@seed-ship/mcp-ui-solid 6.6.0 → 6.7.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/adapters/index.d.ts +2 -1
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/adapters/macro-run.cjs +226 -0
  5. package/dist/adapters/macro-run.cjs.map +1 -0
  6. package/dist/adapters/macro-run.d.ts +65 -0
  7. package/dist/adapters/macro-run.d.ts.map +1 -0
  8. package/dist/adapters/macro-run.js +226 -0
  9. package/dist/adapters/macro-run.js.map +1 -0
  10. package/dist/adapters.cjs +3 -0
  11. package/dist/adapters.cjs.map +1 -1
  12. package/dist/adapters.d.cts +2 -1
  13. package/dist/adapters.d.ts +2 -1
  14. package/dist/adapters.js +4 -1
  15. package/dist/adapters.js.map +1 -1
  16. package/dist/components/ActionGroupRenderer.cjs +12 -3
  17. package/dist/components/ActionGroupRenderer.cjs.map +1 -1
  18. package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
  19. package/dist/components/ActionGroupRenderer.js +12 -3
  20. package/dist/components/ActionGroupRenderer.js.map +1 -1
  21. package/dist/components/UIResourceRenderer.cjs +22 -15
  22. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  23. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  24. package/dist/components/UIResourceRenderer.js +22 -15
  25. package/dist/components/UIResourceRenderer.js.map +1 -1
  26. package/dist/context/MCPActionContext.cjs +4 -1
  27. package/dist/context/MCPActionContext.cjs.map +1 -1
  28. package/dist/context/MCPActionContext.d.ts +13 -1
  29. package/dist/context/MCPActionContext.d.ts.map +1 -1
  30. package/dist/context/MCPActionContext.js +4 -1
  31. package/dist/context/MCPActionContext.js.map +1 -1
  32. package/dist/mcp-ui-spec/dist/schemas.cjs +250 -1
  33. package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
  34. package/dist/mcp-ui-spec/dist/schemas.js +251 -2
  35. package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
  36. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs +2 -0
  37. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs.map +1 -1
  38. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +2 -0
  39. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js.map +1 -1
  40. package/package.json +2 -2
  41. package/src/adapters/index.ts +4 -5
  42. package/src/adapters/macro-run.test.ts +293 -0
  43. package/src/adapters/macro-run.ts +362 -0
  44. package/src/components/ActionGroupRenderer.test.tsx +1 -0
  45. package/src/components/ActionGroupRenderer.tsx +19 -4
  46. package/src/components/ActionSubmit.test.tsx +188 -0
  47. package/src/components/UIResourceRenderer.tsx +19 -6
  48. package/src/context/MCPActionContext.tsx +17 -1
  49. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,68 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [6.7.0] - 2026-05-22
9
+
10
+ ### Added — MacroRun Phase 2 adapters
11
+
12
+ Pure adapters from the `MacroRunV1` contract (new in
13
+ `@seed-ship/mcp-ui-spec@5.3.0`) to existing MCP-UI primitives. Published on
14
+ the opt-in `@seed-ship/mcp-ui-solid/adapters` subpath — never imported by the
15
+ core renderer path.
16
+
17
+ - `macroRunToScratchpadState(run: MacroRunV1): ScratchpadState` — builds an
18
+ `agent_card` section, a `stepper` (or `split_stepper` when steps carry
19
+ `parallel` branches), a `prompt` section for an embedded
20
+ `pendingInterrogation`, and one section per `results` entry. Run status
21
+ maps `pending→loading`, `running→processing`, `awaiting_input→waiting_human`,
22
+ `completed→complete`, `failed`/`aborted`→`error` (aborted is never
23
+ retryable). `results` is optional — the adapter works without UI results.
24
+ - `macroInterrogationToChatPromptConfig(q: MacroInterrogationV1): ChatPromptConfig`
25
+ — maps `choice` / `confirm` / `form` directly, and routes `elicitation`
26
+ through the existing `elicitationToPromptConfig()` helper. Always returns a
27
+ `ChatPromptConfig`. Usable standalone or via `macroRunToScratchpadState`.
28
+
29
+ Both are **pure functions** — no fetch, no SSE listener, no persistence, no
30
+ global state.
31
+
32
+ **Out of scope (host / runtime responsibility):** the producer runtime that
33
+ emits a `macro-run/v1` snapshot (a later goal on the producing repo), and all
34
+ host-side wiring — SSE listener, fetch, persistence, resume. These adapters
35
+ only translate a snapshot the host already has. The `action:'submit'`
36
+ executors are untouched, and MacroRun is kept separate from the tool-call
37
+ action path.
38
+
39
+ ## [6.6.1] - 2026-05-22
40
+
41
+ ### Fixed — `action: 'submit'` is no longer inert outside a `<form>`
42
+
43
+ `ActionParamsSchema.action` allows `'tool-call' | 'link' | 'submit'`, but
44
+ at runtime `submit` did nothing : `ActionGroupRenderer` only branched on
45
+ `tool-call` / `link`, and the standalone `action` renderer emitted a
46
+ native `type="submit"` button — which only fires inside a real `<form>`.
47
+ Standalone resources rendered by `<UIResourceRenderer>` have no
48
+ surrounding form, so the click was inert.
49
+
50
+ `submit` actions now route through the host executor — like `tool-call`,
51
+ but **not treated as a tool call** :
52
+
53
+ - `<ActionGroupRenderer>` and the standalone `action` renderer both call
54
+ `executeAction({ action: 'submit', toolName, params })` on click.
55
+ - The action **kind** is preserved : `ActionRequest` gains an optional
56
+ `action?: 'tool-call' | 'submit' | 'link'` field so a host `executor`
57
+ can tell a submit apart from a tool call (e.g. POST to
58
+ `params.submit_url`). The full `params` payload (`submit_url`,
59
+ `connector_id`, `feedback_value`, `preferred_layout`, …) is passed
60
+ through intact.
61
+ - The submit button is now `type="button"` (JS-handled) — it works with
62
+ no surrounding `<form>`, and shows the same loading / disabled state as
63
+ a `tool-call` button.
64
+ - The `defaultExecutor` `mcp-action` `CustomEvent` detail now carries
65
+ `action`, so a window-level listener can route submits too.
66
+
67
+ Backward compatible : `action` is optional everywhere and absent on every
68
+ pre-6.6.1 request — a request without it is still treated as `tool-call`.
69
+
8
70
  ## [6.6.0] - 2026-05-21
9
71
 
10
72
  Sprint OpenData / macros — cf. `docs/briefs/ROADMAP-opendata-macro-mcpui.md`
@@ -13,6 +13,7 @@
13
13
  * // → <UIResourceRenderer content={layout} />
14
14
  * ```
15
15
  */
16
- export { connectorResultToUILayout, connectorActionsToActionGroup, } from './connector';
16
+ export { connectorResultToUILayout, connectorActionsToActionGroup } from './connector';
17
17
  export type { ConnectorResultToUILayoutOptions, ConnectorActionsToActionGroupOptions, } from './connector';
18
+ export { macroRunToScratchpadState, macroInterrogationToChatPromptConfig } from './macro-run';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACvF,YAAY,EACV,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const chatBus = require("../services/chat-bus.cjs");
4
+ const RUN_STATUS_TO_SCRATCHPAD = {
5
+ pending: "loading",
6
+ running: "processing",
7
+ awaiting_input: "waiting_human",
8
+ completed: "complete",
9
+ failed: "error",
10
+ aborted: "error"
11
+ };
12
+ function runStatusToAgentStatus(status) {
13
+ switch (status) {
14
+ case "pending":
15
+ return "idle";
16
+ case "running":
17
+ return "running";
18
+ case "awaiting_input":
19
+ return "waiting";
20
+ case "completed":
21
+ return "done";
22
+ case "failed":
23
+ case "aborted":
24
+ return "error";
25
+ }
26
+ }
27
+ function stepToStepperStatus(status) {
28
+ return status === "failed" ? "error" : status;
29
+ }
30
+ function buildAgentCard(run) {
31
+ const agent = run.agent;
32
+ const card = {
33
+ agentId: (agent == null ? void 0 : agent.id) ?? run.macroId,
34
+ name: (agent == null ? void 0 : agent.name) ?? run.macroName ?? run.macroId,
35
+ status: (agent == null ? void 0 : agent.status) ?? runStatusToAgentStatus(run.status)
36
+ };
37
+ if (agent == null ? void 0 : agent.avatar) card.avatar = agent.avatar;
38
+ if (agent == null ? void 0 : agent.capabilities) card.capabilities = agent.capabilities;
39
+ if (agent == null ? void 0 : agent.currentStep) card.currentStep = agent.currentStep;
40
+ return card;
41
+ }
42
+ function buildStepperContent(steps) {
43
+ return {
44
+ orientation: "horizontal",
45
+ steps: steps.map((step) => {
46
+ const out = {
47
+ id: step.id,
48
+ label: step.label,
49
+ status: stepToStepperStatus(step.status)
50
+ };
51
+ if (step.summary) out.summary = step.summary;
52
+ if (typeof step.durationMs === "number") out.duration_ms = step.durationMs;
53
+ return out;
54
+ })
55
+ };
56
+ }
57
+ function laneStatus(subSteps) {
58
+ if (subSteps.some((s) => s.status === "failed")) return "error";
59
+ if (subSteps.some((s) => s.status === "active")) return "active";
60
+ if (subSteps.length > 0 && subSteps.every((s) => s.status === "done" || s.status === "skipped"))
61
+ return "done";
62
+ return "pending";
63
+ }
64
+ function buildSplitStepperContent(steps) {
65
+ return {
66
+ agents: steps.map((step) => {
67
+ const subSteps = step.parallel && step.parallel.length > 0 ? step.parallel : [step];
68
+ return {
69
+ id: step.id,
70
+ name: step.label,
71
+ status: laneStatus(subSteps),
72
+ steps: subSteps.map((sub) => ({
73
+ id: sub.id,
74
+ label: sub.label,
75
+ status: stepToStepperStatus(sub.status)
76
+ }))
77
+ };
78
+ })
79
+ };
80
+ }
81
+ function resultSectionType(componentType) {
82
+ switch (componentType) {
83
+ case "chart":
84
+ return "chart";
85
+ case "map":
86
+ return "map";
87
+ case "table":
88
+ return "data_preview";
89
+ default:
90
+ return "data";
91
+ }
92
+ }
93
+ function buildError(run) {
94
+ if (run.status !== "failed" && run.status !== "aborted") return void 0;
95
+ const aborted = run.status === "aborted";
96
+ if (run.error) {
97
+ const err = {
98
+ message: run.error.message,
99
+ // An aborted run is never retryable, regardless of the producer flag.
100
+ retryable: aborted ? false : run.error.retryable ?? false
101
+ };
102
+ if (run.error.code) err.code = run.error.code;
103
+ return err;
104
+ }
105
+ return {
106
+ message: aborted ? "Macro run aborted." : "Macro run failed.",
107
+ retryable: false
108
+ };
109
+ }
110
+ function macroRunToScratchpadState(run) {
111
+ const sections = [];
112
+ sections.push({
113
+ id: "macro-agent",
114
+ title: "Agent",
115
+ type: "agent_card",
116
+ content: buildAgentCard(run),
117
+ editable: false,
118
+ source: "agent"
119
+ });
120
+ if (run.steps.length > 0) {
121
+ const hasParallel = run.steps.some((s) => Array.isArray(s.parallel) && s.parallel.length > 0);
122
+ sections.push(
123
+ hasParallel ? {
124
+ id: "macro-split-stepper",
125
+ title: "Progress",
126
+ type: "split_stepper",
127
+ content: buildSplitStepperContent(run.steps),
128
+ editable: false,
129
+ source: "agent"
130
+ } : {
131
+ id: "macro-stepper",
132
+ title: "Progress",
133
+ type: "stepper",
134
+ content: buildStepperContent(run.steps),
135
+ editable: false,
136
+ source: "agent"
137
+ }
138
+ );
139
+ }
140
+ if (run.pendingInterrogation) {
141
+ sections.push({
142
+ id: "macro-prompt",
143
+ title: run.pendingInterrogation.title,
144
+ type: "prompt",
145
+ content: macroInterrogationToChatPromptConfig(run.pendingInterrogation),
146
+ editable: false,
147
+ source: "agent"
148
+ });
149
+ }
150
+ const results = run.results ?? [];
151
+ results.forEach((component, index) => {
152
+ sections.push({
153
+ id: `macro-result-${String((component == null ? void 0 : component.id) ?? index)}`,
154
+ title: "Result",
155
+ type: resultSectionType(component == null ? void 0 : component.type),
156
+ content: component,
157
+ editable: false,
158
+ source: "agent"
159
+ });
160
+ });
161
+ const state = {
162
+ id: run.runId,
163
+ title: run.title ?? run.macroName ?? run.macroId,
164
+ sections,
165
+ filters: {},
166
+ agentMessages: [],
167
+ status: RUN_STATUS_TO_SCRATCHPAD[run.status]
168
+ };
169
+ const error = buildError(run);
170
+ if (error) state.error = error;
171
+ return state;
172
+ }
173
+ function isElicitationSchema(value) {
174
+ if (typeof value !== "object" || value === null) return false;
175
+ const v = value;
176
+ return v.type === "object" && typeof v.properties === "object" && v.properties !== null;
177
+ }
178
+ function macroInterrogationToChatPromptConfig(q) {
179
+ var _a, _b, _c;
180
+ switch (q.kind) {
181
+ case "choice": {
182
+ const options = (q.options ?? []).map((o) => {
183
+ const opt = { value: o.value, label: o.label };
184
+ if (o.icon) opt.icon = o.icon;
185
+ if (o.description) opt.description = o.description;
186
+ if (o.metadata) opt.metadata = o.metadata;
187
+ return opt;
188
+ });
189
+ return {
190
+ type: "choice",
191
+ title: q.title,
192
+ config: { options, layout: "vertical" }
193
+ };
194
+ }
195
+ case "confirm": {
196
+ const config = {};
197
+ if (q.message) config.message = q.message;
198
+ if ((_a = q.confirm) == null ? void 0 : _a.confirmLabel) config.confirmLabel = q.confirm.confirmLabel;
199
+ if ((_b = q.confirm) == null ? void 0 : _b.cancelLabel) config.cancelLabel = q.confirm.cancelLabel;
200
+ if ((_c = q.confirm) == null ? void 0 : _c.variant) config.variant = q.confirm.variant;
201
+ return { type: "confirm", title: q.title, config };
202
+ }
203
+ case "form":
204
+ return {
205
+ type: "form",
206
+ title: q.title,
207
+ config: { fields: q.fields ?? [] }
208
+ };
209
+ case "elicitation": {
210
+ if (isElicitationSchema(q.elicitationSchema)) {
211
+ return chatBus.elicitationToPromptConfig({
212
+ message: q.message ?? q.title,
213
+ requestedSchema: q.elicitationSchema
214
+ });
215
+ }
216
+ return {
217
+ type: "confirm",
218
+ title: q.title,
219
+ config: { message: q.message ?? "Please confirm to continue." }
220
+ };
221
+ }
222
+ }
223
+ }
224
+ exports.macroInterrogationToChatPromptConfig = macroInterrogationToChatPromptConfig;
225
+ exports.macroRunToScratchpadState = macroRunToScratchpadState;
226
+ //# sourceMappingURL=macro-run.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macro-run.cjs","sources":["../../src/adapters/macro-run.ts"],"sourcesContent":["/**\n * MacroRun adapters — `MacroRunV1` / `MacroInterrogationV1` → MCP-UI render\n * primitives.\n *\n * @since v6.7.0 (MacroRun Phase 2 — contract consolidated in deposium_MCPs\n * `docs/2026/briefs/2026-05-22-macro-run-runtime-contract-consolidation.md`)\n *\n * ## Opt-in, pure\n *\n * Published under the dedicated subpath `@seed-ship/mcp-ui-solid/adapters` —\n * never imported by the core renderer path. Every function here is a **pure\n * function**: same input → same output, no `fetch`, no SSE listener, no\n * persistence, no global state, no clock, no randomness.\n *\n * ## Scope boundary\n *\n * These adapters only translate the agnostic `MacroRunV1` contract (defined\n * in `@seed-ship/mcp-ui-spec`) into existing MCP-UI primitives — a\n * `ScratchpadState` and a `ChatPromptConfig`. They do NOT:\n *\n * - emit or consume any SSE event (a `macro_run_snapshot` producer is a\n * separate, later goal on the producing runtime repo);\n * - perform any fetch, persistence or resume;\n * - know anything about a specific runtime, host, corpus or domain;\n * - touch the `action:'submit'` executors, nor mix MacroRun with the\n * existing tool-call action path.\n *\n * The host owns all of the above — it feeds a `MacroRunV1` snapshot in and\n * decides where to render the result.\n */\n\nimport type { MacroRunV1, MacroStepV1, MacroInterrogationV1 } from '@seed-ship/mcp-ui-spec';\nimport type {\n ScratchpadState,\n ScratchpadSection,\n ChatPromptConfig,\n ChoiceOption,\n ConfirmPromptConfig,\n AgentCardContent,\n SplitStepperContent,\n ElicitationRequestedSchema,\n FormPromptConfig,\n} from '../types/chat-bus';\nimport { elicitationToPromptConfig } from '../services/chat-bus';\n\n// ─── Status mappings ─────────────────────────────────────────\n\n/**\n * Run status → top-level `ScratchpadState` status. `aborted` and `failed`\n * both surface as `error` (an aborted run is additionally non-retryable —\n * see `buildError`).\n */\nconst RUN_STATUS_TO_SCRATCHPAD: Record<MacroRunV1['status'], ScratchpadState['status']> = {\n pending: 'loading',\n running: 'processing',\n awaiting_input: 'waiting_human',\n completed: 'complete',\n failed: 'error',\n aborted: 'error',\n};\n\n/** Run status → `AgentCardContent` status, used when the run carries no agent. */\nfunction runStatusToAgentStatus(status: MacroRunV1['status']): AgentCardContent['status'] {\n switch (status) {\n case 'pending':\n return 'idle';\n case 'running':\n return 'running';\n case 'awaiting_input':\n return 'waiting';\n case 'completed':\n return 'done';\n case 'failed':\n case 'aborted':\n return 'error';\n }\n}\n\n/**\n * Step status → stepper status. The MCP-UI stepper primitive renders\n * `failed` as `error`; every other value passes through unchanged.\n */\nfunction stepToStepperStatus(\n status: MacroStepV1['status']\n): 'pending' | 'active' | 'done' | 'skipped' | 'error' {\n return status === 'failed' ? 'error' : status;\n}\n\n// ─── Section builders ────────────────────────────────────────\n\ninterface StepperSectionContent {\n steps: Array<{\n id: string;\n label: string;\n status: 'pending' | 'active' | 'done' | 'skipped' | 'error';\n summary?: string;\n duration_ms?: number;\n }>;\n orientation: 'horizontal' | 'vertical';\n}\n\nfunction buildAgentCard(run: MacroRunV1): AgentCardContent {\n const agent = run.agent;\n const card: AgentCardContent = {\n agentId: agent?.id ?? run.macroId,\n name: agent?.name ?? run.macroName ?? run.macroId,\n status: agent?.status ?? runStatusToAgentStatus(run.status),\n };\n if (agent?.avatar) card.avatar = agent.avatar;\n if (agent?.capabilities) card.capabilities = agent.capabilities;\n if (agent?.currentStep) card.currentStep = agent.currentStep;\n return card;\n}\n\nfunction buildStepperContent(steps: MacroStepV1[]): StepperSectionContent {\n return {\n orientation: 'horizontal',\n steps: steps.map((step) => {\n const out: StepperSectionContent['steps'][number] = {\n id: step.id,\n label: step.label,\n status: stepToStepperStatus(step.status),\n };\n if (step.summary) out.summary = step.summary;\n if (typeof step.durationMs === 'number') out.duration_ms = step.durationMs;\n return out;\n }),\n };\n}\n\n/** Collapse a set of sub-step statuses into a single parallel-lane status. */\nfunction laneStatus(subSteps: MacroStepV1[]): 'done' | 'active' | 'pending' | 'error' {\n if (subSteps.some((s) => s.status === 'failed')) return 'error';\n if (subSteps.some((s) => s.status === 'active')) return 'active';\n if (subSteps.length > 0 && subSteps.every((s) => s.status === 'done' || s.status === 'skipped'))\n return 'done';\n return 'pending';\n}\n\n/**\n * Build a `split_stepper` content from steps that carry `parallel` branches.\n * Each top-level step becomes a lane: a step with `parallel` sub-steps shows\n * those sub-steps; a step without falls back to a single-step lane.\n */\nfunction buildSplitStepperContent(steps: MacroStepV1[]): SplitStepperContent {\n return {\n agents: steps.map((step) => {\n const subSteps = step.parallel && step.parallel.length > 0 ? step.parallel : [step];\n return {\n id: step.id,\n name: step.label,\n status: laneStatus(subSteps),\n steps: subSteps.map((sub) => ({\n id: sub.id,\n label: sub.label,\n status: stepToStepperStatus(sub.status),\n })),\n };\n }),\n };\n}\n\n/** Component `type` → the closest `ScratchpadSection` type for a result. */\nfunction resultSectionType(componentType: unknown): ScratchpadSection['type'] {\n switch (componentType) {\n case 'chart':\n return 'chart';\n case 'map':\n return 'map';\n case 'table':\n return 'data_preview';\n default:\n return 'data';\n }\n}\n\nfunction buildError(run: MacroRunV1): ScratchpadState['error'] | undefined {\n if (run.status !== 'failed' && run.status !== 'aborted') return undefined;\n const aborted = run.status === 'aborted';\n if (run.error) {\n const err: NonNullable<ScratchpadState['error']> = {\n message: run.error.message,\n // An aborted run is never retryable, regardless of the producer flag.\n retryable: aborted ? false : (run.error.retryable ?? false),\n };\n if (run.error.code) err.code = run.error.code;\n return err;\n }\n return {\n message: aborted ? 'Macro run aborted.' : 'Macro run failed.',\n retryable: false,\n };\n}\n\n// ─── macroRunToScratchpadState ───────────────────────────────\n\n/**\n * Convert a `MacroRunV1` snapshot into a `ScratchpadState`.\n *\n * Sections produced, in order:\n * 1. `agent_card` — always (derived from `run.agent`, or from the macro\n * identity when the run carries no agent, e.g. a non-interactive macro).\n * 2. `stepper` — when the run has steps and none carry `parallel` branches.\n * `split_stepper` instead when any step carries `parallel` (future model).\n * 3. `prompt` — when `run.pendingInterrogation` is set; its content is the\n * `ChatPromptConfig` produced by {@link macroInterrogationToChatPromptConfig}.\n * 4. one section per `run.results` entry (`chart` / `map` / `data_preview` /\n * `data`, by component type). Optional — the adapter works without results.\n *\n * Pure: no fetch, no SSE, no persistence. The host owns all wiring.\n */\nexport function macroRunToScratchpadState(run: MacroRunV1): ScratchpadState {\n const sections: ScratchpadSection[] = [];\n\n // 1. Agent card — always present.\n sections.push({\n id: 'macro-agent',\n title: 'Agent',\n type: 'agent_card',\n content: buildAgentCard(run),\n editable: false,\n source: 'agent',\n });\n\n // 2. Stepper / split_stepper — when there are steps.\n if (run.steps.length > 0) {\n const hasParallel = run.steps.some((s) => Array.isArray(s.parallel) && s.parallel.length > 0);\n sections.push(\n hasParallel\n ? {\n id: 'macro-split-stepper',\n title: 'Progress',\n type: 'split_stepper',\n content: buildSplitStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n : {\n id: 'macro-stepper',\n title: 'Progress',\n type: 'stepper',\n content: buildStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n );\n }\n\n // 3. Pending interrogation → a `prompt` section.\n if (run.pendingInterrogation) {\n sections.push({\n id: 'macro-prompt',\n title: run.pendingInterrogation.title,\n type: 'prompt',\n content: macroInterrogationToChatPromptConfig(run.pendingInterrogation),\n editable: false,\n source: 'agent',\n });\n }\n\n // 4. Result components → one section each (results are optional). A result\n // is a `UIComponent`-shaped object — passthrough, read loosely (the spec\n // validates the run envelope, the renderer validates each component).\n const results = run.results ?? [];\n results.forEach((component, index) => {\n sections.push({\n id: `macro-result-${String(component?.id ?? index)}`,\n title: 'Result',\n type: resultSectionType(component?.type),\n content: component,\n editable: false,\n source: 'agent',\n });\n });\n\n const state: ScratchpadState = {\n id: run.runId,\n title: run.title ?? run.macroName ?? run.macroId,\n sections,\n filters: {},\n agentMessages: [],\n status: RUN_STATUS_TO_SCRATCHPAD[run.status],\n };\n\n const error = buildError(run);\n if (error) state.error = error;\n\n return state;\n}\n\n// ─── macroInterrogationToChatPromptConfig ────────────────────\n\nfunction isElicitationSchema(value: unknown): value is ElicitationRequestedSchema {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as { type?: unknown; properties?: unknown };\n return v.type === 'object' && typeof v.properties === 'object' && v.properties !== null;\n}\n\n/**\n * Convert a `MacroInterrogationV1` into a `ChatPromptConfig`.\n *\n * - `choice` → `{ type: 'choice' }` (vertical layout).\n * - `confirm` → `{ type: 'confirm' }`.\n * - `form` → `{ type: 'form' }` (the opaque `fields` are passed through).\n * - `elicitation` → routed through the existing `elicitationToPromptConfig()`\n * helper. If the interrogation carries no usable elicitation JSON Schema,\n * it degrades to a `confirm` prompt rather than throwing.\n *\n * Always returns a `ChatPromptConfig` — never an `ElicitationEvent` — so the\n * host has a single entry point. Usable standalone or via\n * {@link macroRunToScratchpadState} (which calls it for an embedded\n * `pendingInterrogation`).\n */\nexport function macroInterrogationToChatPromptConfig(q: MacroInterrogationV1): ChatPromptConfig {\n switch (q.kind) {\n case 'choice': {\n const options: ChoiceOption[] = (q.options ?? []).map((o) => {\n const opt: ChoiceOption = { value: o.value, label: o.label };\n if (o.icon) opt.icon = o.icon;\n if (o.description) opt.description = o.description;\n if (o.metadata) opt.metadata = o.metadata;\n return opt;\n });\n return {\n type: 'choice',\n title: q.title,\n config: { options, layout: 'vertical' },\n };\n }\n\n case 'confirm': {\n const config: ConfirmPromptConfig = {};\n if (q.message) config.message = q.message;\n if (q.confirm?.confirmLabel) config.confirmLabel = q.confirm.confirmLabel;\n if (q.confirm?.cancelLabel) config.cancelLabel = q.confirm.cancelLabel;\n if (q.confirm?.variant) config.variant = q.confirm.variant;\n return { type: 'confirm', title: q.title, config };\n }\n\n case 'form':\n return {\n type: 'form',\n title: q.title,\n config: { fields: (q.fields ?? []) as FormPromptConfig['fields'] },\n };\n\n case 'elicitation': {\n if (isElicitationSchema(q.elicitationSchema)) {\n return elicitationToPromptConfig({\n message: q.message ?? q.title,\n requestedSchema: q.elicitationSchema,\n });\n }\n // No usable schema — degrade gracefully instead of crashing.\n return {\n type: 'confirm',\n title: q.title,\n config: { message: q.message ?? 'Please confirm to continue.' },\n };\n }\n }\n}\n"],"names":["elicitationToPromptConfig"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * MacroRun adapters — `MacroRunV1` / `MacroInterrogationV1` → MCP-UI render
3
+ * primitives.
4
+ *
5
+ * @since v6.7.0 (MacroRun Phase 2 — contract consolidated in deposium_MCPs
6
+ * `docs/2026/briefs/2026-05-22-macro-run-runtime-contract-consolidation.md`)
7
+ *
8
+ * ## Opt-in, pure
9
+ *
10
+ * Published under the dedicated subpath `@seed-ship/mcp-ui-solid/adapters` —
11
+ * never imported by the core renderer path. Every function here is a **pure
12
+ * function**: same input → same output, no `fetch`, no SSE listener, no
13
+ * persistence, no global state, no clock, no randomness.
14
+ *
15
+ * ## Scope boundary
16
+ *
17
+ * These adapters only translate the agnostic `MacroRunV1` contract (defined
18
+ * in `@seed-ship/mcp-ui-spec`) into existing MCP-UI primitives — a
19
+ * `ScratchpadState` and a `ChatPromptConfig`. They do NOT:
20
+ *
21
+ * - emit or consume any SSE event (a `macro_run_snapshot` producer is a
22
+ * separate, later goal on the producing runtime repo);
23
+ * - perform any fetch, persistence or resume;
24
+ * - know anything about a specific runtime, host, corpus or domain;
25
+ * - touch the `action:'submit'` executors, nor mix MacroRun with the
26
+ * existing tool-call action path.
27
+ *
28
+ * The host owns all of the above — it feeds a `MacroRunV1` snapshot in and
29
+ * decides where to render the result.
30
+ */
31
+ import type { MacroRunV1, MacroInterrogationV1 } from '@seed-ship/mcp-ui-spec';
32
+ import type { ScratchpadState, ChatPromptConfig } from '../types/chat-bus';
33
+ /**
34
+ * Convert a `MacroRunV1` snapshot into a `ScratchpadState`.
35
+ *
36
+ * Sections produced, in order:
37
+ * 1. `agent_card` — always (derived from `run.agent`, or from the macro
38
+ * identity when the run carries no agent, e.g. a non-interactive macro).
39
+ * 2. `stepper` — when the run has steps and none carry `parallel` branches.
40
+ * `split_stepper` instead when any step carries `parallel` (future model).
41
+ * 3. `prompt` — when `run.pendingInterrogation` is set; its content is the
42
+ * `ChatPromptConfig` produced by {@link macroInterrogationToChatPromptConfig}.
43
+ * 4. one section per `run.results` entry (`chart` / `map` / `data_preview` /
44
+ * `data`, by component type). Optional — the adapter works without results.
45
+ *
46
+ * Pure: no fetch, no SSE, no persistence. The host owns all wiring.
47
+ */
48
+ export declare function macroRunToScratchpadState(run: MacroRunV1): ScratchpadState;
49
+ /**
50
+ * Convert a `MacroInterrogationV1` into a `ChatPromptConfig`.
51
+ *
52
+ * - `choice` → `{ type: 'choice' }` (vertical layout).
53
+ * - `confirm` → `{ type: 'confirm' }`.
54
+ * - `form` → `{ type: 'form' }` (the opaque `fields` are passed through).
55
+ * - `elicitation` → routed through the existing `elicitationToPromptConfig()`
56
+ * helper. If the interrogation carries no usable elicitation JSON Schema,
57
+ * it degrades to a `confirm` prompt rather than throwing.
58
+ *
59
+ * Always returns a `ChatPromptConfig` — never an `ElicitationEvent` — so the
60
+ * host has a single entry point. Usable standalone or via
61
+ * {@link macroRunToScratchpadState} (which calls it for an embedded
62
+ * `pendingInterrogation`).
63
+ */
64
+ export declare function macroInterrogationToChatPromptConfig(q: MacroInterrogationV1): ChatPromptConfig;
65
+ //# sourceMappingURL=macro-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macro-run.d.ts","sourceRoot":"","sources":["../../src/adapters/macro-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,KAAK,EACV,eAAe,EAEf,gBAAgB,EAOjB,MAAM,mBAAmB,CAAC;AA0J3B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,UAAU,GAAG,eAAe,CA6E1E;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oCAAoC,CAAC,CAAC,EAAE,oBAAoB,GAAG,gBAAgB,CAgD9F"}
@@ -0,0 +1,226 @@
1
+ import { elicitationToPromptConfig } from "../services/chat-bus.js";
2
+ const RUN_STATUS_TO_SCRATCHPAD = {
3
+ pending: "loading",
4
+ running: "processing",
5
+ awaiting_input: "waiting_human",
6
+ completed: "complete",
7
+ failed: "error",
8
+ aborted: "error"
9
+ };
10
+ function runStatusToAgentStatus(status) {
11
+ switch (status) {
12
+ case "pending":
13
+ return "idle";
14
+ case "running":
15
+ return "running";
16
+ case "awaiting_input":
17
+ return "waiting";
18
+ case "completed":
19
+ return "done";
20
+ case "failed":
21
+ case "aborted":
22
+ return "error";
23
+ }
24
+ }
25
+ function stepToStepperStatus(status) {
26
+ return status === "failed" ? "error" : status;
27
+ }
28
+ function buildAgentCard(run) {
29
+ const agent = run.agent;
30
+ const card = {
31
+ agentId: (agent == null ? void 0 : agent.id) ?? run.macroId,
32
+ name: (agent == null ? void 0 : agent.name) ?? run.macroName ?? run.macroId,
33
+ status: (agent == null ? void 0 : agent.status) ?? runStatusToAgentStatus(run.status)
34
+ };
35
+ if (agent == null ? void 0 : agent.avatar) card.avatar = agent.avatar;
36
+ if (agent == null ? void 0 : agent.capabilities) card.capabilities = agent.capabilities;
37
+ if (agent == null ? void 0 : agent.currentStep) card.currentStep = agent.currentStep;
38
+ return card;
39
+ }
40
+ function buildStepperContent(steps) {
41
+ return {
42
+ orientation: "horizontal",
43
+ steps: steps.map((step) => {
44
+ const out = {
45
+ id: step.id,
46
+ label: step.label,
47
+ status: stepToStepperStatus(step.status)
48
+ };
49
+ if (step.summary) out.summary = step.summary;
50
+ if (typeof step.durationMs === "number") out.duration_ms = step.durationMs;
51
+ return out;
52
+ })
53
+ };
54
+ }
55
+ function laneStatus(subSteps) {
56
+ if (subSteps.some((s) => s.status === "failed")) return "error";
57
+ if (subSteps.some((s) => s.status === "active")) return "active";
58
+ if (subSteps.length > 0 && subSteps.every((s) => s.status === "done" || s.status === "skipped"))
59
+ return "done";
60
+ return "pending";
61
+ }
62
+ function buildSplitStepperContent(steps) {
63
+ return {
64
+ agents: steps.map((step) => {
65
+ const subSteps = step.parallel && step.parallel.length > 0 ? step.parallel : [step];
66
+ return {
67
+ id: step.id,
68
+ name: step.label,
69
+ status: laneStatus(subSteps),
70
+ steps: subSteps.map((sub) => ({
71
+ id: sub.id,
72
+ label: sub.label,
73
+ status: stepToStepperStatus(sub.status)
74
+ }))
75
+ };
76
+ })
77
+ };
78
+ }
79
+ function resultSectionType(componentType) {
80
+ switch (componentType) {
81
+ case "chart":
82
+ return "chart";
83
+ case "map":
84
+ return "map";
85
+ case "table":
86
+ return "data_preview";
87
+ default:
88
+ return "data";
89
+ }
90
+ }
91
+ function buildError(run) {
92
+ if (run.status !== "failed" && run.status !== "aborted") return void 0;
93
+ const aborted = run.status === "aborted";
94
+ if (run.error) {
95
+ const err = {
96
+ message: run.error.message,
97
+ // An aborted run is never retryable, regardless of the producer flag.
98
+ retryable: aborted ? false : run.error.retryable ?? false
99
+ };
100
+ if (run.error.code) err.code = run.error.code;
101
+ return err;
102
+ }
103
+ return {
104
+ message: aborted ? "Macro run aborted." : "Macro run failed.",
105
+ retryable: false
106
+ };
107
+ }
108
+ function macroRunToScratchpadState(run) {
109
+ const sections = [];
110
+ sections.push({
111
+ id: "macro-agent",
112
+ title: "Agent",
113
+ type: "agent_card",
114
+ content: buildAgentCard(run),
115
+ editable: false,
116
+ source: "agent"
117
+ });
118
+ if (run.steps.length > 0) {
119
+ const hasParallel = run.steps.some((s) => Array.isArray(s.parallel) && s.parallel.length > 0);
120
+ sections.push(
121
+ hasParallel ? {
122
+ id: "macro-split-stepper",
123
+ title: "Progress",
124
+ type: "split_stepper",
125
+ content: buildSplitStepperContent(run.steps),
126
+ editable: false,
127
+ source: "agent"
128
+ } : {
129
+ id: "macro-stepper",
130
+ title: "Progress",
131
+ type: "stepper",
132
+ content: buildStepperContent(run.steps),
133
+ editable: false,
134
+ source: "agent"
135
+ }
136
+ );
137
+ }
138
+ if (run.pendingInterrogation) {
139
+ sections.push({
140
+ id: "macro-prompt",
141
+ title: run.pendingInterrogation.title,
142
+ type: "prompt",
143
+ content: macroInterrogationToChatPromptConfig(run.pendingInterrogation),
144
+ editable: false,
145
+ source: "agent"
146
+ });
147
+ }
148
+ const results = run.results ?? [];
149
+ results.forEach((component, index) => {
150
+ sections.push({
151
+ id: `macro-result-${String((component == null ? void 0 : component.id) ?? index)}`,
152
+ title: "Result",
153
+ type: resultSectionType(component == null ? void 0 : component.type),
154
+ content: component,
155
+ editable: false,
156
+ source: "agent"
157
+ });
158
+ });
159
+ const state = {
160
+ id: run.runId,
161
+ title: run.title ?? run.macroName ?? run.macroId,
162
+ sections,
163
+ filters: {},
164
+ agentMessages: [],
165
+ status: RUN_STATUS_TO_SCRATCHPAD[run.status]
166
+ };
167
+ const error = buildError(run);
168
+ if (error) state.error = error;
169
+ return state;
170
+ }
171
+ function isElicitationSchema(value) {
172
+ if (typeof value !== "object" || value === null) return false;
173
+ const v = value;
174
+ return v.type === "object" && typeof v.properties === "object" && v.properties !== null;
175
+ }
176
+ function macroInterrogationToChatPromptConfig(q) {
177
+ var _a, _b, _c;
178
+ switch (q.kind) {
179
+ case "choice": {
180
+ const options = (q.options ?? []).map((o) => {
181
+ const opt = { value: o.value, label: o.label };
182
+ if (o.icon) opt.icon = o.icon;
183
+ if (o.description) opt.description = o.description;
184
+ if (o.metadata) opt.metadata = o.metadata;
185
+ return opt;
186
+ });
187
+ return {
188
+ type: "choice",
189
+ title: q.title,
190
+ config: { options, layout: "vertical" }
191
+ };
192
+ }
193
+ case "confirm": {
194
+ const config = {};
195
+ if (q.message) config.message = q.message;
196
+ if ((_a = q.confirm) == null ? void 0 : _a.confirmLabel) config.confirmLabel = q.confirm.confirmLabel;
197
+ if ((_b = q.confirm) == null ? void 0 : _b.cancelLabel) config.cancelLabel = q.confirm.cancelLabel;
198
+ if ((_c = q.confirm) == null ? void 0 : _c.variant) config.variant = q.confirm.variant;
199
+ return { type: "confirm", title: q.title, config };
200
+ }
201
+ case "form":
202
+ return {
203
+ type: "form",
204
+ title: q.title,
205
+ config: { fields: q.fields ?? [] }
206
+ };
207
+ case "elicitation": {
208
+ if (isElicitationSchema(q.elicitationSchema)) {
209
+ return elicitationToPromptConfig({
210
+ message: q.message ?? q.title,
211
+ requestedSchema: q.elicitationSchema
212
+ });
213
+ }
214
+ return {
215
+ type: "confirm",
216
+ title: q.title,
217
+ config: { message: q.message ?? "Please confirm to continue." }
218
+ };
219
+ }
220
+ }
221
+ }
222
+ export {
223
+ macroInterrogationToChatPromptConfig,
224
+ macroRunToScratchpadState
225
+ };
226
+ //# sourceMappingURL=macro-run.js.map