@maudecode/talaria-web 1.17.2 → 1.19.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 (623) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/auth-raw.d.ts +1 -1
  3. package/dist/api/auth-raw.js +20 -20
  4. package/dist/api/auth-raw.js.map +1 -1
  5. package/dist/api/automation-raw.d.ts +7 -1
  6. package/dist/api/automation-raw.js +74 -27
  7. package/dist/api/automation-raw.js.map +1 -1
  8. package/dist/api/automation-router.d.ts +128 -23
  9. package/dist/api/automation-router.js +29 -13
  10. package/dist/api/automation-router.js.map +1 -1
  11. package/dist/api/chat-router.d.ts +1845 -40
  12. package/dist/api/chat-router.js +196 -114
  13. package/dist/api/chat-router.js.map +1 -1
  14. package/dist/api/git-router.d.ts +37 -3
  15. package/dist/api/git-router.js +47 -48
  16. package/dist/api/git-router.js.map +1 -1
  17. package/dist/api/raw-routes.d.ts +9 -1
  18. package/dist/api/raw-routes.js +286 -73
  19. package/dist/api/raw-routes.js.map +1 -1
  20. package/dist/api/router.d.ts +16 -6
  21. package/dist/api/router.js +28 -26
  22. package/dist/api/router.js.map +1 -1
  23. package/dist/api/session-visibility.d.ts +4 -4
  24. package/dist/api/session-visibility.js +26 -16
  25. package/dist/api/session-visibility.js.map +1 -1
  26. package/dist/api/sessions-router.d.ts +3312 -131
  27. package/dist/api/sessions-router.js +287 -157
  28. package/dist/api/sessions-router.js.map +1 -1
  29. package/dist/api/settings-router.d.ts +457 -8
  30. package/dist/api/settings-router.js +54 -33
  31. package/dist/api/settings-router.js.map +1 -1
  32. package/dist/api/sse-routes.d.ts +7 -2
  33. package/dist/api/sse-routes.js +109 -62
  34. package/dist/api/sse-routes.js.map +1 -1
  35. package/dist/api/tools-raw.d.ts +5 -0
  36. package/dist/api/tools-raw.js +63 -55
  37. package/dist/api/tools-raw.js.map +1 -1
  38. package/dist/api/tools-router.d.ts +998 -85
  39. package/dist/api/tools-router.js +447 -61
  40. package/dist/api/tools-router.js.map +1 -1
  41. package/dist/api/transcribe-stream.d.ts +16 -0
  42. package/dist/api/transcribe-stream.js +172 -0
  43. package/dist/api/transcribe-stream.js.map +1 -0
  44. package/dist/app.d.ts +4 -1
  45. package/dist/app.js +98 -59
  46. package/dist/app.js.map +1 -1
  47. package/dist/auth/gate.js +15 -11
  48. package/dist/auth/gate.js.map +1 -1
  49. package/dist/auth/oidc.d.ts +5 -2
  50. package/dist/auth/oidc.js +8 -7
  51. package/dist/auth/oidc.js.map +1 -1
  52. package/dist/auth/passkeys.d.ts +15 -14
  53. package/dist/auth/passkeys.js +89 -91
  54. package/dist/auth/passkeys.js.map +1 -1
  55. package/dist/auth/store.d.ts +17 -7
  56. package/dist/auth/store.js +93 -52
  57. package/dist/auth/store.js.map +1 -1
  58. package/dist/bin/talaria-web.js +12 -81
  59. package/dist/bin/talaria-web.js.map +1 -1
  60. package/dist/cli/ctl.js +2 -1
  61. package/dist/cli/ctl.js.map +1 -1
  62. package/dist/cli/dotenv.d.ts +5 -0
  63. package/dist/cli/dotenv.js +15 -2
  64. package/dist/cli/dotenv.js.map +1 -1
  65. package/dist/cli/launcher.js +5 -5
  66. package/dist/cli/launcher.js.map +1 -1
  67. package/dist/cli/main.d.ts +1 -0
  68. package/dist/cli/main.js +85 -0
  69. package/dist/cli/main.js.map +1 -0
  70. package/dist/cli/supervise.d.ts +2 -0
  71. package/dist/cli/supervise.js +67 -4
  72. package/dist/cli/supervise.js.map +1 -1
  73. package/dist/config/agent-config.d.ts +34 -11
  74. package/dist/config/agent-config.js +116 -60
  75. package/dist/config/agent-config.js.map +1 -1
  76. package/dist/config.d.ts +4 -0
  77. package/dist/config.js +19 -6
  78. package/dist/config.js.map +1 -1
  79. package/dist/fs/atomic.d.ts +1 -0
  80. package/dist/fs/atomic.js +4 -1
  81. package/dist/fs/atomic.js.map +1 -1
  82. package/dist/fs/stat.d.ts +1 -0
  83. package/dist/fs/stat.js +11 -0
  84. package/dist/fs/stat.js.map +1 -0
  85. package/dist/http/context.d.ts +31 -12
  86. package/dist/http/context.js +60 -24
  87. package/dist/http/context.js.map +1 -1
  88. package/dist/http/csp.d.ts +2 -1
  89. package/dist/http/csp.js +3 -2
  90. package/dist/http/csp.js.map +1 -1
  91. package/dist/onboarding.d.ts +2 -2
  92. package/dist/onboarding.js +10 -8
  93. package/dist/onboarding.js.map +1 -1
  94. package/dist/profiles/profiles.d.ts +20 -4
  95. package/dist/profiles/profiles.js +115 -30
  96. package/dist/profiles/profiles.js.map +1 -1
  97. package/dist/projects.d.ts +15 -6
  98. package/dist/projects.js +55 -47
  99. package/dist/projects.js.map +1 -1
  100. package/dist/providers/catalog.d.ts +84 -14
  101. package/dist/providers/catalog.js +474 -151
  102. package/dist/providers/catalog.js.map +1 -1
  103. package/dist/providers/env-file.d.ts +10 -3
  104. package/dist/providers/env-file.js +24 -75
  105. package/dist/providers/env-file.js.map +1 -1
  106. package/dist/providers/runtime-env.d.ts +4 -2
  107. package/dist/providers/runtime-env.js +9 -6
  108. package/dist/providers/runtime-env.js.map +1 -1
  109. package/dist/providers/tables.d.ts +3 -1
  110. package/dist/providers/tables.js +4 -2
  111. package/dist/providers/tables.js.map +1 -1
  112. package/dist/raster-image.d.ts +7 -0
  113. package/dist/raster-image.js +267 -0
  114. package/dist/raster-image.js.map +1 -0
  115. package/dist/redact.js +342 -46
  116. package/dist/redact.js.map +1 -1
  117. package/dist/release.d.ts +7 -0
  118. package/dist/release.js +14 -0
  119. package/dist/release.js.map +1 -1
  120. package/dist/runtime.d.ts +5 -1
  121. package/dist/runtime.js +305 -96
  122. package/dist/runtime.js.map +1 -1
  123. package/dist/server.js +15 -0
  124. package/dist/server.js.map +1 -1
  125. package/dist/sessions/anchor.d.ts +9 -3
  126. package/dist/sessions/anchor.js +28 -36
  127. package/dist/sessions/anchor.js.map +1 -1
  128. package/dist/sessions/background-events.d.ts +2 -0
  129. package/dist/sessions/background-events.js +10 -0
  130. package/dist/sessions/background-events.js.map +1 -0
  131. package/dist/sessions/background-tasks.d.ts +26 -27
  132. package/dist/sessions/background-tasks.js +89 -97
  133. package/dist/sessions/background-tasks.js.map +1 -1
  134. package/dist/sessions/background-updates.d.ts +15 -8
  135. package/dist/sessions/background-updates.js +101 -25
  136. package/dist/sessions/background-updates.js.map +1 -1
  137. package/dist/sessions/cli-sessions.d.ts +27 -6
  138. package/dist/sessions/cli-sessions.js +152 -42
  139. package/dist/sessions/cli-sessions.js.map +1 -1
  140. package/dist/sessions/completions.d.ts +77 -9
  141. package/dist/sessions/completions.js +482 -45
  142. package/dist/sessions/completions.js.map +1 -1
  143. package/dist/sessions/compress.d.ts +8 -0
  144. package/dist/sessions/compress.js +2 -2
  145. package/dist/sessions/compress.js.map +1 -1
  146. package/dist/sessions/drafts.d.ts +14 -10
  147. package/dist/sessions/drafts.js +38 -43
  148. package/dist/sessions/drafts.js.map +1 -1
  149. package/dist/sessions/export.d.ts +5 -0
  150. package/dist/sessions/export.js +30 -0
  151. package/dist/sessions/export.js.map +1 -1
  152. package/dist/sessions/gateway-sessions.d.ts +46 -0
  153. package/dist/sessions/gateway-sessions.js +378 -0
  154. package/dist/sessions/gateway-sessions.js.map +1 -0
  155. package/dist/sessions/gateway-watcher.d.ts +7 -3
  156. package/dist/sessions/gateway-watcher.js +31 -19
  157. package/dist/sessions/gateway-watcher.js.map +1 -1
  158. package/dist/sessions/goals.d.ts +31 -0
  159. package/dist/sessions/goals.js +75 -0
  160. package/dist/sessions/goals.js.map +1 -0
  161. package/dist/sessions/handoff.d.ts +32 -0
  162. package/dist/sessions/handoff.js +114 -0
  163. package/dist/sessions/handoff.js.map +1 -0
  164. package/dist/sessions/journal.d.ts +5 -79
  165. package/dist/sessions/journal.js +15 -606
  166. package/dist/sessions/journal.js.map +1 -1
  167. package/dist/sessions/list.d.ts +31 -16
  168. package/dist/sessions/list.js +139 -129
  169. package/dist/sessions/list.js.map +1 -1
  170. package/dist/sessions/merge.d.ts +69 -13
  171. package/dist/sessions/merge.js +265 -64
  172. package/dist/sessions/merge.js.map +1 -1
  173. package/dist/sessions/notices.d.ts +22 -0
  174. package/dist/sessions/notices.js +72 -0
  175. package/dist/sessions/notices.js.map +1 -0
  176. package/dist/sessions/pending.d.ts +10 -4
  177. package/dist/sessions/pending.js +83 -7
  178. package/dist/sessions/pending.js.map +1 -1
  179. package/dist/sessions/prefix-index.d.ts +82 -0
  180. package/dist/sessions/prefix-index.js +232 -0
  181. package/dist/sessions/prefix-index.js.map +1 -0
  182. package/dist/sessions/recovery.d.ts +19 -0
  183. package/dist/sessions/recovery.js +322 -0
  184. package/dist/sessions/recovery.js.map +1 -0
  185. package/dist/sessions/relay.d.ts +38 -19
  186. package/dist/sessions/relay.js +302 -79
  187. package/dist/sessions/relay.js.map +1 -1
  188. package/dist/sessions/service.d.ts +260 -55
  189. package/dist/sessions/service.js +1448 -462
  190. package/dist/sessions/service.js.map +1 -1
  191. package/dist/sessions/session.d.ts +24 -2
  192. package/dist/sessions/session.js +69 -7
  193. package/dist/sessions/session.js.map +1 -1
  194. package/dist/sessions/shares.d.ts +7 -6
  195. package/dist/sessions/shares.js +22 -45
  196. package/dist/sessions/shares.js.map +1 -1
  197. package/dist/sessions/source-kind.js +1 -0
  198. package/dist/sessions/source-kind.js.map +1 -1
  199. package/dist/sessions/state-db-identity.d.ts +18 -0
  200. package/dist/sessions/state-db-identity.js +67 -0
  201. package/dist/sessions/state-db-identity.js.map +1 -0
  202. package/dist/sessions/state-db-worker.d.ts +1 -0
  203. package/dist/sessions/state-db-worker.js +35 -0
  204. package/dist/sessions/state-db-worker.js.map +1 -0
  205. package/dist/sessions/state-db.d.ts +113 -7
  206. package/dist/sessions/state-db.js +861 -44
  207. package/dist/sessions/state-db.js.map +1 -1
  208. package/dist/sessions/storage/backend.d.ts +162 -0
  209. package/dist/sessions/storage/backend.js +19 -0
  210. package/dist/sessions/storage/backend.js.map +1 -0
  211. package/dist/sessions/storage/conformance.d.ts +20 -0
  212. package/dist/sessions/storage/conformance.js +237 -0
  213. package/dist/sessions/storage/conformance.js.map +1 -0
  214. package/dist/sessions/storage/document.d.ts +16 -0
  215. package/dist/sessions/storage/document.js +44 -0
  216. package/dist/sessions/storage/document.js.map +1 -0
  217. package/dist/sessions/storage/json-documents.d.ts +23 -0
  218. package/dist/sessions/storage/json-documents.js +233 -0
  219. package/dist/sessions/storage/json-documents.js.map +1 -0
  220. package/dist/sessions/storage/json-files.d.ts +12 -0
  221. package/dist/sessions/storage/json-files.js +124 -0
  222. package/dist/sessions/storage/json-files.js.map +1 -0
  223. package/dist/sessions/storage/json-installation.d.ts +3 -0
  224. package/dist/sessions/storage/json-installation.js +31 -0
  225. package/dist/sessions/storage/json-installation.js.map +1 -0
  226. package/dist/sessions/storage/json-journal.d.ts +114 -0
  227. package/dist/sessions/storage/json-journal.js +686 -0
  228. package/dist/sessions/storage/json-journal.js.map +1 -0
  229. package/dist/sessions/storage/json-recovery.d.ts +4 -0
  230. package/dist/sessions/storage/json-recovery.js +195 -0
  231. package/dist/sessions/storage/json-recovery.js.map +1 -0
  232. package/dist/sessions/storage/json.d.ts +68 -0
  233. package/dist/sessions/storage/json.js +258 -0
  234. package/dist/sessions/storage/json.js.map +1 -0
  235. package/dist/sessions/storage/row.d.ts +6 -0
  236. package/dist/sessions/storage/row.js +49 -0
  237. package/dist/sessions/storage/row.js.map +1 -0
  238. package/dist/sessions/storage/search-text.d.ts +4 -0
  239. package/dist/sessions/storage/search-text.js +16 -0
  240. package/dist/sessions/storage/search-text.js.map +1 -0
  241. package/dist/sessions/store.d.ts +65 -68
  242. package/dist/sessions/store.js +305 -602
  243. package/dist/sessions/store.js.map +1 -1
  244. package/dist/sessions/streams.d.ts +4 -0
  245. package/dist/sessions/streams.js +9 -1
  246. package/dist/sessions/streams.js.map +1 -1
  247. package/dist/sessions/titles.d.ts +2 -0
  248. package/dist/sessions/titles.js +5 -1
  249. package/dist/sessions/titles.js.map +1 -1
  250. package/dist/sessions/todo.d.ts +5 -0
  251. package/dist/sessions/todo.js +28 -21
  252. package/dist/sessions/todo.js.map +1 -1
  253. package/dist/sessions/tool-display.d.ts +5 -4
  254. package/dist/sessions/tool-display.js +30 -50
  255. package/dist/sessions/tool-display.js.map +1 -1
  256. package/dist/sessions/turn-context.d.ts +11 -2
  257. package/dist/sessions/turn-context.js +18 -11
  258. package/dist/sessions/turn-context.js.map +1 -1
  259. package/dist/sessions/turn.d.ts +122 -17
  260. package/dist/sessions/turn.js +939 -358
  261. package/dist/sessions/turn.js.map +1 -1
  262. package/dist/sessions/wakeup-pause.d.ts +54 -0
  263. package/dist/sessions/wakeup-pause.js +163 -0
  264. package/dist/sessions/wakeup-pause.js.map +1 -0
  265. package/dist/sessions/window.js +13 -12
  266. package/dist/sessions/window.js.map +1 -1
  267. package/dist/settings.d.ts +19 -7
  268. package/dist/settings.js +178 -184
  269. package/dist/settings.js.map +1 -1
  270. package/dist/sidecar/client.d.ts +17 -3
  271. package/dist/sidecar/client.js +78 -8
  272. package/dist/sidecar/client.js.map +1 -1
  273. package/dist/sidecar/discover.d.ts +2 -1
  274. package/dist/sidecar/discover.js +93 -10
  275. package/dist/sidecar/discover.js.map +1 -1
  276. package/dist/sidecar/env.d.ts +4 -0
  277. package/dist/sidecar/env.js +3 -0
  278. package/dist/sidecar/env.js.map +1 -0
  279. package/dist/sidecar/fake.d.ts +2 -2
  280. package/dist/sidecar/fake.js +19 -2
  281. package/dist/sidecar/fake.js.map +1 -1
  282. package/dist/startup.d.ts +13 -5
  283. package/dist/startup.js +48 -0
  284. package/dist/startup.js.map +1 -1
  285. package/dist/test/env-file.d.ts +5 -0
  286. package/dist/test/env-file.js +88 -0
  287. package/dist/test/env-file.js.map +1 -0
  288. package/dist/test/harness.d.ts +1 -0
  289. package/dist/test/harness.js +1 -1
  290. package/dist/test/harness.js.map +1 -1
  291. package/dist/test/passkeys.d.ts +22 -0
  292. package/dist/test/passkeys.js +62 -0
  293. package/dist/test/passkeys.js.map +1 -0
  294. package/dist/test/storage.d.ts +15 -0
  295. package/dist/test/storage.js +26 -0
  296. package/dist/test/storage.js.map +1 -0
  297. package/dist/test/ts-worker-hooks.d.ts +1 -0
  298. package/dist/test/ts-worker-hooks.js +24 -0
  299. package/dist/test/ts-worker-hooks.js.map +1 -0
  300. package/dist/text/diff.d.ts +9 -14
  301. package/dist/text/diff.js +74 -108
  302. package/dist/text/diff.js.map +1 -1
  303. package/dist/tools/commands.d.ts +6 -1
  304. package/dist/tools/commands.js +8 -2
  305. package/dist/tools/commands.js.map +1 -1
  306. package/dist/tools/connectors.d.ts +33 -0
  307. package/dist/tools/connectors.js +121 -0
  308. package/dist/tools/connectors.js.map +1 -0
  309. package/dist/tools/crons.d.ts +38 -1
  310. package/dist/tools/crons.js +122 -18
  311. package/dist/tools/crons.js.map +1 -1
  312. package/dist/tools/dashboard-plugins.d.ts +53 -0
  313. package/dist/tools/dashboard-plugins.js +188 -0
  314. package/dist/tools/dashboard-plugins.js.map +1 -0
  315. package/dist/tools/extensions.d.ts +18 -5
  316. package/dist/tools/extensions.js +344 -266
  317. package/dist/tools/extensions.js.map +1 -1
  318. package/dist/tools/gateway-restart.d.ts +62 -0
  319. package/dist/tools/gateway-restart.js +142 -0
  320. package/dist/tools/gateway-restart.js.map +1 -0
  321. package/dist/tools/health.d.ts +44 -0
  322. package/dist/tools/health.js +201 -46
  323. package/dist/tools/health.js.map +1 -1
  324. package/dist/tools/hygiene.d.ts +4 -3
  325. package/dist/tools/hygiene.js +23 -9
  326. package/dist/tools/hygiene.js.map +1 -1
  327. package/dist/tools/kanban.d.ts +4 -2
  328. package/dist/tools/kanban.js +28 -19
  329. package/dist/tools/kanban.js.map +1 -1
  330. package/dist/tools/mcp.d.ts +13 -0
  331. package/dist/tools/mcp.js +88 -0
  332. package/dist/tools/mcp.js.map +1 -1
  333. package/dist/tools/memory-masks.d.ts +5 -0
  334. package/dist/tools/memory-masks.js +256 -0
  335. package/dist/tools/memory-masks.js.map +1 -0
  336. package/dist/tools/memory.d.ts +29 -3
  337. package/dist/tools/memory.js +69 -27
  338. package/dist/tools/memory.js.map +1 -1
  339. package/dist/tools/plugin-settings.d.ts +15 -0
  340. package/dist/tools/plugin-settings.js +90 -0
  341. package/dist/tools/plugin-settings.js.map +1 -0
  342. package/dist/tools/project-os.d.ts +11 -0
  343. package/dist/tools/project-os.js +267 -0
  344. package/dist/tools/project-os.js.map +1 -0
  345. package/dist/tools/skills.d.ts +14 -5
  346. package/dist/tools/skills.js +49 -16
  347. package/dist/tools/skills.js.map +1 -1
  348. package/dist/tools/update-notifications.d.ts +34 -15
  349. package/dist/tools/update-notifications.js +141 -57
  350. package/dist/tools/update-notifications.js.map +1 -1
  351. package/dist/tools/update-rollback.d.ts +11 -0
  352. package/dist/tools/update-rollback.js +28 -0
  353. package/dist/tools/update-rollback.js.map +1 -0
  354. package/dist/tools/updates.d.ts +110 -32
  355. package/dist/tools/updates.js +1112 -294
  356. package/dist/tools/updates.js.map +1 -1
  357. package/dist/tools/wiki.d.ts +68 -0
  358. package/dist/tools/wiki.js +413 -0
  359. package/dist/tools/wiki.js.map +1 -0
  360. package/dist/util.d.ts +2 -0
  361. package/dist/util.js +5 -0
  362. package/dist/util.js.map +1 -1
  363. package/dist/workspace/escape.d.ts +61 -0
  364. package/dist/workspace/escape.js +149 -0
  365. package/dist/workspace/escape.js.map +1 -0
  366. package/dist/workspace/extract.d.ts +22 -0
  367. package/dist/workspace/extract.js +308 -0
  368. package/dist/workspace/extract.js.map +1 -0
  369. package/dist/workspace/fs.d.ts +12 -0
  370. package/dist/workspace/fs.js +92 -23
  371. package/dist/workspace/fs.js.map +1 -1
  372. package/dist/workspace/git.d.ts +34 -1
  373. package/dist/workspace/git.js +328 -35
  374. package/dist/workspace/git.js.map +1 -1
  375. package/dist/workspace/media.d.ts +16 -13
  376. package/dist/workspace/media.js +43 -61
  377. package/dist/workspace/media.js.map +1 -1
  378. package/dist/workspace/rollback.d.ts +36 -22
  379. package/dist/workspace/rollback.js +178 -272
  380. package/dist/workspace/rollback.js.map +1 -1
  381. package/dist/workspace/unzip.js +4 -1
  382. package/dist/workspace/unzip.js.map +1 -1
  383. package/dist/workspace/upload.d.ts +7 -4
  384. package/dist/workspace/upload.js +5 -2
  385. package/dist/workspace/upload.js.map +1 -1
  386. package/dist/workspace/workspaces.d.ts +15 -19
  387. package/dist/workspace/workspaces.js +55 -127
  388. package/dist/workspace/workspaces.js.map +1 -1
  389. package/dist/workspace/worktrees.d.ts +2 -1
  390. package/dist/workspace/worktrees.js +179 -42
  391. package/dist/workspace/worktrees.js.map +1 -1
  392. package/package.json +7 -3
  393. package/sidecar/agent_dependency.json +4 -4
  394. package/sidecar/agent_support.json +26 -0
  395. package/sidecar/scripts/record-fixtures.py +12 -3
  396. package/sidecar/scripts/replay_sidecar.py +32 -0
  397. package/sidecar/scripts/suite_runner.py +302 -0
  398. package/sidecar/scripts/test.sh +12 -4
  399. package/sidecar/talaria_sidecar/__init__.py +6 -1
  400. package/sidecar/talaria_sidecar/__main__.py +4 -2
  401. package/sidecar/talaria_sidecar/agent_mutation.py +975 -0
  402. package/sidecar/talaria_sidecar/agent_services.py +1053 -0
  403. package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
  404. package/sidecar/talaria_sidecar/home.py +56 -3
  405. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  406. package/sidecar/talaria_sidecar/methods/aux.py +166 -24
  407. package/sidecar/talaria_sidecar/methods/chat.py +852 -135
  408. package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
  409. package/sidecar/talaria_sidecar/methods/commands.py +294 -4
  410. package/sidecar/talaria_sidecar/methods/config.py +123 -4
  411. package/sidecar/talaria_sidecar/methods/connectors.py +343 -0
  412. package/sidecar/talaria_sidecar/methods/cron.py +395 -36
  413. package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
  414. package/sidecar/talaria_sidecar/methods/gateway.py +212 -55
  415. package/sidecar/talaria_sidecar/methods/gateway_sessions.py +234 -0
  416. package/sidecar/talaria_sidecar/methods/goals.py +81 -41
  417. package/sidecar/talaria_sidecar/methods/kanban.py +108 -34
  418. package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
  419. package/sidecar/talaria_sidecar/methods/memory.py +84 -0
  420. package/sidecar/talaria_sidecar/methods/oauth.py +5 -2
  421. package/sidecar/talaria_sidecar/methods/process.py +218 -15
  422. package/sidecar/talaria_sidecar/methods/profiles.py +121 -13
  423. package/sidecar/talaria_sidecar/methods/providers.py +217 -28
  424. package/sidecar/talaria_sidecar/methods/runtime.py +69 -1
  425. package/sidecar/talaria_sidecar/methods/skills.py +67 -4
  426. package/sidecar/talaria_sidecar/methods/state_db.py +316 -75
  427. package/sidecar/talaria_sidecar/methods/stt.py +159 -78
  428. package/sidecar/talaria_sidecar/methods/text.py +14 -1
  429. package/sidecar/talaria_sidecar/methods/toolsets.py +49 -0
  430. package/sidecar/talaria_sidecar/methods/usage.py +113 -14
  431. package/sidecar/talaria_sidecar/methods/worktree.py +26 -19
  432. package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
  433. package/sidecar/talaria_sidecar/rpc.py +45 -4
  434. package/sidecar/talaria_sidecar/runtime.py +98 -13
  435. package/sidecar/talaria_sidecar/speed.py +35 -0
  436. package/static/dist/FILES.txt +126 -126
  437. package/static/dist/assets/AppShell-cey33v9s.js +8 -0
  438. package/static/dist/assets/ChatPage-i8wnugr7.js +18 -0
  439. package/static/dist/assets/ConnectTargets-hg19553x.js +1 -0
  440. package/static/dist/assets/ExtensionRoute-cly4apm5.js +1 -0
  441. package/static/dist/assets/Field-j8uqoigz.js +9 -0
  442. package/static/dist/assets/HubRoute-e4bgz41j.js +2 -0
  443. package/static/dist/assets/Markdown-lahuichm.js +598 -0
  444. package/static/dist/assets/RightPanel-lbo4i0fn.js +1 -0
  445. package/static/dist/assets/Select-gqatm2e0.js +1 -0
  446. package/static/dist/assets/SessionListPanel-mfqayfjh.js +1 -0
  447. package/static/dist/assets/SettingsLayout-b8980u7k.js +1 -0
  448. package/static/dist/assets/States-e7dkgtxf.js +1 -0
  449. package/static/dist/assets/Toaster-bfqqy786.js +1 -0
  450. package/static/dist/assets/_app-n1n6pfx1.js +1 -0
  451. package/static/dist/assets/{_app.ext._extensionId-opyh9y0v.js → _app.ext._extensionId-buxjxav3.js} +1 -1
  452. package/static/dist/assets/_app.index-jt8zwiu2.js +1 -0
  453. package/static/dist/assets/_app.insights-cv76ml71.js +1 -0
  454. package/static/dist/assets/_app.kanban-h6ts53j7.js +1 -0
  455. package/static/dist/assets/_app.logs-dm873z90.js +1 -0
  456. package/static/dist/assets/_app.memory-glk5y6m8.js +1 -0
  457. package/static/dist/assets/_app.profiles-ka6zpstq.js +1 -0
  458. package/static/dist/assets/{_app.session._sessionId-bfd4h3id.js → _app.session._sessionId-g2vzghvc.js} +1 -1
  459. package/static/dist/assets/_app.settings-hgjdhzcd.js +1 -0
  460. package/static/dist/assets/_app.settings._section-jf2kmhae.js +3 -0
  461. package/static/dist/assets/_app.skills-cii852yq.js +1 -0
  462. package/static/dist/assets/_app.tasks-fp9q7atm.js +1 -0
  463. package/static/dist/assets/_app.todos-dw94qzue.js +1 -0
  464. package/static/dist/assets/_app.workspaces-inyygzze.js +1 -0
  465. package/static/dist/assets/{abnfDiagram-VCTEODGH-b2x1lqot.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
  466. package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
  467. package/static/dist/assets/{architectureDiagram-5GKGNRK7-h38o5l7b.js → architectureDiagram-5GKGNRK7-nwb3xovn.js} +1 -1
  468. package/static/dist/assets/archive-b1j004vn.js +1 -0
  469. package/static/dist/assets/back-g74gkozu.js +1 -0
  470. package/static/dist/assets/{blockDiagram-I7D4REHJ-bqquxv2u.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
  471. package/static/dist/assets/{c4Diagram-7LVT6UL2-f3fb8w6z.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
  472. package/static/dist/assets/channel-es95o4y8.js +1 -0
  473. package/static/dist/assets/{chunk-4HAMMTFA-bzfyyzp3.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
  474. package/static/dist/assets/{chunk-75Z2AOVW-ly99rfx5.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
  475. package/static/dist/assets/{chunk-DU6HZSFF-bg6ecfqf.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
  476. package/static/dist/assets/{chunk-F27PBJKO-e8k7mmqw.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
  477. package/static/dist/assets/{chunk-GMAD6QVW-cmalnoaj.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
  478. package/static/dist/assets/{chunk-GVQU2GXP-gmif5o01.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
  479. package/static/dist/assets/{chunk-IMKFNOWR-f1nwwh6u.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
  480. package/static/dist/assets/{chunk-L3NEJ4N5-oktfh5v7.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
  481. package/static/dist/assets/{chunk-OSK3NFVY-b1sdx96z.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
  482. package/static/dist/assets/{chunk-P2QGCYS3-fhu4nzxt.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
  483. package/static/dist/assets/{chunk-POPQ4Y6H-em31rnef.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
  484. package/static/dist/assets/{chunk-PWAF6VOD-bxhhyftw.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
  485. package/static/dist/assets/{chunk-SHT3W25Y-fmrvwcav.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
  486. package/static/dist/assets/{chunk-SVP7TREG-lymukl2j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
  487. package/static/dist/assets/{chunk-TICWLB2K-lmza6k23.js → chunk-TICWLB2K-bnk3m1mq.js} +1 -1
  488. package/static/dist/assets/classDiagram-ZZMXUADV-kmihoqxh.js +1 -0
  489. package/static/dist/assets/classDiagram-v2-VYDZK3BY-kmihoqxh.js +1 -0
  490. package/static/dist/assets/copied-bli9tbcx.js +1 -0
  491. package/static/dist/assets/{copy-fw5b1pc6.js → copy-jamtd1pf.js} +1 -1
  492. package/static/dist/assets/{cynefin-OW5HDTMX-czlhbyhs.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
  493. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-gq7mvswb.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
  494. package/static/dist/assets/{dagre-GXQ25YYZ-cqdbf7dr.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
  495. package/static/dist/assets/{diagram-S7CK7UJ4-o6arxa58.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
  496. package/static/dist/assets/{diagram-UQ7AKVKN-nhnd68tz.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
  497. package/static/dist/assets/{diagram-VSXAHHWV-dk2sclzn.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
  498. package/static/dist/assets/{diagram-VX7I27RA-n3k5nyx3.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
  499. package/static/dist/assets/{diagram-Z3DM3KII-m6q9cwdh.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
  500. package/static/dist/assets/{ebnfDiagram-PWID7BFC-lsa5641p.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
  501. package/static/dist/assets/{erDiagram-RLTQ6QDP-fo2ckbe6.js → erDiagram-RLTQ6QDP-brdu9lcm.js} +1 -1
  502. package/static/dist/assets/eventmodeling-NTZA5JFV-njk1j8wl.js +1 -0
  503. package/static/dist/assets/flowDiagram-HODETNUW-nma6f0ga.js +1 -0
  504. package/static/dist/assets/folder-plus-lvt9kudb.js +1 -0
  505. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-nzqz6x9g.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
  506. package/static/dist/assets/{gitGraph-4MIJSDKK-gukvcxe6.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
  507. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-lqhdp8f0.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
  508. package/static/dist/assets/{highlighted-body-KPVGNVTW-igw6cp39.js → highlighted-body-KPVGNVTW-ghoavj8d.js} +1 -1
  509. package/static/dist/assets/host-hzm8n85n.js +1 -0
  510. package/static/dist/assets/index-drdcaqeq.css +2 -0
  511. package/static/dist/assets/index-jzm844he.js +11 -0
  512. package/static/dist/assets/{info-A6RAGUB7-gvu7a93l.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
  513. package/static/dist/assets/{infoDiagram-27XIBGKW-m8t8g6w1.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
  514. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-l07vkbgj.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
  515. package/static/dist/assets/{journeyDiagram-3NMN7TZE-hybkgj8l.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
  516. package/static/dist/assets/{kanban-definition-UXKFOSKX-by13uvtn.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
  517. package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
  518. package/static/dist/assets/{line-osxq6fq7.js → line-h0ojzsvs.js} +1 -1
  519. package/static/dist/assets/link-k01ryaf9.js +1 -0
  520. package/static/dist/assets/login-bsae49ew.js +1 -0
  521. package/static/dist/assets/mermaid-HWGCJPDP-ihl34s74.js +1 -0
  522. package/static/dist/assets/{mermaid-parser.core-i91oxmou.js → mermaid-parser.core-bnre27u8.js} +3 -3
  523. package/static/dist/assets/{mindmap-definition-YA3MSWOX-m82mx8ww.js → mindmap-definition-YA3MSWOX-o1vathns.js} +1 -1
  524. package/static/dist/assets/onboarding-c65tysya.js +1 -0
  525. package/static/dist/assets/onboarding_model_label-gpn28uix.js +1 -0
  526. package/static/dist/assets/{packet-AYTQ26CC-nbtgge2o.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
  527. package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
  528. package/static/dist/assets/{pegDiagram-XKGWAZYB-f1zxzga1.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
  529. package/static/dist/assets/{pie-WAS4IAKB-of8vuhxs.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
  530. package/static/dist/assets/{pieDiagram-E7YTZNPT-o7y8ftio.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
  531. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-iqiwia1t.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
  532. package/static/dist/assets/{radar-RG4KPBEZ-delnsy2v.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
  533. package/static/dist/assets/{railroad-74A4TZTK-nspnyq9u.js → railroad-74A4TZTK-a7t5eibp.js} +1 -1
  534. package/static/dist/assets/railroad-abnf-HS5TGJTU-ol8cdktf.js +1 -0
  535. package/static/dist/assets/railroad-ebnf-LZEXJU2U-i8vzd429.js +1 -0
  536. package/static/dist/assets/railroad-peg-WCYAUIDC-nw3ulewz.js +1 -0
  537. package/static/dist/assets/{railroadDiagram-O6MQD6OU-z41tqx5z.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
  538. package/static/dist/assets/{refresh-cw-nt1dtsx4.js → refresh-cw-mqbkv2a3.js} +1 -1
  539. package/static/dist/assets/refresh-l29ljp76.js +1 -0
  540. package/static/dist/assets/{requirementDiagram-BXWQKSXE-bdvif194.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
  541. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-h73e0rol.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
  542. package/static/dist/assets/saved-ndd4t2xb.js +1 -0
  543. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-iv95mb1z.js → sequenceDiagram-WJ2MYXX4-i0v116q0.js} +2 -2
  544. package/static/dist/assets/settings_section_extensions_title-jhfo6o8z.js +1 -0
  545. package/static/dist/assets/share._token-c1ri0hy1.js +2 -0
  546. package/static/dist/assets/sliders-horizontal-j3jjt9tv.js +1 -0
  547. package/static/dist/assets/{stateDiagram-D77RDMKH-k417ixmf.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
  548. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
  549. package/static/dist/assets/{swimlanes-42K2YHIH-esola70w.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
  550. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
  551. package/static/dist/assets/{timeline-definition-24CTP7MA-getrz2y8.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
  552. package/static/dist/assets/toast-i3h34v6o.js +64 -0
  553. package/static/dist/assets/{treeView-Q6P3EWNA-hc7ap1q7.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
  554. package/static/dist/assets/{treemap-WGGIJYW6-b7k1syy5.js → treemap-WGGIJYW6-lzr49vv5.js} +1 -1
  555. package/static/dist/assets/untitled-oaoya4qj.js +1 -0
  556. package/static/dist/assets/useForm-nfaxgmsk.js +1 -0
  557. package/static/dist/assets/{useParams-lhg566ew.js → useParams-gjc70qru.js} +1 -1
  558. package/static/dist/assets/{useSearch-lbrh6ejn.js → useSearch-e6ae539u.js} +1 -1
  559. package/static/dist/assets/{vennDiagram-4TSXK5OY-n6pcy5qb.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
  560. package/static/dist/assets/{wardley-WFR3VGLG-lpa18vz1.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
  561. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-kpclwwg7.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
  562. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-paa2n8y0.js → xychartDiagram-S5SC5T6Z-aqbgvujg.js} +1 -1
  563. package/static/dist/index.html +1 -1
  564. package/static/dist/sw.js +1 -1
  565. package/static/dist/assets/AppShell-fb2td9zi.js +0 -1
  566. package/static/dist/assets/ChatPage-cj96kiy9.js +0 -25
  567. package/static/dist/assets/Dialog-kxcg7ard.js +0 -1
  568. package/static/dist/assets/ExtensionRoute-jf7h0754.js +0 -1
  569. package/static/dist/assets/HubRoute-gmanpd5y.js +0 -2
  570. package/static/dist/assets/Markdown-mdwlvj3w.js +0 -598
  571. package/static/dist/assets/RightPanel-ftvrjlcp.js +0 -1
  572. package/static/dist/assets/Select-bilaypej.js +0 -1
  573. package/static/dist/assets/SessionListPanel-og8n36qs.js +0 -1
  574. package/static/dist/assets/SettingsLayout-jonjefmj.js +0 -1
  575. package/static/dist/assets/States-nmejrwrm.js +0 -1
  576. package/static/dist/assets/Toaster-nnl8zkt9.js +0 -1
  577. package/static/dist/assets/_app-gdidzd94.js +0 -1
  578. package/static/dist/assets/_app.index-hbarzbjx.js +0 -1
  579. package/static/dist/assets/_app.insights-luywlarz.js +0 -1
  580. package/static/dist/assets/_app.kanban-kincnbr8.js +0 -1
  581. package/static/dist/assets/_app.logs-oi2gr3gs.js +0 -1
  582. package/static/dist/assets/_app.memory-b6jfivt6.js +0 -1
  583. package/static/dist/assets/_app.profiles-lpvixmqp.js +0 -1
  584. package/static/dist/assets/_app.settings-vowx3iq0.js +0 -1
  585. package/static/dist/assets/_app.settings._section-cnntg1tu.js +0 -3
  586. package/static/dist/assets/_app.skills-fb57lpau.js +0 -1
  587. package/static/dist/assets/_app.tasks-eszpx1q7.js +0 -2
  588. package/static/dist/assets/_app.todos-nr05ac6w.js +0 -1
  589. package/static/dist/assets/_app.workspaces-d2luomu6.js +0 -1
  590. package/static/dist/assets/architecture-7GRP2DOG-hd0o7bde.js +0 -1
  591. package/static/dist/assets/back-bemaer09.js +0 -1
  592. package/static/dist/assets/cancel-drd0g6d9.js +0 -1
  593. package/static/dist/assets/channel-cpdgf867.js +0 -1
  594. package/static/dist/assets/classDiagram-ZZMXUADV-ko09sguk.js +0 -1
  595. package/static/dist/assets/classDiagram-v2-VYDZK3BY-ko09sguk.js +0 -1
  596. package/static/dist/assets/copied-ima3pysb.js +0 -1
  597. package/static/dist/assets/endpoints-d33siokx.js +0 -64
  598. package/static/dist/assets/eventmodeling-NTZA5JFV-emctlo64.js +0 -1
  599. package/static/dist/assets/flowDiagram-HODETNUW-bfi3moqa.js +0 -1
  600. package/static/dist/assets/index-cxq58xb1.js +0 -11
  601. package/static/dist/assets/index-hgtx08n5.css +0 -2
  602. package/static/dist/assets/lazyRouteComponent-af0lvgjx.js +0 -1
  603. package/static/dist/assets/link-jyxicdhg.js +0 -1
  604. package/static/dist/assets/login-ec21t39x.js +0 -1
  605. package/static/dist/assets/mermaid-HWGCJPDP-gfl8z3ep.js +0 -1
  606. package/static/dist/assets/onboarding-btnltvyz.js +0 -1
  607. package/static/dist/assets/onboarding_model_label-dp7xffoh.js +0 -1
  608. package/static/dist/assets/railroad-abnf-HS5TGJTU-nst1qxyn.js +0 -1
  609. package/static/dist/assets/railroad-ebnf-LZEXJU2U-ci37x8qy.js +0 -1
  610. package/static/dist/assets/railroad-peg-WCYAUIDC-aimkk07z.js +0 -1
  611. package/static/dist/assets/refresh-b4uams1i.js +0 -1
  612. package/static/dist/assets/saved-kg52csy7.js +0 -1
  613. package/static/dist/assets/settings_section_extensions_title-ej0iapxe.js +0 -1
  614. package/static/dist/assets/share._token-f97e94r0.js +0 -2
  615. package/static/dist/assets/sliders-horizontal-fj18it47.js +0 -1
  616. package/static/dist/assets/sse-fwpqtzbg.js +0 -1
  617. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hwn4apct.js +0 -1
  618. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d1h97oyg.js +0 -8
  619. package/static/dist/assets/todoStore-eginf9h4.js +0 -1
  620. package/static/dist/assets/tts-lxdxnmjd.js +0 -1
  621. package/static/dist/assets/untitled-ovpfthg4.js +0 -1
  622. package/static/dist/assets/useForm-bcblv1rx.js +0 -1
  623. package/static/dist/assets/useLocale-fi5jb8ma.js +0 -1
@@ -31,10 +31,15 @@ export const CLIENT_COMMANDS = [
31
31
  client('skills', 'List skills'),
32
32
  client('use', 'Use a skill', { args_hint: '<skill>', ...webOnly('Use `/skills [query]` to search skills.') }),
33
33
  ];
34
+ /** Agent commands `POST /api/commands/exec` runs on the chat's session itself rather than through the sidecar's `commands.exec` (TAL-902). */
35
+ export const SESSION_EXEC_COMMANDS = new Set(['refine']);
36
+ /** What a client shows for an Agent prompt built-in this Agent cannot expand (TAL-817); the turn path refuses it with the same text. */
37
+ export const unsupportedPromptMessage = (name) => `/${name} is not available in Talaria yet.`;
34
38
  /**
35
39
  * The client table followed by the Agent registry. An Agent command whose name is already a client name or alias is
36
40
  * dropped, and client-claimed aliases are removed from the rest, so every typed name resolves to one entry.
37
- * Gateway-only commands never reach a client; CLI-only ones stay listed for no client.
41
+ * Gateway-only commands never reach a client; CLI-only ones and prompt built-ins the sidecar cannot expand stay listed
42
+ * for no client. An expandable prompt built-in is `handler: 'prompt'`: chat start sends the Agent's expansion (TAL-817).
38
43
  */
39
44
  export function commandCatalog(agent) {
40
45
  const claimed = new Set(CLIENT_COMMANDS.flatMap((c) => [c.name, ...c.aliases]));
@@ -45,7 +50,8 @@ export function commandCatalog(agent) {
45
50
  const aliases = c.aliases.filter((a) => !claimed.has(a));
46
51
  for (const a of aliases)
47
52
  claimed.add(a);
48
- return [{ ...c, aliases, handler: 'agent', clients: c.cli_only ? [] : ALL, ...(c.cli_only ? { unsupported_message: `/${c.name} runs only in the Hermes CLI.` } : {}) }];
53
+ const unsupported = c.cli_only ? `/${c.name} runs only in the Hermes CLI.` : c.prompt === 'unsupported' ? unsupportedPromptMessage(c.name) : null;
54
+ return [{ ...c, aliases, exec: c.exec || SESSION_EXEC_COMMANDS.has(c.name), handler: c.prompt === 'expand' ? 'prompt' : 'agent', clients: unsupported === null ? ALL : [], ...(unsupported === null ? {} : { unsupported_message: unsupported }) }];
49
55
  });
50
56
  return [...CLIENT_COMMANDS, ...rows];
51
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/tools/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/tools/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * TAL-818: the Connectors page and connect card, composed from the sidecar's raw `connectors.*` answers. The policy model
3
+ * follows the Agent desktop's (`apps/desktop/.../connectors/data/join.ts`): the member layer is the user's own rules and
4
+ * the one a change writes; organization and role layers lock an app or tool off.
5
+ */
6
+ import type { ConnectorOperationView, ConnectorsPage, ConnectorToolsView, SidecarResult } from '@maudecode/talaria-web-contracts';
7
+ type Policy = SidecarResult<'connectors.policy.get'>;
8
+ type Catalog = SidecarResult<'connectors.catalog'>['connectors'];
9
+ type Accounts = SidecarResult<'connectors.accounts'>['accounts'];
10
+ type Tools = SidecarResult<'connectors.tools'>;
11
+ type Snapshot = SidecarResult<'connectors.operation'>;
12
+ export declare function rememberCatalogNames(home: string, catalog: Catalog): Record<string, string>;
13
+ export declare const catalogNames: (home: string) => Record<string, string> | undefined;
14
+ /**
15
+ * `available: false` hides the page. Rules that cannot be read (`policy` null) fail closed: every app reads off and
16
+ * read-only, and `rules_error` says why, instead of showing apps the rules may keep off as on.
17
+ */
18
+ export declare function connectorsPage(catalog: Catalog, accounts: Accounts, policy: Policy | null, rulesError?: string | null): ConnectorsPage;
19
+ /**
20
+ * Each tool as Hermes gets it: on only when every layer allows the app, no layer turns the tool off by name or tag, and the
21
+ * member rules leave it on. Its switch writes the member's tool rule, so it is editable only where that rule decides.
22
+ * Unreadable rules fail closed: every tool reads off and read-only.
23
+ */
24
+ export declare function connectorTools(listing: Tools, policy: Policy | null): ConnectorToolsView;
25
+ /** `google_calendar` → `Google Calendar`: the title of a target the catalog does not name (an MCP server, or before a catalog read). */
26
+ export declare const connectorTitle: (slug: string) => string;
27
+ /**
28
+ * The moves the user may make on each target now (the Agent's transition table, `tools/connectors/contract.py`): skip any
29
+ * unresolved target, retry a failed or expired one, approve an MCP install the card holds. A settled operation is frozen.
30
+ * Only a chat card continues: the model is waiting on it.
31
+ */
32
+ export declare function connectorOperation(snapshot: Snapshot, names?: Record<string, string>): ConnectorOperationView;
33
+ export {};
@@ -0,0 +1,121 @@
1
+ function rulesOf(body, revision) {
2
+ const tools = Object.fromEntries(Object.entries(body.tools ?? {}).map(([slug, rule]) => [slug, rule.disable]));
3
+ const tags = { enable: body.tags?.enable ?? [], disable: body.tags?.disable ?? [] };
4
+ if (body.mode === 'unrestricted')
5
+ return { allowed: null, denied: new Set(), tools: {}, tags: { enable: [], disable: [] }, revision };
6
+ if (body.mode === 'deny-all')
7
+ return { allowed: new Set(), denied: new Set(), tools: {}, tags: { enable: [], disable: [] }, revision };
8
+ if (body.mode === 'allow')
9
+ return { allowed: new Set(body.connectors ?? []), denied: new Set(), tools, tags, revision };
10
+ return { allowed: null, denied: new Set(body.disabled_connectors ?? []), tools, tags, revision };
11
+ }
12
+ const PROBLEMS = new Set(['pending', 'failed', 'expired', 'revoked', 'inactive']);
13
+ /** An account's gateway status while it is not active; a status this server does not know reads as `inactive`. */
14
+ const accountProblem = (status) => status === 'active' ? null : PROBLEMS.has(status) ? status : 'inactive';
15
+ const FACETS = new Set(['read', 'write', 'destructive', 'unclassified']);
16
+ const facetOf = (facet) => FACETS.has(facet) ? facet : 'unclassified';
17
+ /** Catalog names by profile home, kept from the last catalog read so a connect card names `github` GitHub. */
18
+ const catalogNameCache = new Map();
19
+ export function rememberCatalogNames(home, catalog) {
20
+ const names = Object.fromEntries(catalog.map((row) => [row.slug, row.name]));
21
+ catalogNameCache.set(home, names);
22
+ return names;
23
+ }
24
+ export const catalogNames = (home) => catalogNameCache.get(home);
25
+ const allows = (rules, slug) => (rules.allowed === null || rules.allowed.has(slug)) && !rules.denied.has(slug);
26
+ /** The member layer (null: none, so the rules are read-only) and every other layer. */
27
+ function layers(policy) {
28
+ const member = policy?.layers.find((layer) => layer.kind === 'member');
29
+ return {
30
+ member: member ? rulesOf(member.body, member.revision) : null,
31
+ others: (policy?.layers ?? []).filter((layer) => layer.kind !== 'member').map((layer) => rulesOf(layer.body, layer.revision)),
32
+ };
33
+ }
34
+ /** A layer's tag rules keep a tool off: it carries a disabled tag, or the layer enables tags and it carries none of them. */
35
+ const tagBlocks = (rules, hints) => rules.tags.disable.some((tag) => hints.includes(tag)) || (rules.tags.enable.length > 0 && !rules.tags.enable.some((tag) => hints.includes(tag)));
36
+ /**
37
+ * `available: false` hides the page. Rules that cannot be read (`policy` null) fail closed: every app reads off and
38
+ * read-only, and `rules_error` says why, instead of showing apps the rules may keep off as on.
39
+ */
40
+ export function connectorsPage(catalog, accounts, policy, rulesError = null) {
41
+ const { member, others } = layers(policy);
42
+ const slugs = [...new Set([...catalog.map((row) => row.slug), ...accounts.map((row) => row.connector)])];
43
+ const connectors = slugs.map((slug) => {
44
+ const entry = catalog.find((row) => row.slug === slug);
45
+ // Live accounts only (a reconnect retires the one it replaced), active first, then newest.
46
+ const mine = accounts.filter((row) => row.connector === slug && !row.disabled)
47
+ .sort((a, b) => Number(b.active) - Number(a.active) || b.created_at.localeCompare(a.created_at));
48
+ const orgLocked = others.some((rules) => !allows(rules, slug));
49
+ return {
50
+ slug, name: entry?.name || slug, description: entry?.description ?? '', category: entry?.category ?? '', logo_url: entry?.logo_url ?? null,
51
+ connected: mine.length > 0,
52
+ accounts: mine.map((row) => ({ connection_id: row.connection_id, name: row.alias?.trim() || row.label, problem: accountProblem(row.status), status_reason: row.status_reason?.trim() || null, active: row.active, created_at: row.created_at })),
53
+ // The switch shows what Hermes gets: an app another layer locks off reads off, whatever the member rule says.
54
+ enabled: policy !== null && (member === null || allows(member, slug)) && !orgLocked,
55
+ org_locked: orgLocked,
56
+ rules_editable: member !== null && !orgLocked,
57
+ tools_off: member?.tools[slug]?.length ?? 0,
58
+ };
59
+ });
60
+ return { available: true, connectors, policy_revision: member?.revision ?? null, rules_error: policy === null ? rulesError ?? 'Connector rules are unavailable.' : null };
61
+ }
62
+ /**
63
+ * Each tool as Hermes gets it: on only when every layer allows the app, no layer turns the tool off by name or tag, and the
64
+ * member rules leave it on. Its switch writes the member's tool rule, so it is editable only where that rule decides.
65
+ * Unreadable rules fail closed: every tool reads off and read-only.
66
+ */
67
+ export function connectorTools(listing, policy) {
68
+ const { member, others } = layers(policy);
69
+ const slug = listing.connector;
70
+ const off = new Set(member?.tools[slug] ?? []);
71
+ const appOn = policy !== null && (member === null || allows(member, slug)) && others.every((rules) => allows(rules, slug));
72
+ return {
73
+ connector: slug, policy_revision: member?.revision ?? null,
74
+ tools: listing.tools.map((tool) => {
75
+ // Another layer's name or tag rule locks the tool; the member's own tag rules keep it off without its switch deciding.
76
+ const locked = others.some((rules) => (rules.tools[slug] ?? []).includes(tool.slug) || tagBlocks(rules, tool.hints));
77
+ const memberTagOff = member !== null && tagBlocks(member, tool.hints);
78
+ return {
79
+ slug: tool.slug, name: tool.name, description: tool.description, facet: facetOf(tool.facet), deprecated: tool.deprecated,
80
+ enabled: appOn && !off.has(tool.slug) && !locked && !memberTagOff, locked,
81
+ // The Agent refuses a tool rule for an app the member rules keep off (`compose_tools_write`).
82
+ editable: member !== null && appOn && !locked && !memberTagOff,
83
+ };
84
+ }),
85
+ };
86
+ }
87
+ const SKIPPABLE = new Set(['pending', 'initiated', 'failed', 'expired']);
88
+ /** `google_calendar` → `Google Calendar`: the title of a target the catalog does not name (an MCP server, or before a catalog read). */
89
+ export const connectorTitle = (slug) => slug.split(/[_\s-]+/).filter(Boolean).map((word) => word[0].toUpperCase() + word.slice(1)).join(' ') || slug;
90
+ /**
91
+ * The moves the user may make on each target now (the Agent's transition table, `tools/connectors/contract.py`): skip any
92
+ * unresolved target, retry a failed or expired one, approve an MCP install the card holds. A settled operation is frozen.
93
+ * Only a chat card continues: the model is waiting on it.
94
+ */
95
+ export function connectorOperation(snapshot, names = {}) {
96
+ const open = !snapshot.settled;
97
+ return {
98
+ op_id: snapshot.op_id, settled: snapshot.settled, tool_call_id: snapshot.tool_call_id,
99
+ outcome: open ? null : snapshot.targets.every((target) => target.state === 'connected') ? 'connected' : 'not_connected',
100
+ can_continue: open && snapshot.owner === 'session',
101
+ targets: snapshot.targets.map((target) => {
102
+ const local = target.kind !== 'connector';
103
+ const actions = [];
104
+ if (open && local && target.state === 'pending')
105
+ actions.push('approve');
106
+ if (open && (target.state === 'failed' || target.state === 'expired'))
107
+ actions.push('retry');
108
+ if (open && SKIPPABLE.has(target.state))
109
+ actions.push('skip');
110
+ return {
111
+ name: target.name, title: names[target.name] ?? connectorTitle(target.name), kind: target.kind, state: target.state, detail: target.detail,
112
+ // Only an https authorization link reaches a client; anything else is dropped rather than rendered as a link.
113
+ connect_url: open && target.state === 'initiated' && /^https:\/\//i.test(target.connect_url ?? '') ? target.connect_url : null,
114
+ actions,
115
+ // An approval (or a failed install's retry) sends the credentials the install still needs.
116
+ env_fields: open && local && (target.state === 'pending' || target.state === 'failed') ? target.required_env.map((field) => ({ name: field.name, label: field.prompt.trim() || field.name, required: field.required, secret: field.secret })) : [],
117
+ };
118
+ }),
119
+ };
120
+ }
121
+ //# sourceMappingURL=connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.js","sourceRoot":"","sources":["../../src/tools/connectors.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export interface CronDeps {
17
17
  modelOptionFor?: (home: string, model: string | null, provider: string | null) => Promise<string | null>;
18
18
  /** Python `_RUNNING_CRON_JOBS`: job id → start time, read by the session list's `cron_running` stamp. */
19
19
  runningJobs?: Map<string, number>;
20
+ updateInProgress?: () => boolean;
20
21
  }
21
22
  /** Python `_cron_job_for_api`, plus the derived status every client renders (TAL-296). */
22
23
  export declare function jobForApi(job: Dict, running?: boolean): Dict;
@@ -37,11 +38,47 @@ export declare class CronService {
37
38
  private readonly deps;
38
39
  constructor(deps: CronDeps);
39
40
  private sidecar;
41
+ blueprints(home: string): Promise<{
42
+ blueprints: {
43
+ key: string;
44
+ title: string;
45
+ description: string;
46
+ category: string;
47
+ source: "plugin" | "builtin";
48
+ plugin: string | null;
49
+ schedule_label: string;
50
+ slots: {
51
+ name: string;
52
+ type: string;
53
+ label: string;
54
+ default: string | null;
55
+ options: string[];
56
+ optional: boolean;
57
+ strict: boolean;
58
+ help: string;
59
+ }[];
60
+ }[];
61
+ }>;
62
+ blueprintFill(home: string, input: {
63
+ key: string;
64
+ values: Record<string, string>;
65
+ }): Promise<{
66
+ draft: {
67
+ name: string;
68
+ prompt: string;
69
+ schedule: string;
70
+ deliver: string;
71
+ skills: string[];
72
+ };
73
+ }>;
40
74
  private profileNames;
41
75
  availableProfileNames(): Promise<Set<string>>;
42
76
  normalizeProfile(value: unknown): Promise<string | null>;
43
77
  private profileForHome;
44
- /** The physical store owns execution. Additive owner_profile metadata lets the creator manage a new job there. */
78
+ /**
79
+ * The physical store owns execution. Additive owner_profile metadata lets the creator manage a new job there.
80
+ * Passing `unwritable` probes each listed store's writes (TAL-810) and collects the ones that fail.
81
+ */
45
82
  private storedJobs;
46
83
  /** `pickerHome` is the profile whose `/api/models` catalog the requesting client shows. */
47
84
  private view;
@@ -8,6 +8,7 @@ import { stripToolCallXml } from '../sessions/merge.js';
8
8
  import { str } from '../util.js';
9
9
  const JOB_ID_RE = /^[A-Za-z0-9_-][A-Za-z0-9_.-]{0,63}$/;
10
10
  const PASSTHROUGH_FIELDS = ['script', 'no_agent', 'context_from', 'reasoning_effort'];
11
+ const isContextSource = (job) => job.recovery_only !== true;
11
12
  /** TAL-301: a picked catalog id (`@provider:model`) names its own provider, exactly as a chat request does; a bare id keeps the explicit one. */
12
13
  function modelSelection(model, provider) {
13
14
  const raw = str(model).trim();
@@ -32,10 +33,66 @@ export function jobForApi(job, running = false) {
32
33
  payload.derived_state = state;
33
34
  payload.needs_attention = state === 'needs_attention' || state === 'schedule_error';
34
35
  payload.resumable = payload.needs_attention || state === 'paused' || state === 'off';
35
- payload.running = running || job.running === true;
36
+ // TAL-599: a stuck job whose error names croniter gets the "restart the Gateway with cron support" hint.
37
+ payload.attention_hint = payload.needs_attention && /croniter/i.test(str(job.last_error)) ? 'croniter_missing' : null;
38
+ // TAL-810: a run the gateway scheduler (or any other live process) owns reads as running too.
39
+ payload.running = running || job.running === true || job.running_elsewhere === true;
40
+ delete payload.running_elsewhere;
41
+ delete payload.recovery_only;
42
+ payload.last_failure = lastFailure(job.last_failure);
36
43
  Object.assign(payload, scheduleText(job));
37
44
  return payload;
38
45
  }
46
+ /** TAL-810: the Agent's sticky `{at, detail}` stamp of the latest failed run, which survives later successes. */
47
+ function lastFailure(value) {
48
+ if (!value || typeof value !== 'object')
49
+ return null;
50
+ const failure = value;
51
+ return { at: completedAtSeconds(failure.at), detail: str(failure.detail).trim() || 'run failed' };
52
+ }
53
+ /** TAL-601: the canonical list order every client renders: running first, then soonest next run (none last), then name. */
54
+ function compareListedJobs(a, b) {
55
+ if (a.running !== b.running)
56
+ return a.running ? -1 : 1;
57
+ const [an, bn] = [completedAtSeconds(nextRunValue(a)), completedAtSeconds(nextRunValue(b))];
58
+ if (an !== bn)
59
+ return an === null ? 1 : bn === null ? -1 : an - bn;
60
+ return (str(a.name) || str(a.schedule_display)).localeCompare(str(b.name) || str(b.schedule_display), 'en', { sensitivity: 'accent' });
61
+ }
62
+ const PROMPT_HEADING = '## Prompt\n\n';
63
+ const PROMPT_FRAME = /^\*\*Prompt Characters:\*\* (\d+)\n## Prompt\n\n/m;
64
+ const RESPONSE_FRAME = /^\*\*Response Characters:\*\* (\d+)\n## Response\n\n/;
65
+ /**
66
+ * TAL-599, TAL-912: the agent's reply from a run file, read like the Agent's v0.21.6 `_archive_answer`. A framed run skips its
67
+ * prompt by the writer's length stamp and takes exactly the stamped answer (none when that frame is broken), so a prompt
68
+ * quoting `## Response` never leaks.
69
+ * Otherwise the last Response heading is the writer's own; a run without one (script mode) is the whole text.
70
+ */
71
+ function runResponse(raw) {
72
+ const content = raw.replace(/\r\n?/g, '\n');
73
+ const prompt = PROMPT_FRAME.exec(content);
74
+ const promptStart = prompt ? prompt.index + prompt[0].length : -1;
75
+ if (prompt && content.indexOf(PROMPT_HEADING) === promptStart - PROMPT_HEADING.length) {
76
+ const frameAt = advanceCodePoints(content, promptStart, Number(prompt[1])) + 2;
77
+ const frame = RESPONSE_FRAME.exec(content.slice(frameAt));
78
+ const answerStart = frame ? frameAt + frame[0].length : -1;
79
+ const answerEnd = frame ? advanceCodePoints(content, answerStart, Number(frame[1])) : -1;
80
+ // A truncated or missing answer frame is unusable: any later heading belongs to the prompt.
81
+ return frame && content.slice(answerEnd) === '\n' ? content.slice(answerStart, answerEnd).trim() : '';
82
+ }
83
+ const idx = [...content.matchAll(/^#{1,2} Response\s*$/gm)].at(-1)?.index ?? -1;
84
+ if (idx < 0)
85
+ return content.trim();
86
+ const afterHeading = content.indexOf('\n', idx);
87
+ return afterHeading < 0 ? '' : content.slice(afterHeading + 1).trim();
88
+ }
89
+ /** The writer's frames count Python code points; JavaScript indexes UTF-16 units. */
90
+ function advanceCodePoints(text, from, count) {
91
+ let at = from;
92
+ for (let i = 0; i < count && at < text.length; i++)
93
+ at += text.codePointAt(at) > 0xffff ? 2 : 1;
94
+ return at;
95
+ }
39
96
  /** TAL-298: the schedule's display text and the editor's prefill, in the scheduler's own vocabulary (not localized copy). */
40
97
  function scheduleText(job) {
41
98
  const schedule = job.schedule;
@@ -65,10 +122,14 @@ function isRecurring(job) {
65
122
  // Legacy string schedules carry no kind; an unlimited repeat record marks the job recurring (a one-shot has times: 1).
66
123
  return typeof schedule === 'string' && hasUnlimitedRepeat(job);
67
124
  }
125
+ /** `next_run_at`, else an older agent's `next_run`. */
126
+ function nextRunValue(job) {
127
+ return job.next_run_at ?? (typeof job.next_run === 'number' || typeof job.next_run === 'string' ? job.next_run : null);
128
+ }
68
129
  /** Older agents report `paused` / `status` / `next_run` instead of `state` / `last_status` / `next_run_at`; all stay supported. */
69
130
  function cronDerivedState(job) {
70
131
  const errored = job.state === 'error' || completionOutcome(job.last_status) === 'failed' || job.status === 'error';
71
- const nextRun = job.next_run_at ?? (typeof job.next_run === 'number' || typeof job.next_run === 'string' ? job.next_run : null);
132
+ const nextRun = nextRunValue(job);
72
133
  if (isRecurring(job) && hasUnlimitedRepeat(job) && job.enabled === false && job.state === 'completed' && !nextRun)
73
134
  return 'needs_attention';
74
135
  // A paused job keeps the last run's error and has no next run; that is not a schedule failure.
@@ -177,6 +238,19 @@ export class CronService {
177
238
  throw new HttpFailure(503, 'Hermes Agent sidecar is not running; cron jobs are unavailable');
178
239
  return s;
179
240
  }
241
+ async blueprints(home) {
242
+ return this.sidecar().call('cron.blueprints', { profile_home: home });
243
+ }
244
+ async blueprintFill(home, input) {
245
+ try {
246
+ return await this.sidecar().call('cron.blueprint_fill', { ...input, profile_home: home });
247
+ }
248
+ catch (error) {
249
+ if (error instanceof SidecarError && error.code === -32602)
250
+ throw new HttpFailure(400, error.message);
251
+ throw error;
252
+ }
253
+ }
180
254
  async profileNames(active) {
181
255
  const names = [];
182
256
  const seen = new Set();
@@ -214,25 +288,45 @@ export class CronService {
214
288
  }
215
289
  async profileForHome(home) {
216
290
  const names = this.deps.isolatedProfileMode() ? (await this.deps.profileNames()).map((row) => row.name) : await this.availableProfileNames();
217
- for (const profile of names)
218
- if (this.deps.profileHome(profile) === home)
219
- return profile;
291
+ // A profile whose home escapes the profiles root (`profileHome` throws) owns no store.
292
+ for (const profile of names) {
293
+ try {
294
+ if (this.deps.profileHome(profile) === home)
295
+ return profile;
296
+ }
297
+ catch { /* skip */ }
298
+ }
220
299
  throw new HttpFailure(403, 'Unknown cron profile home');
221
300
  }
222
- /** The physical store owns execution. Additive owner_profile metadata lets the creator manage a new job there. */
223
- async storedJobs(active) {
301
+ /**
302
+ * The physical store owns execution. Additive owner_profile metadata lets the creator manage a new job there.
303
+ * Passing `unwritable` probes each listed store's writes (TAL-810) and collects the ones that fail.
304
+ */
305
+ async storedJobs(active, unwritable) {
224
306
  // ponytail: scan visible stores per request; add an index only if profile/job counts make this expensive.
225
307
  const rows = [];
226
308
  const seen = new Set();
227
309
  for (const profile of await this.profileNames(active)) {
228
- const home = this.deps.profileHome(profile);
310
+ const local = this.deps.profilesMatch(profile, active);
311
+ let home;
312
+ try {
313
+ home = this.deps.profileHome(profile);
314
+ }
315
+ catch (error) {
316
+ if (local)
317
+ throw error;
318
+ continue;
319
+ }
229
320
  if (seen.has(home))
230
321
  continue;
231
322
  seen.add(home);
232
- const local = this.deps.profilesMatch(profile, active);
233
323
  let jobs;
234
324
  try {
235
- jobs = (await this.sidecar().call('cron.list', { profile_home: home })).jobs;
325
+ const listed = await this.sidecar().call('cron.list', unwritable ? { profile_home: home, probe_store: true } : { profile_home: home });
326
+ jobs = listed.jobs;
327
+ const health = listed.store_health;
328
+ if (unwritable && health)
329
+ unwritable.push({ profile, store: health.store, error: health.error, fix: health.fix, since: completedAtSeconds(health.since) });
236
330
  }
237
331
  catch (error) {
238
332
  if (local)
@@ -261,7 +355,7 @@ export class CronService {
261
355
  const refs = continuityRefs(fields.context_from, false);
262
356
  if (!refs.length)
263
357
  return;
264
- const ids = new Set((await this.sidecar().call('cron.list', { profile_home: home })).jobs.map((job) => job.id));
358
+ const ids = new Set((await this.sidecar().call('cron.list', { profile_home: home })).jobs.filter(isContextSource).map((job) => job.id));
265
359
  if (refs.some((ref) => !ids.has(str(ref))))
266
360
  throw new HttpFailure(400, 'Context jobs must belong to the execution profile');
267
361
  }
@@ -297,7 +391,7 @@ export class CronService {
297
391
  const included = new Set();
298
392
  for (const row of inStore) {
299
393
  const id = str(row.job.id).trim();
300
- if (!row.managed || !id || id === excludeId || counts.get(id) !== 1)
394
+ if (!row.managed || !isContextSource(row.job) || !id || id === excludeId || counts.get(id) !== 1)
301
395
  continue;
302
396
  sources.push({ job_id: id, label: str(row.job.name).trim() || id, selectable: true });
303
397
  included.add(id);
@@ -317,17 +411,23 @@ export class CronService {
317
411
  const activeJobs = [];
318
412
  const otherJobs = [];
319
413
  const pickerHome = this.deps.profileHome(active);
414
+ const unwritable = [];
415
+ const all = allProfiles && !this.deps.isolatedProfileMode();
416
+ // TAL-810: a failing store is reported for the active profile and for every store whose jobs this list shows.
417
+ const shownStores = new Set([active]);
320
418
  try {
321
- for (const row of await this.storedJobs(active))
419
+ for (const row of await this.storedJobs(active, unwritable)) {
322
420
  (row.managed ? activeJobs : otherJobs).push(await this.view(row, pickerHome));
421
+ if (row.managed || all)
422
+ shownStores.add(row.profile);
423
+ }
323
424
  }
324
425
  catch (error) {
325
426
  if (error instanceof SidecarError && error.condition === 'cron_unavailable')
326
- return { jobs: [], cron_unavailable: true };
427
+ return { jobs: [], cron_unavailable: true, unwritable_stores: [] };
327
428
  throw error;
328
429
  }
329
- const all = allProfiles && !this.deps.isolatedProfileMode();
330
- return { jobs: all ? [...activeJobs, ...otherJobs] : activeJobs, all_profiles: all, active_profile: active, other_profile_count: all ? 0 : otherJobs.length };
430
+ return { jobs: (all ? [...activeJobs, ...otherJobs] : activeJobs).sort(compareListedJobs), ordered: true, all_profiles: all, active_profile: active, other_profile_count: all ? 0 : otherJobs.length, unwritable_stores: unwritable.filter((store) => shownStores.has(store.profile)) };
331
431
  }
332
432
  /**
333
433
  * Python `/api/crons/recent`: each active-profile job's latest completion after `since`, newest first (ties by
@@ -485,6 +585,8 @@ export class CronService {
485
585
  async runNow(home, jobId) {
486
586
  if (!jobId)
487
587
  throw new HttpFailure(400, 'job_id required');
588
+ if (this.deps.updateInProgress?.())
589
+ throw new HttpFailure(503, 'Web is updating. Retry after it restarts.');
488
590
  const running = this.deps.runningJobs;
489
591
  const existing = running?.get(jobId);
490
592
  if (existing !== undefined)
@@ -582,8 +684,10 @@ export class CronService {
582
684
  home = (await this.resolveStore(home, jobId)).home;
583
685
  try {
584
686
  const detail = await this.sidecar().call('cron.run_detail', { profile_home: home, job_id: jobId, filename });
585
- // Leaked tool-call XML is removed from the run's text, as from a transcript reply (TAL-302).
586
- return { ...detail, content: stripToolCallXml(detail.content), snippet: stripToolCallXml(detail.snippet) };
687
+ // Leaked tool-call XML is removed from the run's text, as from a transcript reply (TAL-302); the response is
688
+ // framed on the Agent's raw text (TAL-912), then stripped.
689
+ const content = stripToolCallXml(detail.content);
690
+ return { ...detail, content, snippet: stripToolCallXml(detail.snippet), response: stripToolCallXml(runResponse(detail.content)) };
587
691
  }
588
692
  catch (error) {
589
693
  if (error instanceof SidecarError && error.condition === 'not_found')