@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.
@@ -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,CAkMjF"}
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
- ), o = B(
12
+ ), n = B(
13
13
  () => ({ client: e, runtimeUrl: s }),
14
14
  [e, s]
15
15
  );
16
- return /* @__PURE__ */ v(j.Provider, { value: o, children: t });
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 o = [...e.contentBlocks], a = o[o.length - 1];
76
- a && a.type === "text" ? o[o.length - 1] = { type: "text", text: a.text + r.content } : o.push({ type: "text", text: r.content }), t[t.length - 1] = { ...e, text: e.text + r.content, contentBlocks: o };
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], o = {
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, o], c = [...e.contentBlocks], u = c[c.length - 1];
89
- u && u.type === "tool_calls" ? c[c.length - 1] = { type: "tool_calls", calls: [...u.calls, o] } : c.push({ type: "tool_calls", calls: [o] }), t[t.length - 1] = { ...e, toolCalls: a, contentBlocks: c };
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, o]
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 o = s.activeToolCalls.filter(
112
+ const n = s.activeToolCalls.filter(
113
113
  (a) => a.toolId !== r.toolId
114
114
  );
115
- return { ...s, messages: t, activeToolCalls: o };
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 o = (u) => u.toolId === r.parentToolId ? { ...u, subagentEvents: [...u.subagentEvents ?? [], r.event] } : u, a = e.toolCalls.map(o), c = e.contentBlocks.map(
121
- (u) => u.type === "tool_calls" ? { ...u, calls: u.calls.map(o) } : u
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 o = {
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, o]
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 o = {
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, o]
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 o = e.confirmations.map(
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: o, contentBlocks: a };
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 o = 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: o };
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), o = N((s == null ? void 0 : s.initialSessionId) ?? null), a = N(null), c = N(s);
190
- c.current = s, o.current = t.sessionId ?? o.current;
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 n, d, f, l, b, T, x, C, M, D, O;
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: o.current ?? void 0,
202
- context: (n = c.current) == null ? void 0 : n.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: o,
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
- (n) => {
419
- n.preventDefault();
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", o].filter(Boolean).join(" ");
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((n) => {
428
- switch (n.type) {
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: n.text }, n.id);
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: n.contentBlocks.map((d, f) => {
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
- }) }, n.id);
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: n.message }, n.id);
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: (n) => _(n.target.value),
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: o }) {
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 n = u[u.length - 1];
495
- n && n.type === "assistant_text" ? e == null || e(n.text) : n && n.type === "error" && (o == null || o(n.message));
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((n) => n.type === "assistant_text"), m = h && h.type === "assistant_text" ? h.confirmations.filter((n) => n.status === "pending") : [], p = (n, d) => {
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
- n.correlationId && E(n.correlationId, !0);
501
+ o.correlationId && E(o.correlationId, !0);
502
502
  }, l = () => {
503
- n.correlationId && E(n.correlationId, !1);
503
+ o.correlationId && E(o.correlationId, !1);
504
504
  };
505
- return n.escalated || n.params && Object.keys(n.params).length > 0 ? /* @__PURE__ */ v(
505
+ return o.escalated || o.params && Object.keys(o.params).length > 0 ? /* @__PURE__ */ v(
506
506
  J,
507
507
  {
508
- confirmation: n,
508
+ confirmation: o,
509
509
  onApprove: f,
510
510
  onDeny: l
511
511
  },
512
- n.correlationId ?? String(d)
512
+ o.correlationId ?? String(d)
513
513
  ) : /* @__PURE__ */ v(
514
514
  H,
515
515
  {
516
- confirmation: n,
516
+ confirmation: o,
517
517
  onApprove: f,
518
518
  onDeny: l
519
519
  },
520
- n.correlationId ?? String(d)
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: o } = R(), [a, c] = y(null), [u, i] = y(!1), [S, E] = y(null), _ = N(null), h = N(!1), m = A(async () => {
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 n = new AbortController();
546
- _.current = n, i(!0), E(null);
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 o.chatStream(r, { context: t, signal: n.signal }))
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
- }, [o, r, t]), p = A(() => {
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: o } = R(), [a, c] = y("idle"), [u, i] = y(""), [S, E] = y(""), [_, h] = y(null), m = N(null), p = N(!1), n = A(async () => {
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 o.chatStream(r, { context: t, signal: f.signal }))
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
- }, [o, r, t]), d = A(() => {
620
- n();
621
- }, [n]);
622
- return w(() => (e && !p.current && (p.current = !0, n()), () => {
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, n]), { status: a, summary: u, details: S, isLoading: a === "loading", error: _, refresh: d };
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(), [o, a] = y("idle"), [c, u] = y(""), [i, S] = y(""), [E, _] = y([]), [h, m] = y(null), p = N(null), n = N(!1), d = A(async () => {
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
- o === "running" && a("completed");
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, o]), f = A(() => {
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 && !n.current && (n.current = !0, l.current()), () => {
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: o,
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: o } = R(), [a, c] = y(null), [u, i] = y(!1), [S, E] = y(null), _ = N(null), h = N(!1), m = A(async () => {
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 n = new AbortController();
688
- _.current = n, i(!0), E(null);
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 o.chatStream(r, { context: t, signal: n.signal }))
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
- }, [o, r, t]), p = A(() => {
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: o } = R(), [a, c] = y(null), [u, i] = y([]), [S, E] = y(!0), [_, h] = y(null), m = N(null), p = A(async () => {
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 o.getStoreDocument(s, t, d.signal);
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
- }, [o, s, t]), n = A(() => {
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: n
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: o = 20, refreshInterval: a = 3e4 } = r, { client: c } = R(), [u, i] = y([]), [S, E] = y(0), [_, h] = y(!1), [m, p] = y(!0), [n, d] = y(null), f = N(null), l = t ? JSON.stringify(t) : "", b = A(async () => {
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: o,
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, o]), T = A(() => {
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: n,
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, o] = y(!1), [a, c] = y(null), [u, i] = y(null), S = N(null);
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, o(!0), c(null), i(null);
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 n of t.chatStream(m, { signal: h.signal }))
815
- switch (n.type) {
814
+ for await (const o of t.chatStream(m, { signal: h.signal }))
815
+ switch (o.type) {
816
816
  case "text_delta":
817
- p += n.content;
817
+ p += o.content;
818
818
  break;
819
819
  case "error":
820
- i(n.message);
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
- o(!1), S.current = null;
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amodalai/react",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "React bindings for Amodal agent runtime",
5
5
  "license": "MIT",
6
6
  "repository": {