Skip to content

Commit 3b29d24

Browse files
Skobeltsynclaude
andcommitted
docs(#1730): roadmap — wrap operator + KSP @generable done; LlmChunk streaming entry
Refresh docs/roadmap.md to match what has landed on main: - Phase 1: replace `[ ] >> — security/education wrap` with `[x] wrap` (#1698) — teacher→student prompt-override operator. Kotlin can't overload `>>`, so the implementation is named `wrap`. - Phase 2: split the old KSP line. The compile-time `@Generable` codegen half is done (#1700–#1705 — validation, schema, sealed-root, toLlmDescription, constructFromMap, drop kotlin-reflect). The provider-level constrained-decoding / guided-JSON-mode half is now its own pending entry. - Phase 2: new `[x]` entry for the streaming foundation (#1722) — `LlmChunk` sealed type + `ModelClient.chatStream` default impl. Per-adapter native streaming is its own follow-up entry; the `Flow<PipelineEvent>` line now reads as built on top of `LlmChunk`. UUID: 0F5BC33F-0938-4EF7-8D24-D88B68682096 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 1ea5a63 commit 3b29d24

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

docs/roadmap.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
- [x] `Agent.toString()` + `Agent.describe()` — readable single-line + multi-line debug output replacing the JVM identity-hash default (#970)
3030
- [x] `onBudgetThreshold(threshold) { reason, usedPercent -> }` — pre-cap warning hook; fires once per `BudgetReason` when cumulative usage crosses the fraction, before the cap throws (#966)
3131
- [x] `loadResource(path)` / `loadResourceOrNull(path)` — read agent system prompts from classpath resources; fail-fast at agent construction when path is missing; UTF-8 decoded; leading-slash normalized (#980)
32-
- [ ] `>>`security/education wrap
32+
- [x] `wrap`teacher→student prompt-override operator (`teacher wrap student` returns a `Pipeline<IN, OUT>` where the teacher's `String` output becomes the student's system prompt for that one call; restored after). Two framings: *education* (one generalist student specialized by many teachers) and *security* (the student's task surface is locked to what the teacher emits). The PRD calls this the `>>` operator; Kotlin can't overload `>>` so the function is named `wrap` (#1698)
3333

3434
**Phase 2 — Runtime + Distribution** *(Q2 2026)*
3535

@@ -38,7 +38,8 @@
3838
- [ ] MCP client integration — `McpTool` instances consumable alongside local tools
3939
- [ ] `grants { tools(...) }` — Layer 2 permissions use actual `Tool<*,*>` references
4040
- [ ] Permission model: 3 states — Granted (auto-runs), Confirmed (user approval), Absent (unavailable)
41-
- [ ] KSP annotation processor — compile-time `@Generable`; constrained decoding (Ollama) + guided JSON mode (Anthropic/OpenAI)
41+
- [x] KSP annotation processor — compile-time `@Generable` codegen: shape validation (#1700), schema emitter + field-type validation (#1701), sealed-root schema (#1702), `toLlmDescription()` + multi-constant cache (#1703), `constructFromMap` codegen (#1704), drop runtime `kotlin-reflect` + empty-variants gate (#1705). Ships as `agents-kt-ksp` module
42+
- [ ] Provider-level constrained decoding (Ollama `format: schema`) + guided JSON mode (Anthropic / OpenAI `response_format: json_schema`) — wire `@Generable` JSON schemas through to provider request payloads so the model is forced to emit valid shape (eliminates retry-on-parse loops)
4243
- [ ] Native CLI binary (GraalVM — no JRE required); `brew`, npm, pip, curl, apt
4344
- [ ] jlink minimal JRE bundle for runtime (~35MB)
4445

@@ -47,7 +48,9 @@
4748
- [ ] Reactive context hooks — `beforeInference`, `afterToolCall` (context-mutating)
4849
- [x] Agent memory — `MemoryBank`, `memory_read`/`memory_write`/`memory_search` auto-injected tools
4950
- [ ] `.spawn {}` — independent sub-agent lifecycle, `AgentHandle<OUT>`, parent-managed join
50-
- [ ] `Flow<PipelineEvent>` for reactive UIs + Pipeline-level events (`StageStarted`, `PipelineCompleted`, etc) — depends on streaming, sub-agents, sessions
51+
- [x] Streaming foundation — `LlmChunk` sealed type (`TextDelta` / `ToolCallStarted` / `ToolCallArgumentsDelta` / `ToolCallFinished` / `End`) + `ModelClient.chatStream(messages): Flow<LlmChunk>` with a default impl that wraps `chat()` so non-streaming providers keep working unchanged. Provider-native streaming (Anthropic SSE, OpenAI SSE, Ollama `stream: true`) overrides land per-adapter. `LlmChunk` stays narrow — no agentic concepts like `skillName` / `agentId` (#1722)
52+
- [ ] Per-adapter native streaming overrides — Anthropic SSE, OpenAI SSE, Ollama `stream: true` — emit real partial chunks instead of the default `chat()`-wrap. See [v0.5.0 streaming premortem](premortem-0.5.0-streaming.md)
53+
- [ ] `Flow<PipelineEvent>` for reactive UIs + Pipeline-level events (`StageStarted`, `PipelineCompleted`, etc) — built on top of `LlmChunk`; depends on sub-agents and sessions
5154
- [ ] **Multimodal input** — vision and audio content blocks on LLM messages.
5255
- **Image input:** vision-capable adapters accept image bytes + media type as a content block alongside text. Targets: Anthropic (`image` content blocks), OpenAI (`image_url` / base64 in content), Ollama (`llava` / `bakllava` via `images` field), Google Gemini.
5356
- **Audio input:** true audio input (Gemini, GPT-4o-audio) — `LlmContent.Audio` block. Optional STT-only helper `audio.transcribe(file)` for the Whisper-style use case.

0 commit comments

Comments
 (0)