@maudecode/talaria-web 1.18.0 → 1.20.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 (774) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/auth-raw.js +16 -16
  3. package/dist/api/auth-raw.js.map +1 -1
  4. package/dist/api/automation-raw.d.ts +2 -2
  5. package/dist/api/automation-raw.js +93 -38
  6. package/dist/api/automation-raw.js.map +1 -1
  7. package/dist/api/automation-router.d.ts +99 -17
  8. package/dist/api/automation-router.js +22 -14
  9. package/dist/api/automation-router.js.map +1 -1
  10. package/dist/api/chat-router.d.ts +1433 -37
  11. package/dist/api/chat-router.js +205 -90
  12. package/dist/api/chat-router.js.map +1 -1
  13. package/dist/api/git-router.d.ts +6 -2
  14. package/dist/api/git-router.js +30 -30
  15. package/dist/api/git-router.js.map +1 -1
  16. package/dist/api/raw-routes.d.ts +3 -3
  17. package/dist/api/raw-routes.js +76 -62
  18. package/dist/api/raw-routes.js.map +1 -1
  19. package/dist/api/router.d.ts +5 -5
  20. package/dist/api/router.js +22 -22
  21. package/dist/api/router.js.map +1 -1
  22. package/dist/api/session-visibility.d.ts +4 -4
  23. package/dist/api/session-visibility.js +26 -16
  24. package/dist/api/session-visibility.js.map +1 -1
  25. package/dist/api/sessions-router.d.ts +2635 -151
  26. package/dist/api/sessions-router.js +193 -177
  27. package/dist/api/sessions-router.js.map +1 -1
  28. package/dist/api/settings-router.d.ts +450 -11
  29. package/dist/api/settings-router.js +102 -49
  30. package/dist/api/settings-router.js.map +1 -1
  31. package/dist/api/sse-routes.d.ts +2 -2
  32. package/dist/api/sse-routes.js +102 -80
  33. package/dist/api/sse-routes.js.map +1 -1
  34. package/dist/api/tools-raw.d.ts +5 -0
  35. package/dist/api/tools-raw.js +58 -33
  36. package/dist/api/tools-raw.js.map +1 -1
  37. package/dist/api/tools-router.d.ts +963 -109
  38. package/dist/api/tools-router.js +426 -72
  39. package/dist/api/tools-router.js.map +1 -1
  40. package/dist/api/transcribe-stream.d.ts +16 -0
  41. package/dist/api/transcribe-stream.js +172 -0
  42. package/dist/api/transcribe-stream.js.map +1 -0
  43. package/dist/app.d.ts +4 -1
  44. package/dist/app.js +80 -57
  45. package/dist/app.js.map +1 -1
  46. package/dist/auth/crypto.d.ts +3 -0
  47. package/dist/auth/crypto.js +18 -0
  48. package/dist/auth/crypto.js.map +1 -1
  49. package/dist/auth/gate.js +14 -9
  50. package/dist/auth/gate.js.map +1 -1
  51. package/dist/auth/passkeys.d.ts +15 -14
  52. package/dist/auth/passkeys.js +89 -91
  53. package/dist/auth/passkeys.js.map +1 -1
  54. package/dist/auth/store.d.ts +17 -7
  55. package/dist/auth/store.js +93 -52
  56. package/dist/auth/store.js.map +1 -1
  57. package/dist/bin/talaria-web.js +12 -81
  58. package/dist/bin/talaria-web.js.map +1 -1
  59. package/dist/cli/ctl.js +8 -2
  60. package/dist/cli/ctl.js.map +1 -1
  61. package/dist/cli/dotenv.d.ts +5 -0
  62. package/dist/cli/dotenv.js +14 -2
  63. package/dist/cli/dotenv.js.map +1 -1
  64. package/dist/cli/launcher.js +5 -5
  65. package/dist/cli/launcher.js.map +1 -1
  66. package/dist/cli/main.d.ts +1 -0
  67. package/dist/cli/main.js +90 -0
  68. package/dist/cli/main.js.map +1 -0
  69. package/dist/cli/supervise.d.ts +24 -0
  70. package/dist/cli/supervise.js +147 -6
  71. package/dist/cli/supervise.js.map +1 -1
  72. package/dist/config/agent-config.d.ts +37 -11
  73. package/dist/config/agent-config.js +146 -64
  74. package/dist/config/agent-config.js.map +1 -1
  75. package/dist/config.d.ts +2 -0
  76. package/dist/config.js +14 -5
  77. package/dist/config.js.map +1 -1
  78. package/dist/fs/atomic.d.ts +4 -0
  79. package/dist/fs/atomic.js +19 -2
  80. package/dist/fs/atomic.js.map +1 -1
  81. package/dist/fs/stat.d.ts +7 -0
  82. package/dist/fs/stat.js +27 -0
  83. package/dist/fs/stat.js.map +1 -0
  84. package/dist/http/context.d.ts +28 -9
  85. package/dist/http/context.js +77 -25
  86. package/dist/http/context.js.map +1 -1
  87. package/dist/onboarding.d.ts +2 -2
  88. package/dist/onboarding.js +10 -8
  89. package/dist/onboarding.js.map +1 -1
  90. package/dist/profiles/profiles.d.ts +12 -4
  91. package/dist/profiles/profiles.js +78 -30
  92. package/dist/profiles/profiles.js.map +1 -1
  93. package/dist/projects.d.ts +15 -6
  94. package/dist/projects.js +55 -47
  95. package/dist/projects.js.map +1 -1
  96. package/dist/providers/catalog.d.ts +85 -14
  97. package/dist/providers/catalog.js +502 -146
  98. package/dist/providers/catalog.js.map +1 -1
  99. package/dist/providers/env-file.d.ts +10 -3
  100. package/dist/providers/env-file.js +24 -75
  101. package/dist/providers/env-file.js.map +1 -1
  102. package/dist/providers/runtime-env.d.ts +4 -2
  103. package/dist/providers/runtime-env.js +9 -6
  104. package/dist/providers/runtime-env.js.map +1 -1
  105. package/dist/providers/tables.d.ts +3 -1
  106. package/dist/providers/tables.js +4 -2
  107. package/dist/providers/tables.js.map +1 -1
  108. package/dist/redact.js +56 -23
  109. package/dist/redact.js.map +1 -1
  110. package/dist/release.d.ts +7 -0
  111. package/dist/release.js +19 -3
  112. package/dist/release.js.map +1 -1
  113. package/dist/runtime.d.ts +5 -1
  114. package/dist/runtime.js +303 -96
  115. package/dist/runtime.js.map +1 -1
  116. package/dist/server.js +31 -18
  117. package/dist/server.js.map +1 -1
  118. package/dist/sessions/anchor.d.ts +11 -4
  119. package/dist/sessions/anchor.js +33 -37
  120. package/dist/sessions/anchor.js.map +1 -1
  121. package/dist/sessions/background-events.d.ts +2 -0
  122. package/dist/sessions/background-events.js +10 -0
  123. package/dist/sessions/background-events.js.map +1 -0
  124. package/dist/sessions/background-tasks.d.ts +49 -23
  125. package/dist/sessions/background-tasks.js +161 -89
  126. package/dist/sessions/background-tasks.js.map +1 -1
  127. package/dist/sessions/background-updates.d.ts +15 -8
  128. package/dist/sessions/background-updates.js +101 -25
  129. package/dist/sessions/background-updates.js.map +1 -1
  130. package/dist/sessions/cli-sessions.d.ts +23 -6
  131. package/dist/sessions/cli-sessions.js +84 -84
  132. package/dist/sessions/cli-sessions.js.map +1 -1
  133. package/dist/sessions/completions.d.ts +38 -2
  134. package/dist/sessions/completions.js +348 -77
  135. package/dist/sessions/completions.js.map +1 -1
  136. package/dist/sessions/compress.d.ts +8 -0
  137. package/dist/sessions/compress.js +2 -2
  138. package/dist/sessions/compress.js.map +1 -1
  139. package/dist/sessions/drafts.d.ts +14 -10
  140. package/dist/sessions/drafts.js +38 -43
  141. package/dist/sessions/drafts.js.map +1 -1
  142. package/dist/sessions/export.d.ts +2 -0
  143. package/dist/sessions/export.js +6 -2
  144. package/dist/sessions/export.js.map +1 -1
  145. package/dist/sessions/gateway-sessions.d.ts +86 -0
  146. package/dist/sessions/gateway-sessions.js +914 -0
  147. package/dist/sessions/gateway-sessions.js.map +1 -0
  148. package/dist/sessions/gateway-watcher.d.ts +10 -11
  149. package/dist/sessions/gateway-watcher.js +25 -21
  150. package/dist/sessions/gateway-watcher.js.map +1 -1
  151. package/dist/sessions/goals.d.ts +31 -0
  152. package/dist/sessions/goals.js +75 -0
  153. package/dist/sessions/goals.js.map +1 -0
  154. package/dist/sessions/journal.d.ts +5 -79
  155. package/dist/sessions/journal.js +15 -606
  156. package/dist/sessions/journal.js.map +1 -1
  157. package/dist/sessions/list.d.ts +34 -18
  158. package/dist/sessions/list.js +161 -147
  159. package/dist/sessions/list.js.map +1 -1
  160. package/dist/sessions/merge.d.ts +77 -13
  161. package/dist/sessions/merge.js +315 -65
  162. package/dist/sessions/merge.js.map +1 -1
  163. package/dist/sessions/notices.d.ts +22 -0
  164. package/dist/sessions/notices.js +72 -0
  165. package/dist/sessions/notices.js.map +1 -0
  166. package/dist/sessions/pending.d.ts +10 -4
  167. package/dist/sessions/pending.js +83 -7
  168. package/dist/sessions/pending.js.map +1 -1
  169. package/dist/sessions/prefix-index.d.ts +85 -0
  170. package/dist/sessions/prefix-index.js +243 -0
  171. package/dist/sessions/prefix-index.js.map +1 -0
  172. package/dist/sessions/recovery.d.ts +4 -7
  173. package/dist/sessions/recovery.js +100 -283
  174. package/dist/sessions/recovery.js.map +1 -1
  175. package/dist/sessions/relay.d.ts +20 -20
  176. package/dist/sessions/relay.js +205 -127
  177. package/dist/sessions/relay.js.map +1 -1
  178. package/dist/sessions/service.d.ts +251 -78
  179. package/dist/sessions/service.js +1510 -564
  180. package/dist/sessions/service.js.map +1 -1
  181. package/dist/sessions/session.d.ts +20 -2
  182. package/dist/sessions/session.js +33 -5
  183. package/dist/sessions/session.js.map +1 -1
  184. package/dist/sessions/shares.d.ts +7 -6
  185. package/dist/sessions/shares.js +22 -45
  186. package/dist/sessions/shares.js.map +1 -1
  187. package/dist/sessions/source-kind.js +1 -0
  188. package/dist/sessions/source-kind.js.map +1 -1
  189. package/dist/sessions/state-db-identity.d.ts +18 -0
  190. package/dist/sessions/state-db-identity.js +67 -0
  191. package/dist/sessions/state-db-identity.js.map +1 -0
  192. package/dist/sessions/state-db-worker.js +24 -5
  193. package/dist/sessions/state-db-worker.js.map +1 -1
  194. package/dist/sessions/state-db.d.ts +157 -21
  195. package/dist/sessions/state-db.js +1145 -204
  196. package/dist/sessions/state-db.js.map +1 -1
  197. package/dist/sessions/state-saved.d.ts +1 -1
  198. package/dist/sessions/state-saved.js +35 -11
  199. package/dist/sessions/state-saved.js.map +1 -1
  200. package/dist/sessions/storage/backend.d.ts +171 -0
  201. package/dist/sessions/storage/backend.js +19 -0
  202. package/dist/sessions/storage/backend.js.map +1 -0
  203. package/dist/sessions/storage/conformance.d.ts +20 -0
  204. package/dist/sessions/storage/conformance.js +237 -0
  205. package/dist/sessions/storage/conformance.js.map +1 -0
  206. package/dist/sessions/storage/document.d.ts +16 -0
  207. package/dist/sessions/storage/document.js +44 -0
  208. package/dist/sessions/storage/document.js.map +1 -0
  209. package/dist/sessions/storage/json-documents.d.ts +25 -0
  210. package/dist/sessions/storage/json-documents.js +277 -0
  211. package/dist/sessions/storage/json-documents.js.map +1 -0
  212. package/dist/sessions/storage/json-files.d.ts +23 -0
  213. package/dist/sessions/storage/json-files.js +244 -0
  214. package/dist/sessions/storage/json-files.js.map +1 -0
  215. package/dist/sessions/storage/json-installation.d.ts +3 -0
  216. package/dist/sessions/storage/json-installation.js +31 -0
  217. package/dist/sessions/storage/json-installation.js.map +1 -0
  218. package/dist/sessions/storage/json-journal.d.ts +113 -0
  219. package/dist/sessions/storage/json-journal.js +756 -0
  220. package/dist/sessions/storage/json-journal.js.map +1 -0
  221. package/dist/sessions/storage/json-recovery.d.ts +4 -0
  222. package/dist/sessions/storage/json-recovery.js +195 -0
  223. package/dist/sessions/storage/json-recovery.js.map +1 -0
  224. package/dist/sessions/storage/json.d.ts +82 -0
  225. package/dist/sessions/storage/json.js +350 -0
  226. package/dist/sessions/storage/json.js.map +1 -0
  227. package/dist/sessions/storage/row.d.ts +6 -0
  228. package/dist/sessions/storage/row.js +49 -0
  229. package/dist/sessions/storage/row.js.map +1 -0
  230. package/dist/sessions/storage/search-text.d.ts +4 -0
  231. package/dist/sessions/storage/search-text.js +16 -0
  232. package/dist/sessions/storage/search-text.js.map +1 -0
  233. package/dist/sessions/store.d.ts +67 -73
  234. package/dist/sessions/store.js +341 -607
  235. package/dist/sessions/store.js.map +1 -1
  236. package/dist/sessions/streams.d.ts +12 -7
  237. package/dist/sessions/streams.js +58 -15
  238. package/dist/sessions/streams.js.map +1 -1
  239. package/dist/sessions/titles.js +1 -1
  240. package/dist/sessions/titles.js.map +1 -1
  241. package/dist/sessions/todo.d.ts +5 -0
  242. package/dist/sessions/todo.js +28 -21
  243. package/dist/sessions/todo.js.map +1 -1
  244. package/dist/sessions/tool-display.d.ts +8 -5
  245. package/dist/sessions/tool-display.js +28 -16
  246. package/dist/sessions/tool-display.js.map +1 -1
  247. package/dist/sessions/turn-context.d.ts +10 -1
  248. package/dist/sessions/turn-context.js +13 -6
  249. package/dist/sessions/turn-context.js.map +1 -1
  250. package/dist/sessions/turn.d.ts +110 -22
  251. package/dist/sessions/turn.js +918 -380
  252. package/dist/sessions/turn.js.map +1 -1
  253. package/dist/sessions/wakeup-pause.d.ts +8 -13
  254. package/dist/sessions/wakeup-pause.js +31 -49
  255. package/dist/sessions/wakeup-pause.js.map +1 -1
  256. package/dist/sessions/window.js +13 -12
  257. package/dist/sessions/window.js.map +1 -1
  258. package/dist/settings.d.ts +19 -7
  259. package/dist/settings.js +179 -183
  260. package/dist/settings.js.map +1 -1
  261. package/dist/sidecar/client.d.ts +41 -4
  262. package/dist/sidecar/client.js +192 -42
  263. package/dist/sidecar/client.js.map +1 -1
  264. package/dist/sidecar/discover.d.ts +2 -1
  265. package/dist/sidecar/discover.js +93 -10
  266. package/dist/sidecar/discover.js.map +1 -1
  267. package/dist/sidecar/env.d.ts +4 -0
  268. package/dist/sidecar/env.js +3 -0
  269. package/dist/sidecar/env.js.map +1 -0
  270. package/dist/sidecar/fake.d.ts +6 -2
  271. package/dist/sidecar/fake.js +34 -4
  272. package/dist/sidecar/fake.js.map +1 -1
  273. package/dist/spa.d.ts +9 -4
  274. package/dist/spa.js +36 -12
  275. package/dist/spa.js.map +1 -1
  276. package/dist/startup-timing.d.ts +66 -0
  277. package/dist/startup-timing.js +129 -0
  278. package/dist/startup-timing.js.map +1 -0
  279. package/dist/test/env-file.d.ts +5 -0
  280. package/dist/test/env-file.js +88 -0
  281. package/dist/test/env-file.js.map +1 -0
  282. package/dist/test/fs-handles.d.ts +11 -0
  283. package/dist/test/fs-handles.js +31 -0
  284. package/dist/test/fs-handles.js.map +1 -0
  285. package/dist/test/harness.d.ts +1 -0
  286. package/dist/test/harness.js +1 -1
  287. package/dist/test/harness.js.map +1 -1
  288. package/dist/test/passkeys.d.ts +22 -0
  289. package/dist/test/passkeys.js +62 -0
  290. package/dist/test/passkeys.js.map +1 -0
  291. package/dist/test/storage.d.ts +15 -0
  292. package/dist/test/storage.js +26 -0
  293. package/dist/test/storage.js.map +1 -0
  294. package/dist/tools/commands.d.ts +6 -1
  295. package/dist/tools/commands.js +8 -2
  296. package/dist/tools/commands.js.map +1 -1
  297. package/dist/tools/connectors.d.ts +33 -0
  298. package/dist/tools/connectors.js +121 -0
  299. package/dist/tools/connectors.js.map +1 -0
  300. package/dist/tools/crons.d.ts +46 -5
  301. package/dist/tools/crons.js +100 -26
  302. package/dist/tools/crons.js.map +1 -1
  303. package/dist/tools/dashboard-plugins.d.ts +34 -5
  304. package/dist/tools/dashboard-plugins.js +146 -14
  305. package/dist/tools/dashboard-plugins.js.map +1 -1
  306. package/dist/tools/extensions.d.ts +5 -4
  307. package/dist/tools/extensions.js +213 -207
  308. package/dist/tools/extensions.js.map +1 -1
  309. package/dist/tools/gateway-restart.d.ts +82 -0
  310. package/dist/tools/gateway-restart.js +222 -0
  311. package/dist/tools/gateway-restart.js.map +1 -0
  312. package/dist/tools/health.d.ts +28 -4
  313. package/dist/tools/health.js +171 -50
  314. package/dist/tools/health.js.map +1 -1
  315. package/dist/tools/hygiene.d.ts +4 -3
  316. package/dist/tools/hygiene.js +23 -9
  317. package/dist/tools/hygiene.js.map +1 -1
  318. package/dist/tools/insights.d.ts +1 -1
  319. package/dist/tools/insights.js +2 -2
  320. package/dist/tools/insights.js.map +1 -1
  321. package/dist/tools/kanban.d.ts +4 -2
  322. package/dist/tools/kanban.js +28 -19
  323. package/dist/tools/kanban.js.map +1 -1
  324. package/dist/tools/mcp-health.js +74 -24
  325. package/dist/tools/mcp-health.js.map +1 -1
  326. package/dist/tools/mcp.js +19 -1
  327. package/dist/tools/mcp.js.map +1 -1
  328. package/dist/tools/memory-masks.d.ts +5 -0
  329. package/dist/tools/memory-masks.js +256 -0
  330. package/dist/tools/memory-masks.js.map +1 -0
  331. package/dist/tools/memory.d.ts +29 -3
  332. package/dist/tools/memory.js +69 -27
  333. package/dist/tools/memory.js.map +1 -1
  334. package/dist/tools/plugin-oauth.d.ts +14 -0
  335. package/dist/tools/plugin-oauth.js +53 -0
  336. package/dist/tools/plugin-oauth.js.map +1 -0
  337. package/dist/tools/plugin-settings.d.ts +15 -0
  338. package/dist/tools/plugin-settings.js +90 -0
  339. package/dist/tools/plugin-settings.js.map +1 -0
  340. package/dist/tools/prune-advice.d.ts +50 -0
  341. package/dist/tools/prune-advice.js +114 -0
  342. package/dist/tools/prune-advice.js.map +1 -0
  343. package/dist/tools/skills.d.ts +13 -5
  344. package/dist/tools/skills.js +53 -19
  345. package/dist/tools/skills.js.map +1 -1
  346. package/dist/tools/update-notifications.d.ts +102 -17
  347. package/dist/tools/update-notifications.js +400 -82
  348. package/dist/tools/update-notifications.js.map +1 -1
  349. package/dist/tools/update-rollback.d.ts +11 -0
  350. package/dist/tools/update-rollback.js +28 -0
  351. package/dist/tools/update-rollback.js.map +1 -0
  352. package/dist/tools/updates.d.ts +100 -33
  353. package/dist/tools/updates.js +1085 -345
  354. package/dist/tools/updates.js.map +1 -1
  355. package/dist/util.d.ts +2 -0
  356. package/dist/util.js +5 -0
  357. package/dist/util.js.map +1 -1
  358. package/dist/workspace/git.d.ts +16 -1
  359. package/dist/workspace/git.js +291 -11
  360. package/dist/workspace/git.js.map +1 -1
  361. package/dist/workspace/media.d.ts +12 -9
  362. package/dist/workspace/media.js +98 -38
  363. package/dist/workspace/media.js.map +1 -1
  364. package/dist/workspace/preview.js +4 -14
  365. package/dist/workspace/preview.js.map +1 -1
  366. package/dist/workspace/rollback.d.ts +8 -4
  367. package/dist/workspace/rollback.js +22 -12
  368. package/dist/workspace/rollback.js.map +1 -1
  369. package/dist/workspace/workspaces.d.ts +15 -19
  370. package/dist/workspace/workspaces.js +55 -127
  371. package/dist/workspace/workspaces.js.map +1 -1
  372. package/dist/workspace/worktrees.js +170 -32
  373. package/dist/workspace/worktrees.js.map +1 -1
  374. package/package.json +6 -4
  375. package/sidecar/agent_dependency.json +4 -4
  376. package/sidecar/agent_support.json +29 -0
  377. package/sidecar/scripts/record-fixtures.py +12 -3
  378. package/sidecar/scripts/replay_sidecar.py +8 -0
  379. package/sidecar/scripts/suite_runner.py +458 -0
  380. package/sidecar/scripts/test.sh +11 -5
  381. package/sidecar/talaria_sidecar/__init__.py +6 -1
  382. package/sidecar/talaria_sidecar/__main__.py +13 -4
  383. package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
  384. package/sidecar/talaria_sidecar/agent_services.py +1116 -0
  385. package/sidecar/talaria_sidecar/context_detail.py +59 -0
  386. package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
  387. package/sidecar/talaria_sidecar/home.py +133 -14
  388. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  389. package/sidecar/talaria_sidecar/methods/aux.py +211 -41
  390. package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
  391. package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
  392. package/sidecar/talaria_sidecar/methods/commands.py +483 -13
  393. package/sidecar/talaria_sidecar/methods/config.py +195 -6
  394. package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
  395. package/sidecar/talaria_sidecar/methods/cron.py +374 -36
  396. package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
  397. package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
  398. package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
  399. package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
  400. package/sidecar/talaria_sidecar/methods/goals.py +81 -41
  401. package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
  402. package/sidecar/talaria_sidecar/methods/memory.py +84 -0
  403. package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
  404. package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
  405. package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
  406. package/sidecar/talaria_sidecar/methods/process.py +229 -16
  407. package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
  408. package/sidecar/talaria_sidecar/methods/providers.py +196 -26
  409. package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
  410. package/sidecar/talaria_sidecar/methods/skills.py +83 -5
  411. package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
  412. package/sidecar/talaria_sidecar/methods/stt.py +159 -78
  413. package/sidecar/talaria_sidecar/methods/text.py +14 -1
  414. package/sidecar/talaria_sidecar/methods/toolsets.py +51 -0
  415. package/sidecar/talaria_sidecar/methods/usage.py +113 -14
  416. package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
  417. package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
  418. package/sidecar/talaria_sidecar/rpc.py +70 -7
  419. package/sidecar/talaria_sidecar/runtime.py +122 -14
  420. package/sidecar/talaria_sidecar/speed.py +47 -0
  421. package/sidecar/talaria_sidecar/startup_timing.py +119 -0
  422. package/static/dist/FILES.txt +242 -215
  423. package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
  424. package/static/dist/assets/AppShell-3isgvoro.js +8 -0
  425. package/static/dist/assets/Button-f4n6dapf.js +1 -0
  426. package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
  427. package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
  428. package/static/dist/assets/Dialog-hta5utr3.js +1 -0
  429. package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
  430. package/static/dist/assets/Field-b6ez48oz.js +1 -0
  431. package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
  432. package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
  433. package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
  434. package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
  435. package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
  436. package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
  437. package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
  438. package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
  439. package/static/dist/assets/Select-kr07928w.js +1 -0
  440. package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
  441. package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
  442. package/static/dist/assets/States-icab19yg.js +1 -0
  443. package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
  444. package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
  445. package/static/dist/assets/_app-ga1moszl.js +1 -0
  446. package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
  447. package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
  448. package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
  449. package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
  450. package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
  451. package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
  452. package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
  453. package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
  454. package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
  455. package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
  456. package/static/dist/assets/_app.skills-n016rihd.js +1 -0
  457. package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
  458. package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
  459. package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
  460. package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
  461. package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
  462. package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
  463. package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
  464. package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
  465. package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
  466. package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
  467. package/static/dist/assets/archive-il7c6053.js +1 -0
  468. package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
  469. package/static/dist/assets/back-gu3nu279.js +1 -0
  470. package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
  471. package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
  472. package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
  473. package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
  474. package/static/dist/assets/cancel-bsnfo36u.js +1 -0
  475. package/static/dist/assets/channel-dsbtk01y.js +1 -0
  476. package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
  477. package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
  478. package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
  479. package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
  480. package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
  481. package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
  482. package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
  483. package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
  484. package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
  485. package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
  486. package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
  487. package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
  488. package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
  489. package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
  490. package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
  491. package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
  492. package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
  493. package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
  494. package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
  495. package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
  496. package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
  497. package/static/dist/assets/copied-bz3gkazh.js +1 -0
  498. package/static/dist/assets/copy-jo006coq.js +1 -0
  499. package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
  500. package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
  501. package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
  502. package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
  503. package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
  504. package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
  505. package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
  506. package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
  507. package/static/dist/assets/dagre-o5jmjz46.js +1 -0
  508. package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
  509. package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
  510. package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
  511. package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
  512. package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
  513. package/static/dist/assets/dist-crc46di9.js +7 -0
  514. package/static/dist/assets/dist-etpoyscq.js +44 -0
  515. package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
  516. package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
  517. package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
  518. package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
  519. package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
  520. package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
  521. package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
  522. package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
  523. package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
  524. package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
  525. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
  526. package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
  527. package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
  528. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
  529. package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
  530. package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
  531. package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
  532. package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
  533. package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
  534. package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
  535. package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
  536. package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
  537. package/static/dist/assets/host-fr6lni1p.js +1 -0
  538. package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
  539. package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
  540. package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
  541. package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
  542. package/static/dist/assets/index-73649w7o.js +10 -0
  543. package/static/dist/assets/index-lhf1fsdf.css +2 -0
  544. package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
  545. package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
  546. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
  547. package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
  548. package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
  549. package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
  550. package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
  551. package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
  552. package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
  553. package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
  554. package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
  555. package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
  556. package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
  557. package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
  558. package/static/dist/assets/katex-cbdd1ohw.css +1 -0
  559. package/static/dist/assets/katex-pbij2oo6.js +257 -0
  560. package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
  561. package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
  562. package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
  563. package/static/dist/assets/linear-jlwrvvy6.js +1 -0
  564. package/static/dist/assets/link-iadw4ghw.js +2 -0
  565. package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
  566. package/static/dist/assets/locale-cs-n41hptse.js +5 -0
  567. package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
  568. package/static/dist/assets/locale-es-ih078lco.js +5 -0
  569. package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
  570. package/static/dist/assets/locale-it-kb96jufy.js +5 -0
  571. package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
  572. package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
  573. package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
  574. package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
  575. package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
  576. package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
  577. package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
  578. package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
  579. package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
  580. package/static/dist/assets/login-lkhtzfcl.js +1 -0
  581. package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
  582. package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
  583. package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
  584. package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
  585. package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
  586. package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
  587. package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
  588. package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
  589. package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
  590. package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
  591. package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
  592. package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
  593. package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
  594. package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
  595. package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
  596. package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
  597. package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
  598. package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
  599. package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
  600. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
  601. package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
  602. package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
  603. package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
  604. package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
  605. package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
  606. package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
  607. package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
  608. package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
  609. package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
  610. package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
  611. package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
  612. package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
  613. package/static/dist/assets/registry-g7w3353u.js +1 -0
  614. package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
  615. package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
  616. package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
  617. package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
  618. package/static/dist/assets/runtime-nlxpnegr.js +1 -0
  619. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
  620. package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
  621. package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
  622. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
  623. package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
  624. package/static/dist/assets/share._token-o76ki0ly.js +2 -0
  625. package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
  626. package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
  627. package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
  628. package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
  629. package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
  630. package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
  631. package/static/dist/assets/src-h89s0hs4.js +1 -0
  632. package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
  633. package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
  634. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
  635. package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
  636. package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
  637. package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
  638. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
  639. package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
  640. package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
  641. package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
  642. package/static/dist/assets/toast-liparz2j.js +56 -0
  643. package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
  644. package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
  645. package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
  646. package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
  647. package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
  648. package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
  649. package/static/dist/assets/untitled-mj86r4gz.js +1 -0
  650. package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
  651. package/static/dist/assets/useForm-o4uu74mx.js +1 -0
  652. package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
  653. package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
  654. package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
  655. package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
  656. package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
  657. package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
  658. package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
  659. package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
  660. package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
  661. package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
  662. package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
  663. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
  664. package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
  665. package/static/dist/extension-sdk.js +1 -1
  666. package/static/dist/index.html +1 -1
  667. package/static/dist/sw.js +180 -136
  668. package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
  669. package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
  670. package/static/dist/assets/Dialog-g355qxhp.js +0 -1
  671. package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
  672. package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
  673. package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
  674. package/static/dist/assets/Markdown-lwviulmg.css +0 -1
  675. package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
  676. package/static/dist/assets/Select-kddq75qc.js +0 -1
  677. package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
  678. package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
  679. package/static/dist/assets/States-eq6fe29m.js +0 -1
  680. package/static/dist/assets/Toaster-pc247u9f.js +0 -1
  681. package/static/dist/assets/_app-f8n1i0m1.js +0 -1
  682. package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +0 -1
  683. package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
  684. package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
  685. package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
  686. package/static/dist/assets/_app.logs-i69qds98.js +0 -1
  687. package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
  688. package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
  689. package/static/dist/assets/_app.session._sessionId-fn1bhde6.js +0 -1
  690. package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
  691. package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
  692. package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
  693. package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
  694. package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
  695. package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
  696. package/static/dist/assets/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
  697. package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
  698. package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
  699. package/static/dist/assets/back-h7aun7ew.js +0 -1
  700. package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
  701. package/static/dist/assets/channel-b2zo73z1.js +0 -1
  702. package/static/dist/assets/chunk-DU6HZSFF-ofajdixh.js +0 -128
  703. package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
  704. package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
  705. package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
  706. package/static/dist/assets/copied-hcplv46p.js +0 -1
  707. package/static/dist/assets/copy-magtofyp.js +0 -1
  708. package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
  709. package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
  710. package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
  711. package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
  712. package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
  713. package/static/dist/assets/dagre-lkoknbjn.js +0 -1
  714. package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
  715. package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
  716. package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
  717. package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
  718. package/static/dist/assets/endpoints-klbxod4t.js +0 -64
  719. package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
  720. package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
  721. package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
  722. package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
  723. package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.js +0 -1
  724. package/static/dist/assets/host-i828xuo7.js +0 -1
  725. package/static/dist/assets/index-eh8zilnv.css +0 -2
  726. package/static/dist/assets/index-r648f4o1.js +0 -11
  727. package/static/dist/assets/info-A6RAGUB7-h11x0dxo.js +0 -1
  728. package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
  729. package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
  730. package/static/dist/assets/linear-becwlnhk.js +0 -1
  731. package/static/dist/assets/link-oot2yn73.js +0 -1
  732. package/static/dist/assets/login-gu28l9ou.js +0 -1
  733. package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
  734. package/static/dist/assets/mermaid-parser.core-ntne45i9.js +0 -7
  735. package/static/dist/assets/not-found-ccnnac39.js +0 -1
  736. package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
  737. package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
  738. package/static/dist/assets/packet-AYTQ26CC-l6jdka8p.js +0 -1
  739. package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
  740. package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
  741. package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
  742. package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
  743. package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.js +0 -1
  744. package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
  745. package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
  746. package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
  747. package/static/dist/assets/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
  748. package/static/dist/assets/refresh-abtu93ke.js +0 -1
  749. package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
  750. package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
  751. package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
  752. package/static/dist/assets/root-mbklpuv4.js +0 -1
  753. package/static/dist/assets/saved-girnabkf.js +0 -1
  754. package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
  755. package/static/dist/assets/share._token-kl0r7ido.js +0 -2
  756. package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
  757. package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
  758. package/static/dist/assets/src-hjyib4mu.js +0 -1
  759. package/static/dist/assets/sse-iwku0sjo.js +0 -1
  760. package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
  761. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
  762. package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.js +0 -1
  763. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
  764. package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
  765. package/static/dist/assets/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
  766. package/static/dist/assets/treemap-WGGIJYW6-nl85071a.js +0 -1
  767. package/static/dist/assets/units-kgxzxfhi.js +0 -1
  768. package/static/dist/assets/untitled-cikfjntn.js +0 -1
  769. package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
  770. package/static/dist/assets/useLocale-o59tbiea.js +0 -1
  771. package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
  772. package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
  773. package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
  774. /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
@@ -0,0 +1,914 @@
1
+ import { unavailableContextDetail } from '@maudecode/talaria-web-contracts';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { OWNER_EXPORT_MAX_BYTES, SessionNoticeSchema, GatewayClarifyBatchSchema, GatewaySessionResultSchema } from '@maudecode/talaria-web-contracts';
4
+ import { redactNestedMessageContainers, publicToolFrame, redactString } from '../redact.js';
5
+ import { str } from '../util.js';
6
+ import { PendingPrompts } from './pending.js';
7
+ import { wrapExportHtml } from './export.js';
8
+ import { clarifyReply } from './pending.js';
9
+ import { HttpFailure } from './service.js';
10
+ import { SessionNotices } from './notices.js';
11
+ import { SessionEventBus } from './events.js';
12
+ import { messageWindowForDisplay, messagesForLimitedPayload } from './window.js';
13
+ import { pendingUserRow } from './merge.js';
14
+ import { ReasoningTitleTracker, reasoningEventPayload } from './reasoning-titles.js';
15
+ import { CANONICAL_READ_ONLY_REASON, WEB_DIAGNOSTIC_REQUEST_PREFIX } from './state-db.js';
16
+ import { toolProgress } from './tool-display.js';
17
+ const ownerStreamPrefix = (home) => `owner-${createHash('sha256').update(home).digest('hex').slice(0, 16)}-`;
18
+ const ownerStateId = (identity) => `owner-${createHash('sha256').update(identity).digest('hex')}`;
19
+ /** The scope remains verifiable after a server restart, before a journal lookup or stream subscription. */
20
+ export const gatewayStreamVisible = (stream, home) => !stream.startsWith('owner-') || stream.startsWith(ownerStreamPrefix(home));
21
+ /** The server's one classification of why an owner cannot start a diagnostic chat; clients word the code. */
22
+ function unavailableReason(result) {
23
+ if (result.state === 'stopped')
24
+ return 'gateway_stopped';
25
+ if (result.reason === 'served_profile_sessions_unavailable')
26
+ return 'served_profile';
27
+ if (result.state === 'incompatible')
28
+ return 'agent_unsupported';
29
+ return 'gateway_unavailable';
30
+ }
31
+ /** A preview can be absent in a valid native receipt; only original nonblank text can become a retry draft. */
32
+ function retryText(admission) {
33
+ const text = admission.text;
34
+ return typeof text === 'string' && text.trim() ? text : null;
35
+ }
36
+ /** Steering belongs to the current turn; it must never replace that turn's transcript anchor. */
37
+ const runningAdmission = (snapshot) => snapshot.pending.find((p) => p.status === 'started' && !p.steering);
38
+ const sameExecution = (a, b) => a.authority_epoch === b.authority_epoch && a.replay_epoch === b.replay_epoch && a.execution_generation === b.execution_generation;
39
+ /** Native counters and the owner's compact turn-end usage share one existing Web usage shape. */
40
+ function ownerUsage(data) {
41
+ const fields = {
42
+ input_tokens: ['prompt_tokens', 'prompt', 'input_tokens', 'input'], output_tokens: ['completion_tokens', 'completion', 'output_tokens', 'output'],
43
+ cache_read_tokens: ['cache_read_tokens'], cache_write_tokens: ['cache_write_tokens'],
44
+ estimated_cost: ['estimated_cost_usd'], last_prompt_tokens: ['last_prompt_tokens', 'context_used'],
45
+ context_length: ['context_length', 'context_max'], cache_hit_percent: ['cache_hit_pct'], tps: ['tokens_per_s', 'avg_tps'],
46
+ };
47
+ const usage = {};
48
+ for (const [field, keys] of Object.entries(fields)) {
49
+ const value = keys.map((key) => data[key]).find((value) => typeof value === 'number' && Number.isFinite(value) && value >= 0);
50
+ if (value !== undefined)
51
+ usage[field] = value;
52
+ }
53
+ return usage;
54
+ }
55
+ /** Translate only owner-confirmed outcomes; an unknown receipt never means applied. */
56
+ function modelChange(receipt, selection = {}) {
57
+ const payload = receipt.payload && typeof receipt.payload === 'object' ? receipt.payload : selection;
58
+ const model = str(receipt.target_model) || str(payload.model) || str(receipt.model);
59
+ const provider = Object.hasOwn(receipt, 'target_provider') ? receipt.target_provider : payload.provider;
60
+ const target = { ...(model ? { model } : {}), ...(provider === null || typeof provider === 'string' ? { provider } : {}) };
61
+ if (receipt.operation !== 'model')
62
+ return { state: 'refused', message: 'The owner did not confirm the model change' };
63
+ if (receipt.status === 'deferred')
64
+ return { state: 'deferred', ...target };
65
+ if (receipt.status === 'confirmation_required' && typeof receipt.confirm === 'string' && receipt.confirm && model)
66
+ return { state: 'confirmation_required', message: str(receipt.confirm_message), confirm: receipt.confirm, ...target };
67
+ if (receipt.status === undefined && Number.isInteger(receipt.revision))
68
+ return { state: 'applied' };
69
+ return { state: 'refused', message: str(receipt.reason || receipt.message) || 'The owner did not confirm the model change' };
70
+ }
71
+ export class GatewaySessions {
72
+ deps;
73
+ watches = new Map();
74
+ runWorkers = new Set();
75
+ observations = new Map();
76
+ noticeEpochs = new Map();
77
+ notices;
78
+ modelMutations = new Map();
79
+ modelChanges = new Map();
80
+ rememberModelChange(target, snapshot, change) {
81
+ this.modelChanges.set(target.key, { epoch: snapshot.authority_epoch, replay: snapshot.replay_epoch, change });
82
+ }
83
+ currentModelChange(target, snapshot) {
84
+ const saved = this.modelChanges.get(target.key);
85
+ if (!saved || !snapshot)
86
+ return undefined;
87
+ if (saved.epoch === snapshot.authority_epoch && saved.replay === snapshot.replay_epoch)
88
+ return saved.change;
89
+ this.modelChanges.delete(target.key);
90
+ return undefined;
91
+ }
92
+ constructor(deps) {
93
+ this.deps = deps;
94
+ this.notices = new SessionNotices(deps.now);
95
+ }
96
+ addNativeNotice(target, key, frame) {
97
+ const text = typeof frame.text === 'string' ? frame.text.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '') : '';
98
+ this.notices.add(target.key, { ...frame, key, text, lapses_with_agent: true });
99
+ }
100
+ noticeState(target, snapshot, reset = false) {
101
+ const identity = ownerStateId(JSON.stringify([target.key, snapshot.authority_epoch, snapshot.replay_epoch]));
102
+ let state = this.noticeEpochs.get(target.key);
103
+ if (state?.identity !== identity || reset) {
104
+ this.notices.reset(target.key);
105
+ state = { identity, sequence: reset ? snapshot.last_sequence : 0 };
106
+ this.noticeEpochs.set(target.key, state);
107
+ }
108
+ const warning = typeof snapshot.info.config_warning === 'string' ? snapshot.info.config_warning : '';
109
+ if (warning.trim())
110
+ this.addNativeNotice(target, `${identity}:config-warning`, { text: warning, level: 'warn' });
111
+ return state;
112
+ }
113
+ nativeNotices(target, snapshot) {
114
+ const observed = this.observations.get(target.key)?.snapshot;
115
+ this.noticeState(target, observed && observed.authority_epoch >= snapshot.authority_epoch ? observed : snapshot);
116
+ // A detail row may already contain our projection. Read the direct layer itself so
117
+ // retained transport bases cannot duplicate warnings or resurrect cleared notices.
118
+ const direct = SessionNoticeSchema.array().safeParse(this.deps.service.deps.runtime.sessionNotices?.(target.sid) ?? []);
119
+ return [...(direct.success ? direct.data : []), ...this.notices.list(target.key)];
120
+ }
121
+ changed(target) {
122
+ this.deps.channels.emit(target.sid, 'session-updated', { session_id: target.sid, source: 'native_owner' }, target.profile);
123
+ }
124
+ /** One shared connection, acquired by viewers and run projections, with no local Agent admission. */
125
+ transport(target, base, snapshot) {
126
+ const prior = this.observations.get(target.key);
127
+ if (prior && !prior.controller.signal.aborted)
128
+ return prior;
129
+ const observation = { controller: new AbortController(), snapshot, replaying: true, completion: null, listeners: new Set(), leases: 0, ended: Promise.resolve({ state: 'unavailable', reason: 'owner_connection_lost', snapshot: null, receipt: null }) };
130
+ this.observations.set(target.key, observation);
131
+ this.noticeState(target, snapshot);
132
+ observation.ended = (async () => {
133
+ const showReasoning = await this.deps.showReasoning(target.home).catch(() => false);
134
+ const sidecar = this.deps.sidecar();
135
+ if (!sidecar || observation.controller.signal.aborted)
136
+ return { state: 'unavailable', reason: 'sidecar_unavailable', snapshot: null, receipt: null };
137
+ return sidecar.call('gateway.session', { profile_home: target.home, session_id: target.sid, action: 'watch', show_reasoning: showReasoning }, {
138
+ signal: observation.controller.signal, timeoutMs: 0,
139
+ onStream: (frame) => {
140
+ if (observation.controller.signal.aborted || this.observations.get(target.key) !== observation)
141
+ return;
142
+ if (frame.event === 'snapshot') {
143
+ const result = GatewaySessionResultSchema.parse(frame.data);
144
+ if (result.snapshot?.session_id !== target.sid)
145
+ return;
146
+ const completed = observation.completion?.data;
147
+ if (result.replay_gap || completed && (completed.authority_epoch !== result.snapshot.authority_epoch || completed.replay_epoch !== result.snapshot.replay_epoch))
148
+ observation.completion = null;
149
+ observation.snapshot = result.snapshot;
150
+ observation.replaying = frame.data.replaying === true;
151
+ this.noticeState(target, result.snapshot, result.replay_gap === true);
152
+ if ((result.snapshot.running || result.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started')) && !this.watches.has(target.key))
153
+ this.watch(target, base, result.snapshot);
154
+ this.changed(target);
155
+ }
156
+ else if (frame.event === 'replay_complete') {
157
+ observation.replaying = false;
158
+ }
159
+ else if (frame.event === 'event') {
160
+ const event = frame.data;
161
+ const data = (event.payload ?? {});
162
+ if (event.type === 'notification.show' || event.type === 'notification.clear') {
163
+ const snap = observation.snapshot;
164
+ const state = this.noticeState(target, snap);
165
+ if (event.session_id !== target.sid || event.replay_epoch !== snap.replay_epoch
166
+ || event.authority_epoch !== undefined && event.authority_epoch !== snap.authority_epoch
167
+ || !Number.isSafeInteger(event.seq) || Number(event.seq) <= state.sequence)
168
+ return;
169
+ state.sequence = Number(event.seq);
170
+ const key = typeof data.key === 'string' ? data.key : typeof data.id === 'string' ? data.id : '';
171
+ if (!key)
172
+ return;
173
+ const scopedKey = `${state.identity}:plugin:${ownerStateId(key)}`;
174
+ if (event.type === 'notification.clear')
175
+ this.notices.clear(target.key, scopedKey);
176
+ else
177
+ this.addNativeNotice(target, scopedKey, data);
178
+ this.changed(target);
179
+ }
180
+ else if (event.type === 'session.info') {
181
+ if (data.authority_epoch !== observation.snapshot.authority_epoch || Number(data.execution_generation) < observation.snapshot.execution_generation)
182
+ return;
183
+ observation.snapshot = { ...observation.snapshot, ...data };
184
+ if ((observation.snapshot.running || observation.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started')) && !this.watches.has(target.key))
185
+ this.watch(target, base, observation.snapshot);
186
+ this.changed(target);
187
+ }
188
+ else if (event.type === 'message.complete' && event.session_id === target.sid
189
+ && event.authority_epoch === observation.snapshot.authority_epoch && event.replay_epoch === observation.snapshot.replay_epoch
190
+ && Number.isSafeInteger(event.execution_generation) && Number(event.execution_generation) >= observation.snapshot.execution_generation) {
191
+ observation.completion = frame;
192
+ }
193
+ else if (event.type === 'session.updated')
194
+ this.changed(target);
195
+ }
196
+ for (const listener of observation.listeners)
197
+ listener(frame);
198
+ },
199
+ });
200
+ })().catch(() => ({ state: 'unavailable', reason: 'owner_connection_lost', snapshot: null, receipt: null })).finally(() => {
201
+ observation.controller.abort();
202
+ if (this.observations.get(target.key) === observation)
203
+ this.observations.delete(target.key);
204
+ this.changed(target);
205
+ });
206
+ return observation;
207
+ }
208
+ lease(observation) {
209
+ observation.leases++;
210
+ let held = true;
211
+ return () => { if (!held)
212
+ return; held = false; if (--observation.leases === 0)
213
+ observation.controller.abort(); };
214
+ }
215
+ /** Called only after the existing HTTP owner has authorized and claimed a viewer's stream slot. */
216
+ async observe(sid, profile, signal) {
217
+ const target = await this.target(sid, profile);
218
+ if (!target || signal.aborted)
219
+ return null;
220
+ const base = await this.deps.service.detail(sid, {});
221
+ const result = await this.call(target, { action: 'snapshot' }, signal);
222
+ if (signal.aborted)
223
+ return null;
224
+ if (!result.snapshot || result.state !== 'attached')
225
+ return { release: () => undefined, ended: Promise.resolve(result) };
226
+ const observation = this.transport(target, base, result.snapshot);
227
+ const release = this.lease(observation);
228
+ signal.addEventListener('abort', release, { once: true });
229
+ return { release: () => { signal.removeEventListener('abort', release); release(); }, ended: observation.ended };
230
+ }
231
+ async target(sid, profile = this.deps.activeProfile()) {
232
+ if (sid.length === 0 || sid !== sid.trim())
233
+ return null;
234
+ const owner = (await this.deps.service.stateDbSources([sid], profile))?.get(sid);
235
+ if (typeof owner !== 'object')
236
+ return null;
237
+ if (owner.reason)
238
+ return null;
239
+ const home = this.deps.profileHome(profile);
240
+ return { sid, profile, home, key: JSON.stringify([home, sid]) };
241
+ }
242
+ async contextDetail(sid, expectedKey) {
243
+ const profile = this.deps.activeProfile();
244
+ const target = await this.target(sid, profile);
245
+ if (!target)
246
+ return unavailableContextDetail();
247
+ const result = await this.call(target, { action: 'context_detail' });
248
+ return profile === this.deps.activeProfile() && result.state === 'attached' && this.contextDetailKey(target, result.snapshot) === expectedKey ? result.context_detail ?? unavailableContextDetail('unsupported') : unavailableContextDetail('changed');
249
+ }
250
+ async isOwned(sid) { return (await this.target(sid)) !== null; }
251
+ async export(sid, format) {
252
+ const target = await this.target(sid);
253
+ if (!target)
254
+ return null;
255
+ const redact = this.deps.redactEnabled();
256
+ const result = await this.call(target, { action: 'export', format, redact });
257
+ const value = result.export;
258
+ if (result.reason === 'export_too_large')
259
+ throw new HttpFailure(413, 'The owner transcript exceeds the export limit');
260
+ if (result.state !== 'attached' || value?.format !== format) {
261
+ throw new HttpFailure(409, 'The Agent owner cannot export this chat. Check that its gateway is running and supports transcript export.', { code: 'owner_export_unavailable' });
262
+ }
263
+ if (Buffer.byteLength(value.content, 'utf8') > OWNER_EXPORT_MAX_BYTES)
264
+ throw new HttpFailure(413, 'The owner transcript exceeds the export limit');
265
+ let content;
266
+ try {
267
+ // The owner redacts HTML's structured transcript before rendering. A shell/text redactor corrupts its markup.
268
+ content = format === 'html' ? wrapExportHtml(value.content) : format === 'json'
269
+ ? JSON.stringify(redactNestedMessageContainers(JSON.parse(value.content), redact), null, 2)
270
+ : redactString(value.content, redact);
271
+ }
272
+ catch {
273
+ throw new HttpFailure(409, 'The Agent owner returned an invalid transcript export', { code: 'owner_export_invalid' });
274
+ }
275
+ if (Buffer.byteLength(content, 'utf8') > OWNER_EXPORT_MAX_BYTES)
276
+ throw new HttpFailure(413, 'The owner transcript exceeds the export limit');
277
+ return { ...value, content };
278
+ }
279
+ async createCall(params) {
280
+ const sidecar = this.deps.sidecar();
281
+ if (!sidecar)
282
+ return { state: 'unavailable', reason: 'sidecar_unavailable', snapshot: null, receipt: null };
283
+ try {
284
+ return await sidecar.call('gateway.create', params, { timeoutMs: 35_000 });
285
+ }
286
+ catch {
287
+ return { state: 'unavailable', reason: 'owner_connection_lost', snapshot: null, receipt: null };
288
+ }
289
+ }
290
+ /** TAL-1040: normal always runs; the bypass modes need an owner that freezes them before any Agent import. */
291
+ async modes(profile) {
292
+ const result = await this.createCall({ profile_home: this.deps.profileHome(profile), probe: true });
293
+ const reason = result.state === 'attached' ? null : unavailableReason(result);
294
+ // Owner chats take no file attachments (`submit` refuses them), so a fresh chat in either bypass mode cannot attach.
295
+ return { modes: [{ mode: 'normal', available: true, reason: null, can_attach: true }, ...['ignore_config', 'safe'].map((mode) => ({ mode, available: reason === null, reason, can_attach: false }))] };
296
+ }
297
+ /**
298
+ * TAL-1040: the owner mints a diagnostic chat, freezes its bypass in the creation receipt and runs each turn in a fresh
299
+ * private worker. Talaria keeps no local Session and never falls back to an ordinary chat; no credential is sent.
300
+ */
301
+ async create(profile, creationId, params) {
302
+ // The client's creation id survives a lost response, so a retry recovers the owner's committed session, never a second one.
303
+ const result = await this.createCall({ ...params, profile_home: this.deps.profileHome(profile), request_id: WEB_DIAGNOSTIC_REQUEST_PREFIX + (creationId ?? randomUUID()) });
304
+ if (result.state !== 'attached' || !result.snapshot) {
305
+ throw new HttpFailure(409, 'The Agent cannot start a chat in this mode', { code: 'execution_mode_unavailable', reason: unavailableReason(result) });
306
+ }
307
+ return result.snapshot.session_id;
308
+ }
309
+ async call(target, params, signal) {
310
+ const sidecar = this.deps.sidecar();
311
+ if (!sidecar)
312
+ return { state: 'unavailable', reason: 'sidecar_unavailable', snapshot: null, receipt: null };
313
+ const before = this.modelChanges.get(target.key);
314
+ const modelMutation = params.action === 'mutate' && params.operation === 'model';
315
+ if (modelMutation)
316
+ this.modelMutations.set(target.key, (this.modelMutations.get(target.key) ?? 0) + 1);
317
+ try {
318
+ const result = await sidecar.call('gateway.session', { ...params, profile_home: target.home, session_id: target.sid }, { timeoutMs: params.action === 'mutate' ? 675_000 : 35_000, ...(signal ? { signal } : {}) });
319
+ if (params.action === 'mutate' && params.operation === 'model' && result.snapshot) {
320
+ const change = modelChange(result.receipt ?? {}, params.payload);
321
+ // The stream can resolve a deferred pick before its HTTP ACK returns. Keep the later observation.
322
+ if (change.state !== 'deferred' || this.modelChanges.get(target.key) === before
323
+ || !this.currentModelChange(target, result.snapshot))
324
+ this.rememberModelChange(target, result.snapshot, change);
325
+ }
326
+ const change = this.currentModelChange(target, result.snapshot);
327
+ return { ...result, ...(change ? { model_change: change } : {}) };
328
+ }
329
+ catch {
330
+ return { state: 'unavailable', reason: 'owner_connection_lost', snapshot: null, receipt: null };
331
+ }
332
+ finally {
333
+ if (modelMutation) {
334
+ const remaining = (this.modelMutations.get(target.key) ?? 1) - 1;
335
+ if (remaining)
336
+ this.modelMutations.set(target.key, remaining);
337
+ else {
338
+ this.modelMutations.delete(target.key);
339
+ this.watches.get(target.key)?.reconcile?.();
340
+ }
341
+ }
342
+ }
343
+ }
344
+ attachment(result) {
345
+ const snapshot = result.snapshot;
346
+ const unknown = snapshot?.pending.some((p) => p.status === 'unknown') ?? false;
347
+ const restarting = result.restarting === true;
348
+ const value = {
349
+ state: result.state, reason: result.reason, restarting, can_submit: result.state === 'attached' && snapshot !== null && !unknown && !restarting,
350
+ can_interrupt: result.state === 'attached' && snapshot?.running === true, can_attach: false,
351
+ revision: snapshot?.revision ?? null, execution_generation: snapshot?.execution_generation ?? null,
352
+ ...(result.model_change ? { model_change: result.model_change } : {}),
353
+ active_admission: snapshot ? runningAdmission(snapshot) ?? null : null,
354
+ admissions: (snapshot?.pending ?? []).filter((p) => p.status === 'queued' || p.status === 'unknown').map((p) => ({ ...p,
355
+ actions: p.status === 'queued' ? ['cancel', ...(p.controls?.includes('steer') ? ['steer'] : []), ...(p.controls?.includes('replace') ? ['edit'] : [])]
356
+ : p.execution_generation === null ? []
357
+ : retryText(p) === null ? ['discard'] : ['retry', 'discard'],
358
+ })),
359
+ };
360
+ return redactNestedMessageContainers(value, this.deps.redactEnabled());
361
+ }
362
+ contextDetailKey(target, snapshot) {
363
+ return snapshot ? ownerStateId(JSON.stringify([target.key, snapshot.authority_epoch, snapshot.replay_epoch, snapshot.revision, snapshot.execution_generation, snapshot.info, snapshot.last_sequence])) : null;
364
+ }
365
+ async view(base, result, stream, target, limit = 120, before = null, withMessages = true) {
366
+ const snapshot = result.snapshot;
367
+ const fields = { ...base, owner_attachment: this.attachment({ ...result, model_change: this.currentModelChange(target, snapshot) }), composer_state_key: ownerStateId(target.key), context_detail_key: this.contextDetailKey(target, snapshot), active_stream_id: stream, is_streaming: Boolean(stream) };
368
+ if (snapshot) {
369
+ fields.notices = this.nativeNotices(target, snapshot);
370
+ const observed = this.watches.get(target.key)?.snapshot;
371
+ const nativeRows = [...snapshot.messages];
372
+ const active = stream ? runningAdmission(snapshot) : null;
373
+ let start = active ? nativeRows.findIndex((m) => m.role === 'user' && m.message_id === active.admission_id) : -1;
374
+ if (active && stream && start < 0) {
375
+ start = nativeRows.length;
376
+ nativeRows.push({ ...pendingUserRow(active.text ?? '', [], null, str(snapshot.info.source) || 'gateway', stream), message_id: active.admission_id });
377
+ }
378
+ const messages = start < 0 ? nativeRows : nativeRows.map((row, index) => index >= start ? { ...row, _turn_id: stream } : row);
379
+ const projected = withMessages ? this.deps.service.foreignMessages(messages, base) : [];
380
+ const [rows, offset] = messageWindowForDisplay(projected, limit, before);
381
+ const model = str(snapshot.info.model) || str(base.model) || null;
382
+ const provider = Object.hasOwn(snapshot.info, 'provider')
383
+ ? str(snapshot.info.provider) || null : str(base.model_provider) || null;
384
+ Object.assign(fields, { messages: limit === null ? rows : messagesForLimitedPayload(rows), message_count: Math.max(snapshot.message_count, nativeRows.length), _messages_offset: offset, _messages_truncated: offset > 0,
385
+ title: str(snapshot.info.title) || base.title, model: str(snapshot.info.model) || base.model,
386
+ model_provider: provider, model_option_id: this.deps.service.deps.modelOptionFor?.(model, provider) ?? null,
387
+ workspace: str(snapshot.info.cwd) || base.workspace, active_stream_id: stream, is_streaming: Boolean(stream), agent_running: snapshot.running,
388
+ transcript_seq: stream ? { stream_id: stream, seq: 0 } : null,
389
+ tool_calls: withMessages && before === null && stream && snapshot.running && observed && sameExecution(snapshot, observed)
390
+ ? this.deps.service.deps.runtime.liveToolProgress?.(stream) ?? [] : [],
391
+ });
392
+ fields.workspace_name = (await this.deps.service.workspaceNames([fields]))(fields);
393
+ }
394
+ return redactNestedMessageContainers(fields, this.deps.redactEnabled());
395
+ }
396
+ async project(base, limit = 120, before = null, withMessages = true) {
397
+ // The wire's existing owner lock already classified ordinary sessions, including cached pages.
398
+ if (base.read_only_reason !== CANONICAL_READ_ONLY_REASON)
399
+ return base;
400
+ const target = await this.target(str(base.session_id), str(base.profile) || this.deps.activeProfile());
401
+ if (!target)
402
+ return base;
403
+ const result = await this.call(target, { action: 'snapshot' });
404
+ let watch = this.watches.get(target.key);
405
+ if (result.state !== 'attached') {
406
+ watch?.controller.abort();
407
+ watch = undefined;
408
+ }
409
+ if (result.snapshot && (result.snapshot.running || result.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started')) && !watch)
410
+ watch = this.watch(target, base, result.snapshot);
411
+ return this.view(base, result, watch?.stream ?? null, target, limit, before, withMessages);
412
+ }
413
+ /** Called before the direct-chat admission path, including for an already materialized foreign session. */
414
+ async submit(sid, body, timing) {
415
+ const target = await this.target(sid);
416
+ if (!target)
417
+ return null;
418
+ const text = str(body.message).trim();
419
+ if (!text)
420
+ throw new HttpFailure(400, 'message is required');
421
+ // Native policy is frozen by its owner. Changing model/workspace travels through session.mutate,
422
+ // never through a hidden per-turn override or the local Agent setup path.
423
+ const closeSnapshot = timing?.begin('owner_snapshot');
424
+ const before = await this.call(target, { action: 'snapshot' });
425
+ closeSnapshot?.(before.state === 'unavailable' ? 'unknown' : before.state === 'attached' ? 'ok' : 'refused');
426
+ if (!this.attachment(before).can_submit)
427
+ throw new HttpFailure(before.state === 'attached' ? 409 : 403, 'The owning Agent is unavailable or needs an explicit recovery decision', { owner_attachment: this.attachment(before) });
428
+ if (typeof body.submission_id !== 'string' || !body.submission_id || body.submission_id.length > 128)
429
+ throw new HttpFailure(400, 'A stable submission_id is required for an owner chat');
430
+ if (Array.isArray(body.attachments) && body.attachments.length)
431
+ throw new HttpFailure(400, 'File attachments are unavailable through this owner connection', { code: 'owner_attachments_unavailable' });
432
+ // Resolve display state before admission; a failed post-ACK read must never turn accepted work into a refusal.
433
+ const base = await (timing ? timing.measure('owner_detail', () => this.deps.service.detail(sid, {})) : this.deps.service.detail(sid, {}));
434
+ const closeSubmit = timing?.begin('owner_submit');
435
+ const result = await this.call(target, { action: 'submit', request_id: body.submission_id, text });
436
+ closeSubmit?.(result.receipt ? 'ok' : result.state === 'unavailable' ? 'unknown' : 'refused');
437
+ if (result.state === 'attached' && result.snapshot && result.receipt?.voice_stopped === true) {
438
+ const watch = this.watches.get(target.key);
439
+ return { ok: true, status: 'suppressed', reason: 'voice_stopped', session_id: sid,
440
+ owner_attachment: this.attachment(result), session: await this.view(base, result, watch?.stream ?? null, target) };
441
+ }
442
+ if (!result.receipt || !('admission_id' in result.receipt))
443
+ throw new HttpFailure(409, 'The owner did not confirm this admission. Reconcile it before resending.', { owner_attachment: this.attachment(result), outcome_unknown: result.state === 'unavailable' });
444
+ const snapshot = result.snapshot;
445
+ // A fast refusal can settle before submit returns; its retained completion still belongs to this input.
446
+ const refused = result.receipt.status === 'terminal' && result.receipt.outcome === 'failed';
447
+ const watch = snapshot && (refused || snapshot.running || snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started'))
448
+ ? this.watches.get(target.key) ?? this.watch(target, base, snapshot, refused ? str(result.receipt.admission_id) : undefined) : null;
449
+ this.deps.events.publish('owner_admission', { profile: target.profile, sessionId: sid });
450
+ return { session_id: sid, ...(watch ? { stream_id: watch.stream, turn_id: watch.stream } : {}), owner_attachment: this.attachment(result), admission_id: result.receipt.admission_id, session: await this.view(base, result, watch?.stream ?? null, target) };
451
+ }
452
+ async action(sid, params) {
453
+ const target = await this.target(sid);
454
+ if (!target)
455
+ throw new HttpFailure(403, 'This session has no canonical owner');
456
+ if (params.action === 'mutate' && params.operation === 'workspace') {
457
+ try {
458
+ await this.deps.service.deps.workspaces.resolveTrusted(str(params.payload?.cwd), target.profile);
459
+ }
460
+ catch {
461
+ throw new HttpFailure(400, 'The workspace must be trusted before selecting it');
462
+ }
463
+ }
464
+ const result = await this.call(target, params);
465
+ if (result.state !== 'attached' || !result.snapshot)
466
+ throw new HttpFailure(409, 'The owning Agent refused the action', { owner_attachment: this.attachment(result) });
467
+ this.deps.events.publish('owner_changed', { profile: target.profile, sessionId: sid });
468
+ return result;
469
+ }
470
+ /** The display preview is redacted; an explicit retry returns the original text for review, like direct-chat retry. */
471
+ async retry(sid, admissionId, generation) {
472
+ const target = await this.target(sid);
473
+ if (!target)
474
+ throw new HttpFailure(403, 'This session has no canonical owner');
475
+ const current = await this.call(target, { action: 'snapshot' });
476
+ const admission = current.snapshot?.pending.find((p) => p.admission_id === admissionId && p.status === 'unknown' && p.execution_generation === generation);
477
+ if (!admission)
478
+ throw new HttpFailure(409, 'The unknown admission is stale');
479
+ const text = retryText(admission);
480
+ if (text === null)
481
+ throw new HttpFailure(409, 'The original input text is unavailable; inspect the owner before discarding this work');
482
+ await this.action(sid, { action: 'discard', admission_id: admissionId, execution_generation: generation });
483
+ return text;
484
+ }
485
+ prompts(snapshot, sid, batch) {
486
+ const pending = new PendingPrompts(new SessionEventBus(), this.deps.now);
487
+ for (const prompt of snapshot?.prompts ?? []) {
488
+ const data = { ...prompt, session_id: sid, request_id: prompt.prompt_id, timeout_seconds: 0, allowed_choices: prompt.choices, can_enable_yolo: false };
489
+ if (prompt.kind === 'approval')
490
+ pending.submitApproval(sid, { ...data, approval_id: prompt.prompt_id });
491
+ else if (prompt.kind === 'clarify')
492
+ pending.submitClarify(sid, { ...data, clarify_id: prompt.prompt_id });
493
+ }
494
+ // A fully locked batch waits only for the owner's withdrawal; nothing is left to ask.
495
+ if (batch?.remaining.length) {
496
+ const entry = pending.submitClarify(sid, { session_id: sid, clarify_id: batch.request_id, request_id: batch.request_id, timeout_seconds: 0, questions: batch.questions });
497
+ for (const step of entry.steps)
498
+ step.answered = !batch.remaining.includes(step.qid);
499
+ }
500
+ return pending;
501
+ }
502
+ /** The batch the target's live watch received; the owner asks it once, of the viewers attached when it parks. */
503
+ batch(target) { return this.watches.get(target.key)?.batch ?? null; }
504
+ /** Locks each answer; the owner settles the batch on the lock that leaves nothing open. */
505
+ async lockBatch(target, batch, answers) {
506
+ for (const [qid, answer] of Object.entries(answers)) {
507
+ const result = await this.call(target, { action: 'clarify_lock', request_id: batch.request_id, question_id: qid, answer: Array.isArray(answer) ? JSON.stringify(answer) : answer });
508
+ if (result.state === 'attached' && result.lock?.status === 'ok') {
509
+ batch.remaining = result.lock.remaining ?? [];
510
+ continue;
511
+ }
512
+ if (result.lock?.status === 'expired')
513
+ batch.remaining = [];
514
+ // An unconfirmed lock keeps the card and its answers for a retry; an ended batch or a refusal is stale.
515
+ throw new HttpFailure(result.state === 'unavailable' ? 503 : 409, 'The owning Agent did not accept this answer', { owner_attachment: this.attachment(result) });
516
+ }
517
+ }
518
+ async pending(sid, kind) {
519
+ const target = await this.target(sid);
520
+ if (!target)
521
+ throw new HttpFailure(404, 'Session not found');
522
+ const result = await this.call(target, { action: 'snapshot' });
523
+ const pending = this.prompts(result.snapshot, sid, this.batch(target));
524
+ const envelope = kind === 'approval' ? pending.approvalPending(sid) : pending.clarifyPending(sid);
525
+ return { pending: envelope.pending ? redactNestedMessageContainers(envelope.pending, this.deps.redactEnabled()) : null, pending_count: envelope.pending_count };
526
+ }
527
+ async respond(sid, kind, id, value) {
528
+ const target = await this.target(sid);
529
+ if (!target)
530
+ return false;
531
+ const current = await this.call(target, { action: 'snapshot' });
532
+ const batch = this.batch(target);
533
+ const pending = this.prompts(current.snapshot, sid, batch);
534
+ if (current.state !== 'attached')
535
+ throw new HttpFailure(403, 'This canonical session is read-only while its owner is unavailable');
536
+ if (kind === 'clarify' && batch?.remaining.length && batch.request_id === id) {
537
+ const entry = pending.peekClarify(sid, id);
538
+ const reply = entry && value !== null ? clarifyReply(entry, value) : null;
539
+ if (reply === null)
540
+ throw new HttpFailure(400, 'Answer every question in the pending clarification');
541
+ await this.lockBatch(target, batch, JSON.parse(reply).answers);
542
+ return true;
543
+ }
544
+ const prompt = current.snapshot?.prompts.find((p) => p.kind === kind && p.prompt_id === id);
545
+ if (!prompt)
546
+ throw new HttpFailure(409, 'The owner prompt is stale');
547
+ let text = '';
548
+ if (kind === 'clarify') {
549
+ const entry = pending.peekClarify(sid, id);
550
+ const answer = entry && value !== null ? clarifyReply(entry, value) : null;
551
+ if (answer === null)
552
+ throw new HttpFailure(400, 'Answer every question in the pending clarification');
553
+ text = answer;
554
+ }
555
+ await this.action(sid, { action: kind, prompt_id: id, execution_generation: Number(prompt.execution_generation), ...(kind === 'approval' ? { choice: str(value) } : { text }) });
556
+ if (kind === 'approval')
557
+ pending.resolveApproval(sid, id);
558
+ else
559
+ pending.resolveClarify(sid, id);
560
+ return true;
561
+ }
562
+ async cancel(stream) {
563
+ const found = [...this.watches.entries()].find(([, w]) => w.stream === stream);
564
+ if (!found)
565
+ return null;
566
+ const [key, watch] = found;
567
+ const [home, sid] = JSON.parse(key);
568
+ // A request bound to another profile must never control this watch.
569
+ if (this.deps.profileHome(this.deps.activeProfile()) !== home)
570
+ throw new HttpFailure(404, 'Session not found');
571
+ if (!watch.snapshot.running)
572
+ return false;
573
+ await this.action(sid, { action: 'interrupt', execution_generation: watch.snapshot.execution_generation });
574
+ return true;
575
+ }
576
+ watch(target, base, snapshot, admissionId) {
577
+ const watch = { stream: `${ownerStreamPrefix(target.home)}${randomUUID()}`, controller: new AbortController(), snapshot, batch: null, restarting: false };
578
+ this.watches.set(target.key, watch);
579
+ const observation = this.transport(target, base, snapshot);
580
+ const release = this.lease(observation);
581
+ let activeAdmission = admissionId ?? runningAdmission(snapshot)?.admission_id ?? snapshot.pending.find((p) => !p.steering)?.admission_id;
582
+ let receive = null;
583
+ const buffered = [{ event: 'snapshot', seq: 0, data: { state: 'attached', reason: null, snapshot, receipt: null, replaying: true } }];
584
+ const completed = observation.completion?.data;
585
+ if (completed?.authority_epoch === snapshot.authority_epoch && completed.replay_epoch === snapshot.replay_epoch
586
+ && completed.execution_generation === snapshot.execution_generation && (completed.payload ?? {}).admission_id === activeAdmission)
587
+ buffered.push(observation.completion);
588
+ if (!observation.replaying)
589
+ buffered.push({ event: 'replay_complete', seq: 0, data: {} });
590
+ const listener = (frame) => {
591
+ if (receive)
592
+ receive(frame);
593
+ else if (buffered.length < 4096)
594
+ buffered.push(frame);
595
+ else
596
+ watch.controller.abort();
597
+ };
598
+ observation.listeners.add(listener);
599
+ watch.controller.signal.addEventListener('abort', () => { observation.listeners.delete(listener); release(); }, { once: true });
600
+ const registry = this.deps.registry;
601
+ const channel = registry.create(watch.stream, target.sid);
602
+ registry.registerActiveRun({ stream_id: watch.stream, session_id: target.sid, phase: 'running', started_at: this.deps.now(), workspace: str(base.workspace), model: str(base.model) || null, provider: null, ephemeral: false, origin: 'user' });
603
+ let chain = Promise.resolve();
604
+ let terminal = false;
605
+ let streamError = null;
606
+ let closeWriter = null;
607
+ const enqueue = (work) => {
608
+ chain = chain.then(async () => { if (!terminal && !streamError)
609
+ await work(); })
610
+ .catch((error) => { streamError = error; watch.controller.abort(); });
611
+ };
612
+ const worker = async () => {
613
+ // Same persisted IDs can exist in separate homes. Native observation journals must not
614
+ // join the sid-only direct-chat journal; the owner retains the canonical transcript.
615
+ const journalSession = ownerStateId(target.key);
616
+ const writer = await this.deps.journal.writer(journalSession, watch.stream);
617
+ closeWriter = writer;
618
+ const showReasoning = await this.deps.showReasoning(target.home).catch(() => false);
619
+ let completion = null;
620
+ let replaying = true;
621
+ let usage = {};
622
+ let reasoning = '';
623
+ let titles = new ReasoningTitleTracker();
624
+ const calls = registry.liveToolCalls.get(watch.stream);
625
+ const put = async (event, data) => {
626
+ const safe = event === 'tool' || event === 'tool_complete' ? publicToolFrame(data, this.deps.redactEnabled()) : redactNestedMessageContainers(data, this.deps.redactEnabled());
627
+ // Progress is ephemeral, just like direct turns; a reload gets the channel's latest value after journal replay.
628
+ if (event === 'tool_progress') {
629
+ channel.put([event, safe, null, this.deps.redactEnabled()]);
630
+ return;
631
+ }
632
+ const record = await writer.appendSseEvent(event, safe);
633
+ channel.put([event, safe, record.event_id]);
634
+ };
635
+ const clearTools = async () => {
636
+ for (const call of calls)
637
+ if (call.progress)
638
+ await put('tool_progress', { id: call.tid, progress: null });
639
+ calls.length = 0;
640
+ };
641
+ const resetProjection = async () => { await clearTools(); reasoning = ''; usage = {}; completion = null; titles = new ReasoningTitleTracker(); };
642
+ const meter = async (data) => {
643
+ usage = { ...usage, ...ownerUsage(data) };
644
+ if (['input_tokens', 'output_tokens', 'cache_read_tokens', 'cache_write_tokens'].every((key) => typeof usage[key] === 'number'))
645
+ await put('metering', { session_id: target.sid, usage: { ...usage, estimated_cost: usage.estimated_cost ?? null }, tps: usage.tps ?? null, tps_available: usage.tps !== undefined, estimated: false });
646
+ };
647
+ const finish = async () => {
648
+ // A model pick resolves at the owner's next claim boundary, after the turn becomes idle.
649
+ if (terminal || replaying || this.modelMutations.has(target.key) || this.currentModelChange(target, watch.snapshot)?.state === 'deferred')
650
+ return;
651
+ terminal = true;
652
+ // A new claim may arrive while this turn's receipt is being read. Give it its own projection immediately.
653
+ if (this.watches.get(target.key) === watch)
654
+ this.watches.delete(target.key);
655
+ registry.retire(watch.stream);
656
+ await clearTools();
657
+ const current = await this.call(target, { action: 'snapshot' });
658
+ const rawReceipt = activeAdmission ? (await this.call(target, { action: 'receipt', admission_id: activeAdmission })).receipt : null;
659
+ const receipt = rawReceipt && 'admission_id' in rawReceipt ? rawReceipt : null;
660
+ const cancelled = receipt?.outcome === 'interrupted' || receipt?.outcome === 'cancelled';
661
+ const failed = current.state !== 'attached' || receipt?.status !== 'terminal' || receipt.outcome !== 'completed' && !cancelled;
662
+ const refusal = current.state === 'attached' && current.snapshot && sameExecution(current.snapshot, watch.snapshot)
663
+ && receipt?.status === 'terminal' && receipt.outcome === 'failed' && completion && completion.admission === activeAdmission
664
+ && receipt.authority_epoch === watch.snapshot.authority_epoch && receipt.execution_generation === watch.snapshot.execution_generation
665
+ ? { message: completion.message, type: completion.type, code: completion.code, retryable: completion.retryable } : null;
666
+ // A terminal frame for the previous generation must not overwrite the newer turn's state.
667
+ const session = current.snapshot && !sameExecution(current.snapshot, observation.snapshot)
668
+ ? undefined : { ...await this.view(base, current, null, target), ...usage };
669
+ await put(cancelled ? 'cancel' : failed ? 'apperror' : 'done', { session_id: target.sid,
670
+ terminal_state: cancelled ? 'cancelled' : failed ? 'error' : 'completed',
671
+ ...(failed ? refusal ?? { message: 'The owning Agent could not complete this turn', type: current.reason ?? 'owner_turn_failed' } : {}),
672
+ ...(Object.keys(usage).length ? { usage } : {}),
673
+ ...(session ? { session } : {}) });
674
+ await put('stream_end', { session_id: target.sid });
675
+ watch.controller.abort();
676
+ };
677
+ // Reconcile after the last in-flight mutation releases its fence, in the same order as owner frames.
678
+ watch.reconcile = () => {
679
+ enqueue(async () => {
680
+ if (!watch.snapshot.running && !watch.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started'))
681
+ await finish();
682
+ });
683
+ };
684
+ let pending = this.prompts(snapshot, target.sid, watch.batch);
685
+ let ran = snapshot.running;
686
+ const prompts = async (snap) => {
687
+ watch.snapshot = snap;
688
+ pending = this.prompts(snap, target.sid, watch.batch);
689
+ const approval = pending.approvalPending(target.sid);
690
+ if (approval.pending)
691
+ await put('approval', { ...approval.pending, pending_count: approval.pending_count });
692
+ const clarify = pending.clarifyHeadFrame(target.sid);
693
+ if (clarify)
694
+ await put('clarify', clarify);
695
+ };
696
+ await prompts(snapshot);
697
+ if (watch.controller.signal.aborted)
698
+ return;
699
+ receive = (frame) => {
700
+ enqueue(async () => {
701
+ if (frame.event === 'replay_complete') {
702
+ replaying = false;
703
+ if (!watch.snapshot.running && !watch.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started'))
704
+ await finish();
705
+ return;
706
+ }
707
+ if (frame.event === 'restarting') {
708
+ // The owner entered a restart's after-turn wait after this watch attached: clients stop sending.
709
+ watch.restarting = true;
710
+ await put('session_snapshot', { session: await this.view(base, { state: 'attached', reason: null, snapshot: watch.snapshot, receipt: null, restarting: true }, watch.stream, target) });
711
+ return;
712
+ }
713
+ if (frame.event === 'clarify_batch') {
714
+ const batch = GatewayClarifyBatchSchema.parse(frame.data);
715
+ watch.batch = { ...batch, remaining: batch.questions.map((q) => q.qid) };
716
+ await prompts(watch.snapshot);
717
+ return;
718
+ }
719
+ if (frame.event === 'snapshot') {
720
+ const result = GatewaySessionResultSchema.parse(frame.data);
721
+ replaying = frame.data.replaying === true;
722
+ if (!result.snapshot)
723
+ return;
724
+ if (result.replay_gap || !sameExecution(result.snapshot, watch.snapshot))
725
+ await resetProjection();
726
+ await put('session_snapshot', { session: await this.view(base, result, watch.stream, target), replay_gap: result.replay_gap === true });
727
+ await prompts(result.snapshot);
728
+ if (!result.snapshot.running && !result.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started'))
729
+ await finish();
730
+ return;
731
+ }
732
+ const event = frame.data;
733
+ const data = (event.payload ?? {});
734
+ const kind = str(event.type);
735
+ if (kind === 'notification.show' || kind === 'notification.clear') {
736
+ await put('notices', { session_id: target.sid, notices: this.nativeNotices(target, observation.snapshot) });
737
+ return;
738
+ }
739
+ if (kind === 'request.cancel') {
740
+ // The owner withdraws a settled, timed-out or interrupted batch from every viewer.
741
+ if (!watch.batch || watch.batch.request_id !== data.id)
742
+ return;
743
+ watch.batch = null;
744
+ await prompts(watch.snapshot);
745
+ if (!pending.clarifyHeadFrame(target.sid))
746
+ await put('clarify', { status: 'resolved', clarify_id: data.id });
747
+ return;
748
+ }
749
+ if (kind === 'session.updated') {
750
+ // Idle owner mutations carry no execution stamp. The sidecar scopes their subscription and replay.
751
+ if (event.session_id !== target.sid
752
+ || event.authority_epoch !== undefined && event.authority_epoch !== watch.snapshot.authority_epoch
753
+ || event.execution_generation !== undefined && event.execution_generation !== watch.snapshot.execution_generation)
754
+ return;
755
+ if (data.operation !== 'model')
756
+ return;
757
+ this.rememberModelChange(target, watch.snapshot, modelChange(data));
758
+ const current = await this.call(target, { action: 'snapshot' });
759
+ if (current.snapshot)
760
+ watch.snapshot = current.snapshot;
761
+ await put('session_snapshot', { session: await this.view(base, current, watch.stream, target) });
762
+ if (!watch.snapshot.running && !watch.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started'))
763
+ await finish();
764
+ return;
765
+ }
766
+ if (kind === 'session.info') {
767
+ if (data.authority_epoch !== watch.snapshot.authority_epoch)
768
+ return;
769
+ if (Number(data.execution_generation) < watch.snapshot.execution_generation)
770
+ return;
771
+ const firstClaim = !ran && data.running === true;
772
+ if (Number(data.execution_generation) > watch.snapshot.execution_generation)
773
+ await resetProjection();
774
+ watch.snapshot = { ...watch.snapshot, ...data };
775
+ const claimed = runningAdmission(watch.snapshot);
776
+ if (firstClaim && claimed)
777
+ activeAdmission = claimed.admission_id;
778
+ ran ||= data.running === true;
779
+ if (firstClaim)
780
+ await put('session_snapshot', { session: await this.view(base, { state: 'attached', reason: null, snapshot: watch.snapshot, receipt: null, restarting: watch.restarting }, watch.stream, target) });
781
+ if (data.running === false && (ran || !watch.snapshot.pending.some((p) => p.status === 'queued' || p.status === 'started')))
782
+ await finish();
783
+ return;
784
+ }
785
+ if (event.authority_epoch !== watch.snapshot.authority_epoch || event.execution_generation !== watch.snapshot.execution_generation)
786
+ return;
787
+ if (kind === 'message.delta') {
788
+ const stable = titles.stableSnapshot(reasoning);
789
+ if (stable !== null)
790
+ await put('reasoning', { text: '', titles: stable });
791
+ await put('token', { text: str(data.text || data.delta || data.content) });
792
+ }
793
+ else if (kind === 'reasoning.delta' && showReasoning) {
794
+ reasoning += str(data.text);
795
+ await put('reasoning', titles.prepare(reasoningEventPayload(data.text, reasoning)));
796
+ }
797
+ else if (kind.startsWith('subagent.') && str(data.subagent_id)) {
798
+ // Reuse the delegate activity row; each child keeps one identity through progress and completion.
799
+ const complete = kind === 'subagent.complete';
800
+ const preview = kind === 'subagent.thinking' && !showReasoning ? '' : str(data.summary || data.tool_preview || data.text);
801
+ await put(complete ? 'tool_complete' : 'tool', { id: `owner-subagent-${str(data.subagent_id)}`, name: 'subagent_progress',
802
+ args: { task: str(data.goal) }, preview: preview || null,
803
+ ...(complete ? { is_error: data.status !== 'completed', duration: data.duration_seconds } : {}) });
804
+ }
805
+ else if (kind === 'session.usage')
806
+ await meter(data);
807
+ else if (kind === 'message.complete') {
808
+ if (event.session_id !== target.sid || event.replay_epoch !== undefined && event.replay_epoch !== watch.snapshot.replay_epoch)
809
+ return;
810
+ // Only this owner-defined refusal is public; never forward provider diagnostics or private descriptor fields.
811
+ const surface = data.error_surface;
812
+ if (activeAdmission && data.admission_id === activeAdmission && data.outcome === 'failed' && data.status === 'error'
813
+ && surface?.layer === 'gateway' && surface.code === 'cron_session_read_only' && surface.retryable === false
814
+ && typeof data.text === 'string' && data.text.trim()) {
815
+ completion = { admission: activeAdmission, message: data.text, type: 'cron_session_read_only', code: 'cron_session_read_only', retryable: false };
816
+ }
817
+ if (data.usage && typeof data.usage === 'object')
818
+ await meter(data.usage);
819
+ }
820
+ else if (kind === 'tool.start' || kind === 'tool.progress' || kind === 'tool.complete') {
821
+ if (event.session_id !== target.sid || event.replay_epoch !== undefined && event.replay_epoch !== watch.snapshot.replay_epoch)
822
+ return;
823
+ const id = str(data.tool_id) || str(data.tool_call_id);
824
+ const call = calls.findLast((call) => call.tid === id);
825
+ if (kind === 'tool.start') {
826
+ if (id && call)
827
+ return;
828
+ calls.push({ tid: id, name: data.name || data.tool_name, args: data.args ?? {}, done: false });
829
+ await put('tool', { ...data, id, name: data.name || data.tool_name });
830
+ }
831
+ else if (kind === 'tool.progress') {
832
+ if (!id || !call || call.done || !watch.snapshot.running)
833
+ return;
834
+ call.progress = toolProgress({ ...data, message: typeof data.message === 'string' ? redactString(data.message, this.deps.redactEnabled()) : null });
835
+ await put('tool_progress', { id, progress: call.progress });
836
+ }
837
+ else {
838
+ if (call?.done)
839
+ return;
840
+ if (call)
841
+ Object.assign(call, { done: true, progress: null });
842
+ await put('tool_complete', { ...data, id, name: data.name || data.tool_name, progress: null });
843
+ }
844
+ }
845
+ else if (kind === 'approval.request' || kind === 'clarify.request')
846
+ await prompts({ ...watch.snapshot, prompts: [...watch.snapshot.prompts.filter((p) => p.prompt_id !== data.prompt_id), { ...data, kind: kind.split('.')[0] }] });
847
+ else if (kind === 'approval.settled' || kind === 'clarify.settled') {
848
+ await prompts({ ...watch.snapshot, prompts: watch.snapshot.prompts.filter((p) => p.prompt_id !== data.prompt_id) });
849
+ if (kind === 'approval.settled' && !pending.approvalPending(target.sid).pending)
850
+ await put('approval_cleared', { pending_count: 0 });
851
+ if (kind === 'clarify.settled' && !pending.clarifyHeadFrame(target.sid))
852
+ await put('clarify', { status: 'resolved', clarify_id: data.prompt_id });
853
+ }
854
+ });
855
+ };
856
+ for (const frame of buffered.splice(0))
857
+ receive(frame);
858
+ const result = await Promise.race([
859
+ observation.ended,
860
+ new Promise((resolve) => {
861
+ const stopped = () => { resolve({ state: 'attached', reason: null, snapshot: watch.snapshot, receipt: null }); };
862
+ if (watch.controller.signal.aborted)
863
+ stopped();
864
+ else
865
+ watch.controller.signal.addEventListener('abort', stopped, { once: true });
866
+ }),
867
+ ]);
868
+ await chain;
869
+ if (streamError)
870
+ throw streamError instanceof Error ? streamError : new Error('Owner stream projection failed');
871
+ if (!terminal) {
872
+ await put('apperror', { message: 'The owning Agent disconnected. Reopen the session before resending work.', type: result.reason ?? 'owner_unavailable', terminal_state: 'error' });
873
+ await put('stream_end', { session_id: target.sid });
874
+ watch.controller.abort();
875
+ }
876
+ };
877
+ const running = worker().catch((error) => {
878
+ // Closing the sidecar after a terminal snapshot is expected; every other exit is observable.
879
+ if (!terminal)
880
+ channel.put(['apperror', { message: 'The owning Agent connection ended', type: 'owner_unavailable', terminal_state: 'error' }, null]);
881
+ this.deps.log(`[webui] owner observation ended: ${error instanceof Error ? error.name : 'error'}`);
882
+ }).finally(async () => {
883
+ watch.controller.abort();
884
+ observation.listeners.delete(listener);
885
+ release();
886
+ try {
887
+ await closeWriter?.close();
888
+ }
889
+ catch {
890
+ this.deps.log('[webui] owner observation journal could not close');
891
+ }
892
+ if (this.watches.get(target.key) === watch)
893
+ this.watches.delete(target.key);
894
+ registry.retire(watch.stream);
895
+ this.changed(target);
896
+ this.deps.events.publish('owner_changed', { profile: target.profile, sessionId: target.sid });
897
+ this.runWorkers.delete(running);
898
+ });
899
+ this.runWorkers.add(running);
900
+ return watch;
901
+ }
902
+ async close() {
903
+ const observations = [...this.observations.values()];
904
+ for (const observation of observations)
905
+ observation.controller.abort();
906
+ const watches = [...this.watches.values()];
907
+ for (const watch of watches)
908
+ watch.controller.abort();
909
+ await Promise.allSettled([...this.runWorkers]);
910
+ await Promise.allSettled(observations.map((observation) => observation.ended));
911
+ this.modelChanges.clear();
912
+ }
913
+ }
914
+ //# sourceMappingURL=gateway-sessions.js.map