@agent-native/core 0.20.9 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/action.d.ts +61 -0
  2. package/dist/action.d.ts.map +1 -1
  3. package/dist/action.js +14 -0
  4. package/dist/action.js.map +1 -1
  5. package/dist/agent/production-agent.d.ts +4 -0
  6. package/dist/agent/production-agent.d.ts.map +1 -1
  7. package/dist/agent/production-agent.js +19 -7
  8. package/dist/agent/production-agent.js.map +1 -1
  9. package/dist/agent/types.d.ts +2 -0
  10. package/dist/agent/types.d.ts.map +1 -1
  11. package/dist/agent/types.js.map +1 -1
  12. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  13. package/dist/cli/code-agent-executor.js +1 -0
  14. package/dist/cli/code-agent-executor.js.map +1 -1
  15. package/dist/cli/connect.d.ts +18 -3
  16. package/dist/cli/connect.d.ts.map +1 -1
  17. package/dist/cli/connect.js +619 -19
  18. package/dist/cli/connect.js.map +1 -1
  19. package/dist/client/AgentPanel.d.ts.map +1 -1
  20. package/dist/client/AgentPanel.js +6 -2
  21. package/dist/client/AgentPanel.js.map +1 -1
  22. package/dist/client/AssistantChat.d.ts.map +1 -1
  23. package/dist/client/AssistantChat.js +13 -6
  24. package/dist/client/AssistantChat.js.map +1 -1
  25. package/dist/client/NewWorkspaceAppFlow.js +1 -1
  26. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  27. package/dist/client/agent-chat.d.ts.map +1 -1
  28. package/dist/client/agent-chat.js +13 -8
  29. package/dist/client/agent-chat.js.map +1 -1
  30. package/dist/client/agent-sidebar-state.d.ts +2 -0
  31. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  32. package/dist/client/agent-sidebar-state.js +40 -0
  33. package/dist/client/agent-sidebar-state.js.map +1 -1
  34. package/dist/client/code-agent-chat-adapter.js +1 -0
  35. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  36. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  37. package/dist/client/conversation/AgentConversation.js +3 -2
  38. package/dist/client/conversation/AgentConversation.js.map +1 -1
  39. package/dist/client/conversation/code-agent-transcript.js +1 -0
  40. package/dist/client/conversation/code-agent-transcript.js.map +1 -1
  41. package/dist/client/conversation/types.d.ts +2 -0
  42. package/dist/client/conversation/types.d.ts.map +1 -1
  43. package/dist/client/conversation/types.js.map +1 -1
  44. package/dist/client/index.d.ts +1 -0
  45. package/dist/client/index.d.ts.map +1 -1
  46. package/dist/client/index.js +1 -0
  47. package/dist/client/index.js.map +1 -1
  48. package/dist/client/mcp-apps/McpAppRenderer.d.ts +10 -0
  49. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -0
  50. package/dist/client/mcp-apps/McpAppRenderer.js +301 -0
  51. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -0
  52. package/dist/client/sse-event-processor.d.ts +3 -0
  53. package/dist/client/sse-event-processor.d.ts.map +1 -1
  54. package/dist/client/sse-event-processor.js +2 -0
  55. package/dist/client/sse-event-processor.js.map +1 -1
  56. package/dist/client/use-db-sync.d.ts +5 -5
  57. package/dist/client/use-db-sync.d.ts.map +1 -1
  58. package/dist/client/use-db-sync.js +15 -5
  59. package/dist/client/use-db-sync.js.map +1 -1
  60. package/dist/client/use-db-sync.spec.d.ts +2 -0
  61. package/dist/client/use-db-sync.spec.d.ts.map +1 -0
  62. package/dist/client/use-db-sync.spec.js +80 -0
  63. package/dist/client/use-db-sync.spec.js.map +1 -0
  64. package/dist/code-agents/transcript-normalizer.d.ts +2 -0
  65. package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
  66. package/dist/code-agents/transcript-normalizer.js +17 -0
  67. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  68. package/dist/db/client.d.ts.map +1 -1
  69. package/dist/db/client.js +29 -21
  70. package/dist/db/client.js.map +1 -1
  71. package/dist/extensions/actions.d.ts.map +1 -1
  72. package/dist/extensions/actions.js +62 -3
  73. package/dist/extensions/actions.js.map +1 -1
  74. package/dist/extensions/content-patch.d.ts +71 -0
  75. package/dist/extensions/content-patch.d.ts.map +1 -0
  76. package/dist/extensions/content-patch.js +251 -0
  77. package/dist/extensions/content-patch.js.map +1 -0
  78. package/dist/extensions/routes.js +6 -1
  79. package/dist/extensions/routes.js.map +1 -1
  80. package/dist/extensions/store.d.ts +4 -4
  81. package/dist/extensions/store.d.ts.map +1 -1
  82. package/dist/extensions/store.js +14 -18
  83. package/dist/extensions/store.js.map +1 -1
  84. package/dist/index.browser.d.ts +1 -1
  85. package/dist/index.browser.d.ts.map +1 -1
  86. package/dist/index.browser.js +1 -1
  87. package/dist/index.browser.js.map +1 -1
  88. package/dist/index.d.ts +1 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/mcp/build-server.d.ts +3 -0
  93. package/dist/mcp/build-server.d.ts.map +1 -1
  94. package/dist/mcp/build-server.js +207 -8
  95. package/dist/mcp/build-server.js.map +1 -1
  96. package/dist/mcp/oauth-route.d.ts +22 -0
  97. package/dist/mcp/oauth-route.d.ts.map +1 -0
  98. package/dist/mcp/oauth-route.js +618 -0
  99. package/dist/mcp/oauth-route.js.map +1 -0
  100. package/dist/mcp/oauth-store.d.ts +89 -0
  101. package/dist/mcp/oauth-store.d.ts.map +1 -0
  102. package/dist/mcp/oauth-store.js +391 -0
  103. package/dist/mcp/oauth-store.js.map +1 -0
  104. package/dist/mcp/oauth-token.d.ts +28 -0
  105. package/dist/mcp/oauth-token.d.ts.map +1 -0
  106. package/dist/mcp/oauth-token.js +83 -0
  107. package/dist/mcp/oauth-token.js.map +1 -0
  108. package/dist/mcp/server.d.ts.map +1 -1
  109. package/dist/mcp/server.js +5 -2
  110. package/dist/mcp/server.js.map +1 -1
  111. package/dist/mcp/stdio.d.ts +2 -2
  112. package/dist/mcp/stdio.d.ts.map +1 -1
  113. package/dist/mcp/stdio.js +26 -8
  114. package/dist/mcp/stdio.js.map +1 -1
  115. package/dist/mcp-client/app-result.d.ts +40 -0
  116. package/dist/mcp-client/app-result.d.ts.map +1 -0
  117. package/dist/mcp-client/app-result.js +19 -0
  118. package/dist/mcp-client/app-result.js.map +1 -0
  119. package/dist/mcp-client/index.d.ts +5 -2
  120. package/dist/mcp-client/index.d.ts.map +1 -1
  121. package/dist/mcp-client/index.js +201 -25
  122. package/dist/mcp-client/index.js.map +1 -1
  123. package/dist/mcp-client/manager.d.ts +16 -0
  124. package/dist/mcp-client/manager.d.ts.map +1 -1
  125. package/dist/mcp-client/manager.js +58 -1
  126. package/dist/mcp-client/manager.js.map +1 -1
  127. package/dist/mcp-client/routes.d.ts +4 -1
  128. package/dist/mcp-client/routes.d.ts.map +1 -1
  129. package/dist/mcp-client/routes.js +159 -0
  130. package/dist/mcp-client/routes.js.map +1 -1
  131. package/dist/scripts/dev/shell.d.ts.map +1 -1
  132. package/dist/scripts/dev/shell.js +24 -1
  133. package/dist/scripts/dev/shell.js.map +1 -1
  134. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  135. package/dist/server/agent-chat-plugin.js +3 -2
  136. package/dist/server/agent-chat-plugin.js.map +1 -1
  137. package/dist/server/auth.d.ts.map +1 -1
  138. package/dist/server/auth.js +14 -8
  139. package/dist/server/auth.js.map +1 -1
  140. package/dist/server/builder-browser.d.ts +6 -0
  141. package/dist/server/builder-browser.d.ts.map +1 -1
  142. package/dist/server/builder-browser.js +15 -0
  143. package/dist/server/builder-browser.js.map +1 -1
  144. package/dist/server/core-routes-plugin.d.ts +5 -4
  145. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  146. package/dist/server/core-routes-plugin.js +17 -2
  147. package/dist/server/core-routes-plugin.js.map +1 -1
  148. package/dist/styles/agent-conversation.css +53 -0
  149. package/dist/templates/default/.agents/skills/actions/SKILL.md +193 -72
  150. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +88 -38
  151. package/dist/templates/default/AGENTS.md +3 -3
  152. package/dist/templates/default/actions/hello.ts +13 -20
  153. package/dist/templates/default/actions/navigate.ts +19 -51
  154. package/dist/templates/default/actions/view-screen.ts +16 -33
  155. package/dist/templates/default/app/hooks/use-navigation-state.ts +13 -3
  156. package/dist/templates/default/app/lib/tab-id.ts +1 -0
  157. package/dist/templates/default/app/root.tsx +2 -1
  158. package/dist/templates/default/app/routes/_index.tsx +11 -0
  159. package/dist/templates/default/package.json +2 -1
  160. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +9 -1
  161. package/dist/templates/workspace-core/AGENTS.md +8 -0
  162. package/dist/templates/workspace-root/AGENTS.md +7 -0
  163. package/dist/vite/client.d.ts.map +1 -1
  164. package/dist/vite/client.js +2 -2
  165. package/dist/vite/client.js.map +1 -1
  166. package/docs/content/actions.md +26 -3
  167. package/docs/content/authentication.md +16 -1
  168. package/docs/content/client.md +11 -8
  169. package/docs/content/context-awareness.md +2 -3
  170. package/docs/content/creating-templates.md +2 -2
  171. package/docs/content/external-agents.md +106 -19
  172. package/docs/content/faq.md +2 -2
  173. package/docs/content/key-concepts.md +31 -23
  174. package/docs/content/mcp-clients.md +1 -1
  175. package/docs/content/mcp-protocol.md +65 -27
  176. package/docs/content/template-starter.md +3 -3
  177. package/docs/content/what-is-agent-native.md +4 -2
  178. package/package.json +3 -1
  179. package/src/templates/default/.agents/skills/actions/SKILL.md +193 -72
  180. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +88 -38
  181. package/src/templates/default/AGENTS.md +3 -3
  182. package/src/templates/default/actions/hello.ts +13 -20
  183. package/src/templates/default/actions/navigate.ts +19 -51
  184. package/src/templates/default/actions/view-screen.ts +16 -33
  185. package/src/templates/default/app/hooks/use-navigation-state.ts +13 -3
  186. package/src/templates/default/app/lib/tab-id.ts +1 -0
  187. package/src/templates/default/app/root.tsx +2 -1
  188. package/src/templates/default/app/routes/_index.tsx +11 -0
  189. package/src/templates/default/package.json +2 -1
  190. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +9 -1
  191. package/src/templates/workspace-core/AGENTS.md +8 -0
  192. package/src/templates/workspace-root/AGENTS.md +7 -0
  193. package/dist/templates/default/server/routes/api/hello.get.ts +0 -5
  194. package/dist/templates/default/shared/api.ts +0 -6
  195. package/src/templates/default/server/routes/api/hello.get.ts +0 -5
  196. package/src/templates/default/shared/api.ts +0 -6
@@ -12,11 +12,11 @@ interface QueryClient {
12
12
  * SSE is the fast path; polling is the safety net.
13
13
  *
14
14
  * @param options.queryClient - The react-query QueryClient instance
15
- * @param options.queryKeys - **Deprecated and ignored.** The hook now
16
- * invalidates every active query on any non-own change event, so templates
17
- * no longer need to enumerate their keys. Kept in the type signature for
18
- * backward compatibility — existing call sites that still pass this option
19
- * keep working but the value has no effect.
15
+ * @param options.queryKeys - **Deprecated and ignored.** The hook uses
16
+ * framework-owned fixed prefixes plus per-source change counters instead of
17
+ * caller-supplied key lists. Kept in the type signature for backward
18
+ * compatibility — existing call sites that still pass this option keep
19
+ * working but the value has no effect.
20
20
  * @param options.pollUrl - Poll endpoint URL. Default: "/_agent-native/poll"
21
21
  * @param options.sseUrl - SSE endpoint URL. Default: "/_agent-native/events".
22
22
  * Pass false to disable SSE and use polling only.
@@ -1 +1 @@
1
- {"version":3,"file":"use-db-sync.d.ts","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACzD;AAyFD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CACvB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,IAAI,CA4NN;AAED,wCAAwC;AACxC,eAAO,MAAM,cAAc,kBAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,GACL,MAAM,CAsJR"}
1
+ {"version":3,"file":"use-db-sync.d.ts","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACzD;AAyFD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CACvB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,IAAI,CAuON;AAED,wCAAwC;AACxC,eAAO,MAAM,cAAc,kBAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,GACL,MAAM,CAsJR"}
@@ -63,11 +63,11 @@ async function fetchPollJson(pollUrl, since, interval) {
63
63
  * SSE is the fast path; polling is the safety net.
64
64
  *
65
65
  * @param options.queryClient - The react-query QueryClient instance
66
- * @param options.queryKeys - **Deprecated and ignored.** The hook now
67
- * invalidates every active query on any non-own change event, so templates
68
- * no longer need to enumerate their keys. Kept in the type signature for
69
- * backward compatibility — existing call sites that still pass this option
70
- * keep working but the value has no effect.
66
+ * @param options.queryKeys - **Deprecated and ignored.** The hook uses
67
+ * framework-owned fixed prefixes plus per-source change counters instead of
68
+ * caller-supplied key lists. Kept in the type signature for backward
69
+ * compatibility — existing call sites that still pass this option keep
70
+ * working but the value has no effect.
71
71
  * @param options.pollUrl - Poll endpoint URL. Default: "/_agent-native/poll"
72
72
  * @param options.sseUrl - SSE endpoint URL. Default: "/_agent-native/events".
73
73
  * Pass false to disable SSE and use polling only.
@@ -126,6 +126,16 @@ export function useDbSync(options = {}) {
126
126
  bumpChangeVersion(src, ver);
127
127
  }
128
128
  if (relevant.length > 0 && queryClient) {
129
+ const hasActionEvent = relevant.some((evt) => evt.source === "action");
130
+ if (hasActionEvent) {
131
+ // Custom apps frequently start with raw `useQuery` calls before
132
+ // graduating to `useActionQuery` or source-versioned query keys.
133
+ // A successful mutating action is the core "agent changed app data"
134
+ // signal, so refresh active queries broadly as a compatibility
135
+ // safety net. Other event sources stay targeted to avoid request
136
+ // storms from noisy domain-specific writes.
137
+ queryClient.invalidateQueries();
138
+ }
129
139
  // Framework-level invalidate: a small, fixed list of query-key
130
140
  // prefixes the framework's own hooks/components use (action results,
131
141
  // extension state, application-state, the agent's `set-url` channel,
@@ -1 +1 @@
1
- {"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\n\ninterface QueryClient {\n invalidateQueries(opts?: { queryKey?: string[] }): void;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\nconst SSE_FALLBACK_INTERVAL_MS = 15_000;\n\ntype SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction eventVersion(event: SyncEvent): number {\n return typeof event.version === \"number\" ? event.version : 0;\n}\n\nfunction hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n try {\n const res = await fetch(\n `${pollUrl}?since=${since}`,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook now\n * invalidates every active query on any non-own change event, so templates\n * no longer need to enumerate their keys. Kept in the type signature for\n * backward compatibility — existing call sites that still pass this option\n * keep working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 15000\n * @param options.pauseWhenHidden - Pause polling while the tab is hidden.\n * Default: true\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n\n useEffect(() => {\n // Universal demo-mode redaction for the UI. Idempotent + browser-only +\n // a no-op until demo mode is on. Lives here because every template root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureDemoModeFetchInterceptor();\n\n let versionRef = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n let inFlight = false;\n let eventSource: EventSource | null = null;\n let sseConnected = false;\n\n function schedulePoll() {\n if (stopped) return;\n if (pauseWhenHidden && isDocumentHidden()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(\n () => {\n timer = null;\n void poll();\n },\n sseConnected ? fallbackInterval : interval,\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const relevant = ignore\n ? events.filter((e) => e.requestSource !== ignore)\n : events;\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) bumpChangeVersion(src, ver);\n }\n\n if (relevant.length > 0 && queryClient) {\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n queryClient.invalidateQueries({ queryKey: [\"action\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\"] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension-slots\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-available\"] });\n queryClient.invalidateQueries({ queryKey: [\"tool\"] });\n queryClient.invalidateQueries({ queryKey: [\"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"app-state\"] });\n if (hasAppStateEvent(relevant, \"navigate\")) {\n queryClient.invalidateQueries({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(relevant, \"show-questions\")) {\n queryClient.invalidateQueries({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(relevant, \"__set_url__\")) {\n queryClient.invalidateQueries({ queryKey: [\"__set_url__\"] });\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function applyEvents(events: SyncEvent[], version?: number) {\n const freshEvents = events.filter((event) => {\n const version = eventVersion(event);\n return version === 0 || version > versionRef;\n });\n\n if (freshEvents.length > 0) {\n invalidateForEvents(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) => Math.max(max, eventVersion(event)),\n 0,\n );\n versionRef = Math.max(versionRef, version ?? 0, maxEventVersion);\n }\n\n function closeEvents() {\n if (!eventSource) return;\n eventSource.close();\n eventSource = null;\n sseConnected = false;\n }\n\n function connectEvents() {\n if (\n stopped ||\n !sseUrl ||\n eventSource ||\n typeof EventSource === \"undefined\" ||\n (pauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(sseUrl);\n eventSource = source;\n source.onopen = () => {\n sseConnected = true;\n schedulePoll();\n };\n source.onerror = () => {\n sseConnected = false;\n schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n applyEvents(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n }\n\n async function poll() {\n if (stopped || inFlight) return;\n inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n pollUrl,\n versionRef,\n interval,\n );\n applyEvents(data.events ?? [], data.version);\n } catch {\n // Network error — will retry on next interval\n } finally {\n inFlight = false;\n schedulePoll();\n }\n }\n\n function pollNow() {\n if (pauseWhenHidden && isDocumentHidden()) {\n return;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n connectEvents();\n void poll();\n }\n\n function handleVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n connectEvents();\n pollNow();\n } else if (pauseWhenHidden) {\n closeEvents();\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n }\n\n // Initial poll immediately when visible. Hidden tabs catch up on focus.\n if (!pauseWhenHidden || !isDocumentHidden()) {\n connectEvents();\n void poll();\n }\n window.addEventListener(\"focus\", pollNow);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n stopped = true;\n closeEvents();\n if (timer) clearTimeout(timer);\n window.removeEventListener(\"focus\", pollNow);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n let versionRef = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n let inFlight = false;\n let eventSource: EventSource | null = null;\n let sseConnected = false;\n\n function schedulePoll() {\n if (stopped) return;\n if (pauseWhenHidden && isDocumentHidden()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(\n () => {\n timer = null;\n void poll();\n },\n sseConnected ? fallbackInterval : interval,\n );\n }\n\n function applyEvents(events: SyncEvent[], version?: number) {\n const freshEvents = events.filter((event) => {\n const version = eventVersion(event);\n return version === 0 || version > versionRef;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) => Math.max(max, eventVersion(event)),\n 0,\n );\n versionRef = Math.max(versionRef, version ?? 0, maxEventVersion);\n }\n\n function closeEvents() {\n if (!eventSource) return;\n eventSource.close();\n eventSource = null;\n sseConnected = false;\n }\n\n function connectEvents() {\n if (\n stopped ||\n !sseUrl ||\n eventSource ||\n typeof EventSource === \"undefined\" ||\n (pauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(sseUrl);\n eventSource = source;\n source.onopen = () => {\n sseConnected = true;\n schedulePoll();\n };\n source.onerror = () => {\n sseConnected = false;\n schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n applyEvents(events, version);\n } catch {\n // Polling will catch missed screen-refresh events.\n }\n };\n }\n\n async function poll() {\n if (stopped || inFlight) return;\n inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n pollUrl,\n versionRef,\n interval,\n );\n applyEvents(data.events ?? [], data.version);\n } catch {\n // Network error — retry on next interval.\n } finally {\n inFlight = false;\n schedulePoll();\n }\n }\n\n function pollNow() {\n if (pauseWhenHidden && isDocumentHidden()) {\n return;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n connectEvents();\n void poll();\n }\n\n function handleVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n connectEvents();\n pollNow();\n } else if (pauseWhenHidden) {\n closeEvents();\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n }\n\n if (!pauseWhenHidden || !isDocumentHidden()) {\n connectEvents();\n void poll();\n }\n window.addEventListener(\"focus\", pollNow);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n stopped = true;\n closeEvents();\n if (timer) clearTimeout(timer);\n window.removeEventListener(\"focus\", pollNow);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [pollUrl, sseUrl, interval, fallbackInterval, pauseWhenHidden]);\n\n return key;\n}\n"]}
1
+ {"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\n\ninterface QueryClient {\n invalidateQueries(opts?: { queryKey?: string[] }): void;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\nconst SSE_FALLBACK_INTERVAL_MS = 15_000;\n\ntype SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction eventVersion(event: SyncEvent): number {\n return typeof event.version === \"number\" ? event.version : 0;\n}\n\nfunction hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n try {\n const res = await fetch(\n `${pollUrl}?since=${since}`,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook uses\n * framework-owned fixed prefixes plus per-source change counters instead of\n * caller-supplied key lists. Kept in the type signature for backward\n * compatibility — existing call sites that still pass this option keep\n * working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 15000\n * @param options.pauseWhenHidden - Pause polling while the tab is hidden.\n * Default: true\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n\n useEffect(() => {\n // Universal demo-mode redaction for the UI. Idempotent + browser-only +\n // a no-op until demo mode is on. Lives here because every template root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureDemoModeFetchInterceptor();\n\n let versionRef = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n let inFlight = false;\n let eventSource: EventSource | null = null;\n let sseConnected = false;\n\n function schedulePoll() {\n if (stopped) return;\n if (pauseWhenHidden && isDocumentHidden()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(\n () => {\n timer = null;\n void poll();\n },\n sseConnected ? fallbackInterval : interval,\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const relevant = ignore\n ? events.filter((e) => e.requestSource !== ignore)\n : events;\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) bumpChangeVersion(src, ver);\n }\n\n if (relevant.length > 0 && queryClient) {\n const hasActionEvent = relevant.some((evt) => evt.source === \"action\");\n if (hasActionEvent) {\n // Custom apps frequently start with raw `useQuery` calls before\n // graduating to `useActionQuery` or source-versioned query keys.\n // A successful mutating action is the core \"agent changed app data\"\n // signal, so refresh active queries broadly as a compatibility\n // safety net. Other event sources stay targeted to avoid request\n // storms from noisy domain-specific writes.\n queryClient.invalidateQueries();\n }\n\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n queryClient.invalidateQueries({ queryKey: [\"action\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\"] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension-slots\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-available\"] });\n queryClient.invalidateQueries({ queryKey: [\"tool\"] });\n queryClient.invalidateQueries({ queryKey: [\"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"app-state\"] });\n if (hasAppStateEvent(relevant, \"navigate\")) {\n queryClient.invalidateQueries({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(relevant, \"show-questions\")) {\n queryClient.invalidateQueries({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(relevant, \"__set_url__\")) {\n queryClient.invalidateQueries({ queryKey: [\"__set_url__\"] });\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function applyEvents(events: SyncEvent[], version?: number) {\n const freshEvents = events.filter((event) => {\n const version = eventVersion(event);\n return version === 0 || version > versionRef;\n });\n\n if (freshEvents.length > 0) {\n invalidateForEvents(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) => Math.max(max, eventVersion(event)),\n 0,\n );\n versionRef = Math.max(versionRef, version ?? 0, maxEventVersion);\n }\n\n function closeEvents() {\n if (!eventSource) return;\n eventSource.close();\n eventSource = null;\n sseConnected = false;\n }\n\n function connectEvents() {\n if (\n stopped ||\n !sseUrl ||\n eventSource ||\n typeof EventSource === \"undefined\" ||\n (pauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(sseUrl);\n eventSource = source;\n source.onopen = () => {\n sseConnected = true;\n schedulePoll();\n };\n source.onerror = () => {\n sseConnected = false;\n schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n applyEvents(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n }\n\n async function poll() {\n if (stopped || inFlight) return;\n inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n pollUrl,\n versionRef,\n interval,\n );\n applyEvents(data.events ?? [], data.version);\n } catch {\n // Network error — will retry on next interval\n } finally {\n inFlight = false;\n schedulePoll();\n }\n }\n\n function pollNow() {\n if (pauseWhenHidden && isDocumentHidden()) {\n return;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n connectEvents();\n void poll();\n }\n\n function handleVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n connectEvents();\n pollNow();\n } else if (pauseWhenHidden) {\n closeEvents();\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n }\n\n // Initial poll immediately when visible. Hidden tabs catch up on focus.\n if (!pauseWhenHidden || !isDocumentHidden()) {\n connectEvents();\n void poll();\n }\n window.addEventListener(\"focus\", pollNow);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n stopped = true;\n closeEvents();\n if (timer) clearTimeout(timer);\n window.removeEventListener(\"focus\", pollNow);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = true,\n } = options;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n let versionRef = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n let inFlight = false;\n let eventSource: EventSource | null = null;\n let sseConnected = false;\n\n function schedulePoll() {\n if (stopped) return;\n if (pauseWhenHidden && isDocumentHidden()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(\n () => {\n timer = null;\n void poll();\n },\n sseConnected ? fallbackInterval : interval,\n );\n }\n\n function applyEvents(events: SyncEvent[], version?: number) {\n const freshEvents = events.filter((event) => {\n const version = eventVersion(event);\n return version === 0 || version > versionRef;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) => Math.max(max, eventVersion(event)),\n 0,\n );\n versionRef = Math.max(versionRef, version ?? 0, maxEventVersion);\n }\n\n function closeEvents() {\n if (!eventSource) return;\n eventSource.close();\n eventSource = null;\n sseConnected = false;\n }\n\n function connectEvents() {\n if (\n stopped ||\n !sseUrl ||\n eventSource ||\n typeof EventSource === \"undefined\" ||\n (pauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n const source = new EventSource(sseUrl);\n eventSource = source;\n source.onopen = () => {\n sseConnected = true;\n schedulePoll();\n };\n source.onerror = () => {\n sseConnected = false;\n schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n applyEvents(events, version);\n } catch {\n // Polling will catch missed screen-refresh events.\n }\n };\n }\n\n async function poll() {\n if (stopped || inFlight) return;\n inFlight = true;\n try {\n const data = await fetchPollJson<PollResponse>(\n pollUrl,\n versionRef,\n interval,\n );\n applyEvents(data.events ?? [], data.version);\n } catch {\n // Network error — retry on next interval.\n } finally {\n inFlight = false;\n schedulePoll();\n }\n }\n\n function pollNow() {\n if (pauseWhenHidden && isDocumentHidden()) {\n return;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n connectEvents();\n void poll();\n }\n\n function handleVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n connectEvents();\n pollNow();\n } else if (pauseWhenHidden) {\n closeEvents();\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n }\n\n if (!pauseWhenHidden || !isDocumentHidden()) {\n connectEvents();\n void poll();\n }\n window.addEventListener(\"focus\", pollNow);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n stopped = true;\n closeEvents();\n if (timer) clearTimeout(timer);\n window.removeEventListener(\"focus\", pollNow);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [pollUrl, sseUrl, interval, fallbackInterval, pauseWhenHidden]);\n\n return key;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-db-sync.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-db-sync.spec.d.ts","sourceRoot":"","sources":["../../src/client/use-db-sync.spec.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { act } from "react";
4
+ import { createRoot } from "react-dom/client";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+ import { useDbSync } from "./use-db-sync.js";
7
+ class QueryClientProbe {
8
+ calls = [];
9
+ invalidateQueries(opts) {
10
+ this.calls.push(opts);
11
+ }
12
+ }
13
+ function SyncProbe({ queryClient }) {
14
+ useDbSync({
15
+ queryClient,
16
+ sseUrl: false,
17
+ interval: 50,
18
+ pauseWhenHidden: false,
19
+ });
20
+ return null;
21
+ }
22
+ async function renderWithEvent(event) {
23
+ const queryClient = new QueryClientProbe();
24
+ const fetchMock = vi.fn(async () => new Response(JSON.stringify({ version: event.version ?? 1, events: [event] })));
25
+ vi.stubGlobal("fetch", fetchMock);
26
+ const container = document.createElement("div");
27
+ document.body.appendChild(container);
28
+ const root = createRoot(container);
29
+ await act(async () => {
30
+ root.render(_jsx(SyncProbe, { queryClient: queryClient }));
31
+ await Promise.resolve();
32
+ await Promise.resolve();
33
+ });
34
+ return { container, fetchMock, queryClient, root };
35
+ }
36
+ describe("useDbSync", () => {
37
+ let roots = [];
38
+ let containers = [];
39
+ beforeEach(() => {
40
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
41
+ });
42
+ afterEach(() => {
43
+ for (const root of roots) {
44
+ act(() => root.unmount());
45
+ }
46
+ for (const container of containers) {
47
+ container.remove();
48
+ }
49
+ roots = [];
50
+ containers = [];
51
+ vi.unstubAllGlobals();
52
+ });
53
+ it("broadly invalidates active queries for action events", async () => {
54
+ const result = await renderWithEvent({
55
+ version: 1,
56
+ source: "action",
57
+ type: "change",
58
+ key: "create-project",
59
+ });
60
+ roots.push(result.root);
61
+ containers.push(result.container);
62
+ expect(result.fetchMock).toHaveBeenCalled();
63
+ expect(result.queryClient.calls).toContainEqual(undefined);
64
+ expect(result.queryClient.calls).toContainEqual({ queryKey: ["action"] });
65
+ });
66
+ it("keeps non-action events on targeted framework invalidations", async () => {
67
+ const result = await renderWithEvent({
68
+ version: 1,
69
+ source: "settings",
70
+ type: "change",
71
+ key: "*",
72
+ });
73
+ roots.push(result.root);
74
+ containers.push(result.container);
75
+ expect(result.fetchMock).toHaveBeenCalled();
76
+ expect(result.queryClient.calls).not.toContainEqual(undefined);
77
+ expect(result.queryClient.calls).toContainEqual({ queryKey: ["action"] });
78
+ });
79
+ });
80
+ //# sourceMappingURL=use-db-sync.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-db-sync.spec.js","sourceRoot":"","sources":["../../src/client/use-db-sync.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\n\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { useDbSync } from \"./use-db-sync.js\";\n\nclass QueryClientProbe {\n calls: Array<{ queryKey?: string[] } | undefined> = [];\n\n invalidateQueries(opts?: { queryKey?: string[] }) {\n this.calls.push(opts);\n }\n}\n\nfunction SyncProbe({ queryClient }: { queryClient: QueryClientProbe }) {\n useDbSync({\n queryClient,\n sseUrl: false,\n interval: 50,\n pauseWhenHidden: false,\n });\n return null;\n}\n\nasync function renderWithEvent(event: Record<string, unknown>) {\n const queryClient = new QueryClientProbe();\n const fetchMock = vi.fn(\n async () =>\n new Response(\n JSON.stringify({ version: event.version ?? 1, events: [event] }),\n ),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n const root = createRoot(container);\n\n await act(async () => {\n root.render(<SyncProbe queryClient={queryClient} />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n return { container, fetchMock, queryClient, root };\n}\n\ndescribe(\"useDbSync\", () => {\n let roots: Root[] = [];\n let containers: HTMLDivElement[] = [];\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n });\n\n afterEach(() => {\n for (const root of roots) {\n act(() => root.unmount());\n }\n for (const container of containers) {\n container.remove();\n }\n roots = [];\n containers = [];\n vi.unstubAllGlobals();\n });\n\n it(\"broadly invalidates active queries for action events\", async () => {\n const result = await renderWithEvent({\n version: 1,\n source: \"action\",\n type: \"change\",\n key: \"create-project\",\n });\n roots.push(result.root);\n containers.push(result.container);\n\n expect(result.fetchMock).toHaveBeenCalled();\n expect(result.queryClient.calls).toContainEqual(undefined);\n expect(result.queryClient.calls).toContainEqual({ queryKey: [\"action\"] });\n });\n\n it(\"keeps non-action events on targeted framework invalidations\", async () => {\n const result = await renderWithEvent({\n version: 1,\n source: \"settings\",\n type: \"change\",\n key: \"*\",\n });\n roots.push(result.root);\n containers.push(result.container);\n\n expect(result.fetchMock).toHaveBeenCalled();\n expect(result.queryClient.calls).not.toContainEqual(undefined);\n expect(result.queryClient.calls).toContainEqual({ queryKey: [\"action\"] });\n });\n});\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { CodeAgentTranscriptEvent } from "../cli/code-agent-runs.js";
2
+ import type { AgentMcpAppPayload } from "../mcp-client/app-result.js";
2
3
  export type { CodeAgentTranscriptEvent } from "../cli/code-agent-runs.js";
3
4
  export type NormalizedCodeAgentTranscriptItem = NormalizedCodeAgentUserTurn | NormalizedCodeAgentAssistantTurn | NormalizedCodeAgentToolEvent | NormalizedCodeAgentStatusEvent;
4
5
  export interface NormalizedCodeAgentTranscript {
@@ -33,6 +34,7 @@ export interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscr
33
34
  state: "activity" | "running" | "completed";
34
35
  input?: unknown;
35
36
  result?: unknown;
37
+ mcpApp?: AgentMcpAppPayload;
36
38
  activities: string[];
37
39
  startedAt?: string;
38
40
  completedAt?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-normalizer.d.ts","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,MAAM,iCAAiC,GACzC,2BAA2B,GAC3B,gCAAgC,GAChC,4BAA4B,GAC5B,8BAA8B,CAAC;AAEnC,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,iCAAiC,EAAE,CAAC;IAC3C,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,iCAAiC;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,4BAA6B,SAAQ,iCAAiC;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,wBAAwB,EAAE,GAC1C,6BAA6B,CA2D/B"}
1
+ {"version":3,"file":"transcript-normalizer.d.ts","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,MAAM,iCAAiC,GACzC,2BAA2B,GAC3B,gCAAgC,GAChC,4BAA4B,GAC5B,8BAA8B,CAAC;AAEnC,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,iCAAiC,EAAE,CAAC;IAC3C,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,iCAAiC;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,4BAA6B,SAAQ,iCAAiC;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,wBAAwB,EAAE,GAC1C,6BAA6B,CA2D/B"}
@@ -134,6 +134,9 @@ function appendToolEvent(items, event, toolType, turnIndex) {
134
134
  if (hasMetadataKey(event.metadata, "result")) {
135
135
  item.result = event.metadata?.result;
136
136
  }
137
+ const mcpApp = mcpAppMetadata(event.metadata);
138
+ if (mcpApp)
139
+ item.mcpApp = mcpApp;
137
140
  }
138
141
  function createToolEvent(event, toolType, turnIndex) {
139
142
  const metadata = event.metadata;
@@ -150,6 +153,7 @@ function createToolEvent(event, toolType, turnIndex) {
150
153
  state,
151
154
  input: hasMetadataKey(metadata, "input") ? metadata?.input : undefined,
152
155
  result: hasMetadataKey(metadata, "result") ? metadata?.result : undefined,
156
+ mcpApp: mcpAppMetadata(metadata),
153
157
  activities: toolType === "activity" ? [event.message] : [],
154
158
  startedAt: toolType === "tool_start" ? event.createdAt : undefined,
155
159
  completedAt: toolType === "tool_done" ? event.createdAt : undefined,
@@ -362,4 +366,17 @@ function stringMetadata(metadata, key) {
362
366
  function hasMetadataKey(metadata, key) {
363
367
  return (Boolean(metadata) && Object.prototype.hasOwnProperty.call(metadata, key));
364
368
  }
369
+ function mcpAppMetadata(metadata) {
370
+ const value = metadata?.mcpApp;
371
+ if (!value || typeof value !== "object")
372
+ return undefined;
373
+ const candidate = value;
374
+ if (typeof candidate.serverId !== "string" ||
375
+ typeof candidate.originalToolName !== "string" ||
376
+ typeof candidate.resourceUri !== "string" ||
377
+ !candidate.resourceUri.startsWith("ui://")) {
378
+ return undefined;
379
+ }
380
+ return candidate;
381
+ }
365
382
  //# sourceMappingURL=transcript-normalizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-normalizer.js","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\n\nexport type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\n\nexport type NormalizedCodeAgentTranscriptItem =\n | NormalizedCodeAgentUserTurn\n | NormalizedCodeAgentAssistantTurn\n | NormalizedCodeAgentToolEvent\n | NormalizedCodeAgentStatusEvent;\n\nexport interface NormalizedCodeAgentTranscript {\n items: NormalizedCodeAgentTranscriptItem[];\n rawEvents: CodeAgentTranscriptEvent[];\n hiddenEvents: CodeAgentTranscriptEvent[];\n}\n\nexport interface NormalizedCodeAgentTranscriptBase {\n id: string;\n createdAt: string;\n updatedAt: string;\n eventIds: string[];\n events: CodeAgentTranscriptEvent[];\n turnIndex: number;\n}\n\nexport interface NormalizedCodeAgentUserTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"user\";\n role: \"user\";\n text: string;\n}\n\nexport interface NormalizedCodeAgentAssistantTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"assistant\";\n role: \"assistant\";\n text: string;\n source: \"system\" | \"runner-stdout\";\n suppressedDuplicateEventIds?: string[];\n}\n\nexport interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"tool\";\n tool?: string;\n label: string;\n state: \"activity\" | \"running\" | \"completed\";\n input?: unknown;\n result?: unknown;\n activities: string[];\n startedAt?: string;\n completedAt?: string;\n}\n\nexport interface NormalizedCodeAgentStatusEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"status\";\n level: \"info\" | \"warning\" | \"error\" | \"approval\";\n text: string;\n statusKind: CodeAgentTranscriptEvent[\"kind\"];\n status?: string;\n phase?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport function normalizeCodeAgentTranscript(\n events: readonly CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscript {\n const items: NormalizedCodeAgentTranscriptItem[] = [];\n const hiddenEvents: CodeAgentTranscriptEvent[] = [];\n const eventOrder = new Map(events.map((event, index) => [event.id, index]));\n let turnIndex = -1;\n\n for (const event of events) {\n const currentTurnIndex = Math.max(turnIndex, 0);\n if (event.kind === \"user\") {\n turnIndex = turnIndex < 0 ? (items.length === 0 ? 0 : 1) : turnIndex + 1;\n items.push(createUserTurn(event, turnIndex));\n continue;\n }\n\n const assistantSource = assistantTextSource(event);\n if (assistantSource) {\n const text = assistantTextForEvent(event, assistantSource);\n if (!text) {\n hiddenEvents.push(event);\n continue;\n }\n const previous = items.at(-1);\n if (\n previous?.type === \"assistant\" &&\n previous.source === assistantSource &&\n previous.turnIndex === currentTurnIndex\n ) {\n appendAssistantChunk(previous, event, text);\n } else {\n items.push(\n createAssistantTurn(event, assistantSource, currentTurnIndex, text),\n );\n }\n continue;\n }\n\n const toolType = toolEventType(event);\n if (toolType) {\n appendToolEvent(items, event, toolType, currentTurnIndex);\n continue;\n }\n\n if (shouldShowStatusEvent(event)) {\n items.push(createStatusEvent(event, currentTurnIndex));\n } else {\n hiddenEvents.push(event);\n }\n }\n\n const dedupedItems = suppressDuplicateFinalAssistantText(items, hiddenEvents);\n hiddenEvents.sort(\n (a, b) => (eventOrder.get(a.id) ?? 0) - (eventOrder.get(b.id) ?? 0),\n );\n\n return {\n items: dedupedItems,\n rawEvents: [...events],\n hiddenEvents,\n };\n}\n\nfunction createUserTurn(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentUserTurn {\n return {\n type: \"user\",\n role: \"user\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction createAssistantTurn(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n turnIndex: number,\n text: string,\n): NormalizedCodeAgentAssistantTurn {\n return {\n type: \"assistant\",\n role: \"assistant\",\n id: event.id,\n text,\n source,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendAssistantChunk(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n text: string,\n): void {\n item.text = shouldAppendAssistantChunkExactly(item, event)\n ? `${item.text}${text}`\n : joinAssistantChunks(item.text, text);\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n}\n\nfunction createStatusEvent(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentStatusEvent {\n const metadata = event.metadata;\n return {\n type: \"status\",\n id: event.id,\n text: event.message,\n level: statusEventLevel(event),\n statusKind: event.kind,\n status: stringMetadata(metadata, \"status\"),\n phase: stringMetadata(metadata, \"phase\"),\n metadata,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendToolEvent(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): void {\n const tool = stringMetadata(event.metadata, \"tool\");\n const item = findOpenToolEvent(items, tool, turnIndex);\n\n if (!item) {\n items.push(createToolEvent(event, toolType, turnIndex));\n return;\n }\n\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n\n if (toolType === \"activity\") {\n item.activities.push(event.message);\n if (item.state === \"activity\") item.label = event.message;\n return;\n }\n\n if (toolType === \"tool_start\") {\n const wasActivity = item.state === \"activity\";\n item.state = \"running\";\n item.startedAt = item.startedAt ?? event.createdAt;\n if (hasMetadataKey(event.metadata, \"input\")) {\n item.input = event.metadata?.input;\n }\n if (wasActivity || item.label === item.activities.at(-1)) {\n item.label = event.message;\n }\n return;\n }\n\n item.state = \"completed\";\n item.completedAt = event.createdAt;\n if (hasMetadataKey(event.metadata, \"result\")) {\n item.result = event.metadata?.result;\n }\n}\n\nfunction createToolEvent(\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): NormalizedCodeAgentToolEvent {\n const metadata = event.metadata;\n const state =\n toolType === \"tool_done\"\n ? \"completed\"\n : toolType === \"tool_start\"\n ? \"running\"\n : \"activity\";\n return {\n type: \"tool\",\n id: event.id,\n tool: stringMetadata(metadata, \"tool\"),\n label: event.message,\n state,\n input: hasMetadataKey(metadata, \"input\") ? metadata?.input : undefined,\n result: hasMetadataKey(metadata, \"result\") ? metadata?.result : undefined,\n activities: toolType === \"activity\" ? [event.message] : [],\n startedAt: toolType === \"tool_start\" ? event.createdAt : undefined,\n completedAt: toolType === \"tool_done\" ? event.createdAt : undefined,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction findOpenToolEvent(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n tool: string | undefined,\n turnIndex: number,\n): NormalizedCodeAgentToolEvent | null {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item.type !== \"tool\") continue;\n if (item.turnIndex !== turnIndex) continue;\n if (item.state === \"completed\") continue;\n if (tool && item.tool !== tool) continue;\n if (!tool && item.tool) continue;\n return item;\n }\n return null;\n}\n\nfunction suppressDuplicateFinalAssistantText(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n hiddenEvents: CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscriptItem[] {\n const result: NormalizedCodeAgentTranscriptItem[] = [];\n\n for (const item of items) {\n if (item.type !== \"assistant\" || item.source !== \"system\") {\n result.push(item);\n continue;\n }\n\n const stdoutItems = result.filter(\n (candidate): candidate is NormalizedCodeAgentAssistantTurn =>\n candidate.type === \"assistant\" &&\n candidate.source === \"runner-stdout\" &&\n candidate.turnIndex === item.turnIndex,\n );\n if (\n stdoutItems.length === 0 ||\n !isSameAssistantText(\n stdoutItems.map((candidate) => candidate.text).join(\" \"),\n item.text,\n )\n ) {\n result.push(item);\n continue;\n }\n\n hiddenEvents.push(...item.events);\n const target =\n stdoutItems.length === 1 ? stdoutItems[0] : stdoutItems.at(-1);\n if (!target) continue;\n if (stdoutItems.length === 1) {\n target.text = item.text;\n target.updatedAt = item.updatedAt;\n }\n target.eventIds.push(...item.eventIds);\n target.events.push(...item.events);\n target.suppressedDuplicateEventIds = [\n ...(target.suppressedDuplicateEventIds ?? []),\n ...item.eventIds,\n ];\n }\n\n return result;\n}\n\nfunction shouldShowStatusEvent(event: CodeAgentTranscriptEvent): boolean {\n if (event.kind === \"artifact\" || event.kind === \"note\") return true;\n if (event.kind !== \"status\") return false;\n if (isLowSignalLifecycleEvent(event)) return false;\n return true;\n}\n\nfunction isLowSignalLifecycleEvent(event: CodeAgentTranscriptEvent): boolean {\n const metadata = event.metadata;\n const type = stringMetadata(metadata, \"type\");\n if (type === \"mcp-tools-connected\") return true;\n if (statusEventLevel(event) !== \"info\") return false;\n\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n if (status === \"queued\" || status === \"running\" || status === \"completed\") {\n return true;\n }\n if (\n phase === \"queued\" ||\n phase === \"starting\" ||\n phase === \"executing\" ||\n phase === \"follow-up\" ||\n phase === \"complete\"\n ) {\n return true;\n }\n\n return LOW_SIGNAL_STATUS_MESSAGES.some((pattern) =>\n pattern.test(event.message),\n );\n}\n\nconst LOW_SIGNAL_STATUS_MESSAGES = [\n /^Agent-Native Code run started\\.?$/i,\n /^Agent-Native Code run completed\\.?$/i,\n /^Agent-Native Code process exited\\.?$/i,\n /^Starting local Agent-Native Code execution\\.?$/i,\n /^Remote Agent-Native Code run queued\\.?$/i,\n /^Connected \\d+ MCP tools? for this run\\.?$/i,\n];\n\nfunction statusEventLevel(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentStatusEvent[\"level\"] {\n const metadata = event.metadata;\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n const source = stringMetadata(metadata, \"source\");\n const type = stringMetadata(metadata, \"type\");\n\n if (\n status === \"needs-approval\" ||\n Boolean(metadata?.pendingApproval) ||\n Boolean(metadata?.pendingApprovalId) ||\n Boolean(metadata?.approvalId) ||\n phase?.includes(\"approval\") ||\n /\\bapproval\\b/i.test(event.message)\n ) {\n return \"approval\";\n }\n\n if (\n event.kind === \"status\" &&\n (status === \"errored\" ||\n type === \"error\" ||\n type?.endsWith(\"-error\") ||\n Boolean(metadata?.failed) ||\n typeof metadata?.errorCode === \"string\" ||\n source === \"runner-stderr\")\n ) {\n return \"error\";\n }\n\n if (\n status === \"paused\" ||\n phase === \"missing-credentials\" ||\n phase === \"stopped\" ||\n /\\b(missing|stopped|unavailable|denied)\\b/i.test(event.message)\n ) {\n return \"warning\";\n }\n\n return \"info\";\n}\n\nfunction assistantTextSource(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentAssistantTurn[\"source\"] | null {\n const source = stringMetadata(event.metadata, \"source\");\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"assistant_delta\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"status\" && source === \"runner-stdout\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"system\" || event.metadata?.role === \"assistant\") {\n return \"system\";\n }\n return null;\n}\n\nfunction shouldAppendAssistantChunkExactly(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n): boolean {\n return (\n item.source === \"runner-stdout\" &&\n (isAssistantDeltaEvent(event) || item.events.some(isAssistantDeltaEvent))\n );\n}\n\nfunction isAssistantDeltaEvent(event: CodeAgentTranscriptEvent): boolean {\n return stringMetadata(event.metadata, \"type\") === \"assistant_delta\";\n}\n\nfunction assistantTextForEvent(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n): string {\n if (source === \"runner-stdout\") {\n return stripRunnerDiagnostics(event.message, {\n trim: !isAssistantDeltaEvent(event),\n });\n }\n return event.message;\n}\n\nfunction stripRunnerDiagnostics(\n value: string,\n options: { trim?: boolean } = {},\n): string {\n const stripped = value\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.engineDetect, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.builderEngine, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.sessionStartedBanner, \"\");\n return options.trim === false ? stripped : stripped.trim();\n}\n\nconst RUNNER_DIAGNOSTIC_LINE_PATTERNS = {\n engineDetect: /^\\[engine-detect\\][^\\r\\n]*(?:\\r?\\n|$)/gm,\n builderEngine: /^\\[builder-engine\\]\\s*[←→][^\\r\\n]*(?:\\r?\\n|$)/gm,\n // Strip the \"Agent-Native Code session started.\" banner block that the CLI\n // prints to stdout at the start of every run. It is informational for\n // terminal users but clutters the chat transcript.\n sessionStartedBanner:\n /\\n?Agent-Native Code session started\\.[\\s\\S]*?Streaming output below\\. The transcript is saved with this run\\.\\n?/,\n};\n\nfunction toolEventType(\n event: CodeAgentTranscriptEvent,\n): \"activity\" | \"tool_done\" | \"tool_start\" | null {\n if (event.kind !== \"status\") return null;\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"activity\" || type === \"tool_done\" || type === \"tool_start\") {\n return type;\n }\n return null;\n}\n\nfunction joinAssistantChunks(previous: string, next: string): string {\n if (!previous) return next;\n if (!next) return previous;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return `${previous}${next}`;\n if (/^[.,!?;:)\\]}'\"`]/.test(next)) return `${previous}${next}`;\n if (/[(\\[{'\"`]$/.test(previous)) return `${previous}${next}`;\n return `${previous} ${next}`;\n}\n\nfunction canonicalText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction isSameAssistantText(left: string, right: string): boolean {\n if (canonicalText(left) === canonicalText(right)) return true;\n return compactText(left) === compactText(right);\n}\n\nfunction compactText(value: string): string {\n return canonicalText(value).replace(/\\s+/g, \"\");\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction hasMetadataKey(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): boolean {\n return (\n Boolean(metadata) && Object.prototype.hasOwnProperty.call(metadata, key)\n );\n}\n"]}
1
+ {"version":3,"file":"transcript-normalizer.js","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"AA+DA,MAAM,UAAU,4BAA4B,CAC1C,MAA2C;IAE3C,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,MAAM,YAAY,GAA+B,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IAEnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,IACE,QAAQ,EAAE,IAAI,KAAK,WAAW;gBAC9B,QAAQ,CAAC,MAAM,KAAK,eAAe;gBACnC,QAAQ,CAAC,SAAS,KAAK,gBAAgB,EACvC,CAAC;gBACD,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CACR,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,IAAI,CAAC,CACpE,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,mCAAmC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9E,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CACpE,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC;QACtB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAA+B,EAC/B,SAAiB;IAEjB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA+B,EAC/B,MAAkD,EAClD,SAAiB,EACjB,IAAY;IAEZ,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAsC,EACtC,KAA+B,EAC/B,IAAY;IAEZ,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC,IAAI,EAAE,KAAK,CAAC;QACxD,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE;QACvB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA+B,EAC/B,SAAiB;IAEjB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;QAC9B,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1C,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxC,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,KAA0C,EAC1C,KAA+B,EAC/B,QAAiD,EACjD,SAAiB;IAEjB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACnD,IAAI,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC;QACrC,CAAC;QACD,IAAI,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;IACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC;IACnC,IAAI,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CACtB,KAA+B,EAC/B,QAAiD,EACjD,SAAiB;IAEjB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,KAAK,GACT,QAAQ,KAAK,WAAW;QACtB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,QAAQ,KAAK,YAAY;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC;IACnB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,KAAK;QACL,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;QACtE,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS;QACzE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;QAChC,UAAU,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1D,SAAS,EAAE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAClE,WAAW,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACnE,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAmD,EACnD,IAAwB,EACxB,SAAiB;IAEjB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACnC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,SAAS;QACzC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,SAAS;QACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mCAAmC,CAC1C,KAAmD,EACnD,YAAwC;IAExC,MAAM,MAAM,GAAwC,EAAE,CAAC;IAEvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,SAAS,EAAiD,EAAE,CAC3D,SAAS,CAAC,IAAI,KAAK,WAAW;YAC9B,SAAS,CAAC,MAAM,KAAK,eAAe;YACpC,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CACzC,CAAC;QACF,IACE,WAAW,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,mBAAmB,CAClB,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACxD,IAAI,CAAC,IAAI,CACV,EACD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,MAAM,GACV,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,2BAA2B,GAAG;YACnC,GAAG,CAAC,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAC;YAC7C,GAAG,IAAI,CAAC,QAAQ;SACjB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA+B;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,yBAAyB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA+B;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,qBAAqB;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAErD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,UAAU,EACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,0BAA0B,GAAG;IACjC,qCAAqC;IACrC,uCAAuC;IACvC,wCAAwC;IACxC,kDAAkD;IAClD,2CAA2C;IAC3C,6CAA6C;CAC9C,CAAC;AAEF,SAAS,gBAAgB,CACvB,KAA+B;IAE/B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE9C,IACE,MAAM,KAAK,gBAAgB;QAC3B,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC;QAClC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC;QACpC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;QAC3B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EACnC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IACE,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,CAAC,MAAM,KAAK,SAAS;YACnB,IAAI,KAAK,OAAO;YAChB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACxB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;YACzB,OAAO,QAAQ,EAAE,SAAS,KAAK,QAAQ;YACvC,MAAM,KAAK,eAAe,CAAC,EAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IACE,MAAM,KAAK,QAAQ;QACnB,KAAK,KAAK,qBAAqB;QAC/B,KAAK,KAAK,SAAS;QACnB,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAC/D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA+B;IAE/B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC1D,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iCAAiC,CACxC,IAAsC,EACtC,KAA+B;IAE/B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,eAAe;QAC/B,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA+B;IAC5D,OAAO,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,iBAAiB,CAAC;AACtE,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAA+B,EAC/B,MAAkD;IAElD,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE;YAC3C,IAAI,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,UAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,KAAK;SACnB,OAAO,CAAC,+BAA+B,CAAC,YAAY,EAAE,EAAE,CAAC;SACzD,OAAO,CAAC,+BAA+B,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1D,OAAO,CAAC,+BAA+B,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,+BAA+B,GAAG;IACtC,YAAY,EAAE,yCAAyC;IACvD,aAAa,EAAE,iDAAiD;IAChE,2EAA2E;IAC3E,sEAAsE;IACtE,mDAAmD;IACnD,oBAAoB,EAClB,mHAAmH;CACtH,CAAC;AAEF,SAAS,aAAa,CACpB,KAA+B;IAE/B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;IAC1E,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;IAC/D,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;IAC7D,OAAO,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CACrB,QAA6C,EAC7C,GAAW;IAEX,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,QAA6C,EAC7C,GAAW;IAEX,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,QAA6C;IAE7C,MAAM,KAAK,GAAG,QAAQ,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,SAAS,GAAG,KAAoC,CAAC;IACvD,IACE,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;QACtC,OAAO,SAAS,CAAC,gBAAgB,KAAK,QAAQ;QAC9C,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;QACzC,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EAC1C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAA+B,CAAC;AACzC,CAAC","sourcesContent":["import type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\n\nexport type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\n\nexport type NormalizedCodeAgentTranscriptItem =\n | NormalizedCodeAgentUserTurn\n | NormalizedCodeAgentAssistantTurn\n | NormalizedCodeAgentToolEvent\n | NormalizedCodeAgentStatusEvent;\n\nexport interface NormalizedCodeAgentTranscript {\n items: NormalizedCodeAgentTranscriptItem[];\n rawEvents: CodeAgentTranscriptEvent[];\n hiddenEvents: CodeAgentTranscriptEvent[];\n}\n\nexport interface NormalizedCodeAgentTranscriptBase {\n id: string;\n createdAt: string;\n updatedAt: string;\n eventIds: string[];\n events: CodeAgentTranscriptEvent[];\n turnIndex: number;\n}\n\nexport interface NormalizedCodeAgentUserTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"user\";\n role: \"user\";\n text: string;\n}\n\nexport interface NormalizedCodeAgentAssistantTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"assistant\";\n role: \"assistant\";\n text: string;\n source: \"system\" | \"runner-stdout\";\n suppressedDuplicateEventIds?: string[];\n}\n\nexport interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"tool\";\n tool?: string;\n label: string;\n state: \"activity\" | \"running\" | \"completed\";\n input?: unknown;\n result?: unknown;\n mcpApp?: AgentMcpAppPayload;\n activities: string[];\n startedAt?: string;\n completedAt?: string;\n}\n\nexport interface NormalizedCodeAgentStatusEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"status\";\n level: \"info\" | \"warning\" | \"error\" | \"approval\";\n text: string;\n statusKind: CodeAgentTranscriptEvent[\"kind\"];\n status?: string;\n phase?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport function normalizeCodeAgentTranscript(\n events: readonly CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscript {\n const items: NormalizedCodeAgentTranscriptItem[] = [];\n const hiddenEvents: CodeAgentTranscriptEvent[] = [];\n const eventOrder = new Map(events.map((event, index) => [event.id, index]));\n let turnIndex = -1;\n\n for (const event of events) {\n const currentTurnIndex = Math.max(turnIndex, 0);\n if (event.kind === \"user\") {\n turnIndex = turnIndex < 0 ? (items.length === 0 ? 0 : 1) : turnIndex + 1;\n items.push(createUserTurn(event, turnIndex));\n continue;\n }\n\n const assistantSource = assistantTextSource(event);\n if (assistantSource) {\n const text = assistantTextForEvent(event, assistantSource);\n if (!text) {\n hiddenEvents.push(event);\n continue;\n }\n const previous = items.at(-1);\n if (\n previous?.type === \"assistant\" &&\n previous.source === assistantSource &&\n previous.turnIndex === currentTurnIndex\n ) {\n appendAssistantChunk(previous, event, text);\n } else {\n items.push(\n createAssistantTurn(event, assistantSource, currentTurnIndex, text),\n );\n }\n continue;\n }\n\n const toolType = toolEventType(event);\n if (toolType) {\n appendToolEvent(items, event, toolType, currentTurnIndex);\n continue;\n }\n\n if (shouldShowStatusEvent(event)) {\n items.push(createStatusEvent(event, currentTurnIndex));\n } else {\n hiddenEvents.push(event);\n }\n }\n\n const dedupedItems = suppressDuplicateFinalAssistantText(items, hiddenEvents);\n hiddenEvents.sort(\n (a, b) => (eventOrder.get(a.id) ?? 0) - (eventOrder.get(b.id) ?? 0),\n );\n\n return {\n items: dedupedItems,\n rawEvents: [...events],\n hiddenEvents,\n };\n}\n\nfunction createUserTurn(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentUserTurn {\n return {\n type: \"user\",\n role: \"user\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction createAssistantTurn(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n turnIndex: number,\n text: string,\n): NormalizedCodeAgentAssistantTurn {\n return {\n type: \"assistant\",\n role: \"assistant\",\n id: event.id,\n text,\n source,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendAssistantChunk(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n text: string,\n): void {\n item.text = shouldAppendAssistantChunkExactly(item, event)\n ? `${item.text}${text}`\n : joinAssistantChunks(item.text, text);\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n}\n\nfunction createStatusEvent(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentStatusEvent {\n const metadata = event.metadata;\n return {\n type: \"status\",\n id: event.id,\n text: event.message,\n level: statusEventLevel(event),\n statusKind: event.kind,\n status: stringMetadata(metadata, \"status\"),\n phase: stringMetadata(metadata, \"phase\"),\n metadata,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendToolEvent(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): void {\n const tool = stringMetadata(event.metadata, \"tool\");\n const item = findOpenToolEvent(items, tool, turnIndex);\n\n if (!item) {\n items.push(createToolEvent(event, toolType, turnIndex));\n return;\n }\n\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n\n if (toolType === \"activity\") {\n item.activities.push(event.message);\n if (item.state === \"activity\") item.label = event.message;\n return;\n }\n\n if (toolType === \"tool_start\") {\n const wasActivity = item.state === \"activity\";\n item.state = \"running\";\n item.startedAt = item.startedAt ?? event.createdAt;\n if (hasMetadataKey(event.metadata, \"input\")) {\n item.input = event.metadata?.input;\n }\n if (wasActivity || item.label === item.activities.at(-1)) {\n item.label = event.message;\n }\n return;\n }\n\n item.state = \"completed\";\n item.completedAt = event.createdAt;\n if (hasMetadataKey(event.metadata, \"result\")) {\n item.result = event.metadata?.result;\n }\n const mcpApp = mcpAppMetadata(event.metadata);\n if (mcpApp) item.mcpApp = mcpApp;\n}\n\nfunction createToolEvent(\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): NormalizedCodeAgentToolEvent {\n const metadata = event.metadata;\n const state =\n toolType === \"tool_done\"\n ? \"completed\"\n : toolType === \"tool_start\"\n ? \"running\"\n : \"activity\";\n return {\n type: \"tool\",\n id: event.id,\n tool: stringMetadata(metadata, \"tool\"),\n label: event.message,\n state,\n input: hasMetadataKey(metadata, \"input\") ? metadata?.input : undefined,\n result: hasMetadataKey(metadata, \"result\") ? metadata?.result : undefined,\n mcpApp: mcpAppMetadata(metadata),\n activities: toolType === \"activity\" ? [event.message] : [],\n startedAt: toolType === \"tool_start\" ? event.createdAt : undefined,\n completedAt: toolType === \"tool_done\" ? event.createdAt : undefined,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction findOpenToolEvent(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n tool: string | undefined,\n turnIndex: number,\n): NormalizedCodeAgentToolEvent | null {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item.type !== \"tool\") continue;\n if (item.turnIndex !== turnIndex) continue;\n if (item.state === \"completed\") continue;\n if (tool && item.tool !== tool) continue;\n if (!tool && item.tool) continue;\n return item;\n }\n return null;\n}\n\nfunction suppressDuplicateFinalAssistantText(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n hiddenEvents: CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscriptItem[] {\n const result: NormalizedCodeAgentTranscriptItem[] = [];\n\n for (const item of items) {\n if (item.type !== \"assistant\" || item.source !== \"system\") {\n result.push(item);\n continue;\n }\n\n const stdoutItems = result.filter(\n (candidate): candidate is NormalizedCodeAgentAssistantTurn =>\n candidate.type === \"assistant\" &&\n candidate.source === \"runner-stdout\" &&\n candidate.turnIndex === item.turnIndex,\n );\n if (\n stdoutItems.length === 0 ||\n !isSameAssistantText(\n stdoutItems.map((candidate) => candidate.text).join(\" \"),\n item.text,\n )\n ) {\n result.push(item);\n continue;\n }\n\n hiddenEvents.push(...item.events);\n const target =\n stdoutItems.length === 1 ? stdoutItems[0] : stdoutItems.at(-1);\n if (!target) continue;\n if (stdoutItems.length === 1) {\n target.text = item.text;\n target.updatedAt = item.updatedAt;\n }\n target.eventIds.push(...item.eventIds);\n target.events.push(...item.events);\n target.suppressedDuplicateEventIds = [\n ...(target.suppressedDuplicateEventIds ?? []),\n ...item.eventIds,\n ];\n }\n\n return result;\n}\n\nfunction shouldShowStatusEvent(event: CodeAgentTranscriptEvent): boolean {\n if (event.kind === \"artifact\" || event.kind === \"note\") return true;\n if (event.kind !== \"status\") return false;\n if (isLowSignalLifecycleEvent(event)) return false;\n return true;\n}\n\nfunction isLowSignalLifecycleEvent(event: CodeAgentTranscriptEvent): boolean {\n const metadata = event.metadata;\n const type = stringMetadata(metadata, \"type\");\n if (type === \"mcp-tools-connected\") return true;\n if (statusEventLevel(event) !== \"info\") return false;\n\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n if (status === \"queued\" || status === \"running\" || status === \"completed\") {\n return true;\n }\n if (\n phase === \"queued\" ||\n phase === \"starting\" ||\n phase === \"executing\" ||\n phase === \"follow-up\" ||\n phase === \"complete\"\n ) {\n return true;\n }\n\n return LOW_SIGNAL_STATUS_MESSAGES.some((pattern) =>\n pattern.test(event.message),\n );\n}\n\nconst LOW_SIGNAL_STATUS_MESSAGES = [\n /^Agent-Native Code run started\\.?$/i,\n /^Agent-Native Code run completed\\.?$/i,\n /^Agent-Native Code process exited\\.?$/i,\n /^Starting local Agent-Native Code execution\\.?$/i,\n /^Remote Agent-Native Code run queued\\.?$/i,\n /^Connected \\d+ MCP tools? for this run\\.?$/i,\n];\n\nfunction statusEventLevel(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentStatusEvent[\"level\"] {\n const metadata = event.metadata;\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n const source = stringMetadata(metadata, \"source\");\n const type = stringMetadata(metadata, \"type\");\n\n if (\n status === \"needs-approval\" ||\n Boolean(metadata?.pendingApproval) ||\n Boolean(metadata?.pendingApprovalId) ||\n Boolean(metadata?.approvalId) ||\n phase?.includes(\"approval\") ||\n /\\bapproval\\b/i.test(event.message)\n ) {\n return \"approval\";\n }\n\n if (\n event.kind === \"status\" &&\n (status === \"errored\" ||\n type === \"error\" ||\n type?.endsWith(\"-error\") ||\n Boolean(metadata?.failed) ||\n typeof metadata?.errorCode === \"string\" ||\n source === \"runner-stderr\")\n ) {\n return \"error\";\n }\n\n if (\n status === \"paused\" ||\n phase === \"missing-credentials\" ||\n phase === \"stopped\" ||\n /\\b(missing|stopped|unavailable|denied)\\b/i.test(event.message)\n ) {\n return \"warning\";\n }\n\n return \"info\";\n}\n\nfunction assistantTextSource(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentAssistantTurn[\"source\"] | null {\n const source = stringMetadata(event.metadata, \"source\");\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"assistant_delta\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"status\" && source === \"runner-stdout\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"system\" || event.metadata?.role === \"assistant\") {\n return \"system\";\n }\n return null;\n}\n\nfunction shouldAppendAssistantChunkExactly(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n): boolean {\n return (\n item.source === \"runner-stdout\" &&\n (isAssistantDeltaEvent(event) || item.events.some(isAssistantDeltaEvent))\n );\n}\n\nfunction isAssistantDeltaEvent(event: CodeAgentTranscriptEvent): boolean {\n return stringMetadata(event.metadata, \"type\") === \"assistant_delta\";\n}\n\nfunction assistantTextForEvent(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n): string {\n if (source === \"runner-stdout\") {\n return stripRunnerDiagnostics(event.message, {\n trim: !isAssistantDeltaEvent(event),\n });\n }\n return event.message;\n}\n\nfunction stripRunnerDiagnostics(\n value: string,\n options: { trim?: boolean } = {},\n): string {\n const stripped = value\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.engineDetect, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.builderEngine, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.sessionStartedBanner, \"\");\n return options.trim === false ? stripped : stripped.trim();\n}\n\nconst RUNNER_DIAGNOSTIC_LINE_PATTERNS = {\n engineDetect: /^\\[engine-detect\\][^\\r\\n]*(?:\\r?\\n|$)/gm,\n builderEngine: /^\\[builder-engine\\]\\s*[←→][^\\r\\n]*(?:\\r?\\n|$)/gm,\n // Strip the \"Agent-Native Code session started.\" banner block that the CLI\n // prints to stdout at the start of every run. It is informational for\n // terminal users but clutters the chat transcript.\n sessionStartedBanner:\n /\\n?Agent-Native Code session started\\.[\\s\\S]*?Streaming output below\\. The transcript is saved with this run\\.\\n?/,\n};\n\nfunction toolEventType(\n event: CodeAgentTranscriptEvent,\n): \"activity\" | \"tool_done\" | \"tool_start\" | null {\n if (event.kind !== \"status\") return null;\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"activity\" || type === \"tool_done\" || type === \"tool_start\") {\n return type;\n }\n return null;\n}\n\nfunction joinAssistantChunks(previous: string, next: string): string {\n if (!previous) return next;\n if (!next) return previous;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return `${previous}${next}`;\n if (/^[.,!?;:)\\]}'\"`]/.test(next)) return `${previous}${next}`;\n if (/[(\\[{'\"`]$/.test(previous)) return `${previous}${next}`;\n return `${previous} ${next}`;\n}\n\nfunction canonicalText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction isSameAssistantText(left: string, right: string): boolean {\n if (canonicalText(left) === canonicalText(right)) return true;\n return compactText(left) === compactText(right);\n}\n\nfunction compactText(value: string): string {\n return canonicalText(value).replace(/\\s+/g, \"\");\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction hasMetadataKey(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): boolean {\n return (\n Boolean(metadata) && Object.prototype.hasOwnProperty.call(metadata, key)\n );\n}\n\nfunction mcpAppMetadata(\n metadata: Record<string, unknown> | undefined,\n): AgentMcpAppPayload | undefined {\n const value = metadata?.mcpApp;\n if (!value || typeof value !== \"object\") return undefined;\n const candidate = value as Partial<AgentMcpAppPayload>;\n if (\n typeof candidate.serverId !== \"string\" ||\n typeof candidate.originalToolName !== \"string\" ||\n typeof candidate.resourceUri !== \"string\" ||\n !candidate.resourceUri.startsWith(\"ui://\")\n ) {\n return undefined;\n }\n return candidate as AgentMcpAppPayload;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}