basalt-ui 1.10.0 → 1.12.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/AGENTS.md +21 -21
- package/CHANGELOG.md +25 -0
- package/README.md +36 -27
- package/agent/rules/basalt-content.md +16 -3
- package/dist/agent/adapter.d.ts +146 -0
- package/dist/agent/adapter.d.ts.map +1 -0
- package/dist/agent/adapter.js +473 -0
- package/dist/agent/adapter.test.d.ts +2 -0
- package/dist/agent/adapter.test.d.ts.map +1 -0
- package/dist/agent/ai-sdk-transport.d.ts +3 -52
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +108 -24
- package/dist/agent/ai-sdk-transport.test.d.ts +2 -0
- package/dist/agent/ai-sdk-transport.test.d.ts.map +1 -0
- package/dist/agent/coalesce.d.ts +42 -0
- package/dist/agent/coalesce.d.ts.map +1 -0
- package/dist/agent/coalesce.js +137 -0
- package/dist/agent/coalesce.test.d.ts +2 -0
- package/dist/agent/coalesce.test.d.ts.map +1 -0
- package/dist/agent/foreign.d.ts +97 -0
- package/dist/agent/foreign.d.ts.map +1 -0
- package/dist/agent/foreign.js +18 -0
- package/dist/agent/foreign.test.d.ts +2 -0
- package/dist/agent/foreign.test.d.ts.map +1 -0
- package/dist/agent/history.d.ts +2 -0
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/id.d.ts +65 -0
- package/dist/agent/id.d.ts.map +1 -0
- package/dist/agent/id.js +30 -0
- package/dist/agent/id.test.d.ts +2 -0
- package/dist/agent/id.test.d.ts.map +1 -0
- package/dist/agent/index.d.ts +11 -4
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +18 -3
- package/dist/agent/merge.d.ts +8 -0
- package/dist/agent/merge.d.ts.map +1 -0
- package/dist/agent/merge.js +35 -0
- package/dist/agent/merge.test.d.ts +2 -0
- package/dist/agent/merge.test.d.ts.map +1 -0
- package/dist/agent/part-list.d.ts +49 -34
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +53 -7
- package/dist/agent/part-list.test.d.ts +2 -0
- package/dist/agent/part-list.test.d.ts.map +1 -0
- package/dist/agent/parts.d.ts +135 -20
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/parts.js +138 -11
- package/dist/agent/parts.test.d.ts +2 -0
- package/dist/agent/parts.test.d.ts.map +1 -0
- package/dist/agent/thread.d.ts +14 -0
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +8 -2
- package/dist/agent/thread.test.d.ts +2 -0
- package/dist/agent/thread.test.d.ts.map +1 -0
- package/dist/agent/transport.d.ts +39 -3
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +20 -17
- package/dist/agent/transport.test.d.ts +2 -0
- package/dist/agent/transport.test.d.ts.map +1 -0
- package/dist/agent/use-agent-stream.d.ts +2 -1
- package/dist/agent/use-agent-stream.d.ts.map +1 -1
- package/dist/agent/use-agent-stream.js +5 -2
- package/dist/agent/use-agent-stream.test.d.ts +2 -0
- package/dist/agent/use-agent-stream.test.d.ts.map +1 -0
- package/dist/agent/use-agent-thread-runs.d.ts +9 -3
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +2 -0
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +1 -0
- package/dist/agent/use-agent-thread-runs.js +75 -23
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +2 -0
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +1 -0
- package/dist/agent/use-agent-thread-runs.test.d.ts +2 -0
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +1 -0
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +2 -0
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +1 -0
- package/dist/agent-chat/composer.d.ts +130 -8
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +189 -23
- package/dist/agent-chat/composer.test.d.ts +2 -0
- package/dist/agent-chat/composer.test.d.ts.map +1 -0
- package/dist/agent-chat/index.d.ts +3 -1
- package/dist/agent-chat/index.d.ts.map +1 -1
- package/dist/agent-chat/index.js +2 -0
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +1 -1
- package/dist/agent-chat/thread-message.d.ts +24 -7
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +115 -45
- package/dist/agent-chat/thread-message.test.d.ts +2 -0
- package/dist/agent-chat/thread-message.test.d.ts.map +1 -0
- package/dist/agent-chat/thread-workspace.js +1 -1
- package/dist/agent-chat/tool-chip.d.ts +21 -0
- package/dist/agent-chat/tool-chip.d.ts.map +1 -0
- package/dist/agent-chat/tool-chip.js +120 -0
- package/dist/agent-chat/tool-chip.test.d.ts +2 -0
- package/dist/agent-chat/tool-chip.test.d.ts.map +1 -0
- package/dist/charts/primitives/ChartFrame.test.d.ts +2 -0
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +1 -0
- package/dist/charts/utils/domain.test.d.ts +2 -0
- package/dist/charts/utils/domain.test.d.ts.map +1 -0
- package/dist/cli/check-theme.test.d.ts +2 -0
- package/dist/cli/check-theme.test.d.ts.map +1 -0
- package/dist/cli/help.test.d.ts +2 -0
- package/dist/cli/help.test.d.ts.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/init-sync.test.d.ts +2 -0
- package/dist/cli/init-sync.test.d.ts.map +1 -0
- package/dist/cli/placement-engine.test.d.ts +2 -0
- package/dist/cli/placement-engine.test.d.ts.map +1 -0
- package/dist/cli/tarball-parity.test.d.ts +2 -0
- package/dist/cli/tarball-parity.test.d.ts.map +1 -0
- package/dist/cli/template-format.test.d.ts +2 -0
- package/dist/cli/template-format.test.d.ts.map +1 -0
- package/dist/cli/template-ledger.test.d.ts +2 -0
- package/dist/cli/template-ledger.test.d.ts.map +1 -0
- package/dist/cli/tokens-css.test.d.ts +2 -0
- package/dist/cli/tokens-css.test.d.ts.map +1 -0
- package/dist/content/article-actions.test.d.ts +2 -0
- package/dist/content/article-actions.test.d.ts.map +1 -0
- package/dist/content/article-model.test.d.ts +2 -0
- package/dist/content/article-model.test.d.ts.map +1 -0
- package/dist/content/block-split.test.d.ts +2 -0
- package/dist/content/block-split.test.d.ts.map +1 -0
- package/dist/content/fence-block.d.ts +37 -10
- package/dist/content/fence-block.d.ts.map +1 -1
- package/dist/content/fence-block.js +80 -14
- package/dist/content/heading-components.d.ts.map +1 -1
- package/dist/content/heading-components.js +7 -4
- package/dist/content/heading-components.test.d.ts +2 -0
- package/dist/content/heading-components.test.d.ts.map +1 -0
- package/dist/content/index.d.ts +6 -3
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +5 -1
- package/dist/content/markdown.d.ts +101 -14
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +141 -28
- package/dist/content/markdown.test.d.ts +2 -0
- package/dist/content/markdown.test.d.ts.map +1 -0
- package/dist/content/prose.module.css.test.d.ts +2 -0
- package/dist/content/prose.module.css.test.d.ts.map +1 -0
- package/dist/content/sanitize.d.ts +170 -0
- package/dist/content/sanitize.d.ts.map +1 -0
- package/dist/content/sanitize.js +178 -0
- package/dist/content/sanitize.test.d.ts +2 -0
- package/dist/content/sanitize.test.d.ts.map +1 -0
- package/dist/content/slug.test.d.ts +2 -0
- package/dist/content/slug.test.d.ts.map +1 -0
- package/dist/dashboard/stat-card.test.d.ts +2 -0
- package/dist/dashboard/stat-card.test.d.ts.map +1 -0
- package/dist/guard/check-source.test.d.ts +2 -0
- package/dist/guard/check-source.test.d.ts.map +1 -0
- package/dist/guard/guard-hook.test.d.ts +2 -0
- package/dist/guard/guard-hook.test.d.ts.map +1 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +1 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/provider/index.test.d.ts +2 -0
- package/dist/provider/index.test.d.ts.map +1 -0
- package/dist/provider/lab-theme.test.d.ts +2 -0
- package/dist/provider/lab-theme.test.d.ts.map +1 -0
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +2 -0
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +1 -0
- package/dist/styles.floor.test.d.ts +2 -0
- package/dist/styles.floor.test.d.ts.map +1 -0
- package/dist/surfaces.d.ts +5 -5
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +13 -4
- package/dist/theme/border-coverage.test.d.ts +18 -0
- package/dist/theme/border-coverage.test.d.ts.map +1 -0
- package/dist/theme/contrast.test.d.ts +2 -0
- package/dist/theme/contrast.test.d.ts.map +1 -0
- package/dist/theme/density-option.test.d.ts +2 -0
- package/dist/theme/density-option.test.d.ts.map +1 -0
- package/dist/theme/density-relations.test.d.ts +2 -0
- package/dist/theme/density-relations.test.d.ts.map +1 -0
- package/dist/theme/derive-theme.test.d.ts +2 -0
- package/dist/theme/derive-theme.test.d.ts.map +1 -0
- package/dist/theme/fonts-option.test.d.ts +2 -0
- package/dist/theme/fonts-option.test.d.ts.map +1 -0
- package/dist/theme/radius-option.test.d.ts +2 -0
- package/dist/theme/radius-option.test.d.ts.map +1 -0
- package/dist/theme/radius.test.d.ts +2 -0
- package/dist/theme/radius.test.d.ts.map +1 -0
- package/dist/theme/shadow-surfaces.test.d.ts +26 -0
- package/dist/theme/shadow-surfaces.test.d.ts.map +1 -0
- package/dist/theme/spacing.test.d.ts +2 -0
- package/dist/theme/spacing.test.d.ts.map +1 -0
- package/dist/theme/use-basalt-spacing.test.d.ts +2 -0
- package/dist/theme/use-basalt-spacing.test.d.ts.map +1 -0
- package/dist/theme-lab/derive-controls.test.d.ts +2 -0
- package/dist/theme-lab/derive-controls.test.d.ts.map +1 -0
- package/dist/theme-lab/derive-state.test.d.ts +2 -0
- package/dist/theme-lab/derive-state.test.d.ts.map +1 -0
- package/dist/theme-lab/theme-lab.test.d.ts +2 -0
- package/dist/theme-lab/theme-lab.test.d.ts.map +1 -0
- package/dist/tokens/build-fonts-css.test.d.ts +2 -0
- package/dist/tokens/build-fonts-css.test.d.ts.map +1 -0
- package/dist/tokens/build-radius-css.test.d.ts +2 -0
- package/dist/tokens/build-radius-css.test.d.ts.map +1 -0
- package/dist/tokens/density.test.d.ts +2 -0
- package/dist/tokens/density.test.d.ts.map +1 -0
- package/dist/tokens/derive-radius.test.d.ts +2 -0
- package/dist/tokens/derive-radius.test.d.ts.map +1 -0
- package/dist/tokens/derive.test.d.ts +2 -0
- package/dist/tokens/derive.test.d.ts.map +1 -0
- package/dist/tokens/palette.test.d.ts +2 -0
- package/dist/tokens/palette.test.d.ts.map +1 -0
- package/dist/vite-color-mix.test.d.ts +2 -0
- package/dist/vite-color-mix.test.d.ts.map +1 -0
- package/dist/vite.test.d.ts +2 -0
- package/dist/vite.test.d.ts.map +1 -0
- package/llms.txt +7 -7
- package/package.json +6 -1
- package/src/agent/adapter.test.ts +1403 -0
- package/src/agent/adapter.ts +887 -0
- package/src/agent/ai-sdk-transport.test.ts +380 -55
- package/src/agent/ai-sdk-transport.ts +206 -53
- package/src/agent/coalesce.test.ts +387 -0
- package/src/agent/coalesce.ts +229 -0
- package/src/agent/foreign.test.ts +51 -0
- package/src/agent/foreign.ts +140 -0
- package/src/agent/history.ts +2 -0
- package/src/agent/id.test.ts +75 -0
- package/src/agent/id.ts +91 -0
- package/src/agent/index.ts +34 -3
- package/src/agent/merge.test.ts +206 -0
- package/src/agent/merge.ts +114 -0
- package/src/agent/part-list.test.tsx +112 -0
- package/src/agent/part-list.tsx +108 -35
- package/src/agent/parts.test.ts +516 -57
- package/src/agent/parts.ts +323 -32
- package/src/agent/thread.test.ts +75 -2
- package/src/agent/thread.ts +21 -1
- package/src/agent/transport.test.ts +70 -0
- package/src/agent/transport.ts +72 -20
- package/src/agent/use-agent-stream.test.tsx +53 -19
- package/src/agent/use-agent-stream.ts +13 -3
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +138 -0
- package/src/agent/use-agent-thread-runs.resume.test.tsx +44 -11
- package/src/agent/use-agent-thread-runs.test.tsx +418 -22
- package/src/agent/use-agent-thread-runs.ts +170 -26
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +15 -7
- package/src/agent-chat/composer.test.tsx +924 -0
- package/src/agent-chat/composer.tsx +521 -52
- package/src/agent-chat/index.ts +5 -1
- package/src/agent-chat/thread-detail-panel.tsx +3 -1
- package/src/agent-chat/thread-message.test.tsx +351 -0
- package/src/agent-chat/thread-message.tsx +262 -64
- package/src/agent-chat/thread-workspace.tsx +1 -1
- package/src/agent-chat/tool-chip.test.tsx +139 -0
- package/src/agent-chat/tool-chip.tsx +219 -0
- package/src/cli/index.ts +0 -1
- package/src/cli/template-format.test.ts +2 -2
- package/src/content/fence-block.tsx +242 -15
- package/src/content/heading-components.test.tsx +65 -0
- package/src/content/heading-components.tsx +26 -5
- package/src/content/index.ts +19 -3
- package/src/content/markdown.test.tsx +603 -0
- package/src/content/markdown.tsx +355 -35
- package/src/content/sanitize.test.ts +659 -0
- package/src/content/sanitize.ts +510 -0
- package/src/dashboard/stat-card.test.tsx +6 -1
- package/src/guard/check-source.test.ts +8 -4
- package/src/guard/index.ts +1 -3
- package/src/index.ts +15 -1
- package/src/surfaces.ts +13 -4
- package/src/theme/contrast.test.ts +1 -4
- package/src/theme/density-relations.test.ts +4 -2
- package/src/theme/fonts-option.test.ts +7 -1
- package/src/theme/shadow-surfaces.test.ts +12 -6
- package/src/theme/use-basalt-spacing.test.tsx +2 -1
package/dist/agent/index.d.ts
CHANGED
|
@@ -30,10 +30,15 @@
|
|
|
30
30
|
* )
|
|
31
31
|
* }
|
|
32
32
|
*/
|
|
33
|
-
export type { AgentPart, StartPart, TextPart, ReasoningPart, ToolCallPart, SourcePart, ErrorPart, } from './parts.js';
|
|
34
|
-
export { parseAgentPart, isStartPart } from './parts.js';
|
|
35
|
-
export
|
|
36
|
-
export {
|
|
33
|
+
export type { AgentPart, AgentPartDraft, Drafted, StartPart, TextPart, ReasoningPart, ToolCallPart, ToolCallState, SourcePart, ErrorPart, } from './parts.js';
|
|
34
|
+
export { parseAgentPart, isStartPart, isToolCallSettled, TERMINAL_TOOL_STATES } from './parts.js';
|
|
35
|
+
export { mergePart } from './merge.js';
|
|
36
|
+
export { withPartIds } from './id.js';
|
|
37
|
+
export { coalesceParts } from './coalesce.js';
|
|
38
|
+
export { definePartRenderers, narrowAgentPart } from './foreign.js';
|
|
39
|
+
export type { ForeignPart, TranscriptPart, ConsumerPart, PartRenderers, PartRenderContext, PartRenderer, } from './foreign.js';
|
|
40
|
+
export type { AgentTransport, ResumableAgentTransport } from './transport.js';
|
|
41
|
+
export { edenTransport, isResumable } from './transport.js';
|
|
37
42
|
export { aiSdkTransport } from './ai-sdk-transport.js';
|
|
38
43
|
export type { AiSdkTransport, AiSdkTransportOptions } from './ai-sdk-transport.js';
|
|
39
44
|
export { useAgentStream } from './use-agent-stream.js';
|
|
@@ -50,4 +55,6 @@ export { createThreadsStore } from './thread.js';
|
|
|
50
55
|
export type { AgentThread, ThreadStatus, ThreadsStore, ThreadsStoreOptions } from './thread.js';
|
|
51
56
|
export { heuristicOutcome } from './outcome.js';
|
|
52
57
|
export type { AgentOutcome, OutcomeResolver } from './outcome.js';
|
|
58
|
+
export { createAdapterThreadsStore, threadsStoreAdapterContract } from './adapter.js';
|
|
59
|
+
export type { AdapterThreadsStoreOptions, ThreadsStoreAdapter, ThreadsStoreAdapterContractCase, } from './adapter.js';
|
|
53
60
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,YAAY,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,YAAY,EACV,SAAS,EACT,cAAc,EACd,OAAO,EACP,SAAS,EACT,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAG9F,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGnC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAGlC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG1C,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChE,YAAY,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAA;AAGlB,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAG/E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAG5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAGvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAA;AAClF,YAAY,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,WAAW,CAAA"}
|
package/dist/agent/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { parseAgentPart, isStartPart } from "./parts.js";
|
|
2
|
-
import {
|
|
1
|
+
import { parseAgentPart, isStartPart, isToolCallSettled, TERMINAL_TOOL_STATES } from "./parts.js";
|
|
2
|
+
import { mergePart } from "./merge.js";
|
|
3
|
+
import { withPartIds } from "./id.js";
|
|
4
|
+
import { coalesceParts } from "./coalesce.js";
|
|
5
|
+
import { definePartRenderers, narrowAgentPart } from "./foreign.js";
|
|
6
|
+
import { edenTransport, isResumable } from "./transport.js";
|
|
3
7
|
import { aiSdkTransport } from "./ai-sdk-transport.js";
|
|
4
8
|
import { useAgentStream } from "./use-agent-stream.js";
|
|
5
9
|
import { useAgentThreadRuns } from "./use-agent-thread-runs.js";
|
|
@@ -8,16 +12,27 @@ import { BasaltStickToBottom } from "./stick-to-bottom.js";
|
|
|
8
12
|
import { createChatHistoryStore } from "./history.js";
|
|
9
13
|
import { createThreadsStore } from "./thread.js";
|
|
10
14
|
import { heuristicOutcome } from "./outcome.js";
|
|
15
|
+
import { createAdapterThreadsStore, threadsStoreAdapterContract } from "./adapter.js";
|
|
11
16
|
export {
|
|
12
17
|
BasaltStickToBottom,
|
|
13
18
|
PartList,
|
|
19
|
+
TERMINAL_TOOL_STATES,
|
|
14
20
|
aiSdkTransport,
|
|
21
|
+
coalesceParts,
|
|
22
|
+
createAdapterThreadsStore,
|
|
15
23
|
createChatHistoryStore,
|
|
16
24
|
createThreadsStore,
|
|
25
|
+
definePartRenderers,
|
|
17
26
|
edenTransport,
|
|
18
27
|
heuristicOutcome,
|
|
28
|
+
isResumable,
|
|
19
29
|
isStartPart,
|
|
30
|
+
isToolCallSettled,
|
|
31
|
+
mergePart,
|
|
32
|
+
narrowAgentPart,
|
|
20
33
|
parseAgentPart,
|
|
34
|
+
threadsStoreAdapterContract,
|
|
21
35
|
useAgentStream,
|
|
22
|
-
useAgentThreadRuns
|
|
36
|
+
useAgentThreadRuns,
|
|
37
|
+
withPartIds
|
|
23
38
|
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The structural bound `mergePart` (and the hooks that call it) actually need — an `AgentPart` or
|
|
2
|
+
* a `ForeignPart` both satisfy it, so this is the widened constraint, not a new closed union. */
|
|
3
|
+
export type PartLike = {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly type: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function mergePart<TPart extends PartLike>(parts: readonly TPart[], next: TPart): TPart[];
|
|
8
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/agent/merge.ts"],"names":[],"mappings":"AAkCA;iGACiG;AACjG,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAoDrE,wBAAgB,SAAS,CAAC,KAAK,SAAS,QAAQ,EAAE,KAAK,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,CAyB/F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function isTextLikeType(type) {
|
|
2
|
+
return type === "text" || type === "reasoning";
|
|
3
|
+
}
|
|
4
|
+
function spliceText(existingText, next) {
|
|
5
|
+
const offset = clampOffset(next.offset ?? existingText.length, existingText.length);
|
|
6
|
+
return existingText.slice(0, offset) + next.text + existingText.slice(offset + next.text.length);
|
|
7
|
+
}
|
|
8
|
+
function clampOffset(offset, length) {
|
|
9
|
+
const clamped = Number.isFinite(offset) ? Math.min(Math.max(offset, 0), length) : length;
|
|
10
|
+
if (clamped !== offset && process.env["NODE_ENV"] !== "production") {
|
|
11
|
+
console.warn(
|
|
12
|
+
`[basalt] mergePart: text offset ${offset} out of range [0, ${length}] \u2014 clamped to ${clamped}`
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
return clamped;
|
|
16
|
+
}
|
|
17
|
+
function mergePart(parts, next) {
|
|
18
|
+
const index = parts.findIndex((part) => part.id === next.id);
|
|
19
|
+
const existing = index === -1 ? void 0 : parts[index];
|
|
20
|
+
const spliceable = isTextLikeType(next.type) && (existing === void 0 || existing.type === next.type);
|
|
21
|
+
const merged = spliceable ? {
|
|
22
|
+
...next,
|
|
23
|
+
text: spliceText(
|
|
24
|
+
existing === void 0 ? "" : existing.text,
|
|
25
|
+
next
|
|
26
|
+
)
|
|
27
|
+
} : next;
|
|
28
|
+
if (existing === void 0) return [...parts, merged];
|
|
29
|
+
const out = parts.slice();
|
|
30
|
+
out[index] = merged;
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
mergePart
|
|
35
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/agent/merge.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
import type { JSX } from 'react';
|
|
2
2
|
import type { AgentPart } from './parts.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
index: number;
|
|
14
|
-
}) => JSX.Element | null;
|
|
15
|
-
export type ToolCallPartRenderer<TPart extends AgentPart = AgentPart> = (props: {
|
|
16
|
-
part: Extract<TPart, {
|
|
17
|
-
type: 'tool';
|
|
18
|
-
}>;
|
|
19
|
-
index: number;
|
|
20
|
-
}) => JSX.Element | null;
|
|
21
|
-
export type SourcePartRenderer<TPart extends AgentPart = AgentPart> = (props: {
|
|
22
|
-
part: Extract<TPart, {
|
|
23
|
-
type: 'source';
|
|
24
|
-
}>;
|
|
25
|
-
index: number;
|
|
26
|
-
}) => JSX.Element | null;
|
|
27
|
-
export type ErrorPartRenderer<TPart extends AgentPart = AgentPart> = (props: {
|
|
28
|
-
part: Extract<TPart, {
|
|
29
|
-
type: 'error';
|
|
30
|
-
}>;
|
|
3
|
+
/**
|
|
4
|
+
* The per-renderer argument. `settled` is `false` only while the message these parts belong to is
|
|
5
|
+
* still streaming — it converges this map toward the `PartRenderContext` a foreign renderer
|
|
6
|
+
* already receives (`./foreign`), rather than adding a third shape. Additive and
|
|
7
|
+
* source-compatible: an existing `({ part }) => …` renderer simply ignores it.
|
|
8
|
+
*
|
|
9
|
+
* Settlement is MONOTONE — a message that has settled never un-settles.
|
|
10
|
+
*/
|
|
11
|
+
type PartRenderArgs<TPart> = {
|
|
12
|
+
part: TPart;
|
|
31
13
|
index: number;
|
|
32
|
-
|
|
14
|
+
settled: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type TextPartRenderer<TPart extends AgentPart = AgentPart> = (props: PartRenderArgs<Extract<TPart, {
|
|
17
|
+
type: 'text';
|
|
18
|
+
}>>) => JSX.Element | null;
|
|
19
|
+
export type ReasoningPartRenderer<TPart extends AgentPart = AgentPart> = (props: PartRenderArgs<Extract<TPart, {
|
|
20
|
+
type: 'reasoning';
|
|
21
|
+
}>>) => JSX.Element | null;
|
|
22
|
+
export type ToolCallPartRenderer<TPart extends AgentPart = AgentPart> = (props: PartRenderArgs<Extract<TPart, {
|
|
23
|
+
type: 'tool';
|
|
24
|
+
}>>) => JSX.Element | null;
|
|
25
|
+
export type SourcePartRenderer<TPart extends AgentPart = AgentPart> = (props: PartRenderArgs<Extract<TPart, {
|
|
26
|
+
type: 'source';
|
|
27
|
+
}>>) => JSX.Element | null;
|
|
28
|
+
export type ErrorPartRenderer<TPart extends AgentPart = AgentPart> = (props: PartRenderArgs<Extract<TPart, {
|
|
29
|
+
type: 'error';
|
|
30
|
+
}>>) => JSX.Element | null;
|
|
33
31
|
/**
|
|
34
32
|
* Partial map of per-type renderers. Any omitted key falls back to the headless default.
|
|
35
33
|
*
|
|
36
34
|
* @example
|
|
37
35
|
* const renderers: Partial<AgentPartRenderers> = {
|
|
38
|
-
* text: ({ part }) =>
|
|
36
|
+
* text: ({ part, settled }) => (
|
|
37
|
+
* <Markdown streaming={!settled} contentTrust="untrusted" density="chat">{part.text}</Markdown>
|
|
38
|
+
* ),
|
|
39
39
|
* }
|
|
40
40
|
*/
|
|
41
41
|
export type AgentPartRenderers<TPart extends AgentPart = AgentPart> = {
|
|
@@ -50,10 +50,17 @@ export type PartListProps<TPart extends AgentPart = AgentPart> = {
|
|
|
50
50
|
readonly parts: TPart[];
|
|
51
51
|
/**
|
|
52
52
|
* Override individual part renderers. Omitted keys fall back to the headless defaults.
|
|
53
|
-
* Pass `{ text: ({ part }) => <Markdown streaming density="chat">{part.text}</Markdown> }`
|
|
54
|
-
* enable rich markdown rendering.
|
|
53
|
+
* Pass `{ text: ({ part, settled }) => <Markdown streaming={!settled} contentTrust="untrusted" density="chat">{part.text}</Markdown> }`
|
|
54
|
+
* to enable rich markdown rendering.
|
|
55
55
|
*/
|
|
56
56
|
readonly components?: Partial<AgentPartRenderers<TPart>>;
|
|
57
|
+
/**
|
|
58
|
+
* `false` while the message these parts belong to is still streaming — forwarded to every
|
|
59
|
+
* renderer so a text renderer can drop out of streaming mode (and a fenced mermaid/diagram can
|
|
60
|
+
* upgrade) once the turn finishes. Defaults to `true`: a caller that knows nothing about a run
|
|
61
|
+
* is rendering a finished list, and un-settled must be opted into by the thing that does know.
|
|
62
|
+
*/
|
|
63
|
+
readonly settled?: boolean;
|
|
57
64
|
};
|
|
58
65
|
/**
|
|
59
66
|
* Renders a list of AgentPart values via an exhaustive switch over part.type.
|
|
@@ -69,7 +76,15 @@ export type PartListProps<TPart extends AgentPart = AgentPart> = {
|
|
|
69
76
|
* // With basalt's own Markdown for the text renderer:
|
|
70
77
|
* import { PartList } from 'basalt-ui/agent'
|
|
71
78
|
* import { Markdown } from 'basalt-ui/content'
|
|
72
|
-
* <PartList
|
|
79
|
+
* <PartList
|
|
80
|
+
* parts={parts}
|
|
81
|
+
* components={{
|
|
82
|
+
* text: ({ part, settled }) => (
|
|
83
|
+
* <Markdown streaming={!settled} contentTrust="untrusted" density="chat">{part.text}</Markdown>
|
|
84
|
+
* ),
|
|
85
|
+
* }}
|
|
86
|
+
* />
|
|
73
87
|
*/
|
|
74
|
-
export declare function PartList<TPart extends AgentPart = AgentPart>({ parts, components, }: PartListProps<TPart>): JSX.Element;
|
|
88
|
+
export declare function PartList<TPart extends AgentPart = AgentPart>({ parts, components, settled, }: PartListProps<TPart>): JSX.Element;
|
|
89
|
+
export {};
|
|
75
90
|
//# sourceMappingURL=part-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"part-list.d.ts","sourceRoot":"","sources":["../../src/agent/part-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"part-list.d.ts","sourceRoot":"","sources":["../../src/agent/part-list.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,SAAS,CAAA;AAIhB;;;;;;;GAOG;AACH,KAAK,cAAc,CAAC,KAAK,IAAI;IAC3B,IAAI,EAAE,KAAK,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,CAClE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,KACpD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;AAEvB,MAAM,MAAM,qBAAqB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,CACvE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,KACzD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;AAEvB,MAAM,MAAM,oBAAoB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,CACtE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,KACpD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;AAEvB,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,CACpE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,KACtD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;AAEvB,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,CACnE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,KACrD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;AAEvB;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI;IACpE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAChD,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC1C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC1C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;CACzC,CAAA;AAqJD,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI;IAC/D,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,SAAS,SAAS,GAAG,SAAS,EAAE,EAC5D,KAAK,EACL,UAAU,EACV,OAAc,GACf,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,CAoFpC"}
|
package/dist/agent/part-list.js
CHANGED
|
@@ -22,6 +22,10 @@ const CODE_BLOCK_STYLE = {
|
|
|
22
22
|
padding: "var(--vx-space-agent-code-inset)",
|
|
23
23
|
overflowX: "auto"
|
|
24
24
|
};
|
|
25
|
+
const STATUS_LINE_STYLE = {
|
|
26
|
+
marginTop: "var(--vx-space-agent-part-gap-top)",
|
|
27
|
+
color: VX.status.bad
|
|
28
|
+
};
|
|
25
29
|
function DefaultText({ part }) {
|
|
26
30
|
return /* @__PURE__ */ jsx(
|
|
27
31
|
"div",
|
|
@@ -56,7 +60,13 @@ function DefaultToolCall({ part }) {
|
|
|
56
60
|
return /* @__PURE__ */ jsxs("div", { className: "basalt-agent-tool", style: RAIL_STYLE, children: [
|
|
57
61
|
/* @__PURE__ */ jsx("span", { className: "basalt-agent-tool-name", style: MICRO_LABEL_STYLE, children: part.toolName }),
|
|
58
62
|
/* @__PURE__ */ jsx("pre", { className: "basalt-agent-tool-input", style: CODE_BLOCK_STYLE, children: JSON.stringify(part.input, null, 2) }),
|
|
59
|
-
part.output !== void 0 && /* @__PURE__ */ jsx("pre", { className: "basalt-agent-tool-
|
|
63
|
+
part.state === "output-error" && part.input === void 0 && part.rawInput !== void 0 && /* @__PURE__ */ jsx("pre", { className: "basalt-agent-tool-raw-input", style: CODE_BLOCK_STYLE, children: JSON.stringify(part.rawInput, null, 2) }),
|
|
64
|
+
part.state === "output-available" && /* @__PURE__ */ jsx("pre", { className: "basalt-agent-tool-output", style: CODE_BLOCK_STYLE, children: JSON.stringify(part.output, null, 2) }),
|
|
65
|
+
part.state === "output-error" && /* @__PURE__ */ jsx("div", { className: "basalt-agent-tool-error", role: "alert", style: STATUS_LINE_STYLE, children: part.errorText }),
|
|
66
|
+
part.state === "output-denied" && /* @__PURE__ */ jsxs("div", { className: "basalt-agent-tool-denied", style: STATUS_LINE_STYLE, children: [
|
|
67
|
+
"Denied",
|
|
68
|
+
part.approval.reason !== void 0 ? `: ${part.approval.reason}` : ""
|
|
69
|
+
] })
|
|
60
70
|
] });
|
|
61
71
|
}
|
|
62
72
|
function DefaultSource({ part }) {
|
|
@@ -97,7 +107,8 @@ const DEFAULT_RENDERERS = {
|
|
|
97
107
|
};
|
|
98
108
|
function PartList({
|
|
99
109
|
parts,
|
|
100
|
-
components
|
|
110
|
+
components,
|
|
111
|
+
settled = true
|
|
101
112
|
}) {
|
|
102
113
|
const renderers = useMemo(
|
|
103
114
|
() => ({ ...DEFAULT_RENDERERS, ...components }),
|
|
@@ -109,23 +120,58 @@ function PartList({
|
|
|
109
120
|
return null;
|
|
110
121
|
case "text": {
|
|
111
122
|
const Render = renderers.text;
|
|
112
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
123
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
124
|
+
Render,
|
|
125
|
+
{
|
|
126
|
+
part,
|
|
127
|
+
index,
|
|
128
|
+
settled
|
|
129
|
+
}
|
|
130
|
+
) }, part.id);
|
|
113
131
|
}
|
|
114
132
|
case "reasoning": {
|
|
115
133
|
const Render = renderers.reasoning;
|
|
116
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
134
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
135
|
+
Render,
|
|
136
|
+
{
|
|
137
|
+
part,
|
|
138
|
+
index,
|
|
139
|
+
settled
|
|
140
|
+
}
|
|
141
|
+
) }, part.id);
|
|
117
142
|
}
|
|
118
143
|
case "tool": {
|
|
119
144
|
const Render = renderers.tool;
|
|
120
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
145
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
146
|
+
Render,
|
|
147
|
+
{
|
|
148
|
+
part,
|
|
149
|
+
index,
|
|
150
|
+
settled
|
|
151
|
+
}
|
|
152
|
+
) }, part.id);
|
|
121
153
|
}
|
|
122
154
|
case "source": {
|
|
123
155
|
const Render = renderers.source;
|
|
124
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
156
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
157
|
+
Render,
|
|
158
|
+
{
|
|
159
|
+
part,
|
|
160
|
+
index,
|
|
161
|
+
settled
|
|
162
|
+
}
|
|
163
|
+
) }, part.id);
|
|
125
164
|
}
|
|
126
165
|
case "error": {
|
|
127
166
|
const Render = renderers.error;
|
|
128
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
167
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
168
|
+
Render,
|
|
169
|
+
{
|
|
170
|
+
part,
|
|
171
|
+
index,
|
|
172
|
+
settled
|
|
173
|
+
}
|
|
174
|
+
) }, part.id);
|
|
129
175
|
}
|
|
130
176
|
default:
|
|
131
177
|
return assertNever(part);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"part-list.test.d.ts","sourceRoot":"","sources":["../../src/agent/part-list.test.tsx"],"names":[],"mappings":""}
|
package/dist/agent/parts.d.ts
CHANGED
|
@@ -3,12 +3,20 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Exhaustiveness is enforced at every switch via assertNever (imported from '../register.js').
|
|
5
5
|
* Adding a new variant without a matching case is a tsc error — see the fixture in
|
|
6
|
-
* apps/playground/src/demo/agent-part.type-guard.ts.
|
|
6
|
+
* apps/playground/src/demo/agent-part.type-guard.ts. One caveat for code that folds WIRE data on
|
|
7
|
+
* the render path (`coalesceParts`): keep the compile-time guarantee — bind the value at `never` —
|
|
8
|
+
* but do NOT let the runtime throw, or one malformed chunk kills the whole transcript. See
|
|
9
|
+
* `mergeToolPart`'s default branch for that shape.
|
|
7
10
|
*
|
|
8
11
|
* Eden #231 doctrine: the server-side Elysia route MUST declare `: AsyncGenerator<AgentPart>`
|
|
9
12
|
* explicitly and carry NO t.Object/t.Union response schema. Validate at yield-time. See
|
|
10
13
|
* agent/rules/basalt-agent.md for the full doctrine.
|
|
11
14
|
*
|
|
15
|
+
* Part identity: every variant carries a stable `id` (see `PartBase`). Transports are permitted to
|
|
16
|
+
* yield a DRAFT — `id` omitted — via `AgentPartDraft`; the consuming hooks (or `withPartIds`)
|
|
17
|
+
* normalize a draft into a fully-identified part before it is ever accumulated. `parseAgentPart`
|
|
18
|
+
* validates the FULL (identified) shape — a draft is a separate, narrower concern.
|
|
19
|
+
*
|
|
12
20
|
* @example
|
|
13
21
|
* import type { AgentPart } from 'basalt-ui/agent'
|
|
14
22
|
* function describe(p: AgentPart): string {
|
|
@@ -23,49 +31,143 @@
|
|
|
23
31
|
* }
|
|
24
32
|
* }
|
|
25
33
|
*/
|
|
34
|
+
/** Every AgentPart variant carries a stable id — the addressing key for `mergePart`/`coalesceParts`. */
|
|
35
|
+
type PartBase = {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
};
|
|
26
38
|
/**
|
|
27
39
|
* Emitted once at stream start, carrying the run id and an opaque token a transport can use to
|
|
28
40
|
* resume this run after a disconnect. Not renderable content — UI code should treat it as a
|
|
29
41
|
* no-op signal, not conversation content.
|
|
30
42
|
*/
|
|
31
|
-
export type StartPart = {
|
|
43
|
+
export type StartPart = PartBase & {
|
|
32
44
|
readonly type: 'start';
|
|
33
45
|
readonly runId: string;
|
|
34
46
|
readonly resumeToken?: string;
|
|
35
47
|
};
|
|
36
|
-
/**
|
|
37
|
-
|
|
48
|
+
/**
|
|
49
|
+
* A streamed text fragment from the assistant. `offset` is the character position of this delta
|
|
50
|
+
* inside its part (undefined = append at the tail) — the mechanism `mergePart` uses to splice a
|
|
51
|
+
* replayed delta in place rather than duplicating it.
|
|
52
|
+
*/
|
|
53
|
+
export type TextPart = PartBase & {
|
|
38
54
|
readonly type: 'text';
|
|
39
55
|
readonly text: string;
|
|
56
|
+
readonly offset?: number;
|
|
40
57
|
};
|
|
41
|
-
/** An internal reasoning/thinking fragment (may be hidden in the UI). */
|
|
42
|
-
export type ReasoningPart = {
|
|
58
|
+
/** An internal reasoning/thinking fragment (may be hidden in the UI). Same `offset` mechanism as TextPart. */
|
|
59
|
+
export type ReasoningPart = PartBase & {
|
|
43
60
|
readonly type: 'reasoning';
|
|
44
61
|
readonly text: string;
|
|
62
|
+
readonly offset?: number;
|
|
63
|
+
};
|
|
64
|
+
/** The nested approval envelope — mirrors the SDK's shape verbatim, never flattened. */
|
|
65
|
+
type ToolApproval = {
|
|
66
|
+
readonly id: string;
|
|
67
|
+
readonly approved?: boolean;
|
|
68
|
+
readonly reason?: string;
|
|
69
|
+
readonly isAutomatic?: boolean;
|
|
70
|
+
readonly signature?: string;
|
|
71
|
+
};
|
|
72
|
+
type ToolCallBase = PartBase & {
|
|
73
|
+
readonly type: 'tool';
|
|
74
|
+
readonly toolName: string;
|
|
75
|
+
/** Wall-clock time from first sighting of this toolCallId to its terminal state. */
|
|
76
|
+
readonly durationMs?: number;
|
|
77
|
+
readonly providerExecuted?: boolean;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* The three IN-FLIGHT states (`input-streaming`, `input-available`, `approval-requested`) carry an
|
|
81
|
+
* authoritative `toolCallId` — the merge key, and for them it is structural. An in-flight part
|
|
82
|
+
* exists only to be superseded by the settled part for the same call; with no merge key it can
|
|
83
|
+
* never be closed, so it would render as a forever-pending chip standing beside the real result.
|
|
84
|
+
* Nothing is lost by rejecting an unidentified one either: the `toolName` and `input` it carries
|
|
85
|
+
* are re-supplied on the settled part. `parseToolCallPart` therefore rejects these when the id is
|
|
86
|
+
* missing or empty.
|
|
87
|
+
*/
|
|
88
|
+
type Identified = ToolCallBase & {
|
|
89
|
+
readonly toolCallId: string;
|
|
45
90
|
};
|
|
46
91
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
92
|
+
* The four SETTLED states (`approval-responded` plus the three terminal ones) may legitimately
|
|
93
|
+
* arrive without a `toolCallId`, for two different reasons.
|
|
94
|
+
*
|
|
95
|
+
* `approval-responded` is where the WIRE omits it: the SDK's `tool-approval-response` chunk
|
|
96
|
+
* carries none, and it is resolved by reverse lookup on `approval.id` (coalesce.ts keeps the
|
|
97
|
+
* approvalId -> toolCallId side index that does it).
|
|
49
98
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
99
|
+
* The three terminal states admit the absence for a different reason — tolerance, not wire shape.
|
|
100
|
+
* They are self-contained: each carries the OUTCOME of the call, so a missing id costs only the
|
|
101
|
+
* fold (`coalesceParts` keeps an unresolvable part as its own block and never discards it).
|
|
102
|
+
* Rejecting one instead would delete the only record of how the call ended — silent data loss in a
|
|
103
|
+
* transcript, strictly worse than an unfolded block.
|
|
104
|
+
*
|
|
105
|
+
* The absence is modelled here rather than smuggled through an empty-string sentinel: the union
|
|
106
|
+
* previously declared an always-meaningful `string` that the `approval-responded` wire shape
|
|
107
|
+
* cannot supply, which forced a `''` sentinel into the type and an `as unknown as` cast into every
|
|
108
|
+
* test that built one. A `''` toolCallId is not a value any state accepts; `parseToolCallPart`
|
|
109
|
+
* normalizes one to absent at the wire boundary, so it never reaches the type or a consumer.
|
|
53
110
|
*/
|
|
54
|
-
|
|
55
|
-
readonly type: 'tool';
|
|
56
|
-
readonly toolName: string;
|
|
57
|
-
readonly input: unknown;
|
|
58
|
-
readonly output?: unknown;
|
|
111
|
+
type MaybeIdentified = ToolCallBase & {
|
|
59
112
|
readonly toolCallId?: string;
|
|
60
113
|
};
|
|
114
|
+
export type ToolCallPart = (Identified & {
|
|
115
|
+
readonly state: 'input-streaming';
|
|
116
|
+
readonly input?: unknown;
|
|
117
|
+
}) | (Identified & {
|
|
118
|
+
readonly state: 'input-available';
|
|
119
|
+
readonly input: unknown;
|
|
120
|
+
}) | (Identified & {
|
|
121
|
+
readonly state: 'approval-requested';
|
|
122
|
+
readonly input: unknown;
|
|
123
|
+
readonly approval: ToolApproval & {
|
|
124
|
+
readonly approved?: never;
|
|
125
|
+
readonly reason?: never;
|
|
126
|
+
};
|
|
127
|
+
}) | (MaybeIdentified & {
|
|
128
|
+
readonly state: 'approval-responded';
|
|
129
|
+
readonly input: unknown;
|
|
130
|
+
readonly approval: ToolApproval & {
|
|
131
|
+
readonly approved: boolean;
|
|
132
|
+
};
|
|
133
|
+
}) | (MaybeIdentified & {
|
|
134
|
+
readonly state: 'output-available';
|
|
135
|
+
readonly input: unknown;
|
|
136
|
+
readonly output: unknown;
|
|
137
|
+
readonly preliminary?: boolean;
|
|
138
|
+
readonly approval?: ToolApproval & {
|
|
139
|
+
readonly approved?: true;
|
|
140
|
+
};
|
|
141
|
+
}) | (MaybeIdentified & {
|
|
142
|
+
readonly state: 'output-error';
|
|
143
|
+
readonly input?: unknown;
|
|
144
|
+
/** The SDK's field name — there is no field named `error` anywhere in the union. */
|
|
145
|
+
readonly errorText: string;
|
|
146
|
+
/** The only place the raw, un-parsed input survives — what lets a UI render a call whose input never validated. */
|
|
147
|
+
readonly rawInput?: unknown;
|
|
148
|
+
readonly approval?: ToolApproval & {
|
|
149
|
+
readonly approved?: true;
|
|
150
|
+
};
|
|
151
|
+
}) | (MaybeIdentified & {
|
|
152
|
+
readonly state: 'output-denied';
|
|
153
|
+
readonly input: unknown;
|
|
154
|
+
readonly approval: ToolApproval & {
|
|
155
|
+
readonly approved: false;
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
export type ToolCallState = ToolCallPart['state'];
|
|
159
|
+
/** The three states a tool call can never leave — see `isToolCallSettled`. */
|
|
160
|
+
export declare const TERMINAL_TOOL_STATES: readonly ["output-available", "output-error", "output-denied"];
|
|
161
|
+
/** True once a tool call has reached one of `TERMINAL_TOOL_STATES` — no further state transition. */
|
|
162
|
+
export declare function isToolCallSettled(part: ToolCallPart): boolean;
|
|
61
163
|
/** A cited source URL referenced by the assistant. */
|
|
62
|
-
export type SourcePart = {
|
|
164
|
+
export type SourcePart = PartBase & {
|
|
63
165
|
readonly type: 'source';
|
|
64
166
|
readonly url: string;
|
|
65
167
|
readonly title?: string;
|
|
66
168
|
};
|
|
67
169
|
/** A fatal or recoverable error emitted in-stream by the agent. */
|
|
68
|
-
export type ErrorPart = {
|
|
170
|
+
export type ErrorPart = PartBase & {
|
|
69
171
|
readonly type: 'error';
|
|
70
172
|
readonly message: string;
|
|
71
173
|
};
|
|
@@ -73,12 +175,24 @@ export type ErrorPart = {
|
|
|
73
175
|
* The complete discriminated union of all structured agent stream parts.
|
|
74
176
|
*
|
|
75
177
|
* @example
|
|
76
|
-
* const part: AgentPart = { type: 'text', text: 'Hello' }
|
|
178
|
+
* const part: AgentPart = { id: 'p1', type: 'text', text: 'Hello' }
|
|
77
179
|
*/
|
|
78
180
|
export type AgentPart = StartPart | TextPart | ReasoningPart | ToolCallPart | SourcePart | ErrorPart;
|
|
181
|
+
/**
|
|
182
|
+
* An AgentPart with `id` optional — the shape a transport is allowed to yield. The naked type
|
|
183
|
+
* parameter (not `AgentPart extends unknown ? ... : never` written some other way) is deliberate:
|
|
184
|
+
* it makes the conditional type distribute over the AgentPart union member-by-member, so
|
|
185
|
+
* `Drafted<AgentPart>` is `Drafted<StartPart> | Drafted<TextPart> | ...` rather than one flattened
|
|
186
|
+
* (and wrong) shape.
|
|
187
|
+
*/
|
|
188
|
+
export type Drafted<T> = T extends unknown ? Omit<T, 'id'> & {
|
|
189
|
+
readonly id?: string;
|
|
190
|
+
} : never;
|
|
191
|
+
export type AgentPartDraft = Drafted<AgentPart>;
|
|
79
192
|
/**
|
|
80
193
|
* Runtime type-narrowing guard: validates an unknown value against the AgentPart discriminated
|
|
81
|
-
* union and returns the narrowed type or null when validation fails.
|
|
194
|
+
* union and returns the narrowed type or null when validation fails. Validates the FULL
|
|
195
|
+
* (identified) shape — an `id`-less draft is a separate concern handled by `withPartIds`.
|
|
82
196
|
*
|
|
83
197
|
* @example
|
|
84
198
|
* const raw = JSON.parse(line)
|
|
@@ -88,4 +202,5 @@ export type AgentPart = StartPart | TextPart | ReasoningPart | ToolCallPart | So
|
|
|
88
202
|
export declare function parseAgentPart(raw: unknown): AgentPart | null;
|
|
89
203
|
/** Type guard: narrows an unknown value to StartPart. */
|
|
90
204
|
export declare function isStartPart(part: unknown): part is StartPart;
|
|
205
|
+
export {};
|
|
91
206
|
//# sourceMappingURL=parts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/agent/parts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/agent/parts.ts"],"names":[],"mappings":"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"}
|