@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
@@ -14,9 +14,13 @@ import importlib
14
14
  import logging
15
15
  import multiprocessing
16
16
  import queue
17
+ import os
17
18
  import re
19
+ import signal
18
20
  import threading
19
21
  import time
22
+ from datetime import datetime
23
+ from functools import wraps
20
24
  from pathlib import Path
21
25
 
22
26
  from ..errors import InvalidParams, RpcError
@@ -31,6 +35,18 @@ _PASSTHROUGH_FIELDS = ("script", "no_agent", "context_from", "reasoning_effort",
31
35
  _RUNNING: dict[str, float] = {}
32
36
  _RUNNING_LOCK = threading.Lock()
33
37
  _SNAPSHOT_LOCK = threading.Lock()
38
+ # The Agent's fire claim lives FIRE_CLAIM_TTL_SECONDS (300); a run refreshes it well inside that, re-checks a missed
39
+ # refresh once before treating the claim as lost (as the Agent's own runs do), and gives up once no refresh has landed
40
+ # for most of the lease.
41
+ _CLAIM_HEARTBEAT_SECONDS = 60.0
42
+ _CLAIM_MISS_CONFIRM_SECONDS = 1.0
43
+ _CLAIM_HEARTBEAT_GRACE_SECONDS = 240.0
44
+ _CLAIM_LOST = "Another process took over this task's run claim, so this run stopped before saving or delivering anything"
45
+
46
+
47
+ class _ClaimLost(RuntimeError):
48
+ def __init__(self) -> None:
49
+ super().__init__(_CLAIM_LOST)
34
50
 
35
51
 
36
52
  def _main_model_pin() -> tuple[str | None, str | None]:
@@ -97,6 +113,25 @@ def _job_ref(params: dict, key: str = "job_id") -> str:
97
113
  return ref
98
114
 
99
115
 
116
+ def _settled_mutation(method):
117
+ """Fence schedule edits against manual execution, including its retained recovery obligation."""
118
+ @wraps(method)
119
+ def guarded(ctx, params):
120
+ from .cron_execution import ManualExecution, Unverified
121
+ home, jobs = profile_home_param(params), _jobs()
122
+ with _store(home):
123
+ job = getattr(jobs, "resolve_job_ref", jobs.get_job)(_job_ref(params))
124
+ if job is None:
125
+ return method(ctx, params)
126
+ job_id = _job_id({"job_id": job["id"]})
127
+ execution = ManualExecution(home, home, {"id": job_id}, None)
128
+ with execution.acquire():
129
+ if execution.file.exists():
130
+ raise Unverified("Schedule edits and deletion are blocked until the manual execution is reconciled.")
131
+ return method(ctx, dict(params, job_id=job_id))
132
+ return guarded
133
+
134
+
100
135
  # ── job payload shaping ───────────────────────────────────────────────────
101
136
 
102
137
  def _monitor_storage(monitor) -> dict:
@@ -144,6 +179,87 @@ def job_for_api(job: dict) -> dict:
144
179
  return payload
145
180
 
146
181
 
182
+ # ── store health and foreign runs (TAL-810) ─────────────────────────────
183
+
184
+ def _store_health(cron_dir: Path) -> dict | None:
185
+ """The Agent's cross-process write probe: ``None`` when the store accepts writes or the Agent predates it."""
186
+ try:
187
+ from cron.store_health import probe_report
188
+ except ImportError:
189
+ return None
190
+ return probe_report(cron_dir)
191
+
192
+
193
+ def _live_executions(home: Path, job_ids: list[str], *, strict: bool = False) -> dict[str, dict]:
194
+ """Jobs whose latest attempt is claimed or running under a live owner: the gateway scheduler or another process.
195
+
196
+ The executions ledger lives under ``get_hermes_home()``, not the cron store override, so it is read in the
197
+ profile's scope. A store without a ledger never ran anything, and is not created by this read. An unreadable
198
+ ledger reads idle for a listing; ``strict`` (run admission) refuses instead, since it cannot prove the job idle."""
199
+ try:
200
+ from cron.executions import live_inflight_execution
201
+ except ImportError:
202
+ return {}
203
+ if not job_ids or not (Path(home).expanduser() / "cron" / "executions.db").is_file():
204
+ return {}
205
+ try:
206
+ with scoped_home(home):
207
+ return {job_id: record for job_id in job_ids if job_id and (record := live_inflight_execution(job_id))}
208
+ except Exception as exc: # noqa: BLE001 - an unreadable ledger cannot prove a run; the list still loads
209
+ if strict:
210
+ raise RpcError("Cannot tell whether this task is already running: its executions ledger is unreadable", condition="cron_ledger_unreadable") from exc
211
+ log.warning("Cron executions ledger unreadable in %s", home, exc_info=True)
212
+ return {}
213
+
214
+
215
+ def _claim_fire(store_home: Path, job: dict) -> dict | bool | None:
216
+ """The Agent's own run-now lease (``claim_job_for_fire(manual=True)``), which a gateway tick must also win.
217
+
218
+ The exact record the claim took (the one to run), ``False`` when another process holds the job's claim, or
219
+ ``None`` for a job the Agent does not claim (paused, disabled, or terminal), which no tick fires. ``mark_job_run``
220
+ releases a claim when the run ends; the run heartbeats it meanwhile."""
221
+ jobs = _jobs()
222
+ with _store(store_home):
223
+ if not jobs.is_job_runnable(job):
224
+ return None
225
+ claimed = jobs.claim_job_for_fire(job["id"], manual=True, return_job=True)
226
+ if not isinstance(claimed, dict):
227
+ # The claim only loses to a live owner's claim; any other refusal is a record the Agent never claims.
228
+ current = jobs.get_job(job["id"]) or {}
229
+ return False if isinstance(current.get("fire_claim"), dict) else None
230
+ return {key: value for key, value in claimed.items() if key != "_scheduled_instant"}
231
+
232
+
233
+ @contextlib.contextmanager
234
+ def _owner_fence(jobs, job_id: str, owner: str | None, *, protect_unclaimed=False):
235
+ """Hold the Agent fire fence across side effects; canonical unclaimed runs also exclude a successor claim."""
236
+ if owner is None and protect_unclaimed:
237
+ with jobs._fire_job_lock(job_id) as locked:
238
+ current = jobs.get_job(job_id) if locked else None
239
+ yield bool(current) and not current.get("fire_claim")
240
+ else:
241
+ with jobs.fire_claim_fence(job_id, expected_owner=owner) if owner else contextlib.nullcontext(True) as owns:
242
+ yield owns
243
+
244
+
245
+ def _mark_run(jobs, job_id: str, success: bool, error, owner: str | None, delivery_error=None) -> None:
246
+ """``mark_job_run`` fenced by the run's fire claim: a run that lost its claim records nothing over the new owner's."""
247
+ fence = {"expected_fire_owner": owner} if owner else {}
248
+ try:
249
+ jobs.mark_job_run(job_id, success, error, delivery_error=delivery_error, **fence)
250
+ except TypeError:
251
+ if owner:
252
+ raise
253
+ jobs.mark_job_run(job_id, success, error)
254
+
255
+
256
+ def _elapsed(record: dict) -> float:
257
+ try:
258
+ return round(max(0.0, time.time() - datetime.fromisoformat(str(record.get("claimed_at"))).timestamp()), 1)
259
+ except ValueError:
260
+ return 0.0
261
+
262
+
147
263
  # ── output files ──────────────────────────────────────────────────────────
148
264
 
149
265
  def _response_marker_index(text: str) -> int:
@@ -228,12 +344,20 @@ def _snippet(text: str, limit: int = 600) -> str:
228
344
 
229
345
  # ── manual runs ───────────────────────────────────────────────────────────
230
346
 
231
- def _child_main(job, execution_home, result_queue):
347
+ def _child_main(job, execution_home, result_queue, cancel_event=None, execution_id=None, recovering=False):
232
348
  try:
233
349
  from cron.scheduler import run_job
234
350
 
351
+ def execute():
352
+ if recovering:
353
+ from .cron_execution import recover
354
+ return recover(job, execution_id, cancel_event)
355
+ if execution_id is not None:
356
+ return run_job(job, cancel_event=cancel_event, execution_id=execution_id)
357
+ return run_job(job)
358
+
235
359
  if execution_home is None:
236
- result = run_job(job)
360
+ result = execute()
237
361
  else:
238
362
  from talaria_sidecar.home import scoped_home as _scoped
239
363
 
@@ -241,12 +365,16 @@ def _child_main(job, execution_home, result_queue):
241
365
 
242
366
  os.environ["HERMES_HOME"] = str(execution_home)
243
367
  with _scoped(Path(execution_home)):
244
- result = run_job(job)
245
- result_queue.put(("ok", result))
368
+ result = execute()
369
+ result_queue.put(("ok", result, {key: job[key] for key in ("_model_unreachable", "_quota_hold_seconds") if key in job}))
246
370
  except BaseException as exc: # noqa: BLE001 - surfaced in the parent
247
371
  import traceback
372
+ from .cron_execution import Unverified
248
373
 
249
- result_queue.put(("error", f"{type(exc).__name__}: {exc}", traceback.format_exc()))
374
+ if isinstance(exc, Unverified):
375
+ result_queue.put(("unverified", exc.detail))
376
+ else:
377
+ result_queue.put(("error", f"{type(exc).__name__}: {exc}", traceback.format_exc()))
250
378
 
251
379
 
252
380
  def _result_timeout(job) -> float:
@@ -263,44 +391,137 @@ def _result_timeout(job) -> float:
263
391
  return 6 * 60 * 60.0
264
392
 
265
393
 
266
- def _run_in_child(job, execution_home, ctx: CallContext):
394
+ def _worker(main, *args) -> None:
395
+ """A run's worker leads its own process group, so stopping the run also reaches every process it started."""
396
+ if hasattr(os, "setsid"):
397
+ os.setsid()
398
+ main(*args)
399
+
400
+
401
+ def _signal_group(process, sig) -> None:
402
+ with contextlib.suppress(ProcessLookupError, PermissionError):
403
+ os.killpg(process.pid, sig)
404
+
405
+
406
+ def _stop(process) -> None:
407
+ """End a run's worker and everything it started, returning only once the worker has exited: SIGTERM to the
408
+ worker's process group, then SIGKILL to whatever is left, so nothing keeps running after the run gives up its
409
+ claim or its running guard. Without process groups (Windows) only the worker itself is stopped."""
410
+ if not hasattr(os, "killpg"):
411
+ process.terminate()
412
+ process.join(timeout=5)
413
+ if process.is_alive():
414
+ process.kill()
415
+ process.join()
416
+ return
417
+ _signal_group(process, signal.SIGTERM)
418
+ process.join(timeout=5)
419
+ _signal_group(process, signal.SIGKILL)
420
+ process.join()
421
+
422
+
423
+ def _run_in_child(job, execution_home, ctx: CallContext, heartbeat=None, execution=None):
424
+ from .cron_execution import SETTLEMENT_SECONDS, Unverified
425
+
267
426
  ctx_mp = multiprocessing.get_context("spawn")
268
427
  result_queue = ctx_mp.Queue(maxsize=1)
269
- process = ctx_mp.Process(target=_child_main, args=(job, str(execution_home) if execution_home else None, result_queue))
270
- process.start()
428
+ cancel_event = ctx_mp.Event() if execution is not None else None
429
+
430
+ def start(recovering=False):
431
+ args = (job, str(execution_home) if execution_home else None, result_queue)
432
+ if execution is not None:
433
+ args += (cancel_event, execution.execution_id, recovering)
434
+ child = ctx_mp.Process(target=_worker, args=(_child_main, *args))
435
+ child.start()
436
+ return child
437
+
438
+ process = start(execution.recovering if execution else False)
271
439
  deadline = time.monotonic() + _result_timeout(job)
440
+ next_beat = time.monotonic() + _CLAIM_HEARTBEAT_SECONDS
272
441
  status, payload = "error", ["cron run subprocess failed before producing a result", ""]
442
+ settling = None
443
+ recovery_started = bool(execution and execution.recovering)
444
+
445
+ def cancel(reason):
446
+ nonlocal settling
447
+ if execution is None:
448
+ return
449
+ execution.cancel(reason)
450
+ cancel_event.set()
451
+ if settling is None:
452
+ settling = time.monotonic() + SETTLEMENT_SECONDS
453
+
454
+ def recover_child(detail):
455
+ nonlocal process, recovery_started, result_queue
456
+ process.join(timeout=5)
457
+ if process.is_alive():
458
+ _stop(process)
459
+ if recovery_started:
460
+ raise Unverified(detail)
461
+ recovery_started = True
462
+ cancel("submitter interrupted")
463
+ # A killed queue writer can leave a partial frame. Recovery gets a fresh pipe.
464
+ result_queue.close()
465
+ result_queue.join_thread()
466
+ result_queue = ctx_mp.Queue(maxsize=1)
467
+ process = start(True)
468
+
469
+ if execution and execution.record["cancel_reason"]:
470
+ cancel(execution.record["cancel_reason"])
273
471
  try:
274
472
  while True:
275
473
  try:
276
474
  status, *payload = result_queue.get(timeout=1.0)
277
- break
475
+ if execution is not None and status == "unverified":
476
+ raise Unverified(payload[0])
477
+ if execution is None or status == "ok":
478
+ break
479
+ # A transport failure is not a failed task. Recover the original identity once.
480
+ recover_child(payload[0])
278
481
  except queue.Empty:
482
+ if heartbeat is not None and time.monotonic() >= next_beat:
483
+ next_beat = time.monotonic() + _CLAIM_HEARTBEAT_SECONDS
484
+ if not heartbeat():
485
+ if execution is None:
486
+ _stop(process)
487
+ raise _ClaimLost()
488
+ cancel("claim_lost")
489
+ heartbeat = None
279
490
  if ctx.cancelled:
280
- process.terminate()
281
- process.join(timeout=5)
282
- status, payload = "cancelled", ["cancelled", ""]
283
- break
491
+ if execution is None:
492
+ _stop(process)
493
+ status, payload = "cancelled", ["cancelled", ""]
494
+ break
495
+ cancel("cancelled")
284
496
  if not process.is_alive():
285
497
  # The child may have put its result just before exiting; otherwise it died (OOM, signal) without one.
286
498
  try:
287
499
  status, *payload = result_queue.get_nowait()
288
500
  except queue.Empty:
289
501
  payload = [f"cron run subprocess exited with code {process.exitcode} without producing a result", ""]
502
+ if execution is not None and status != "ok":
503
+ recover_child(payload[0])
504
+ continue
290
505
  break
291
506
  if time.monotonic() >= deadline:
292
- process.terminate()
293
- process.join(timeout=5)
294
- payload = [f"cron run subprocess produced no result within {_result_timeout(job):g}s and was terminated", ""]
295
- break
507
+ if execution is None:
508
+ _stop(process)
509
+ payload = [f"cron run subprocess produced no result within {_result_timeout(job):g}s and was terminated", ""]
510
+ break
511
+ cancel("Manual task timed out")
512
+ if settling is not None and time.monotonic() >= settling:
513
+ raise Unverified("The owner has not provided a terminal receipt.")
296
514
  process.join(timeout=5)
297
515
  if process.is_alive():
298
- process.terminate()
299
- process.join(timeout=5)
516
+ _stop(process)
300
517
  finally:
518
+ if process.is_alive():
519
+ _stop(process)
301
520
  result_queue.close()
302
521
  result_queue.join_thread()
303
522
  if status == "ok":
523
+ if execution is not None and len(payload) > 1:
524
+ execution.job.update(payload[1])
304
525
  return payload[0]
305
526
  if status == "cancelled":
306
527
  raise RpcError("cancelled", condition="cancelled")
@@ -331,7 +552,32 @@ def _delivery_home(scheduler, home: Path):
331
552
  pass
332
553
 
333
554
 
334
- def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: CallContext) -> dict:
555
+ def _heartbeat(store_home, job_id, claim_owner):
556
+ jobs = _jobs()
557
+ last_beat = time.monotonic()
558
+
559
+ def heartbeat() -> bool:
560
+ """Refresh only this fire's claim, giving transient store errors less than a lease to recover."""
561
+ nonlocal last_beat
562
+ try:
563
+ with _store(store_home):
564
+ owned = jobs.heartbeat_fire_claim(job_id, expected_owner=claim_owner) is not False
565
+ if not owned:
566
+ time.sleep(_CLAIM_MISS_CONFIRM_SECONDS)
567
+ owned = jobs.heartbeat_fire_claim(job_id, expected_owner=claim_owner) is not False
568
+ except Exception: # noqa: BLE001
569
+ log.warning("Fire claim heartbeat failed for job %s", job_id, exc_info=True)
570
+ return time.monotonic() - last_beat < _CLAIM_HEARTBEAT_GRACE_SECONDS
571
+ if owned:
572
+ last_beat = time.monotonic()
573
+ return owned
574
+ return heartbeat
575
+
576
+
577
+ def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: CallContext, claim_owner: str | None = None, *, recovery_only=False) -> dict:
578
+ from . import cron_execution
579
+ if recovery_only or cron_execution.path(store_home, job["id"]).exists() or cron_execution.supported(job):
580
+ return cron_execution.run(job, store_home, execution_home, ctx, claim_owner, recovery_only=recovery_only)
335
581
  jobs = _jobs()
336
582
  scheduler = importlib.import_module("cron.scheduler")
337
583
  silent_marker = getattr(scheduler, "SILENT_MARKER", "[SILENT]")
@@ -340,8 +586,12 @@ def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: C
340
586
  execution_home = execution_home or store_home
341
587
  outcome: dict = {"job_id": job_id, "status": "completed"}
342
588
  try:
343
- success, output, final_response, error = _run_in_child(job, execution_home, ctx)
344
- with _store(store_home), _delivery_home(scheduler, store_home):
589
+ heartbeat = _heartbeat(store_home, job_id, claim_owner)
590
+ success, output, final_response, error = _run_in_child(job, execution_home, ctx, heartbeat if claim_owner else None)
591
+ with _store(store_home), _owner_fence(jobs, job_id, claim_owner) as owns, contextlib.ExitStack() as delivery:
592
+ if not owns:
593
+ raise _ClaimLost()
594
+ delivery.enter_context(_delivery_home(scheduler, store_home))
345
595
  jobs.save_job_output(job_id, output)
346
596
  content = final_response if success else f"⚠️ Cron job '{job.get('name', job_id)}' failed:\n{error}"
347
597
  should_deliver = bool(content) and not (success and silent_marker in content.strip().upper())
@@ -353,15 +603,12 @@ def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: C
353
603
  delivery_error = str(exc)
354
604
  if success and not final_response:
355
605
  success, error = False, "Agent completed but produced empty response (model error, timeout, or misconfiguration)"
356
- try:
357
- jobs.mark_job_run(job_id, success, error, delivery_error=delivery_error)
358
- except TypeError:
359
- jobs.mark_job_run(job_id, success, error)
606
+ _mark_run(jobs, job_id, success, error, claim_owner, delivery_error)
360
607
  outcome.update(success=bool(success), error=error, delivery_error=delivery_error)
361
608
  except RpcError:
362
609
  with _store(store_home):
363
610
  try:
364
- jobs.mark_job_run(job_id, False, "cancelled")
611
+ _mark_run(jobs, job_id, False, "cancelled", claim_owner)
365
612
  except Exception: # noqa: BLE001
366
613
  pass
367
614
  raise
@@ -369,7 +616,7 @@ def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: C
369
616
  log.exception("Manual cron run failed for job %s", job_id)
370
617
  with _store(store_home):
371
618
  try:
372
- jobs.mark_job_run(job_id, False, str(exc))
619
+ _mark_run(jobs, job_id, False, str(exc), claim_owner)
373
620
  except Exception: # noqa: BLE001
374
621
  pass
375
622
  outcome.update(status="failed", success=False, error=str(exc))
@@ -382,17 +629,79 @@ def run_tracked(job: dict, store_home: Path, execution_home: Path | None, ctx: C
382
629
  # ── methods ───────────────────────────────────────────────────────────────
383
630
 
384
631
  def register(registry) -> None:
632
+ @registry.method("cron.blueprints")
633
+ def blueprints(ctx: CallContext, params: dict) -> dict:
634
+ try:
635
+ catalog = importlib.import_module("cron.blueprint_catalog")
636
+ except ModuleNotFoundError as exc:
637
+ if exc.name != "cron.blueprint_catalog":
638
+ raise
639
+ return {"blueprints": []}
640
+ with scoped_home(profile_home_param(params)):
641
+ rows = []
642
+ for blueprint in catalog.list_blueprints():
643
+ entry = catalog.blueprint_catalog_entry(blueprint)
644
+ schema = catalog.blueprint_form_schema(blueprint)
645
+ slots = [{**slot, "default": str(slot["default"]) if slot.get("default") is not None else None,
646
+ "options": [str(value) for value in slot.get("options", [])]} for slot in schema["fields"]]
647
+ rows.append({key: entry[key] for key in ("key", "title", "description", "category", "source", "plugin")})
648
+ rows[-1].update(schedule_label=entry["scheduleHuman"], slots=slots)
649
+ return {"blueprints": rows}
650
+
651
+ @registry.method("cron.blueprint_fill")
652
+ def blueprint_fill(ctx: CallContext, params: dict) -> dict:
653
+ key, values = params.get("key"), params.get("values")
654
+ if not isinstance(key, str) or not key.strip() or not isinstance(values, dict) or not all(isinstance(v, str) for v in values.values()):
655
+ raise InvalidParams("key and string slot values are required")
656
+ try:
657
+ catalog = importlib.import_module("cron.blueprint_catalog")
658
+ except ModuleNotFoundError as exc:
659
+ if exc.name != "cron.blueprint_catalog":
660
+ raise
661
+ raise InvalidParams("Automation blueprints are unavailable") from exc
662
+ with scoped_home(profile_home_param(params)):
663
+ blueprint = catalog.get_blueprint(key)
664
+ if blueprint is None:
665
+ raise InvalidParams("Unknown automation blueprint")
666
+ try:
667
+ draft = catalog.fill_blueprint(blueprint, values)
668
+ except catalog.BlueprintFillError as exc:
669
+ raise InvalidParams(str(exc)) from exc
670
+ draft.setdefault("skills", [])
671
+ return {"draft": draft}
672
+
385
673
  @registry.method("cron.list")
386
674
  def list_(ctx: CallContext, params: dict) -> dict:
387
- """Jobs of one store, shaped for the API; the server merges profiles."""
675
+ """Jobs of one store, shaped for the API; the server merges profiles. ``probe_store`` adds the store's write health."""
388
676
  jobs = _jobs()
389
- with _store(profile_home_param(params)):
390
- return {"jobs": [job_for_api(job) for job in jobs.list_jobs(include_disabled=True)]}
677
+ home = profile_home_param(params)
678
+ with _store(home):
679
+ from .cron_execution import pending_jobs
680
+ pending = {job["id"]: job for job in pending_jobs(home)}
681
+ stored = jobs.list_jobs(include_disabled=True)
682
+ ids = {job["id"] for job in stored}
683
+ stored.extend(job for jid, job in pending.items() if jid not in ids)
684
+ listed = [job_for_api(job) for job in stored]
685
+ result: dict = {"jobs": listed}
686
+ if params.get("probe_store"):
687
+ result["store_health"] = _store_health(jobs.get_cron_output_dir().parent)
688
+ live = _live_executions(home, [str(job.get("id") or "") for job in listed])
689
+ with _RUNNING_LOCK:
690
+ active = set(_RUNNING)
691
+ for index, job in enumerate(listed):
692
+ jid = str(job.get("id") or "")
693
+ if jid in pending and jid not in live and jid not in active:
694
+ # Web preflight must use the accepted fire's profile, even after external job edits.
695
+ job = listed[index] = job_for_api(pending[jid])
696
+ job["running_elsewhere"] = jid in live
697
+ return result
391
698
 
392
699
  @registry.method("cron.get")
393
700
  def get(ctx: CallContext, params: dict) -> dict:
394
- with _store(profile_home_param(params)):
395
- job = _jobs().get_job(_job_id(params))
701
+ from .cron_execution import pending_job
702
+ home, job_id = profile_home_param(params), _job_id(params)
703
+ with _store(home):
704
+ job = pending_job(home, job_id) or _jobs().get_job(job_id)
396
705
  return {"job": job_for_api(job) if job else None}
397
706
 
398
707
  @registry.method("cron.create")
@@ -444,6 +753,7 @@ def register(registry) -> None:
444
753
  return {"job": job_for_api(job)}
445
754
 
446
755
  @registry.method("cron.update")
756
+ @_settled_mutation
447
757
  def update(ctx: CallContext, params: dict) -> dict:
448
758
  jobs = _jobs()
449
759
  job_id = _job_ref(params)
@@ -472,6 +782,7 @@ def register(registry) -> None:
472
782
  return {"job": job_for_api(job)}
473
783
 
474
784
  @registry.method("cron.delete")
785
+ @_settled_mutation
475
786
  def delete(ctx: CallContext, params: dict) -> dict:
476
787
  job_id = _job_ref(params)
477
788
  with _store(profile_home_param(params)):
@@ -489,6 +800,7 @@ def register(registry) -> None:
489
800
  return {"job": dict(job)}
490
801
 
491
802
  @registry.method("cron.resume")
803
+ @_settled_mutation
492
804
  def resume(ctx: CallContext, params: dict) -> dict:
493
805
  with _store(profile_home_param(params)):
494
806
  try:
@@ -505,17 +817,37 @@ def register(registry) -> None:
505
817
  store_home = profile_home_param(params)
506
818
  execution_home = Path(params["execution_home"]).expanduser() if params.get("execution_home") else None
507
819
  job_id = _job_id(params)
820
+ from .cron_execution import path
821
+ if path(store_home, job_id).exists():
822
+ return run_tracked({"id": job_id}, store_home, execution_home, ctx, recovery_only=True)
508
823
  with _store(store_home):
509
824
  job = _jobs().get_job(job_id)
510
825
  if not job:
511
826
  raise RpcError("Job not found", condition="not_found")
827
+ foreign = _live_executions(store_home, [job_id], strict=True).get(job_id)
828
+ if foreign is not None:
829
+ return {"job_id": job_id, "status": "already_running", "elapsed": _elapsed(foreign)}
512
830
  with _RUNNING_LOCK:
513
831
  started = _RUNNING.get(job_id)
514
832
  if started is not None:
515
833
  return {"job_id": job_id, "status": "already_running", "elapsed": round(time.time() - started, 1)}
516
834
  _RUNNING[job_id] = time.time()
835
+ try:
836
+ claimed = _claim_fire(store_home, job)
837
+ except BaseException:
838
+ with _RUNNING_LOCK:
839
+ _RUNNING.pop(job_id, None)
840
+ raise
841
+ if claimed is False:
842
+ with _RUNNING_LOCK:
843
+ _RUNNING.pop(job_id, None)
844
+ return {"job_id": job_id, "status": "already_running", "elapsed": 0.0}
845
+ owner = None
846
+ if claimed:
847
+ job = claimed
848
+ owner = str((claimed.get("fire_claim") or {}).get("by") or "") or None
517
849
  ctx.emit("started", {"job_id": job_id})
518
- return run_tracked(job, store_home, execution_home, ctx)
850
+ return run_tracked(job, store_home, execution_home, ctx, owner)
519
851
 
520
852
  @registry.method("cron.status", requires_agent=False)
521
853
  def status(ctx: CallContext, params: dict) -> dict:
@@ -582,7 +914,8 @@ def register(registry) -> None:
582
914
 
583
915
  @registry.method("cron.delivery_options", requires_agent=False)
584
916
  def delivery_options(ctx: CallContext, params: dict) -> dict:
585
- known: frozenset = frozenset()
917
+ home = profile_home_param(params)
918
+ known: set = set()
586
919
  for module_name in ("cron.scheduler_delivery", "cron.scheduler"):
587
920
  try:
588
921
  module = importlib.import_module(module_name)
@@ -590,7 +923,12 @@ def register(registry) -> None:
590
923
  continue
591
924
  candidates = getattr(module, "_KNOWN_DELIVERY_PLATFORMS", None)
592
925
  if candidates:
593
- known = frozenset(candidates)
926
+ known = set(candidates)
927
+ # Agent 0.22.3+ keeps messaging platforms in the plugin registry; mirror its `_is_known_delivery_platform`.
928
+ plugin_platforms = getattr(module, "_iter_home_target_platforms", None)
929
+ if plugin_platforms is not None:
930
+ with scoped_home(home):
931
+ known.update(plugin_platforms())
594
932
  break
595
933
  platforms = [{"value": "local", "label": "Local (save output only)"}, {"value": "origin", "label": "Origin (reply to creator)"}]
596
934
  platforms.extend({"value": name, "label": name.capitalize()} for name in sorted(known))