@amodalai/react 0.1.19 → 0.1.20
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/dist/hooks/useAmodalChat.d.ts.map +1 -1
- package/dist/react.js +85 -85
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAmodalChat.d.ts","sourceRoot":"","sources":["../../src/hooks/useAmodalChat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EAEX,YAAY,EAEZ,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAoBlB,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAkM3E;AAED,MAAM,WAAW,oBAAoB;IACnC,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,8CAA8C;IAC9C,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,YAAY,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,CAAC;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3E;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"useAmodalChat.d.ts","sourceRoot":"","sources":["../../src/hooks/useAmodalChat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EAEX,YAAY,EAEZ,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAoBlB,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAkM3E;AAED,MAAM,WAAW,oBAAoB;IACnC,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,8CAA8C;IAC9C,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,YAAY,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,CAAC;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3E;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAmMjF"}
|
package/dist/react.js
CHANGED
|
@@ -9,11 +9,11 @@ function Z({ runtimeUrl: s, getToken: r, children: t }) {
|
|
|
9
9
|
const e = B(
|
|
10
10
|
() => new V({ runtimeUrl: s, getToken: r }),
|
|
11
11
|
[s, r]
|
|
12
|
-
),
|
|
12
|
+
), n = B(
|
|
13
13
|
() => ({ client: e, runtimeUrl: s }),
|
|
14
14
|
[e, s]
|
|
15
15
|
);
|
|
16
|
-
return /* @__PURE__ */ v(j.Provider, { value:
|
|
16
|
+
return /* @__PURE__ */ v(j.Provider, { value: n, children: t });
|
|
17
17
|
}
|
|
18
18
|
function R() {
|
|
19
19
|
const s = U(j);
|
|
@@ -72,26 +72,26 @@ function X(s, r) {
|
|
|
72
72
|
case "STREAM_TEXT_DELTA": {
|
|
73
73
|
const t = [...s.messages], e = t[t.length - 1];
|
|
74
74
|
if (e && e.type === "assistant_text") {
|
|
75
|
-
const
|
|
76
|
-
a && a.type === "text" ?
|
|
75
|
+
const n = [...e.contentBlocks], a = n[n.length - 1];
|
|
76
|
+
a && a.type === "text" ? n[n.length - 1] = { type: "text", text: a.text + r.content } : n.push({ type: "text", text: r.content }), t[t.length - 1] = { ...e, text: e.text + r.content, contentBlocks: n };
|
|
77
77
|
}
|
|
78
78
|
return { ...s, messages: t };
|
|
79
79
|
}
|
|
80
80
|
case "STREAM_TOOL_CALL_START": {
|
|
81
|
-
const t = [...s.messages], e = t[t.length - 1],
|
|
81
|
+
const t = [...s.messages], e = t[t.length - 1], n = {
|
|
82
82
|
toolId: r.toolId,
|
|
83
83
|
toolName: r.toolName,
|
|
84
84
|
parameters: r.parameters,
|
|
85
85
|
status: "running"
|
|
86
86
|
};
|
|
87
87
|
if (e && e.type === "assistant_text") {
|
|
88
|
-
const a = [...e.toolCalls,
|
|
89
|
-
u && u.type === "tool_calls" ? c[c.length - 1] = { type: "tool_calls", calls: [...u.calls,
|
|
88
|
+
const a = [...e.toolCalls, n], c = [...e.contentBlocks], u = c[c.length - 1];
|
|
89
|
+
u && u.type === "tool_calls" ? c[c.length - 1] = { type: "tool_calls", calls: [...u.calls, n] } : c.push({ type: "tool_calls", calls: [n] }), t[t.length - 1] = { ...e, toolCalls: a, contentBlocks: c };
|
|
90
90
|
}
|
|
91
91
|
return {
|
|
92
92
|
...s,
|
|
93
93
|
messages: t,
|
|
94
|
-
activeToolCalls: [...s.activeToolCalls,
|
|
94
|
+
activeToolCalls: [...s.activeToolCalls, n]
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
case "STREAM_TOOL_CALL_RESULT": {
|
|
@@ -109,16 +109,16 @@ function X(s, r) {
|
|
|
109
109
|
);
|
|
110
110
|
t[t.length - 1] = { ...e, toolCalls: c, contentBlocks: u };
|
|
111
111
|
}
|
|
112
|
-
const
|
|
112
|
+
const n = s.activeToolCalls.filter(
|
|
113
113
|
(a) => a.toolId !== r.toolId
|
|
114
114
|
);
|
|
115
|
-
return { ...s, messages: t, activeToolCalls:
|
|
115
|
+
return { ...s, messages: t, activeToolCalls: n };
|
|
116
116
|
}
|
|
117
117
|
case "STREAM_SUBAGENT_EVENT": {
|
|
118
118
|
const t = [...s.messages], e = t[t.length - 1];
|
|
119
119
|
if (e && e.type === "assistant_text") {
|
|
120
|
-
const
|
|
121
|
-
(u) => u.type === "tool_calls" ? { ...u, calls: u.calls.map(
|
|
120
|
+
const n = (u) => u.toolId === r.parentToolId ? { ...u, subagentEvents: [...u.subagentEvents ?? [], r.event] } : u, a = e.toolCalls.map(n), c = e.contentBlocks.map(
|
|
121
|
+
(u) => u.type === "tool_calls" ? { ...u, calls: u.calls.map(n) } : u
|
|
122
122
|
);
|
|
123
123
|
t[t.length - 1] = { ...e, toolCalls: a, contentBlocks: c };
|
|
124
124
|
}
|
|
@@ -127,14 +127,14 @@ function X(s, r) {
|
|
|
127
127
|
case "STREAM_WIDGET": {
|
|
128
128
|
const t = [...s.messages], e = t[t.length - 1];
|
|
129
129
|
if (e && e.type === "assistant_text") {
|
|
130
|
-
const
|
|
130
|
+
const n = {
|
|
131
131
|
type: "widget",
|
|
132
132
|
widgetType: r.widgetType,
|
|
133
133
|
data: r.data
|
|
134
134
|
};
|
|
135
135
|
t[t.length - 1] = {
|
|
136
136
|
...e,
|
|
137
|
-
contentBlocks: [...e.contentBlocks,
|
|
137
|
+
contentBlocks: [...e.contentBlocks, n]
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
return { ...s, messages: t };
|
|
@@ -142,14 +142,14 @@ function X(s, r) {
|
|
|
142
142
|
case "STREAM_CONFIRMATION_REQUIRED": {
|
|
143
143
|
const t = [...s.messages], e = t[t.length - 1];
|
|
144
144
|
if (e && e.type === "assistant_text") {
|
|
145
|
-
const
|
|
145
|
+
const n = {
|
|
146
146
|
type: "confirmation",
|
|
147
147
|
confirmation: r.confirmation
|
|
148
148
|
};
|
|
149
149
|
t[t.length - 1] = {
|
|
150
150
|
...e,
|
|
151
151
|
confirmations: [...e.confirmations, r.confirmation],
|
|
152
|
-
contentBlocks: [...e.contentBlocks,
|
|
152
|
+
contentBlocks: [...e.contentBlocks, n]
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
155
|
return { ...s, messages: t };
|
|
@@ -157,12 +157,12 @@ function X(s, r) {
|
|
|
157
157
|
case "CONFIRMATION_RESPONDED": {
|
|
158
158
|
const t = [...s.messages], e = t[t.length - 1];
|
|
159
159
|
if (e && e.type === "assistant_text") {
|
|
160
|
-
const
|
|
160
|
+
const n = e.confirmations.map(
|
|
161
161
|
(c) => c.correlationId === r.correlationId ? { ...c, status: r.approved ? "approved" : "denied" } : c
|
|
162
162
|
), a = e.contentBlocks.map(
|
|
163
163
|
(c) => c.type === "confirmation" && c.confirmation.correlationId === r.correlationId ? { ...c, confirmation: { ...c.confirmation, status: r.approved ? "approved" : "denied" } } : c
|
|
164
164
|
);
|
|
165
|
-
t[t.length - 1] = { ...e, confirmations:
|
|
165
|
+
t[t.length - 1] = { ...e, confirmations: n, contentBlocks: a };
|
|
166
166
|
}
|
|
167
167
|
return { ...s, messages: t };
|
|
168
168
|
}
|
|
@@ -176,8 +176,8 @@ function X(s, r) {
|
|
|
176
176
|
);
|
|
177
177
|
t[t.length - 1] = { ...e, toolCalls: c, contentBlocks: u };
|
|
178
178
|
}
|
|
179
|
-
const
|
|
180
|
-
return { ...s, messages: t, isStreaming: !1, activeToolCalls: [], usage:
|
|
179
|
+
const n = r.usage ? { inputTokens: s.usage.inputTokens + r.usage.inputTokens, outputTokens: s.usage.outputTokens + r.usage.outputTokens } : s.usage;
|
|
180
|
+
return { ...s, messages: t, isStreaming: !1, activeToolCalls: [], usage: n };
|
|
181
181
|
}
|
|
182
182
|
case "RESET":
|
|
183
183
|
return { ...G };
|
|
@@ -186,20 +186,20 @@ function X(s, r) {
|
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
function W(s) {
|
|
189
|
-
const { client: r } = R(), [t, e] = Q(X, G),
|
|
190
|
-
c.current = s,
|
|
189
|
+
const { client: r } = R(), [t, e] = Q(X, G), n = N((s == null ? void 0 : s.initialSessionId) ?? null), a = N(null), c = N(s);
|
|
190
|
+
c.current = s, n.current = t.sessionId ?? n.current;
|
|
191
191
|
const u = A(
|
|
192
192
|
(_) => {
|
|
193
193
|
if (t.isStreaming) return;
|
|
194
194
|
e({ type: "SEND_MESSAGE", text: _ });
|
|
195
195
|
const h = new AbortController();
|
|
196
196
|
a.current = h, (async () => {
|
|
197
|
-
var
|
|
197
|
+
var o, d, f, l, b, T, x, C, M, D, O;
|
|
198
198
|
let p = !1;
|
|
199
199
|
try {
|
|
200
200
|
const k = r.chatStream(_, {
|
|
201
|
-
sessionId:
|
|
202
|
-
context: (
|
|
201
|
+
sessionId: n.current ?? void 0,
|
|
202
|
+
context: (o = c.current) == null ? void 0 : o.context,
|
|
203
203
|
signal: h.signal
|
|
204
204
|
});
|
|
205
205
|
for await (const g of k)
|
|
@@ -300,7 +300,7 @@ function W(s) {
|
|
|
300
300
|
), i = A(() => {
|
|
301
301
|
a.current && (a.current.abort(), a.current = null), e({ type: "STREAM_DONE" });
|
|
302
302
|
}, []), S = A(() => {
|
|
303
|
-
a.current && (a.current.abort(), a.current = null), e({ type: "RESET" });
|
|
303
|
+
a.current && (a.current.abort(), a.current = null), n.current = null, e({ type: "RESET" });
|
|
304
304
|
}, []), E = A(
|
|
305
305
|
(_, h) => {
|
|
306
306
|
e({ type: "CONFIRMATION_RESPONDED", correlationId: _, approved: h });
|
|
@@ -411,25 +411,25 @@ function ee({
|
|
|
411
411
|
renderText: r,
|
|
412
412
|
renderToolCall: t,
|
|
413
413
|
renderConfirmation: e,
|
|
414
|
-
className:
|
|
414
|
+
className: n,
|
|
415
415
|
...a
|
|
416
416
|
}) {
|
|
417
417
|
const { messages: c, send: u, isStreaming: i, respondToConfirmation: S } = W(a), [E, _] = y(""), h = N(null), m = A(
|
|
418
|
-
(
|
|
419
|
-
|
|
418
|
+
(o) => {
|
|
419
|
+
o.preventDefault();
|
|
420
420
|
const d = E.trim();
|
|
421
421
|
d.length === 0 || i || (_(""), u(d));
|
|
422
422
|
},
|
|
423
423
|
[E, i, u]
|
|
424
|
-
), p = ["amodal-chat",
|
|
424
|
+
), p = ["amodal-chat", n].filter(Boolean).join(" ");
|
|
425
425
|
return /* @__PURE__ */ I("div", { className: p, "data-testid": "amodal-chat", children: [
|
|
426
426
|
/* @__PURE__ */ I("div", { className: "amodal-chat__messages", "data-testid": "message-list", children: [
|
|
427
|
-
c.map((
|
|
428
|
-
switch (
|
|
427
|
+
c.map((o) => {
|
|
428
|
+
switch (o.type) {
|
|
429
429
|
case "user":
|
|
430
|
-
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--user", "data-testid": "user-message", children:
|
|
430
|
+
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--user", "data-testid": "user-message", children: o.text }, o.id);
|
|
431
431
|
case "assistant_text":
|
|
432
|
-
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--assistant", "data-testid": "assistant-message", children:
|
|
432
|
+
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--assistant", "data-testid": "assistant-message", children: o.contentBlocks.map((d, f) => {
|
|
433
433
|
switch (d.type) {
|
|
434
434
|
case "text":
|
|
435
435
|
return /* @__PURE__ */ v("div", { className: "amodal-chat__text", children: r ? r(d.text) : d.text }, `text-${String(f)}`);
|
|
@@ -453,9 +453,9 @@ function ee({
|
|
|
453
453
|
default:
|
|
454
454
|
return null;
|
|
455
455
|
}
|
|
456
|
-
}) },
|
|
456
|
+
}) }, o.id);
|
|
457
457
|
case "error":
|
|
458
|
-
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--error", "data-testid": "error-message", children:
|
|
458
|
+
return /* @__PURE__ */ v("div", { className: "amodal-chat__message amodal-chat__message--error", "data-testid": "error-message", children: o.message }, o.id);
|
|
459
459
|
default:
|
|
460
460
|
return null;
|
|
461
461
|
}
|
|
@@ -468,7 +468,7 @@ function ee({
|
|
|
468
468
|
{
|
|
469
469
|
className: "amodal-chat__input",
|
|
470
470
|
value: E,
|
|
471
|
-
onChange: (
|
|
471
|
+
onChange: (o) => _(o.target.value),
|
|
472
472
|
placeholder: s,
|
|
473
473
|
disabled: i,
|
|
474
474
|
"data-testid": "chat-input"
|
|
@@ -487,37 +487,37 @@ function ee({
|
|
|
487
487
|
] })
|
|
488
488
|
] });
|
|
489
489
|
}
|
|
490
|
-
function te({ prompt: s, label: r, context: t, onComplete: e, onError:
|
|
490
|
+
function te({ prompt: s, label: r, context: t, onComplete: e, onError: n }) {
|
|
491
491
|
const [a, c] = y(!1), { messages: u, send: i, isStreaming: S, respondToConfirmation: E } = W({
|
|
492
492
|
context: t,
|
|
493
493
|
onStreamEnd: () => {
|
|
494
|
-
const
|
|
495
|
-
|
|
494
|
+
const o = u[u.length - 1];
|
|
495
|
+
o && o.type === "assistant_text" ? e == null || e(o.text) : o && o.type === "error" && (n == null || n(o.message));
|
|
496
496
|
}
|
|
497
497
|
}), _ = A(() => {
|
|
498
498
|
a || S || (c(!0), i(s));
|
|
499
|
-
}, [a, S, i, s]), h = [...u].reverse().find((
|
|
499
|
+
}, [a, S, i, s]), h = [...u].reverse().find((o) => o.type === "assistant_text"), m = h && h.type === "assistant_text" ? h.confirmations.filter((o) => o.status === "pending") : [], p = (o, d) => {
|
|
500
500
|
const f = () => {
|
|
501
|
-
|
|
501
|
+
o.correlationId && E(o.correlationId, !0);
|
|
502
502
|
}, l = () => {
|
|
503
|
-
|
|
503
|
+
o.correlationId && E(o.correlationId, !1);
|
|
504
504
|
};
|
|
505
|
-
return
|
|
505
|
+
return o.escalated || o.params && Object.keys(o.params).length > 0 ? /* @__PURE__ */ v(
|
|
506
506
|
J,
|
|
507
507
|
{
|
|
508
|
-
confirmation:
|
|
508
|
+
confirmation: o,
|
|
509
509
|
onApprove: f,
|
|
510
510
|
onDeny: l
|
|
511
511
|
},
|
|
512
|
-
|
|
512
|
+
o.correlationId ?? String(d)
|
|
513
513
|
) : /* @__PURE__ */ v(
|
|
514
514
|
H,
|
|
515
515
|
{
|
|
516
|
-
confirmation:
|
|
516
|
+
confirmation: o,
|
|
517
517
|
onApprove: f,
|
|
518
518
|
onDeny: l
|
|
519
519
|
},
|
|
520
|
-
|
|
520
|
+
o.correlationId ?? String(d)
|
|
521
521
|
);
|
|
522
522
|
};
|
|
523
523
|
return a ? /* @__PURE__ */ I("div", { className: "amodal-action", "data-testid": "action-container", children: [
|
|
@@ -540,14 +540,14 @@ function te({ prompt: s, label: r, context: t, onComplete: e, onError: o }) {
|
|
|
540
540
|
* SPDX-License-Identifier: MIT
|
|
541
541
|
*/
|
|
542
542
|
function se(s) {
|
|
543
|
-
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client:
|
|
543
|
+
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client: n } = R(), [a, c] = y(null), [u, i] = y(!1), [S, E] = y(null), _ = N(null), h = N(!1), m = A(async () => {
|
|
544
544
|
_.current && _.current.abort();
|
|
545
|
-
const
|
|
546
|
-
_.current =
|
|
545
|
+
const o = new AbortController();
|
|
546
|
+
_.current = o, i(!0), E(null);
|
|
547
547
|
try {
|
|
548
548
|
let d = "";
|
|
549
549
|
const f = [];
|
|
550
|
-
for await (const l of
|
|
550
|
+
for await (const l of n.chatStream(r, { context: t, signal: o.signal }))
|
|
551
551
|
switch (l.type) {
|
|
552
552
|
case "text_delta":
|
|
553
553
|
d += l.content;
|
|
@@ -577,7 +577,7 @@ function se(s) {
|
|
|
577
577
|
} finally {
|
|
578
578
|
i(!1), _.current = null;
|
|
579
579
|
}
|
|
580
|
-
}, [
|
|
580
|
+
}, [n, r, t]), p = A(() => {
|
|
581
581
|
m();
|
|
582
582
|
}, [m]);
|
|
583
583
|
return w(() => (e && !h.current && (h.current = !0, m()), () => {
|
|
@@ -590,13 +590,13 @@ function se(s) {
|
|
|
590
590
|
* SPDX-License-Identifier: MIT
|
|
591
591
|
*/
|
|
592
592
|
function re(s) {
|
|
593
|
-
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client:
|
|
593
|
+
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client: n } = R(), [a, c] = y("idle"), [u, i] = y(""), [S, E] = y(""), [_, h] = y(null), m = N(null), p = N(!1), o = A(async () => {
|
|
594
594
|
m.current && m.current.abort();
|
|
595
595
|
const f = new AbortController();
|
|
596
596
|
m.current = f, c("loading"), h(null), i(""), E("");
|
|
597
597
|
try {
|
|
598
598
|
let l = "";
|
|
599
|
-
for await (const T of
|
|
599
|
+
for await (const T of n.chatStream(r, { context: t, signal: f.signal }))
|
|
600
600
|
switch (T.type) {
|
|
601
601
|
case "text_delta":
|
|
602
602
|
l += T.content;
|
|
@@ -616,12 +616,12 @@ function re(s) {
|
|
|
616
616
|
} finally {
|
|
617
617
|
m.current = null;
|
|
618
618
|
}
|
|
619
|
-
}, [
|
|
620
|
-
|
|
621
|
-
}, [
|
|
622
|
-
return w(() => (e && !p.current && (p.current = !0,
|
|
619
|
+
}, [n, r, t]), d = A(() => {
|
|
620
|
+
o();
|
|
621
|
+
}, [o]);
|
|
622
|
+
return w(() => (e && !p.current && (p.current = !0, o()), () => {
|
|
623
623
|
m.current && m.current.abort();
|
|
624
|
-
}), [e,
|
|
624
|
+
}), [e, o]), { status: a, summary: u, details: S, isLoading: a === "loading", error: _, refresh: d };
|
|
625
625
|
}
|
|
626
626
|
/**
|
|
627
627
|
* @license
|
|
@@ -629,7 +629,7 @@ function re(s) {
|
|
|
629
629
|
* SPDX-License-Identifier: MIT
|
|
630
630
|
*/
|
|
631
631
|
function ae(s) {
|
|
632
|
-
const { taskId: r, autoStream: t = !0 } = s, { client: e } = R(), [
|
|
632
|
+
const { taskId: r, autoStream: t = !0 } = s, { client: e } = R(), [n, a] = y("idle"), [c, u] = y(""), [i, S] = y(""), [E, _] = y([]), [h, m] = y(null), p = N(null), o = N(!1), d = A(async () => {
|
|
633
633
|
p.current && p.current.abort();
|
|
634
634
|
const b = new AbortController();
|
|
635
635
|
p.current = b, a("running"), m(null), _([]), S(""), u("");
|
|
@@ -655,19 +655,19 @@ function ae(s) {
|
|
|
655
655
|
default:
|
|
656
656
|
break;
|
|
657
657
|
}
|
|
658
|
-
|
|
658
|
+
n === "running" && a("completed");
|
|
659
659
|
} catch (T) {
|
|
660
660
|
T instanceof DOMException && T.name === "AbortError" || (m(T instanceof Error ? T.message : "Unknown error"), a("error"));
|
|
661
661
|
} finally {
|
|
662
662
|
p.current = null;
|
|
663
663
|
}
|
|
664
|
-
}, [e, r,
|
|
664
|
+
}, [e, r, n]), f = A(() => {
|
|
665
665
|
p.current && (p.current.abort(), p.current = null);
|
|
666
666
|
}, []), l = N(d);
|
|
667
|
-
return l.current = d, w(() => (t && !
|
|
667
|
+
return l.current = d, w(() => (t && !o.current && (o.current = !0, l.current()), () => {
|
|
668
668
|
p.current && p.current.abort();
|
|
669
669
|
}), [t]), {
|
|
670
|
-
status:
|
|
670
|
+
status: n,
|
|
671
671
|
progress: c,
|
|
672
672
|
result: i,
|
|
673
673
|
events: E,
|
|
@@ -682,13 +682,13 @@ function ae(s) {
|
|
|
682
682
|
* SPDX-License-Identifier: MIT
|
|
683
683
|
*/
|
|
684
684
|
function ne(s) {
|
|
685
|
-
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client:
|
|
685
|
+
const { prompt: r, context: t, autoFetch: e = !0 } = s, { client: n } = R(), [a, c] = y(null), [u, i] = y(!1), [S, E] = y(null), _ = N(null), h = N(!1), m = A(async () => {
|
|
686
686
|
_.current && _.current.abort();
|
|
687
|
-
const
|
|
688
|
-
_.current =
|
|
687
|
+
const o = new AbortController();
|
|
688
|
+
_.current = o, i(!0), E(null);
|
|
689
689
|
try {
|
|
690
690
|
let d = "";
|
|
691
|
-
for await (const f of
|
|
691
|
+
for await (const f of n.chatStream(r, { context: t, signal: o.signal }))
|
|
692
692
|
switch (f.type) {
|
|
693
693
|
case "text_delta":
|
|
694
694
|
d += f.content;
|
|
@@ -705,7 +705,7 @@ function ne(s) {
|
|
|
705
705
|
} finally {
|
|
706
706
|
i(!1), _.current = null;
|
|
707
707
|
}
|
|
708
|
-
}, [
|
|
708
|
+
}, [n, r, t]), p = A(() => {
|
|
709
709
|
m();
|
|
710
710
|
}, [m]);
|
|
711
711
|
return w(() => (e && !h.current && (h.current = !0, m()), () => {
|
|
@@ -718,19 +718,19 @@ function ne(s) {
|
|
|
718
718
|
* SPDX-License-Identifier: MIT
|
|
719
719
|
*/
|
|
720
720
|
function oe(s, r) {
|
|
721
|
-
const { key: t, refreshInterval: e = 3e4 } = r, { client:
|
|
721
|
+
const { key: t, refreshInterval: e = 3e4 } = r, { client: n } = R(), [a, c] = y(null), [u, i] = y([]), [S, E] = y(!0), [_, h] = y(null), m = N(null), p = A(async () => {
|
|
722
722
|
m.current && m.current.abort();
|
|
723
723
|
const d = new AbortController();
|
|
724
724
|
m.current = d;
|
|
725
725
|
try {
|
|
726
|
-
const f = await
|
|
726
|
+
const f = await n.getStoreDocument(s, t, d.signal);
|
|
727
727
|
c(f.document), i(f.history), h(null);
|
|
728
728
|
} catch (f) {
|
|
729
729
|
f instanceof DOMException && f.name === "AbortError" || h(f instanceof Error ? f.message : "Failed to fetch document");
|
|
730
730
|
} finally {
|
|
731
731
|
E(!1), m.current = null;
|
|
732
732
|
}
|
|
733
|
-
}, [
|
|
733
|
+
}, [n, s, t]), o = A(() => {
|
|
734
734
|
p();
|
|
735
735
|
}, [p]);
|
|
736
736
|
return w(() => (E(!0), p(), () => {
|
|
@@ -748,7 +748,7 @@ function oe(s, r) {
|
|
|
748
748
|
history: u,
|
|
749
749
|
isLoading: S,
|
|
750
750
|
error: _,
|
|
751
|
-
refetch:
|
|
751
|
+
refetch: o
|
|
752
752
|
};
|
|
753
753
|
}
|
|
754
754
|
/**
|
|
@@ -757,7 +757,7 @@ function oe(s, r) {
|
|
|
757
757
|
* SPDX-License-Identifier: MIT
|
|
758
758
|
*/
|
|
759
759
|
function le(s, r = {}) {
|
|
760
|
-
const { filter: t, sort: e, limit:
|
|
760
|
+
const { filter: t, sort: e, limit: n = 20, refreshInterval: a = 3e4 } = r, { client: c } = R(), [u, i] = y([]), [S, E] = y(0), [_, h] = y(!1), [m, p] = y(!0), [o, d] = y(null), f = N(null), l = t ? JSON.stringify(t) : "", b = A(async () => {
|
|
761
761
|
f.current && f.current.abort();
|
|
762
762
|
const x = new AbortController();
|
|
763
763
|
f.current = x;
|
|
@@ -765,7 +765,7 @@ function le(s, r = {}) {
|
|
|
765
765
|
const C = await c.getStoreDocuments(s, {
|
|
766
766
|
filter: l ? JSON.parse(l) : void 0,
|
|
767
767
|
sort: e,
|
|
768
|
-
limit:
|
|
768
|
+
limit: n,
|
|
769
769
|
signal: x.signal
|
|
770
770
|
});
|
|
771
771
|
i(C.documents), E(C.total), h(C.hasMore), d(null);
|
|
@@ -774,7 +774,7 @@ function le(s, r = {}) {
|
|
|
774
774
|
} finally {
|
|
775
775
|
p(!1), f.current = null;
|
|
776
776
|
}
|
|
777
|
-
}, [c, s, l, e,
|
|
777
|
+
}, [c, s, l, e, n]), T = A(() => {
|
|
778
778
|
b();
|
|
779
779
|
}, [b]);
|
|
780
780
|
return w(() => (p(!0), b(), () => {
|
|
@@ -791,7 +791,7 @@ function le(s, r = {}) {
|
|
|
791
791
|
total: S,
|
|
792
792
|
hasMore: _,
|
|
793
793
|
isLoading: m,
|
|
794
|
-
error:
|
|
794
|
+
error: o,
|
|
795
795
|
refetch: T
|
|
796
796
|
};
|
|
797
797
|
}
|
|
@@ -801,23 +801,23 @@ function le(s, r = {}) {
|
|
|
801
801
|
* SPDX-License-Identifier: MIT
|
|
802
802
|
*/
|
|
803
803
|
function ce(s, r = {}) {
|
|
804
|
-
const { client: t } = R(), [e,
|
|
804
|
+
const { client: t } = R(), [e, n] = y(!1), [a, c] = y(null), [u, i] = y(null), S = N(null);
|
|
805
805
|
return { execute: A(
|
|
806
806
|
(_) => {
|
|
807
807
|
S.current && S.current.abort();
|
|
808
808
|
const h = new AbortController();
|
|
809
|
-
S.current = h,
|
|
809
|
+
S.current = h, n(!0), c(null), i(null);
|
|
810
810
|
let m = `Run skill "${s}"`;
|
|
811
811
|
_ && Object.keys(_).length > 0 && (m += ` with parameters: ${JSON.stringify(_)}`), r.stores && r.stores.length > 0 && (m += `. Write results to stores: ${r.stores.join(", ")}`), r.confirm && (m += ". Confirm before writing."), (async () => {
|
|
812
812
|
try {
|
|
813
813
|
let p = "";
|
|
814
|
-
for await (const
|
|
815
|
-
switch (
|
|
814
|
+
for await (const o of t.chatStream(m, { signal: h.signal }))
|
|
815
|
+
switch (o.type) {
|
|
816
816
|
case "text_delta":
|
|
817
|
-
p +=
|
|
817
|
+
p += o.content;
|
|
818
818
|
break;
|
|
819
819
|
case "error":
|
|
820
|
-
i(
|
|
820
|
+
i(o.message);
|
|
821
821
|
break;
|
|
822
822
|
default:
|
|
823
823
|
break;
|
|
@@ -826,7 +826,7 @@ function ce(s, r = {}) {
|
|
|
826
826
|
} catch (p) {
|
|
827
827
|
p instanceof DOMException && p.name === "AbortError" || i(p instanceof Error ? p.message : "Skill execution failed");
|
|
828
828
|
} finally {
|
|
829
|
-
|
|
829
|
+
n(!1), S.current = null;
|
|
830
830
|
}
|
|
831
831
|
})();
|
|
832
832
|
},
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sources":["../src/provider.tsx","../src/hooks/useAmodalChat.ts","../src/components/ConfirmCard.tsx","../src/components/ReviewCard.tsx","../src/chat.tsx","../src/components/AmodalAction.tsx","../src/hooks/useAmodalBrief.ts","../src/hooks/useAmodalInsight.ts","../src/hooks/useAmodalTask.ts","../src/hooks/useAmodalQuery.ts","../src/hooks/useStore.ts","../src/hooks/useStoreList.ts","../src/hooks/useSkillAction.ts","../src/hooks/useNavigate.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport { RuntimeClient } from './client/runtime-client';\n\nexport interface AmodalProviderProps {\n /** Base URL of the Amodal runtime server (e.g., \"http://localhost:3001\"). */\n runtimeUrl: string;\n /** Optional token getter for auth (hosted mode). */\n getToken?: () => string | Promise<string> | null | undefined;\n children: ReactNode;\n}\n\ninterface AmodalContextValue {\n client: RuntimeClient;\n runtimeUrl: string;\n}\n\nconst AmodalContext = createContext<AmodalContextValue | null>(null);\n\n/**\n * Provides a RuntimeClient to all child hooks and components.\n */\nexport function AmodalProvider({ runtimeUrl, getToken, children }: AmodalProviderProps) {\n const client = useMemo(\n () => new RuntimeClient({ runtimeUrl, getToken }),\n [runtimeUrl, getToken],\n );\n\n const value = useMemo(\n () => ({ client, runtimeUrl }),\n [client, runtimeUrl],\n );\n\n return <AmodalContext.Provider value={value}>{children}</AmodalContext.Provider>;\n}\n\n/**\n * Access the RuntimeClient and config from the nearest AmodalProvider.\n * Throws if called outside of an AmodalProvider.\n */\nexport function useAmodalContext(): AmodalContextValue {\n const ctx = useContext(AmodalContext);\n if (!ctx) {\n throw new Error('useAmodalContext must be used within an <AmodalProvider>');\n }\n return ctx;\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\nimport type {\n ChatState,\n ChatAction,\n ChatMessage,\n AssistantTextMessage,\n ToolCallInfo,\n ContentBlock,\n ConfirmationInfo,\n} from '../types';\nimport { useAmodalContext } from '../provider';\n\nconst initialState: ChatState = {\n messages: [],\n sessionId: null,\n isStreaming: false,\n error: null,\n activeToolCalls: [],\n isHistorical: false,\n usage: {inputTokens: 0, outputTokens: 0},\n};\n\nlet messageCounter = 0;\n\nfunction createMessageId(): string {\n messageCounter++;\n return `msg-${Date.now()}-${String(messageCounter)}`;\n}\n\nexport function chatReducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case 'SEND_MESSAGE': {\n const userMessage: ChatMessage = {\n type: 'user',\n id: createMessageId(),\n text: action.text,\n timestamp: new Date().toISOString(),\n };\n const assistantMessage: AssistantTextMessage = {\n type: 'assistant_text',\n id: createMessageId(),\n text: '',\n toolCalls: [],\n confirmations: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n return {\n ...state,\n messages: [...state.messages, userMessage, assistantMessage],\n isStreaming: true,\n error: null,\n activeToolCalls: [],\n };\n }\n case 'STREAM_INIT':\n return { ...state, sessionId: action.sessionId };\n case 'STREAM_TEXT_DELTA': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'text') {\n blocks[blocks.length - 1] = { type: 'text', text: lastBlock.text + action.content };\n } else {\n blocks.push({ type: 'text', text: action.content });\n }\n msgs[msgs.length - 1] = { ...last, text: last.text + action.content, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_TOOL_CALL_START': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n const toolCall: ToolCallInfo = {\n toolId: action.toolId,\n toolName: action.toolName,\n parameters: action.parameters,\n status: 'running',\n };\n if (last && last.type === 'assistant_text') {\n const updatedToolCalls = [...last.toolCalls, toolCall];\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'tool_calls') {\n blocks[blocks.length - 1] = { type: 'tool_calls', calls: [...lastBlock.calls, toolCall] };\n } else {\n blocks.push({ type: 'tool_calls', calls: [toolCall] });\n }\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedToolCalls, contentBlocks: blocks };\n }\n return {\n ...state,\n messages: msgs,\n activeToolCalls: [...state.activeToolCalls, toolCall],\n };\n }\n case 'STREAM_TOOL_CALL_RESULT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updateCall = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.toolId\n ? {\n ...tc,\n status: action.status,\n result: action.result,\n parameters: action.parameters ?? tc.parameters,\n duration_ms: action.duration_ms,\n error: action.error,\n }\n : tc;\n const updatedCalls = last.toolCalls.map(updateCall);\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(updateCall) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n const activeToolCalls = state.activeToolCalls.filter(\n (tc) => tc.toolId !== action.toolId,\n );\n return { ...state, messages: msgs, activeToolCalls };\n }\n case 'STREAM_SUBAGENT_EVENT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const appendEvent = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.parentToolId\n ? { ...tc, subagentEvents: [...(tc.subagentEvents ?? []), action.event] }\n : tc;\n const updatedCalls = last.toolCalls.map(appendEvent);\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(appendEvent) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_WIDGET': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'widget',\n widgetType: action.widgetType,\n data: action.data,\n };\n msgs[msgs.length - 1] = {\n ...last,\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_CONFIRMATION_REQUIRED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'confirmation',\n confirmation: action.confirmation,\n };\n msgs[msgs.length - 1] = {\n ...last,\n confirmations: [...last.confirmations, action.confirmation],\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'CONFIRMATION_RESPONDED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updatedConfirmations = last.confirmations.map((c) =>\n c.correlationId === action.correlationId\n ? { ...c, status: (action.approved ? 'approved' : 'denied') as ConfirmationInfo['status'] }\n : c,\n );\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'confirmation' && block.confirmation.correlationId === action.correlationId\n ? { ...block, confirmation: { ...block.confirmation, status: (action.approved ? 'approved' : 'denied') as ConfirmationInfo['status'] } }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, confirmations: updatedConfirmations, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_ERROR':\n return { ...state, isStreaming: false, error: action.message, activeToolCalls: [] };\n case 'STREAM_DONE': {\n const doneMessages = [...state.messages];\n const lastMsg = doneMessages[doneMessages.length - 1];\n if (lastMsg && lastMsg.type === 'assistant_text') {\n const stopRunning = (tc: ToolCallInfo): ToolCallInfo =>\n tc.status === 'running' ? { ...tc, status: 'error', error: 'Stopped' } : tc;\n const stoppedCalls = lastMsg.toolCalls.map(stopRunning);\n const stoppedBlocks = lastMsg.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(stopRunning) }\n : block,\n );\n doneMessages[doneMessages.length - 1] = { ...lastMsg, toolCalls: stoppedCalls, contentBlocks: stoppedBlocks };\n }\n const newUsage = action.usage\n ? {inputTokens: state.usage.inputTokens + action.usage.inputTokens, outputTokens: state.usage.outputTokens + action.usage.outputTokens}\n : state.usage;\n return { ...state, messages: doneMessages, isStreaming: false, activeToolCalls: [], usage: newUsage };\n }\n case 'RESET':\n return { ...initialState };\n default:\n return state;\n }\n}\n\nexport interface UseAmodalChatOptions {\n /** Pre-seed session ID for resuming a previous session. */\n initialSessionId?: string | null;\n /** Additional context sent with each chat message. */\n context?: Record<string, unknown>;\n /** Called when the SSE stream ends. */\n onStreamEnd?: () => void;\n /** Called when a session ID is received from the server. */\n onSessionCreated?: (sessionId: string) => void;\n /** Called on each tool call result. */\n onToolCall?: (call: ToolCallInfo) => void;\n /** Called when a confirmation is required. */\n onConfirmation?: (confirmation: ConfirmationInfo) => void;\n}\n\nexport interface UseAmodalChatReturn {\n messages: ChatMessage[];\n send: (text: string) => void;\n stop: () => void;\n isStreaming: boolean;\n activeToolCalls: ToolCallInfo[];\n sessionId: string | null;\n error: string | null;\n usage: {inputTokens: number; outputTokens: number};\n reset: () => void;\n respondToConfirmation: (correlationId: string, approved: boolean) => void;\n}\n\nexport function useAmodalChat(options?: UseAmodalChatOptions): UseAmodalChatReturn {\n const { client } = useAmodalContext();\n const [state, dispatch] = useReducer(chatReducer, initialState);\n const sessionIdRef = useRef<string | null>(options?.initialSessionId ?? null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const callbacksRef = useRef(options);\n callbacksRef.current = options;\n\n sessionIdRef.current = state.sessionId ?? sessionIdRef.current;\n\n const send = useCallback(\n (text: string) => {\n if (state.isStreaming) return;\n\n dispatch({ type: 'SEND_MESSAGE', text });\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n const runStream = async () => {\n let receivedDone = false;\n try {\n const stream = client.chatStream(text, {\n sessionId: sessionIdRef.current ?? undefined,\n context: callbacksRef.current?.context,\n signal: controller.signal,\n });\n\n for await (const event of stream) {\n switch (event.type) {\n case 'init':\n dispatch({ type: 'STREAM_INIT', sessionId: event.session_id });\n callbacksRef.current?.onSessionCreated?.(event.session_id);\n break;\n case 'text_delta':\n dispatch({ type: 'STREAM_TEXT_DELTA', content: event.content });\n break;\n case 'tool_call_start':\n dispatch({\n type: 'STREAM_TOOL_CALL_START',\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n case 'tool_call_result':\n dispatch({\n type: 'STREAM_TOOL_CALL_RESULT',\n toolId: event.tool_id,\n status: event.status,\n result: event.result,\n parameters: event.parameters,\n duration_ms: event.duration_ms,\n error: event.error,\n });\n callbacksRef.current?.onToolCall?.({\n toolId: event.tool_id,\n toolName: '',\n parameters: {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n });\n break;\n case 'subagent_event':\n dispatch({\n type: 'STREAM_SUBAGENT_EVENT',\n parentToolId: event.parent_tool_id,\n event: {\n agentName: event.agent_name,\n eventType: event.event_type,\n toolName: event.tool_name,\n toolArgs: event.tool_args,\n result: event.result,\n text: event.text,\n error: event.error,\n timestamp: event.timestamp,\n },\n });\n break;\n case 'widget':\n dispatch({\n type: 'STREAM_WIDGET',\n widgetType: event.widget_type,\n data: event.data,\n });\n break;\n case 'confirmation_required': {\n const confirmation: ConfirmationInfo = {\n endpoint: event.endpoint,\n method: event.method,\n reason: event.reason,\n escalated: event.escalated,\n params: event.params,\n connectionName: event.connection_name,\n correlationId: event.correlation_id,\n status: 'pending',\n };\n dispatch({ type: 'STREAM_CONFIRMATION_REQUIRED', confirmation });\n callbacksRef.current?.onConfirmation?.(confirmation);\n break;\n }\n case 'error':\n dispatch({ type: 'STREAM_ERROR', message: event.message });\n break;\n case 'done':\n receivedDone = true;\n dispatch({\n type: 'STREAM_DONE',\n usage: event.usage ? {inputTokens: event.usage.input_tokens, outputTokens: event.usage.output_tokens} : undefined,\n });\n callbacksRef.current?.onStreamEnd?.();\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n dispatch({\n type: 'STREAM_ERROR',\n message: err instanceof Error ? err.message : 'Unknown error',\n });\n }\n } finally {\n abortControllerRef.current = null;\n if (!receivedDone && !controller.signal.aborted) {\n dispatch({ type: 'STREAM_DONE' });\n callbacksRef.current?.onStreamEnd?.();\n }\n }\n };\n\n void runStream();\n },\n [client, state.isStreaming],\n );\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n dispatch({ type: 'STREAM_DONE' });\n }, []);\n\n const reset = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n dispatch({ type: 'RESET' });\n }, []);\n\n const respondToConfirmation = useCallback(\n (correlationId: string, approved: boolean) => {\n dispatch({ type: 'CONFIRMATION_RESPONDED', correlationId, approved });\n\n // Send approval/denial as a follow-up chat message\n const responseText = approved\n ? `I approve the action (correlation: ${correlationId})`\n : `I deny the action (correlation: ${correlationId})`;\n\n // Queue the response after the current stream ends\n if (!state.isStreaming) {\n send(responseText);\n }\n },\n [send, state.isStreaming],\n );\n\n // Abort on unmount\n useEffect(\n () => () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n },\n [],\n );\n\n return {\n messages: state.messages,\n send,\n stop,\n isStreaming: state.isStreaming,\n activeToolCalls: state.activeToolCalls,\n sessionId: state.sessionId,\n error: state.error,\n usage: state.usage,\n reset,\n respondToConfirmation,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { ConfirmationInfo } from '../types';\n\nexport interface ConfirmCardProps {\n confirmation: ConfirmationInfo;\n onApprove: () => void;\n onDeny: () => void;\n}\n\n/**\n * Simple confirmation card: shows endpoint + method + reason, approve/deny buttons.\n */\nexport function ConfirmCard({ confirmation, onApprove, onDeny }: ConfirmCardProps) {\n const isPending = confirmation.status === 'pending';\n\n return (\n <div className=\"amodal-confirm-card\" data-testid=\"confirm-card\">\n <div className=\"amodal-confirm-card__header\">\n <span className=\"amodal-confirm-card__method\">{confirmation.method}</span>\n <span className=\"amodal-confirm-card__endpoint\">{confirmation.endpoint}</span>\n </div>\n <p className=\"amodal-confirm-card__reason\">{confirmation.reason}</p>\n {isPending ? (\n <div className=\"amodal-confirm-card__actions\">\n <button\n className=\"amodal-confirm-card__btn amodal-confirm-card__btn--approve\"\n onClick={onApprove}\n data-testid=\"confirm-approve\"\n >\n Approve\n </button>\n <button\n className=\"amodal-confirm-card__btn amodal-confirm-card__btn--deny\"\n onClick={onDeny}\n data-testid=\"confirm-deny\"\n >\n Deny\n </button>\n </div>\n ) : (\n <div className=\"amodal-confirm-card__status\" data-testid=\"confirm-status\">\n {confirmation.status === 'approved' ? 'Approved' : 'Denied'}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { ConfirmationInfo } from '../types';\n\nexport interface ReviewCardProps {\n confirmation: ConfirmationInfo;\n onApprove: () => void;\n onDeny: () => void;\n}\n\n/**\n * Structured review card: all params, reason, escalation badge, approve/deny.\n */\nexport function ReviewCard({ confirmation, onApprove, onDeny }: ReviewCardProps) {\n const isPending = confirmation.status === 'pending';\n\n return (\n <div className=\"amodal-review-card\" data-testid=\"review-card\">\n <div className=\"amodal-review-card__header\">\n <span className=\"amodal-review-card__method\">{confirmation.method}</span>\n <span className=\"amodal-review-card__endpoint\">{confirmation.endpoint}</span>\n {confirmation.escalated && (\n <span className=\"amodal-review-card__badge\" data-testid=\"escalation-badge\">\n Escalated\n </span>\n )}\n </div>\n {confirmation.connectionName && (\n <div className=\"amodal-review-card__connection\">\n Connection: {confirmation.connectionName}\n </div>\n )}\n <p className=\"amodal-review-card__reason\">{confirmation.reason}</p>\n {confirmation.params && Object.keys(confirmation.params).length > 0 && (\n <div className=\"amodal-review-card__params\" data-testid=\"review-params\">\n <div className=\"amodal-review-card__params-title\">Parameters</div>\n <pre className=\"amodal-review-card__params-body\">\n {JSON.stringify(confirmation.params, null, 2)}\n </pre>\n </div>\n )}\n {isPending ? (\n <div className=\"amodal-review-card__actions\">\n <button\n className=\"amodal-review-card__btn amodal-review-card__btn--approve\"\n onClick={onApprove}\n data-testid=\"review-approve\"\n >\n Approve\n </button>\n <button\n className=\"amodal-review-card__btn amodal-review-card__btn--deny\"\n onClick={onDeny}\n data-testid=\"review-deny\"\n >\n Deny\n </button>\n </div>\n ) : (\n <div className=\"amodal-review-card__status\" data-testid=\"review-status\">\n {confirmation.status === 'approved' ? 'Approved' : 'Denied'}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { ConfirmationInfo, ToolCallInfo } from './types';\nimport { useAmodalChat } from './hooks/useAmodalChat';\nimport type { UseAmodalChatOptions } from './hooks/useAmodalChat';\nimport { ConfirmCard } from './components/ConfirmCard';\nimport { ReviewCard } from './components/ReviewCard';\n\nexport interface AmodalChatProps extends UseAmodalChatOptions {\n /** Placeholder text for the input bar. */\n placeholder?: string;\n /** Custom renderer for text content blocks. */\n renderText?: (text: string) => React.ReactNode;\n /** Custom renderer for tool call blocks. */\n renderToolCall?: (call: ToolCallInfo) => React.ReactNode;\n /** Custom renderer for confirmation blocks. */\n renderConfirmation?: (confirmation: ConfirmationInfo, onApprove: () => void, onDeny: () => void) => React.ReactNode;\n /** CSS class name for the root element. */\n className?: string;\n}\n\n/**\n * Full chat component — message list, input bar, renders confirmations inline.\n */\nexport function AmodalChat({\n placeholder = 'Type a message...',\n renderText,\n renderToolCall,\n renderConfirmation,\n className,\n ...hookOptions\n}: AmodalChatProps) {\n const { messages, send, isStreaming, respondToConfirmation } = useAmodalChat(hookOptions);\n const [input, setInput] = useState('');\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const handleSubmit = useCallback(\n (e: FormEvent) => {\n e.preventDefault();\n const trimmed = input.trim();\n if (trimmed.length === 0 || isStreaming) return;\n setInput('');\n send(trimmed);\n },\n [input, isStreaming, send],\n );\n\n const rootClass = ['amodal-chat', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClass} data-testid=\"amodal-chat\">\n <div className=\"amodal-chat__messages\" data-testid=\"message-list\">\n {messages.map((msg) => {\n switch (msg.type) {\n case 'user':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--user\" data-testid=\"user-message\">\n {msg.text}\n </div>\n );\n case 'assistant_text':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--assistant\" data-testid=\"assistant-message\">\n {msg.contentBlocks.map((block, i) => {\n switch (block.type) {\n case 'text':\n return (\n <div key={`text-${String(i)}`} className=\"amodal-chat__text\">\n {renderText ? renderText(block.text) : block.text}\n </div>\n );\n case 'tool_calls':\n return (\n <div key={`tools-${String(i)}`} className=\"amodal-chat__tool-calls\">\n {block.calls.map((call) =>\n renderToolCall ? (\n <div key={call.toolId}>{renderToolCall(call)}</div>\n ) : (\n <div key={call.toolId} className=\"amodal-chat__tool-call\" data-testid=\"tool-call\">\n <span className=\"amodal-chat__tool-name\">{call.toolName}</span>\n <span className=\"amodal-chat__tool-status\">{call.status}</span>\n </div>\n ),\n )}\n </div>\n );\n case 'confirmation': {\n const conf = block.confirmation;\n const handleApprove = () => {\n if (conf.correlationId) {\n respondToConfirmation(conf.correlationId, true);\n }\n };\n const handleDeny = () => {\n if (conf.correlationId) {\n respondToConfirmation(conf.correlationId, false);\n }\n };\n if (renderConfirmation) {\n return <div key={`conf-${String(i)}`}>{renderConfirmation(conf, handleApprove, handleDeny)}</div>;\n }\n if (conf.escalated || (conf.params && Object.keys(conf.params).length > 0)) {\n return <ReviewCard key={`conf-${String(i)}`} confirmation={conf} onApprove={handleApprove} onDeny={handleDeny} />;\n }\n return <ConfirmCard key={`conf-${String(i)}`} confirmation={conf} onApprove={handleApprove} onDeny={handleDeny} />;\n }\n case 'widget':\n return (\n <div key={`widget-${String(i)}`} className=\"amodal-chat__widget\" data-testid=\"widget\">\n {block.widgetType}\n </div>\n );\n default:\n return null;\n }\n })}\n </div>\n );\n case 'error':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--error\" data-testid=\"error-message\">\n {msg.message}\n </div>\n );\n default:\n return null;\n }\n })}\n <div ref={messagesEndRef} />\n </div>\n <form className=\"amodal-chat__input-bar\" onSubmit={handleSubmit} data-testid=\"input-bar\">\n <input\n className=\"amodal-chat__input\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={placeholder}\n disabled={isStreaming}\n data-testid=\"chat-input\"\n />\n <button\n className=\"amodal-chat__send\"\n type=\"submit\"\n disabled={isStreaming || input.trim().length === 0}\n data-testid=\"send-button\"\n >\n Send\n </button>\n </form>\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useState } from 'react';\nimport type { ConfirmationInfo } from '../types';\nimport { useAmodalChat } from '../hooks/useAmodalChat';\nimport { ConfirmCard } from './ConfirmCard';\nimport { ReviewCard } from './ReviewCard';\n\nexport interface AmodalActionProps {\n /** The prompt to send when the action is triggered. */\n prompt: string;\n /** Label for the trigger button. */\n label?: string;\n /** Additional context sent with the chat message. */\n context?: Record<string, unknown>;\n /** Called when the action completes. */\n onComplete?: (text: string) => void;\n /** Called on error. */\n onError?: (error: string) => void;\n}\n\n/**\n * One-shot action: triggers a chat stream with a prompt, shows confirmation inline.\n */\nexport function AmodalAction({ prompt, label, context, onComplete, onError }: AmodalActionProps) {\n const [triggered, setTriggered] = useState(false);\n\n const { messages, send, isStreaming, respondToConfirmation } = useAmodalChat({\n context,\n onStreamEnd: () => {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.type === 'assistant_text') {\n onComplete?.(lastMsg.text);\n } else if (lastMsg && lastMsg.type === 'error') {\n onError?.(lastMsg.message);\n }\n },\n });\n\n const trigger = useCallback(() => {\n if (triggered || isStreaming) return;\n setTriggered(true);\n send(prompt);\n }, [triggered, isStreaming, send, prompt]);\n\n const lastAssistant = [...messages].reverse().find((m) => m.type === 'assistant_text');\n const pendingConfirmations: ConfirmationInfo[] =\n lastAssistant && lastAssistant.type === 'assistant_text'\n ? lastAssistant.confirmations.filter((c) => c.status === 'pending')\n : [];\n\n const renderConfirmation = (confirmation: ConfirmationInfo, index: number) => {\n const handleApprove = () => {\n if (confirmation.correlationId) {\n respondToConfirmation(confirmation.correlationId, true);\n }\n };\n const handleDeny = () => {\n if (confirmation.correlationId) {\n respondToConfirmation(confirmation.correlationId, false);\n }\n };\n\n if (confirmation.escalated || (confirmation.params && Object.keys(confirmation.params).length > 0)) {\n return (\n <ReviewCard\n key={confirmation.correlationId ?? String(index)}\n confirmation={confirmation}\n onApprove={handleApprove}\n onDeny={handleDeny}\n />\n );\n }\n\n return (\n <ConfirmCard\n key={confirmation.correlationId ?? String(index)}\n confirmation={confirmation}\n onApprove={handleApprove}\n onDeny={handleDeny}\n />\n );\n };\n\n if (!triggered) {\n return (\n <button\n className=\"amodal-action__trigger\"\n onClick={trigger}\n data-testid=\"action-trigger\"\n >\n {label ?? 'Run'}\n </button>\n );\n }\n\n return (\n <div className=\"amodal-action\" data-testid=\"action-container\">\n {isStreaming && (\n <div className=\"amodal-action__loading\" data-testid=\"action-loading\">\n Processing...\n </div>\n )}\n {lastAssistant && lastAssistant.type === 'assistant_text' && lastAssistant.text && (\n <div className=\"amodal-action__result\" data-testid=\"action-result\">\n {lastAssistant.text}\n </div>\n )}\n {pendingConfirmations.map(renderConfirmation)}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { BriefResult, ToolCallInfo } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalBriefOptions {\n /** The prompt to send for the brief. */\n prompt: string;\n /** Additional context sent with the request. */\n context?: Record<string, unknown>;\n /** If true, the brief is fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport interface UseAmodalBriefReturn {\n brief: BriefResult | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\n/**\n * Sends a chat with a brief prompt, collects the full response.\n */\nexport function useAmodalBrief(options: UseAmodalBriefOptions): UseAmodalBriefReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [brief, setBrief] = useState<BriefResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchBrief = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n setError(null);\n\n try {\n let text = '';\n const toolCalls: ToolCallInfo[] = [];\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'tool_call_start':\n toolCalls.push({\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n });\n break;\n case 'tool_call_result': {\n const tc = toolCalls.find((t) => t.toolId === event.tool_id);\n if (tc) {\n tc.status = event.status;\n tc.result = event.result;\n tc.duration_ms = event.duration_ms;\n tc.error = event.error;\n }\n break;\n }\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n\n setBrief({ text, toolCalls });\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refresh = useCallback(() => {\n void fetchBrief();\n }, [fetchBrief]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchBrief();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchBrief]);\n\n return { brief, isLoading, error, refresh };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { InsightResult } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalInsightOptions {\n /** The insight prompt to send. */\n prompt: string;\n /** Additional context for the insight. */\n context?: Record<string, unknown>;\n /** If true, fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport interface UseAmodalInsightReturn {\n status: InsightResult['status'];\n summary: string;\n details: string;\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\n/**\n * Sends a chat with an insight prompt, collects a structured response.\n * Splits the response at the first double newline into summary and details.\n */\nexport function useAmodalInsight(options: UseAmodalInsightOptions): UseAmodalInsightReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [status, setStatus] = useState<InsightResult['status']>('idle');\n const [summary, setSummary] = useState('');\n const [details, setDetails] = useState('');\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchInsight = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setStatus('loading');\n setError(null);\n setSummary('');\n setDetails('');\n\n try {\n let text = '';\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n setStatus('error');\n return;\n default:\n break;\n }\n }\n\n // Split at first double newline\n const splitIndex = text.indexOf('\\n\\n');\n if (splitIndex >= 0) {\n setSummary(text.slice(0, splitIndex).trim());\n setDetails(text.slice(splitIndex + 2).trim());\n } else {\n setSummary(text.trim());\n }\n setStatus('done');\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setStatus('error');\n }\n } finally {\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refresh = useCallback(() => {\n void fetchInsight();\n }, [fetchInsight]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchInsight();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchInsight]);\n\n return { status, summary, details, isLoading: status === 'loading', error, refresh };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { SSEEvent, TaskStatusValue } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalTaskOptions {\n /** The task ID to stream. */\n taskId: string;\n /** If true, starts streaming automatically on mount. Defaults to true. */\n autoStream?: boolean;\n}\n\nexport interface UseAmodalTaskReturn {\n status: TaskStatusValue | 'idle';\n progress: string;\n result: string;\n events: SSEEvent[];\n error: string | null;\n start: () => void;\n stop: () => void;\n}\n\n/**\n * Streams GET /task/:id/stream events.\n */\nexport function useAmodalTask(options: UseAmodalTaskOptions): UseAmodalTaskReturn {\n const { taskId, autoStream = true } = options;\n const { client } = useAmodalContext();\n const [status, setStatus] = useState<TaskStatusValue | 'idle'>('idle');\n const [progress, setProgress] = useState('');\n const [result, setResult] = useState('');\n const [events, setEvents] = useState<SSEEvent[]>([]);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const startedRef = useRef(false);\n\n const start = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setStatus('running');\n setError(null);\n setEvents([]);\n setResult('');\n setProgress('');\n\n try {\n let text = '';\n\n for await (const event of client.streamTask(taskId, controller.signal)) {\n setEvents((prev) => [...prev, event]);\n\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n setResult(text);\n break;\n case 'tool_call_start':\n setProgress(`Running ${event.tool_name}...`);\n break;\n case 'tool_call_result':\n setProgress('');\n break;\n case 'error':\n setError(event.message);\n setStatus('error');\n return;\n case 'done':\n setStatus('completed');\n return;\n default:\n break;\n }\n }\n\n // Stream ended without done event\n if (status === 'running') {\n setStatus('completed');\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setStatus('error');\n }\n } finally {\n abortRef.current = null;\n }\n }, [client, taskId, status]);\n\n const stop = useCallback(() => {\n if (abortRef.current) {\n abortRef.current.abort();\n abortRef.current = null;\n }\n }, []);\n\n const startRef = useRef(start);\n startRef.current = start;\n\n useEffect(() => {\n if (autoStream && !startedRef.current) {\n startedRef.current = true;\n void startRef.current();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoStream]);\n\n return {\n status,\n progress,\n result,\n events,\n error,\n start: () => void start(),\n stop,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { QueryResult } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalQueryOptions {\n /** The query prompt. */\n prompt: string;\n /** Additional context. */\n context?: Record<string, unknown>;\n /** If true, fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport type UseAmodalQueryReturn = QueryResult<string> & {\n refetch: () => void;\n};\n\n/**\n * Non-streaming query. Collects the full response text.\n */\nexport function useAmodalQuery(options: UseAmodalQueryOptions): UseAmodalQueryReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [data, setData] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchQuery = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n setError(null);\n\n try {\n let text = '';\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n\n setData(text);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refetch = useCallback(() => {\n void fetchQuery();\n }, [fetchQuery]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchQuery();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchQuery]);\n\n return { data, isLoading, error, refetch };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { StoreDocument, StoreDocumentMeta } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseStoreOptions {\n /** Document key to fetch. */\n key: string;\n /** Auto-refresh interval in milliseconds. Set to 0 to disable. Default: 30000. */\n refreshInterval?: number;\n}\n\nexport interface UseStoreReturn {\n /** Document payload (the entity data). */\n data: Record<string, unknown> | null;\n /** Document metadata (computedAt, ttl, stale, trace, etc.). */\n meta: StoreDocumentMeta | null;\n /** Full document (key, version, payload, meta). */\n document: StoreDocument | null;\n /** Version history (most recent first). */\n history: StoreDocument[];\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error message if the fetch failed. */\n error: string | null;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n/**\n * Fetch a single document from a store by key.\n *\n * @example\n * ```tsx\n * const { data, meta, isLoading } = useStore('deal-health', { key: `deal:${dealId}` });\n * if (data) {\n * console.log(data.score, data.severity);\n * }\n * ```\n */\nexport function useStore(storeName: string, options: UseStoreOptions): UseStoreReturn {\n const { key, refreshInterval = 30000 } = options;\n const { client } = useAmodalContext();\n const [document, setDocument] = useState<StoreDocument | null>(null);\n const [history, setHistory] = useState<StoreDocument[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const fetchDocument = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const result = await client.getStoreDocument(storeName, key, controller.signal);\n setDocument(result.document);\n setHistory(result.history);\n setError(null);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Failed to fetch document');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, storeName, key]);\n\n const refetch = useCallback(() => {\n void fetchDocument();\n }, [fetchDocument]);\n\n // Initial fetch\n useEffect(() => {\n setIsLoading(true);\n void fetchDocument();\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [fetchDocument]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n void fetchDocument();\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchDocument, refreshInterval]);\n\n return {\n data: document?.payload ?? null,\n meta: document?.meta ?? null,\n document,\n history,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { StoreDocument } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseStoreListOptions {\n /** Filter by field values (equality match). */\n filter?: Record<string, unknown>;\n /** Sort field. Prefix with \"-\" for descending (e.g., \"-severity\"). */\n sort?: string;\n /** Max documents to return. Default: 20. */\n limit?: number;\n /** Auto-refresh interval in milliseconds. Set to 0 to disable. Default: 30000. */\n refreshInterval?: number;\n}\n\nexport interface UseStoreListReturn {\n /** Array of document payloads. */\n data: Array<Record<string, unknown>>;\n /** Full documents (with key, version, meta). */\n documents: StoreDocument[];\n /** Total count of matching documents. */\n total: number;\n /** Whether more documents exist beyond the current page. */\n hasMore: boolean;\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error message if the fetch failed. */\n error: string | null;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n/**\n * Fetch a list of documents from a store with optional filtering and sorting.\n *\n * @example\n * ```tsx\n * const { data, total } = useStoreList('active-alerts', {\n * filter: { severity: 'P1' },\n * sort: '-computedAt',\n * limit: 10,\n * });\n * ```\n */\nexport function useStoreList(storeName: string, options: UseStoreListOptions = {}): UseStoreListReturn {\n const { filter, sort, limit = 20, refreshInterval = 30000 } = options;\n const { client } = useAmodalContext();\n const [documents, setDocuments] = useState<StoreDocument[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n // Stable stringified deps for filter object\n const filterKey = filter ? JSON.stringify(filter) : '';\n\n const fetchList = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const result = await client.getStoreDocuments(storeName, {\n filter: filterKey ? JSON.parse(filterKey) : undefined,\n sort,\n limit,\n signal: controller.signal,\n });\n setDocuments(result.documents);\n setTotal(result.total);\n setHasMore(result.hasMore);\n setError(null);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Failed to fetch store list');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, storeName, filterKey, sort, limit]);\n\n const refetch = useCallback(() => {\n void fetchList();\n }, [fetchList]);\n\n // Initial fetch\n useEffect(() => {\n setIsLoading(true);\n void fetchList();\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [fetchList]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n void fetchList();\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchList, refreshInterval]);\n\n return {\n data: documents.map((d) => d.payload),\n documents,\n total,\n hasMore,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseSkillActionOptions {\n /** Store names this skill writes to (for context in the prompt). */\n stores?: string[];\n /** Whether to include a confirmation hint in the prompt. */\n confirm?: boolean;\n}\n\nexport interface UseSkillActionReturn {\n /** Execute the skill with the given parameters. */\n execute: (params?: Record<string, unknown>) => void;\n /** Whether the skill is currently running. */\n loading: boolean;\n /** The text result from the skill execution. */\n result: string | null;\n /** Error message if execution failed. */\n error: string | null;\n}\n\n/**\n * Invoke a skill via the chat agent.\n *\n * Under the hood, this sends a structured chat message asking the agent\n * to run the skill, then collects the text response.\n *\n * @example\n * ```tsx\n * const investigate = useSkillAction('deep-investigator', {\n * stores: ['active-alerts', 'incident-correlations'],\n * });\n *\n * <button onClick={() => investigate.execute({ correlationId: '123' })}>\n * Investigate\n * </button>\n * ```\n */\nexport function useSkillAction(\n skillName: string,\n options: UseSkillActionOptions = {},\n): UseSkillActionReturn {\n const { client } = useAmodalContext();\n const [loading, setLoading] = useState(false);\n const [result, setResult] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const execute = useCallback(\n (params?: Record<string, unknown>) => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setResult(null);\n setError(null);\n\n // Build a structured prompt for the agent\n let prompt = `Run skill \"${skillName}\"`;\n if (params && Object.keys(params).length > 0) {\n prompt += ` with parameters: ${JSON.stringify(params)}`;\n }\n if (options.stores && options.stores.length > 0) {\n prompt += `. Write results to stores: ${options.stores.join(', ')}`;\n }\n if (options.confirm) {\n prompt += '. Confirm before writing.';\n }\n\n void (async () => {\n try {\n let text = '';\n for await (const event of client.chatStream(prompt, { signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n setResult(text);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Skill execution failed');\n }\n } finally {\n setLoading(false);\n abortRef.current = null;\n }\n })();\n },\n [client, skillName, options.stores, options.confirm],\n );\n\n return { execute, loading, result, error };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext, useContext, useCallback } from 'react';\n\n/**\n * Navigation function type.\n * In the runtime app, this is backed by React Router's navigate.\n * In standalone/embedded usage, the host app provides the implementation.\n */\nexport type NavigateFn = (pageName: string, params?: Record<string, string>) => void;\n\n/**\n * Context for providing a navigate function.\n * The runtime app sets this with React Router's navigate.\n * Standalone users can provide their own via NavigateProvider.\n */\nexport const NavigateContext = createContext<NavigateFn | null>(null);\n\n/**\n * Navigate between pages in the runtime app.\n *\n * In the runtime app, navigates to the page route.\n * In standalone/embedded usage, calls the host-provided navigate function.\n * If no NavigateProvider is present, returns a no-op.\n *\n * @example\n * ```tsx\n * const navigate = useNavigate();\n * navigate('incident-detail', { correlationId: '123' });\n * ```\n */\nexport function useNavigate(): NavigateFn {\n const navigateFn = useContext(NavigateContext);\n\n const noopNavigate = useCallback((_pageName: string, _params?: Record<string, string>) => {\n // No-op when no NavigateProvider is present\n }, []);\n\n return navigateFn ?? noopNavigate;\n}\n"],"names":["AmodalContext","createContext","AmodalProvider","runtimeUrl","getToken","children","client","useMemo","RuntimeClient","value","jsx","useAmodalContext","ctx","useContext","initialState","messageCounter","createMessageId","chatReducer","state","action","userMessage","assistantMessage","msgs","last","blocks","lastBlock","toolCall","updatedToolCalls","updateCall","tc","updatedCalls","block","activeToolCalls","appendEvent","updatedConfirmations","doneMessages","lastMsg","stopRunning","stoppedCalls","stoppedBlocks","newUsage","useAmodalChat","options","dispatch","useReducer","sessionIdRef","useRef","abortControllerRef","callbacksRef","send","useCallback","text","controller","receivedDone","stream","_a","event","_c","_b","_e","_d","confirmation","_g","_f","_i","_h","err","_k","_j","stop","reset","respondToConfirmation","correlationId","approved","responseText","useEffect","ConfirmCard","onApprove","onDeny","isPending","jsxs","ReviewCard","AmodalChat","placeholder","renderText","renderToolCall","renderConfirmation","className","hookOptions","messages","isStreaming","input","setInput","useState","messagesEndRef","handleSubmit","e","trimmed","rootClass","msg","i","call","conf","handleApprove","handleDeny","AmodalAction","prompt","label","context","onComplete","onError","triggered","setTriggered","trigger","lastAssistant","m","pendingConfirmations","c","index","useAmodalBrief","autoFetch","brief","setBrief","isLoading","setIsLoading","error","setError","abortRef","mountedRef","fetchBrief","toolCalls","t","refresh","useAmodalInsight","status","setStatus","summary","setSummary","details","setDetails","fetchInsight","splitIndex","useAmodalTask","taskId","autoStream","progress","setProgress","result","setResult","events","setEvents","startedRef","start","prev","startRef","useAmodalQuery","data","setData","fetchQuery","refetch","useStore","storeName","key","refreshInterval","document","setDocument","history","setHistory","fetchDocument","timer","useStoreList","filter","sort","limit","documents","setDocuments","total","setTotal","hasMore","setHasMore","filterKey","fetchList","d","useSkillAction","skillName","loading","setLoading","params","NavigateContext","useNavigate","navigateFn","noopNavigate","_pageName","_params"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../src/provider.tsx","../src/hooks/useAmodalChat.ts","../src/components/ConfirmCard.tsx","../src/components/ReviewCard.tsx","../src/chat.tsx","../src/components/AmodalAction.tsx","../src/hooks/useAmodalBrief.ts","../src/hooks/useAmodalInsight.ts","../src/hooks/useAmodalTask.ts","../src/hooks/useAmodalQuery.ts","../src/hooks/useStore.ts","../src/hooks/useStoreList.ts","../src/hooks/useSkillAction.ts","../src/hooks/useNavigate.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport { RuntimeClient } from './client/runtime-client';\n\nexport interface AmodalProviderProps {\n /** Base URL of the Amodal runtime server (e.g., \"http://localhost:3001\"). */\n runtimeUrl: string;\n /** Optional token getter for auth (hosted mode). */\n getToken?: () => string | Promise<string> | null | undefined;\n children: ReactNode;\n}\n\ninterface AmodalContextValue {\n client: RuntimeClient;\n runtimeUrl: string;\n}\n\nconst AmodalContext = createContext<AmodalContextValue | null>(null);\n\n/**\n * Provides a RuntimeClient to all child hooks and components.\n */\nexport function AmodalProvider({ runtimeUrl, getToken, children }: AmodalProviderProps) {\n const client = useMemo(\n () => new RuntimeClient({ runtimeUrl, getToken }),\n [runtimeUrl, getToken],\n );\n\n const value = useMemo(\n () => ({ client, runtimeUrl }),\n [client, runtimeUrl],\n );\n\n return <AmodalContext.Provider value={value}>{children}</AmodalContext.Provider>;\n}\n\n/**\n * Access the RuntimeClient and config from the nearest AmodalProvider.\n * Throws if called outside of an AmodalProvider.\n */\nexport function useAmodalContext(): AmodalContextValue {\n const ctx = useContext(AmodalContext);\n if (!ctx) {\n throw new Error('useAmodalContext must be used within an <AmodalProvider>');\n }\n return ctx;\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\nimport type {\n ChatState,\n ChatAction,\n ChatMessage,\n AssistantTextMessage,\n ToolCallInfo,\n ContentBlock,\n ConfirmationInfo,\n} from '../types';\nimport { useAmodalContext } from '../provider';\n\nconst initialState: ChatState = {\n messages: [],\n sessionId: null,\n isStreaming: false,\n error: null,\n activeToolCalls: [],\n isHistorical: false,\n usage: {inputTokens: 0, outputTokens: 0},\n};\n\nlet messageCounter = 0;\n\nfunction createMessageId(): string {\n messageCounter++;\n return `msg-${Date.now()}-${String(messageCounter)}`;\n}\n\nexport function chatReducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case 'SEND_MESSAGE': {\n const userMessage: ChatMessage = {\n type: 'user',\n id: createMessageId(),\n text: action.text,\n timestamp: new Date().toISOString(),\n };\n const assistantMessage: AssistantTextMessage = {\n type: 'assistant_text',\n id: createMessageId(),\n text: '',\n toolCalls: [],\n confirmations: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n return {\n ...state,\n messages: [...state.messages, userMessage, assistantMessage],\n isStreaming: true,\n error: null,\n activeToolCalls: [],\n };\n }\n case 'STREAM_INIT':\n return { ...state, sessionId: action.sessionId };\n case 'STREAM_TEXT_DELTA': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'text') {\n blocks[blocks.length - 1] = { type: 'text', text: lastBlock.text + action.content };\n } else {\n blocks.push({ type: 'text', text: action.content });\n }\n msgs[msgs.length - 1] = { ...last, text: last.text + action.content, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_TOOL_CALL_START': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n const toolCall: ToolCallInfo = {\n toolId: action.toolId,\n toolName: action.toolName,\n parameters: action.parameters,\n status: 'running',\n };\n if (last && last.type === 'assistant_text') {\n const updatedToolCalls = [...last.toolCalls, toolCall];\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'tool_calls') {\n blocks[blocks.length - 1] = { type: 'tool_calls', calls: [...lastBlock.calls, toolCall] };\n } else {\n blocks.push({ type: 'tool_calls', calls: [toolCall] });\n }\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedToolCalls, contentBlocks: blocks };\n }\n return {\n ...state,\n messages: msgs,\n activeToolCalls: [...state.activeToolCalls, toolCall],\n };\n }\n case 'STREAM_TOOL_CALL_RESULT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updateCall = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.toolId\n ? {\n ...tc,\n status: action.status,\n result: action.result,\n parameters: action.parameters ?? tc.parameters,\n duration_ms: action.duration_ms,\n error: action.error,\n }\n : tc;\n const updatedCalls = last.toolCalls.map(updateCall);\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(updateCall) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n const activeToolCalls = state.activeToolCalls.filter(\n (tc) => tc.toolId !== action.toolId,\n );\n return { ...state, messages: msgs, activeToolCalls };\n }\n case 'STREAM_SUBAGENT_EVENT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const appendEvent = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.parentToolId\n ? { ...tc, subagentEvents: [...(tc.subagentEvents ?? []), action.event] }\n : tc;\n const updatedCalls = last.toolCalls.map(appendEvent);\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(appendEvent) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_WIDGET': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'widget',\n widgetType: action.widgetType,\n data: action.data,\n };\n msgs[msgs.length - 1] = {\n ...last,\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_CONFIRMATION_REQUIRED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'confirmation',\n confirmation: action.confirmation,\n };\n msgs[msgs.length - 1] = {\n ...last,\n confirmations: [...last.confirmations, action.confirmation],\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'CONFIRMATION_RESPONDED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updatedConfirmations = last.confirmations.map((c) =>\n c.correlationId === action.correlationId\n ? { ...c, status: (action.approved ? 'approved' : 'denied') as ConfirmationInfo['status'] }\n : c,\n );\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'confirmation' && block.confirmation.correlationId === action.correlationId\n ? { ...block, confirmation: { ...block.confirmation, status: (action.approved ? 'approved' : 'denied') as ConfirmationInfo['status'] } }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, confirmations: updatedConfirmations, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_ERROR':\n return { ...state, isStreaming: false, error: action.message, activeToolCalls: [] };\n case 'STREAM_DONE': {\n const doneMessages = [...state.messages];\n const lastMsg = doneMessages[doneMessages.length - 1];\n if (lastMsg && lastMsg.type === 'assistant_text') {\n const stopRunning = (tc: ToolCallInfo): ToolCallInfo =>\n tc.status === 'running' ? { ...tc, status: 'error', error: 'Stopped' } : tc;\n const stoppedCalls = lastMsg.toolCalls.map(stopRunning);\n const stoppedBlocks = lastMsg.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(stopRunning) }\n : block,\n );\n doneMessages[doneMessages.length - 1] = { ...lastMsg, toolCalls: stoppedCalls, contentBlocks: stoppedBlocks };\n }\n const newUsage = action.usage\n ? {inputTokens: state.usage.inputTokens + action.usage.inputTokens, outputTokens: state.usage.outputTokens + action.usage.outputTokens}\n : state.usage;\n return { ...state, messages: doneMessages, isStreaming: false, activeToolCalls: [], usage: newUsage };\n }\n case 'RESET':\n return { ...initialState };\n default:\n return state;\n }\n}\n\nexport interface UseAmodalChatOptions {\n /** Pre-seed session ID for resuming a previous session. */\n initialSessionId?: string | null;\n /** Additional context sent with each chat message. */\n context?: Record<string, unknown>;\n /** Called when the SSE stream ends. */\n onStreamEnd?: () => void;\n /** Called when a session ID is received from the server. */\n onSessionCreated?: (sessionId: string) => void;\n /** Called on each tool call result. */\n onToolCall?: (call: ToolCallInfo) => void;\n /** Called when a confirmation is required. */\n onConfirmation?: (confirmation: ConfirmationInfo) => void;\n}\n\nexport interface UseAmodalChatReturn {\n messages: ChatMessage[];\n send: (text: string) => void;\n stop: () => void;\n isStreaming: boolean;\n activeToolCalls: ToolCallInfo[];\n sessionId: string | null;\n error: string | null;\n usage: {inputTokens: number; outputTokens: number};\n reset: () => void;\n respondToConfirmation: (correlationId: string, approved: boolean) => void;\n}\n\nexport function useAmodalChat(options?: UseAmodalChatOptions): UseAmodalChatReturn {\n const { client } = useAmodalContext();\n const [state, dispatch] = useReducer(chatReducer, initialState);\n const sessionIdRef = useRef<string | null>(options?.initialSessionId ?? null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const callbacksRef = useRef(options);\n callbacksRef.current = options;\n\n sessionIdRef.current = state.sessionId ?? sessionIdRef.current;\n\n const send = useCallback(\n (text: string) => {\n if (state.isStreaming) return;\n\n dispatch({ type: 'SEND_MESSAGE', text });\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n const runStream = async () => {\n let receivedDone = false;\n try {\n const stream = client.chatStream(text, {\n sessionId: sessionIdRef.current ?? undefined,\n context: callbacksRef.current?.context,\n signal: controller.signal,\n });\n\n for await (const event of stream) {\n switch (event.type) {\n case 'init':\n dispatch({ type: 'STREAM_INIT', sessionId: event.session_id });\n callbacksRef.current?.onSessionCreated?.(event.session_id);\n break;\n case 'text_delta':\n dispatch({ type: 'STREAM_TEXT_DELTA', content: event.content });\n break;\n case 'tool_call_start':\n dispatch({\n type: 'STREAM_TOOL_CALL_START',\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n case 'tool_call_result':\n dispatch({\n type: 'STREAM_TOOL_CALL_RESULT',\n toolId: event.tool_id,\n status: event.status,\n result: event.result,\n parameters: event.parameters,\n duration_ms: event.duration_ms,\n error: event.error,\n });\n callbacksRef.current?.onToolCall?.({\n toolId: event.tool_id,\n toolName: '',\n parameters: {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n });\n break;\n case 'subagent_event':\n dispatch({\n type: 'STREAM_SUBAGENT_EVENT',\n parentToolId: event.parent_tool_id,\n event: {\n agentName: event.agent_name,\n eventType: event.event_type,\n toolName: event.tool_name,\n toolArgs: event.tool_args,\n result: event.result,\n text: event.text,\n error: event.error,\n timestamp: event.timestamp,\n },\n });\n break;\n case 'widget':\n dispatch({\n type: 'STREAM_WIDGET',\n widgetType: event.widget_type,\n data: event.data,\n });\n break;\n case 'confirmation_required': {\n const confirmation: ConfirmationInfo = {\n endpoint: event.endpoint,\n method: event.method,\n reason: event.reason,\n escalated: event.escalated,\n params: event.params,\n connectionName: event.connection_name,\n correlationId: event.correlation_id,\n status: 'pending',\n };\n dispatch({ type: 'STREAM_CONFIRMATION_REQUIRED', confirmation });\n callbacksRef.current?.onConfirmation?.(confirmation);\n break;\n }\n case 'error':\n dispatch({ type: 'STREAM_ERROR', message: event.message });\n break;\n case 'done':\n receivedDone = true;\n dispatch({\n type: 'STREAM_DONE',\n usage: event.usage ? {inputTokens: event.usage.input_tokens, outputTokens: event.usage.output_tokens} : undefined,\n });\n callbacksRef.current?.onStreamEnd?.();\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n dispatch({\n type: 'STREAM_ERROR',\n message: err instanceof Error ? err.message : 'Unknown error',\n });\n }\n } finally {\n abortControllerRef.current = null;\n if (!receivedDone && !controller.signal.aborted) {\n dispatch({ type: 'STREAM_DONE' });\n callbacksRef.current?.onStreamEnd?.();\n }\n }\n };\n\n void runStream();\n },\n [client, state.isStreaming],\n );\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n dispatch({ type: 'STREAM_DONE' });\n }, []);\n\n const reset = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n sessionIdRef.current = null;\n dispatch({ type: 'RESET' });\n }, []);\n\n const respondToConfirmation = useCallback(\n (correlationId: string, approved: boolean) => {\n dispatch({ type: 'CONFIRMATION_RESPONDED', correlationId, approved });\n\n // Send approval/denial as a follow-up chat message\n const responseText = approved\n ? `I approve the action (correlation: ${correlationId})`\n : `I deny the action (correlation: ${correlationId})`;\n\n // Queue the response after the current stream ends\n if (!state.isStreaming) {\n send(responseText);\n }\n },\n [send, state.isStreaming],\n );\n\n // Abort on unmount\n useEffect(\n () => () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n },\n [],\n );\n\n return {\n messages: state.messages,\n send,\n stop,\n isStreaming: state.isStreaming,\n activeToolCalls: state.activeToolCalls,\n sessionId: state.sessionId,\n error: state.error,\n usage: state.usage,\n reset,\n respondToConfirmation,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { ConfirmationInfo } from '../types';\n\nexport interface ConfirmCardProps {\n confirmation: ConfirmationInfo;\n onApprove: () => void;\n onDeny: () => void;\n}\n\n/**\n * Simple confirmation card: shows endpoint + method + reason, approve/deny buttons.\n */\nexport function ConfirmCard({ confirmation, onApprove, onDeny }: ConfirmCardProps) {\n const isPending = confirmation.status === 'pending';\n\n return (\n <div className=\"amodal-confirm-card\" data-testid=\"confirm-card\">\n <div className=\"amodal-confirm-card__header\">\n <span className=\"amodal-confirm-card__method\">{confirmation.method}</span>\n <span className=\"amodal-confirm-card__endpoint\">{confirmation.endpoint}</span>\n </div>\n <p className=\"amodal-confirm-card__reason\">{confirmation.reason}</p>\n {isPending ? (\n <div className=\"amodal-confirm-card__actions\">\n <button\n className=\"amodal-confirm-card__btn amodal-confirm-card__btn--approve\"\n onClick={onApprove}\n data-testid=\"confirm-approve\"\n >\n Approve\n </button>\n <button\n className=\"amodal-confirm-card__btn amodal-confirm-card__btn--deny\"\n onClick={onDeny}\n data-testid=\"confirm-deny\"\n >\n Deny\n </button>\n </div>\n ) : (\n <div className=\"amodal-confirm-card__status\" data-testid=\"confirm-status\">\n {confirmation.status === 'approved' ? 'Approved' : 'Denied'}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { ConfirmationInfo } from '../types';\n\nexport interface ReviewCardProps {\n confirmation: ConfirmationInfo;\n onApprove: () => void;\n onDeny: () => void;\n}\n\n/**\n * Structured review card: all params, reason, escalation badge, approve/deny.\n */\nexport function ReviewCard({ confirmation, onApprove, onDeny }: ReviewCardProps) {\n const isPending = confirmation.status === 'pending';\n\n return (\n <div className=\"amodal-review-card\" data-testid=\"review-card\">\n <div className=\"amodal-review-card__header\">\n <span className=\"amodal-review-card__method\">{confirmation.method}</span>\n <span className=\"amodal-review-card__endpoint\">{confirmation.endpoint}</span>\n {confirmation.escalated && (\n <span className=\"amodal-review-card__badge\" data-testid=\"escalation-badge\">\n Escalated\n </span>\n )}\n </div>\n {confirmation.connectionName && (\n <div className=\"amodal-review-card__connection\">\n Connection: {confirmation.connectionName}\n </div>\n )}\n <p className=\"amodal-review-card__reason\">{confirmation.reason}</p>\n {confirmation.params && Object.keys(confirmation.params).length > 0 && (\n <div className=\"amodal-review-card__params\" data-testid=\"review-params\">\n <div className=\"amodal-review-card__params-title\">Parameters</div>\n <pre className=\"amodal-review-card__params-body\">\n {JSON.stringify(confirmation.params, null, 2)}\n </pre>\n </div>\n )}\n {isPending ? (\n <div className=\"amodal-review-card__actions\">\n <button\n className=\"amodal-review-card__btn amodal-review-card__btn--approve\"\n onClick={onApprove}\n data-testid=\"review-approve\"\n >\n Approve\n </button>\n <button\n className=\"amodal-review-card__btn amodal-review-card__btn--deny\"\n onClick={onDeny}\n data-testid=\"review-deny\"\n >\n Deny\n </button>\n </div>\n ) : (\n <div className=\"amodal-review-card__status\" data-testid=\"review-status\">\n {confirmation.status === 'approved' ? 'Approved' : 'Denied'}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { ConfirmationInfo, ToolCallInfo } from './types';\nimport { useAmodalChat } from './hooks/useAmodalChat';\nimport type { UseAmodalChatOptions } from './hooks/useAmodalChat';\nimport { ConfirmCard } from './components/ConfirmCard';\nimport { ReviewCard } from './components/ReviewCard';\n\nexport interface AmodalChatProps extends UseAmodalChatOptions {\n /** Placeholder text for the input bar. */\n placeholder?: string;\n /** Custom renderer for text content blocks. */\n renderText?: (text: string) => React.ReactNode;\n /** Custom renderer for tool call blocks. */\n renderToolCall?: (call: ToolCallInfo) => React.ReactNode;\n /** Custom renderer for confirmation blocks. */\n renderConfirmation?: (confirmation: ConfirmationInfo, onApprove: () => void, onDeny: () => void) => React.ReactNode;\n /** CSS class name for the root element. */\n className?: string;\n}\n\n/**\n * Full chat component — message list, input bar, renders confirmations inline.\n */\nexport function AmodalChat({\n placeholder = 'Type a message...',\n renderText,\n renderToolCall,\n renderConfirmation,\n className,\n ...hookOptions\n}: AmodalChatProps) {\n const { messages, send, isStreaming, respondToConfirmation } = useAmodalChat(hookOptions);\n const [input, setInput] = useState('');\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const handleSubmit = useCallback(\n (e: FormEvent) => {\n e.preventDefault();\n const trimmed = input.trim();\n if (trimmed.length === 0 || isStreaming) return;\n setInput('');\n send(trimmed);\n },\n [input, isStreaming, send],\n );\n\n const rootClass = ['amodal-chat', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClass} data-testid=\"amodal-chat\">\n <div className=\"amodal-chat__messages\" data-testid=\"message-list\">\n {messages.map((msg) => {\n switch (msg.type) {\n case 'user':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--user\" data-testid=\"user-message\">\n {msg.text}\n </div>\n );\n case 'assistant_text':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--assistant\" data-testid=\"assistant-message\">\n {msg.contentBlocks.map((block, i) => {\n switch (block.type) {\n case 'text':\n return (\n <div key={`text-${String(i)}`} className=\"amodal-chat__text\">\n {renderText ? renderText(block.text) : block.text}\n </div>\n );\n case 'tool_calls':\n return (\n <div key={`tools-${String(i)}`} className=\"amodal-chat__tool-calls\">\n {block.calls.map((call) =>\n renderToolCall ? (\n <div key={call.toolId}>{renderToolCall(call)}</div>\n ) : (\n <div key={call.toolId} className=\"amodal-chat__tool-call\" data-testid=\"tool-call\">\n <span className=\"amodal-chat__tool-name\">{call.toolName}</span>\n <span className=\"amodal-chat__tool-status\">{call.status}</span>\n </div>\n ),\n )}\n </div>\n );\n case 'confirmation': {\n const conf = block.confirmation;\n const handleApprove = () => {\n if (conf.correlationId) {\n respondToConfirmation(conf.correlationId, true);\n }\n };\n const handleDeny = () => {\n if (conf.correlationId) {\n respondToConfirmation(conf.correlationId, false);\n }\n };\n if (renderConfirmation) {\n return <div key={`conf-${String(i)}`}>{renderConfirmation(conf, handleApprove, handleDeny)}</div>;\n }\n if (conf.escalated || (conf.params && Object.keys(conf.params).length > 0)) {\n return <ReviewCard key={`conf-${String(i)}`} confirmation={conf} onApprove={handleApprove} onDeny={handleDeny} />;\n }\n return <ConfirmCard key={`conf-${String(i)}`} confirmation={conf} onApprove={handleApprove} onDeny={handleDeny} />;\n }\n case 'widget':\n return (\n <div key={`widget-${String(i)}`} className=\"amodal-chat__widget\" data-testid=\"widget\">\n {block.widgetType}\n </div>\n );\n default:\n return null;\n }\n })}\n </div>\n );\n case 'error':\n return (\n <div key={msg.id} className=\"amodal-chat__message amodal-chat__message--error\" data-testid=\"error-message\">\n {msg.message}\n </div>\n );\n default:\n return null;\n }\n })}\n <div ref={messagesEndRef} />\n </div>\n <form className=\"amodal-chat__input-bar\" onSubmit={handleSubmit} data-testid=\"input-bar\">\n <input\n className=\"amodal-chat__input\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={placeholder}\n disabled={isStreaming}\n data-testid=\"chat-input\"\n />\n <button\n className=\"amodal-chat__send\"\n type=\"submit\"\n disabled={isStreaming || input.trim().length === 0}\n data-testid=\"send-button\"\n >\n Send\n </button>\n </form>\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useState } from 'react';\nimport type { ConfirmationInfo } from '../types';\nimport { useAmodalChat } from '../hooks/useAmodalChat';\nimport { ConfirmCard } from './ConfirmCard';\nimport { ReviewCard } from './ReviewCard';\n\nexport interface AmodalActionProps {\n /** The prompt to send when the action is triggered. */\n prompt: string;\n /** Label for the trigger button. */\n label?: string;\n /** Additional context sent with the chat message. */\n context?: Record<string, unknown>;\n /** Called when the action completes. */\n onComplete?: (text: string) => void;\n /** Called on error. */\n onError?: (error: string) => void;\n}\n\n/**\n * One-shot action: triggers a chat stream with a prompt, shows confirmation inline.\n */\nexport function AmodalAction({ prompt, label, context, onComplete, onError }: AmodalActionProps) {\n const [triggered, setTriggered] = useState(false);\n\n const { messages, send, isStreaming, respondToConfirmation } = useAmodalChat({\n context,\n onStreamEnd: () => {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.type === 'assistant_text') {\n onComplete?.(lastMsg.text);\n } else if (lastMsg && lastMsg.type === 'error') {\n onError?.(lastMsg.message);\n }\n },\n });\n\n const trigger = useCallback(() => {\n if (triggered || isStreaming) return;\n setTriggered(true);\n send(prompt);\n }, [triggered, isStreaming, send, prompt]);\n\n const lastAssistant = [...messages].reverse().find((m) => m.type === 'assistant_text');\n const pendingConfirmations: ConfirmationInfo[] =\n lastAssistant && lastAssistant.type === 'assistant_text'\n ? lastAssistant.confirmations.filter((c) => c.status === 'pending')\n : [];\n\n const renderConfirmation = (confirmation: ConfirmationInfo, index: number) => {\n const handleApprove = () => {\n if (confirmation.correlationId) {\n respondToConfirmation(confirmation.correlationId, true);\n }\n };\n const handleDeny = () => {\n if (confirmation.correlationId) {\n respondToConfirmation(confirmation.correlationId, false);\n }\n };\n\n if (confirmation.escalated || (confirmation.params && Object.keys(confirmation.params).length > 0)) {\n return (\n <ReviewCard\n key={confirmation.correlationId ?? String(index)}\n confirmation={confirmation}\n onApprove={handleApprove}\n onDeny={handleDeny}\n />\n );\n }\n\n return (\n <ConfirmCard\n key={confirmation.correlationId ?? String(index)}\n confirmation={confirmation}\n onApprove={handleApprove}\n onDeny={handleDeny}\n />\n );\n };\n\n if (!triggered) {\n return (\n <button\n className=\"amodal-action__trigger\"\n onClick={trigger}\n data-testid=\"action-trigger\"\n >\n {label ?? 'Run'}\n </button>\n );\n }\n\n return (\n <div className=\"amodal-action\" data-testid=\"action-container\">\n {isStreaming && (\n <div className=\"amodal-action__loading\" data-testid=\"action-loading\">\n Processing...\n </div>\n )}\n {lastAssistant && lastAssistant.type === 'assistant_text' && lastAssistant.text && (\n <div className=\"amodal-action__result\" data-testid=\"action-result\">\n {lastAssistant.text}\n </div>\n )}\n {pendingConfirmations.map(renderConfirmation)}\n </div>\n );\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { BriefResult, ToolCallInfo } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalBriefOptions {\n /** The prompt to send for the brief. */\n prompt: string;\n /** Additional context sent with the request. */\n context?: Record<string, unknown>;\n /** If true, the brief is fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport interface UseAmodalBriefReturn {\n brief: BriefResult | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\n/**\n * Sends a chat with a brief prompt, collects the full response.\n */\nexport function useAmodalBrief(options: UseAmodalBriefOptions): UseAmodalBriefReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [brief, setBrief] = useState<BriefResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchBrief = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n setError(null);\n\n try {\n let text = '';\n const toolCalls: ToolCallInfo[] = [];\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'tool_call_start':\n toolCalls.push({\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n });\n break;\n case 'tool_call_result': {\n const tc = toolCalls.find((t) => t.toolId === event.tool_id);\n if (tc) {\n tc.status = event.status;\n tc.result = event.result;\n tc.duration_ms = event.duration_ms;\n tc.error = event.error;\n }\n break;\n }\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n\n setBrief({ text, toolCalls });\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refresh = useCallback(() => {\n void fetchBrief();\n }, [fetchBrief]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchBrief();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchBrief]);\n\n return { brief, isLoading, error, refresh };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { InsightResult } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalInsightOptions {\n /** The insight prompt to send. */\n prompt: string;\n /** Additional context for the insight. */\n context?: Record<string, unknown>;\n /** If true, fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport interface UseAmodalInsightReturn {\n status: InsightResult['status'];\n summary: string;\n details: string;\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\n/**\n * Sends a chat with an insight prompt, collects a structured response.\n * Splits the response at the first double newline into summary and details.\n */\nexport function useAmodalInsight(options: UseAmodalInsightOptions): UseAmodalInsightReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [status, setStatus] = useState<InsightResult['status']>('idle');\n const [summary, setSummary] = useState('');\n const [details, setDetails] = useState('');\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchInsight = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setStatus('loading');\n setError(null);\n setSummary('');\n setDetails('');\n\n try {\n let text = '';\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n setStatus('error');\n return;\n default:\n break;\n }\n }\n\n // Split at first double newline\n const splitIndex = text.indexOf('\\n\\n');\n if (splitIndex >= 0) {\n setSummary(text.slice(0, splitIndex).trim());\n setDetails(text.slice(splitIndex + 2).trim());\n } else {\n setSummary(text.trim());\n }\n setStatus('done');\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setStatus('error');\n }\n } finally {\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refresh = useCallback(() => {\n void fetchInsight();\n }, [fetchInsight]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchInsight();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchInsight]);\n\n return { status, summary, details, isLoading: status === 'loading', error, refresh };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { SSEEvent, TaskStatusValue } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalTaskOptions {\n /** The task ID to stream. */\n taskId: string;\n /** If true, starts streaming automatically on mount. Defaults to true. */\n autoStream?: boolean;\n}\n\nexport interface UseAmodalTaskReturn {\n status: TaskStatusValue | 'idle';\n progress: string;\n result: string;\n events: SSEEvent[];\n error: string | null;\n start: () => void;\n stop: () => void;\n}\n\n/**\n * Streams GET /task/:id/stream events.\n */\nexport function useAmodalTask(options: UseAmodalTaskOptions): UseAmodalTaskReturn {\n const { taskId, autoStream = true } = options;\n const { client } = useAmodalContext();\n const [status, setStatus] = useState<TaskStatusValue | 'idle'>('idle');\n const [progress, setProgress] = useState('');\n const [result, setResult] = useState('');\n const [events, setEvents] = useState<SSEEvent[]>([]);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const startedRef = useRef(false);\n\n const start = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setStatus('running');\n setError(null);\n setEvents([]);\n setResult('');\n setProgress('');\n\n try {\n let text = '';\n\n for await (const event of client.streamTask(taskId, controller.signal)) {\n setEvents((prev) => [...prev, event]);\n\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n setResult(text);\n break;\n case 'tool_call_start':\n setProgress(`Running ${event.tool_name}...`);\n break;\n case 'tool_call_result':\n setProgress('');\n break;\n case 'error':\n setError(event.message);\n setStatus('error');\n return;\n case 'done':\n setStatus('completed');\n return;\n default:\n break;\n }\n }\n\n // Stream ended without done event\n if (status === 'running') {\n setStatus('completed');\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setStatus('error');\n }\n } finally {\n abortRef.current = null;\n }\n }, [client, taskId, status]);\n\n const stop = useCallback(() => {\n if (abortRef.current) {\n abortRef.current.abort();\n abortRef.current = null;\n }\n }, []);\n\n const startRef = useRef(start);\n startRef.current = start;\n\n useEffect(() => {\n if (autoStream && !startedRef.current) {\n startedRef.current = true;\n void startRef.current();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoStream]);\n\n return {\n status,\n progress,\n result,\n events,\n error,\n start: () => void start(),\n stop,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { QueryResult } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseAmodalQueryOptions {\n /** The query prompt. */\n prompt: string;\n /** Additional context. */\n context?: Record<string, unknown>;\n /** If true, fetched automatically on mount. Defaults to true. */\n autoFetch?: boolean;\n}\n\nexport type UseAmodalQueryReturn = QueryResult<string> & {\n refetch: () => void;\n};\n\n/**\n * Non-streaming query. Collects the full response text.\n */\nexport function useAmodalQuery(options: UseAmodalQueryOptions): UseAmodalQueryReturn {\n const { prompt, context, autoFetch = true } = options;\n const { client } = useAmodalContext();\n const [data, setData] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n\n const fetchQuery = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n setError(null);\n\n try {\n let text = '';\n\n for await (const event of client.chatStream(prompt, { context, signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n\n setData(text);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, prompt, context]);\n\n const refetch = useCallback(() => {\n void fetchQuery();\n }, [fetchQuery]);\n\n useEffect(() => {\n if (autoFetch && !mountedRef.current) {\n mountedRef.current = true;\n void fetchQuery();\n }\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [autoFetch, fetchQuery]);\n\n return { data, isLoading, error, refetch };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { StoreDocument, StoreDocumentMeta } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseStoreOptions {\n /** Document key to fetch. */\n key: string;\n /** Auto-refresh interval in milliseconds. Set to 0 to disable. Default: 30000. */\n refreshInterval?: number;\n}\n\nexport interface UseStoreReturn {\n /** Document payload (the entity data). */\n data: Record<string, unknown> | null;\n /** Document metadata (computedAt, ttl, stale, trace, etc.). */\n meta: StoreDocumentMeta | null;\n /** Full document (key, version, payload, meta). */\n document: StoreDocument | null;\n /** Version history (most recent first). */\n history: StoreDocument[];\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error message if the fetch failed. */\n error: string | null;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n/**\n * Fetch a single document from a store by key.\n *\n * @example\n * ```tsx\n * const { data, meta, isLoading } = useStore('deal-health', { key: `deal:${dealId}` });\n * if (data) {\n * console.log(data.score, data.severity);\n * }\n * ```\n */\nexport function useStore(storeName: string, options: UseStoreOptions): UseStoreReturn {\n const { key, refreshInterval = 30000 } = options;\n const { client } = useAmodalContext();\n const [document, setDocument] = useState<StoreDocument | null>(null);\n const [history, setHistory] = useState<StoreDocument[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const fetchDocument = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const result = await client.getStoreDocument(storeName, key, controller.signal);\n setDocument(result.document);\n setHistory(result.history);\n setError(null);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Failed to fetch document');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, storeName, key]);\n\n const refetch = useCallback(() => {\n void fetchDocument();\n }, [fetchDocument]);\n\n // Initial fetch\n useEffect(() => {\n setIsLoading(true);\n void fetchDocument();\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [fetchDocument]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n void fetchDocument();\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchDocument, refreshInterval]);\n\n return {\n data: document?.payload ?? null,\n meta: document?.meta ?? null,\n document,\n history,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { StoreDocument } from '../types';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseStoreListOptions {\n /** Filter by field values (equality match). */\n filter?: Record<string, unknown>;\n /** Sort field. Prefix with \"-\" for descending (e.g., \"-severity\"). */\n sort?: string;\n /** Max documents to return. Default: 20. */\n limit?: number;\n /** Auto-refresh interval in milliseconds. Set to 0 to disable. Default: 30000. */\n refreshInterval?: number;\n}\n\nexport interface UseStoreListReturn {\n /** Array of document payloads. */\n data: Array<Record<string, unknown>>;\n /** Full documents (with key, version, meta). */\n documents: StoreDocument[];\n /** Total count of matching documents. */\n total: number;\n /** Whether more documents exist beyond the current page. */\n hasMore: boolean;\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error message if the fetch failed. */\n error: string | null;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n/**\n * Fetch a list of documents from a store with optional filtering and sorting.\n *\n * @example\n * ```tsx\n * const { data, total } = useStoreList('active-alerts', {\n * filter: { severity: 'P1' },\n * sort: '-computedAt',\n * limit: 10,\n * });\n * ```\n */\nexport function useStoreList(storeName: string, options: UseStoreListOptions = {}): UseStoreListReturn {\n const { filter, sort, limit = 20, refreshInterval = 30000 } = options;\n const { client } = useAmodalContext();\n const [documents, setDocuments] = useState<StoreDocument[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n // Stable stringified deps for filter object\n const filterKey = filter ? JSON.stringify(filter) : '';\n\n const fetchList = useCallback(async () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const result = await client.getStoreDocuments(storeName, {\n filter: filterKey ? JSON.parse(filterKey) : undefined,\n sort,\n limit,\n signal: controller.signal,\n });\n setDocuments(result.documents);\n setTotal(result.total);\n setHasMore(result.hasMore);\n setError(null);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Failed to fetch store list');\n }\n } finally {\n setIsLoading(false);\n abortRef.current = null;\n }\n }, [client, storeName, filterKey, sort, limit]);\n\n const refetch = useCallback(() => {\n void fetchList();\n }, [fetchList]);\n\n // Initial fetch\n useEffect(() => {\n setIsLoading(true);\n void fetchList();\n\n return () => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n };\n }, [fetchList]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n void fetchList();\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchList, refreshInterval]);\n\n return {\n data: documents.map((d) => d.payload),\n documents,\n total,\n hasMore,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { useAmodalContext } from '../provider';\n\nexport interface UseSkillActionOptions {\n /** Store names this skill writes to (for context in the prompt). */\n stores?: string[];\n /** Whether to include a confirmation hint in the prompt. */\n confirm?: boolean;\n}\n\nexport interface UseSkillActionReturn {\n /** Execute the skill with the given parameters. */\n execute: (params?: Record<string, unknown>) => void;\n /** Whether the skill is currently running. */\n loading: boolean;\n /** The text result from the skill execution. */\n result: string | null;\n /** Error message if execution failed. */\n error: string | null;\n}\n\n/**\n * Invoke a skill via the chat agent.\n *\n * Under the hood, this sends a structured chat message asking the agent\n * to run the skill, then collects the text response.\n *\n * @example\n * ```tsx\n * const investigate = useSkillAction('deep-investigator', {\n * stores: ['active-alerts', 'incident-correlations'],\n * });\n *\n * <button onClick={() => investigate.execute({ correlationId: '123' })}>\n * Investigate\n * </button>\n * ```\n */\nexport function useSkillAction(\n skillName: string,\n options: UseSkillActionOptions = {},\n): UseSkillActionReturn {\n const { client } = useAmodalContext();\n const [loading, setLoading] = useState(false);\n const [result, setResult] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const execute = useCallback(\n (params?: Record<string, unknown>) => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setResult(null);\n setError(null);\n\n // Build a structured prompt for the agent\n let prompt = `Run skill \"${skillName}\"`;\n if (params && Object.keys(params).length > 0) {\n prompt += ` with parameters: ${JSON.stringify(params)}`;\n }\n if (options.stores && options.stores.length > 0) {\n prompt += `. Write results to stores: ${options.stores.join(', ')}`;\n }\n if (options.confirm) {\n prompt += '. Confirm before writing.';\n }\n\n void (async () => {\n try {\n let text = '';\n for await (const event of client.chatStream(prompt, { signal: controller.signal })) {\n switch (event.type) {\n case 'text_delta':\n text += event.content;\n break;\n case 'error':\n setError(event.message);\n break;\n default:\n break;\n }\n }\n setResult(text);\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n setError(err instanceof Error ? err.message : 'Skill execution failed');\n }\n } finally {\n setLoading(false);\n abortRef.current = null;\n }\n })();\n },\n [client, skillName, options.stores, options.confirm],\n );\n\n return { execute, loading, result, error };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext, useContext, useCallback } from 'react';\n\n/**\n * Navigation function type.\n * In the runtime app, this is backed by React Router's navigate.\n * In standalone/embedded usage, the host app provides the implementation.\n */\nexport type NavigateFn = (pageName: string, params?: Record<string, string>) => void;\n\n/**\n * Context for providing a navigate function.\n * The runtime app sets this with React Router's navigate.\n * Standalone users can provide their own via NavigateProvider.\n */\nexport const NavigateContext = createContext<NavigateFn | null>(null);\n\n/**\n * Navigate between pages in the runtime app.\n *\n * In the runtime app, navigates to the page route.\n * In standalone/embedded usage, calls the host-provided navigate function.\n * If no NavigateProvider is present, returns a no-op.\n *\n * @example\n * ```tsx\n * const navigate = useNavigate();\n * navigate('incident-detail', { correlationId: '123' });\n * ```\n */\nexport function useNavigate(): NavigateFn {\n const navigateFn = useContext(NavigateContext);\n\n const noopNavigate = useCallback((_pageName: string, _params?: Record<string, string>) => {\n // No-op when no NavigateProvider is present\n }, []);\n\n return navigateFn ?? noopNavigate;\n}\n"],"names":["AmodalContext","createContext","AmodalProvider","runtimeUrl","getToken","children","client","useMemo","RuntimeClient","value","jsx","useAmodalContext","ctx","useContext","initialState","messageCounter","createMessageId","chatReducer","state","action","userMessage","assistantMessage","msgs","last","blocks","lastBlock","toolCall","updatedToolCalls","updateCall","tc","updatedCalls","block","activeToolCalls","appendEvent","updatedConfirmations","doneMessages","lastMsg","stopRunning","stoppedCalls","stoppedBlocks","newUsage","useAmodalChat","options","dispatch","useReducer","sessionIdRef","useRef","abortControllerRef","callbacksRef","send","useCallback","text","controller","receivedDone","stream","_a","event","_c","_b","_e","_d","confirmation","_g","_f","_i","_h","err","_k","_j","stop","reset","respondToConfirmation","correlationId","approved","responseText","useEffect","ConfirmCard","onApprove","onDeny","isPending","jsxs","ReviewCard","AmodalChat","placeholder","renderText","renderToolCall","renderConfirmation","className","hookOptions","messages","isStreaming","input","setInput","useState","messagesEndRef","handleSubmit","e","trimmed","rootClass","msg","i","call","conf","handleApprove","handleDeny","AmodalAction","prompt","label","context","onComplete","onError","triggered","setTriggered","trigger","lastAssistant","m","pendingConfirmations","c","index","useAmodalBrief","autoFetch","brief","setBrief","isLoading","setIsLoading","error","setError","abortRef","mountedRef","fetchBrief","toolCalls","t","refresh","useAmodalInsight","status","setStatus","summary","setSummary","details","setDetails","fetchInsight","splitIndex","useAmodalTask","taskId","autoStream","progress","setProgress","result","setResult","events","setEvents","startedRef","start","prev","startRef","useAmodalQuery","data","setData","fetchQuery","refetch","useStore","storeName","key","refreshInterval","document","setDocument","history","setHistory","fetchDocument","timer","useStoreList","filter","sort","limit","documents","setDocuments","total","setTotal","hasMore","setHasMore","filterKey","fetchList","d","useSkillAction","skillName","loading","setLoading","params","NavigateContext","useNavigate","navigateFn","noopNavigate","_pageName","_params"],"mappings":"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"}
|