@kitn.ai/ui 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/construct-cli.es.js +3 -3
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/mcp.es.js +1 -1
- package/package.json +16 -16
- package/bin/route.test.js +0 -58
- package/src/agent-tooling/README.md +0 -192
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -147
- package/src/agent-tooling/construct/codegen.ts +0 -1635
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
- package/src/agent-tooling/construct/schema.ts +0 -452
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -1014
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -241
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/conversation-panel.tsx +0 -118
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/home-panel.tsx +0 -159
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/widget-tab-bar.tsx +0 -73
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -304
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -187
- package/src/elements/element-types.d.ts +0 -4353
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/styles.css +0 -328
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -430
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/conversation-store.ts +0 -248
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -173
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -95
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -630
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$id": "https://ui.kitn.ai/schemas/construct/v1.json",
|
|
3
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
|
-
"type": "object",
|
|
5
|
-
"properties": {
|
|
6
|
-
"$schema": {
|
|
7
|
-
"type": "string"
|
|
8
|
-
},
|
|
9
|
-
"name": {
|
|
10
|
-
"type": "string",
|
|
11
|
-
"pattern": "^[a-z][a-z0-9]*-[a-z0-9-]+$"
|
|
12
|
-
},
|
|
13
|
-
"layout": {
|
|
14
|
-
"type": "string",
|
|
15
|
-
"enum": [
|
|
16
|
-
"widget",
|
|
17
|
-
"fullscreen",
|
|
18
|
-
"aside",
|
|
19
|
-
"split",
|
|
20
|
-
"custom"
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
"provider": {
|
|
24
|
-
"oneOf": [
|
|
25
|
-
{
|
|
26
|
-
"type": "object",
|
|
27
|
-
"properties": {
|
|
28
|
-
"mode": {
|
|
29
|
-
"type": "string",
|
|
30
|
-
"const": "mock"
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"required": [
|
|
34
|
-
"mode"
|
|
35
|
-
],
|
|
36
|
-
"additionalProperties": false
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"type": "object",
|
|
40
|
-
"properties": {
|
|
41
|
-
"mode": {
|
|
42
|
-
"type": "string",
|
|
43
|
-
"const": "endpoint"
|
|
44
|
-
},
|
|
45
|
-
"url": {
|
|
46
|
-
"type": "string",
|
|
47
|
-
"minLength": 1
|
|
48
|
-
},
|
|
49
|
-
"wire": {
|
|
50
|
-
"type": "string",
|
|
51
|
-
"enum": [
|
|
52
|
-
"openai",
|
|
53
|
-
"anthropic"
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
"required": [
|
|
58
|
-
"mode",
|
|
59
|
-
"url",
|
|
60
|
-
"wire"
|
|
61
|
-
],
|
|
62
|
-
"additionalProperties": false
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
},
|
|
66
|
-
"userId": {
|
|
67
|
-
"type": "string",
|
|
68
|
-
"minLength": 1,
|
|
69
|
-
"pattern": "^[\\x20-\\x7E]+$"
|
|
70
|
-
},
|
|
71
|
-
"theme": {
|
|
72
|
-
"type": "object",
|
|
73
|
-
"properties": {
|
|
74
|
-
"accent": {
|
|
75
|
-
"type": "string"
|
|
76
|
-
},
|
|
77
|
-
"unreadColor": {
|
|
78
|
-
"type": "string"
|
|
79
|
-
},
|
|
80
|
-
"mode": {
|
|
81
|
-
"default": "system",
|
|
82
|
-
"type": "string",
|
|
83
|
-
"enum": [
|
|
84
|
-
"light",
|
|
85
|
-
"dark",
|
|
86
|
-
"system"
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
"required": [
|
|
91
|
-
"mode"
|
|
92
|
-
],
|
|
93
|
-
"additionalProperties": false
|
|
94
|
-
},
|
|
95
|
-
"header": {
|
|
96
|
-
"type": "object",
|
|
97
|
-
"properties": {
|
|
98
|
-
"title": {
|
|
99
|
-
"type": "string",
|
|
100
|
-
"minLength": 1
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"additionalProperties": false
|
|
104
|
-
},
|
|
105
|
-
"empty": {
|
|
106
|
-
"type": "object",
|
|
107
|
-
"properties": {
|
|
108
|
-
"title": {
|
|
109
|
-
"type": "string",
|
|
110
|
-
"minLength": 1
|
|
111
|
-
},
|
|
112
|
-
"description": {
|
|
113
|
-
"type": "string",
|
|
114
|
-
"minLength": 1
|
|
115
|
-
},
|
|
116
|
-
"icon": {
|
|
117
|
-
"type": "string",
|
|
118
|
-
"minLength": 1
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
"required": [
|
|
122
|
-
"title"
|
|
123
|
-
],
|
|
124
|
-
"additionalProperties": false
|
|
125
|
-
},
|
|
126
|
-
"home": {
|
|
127
|
-
"type": "object",
|
|
128
|
-
"properties": {
|
|
129
|
-
"greeting": {
|
|
130
|
-
"type": "object",
|
|
131
|
-
"properties": {
|
|
132
|
-
"title": {
|
|
133
|
-
"type": "string",
|
|
134
|
-
"minLength": 1
|
|
135
|
-
},
|
|
136
|
-
"subtitle": {
|
|
137
|
-
"type": "string",
|
|
138
|
-
"minLength": 1
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
"additionalProperties": false
|
|
142
|
-
},
|
|
143
|
-
"recentConversation": {
|
|
144
|
-
"type": "boolean",
|
|
145
|
-
"const": true
|
|
146
|
-
},
|
|
147
|
-
"newConversation": {
|
|
148
|
-
"type": "object",
|
|
149
|
-
"properties": {
|
|
150
|
-
"label": {
|
|
151
|
-
"type": "string",
|
|
152
|
-
"minLength": 1
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
"additionalProperties": false
|
|
156
|
-
},
|
|
157
|
-
"links": {
|
|
158
|
-
"type": "array",
|
|
159
|
-
"items": {
|
|
160
|
-
"type": "object",
|
|
161
|
-
"properties": {
|
|
162
|
-
"label": {
|
|
163
|
-
"type": "string",
|
|
164
|
-
"minLength": 1
|
|
165
|
-
},
|
|
166
|
-
"href": {
|
|
167
|
-
"type": "string",
|
|
168
|
-
"minLength": 1
|
|
169
|
-
},
|
|
170
|
-
"description": {
|
|
171
|
-
"type": "string",
|
|
172
|
-
"minLength": 1
|
|
173
|
-
},
|
|
174
|
-
"icon": {
|
|
175
|
-
"type": "string",
|
|
176
|
-
"minLength": 1
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
"required": [
|
|
180
|
-
"label"
|
|
181
|
-
],
|
|
182
|
-
"additionalProperties": false
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
},
|
|
186
|
-
"additionalProperties": false
|
|
187
|
-
},
|
|
188
|
-
"capabilities": {
|
|
189
|
-
"type": "object",
|
|
190
|
-
"properties": {
|
|
191
|
-
"starters": {
|
|
192
|
-
"minItems": 1,
|
|
193
|
-
"maxItems": 6,
|
|
194
|
-
"type": "array",
|
|
195
|
-
"items": {
|
|
196
|
-
"type": "string",
|
|
197
|
-
"minLength": 1
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
"attachments": {
|
|
201
|
-
"type": "object",
|
|
202
|
-
"properties": {
|
|
203
|
-
"accept": {
|
|
204
|
-
"minItems": 1,
|
|
205
|
-
"type": "array",
|
|
206
|
-
"items": {
|
|
207
|
-
"type": "string",
|
|
208
|
-
"minLength": 1
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
"required": [
|
|
213
|
-
"accept"
|
|
214
|
-
],
|
|
215
|
-
"additionalProperties": false
|
|
216
|
-
},
|
|
217
|
-
"history": {
|
|
218
|
-
"type": "object",
|
|
219
|
-
"properties": {
|
|
220
|
-
"persistence": {
|
|
221
|
-
"type": "string",
|
|
222
|
-
"enum": [
|
|
223
|
-
"none",
|
|
224
|
-
"local",
|
|
225
|
-
"endpoint"
|
|
226
|
-
]
|
|
227
|
-
},
|
|
228
|
-
"url": {
|
|
229
|
-
"type": "string",
|
|
230
|
-
"minLength": 1
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
"required": [
|
|
234
|
-
"persistence"
|
|
235
|
-
],
|
|
236
|
-
"additionalProperties": false
|
|
237
|
-
},
|
|
238
|
-
"reasoning": {
|
|
239
|
-
"type": "string",
|
|
240
|
-
"enum": [
|
|
241
|
-
"full",
|
|
242
|
-
"compact",
|
|
243
|
-
"off"
|
|
244
|
-
]
|
|
245
|
-
},
|
|
246
|
-
"reasoningOpen": {
|
|
247
|
-
"type": "boolean"
|
|
248
|
-
},
|
|
249
|
-
"conversations": {
|
|
250
|
-
"type": "boolean",
|
|
251
|
-
"const": true
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
"additionalProperties": false
|
|
255
|
-
},
|
|
256
|
-
"cards": {
|
|
257
|
-
"minItems": 1,
|
|
258
|
-
"type": "array",
|
|
259
|
-
"items": {
|
|
260
|
-
"type": "object",
|
|
261
|
-
"properties": {
|
|
262
|
-
"name": {
|
|
263
|
-
"type": "string",
|
|
264
|
-
"pattern": "^[a-z][a-z0-9_]*$"
|
|
265
|
-
},
|
|
266
|
-
"schema": {
|
|
267
|
-
"type": "object",
|
|
268
|
-
"propertyNames": {
|
|
269
|
-
"type": "string"
|
|
270
|
-
},
|
|
271
|
-
"additionalProperties": {}
|
|
272
|
-
}
|
|
273
|
-
},
|
|
274
|
-
"required": [
|
|
275
|
-
"name",
|
|
276
|
-
"schema"
|
|
277
|
-
],
|
|
278
|
-
"additionalProperties": false
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
"slots": {
|
|
282
|
-
"minItems": 1,
|
|
283
|
-
"maxItems": 8,
|
|
284
|
-
"type": "array",
|
|
285
|
-
"items": {
|
|
286
|
-
"type": "string",
|
|
287
|
-
"pattern": "^[a-z][a-z0-9-]*$"
|
|
288
|
-
}
|
|
289
|
-
},
|
|
290
|
-
"widget": {
|
|
291
|
-
"type": "object",
|
|
292
|
-
"properties": {
|
|
293
|
-
"position": {
|
|
294
|
-
"type": "string",
|
|
295
|
-
"enum": [
|
|
296
|
-
"bottom-end",
|
|
297
|
-
"bottom-start",
|
|
298
|
-
"top-end",
|
|
299
|
-
"top-start"
|
|
300
|
-
]
|
|
301
|
-
},
|
|
302
|
-
"launcherIcon": {
|
|
303
|
-
"type": "string",
|
|
304
|
-
"minLength": 1
|
|
305
|
-
},
|
|
306
|
-
"defaultOpen": {
|
|
307
|
-
"type": "boolean"
|
|
308
|
-
}
|
|
309
|
-
},
|
|
310
|
-
"additionalProperties": false
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
"required": [
|
|
314
|
-
"name",
|
|
315
|
-
"layout",
|
|
316
|
-
"provider"
|
|
317
|
-
],
|
|
318
|
-
"additionalProperties": false
|
|
319
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* kai dev — validate → codegen → npm install (once per dependency change) →
|
|
3
|
-
* vite dev inside the generated project → watch the construct file.
|
|
4
|
-
*
|
|
5
|
-
* HMR comes free: on every construct edit we re-run the SAME generateProject
|
|
6
|
-
* and rewrite the source files in place; the running Vite server sees changed
|
|
7
|
-
* modules and hot-updates the open tab. A validation failure never touches the
|
|
8
|
-
* generated files — the reasons print and the LAST GOOD preview keeps running.
|
|
9
|
-
* Mock-first and keyless by default.
|
|
10
|
-
*/
|
|
11
|
-
import { createHash } from 'node:crypto';
|
|
12
|
-
import { spawn } from 'node:child_process';
|
|
13
|
-
import { existsSync, readFileSync, watch, writeFileSync } from 'node:fs';
|
|
14
|
-
import { basename, dirname, join, resolve } from 'node:path';
|
|
15
|
-
import { accentContrastNotice, generateProject, writeProject, type GeneratedFile, type GenerateOptions } from './codegen';
|
|
16
|
-
import { validateConstruct, type Construct, type ConstructProblem } from './schema';
|
|
17
|
-
import type { CliIo } from './cli';
|
|
18
|
-
|
|
19
|
-
export function workDirFor(name: string, root: string): string {
|
|
20
|
-
return join(root, '.kai', name);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function installKey(files: GeneratedFile[]): string {
|
|
24
|
-
const pkg = files.find((f) => f.path === 'package.json');
|
|
25
|
-
return createHash('sha256').update(pkg?.code ?? '').digest('hex');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type RegenOutcome =
|
|
29
|
-
| { ok: true; files: GeneratedFile[]; construct: Construct }
|
|
30
|
-
| { ok: false; problems: ConstructProblem[] };
|
|
31
|
-
|
|
32
|
-
/** One regen turn, injectable writer so the watch loop is testable. */
|
|
33
|
-
export function regenerate(
|
|
34
|
-
raw: unknown,
|
|
35
|
-
sink: { write: (files: GeneratedFile[], dir: string) => void },
|
|
36
|
-
dir: string,
|
|
37
|
-
opts: GenerateOptions = {},
|
|
38
|
-
): RegenOutcome {
|
|
39
|
-
const validated = validateConstruct(raw);
|
|
40
|
-
if (!validated.ok) return validated;
|
|
41
|
-
const files = generateProject(validated.construct, opts);
|
|
42
|
-
sink.write(files, dir);
|
|
43
|
-
return { ok: true, files, construct: validated.construct };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* One watch-triggered turn: read → regenerate → report. Exported so the
|
|
48
|
-
* "a throw during regen must not kill the loop" guarantee is unit-testable
|
|
49
|
-
* without spawning fs.watch, npm install or Vite. Never throws — every
|
|
50
|
-
* failure (invalid JSON, a rejected construct, or an exception from the
|
|
51
|
-
* sink's real fs writes) is reported via `io` and swallowed here, because
|
|
52
|
-
* this same body runs inside an fs.watch listener where an uncaught throw
|
|
53
|
-
* is an uncaught exception that crashes the whole `kai dev` process rather
|
|
54
|
-
* than leaving the last good preview running.
|
|
55
|
-
*/
|
|
56
|
-
export function regenTurn(
|
|
57
|
-
readRaw: () => unknown,
|
|
58
|
-
sink: { write: (files: GeneratedFile[], dir: string) => void },
|
|
59
|
-
dir: string,
|
|
60
|
-
opts: GenerateOptions,
|
|
61
|
-
io: CliIo,
|
|
62
|
-
): void {
|
|
63
|
-
try {
|
|
64
|
-
const raw = readRaw();
|
|
65
|
-
const out = regenerate(raw, sink, dir, opts);
|
|
66
|
-
if (!out.ok) {
|
|
67
|
-
io.error('construct rejected — last good preview stays up:');
|
|
68
|
-
for (const p of out.problems) io.error(` ${p.path || '(root)'}: ${p.message}`);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
io.log('construct changed — regenerated; Vite will hot-update the tab.');
|
|
72
|
-
const notice = accentContrastNotice(out.construct);
|
|
73
|
-
if (notice) io.log(notice);
|
|
74
|
-
} catch (err) {
|
|
75
|
-
io.error(`regen failed (${err instanceof Error ? err.message : String(err)}) — last good preview stays up`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const KEY_FILE = '.kai-install-key';
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* `npm install` in the generated workdir, but only when the emitted
|
|
83
|
-
* package.json actually changed since the last install (tracked via a hash
|
|
84
|
-
* written to KEY_FILE) — shared by `kai dev` (on first run and per regen) and
|
|
85
|
-
* `kai compile`, so there's one install path, not two.
|
|
86
|
-
*/
|
|
87
|
-
export async function ensureInstalled(dir: string, files: GeneratedFile[], io: CliIo): Promise<void> {
|
|
88
|
-
const key = installKey(files);
|
|
89
|
-
const keyPath = join(dir, KEY_FILE);
|
|
90
|
-
const installed = existsSync(keyPath) && readFileSync(keyPath, 'utf8') === key;
|
|
91
|
-
if (installed) return;
|
|
92
|
-
io.log(`installing dependencies in ${dir} (first run or deps changed)…`);
|
|
93
|
-
await new Promise<void>((done, fail) => {
|
|
94
|
-
const child = spawn('npm', ['install'], { cwd: dir, stdio: 'inherit' });
|
|
95
|
-
child.on('exit', (code) => (code === 0 ? done() : fail(new Error(`npm install exited ${code}`))));
|
|
96
|
-
});
|
|
97
|
-
writeFileSync(keyPath, key);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function dev(
|
|
101
|
-
constructPath: string,
|
|
102
|
-
opts: { io?: CliIo; uiSpec?: string } = {},
|
|
103
|
-
): Promise<never> {
|
|
104
|
-
const io = opts.io ?? { log: (s: string) => console.log(s), error: (s: string) => console.error(s) };
|
|
105
|
-
const abs = resolve(constructPath);
|
|
106
|
-
const readRaw = (): unknown => JSON.parse(readFileSync(abs, 'utf8'));
|
|
107
|
-
|
|
108
|
-
const first = validateConstruct(readRaw());
|
|
109
|
-
if (!first.ok) {
|
|
110
|
-
for (const p of first.problems) io.error(` ${p.path || '(root)'}: ${p.message}`);
|
|
111
|
-
process.exit(1);
|
|
112
|
-
}
|
|
113
|
-
const dir = workDirFor(first.construct.name, process.cwd());
|
|
114
|
-
const files = generateProject(first.construct, { uiSpec: opts.uiSpec });
|
|
115
|
-
writeProject(files, dir);
|
|
116
|
-
const firstNotice = accentContrastNotice(first.construct);
|
|
117
|
-
if (firstNotice) io.log(firstNotice);
|
|
118
|
-
|
|
119
|
-
await ensureInstalled(dir, files, io);
|
|
120
|
-
|
|
121
|
-
// Watch the PARENT DIRECTORY, not the file itself: most editors save by
|
|
122
|
-
// writing a temp file and renaming it over the original, which replaces the
|
|
123
|
-
// inode. fs.watch(path) on macOS/FSEvents stays bound to the old inode and
|
|
124
|
-
// goes permanently silent after that first rename — one edit works, every
|
|
125
|
-
// edit after it is dropped with no error. Watching the directory and
|
|
126
|
-
// filtering for the construct's basename survives rename-based saves.
|
|
127
|
-
const base = basename(abs);
|
|
128
|
-
watch(dirname(abs), (_event, filename) => {
|
|
129
|
-
if (filename !== base) return;
|
|
130
|
-
regenTurn(readRaw, { write: writeProject }, dir, { uiSpec: opts.uiSpec }, io);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
io.log(`previewing <${first.construct.name}> — edit ${abs} and watch the tab.`);
|
|
134
|
-
const vite = spawn('npm', ['run', 'dev'], { cwd: dir, stdio: 'inherit' });
|
|
135
|
-
// Explicit cleanup rather than relying on process-group/SIGINT defaults:
|
|
136
|
-
// whatever ends this process (a fatal error above, Ctrl-C, a signal from
|
|
137
|
-
// the shell) takes the Vite child down with it instead of orphaning it.
|
|
138
|
-
const killVite = () => vite.kill();
|
|
139
|
-
process.once('exit', killVite);
|
|
140
|
-
process.once('SIGINT', killVite);
|
|
141
|
-
process.once('SIGTERM', killVite);
|
|
142
|
-
return new Promise<never>((_, rejectP) => {
|
|
143
|
-
vite.on('exit', (code) => {
|
|
144
|
-
rejectP(new Error(`vite dev exited ${code}`));
|
|
145
|
-
process.exit(code ?? 0);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.kitn.ai/schemas/construct/v1.json",
|
|
3
|
-
"name": "ops-console",
|
|
4
|
-
"layout": "aside",
|
|
5
|
-
"provider": { "mode": "endpoint", "url": "/api/chat", "wire": "openai" },
|
|
6
|
-
"theme": { "accent": "#0ea5e9", "mode": "system" },
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"starters": ["Deploy payments to production", "Check the canary status"],
|
|
9
|
-
"attachments": { "accept": ["image/*", "application/pdf"] },
|
|
10
|
-
"history": { "persistence": "local" }
|
|
11
|
-
},
|
|
12
|
-
"cards": [
|
|
13
|
-
{
|
|
14
|
-
"name": "deployment_parameters",
|
|
15
|
-
"schema": {
|
|
16
|
-
"type": "object",
|
|
17
|
-
"title": "Deployment parameters",
|
|
18
|
-
"required": ["region", "ticket"],
|
|
19
|
-
"properties": {
|
|
20
|
-
"region": {
|
|
21
|
-
"type": "string",
|
|
22
|
-
"title": "Region",
|
|
23
|
-
"description": "Where the new revision lands first.",
|
|
24
|
-
"enum": ["us-east-1", "us-west-2", "eu-west-1"],
|
|
25
|
-
"default": "us-east-1",
|
|
26
|
-
"x-kai-widget": "select"
|
|
27
|
-
},
|
|
28
|
-
"ticket": {
|
|
29
|
-
"type": "string",
|
|
30
|
-
"title": "Change ticket",
|
|
31
|
-
"description": "CHG-#### from the change calendar. Shaped as you type.",
|
|
32
|
-
"pattern": "^CHG-[0-9]{4}$",
|
|
33
|
-
"x-kai-placeholder": "CHG-4821",
|
|
34
|
-
"x-kai-format": "custom",
|
|
35
|
-
"x-kai-mask": "CHG-####",
|
|
36
|
-
"x-kai-mask-guide": "CHG-####"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"x-kai-order": ["region", "ticket"],
|
|
40
|
-
"x-kai-submitLabel": "Draft the approval"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
]
|
|
44
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.kitn.ai/schemas/construct/v1.json",
|
|
3
|
-
"name": "acme-support",
|
|
4
|
-
"layout": "widget",
|
|
5
|
-
"provider": { "mode": "mock" },
|
|
6
|
-
"userId": "user_123",
|
|
7
|
-
"header": { "title": "Acme Support" },
|
|
8
|
-
"theme": { "unreadColor": "#38BDF8" },
|
|
9
|
-
"empty": {
|
|
10
|
-
"title": "Hi, we're Acme Support",
|
|
11
|
-
"description": "Ask us about orders, refunds, and more."
|
|
12
|
-
},
|
|
13
|
-
"home": {
|
|
14
|
-
"greeting": { "title": "Hi from Acme 👋", "subtitle": "Orders, refunds, anything." },
|
|
15
|
-
"recentConversation": true,
|
|
16
|
-
"links": [
|
|
17
|
-
{ "label": "Help center", "href": "https://ui.kitn.ai", "description": "Guides and FAQs", "icon": "book-open" },
|
|
18
|
-
{ "label": "Talk to sales", "description": "We reply fast", "icon": "message-circle" }
|
|
19
|
-
]
|
|
20
|
-
},
|
|
21
|
-
"widget": {
|
|
22
|
-
"position": "top-start",
|
|
23
|
-
"defaultOpen": true
|
|
24
|
-
},
|
|
25
|
-
"capabilities": {
|
|
26
|
-
"attachments": { "accept": ["image/*", "application/pdf"] },
|
|
27
|
-
"history": { "persistence": "local" },
|
|
28
|
-
"starters": ["Where's my order?", "Request a refund"],
|
|
29
|
-
"reasoningOpen": true,
|
|
30
|
-
"conversations": true
|
|
31
|
-
}
|
|
32
|
-
}
|