@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,7 +1,8 @@
1
1
  /** Chat turn admission, control, approvals, clarify, goals, background tasks, and side questions. */
2
+ import { timingOutcome } from '../startup-timing.js';
2
3
  import { GATEWAY_APPROVAL_RELAY_UNAVAILABLE, isGenericContinuationIntent } from '../sessions/turn.js';
3
4
  import { implement } from '@orpc/server';
4
- import { chatContract, MAX_CHAT_ATTACHMENTS } from '@maudecode/talaria-web-contracts';
5
+ import { chatContract, MAX_CHAT_ATTACHMENTS, RPC_ERROR_CODES } from '@maudecode/talaria-web-contracts';
5
6
  import { randomUUID } from 'node:crypto';
6
7
  import { HttpError } from './router.js';
7
8
  import { requestSessionIdGuard, streamOwnerSessionId, streamVisibleToRequest } from './session-visibility.js';
@@ -10,6 +11,9 @@ import { SessionNotFound } from '../sessions/store.js';
10
11
  import { compressionRecoveryPayload, isSafeSessionId } from '../sessions/session.js';
11
12
  import { messageText } from '../sessions/merge.js';
12
13
  import { str } from '../util.js';
14
+ import { activeProfileName } from '../auth/gate.js';
15
+ import { SidecarError } from '../sidecar/client.js';
16
+ import { unsupportedPromptMessage } from '../tools/commands.js';
13
17
  const os = implement(chatContract).$context().use(requestSessionIdGuard);
14
18
  const STEER_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
15
19
  const PROFILE_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
@@ -27,14 +31,14 @@ async function run(fn) {
27
31
  }
28
32
  }
29
33
  /** A session this request's profile may see (TAL-372 background work never crosses owners). */
30
- function visibleSession(ctx, sid) {
31
- if (!ctx.deps.sessions.sessionIdVisible(sid))
34
+ async function visibleSession(ctx, sid) {
35
+ if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
32
36
  throw new HttpError(404, 'Session not found');
33
- return getSession(ctx, sid, true);
37
+ return (await getSession(ctx, sid, true));
34
38
  }
35
- function getSession(ctx, sid, metadataOnly = false) {
39
+ async function getSession(ctx, sid, metadataOnly = false) {
36
40
  try {
37
- return ctx.deps.sessionStore.get(sid, { metadataOnly });
41
+ return (await ctx.deps.sessionStore.get(sid, { metadataOnly }));
38
42
  }
39
43
  catch {
40
44
  throw new HttpError(404, 'Session not found');
@@ -88,9 +92,61 @@ function visibleOrRetag(ctx, s, requestedProfile) {
88
92
  }
89
93
  throw new HttpError(404, 'Session not found');
90
94
  }
95
+ /**
96
+ * TAL-817: what the model gets for a typed Agent prompt built-in (`/plan`, `/initiate-setup`, …): the Agent's own expansion
97
+ * of it for this session's profile, workspace and toolsets, while the transcript keeps the typed text; null when `msg` is
98
+ * not one. One the Agent cannot expand is
99
+ * refused with the catalog's message instead of reaching the model raw. Without a sidecar the turn reports that itself.
100
+ */
101
+ async function expandPromptBuiltin(ctx, s, msg, workspace) {
102
+ const sidecar = ctx.deps.sidecar();
103
+ if (!msg.startsWith('/') || !sidecar)
104
+ return null;
105
+ // Only `/init` reads the workspace, and the sidecar refuses it without one; the turn reports a bad workspace itself.
106
+ let cwd = '';
107
+ try {
108
+ cwd = (await ctx.deps.sessions.turnWorkspace(s, workspace));
109
+ }
110
+ catch {
111
+ cwd = '';
112
+ }
113
+ let expanded;
114
+ try {
115
+ expanded = await sidecar.call('commands.expand_prompt', {
116
+ profile_home: ctx.deps.profileHome(s.profile ?? activeProfileName(ctx)), command: msg, session_id: s.session_id, workspace: cwd,
117
+ enabled_toolsets: s.enabled_toolsets,
118
+ }, { timeoutMs: 120_000 });
119
+ }
120
+ catch (error) {
121
+ if (!(error instanceof SidecarError))
122
+ throw error;
123
+ const invalid = error.condition === 'invalid_params' || error.code === RPC_ERROR_CODES.invalidParams;
124
+ throw new HttpError(invalid ? 400 : error.condition === 'sidecar_unavailable' ? 503 : 502, error.message);
125
+ }
126
+ if (expanded.name !== null && expanded.message === null)
127
+ throw new HttpError(400, unsupportedPromptMessage(expanded.name));
128
+ return expanded.message;
129
+ }
91
130
  /** `chat.start`; a `chat.steer` sent while a background turn runs starts the user's turn through it too (TAL-460). */
92
131
  async function startChat(ctx, body, settle = {}) {
132
+ ctx.enterChatStart();
133
+ const timing = ctx.startupTiming;
134
+ try {
135
+ const response = await startChatTimed(ctx, body, settle);
136
+ if (!response.stream_id)
137
+ timing?.finish('noop');
138
+ return response;
139
+ }
140
+ catch (error) {
141
+ timing?.finish(timingOutcome(error));
142
+ throw error;
143
+ }
144
+ }
145
+ async function startChatTimed(ctx, body, settle) {
146
+ const timing = ctx.startupTiming;
147
+ const measure = (name, fn) => timing ? timing.measure(name, fn) : Promise.resolve(fn());
93
148
  requireField(body, 'session_id');
149
+ timing?.identify(str(body.session_id));
94
150
  if (str(body.message).trim() === '[SILENT]')
95
151
  return { status: 'suppressed', reason: 'silent_control_message' };
96
152
  if (body.regenerate === true)
@@ -98,51 +154,66 @@ async function startChat(ctx, body, settle = {}) {
98
154
  const sid = str(body.session_id);
99
155
  // Python `_agent_runtime_barrier_response`: a stale local Agent checkout is refused with a typed 409 before any
100
156
  // session state is materialised, claimed, or mutated.
101
- await ensureAgentRuntimeCurrent(ctx.deps.sidecar());
102
- // TAL-542: the stale-model check reads this catalog; it is built before the session is read so no await follows that read.
103
- await ctx.deps.sessions.deps.warmSessionModelRepair?.();
157
+ await measure('runtime_barrier', () => ensureAgentRuntimeCurrent(ctx.deps.sidecar()));
158
+ const owner = ctx.deps.sessions.owner;
159
+ if (owner && (await measure('owner_routing', () => owner.isOwned(sid)))) {
160
+ if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
161
+ throw new HttpError(404, 'Session not found');
162
+ const response = (await owner.submit(sid, body, timing));
163
+ timing?.finish('ok');
164
+ return response;
165
+ }
166
+ // Admission reads the cached catalog snapshot; it never waits for a refresh.
167
+ timing?.begin('catalog_wait');
168
+ timing?.end('catalog_wait', 'noop');
169
+ const closeLoad = timing?.begin('session_load');
104
170
  let s;
105
171
  try {
106
- s = ctx.deps.sessionStore.get(sid);
172
+ s = (await ctx.deps.sessionStore.get(sid));
107
173
  }
108
174
  catch {
109
175
  // Python `_claim_or_synthesize_cli_session` on the POST path: a claimable foreign (CLI/TUI/Desktop) session is
110
176
  // materialised as a WebUI sidecar before its first turn; an owned foreign store answers 403, nothing → 404.
111
- const synth = ctx.deps.sessions.claimOrSynthesizeCliSession(sid);
177
+ const synth = (await ctx.deps.sessions.claimOrSynthesizeCliSession(sid));
112
178
  if (!synth.session)
113
179
  throw new HttpError(404, 'Session not found');
114
180
  if (synth.reason === 'not_claimable')
115
181
  throw new HttpError(403, 'session is read-only in its foreign store; cannot be claimed writeable in WebUI');
116
- ctx.deps.sessionStore.save(synth.session);
117
- s = ctx.deps.sessionStore.get(sid);
182
+ await ctx.deps.sessionStore.save(synth.session);
183
+ s = (await ctx.deps.sessionStore.get(sid));
118
184
  }
185
+ closeLoad?.();
186
+ const closeOwnership = timing?.begin('ownership_checks');
119
187
  // Python `_get_or_materialize_session` raised PermissionError for both: a read-only import and a delegated
120
188
  // subagent child (by sidecar tag or state.db row), which chat start answered with the same 403.
121
- if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly || ctx.deps.sessions.isSubagentViewOnly(sid))
189
+ if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly || (await ctx.deps.sessions.isSubagentViewOnly(sid)))
122
190
  throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
123
191
  const requestedProfile = str(body.profile).trim();
124
192
  if (requestedProfile && requestedProfile !== 'default' && !PROFILE_ID_RE.test(requestedProfile))
125
193
  throw new HttpError(400, 'invalid profile');
126
194
  visibleOrRetag(ctx, s, requestedProfile);
195
+ closeOwnership?.();
127
196
  const msg = str(body.message).trim();
128
197
  const attachments = normalizeChatAttachments(body.attachments).slice(0, MAX_CHAT_ATTACHMENTS);
129
198
  // TAL-276: an attached file alone makes a turn; one with neither text nor a file path is refused.
130
199
  if (!msg && !attachments.some((att) => str(att.path)))
131
200
  throw new HttpError(400, 'message is required');
201
+ const prompt = await measure('prompt_preparation', () => expandPromptBuiltin(ctx, s, msg, body.workspace));
132
202
  // TAL-460: the user's message never joins a background turn; that turn stops quietly and this one takes its place.
133
- if (await ctx.deps.turns.yieldBackgroundTurn(sid)) {
134
- await ctx.deps.sessions.deps.warmSessionModelRepair?.();
135
- s = ctx.deps.sessionStore.get(sid);
203
+ const yielded = await measure('background_yield', () => ctx.deps.turns.yieldBackgroundTurn(sid));
204
+ if (prompt !== null || yielded) {
205
+ s = (await ctx.deps.sessionStore.get(sid));
206
+ visibleOrRetag(ctx, s, requestedProfile);
136
207
  }
137
208
  // Python `compression_recovery_payload_for_session` + `is_generic_continuation_intent`.
138
209
  if (compressionRecoveryPayload(s) && !attachments.length && isGenericContinuationIntent(msg)) {
139
210
  throw new HttpError(409, 'This session exhausted context compression. Start a focused continuation, then describe the next narrow task.', { type: 'compression_recovery_required', compression_recovery: s.compression_recovery, session_id: s.session_id });
140
211
  }
141
- const workspace = ctx.deps.sessions.turnWorkspace(s, body.workspace);
212
+ const workspace = await measure('workspace_preparation', () => ctx.deps.sessions.turnWorkspace(s, body.workspace));
142
213
  const [model, provider, normalized] = ctx.deps.sessions.turnModel(s, body);
143
214
  if (body.moa_config)
144
215
  throw new HttpError(503, 'MoA overrides need the Agent command registry (checkpoint 7).');
145
- const response = ctx.deps.turns.start(s, { msg, attachments, workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', ...settle });
216
+ const response = (await ctx.deps.turns.start(s, { timing, msg, ...(prompt === null ? {} : { prompt }), attachments, workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', voiceTurn: body.voice_turn === true, connectCard: body.connect_card === true, skillSecret: body.skill_secret === true, ...settle }));
146
217
  if (response._status !== undefined && response._status >= 400)
147
218
  throw new HttpError(response._status, response.error ?? 'chat start failed', response.active_stream_id ? { active_stream_id: response.active_stream_id } : {});
148
219
  return startPayload(response);
@@ -152,7 +223,9 @@ async function startChat(ctx, body, settle = {}) {
152
223
  * failed after streaming text, answers `partial` with that text; any other failure answers with its error frame.
153
224
  */
154
225
  async function syncChat(ctx, body) {
155
- if (ctx.deps.sessions.isSubagentViewOnly(str(body.session_id)))
226
+ if (await ctx.deps.sessions.owner?.isOwned(str(body.session_id)))
227
+ throw new HttpError(409, 'This owner requires the asynchronous chat stream', { code: 'owner_requires_streaming' });
228
+ if ((await ctx.deps.sessions.isSubagentViewOnly(str(body.session_id))))
156
229
  throw new HttpError(400, 'Subagent sessions are view-only and cannot be written from WebUI');
157
230
  if (!str(body.message).trim())
158
231
  throw new HttpError(400, 'empty message');
@@ -164,8 +237,8 @@ async function syncChat(ctx, body) {
164
237
  const streamId = str(started.stream_id);
165
238
  if (streamId)
166
239
  await ctx.deps.turns.finished(streamId);
167
- const s = getSession(ctx, str(body.session_id));
168
- const session = ctx.deps.turns.publicTerminalSession(s);
240
+ const s = (await getSession(ctx, str(body.session_id)));
241
+ const session = (await ctx.deps.turns.publicTerminalSession(s));
169
242
  const ended = outcome;
170
243
  // A `[SILENT]` control message starts no turn.
171
244
  if (!streamId || (ended && 'answer' in ended)) {
@@ -186,8 +259,24 @@ async function syncChat(ctx, body) {
186
259
  }
187
260
  export const chatRouter = os.router({
188
261
  chat: {
189
- sync: os.chat.sync.handler(({ input, context: { ctx } }) => run(() => syncChat(ctx, input))),
190
- start: os.chat.start.handler(({ input, context: { ctx } }) => run(() => startChat(ctx, input))),
262
+ ownerAction: os.chat.ownerAction.handler(({ input, context: { ctx } }) => run(async () => {
263
+ if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
264
+ throw new HttpError(404, 'Session not found');
265
+ const owner = ctx.deps.sessions.owner;
266
+ if (!owner)
267
+ throw new HttpError(503, 'Native session controls are unavailable');
268
+ let draft;
269
+ if (input.action === 'retry') {
270
+ draft = await owner.retry(input.session_id, input.admission_id, input.execution_generation);
271
+ }
272
+ else
273
+ await owner.action(input.session_id, input);
274
+ const session = await ctx.deps.sessions.detail(input.session_id, {});
275
+ const model_change = session.owner_attachment?.model_change;
276
+ return { ok: true, session: session, ...(draft === undefined ? {} : { draft }), ...(model_change ? { model_change } : {}) };
277
+ })),
278
+ sync: os.chat.sync.handler(({ input, context: { ctx } }) => run(async () => (await syncChat(ctx, input)))),
279
+ start: os.chat.start.handler(({ input, context: { ctx } }) => run(async () => (await startChat(ctx, input)))),
191
280
  steer: os.chat.steer.handler(({ input, context: { ctx } }) => run(async () => {
192
281
  const sid = str(input.session_id).trim();
193
282
  const text = str(input.text).trim();
@@ -201,43 +290,52 @@ export const chatRouter = os.router({
201
290
  throw new HttpError(400, 'steer_id must be 1-128 URL-safe characters');
202
291
  if (!steerId)
203
292
  steerId = `steer-${randomUUID()}`;
204
- if (!ctx.deps.sessions.sessionIdVisible(sid))
293
+ if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
205
294
  throw new HttpError(404, 'Session not found');
206
295
  const active = ctx.deps.registry.activeRunStreamForSession(sid);
207
296
  if (active && ctx.deps.registry.activeRuns.get(active)?.origin === 'background') {
208
297
  const started = await startChat(ctx, { session_id: sid, message: text });
209
298
  return { accepted: true, fallback: null, stream_id: started.stream_id ? str(started.stream_id) : null, steer_id: steerId, started_turn: started };
210
299
  }
211
- return ctx.deps.turns.steer(sid, text, display, steerId);
300
+ // TAL-817: a prompt built-in steers with its expansion; the steer still shows as typed. A missing session is the steer's to report.
301
+ let target = null;
302
+ try {
303
+ target = (await ctx.deps.sessionStore.get(sid, { metadataOnly: true }));
304
+ }
305
+ catch {
306
+ target = null;
307
+ }
308
+ const prompt = target ? await expandPromptBuiltin(ctx, target, text, undefined) : null;
309
+ return (await ctx.deps.turns.steer(sid, prompt ?? text, display || (prompt === null ? '' : text), steerId));
212
310
  })),
213
311
  // TAL-424: Edit, Cancel and Send now on a pending steer; unknown or already-taken steers answer false.
214
312
  steerWithdraw: os.chat.steerWithdraw.handler(({ input, context: { ctx } }) => run(async () => {
215
- if (!ctx.deps.sessions.sessionIdVisible(input.session_id))
313
+ if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
216
314
  throw new HttpError(404, 'Session not found');
217
- return ctx.deps.turns.withdrawSteer(input.session_id, input.steer_id, input.reason);
315
+ return (await ctx.deps.turns.withdrawSteer(input.session_id, input.steer_id, input.reason));
218
316
  })),
219
317
  steerSendNow: os.chat.steerSendNow.handler(({ input, context: { ctx } }) => run(async () => {
220
- if (!ctx.deps.sessions.sessionIdVisible(input.session_id))
318
+ if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
221
319
  throw new HttpError(404, 'Session not found');
222
- return ctx.deps.turns.sendSteerNow(input.session_id, input.steer_id);
320
+ return (await ctx.deps.turns.sendSteerNow(input.session_id, input.steer_id));
223
321
  })),
224
322
  cancel: os.chat.cancel.handler(({ input, context: { ctx } }) => run(async () => {
225
323
  const streamId = str(input.stream_id);
226
324
  if (!streamId)
227
325
  throw new HttpError(400, 'stream_id required');
228
- if (!streamVisibleToRequest(ctx, streamId))
326
+ if (!(await streamVisibleToRequest(ctx, streamId)))
229
327
  throw new HttpError(404, 'Session not found');
230
328
  const { cancelled, withdrawn } = await ctx.deps.turns.cancel(streamId);
231
329
  return { ok: true, cancelled, stream_id: streamId, withdrawn_steers: withdrawn };
232
330
  })),
233
- streamStatus: os.chat.streamStatus.handler(({ input, context: { ctx } }) => run(() => {
331
+ streamStatus: os.chat.streamStatus.handler(({ input, context: { ctx } }) => run(async () => {
234
332
  const streamId = str(input.stream_id);
235
- if (!streamVisibleToRequest(ctx, streamId))
333
+ if (!(await streamVisibleToRequest(ctx, streamId)))
236
334
  throw new HttpError(404, 'Session not found');
237
335
  const active = ctx.deps.registry.liveIds.has(streamId);
238
- const owner = streamOwnerSessionId(ctx, streamId);
239
- const payload = { active, stream_id: streamId, replay_available: false, blocking_stream_id: owner ? ctx.deps.sessions.activeRunBlocking(owner) : null };
240
- const summary = streamId ? ctx.deps.journal.findRunSummary(streamId) : null;
336
+ const owner = (await streamOwnerSessionId(ctx, streamId));
337
+ const payload = { active, stream_id: streamId, replay_available: false, blocking_stream_id: owner ? (await ctx.deps.sessions.activeRunBlocking(owner)) : null };
338
+ const summary = streamId ? (await ctx.deps.journal.findRunSummary(streamId)) : null;
241
339
  if (summary) {
242
340
  payload.replay_available = true;
243
341
  const terminal = summary.terminal;
@@ -247,7 +345,7 @@ export const chatRouter = os.router({
247
345
  })),
248
346
  },
249
347
  approval: {
250
- pending: os.approval.pending.handler(({ input, context: { ctx } }) => run(() => ctx.deps.pending.approvalPending(str(input.session_id)))),
348
+ pending: os.approval.pending.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.owner?.isOwned(str(input.session_id))) ? ctx.deps.sessions.owner.pending(str(input.session_id), 'approval') : ctx.deps.pending.approvalPending(str(input.session_id)))),
251
349
  respond: os.approval.respond.handler(({ input, context: { ctx } }) => run(async () => {
252
350
  const sid = str(input.session_id);
253
351
  if (!sid)
@@ -268,14 +366,15 @@ export const chatRouter = os.router({
268
366
  })),
269
367
  },
270
368
  clarify: {
271
- pending: os.clarify.pending.handler(({ input, context: { ctx } }) => run(() => ctx.deps.pending.clarifyPending(str(input.session_id)))),
369
+ pending: os.clarify.pending.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.owner?.isOwned(str(input.session_id))) ? ctx.deps.sessions.owner.pending(str(input.session_id), 'clarify') : ctx.deps.pending.clarifyPending(str(input.session_id)))),
272
370
  respond: os.clarify.respond.handler(({ input, context: { ctx } }) => run(async () => {
273
371
  const sid = str(input.session_id);
274
372
  if (!sid)
275
373
  throw new HttpError(400, 'session_id is required');
276
- // Keyed step answers are shaped by the server; a raw `response` is relayed as-is for older clients.
277
- const reply = input.answers ?? str(input.response ?? input.answer ?? input.choice).trim();
278
- if (!reply)
374
+ // Both keyed answers and older clients' raw replies are shaped against the pending prompt; only a vault prompt
375
+ // takes a decline (TAL-887).
376
+ const reply = input.decline === true ? null : input.answers ?? str(input.response ?? input.answer ?? input.choice).trim();
377
+ if (reply === '')
279
378
  throw new HttpError(400, 'response is required');
280
379
  const result = await ctx.deps.turns.respondClarify(sid, str(input.clarify_id), reply);
281
380
  if (result.stale)
@@ -284,7 +383,8 @@ export const chatRouter = os.router({
284
383
  throw new HttpError(400, 'answers must answer every question of the pending clarification', { ok: false });
285
384
  if (!result.ok)
286
385
  throw new HttpError(503, result.error ?? 'clarify relay failed', { ok: false });
287
- return { ok: true, response: str(result.response) };
386
+ // A vault answer is never echoed back.
387
+ return result.response === undefined ? { ok: true } : { ok: true, response: result.response };
288
388
  })),
289
389
  },
290
390
  goal: os.goal.handler(({ input, context: { ctx } }) => run(async () => {
@@ -295,10 +395,10 @@ export const chatRouter = os.router({
295
395
  return { status: 'suppressed', reason: 'silent_control_message' };
296
396
  const sid = str(body.session_id);
297
397
  // Python: a delegated subagent child is view-only; its goal state is never mutated and no turn starts on it.
298
- if (ctx.deps.sessions.isSubagentViewOnly(sid))
398
+ if ((await ctx.deps.sessions.isSubagentViewOnly(sid)))
299
399
  throw new HttpError(400, 'Subagent sessions are view-only and cannot run /goal from WebUI');
300
- const s = getSession(ctx, sid);
301
- if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly)
400
+ const s = (await getSession(ctx, sid));
401
+ if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly)
302
402
  throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
303
403
  const requestedProfile = str(body.profile).trim();
304
404
  if (requestedProfile && requestedProfile !== 'default' && !PROFILE_ID_RE.test(requestedProfile))
@@ -309,7 +409,7 @@ export const chatRouter = os.router({
309
409
  if (s.active_stream_id) {
310
410
  streamRunning = ctx.deps.registry.liveIds.has(s.active_stream_id);
311
411
  if (!streamRunning)
312
- ctx.deps.sessions.clearStaleStreamState(s);
412
+ (await ctx.deps.sessions.clearStaleStreamState(s));
313
413
  }
314
414
  const sidecar = ctx.deps.sidecar();
315
415
  if (!sidecar)
@@ -329,21 +429,27 @@ export const chatRouter = os.router({
329
429
  defaultMaxTurns = 20;
330
430
  }
331
431
  const snapshot = await sidecar.call('goals.snapshot', { session_id: sid, profile_home: profileHome, default_max_turns: defaultMaxTurns });
332
- const payload = await sidecar.call('goals.command', { session_id: sid, profile_home: profileHome, args, stream_running: streamRunning, default_max_turns: defaultMaxTurns });
333
- if (payload.ok === false)
334
- throw new HttpError(payload.error === 'agent_running' ? 409 : 400, str(payload.message || payload.error || 'goal command failed'), payload);
432
+ await ctx.deps.sessions.assertWritable(s);
433
+ const payload = await sidecar.call('goals.command', { session_id: sid, profile_home: profileHome, args, stream_running: streamRunning, default_max_turns: defaultMaxTurns, workspace: str(s.workspace) || undefined });
434
+ // TAL-808: the session `goal` follows the command before the client reloads the session.
435
+ await ctx.deps.turns.refreshGoal(s);
436
+ if (payload.ok === false) {
437
+ // Clients show the body's `error`, so the Agent's reason replaces the sidecar's code there.
438
+ const reason = str(payload.message || payload.error || 'goal command failed');
439
+ throw new HttpError(payload.error === 'agent_running' ? 409 : 400, reason, { ...payload, error: reason });
440
+ }
335
441
  const kickoff = str(payload.kickoff_prompt).trim();
336
442
  if (kickoff) {
337
- // TAL-542: after the goal RPCs, so the stale-model check reads a catalog for the profile the session now runs under.
338
- await ctx.deps.sessions.deps.warmSessionModelRepair?.(s.profile);
339
- const workspace = ctx.deps.sessions.turnWorkspace(s, body.workspace);
443
+ const workspace = (await ctx.deps.sessions.turnWorkspace(s, body.workspace));
340
444
  const [model, provider, normalized] = ctx.deps.sessions.turnModel(s, body);
341
- const started = ctx.deps.turns.start(s, { msg: kickoff, attachments: [], workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', goalRelated: true });
445
+ const started = (await ctx.deps.turns.start(s, { msg: kickoff, attachments: [], workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', goalRelated: true }));
342
446
  if (started._status !== undefined && started._status >= 400) {
343
447
  try {
448
+ await ctx.deps.sessions.assertWritable(s);
344
449
  await sidecar.call('goals.restore', { session_id: sid, profile_home: profileHome, snapshot: snapshot.snapshot });
345
450
  }
346
451
  catch { /* best effort */ }
452
+ await ctx.deps.turns.refreshGoal(s);
347
453
  throw new HttpError(started._status, started.error ?? 'goal kickoff failed', { ...payload, ok: false });
348
454
  }
349
455
  Object.assign(payload, startPayload(started));
@@ -355,69 +461,79 @@ export const chatRouter = os.router({
355
461
  const body = input;
356
462
  requireField(body, 'session_id', 'prompt');
357
463
  // A subagent child's profile/workspace/context must never seed a runnable background session.
358
- if (ctx.deps.sessions.isSubagentViewOnly(str(body.session_id)))
464
+ if ((await ctx.deps.sessions.isSubagentViewOnly(str(body.session_id))))
359
465
  throw new HttpError(400, 'Subagent sessions are view-only and cannot run background tasks from WebUI');
360
- // TAL-542: the background turn starts on the parent's repaired pair; the catalog is built before the parent is read.
361
- await ctx.deps.sessions.deps.warmSessionModelRepair?.();
362
- const parent = getSession(ctx, str(body.session_id));
363
- if (ctx.deps.sessions.isReadOnly(parent) || parent.branchSourceReadonly)
466
+ const parent = (await getSession(ctx, str(body.session_id)));
467
+ if ((await ctx.deps.sessions.isReadOnly(parent)) || parent.branchSourceReadonly)
364
468
  throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
365
469
  const prompt = str(body.prompt).trim();
366
470
  if (!prompt)
367
471
  throw new HttpError(400, 'prompt is required');
368
472
  const [model, modelProvider] = ctx.deps.sessions.turnModel(parent, {});
369
- const bg = ctx.deps.sessionStore.newSession({ workspace: parent.workspace, model, modelProvider, profile: parent.profile });
473
+ const bg = (await ctx.deps.sessionStore.newSession({ workspace: parent.workspace, model, modelProvider, profile: parent.profile }));
370
474
  bg.title = `bg: ${prompt.slice(0, 60)}`;
371
- ctx.deps.sessionStore.save(bg);
475
+ await ctx.deps.sessionStore.save(bg);
372
476
  // Python: `uuid.uuid4().hex[:8]`; a failed run still completes the task so `/api/background/tasks` reports it,
373
477
  // and the hidden bg session file is removed afterwards.
374
478
  const taskId = randomUUID().replace(/-/g, '').slice(0, 8);
375
479
  // TAL-372: the parent session keeps the task's record and result, so every client and a restart see it.
376
- ctx.deps.background.trackCommand(parent.session_id, taskId, prompt);
377
- const cleanup = () => { try {
378
- ctx.deps.sessionStore.deleteFiles(bg.session_id, { tombstone: false });
480
+ await ctx.deps.background.trackCommand(parent.session_id, taskId, prompt);
481
+ const cleanup = async () => { try {
482
+ (await ctx.deps.sessionStore.delete(bg.session_id, { tombstone: false }));
379
483
  }
380
484
  catch { /* best effort */ } };
381
- const started = ctx.deps.turns.start(bg, {
485
+ const started = (await ctx.deps.turns.start(bg, {
382
486
  msg: prompt, attachments: [], workspace: parent.workspace, model, modelProvider, source: 'webui',
383
487
  // Python: the last non-error assistant reply with content, else "(no answer produced)".
384
- onDone: (answer) => { ctx.deps.background.settleCommand(parent.session_id, taskId, 'completed', answer || '(no answer produced)'); cleanup(); },
385
- onFailed: () => { ctx.deps.background.settleCommand(parent.session_id, taskId, 'failed', '(background task failed)'); cleanup(); },
386
- });
488
+ onDone: async (answer) => { (await ctx.deps.background.settleCommand(parent.session_id, taskId, 'completed', answer || '(no answer produced)')); (await cleanup()); },
489
+ onFailed: async () => { (await ctx.deps.background.settleCommand(parent.session_id, taskId, 'failed', '(background task failed)')); (await cleanup()); },
490
+ }));
387
491
  if (started._status !== undefined && started._status >= 400) {
388
492
  // Admission refused (profile deleting, session busy…): nothing runs, so the tracked task and hidden
389
493
  // session must not linger as "running".
390
- ctx.deps.background.forgetCommand(parent.session_id, taskId);
391
- cleanup();
494
+ await ctx.deps.background.forgetCommand(parent.session_id, taskId);
495
+ await cleanup();
392
496
  throw new HttpError(started._status, started.error ?? 'background start failed');
393
497
  }
394
- ctx.deps.background.setCommandStream(parent.session_id, taskId, str(started.stream_id));
498
+ await ctx.deps.background.setCommandStream(parent.session_id, taskId, str(started.stream_id));
395
499
  return { ok: true, task_id: taskId, stream_id: str(started.stream_id), session_id: bg.session_id };
396
500
  })),
397
501
  tasks: os.background.tasks.handler(({ input, context: { ctx } }) => run(async () => {
398
- const s = visibleSession(ctx, input.session_id);
399
- const snapshot = await ctx.deps.background.snapshot(s.session_id, s.profile);
502
+ const s = (await visibleSession(ctx, input.session_id));
503
+ const snapshot = await ctx.deps.background.snapshot(s.session_id, s.profile, { canStop: !(await ctx.deps.sessions.isReadOnly(s)) });
400
504
  return { session_id: s.session_id, ...snapshot, tasks: input.kind ? snapshot.tasks.filter((t) => t.kind === input.kind) : snapshot.tasks };
401
505
  })),
402
506
  result: os.background.result.handler(({ input, context: { ctx } }) => run(async () => {
403
- const s = visibleSession(ctx, input.session_id);
507
+ const s = (await visibleSession(ctx, input.session_id));
404
508
  const text = await ctx.deps.background.result(s.session_id, s.profile, input.task_id);
405
509
  if (text === null)
406
510
  throw new HttpError(404, 'No result for this background task');
407
511
  return { task_id: input.task_id, text };
408
512
  })),
409
- dismiss: os.background.dismiss.handler(({ input, context: { ctx } }) => run(() => {
410
- const s = visibleSession(ctx, input.session_id);
411
- const task = ctx.deps.background.dismiss(s.session_id, input.task_id);
513
+ stop: os.background.stop.handler(({ input, context: { ctx } }) => run(async () => {
514
+ const s = await visibleSession(ctx, input.session_id);
515
+ await ctx.deps.sessions.assertWritable(s);
516
+ try {
517
+ return await ctx.deps.background.stop(s.session_id, s.profile, input.task_id);
518
+ }
519
+ catch (error) {
520
+ if (!(error instanceof SidecarError))
521
+ throw error;
522
+ throw new HttpError(error.condition === 'sidecar_unavailable' ? 503 : 502, error.message);
523
+ }
524
+ })),
525
+ dismiss: os.background.dismiss.handler(({ input, context: { ctx } }) => run(async () => {
526
+ const s = (await visibleSession(ctx, input.session_id));
527
+ const task = (await ctx.deps.background.dismiss(s.session_id, input.task_id));
412
528
  if (!task)
413
529
  throw new HttpError(404, 'Background task not found');
414
530
  return { ok: true, task };
415
531
  })),
416
- ack: os.background.ack.handler(({ input, context: { ctx } }) => run(() => {
532
+ ack: os.background.ack.handler(({ input, context: { ctx } }) => run(async () => {
417
533
  const body = input;
418
534
  requireField(body, 'session_id');
419
535
  const sid = str(body.session_id).trim();
420
- const s = getSession(ctx, sid, true);
536
+ const s = (await getSession(ctx, sid, true));
421
537
  const pid = str(body.task_id || body.process_id).trim();
422
538
  if (str(body.process_id).trim())
423
539
  ctx.extraResponseHeaders = { deprecation: 'true' };
@@ -431,31 +547,30 @@ export const chatRouter = os.router({
431
547
  if (!isSafeSessionId(sid))
432
548
  throw new HttpError(404, 'Session not found');
433
549
  // Python: a subagent child's context must not be cloned into a runnable ephemeral session.
434
- if (ctx.deps.sessions.isSubagentViewOnly(sid))
550
+ if ((await ctx.deps.sessions.isSubagentViewOnly(sid)))
435
551
  throw new HttpError(400, 'Subagent sessions are view-only and cannot be used for /btw from WebUI');
436
- // TAL-542: the side question starts on the chat's repaired pair; the catalog is built before the chat is read.
437
- await ctx.deps.sessions.deps.warmSessionModelRepair?.();
438
- const s = getSession(ctx, sid);
439
- if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly)
552
+ const s = (await getSession(ctx, sid));
553
+ if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly)
440
554
  throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
441
555
  const question = str(body.question).trim();
442
556
  if (!question)
443
557
  throw new HttpError(400, 'question is required');
444
558
  // TAL-518: a side question runs in its own hidden session, so the chat's running turn does not block it.
445
559
  const [model, modelProvider] = ctx.deps.sessions.turnModel(s, {});
446
- const ephemeral = ctx.deps.sessionStore.newSession({ workspace: s.workspace, model, modelProvider, profile: s.profile });
560
+ const ephemeral = (await ctx.deps.sessionStore.newSession({ workspace: s.workspace, model, modelProvider, profile: s.profile }));
561
+ const context = await ctx.deps.sessions.sideQuestionContext(s);
447
562
  ephemeral.messages = structuredClone(s.messages);
448
- ephemeral.context_messages = ctx.deps.sessions.sideQuestionContext(s);
563
+ ephemeral.context_messages = context;
449
564
  ephemeral.title = `btw: ${question.slice(0, 60)}`;
450
- ctx.deps.sessionStore.save(ephemeral);
565
+ await ctx.deps.sessionStore.save(ephemeral);
451
566
  // TAL-512: a failed or refused btw turn must not leave its copy of the parent conversation behind.
452
- const cleanup = () => { try {
453
- ctx.deps.sessionStore.deleteFiles(ephemeral.session_id, { tombstone: false });
567
+ const cleanup = async () => { try {
568
+ (await ctx.deps.sessionStore.delete(ephemeral.session_id, { tombstone: false }));
454
569
  }
455
570
  catch { /* best effort */ } };
456
- const started = ctx.deps.turns.start(ephemeral, { msg: question, attachments: [], workspace: s.workspace, model, modelProvider, source: 'webui', ephemeral: true, onFailed: cleanup });
571
+ const started = (await ctx.deps.turns.start(ephemeral, { msg: question, attachments: [], workspace: s.workspace, model, modelProvider, source: 'webui', ephemeral: true, onFailed: cleanup }));
457
572
  if (started._status !== undefined && started._status >= 400) {
458
- cleanup();
573
+ await cleanup();
459
574
  throw new HttpError(started._status, started.error ?? 'btw start failed');
460
575
  }
461
576
  return { stream_id: str(started.stream_id), session_id: ephemeral.session_id, parent_session_id: sid };