@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
@@ -1,6 +1,6 @@
1
1
  /** Session, project, share, workspace, and file procedures. */
2
2
  import { implement } from '@orpc/server';
3
- import { stateDbHasSession } from '../sessions/state-db.js';
3
+ import { stateDbSessionReadAsync } from '../sessions/state-db.js';
4
4
  import { sessionsContract, workspacesContract } from '@maudecode/talaria-web-contracts';
5
5
  import { mkdirSync } from 'node:fs';
6
6
  import { closeSync, existsSync, lstatSync, statSync } from 'node:fs';
@@ -66,8 +66,8 @@ function queryPositiveInt(value, fallback, maximum) {
66
66
  }
67
67
  const sanitizeError = sanitizePaths;
68
68
  /** Python `_guard_request_session_visibility` for a body/query session id. */
69
- function guardVisibility(ctx, sid) {
70
- if (!ctx.deps.sessions.sessionIdVisible(sid))
69
+ async function guardVisibility(ctx, sid) {
70
+ if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
71
71
  throw new HttpError(404, 'Session not found');
72
72
  }
73
73
  /** Python `float(body["since"])` for the handoff dock: a unix time or numeric string; absent is null. */
@@ -80,13 +80,13 @@ function handoffSince(value) {
80
80
  return n;
81
81
  }
82
82
  /** The handoff dock's session id and `since`, validated in the predecessor's order. */
83
- function handoffInput(ctx, input) {
83
+ async function handoffInput(ctx, input) {
84
84
  requireFields(input, 'session_id');
85
85
  const sid = str(input.session_id).trim();
86
86
  if (!sid)
87
87
  throw new HttpError(400, 'session_id is required');
88
88
  const since = handoffSince(input.since);
89
- guardVisibility(ctx, sid);
89
+ await guardVisibility(ctx, sid);
90
90
  return { sid, since };
91
91
  }
92
92
  function allProfilesEnabled(ctx, value) {
@@ -95,8 +95,8 @@ function allProfilesEnabled(ctx, value) {
95
95
  /** Search inputs that select the sidebar rows rather than every stored session (TAL-308). */
96
96
  const SIDEBAR_SEARCH_KEYS = ['project_id', 'sidebar_source', 'include_archived', 'exclude_hidden', 'show_cli_sessions', 'show_claude_code_sessions', 'show_cron_sessions', 'show_webhook_sessions', 'show_kanban_sessions'];
97
97
  /** The `/api/sessions` row selection for a list or sidebar-search query (TAL-308 shares it). */
98
- function sidebarListParams(ctx, input) {
99
- const settings = ctx.deps.settings.load();
98
+ async function sidebarListParams(ctx, input) {
99
+ const settings = (await ctx.deps.settings.load());
100
100
  const overrideKeys = ['show_cli_sessions', 'show_claude_code_sessions', 'show_cron_sessions', 'show_webhook_sessions', 'show_kanban_sessions'];
101
101
  const sidebarSourceRaw = (input.sidebar_source ?? '').trim().toLowerCase();
102
102
  return {
@@ -119,7 +119,7 @@ function sidebarListParams(ctx, input) {
119
119
  export const sessionsRouter = os.router({
120
120
  sessions: {
121
121
  list: os.sessions.list.handler(({ input, context: { ctx } }) => run(async () => {
122
- const { body, etag } = await ctx.deps.sessions.list(sidebarListParams(ctx, input));
122
+ const { body, etag } = await ctx.deps.sessions.list((await sidebarListParams(ctx, input)));
123
123
  ctx.extraResponseHeaders = { etag };
124
124
  if (ifNoneMatchMatches(ctx.header('if-none-match') ?? '', etag))
125
125
  ctx.notModified = true;
@@ -132,19 +132,19 @@ export const sessionsRouter = os.router({
132
132
  const opts = { content: (input.content ?? '1') === '1', depth, allProfiles: allProfilesEnabled(ctx, input.all_profiles) };
133
133
  // TAL-308: any sidebar filter answers from the sidebar's own rows; without one the store-only search stays.
134
134
  if (SIDEBAR_SEARCH_KEYS.some((k) => input[k] !== undefined)) {
135
- return await ctx.deps.sessions.sidebarSearch(input.q ?? '', sidebarListParams(ctx, input), { ...opts, projectId: input.project_id?.trim() || null });
135
+ return await ctx.deps.sessions.sidebarSearch(input.q ?? '', (await sidebarListParams(ctx, input)), { ...opts, projectId: input.project_id?.trim() || null });
136
136
  }
137
- return ctx.deps.sessions.search(input.q ?? '', opts);
137
+ return await ctx.deps.sessions.search(input.q ?? '', opts);
138
138
  })),
139
- cleanup: os.sessions.cleanup.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.cleanup(false))),
140
- cleanupZeroMessage: os.sessions.cleanupZeroMessage.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.cleanup(true))),
139
+ cleanup: os.sessions.cleanup.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.cleanup(false)))),
140
+ cleanupZeroMessage: os.sessions.cleanupZeroMessage.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.cleanup(true)))),
141
141
  // TAL-627: each id runs the single-session route's own guards, lock and cleanup, one at a time; a failure becomes
142
142
  // that id's result and the rest still run.
143
143
  bulk: os.sessions.bulk.handler(async ({ input, context: { ctx } }) => {
144
144
  const results = [];
145
145
  for (const sid of input.session_ids) {
146
146
  try {
147
- guardVisibility(ctx, sid);
147
+ await guardVisibility(ctx, sid);
148
148
  if (input.action === 'delete') {
149
149
  const { state_db_cleanup_failed } = await ctx.deps.sessions.delete(sid);
150
150
  results.push({ session_id: sid, ok: true, state_db_cleanup_failed: Boolean(state_db_cleanup_failed) });
@@ -159,7 +159,8 @@ export const sessionsRouter = os.router({
159
159
  : error instanceof HttpFailure ? [error.status, error.message]
160
160
  : error instanceof SessionNotFound ? [404, 'Session not found']
161
161
  : [500, sanitizeError(error)];
162
- results.push({ session_id: sid, ok: false, status, error: message });
162
+ const refused = error instanceof HttpFailure ? error.extra.refused : undefined;
163
+ results.push({ session_id: sid, ok: false, status, error: message, ...(refused ? { refused } : {}) });
163
164
  }
164
165
  }
165
166
  return { results };
@@ -169,30 +170,43 @@ export const sessionsRouter = os.router({
169
170
  // No visibility guard here: `detail()` answers 409 `session_profile_mismatch` so the frontend can switch to the owning profile.
170
171
  get: os.session.get.handler(({ input, context: { ctx } }) => run(async () => {
171
172
  await ctx.deps.sessions.deps.warmModelOptions?.();
173
+ await ctx.deps.turns.loadGoal(input.session_id.trim());
172
174
  try {
173
- return { session: ctx.deps.sessions.detail(input.session_id, input) };
175
+ return { session: (await ctx.deps.sessions.detail(input.session_id, input)) };
174
176
  }
175
177
  catch (error) {
176
178
  // Runs left on the relay by a deletion that predates `clearRelayCompletions` clear when the id is next requested.
177
179
  const sid = input.session_id.trim();
178
- if (error instanceof HttpFailure && error.status === 404 && ctx.deps.sessionStore.wasDeleted(sid))
179
- ctx.deps.relay.clearDeleted(sid, ctx.deps.activeProfile());
180
+ if (error instanceof HttpFailure && error.status === 404 && (await ctx.deps.sessionStore.wasDeleted(sid)))
181
+ (await ctx.deps.relay.clearDeleted(sid, ctx.deps.activeProfile()));
180
182
  throw error;
181
183
  }
182
184
  })),
183
- status: os.session.status.handler(({ input, context: { ctx } }) => run(() => {
185
+ status: os.session.status.handler(({ input, context: { ctx } }) => run(async () => {
184
186
  if (!input.session_id)
185
187
  throw new HttpError(400, 'Missing session_id');
186
- guardVisibility(ctx, input.session_id);
187
- return ctx.deps.sessions.status(input.session_id);
188
+ await guardVisibility(ctx, input.session_id);
189
+ return (await ctx.deps.sessions.status(input.session_id));
188
190
  })),
189
- usage: os.session.usage.handler(({ input, context: { ctx } }) => run(() => {
191
+ contextDetail: os.session.contextDetail.handler(({ input, context: { ctx } }) => run(async () => {
192
+ await guardVisibility(ctx, input.session_id);
193
+ return ctx.deps.sessions.contextDetail(input.session_id, input.context_detail_key);
194
+ })),
195
+ usage: os.session.usage.handler(({ input, context: { ctx } }) => run(async () => {
190
196
  if (!input.session_id)
191
197
  throw new HttpError(400, 'Missing session_id');
192
- guardVisibility(ctx, input.session_id);
193
- return ctx.deps.sessions.usage(input.session_id);
198
+ await guardVisibility(ctx, input.session_id);
199
+ return (await ctx.deps.sessions.usage(input.session_id));
194
200
  })),
201
+ executionModes: os.session.executionModes.handler(({ context: { ctx } }) => run(async () => ctx.deps.sessions.owner.modes(ctx.deps.activeProfile()))),
195
202
  new: os.session.new.handler(({ input, context: { ctx } }) => run(async () => {
203
+ if (input.execution_mode === 'ignore_config' || input.execution_mode === 'safe') {
204
+ // The owner has no worktree flow; refuse it rather than silently start an ordinary chat.
205
+ if (input.worktree !== undefined && input.worktree !== false)
206
+ throw new HttpError(400, 'A diagnostic chat cannot start in a new worktree');
207
+ await ctx.deps.agentConfig.read(ctx.deps.profileHome(ctx.deps.activeProfile())).catch(() => undefined);
208
+ return { session: (await ctx.deps.sessions.createDiagnostic(input, input.execution_mode)) };
209
+ }
196
210
  // Python: an invisible prev_session_id is ignored (the service drops it), never an error (#5420).
197
211
  const profile = input.profile || null;
198
212
  // The middleware warms only the cookie profile's config; new-session defaults read the target's synchronously.
@@ -213,8 +227,8 @@ export const sessionsRouter = os.router({
213
227
  }
214
228
  if (requested) {
215
229
  try {
216
- let base = input.workspace ? ctx.deps.sessions.resolveNewSessionWorkspace(input, null, profile) : null;
217
- base ??= ctx.deps.workspaces.resolveTrusted(ctx.deps.workspaces.lastWorkspace(profile), profile);
230
+ let base = input.workspace ? (await ctx.deps.sessions.resolveNewSessionWorkspace(input, null, profile)) : null;
231
+ base ??= (await ctx.deps.workspaces.resolveTrusted((await ctx.deps.workspaces.lastWorkspace(profile)), profile));
218
232
  const repo = base;
219
233
  worktree = await ctx.deps.git.holdWrite(repo, () => ctx.deps.worktrees.create(repo));
220
234
  }
@@ -232,67 +246,69 @@ export const sessionsRouter = os.router({
232
246
  worktreeSkipped = error.message;
233
247
  }
234
248
  }
235
- const s = ctx.deps.sessions.create(input, { worktree });
236
- const payload = { session: ctx.deps.sessions.publicSession(s) };
249
+ const s = (await ctx.deps.sessions.create(input, { worktree }));
250
+ const payload = { session: (await ctx.deps.sessions.publicSession(s)) };
237
251
  if (worktreeSkipped)
238
252
  payload.worktree_skipped = worktreeSkipped;
239
253
  return payload;
240
254
  })),
241
255
  rename: os.session.rename.handler(({ input, context: { ctx } }) => run(async () => {
242
- guardVisibility(ctx, input.session_id);
256
+ await guardVisibility(ctx, input.session_id);
243
257
  if (!input.title)
244
258
  throw new HttpError(400, 'Missing required field(s): title');
245
- return ctx.deps.sessions.rename(input.session_id, input.title);
259
+ return (await ctx.deps.sessions.rename(input.session_id, input.title));
246
260
  })),
247
261
  delete: os.session.delete.handler(({ input, context: { ctx } }) => run(async () => {
248
- guardVisibility(ctx, input.session_id);
249
- return ctx.deps.sessions.delete(input.session_id);
262
+ await guardVisibility(ctx, input.session_id);
263
+ return (await ctx.deps.sessions.delete(input.session_id));
250
264
  })),
251
265
  pin: os.session.pin.handler(({ input, context: { ctx } }) => run(async () => {
252
- guardVisibility(ctx, input.session_id);
266
+ await guardVisibility(ctx, input.session_id);
253
267
  return ctx.deps.sessions.pin(input.session_id, input.pinned ?? true);
254
268
  })),
255
269
  archive: os.session.archive.handler(({ input, context: { ctx } }) => run(async () => {
256
- guardVisibility(ctx, input.session_id);
257
- return ctx.deps.sessions.archive(input.session_id, input.archived ?? true);
270
+ await guardVisibility(ctx, input.session_id);
271
+ return (await ctx.deps.sessions.archive(input.session_id, input.archived ?? true));
258
272
  })),
259
273
  move: os.session.move.handler(({ input, context: { ctx } }) => run(async () => {
260
- guardVisibility(ctx, input.session_id);
261
- return ctx.deps.sessions.move(input.session_id, input.project_id || null);
274
+ await guardVisibility(ctx, input.session_id);
275
+ return (await ctx.deps.sessions.move(input.session_id, input.project_id || null));
262
276
  })),
263
- duplicate: os.session.duplicate.handler(({ input, context: { ctx } }) => run(() => {
277
+ duplicate: os.session.duplicate.handler(({ input, context: { ctx } }) => run(async () => {
264
278
  if (!input.session_id)
265
279
  throw new HttpError(400, 'session_id is required');
266
- guardVisibility(ctx, input.session_id);
267
- return ctx.deps.sessions.duplicate(input.session_id);
280
+ await guardVisibility(ctx, input.session_id);
281
+ return (await ctx.deps.sessions.duplicate(input.session_id));
268
282
  })),
269
- branch: os.session.branch.handler(({ input, context: { ctx } }) => run(() => {
270
- guardVisibility(ctx, input.session_id);
271
- return ctx.deps.sessions.branch(input.session_id, input);
283
+ branch: os.session.branch.handler(({ input, context: { ctx } }) => run(async () => {
284
+ await guardVisibility(ctx, input.session_id);
285
+ return (await ctx.deps.sessions.branch(input.session_id, input));
272
286
  })),
273
287
  truncate: os.session.truncate.handler(({ input, context: { ctx } }) => run(async () => {
274
- guardVisibility(ctx, input.session_id);
275
- return ctx.deps.sessions.truncate(input.session_id, input.keep_count);
288
+ await guardVisibility(ctx, input.session_id);
289
+ // A body without `confirm_deep_truncate` is a released App's, which asked on the device before sending it.
290
+ const hold = input.confirm_deep_truncate === undefined ? null : { confirmToken: input.confirm_deep_truncate ? input.confirm_token ?? null : null };
291
+ return (await ctx.deps.sessions.truncate(input.session_id, input.keep_count, hold));
276
292
  })),
277
293
  clear: os.session.clear.handler(({ input, context: { ctx } }) => run(async () => {
278
- guardVisibility(ctx, input.session_id);
279
- return ctx.deps.sessions.clear(input.session_id);
294
+ await guardVisibility(ctx, input.session_id);
295
+ return (await ctx.deps.sessions.clear(input.session_id));
280
296
  })),
281
297
  retry: os.session.retry.handler(({ input, context: { ctx } }) => run(async () => {
282
- guardVisibility(ctx, input.session_id);
283
- return ctx.deps.sessions.retry(input.session_id);
298
+ await guardVisibility(ctx, input.session_id);
299
+ return (await ctx.deps.sessions.retry(input.session_id));
284
300
  })),
285
301
  undo: os.session.undo.handler(({ input, context: { ctx } }) => run(async () => {
286
- guardVisibility(ctx, input.session_id);
287
- return ctx.deps.sessions.undo(input.session_id);
302
+ await guardVisibility(ctx, input.session_id);
303
+ return (await ctx.deps.sessions.undo(input.session_id));
288
304
  })),
289
305
  update: os.session.update.handler(({ input, context: { ctx } }) => run(async () => {
290
- guardVisibility(ctx, input.session_id);
291
- return ctx.deps.sessions.update(input.session_id, input);
306
+ await guardVisibility(ctx, input.session_id);
307
+ return (await ctx.deps.sessions.update(input.session_id, input));
292
308
  })),
293
309
  toolsets: os.session.toolsets.handler(({ input, context: { ctx } }) => run(async () => {
294
- guardVisibility(ctx, input.session_id);
295
- return ctx.deps.sessions.setToolsets(input.session_id, input.toolsets);
310
+ await guardVisibility(ctx, input.session_id);
311
+ return (await ctx.deps.sessions.setToolsets(input.session_id, input.toolsets));
296
312
  })),
297
313
  yoloGet: os.session.yoloGet.handler(({ input, context: { ctx } }) => run(() => ctx.deps.sessions.yolo(input.session_id))),
298
314
  yoloSet: os.session.yoloSet.handler(({ input, context: { ctx } }) => run(async () => {
@@ -312,52 +328,52 @@ export const sessionsRouter = os.router({
312
328
  const released = await ctx.deps.turns.respondApproval(sid, 'once', '', true);
313
329
  return { ok: true, yolo_enabled: Boolean(released.yolo_enabled ?? ctx.deps.sessions.yolo(sid).yolo_enabled), ...(released.stale_cleared ? { stale_cleared: true } : {}) };
314
330
  })),
315
- import: os.session.import.handler(({ input, context: { ctx } }) => run(() => ctx.deps.sessions.import(input))),
331
+ import: os.session.import.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.import(input)))),
316
332
  regenerateTitle: os.session.regenerateTitle.handler(({ input, context: { ctx } }) => run(async () => {
317
333
  const sid = input.session_id;
318
334
  let session;
319
335
  try {
320
- session = ctx.deps.sessionStore.get(sid);
336
+ session = (await ctx.deps.sessionStore.get(sid));
321
337
  }
322
338
  catch {
323
339
  throw new HttpError(404, 'Session not found');
324
340
  }
325
- if (ctx.deps.sessions.isReadOnly(session) || ctx.deps.sessions.isSubagentViewOnly(sid))
341
+ if ((await ctx.deps.sessions.isReadOnly(session)) || (await ctx.deps.sessions.isSubagentViewOnly(sid)))
326
342
  throw new HttpError(403, 'Read-only imported sessions cannot regenerate titles');
327
343
  const generated = await ctx.deps.turns.generateTitle(session, { preferLatest: Boolean(input.prefer_latest) });
328
344
  if (!generated.title)
329
345
  throw new HttpError(422, `Could not generate a better title (${generated.status || 'empty'})`);
330
346
  const current = await ctx.deps.sessions.persistGeneratedTitle(sid, generated.title, 'session_title_regenerate');
331
- return { session: ctx.deps.sessions.wireRow(current), title: current.title, status: generated.status, raw_preview: generated.rawPreview.slice(0, 240) };
347
+ return { session: (await ctx.deps.sessions.wireRow(current)), title: current.title, status: generated.status, raw_preview: generated.rawPreview.slice(0, 240) };
332
348
  })),
333
- recoveryAudit: os.session.recoveryAudit.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.recoveryAudit())),
349
+ recoveryAudit: os.session.recoveryAudit.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.recoveryAudit()))),
334
350
  recoveryRepairSafe: os.session.recoveryRepairSafe.handler(({ context: { ctx } }) => run(async () => {
335
351
  const result = await ctx.deps.sessions.recoveryRepairSafe();
336
352
  if (!result.clean)
337
353
  throw new RawResponse(409, result);
338
354
  return result;
339
355
  })),
340
- lineageReport: os.session.lineageReport.handler(({ input, context: { ctx } }) => run(() => {
356
+ lineageReport: os.session.lineageReport.handler(({ input, context: { ctx } }) => run(async () => {
341
357
  const sid = input.session_id ?? '';
342
358
  if (!sid)
343
359
  throw new HttpError(400, 'session_id required');
344
- const report = ctx.deps.sessions.lineageReport(sid);
360
+ const report = await ctx.deps.sessions.lineageReport(sid);
345
361
  if (!report.found)
346
362
  throw new HttpError(404, 'Session not found');
347
363
  return report;
348
364
  })),
349
- compressionRecoveryStart: os.session.compressionRecoveryStart.handler(({ input, context: { ctx } }) => run(() => {
365
+ compressionRecoveryStart: os.session.compressionRecoveryStart.handler(({ input, context: { ctx } }) => run(async () => {
350
366
  requireFields(input, 'session_id');
351
367
  const sid = str(input.session_id).trim();
352
368
  if (!sid)
353
369
  throw new HttpError(400, 'session_id is required');
354
- return ctx.deps.sessions.compressionRecoveryStart(sid);
370
+ return (await ctx.deps.sessions.compressionRecoveryStart(sid));
355
371
  })),
356
372
  // TAL-255: the iOS `/compress` route joins or starts the session's compression job and answers with its result.
357
373
  compress: os.session.compress.handler(({ input, context: { ctx } }) => run(async () => {
358
374
  requireFields(input, 'session_id');
359
375
  const sid = str(input.session_id).trim();
360
- guardVisibility(ctx, sid);
376
+ await guardVisibility(ctx, sid);
361
377
  const job = await ctx.deps.sessions.startCompression(sid, input.focus_topic || input.topic);
362
378
  await job.done;
363
379
  if (job.status === 'error')
@@ -367,56 +383,56 @@ export const sessionsRouter = os.router({
367
383
  compressStart: os.session.compressStart.handler(({ input, context: { ctx } }) => run(async () => {
368
384
  requireFields(input, 'session_id');
369
385
  const sid = str(input.session_id).trim();
370
- guardVisibility(ctx, sid);
386
+ await guardVisibility(ctx, sid);
371
387
  return compressionStatusPayload(await ctx.deps.sessions.startCompression(sid, input.focus_topic || input.topic));
372
388
  })),
373
389
  // TAL-258: the handoff dock. Rounds decides when to offer it; the summary is generated and appended to the transcript.
374
- conversationRounds: os.session.conversationRounds.handler(({ input, context: { ctx } }) => run(() => {
375
- const { sid, since } = handoffInput(ctx, input);
376
- return ctx.deps.sessions.conversationRounds(sid, since);
390
+ conversationRounds: os.session.conversationRounds.handler(({ input, context: { ctx } }) => run(async () => {
391
+ const { sid, since } = (await handoffInput(ctx, input));
392
+ return (await ctx.deps.sessions.conversationRounds(sid, since));
377
393
  })),
378
- handoffSummary: os.session.handoffSummary.handler(({ input, context: { ctx } }) => run(() => {
379
- const { sid, since } = handoffInput(ctx, input);
380
- return ctx.deps.sessions.handoffSummary(sid, since);
394
+ handoffSummary: os.session.handoffSummary.handler(({ input, context: { ctx } }) => run(async () => {
395
+ const { sid, since } = (await handoffInput(ctx, input));
396
+ return (await ctx.deps.sessions.handoffSummary(sid, since));
381
397
  })),
382
- compressStatus: os.session.compressStatus.handler(({ input, context: { ctx } }) => run(() => {
398
+ compressStatus: os.session.compressStatus.handler(({ input, context: { ctx } }) => run(async () => {
383
399
  const sid = input.session_id.trim();
384
400
  if (!sid)
385
401
  throw new HttpError(400, 'session_id is required');
386
- guardVisibility(ctx, sid);
387
- const job = ctx.deps.sessions.compressionJob(sid);
402
+ await guardVisibility(ctx, sid);
403
+ const job = (await ctx.deps.sessions.compressionJob(sid));
388
404
  return (job ? compressionStatusPayload(job) : { ok: true, status: 'idle', session_id: sid });
389
405
  })),
390
- draftGet: os.session.draftGet.handler(({ input, context: { ctx } }) => run(() => {
391
- guardVisibility(ctx, input.session_id);
392
- return ctx.deps.sessions.readDraft(input.session_id);
406
+ draftGet: os.session.draftGet.handler(({ input, context: { ctx } }) => run(async () => {
407
+ await guardVisibility(ctx, input.session_id);
408
+ return (await ctx.deps.sessions.readDraft(input.session_id));
393
409
  })),
394
410
  draftSave: os.session.draftSave.handler(({ input, context: { ctx } }) => run(async () => {
395
- guardVisibility(ctx, input.session_id);
396
- return ctx.deps.sessions.writeDraft(input);
411
+ await guardVisibility(ctx, input.session_id);
412
+ return (await ctx.deps.sessions.writeDraft(input));
397
413
  })),
398
- anchorSceneGet: os.session.anchorSceneGet.handler(({ input, context: { ctx } }) => run(() => {
399
- guardVisibility(ctx, input.session_id);
400
- return ctx.deps.sessions.readAnchorScene(input);
414
+ anchorSceneGet: os.session.anchorSceneGet.handler(({ input, context: { ctx } }) => run(async () => {
415
+ await guardVisibility(ctx, input.session_id);
416
+ return (await ctx.deps.sessions.readAnchorScene(input));
401
417
  })),
402
- toolResult: os.session.toolResult.handler(({ input, context: { ctx } }) => run(() => {
403
- guardVisibility(ctx, input.session_id);
404
- return ctx.deps.sessions.readToolResult(input);
418
+ toolResult: os.session.toolResult.handler(({ input, context: { ctx } }) => run(async () => {
419
+ await guardVisibility(ctx, input.session_id);
420
+ return (await ctx.deps.sessions.readToolResult(input));
405
421
  })),
406
422
  anchorSceneSave: os.session.anchorSceneSave.handler(({ input, context: { ctx } }) => run(async () => {
407
- guardVisibility(ctx, input.session_id);
408
- return ctx.deps.sessions.saveAnchorScene(input);
423
+ await guardVisibility(ctx, input.session_id);
424
+ return (await ctx.deps.sessions.saveAnchorScene(input));
409
425
  })),
410
426
  },
411
427
  projects: {
412
- list: os.projects.list.handler(({ input, context: { ctx } }) => run(() => {
428
+ list: os.projects.list.handler(({ input, context: { ctx } }) => run(async () => {
413
429
  const activeProfile = ctx.deps.activeProfile();
414
- const all = ctx.deps.projects.load();
430
+ const all = (await ctx.deps.projects.load());
415
431
  const allProfiles = allProfilesEnabled(ctx, input.all_profiles);
416
432
  const scoped = allProfiles ? all : all.filter((p) => ctx.deps.profilesMatch(p.profile ?? null, activeProfile));
417
433
  return { projects: scoped, all_profiles: allProfiles, active_profile: activeProfile, other_profile_count: allProfiles || ctx.deps.isolatedProfileMode() ? 0 : all.length - scoped.length };
418
434
  })),
419
- create: os.projects.create.handler(({ input, context: { ctx } }) => run(() => {
435
+ create: os.projects.create.handler(({ input, context: { ctx } }) => run(async () => {
420
436
  const name = input.name.trim().slice(0, 128);
421
437
  if (!name)
422
438
  throw new HttpError(400, 'name required');
@@ -426,43 +442,43 @@ export const sessionsRouter = os.router({
426
442
  const requested = (input.profile ?? '').trim();
427
443
  if (requested && requested !== 'default' && !/^[a-z0-9][a-z0-9_-]{0,63}$/.test(requested))
428
444
  throw new HttpError(400, 'invalid profile');
429
- const projects = ctx.deps.projects.load();
430
445
  const proj = { project_id: randomUUID().replace(/-/g, '').slice(0, 12), name, color, profile: requested || ctx.deps.activeProfile() || 'default', created_at: ctx.deps.auth.now() };
431
- projects.push(proj);
432
- ctx.deps.projects.save(projects);
446
+ await ctx.deps.projects.mutate((projects) => { projects.push(proj); });
433
447
  ctx.deps.events.publish('project_create', { profile: proj.profile });
434
448
  return { ok: true, project: proj };
435
449
  })),
436
- rename: os.projects.rename.handler(({ input, context: { ctx } }) => run(() => {
437
- const projects = ctx.deps.projects.load();
438
- const proj = projects.find((p) => p.project_id === input.project_id);
450
+ rename: os.projects.rename.handler(({ input, context: { ctx } }) => run(async () => {
439
451
  const activeProfile = ctx.deps.activeProfile();
440
- if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
441
- throw new HttpError(404, 'Project not found');
442
- requireFields(input, 'project_id', 'name');
443
- proj.name = input.name.trim().slice(0, 128);
444
- if ('color' in input) {
445
- const color = input.color ?? null;
446
- if (color && !/^#[0-9a-fA-F]{3,8}$/.test(color))
447
- throw new HttpError(400, 'Invalid color format');
448
- proj.color = color;
449
- }
450
- ctx.deps.projects.save(projects);
452
+ const proj = await ctx.deps.projects.mutate((projects) => {
453
+ const proj = projects.find((p) => p.project_id === input.project_id);
454
+ if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
455
+ throw new HttpError(404, 'Project not found');
456
+ requireFields(input, 'project_id', 'name');
457
+ proj.name = input.name.trim().slice(0, 128);
458
+ if ('color' in input) {
459
+ const color = input.color ?? null;
460
+ if (color && !/^#[0-9a-fA-F]{3,8}$/.test(color))
461
+ throw new HttpError(400, 'Invalid color format');
462
+ proj.color = color;
463
+ }
464
+ return proj;
465
+ });
451
466
  ctx.deps.events.publish('project_rename', { profile: activeProfile });
452
467
  return { ok: true, project: proj };
453
468
  })),
454
- delete: os.projects.delete.handler(({ input, context: { ctx } }) => run(() => {
455
- let projects = ctx.deps.projects.load();
456
- const proj = projects.find((p) => p.project_id === input.project_id);
469
+ delete: os.projects.delete.handler(({ input, context: { ctx } }) => run(async () => {
457
470
  const activeProfile = ctx.deps.activeProfile();
458
- if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
459
- throw new HttpError(404, 'Project not found');
460
- projects = projects.filter((p) => p.project_id !== input.project_id);
461
- ctx.deps.projects.save(projects);
471
+ await ctx.deps.projects.mutate((projects) => {
472
+ const position = projects.findIndex((p) => p.project_id === input.project_id);
473
+ const proj = projects[position];
474
+ if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
475
+ throw new HttpError(404, 'Project not found');
476
+ projects.splice(position, 1);
477
+ });
462
478
  const store = ctx.deps.sessionStore;
463
479
  const activeIds = ctx.deps.sessions.deps.runtime.activeStreamIds;
464
480
  try {
465
- for (const entry of store.readIndexEntries()) {
481
+ for (const entry of (await store.readIndexEntries())) {
466
482
  if (entry.project_id !== input.project_id)
467
483
  continue;
468
484
  const sid = str(entry.session_id);
@@ -474,9 +490,9 @@ export const sessionsRouter = os.router({
474
490
  continue;
475
491
  }
476
492
  }
477
- const s = store.get(sid);
493
+ const s = (await store.get(sid));
478
494
  s.project_id = null;
479
- store.save(s);
495
+ await store.save(s);
480
496
  }
481
497
  catch { /* one slow or failing session never aborts the request */ }
482
498
  }
@@ -501,36 +517,36 @@ export const sessionsRouter = os.router({
501
517
  const bound = str(session?.bound_profile).trim() || null;
502
518
  return relayCall(() => Promise.resolve(ctx.deps.relay.presence.update(input, ctx.deps.isRootProfile(bound ?? ctx.deps.activeProfile()) ? 'default' : (bound ?? ctx.deps.activeProfile()))));
503
519
  }),
504
- viewed: os.talaria.viewed.handler(({ input, context: { ctx } }) => run(() => {
505
- ctx.deps.relay.markViewed(input.session_id.trim());
520
+ viewed: os.talaria.viewed.handler(({ input, context: { ctx } }) => run(async () => {
521
+ await ctx.deps.relay.markViewed(input.session_id.trim());
506
522
  return { ok: true };
507
523
  })),
508
524
  },
509
525
  share: {
510
- create: os.share.create.handler(({ input, context: { ctx } }) => run(() => {
526
+ create: os.share.create.handler(({ input, context: { ctx } }) => run(async () => {
511
527
  const sid = input.session_id.trim();
512
528
  if (!sid)
513
529
  throw new HttpError(400, 'session_id is required');
514
- return ctx.deps.sessions.createShare(sid);
530
+ return (await ctx.deps.sessions.createShare(sid));
515
531
  })),
516
- revoke: os.share.revoke.handler(({ input, context: { ctx } }) => run(() => {
532
+ revoke: os.share.revoke.handler(({ input, context: { ctx } }) => run(async () => {
517
533
  const sid = input.session_id.trim();
518
534
  if (!sid)
519
535
  throw new HttpError(400, 'session_id is required');
520
- return ctx.deps.sessions.revokeShare(sid);
536
+ return (await ctx.deps.sessions.revokeShare(sid));
521
537
  })),
522
- read: os.share.read.handler(({ input, context: { ctx } }) => run(() => {
538
+ read: os.share.read.handler(({ input, context: { ctx } }) => run(async () => {
523
539
  ctx.extraResponseHeaders = { 'x-robots-tag': 'noindex, nofollow' };
524
- return ctx.deps.sessions.loadShare(input.token.trim());
540
+ return (await ctx.deps.sessions.loadShare(input.token.trim()));
525
541
  })),
526
542
  },
527
543
  workspaces: {
528
- list: os.workspaces.list.handler(({ context: { ctx } }) => run(() => {
544
+ list: os.workspaces.list.handler(({ context: { ctx } }) => run(async () => {
529
545
  const profile = ctx.deps.activeProfile();
530
- return { workspaces: ctx.deps.workspaces.load(profile), last: ctx.deps.workspaces.lastWorkspace(profile), terminal_remote_backend: ctx.deps.features().terminal_remote_backend };
546
+ return { workspaces: (await ctx.deps.workspaces.load(profile)), last: (await ctx.deps.workspaces.lastWorkspace(profile)), terminal_remote_backend: ctx.deps.features().terminal_remote_backend };
531
547
  })),
532
- suggest: os.workspaces.suggest.handler(({ input, context: { ctx } }) => run(() => ({ suggestions: ctx.deps.workspaces.suggest(input.prefix ?? '', 12, ctx.deps.activeProfile()), prefix: input.prefix ?? '' }))),
533
- add: os.workspaces.add.handler(({ input, context: { ctx } }) => run(() => {
548
+ suggest: os.workspaces.suggest.handler(({ input, context: { ctx } }) => run(async () => ({ suggestions: (await ctx.deps.workspaces.suggest(input.prefix ?? '', 12, ctx.deps.activeProfile())), prefix: input.prefix ?? '' }))),
549
+ add: os.workspaces.add.handler(({ input, context: { ctx } }) => run(async () => {
534
550
  const ws = ctx.deps.workspaces;
535
551
  const pathStr = stripSurroundingQuotes(input.path.trim());
536
552
  const name = (input.name ?? '').trim();
@@ -569,42 +585,42 @@ export const sessionsRouter = os.router({
569
585
  catch (error) {
570
586
  throw new HttpError(400, error.message);
571
587
  }
572
- const list = ws.load(profile);
588
+ const list = (await ws.load(profile));
573
589
  if (list.some((w) => w.path === p))
574
590
  throw new HttpError(400, 'Workspace already in list');
575
591
  list.push({ path: p, name: name || basename(p) });
576
- ws.save(list, profile);
592
+ await ws.save(list, profile);
577
593
  return { ok: true, workspaces: list };
578
594
  })),
579
- remove: os.workspaces.remove.handler(({ input, context: { ctx } }) => run(() => {
595
+ remove: os.workspaces.remove.handler(({ input, context: { ctx } }) => run(async () => {
580
596
  const pathStr = input.path.trim();
581
597
  if (!pathStr)
582
598
  throw new HttpError(400, 'path is required');
583
599
  const profile = ctx.deps.activeProfile();
584
- const list = ctx.deps.workspaces.load(profile).filter((w) => w.path !== pathStr);
585
- ctx.deps.workspaces.save(list, profile);
600
+ const list = (await ctx.deps.workspaces.load(profile)).filter((w) => w.path !== pathStr);
601
+ await ctx.deps.workspaces.save(list, profile);
586
602
  return { ok: true, workspaces: list };
587
603
  })),
588
- rename: os.workspaces.rename.handler(({ input, context: { ctx } }) => run(() => {
604
+ rename: os.workspaces.rename.handler(({ input, context: { ctx } }) => run(async () => {
589
605
  const pathStr = input.path.trim();
590
606
  const name = input.name.trim();
591
607
  if (!pathStr || !name)
592
608
  throw new HttpError(400, 'path and name are required');
593
609
  const profile = ctx.deps.activeProfile();
594
- const list = ctx.deps.workspaces.load(profile);
610
+ const list = (await ctx.deps.workspaces.load(profile));
595
611
  const entry = list.find((w) => w.path === pathStr);
596
612
  if (!entry)
597
613
  throw new HttpError(404, 'Workspace not found');
598
614
  entry.name = name;
599
- ctx.deps.workspaces.save(list, profile);
615
+ await ctx.deps.workspaces.save(list, profile);
600
616
  return { ok: true, workspaces: list };
601
617
  })),
602
- reorder: os.workspaces.reorder.handler(({ input, context: { ctx } }) => run(() => {
618
+ reorder: os.workspaces.reorder.handler(({ input, context: { ctx } }) => run(async () => {
603
619
  const paths = input.paths;
604
620
  if (!Array.isArray(paths) || !paths.length)
605
621
  throw new HttpError(400, 'paths is required and must be a list');
606
622
  const profile = ctx.deps.activeProfile();
607
- const list = ctx.deps.workspaces.load(profile);
623
+ const list = (await ctx.deps.workspaces.load(profile));
608
624
  const byPath = new Map(list.map((w) => [w.path, w]));
609
625
  const reordered = [];
610
626
  const seen = new Set();
@@ -619,18 +635,18 @@ export const sessionsRouter = os.router({
619
635
  for (const w of list)
620
636
  if (!seen.has(w.path))
621
637
  reordered.push(w);
622
- ctx.deps.workspaces.save(reordered, profile);
638
+ await ctx.deps.workspaces.save(reordered, profile);
623
639
  return { ok: true, workspaces: reordered };
624
640
  })),
625
641
  },
626
642
  files: {
627
- list: os.files.list.handler(({ input, context: { ctx } }) => run(() => {
643
+ list: os.files.list.handler(({ input, context: { ctx } }) => run(async () => {
628
644
  if (!input.session_id)
629
645
  throw new HttpError(400, 'session_id is required');
630
- guardVisibility(ctx, input.session_id);
646
+ await guardVisibility(ctx, input.session_id);
631
647
  // Python `_handle_list` resolved the workspace directly and answered 404 with the trust error; the POST file ops
632
648
  // keep `get_session_for_file_ops`' lenient fallback.
633
- const s = fileOpsSession(ctx, input.session_id, { strictWorkspace: true });
649
+ const s = (await fileOpsSession(ctx, input.session_id, { strictWorkspace: true }));
634
650
  const rel = input.path ?? '.';
635
651
  try {
636
652
  const entries = listDir(s.workspace, rel);
@@ -640,11 +656,11 @@ export const sessionsRouter = os.router({
640
656
  throw fileError(error, 404);
641
657
  }
642
658
  })),
643
- read: os.files.read.handler(({ input, context: { ctx } }) => run(() => {
659
+ read: os.files.read.handler(({ input, context: { ctx } }) => run(async () => {
644
660
  if (!input.session_id)
645
661
  throw new HttpError(400, 'session_id is required');
646
- guardVisibility(ctx, input.session_id);
647
- const s = fileOpsSession(ctx, input.session_id);
662
+ await guardVisibility(ctx, input.session_id);
663
+ const s = (await fileOpsSession(ctx, input.session_id));
648
664
  if (!input.path)
649
665
  throw new HttpError(400, 'path is required');
650
666
  try {
@@ -655,9 +671,9 @@ export const sessionsRouter = os.router({
655
671
  throw fileError(error, 404);
656
672
  }
657
673
  })),
658
- save: os.files.save.handler(({ input, context: { ctx } }) => run(() => {
674
+ save: os.files.save.handler(({ input, context: { ctx } }) => run(async () => {
659
675
  requireFields(input, 'session_id', 'path');
660
- const s = fileOpsSession(ctx, input.session_id);
676
+ const s = (await fileOpsSession(ctx, input.session_id));
661
677
  try {
662
678
  if (['.docx', '.xlsx', '.pptx'].includes(extname(input.path).toLowerCase()))
663
679
  throw new HttpError(400, 'Office documents cannot be saved from the Web UI');
@@ -684,9 +700,9 @@ export const sessionsRouter = os.router({
684
700
  throw fileError(error);
685
701
  }
686
702
  })),
687
- create: os.files.create.handler(({ input, context: { ctx } }) => run(() => {
703
+ create: os.files.create.handler(({ input, context: { ctx } }) => run(async () => {
688
704
  requireFields(input, 'session_id', 'path');
689
- const s = fileOpsSession(ctx, input.session_id);
705
+ const s = (await fileOpsSession(ctx, input.session_id));
690
706
  try {
691
707
  const root = s.workspace;
692
708
  assertWorkspaceFree(ctx, root);
@@ -709,9 +725,9 @@ export const sessionsRouter = os.router({
709
725
  throw fileError(error);
710
726
  }
711
727
  })),
712
- createDir: os.files.createDir.handler(({ input, context: { ctx } }) => run(() => {
728
+ createDir: os.files.createDir.handler(({ input, context: { ctx } }) => run(async () => {
713
729
  requireFields(input, 'session_id', 'path');
714
- const s = fileOpsSession(ctx, input.session_id);
730
+ const s = (await fileOpsSession(ctx, input.session_id));
715
731
  try {
716
732
  const root = s.workspace;
717
733
  assertWorkspaceFree(ctx, root);
@@ -725,9 +741,9 @@ export const sessionsRouter = os.router({
725
741
  throw fileError(error);
726
742
  }
727
743
  })),
728
- delete: os.files.delete.handler(({ input, context: { ctx } }) => run(() => {
744
+ delete: os.files.delete.handler(({ input, context: { ctx } }) => run(async () => {
729
745
  requireFields(input, 'session_id', 'path');
730
- const s = fileOpsSession(ctx, input.session_id);
746
+ const s = (await fileOpsSession(ctx, input.session_id));
731
747
  try {
732
748
  const root = s.workspace;
733
749
  assertWorkspaceFree(ctx, root);
@@ -749,9 +765,9 @@ export const sessionsRouter = os.router({
749
765
  throw fileError(error);
750
766
  }
751
767
  })),
752
- rename: os.files.rename.handler(({ input, context: { ctx } }) => run(() => {
768
+ rename: os.files.rename.handler(({ input, context: { ctx } }) => run(async () => {
753
769
  requireFields(input, 'session_id', 'path', 'new_name');
754
- const s = fileOpsSession(ctx, input.session_id);
770
+ const s = (await fileOpsSession(ctx, input.session_id));
755
771
  try {
756
772
  const root = s.workspace;
757
773
  assertWorkspaceFree(ctx, root);
@@ -776,10 +792,10 @@ export const sessionsRouter = os.router({
776
792
  throw fileError(error);
777
793
  }
778
794
  })),
779
- move: os.files.move.handler(({ input, context: { ctx } }) => run(() => {
795
+ move: os.files.move.handler(({ input, context: { ctx } }) => run(async () => {
780
796
  requireFields({ ...input, dest_dir: input.dest_dir ?? input.destination }, 'session_id', 'path', 'dest_dir');
781
797
  const destDirRaw = (input.dest_dir ?? input.destination ?? '.').trim() || '.';
782
- const s = fileOpsSession(ctx, input.session_id);
798
+ const s = (await fileOpsSession(ctx, input.session_id));
783
799
  try {
784
800
  const root = s.workspace;
785
801
  assertWorkspaceFree(ctx, root);
@@ -812,7 +828,7 @@ export const sessionsRouter = os.router({
812
828
  })),
813
829
  reveal: os.files.reveal.handler(({ input, context: { ctx } }) => run(async () => {
814
830
  requireFields(input, 'session_id', 'path');
815
- const s = fileOpsSession(ctx, input.session_id);
831
+ const s = (await fileOpsSession(ctx, input.session_id));
816
832
  try {
817
833
  const target = safeResolve(s.workspace, input.path);
818
834
  if (!existsSync(target))
@@ -831,9 +847,9 @@ export const sessionsRouter = os.router({
831
847
  throw fileError(error);
832
848
  }
833
849
  })),
834
- path: os.files.path.handler(({ input, context: { ctx } }) => run(() => {
850
+ path: os.files.path.handler(({ input, context: { ctx } }) => run(async () => {
835
851
  requireFields(input, 'session_id', 'path');
836
- const s = fileOpsSession(ctx, input.session_id);
852
+ const s = (await fileOpsSession(ctx, input.session_id));
837
853
  try {
838
854
  return { ok: true, path: safeResolve(s.workspace, input.path) };
839
855
  }
@@ -843,7 +859,7 @@ export const sessionsRouter = os.router({
843
859
  })),
844
860
  openVsCode: os.files.openVsCode.handler(({ input, context: { ctx } }) => run(async () => {
845
861
  requireFields(input, 'session_id', 'path');
846
- const s = fileOpsSession(ctx, input.session_id);
862
+ const s = (await fileOpsSession(ctx, input.session_id));
847
863
  try {
848
864
  const target = safeResolve(s.workspace, input.path);
849
865
  if (!existsSync(target))
@@ -859,7 +875,7 @@ export const sessionsRouter = os.router({
859
875
  throw fileError(error);
860
876
  }
861
877
  })),
862
- escapeAuthorize: os.files.escapeAuthorize.handler(({ input, context: { ctx } }) => run(() => {
878
+ escapeAuthorize: os.files.escapeAuthorize.handler(({ input, context: { ctx } }) => run(async () => {
863
879
  // A Referer alone is not a browser fetch: Python required `Origin`, which the global CSRF check has already matched.
864
880
  if (!ctx.header('origin'))
865
881
  throw new HttpError(403, 'browser origin required');
@@ -871,7 +887,7 @@ export const sessionsRouter = os.router({
871
887
  throw new HttpError(400, 'session_id is required');
872
888
  if (!rel)
873
889
  throw new HttpError(400, 'path is required');
874
- const s = fileOpsSession(ctx, sid);
890
+ const s = (await fileOpsSession(ctx, sid));
875
891
  try {
876
892
  return ctx.deps.escapeGrants.authorize(s.workspace, sid, s.profile, rel);
877
893
  }
@@ -879,8 +895,8 @@ export const sessionsRouter = os.router({
879
895
  throw fileError(error, 404);
880
896
  }
881
897
  })),
882
- escapeList: os.files.escapeList.handler(({ input, context: { ctx } }) => run(() => {
883
- const req = escapeRequest(ctx, input.session_id, input.token, input.path ?? '.');
898
+ escapeList: os.files.escapeList.handler(({ input, context: { ctx } }) => run(async () => {
899
+ const req = (await escapeRequest(ctx, input.session_id, input.token, input.path ?? '.'));
884
900
  try {
885
901
  const listing = ctx.deps.escapeGrants.list(req);
886
902
  return { ...listing, entries: serializeEntriesForBrowser(listing.entries) };
@@ -889,8 +905,8 @@ export const sessionsRouter = os.router({
889
905
  throw fileError(error, 404);
890
906
  }
891
907
  })),
892
- escapeRead: os.files.escapeRead.handler(({ input, context: { ctx } }) => run(() => {
893
- const req = escapeRequest(ctx, input.session_id, input.token, input.path ?? '');
908
+ escapeRead: os.files.escapeRead.handler(({ input, context: { ctx } }) => run(async () => {
909
+ const req = (await escapeRequest(ctx, input.session_id, input.token, input.path ?? ''));
894
910
  try {
895
911
  const file = ctx.deps.escapeGrants.read(req);
896
912
  // The frame loads the bytes through the same grant; the workspace preview grant would outlive and skip its re-checks.
@@ -903,12 +919,12 @@ export const sessionsRouter = os.router({
903
919
  },
904
920
  });
905
921
  /** The escape routes' shared front half: required ids, the session, and the grant re-check (403 when it fails). */
906
- export function escapeRequest(ctx, sid, token, rel) {
922
+ export async function escapeRequest(ctx, sid, token, rel) {
907
923
  if (!sid)
908
924
  throw new HttpError(400, 'session_id is required');
909
925
  if (!token)
910
926
  throw new HttpError(400, 'token is required');
911
- const s = fileOpsSession(ctx, sid);
927
+ const s = (await fileOpsSession(ctx, sid));
912
928
  try {
913
929
  return ctx.deps.escapeGrants.resolve(s.workspace, sid, s.profile, token, rel);
914
930
  }
@@ -947,18 +963,18 @@ export function fileError(error, notFoundStatus = 400) {
947
963
  * `state.db` but that has no `sessions/<sid>.json` (CLI, messaging) is served as an external view bound to the active
948
964
  * workspace, as the sidebar already lists it (issue #3280).
949
965
  */
950
- export function fileOpsSession(ctx, sid, opts = {}) {
966
+ export async function fileOpsSession(ctx, sid, opts = {}) {
951
967
  let session;
952
968
  try {
953
- session = ctx.deps.sessionStore.get(sid, { metadataOnly: true });
969
+ session = (await ctx.deps.sessionStore.get(sid, { metadataOnly: true }));
954
970
  }
955
971
  catch {
956
972
  const profile = ctx.deps.activeProfile();
957
- if (!isSafeSessionId(sid) || !stateDbHasSession(ctx.deps.cliSessions.dbPath(profile), sid))
973
+ if (!isSafeSessionId(sid) || !(await stateDbSessionReadAsync(false, 'stateDbHasSession', ctx.deps.cliSessions.dbPath(profile), sid)))
958
974
  throw new HttpError(404, 'Session not found');
959
975
  if (!ctx.deps.workspaces.profileSupportsLocalIo(profile))
960
976
  throw new HttpError(400, REMOTE_WORKSPACE_UNSUPPORTED_CODE, { message: REMOTE_WORKSPACE_UNSUPPORTED_MESSAGE });
961
- return { workspace: ctx.deps.workspaces.lastWorkspace(profile), profile, recovered: false, session: null };
977
+ return { workspace: (await ctx.deps.workspaces.lastWorkspace(profile)), profile, recovered: false, session: null };
962
978
  }
963
979
  if (!ctx.deps.profilesMatch(session.profile, ctx.deps.activeProfile()))
964
980
  throw new HttpError(404, 'Session not found');
@@ -968,7 +984,7 @@ export function fileOpsSession(ctx, sid, opts = {}) {
968
984
  let recovered = false;
969
985
  try {
970
986
  ;
971
- [workspace, recovered] = ctx.deps.workspaces.resolveImplicitWithRecovery(session.workspace, (p) => ctx.deps.workspaces.lastWorkspace(p), session.profile);
987
+ [workspace, recovered] = (await ctx.deps.workspaces.resolveImplicitWithRecovery(session.workspace, async (p) => (await ctx.deps.workspaces.lastWorkspace(p)), session.profile));
972
988
  }
973
989
  catch (error) {
974
990
  if (opts.strictWorkspace)
@@ -981,10 +997,10 @@ export function fileOpsSession(ctx, sid, opts = {}) {
981
997
  if (cached)
982
998
  cached.workspace = workspace;
983
999
  try {
984
- const full = ctx.deps.sessionStore.load(sid);
1000
+ const full = (await ctx.deps.sessionStore.load(sid));
985
1001
  if (full) {
986
1002
  full.workspace = workspace;
987
- ctx.deps.sessionStore.save(full, { touchUpdatedAt: false });
1003
+ (await ctx.deps.sessionStore.save(full, { touchUpdatedAt: false }));
988
1004
  }
989
1005
  }
990
1006
  catch { /* recovery persistence is best effort */ }