@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
@@ -2,8 +2,16 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import contextlib
6
+ import hashlib
7
+ import importlib.util
8
+ import json
5
9
  import logging
10
+ import os
11
+ import pathlib
12
+ import secrets
6
13
  import threading
14
+ import time
7
15
  from typing import Any
8
16
 
9
17
  from ..errors import InvalidParams, RpcError
@@ -22,13 +30,21 @@ _RUNTIME_COMMANDS = {
22
30
  "codex-runtime": ("Toggle codex app-server runtime for OpenAI/Codex models", "Configuration", "[auto|codex_app_server]"),
23
31
  "credits": ("Show your Nous credits", "Info", ""),
24
32
  }
25
- _ALLOWED = frozenset(_RUNTIME_COMMANDS)
33
+ # Commands ``commands.exec`` runs through the Agent's registry executor (``hermes_cli.slash_exec``), so the reply is the
34
+ # Agent's own; an Agent whose registry lacks one neither lists nor runs it.
35
+ _REGISTRY_EXECUTED = frozenset({"autoprune"})
36
+ _ALLOWED = frozenset(_RUNTIME_COMMANDS) | _REGISTRY_EXECUTED
26
37
  _RELOAD_MCP_LOCK = threading.Lock()
27
38
  _RELOAD_SKILLS_LOCK = threading.Lock()
28
39
  _CODEX_RUNTIME_LOCK = threading.Lock()
40
+ _MCP_DISCOVERED_HOMES: set[str] = set()
41
+ _MCP_DISCOVERED_LOCK = threading.Lock()
42
+ _PLUGIN_UPDATE_CONSENTS: dict[str, dict] = {}
43
+ _PLUGIN_UPDATE_CONSENT_LOCK = threading.Lock()
29
44
 
30
45
 
31
- def parse_slash_command(command: str) -> tuple[str, str]:
46
+ def _split_slash_command(command: str) -> tuple[str, str]:
47
+ """The command name as typed (lowercase, no slash) and its raw arguments."""
32
48
  raw = str(command or "").strip()
33
49
  if not raw:
34
50
  raise InvalidParams("command is required")
@@ -37,7 +53,111 @@ def parse_slash_command(command: str) -> tuple[str, str]:
37
53
  base = (parts[0] if parts else "").strip().lower()
38
54
  if not base:
39
55
  raise InvalidParams("command is required")
40
- return _ALIASES.get(base, base), parts[1] if len(parts) > 1 else ""
56
+ return base, parts[1] if len(parts) > 1 else ""
57
+
58
+
59
+ def parse_slash_command(command: str) -> tuple[str, str]:
60
+ base, args = _split_slash_command(command)
61
+ return _ALIASES.get(base, base), args
62
+
63
+
64
+ def _expand_plan(args: str, **_turn) -> str:
65
+ from agent.plan_prompt import build_plan_prompt
66
+
67
+ return build_plan_prompt(args)
68
+
69
+
70
+ def _expand_learn(args: str, **_turn) -> str:
71
+ from agent.learn_prompt import build_learn_prompt
72
+
73
+ return build_learn_prompt(args)
74
+
75
+
76
+ def _expand_init(args: str, *, workspace: str, **_turn) -> str:
77
+ from hermes_cli.init_command import build_init_prompt_for_cwd
78
+
79
+ # The Agent falls back to the process cwd for a missing directory; the sidecar's is never the user's project.
80
+ if not workspace or not os.path.isdir(workspace):
81
+ raise InvalidParams("workspace is not a directory")
82
+ return build_init_prompt_for_cwd(cwd=workspace, extra=args)
83
+
84
+
85
+ def _expand_initiate_setup(_args: str, *, enabled_toolsets, **_turn) -> str:
86
+ from agent.initiate_setup_prompt import build_initiate_setup_prompt
87
+ from hermes_cli.setup_profile import primary_profile
88
+ from hermes_constants import get_hermes_home
89
+ from model_tools import get_tool_definitions
90
+
91
+ from .chat import _turn_toolsets
92
+ from .toolsets import disabled_toolsets
93
+
94
+ # The gateway's ``_hm_cmd_initiate_setup``: the tools this turn's agent gets, by name. MCP servers connect first, as
95
+ # chat start connects them before its agent snapshots tools; a failure leaves them out, as it does for the turn.
96
+ try:
97
+ discover_profile_mcp_tools()
98
+ except Exception: # noqa: BLE001
99
+ log.warning("MCP discovery failed", exc_info=True)
100
+ tools = get_tool_definitions(enabled_toolsets=_turn_toolsets(enabled_toolsets), disabled_toolsets=disabled_toolsets(),
101
+ quiet_mode=True, skip_tool_search_assembly=True)
102
+ return build_initiate_setup_prompt("webui", [tool["function"]["name"] for tool in tools], primary_profile(get_hermes_home()))
103
+
104
+
105
+ # The Agent built-ins every surface answers by rewriting the turn to a builder's prompt (the gateway's
106
+ # ``_hm_rewrite_turn_to_prompt``), with the Agent module each expander needs. ``None``: no expander yet, so no client
107
+ # offers it (``/blueprint`` seeds a turn only after its own slot parsing and job wiring).
108
+ _PROMPT_BUILTINS: dict[str, tuple[Any, str] | None] = {
109
+ "plan": (_expand_plan, "agent.plan_prompt"),
110
+ "learn": (_expand_learn, "agent.learn_prompt"),
111
+ "init": (_expand_init, "hermes_cli.init_command"),
112
+ "initiate-setup": (_expand_initiate_setup, "agent.initiate_setup_prompt"),
113
+ "blueprint": None,
114
+ }
115
+
116
+
117
+ def _prompt_expander(name: str):
118
+ """The expander for a prompt built-in this Agent ships the builder for; None when it has none."""
119
+ entry = _PROMPT_BUILTINS.get(name)
120
+ if entry is None:
121
+ return None
122
+ try:
123
+ found = importlib.util.find_spec(entry[1]) is not None
124
+ except (ImportError, ValueError):
125
+ found = False
126
+ return entry[0] if found else None
127
+
128
+
129
+ def _prompt_mode(name: str) -> str | None:
130
+ if name not in _PROMPT_BUILTINS:
131
+ return None
132
+ return "expand" if _prompt_expander(name) else "unsupported"
133
+
134
+
135
+ def expand_prompt(command: str, workspace: str, enabled_toolsets, session_id: str = "") -> dict[str, Any]:
136
+ """``/<prompt built-in> [args]`` as the turn text the Agent's own builder writes. ``name`` is the built-in's (None
137
+ when the command is not one) and ``message`` None when this Agent has no builder for it."""
138
+ try:
139
+ name, args = parse_slash_command(command)
140
+ from hermes_cli.commands import resolve_command
141
+ except (InvalidParams, ImportError):
142
+ return {"name": None, "message": None}
143
+ cmd = resolve_command(name)
144
+ if cmd is None or cmd.name not in _PROMPT_BUILTINS:
145
+ return {"name": None, "message": None}
146
+ # TAL-1279: as the CLI does, before it expands or refuses the built-in.
147
+ _fire_pre_command(command, session_id, cmd.name, workspace)
148
+ expander = _prompt_expander(cmd.name)
149
+ if expander is None:
150
+ return {"name": cmd.name, "message": None}
151
+ try:
152
+ message = str(expander(args, workspace=workspace, enabled_toolsets=enabled_toolsets) or "").strip()
153
+ except InvalidParams:
154
+ raise
155
+ except Exception as exc: # noqa: BLE001
156
+ log.warning("Failed to expand /%s", cmd.name, exc_info=True)
157
+ raise RpcError(f"Couldn't start /{cmd.name}", condition="prompt_expand_failed") from exc
158
+ if not message:
159
+ raise RpcError(f"Couldn't start /{cmd.name}", condition="prompt_expand_failed")
160
+ return {"name": cmd.name, "message": message}
41
161
 
42
162
 
43
163
  def list_commands() -> list[dict[str, Any]]:
@@ -53,13 +173,13 @@ def list_commands() -> list[dict[str, Any]]:
53
173
  out.append({
54
174
  "name": cmd.name, "description": cmd.description, "category": cmd.category, "aliases": list(cmd.aliases),
55
175
  "args_hint": cmd.args_hint, "subcommands": list(cmd.subcommands), "cli_only": bool(cmd.cli_only), "gateway_only": bool(cmd.gateway_only),
56
- "exec": cmd.name in _ALLOWED,
176
+ "exec": cmd.name in _ALLOWED, "prompt": _prompt_mode(cmd.name),
57
177
  })
58
178
  listed = {c["name"] for c in out}
59
179
  for name, (description, category, args_hint) in _RUNTIME_COMMANDS.items():
60
180
  if name not in listed:
61
181
  out.append({"name": name, "description": description, "category": category, "aliases": [a for a, n in _ALIASES.items() if n == name],
62
- "args_hint": args_hint, "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True})
182
+ "args_hint": args_hint, "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True, "prompt": None})
63
183
  try:
64
184
  from hermes_cli.plugins import get_plugin_commands
65
185
 
@@ -68,7 +188,7 @@ def list_commands() -> list[dict[str, Any]]:
68
188
  if name in existing or name in _NEVER_EXPOSE:
69
189
  continue
70
190
  out.append({"name": name, "description": str(info.get("description", "Plugin command")), "category": "Plugin", "aliases": [],
71
- "args_hint": str(info.get("args_hint", "")), "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True})
191
+ "args_hint": str(info.get("args_hint", "")), "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True, "prompt": None})
72
192
  except Exception: # noqa: BLE001 - plugin registry is optional
73
193
  log.debug("plugin command listing failed", exc_info=True)
74
194
  return out
@@ -95,15 +215,42 @@ def retire_unscoped_launch_mcp_servers() -> set[str]:
95
215
  return names
96
216
 
97
217
 
218
+ def discover_profile_mcp_tools() -> list[str]:
219
+ """Connect this profile's configured servers, retiring pre-multiplex launch connections first."""
220
+ from hermes_constants import get_hermes_home
221
+ from tools.mcp_tool_discovery import discover_mcp_tools
222
+
223
+ retire_unscoped_launch_mcp_servers()
224
+ tools = discover_mcp_tools()
225
+ with _MCP_DISCOVERED_LOCK:
226
+ _MCP_DISCOVERED_HOMES.add(os.path.realpath(get_hermes_home()))
227
+ return tools
228
+
229
+
230
+ def profile_mcp_tools_discovered(home) -> bool:
231
+ """A completed discovery, including an empty registry, establishes this process's profile baseline."""
232
+ with _MCP_DISCOVERED_LOCK:
233
+ return os.path.realpath(home) in _MCP_DISCOVERED_HOMES
234
+
235
+
236
+ def forget_profile_mcp_tools(home) -> None:
237
+ """A successfully deleted profile must start cold if its path is recreated."""
238
+ with _MCP_DISCOVERED_LOCK:
239
+ _MCP_DISCOVERED_HOMES.discard(os.path.realpath(home))
240
+
241
+
98
242
  def _reload_mcp() -> str:
99
243
  with _RELOAD_MCP_LOCK:
100
244
  try:
101
245
  from agent.secret_scope import is_multiplex_active
246
+ from hermes_constants import get_hermes_home
102
247
  from tools.mcp_tool import _lock, _mcp_tool_server_names, _server_visible_in_scope, _servers
103
- from tools.mcp_tool_discovery import discover_mcp_tools
248
+ from tools.mcp_tool_agent import reprobe_tool_availability
104
249
  from tools.mcp_tool_lifecycle import shutdown_mcp_servers
105
250
  from tools.mcp_tool_scope import _key_name
106
251
  from tools.registry import registry
252
+
253
+ from .chat import refresh_profile_agents_mcp_tools
107
254
  except Exception as exc: # noqa: BLE001
108
255
  raise RpcError("MCP runtime unavailable", condition="mcp_unavailable") from exc
109
256
  # Like the gateway's ``_execute_mcp_reload``: under multiplexing only this profile's connections go down and
@@ -117,7 +264,11 @@ def _reload_mcp() -> str:
117
264
  try:
118
265
  old = server_names() | retire_unscoped_launch_mcp_servers()
119
266
  shutdown_mcp_servers(scope=scope)
120
- tools = discover_mcp_tools() or []
267
+ # As the gateway does: drop the cached tool availability verdicts, then hand the profile's open chats the
268
+ # rediscovered tools.
269
+ reprobe_tool_availability()
270
+ tools = discover_profile_mcp_tools() or []
271
+ refresh_profile_agents_mcp_tools(get_hermes_home())
121
272
  connected = server_names()
122
273
  if scope is not None:
123
274
  with _lock:
@@ -210,11 +361,43 @@ def _credits() -> str:
210
361
  return "\n".join(lines)
211
362
 
212
363
 
213
- def execute_agent_command(command: str) -> str | None:
364
+ def _fire_pre_command(command: str, session_id: str, canonical: str | None = None, workspace: str = "") -> None:
365
+ """The Agent's observer-only ``pre_command`` hook, which every local surface fires before a recognised command runs.
366
+ A chat's observers run under that chat's session and workspace, as its plugin commands and turns do."""
367
+ from hermes_cli.plugins import fire_pre_command_hook
368
+
369
+ from .chat import _turn_identity
370
+
371
+ typed, arg = _split_slash_command(command)
372
+ with _turn_identity(session_id, workspace) if session_id else contextlib.nullcontext():
373
+ fire_pre_command_hook(surface="webui", command=canonical or _ALIASES.get(typed, typed), alias_used=typed, args_raw=arg,
374
+ session_key=session_id or None, platform="webui")
375
+
376
+
377
+ def _registry_executor(name: str):
378
+ """The Agent registry's shared executor for ``name``; None when this Agent has none."""
379
+ try:
380
+ from hermes_cli.commands import resolve_command
381
+ from hermes_cli.slash_exec import resolve_executor
382
+ except ImportError:
383
+ return None
384
+ cmd = resolve_command(name)
385
+ return resolve_executor(cmd) if cmd is not None else None
386
+
387
+
388
+ def execute_agent_command(command: str, session_id: str = "", workspace: str = "") -> str | None:
214
389
  """Run one of the allowlisted agent-side runtime commands; None when not one."""
215
390
  canonical, arg_string = parse_slash_command(command)
216
391
  if canonical not in _ALLOWED:
217
392
  return None
393
+ executor = _registry_executor(canonical) if canonical in _REGISTRY_EXECUTED else None
394
+ if canonical in _REGISTRY_EXECUTED and executor is None:
395
+ return None
396
+ _fire_pre_command(command, session_id, workspace=workspace)
397
+ if executor is not None:
398
+ from hermes_cli.slash_exec import CommandContext
399
+
400
+ return str(executor(CommandContext(surface="webui", args=arg_string)).text or "(no output)")
218
401
  if canonical == "reload-mcp":
219
402
  return _reload_mcp()
220
403
  if canonical == "reload-skills":
@@ -224,7 +407,16 @@ def execute_agent_command(command: str) -> str | None:
224
407
  return _credits()
225
408
 
226
409
 
227
- def execute_plugin_command(command: str) -> str | None:
410
+ def _invoke_plugin_handler(handler, arg: str, session_id: str):
411
+ """``handler(arg)`` plus the session context it declares, as every Agent surface calls it (v0.22.3+)."""
412
+ try:
413
+ from hermes_cli.plugin_command_dispatch import invoke_plugin_command
414
+ except ImportError: # Delete this fallback once v0.22.3 is the oldest supported Agent.
415
+ return handler(arg)
416
+ return invoke_plugin_command(handler, arg, source=None, session_id=session_id, session_key=session_id, platform="webui")
417
+
418
+
419
+ def execute_plugin_command(command: str, session_id: str = "") -> str | None:
228
420
  """Run a plugin-registered slash command; None when no plugin owns it."""
229
421
  base, arg = parse_slash_command(command)
230
422
  try:
@@ -237,8 +429,9 @@ def execute_plugin_command(command: str) -> str | None:
237
429
  raise RpcError("plugin command lookup failed", condition="plugins_unavailable") from exc
238
430
  if not handler:
239
431
  return None
432
+ _fire_pre_command(command, session_id)
240
433
  try:
241
- return str(resolve_plugin_command_result(handler(arg)) or "(no output)")
434
+ return str(resolve_plugin_command_result(_invoke_plugin_handler(handler, arg, session_id)) or "(no output)")
242
435
  except Exception as exc: # noqa: BLE001 - user-facing text, never a transport error
243
436
  log.warning("Plugin command %r execution failed", base, exc_info=True)
244
437
  return f"Plugin command error: {type(exc).__name__}"
@@ -360,6 +553,103 @@ def _clean_text(value, limit: int = 240) -> str:
360
553
  return text[: limit - 1].rstrip() + "…" if len(text) > limit else text
361
554
 
362
555
 
556
+ def _plugin_update_modules():
557
+ try:
558
+ from hermes_cli import plugins_cmd, plugins_transaction
559
+ from hermes_cli.plugins_cadence import cached_git_updates
560
+ except ImportError:
561
+ return None
562
+ return plugins_cmd, plugins_transaction, cached_git_updates
563
+
564
+
565
+ def update_plugin(key: str, accept_caution: bool, consent_token: str | None = None) -> dict:
566
+ """The Agent owns Git staging, scan consent and publication, under the caller's profile scope."""
567
+ if not key or not isinstance(accept_caution, bool) or (consent_token is not None and not isinstance(consent_token, str)):
568
+ raise InvalidParams("plugins.update requires a key and boolean accept_caution")
569
+ modules = _plugin_update_modules()
570
+ if modules is None:
571
+ raise RpcError("This Hermes Agent cannot update plugins from Web", condition="plugin_update_unsupported")
572
+ pc, transaction, _cached = modules
573
+ found = pc._find_plugin_entry(key)
574
+ if found is None or not found[4]:
575
+ raise RpcError(f"plugin {key!r} not found", condition="plugin_not_found")
576
+ from hermes_constants import get_hermes_home
577
+ target = pathlib.Path(str(found[4])).resolve()
578
+ # Only profile-owned installs, never bundled, project or entrypoint plugins.
579
+ if target.parent != (get_hermes_home() / "plugins").resolve():
580
+ raise InvalidParams("Only profile-installed Git plugins can be updated")
581
+ from pm.store import tree_digest
582
+ from tools.plugin_guard import format_scan_report
583
+
584
+ def installed_identity():
585
+ return (str(get_hermes_home().resolve()), str(target.resolve()), found[5], tree_digest(target),
586
+ json.dumps(pc._read_install_metadata().get(target.name, {}), sort_keys=True))
587
+
588
+ identity = installed_identity()
589
+ with _PLUGIN_UPDATE_CONSENT_LOCK:
590
+ now = time.monotonic()
591
+ for token, receipt in list(_PLUGIN_UPDATE_CONSENTS.items()):
592
+ if receipt["expires"] <= now:
593
+ _PLUGIN_UPDATE_CONSENTS.pop(token)
594
+ consent = _PLUGIN_UPDATE_CONSENTS.pop(consent_token, None) if accept_caution and consent_token else None
595
+ if accept_caution and consent_token and (consent is None or consent["identity"] != identity):
596
+ raise RpcError("Plugin update confirmation expired or the installation changed; update again to review its scan",
597
+ condition="plugin_update_consent_changed")
598
+
599
+ revision = ""
600
+ consent_changed = False
601
+ changed_message = "The plugin installation or revision changed; update again to review its scan"
602
+
603
+ # The Agent staging hook exposes the candidate commit before its scan and publication gates.
604
+ def capture_revision(staged):
605
+ nonlocal revision, consent_changed
606
+ if not staged.resolve().is_relative_to(target.parent) or installed_identity() != identity:
607
+ consent_changed = True
608
+ raise pc.PluginOperationError(changed_message)
609
+ revision = pc._git_head_revision(staged, pc._resolve_git_executable())
610
+ if consent and consent["revision"] != revision:
611
+ consent_changed = True
612
+ raise pc.PluginOperationError(changed_message)
613
+ return []
614
+
615
+ def scan_binding(scan):
616
+ payload = json.dumps([format_scan_report(scan), getattr(scan, "scan_provenance", {}),
617
+ [vars(finding) for finding in getattr(scan, "findings", [])]], sort_keys=True)
618
+ return hashlib.sha256(payload.encode()).hexdigest()
619
+
620
+ def accept_scan(scan):
621
+ nonlocal consent_changed
622
+ if installed_identity() != identity:
623
+ consent_changed = True
624
+ return False
625
+ return consent is not None and consent["revision"] == revision and consent["scan"] == scan_binding(scan)
626
+
627
+ try:
628
+ # A blanket force would bypass the callback: only the exact scanned identity can accept caution.
629
+ transaction.update_plugin(target, force=False, scan_decision_cb=accept_scan, carry_user_files=capture_revision)
630
+ except pc.PluginScanBlocked as exc:
631
+ if consent_changed:
632
+ raise RpcError(changed_message, condition="plugin_update_consent_changed") from exc
633
+ scan = exc.scan_result
634
+ verdict = getattr(scan, "verdict", "dangerous")
635
+ result = {"key": found[5], "status": "needs_consent" if verdict == "caution" else "blocked",
636
+ "verdict": verdict, "findings": str(exc)}
637
+ if verdict == "caution":
638
+ token = secrets.token_urlsafe(32)
639
+ with _PLUGIN_UPDATE_CONSENT_LOCK:
640
+ if len(_PLUGIN_UPDATE_CONSENTS) >= 64:
641
+ _PLUGIN_UPDATE_CONSENTS.pop(next(iter(_PLUGIN_UPDATE_CONSENTS)))
642
+ _PLUGIN_UPDATE_CONSENTS[token] = {"identity": identity, "revision": revision, "scan": scan_binding(scan),
643
+ "expires": time.monotonic() + 300}
644
+ result["consent_token"] = token
645
+ return result
646
+ except pc.PluginOperationError as exc:
647
+ raise RpcError(str(exc), condition="plugin_update_consent_changed" if consent_changed else "plugin_update_refused") from exc
648
+ from hermes_cli.plugins import discover_plugins
649
+ discover_plugins(force=True)
650
+ return {"key": found[5], "status": "updated"}
651
+
652
+
363
653
  def plugin_visibility(selected_providers: dict) -> dict:
364
654
  """Sanitized plugin/hook rows for Settings (Python ``_plugin_visibility_payload``); no paths or callbacks."""
365
655
  try:
@@ -369,6 +659,12 @@ def plugin_visibility(selected_providers: dict) -> dict:
369
659
  manager.discover_and_load(force=False)
370
660
  except Exception as exc: # noqa: BLE001
371
661
  raise RpcError(f"plugin manager unavailable: {exc}", condition="plugins_unavailable") from exc
662
+ modules = _plugin_update_modules()
663
+ updates = None
664
+ if modules:
665
+ from hermes_cli.plugins_provenance import read_sidecar_rows
666
+ from hermes_constants import get_hermes_home
667
+ updates = modules[2](read_sidecar_rows(get_hermes_home() / "plugins"))
372
668
  rows = []
373
669
  for key, loaded in sorted((getattr(manager, "_plugins", {}) or {}).items(), key=lambda item: str(item[0])):
374
670
  manifest = getattr(loaded, "manifest", None)
@@ -400,10 +696,141 @@ def plugin_visibility(selected_providers: dict) -> dict:
400
696
  row["is_active_provider"] = bool(selected) and slug == selected
401
697
  else:
402
698
  row["is_active_provider"] = kind == "model-provider" and enabled
699
+ if updates is not None:
700
+ installed = pathlib.Path(str(getattr(manifest, "path", "") or "")).resolve()
701
+ owned = installed.parent == (get_hermes_home() / "plugins").resolve() and (installed / ".git").is_dir()
702
+ revision = updates.get(installed.name) if owned else None
703
+ row["update_available"] = bool(revision)
704
+ if revision:
705
+ row["latest_revision"] = revision
403
706
  rows.append(row)
404
707
  return {"plugins": rows, "supported_hooks": list(PLUGIN_VISIBILITY_HOOKS)}
405
708
 
406
709
 
710
+ def isolation_survey(base_home: pathlib.Path) -> list[dict]:
711
+ """Each profile's ``plugins.isolation`` and installed third-party plugin count, read from disk without loading a plugin."""
712
+ from hermes_cli.plugin_isolation import isolation_mode
713
+ from hermes_cli.plugins_cmd import _scan_level
714
+
715
+ from .profiles import _yaml_load, named_profile_homes
716
+
717
+ rows = []
718
+ for name, home in [("default", base_home), *named_profile_homes(base_home)]:
719
+ seen: dict = {}
720
+ _scan_level(home / "plugins", "user", set(), "", 0, seen)
721
+ rows.append({"name": name, "isolation": isolation_mode(_yaml_load(home / "config.yaml") or {}), "third_party_plugins": len(seen)})
722
+ return rows
723
+
724
+
725
+ def _plugin_settings_modules():
726
+ """The Agent's manifest ``config_schema`` reader/writer (v0.21.6+) and its plugin resolver; ``None`` on older Agents."""
727
+ try:
728
+ import hermes_cli.plugins_cmd as plugins_cmd
729
+ import hermes_cli.plugins_settings as plugins_settings
730
+ except ImportError:
731
+ return None
732
+ return plugins_cmd, plugins_settings
733
+
734
+
735
+ def plugin_settings() -> dict:
736
+ """Every discovered plugin whose manifest declares settings, with its fields (secrets as ``env`` + ``has_value`` only)."""
737
+ modules = _plugin_settings_modules()
738
+ if modules is None:
739
+ return {"supported": False, "plugins": []}
740
+ plugins_cmd, plugins_settings = modules
741
+ rows = []
742
+ for _name, _version, _desc, _source, plugin_dir, key in plugins_cmd._discover_all_plugins():
743
+ fields = plugins_settings.plugin_settings_fields(key, pathlib.Path(str(plugin_dir)) if plugin_dir else None)
744
+ if fields:
745
+ rows.append({"key": key, "fields": fields})
746
+ return {"supported": True, "plugins": rows}
747
+
748
+
749
+ def _apply_plugin_mcp_settings(plugins_cmd, plugin_dir, key: str) -> str:
750
+ """Reconcile package-owned launch inputs on the RPC worker, preserving the request's profile scope."""
751
+ try:
752
+ if not plugin_dir or not plugins_cmd._is_portable_plugin_dir(plugin_dir):
753
+ return "applied"
754
+ from hermes_cli.agent_plugins import load_agent_plugin
755
+ from hermes_cli.plugins_manifest import portable_mcp_server_name
756
+
757
+ package = load_agent_plugin(plugin_dir, plugin_dir)
758
+ if any(d.scope == "mcp" or d.scope.startswith("mcp:") for d in package.diagnostics):
759
+ return "unknown"
760
+ names = {portable_mcp_server_name(key, server) for server in package.mcp_servers}
761
+ if not names:
762
+ return "applied"
763
+ from hermes_cli.config import load_config_readonly
764
+ from hermes_cli.plugins import get_plugin_manager
765
+
766
+ manager = get_plugin_manager()
767
+ manager.discover_and_load(force=False)
768
+ owners = getattr(manager, "_portable_mcp_server_plugins", None)
769
+ if owners is None:
770
+ return "restart_required"
771
+ native = (load_config_readonly() or {}).get("mcp_servers") or {}
772
+ names = {name for name in names if owners.get(name) == key and name not in native}
773
+ if not names:
774
+ return "applied"
775
+ from tools import mcp_tool_discovery as discovery
776
+
777
+ reconnect = getattr(discovery, "restart_mcp_servers_with_new_inputs", None)
778
+ if reconnect is None:
779
+ return "restart_required"
780
+ # Also exclude the explicit Reload MCP path. The native helper serializes settings-driven reconnects.
781
+ with _RELOAD_MCP_LOCK:
782
+ live = {row["name"] for row in discovery.get_mcp_status() if row["name"] in names and row.get("connected")}
783
+ restarted = reconnect(names)
784
+ if restarted:
785
+ from hermes_constants import get_hermes_home
786
+
787
+ from .chat import refresh_profile_agents_mcp_tools
788
+
789
+ refresh_profile_agents_mcp_tools(get_hermes_home())
790
+ statuses = {row["name"]: row["status"] for row in discovery.get_mcp_status() if row["name"] in names}
791
+ if any(status == "failed" for status in statuses.values()):
792
+ return "restart_required"
793
+ if any(status == "connecting" for status in statuses.values()) or any(name not in statuses for name in live | set(restarted)):
794
+ return "unknown"
795
+ return "applied"
796
+ except ImportError:
797
+ return "restart_required"
798
+ except Exception: # noqa: BLE001
799
+ # Persistence already succeeded. Neither expose launch inputs in an exception nor retry an uncertain reconnect.
800
+ return "unknown"
801
+
802
+
803
+ def save_plugin_settings(key: str, values: Any, secret_envs: Any = None) -> dict:
804
+ """Write manifest-declared, non-secret settings through the Agent's locked writer; returns the refreshed fields.
805
+
806
+ ``secret_envs`` (secret key -> ``.env`` name the caller wrote) must still match the manifest before anything is written.
807
+ """
808
+ if not key or not isinstance(values, dict) or not isinstance(secret_envs or {}, dict):
809
+ raise InvalidParams("plugins.settings_save requires a 'key' and a 'values' mapping")
810
+ modules = _plugin_settings_modules()
811
+ if modules is None:
812
+ raise RpcError("This Hermes Agent cannot edit plugin settings", condition="plugin_settings_unsupported")
813
+ plugins_cmd, plugins_settings = modules
814
+ found = plugins_cmd._find_plugin_entry(key)
815
+ if found is None:
816
+ raise RpcError(f"plugin {key!r} not found", condition="plugin_not_found")
817
+ plugin_dir = pathlib.Path(str(found[4])) if found[4] else None
818
+ current = {field["key"]: field for field in plugins_settings.plugin_settings_fields(found[5], plugin_dir)}
819
+ for secret, env in (secret_envs or {}).items():
820
+ field = current.get(str(secret))
821
+ if field is None or field.get("type") != "secret" or field.get("env") != env:
822
+ raise RpcError(f"{secret!r} is no longer stored in {env}", condition="plugin_settings_changed")
823
+ try:
824
+ written = plugins_settings.save_plugin_settings(found[5], plugin_dir, values)
825
+ except PermissionError as exc:
826
+ raise RpcError(str(exc), condition="plugin_settings_managed") from exc
827
+ except ValueError as exc:
828
+ raise InvalidParams(str(exc)) from exc
829
+ fields = plugins_settings.plugin_settings_fields(found[5], plugin_dir)
830
+ application = _apply_plugin_mcp_settings(plugins_cmd, plugin_dir, found[5])
831
+ return {"key": found[5], "written": written, "fields": fields, "runtime_application": application}
832
+
833
+
407
834
  def register(registry) -> None:
408
835
  @registry.method("commands.registry")
409
836
  def registry_(ctx: CallContext, params: dict) -> dict:
@@ -413,16 +840,28 @@ def register(registry) -> None:
413
840
  @registry.method("commands.exec")
414
841
  def exec_(ctx: CallContext, params: dict) -> dict:
415
842
  command = str(params.get("command") or "")
843
+ session_id = str(params.get("session_id") or "").strip()
844
+ workspace = str(params.get("workspace") or "")
416
845
  with scoped_home(profile_home_param(params)):
417
- output = execute_agent_command(command)
846
+ output = execute_agent_command(command, session_id, workspace)
418
847
  source = "agent"
419
848
  if output is None:
420
- output = execute_plugin_command(command)
849
+ from .chat import _turn_identity
850
+
851
+ # TAL-904: a chat's plugin command runs under that chat's session and workspace, as its turns do.
852
+ with _turn_identity(session_id, workspace) if session_id else contextlib.nullcontext():
853
+ output = execute_plugin_command(command, session_id)
421
854
  source = "plugin"
422
855
  if output is None:
423
856
  raise RpcError(f"unknown command {parse_slash_command(command)[0]!r}", condition="command_not_found")
424
857
  return {"output": output, "source": source}
425
858
 
859
+ @registry.method("commands.expand_prompt")
860
+ def expand_prompt_(ctx: CallContext, params: dict) -> dict:
861
+ with scoped_home(profile_home_param(params)):
862
+ return expand_prompt(str(params.get("command") or ""), str(params.get("workspace") or ""), params.get("enabled_toolsets"),
863
+ str(params.get("session_id") or "").strip())
864
+
426
865
  @registry.method("commands.bundles")
427
866
  def bundles(ctx: CallContext, params: dict) -> dict:
428
867
  with scoped_home(profile_home_param(params)):
@@ -447,3 +886,34 @@ def register(registry) -> None:
447
886
  def list_(ctx: CallContext, params: dict) -> dict:
448
887
  with scoped_home(profile_home_param(params)):
449
888
  return plugin_visibility(params.get("selected_providers") if isinstance(params.get("selected_providers"), dict) else {})
889
+
890
+ @registry.method("plugins.catalog")
891
+ def catalog_(ctx: CallContext, params: dict) -> dict:
892
+ from .plugin_catalog import catalog
893
+ with scoped_home(profile_home_param(params)):
894
+ return catalog(params.get('query', ''), params.get('offset', 0), params.get('limit', 20))
895
+
896
+ @registry.method("plugins.install")
897
+ def install_(ctx: CallContext, params: dict) -> dict:
898
+ from .plugin_catalog import install
899
+ with scoped_home(profile_home_param(params)):
900
+ return install(params.get('name'), params.get('consent_token'))
901
+
902
+ @registry.method("plugins.update")
903
+ def update(ctx: CallContext, params: dict) -> dict:
904
+ with scoped_home(profile_home_param(params)):
905
+ return update_plugin(str(params.get("key") or "").strip(), params.get("accept_caution", False), params.get("consent_token"))
906
+
907
+ @registry.method("plugins.isolation")
908
+ def isolation(ctx: CallContext, params: dict) -> dict:
909
+ return {"profiles": isolation_survey(profile_home_param(params, "base_home"))}
910
+
911
+ @registry.method("plugins.settings")
912
+ def settings(ctx: CallContext, params: dict) -> dict:
913
+ with scoped_home(profile_home_param(params)):
914
+ return plugin_settings()
915
+
916
+ @registry.method("plugins.settings_save")
917
+ def settings_save(ctx: CallContext, params: dict) -> dict:
918
+ with scoped_home(profile_home_param(params)):
919
+ return save_plugin_settings(str(params.get("key") or "").strip(), params.get("values"), params.get("secret_envs"))