@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,418 @@
1
+ """Authenticated observations, fenced controls and diagnostic creation through an existing native owner.
2
+
3
+ Never ensure/start a gateway, build an Agent, or write its transcript locally.
4
+ Each call owns its connection and subscription; cancellation only detaches it.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import asyncio
9
+ from contextlib import asynccontextmanager, closing, suppress
10
+ from importlib.util import find_spec
11
+ import json
12
+ from pathlib import Path
13
+ import re
14
+ import sqlite3
15
+
16
+ from ..errors import InvalidParams
17
+ from ..home import profile_home_param, scoped_home
18
+
19
+ _ACTIONS = {"snapshot", "watch", "context_detail", "submit", "receipt", "cancel", "steer_queued", "replace_queued", "interrupt", "approval", "clarify",
20
+ "clarify_lock", "discard", "mutate", "export"}
21
+ _EXPORT_MAX_BYTES = 4 * 1024 * 1024
22
+ # A restart's after-turn wait keeps the owner reachable only to finish its parked turn (the owner's
23
+ # RESTART_WAIT_WS_METHODS); new work waits for the next owner.
24
+ _RESTART_ACTIONS = {"snapshot", "watch", "receipt", "approval", "clarify", "clarify_lock", "interrupt"}
25
+ _CAPABILITIES = {"durable-admission-v1", "event-replay-v1"}
26
+ _CONTROL_REFUSALS = {"native_clarify_batch_unavailable", "owner_controls_unverified"}
27
+ _CREATE_FIELDS = {"request_id", "source", "cwd", "model", "provider", "base_url", "toolsets", "safe_mode", "ignore_user_config"}
28
+
29
+
30
+ def _batch_locks() -> bool:
31
+ """v0.22.3 owners serve ``clarify.lock``, so an attached viewer can answer a clarify batch per question."""
32
+ return find_spec("gateway.session_clarify_lock") is not None
33
+
34
+
35
+ def _restart_wait(home: Path) -> bool:
36
+ """Whether the owner has entered a restart's after-turn wait since a watch attached. The owner announces
37
+ it on no socket, and the watch must not send on its own: a socket opened before the wait is cut when it does."""
38
+ from hermes_cli import gateway_runtime
39
+ if not hasattr(gateway_runtime, "attachable"):
40
+ return False
41
+ try:
42
+ found = gateway_runtime.discover_gateway_endpoint(home)
43
+ except Exception: # noqa: BLE001 - a failed probe leaves the watch as it was; every action rediscovers anyway
44
+ return False
45
+ return found.state != "ready" and gateway_runtime.attachable(found)
46
+
47
+
48
+ def _control_refusal(home: Path, sid: str) -> str | None:
49
+ """Only canonical PendingControls can be recovered before v0.22.3. Never infer a missing batch.
50
+
51
+ Read the owner's committed admission in a read-only connection; opening SessionDB here
52
+ would run its schema writer alongside the owner. Compression keeps the logical target.
53
+ """
54
+ try:
55
+ with closing(sqlite3.connect((home / "state.db").as_uri() + "?mode=ro", uri=True, timeout=2)) as db:
56
+ rows = db.execute("""SELECT payload_json FROM session_admissions
57
+ WHERE target_session_id=? AND status IN ('queued', 'started')""", (sid,))
58
+ for (raw,) in rows:
59
+ payload = json.loads(raw)
60
+ policy = payload.get("cli_turn_v1", {})
61
+ if not isinstance(policy, dict):
62
+ return "owner_controls_unverified"
63
+ if "clarify_batch" in policy and not isinstance(policy["clarify_batch"], bool):
64
+ return "owner_controls_unverified"
65
+ if policy.get("clarify_batch") is True and not _batch_locks():
66
+ return "native_clarify_batch_unavailable"
67
+ except (sqlite3.Error, OSError, ValueError, TypeError, AttributeError):
68
+ return "owner_controls_unverified"
69
+ return None
70
+
71
+
72
+ def _snapshot(value: dict) -> dict:
73
+ # Raw conversation rows contain private principal/admission metadata; the client needs
74
+ # display rows, not those bindings or the inventory's system prompt and credential hint.
75
+ message_keys = {"role", "content", "tool_calls", "tool_call_id", "name", "timestamp", "message_id", "row_id",
76
+ "reasoning", "reasoning_content", "display_kind", "finish_reason"}
77
+ info_keys = {"title", "model", "cwd", "source", "provider", "config_warning"}
78
+ return {**value, "messages": [{k: v for k, v in row.items() if k in message_keys} for row in value["messages"]],
79
+ "info": {k: v for k, v in value["info"].items() if k in info_keys}}
80
+
81
+
82
+ def _refused(state: str, reason: str) -> dict:
83
+ return {"state": state, "reason": reason, "snapshot": None, "receipt": None}
84
+
85
+
86
+ @asynccontextmanager
87
+ async def _connect(home: Path, endpoint):
88
+ from hermes_constants import get_hermes_home
89
+ from hermes_cli.gateway_client import GatewayClientError, connect_gateway
90
+
91
+ # The supplied endpoint selects the native client's attach-only branch. The home
92
+ # override is mandatory so its bootstrap ticket cannot fall back to the launch profile.
93
+ if Path(get_hermes_home()).resolve() != home:
94
+ raise GatewayClientError("profile_mismatch")
95
+ async with connect_gateway(endpoint) as client:
96
+ websocket = client.websocket
97
+ # GatewayClient queues server requests as events. Drain continuously, including
98
+ # during an RPC, so unsupported sudo/secure inputs never wait for a Web renderer.
99
+ events = asyncio.Queue(maxsize=4096)
100
+
101
+ async def drain():
102
+ while True:
103
+ frame = await client.events.get()
104
+ if isinstance(frame, dict) and frame.get("method") in {"sudo", "secret"} and "id" in frame:
105
+ await websocket.send(json.dumps({"jsonrpc": "2.0", "id": frame["id"], "result": {"value": ""}}))
106
+ else:
107
+ await events.put(frame)
108
+
109
+ reader = asyncio.create_task(drain())
110
+ try:
111
+ yield client, events
112
+ finally:
113
+ reader.cancel()
114
+ with suppress(asyncio.CancelledError):
115
+ await reader
116
+
117
+
118
+ def _served(home: Path, endpoint, *, allow_verified: bool = False) -> bool:
119
+ if not endpoint.control_home or Path(endpoint.control_home).resolve() == home:
120
+ return False
121
+ if not allow_verified:
122
+ return True
123
+ # The private control socket reports the owner's boot revision, not the sidecar's
124
+ # checkout or a version label. The authenticated describe must still match below.
125
+ try:
126
+ record = json.loads((Path(__file__).resolve().parents[2] / "agent_support.json").read_text())
127
+ revisions = record["nativeContracts"]["served-local-policy-v1"]
128
+ return (not isinstance(revisions, list)
129
+ or not all(isinstance(sha, str) and re.fullmatch(r"[0-9a-f]{40}", sha) for sha in revisions)
130
+ or getattr(endpoint, "code_sha", None) not in revisions)
131
+ except (OSError, ValueError, KeyError, TypeError):
132
+ return True
133
+
134
+
135
+ def _owner_refusal(described: dict, endpoint) -> dict | None:
136
+ if (not isinstance(described, dict)
137
+ or described.get("instance_id") != endpoint.instance_id
138
+ or described.get("profile_id") != endpoint.profile_id
139
+ or type(described.get("authority_epoch")) is not int
140
+ or described.get("authority_epoch") != endpoint.authority_epoch
141
+ or not isinstance(described.get("capabilities"), list)
142
+ or not all(isinstance(capability, str) for capability in described["capabilities"])
143
+ or not _CAPABILITIES.issubset(described.get("capabilities", []))):
144
+ return _refused("incompatible", "owner_capabilities")
145
+ return None
146
+
147
+
148
+ async def _run(ctx, params: dict, home: Path, discovery) -> dict:
149
+ from hermes_cli.gateway_client import GatewayRPCError
150
+
151
+ endpoint = discovery.endpoint
152
+ if _served(home, endpoint, allow_verified=True):
153
+ return _refused("incompatible", "served_profile_sessions_unavailable")
154
+ restarting = discovery.state != "ready"
155
+ if restarting and params["action"] not in _RESTART_ACTIONS:
156
+ return _refused("refused", "gateway_restarting")
157
+ subscription = None
158
+ async with _connect(home, endpoint) as (client, events):
159
+ described = await client.rpc("runtime.describe")
160
+ if refusal := _owner_refusal(described, endpoint):
161
+ return refusal
162
+ sid = params["session_id"]
163
+
164
+ async def snapshot():
165
+ nonlocal subscription, sid
166
+ value = await client.rpc("session.resume", session_id=sid)
167
+ sid = value["session_id"]
168
+ # Native attach reuses this actor's subscription; overflow retires it before
169
+ # a replacement is issued. A resume does not accumulate live subscriptions.
170
+ subscription = value["subscription_id"]
171
+ if reason := await asyncio.to_thread(_control_refusal, home, sid):
172
+ raise GatewayRPCError(reason)
173
+ return _snapshot(value)
174
+
175
+ receipt = lock = None
176
+ try:
177
+ if params["action"] == "export":
178
+ # No resume/subscription or mutation: the owner selects its current physical target.
179
+ fmt = "md" if params["format"] == "markdown" else params["format"]
180
+ value = await asyncio.wait_for(client.rpc("session.export", session_id=sid,
181
+ format=fmt, redact=params["redact"], _timeout=25), timeout=30)
182
+ if (not isinstance(value, dict) or value.get("format") != fmt
183
+ or not isinstance(value.get("filename"), str) or not 0 < len(value["filename"]) <= 255
184
+ or not isinstance(value.get("content"), str)):
185
+ return _refused("refused", "owner_export_invalid")
186
+ if len(value["content"]) > _EXPORT_MAX_BYTES or len(value["content"].encode("utf-8")) > _EXPORT_MAX_BYTES:
187
+ return _refused("refused", "export_too_large")
188
+ return {"state": "attached", "reason": None, "snapshot": None, "receipt": None,
189
+ "export": {"format": params["format"], "filename": value["filename"], "content": value["content"]}}
190
+ snap = await snapshot()
191
+ action = params["action"]
192
+ common = {"session_id": sid}
193
+ if action == "context_detail":
194
+ from ..context_detail import project, unavailable
195
+ # The authorized native read owns lookup and prompt interpretation. No local Agent is built.
196
+ try:
197
+ payload = await client.rpc("session.context_breakdown", **common)
198
+ usage = None
199
+ with suppress(Exception):
200
+ usage = await client.rpc("session.stats", **common)
201
+ after = await snapshot()
202
+ marks = ("session_id", "stored_session_id", "authority_epoch", "replay_epoch", "revision", "execution_generation", "running", "last_sequence")
203
+ stable = all(snap.get(k) == after.get(k) for k in marks) and snap.get("info") == after.get("info")
204
+ detail = project(payload, usage=usage, running=after.get("running") is True) if stable else unavailable("changed")
205
+ except Exception: # unsupported owners and failed reads never authorize a fallback Agent
206
+ detail = unavailable("unsupported")
207
+ return {"state": "attached", "reason": None, "snapshot": snap, "receipt": None, "context_detail": detail}
208
+ if action == "submit":
209
+ # The caller retains this identity across lost ACKs. An ambiguous error never
210
+ # causes this adapter to generate a replacement or replay started work.
211
+ receipt = await client.rpc("prompt.submit", **common, submission_id=params["request_id"], text=params["text"])
212
+ elif action == "receipt":
213
+ receipt = await client.rpc("prompt.receipt", **common, admission_id=params["admission_id"])
214
+ elif action in {"cancel", "discard"}:
215
+ method = "prompt.cancel" if action == "cancel" else "prompt.resolve_unknown"
216
+ receipt = await client.rpc(method, **common, admission_id=params["admission_id"],
217
+ **({"execution_generation": params["execution_generation"]} if action == "discard" else {}))
218
+ elif action in {"steer_queued", "replace_queued"}:
219
+ receipt = await client.rpc("prompt." + action, **common, admission_id=params["admission_id"],
220
+ **({"submission_id": params["submission_id"], "text": params["text"]} if action == "replace_queued" else {}))
221
+ elif action == "interrupt":
222
+ await client.rpc("session.interrupt", **common, execution_generation=params["execution_generation"])
223
+ elif action == "clarify_lock":
224
+ # The lock that answers the last question settles the batch with every locked answer.
225
+ lock = await client.rpc("clarify.lock", request_id=params["request_id"],
226
+ question_id=params["question_id"], answer=params["answer"])
227
+ elif action in {"approval", "clarify"}:
228
+ await client.rpc(action + ".respond", **common, prompt_id=params["prompt_id"],
229
+ execution_generation=params["execution_generation"],
230
+ **({"choice": params["choice"]} if action == "approval" else {"answer": params["text"]}))
231
+ elif action == "mutate":
232
+ receipt = await client.rpc("session.mutate", **common, request_id=params["request_id"],
233
+ expected_revision=params["expected_revision"], expected_generation=params["execution_generation"],
234
+ operation=params["operation"], payload=params["payload"], _timeout=660)
235
+ if action not in {"snapshot", "watch"}:
236
+ snap = await snapshot()
237
+ result = {"state": "attached", "reason": None, "snapshot": snap, "receipt": receipt, "restarting": restarting,
238
+ **({"lock": lock} if action == "clarify_lock" else {})}
239
+ if action != "watch":
240
+ return result
241
+ # Display negotiation is best effort on older owners. It changes no persisted config.
242
+ if isinstance(params.get("show_reasoning"), bool):
243
+ with suppress(GatewayRPCError, TimeoutError):
244
+ await client.rpc("config.set", **common, key="show_reasoning",
245
+ value="1" if params["show_reasoning"] else "0", _timeout=10)
246
+ ctx.emit("snapshot", {**result, "replaying": True})
247
+ epoch, sequence = snap["replay_epoch"], snap["last_sequence"]
248
+ # Rebuild the active turn's display from retained events, even when its initial
249
+ # tokens predate this viewer. A gap replaces the subscription, never invents replay.
250
+ replay = await client.rpc("session.events.since", **common, replay_epoch=epoch, last_sequence=0)
251
+ if replay.get("snapshot_required"):
252
+ snap = await snapshot()
253
+ ctx.emit("snapshot", {**result, "snapshot": snap, "replay_gap": True, "replaying": True})
254
+ epoch, sequence = snap["replay_epoch"], snap["last_sequence"]
255
+ else:
256
+ for event in replay["events"]:
257
+ if event.get("session_id") != sid or event.get("replay_epoch") != epoch:
258
+ continue
259
+ if (event.get("type") in {"session.updated", "notification.show", "notification.clear"}
260
+ or event.get("execution_generation") == snap["execution_generation"]
261
+ or event.get("type") == "session.info" and event.get("payload", {}).get("execution_generation") == snap["execution_generation"]):
262
+ ctx.emit("event", event)
263
+ sequence = replay["last_sequence"]
264
+ ctx.emit("replay_complete", {})
265
+ checked = asyncio.get_running_loop().time()
266
+ while not ctx.cancelled:
267
+ try:
268
+ frame = await asyncio.wait_for(events.get(), .25)
269
+ except TimeoutError:
270
+ now = asyncio.get_running_loop().time()
271
+ if not restarting and now - checked >= 2:
272
+ checked = now
273
+ # One-way for this owner: its next state is exit, which ends the watch.
274
+ if restarting := await asyncio.to_thread(_restart_wait, home):
275
+ result["restarting"] = True
276
+ ctx.emit("restarting", {"restarting": True})
277
+ continue
278
+ if isinstance(frame, Exception):
279
+ raise frame
280
+ if frame.get("method") == "clarify" and "id" in frame:
281
+ if not _batch_locks():
282
+ raise GatewayRPCError("native_clarify_batch_unavailable")
283
+ # The owner asks attached viewers only, once; its later request.cancel event settles it.
284
+ request = frame.get("params", {})
285
+ if request.get("session_id") == sid:
286
+ ctx.emit("clarify_batch", {"request_id": frame["id"], "questions": request.get("questions", [])})
287
+ continue
288
+ if frame.get("method") != "event":
289
+ continue
290
+ event = frame.get("params", {})
291
+ if event.get("session_id") != sid:
292
+ continue
293
+ if event.get("type") == "session.info":
294
+ if reason := await asyncio.to_thread(_control_refusal, home, sid):
295
+ raise GatewayRPCError(reason)
296
+ if (event.get("type") == "session.replay_gap" or event.get("replay_epoch") != epoch
297
+ or event.get("seq", sequence + 1) > sequence + 1):
298
+ current = await snapshot()
299
+ # A queued frame from an obsolete epoch is not a gap in the current subscription.
300
+ if (event.get("type") != "session.replay_gap" and event.get("replay_epoch") != epoch
301
+ and current["replay_epoch"] == epoch):
302
+ continue
303
+ snap = current
304
+ ctx.emit("snapshot", {**result, "snapshot": snap, "replay_gap": True})
305
+ epoch, sequence = snap["replay_epoch"], snap["last_sequence"]
306
+ continue
307
+ if event.get("seq", 0) <= sequence:
308
+ continue
309
+ sequence = event["seq"]
310
+ ctx.emit("event", event)
311
+ return result
312
+ except GatewayRPCError as exc:
313
+ if params["action"] == "export":
314
+ return _refused("refused", "export_too_large" if str(exc) == "export_too_large" else "owner_export_unsupported")
315
+ return {**_refused("incompatible" if str(exc) in _CONTROL_REFUSALS else "refused", str(exc)), "receipt": receipt}
316
+ except Exception: # noqa: BLE001 - native transport/contract failures never authorize another writer
317
+ # A received receipt remains admission proof even if the following observation
318
+ # disconnects. Losing that ACK would invite a new request identity for admitted work.
319
+ return {**_refused("unavailable", "owner_connection_lost"), "receipt": receipt}
320
+ finally:
321
+ if subscription:
322
+ with suppress(Exception):
323
+ await client.rpc("session.detach", session_id=sid, subscription_id=subscription)
324
+
325
+
326
+ def session(ctx, params: dict) -> dict:
327
+ home = profile_home_param(params).resolve()
328
+ action = params.get("action", "snapshot")
329
+ sid = params.get("session_id")
330
+ if action not in _ACTIONS or not isinstance(sid, str) or not sid.strip() or sid != sid.strip():
331
+ raise InvalidParams("session_id and supported action are required")
332
+ params = {**params, "action": action}
333
+ if action == "export" and (params.get("format") not in ("json", "markdown", "html")
334
+ or not isinstance(params.get("redact"), bool)):
335
+ raise InvalidParams("export requires an allowed format and redaction policy")
336
+ required = {
337
+ "submit": ("request_id", "text"), "receipt": ("admission_id",), "cancel": ("admission_id",),
338
+ "steer_queued": ("admission_id",), "replace_queued": ("admission_id", "submission_id", "text"),
339
+ "interrupt": ("execution_generation",), "approval": ("execution_generation", "prompt_id", "choice"),
340
+ "clarify": ("execution_generation", "prompt_id", "text"), "clarify_lock": ("request_id", "question_id", "answer"), "discard": ("execution_generation", "admission_id"),
341
+ "mutate": ("request_id", "expected_revision", "execution_generation", "operation", "payload"),
342
+ }.get(action, ())
343
+ if any(key not in params for key in required):
344
+ raise InvalidParams("missing gateway session action fields")
345
+ return _with_owner(home, lambda discovery: _run(ctx, params, home, discovery))
346
+
347
+
348
+ def _with_owner(home: Path, run) -> dict:
349
+ try:
350
+ from hermes_constants import set_hermes_home_override, reset_hermes_home_override # noqa: F401
351
+ from hermes_cli import gateway_runtime
352
+ from hermes_cli.gateway_client import connect_gateway # noqa: F401
353
+ except ImportError:
354
+ return _refused("incompatible", "native_sessions_unavailable")
355
+ # v0.22.3 also admits a restart's after-turn wait, so a parked approval or clarify can still be answered.
356
+ attachable = getattr(gateway_runtime, "attachable", lambda found: found.state == "ready")
357
+ with scoped_home(home):
358
+ discovery = gateway_runtime.discover_gateway_endpoint(home)
359
+ if discovery.endpoint is None or not attachable(discovery):
360
+ return _refused("stopped" if discovery.state in {"stopped", "absent"} else "unavailable", discovery.reason_code or discovery.state)
361
+ try:
362
+ return asyncio.run(run(discovery))
363
+ except Exception: # noqa: BLE001 - native transport/contract failures never authorize another writer
364
+ # Do not expose peer diagnostics, endpoint paths or bootstrap credentials.
365
+ return _refused("unavailable", "owner_connection_lost")
366
+
367
+
368
+ async def _create(params: dict, home: Path, discovery) -> dict:
369
+ """Mint one diagnostic session through the owner, which freezes the bypass in its creation
370
+ policy and runs every turn in a fresh private worker. Talaria never imports the Agent with
371
+ that policy, flips a process global or passes it through the environment."""
372
+ from hermes_cli.gateway_client import GatewayRPCError
373
+
374
+ endpoint = discovery.endpoint
375
+ if _served(home, endpoint):
376
+ return _refused("incompatible", "served_profile_sessions_unavailable")
377
+ if discovery.state != "ready":
378
+ return _refused("unavailable", "gateway_restarting")
379
+ async with _connect(home, endpoint) as (client, _):
380
+ described = await client.rpc("runtime.describe")
381
+ if refusal := _owner_refusal(described, endpoint):
382
+ return refusal
383
+ accepted = set((described.get("session_create") or {}).get("parameters", []))
384
+ if "local-cli-create-v1" not in described.get("capabilities", []) or not _CREATE_FIELDS.issubset(accepted):
385
+ return _refused("incompatible", "execution_mode_unavailable")
386
+ if params.get("probe") is True:
387
+ return {"state": "attached", "reason": None, "snapshot": None, "receipt": None}
388
+ fields = {key: params[key] for key in ("cwd", "model", "provider", "base_url", "toolsets") if params.get(key) is not None}
389
+ try:
390
+ # Safe implies config-only; the owner normalizes it too. No credential is sent or receipted.
391
+ created = await client.rpc("session.create", request_id=params["request_id"], source="cli", **fields,
392
+ safe_mode=params["execution_mode"] == "safe", ignore_user_config=True)
393
+ except GatewayRPCError as exc:
394
+ return _refused("refused", str(exc))
395
+ with suppress(Exception):
396
+ await client.rpc("session.detach", session_id=created["session_id"], subscription_id=created["subscription_id"])
397
+ return {"state": "attached", "reason": None, "snapshot": _snapshot(created), "receipt": None}
398
+
399
+
400
+ def _text(params: dict, key: str, required: bool = True) -> bool:
401
+ value = params.get(key)
402
+ if value is None:
403
+ return not required
404
+ return isinstance(value, str) and bool(value) and value == value.strip()
405
+
406
+
407
+ def create(params: dict) -> dict:
408
+ """``probe`` answers whether this owner can create diagnostic sessions, without creating one."""
409
+ home = profile_home_param(params).resolve()
410
+ toolsets = params.get("toolsets")
411
+ if params.get("probe") is not True and (
412
+ params.get("execution_mode") not in {"ignore_config", "safe"}
413
+ or not _text(params, "request_id") or len(params["request_id"]) > 128
414
+ or not _text(params, "model") or not _text(params, "cwd") or not Path(params["cwd"]).is_absolute()
415
+ or not _text(params, "provider", False) or not _text(params, "base_url", False)
416
+ or toolsets is not None and (not isinstance(toolsets, list) or not all(isinstance(t, str) and t for t in toolsets))):
417
+ raise InvalidParams("execution_mode, request_id, model and an absolute cwd are required")
418
+ return _with_owner(home, lambda discovery: _create(params, home, discovery))
@@ -1,7 +1,8 @@
1
1
  """``goals.*``: Hermes persistent session goals (ported from api/goals.py).
2
2
 
3
- The server passes the session's ``profile_home`` and the configured turn
4
- budget; the sidecar never reads WebUI settings itself.
3
+ The server passes the session's ``profile_home``, its workspace and the configured
4
+ turn budget; the sidecar never reads WebUI settings itself. ``/goal`` parses through
5
+ the Agent's own ``dispatch_goal_command``, like its CLI, gateway and TUI.
5
6
  """
6
7
 
7
8
  from __future__ import annotations
@@ -14,7 +15,7 @@ from pathlib import Path
14
15
  from typing import Any
15
16
 
16
17
  from ..errors import InvalidParams, RpcError
17
- from ..home import profile_home_param, scoped_home
18
+ from ..home import profile_home_param, scoped_home, session_workspace
18
19
  from ..rpc import CallContext
19
20
 
20
21
  log = logging.getLogger("talaria_sidecar.goals")
@@ -29,17 +30,18 @@ def _native():
29
30
 
30
31
 
31
32
  class _Manager:
32
- """Native GoalManager scoped to one profile home."""
33
+ """Native GoalManager scoped to one profile home and the session's workspace, where its gates run."""
33
34
 
34
- def __init__(self, session_id: str, profile_home: Path, default_max_turns: int):
35
+ def __init__(self, session_id: str, profile_home: Path, default_max_turns: int, workspace: str | None = None):
35
36
  _, default, GoalManager, _, _ = _native()
36
37
  self.session_id = session_id
37
38
  self.profile_home = profile_home
39
+ self.workspace = workspace
38
40
  with scoped_home(profile_home):
39
41
  self._manager = GoalManager(session_id=session_id, default_max_turns=int(default_max_turns or default or 20))
40
42
 
41
43
  def scoped(self, func, *args, **kwargs):
42
- with scoped_home(self.profile_home):
44
+ with scoped_home(self.profile_home), session_workspace(self.workspace):
43
45
  return func(*args, **kwargs)
44
46
 
45
47
  @property
@@ -123,13 +125,22 @@ def _decision_payload(decision: dict, state: Any) -> dict:
123
125
  turns_used, max_turns = _turns_from_message(str(decision.get("message") or ""))
124
126
  if status == "done":
125
127
  return {**decision, "message_key": "goal_achieved", "message_args": [reason]}
126
- if status == "paused":
128
+ if status == "paused" and str(getattr(state, "paused_reason", "") or "").startswith("turn budget exhausted"):
127
129
  return {**decision, "message_key": "goal_paused_budget_exhausted", "message_args": [turns_used, max_turns]}
128
130
  if decision.get("should_continue"):
129
131
  return {**decision, "message_key": "goal_continuing", "message_args": [turns_used, max_turns, reason]}
130
132
  return decision
131
133
 
132
134
 
135
+ def _parked(mgr: _Manager) -> dict | None:
136
+ """TAL-808: an active goal's live wait barrier, as the Agent's own ``is_waiting`` (which clears a satisfied one) sees it."""
137
+ if not mgr.is_waiting():
138
+ return None
139
+ state = mgr.state
140
+ until = float(getattr(state, "waiting_until", 0.0) or 0.0)
141
+ return {"reason": getattr(state, "waiting_reason", None) or None, "until": until or None}
142
+
143
+
133
144
  def _inactive(reason: str, status=None) -> dict:
134
145
  return {"status": status, "should_continue": False, "continuation_prompt": None, "verdict": "inactive", "reason": reason, "message": ""}
135
146
 
@@ -139,7 +150,41 @@ def _manager_from(params: dict) -> _Manager:
139
150
  if not session_id:
140
151
  raise InvalidParams("session_id is required")
141
152
  max_turns = params.get("default_max_turns") or 20
142
- return _Manager(session_id, profile_home_param(params), int(max_turns))
153
+ return _Manager(session_id, profile_home_param(params), int(max_turns), str(params.get("workspace") or "") or None)
154
+
155
+
156
+ #: Older Agents run gates in their launch directory, where a gate checks another project and can pass for it.
157
+ _GATES_NEED_WORKSPACE = "Goal gates need Hermes Agent 0.21.6 or later, which runs them in the session workspace."
158
+
159
+
160
+ def _gates_run_in_workspace() -> bool:
161
+ from hermes_cli import goals as agent_goals
162
+
163
+ return hasattr(agent_goals, "_gate_workspace")
164
+
165
+
166
+ #: The response ``action`` of each control verb the Agent dispatches; any other command sets the goal.
167
+ _CONTROL_ACTIONS = {
168
+ "": "status", "status": "status", "show": "show", "pause": "pause", "resume": "resume", "continue": "resume",
169
+ "unpause": "resume", "clear": "clear", "stop": "clear", "done": "clear", "unwait": "unwait", "wait": "wait", "gate": "gate",
170
+ }
171
+
172
+
173
+ def _localized(action: str, state: Any, had_goal: bool) -> dict:
174
+ """``message_key``/``message_args`` for the verbs Web already localizes; other verbs show the Agent's text."""
175
+ status = str(getattr(state, "status", "") or "")
176
+ goal = str(getattr(state, "goal", "") or "")
177
+ if action == "status":
178
+ return {k: v for k, v in _status_payload(state).items() if k != "message"}
179
+ if action == "set":
180
+ return {"message_key": "goal_set", "message_args": [int(getattr(state, "max_turns", 0) or 0), goal]}
181
+ if action == "pause":
182
+ return {"message_key": "goal_paused", "message_args": [goal]} if had_goal and status == "paused" else {"message_key": "goal_no_goal"}
183
+ if action == "resume":
184
+ return {"message_key": "goal_resumed", "message_args": [goal]} if had_goal and status == "active" else {"message_key": "goal_no_goal"}
185
+ if action == "clear":
186
+ return {"message_key": "goal_cleared" if had_goal else "goal_no_goal"}
187
+ return {}
143
188
 
144
189
 
145
190
  def register(registry) -> None:
@@ -147,45 +192,35 @@ def register(registry) -> None:
147
192
  def get(ctx: CallContext, params: dict) -> dict:
148
193
  mgr = _manager_from(params)
149
194
  state = mgr.state
150
- return {"goal": _state_payload(state), "active": bool(state is not None and getattr(state, "status", None) == "active"), **_status_payload(state)}
195
+ active = bool(state is not None and getattr(state, "status", None) == "active")
196
+ return {"goal": _state_payload(state), "active": active, "parked": _parked(mgr) if active else None, **_status_payload(state)}
151
197
 
152
198
  @registry.method("goals.command")
153
199
  def command(ctx: CallContext, params: dict) -> dict:
154
- """/goal <args> with the same semantics as the gateway command."""
200
+ """/goal <args> through the Agent's ``dispatch_goal_command``, as its TUI runs it."""
155
201
  mgr = _manager_from(params)
202
+ try:
203
+ from hermes_cli import goals as agent_goals
204
+ from hermes_cli.goal_command import dispatch_goal_command, is_goal_control
205
+ except Exception as exc: # noqa: BLE001
206
+ raise RpcError(f"Hermes goals unavailable: {exc}", condition="goals_unavailable")
156
207
  text = str(params.get("args") or "").strip()
157
- lower = text.lower()
158
- stream_running = bool(params.get("stream_running", False))
159
- if not text or lower == "status":
160
- state = mgr.state
161
- return _payload(action="status", state=state, **_status_payload(state))
162
- if lower == "pause":
163
- state = mgr.pause(reason="user-paused")
164
- if state is None:
165
- return _payload(ok=False, action="pause", error="no_goal", message="No goal set.", message_key="goal_no_goal")
166
- return _payload(action="pause", message=f"⏸ Goal paused: {state.goal}", message_key="goal_paused", message_args=[str(state.goal)], state=state)
167
- if lower == "resume":
168
- state = mgr.resume()
169
- if state is None:
170
- return _payload(ok=False, action="resume", error="no_goal", message="No goal to resume.", message_key="goal_no_goal")
171
- return _payload(action="resume", message=f"▶ Goal resumed: {state.goal}\nSend a new message, or type continue, to kick it off.", message_key="goal_resumed", message_args=[str(state.goal)], state=state)
172
- if lower in ("clear", "stop", "done"):
173
- had = bool(mgr.has_goal())
174
- mgr.clear()
175
- return _payload(action="clear", message="Goal cleared." if had else "No active goal.", message_key="goal_cleared" if had else "goal_no_goal", state=mgr.state)
176
- if stream_running:
208
+ tokens = text.lower().split()
209
+ action = _CONTROL_ACTIONS.get(tokens[0] if tokens else "", "set") if is_goal_control(text) else "set"
210
+ if action == "set" and params.get("stream_running"):
177
211
  return _payload(ok=False, action="set", error="agent_running", message="Agent is running — use /goal status / pause / clear mid-run, or /stop before setting a new goal.")
178
- try:
179
- state = mgr.set(text)
180
- except ValueError as exc:
181
- return _payload(ok=False, action="set", error="invalid_goal", message=f"Invalid goal: {exc}")
182
- return _payload(
183
- action="set",
184
- message=(f"⊙ Goal set ({state.max_turns}-turn budget): {state.goal}\n"
185
- "I'll keep working until the goal is done, you pause/clear it, or the budget is exhausted.\n"
186
- "Controls: /goal status · /goal pause · /goal resume · /goal clear"),
187
- message_key="goal_set", message_args=[state.max_turns, state.goal], state=state, kickoff_prompt=state.goal,
188
- )
212
+ if tokens[:2] == ["gate", "add"] and not _gates_run_in_workspace():
213
+ return _payload(ok=False, action="gate", error="gates_unsupported", state=mgr.state, message=_GATES_NEED_WORKSPACE)
214
+ had_goal = bool(mgr.has_goal())
215
+ # Only goal-setting text reads it: a re-pasted goal kicks off without repeating itself.
216
+ last_user_message = mgr.scoped(agent_goals.last_user_message_from_db, mgr.session_id) if action == "set" else None
217
+ result = mgr.scoped(dispatch_goal_command, mgr._manager, text, authorize_gate=lambda: None, last_user_message=last_user_message)
218
+ state = mgr.state
219
+ if result.error:
220
+ return _payload(ok=False, action=action, error="invalid_goal" if action == "set" else "invalid_command", message=result.output, state=state)
221
+ # A running turn's judge continues a resumed goal itself.
222
+ kickoff = result.prompt if result.prompt and not params.get("stream_running") else None
223
+ return _payload(action=action, message=result.output, state=state, kickoff_prompt=kickoff, **_localized(action, state, had_goal))
189
224
 
190
225
  @registry.method("goals.snapshot")
191
226
  def snapshot(ctx: CallContext, params: dict) -> dict:
@@ -212,6 +247,11 @@ def register(registry) -> None:
212
247
  try:
213
248
  if not mgr.is_active():
214
249
  return _inactive("no active goal", getattr(mgr.state, "status", None) if mgr.state is not None else None)
250
+ # Gates set on a newer Agent persist across a channel switch; this one would run them outside the workspace.
251
+ if getattr(mgr.state, "gates", None) and not _gates_run_in_workspace():
252
+ mgr.pause(reason="gates need Hermes Agent 0.21.6 or later")
253
+ return {"status": "paused", "should_continue": False, "continuation_prompt": None, "verdict": "gate_failed", "reason": "gates not run",
254
+ "message": f"⏸ Goal paused — quality gates not run. {_GATES_NEED_WORKSPACE} /goal gate clear, then /goal resume."}
215
255
  decision = mgr.evaluate_after_turn(str(params.get("last_response") or ""), user_initiated=bool(params.get("user_initiated", True)))
216
256
  except Exception as exc: # noqa: BLE001 - never fail a turn on goal evaluation
217
257
  log.debug("goal evaluation failed", exc_info=True)