@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,33 +2,174 @@
2
2
  * `talaria-web serve` runs the server in a child so a self-update can restart it
3
3
  * (Python `os.execv`; Node has no in-place exec). The supervisor keeps the PID
4
4
  * that ctl, launchd, and systemd track, forwards signals, and respawns only
5
- * when the child exits with `RESTART_EXIT_CODE`.
5
+ * when the child requests a restart, or once after an updated worker fails before readiness.
6
+ *
7
+ * Lifetime contract (TAL-1432): a worker never outlives its supervisor holding the port.
8
+ * - The supervisor forwards the first stop signal once, kills its own worker if it has not exited
9
+ * within `stopGraceMs`, and returns or respawns only after that worker's `close`.
10
+ * - The worker (`watchRetirement`) retires on a stop signal or when its IPC supervisor disconnects:
11
+ * before its close path exists it exits at once; after, it stops listening, drains, and exits
12
+ * within `WORKER_SHUTDOWN_MS`, which is shorter than the supervisor's grace.
13
+ * A process stuck in an uninterruptible kernel wait ignores SIGKILL too; the supervisor then keeps
14
+ * waiting rather than start a successor that cannot bind.
6
15
  */
7
16
  import { spawn } from 'node:child_process';
17
+ import { existsSync, renameSync, rmSync } from 'node:fs';
18
+ import { atomicWriteText } from '../fs/atomic.js';
19
+ import { readUpdateRollback, rollbackPaths } from '../tools/update-rollback.js';
20
+ import { homeDotenvKeys, setHomeDotenvKeys } from './dotenv.js';
8
21
  export const RESTART_EXIT_CODE = 75;
9
22
  export const WORKER_ENV = 'TALARIA_WEB_WORKER';
23
+ export const WORKER_SHUTDOWN_MS = 10_000;
24
+ export const STOP_GRACE_MS = 15_000;
10
25
  export async function supervise(opts) {
11
26
  const [cmd, ...args] = opts.command;
12
27
  if (!cmd)
13
28
  throw new Error('supervise: empty command');
14
29
  const cwd = process.cwd();
15
30
  let stopping = false;
31
+ let afterRestart = false;
32
+ let rolledBack = false;
16
33
  for (;;) {
17
- const child = spawn(cmd, args, { cwd, stdio: 'inherit', env: { ...opts.env, [WORKER_ENV]: '1' } });
18
- const forward = (signal) => () => { stopping = true; child.kill(signal); };
34
+ const env = { ...opts.env, [WORKER_ENV]: '1' };
35
+ // Reload home-file values in each worker; the supervisor may hold credentials revoked since startup.
36
+ for (const key of homeDotenvKeys(env))
37
+ Reflect.deleteProperty(env, key);
38
+ setHomeDotenvKeys(env, new Set());
39
+ const paths = opts.packageRoot && opts.stateDir ? rollbackPaths(opts.packageRoot, opts.stateDir) : null;
40
+ const pendingUpdate = paths && existsSync(paths.previous) ? readUpdateRollback(opts.stateDir) : null;
41
+ const child = spawn(cmd, args, { cwd, stdio: ['inherit', 'inherit', 'inherit', 'ipc'], env });
42
+ let ready = false;
43
+ child.on('message', (message) => {
44
+ if (message !== 'ready' || ready)
45
+ return;
46
+ ready = true;
47
+ if (afterRestart && !rolledBack && paths && pendingUpdate) {
48
+ // A later update may already have written a different marker after this worker started listening.
49
+ if (JSON.stringify(readUpdateRollback(opts.stateDir)) !== JSON.stringify(pendingUpdate))
50
+ return;
51
+ try {
52
+ rmSync(paths.failed, { recursive: true, force: true });
53
+ rmSync(paths.marker, { force: true });
54
+ }
55
+ catch (error) {
56
+ opts.log(`[serve] could not finish update recovery cleanup: ${error.message}`);
57
+ }
58
+ }
59
+ });
60
+ let killTimer;
61
+ const forward = (signal) => () => {
62
+ // The worker shuts down once; repeating the signal would only cut its cleanup short.
63
+ if (stopping)
64
+ return;
65
+ stopping = true;
66
+ child.kill(signal);
67
+ const graceMs = opts.stopGraceMs ?? STOP_GRACE_MS;
68
+ killTimer = setTimeout(() => {
69
+ opts.log(`[serve] worker ${String(child.pid)} did not exit within ${String(graceMs)} ms of ${signal}; killing it`);
70
+ child.kill('SIGKILL');
71
+ }, graceMs);
72
+ };
19
73
  const handlers = [['SIGTERM', forward('SIGTERM')], ['SIGINT', forward('SIGINT')], ['SIGHUP', forward('SIGHUP')]];
20
74
  for (const [signal, handler] of handlers)
21
75
  process.on(signal, handler);
22
76
  const code = await new Promise((resolve) => {
23
- child.on('exit', (status, signal) => { resolve(status ?? (signal ? 128 + (signal === 'SIGKILL' ? 9 : 15) : 1)); });
24
- child.on('error', (error) => { opts.log(`[serve] worker failed to start: ${error.message}`); resolve(1); });
77
+ child.on('close', (status, signal) => { resolve(status ?? (signal ? 128 + (signal === 'SIGKILL' ? 9 : 15) : 1)); });
78
+ child.on('error', (error) => {
79
+ // A started worker still owns its port: wait for its close rather than return or respawn beside it.
80
+ if (child.pid !== undefined) {
81
+ opts.log(`[serve] worker error: ${error.message}`);
82
+ return;
83
+ }
84
+ opts.log(`[serve] worker failed to start: ${error.message}`);
85
+ resolve(1);
86
+ });
25
87
  });
88
+ clearTimeout(killTimer);
26
89
  for (const [signal, handler] of handlers)
27
90
  process.off(signal, handler);
28
- if (code !== RESTART_EXIT_CODE || stopping)
91
+ if (stopping)
29
92
  return code;
93
+ if (code !== RESTART_EXIT_CODE) {
94
+ const marker = readUpdateRollback(opts.stateDir);
95
+ if (!afterRestart || ready || rolledBack || !marker || !paths || !opts.packageRoot || !existsSync(paths.previous))
96
+ return code;
97
+ try {
98
+ rmSync(paths.failed, { recursive: true, force: true });
99
+ renameSync(opts.packageRoot, paths.failed);
100
+ try {
101
+ renameSync(paths.previous, opts.packageRoot);
102
+ }
103
+ catch (error) {
104
+ renameSync(paths.failed, opts.packageRoot);
105
+ throw error;
106
+ }
107
+ // Record the attempt before spawning again; never loop if the restored worker also crashes.
108
+ rolledBack = true;
109
+ try {
110
+ atomicWriteText(paths.marker, JSON.stringify({ ...marker, failedVersion: marker.version }));
111
+ }
112
+ catch (error) {
113
+ opts.log(`[serve] could not persist failed update: ${error.message}`);
114
+ }
115
+ opts.log(`[serve] update to ${marker.version} failed to start; restored ${marker.previousVersion}`);
116
+ continue;
117
+ }
118
+ catch (error) {
119
+ opts.log(`[serve] update rollback failed: ${error.message}`);
120
+ return code;
121
+ }
122
+ }
123
+ rolledBack = false;
124
+ afterRestart = true;
30
125
  opts.log('[serve] restarting the server with the updated source');
31
126
  await new Promise((r) => setTimeout(r, opts.restartDelayMs ?? 500));
32
127
  }
33
128
  }
129
+ /** Retires the server on SIGTERM/SIGINT/SIGHUP and, for a supervised worker, on loss of its supervisor. */
130
+ export function watchRetirement(opts) {
131
+ const events = opts.events ?? process;
132
+ const exit = opts.exit ?? ((code) => { process.exit(code); });
133
+ const deadlineMs = opts.deadlineMs ?? WORKER_SHUTDOWN_MS;
134
+ let close = null;
135
+ let retiring = false;
136
+ let exited = false;
137
+ const finish = (code) => { if (!exited) {
138
+ exited = true;
139
+ exit(code);
140
+ } };
141
+ const run = (shutdown) => {
142
+ const timer = setTimeout(() => {
143
+ opts.log(`[webui] shutdown did not finish within ${String(deadlineMs)} ms; exiting`);
144
+ finish(1);
145
+ }, deadlineMs);
146
+ void Promise.resolve().then(shutdown).then(() => { clearTimeout(timer); finish(0); }, (error) => { clearTimeout(timer); opts.log(`[webui] shutdown failed: ${error.message}`); finish(1); });
147
+ };
148
+ const retire = (reason) => {
149
+ if (retiring)
150
+ return;
151
+ retiring = true;
152
+ opts.log(`[webui] ${reason}; shutting down`);
153
+ // Nothing has been served before the close path exists.
154
+ if (close)
155
+ run(close);
156
+ else
157
+ finish(0);
158
+ };
159
+ for (const signal of ['SIGTERM', 'SIGINT', 'SIGHUP'])
160
+ events.on(signal, () => { retire(`${signal} received`); });
161
+ if (opts.supervised) {
162
+ events.on('disconnect', () => { retire('supervisor disconnected'); });
163
+ // The listener must not keep a worker alive that would otherwise exit.
164
+ if (events === process)
165
+ process.channel?.unref();
166
+ if (!events.connected)
167
+ retire('supervisor disconnected');
168
+ }
169
+ return {
170
+ get retiring() { return retiring; },
171
+ attach: (shutdown) => { if (!retiring)
172
+ close = shutdown; },
173
+ };
174
+ }
34
175
  //# sourceMappingURL=supervise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"supervise.js","sourceRoot":"","sources":["../../src/cli/supervise.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,oBAAoB,CAAA;AAU9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAClG,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAE,EAAE,CAAC,GAAS,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,CAAC,CAAA;QAC/F,MAAM,QAAQ,GAAmC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAChJ,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACjD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;YACjH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC5G,CAAC,CAAC,CAAA;QACF,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtE,IAAI,IAAI,KAAK,iBAAiB,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAA;QACvD,IAAI,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACjE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC,CAAA;IACrE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"supervise.js","sourceRoot":"","sources":["../../src/cli/supervise.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,10 @@
1
+ import type { SidecarResult } from '@maudecode/talaria-web-contracts';
1
2
  import type { SidecarLike } from '../sidecar/client.js';
3
+ export type SpeedTier = SidecarResult<'models.speed_tiers'>['tiers'][number][number];
4
+ /** One auxiliary slot as the Agent lists it (TAL-800); the static catalog's rows carry no effort or inheritance. */
5
+ export type AuxSlot = Omit<SidecarResult<'aux.tasks'>['tasks'][number], 'reasoning_effort'> & {
6
+ reasoning_effort: string | null;
7
+ };
2
8
  export type Config = Record<string, unknown>;
3
9
  export type Dict = Record<string, unknown>;
4
10
  export declare const isDict: (v: unknown) => v is Dict;
@@ -26,9 +32,28 @@ export declare class AgentConfig {
26
32
  /** Parsed config.yaml (empty object when the file is missing). */
27
33
  read(profileHome: string, opts?: ConfigFileOptions): Promise<Config>;
28
34
  /** Synchronous last-known config for callers that cannot await (workspace resolution); refreshes in the background. */
29
- peek(profileHome: string): Config | null;
35
+ peek(profileHome: string, opts?: {
36
+ refresh?: boolean;
37
+ }): Config | null;
30
38
  /** Read-modify-write under a per-file lock (homes sharing an `HERMES_CONFIG_PATH` override serialise); `mutate` returns false to skip the write. */
31
39
  update(profileHome: string, mutate: (config: Config) => unknown, opts?: ConfigFileOptions): Promise<Config>;
40
+ /** The Agent owns speed eligibility. A failed lookup must not erase a saved tier. */
41
+ speedTiers(profileHome: string, config: Config, models: {
42
+ model: string;
43
+ provider: string;
44
+ }[]): Promise<SpeedTier[][]>;
45
+ /**
46
+ * TAL-800: the profile's auxiliary slots as its Agent lists them (plugin tasks included), and the Agent's other
47
+ * `auxiliary.*` keys. The static catalog only when the Agent cannot list them; `reserved` is then unknown (null).
48
+ */
49
+ auxiliarySlots(profileHome: string): Promise<{
50
+ slots: AuxSlot[];
51
+ reserved: string[] | null;
52
+ }>;
53
+ /** TAL-901: the personalities the profile's Agent offers for its config; throws when the Agent cannot list them. */
54
+ agentPersonalities(profileHome: string): Promise<PersonalityRow[]>;
55
+ /** The Agent's personalities to list and select from; the config's own block only while the sidecar cannot list them. */
56
+ personalities(profileHome: string): Promise<PersonalityRow[]>;
32
57
  invalidate(profileHome?: string): void;
33
58
  }
34
59
  /** Settings `provider_cost_budget` → positive number or null. */
@@ -67,6 +92,7 @@ export interface ReasoningStatus {
67
92
  supported_efforts: string[];
68
93
  supports_reasoning_effort: boolean;
69
94
  supports_thinking_toggle: boolean;
95
+ supports_session_scope: boolean;
70
96
  }
71
97
  export type EffortsResolver = (model: string, provider: string, baseUrl: string) => Promise<string[]>;
72
98
  /**
@@ -75,25 +101,25 @@ export type EffortsResolver = (model: string, provider: string, baseUrl: string)
75
101
  * endpoint never receives a supra-ceiling level.
76
102
  */
77
103
  export declare function coerceReasoningEffort(effort: string, supported: string[], provider?: string): string;
104
+ /** The Web display preference, shared by the settings response and native-owner watches. */
105
+ export declare function showReasoning(config: Config): boolean;
78
106
  export declare function reasoningStatus(config: Config, resolve: EffortsResolver, opts?: {
79
107
  model?: string | null;
80
108
  provider?: string | null;
81
109
  baseUrl?: string | null;
82
110
  }): Promise<ReasoningStatus>;
83
111
  export declare function validReasoningEffort(effort: string): boolean;
84
- export declare function personalityRows(config: Config): {
85
- name: string;
86
- description: string;
87
- }[];
88
- /** Python `/api/personality/set` prompt resolution; null when the personality is unknown. */
89
- export declare function personalityPrompt(config: Config, name: string): string | null;
112
+ export type PersonalityRow = SidecarResult<'personalities.list'>['personalities'][number];
113
+ /** The pre-TAL-901 reading of `agent.personalities` alone, kept only for when the sidecar cannot list the Agent's. */
114
+ export declare function configPersonalities(config: Config): PersonalityRow[];
115
+ /** The personality `name` selects, compared case-folded as the Agent does; undefined when there is none. */
116
+ export declare function findPersonality(rows: PersonalityRow[], name: string): PersonalityRow | undefined;
90
117
  /** Python `_apply_advanced_model_options` (in place). */
91
118
  export declare function applyAdvancedModelOptions(target: Dict, advanced: unknown): void;
92
119
  export declare function publicAdvancedModelOptions(modelCfg: Dict): Dict;
93
- export declare function isOpenAiFamilyProvider(provider: unknown): boolean;
94
- /** Python `_main_model_supports_service_tier`: OpenAI-family GPT-5-class models take `priority`. */
95
- export declare function mainModelSupportsServiceTier(model: unknown, provider: unknown): boolean;
96
- export declare function auxiliaryModels(config: Config): {
120
+ /** Effective configured endpoint, shared by speed display and validation after model selection. */
121
+ export declare function modelBaseUrl(config: Config, provider: string): string;
122
+ export declare function auxiliaryModels(config: Config, tiers: SpeedTier[], slots: AuxSlot[]): {
97
123
  tasks: Dict[];
98
124
  main: Dict;
99
125
  };
@@ -6,11 +6,11 @@
6
6
  * Policy helpers (model section, reasoning, max_tokens, auxiliary slots,
7
7
  * personalities) port Python `api/config.py`.
8
8
  */
9
- import { statSync } from 'node:fs';
10
9
  import { homedir } from 'node:os';
11
10
  import { join, resolve as resolvePath } from 'node:path';
12
- import { PORTAL_PROVIDERS, PROVIDER_ALIASES, PROVIDER_DISPLAY, PROVIDER_MODELS, VALID_REASONING_EFFORTS, AUXILIARY_TASK_CATALOG, AUX_TASK_SLOTS, RETIRED_AUX_TASK_SLOTS } from '../providers/tables.js';
11
+ import { LOCAL_RUNTIME_PROVIDER, PORTAL_PROVIDERS, PROVIDER_ALIASES, PROVIDER_DISPLAY, PROVIDER_MODELS, VALID_REASONING_EFFORTS, AUXILIARY_TASK_CATALOG, RETIRED_AUX_TASK_SLOTS } from '../providers/tables.js';
13
12
  import { str } from '../util.js';
13
+ import { fileStatKey } from '../fs/stat.js';
14
14
  export const isDict = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
15
15
  export const dict = (v) => (isDict(v) ? v : {});
16
16
  export class ConfigUnavailable extends Error {
@@ -30,9 +30,8 @@ export class AgentConfig {
30
30
  /** Fingerprint of the config file; `missing` only when it does not exist. Any other stat failure (EACCES, EIO, ...) is unreadable, never empty. */
31
31
  statKey(profileHome, opts = {}) {
32
32
  try {
33
- const st = statSync(this.path(profileHome, opts), { bigint: true });
34
33
  // ctime moves on chmod/chown, so a permission change re-reads through the sidecar instead of serving the old parse.
35
- return `${String(st.mtimeNs)}:${String(st.ctimeNs)}:${String(st.size)}:${String(st.ino)}`;
34
+ return fileStatKey(this.path(profileHome, opts));
36
35
  }
37
36
  catch (error) {
38
37
  const code = error.code;
@@ -76,7 +75,7 @@ export class AgentConfig {
76
75
  throw new ConfigUnavailable('config.yaml changed while it was being read; retry');
77
76
  }
78
77
  /** Synchronous last-known config for callers that cannot await (workspace resolution); refreshes in the background. */
79
- peek(profileHome) {
78
+ peek(profileHome, opts = {}) {
80
79
  let key;
81
80
  try {
82
81
  key = this.statKey(profileHome);
@@ -90,7 +89,8 @@ export class AgentConfig {
90
89
  if (key === 'missing')
91
90
  return {};
92
91
  // A changed file invalidates the snapshot: callers gate on `null` (fail closed) until the matching read lands.
93
- void this.read(profileHome).catch(() => undefined);
92
+ if (opts.refresh !== false)
93
+ void this.read(profileHome).catch(() => undefined);
94
94
  return null;
95
95
  }
96
96
  /** Read-modify-write under a per-file lock (homes sharing an `HERMES_CONFIG_PATH` override serialise); `mutate` returns false to skip the write. */
@@ -99,7 +99,7 @@ export class AgentConfig {
99
99
  const prev = this.locks.get(file) ?? Promise.resolve();
100
100
  const run = prev.catch(() => undefined).then(async () => {
101
101
  const config = await this.read(profileHome, opts);
102
- if (mutate(config) === false)
102
+ if (await mutate(config) === false)
103
103
  return config;
104
104
  const sidecar = this.deps.sidecar();
105
105
  if (!sidecar)
@@ -111,6 +111,48 @@ export class AgentConfig {
111
111
  this.locks.set(file, run);
112
112
  return run;
113
113
  }
114
+ /** The Agent owns speed eligibility. A failed lookup must not erase a saved tier. */
115
+ async speedTiers(profileHome, config, models) {
116
+ const sidecar = this.deps.sidecar();
117
+ if (!sidecar)
118
+ throw new ConfigUnavailable('Hermes Agent sidecar is not running; speed tiers are unavailable');
119
+ try {
120
+ const routes = models.map(({ model, provider }) => ({ model, provider: resolveProviderAlias(provider), base_url: modelBaseUrl(config, provider) }));
121
+ const result = await sidecar.call('models.speed_tiers', { profile_home: profileHome, routes });
122
+ if (result.tiers.length !== routes.length)
123
+ throw new Error('incomplete speed tier response');
124
+ return result.tiers;
125
+ }
126
+ catch (error) {
127
+ throw new ConfigUnavailable(`Speed tiers are unavailable: ${String(error)}`);
128
+ }
129
+ }
130
+ /**
131
+ * TAL-800: the profile's auxiliary slots as its Agent lists them (plugin tasks included), and the Agent's other
132
+ * `auxiliary.*` keys. The static catalog only when the Agent cannot list them; `reserved` is then unknown (null).
133
+ */
134
+ async auxiliarySlots(profileHome) {
135
+ const sidecar = this.deps.sidecar();
136
+ // A failed listing offers the built-in table only, so a plugin slot is never assignable without the Agent vouching for it.
137
+ const listed = sidecar ? await sidecar.call('aux.tasks', { profile_home: profileHome }).catch(() => null) : null;
138
+ return listed ? { slots: listed.tasks, reserved: listed.reserved } : { slots: AUXILIARY_TASK_CATALOG.map((slot) => ({ ...slot, inherit_from: null, reasoning_effort: null, effective: null })), reserved: null };
139
+ }
140
+ /** TAL-901: the personalities the profile's Agent offers for its config; throws when the Agent cannot list them. */
141
+ async agentPersonalities(profileHome) {
142
+ const sidecar = this.deps.sidecar();
143
+ if (!sidecar)
144
+ throw new ConfigUnavailable('Hermes Agent sidecar is not running; personalities are unavailable');
145
+ return (await sidecar.call('personalities.list', { config: await this.read(profileHome) })).personalities;
146
+ }
147
+ /** The Agent's personalities to list and select from; the config's own block only while the sidecar cannot list them. */
148
+ async personalities(profileHome) {
149
+ try {
150
+ return await this.agentPersonalities(profileHome);
151
+ }
152
+ catch {
153
+ return configPersonalities(await this.read(profileHome));
154
+ }
155
+ }
114
156
  invalidate(profileHome) {
115
157
  if (profileHome)
116
158
  this.cache.delete(this.path(profileHome));
@@ -148,7 +190,7 @@ export function canonicaliseProviderId(name) {
148
190
  if (raw in PROVIDER_DISPLAY || raw in PROVIDER_MODELS)
149
191
  return raw;
150
192
  const resolved = resolveProviderAlias(raw);
151
- if (resolved && (resolved in PROVIDER_DISPLAY || resolved in PROVIDER_MODELS))
193
+ if (resolved && (resolved in PROVIDER_DISPLAY || resolved in PROVIDER_MODELS || resolved === LOCAL_RUNTIME_PROVIDER))
152
194
  return resolved;
153
195
  return raw;
154
196
  }
@@ -317,8 +359,14 @@ export function coerceReasoningEffort(effort, supported, provider = '') {
317
359
  }
318
360
  return raw;
319
361
  }
320
- export async function reasoningStatus(config, resolve, opts = {}) {
362
+ /** The Web display preference, shared by the settings response and native-owner watches. */
363
+ export function showReasoning(config) {
321
364
  const display = dict(config.display);
365
+ const webui = dict(dict(display.platforms).webui).show_reasoning;
366
+ const raw = typeof webui === 'boolean' ? webui : display.show_reasoning;
367
+ return typeof raw === 'boolean' ? raw : true;
368
+ }
369
+ export async function reasoningStatus(config, resolve, opts = {}) {
322
370
  const agent = dict(config.agent);
323
371
  let model = str(opts.model).trim();
324
372
  let provider = str(opts.provider).trim();
@@ -332,48 +380,41 @@ export async function reasoningStatus(config, resolve, opts = {}) {
332
380
  baseUrl = str(m.base_url).trim();
333
381
  }
334
382
  const supported = model ? await resolve(model, provider, baseUrl) : [];
335
- const showRaw = display.show_reasoning;
336
383
  return {
337
- show_reasoning: typeof showRaw === 'boolean' ? showRaw : true,
384
+ show_reasoning: showReasoning(config),
338
385
  reasoning_effort: coerceReasoningEffort(str(agent.reasoning_effort), supported, provider),
339
386
  supported_efforts: supported,
340
387
  supports_reasoning_effort: supported.length > 0,
341
388
  supports_thinking_toggle: supported.length > 0,
389
+ supports_session_scope: true,
342
390
  };
343
391
  }
344
392
  export function validReasoningEffort(effort) {
345
393
  const raw = effort.trim().toLowerCase();
346
394
  return !raw || raw === 'none' || VALID_REASONING_EFFORTS.includes(raw);
347
395
  }
348
- // ── personalities ─────────────────────────────────────────────────────
349
- export function personalityRows(config) {
396
+ /** The pre-TAL-901 reading of `agent.personalities` alone, kept only for when the sidecar cannot list the Agent's. */
397
+ export function configPersonalities(config) {
350
398
  const raw = dict(config.agent).personalities;
351
399
  if (!isDict(raw))
352
400
  return [];
353
401
  return Object.entries(raw).map(([name, value]) => {
354
- let desc = '';
355
- if (isDict(value))
356
- desc = str(value.description);
357
- else if (typeof value === 'string')
358
- desc = value.slice(0, 80) + (value.length > 80 ? '...' : '');
359
- return { name, description: desc };
402
+ if (isDict(value)) {
403
+ const parts = [str(value.system_prompt) || str(value.prompt)];
404
+ if (value.tone)
405
+ parts.push(`Tone: ${str(value.tone)}`);
406
+ if (value.style)
407
+ parts.push(`Style: ${str(value.style)}`);
408
+ return { name, description: str(value.description), prompt: parts.filter(Boolean).join('\n') };
409
+ }
410
+ const text = str(value);
411
+ return { name, description: text.slice(0, 80) + (text.length > 80 ? '...' : ''), prompt: text };
360
412
  });
361
413
  }
362
- /** Python `/api/personality/set` prompt resolution; null when the personality is unknown. */
363
- export function personalityPrompt(config, name) {
364
- const raw = dict(config.agent).personalities;
365
- if (!isDict(raw) || !(name in raw))
366
- return null;
367
- const value = raw[name];
368
- if (isDict(value)) {
369
- const parts = [str(value.system_prompt) || str(value.prompt)];
370
- if (value.tone)
371
- parts.push(`Tone: ${str(value.tone)}`);
372
- if (value.style)
373
- parts.push(`Style: ${str(value.style)}`);
374
- return parts.filter(Boolean).join('\n');
375
- }
376
- return str(value);
414
+ /** The personality `name` selects, compared case-folded as the Agent does; undefined when there is none. */
415
+ export function findPersonality(rows, name) {
416
+ const key = name.trim().toLowerCase();
417
+ return key ? rows.find((row) => row.name.toLowerCase() === key) : undefined;
377
418
  }
378
419
  // ── advanced model options / auxiliary slots ──────────────────────────
379
420
  function coerceOptionalPositiveInt(value, field) {
@@ -434,10 +475,10 @@ export function applyAdvancedModelOptions(target, advanced) {
434
475
  const tier = str(advanced.service_tier).trim().toLowerCase();
435
476
  if (!tier || tier === 'default')
436
477
  Reflect.deleteProperty(target, 'service_tier');
437
- else if (tier === 'priority')
438
- target.service_tier = 'priority';
478
+ else if (tier === 'priority' || tier === 'ultrafast')
479
+ target.service_tier = tier;
439
480
  else
440
- throw new Error('service_tier must be one of: default, priority');
481
+ throw new Error('service_tier must be one of: default, priority, ultrafast');
441
482
  }
442
483
  if (advanced.api_key_clear)
443
484
  Reflect.deleteProperty(target, 'api_key');
@@ -455,21 +496,24 @@ export function publicAdvancedModelOptions(modelCfg) {
455
496
  api_key_set: Boolean(str(modelCfg.api_key).trim()),
456
497
  };
457
498
  }
458
- export function isOpenAiFamilyProvider(provider) {
459
- const resolved = resolveProviderAlias(provider);
460
- return resolved === 'openai' || resolved === 'openai-api' || resolved === 'openai-codex';
461
- }
462
- /** Python `_main_model_supports_service_tier`: OpenAI-family GPT-5-class models take `priority`. */
463
- export function mainModelSupportsServiceTier(model, provider) {
464
- if (!isOpenAiFamilyProvider(provider))
465
- return false;
466
- const id = str(model).trim().toLowerCase().replace(/^openai\//, '');
467
- return id.startsWith('gpt-5') || /^o[0-9]/.test(id);
468
- }
469
- function auxTaskPayload(key, entry, label, description) {
499
+ /** Effective configured endpoint, shared by speed display and validation after model selection. */
500
+ export function modelBaseUrl(config, provider) {
501
+ const pid = canonicaliseProviderId(provider);
502
+ const model = modelSection(config);
503
+ if (canonicaliseProviderId(model.provider) === pid && str(model.base_url).trim())
504
+ return str(model.base_url).trim();
505
+ const providers = dict(config.providers);
506
+ const key = Object.keys(providers).find((k) => canonicaliseProviderId(k) === pid);
507
+ const base = str(dict(key ? providers[key] : null).base_url).trim();
508
+ if (base)
509
+ return base;
510
+ const custom = customProviderEntries(config).find((cp) => customProviderSlug(cp.name) === pid);
511
+ return str(custom?.base_url).trim();
512
+ }
513
+ function auxTaskPayload(slot, entry) {
470
514
  const e = dict(entry);
471
515
  return {
472
- task: key,
516
+ task: slot.key,
473
517
  provider: str(e.provider).trim() || 'auto',
474
518
  model: str(e.model).trim(),
475
519
  base_url: str(e.base_url).trim(),
@@ -478,23 +522,26 @@ function auxTaskPayload(key, entry, label, description) {
478
522
  max_concurrency: e.max_concurrency ?? '',
479
523
  extra_body: isDict(e.extra_body) ? e.extra_body : {},
480
524
  api_key_set: Boolean(str(e.api_key).trim()),
481
- label,
482
- description,
525
+ label: slot.label,
526
+ description: slot.description,
527
+ inherit_from: slot.inherit_from,
528
+ reasoning_effort: slot.reasoning_effort,
529
+ effective: slot.effective,
483
530
  };
484
531
  }
485
- export function auxiliaryModels(config) {
532
+ export function auxiliaryModels(config, tiers, slots) {
486
533
  const modelCfg = modelSection(config);
487
534
  const aux = dict(config.auxiliary);
488
535
  const mainProvider = str(modelCfg.provider).trim();
489
536
  const mainModel = str(modelCfg.default ?? modelCfg.name).trim();
490
- const supportsFast = mainModelSupportsServiceTier(mainModel, mainProvider);
491
537
  return {
492
- tasks: AUXILIARY_TASK_CATALOG.map((slot) => auxTaskPayload(slot.key, aux[slot.key], slot.label, slot.description)),
538
+ tasks: slots.map((slot) => auxTaskPayload(slot, slot.key === DELEGATION_TASK ? config.delegation : aux[slot.key])),
493
539
  main: {
494
540
  provider: mainProvider,
495
541
  model: mainModel,
496
- supports_fast_tier: supportsFast,
497
- service_tier: supportsFast && str(modelCfg.service_tier).trim().toLowerCase() === 'priority' ? 'priority' : '',
542
+ supports_fast_tier: tiers.some((t) => t.service_tier === 'priority'),
543
+ supported_speed_tiers: tiers,
544
+ service_tier: tiers.find((t) => t.service_tier === str(modelCfg.service_tier).trim().toLowerCase())?.service_tier ?? 'default',
498
545
  ...publicAdvancedModelOptions(modelCfg),
499
546
  },
500
547
  };
@@ -512,9 +559,27 @@ function auxiliarySelection(providerRaw, modelRaw) {
512
559
  return [provider === 'auto' ? parsed[1] : provider, parsed[0]];
513
560
  }
514
561
  const isCustomProvider = (provider) => { const p = str(provider).trim(); return p === 'custom' || p.startsWith('custom:'); };
562
+ /**
563
+ * TAL-1273: the Agent's subagent slot. `delegate_task` reads top-level `delegation`, where Auto (inherit the parent) is
564
+ * stored as empty strings, and a `base_url` outranks `provider`. Only `custom` keeps a direct endpoint; any other pick
565
+ * clears its `base_url` and `api_mode` so the child really runs on the picked provider.
566
+ */
567
+ const DELEGATION_TASK = 'delegation';
568
+ function delegationRoute(entry, provider, model, advanced) {
569
+ const route = { ...dict(entry), provider: provider === 'auto' ? '' : provider, model };
570
+ if (provider !== 'custom')
571
+ Object.assign(route, { base_url: '', api_mode: '' });
572
+ if (isDict(advanced)) {
573
+ // The section has no timeout, concurrency, extra_body, or speed keys; only the endpoint and its key apply.
574
+ applyAdvancedModelOptions(route, Object.fromEntries(['base_url', 'api_key', 'api_key_clear'].filter((k) => k in advanced).map((k) => [k, advanced[k]])));
575
+ }
576
+ return route;
577
+ }
515
578
  export async function setAuxiliaryModel(store, home, task, providerRaw, modelRaw, advanced) {
516
- if (task !== '__reset__' && !AUX_TASK_SLOTS.includes(task))
517
- throw new Error(`Unknown auxiliary task slot: '${task}'. Valid: [${AUX_TASK_SLOTS.map((s) => `'${s}'`).join(', ')}]`);
579
+ const listing = await store.auxiliarySlots(home);
580
+ const slots = listing.slots.map((slot) => slot.key);
581
+ if (task !== '__reset__' && !slots.includes(task))
582
+ throw new Error(`Unknown auxiliary task slot: '${task}'. Valid: [${slots.map((s) => `'${s}'`).join(', ')}]`);
518
583
  const [provider, model] = task === '__reset__' ? ['auto', ''] : auxiliarySelection(providerRaw, modelRaw);
519
584
  await store.update(home, (config) => {
520
585
  const aux = dict(config.auxiliary);
@@ -523,9 +588,20 @@ export async function setAuxiliaryModel(store, home, task, providerRaw, modelRaw
523
588
  if (task === '__reset__') {
524
589
  for (const retired of RETIRED_AUX_TASK_SLOTS)
525
590
  Reflect.deleteProperty(aux, retired);
526
- for (const slot of AUX_TASK_SLOTS)
527
- aux[slot] = autoSlot(aux[slot]);
591
+ // A route block the Agent neither lists nor owns is a disabled or removed plugin's task: Reset All clears it too, so
592
+ // re-enabling the plugin does not bring back a pin the user reset. Unknown ownership (no listing) leaves it alone.
593
+ const { reserved } = listing;
594
+ const orphans = reserved ? Object.keys(aux).filter((key) => isDict(aux[key]) && !slots.includes(key) && !reserved.includes(key)) : [];
595
+ for (const slot of [...slots, ...orphans])
596
+ if (slot !== DELEGATION_TASK)
597
+ aux[slot] = autoSlot(aux[slot]);
528
598
  config.auxiliary = aux;
599
+ if (slots.includes(DELEGATION_TASK))
600
+ config.delegation = delegationRoute(config.delegation, 'auto', '', null);
601
+ return;
602
+ }
603
+ if (task === DELEGATION_TASK) {
604
+ config.delegation = delegationRoute(config.delegation, provider, model, advanced);
529
605
  return;
530
606
  }
531
607
  const slot = provider === 'auto' && !model ? autoSlot(aux[task]) : dict(aux[task]);
@@ -564,7 +640,7 @@ export async function setDefaultModel(store, home, modelId, providerRaw, advance
564
640
  throw new Error('model is required');
565
641
  let persistedModel = selected;
566
642
  let persistedProvider = '';
567
- await store.update(home, (config) => {
643
+ await store.update(home, async (config) => {
568
644
  const modelCfg = modelSection(config);
569
645
  const previousProvider = str(modelCfg.provider).trim();
570
646
  const requested = str(providerRaw).trim();
@@ -638,9 +714,15 @@ export async function setDefaultModel(store, home, modelId, providerRaw, advance
638
714
  Reflect.deleteProperty(modelCfg, 'base_url');
639
715
  }
640
716
  applyAdvancedModelOptions(modelCfg, advanced);
641
- if (!mainModelSupportsServiceTier(persistedModel, persistedProvider))
642
- Reflect.deleteProperty(modelCfg, 'service_tier');
643
717
  config.model = modelCfg;
718
+ if (modelCfg.service_tier) {
719
+ const [tiers] = await store.speedTiers(home, config, [{ model: persistedModel, provider: persistedProvider }]);
720
+ if (!tiers.some((t) => t.service_tier === modelCfg.service_tier)) {
721
+ if (dict(advanced).service_tier)
722
+ throw new Error('service_tier is not supported for this model and route');
723
+ Reflect.deleteProperty(modelCfg, 'service_tier');
724
+ }
725
+ }
644
726
  });
645
727
  return { ok: true, model: persistedModel, provider: persistedProvider || null };
646
728
  }