@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
@@ -10,10 +10,14 @@ composes: ``hermes_cli.auth``, ``hermes_cli.models``, ``hermes_cli.runtime_provi
10
10
  from __future__ import annotations
11
11
 
12
12
  import dataclasses
13
+ import json
13
14
  import logging
15
+ import sqlite3
14
16
  import sys
15
17
  import threading
18
+ from contextlib import closing
16
19
  from pathlib import Path
20
+ from types import SimpleNamespace
17
21
  from typing import Any
18
22
 
19
23
  from ..errors import InvalidParams, RpcError
@@ -94,6 +98,50 @@ def _user_plugin_profiles() -> dict[int, tuple[Any, Path]]:
94
98
  return out
95
99
 
96
100
 
101
+ def _hosted_plugin_profiles(roots: dict[Path, str]) -> dict[Path, list] | None:
102
+ """Resolve enabled directories through the Agent's host metadata and scoped provider registry."""
103
+ import providers
104
+
105
+ if not hasattr(providers, "_home_layer") or not callable(getattr(providers, "provider_source", None)):
106
+ return None
107
+ try:
108
+ from hermes_cli.plugin_isolation import ISOLATION_HOST, isolation_mode
109
+ except ImportError: # per-home registries predate host isolation
110
+ return None
111
+
112
+ if isolation_mode() != ISOLATION_HOST:
113
+ return None
114
+ from hermes_cli.plugin_host_profiles import load_hosted_profiles
115
+ from hermes_constants import get_hermes_home, hermes_home_key
116
+
117
+ registered = {p.name: p for p in providers.list_providers() if providers.provider_source(p.name) == "user"}
118
+ home_key = hermes_home_key(get_hermes_home())
119
+ # Discovery also loads disabled and manifest-less category plugins. Include them when checking name collisions.
120
+ directories = set(roots)
121
+ for parent, flat in ((providers._user_plugins_dir(), False), (providers._installed_plugins_dir(), True)):
122
+ if parent is not None:
123
+ directories.update(child.resolve() for child in parent.iterdir()
124
+ if child.is_dir() and not child.name.startswith(("_", "."))
125
+ and (not flat or (child.name != "model-providers" and providers._declares_model_provider_kind(child))))
126
+ owners: dict[str, set[Path]] = {}
127
+ for root in directories:
128
+ try:
129
+ # Reuse the Agent's cached extraction; provider ids need not match manifest or directory names.
130
+ profiles = load_hosted_profiles(root, providers._user_module_name(root, home_key))
131
+ for profile in profiles:
132
+ owners.setdefault(profile.name, set()).add(root)
133
+ except Exception: # noqa: BLE001 - failed extraction keeps the manifest's not_loaded row
134
+ log.debug("reading hosted provider plugin %s failed", root, exc_info=True)
135
+ found: dict[Path, list] = {root: [] for root in roots}
136
+ for name, profile in registered.items():
137
+ origins = owners.get(name, set())
138
+ if len(origins) == 1:
139
+ root = next(iter(origins))
140
+ if root in found:
141
+ found[root].append(profile)
142
+ return found
143
+
144
+
97
145
  def _load_plugin(root: Path) -> None:
98
146
  """Load the scoped profile's installed plugin that the process-wide discovery (run under the launch profile) skipped.
99
147
 
@@ -123,12 +171,13 @@ def _load_plugin(root: Path) -> None:
123
171
  def installed_plugin_profiles() -> list[tuple[str, Any]]:
124
172
  """``(manifest name, profile | None)`` for each enabled model-provider plugin installed in the scoped home.
125
173
 
126
- Bundled providers are built-ins, not plugins. A profile belongs to this home only when the plugin module that
127
- registered it lives in one of this home's plugin directories; a plugin the launch discovery skipped is loaded here.
128
- ``None`` means the plugin could not be loaded: it failed to import, another plugin took its provider id (only on an
129
- Agent with one process-wide provider registry rather than per-home layers), or another profile's plugin has the same
130
- directory name. ponytail: ownership is read from the plugin module's globals, so a plugin that registers an unbound
131
- inline profile also reads as not loaded; track registrations in the Agent if one ever does.
174
+ Bundled providers are built-ins, not plugins. Hosted profiles come from the Agent's scoped user registry and
175
+ directory metadata. In-process profiles belong to this home when their module lives in its plugin directories;
176
+ a plugin the launch discovery skipped is loaded here.
177
+ ``None`` means the plugin could not be loaded or attributed: it failed to import, its hosted provider id is
178
+ ambiguous, or a registration/module name collided in an older process-wide registry.
179
+ shortcut: in-process ownership uses module globals, so an unbound inline profile reads as not
180
+ loaded; use Agent registration metadata if it becomes available.
132
181
  """
133
182
  try:
134
183
  from hermes_cli.plugins_discovery import _get_disabled_plugins, _get_enabled_plugins, collect_directory_manifests, gate_manifest
@@ -143,6 +192,10 @@ def installed_plugin_profiles() -> list[tuple[str, Any]]:
143
192
  if not roots:
144
193
  return []
145
194
 
195
+ hosted = _hosted_plugin_profiles(roots)
196
+ if hosted is not None:
197
+ return [(name, p) for root, name in roots.items() for p in (hosted[root] or [None])]
198
+
146
199
  def owned() -> dict[Path, list]:
147
200
  found: dict[Path, list] = {root: [] for root in roots}
148
201
  for profile, directory in _user_plugin_profiles().values():
@@ -160,12 +213,17 @@ def installed_plugin_profiles() -> list[tuple[str, Any]]:
160
213
  return [(name, p) for root, name in roots.items() for p in (found[root] or [None])]
161
214
 
162
215
 
163
- def _other_profile_plugin(provider_id: str) -> bool:
164
- """Whether ``provider_id`` is a plugin provider that another profile installed (the registry is process-wide)."""
165
- from providers import get_provider_profile
216
+ def _unavailable_plugin(provider_id: str) -> bool:
217
+ """Whether a registered plugin lacks an enabled, unambiguous owner in this home."""
218
+ import providers
166
219
 
167
- profile = get_provider_profile(provider_id)
168
- if profile is None or id(profile) not in _user_plugin_profiles():
220
+ profile = providers.get_provider_profile(provider_id)
221
+ if profile is None:
222
+ return False
223
+ if hasattr(providers, "_home_layer") and callable(getattr(providers, "provider_source", None)):
224
+ if providers.provider_source(profile.name) != "user":
225
+ return False
226
+ elif id(profile) not in _user_plugin_profiles():
169
227
  return False
170
228
  return not any(p is profile for _name, p in installed_plugin_profiles())
171
229
 
@@ -197,6 +255,9 @@ def _setup_state(profile: Any) -> str:
197
255
  return "unavailable"
198
256
  if profile.auth_type == "external_process":
199
257
  return "ready" if status.get("configured") else "missing_cli"
258
+ if profile.auth_type in ("oauth_external", "oauth_device_code"):
259
+ # The Agent's ``configured`` only means registered here; a pooled token, live or refreshable on use, means signed in.
260
+ return "ready" if status.get("logged_in") or status.get("needs_refresh") else "needs_setup"
200
261
  return "ready" if status.get("logged_in") or status.get("configured") else "needs_setup"
201
262
 
202
263
 
@@ -212,47 +273,97 @@ def plugin_providers() -> list[dict]:
212
273
  return rows
213
274
 
214
275
 
215
- def _plugin_catalog(provider_id: str) -> list[str]:
276
+ def _plugin_catalog(provider_id: str) -> tuple[list[str], bool]:
216
277
  """Discovery for an installed plugin the Agent's catalog has no fetcher for: the profile's own listing, then its fallback.
217
278
 
218
279
  API-key plugins already get both from ``provider_model_ids`` with their key, so only keyless auth types list here.
280
+ Like the Agent, the fallback list is a placeholder only when a listing was tried and declined.
219
281
  """
220
282
  for _name, profile in installed_plugin_profiles():
221
283
  if profile is None or str(profile.name).strip().lower() != provider_id.strip().lower():
222
284
  continue
285
+ lists = bool(profile.supports_model_listing) and profile.auth_type != "api_key"
223
286
  try:
224
- live = profile.fetch_models(timeout=8.0) if profile.supports_model_listing and profile.auth_type != "api_key" else None
287
+ live = profile.fetch_models(timeout=8.0) if lists else None
225
288
  except Exception: # noqa: BLE001 - a broken plugin answers with its fallback catalog
226
289
  log.debug("fetch_models(%r) failed", provider_id, exc_info=True)
227
290
  live = None
228
- return [str(m) for m in (live or profile.fallback_models or ()) if m]
229
- return []
291
+ return [str(m) for m in (live or profile.fallback_models or ()) if m], lists and not live
292
+ return [], False
230
293
 
231
294
 
232
- def model_ids(provider_id: str, *, force_refresh: bool) -> list[str]:
295
+ def model_ids(provider_id: str, *, force_refresh: bool) -> tuple[list[str], bool]:
296
+ """The Agent's catalog for a provider, and whether it is the curated placeholder for an unreachable one (TAL-799)."""
233
297
  try:
234
- from hermes_cli.models import provider_model_ids
298
+ from hermes_cli import models
235
299
  except Exception as exc: # noqa: BLE001
236
300
  raise RpcError(f"model catalog unavailable: {exc}", condition="providers_unavailable") from exc
237
301
  try:
238
- if _other_profile_plugin(provider_id):
239
- return []
240
- except Exception: # noqa: BLE001 - no readable provider registry means no plugin to keep apart
302
+ if _unavailable_plugin(provider_id):
303
+ return [], False
304
+ except Exception: # noqa: BLE001 - an unverified owner must not expose another plugin's models
241
305
  log.debug("plugin ownership check for %r failed", provider_id, exc_info=True)
306
+ return [], False
242
307
  try:
243
- ids = provider_model_ids(provider_id, force_refresh=force_refresh)
308
+ ids = models.provider_model_ids(provider_id, force_refresh=force_refresh)
244
309
  except TypeError:
245
- ids = provider_model_ids(provider_id)
310
+ ids = models.provider_model_ids(provider_id)
246
311
  except Exception: # noqa: BLE001
247
312
  log.debug("provider_model_ids(%r) failed", provider_id, exc_info=True)
248
313
  ids = []
314
+ # Agents before the marker never flag a fallback.
315
+ curated = getattr(models, "CuratedFallbackModels", None)
316
+ fallback = isinstance(curated, type) and isinstance(ids, curated)
249
317
  ids = [str(m) for m in (ids or []) if m]
250
318
  if ids:
251
- return ids
319
+ return ids, fallback
252
320
  try:
253
321
  return _plugin_catalog(provider_id)
254
322
  except RpcError:
255
- return []
323
+ return [], False
324
+
325
+
326
+ def _requests_local_runtime(requested: str | None) -> bool:
327
+ """Whether a resolution asks for the Agent's managed llama.cpp provider, picked the way the Agent picks it: the
328
+ named provider, else the profile's, else ``HERMES_INFERENCE_PROVIDER``."""
329
+ try:
330
+ from hermes_cli.providers import LLAMACPP_ALIASES
331
+ from hermes_cli.runtime_provider import resolve_requested_provider
332
+
333
+ return resolve_requested_provider(requested) in LLAMACPP_ALIASES
334
+ except Exception: # noqa: BLE001 - an Agent without the local runtime
335
+ return False
336
+
337
+
338
+ def runtime_failure(exc: Exception, requested: str | None, message: str | None = None) -> RpcError:
339
+ """The typed error for a runtime that did not resolve. The local llama.cpp provider has no credential to add: it
340
+ fails because its server is off or still starting, and the Agent's message says which (TAL-798)."""
341
+ condition = "local_runtime_unavailable" if _requests_local_runtime(requested) else "credential_missing"
342
+ return RpcError(message or str(exc), condition=condition, data={"error_type": type(exc).__name__})
343
+
344
+
345
+ def local_models() -> dict:
346
+ """The Agent's managed llama.cpp runtime (TAL-798): the downloaded GGUFs, selectable before its server runs (a turn
347
+ on one boots it), and the endpoint the running server recorded. An Agent without the local runtime lists none."""
348
+ try:
349
+ from hermes_cli.local_runtime.bootstrap import staged_model_ids
350
+ from hermes_cli.providers import LLAMACPP_PROVIDER_ID
351
+ except Exception: # noqa: BLE001 - predates the local runtime
352
+ return {"provider_id": "", "models": [], "current_endpoint": None}
353
+ try:
354
+ models = [str(m) for m in staged_model_ids() if m]
355
+ except Exception: # noqa: BLE001 - an unreadable models directory lists none
356
+ log.debug("staged_model_ids failed", exc_info=True)
357
+ models = []
358
+ endpoint = None
359
+ try:
360
+ from hermes_cli.local_runtime.endpoint import _state_endpoint
361
+
362
+ state = _state_endpoint()
363
+ endpoint = str(state["base_url"]) if state else None
364
+ except Exception: # noqa: BLE001 - no recorded server
365
+ log.debug("local runtime endpoint failed", exc_info=True)
366
+ return {"provider_id": str(LLAMACPP_PROVIDER_ID), "models": models, "current_endpoint": endpoint}
256
367
 
257
368
 
258
369
  def resolve_runtime(*, requested: str | None, api_key: str | None, base_url: str | None, target_model: str | None) -> dict:
@@ -267,7 +378,7 @@ def resolve_runtime(*, requested: str | None, api_key: str | None, base_url: str
267
378
  message = format_runtime_provider_error(exc)
268
379
  except Exception: # noqa: BLE001
269
380
  message = str(exc)
270
- raise RpcError(message, condition="credential_missing", data={"error_type": type(exc).__name__})
381
+ raise runtime_failure(exc, requested, message) from exc
271
382
  return _plain(runtime) if isinstance(runtime, dict) else {"runtime": _plain(runtime)}
272
383
 
273
384
 
@@ -365,7 +476,60 @@ def capabilities(provider: str, model: str) -> dict | None:
365
476
  return row if isinstance(row, dict) else None
366
477
 
367
478
 
479
+ def selection_warnings(home: Path, params: dict) -> dict:
480
+ """Read-only guard decision using the same route resolver as a turn; never builds or evicts an Agent."""
481
+ from . import chat
482
+ try:
483
+ from hermes_cli.model_selection_guards import SelectionContext, selection_context_for_agent, selection_warnings as warnings
484
+ except ImportError as exc:
485
+ raise RpcError("Model selection warnings are unavailable in this Agent", condition="unsupported") from exc
486
+
487
+ model = str(params["model"])
488
+ runtime = chat._resolve_runtime(params.get("provider"), model)
489
+ provider = str(runtime.get("provider") or params.get("provider") or "")
490
+ base_url = str(runtime.get("base_url") or "")
491
+ tokens = params.get("context_tokens")
492
+ if not tokens:
493
+ with chat._AGENT_CACHE_LOCK:
494
+ entry = chat._AGENT_CACHE.get(params["session_id"])
495
+ if entry and Path(entry[2]).resolve() == home.resolve():
496
+ context = selection_context_for_agent(entry[0])
497
+ tokens = context.context_tokens if context else None
498
+ if not tokens and (home / "state.db").exists():
499
+ from agent.usage_anchor import persisted_anchor_tokens
500
+
501
+ # SessionDB opens and migrates its database. The guard needs only this read-only accessor.
502
+ with closing(sqlite3.connect(f"{(home / 'state.db').resolve().as_uri()}?mode=ro", uri=True)) as db:
503
+ row = db.execute("SELECT model_config FROM sessions WHERE id=?", (params["session_id"],)).fetchone()
504
+ config = json.loads(row[0] or "{}") if row else {}
505
+ reader = SimpleNamespace(get_session_model_config_value=lambda sid, key, default=None: config.get(key, default))
506
+ tokens = persisted_anchor_tokens(reader, params["session_id"], params.get("messages", []))
507
+ # A same-model pick on another provider still abandons the previous route's prompt cache.
508
+ current = params.get("current_model") if params.get("current_provider") == params.get("provider") else None
509
+ context = SelectionContext(context_tokens=tokens, current_model=current)
510
+ result = warnings(model, provider=provider, base_url=base_url, api_key=runtime.get("api_key"), selection_context=context)
511
+ return {"warnings": [_plain(w) for w in result], "context_tokens": tokens or None, "provider": provider, "base_url": base_url}
512
+
513
+
368
514
  def register(reg) -> None:
515
+ @reg.method("models.selection_warnings")
516
+ def selection(ctx: CallContext, params: dict) -> dict:
517
+ if not params.get("model") or not params.get("session_id"):
518
+ raise InvalidParams("model and session_id are required")
519
+ home = profile_home_param(params)
520
+ with scoped_home(home):
521
+ return selection_warnings(home, params)
522
+
523
+ @reg.method("models.speed_tiers")
524
+ def speed_tiers(ctx: CallContext, params: dict) -> dict:
525
+ from ..speed import supported_speed_tiers
526
+
527
+ routes = params.get("routes")
528
+ if not isinstance(routes, list) or any(not isinstance(route, dict) or not route.get("model") for route in routes):
529
+ raise InvalidParams("routes must contain model routes")
530
+ with scoped_home(profile_home_param(params)):
531
+ return {"tiers": [supported_speed_tiers(str(route["model"]), str(route.get("provider") or ""), str(route.get("base_url") or "")) for route in routes]}
532
+
369
533
  @reg.method("providers.registry")
370
534
  def registry_(ctx: CallContext, params: dict) -> dict:
371
535
  with scoped_home(profile_home_param(params)):
@@ -382,7 +546,13 @@ def register(reg) -> None:
382
546
  if not provider:
383
547
  raise InvalidParams("provider is required")
384
548
  with scoped_home(profile_home_param(params)):
385
- return {"provider": provider, "model_ids": model_ids(provider, force_refresh=bool(params.get("force_refresh", False)))}
549
+ ids, fallback = model_ids(provider, force_refresh=bool(params.get("force_refresh", False)))
550
+ return {"provider": provider, "model_ids": ids, "fallback": fallback}
551
+
552
+ @reg.method("providers.local_models")
553
+ def local(ctx: CallContext, params: dict) -> dict:
554
+ with scoped_home(profile_home_param(params)):
555
+ return local_models()
386
556
 
387
557
  @reg.method("providers.resolve_runtime")
388
558
  def runtime(ctx: CallContext, params: dict) -> dict:
@@ -2,18 +2,84 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import os
6
7
  import re
8
+ import subprocess
9
+ import sys
10
+ import tempfile
11
+ import time
12
+ from pathlib import Path
7
13
 
8
14
  from .. import SIDECAR_RPC_VERSION
9
15
  from ..errors import InvalidParams, RpcError
10
- from ..home import edit_launch_env
16
+ from ..home import edit_launch_env, _frozen_launch_env
11
17
  from ..rpc import CallContext
12
18
 
13
19
 
14
20
  def register(registry) -> None:
15
21
  runtime = registry.runtime
16
22
 
23
+ @registry.method("runtime.agent_mutation", requires_agent=False)
24
+ def agent_mutation(ctx: CallContext, params: dict) -> dict:
25
+ from ..agent_mutation import call
26
+ return call(runtime, ctx, params)
27
+
28
+ @registry.method("runtime.agent_recovery", requires_agent=False)
29
+ def agent_recovery(ctx: CallContext, params: dict) -> dict:
30
+ from ..agent_mutation import recover_retained
31
+ return recover_retained(runtime, ctx, probe=params.get('probe') is True, complete_revision=params.get('complete_revision'))
32
+
33
+ @registry.method("runtime.sync_dependencies", requires_agent=False)
34
+ def sync_dependencies(ctx: CallContext, params: dict) -> dict:
35
+ # Source has already advanced; loading it or checking the old revision would prevent repair.
36
+ expected = params.get("agent_dir")
37
+ root = runtime.agent_dir
38
+ if not isinstance(expected, str) or not expected or root is None or Path(expected).resolve() != root.resolve():
39
+ raise InvalidParams("agent_dir must match the sidecar's configured Agent checkout")
40
+ if not (root / "hermes_cli" / "venv_sync.py").is_file():
41
+ return {"ok": True, "skipped": True, "detail": ""}
42
+ runtime.retire()
43
+ env = _frozen_launch_env()
44
+ env.update(HERMES_HOME=str(runtime.hermes_home), HERMES_DISABLE_LAZY_INSTALLS="1",
45
+ PYTHONPATH=str(root) + (os.pathsep + env["PYTHONPATH"] if env.get("PYTHONPATH") else ""))
46
+ # The supervisor's stdin is a lifetime lease: closing it also covers a killed sidecar.
47
+ with tempfile.TemporaryFile() as stdout, tempfile.TemporaryFile() as stderr:
48
+ try:
49
+ proc = subprocess.Popen(
50
+ [sys.executable, str(Path(__file__).parents[1] / "dependency_sync.py"), str(root)],
51
+ cwd=root, env=env, stdin=subprocess.PIPE, stdout=stdout, stderr=stderr,
52
+ )
53
+ except OSError as exc:
54
+ return {"ok": False, "skipped": False, "detail": str(exc)}
55
+ deadline = time.monotonic() + 300
56
+ try:
57
+ while proc.poll() is None:
58
+ ctx.check_cancelled()
59
+ if time.monotonic() >= deadline:
60
+ return {"ok": False, "skipped": False, "detail": "Agent dependency sync timed out."}
61
+ ctx.cancel_event.wait(0.05)
62
+ finally:
63
+ proc.stdin.close()
64
+ proc.wait() # The supervisor terminates and reaps its writer before releasing the lock.
65
+ stdout.seek(0)
66
+ output = stdout.read(4 * 1024 * 1024 + 1)
67
+ stderr.seek(0, os.SEEK_END)
68
+ stderr.seek(max(0, stderr.tell() - 4000))
69
+ diagnostic = stderr.read().decode("utf-8", errors="replace")
70
+ if proc.returncode != 0:
71
+ return {"ok": False, "skipped": False, "detail": diagnostic or output[-4000:].decode("utf-8", errors="replace") or "Agent dependency sync failed."}
72
+ try:
73
+ if len(output) > 4 * 1024 * 1024:
74
+ raise ValueError("sync output exceeds limit")
75
+ response = json.loads(output)
76
+ if not isinstance(response, dict):
77
+ raise ValueError("not an object")
78
+ except ValueError:
79
+ return {"ok": False, "skipped": False, "detail": "Agent dependency sync returned an invalid result."}
80
+ return {"ok": response.get("ok") is True, "skipped": False,
81
+ "detail": str(response.get("detail") or "")[-4000:]}
82
+
17
83
  @registry.method("runtime.handshake", requires_agent=False)
18
84
  def handshake(ctx: CallContext, params: dict) -> dict:
19
85
  requested = params.get("rpc_version")
@@ -50,6 +116,7 @@ def register(registry) -> None:
50
116
  raise InvalidParams("set must map variable names to strings")
51
117
  if not isinstance(to_unset, list) or not all(isinstance(k, str) and names.match(k) for k in to_unset):
52
118
  raise InvalidParams("unset must list variable names")
119
+ to_set = {**to_set, "HERMES_DISABLE_LAZY_INSTALLS": "1"}
53
120
  for name in to_unset:
54
121
  os.environ.pop(name, None)
55
122
  for name, value in to_set.items():
@@ -67,7 +134,10 @@ def register(registry) -> None:
67
134
  if not isinstance(code, int):
68
135
  raise InvalidParams("exit_code must be an integer")
69
136
  from .chat import drain_agents
137
+ from ..agent_mutation import close_all
70
138
 
139
+ close_all()
71
140
  drain_agents()
141
+ runtime.retire()
72
142
  ctx.server.request_shutdown(exit_code=code)
73
143
  return {"ok": True}
@@ -19,6 +19,17 @@ from .profiles import disabled_skill_names
19
19
  log = logging.getLogger("talaria_sidecar.skills")
20
20
 
21
21
 
22
+ def _skill_helper(name: str):
23
+ from tools import skills_tool
24
+
25
+ return getattr(skills_tool, name, None) or getattr(skills_tool, "_" + name, None)
26
+
27
+
28
+ def _sort_skills(rows: list[dict]) -> list[dict]:
29
+ sort = _skill_helper("sort_skills")
30
+ return sort(rows) if sort else sorted(rows, key=lambda row: (row.get("category") or "", row["name"]))
31
+
32
+
22
33
  def _within(base: Path, candidate: Path) -> bool:
23
34
  try:
24
35
  candidate.resolve().relative_to(base.resolve())
@@ -54,10 +65,29 @@ def _category(skill_md: Path, dirs: list[Path], local: Path) -> str | None:
54
65
 
55
66
 
56
67
  def list_skills(profile_home: Path, category: str | None = None) -> dict:
68
+ try:
69
+ from agent.skill_utils import get_disabled_skill_names, is_disabled_entry
70
+ from tools.skills_tool import _skill_catalog
71
+ except ImportError:
72
+ return _legacy_list_skills(profile_home, category)
73
+ disabled = get_disabled_skill_names("webui")
74
+ # Keep disabled rows manageable, but never advertise shadowed or unloadable copies.
75
+ out = [{"name": entry["load_name"], "load_name": entry["load_name"],
76
+ "declared_name": entry["name"], "status": entry["status"], "tier": entry["tier"],
77
+ "description": entry.get("description") or "", "category": entry.get("category"),
78
+ "disabled": is_disabled_entry(entry, disabled)}
79
+ for entry in _skill_catalog(skip_disabled=True) if entry["load_name"]]
80
+ if category:
81
+ out = [s for s in out if s.get("category") == category]
82
+ out = _sort_skills(out)
83
+ return {"success": True, "skills": out, "categories": sorted({s["category"] for s in out if s.get("category")}), "count": len(out)}
84
+
85
+
86
+ def _legacy_list_skills(profile_home: Path, category: str | None = None) -> dict:
57
87
  skills_dir = profile_home / "skills"
58
88
  try:
59
89
  from agent.skill_utils import iter_skill_index_files
60
- from tools.skills_tool import MAX_DESCRIPTION_LENGTH, _EXCLUDED_SKILL_DIRS, _parse_frontmatter, _sort_skills, skill_matches_platform
90
+ from tools.skills_tool import MAX_DESCRIPTION_LENGTH, _EXCLUDED_SKILL_DIRS, _parse_frontmatter, skill_matches_platform
61
91
  except ImportError:
62
92
  return {"skills": [], "categories": [], "count": 0}
63
93
  if not skills_dir.exists():
@@ -99,6 +129,31 @@ def list_skills(profile_home: Path, category: str | None = None) -> dict:
99
129
 
100
130
 
101
131
  def find_skill(name: str, dirs: list[Path]) -> tuple[Path | None, Path | None]:
132
+ try:
133
+ from agent.skill_utils import resolve_skill_catalog # noqa: F401 - capability gate for the matching lookup API
134
+ locate_skill = _skill_helper("locate_skill")
135
+ skill_lookup_path_error = _skill_helper("skill_lookup_path_error")
136
+ skill_search_dirs = _skill_helper("skill_search_dirs")
137
+ except ImportError:
138
+ return _legacy_find_skill(name, dirs)
139
+ if not all((locate_skill, skill_lookup_path_error, skill_search_dirs)):
140
+ return _legacy_find_skill(name, dirs)
141
+ if error := skill_lookup_path_error(name):
142
+ raise InvalidParams(error)
143
+ local_name = name.replace(":", "/", 1) if ":" in name else None
144
+ if local_name and (error := skill_lookup_path_error(local_name)):
145
+ raise InvalidParams(error)
146
+ roots, _ = skill_search_dirs()
147
+ error, skill_dir, skill_md = locate_skill(name, local_name, roots)
148
+ if error:
149
+ result = json.loads(error)
150
+ if result.get("matches"):
151
+ raise InvalidParams(result["error"])
152
+ return None, None
153
+ return skill_dir, skill_md
154
+
155
+
156
+ def _legacy_find_skill(name: str, dirs: list[Path]) -> tuple[Path | None, Path | None]:
102
157
  from agent.skill_utils import iter_skill_index_files
103
158
  from tools.skills_tool import _EXCLUDED_SKILL_DIRS, _parse_frontmatter
104
159
 
@@ -208,9 +263,15 @@ def view_from_file(skill_dir: Path | None, skill_md: Path) -> dict:
208
263
  def view_skill(profile_home: Path, name: str) -> dict:
209
264
  skills_dir = profile_home / "skills"
210
265
  dirs = search_dirs(skills_dir)
211
- skill_dir, skill_md = find_skill(name, dirs)
266
+ try:
267
+ skill_dir, skill_md = find_skill(name, dirs)
268
+ except InvalidParams as exc:
269
+ return {"success": False, "error": str(exc)}
212
270
  if skill_md:
213
- return view_from_file(skill_dir, skill_md)
271
+ result = view_from_file(skill_dir, skill_md)
272
+ if result.get("success"):
273
+ result["editable"] = skill_md.name == "SKILL.md" and _within(skills_dir, skill_md)
274
+ return result
214
275
  if ":" in str(name or ""):
215
276
  try:
216
277
  from agent.skill_utils import is_valid_namespace, parse_qualified_name
@@ -223,7 +284,10 @@ def view_skill(profile_home: Path, name: str) -> dict:
223
284
  pm = get_plugin_manager()
224
285
  if pm.find_plugin_skill(name) is not None or pm.list_plugin_skills(namespace):
225
286
  raw = skill_view(name)
226
- return json.loads(raw) if isinstance(raw, str) else raw
287
+ result = json.loads(raw) if isinstance(raw, str) else raw
288
+ if result.get("success"):
289
+ result["editable"] = False
290
+ return result
227
291
  except Exception: # noqa: BLE001
228
292
  pass
229
293
  names = [s["name"] for s in list_skills(profile_home).get("skills", [])]
@@ -259,4 +323,18 @@ def register(registry) -> None:
259
323
  raise InvalidParams("name is required")
260
324
  with scoped_home(home):
261
325
  skill_dir, skill_md = find_skill(name, search_dirs(home / "skills"))
262
- return {"found": skill_md is not None, "skill_dir": str(skill_dir) if skill_dir else None, "skill_md": str(skill_md) if skill_md else None}
326
+ identity = {}
327
+ if skill_md:
328
+ try:
329
+ from tools.skills_tool import _skill_catalog
330
+ except ImportError:
331
+ pass
332
+ else:
333
+ catalog = _skill_catalog(skip_disabled=True, include_hidden=True)
334
+ entry = next((e for e in catalog if e["path"] == skill_md), None)
335
+ if entry is not None:
336
+ if not entry["load_name"]:
337
+ raise InvalidParams("Skill has no unambiguous catalog identity")
338
+ identity = {"load_name": entry["load_name"], "declared_name": entry["name"],
339
+ "sibling_load_names": [e["load_name"] for e in catalog if e["name"] == entry["name"] and e["load_name"]]}
340
+ return {"found": skill_md is not None, "skill_dir": str(skill_dir) if skill_dir else None, "skill_md": str(skill_md) if skill_md else None, **identity}