Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
353 commits
Select commit Hold shift + click to select a range
8e2ae9a
fix(kumo-stream): unify presets, lock control btn colors
geoquant Feb 20, 2026
77ea259
fixes
geoquant Feb 20, 2026
33d089b
perf(kumo-stream): speed up stream UX
geoquant Feb 20, 2026
39cd820
fix(kumo-stream): select opts + logo size
geoquant Feb 20, 2026
84657ec
feat(streaming): port JSONL parser and RFC 6902 engine to @cloudflare…
geoquant Feb 21, 2026
066dbe0
feat(streaming): port useUITree hook and runtime value store
geoquant Feb 21, 2026
f46592b
feat(streaming): port action system (handler, registry, processor, ur…
geoquant Feb 21, 2026
7ca1f5f
feat(streaming): wire streaming module into build pipeline and packag…
geoquant Feb 21, 2026
ade0fe4
test(streaming): port 9 streaming engine test files from kumo-stream
geoquant Feb 21, 2026
e05b21d
feat(catalog): port system prompt template to catalog module
geoquant Feb 21, 2026
2c2d7c5
feat(catalog): port prompt builder with prop scoring/filtering/grouping
geoquant Feb 21, 2026
f51836c
feat(catalog): replace generatePrompt() with rich system-prompt + com…
geoquant Feb 21, 2026
fc39671
feat(generative): create generative map codegen script and component …
geoquant Feb 22, 2026
2d77c12
feat(generative): port UITreeRenderer and element validator to @cloud…
geoquant Feb 22, 2026
4662e2b
feat(generative): wire @cloudflare/kumo/generative into build pipeline
geoquant Feb 22, 2026
340303a
test(generative): create drift detection tests for component map
geoquant Feb 22, 2026
f641bb6
test(generative): port 9 rendering test files from kumo-stream
geoquant Feb 22, 2026
39056ac
feat(loadable): port UMD loadable entry point to @cloudflare/kumo/loa…
geoquant Feb 22, 2026
0a6b3c5
feat(loadable): create UMD Vite build config and package exports
geoquant Feb 22, 2026
84d3093
test(loadable): port 5 UMD bundle tests from kumo-stream
geoquant Feb 22, 2026
5041bc8
feat(docs): add Cloudflare SSR adapter and Workers AI binding
geoquant Feb 22, 2026
c6714da
feat(docs): create /api/chat SSE streaming endpoint with Workers AI
geoquant Feb 22, 2026
62693bb
feat(docs): build StreamingDemo chat component for live generative UI
geoquant Feb 22, 2026
5207699
feat(docs): update /streaming page with live demo, quick start, UMD, …
geoquant Feb 22, 2026
6837607
chore(release): add changeset for streaming-ui minor bump
geoquant Feb 22, 2026
c493e08
feat(generative): improve AI output quality for streaming demo
geoquant Feb 22, 2026
5b53d80
test(generative): add structural graders with 8 quality rules and 4 J…
geoquant Feb 22, 2026
19fe7de
feat(prompt): add 3 few-shot examples for dashboard, list, and empty …
geoquant Feb 22, 2026
1fce9c1
feat(prompt): add layout anti-patterns and composition recipes to sys…
geoquant Feb 22, 2026
a7d8d7f
feat(prompt-builder): add layout-critical prop scoring and compositio…
geoquant Feb 22, 2026
72fa582
feat(generative): add Grid, Stack, Text wrappers with sensible LLM de…
geoquant Feb 22, 2026
991ef66
feat(validator): add enum coercion for LLM-hallucinated prop values b…
geoquant Feb 22, 2026
5e90ee9
Complete: Add GenerativeGrid, GenerativeStack, GenerativeText wrappers
geoquant Feb 22, 2026
5a67dfa
Complete: Add ENUM_COERCION_MAP and pre-Zod coercion to element-valid…
geoquant Feb 22, 2026
6033b3f
Complete: Add normalizeSurfaceOrphans() to ui-tree-renderer
geoquant Feb 22, 2026
f9699e8
Complete: Add 3 new few-shot examples to system prompt
geoquant Feb 22, 2026
e2b8743
Complete: Add layout anti-patterns and composition recipes to system …
geoquant Feb 22, 2026
c22fb26
Complete: Add LAYOUT_CRITICAL_PROP_NAMES and COMPOSITION_HINTS to pro…
geoquant Feb 22, 2026
90abfa9
Complete: Create structural graders test suite with 8 rules and 4 JSO…
geoquant Feb 22, 2026
40b1636
Complete: Expand chat endpoint: maxProps=8, add Field/Label/Clipboard…
geoquant Feb 22, 2026
a9b5d29
Complete: Full integration verification: tests, types, lint, golden p…
geoquant Feb 22, 2026
417d6be
feat(validator): mark normalizeSurfaceOrphans task as verified
geoquant Feb 22, 2026
c4b93ee
feat(endpoint): mark chat endpoint expansion task as verified
geoquant Feb 22, 2026
d677398
feat(integration): verify all generative-ui-output-quality tasks pass
geoquant Feb 22, 2026
2c161c9
fix(streaming-demo): use Enter to submit, Shift+Enter for newline
geoquant Feb 22, 2026
190b477
feat(generative): extract structural graders + add eval harness script
geoquant Feb 22, 2026
d4fcfa6
feat(docs): add AI Gateway routing + input length validation for chat…
geoquant Feb 22, 2026
04c83a5
remove _examples, specs, screenshots dirs; clean up branch
geoquant Feb 22, 2026
131f402
remove .opencode/plans
geoquant Feb 22, 2026
27fdcdd
harden streaming UI: block on* props, prototype pollution, URL saniti…
geoquant Feb 22, 2026
3c0abe0
fix(streaming-ui): harden chat endpoint, optimize system prompt, bump…
geoquant Feb 22, 2026
962af55
remove .opencode/plans and .opencode/state from tracking
geoquant Feb 22, 2026
e0d9ea2
fix(docs): add _routes.json to assetsignore, run_worker_first for /api/*
geoquant Feb 22, 2026
ad28769
fix(docs): alias react-dom/server to .edge for Workers compat
geoquant Feb 22, 2026
d5c4f55
chore: trigger preview redeploy
geoquant Feb 22, 2026
fd47dbc
feat(catalog): add CustomComponentDefinition & CustomPropDefinition t…
geoquant Feb 23, 2026
b23f7f4
feat(generative): add defineCustomComponent() factory helper
geoquant Feb 23, 2026
b56290d
feat(generative): UITreeRenderer accepts customComponents prop with m…
geoquant Feb 23, 2026
4effad9
feat(generative): extend validateElement() with custom Zod schema val…
geoquant Feb 23, 2026
02fd138
feat(catalog): extend CatalogConfig and prompt builder with customCom…
geoquant Feb 23, 2026
1264e2f
feat(generative): dev-mode console.warn on custom/built-in component …
geoquant Feb 23, 2026
2482d04
docs(streaming): add Custom Components documentation section
geoquant Feb 23, 2026
2329058
feat(docs): add DemoButton custom component demo to streaming page
geoquant Feb 23, 2026
9f0e142
fix(docs): fix DemoButton hover effect stacking and simplify preset p…
geoquant Feb 23, 2026
1d3a9cb
fix(docs): wire DemoButton onAction so clicks dispatch to action panel
geoquant Feb 23, 2026
714eb64
fix(docs): simplify custom component preset prompt
geoquant Feb 23, 2026
7703b41
fix(docs): improve custom preset prompt for tighter layout and richer…
geoquant Feb 23, 2026
645dfc1
feat(generative): uiTreeToJsx() converter — UITree to idiomatic JSX s…
geoquant Feb 27, 2026
09062fb
refactor(docs): extract readSSEStream to shared lib for playground reuse
geoquant Feb 27, 2026
81c0705
feat(docs): add X-Playground-Key header auth to /api/chat with dual r…
geoquant Feb 27, 2026
636de07
feat(docs): gate /api/chat history behind playground auth for multi-t…
geoquant Feb 27, 2026
8e2e3fb
feat(docs): add model override parameter to /api/chat with allowliste…
geoquant Feb 27, 2026
7f7bce5
feat(docs): add GET /api/chat/prompt endpoint with shared playground …
geoquant Feb 27, 2026
4a2c134
feat(docs): add /playground page with BaseLayout and PlaygroundPage s…
geoquant Feb 27, 2026
c0d87df
feat(docs): add auth gate to PlaygroundPage with ?key= URL param vali…
geoquant Feb 27, 2026
3fd20da
feat(docs): add playground top bar with prompt input, model selector,…
geoquant Feb 27, 2026
56e9e5d
feat(docs): add 4-tab system to playground (Preview, Code, Grading, S…
geoquant Feb 27, 2026
929233d
feat(docs): wire UITreeRenderer into playground Preview tab with live…
geoquant Feb 27, 2026
67e2446
feat(docs): add Code tab with live uiTreeToJsx output and copy button
geoquant Feb 27, 2026
834d0c8
feat(docs): add Grading tab with debounced gradeTree results and per-…
geoquant Feb 27, 2026
89a9f91
feat(docs): add System Prompt tab with read-only prompt display from …
geoquant Feb 27, 2026
5c10609
feat(docs): add bottom follow-up bar with status indicator for multi-…
geoquant Feb 27, 2026
eb73f85
feat(docs): add error banner, cancel button, retry, and streaming ind…
geoquant Feb 27, 2026
d1fa77b
feat(docs): add playground to sidebar nav, search, and streaming cros…
geoquant Feb 27, 2026
0442889
feat(generative): add composition-graders with has-visual-hierarchy rule
geoquant Feb 27, 2026
78194c4
feat(generative): add has-responsive-layout rule to composition graders
geoquant Feb 27, 2026
d5b052e
feat(generative): add surface-hierarchy-correct rule to composition g…
geoquant Feb 27, 2026
9d37a9f
feat(component-registry): harden discovery fallback resolution
geoquant Feb 27, 2026
6b4428f
feat(generative): consolidate manifest type resolution ssot
geoquant Feb 27, 2026
24bbb5a
feat(playground): derive prompt components from manifest
geoquant Feb 27, 2026
50508bb
feat(component-registry): lock Flow registry discovery coverage
geoquant Feb 27, 2026
2f978aa
Complete: Relax discovery for non-conventional components
geoquant Feb 27, 2026
472ca62
chore(prd): mark d3-flow-subcomponents as passing
geoquant Feb 27, 2026
d73f579
test(generative): verify Flow wiring in component-map with explicit a…
geoquant Feb 27, 2026
7bd6cf5
feat(catalog): derive prompt-builder aliases from manifest SSOT
geoquant Feb 27, 2026
96695f7
feat(generative): derive validator schema map from manifest SSOT
geoquant Feb 27, 2026
f871458
feat(catalog): add Flow prompt docs with synthetic sub-component entries
geoquant Feb 27, 2026
b155297
feat(generative): add codegen drift detection for discovery vs registry
geoquant Feb 28, 2026
32538fb
feat(playground): add Workers flow pill preset
geoquant Feb 28, 2026
cd0cc73
test(generative): add manifest-derived validator/prompt integration t…
geoquant Feb 28, 2026
8d5035e
test(generative): add e2e verification for Flow in playground
geoquant Feb 28, 2026
e93ff01
feat(generative): add Flow example to system prompt + structural Tabl…
geoquant Feb 28, 2026
ac54b13
feat(playground): add per-model config for reasoning models
geoquant Feb 28, 2026
98e7479
feat(generative): add spacing-consistency rule to gradeComposition
geoquant Feb 28, 2026
55a11df
feat(generative): add content-density and action-completeness rules t…
geoquant Feb 28, 2026
c39e4ba
feat(generative): export gradeComposition from generative barrel
geoquant Feb 28, 2026
a5d8b5c
chore: restore inspo/ directory with ns-kumo-ui-templates submodule
geoquant Feb 28, 2026
347aaf1
chore: point style-layer PRD at geoquant/streaming-ui branch
geoquant Feb 28, 2026
2ab1ed4
feat(catalog): add PAGE_COMPOSITION section to system prompt
geoquant Feb 28, 2026
aece7d6
feat(catalog): add Product Overview page-level JSONL example to syste…
geoquant Feb 28, 2026
7093440
feat(catalog): add Service Detail page-level JSONL example to system …
geoquant Feb 28, 2026
7749ec9
feat(catalog): add Service Tabs page-level JSONL example to system pr…
geoquant Feb 28, 2026
fffe366
test(generative): verify 7 card-level examples pass gradeTree() after…
geoquant Feb 28, 2026
e7ae808
feat(generative): add eval prompt fixtures with 12 natural language p…
geoquant Feb 28, 2026
9c46a4e
feat(generative): add composition eval harness with env-gating and of…
geoquant Feb 28, 2026
cc42536
feat(eval): unify CLI eval prompts with shared eval-prompts.ts module
geoquant Feb 28, 2026
dc2d7ab
Complete: Unify CLI eval prompts with eval-prompts.ts
geoquant Feb 28, 2026
06691b5
feat(eval): add composition grading to CLI eval harness
geoquant Feb 28, 2026
38b1ced
feat(eval): add --skills and --playground-key flags for A/B comparison
geoquant Mar 2, 2026
24d138a
feat(streaming): repair truncated JSON in JSONL parser flush
geoquant Mar 3, 2026
a2ff368
feat(playground): wire gradeComposition() into Grading tab
geoquant Mar 3, 2026
1d61bd0
feat(playground): add /playground/report eval report page with live e…
geoquant Mar 3, 2026
fd27702
chore(eval): mark d5-generate-baselines complete — no code changes, i…
geoquant Mar 3, 2026
ffb8156
feat(eval-report): add row expansion, column drill-down, and rule too…
geoquant Mar 3, 2026
a974b78
fix: harden type safety + remove stale auth refs across streaming-ui …
geoquant Mar 3, 2026
06df128
feat(playground): send current UITree on follow-ups so LLM can handle…
geoquant Mar 3, 2026
50fb46f
feat(streaming): add built-in reset action for counters
geoquant Mar 3, 2026
bf52249
feat(streaming): add generic set/toggle action handlers
geoquant Mar 3, 2026
acf267d
playground: A/B comparison panels, restore Workers flow pill
geoquant Mar 4, 2026
ca47ea2
feat(playground): inject skillIds into skipSystemPrompt branch of POS…
geoquant Mar 4, 2026
127d5b9
feat(playground): add skill metadata fetch + selection state to Playg…
geoquant Mar 4, 2026
b744ba8
feat(playground): add skill picker popover to Panel B header
geoquant Mar 4, 2026
37ae2d8
feat(playground): extract streamPanelB + wire Apply to re-fire Panel …
geoquant Mar 4, 2026
6675644
fix(playground): fix skill checkbox clipping + use Stack for layout
geoquant Mar 4, 2026
1ca8f90
chore: remove accidentally staged _inspo submodule
geoquant Mar 4, 2026
8f56724
feat(playground): extend ChatMessage with role:tool discriminated union
geoquant Mar 4, 2026
cddecef
feat(playground): add JSONL generator for create-worker confirmation …
geoquant Mar 4, 2026
35be96d
feat(playground): add tool_approve/tool_cancel action handlers with M…
geoquant Mar 4, 2026
2481dfd
chore: set geoquant/streaming-ui as canonical branch for tool middlew…
geoquant Mar 4, 2026
07093bb
feat(playground): render tool messages as inline UITreeRenderer in ch…
geoquant Mar 4, 2026
8735468
feat(playground): grey out cancelled tool messages with disabled butt…
geoquant Mar 4, 2026
f20ee24
feat(playground): add applying/completed visual states for tool confi…
geoquant Mar 4, 2026
43367eb
feat(playground): intercept create-worker prompt with inline tool con…
geoquant Mar 4, 2026
9ab581a
feat(playground): wire cancel path — tool_cancel updates status, skip…
geoquant Mar 4, 2026
d7e8b6e
feat(playground): wire approve path — mock delay then A/B panel gener…
geoquant Mar 4, 2026
a6f0917
feat(playground): add Create worker pill to PRESET_PROMPTS for tool m…
geoquant Mar 4, 2026
b237d6c
refactor(playground): stream tool confirmation cards from AI worker i…
geoquant Mar 4, 2026
477c80c
feat(kumo-mcp): scaffold package — Worker + DO + MCP deps
geoquant Mar 4, 2026
50111fa
feat(kumo-mcp): extract McpAgent to worker/mcp, wire /mcp routing + i…
geoquant Mar 4, 2026
4664315
feat(kumo-mcp): register create_worker tool with UI resource + render…
geoquant Mar 4, 2026
df18a11
feat(kumo-mcp): register execute_create_worker tool with mock 800ms d…
geoquant Mar 4, 2026
61cefae
feat(kumo-mcp): add iframe postMessage utilities — sendMcpMessage + w…
geoquant Mar 4, 2026
c03d623
feat(kumo-mcp): add useMcpUiInit hook — iframe readiness signal + dim…
geoquant Mar 4, 2026
30fe55f
feat(mcp-host): add createIframeMessageHandler — host-side postMessag…
geoquant Mar 4, 2026
43e2dd5
feat(kumo-mcp): scaffold React Router iframe app — route, SSR, client…
geoquant Mar 4, 2026
c1e7f81
feat(kumo-mcp): stream confirmation card via readSSEStream + createJs…
geoquant Mar 4, 2026
bdadda7
feat(kumo-mcp): wire iframe approve/cancel actions + status overlays
geoquant Mar 4, 2026
d03bc78
feat(playground): add McpToolIframe — iframe host component with post…
geoquant Mar 4, 2026
737cbc0
feat(mcp-proxy): add /api/mcp-proxy — thin POST handler forwarding to…
geoquant Mar 4, 2026
3f139d3
feat(playground): replace inline UITreeRenderer tool cards with McpTo…
geoquant Mar 4, 2026
fec1fdc
feat(playground): wire handleSubmit to MCP proxy for create_worker to…
geoquant Mar 4, 2026
32287f6
feat(playground): wire handleToolAction to MCP proxy for execute_crea…
geoquant Mar 5, 2026
1da1c7e
refactor(playground): extract chat types into src/lib/chat-types.ts
geoquant Mar 5, 2026
1a1394e
refactor(playground): extract tool middleware into src/lib/tool-middl…
geoquant Mar 5, 2026
db4f88b
refactor(playground): extract tool prompts into src/lib/tool-prompts.ts
geoquant Mar 5, 2026
16df436
feat(playground): add ToolDefinition registry — generic tool routing …
geoquant Mar 5, 2026
039ce87
fix(playground): switch kumo-mcp to vite dev, update MCP proxy URL to…
geoquant Mar 5, 2026
adfb88e
feat(playground): replace iframe tool cards with inline JSONL streaming
geoquant Mar 5, 2026
36fee84
fix(playground): extract worker name dynamically from user message
geoquant Mar 5, 2026
e7eb9fd
perf: unify 10 normalization passes into 3-phase pipeline, add genera…
geoquant Mar 5, 2026
c4b5f0d
chore(playground): bypass MCP proxy for local dev
geoquant Mar 8, 2026
c9709fb
feat(app-runtime): add initial app spec types
geoquant Mar 8, 2026
29d2fc5
feat(app-runtime): add resolver and action engine
geoquant Mar 8, 2026
d194674
feat(app-runtime): add repeat validation watchers
geoquant Mar 8, 2026
d676da9
feat(app-runtime): upgrade patch normalization core
geoquant Mar 8, 2026
25eaae8
feat(app-runtime): package react session hooks
geoquant Mar 8, 2026
9598243
feat(docs): add app runtime task demo
geoquant Mar 8, 2026
49dfece
feat(playground): extract shared panel state
geoquant Mar 9, 2026
e61813f
feat(playground): add tree inspection tab
geoquant Mar 9, 2026
6663cf4
feat(playground): add local tree editor
geoquant Mar 9, 2026
386cf97
feat(playground): add catalog reference data
geoquant Mar 9, 2026
22e8418
feat(playground): add shared catalog explorer
geoquant Mar 9, 2026
df036cb
feat(playground): upgrade tsx exports
geoquant Mar 9, 2026
afd776d
feat(playground): add desktop split layout
geoquant Mar 9, 2026
8cd3641
feat(playground): add mobile shell
geoquant Mar 9, 2026
5d4f632
feat(playground): add regression tests
geoquant Mar 9, 2026
a6f1241
fix(docs): add missing dev deps
geoquant Mar 9, 2026
a53d372
fix(playground): guard layout storage on ssr
geoquant Mar 9, 2026
1a85d04
fix(playground): remove panel placeholder
geoquant Mar 9, 2026
b3afb66
feat(playground): add output history scrubber
geoquant Mar 9, 2026
a4f6fe2
feat(playground): add eval feedback utilities
geoquant Mar 9, 2026
e57c2d6
feat(playground): wire eval feedback reporting
geoquant Mar 9, 2026
642f72e
feat(catalog): generate component behavior manifest
geoquant Mar 9, 2026
89ae09d
feat(runtime): add UITree AppSpec adapter
geoquant Mar 9, 2026
13eca32
feat(runtime): converge UITree renderer on AppSpec
geoquant Mar 9, 2026
73185af
feat(catalog): add freshness drift checks
geoquant Mar 9, 2026
34f08c6
feat(streaming): unify loadable runtime path
geoquant Mar 9, 2026
488e783
docs(kumo): document generated runtime story
geoquant Mar 9, 2026
6108719
fix(generative): restore inline tool cards
geoquant Mar 10, 2026
902009e
fix(playground): center panel loading state
geoquant Mar 10, 2026
a9ba6ff
fix(playground): simplify header controls
geoquant Mar 10, 2026
fe897c8
fix(catalog): restore chart capability metadata
geoquant Mar 10, 2026
18a35e3
fix(lint): unblock root workspace check
geoquant Mar 10, 2026
344cf25
fix(playground): remove duplicate chat header summary
geoquant Mar 10, 2026
38a09a3
feat(playground): add panel a verifier core
geoquant Mar 11, 2026
3a685cf
feat(playground): add verifier cli
geoquant Mar 11, 2026
6643c86
feat(playground): add verifier budget config
geoquant Mar 11, 2026
2c9c931
feat(playground): gate panel a preview
geoquant Mar 11, 2026
a2c9278
feat(playground): add verifier status ui
geoquant Mar 11, 2026
6b7ca80
feat(playground): expand verifier coverage
geoquant Mar 12, 2026
b2c6121
fix(playground): skip verifier for tool-only output
geoquant Mar 12, 2026
67a7626
docs(kumo): document streaming runtime apis
geoquant Mar 12, 2026
e49cbce
fix(generative): preserve badge success variant
geoquant Mar 12, 2026
e5fa06b
chore(branch): drop planning artifacts
geoquant Mar 12, 2026
a4dff7f
chore(docs): drop unused ui template bundle
geoquant Mar 12, 2026
84ec2bc
fix(docs): restore ci checks
geoquant Mar 12, 2026
44d72bf
chore(kumo): refresh registry artifacts
geoquant Mar 12, 2026
9630477
fix(ci): build demo metadata before running freshness test
geoquant Mar 12, 2026
b2a74b2
fix(ci): checkout fork head for pkg-preview job
geoquant Mar 12, 2026
ab7d53f
revert: undo unnecessary checkout change for pkg-preview
geoquant Mar 12, 2026
693e03e
chore(kumo): refresh registry artifacts (no-cache rebuild)
geoquant Mar 12, 2026
2c27f43
fix(kumo): increase freshness test timeout for uncached CI runs
geoquant Mar 12, 2026
90ee4f7
fix(playground): pass custom component types to verifier so panel A d…
geoquant Mar 12, 2026
7d3e22a
fix(playground): add chart example + sizing hint to panel A system pr…
geoquant Mar 12, 2026
561d2fe
fix(playground): add w-full to preview content wrapper so generated U…
geoquant Mar 12, 2026
09861c1
feat(playground): add lz-string dep for URL state compression
geoquant Mar 13, 2026
3a406a7
feat(playground): add editedSystemPrompt state + derived values
geoquant Mar 13, 2026
0ecbf4c
feat(playground): add URL state sync for edited system prompt
geoquant Mar 13, 2026
52884da
feat(playground): add PromptEditor component with textarea, token cou…
geoquant Mar 13, 2026
21c8480
feat(playground): conditional prompt tab — PromptEditor in panel A, P…
geoquant Mar 13, 2026
3fb73a5
feat(playground): add regenerateWithPrompt — re-run Panel A with edit…
geoquant Mar 13, 2026
1b220d0
feat(playground): show modified badge in Panel A header when system p…
geoquant Mar 13, 2026
187998f
feat(playground): add streamPlainText utility for plain-text SSE stre…
geoquant Mar 13, 2026
8e0aaa1
feat(playground): add PROMPT_EDITOR_SYSTEM_PROMPT constant for AI pro…
geoquant Mar 13, 2026
d894339
feat(playground): add buildPromptEditMessage helper with tests
geoquant Mar 13, 2026
d7566d1
feat(playground): add AI chat input to PromptEditor for streaming pro…
geoquant Mar 13, 2026
8b7edb1
fix(playground): fix lz-string CJS import, PromptEditor width, regene…
geoquant Mar 13, 2026
f97357b
fix(playground): increase MAX_SYSTEM_PROMPT_OVERRIDE_LENGTH to 200k
geoquant Mar 13, 2026
dbcf215
feat(playground): add editable prompt to Panel B + reset button for b…
geoquant Mar 13, 2026
d88106e
fix(playground): pass edited system prompt to Panel A on chat submit
geoquant Mar 13, 2026
ef0ac1f
fix(playground): reassemble pretty-printed JSON in verifier to preven…
geoquant Mar 13, 2026
196abca
fix(playground): never block render on verifier failure, show inline …
geoquant Mar 13, 2026
c2a40e7
fix(playground): raise maxDroppedLines fail threshold to 200
geoquant Mar 13, 2026
ec30c6f
fix(playground): keep chart demos working offline
geoquant Mar 13, 2026
65a51cc
fix(playground): stream charts progressively
geoquant Mar 13, 2026
a8e4986
fix(playground): fail open when rate limit is down
geoquant Mar 13, 2026
b46265b
fix(playground): retry ai without gateway
geoquant Mar 13, 2026
77a8b3a
fix(playground): add staging ai bindings
geoquant Mar 13, 2026
c72dafa
fix(playground): avoid chart demo stalls
geoquant Mar 13, 2026
b21930b
fix(docs): harden local api binding fallbacks
geoquant Mar 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/app-runtime-core-types.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@cloudflare/kumo": minor
---

Add an experimental `@cloudflare/kumo/app-runtime` entry point with initial `AppSpec` core types, compatibility aliases, and root exports for app runtime consumers.
15 changes: 15 additions & 0 deletions .changeset/app-runtime-react-hooks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@cloudflare/kumo": minor
---

Add packaged app runtime React hooks.

### New

- add `@cloudflare/kumo/app-runtime/react` with `useUIStream` and `useChatUI` for streamed AppSpec sessions
- expose runtime effect callbacks and chat/session helpers for mixed text plus UI flows

### Improved

- add mutable app store helpers for state replacement and stream status updates
- return watcher-triggered runtime effects and align loadable/jsonl tests with RFC 6902 semantics
37 changes: 37 additions & 0 deletions .changeset/stack-cluster-layout-primitives.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
"@cloudflare/kumo": minor
---

Add Stack and Cluster layout primitives

**New Component: Stack**

- Vertical flex column layout with constrained gap scale
- `gap`: "none" | "xs" | "sm" | "base" | "lg" | "xl"
- `align`: "start" | "center" | "end" | "stretch" (default: "stretch")
- Composable via `render` prop (default: `<div />`)

**New Component: Cluster**

- Horizontal flex row layout with constrained gap scale
- `gap`: "none" | "xs" | "sm" | "base" | "lg" | "xl"
- `justify`: "start" | "center" | "end" | "between" (default: "start")
- `align`: "start" | "center" | "end" | "baseline" | "stretch" (default: "center")
- `wrap`: "wrap" | "nowrap" (default: "wrap")
- Composable via `render` prop (default: `<div />`)

**Usage:**

```tsx
<Stack gap="base" align="center">
<Text variant="heading2">Title</Text>
<Text variant="secondary">Subtitle</Text>
</Stack>

<Cluster gap="sm" justify="end">
<Button variant="ghost">Cancel</Button>
<Button variant="primary">Save</Button>
</Cluster>
```

Both components export variant constants (`KUMO_STACK_VARIANTS`, `KUMO_CLUSTER_VARIANTS`) and variant functions (`stackVariants()`, `clusterVariants()`) for advanced composition.
5 changes: 5 additions & 0 deletions .changeset/streaming-ui-modules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@cloudflare/kumo": minor
---

Add streaming UI modules: `@cloudflare/kumo/streaming` (JSONL parser, RFC 6902 engine, useUITree hook, action system), `@cloudflare/kumo/generative` (UITreeRenderer, component map, element validator), and `@cloudflare/kumo/loadable` (UMD entry point for script-tag usage). Includes system prompt generation via `generatePrompt()` in catalog module.
1 change: 1 addition & 0 deletions .github/workflows/pullrequest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ jobs:
uses: ./.github/actions/install-dependencies

- run: pnpm --filter @cloudflare/kumo build
- run: pnpm --filter @cloudflare/kumo-docs-astro codegen:demos
- run: pnpm --filter @cloudflare/kumo test
12 changes: 9 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@ worker-configuration.d.ts

# Environment variables
.env
.env.local
.env.production.local
.env.development.local
.env.*
!.env.example

# Logs
*.log
Expand Down Expand Up @@ -50,3 +49,10 @@ coverage/

# Codex
.codex/environments

# Eval harness (local-only, environment-specific)
.eval-baselines/
.eval-outputs/

# Overseer task DB (local-only)
.overseer/
207 changes: 207 additions & 0 deletions .opencode/state/playground-editable-system-prompt/prd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
{
"prdName": "playground-editable-system-prompt",
"tasks": [
{
"id": "setup-1",
"category": "setup",
"description": "Install lz-string dependency for URL state compression. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"lz-string is listed in package.json dependencies for kumo-docs-astro",
"pnpm install completes without errors",
"lz-string can be imported in a .ts file without type errors"
],
"passes": true
},
{
"id": "state-1",
"category": "state",
"description": "Add editedSystemPrompt state and derived values to PlaygroundContent. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PlaygroundContent has useState<string | null> for editedSystemPrompt, initialized to null",
"isPromptModified derived boolean exists (true when editedSystemPrompt !== null)",
"activeSystemPrompt derived value exists (editedSystemPrompt ?? systemPromptText)",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "state-2",
"category": "state",
"description": "URL state sync — read promptOverride/promptRef from URL on mount, write back on change with lz-string compression and localStorage fallback. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"On mount, if ?promptOverride= param exists, decompresses and sets editedSystemPrompt",
"On mount, if ?promptRef= param exists, reads from localStorage and sets editedSystemPrompt",
"When editedSystemPrompt changes, URL is updated via replaceState (debounced)",
"When compressed prompt exceeds 1500 chars, falls back to localStorage + ?promptRef=<hash>",
"When editedSystemPrompt is null, promptOverride and promptRef params are removed from URL",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "ui-1",
"category": "ui",
"description": "Create PromptEditor component with editable textarea, token count, and Regenerate button. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PromptEditor component exists in _PlaygroundPage.tsx",
"Renders a monospace <textarea> pre-filled with canonicalPrompt when editedPrompt is null",
"Textarea onChange calls onPromptChange with the new text",
"Header shows token count estimate that updates as text changes",
"Header shows 'modified' badge when isModified is true",
"Footer has 'Regenerate with this prompt' button that calls onRegenerate",
"Regenerate button is disabled when isStreaming is true",
"Uses only semantic Kumo tokens (bg-kumo-*, text-kumo-*, border-kumo-*) — no raw Tailwind colors",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "ui-2",
"category": "ui",
"description": "Conditional prompt tab rendering — Panel A shows PromptEditor, Panel B keeps read-only PromptTextView. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PanelContent receives panelId prop",
"When tab is 'prompt' and panelId is 'a', renders PromptEditor",
"When tab is 'prompt' and panelId is 'b', renders PromptTextView (unchanged)",
"All new props (panelId, editedSystemPrompt, onPromptChange, onPromptReset, onRegenerate) are threaded through ComparisonPanels to PanelContent",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "functional-1",
"category": "functional",
"description": "Regeneration logic — re-run Panel A only with edited system prompt via skipSystemPrompt + systemPromptOverride. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"regenerateWithPrompt callback exists in PlaygroundContent",
"Aborts any in-flight Panel A stream",
"Sends POST /api/chat with skipSystemPrompt: true and systemPromptOverride: activeSystemPrompt",
"Uses the last user message from chat history as the message field",
"Panel B stream is NOT re-fired",
"Panel A resets (tree, JSONL, status, editor) before streaming",
"On stream complete, Panel A shows new output",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "ui-3",
"category": "ui",
"description": "Modified badge in Panel A header when system prompt has been edited. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PanelHeader receives isPromptModified prop",
"When isPromptModified is true and panelId is 'a', a Badge with 'modified' text is rendered next to the 'A' label",
"Badge uses Kumo semantic tokens only",
"When isPromptModified is false, no badge is shown",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "util-1",
"category": "util",
"description": "Create streamPlainText utility — thin SSE stream reader that accumulates raw text without JSONL parsing. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"File exists at src/lib/stream-plain-text.ts",
"Exports async function streamPlainText with opts: { body, signal, onToken }",
"Calls fetch('/api/chat') with POST and Accept: text/event-stream",
"Uses existing readSSEStream to process SSE, accumulates tokens as plain text",
"Returns the full concatenated response string",
"Does NOT import or use createJsonlParser",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "util-2",
"category": "util",
"description": "Add PROMPT_EDITOR_SYSTEM_PROMPT constant to tool-prompts.ts. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PROMPT_EDITOR_SYSTEM_PROMPT is exported from src/lib/tool-prompts.ts",
"Instructs AI to return only the complete modified system prompt with no preamble",
"Sits alongside existing BASELINE_PROMPT constant",
"pnpm typecheck passes"
],
"passes": true
},
{
"id": "util-3",
"category": "util",
"description": "Create buildPromptEditMessage helper with tests. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"File exists at src/lib/playground/prompt-edit.ts",
"Exports buildPromptEditMessage function",
"Wraps currentPrompt in <current-system-prompt> tags",
"Wraps instruction in <instruction> tags",
"When outputContext is provided, includes <output-context> section with lastUserPrompt, elementCount, treeDepth, gradingReport",
"When outputContext is omitted, no <output-context> section appears",
"Test file exists at src/lib/playground/prompt-edit.test.ts",
"Tests cover: basic message, with all output context fields, with partial context, without context",
"pnpm --filter @cloudflare/kumo-docs-astro test passes for prompt-edit.test.ts"
],
"passes": true
},
{
"id": "ui-4",
"category": "ui",
"description": "AI prompt editor UI — add chat-style input to PromptEditor that streams AI edits directly into textarea. BRANCH: geoquant/streaming-ui — do NOT switch branches.",
"steps": [
"Verify current branch is geoquant/streaming-ui before any work",
"PromptEditor has a text input below the textarea with placeholder 'Describe changes...'",
"Send button triggers POST /api/chat with skipSystemPrompt: true and systemPromptOverride: PROMPT_EDITOR_SYSTEM_PROMPT",
"Message is built via buildPromptEditMessage with current prompt text + instruction + output context",
"Uses streamPlainText (not streamJsonlUI) to stream the response",
"As tokens stream in, textarea content is progressively replaced",
"On stream complete, textarea contains the full AI response",
"Send button is disabled while AI is streaming",
"User can manually edit textarea after AI completes",
"PromptEditor receives tree, lastUserPrompt, gradingReport, selectedModel props for output context",
"Uses only semantic Kumo tokens — no raw Tailwind colors",
"pnpm typecheck passes"
],
"passes": true
}
],
"context": {
"patterns": [
"Playground page: src/components/demos/_PlaygroundPage.tsx (5,500 lines, all sub-components inline)",
"State management: src/lib/playground/state.ts (useReducer with discriminated union actions)",
"Types: src/lib/playground/types.ts (PanelId, PanelTab, PanelArtifact)",
"System prompt generation: src/lib/playground.ts (getSystemPrompt, addPlaygroundPromptSupplement)",
"API endpoint: src/pages/api/chat/index.ts (POST /api/chat with skipSystemPrompt + systemPromptOverride)",
"SSE streaming: src/lib/stream-jsonl-ui.ts (streamJsonlUI, readSSEStream)",
"Baseline prompt: src/lib/tool-prompts.ts (BASELINE_PROMPT constant)",
"Styling: ONLY semantic tokens (bg-kumo-*, text-kumo-*, border-kumo-*), NEVER raw Tailwind colors, NEVER dark: variant",
"Classnames: Always use cn() utility"
],
"keyFiles": [
"packages/kumo-docs-astro/src/components/demos/_PlaygroundPage.tsx",
"packages/kumo-docs-astro/src/lib/playground.ts",
"packages/kumo-docs-astro/src/lib/playground/state.ts",
"packages/kumo-docs-astro/src/lib/playground/types.ts",
"packages/kumo-docs-astro/src/lib/stream-jsonl-ui.ts",
"packages/kumo-docs-astro/src/lib/tool-prompts.ts",
"packages/kumo-docs-astro/src/pages/api/chat/index.ts",
"packages/kumo-docs-astro/src/pages/api/chat/prompt.ts"
],
"nonGoals": [
"Persisting prompt edits server-side (no database)",
"Collaborator accounts or permissions",
"Editing the Panel B baseline prompt",
"Modifying the prompt generation pipeline (playground.ts, catalog system)",
"Multi-turn conversation for AI prompt editing (single-turn only)",
"Separate worker deployment for AI editing",
"Creating new git branches — ALL work stays on geoquant/streaming-ui"
]
}
}
Loading