@maudecode/talaria-web 0.0.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 (876) hide show
  1. package/contract_versions.json +18 -0
  2. package/dist/api/auth-raw.d.ts +9 -0
  3. package/dist/api/auth-raw.js +134 -0
  4. package/dist/api/auth-raw.js.map +1 -0
  5. package/dist/api/automation-raw.d.ts +16 -0
  6. package/dist/api/automation-raw.js +340 -0
  7. package/dist/api/automation-raw.js.map +1 -0
  8. package/dist/api/automation-router.d.ts +788 -0
  9. package/dist/api/automation-router.js +248 -0
  10. package/dist/api/automation-router.js.map +1 -0
  11. package/dist/api/chat-router.d.ts +375 -0
  12. package/dist/api/chat-router.js +446 -0
  13. package/dist/api/chat-router.js.map +1 -0
  14. package/dist/api/git-router.d.ts +681 -0
  15. package/dist/api/git-router.js +275 -0
  16. package/dist/api/git-router.js.map +1 -0
  17. package/dist/api/raw-routes.d.ts +10 -0
  18. package/dist/api/raw-routes.js +466 -0
  19. package/dist/api/raw-routes.js.map +1 -0
  20. package/dist/api/router.d.ts +226 -0
  21. package/dist/api/router.js +331 -0
  22. package/dist/api/router.js.map +1 -0
  23. package/dist/api/session-visibility.d.ts +12 -0
  24. package/dist/api/session-visibility.js +51 -0
  25. package/dist/api/session-visibility.js.map +1 -0
  26. package/dist/api/sessions-router.d.ts +1728 -0
  27. package/dist/api/sessions-router.js +815 -0
  28. package/dist/api/sessions-router.js.map +1 -0
  29. package/dist/api/settings-router.d.ts +592 -0
  30. package/dist/api/settings-router.js +474 -0
  31. package/dist/api/settings-router.js.map +1 -0
  32. package/dist/api/sse-routes.d.ts +51 -0
  33. package/dist/api/sse-routes.js +602 -0
  34. package/dist/api/sse-routes.js.map +1 -0
  35. package/dist/api/tools-raw.d.ts +5 -0
  36. package/dist/api/tools-raw.js +291 -0
  37. package/dist/api/tools-raw.js.map +1 -0
  38. package/dist/api/tools-router.d.ts +494 -0
  39. package/dist/api/tools-router.js +349 -0
  40. package/dist/api/tools-router.js.map +1 -0
  41. package/dist/app.d.ts +4787 -0
  42. package/dist/app.js +453 -0
  43. package/dist/app.js.map +1 -0
  44. package/dist/auth/cookies.d.ts +17 -0
  45. package/dist/auth/cookies.js +42 -0
  46. package/dist/auth/cookies.js.map +1 -0
  47. package/dist/auth/crypto.d.ts +9 -0
  48. package/dist/auth/crypto.js +38 -0
  49. package/dist/auth/crypto.js.map +1 -0
  50. package/dist/auth/gate.d.ts +39 -0
  51. package/dist/auth/gate.js +406 -0
  52. package/dist/auth/gate.js.map +1 -0
  53. package/dist/auth/oidc.d.ts +138 -0
  54. package/dist/auth/oidc.js +836 -0
  55. package/dist/auth/oidc.js.map +1 -0
  56. package/dist/auth/passkeys.d.ts +49 -0
  57. package/dist/auth/passkeys.js +310 -0
  58. package/dist/auth/passkeys.js.map +1 -0
  59. package/dist/auth/store.d.ts +116 -0
  60. package/dist/auth/store.js +485 -0
  61. package/dist/auth/store.js.map +1 -0
  62. package/dist/bin/talaria-web-mcp.d.ts +2 -0
  63. package/dist/bin/talaria-web-mcp.js +12 -0
  64. package/dist/bin/talaria-web-mcp.js.map +1 -0
  65. package/dist/bin/talaria-web.d.ts +2 -0
  66. package/dist/bin/talaria-web.js +87 -0
  67. package/dist/bin/talaria-web.js.map +1 -0
  68. package/dist/cli/ctl.d.ts +58 -0
  69. package/dist/cli/ctl.js +643 -0
  70. package/dist/cli/ctl.js.map +1 -0
  71. package/dist/cli/dotenv.d.ts +30 -0
  72. package/dist/cli/dotenv.js +115 -0
  73. package/dist/cli/dotenv.js.map +1 -0
  74. package/dist/cli/launcher.d.ts +49 -0
  75. package/dist/cli/launcher.js +213 -0
  76. package/dist/cli/launcher.js.map +1 -0
  77. package/dist/cli/supervise.d.ts +10 -0
  78. package/dist/cli/supervise.js +33 -0
  79. package/dist/cli/supervise.js.map +1 -0
  80. package/dist/cli/web-root.d.ts +2 -0
  81. package/dist/cli/web-root.js +23 -0
  82. package/dist/cli/web-root.js.map +1 -0
  83. package/dist/config/agent-config.d.ts +109 -0
  84. package/dist/config/agent-config.js +632 -0
  85. package/dist/config/agent-config.js.map +1 -0
  86. package/dist/config.d.ts +36 -0
  87. package/dist/config.js +105 -0
  88. package/dist/config.js.map +1 -0
  89. package/dist/fs/atomic.d.ts +7 -0
  90. package/dist/fs/atomic.js +68 -0
  91. package/dist/fs/atomic.js.map +1 -0
  92. package/dist/http/addresses.d.ts +5 -0
  93. package/dist/http/addresses.js +68 -0
  94. package/dist/http/addresses.js.map +1 -0
  95. package/dist/http/capped.d.ts +2 -0
  96. package/dist/http/capped.js +22 -0
  97. package/dist/http/capped.js.map +1 -0
  98. package/dist/http/context.d.ts +281 -0
  99. package/dist/http/context.js +327 -0
  100. package/dist/http/context.js.map +1 -0
  101. package/dist/http/csp.d.ts +11 -0
  102. package/dist/http/csp.js +51 -0
  103. package/dist/http/csp.js.map +1 -0
  104. package/dist/http/origin.d.ts +39 -0
  105. package/dist/http/origin.js +183 -0
  106. package/dist/http/origin.js.map +1 -0
  107. package/dist/http/pinned.d.ts +18 -0
  108. package/dist/http/pinned.js +62 -0
  109. package/dist/http/pinned.js.map +1 -0
  110. package/dist/index.d.ts +10 -0
  111. package/dist/index.js +12 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/mcp/server.d.ts +29 -0
  114. package/dist/mcp/server.js +221 -0
  115. package/dist/mcp/server.js.map +1 -0
  116. package/dist/onboarding.d.ts +57 -0
  117. package/dist/onboarding.js +381 -0
  118. package/dist/onboarding.js.map +1 -0
  119. package/dist/profiles/profiles.d.ts +96 -0
  120. package/dist/profiles/profiles.js +476 -0
  121. package/dist/profiles/profiles.js.map +1 -0
  122. package/dist/projects.d.ts +36 -0
  123. package/dist/projects.js +102 -0
  124. package/dist/projects.js.map +1 -0
  125. package/dist/providers/catalog.d.ts +118 -0
  126. package/dist/providers/catalog.js +868 -0
  127. package/dist/providers/catalog.js.map +1 -0
  128. package/dist/providers/env-file.d.ts +6 -0
  129. package/dist/providers/env-file.js +106 -0
  130. package/dist/providers/env-file.js.map +1 -0
  131. package/dist/providers/runtime-env.d.ts +20 -0
  132. package/dist/providers/runtime-env.js +85 -0
  133. package/dist/providers/runtime-env.js.map +1 -0
  134. package/dist/providers/tables.d.ts +54 -0
  135. package/dist/providers/tables.js +54 -0
  136. package/dist/providers/tables.js.map +1 -0
  137. package/dist/redact.d.ts +23 -0
  138. package/dist/redact.js +337 -0
  139. package/dist/redact.js.map +1 -0
  140. package/dist/release.d.ts +16 -0
  141. package/dist/release.js +114 -0
  142. package/dist/release.js.map +1 -0
  143. package/dist/runtime.d.ts +21 -0
  144. package/dist/runtime.js +680 -0
  145. package/dist/runtime.js.map +1 -0
  146. package/dist/server.d.ts +20 -0
  147. package/dist/server.js +90 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/sessions/anchor.d.ts +43 -0
  150. package/dist/sessions/anchor.js +311 -0
  151. package/dist/sessions/anchor.js.map +1 -0
  152. package/dist/sessions/cli-sessions.d.ts +27 -0
  153. package/dist/sessions/cli-sessions.js +158 -0
  154. package/dist/sessions/cli-sessions.js.map +1 -0
  155. package/dist/sessions/completions.d.ts +62 -0
  156. package/dist/sessions/completions.js +332 -0
  157. package/dist/sessions/completions.js.map +1 -0
  158. package/dist/sessions/drafts.d.ts +26 -0
  159. package/dist/sessions/drafts.js +117 -0
  160. package/dist/sessions/drafts.js.map +1 -0
  161. package/dist/sessions/events.d.ts +32 -0
  162. package/dist/sessions/events.js +80 -0
  163. package/dist/sessions/events.js.map +1 -0
  164. package/dist/sessions/export.d.ts +4 -0
  165. package/dist/sessions/export.js +186 -0
  166. package/dist/sessions/export.js.map +1 -0
  167. package/dist/sessions/gateway-watcher.d.ts +58 -0
  168. package/dist/sessions/gateway-watcher.js +199 -0
  169. package/dist/sessions/gateway-watcher.js.map +1 -0
  170. package/dist/sessions/journal.d.ts +103 -0
  171. package/dist/sessions/journal.js +543 -0
  172. package/dist/sessions/journal.js.map +1 -0
  173. package/dist/sessions/list.d.ts +130 -0
  174. package/dist/sessions/list.js +846 -0
  175. package/dist/sessions/list.js.map +1 -0
  176. package/dist/sessions/merge.d.ts +57 -0
  177. package/dist/sessions/merge.js +517 -0
  178. package/dist/sessions/merge.js.map +1 -0
  179. package/dist/sessions/pending.d.ts +69 -0
  180. package/dist/sessions/pending.js +271 -0
  181. package/dist/sessions/pending.js.map +1 -0
  182. package/dist/sessions/reasoning-titles.d.ts +31 -0
  183. package/dist/sessions/reasoning-titles.js +143 -0
  184. package/dist/sessions/reasoning-titles.js.map +1 -0
  185. package/dist/sessions/relay.d.ts +131 -0
  186. package/dist/sessions/relay.js +577 -0
  187. package/dist/sessions/relay.js.map +1 -0
  188. package/dist/sessions/service.d.ts +189 -0
  189. package/dist/sessions/service.js +1344 -0
  190. package/dist/sessions/service.js.map +1 -0
  191. package/dist/sessions/session.d.ts +131 -0
  192. package/dist/sessions/session.js +505 -0
  193. package/dist/sessions/session.js.map +1 -0
  194. package/dist/sessions/shares.d.ts +31 -0
  195. package/dist/sessions/shares.js +267 -0
  196. package/dist/sessions/shares.js.map +1 -0
  197. package/dist/sessions/state-db.d.ts +52 -0
  198. package/dist/sessions/state-db.js +641 -0
  199. package/dist/sessions/state-db.js.map +1 -0
  200. package/dist/sessions/state-saved.d.ts +13 -0
  201. package/dist/sessions/state-saved.js +47 -0
  202. package/dist/sessions/state-saved.js.map +1 -0
  203. package/dist/sessions/store.d.ts +124 -0
  204. package/dist/sessions/store.js +790 -0
  205. package/dist/sessions/store.js.map +1 -0
  206. package/dist/sessions/streams.d.ts +90 -0
  207. package/dist/sessions/streams.js +200 -0
  208. package/dist/sessions/streams.js.map +1 -0
  209. package/dist/sessions/titles.d.ts +17 -0
  210. package/dist/sessions/titles.js +231 -0
  211. package/dist/sessions/titles.js.map +1 -0
  212. package/dist/sessions/todo.d.ts +8 -0
  213. package/dist/sessions/todo.js +72 -0
  214. package/dist/sessions/todo.js.map +1 -0
  215. package/dist/sessions/turn-context.d.ts +27 -0
  216. package/dist/sessions/turn-context.js +136 -0
  217. package/dist/sessions/turn-context.js.map +1 -0
  218. package/dist/sessions/turn.d.ts +178 -0
  219. package/dist/sessions/turn.js +1357 -0
  220. package/dist/sessions/turn.js.map +1 -0
  221. package/dist/sessions/window.d.ts +10 -0
  222. package/dist/sessions/window.js +151 -0
  223. package/dist/sessions/window.js.map +1 -0
  224. package/dist/settings.d.ts +57 -0
  225. package/dist/settings.js +481 -0
  226. package/dist/settings.js.map +1 -0
  227. package/dist/sidecar/client.d.ts +75 -0
  228. package/dist/sidecar/client.js +252 -0
  229. package/dist/sidecar/client.js.map +1 -0
  230. package/dist/sidecar/discover.d.ts +22 -0
  231. package/dist/sidecar/discover.js +146 -0
  232. package/dist/sidecar/discover.js.map +1 -0
  233. package/dist/sidecar/fake.d.ts +37 -0
  234. package/dist/sidecar/fake.js +79 -0
  235. package/dist/sidecar/fake.js.map +1 -0
  236. package/dist/spa.d.ts +42 -0
  237. package/dist/spa.js +145 -0
  238. package/dist/spa.js.map +1 -0
  239. package/dist/startup.d.ts +19 -0
  240. package/dist/startup.js +44 -0
  241. package/dist/startup.js.map +1 -0
  242. package/dist/test/harness.d.ts +41 -0
  243. package/dist/test/harness.js +123 -0
  244. package/dist/test/harness.js.map +1 -0
  245. package/dist/text/diff.d.ts +16 -0
  246. package/dist/text/diff.js +122 -0
  247. package/dist/text/diff.js.map +1 -0
  248. package/dist/text/markdown.d.ts +8 -0
  249. package/dist/text/markdown.js +185 -0
  250. package/dist/text/markdown.js.map +1 -0
  251. package/dist/tools/crons.d.ts +51 -0
  252. package/dist/tools/crons.js +317 -0
  253. package/dist/tools/crons.js.map +1 -0
  254. package/dist/tools/extensions.d.ts +92 -0
  255. package/dist/tools/extensions.js +1096 -0
  256. package/dist/tools/extensions.js.map +1 -0
  257. package/dist/tools/health.d.ts +21 -0
  258. package/dist/tools/health.js +334 -0
  259. package/dist/tools/health.js.map +1 -0
  260. package/dist/tools/hygiene.d.ts +29 -0
  261. package/dist/tools/hygiene.js +112 -0
  262. package/dist/tools/hygiene.js.map +1 -0
  263. package/dist/tools/insights.d.ts +3 -0
  264. package/dist/tools/insights.js +92 -0
  265. package/dist/tools/insights.js.map +1 -0
  266. package/dist/tools/kanban.d.ts +25 -0
  267. package/dist/tools/kanban.js +79 -0
  268. package/dist/tools/kanban.js.map +1 -0
  269. package/dist/tools/mcp-health.d.ts +28 -0
  270. package/dist/tools/mcp-health.js +207 -0
  271. package/dist/tools/mcp-health.js.map +1 -0
  272. package/dist/tools/mcp.d.ts +34 -0
  273. package/dist/tools/mcp.js +269 -0
  274. package/dist/tools/mcp.js.map +1 -0
  275. package/dist/tools/memory.d.ts +20 -0
  276. package/dist/tools/memory.js +216 -0
  277. package/dist/tools/memory.js.map +1 -0
  278. package/dist/tools/skills.d.ts +43 -0
  279. package/dist/tools/skills.js +193 -0
  280. package/dist/tools/skills.js.map +1 -0
  281. package/dist/tools/terminal.d.ts +96 -0
  282. package/dist/tools/terminal.js +324 -0
  283. package/dist/tools/terminal.js.map +1 -0
  284. package/dist/tools/updates.d.ts +151 -0
  285. package/dist/tools/updates.js +1151 -0
  286. package/dist/tools/updates.js.map +1 -0
  287. package/dist/util.d.ts +6 -0
  288. package/dist/util.js +40 -0
  289. package/dist/util.js.map +1 -0
  290. package/dist/workspace/fs.d.ts +61 -0
  291. package/dist/workspace/fs.js +555 -0
  292. package/dist/workspace/fs.js.map +1 -0
  293. package/dist/workspace/git.d.ts +204 -0
  294. package/dist/workspace/git.js +1236 -0
  295. package/dist/workspace/git.js.map +1 -0
  296. package/dist/workspace/media.d.ts +47 -0
  297. package/dist/workspace/media.js +448 -0
  298. package/dist/workspace/media.js.map +1 -0
  299. package/dist/workspace/paths.d.ts +6 -0
  300. package/dist/workspace/paths.js +41 -0
  301. package/dist/workspace/paths.js.map +1 -0
  302. package/dist/workspace/rollback.d.ts +29 -0
  303. package/dist/workspace/rollback.js +337 -0
  304. package/dist/workspace/rollback.js.map +1 -0
  305. package/dist/workspace/unzip.d.ts +9 -0
  306. package/dist/workspace/unzip.js +61 -0
  307. package/dist/workspace/unzip.js.map +1 -0
  308. package/dist/workspace/upload.d.ts +40 -0
  309. package/dist/workspace/upload.js +215 -0
  310. package/dist/workspace/upload.js.map +1 -0
  311. package/dist/workspace/workspaces.d.ts +84 -0
  312. package/dist/workspace/workspaces.js +663 -0
  313. package/dist/workspace/workspaces.js.map +1 -0
  314. package/dist/workspace/worktrees.d.ts +14 -0
  315. package/dist/workspace/worktrees.js +171 -0
  316. package/dist/workspace/worktrees.js.map +1 -0
  317. package/dist/workspace/zip.d.ts +16 -0
  318. package/dist/workspace/zip.js +205 -0
  319. package/dist/workspace/zip.js.map +1 -0
  320. package/package.json +54 -0
  321. package/sidecar/agent_dependency.json +11 -0
  322. package/sidecar/scripts/record-fixtures.py +72 -0
  323. package/sidecar/scripts/replay_sidecar.py +113 -0
  324. package/sidecar/scripts/test.sh +22 -0
  325. package/sidecar/talaria_sidecar/__init__.py +10 -0
  326. package/sidecar/talaria_sidecar/__main__.py +46 -0
  327. package/sidecar/talaria_sidecar/errors.py +41 -0
  328. package/sidecar/talaria_sidecar/home.py +103 -0
  329. package/sidecar/talaria_sidecar/methods/__init__.py +37 -0
  330. package/sidecar/talaria_sidecar/methods/aux.py +160 -0
  331. package/sidecar/talaria_sidecar/methods/chat.py +791 -0
  332. package/sidecar/talaria_sidecar/methods/commands.py +340 -0
  333. package/sidecar/talaria_sidecar/methods/config.py +131 -0
  334. package/sidecar/talaria_sidecar/methods/cron.py +558 -0
  335. package/sidecar/talaria_sidecar/methods/gateway.py +106 -0
  336. package/sidecar/talaria_sidecar/methods/goals.py +225 -0
  337. package/sidecar/talaria_sidecar/methods/kanban.py +723 -0
  338. package/sidecar/talaria_sidecar/methods/mcp.py +65 -0
  339. package/sidecar/talaria_sidecar/methods/process.py +155 -0
  340. package/sidecar/talaria_sidecar/methods/profiles.py +254 -0
  341. package/sidecar/talaria_sidecar/methods/providers.py +241 -0
  342. package/sidecar/talaria_sidecar/methods/runtime.py +68 -0
  343. package/sidecar/talaria_sidecar/methods/skills.py +262 -0
  344. package/sidecar/talaria_sidecar/methods/state_db.py +418 -0
  345. package/sidecar/talaria_sidecar/methods/stt.py +131 -0
  346. package/sidecar/talaria_sidecar/methods/text.py +85 -0
  347. package/sidecar/talaria_sidecar/methods/usage.py +59 -0
  348. package/sidecar/talaria_sidecar/methods/worktree.py +71 -0
  349. package/sidecar/talaria_sidecar/rpc.py +218 -0
  350. package/sidecar/talaria_sidecar/runtime.py +330 -0
  351. package/static/brand/apple-touch-icon.png +0 -0
  352. package/static/brand/brandmark.svg +12 -0
  353. package/static/brand/favicon-192.png +0 -0
  354. package/static/brand/favicon-32.png +0 -0
  355. package/static/brand/favicon-512.png +0 -0
  356. package/static/brand/favicon-512.svg +14 -0
  357. package/static/brand/favicon-dark.svg +14 -0
  358. package/static/brand/favicon-light.svg +14 -0
  359. package/static/brand/favicon.ico +0 -0
  360. package/static/brand/favicon.svg +14 -0
  361. package/static/dist/FILES.txt +515 -0
  362. package/static/dist/assets/AppShell-gs0grlbs.js +1 -0
  363. package/static/dist/assets/ChatPage-gi1xlz52.js +18 -0
  364. package/static/dist/assets/ChatPage-gmu5c7lf.css +1 -0
  365. package/static/dist/assets/HubRoute-qs9vzuh0.js +2 -0
  366. package/static/dist/assets/InterVariable-nonokl6i.woff2 +0 -0
  367. package/static/dist/assets/KaTeX_AMS-Regular-e1why8ff.woff2 +0 -0
  368. package/static/dist/assets/KaTeX_AMS-Regular-mec5w1mt.woff +0 -0
  369. package/static/dist/assets/KaTeX_AMS-Regular-mos1wgtv.ttf +0 -0
  370. package/static/dist/assets/KaTeX_Caligraphic-Bold-axibvb5b.ttf +0 -0
  371. package/static/dist/assets/KaTeX_Caligraphic-Bold-eccvbn5c.woff +0 -0
  372. package/static/dist/assets/KaTeX_Caligraphic-Bold-n63xiolk.woff2 +0 -0
  373. package/static/dist/assets/KaTeX_Caligraphic-Regular-c5dvswgu.ttf +0 -0
  374. package/static/dist/assets/KaTeX_Caligraphic-Regular-iz5gexw5.woff +0 -0
  375. package/static/dist/assets/KaTeX_Caligraphic-Regular-npwmqylf.woff2 +0 -0
  376. package/static/dist/assets/KaTeX_Fraktur-Bold-ftsn4fxp.ttf +0 -0
  377. package/static/dist/assets/KaTeX_Fraktur-Bold-gokmhdpe.woff +0 -0
  378. package/static/dist/assets/KaTeX_Fraktur-Bold-ikhebgtj.woff2 +0 -0
  379. package/static/dist/assets/KaTeX_Fraktur-Regular-hzce8q9o.ttf +0 -0
  380. package/static/dist/assets/KaTeX_Fraktur-Regular-i0egury6.woff2 +0 -0
  381. package/static/dist/assets/KaTeX_Fraktur-Regular-okwm110b.woff +0 -0
  382. package/static/dist/assets/KaTeX_Main-Bold-c5g2m5kh.ttf +0 -0
  383. package/static/dist/assets/KaTeX_Main-Bold-ktk38ybk.woff2 +0 -0
  384. package/static/dist/assets/KaTeX_Main-Bold-ureqgmzo.woff +0 -0
  385. package/static/dist/assets/KaTeX_Main-BoldItalic-bd0upj71.woff +0 -0
  386. package/static/dist/assets/KaTeX_Main-BoldItalic-oj033t4i.woff2 +0 -0
  387. package/static/dist/assets/KaTeX_Main-BoldItalic-opttanob.ttf +0 -0
  388. package/static/dist/assets/KaTeX_Main-Italic-2p4bq1jf.woff2 +0 -0
  389. package/static/dist/assets/KaTeX_Main-Italic-dj86j9xo.ttf +0 -0
  390. package/static/dist/assets/KaTeX_Main-Italic-esmxqs8d.woff +0 -0
  391. package/static/dist/assets/KaTeX_Main-Regular-c978jrkj.ttf +0 -0
  392. package/static/dist/assets/KaTeX_Main-Regular-hbkzldb8.woff2 +0 -0
  393. package/static/dist/assets/KaTeX_Main-Regular-n865mmt0.woff +0 -0
  394. package/static/dist/assets/KaTeX_Math-BoldItalic-cbkxiib1.woff +0 -0
  395. package/static/dist/assets/KaTeX_Math-BoldItalic-hcom2j4y.ttf +0 -0
  396. package/static/dist/assets/KaTeX_Math-BoldItalic-jdo1yxu8.woff2 +0 -0
  397. package/static/dist/assets/KaTeX_Math-Italic-b5lfnctb.ttf +0 -0
  398. package/static/dist/assets/KaTeX_Math-Italic-cz4b2ure.woff2 +0 -0
  399. package/static/dist/assets/KaTeX_Math-Italic-lo894bvj.woff +0 -0
  400. package/static/dist/assets/KaTeX_SansSerif-Bold-h55uj19s.ttf +0 -0
  401. package/static/dist/assets/KaTeX_SansSerif-Bold-m9bkcp3c.woff +0 -0
  402. package/static/dist/assets/KaTeX_SansSerif-Bold-otxc8itm.woff2 +0 -0
  403. package/static/dist/assets/KaTeX_SansSerif-Italic-bp85cocg.ttf +0 -0
  404. package/static/dist/assets/KaTeX_SansSerif-Italic-g42k16nn.woff +0 -0
  405. package/static/dist/assets/KaTeX_SansSerif-Italic-k4kksncm.woff2 +0 -0
  406. package/static/dist/assets/KaTeX_SansSerif-Regular-evq9548m.ttf +0 -0
  407. package/static/dist/assets/KaTeX_SansSerif-Regular-izeggh93.woff +0 -0
  408. package/static/dist/assets/KaTeX_SansSerif-Regular-ltw53ck4.woff2 +0 -0
  409. package/static/dist/assets/KaTeX_Script-Regular-k8v4ghws.ttf +0 -0
  410. package/static/dist/assets/KaTeX_Script-Regular-o2nd302f.woff +0 -0
  411. package/static/dist/assets/KaTeX_Script-Regular-oybd33cp.woff2 +0 -0
  412. package/static/dist/assets/KaTeX_Size1-Regular-cjccv44r.woff2 +0 -0
  413. package/static/dist/assets/KaTeX_Size1-Regular-k13yopgz.woff +0 -0
  414. package/static/dist/assets/KaTeX_Size1-Regular-naiuhmx7.ttf +0 -0
  415. package/static/dist/assets/KaTeX_Size2-Regular-cnnxwlt7.woff +0 -0
  416. package/static/dist/assets/KaTeX_Size2-Regular-hlh6jazj.ttf +0 -0
  417. package/static/dist/assets/KaTeX_Size2-Regular-onxq3bzc.woff2 +0 -0
  418. package/static/dist/assets/KaTeX_Size3-Regular-i00haf83.woff +0 -0
  419. package/static/dist/assets/KaTeX_Size3-Regular-nk2kx36d.ttf +0 -0
  420. package/static/dist/assets/KaTeX_Size4-Regular-effsfy3y.woff +0 -0
  421. package/static/dist/assets/KaTeX_Size4-Regular-myjqyche.ttf +0 -0
  422. package/static/dist/assets/KaTeX_Size4-Regular-nv9nppzf.woff2 +0 -0
  423. package/static/dist/assets/KaTeX_Typewriter-Regular-iqvr3vwu.woff2 +0 -0
  424. package/static/dist/assets/KaTeX_Typewriter-Regular-kzj4h457.woff +0 -0
  425. package/static/dist/assets/KaTeX_Typewriter-Regular-owzsy8p5.ttf +0 -0
  426. package/static/dist/assets/Markdown-bt9bqd6a.js +598 -0
  427. package/static/dist/assets/Markdown-lwviulmg.css +1 -0
  428. package/static/dist/assets/RightPanel-dn19xu42.js +1 -0
  429. package/static/dist/assets/Select-y7wtf85g.js +1 -0
  430. package/static/dist/assets/SessionListPanel-igwdj9xr.js +1 -0
  431. package/static/dist/assets/SettingsLayout-n6mu0ghg.js +1 -0
  432. package/static/dist/assets/States-oil2issf.js +1 -0
  433. package/static/dist/assets/Toaster-jtn59pjm.js +1 -0
  434. package/static/dist/assets/_app-k4jrkgfa.js +1 -0
  435. package/static/dist/assets/_app.ext._extensionId-mmf1mepm.js +1 -0
  436. package/static/dist/assets/_app.index-mb41nf00.js +1 -0
  437. package/static/dist/assets/_app.insights-mz5cep8m.js +1 -0
  438. package/static/dist/assets/_app.kanban-ocgw506i.js +1 -0
  439. package/static/dist/assets/_app.logs-lstmoju6.js +1 -0
  440. package/static/dist/assets/_app.memory-dishj9ra.js +1 -0
  441. package/static/dist/assets/_app.profiles-dynpvsio.js +1 -0
  442. package/static/dist/assets/_app.session._sessionId-kevi4qd2.js +1 -0
  443. package/static/dist/assets/_app.settings-c2czm9v4.js +1 -0
  444. package/static/dist/assets/_app.settings._section-exwflld7.js +1 -0
  445. package/static/dist/assets/_app.skills-j5jh2nug.js +1 -0
  446. package/static/dist/assets/_app.tasks-b99d98fo.js +2 -0
  447. package/static/dist/assets/_app.todos-ma8urvn3.js +1 -0
  448. package/static/dist/assets/_app.workspaces-l86cxeod.js +1 -0
  449. package/static/dist/assets/abap-ij37pki6.js +1 -0
  450. package/static/dist/assets/abnfDiagram-VCTEODGH-hvrr25lb.js +1 -0
  451. package/static/dist/assets/actionscript-3-dz7y3j1x.js +1 -0
  452. package/static/dist/assets/ada-k9zgv987.js +1 -0
  453. package/static/dist/assets/andromeeda-c2n0n86o.js +1 -0
  454. package/static/dist/assets/angular-html-nu6l31w3.js +1 -0
  455. package/static/dist/assets/angular-ts-fbx4f8mm.js +1 -0
  456. package/static/dist/assets/apache-binppq6z.js +1 -0
  457. package/static/dist/assets/apex-h8illjly.js +1 -0
  458. package/static/dist/assets/apl-bx2xr7dh.js +1 -0
  459. package/static/dist/assets/applescript-h0ok5sww.js +1 -0
  460. package/static/dist/assets/ara-dlpjioua.js +1 -0
  461. package/static/dist/assets/arc-7popfhbk.js +1 -0
  462. package/static/dist/assets/architecture-7GRP2DOG-mqft9w2p.js +1 -0
  463. package/static/dist/assets/architectureDiagram-5GKGNRK7-b3r0z8sq.js +36 -0
  464. package/static/dist/assets/array-f36850hm.js +1 -0
  465. package/static/dist/assets/asciidoc-lx0cuujr.js +1 -0
  466. package/static/dist/assets/asm-j5diz3sz.js +1 -0
  467. package/static/dist/assets/astro-g77i97cb.js +1 -0
  468. package/static/dist/assets/aurora-x-h2hngdsl.js +1 -0
  469. package/static/dist/assets/awk-fecghegf.js +1 -0
  470. package/static/dist/assets/ayu-dark-nvvuggz9.js +1 -0
  471. package/static/dist/assets/ayu-light-k5fxgplt.js +1 -0
  472. package/static/dist/assets/ayu-mirage-gltrvhcx.js +1 -0
  473. package/static/dist/assets/ballerina-hk9oga18.js +1 -0
  474. package/static/dist/assets/bat-ghs7lag5.js +1 -0
  475. package/static/dist/assets/beancount-pc6q2dmq.js +1 -0
  476. package/static/dist/assets/berry-l96jp8n4.js +1 -0
  477. package/static/dist/assets/bibtex-jxn7maz2.js +1 -0
  478. package/static/dist/assets/bicep-i1yv3ngd.js +1 -0
  479. package/static/dist/assets/bird2-k3aagqn0.js +1 -0
  480. package/static/dist/assets/blade-boo0u92y.js +1 -0
  481. package/static/dist/assets/blockDiagram-I7D4REHJ-hd3gw0cj.js +129 -0
  482. package/static/dist/assets/bsl-f8m1ja7w.js +1 -0
  483. package/static/dist/assets/c-cat0w3sc.js +1 -0
  484. package/static/dist/assets/c3-j6ile59o.js +1 -0
  485. package/static/dist/assets/c4Diagram-7LVT6UL2-jlmbjiji.js +38 -0
  486. package/static/dist/assets/cadence-e3x2pgsu.js +1 -0
  487. package/static/dist/assets/cairo-mblac9dt.js +1 -0
  488. package/static/dist/assets/catppuccin-frappe-dj7qsd4s.js +1 -0
  489. package/static/dist/assets/catppuccin-latte-oh2bx7qn.js +1 -0
  490. package/static/dist/assets/catppuccin-macchiato-m3xyazph.js +1 -0
  491. package/static/dist/assets/catppuccin-mocha-m3rjj89j.js +1 -0
  492. package/static/dist/assets/channel-ix8cxdld.js +1 -0
  493. package/static/dist/assets/chunk-2Q5K7J3B-k08c29qw.js +1 -0
  494. package/static/dist/assets/chunk-4HAMMTFA-oydbpsin.js +62 -0
  495. package/static/dist/assets/chunk-5VM5RSS4-br0zxsux.js +15 -0
  496. package/static/dist/assets/chunk-75Z2AOVW-j633otj1.js +2 -0
  497. package/static/dist/assets/chunk-DU6HZSFF-ods2l027.js +128 -0
  498. package/static/dist/assets/chunk-F27PBJKO-ln4n2cwt.js +1 -0
  499. package/static/dist/assets/chunk-FOHPRMQF-opuflp73.js +161 -0
  500. package/static/dist/assets/chunk-GMAD6QVW-fpz133eh.js +72 -0
  501. package/static/dist/assets/chunk-GVQU2GXP-abs9ixiy.js +1 -0
  502. package/static/dist/assets/chunk-IMKFNOWR-j9vukdy1.js +231 -0
  503. package/static/dist/assets/chunk-JWPE2WC7-mw03m5s9.js +1 -0
  504. package/static/dist/assets/chunk-L3NEJ4N5-cfyw87r3.js +1 -0
  505. package/static/dist/assets/chunk-OSK3NFVY-baja78wr.js +10 -0
  506. package/static/dist/assets/chunk-P2QGCYS3-g66xby8h.js +1 -0
  507. package/static/dist/assets/chunk-POPQ4Y6H-osqu864t.js +1 -0
  508. package/static/dist/assets/chunk-PWAF6VOD-egejasv1.js +1 -0
  509. package/static/dist/assets/chunk-SHT3W25Y-l014h8zz.js +168 -0
  510. package/static/dist/assets/chunk-SVP7TREG-n3z10bp3.js +88 -0
  511. package/static/dist/assets/chunk-TICWLB2K-bzozkjc0.js +206 -0
  512. package/static/dist/assets/chunk-XXDRQBXY-n40pf9vy.js +1 -0
  513. package/static/dist/assets/chunk-Y2CYZVJY-n9gs7k4d.js +1 -0
  514. package/static/dist/assets/clarity-bdn1d8fx.js +1 -0
  515. package/static/dist/assets/classDiagram-ZZMXUADV-c210y3il.js +1 -0
  516. package/static/dist/assets/classDiagram-v2-VYDZK3BY-c210y3il.js +1 -0
  517. package/static/dist/assets/clojure-n5b9o4lq.js +1 -0
  518. package/static/dist/assets/cmake-f68p68h5.js +1 -0
  519. package/static/dist/assets/cobol-go622aep.js +1 -0
  520. package/static/dist/assets/codeowners-lgfjmw2s.js +1 -0
  521. package/static/dist/assets/codeql-cojlysyb.js +1 -0
  522. package/static/dist/assets/coffee-jwo1xjhq.js +1 -0
  523. package/static/dist/assets/common-lisp-ko58h8pe.js +1 -0
  524. package/static/dist/assets/copied-cjsttec1.js +1 -0
  525. package/static/dist/assets/coq-gns70ukp.js +1 -0
  526. package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +1 -0
  527. package/static/dist/assets/cpp-nre7j0kq.js +1 -0
  528. package/static/dist/assets/crystal-lviso2je.js +1 -0
  529. package/static/dist/assets/csharp-kkz9hcxp.js +1 -0
  530. package/static/dist/assets/css-ywz9j4hb.js +1 -0
  531. package/static/dist/assets/csv-ol0sxk26.js +1 -0
  532. package/static/dist/assets/cue-h5naoluy.js +1 -0
  533. package/static/dist/assets/cynefin-OW5HDTMX-elpt7h1j.js +1 -0
  534. package/static/dist/assets/cynefinDiagram-5FMLGOSQ-5mzl5pi2.js +62 -0
  535. package/static/dist/assets/cypher-j2an42no.js +1 -0
  536. package/static/dist/assets/cytoscape.esm-bqu53u12.js +321 -0
  537. package/static/dist/assets/d-crxkca3p.js +1 -0
  538. package/static/dist/assets/dagre-GXQ25YYZ-ihwlhmfl.js +4 -0
  539. package/static/dist/assets/dagre-lkoknbjn.js +1 -0
  540. package/static/dist/assets/dark-plus-kin19s9x.js +1 -0
  541. package/static/dist/assets/dart-nsg0xvqh.js +1 -0
  542. package/static/dist/assets/dax-f82777dv.js +1 -0
  543. package/static/dist/assets/defaultLocale-eeoev87l.js +1 -0
  544. package/static/dist/assets/desktop-nvg88bea.js +1 -0
  545. package/static/dist/assets/diagram-S7CK7UJ4-4z90agaz.js +30 -0
  546. package/static/dist/assets/diagram-UQ7AKVKN-eifw0lg7.js +41 -0
  547. package/static/dist/assets/diagram-VSXAHHWV-ksh3sjqv.js +3 -0
  548. package/static/dist/assets/diagram-VX7I27RA-ett72f71.js +24 -0
  549. package/static/dist/assets/diagram-Z3DM3KII-l8scp8nu.js +24 -0
  550. package/static/dist/assets/diff-c5xjoml2.js +1 -0
  551. package/static/dist/assets/dist-c4c2m3kv.js +1 -0
  552. package/static/dist/assets/docker-s0pf2u92.js +1 -0
  553. package/static/dist/assets/dotenv-d2gvqxc1.js +1 -0
  554. package/static/dist/assets/dracula-eicfho73.js +1 -0
  555. package/static/dist/assets/dracula-soft-doslejd2.js +1 -0
  556. package/static/dist/assets/dream-maker-mz8d3pqb.js +1 -0
  557. package/static/dist/assets/ebnfDiagram-PWID7BFC-f0pxcmit.js +1 -0
  558. package/static/dist/assets/edge-dvv35byi.js +1 -0
  559. package/static/dist/assets/elixir-i2f1ki1g.js +1 -0
  560. package/static/dist/assets/elm-cpepyjm4.js +1 -0
  561. package/static/dist/assets/emacs-lisp-lhl63kmy.js +1 -0
  562. package/static/dist/assets/endpoints-ipnv1hd4.js +64 -0
  563. package/static/dist/assets/erDiagram-RLTQ6QDP-f47m5xh0.js +99 -0
  564. package/static/dist/assets/erb-idlyfheg.js +1 -0
  565. package/static/dist/assets/erlang-kbk8e1kh.js +1 -0
  566. package/static/dist/assets/eventmodeling-NTZA5JFV-d9b5a0ia.js +1 -0
  567. package/static/dist/assets/everforest-dark-cv4maom7.js +1 -0
  568. package/static/dist/assets/everforest-light-njdw7fx6.js +1 -0
  569. package/static/dist/assets/fennel-mm8r79co.js +1 -0
  570. package/static/dist/assets/fish-em0xdaat.js +1 -0
  571. package/static/dist/assets/flowDiagram-HODETNUW-kfxxsyrk.js +1 -0
  572. package/static/dist/assets/fluent-kzq1mil2.js +1 -0
  573. package/static/dist/assets/fortran-fixed-form-lwddxd99.js +1 -0
  574. package/static/dist/assets/fortran-free-form-jao3bzvo.js +1 -0
  575. package/static/dist/assets/fsharp-ouam7w4k.js +1 -0
  576. package/static/dist/assets/ganttDiagram-EL5Y4UJY-bmktjdi0.js +292 -0
  577. package/static/dist/assets/gdresource-gawivel9.js +1 -0
  578. package/static/dist/assets/gdscript-kcamxf4c.js +1 -0
  579. package/static/dist/assets/gdshader-hx54new5.js +1 -0
  580. package/static/dist/assets/genie-i5n3m91v.js +1 -0
  581. package/static/dist/assets/gherkin-lxn181dy.js +1 -0
  582. package/static/dist/assets/git-commit-e6qgtuh5.js +1 -0
  583. package/static/dist/assets/git-rebase-d9lpfpbn.js +1 -0
  584. package/static/dist/assets/gitGraph-4MIJSDKK-j2ueg258.js +1 -0
  585. package/static/dist/assets/gitGraphDiagram-WWUBYQGX-ms6586v9.js +106 -0
  586. package/static/dist/assets/github-dark-default-m0qs6qki.js +1 -0
  587. package/static/dist/assets/github-dark-dimmed-g0vz4qee.js +1 -0
  588. package/static/dist/assets/github-dark-high-contrast-hugubo52.js +1 -0
  589. package/static/dist/assets/github-dark-ljlyim8s.js +1 -0
  590. package/static/dist/assets/github-light-default-fgfak5mv.js +1 -0
  591. package/static/dist/assets/github-light-high-contrast-hka6wb3r.js +1 -0
  592. package/static/dist/assets/github-light-jhyi45t4.js +1 -0
  593. package/static/dist/assets/gleam-ix1dym3g.js +1 -0
  594. package/static/dist/assets/glimmer-js-39i0urfb.js +1 -0
  595. package/static/dist/assets/glimmer-ts-gdtd6n73.js +1 -0
  596. package/static/dist/assets/glsl-o1djm5pp.js +1 -0
  597. package/static/dist/assets/gn-cbzhsgl9.js +1 -0
  598. package/static/dist/assets/gnuplot-dr8f9gvm.js +1 -0
  599. package/static/dist/assets/go-enhtrrw8.js +1 -0
  600. package/static/dist/assets/graphlib-mrng1xrk.js +1 -0
  601. package/static/dist/assets/graphql-kj6rz55t.js +1 -0
  602. package/static/dist/assets/groovy-jff59t9e.js +1 -0
  603. package/static/dist/assets/gruvbox-dark-hard-lgsj7y5r.js +1 -0
  604. package/static/dist/assets/gruvbox-dark-medium-ezt86wrc.js +1 -0
  605. package/static/dist/assets/gruvbox-dark-soft-1a3jfdlm.js +1 -0
  606. package/static/dist/assets/gruvbox-light-hard-d82lddjc.js +1 -0
  607. package/static/dist/assets/gruvbox-light-medium-d3ffitv3.js +1 -0
  608. package/static/dist/assets/gruvbox-light-soft-e5gf7i2q.js +1 -0
  609. package/static/dist/assets/hack-pe1qqr2i.js +1 -0
  610. package/static/dist/assets/haml-cknnbcqs.js +1 -0
  611. package/static/dist/assets/handlebars-hwq64orh.js +1 -0
  612. package/static/dist/assets/haskell-o7nor2z2.js +1 -0
  613. package/static/dist/assets/haxe-4rwdh42h.js +1 -0
  614. package/static/dist/assets/hcl-nnng763h.js +1 -0
  615. package/static/dist/assets/highlighted-body-KPVGNVTW-ev52d2si.js +1 -0
  616. package/static/dist/assets/hjson-kscwmuzk.js +1 -0
  617. package/static/dist/assets/hlsl-kopkvwox.js +1 -0
  618. package/static/dist/assets/horizon-bright-gn4aqinx.js +1 -0
  619. package/static/dist/assets/horizon-h5nzrwlb.js +1 -0
  620. package/static/dist/assets/houston-kifsbmbx.js +1 -0
  621. package/static/dist/assets/html-derivative-h2i2pyjc.js +1 -0
  622. package/static/dist/assets/html-ha05xtvt.js +1 -0
  623. package/static/dist/assets/http-cf94zu27.js +1 -0
  624. package/static/dist/assets/hurl-lslax568.js +1 -0
  625. package/static/dist/assets/hxml-g52gxet6.js +1 -0
  626. package/static/dist/assets/hy-jc9www1l.js +1 -0
  627. package/static/dist/assets/imba-n9x1ej2f.js +1 -0
  628. package/static/dist/assets/index-bz7g7rhx.css +2 -0
  629. package/static/dist/assets/index-hywfjw88.js +11 -0
  630. package/static/dist/assets/info-A6RAGUB7-j717vyt7.js +1 -0
  631. package/static/dist/assets/infoDiagram-27XIBGKW-dsbpib36.js +2 -0
  632. package/static/dist/assets/ini-hg6eosim.js +1 -0
  633. package/static/dist/assets/init-ljpdkjra.js +1 -0
  634. package/static/dist/assets/ishikawaDiagram-5VMMS53U-n0sz3i2d.js +70 -0
  635. package/static/dist/assets/java-ndjf2o89.js +1 -0
  636. package/static/dist/assets/javascript-coftlwy3.js +1 -0
  637. package/static/dist/assets/jinja-etei9wy7.js +1 -0
  638. package/static/dist/assets/jison-hyekgft1.js +1 -0
  639. package/static/dist/assets/journeyDiagram-3NMN7TZE-mcxz1mme.js +139 -0
  640. package/static/dist/assets/json-lok0yaho.js +1 -0
  641. package/static/dist/assets/json5-e4tr07tg.js +1 -0
  642. package/static/dist/assets/jsonc-jbmkhoep.js +1 -0
  643. package/static/dist/assets/jsonl-j35ke6at.js +1 -0
  644. package/static/dist/assets/jsonnet-iewuy86o.js +1 -0
  645. package/static/dist/assets/jssm-m1449zlc.js +1 -0
  646. package/static/dist/assets/jsx-b64w0nbx.js +1 -0
  647. package/static/dist/assets/jsx-runtime-eu92a5pu.js +1 -0
  648. package/static/dist/assets/julia-jxxzz2yn.js +1 -0
  649. package/static/dist/assets/just-mc29iw9t.js +1 -0
  650. package/static/dist/assets/kanagawa-dragon-i9mmmgud.js +1 -0
  651. package/static/dist/assets/kanagawa-lotus-ev5oro17.js +1 -0
  652. package/static/dist/assets/kanagawa-wave-i06560uw.js +1 -0
  653. package/static/dist/assets/kanban-definition-UXKFOSKX-n6hq2lyc.js +89 -0
  654. package/static/dist/assets/kdl-kgzv1x9e.js +1 -0
  655. package/static/dist/assets/kotlin-nmx05b3f.js +1 -0
  656. package/static/dist/assets/kusto-fawmdms4.js +1 -0
  657. package/static/dist/assets/laserwave-goebpayr.js +1 -0
  658. package/static/dist/assets/latex-pafa03ft.js +1 -0
  659. package/static/dist/assets/lazyRouteComponent-faquioun.js +1 -0
  660. package/static/dist/assets/lean-jom31nm3.js +1 -0
  661. package/static/dist/assets/less-mwvscr3d.js +1 -0
  662. package/static/dist/assets/light-plus-mws1g85f.js +1 -0
  663. package/static/dist/assets/line-h5xq20s4.js +1 -0
  664. package/static/dist/assets/linear-becwlnhk.js +1 -0
  665. package/static/dist/assets/link-ib4prsn5.js +1 -0
  666. package/static/dist/assets/liquid-hz5c2pov.js +1 -0
  667. package/static/dist/assets/llvm-j5wmr3g9.js +1 -0
  668. package/static/dist/assets/log-eur4gurm.js +1 -0
  669. package/static/dist/assets/login-mvjys1ol.js +1 -0
  670. package/static/dist/assets/logo-j3h8r0pu.js +1 -0
  671. package/static/dist/assets/lua-leyf8mlb.js +1 -0
  672. package/static/dist/assets/luau-im5d6q8k.js +1 -0
  673. package/static/dist/assets/make-npl27xqy.js +1 -0
  674. package/static/dist/assets/markdown-fibv6lrm.js +1 -0
  675. package/static/dist/assets/marko-cn1fzpdv.js +1 -0
  676. package/static/dist/assets/matchContext-f8oy3lo7.js +1 -0
  677. package/static/dist/assets/material-theme-darker-dhm8zmok.js +1 -0
  678. package/static/dist/assets/material-theme-gdimc61s.js +1 -0
  679. package/static/dist/assets/material-theme-lighter-c1fszbb2.js +1 -0
  680. package/static/dist/assets/material-theme-ocean-iakojpmy.js +1 -0
  681. package/static/dist/assets/material-theme-palenight-hgxmykmi.js +1 -0
  682. package/static/dist/assets/matlab-o6nvvbf2.js +1 -0
  683. package/static/dist/assets/mdc-huhy88df.js +1 -0
  684. package/static/dist/assets/mdx-mmgeh26h.js +1 -0
  685. package/static/dist/assets/mermaid-HWGCJPDP-gmnkgf1n.js +1 -0
  686. package/static/dist/assets/mermaid-f9ad87lb.js +1 -0
  687. package/static/dist/assets/mermaid-parser.core-n9cuu5ue.js +7 -0
  688. package/static/dist/assets/min-dark-e5sicuw2.js +1 -0
  689. package/static/dist/assets/min-light-gst87fvf.js +1 -0
  690. package/static/dist/assets/mindmap-definition-YA3MSWOX-gta3u7z4.js +96 -0
  691. package/static/dist/assets/mipsasm-etoqqos6.js +1 -0
  692. package/static/dist/assets/mojo-fyyk0b1z.js +1 -0
  693. package/static/dist/assets/monokai-jl389a9o.js +1 -0
  694. package/static/dist/assets/moonbit-je86hbgx.js +1 -0
  695. package/static/dist/assets/move-g7w7k042.js +1 -0
  696. package/static/dist/assets/narrat-d1cszt6i.js +1 -0
  697. package/static/dist/assets/nextflow-fpd3eqgm.js +1 -0
  698. package/static/dist/assets/nextflow-groovy-nc95p6pm.js +1 -0
  699. package/static/dist/assets/nginx-e7lvhsmn.js +1 -0
  700. package/static/dist/assets/night-owl-light-b2j1bc8t.js +1 -0
  701. package/static/dist/assets/night-owl-nm3cgqfv.js +1 -0
  702. package/static/dist/assets/nim-dun5d8mk.js +1 -0
  703. package/static/dist/assets/nix-sxazvl0w.js +1 -0
  704. package/static/dist/assets/nord-jiiendyo.js +1 -0
  705. package/static/dist/assets/not-found-ccnnac39.js +1 -0
  706. package/static/dist/assets/nushell-nbi9xmdg.js +1 -0
  707. package/static/dist/assets/objective-c-oshe4ycx.js +1 -0
  708. package/static/dist/assets/objective-cpp-go29ofq1.js +1 -0
  709. package/static/dist/assets/ocaml-56kivtnr.js +1 -0
  710. package/static/dist/assets/odin-g772bhi5.js +1 -0
  711. package/static/dist/assets/onboarding-l6quy6gz.js +1 -0
  712. package/static/dist/assets/one-dark-pro-ext74l87.js +1 -0
  713. package/static/dist/assets/one-light-o5mlsn8i.js +1 -0
  714. package/static/dist/assets/openscad-e9e9mfyg.js +1 -0
  715. package/static/dist/assets/ordinal-d88pfdla.js +1 -0
  716. package/static/dist/assets/packet-AYTQ26CC-bpzuq5n6.js +1 -0
  717. package/static/dist/assets/pascal-dmg2rs6d.js +1 -0
  718. package/static/dist/assets/passkeys-ktie3sr0.js +1 -0
  719. package/static/dist/assets/path-b509aej0.js +1 -0
  720. package/static/dist/assets/pegDiagram-XKGWAZYB-juye13e5.js +1 -0
  721. package/static/dist/assets/perl-bj3oqtet.js +1 -0
  722. package/static/dist/assets/php-buzp12r0.js +1 -0
  723. package/static/dist/assets/pie-WAS4IAKB-odhb8buq.js +1 -0
  724. package/static/dist/assets/pieDiagram-E7YTZNPT-mgb14ksh.js +39 -0
  725. package/static/dist/assets/pkl-co2grztk.js +1 -0
  726. package/static/dist/assets/plastic-mm7c7uq7.js +1 -0
  727. package/static/dist/assets/plsql-l0i9f33n.js +1 -0
  728. package/static/dist/assets/po-f3ga9osn.js +1 -0
  729. package/static/dist/assets/poimandres-mnwq5v4d.js +1 -0
  730. package/static/dist/assets/polar-ldicpe6g.js +1 -0
  731. package/static/dist/assets/postcss-fgpvnt75.js +1 -0
  732. package/static/dist/assets/powerquery-mflxo46x.js +1 -0
  733. package/static/dist/assets/powershell-oado4mxi.js +1 -0
  734. package/static/dist/assets/prepaint-f14kbd49.js +21 -0
  735. package/static/dist/assets/prisma-go1e7wq8.js +1 -0
  736. package/static/dist/assets/prolog-cbjal8aj.js +1 -0
  737. package/static/dist/assets/proto-lrhov7xc.js +1 -0
  738. package/static/dist/assets/pug-mjad7he9.js +1 -0
  739. package/static/dist/assets/puppet-h22szrmn.js +1 -0
  740. package/static/dist/assets/purescript-dwpj7hdb.js +1 -0
  741. package/static/dist/assets/python-b767fgue.js +1 -0
  742. package/static/dist/assets/qml-d1gdp10s.js +1 -0
  743. package/static/dist/assets/qmldir-lsawched.js +1 -0
  744. package/static/dist/assets/qss-lyvmg4f4.js +1 -0
  745. package/static/dist/assets/quadrantDiagram-AXDQQJYC-cg36naog.js +7 -0
  746. package/static/dist/assets/r-o3r9c7ao.js +1 -0
  747. package/static/dist/assets/racket-nbfqjw5h.js +1 -0
  748. package/static/dist/assets/radar-RG4KPBEZ-lgzfpnef.js +1 -0
  749. package/static/dist/assets/railroad-74A4TZTK-gmglc3ua.js +1 -0
  750. package/static/dist/assets/railroad-abnf-HS5TGJTU-5mjl5wpv.js +1 -0
  751. package/static/dist/assets/railroad-ebnf-LZEXJU2U-bfram8v8.js +1 -0
  752. package/static/dist/assets/railroad-peg-WCYAUIDC-nwfczn88.js +1 -0
  753. package/static/dist/assets/railroadDiagram-O6MQD6OU-cmxwjt73.js +1 -0
  754. package/static/dist/assets/raku-hcy6uwm6.js +1 -0
  755. package/static/dist/assets/razor-ilc585yr.js +1 -0
  756. package/static/dist/assets/red-if4jt303.js +1 -0
  757. package/static/dist/assets/refresh-cw-mf192q3f.js +1 -0
  758. package/static/dist/assets/reg-ivi9d1my.js +1 -0
  759. package/static/dist/assets/regexp-mpjtcvwm.js +1 -0
  760. package/static/dist/assets/rel-gqpkg3ta.js +1 -0
  761. package/static/dist/assets/requirementDiagram-BXWQKSXE-ir0s2mek.js +84 -0
  762. package/static/dist/assets/riscv-j1f2yjp2.js +1 -0
  763. package/static/dist/assets/rolldown-runtime-b9miacsj.js +1 -0
  764. package/static/dist/assets/ron-bjqasg78.js +1 -0
  765. package/static/dist/assets/root-mbklpuv4.js +1 -0
  766. package/static/dist/assets/rose-pine-dawn-nlpzqzob.js +1 -0
  767. package/static/dist/assets/rose-pine-grpwpg67.js +1 -0
  768. package/static/dist/assets/rose-pine-moon-b9yyevxr.js +1 -0
  769. package/static/dist/assets/rosmsg-hv3wcot6.js +1 -0
  770. package/static/dist/assets/rough.esm-on4k4je3.js +1 -0
  771. package/static/dist/assets/rst-jrkwjdyi.js +1 -0
  772. package/static/dist/assets/ruby-n4tjcbpz.js +1 -0
  773. package/static/dist/assets/rust-jqduclx1.js +1 -0
  774. package/static/dist/assets/sankeyDiagram-P5KCCOFB-jo7jcdq0.js +40 -0
  775. package/static/dist/assets/sas-hjo6y93k.js +1 -0
  776. package/static/dist/assets/sass-m1yncbwu.js +1 -0
  777. package/static/dist/assets/saved-g777hp1t.js +1 -0
  778. package/static/dist/assets/scala-l9ahg4e9.js +1 -0
  779. package/static/dist/assets/scheme-mlodf39l.js +1 -0
  780. package/static/dist/assets/scss-ncidjv48.js +1 -0
  781. package/static/dist/assets/sdbl-bwg2t5pt.js +1 -0
  782. package/static/dist/assets/search-i2kfogyx.js +1 -0
  783. package/static/dist/assets/sequenceDiagram-WJ2MYXX4-n0pf6xk5.js +162 -0
  784. package/static/dist/assets/settings_section_extensions_title-hgvh507l.js +1 -0
  785. package/static/dist/assets/shaderlab-be89ch6g.js +1 -0
  786. package/static/dist/assets/share._token-il3y6js2.js +2 -0
  787. package/static/dist/assets/shellscript-m8whjpqd.js +1 -0
  788. package/static/dist/assets/shellsession-i5bj6syz.js +1 -0
  789. package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +1 -0
  790. package/static/dist/assets/slack-dark-ny9l0r7b.js +1 -0
  791. package/static/dist/assets/slack-ochin-g98102hs.js +1 -0
  792. package/static/dist/assets/sliders-horizontal-kd99ffvl.js +1 -0
  793. package/static/dist/assets/smalltalk-g9lpwisn.js +1 -0
  794. package/static/dist/assets/snazzy-light-dlu9q2m5.js +1 -0
  795. package/static/dist/assets/solarized-dark-mx1nd4sm.js +1 -0
  796. package/static/dist/assets/solarized-light-mqzd33fz.js +1 -0
  797. package/static/dist/assets/solidity-ih313ji4.js +1 -0
  798. package/static/dist/assets/soy-hhh36ysq.js +1 -0
  799. package/static/dist/assets/sparql-pewjbauq.js +1 -0
  800. package/static/dist/assets/splunk-d8q89juf.js +1 -0
  801. package/static/dist/assets/sql-j21bzcl6.js +1 -0
  802. package/static/dist/assets/src-hjyib4mu.js +1 -0
  803. package/static/dist/assets/ssh-config-fzxlymn8.js +1 -0
  804. package/static/dist/assets/stata-bbu2onh1.js +1 -0
  805. package/static/dist/assets/stateDiagram-D77RDMKH-olbrwyv9.js +1 -0
  806. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-dnzlmdpu.js +1 -0
  807. package/static/dist/assets/stylus-hifjg0ye.js +1 -0
  808. package/static/dist/assets/surrealql-l5vczuco.js +1 -0
  809. package/static/dist/assets/svelte-idn422g6.js +1 -0
  810. package/static/dist/assets/swift-n11rc3v3.js +1 -0
  811. package/static/dist/assets/swimlanes-42K2YHIH-od14zrw6.js +1 -0
  812. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ck0eqqdp.js +8 -0
  813. package/static/dist/assets/synthwave-84-clkt7319.js +1 -0
  814. package/static/dist/assets/system-verilog-l8k1po2l.js +1 -0
  815. package/static/dist/assets/systemd-d1zoxedb.js +1 -0
  816. package/static/dist/assets/talonscript-j9gt5qb1.js +1 -0
  817. package/static/dist/assets/tasl-meer3lyk.js +1 -0
  818. package/static/dist/assets/tcl-jdc54rsg.js +1 -0
  819. package/static/dist/assets/templ-e22qou3c.js +1 -0
  820. package/static/dist/assets/terraform-oav3wzsy.js +1 -0
  821. package/static/dist/assets/tex-deqpc5ee.js +1 -0
  822. package/static/dist/assets/timeline-definition-24CTP7MA-l0qokmnb.js +120 -0
  823. package/static/dist/assets/todoStore-la6uyqzj.js +1 -0
  824. package/static/dist/assets/tokyo-night-cnyqlmc2.js +1 -0
  825. package/static/dist/assets/toml-jj1ee1k1.js +1 -0
  826. package/static/dist/assets/trash-bxz1k9cw.js +1 -0
  827. package/static/dist/assets/treeView-Q6P3EWNA-hma3ip8m.js +1 -0
  828. package/static/dist/assets/treemap-WGGIJYW6-bghjng5m.js +1 -0
  829. package/static/dist/assets/ts-tags-ctnibc27.js +1 -0
  830. package/static/dist/assets/tsv-cxbgj4wh.js +1 -0
  831. package/static/dist/assets/tsx-i163n32g.js +1 -0
  832. package/static/dist/assets/turtle-g1kfgpwv.js +1 -0
  833. package/static/dist/assets/twig-x0fi7wm8.js +1 -0
  834. package/static/dist/assets/typescript-g18c34xz.js +1 -0
  835. package/static/dist/assets/typespec-hokgy7ic.js +1 -0
  836. package/static/dist/assets/typst-l6lt2vta.js +1 -0
  837. package/static/dist/assets/untitled-nfaw0q7m.js +1 -0
  838. package/static/dist/assets/useForm-k7fj2zsr.js +1 -0
  839. package/static/dist/assets/useLocale-evhacmv2.js +1 -0
  840. package/static/dist/assets/useParams-gpbjxj8s.js +1 -0
  841. package/static/dist/assets/useSearch-bhdptos7.js +1 -0
  842. package/static/dist/assets/useSelector-f2aak1ol.js +1 -0
  843. package/static/dist/assets/v-lwnsi8rl.js +1 -0
  844. package/static/dist/assets/vala-db1h2kp7.js +1 -0
  845. package/static/dist/assets/vb-nrezymby.js +1 -0
  846. package/static/dist/assets/vennDiagram-4TSXK5OY-bo97zf3z.js +34 -0
  847. package/static/dist/assets/verilog-jworpiw4.js +1 -0
  848. package/static/dist/assets/vesper-o1vwtlg2.js +1 -0
  849. package/static/dist/assets/vhdl-gnn4vfnm.js +1 -0
  850. package/static/dist/assets/viml-ogfqutxv.js +1 -0
  851. package/static/dist/assets/vitesse-black-b5y62t71.js +1 -0
  852. package/static/dist/assets/vitesse-dark-fj1ju380.js +1 -0
  853. package/static/dist/assets/vitesse-light-bjycd3ha.js +1 -0
  854. package/static/dist/assets/vue-html-nskj3du0.js +1 -0
  855. package/static/dist/assets/vue-mwu5l1bb.js +1 -0
  856. package/static/dist/assets/vue-vine-cqe77smq.js +1 -0
  857. package/static/dist/assets/vyper-jsmo764l.js +1 -0
  858. package/static/dist/assets/wardley-WFR3VGLG-pbjl6jav.js +1 -0
  859. package/static/dist/assets/wardleyDiagram-VM6X3IG4-bmy9i09l.js +78 -0
  860. package/static/dist/assets/wasm-g1zrybde.js +1 -0
  861. package/static/dist/assets/wasm-gezzbmz0.js +1 -0
  862. package/static/dist/assets/wenyan-lgcd7t1n.js +1 -0
  863. package/static/dist/assets/wgsl-gotoh48n.js +1 -0
  864. package/static/dist/assets/wikitext-j1379ez7.js +1 -0
  865. package/static/dist/assets/wit-neu67rwu.js +1 -0
  866. package/static/dist/assets/wolfram-mbb1p6oi.js +1 -0
  867. package/static/dist/assets/xml-gau7gvrv.js +1 -0
  868. package/static/dist/assets/xsl-ew09zq8b.js +1 -0
  869. package/static/dist/assets/xychartDiagram-S5SC5T6Z-eercu0mc.js +7 -0
  870. package/static/dist/assets/yaml-ofnrxtvf.js +1 -0
  871. package/static/dist/assets/zenscript-ge1h0r83.js +1 -0
  872. package/static/dist/assets/zig-ik06evde.js +1 -0
  873. package/static/dist/extension-sdk.js +1 -0
  874. package/static/dist/index.html +1 -0
  875. package/static/dist/manifest.webmanifest +29 -0
  876. package/static/dist/sw.js +944 -0
@@ -0,0 +1,791 @@
1
+ """``chat.*``, ``approval.*``, ``clarify.*``: one Agent turn per ``chat.start`` call.
2
+
3
+ The server owns the WebUI session (transcript merge, journals, SSE fan-out);
4
+ the sidecar owns the ``AIAgent`` instance. ``chat.start`` streams the Agent's
5
+ callbacks as frames and returns the settled result. Approval and clarify
6
+ prompts block the Agent thread until the server relays the user's answer
7
+ through ``approval.respond`` / ``clarify.respond``; ``rpc.cancel`` or
8
+ ``chat.interrupt`` stop the turn (``api/streaming.py`` in the Python backend).
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import contextlib
14
+ import hashlib
15
+ import inspect
16
+ import json
17
+ import logging
18
+ import threading
19
+ import time
20
+ import uuid
21
+ from collections import OrderedDict
22
+ from typing import Any
23
+
24
+ from ..errors import InvalidParams, RpcError
25
+ from ..home import profile_home_param, scoped_home
26
+ from ..rpc import CallContext
27
+
28
+ log = logging.getLogger("talaria_sidecar.chat")
29
+
30
+ _AGENT_CACHE_MAX = 32
31
+ _TOOL_RESULT_SNIPPET_MAX = 4000
32
+ # Predecessor ``_TOOL_ARG_CONTENT_KEYS`` (#4928): card content / diff-reconstruction inputs keep the long cap.
33
+ _TOOL_ARG_CONTENT_KEYS = frozenset({"command", "cmd", "script", "code", "patch", "diff", "old_string", "new_string", "content", "path", "file_path"})
34
+ _CLARIFY_FALLBACK = "The user did not provide a response within the time limit. Use your best judgement to make the choice and proceed."
35
+
36
+
37
+ class _Run:
38
+ def __init__(self, stream_id: str, session_id: str, ctx: CallContext):
39
+ self.stream_id = stream_id
40
+ self.session_id = session_id
41
+ self.ctx = ctx
42
+ self.agent = None
43
+ self.cancel = threading.Event()
44
+ # Set when the turn is over for any reason; the cancel watcher must not mistake it for a cancellation.
45
+ self.finished = threading.Event()
46
+ self.clarify_entries: dict[str, "_ClarifyEntry"] = {}
47
+ self.lock = threading.Lock()
48
+
49
+
50
+ class _ClarifyEntry:
51
+ def __init__(self, data: dict):
52
+ self.clarify_id = uuid.uuid4().hex
53
+ self.data = data
54
+ self.event = threading.Event()
55
+ self.result: str | None = None
56
+
57
+
58
+ _RUNS: dict[str, _Run] = {}
59
+ _RUNS_BY_SESSION: dict[str, str] = {}
60
+ # Which run owns the Agent's gateway approval callback per session; register/unregister happen under one lock so a
61
+ # stale run can never remove a successor's callback, and a successor can never leak a predecessor's.
62
+ _APPROVAL_CB_OWNER: dict[str, str] = {}
63
+ _APPROVAL_CB_LOCK = threading.Lock()
64
+ _RUNS_LOCK = threading.Lock()
65
+ _AGENT_CACHE: "OrderedDict[str, tuple[Any, str]]" = OrderedDict()
66
+ _AGENT_CACHE_LOCK = threading.Lock()
67
+
68
+
69
+ def _snippet(raw: Any, limit: int = _TOOL_RESULT_SNIPPET_MAX) -> str:
70
+ """Predecessor ``_tool_result_snippet``: the ``output``/``result``/``error`` of a dict (or JSON) result, hard-cut."""
71
+ if limit <= 0:
72
+ return ""
73
+ text = str(raw or "")
74
+ try:
75
+ data = raw if isinstance(raw, dict) else json.loads(text)
76
+ if isinstance(data, dict):
77
+ preview = data.get("output") or data.get("result") or data.get("error") or text
78
+ text = str(preview)
79
+ except Exception: # noqa: BLE001
80
+ pass
81
+ return text[:limit]
82
+
83
+
84
+ def _delegation_cost_usd(name: Any, raw: Any):
85
+ """Predecessor ``_delegation_cost_usd``: total spend a ``delegate_task`` result reports, or None."""
86
+ if str(name or "") != "delegate_task":
87
+ return None
88
+ try:
89
+ data = raw if isinstance(raw, dict) else json.loads(str(raw or ""))
90
+ except Exception: # noqa: BLE001
91
+ return None
92
+ if not isinstance(data, dict):
93
+ return None
94
+ results = data.get("results")
95
+ if not isinstance(results, list):
96
+ return None
97
+ total = 0.0
98
+ for entry in results:
99
+ if not isinstance(entry, dict):
100
+ continue
101
+ if str(entry.get("cost_status") or "").strip().lower() == "unknown":
102
+ return None
103
+ value = entry.get("cost_usd")
104
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
105
+ continue
106
+ if not (0 < value < 1e12):
107
+ continue
108
+ total += float(value)
109
+ return round(total, 6) if total > 0 else None
110
+
111
+
112
+ def _args_snapshot(args: Any) -> dict:
113
+ snap: dict = {}
114
+ if isinstance(args, dict):
115
+ for k, v in list(args.items())[:4]:
116
+ s2 = str(v)
117
+ cap = _TOOL_RESULT_SNIPPET_MAX if str(k).lower() in _TOOL_ARG_CONTENT_KEYS else 120
118
+ snap[k] = s2[:cap] + ("..." if len(s2) > cap else "")
119
+ return snap
120
+
121
+
122
+ def _usage(agent: Any) -> dict:
123
+ def _num(name: str):
124
+ value = getattr(agent, name, None)
125
+ return value if isinstance(value, (int, float)) else 0
126
+
127
+ cost = getattr(agent, "session_estimated_cost_usd", None)
128
+ return {
129
+ "prompt_tokens": int(_num("session_prompt_tokens")),
130
+ "completion_tokens": int(_num("session_completion_tokens")),
131
+ "cache_read_tokens": int(_num("session_cache_read_tokens")),
132
+ "cache_write_tokens": int(_num("session_cache_write_tokens")),
133
+ "estimated_cost_usd": float(cost) if isinstance(cost, (int, float)) else None,
134
+ }
135
+
136
+
137
+ def _context_length(agent: Any) -> dict:
138
+ cc = getattr(agent, "context_compressor", None)
139
+ if cc is None:
140
+ return {}
141
+ out = {}
142
+ for key in ("context_length", "threshold_tokens", "last_prompt_tokens", "compression_count"):
143
+ value = getattr(cc, key, None)
144
+ if isinstance(value, (int, float)):
145
+ out[key] = int(value)
146
+ return out
147
+
148
+
149
+ def _clarify_timeout(params: dict) -> int:
150
+ """Predecessor ``_clarify_timeout_seconds``: an explicit request value wins, else the Agent's resolver over config."""
151
+ explicit = params.get("clarify_timeout_seconds")
152
+ if explicit is not None:
153
+ try:
154
+ return int(explicit)
155
+ except (TypeError, ValueError):
156
+ pass
157
+ try:
158
+ from tools.clarify_gateway import get_clarify_timeout
159
+
160
+ return int(get_clarify_timeout())
161
+ except Exception: # noqa: BLE001 - older Agent without the resolver
162
+ pass
163
+ try:
164
+ from hermes_cli.config import load_config
165
+
166
+ cfg = load_config() or {}
167
+ raw = (cfg.get("clarify") or {}).get("timeout")
168
+ if raw is None:
169
+ raw = (cfg.get("agent") or {}).get("clarify_timeout", 3600)
170
+ return int(raw)
171
+ except Exception: # noqa: BLE001
172
+ return 3600
173
+
174
+
175
+ def _agent_pending_steer_text(agent) -> str:
176
+ """Predecessor ``_agent_pending_steer_text``: the Agent's not-yet-applied steer text."""
177
+ lock = agent.__dict__.get("_pending_steer_lock") if hasattr(agent, "__dict__") else None
178
+ if lock is None:
179
+ return str(getattr(agent, "_pending_steer", "") or "")
180
+ with lock:
181
+ return str(agent.__dict__.get("_pending_steer") or "")
182
+
183
+
184
+ def _resolve_runtime(provider: str | None, model: str) -> dict:
185
+ try:
186
+ from hermes_cli.runtime_provider import resolve_runtime_provider
187
+ except Exception as exc: # noqa: BLE001
188
+ raise RpcError(f"runtime provider unavailable: {exc}", condition="providers_unavailable") from exc
189
+ try:
190
+ runtime = resolve_runtime_provider(requested=provider or None, target_model=model or None)
191
+ except Exception as exc: # noqa: BLE001
192
+ raise RpcError(str(exc), condition="credential_missing", data={"error_type": type(exc).__name__}) from exc
193
+ if not isinstance(runtime, dict):
194
+ runtime = dict(vars(runtime)) if hasattr(runtime, "__dict__") else {}
195
+ return runtime
196
+
197
+
198
+ @contextlib.contextmanager
199
+ def _turn_identity(session_id: str, workspace: str):
200
+ """Bind this turn's identity to the calling context the way the predecessor's ``_set_turn_session_identity`` did:
201
+ the approval session key (so ``register_gateway_notify`` cards reach this turn and dangerous commands are gated
202
+ instead of auto-approved), the gateway session vars (platform ``webui``, chat/ui session ids), and the session cwd
203
+ (so terminals and AGENTS.md discovery run in the selected workspace, not the sidecar's launch directory). Every
204
+ binding is a context variable, so concurrent turns cannot overwrite each other. Missing Agent surfaces are logged,
205
+ not fatal."""
206
+ resets: list = []
207
+ try:
208
+ try:
209
+ from tools.approval_context import reset_current_session_key, set_current_session_key
210
+ except ImportError:
211
+ from tools.approval import reset_current_session_key, set_current_session_key # type: ignore[no-redef]
212
+ token = set_current_session_key(session_id)
213
+ resets.append(lambda: reset_current_session_key(token))
214
+ except Exception: # noqa: BLE001
215
+ log.debug("per-turn approval session-key bind failed", exc_info=True)
216
+ try:
217
+ from gateway import session_context as sc
218
+
219
+ pairs = [
220
+ (sc._SESSION_KEY, session_id), (sc._SESSION_UI_SESSION_ID, session_id), (sc._SESSION_PLATFORM, "webui"),
221
+ (sc._SESSION_CHAT_ID, session_id), (sc._SESSION_ID, session_id),
222
+ ]
223
+ for var, value in pairs:
224
+ tok = var.set(value)
225
+ resets.append(lambda var=var, tok=tok: var.reset(tok))
226
+ except Exception: # noqa: BLE001
227
+ log.debug("per-turn session context bind failed", exc_info=True)
228
+ try:
229
+ from agent.runtime_cwd import _SESSION_CWD
230
+
231
+ tok = _SESSION_CWD.set(str(workspace))
232
+ resets.append(lambda: _SESSION_CWD.reset(tok))
233
+ except Exception: # noqa: BLE001
234
+ log.debug("per-turn session cwd bind failed", exc_info=True)
235
+ try:
236
+ yield
237
+ finally:
238
+ for reset in reversed(resets):
239
+ try:
240
+ reset()
241
+ except Exception: # noqa: BLE001
242
+ log.debug("per-turn identity reset failed", exc_info=True)
243
+
244
+
245
+ def _agent_signature(model: str, provider, runtime: dict, toolsets, home: str, kwargs: dict) -> str:
246
+ """Cache identity of an ``AIAgent``: everything its constructor bound from the resolved runtime, so a rotated key,
247
+ a different API mode, ACP command, or credential pool never reuses an agent built for the old bundle. The key
248
+ itself only enters as a digest."""
249
+ api_key = runtime.get("api_key")
250
+ key_digest = hashlib.sha256(str(api_key).encode("utf-8")).hexdigest()[:16] if api_key else None
251
+ pool = runtime.get("credential_pool")
252
+ pool_identity = pool if isinstance(pool, (str, int, float, bool, list, dict)) or pool is None else f"{type(pool).__name__}:{getattr(pool, 'name', None) or getattr(pool, 'provider', None) or id(pool)}"
253
+ bundle = {
254
+ "model": model, "provider": provider, "base_url": runtime.get("base_url"), "api_key": key_digest,
255
+ "api_mode": runtime.get("api_mode"), "acp_command": runtime.get("acp_command"), "acp_args": runtime.get("acp_args"),
256
+ "credential_pool": pool_identity, "toolsets": toolsets, "home": home,
257
+ "max_iterations": kwargs.get("max_iterations"), "max_tokens": kwargs.get("max_tokens"),
258
+ # Bound at construction too: a reasoning-effort change from the composer must build a fresh agent.
259
+ "reasoning_config": kwargs.get("reasoning_config"),
260
+ }
261
+ return json.dumps(bundle, sort_keys=True, default=str)
262
+
263
+
264
+ def _evict_idle_agents_locked() -> None:
265
+ """Trim the agent LRU (caller holds ``_AGENT_CACHE_LOCK``), never dropping a session whose turn is still running."""
266
+ if len(_AGENT_CACHE) <= _AGENT_CACHE_MAX:
267
+ return
268
+ with _RUNS_LOCK:
269
+ live = {sid for sid, sid_stream in _RUNS_BY_SESSION.items() if (r := _RUNS.get(sid_stream)) is not None and not r.finished.is_set()}
270
+ for sid in list(_AGENT_CACHE):
271
+ if len(_AGENT_CACHE) <= _AGENT_CACHE_MAX:
272
+ break
273
+ if sid not in live:
274
+ _AGENT_CACHE.pop(sid, None)
275
+
276
+
277
+ def evict_all_agents() -> int:
278
+ """Drop every cached agent (credentials or environment changed underneath them)."""
279
+ with _AGENT_CACHE_LOCK:
280
+ count = len(_AGENT_CACHE)
281
+ _AGENT_CACHE.clear()
282
+ return count
283
+
284
+
285
+ def _agent_class():
286
+ try:
287
+ from run_agent import AIAgent
288
+ except Exception as exc: # noqa: BLE001
289
+ raise RpcError(f"AIAgent unavailable: {exc}", condition="agent_unavailable") from exc
290
+ return AIAgent
291
+
292
+
293
+ def _supported(cls, name: str) -> bool:
294
+ """Whether ``cls.__init__`` accepts ``name`` (named, or through ``**kwargs``)."""
295
+ try:
296
+ parameters = inspect.signature(cls.__init__).parameters
297
+ except (TypeError, ValueError):
298
+ return False
299
+ return name in parameters or any(p.kind is inspect.Parameter.VAR_KEYWORD for p in parameters.values())
300
+
301
+
302
+ def start(ctx: CallContext, params: dict) -> dict: # noqa: PLR0915 - one turn, one function
303
+ session_id = str(params.get("session_id") or "").strip()
304
+ stream_id = str(params.get("stream_id") or "").strip()
305
+ if not session_id or not stream_id:
306
+ raise InvalidParams("session_id and stream_id are required")
307
+ user_message = params.get("user_message")
308
+ if not (isinstance(user_message, str) and user_message.strip()) and not (isinstance(user_message, list) and user_message):
309
+ raise InvalidParams("user_message is required")
310
+ model = str(params.get("model") or "").strip()
311
+ provider = str(params.get("model_provider") or "").strip() or None
312
+ history = params.get("conversation_history")
313
+ if history is None:
314
+ history = []
315
+ if not isinstance(history, list):
316
+ raise InvalidParams("conversation_history must be a list")
317
+ toolsets = params.get("enabled_toolsets")
318
+ system_message = params.get("system_message")
319
+ run = _Run(stream_id, session_id, ctx)
320
+ with _RUNS_LOCK:
321
+ prior = _RUNS.get(_RUNS_BY_SESSION.get(session_id) or "")
322
+ # A previous turn for this session that never returned (a tool ignoring its interrupt) still owns the cached
323
+ # agent; this turn must not share, rebind, or un-interrupt that live instance.
324
+ session_busy = prior is not None and not prior.finished.is_set()
325
+ _RUNS[stream_id] = run
326
+ _RUNS_BY_SESSION[session_id] = stream_id
327
+ raw_emit = ctx.emit
328
+ steer_state = {"last": None}
329
+
330
+ def emit(event, data=None):
331
+ """Predecessor ``_webui_steer_events_before``: before content frames, report the Agent's pending steer text
332
+ whenever it changed so the server can mark consumed steers live rather than only after ``done``."""
333
+ if event in ("token", "reasoning", "interim_assistant", "tool", "tool_complete") and run.agent is not None:
334
+ pending = _agent_pending_steer_text(run.agent)
335
+ if pending != steer_state["last"]:
336
+ steer_state["last"] = pending
337
+ raw_emit("steer_pending", {"text": pending})
338
+ raw_emit(event, data)
339
+ try:
340
+ runtime = _resolve_runtime(provider, model)
341
+ resolved_model = model or str(runtime.get("model") or "")
342
+ resolved_provider = provider or runtime.get("provider")
343
+ AIAgent = _agent_class()
344
+ live_tool_calls: list[dict] = []
345
+ started_ids: set[str] = set()
346
+ completed_ids: set[str] = set()
347
+ token_sent = [False]
348
+
349
+ def on_token(text):
350
+ if text is None:
351
+ return
352
+ token_sent[0] = True
353
+ emit("token", {"text": str(text)})
354
+
355
+ def on_reasoning(text):
356
+ if text is None:
357
+ return
358
+ emit("reasoning", {"text": str(text)})
359
+
360
+ def on_interim(text, **kw):
361
+ visible = str(text or "").strip()
362
+ if not visible:
363
+ return
364
+ emit("interim_assistant", {"text": visible, "already_streamed": bool(kw.get("already_streamed", False))})
365
+
366
+ def on_tool_start(tool_call_id, name, args):
367
+ tid = str(tool_call_id or "")
368
+ if tid and tid in started_ids:
369
+ return
370
+ if tid:
371
+ started_ids.add(tid)
372
+ live_tool_calls.append({"name": name, "args": args if isinstance(args, dict) else {}, "tid": tid, "done": False})
373
+ emit("tool", {"event_type": "tool.started", "name": name, "preview": None, "args": _args_snapshot(args), "tid": tid})
374
+
375
+ def on_tool_complete(tool_call_id, name, args, function_result):
376
+ tid = str(tool_call_id or "")
377
+ if tid and tid in completed_ids:
378
+ return
379
+ if tid:
380
+ completed_ids.add(tid)
381
+ snippet = _snippet(function_result)
382
+ for call in reversed(live_tool_calls):
383
+ if call.get("done"):
384
+ continue
385
+ if call.get("tid") == tid or (not call.get("tid") and call.get("name") == name):
386
+ call["done"] = True
387
+ call["snippet"] = snippet
388
+ break
389
+ payload = {"event_type": "tool.completed", "name": name, "preview": snippet, "args": _args_snapshot(args), "tid": tid, "is_error": False}
390
+ cost = _delegation_cost_usd(name, function_result)
391
+ if cost is not None:
392
+ payload["cost_usd"] = cost
393
+ for call in reversed(live_tool_calls):
394
+ if call.get("tid") == tid:
395
+ call["cost_usd"] = cost
396
+ break
397
+ emit("tool_complete", payload)
398
+
399
+ def on_tool(*cb_args, **cb_kwargs):
400
+ # Structured callbacks carry tool cards; the progress callback only feeds reasoning text on older builds.
401
+ if len(cb_args) >= 3 and cb_args[0] in ("reasoning.available", "_thinking"):
402
+ text = cb_args[2] if cb_args[0] == "reasoning.available" else cb_args[1]
403
+ if text:
404
+ emit("reasoning", {"text": str(text)})
405
+
406
+ def on_status(kind, message):
407
+ text = str(message or "").strip()
408
+ if not text:
409
+ return
410
+ lower = text.lower()
411
+ if "compress" in lower and ("start" in lower or "compressing" in lower):
412
+ emit("compressing", {"session_id": session_id, "message": "Compressing context"})
413
+ elif "fallback" in lower or "rate limit" in lower or "retry" in lower:
414
+ emit("warning", {"type": "fallback", "message": text})
415
+ elif "non-retryable error" in lower:
416
+ emit("status", {"kind": "terminal_error", "message": text})
417
+
418
+ def clarify_callback(question, choices, questions=None):
419
+ choices_list = [str(c) for c in (choices or [])]
420
+ # Predecessor `_clarify_timeout_seconds`: the Agent's own resolver over this profile's config
421
+ # (``clarify.timeout`` else ``agent.clarify_timeout`` else 3600); ``<= 0`` waits until answered or cancelled.
422
+ # The advertised ``timeout_seconds`` is what the clients count down, so it is the same number.
423
+ timeout = _clarify_timeout(params)
424
+ data = {"question": str(question or ""), "choices_offered": choices_list, "session_id": session_id, "kind": "clarify", "requested_at": time.time(), "timeout_seconds": timeout}
425
+ if isinstance(questions, list) and questions:
426
+ data["questions"] = questions
427
+ entry = _ClarifyEntry(data)
428
+ entry.data["clarify_id"] = entry.clarify_id
429
+ with run.lock:
430
+ run.clarify_entries[entry.clarify_id] = entry
431
+ emit("clarify", dict(entry.data))
432
+ deadline = None if timeout <= 0 else time.monotonic() + float(timeout)
433
+ while not entry.event.is_set():
434
+ if run.cancel.is_set() or run.finished.is_set():
435
+ break
436
+ if deadline is None:
437
+ entry.event.wait(1.0)
438
+ continue
439
+ remaining = deadline - time.monotonic()
440
+ if remaining <= 0:
441
+ break
442
+ entry.event.wait(min(1.0, remaining))
443
+ with run.lock:
444
+ run.clarify_entries.pop(entry.clarify_id, None)
445
+ emit("clarify_resolved", {"clarify_id": entry.clarify_id, "session_id": session_id})
446
+ return entry.result or _CLARIFY_FALLBACK
447
+
448
+ # Approval bridge: the Agent parks dangerous commands in its gateway queue and calls back here.
449
+ try:
450
+ from tools.approval import register_gateway_notify, unregister_gateway_notify
451
+ except Exception: # noqa: BLE001
452
+ register_gateway_notify = unregister_gateway_notify = None
453
+ if register_gateway_notify is not None:
454
+ def _approval_cb(data):
455
+ payload = dict(data or {})
456
+ payload.setdefault("session_id", session_id)
457
+ payload.setdefault("approval_id", str(payload.get("request_id") or uuid.uuid4().hex))
458
+ emit("approval", payload)
459
+ approval_cb = _approval_cb
460
+ else:
461
+ approval_cb = None
462
+
463
+ kwargs: dict = dict(
464
+ model=resolved_model,
465
+ provider=resolved_provider,
466
+ base_url=runtime.get("base_url"),
467
+ api_key=runtime.get("api_key"),
468
+ platform="webui",
469
+ quiet_mode=True,
470
+ enabled_toolsets=toolsets if isinstance(toolsets, list) else None,
471
+ session_id=session_id,
472
+ stream_delta_callback=on_token,
473
+ reasoning_callback=on_reasoning,
474
+ tool_progress_callback=on_tool,
475
+ clarify_callback=clarify_callback,
476
+ )
477
+ for name, value in (
478
+ ("interim_assistant_callback", on_interim),
479
+ ("tool_start_callback", on_tool_start),
480
+ ("tool_complete_callback", on_tool_complete),
481
+ ("status_callback", on_status),
482
+ ("api_mode", runtime.get("api_mode")),
483
+ ("acp_command", runtime.get("acp_command")),
484
+ ("acp_args", runtime.get("acp_args")),
485
+ ("credential_pool", runtime.get("credential_pool")),
486
+ ("gateway_session_key", session_id),
487
+ ):
488
+ if _supported(AIAgent, name) and value is not None:
489
+ kwargs[name] = value
490
+ if isinstance(params.get("max_iterations"), int) and params["max_iterations"] > 0 and _supported(AIAgent, "max_iterations"):
491
+ kwargs["max_iterations"] = params["max_iterations"]
492
+ if isinstance(params.get("max_tokens"), int) and params["max_tokens"] > 0 and _supported(AIAgent, "max_tokens"):
493
+ kwargs["max_tokens"] = params["max_tokens"]
494
+ # Predecessor: `agent.reasoning_effort` (already coerced for the model) → AIAgent ``reasoning_config``.
495
+ reasoning_config = params.get("reasoning_config")
496
+ if isinstance(reasoning_config, dict) and _supported(AIAgent, "reasoning_config"):
497
+ kwargs["reasoning_config"] = reasoning_config
498
+ signature = _agent_signature(resolved_model, resolved_provider, runtime, toolsets, str(params.get("profile_home")), kwargs)
499
+ agent = None
500
+ if not session_busy:
501
+ with _AGENT_CACHE_LOCK:
502
+ cached = _AGENT_CACHE.get(session_id)
503
+ if cached and cached[1] == signature:
504
+ agent = cached[0]
505
+ _AGENT_CACHE.move_to_end(session_id)
506
+ if agent is not None:
507
+ for name in ("stream_delta_callback", "reasoning_callback", "tool_progress_callback", "clarify_callback", "interim_assistant_callback", "tool_start_callback", "tool_complete_callback", "status_callback"):
508
+ if name in kwargs and hasattr(agent, name):
509
+ setattr(agent, name, kwargs[name])
510
+ else:
511
+ agent = AIAgent(**kwargs)
512
+ with _AGENT_CACHE_LOCK:
513
+ _AGENT_CACHE[session_id] = (agent, signature)
514
+ _AGENT_CACHE.move_to_end(session_id)
515
+ _evict_idle_agents_locked()
516
+ # Predecessor ``agent.ephemeral_system_prompt``: personality, surface context, progress guidance, and delivery
517
+ # hints travel as runtime instructions that are never persisted to history.
518
+ ephemeral = params.get("ephemeral_system_prompt")
519
+ if isinstance(ephemeral, str) and ephemeral.strip():
520
+ try:
521
+ agent.ephemeral_system_prompt = ephemeral
522
+ except Exception: # noqa: BLE001 - read-only stand-ins
523
+ pass
524
+ if approval_cb is not None:
525
+ with _APPROVAL_CB_LOCK:
526
+ register_gateway_notify(session_id, approval_cb)
527
+ _APPROVAL_CB_OWNER[session_id] = stream_id
528
+ run.agent = agent
529
+ compressions_before = int(getattr(getattr(agent, "context_compressor", None), "compression_count", 0) or 0)
530
+
531
+ # A cached agent may still carry the interrupt a previous cancel left behind; the Agent keeps a pending
532
+ # interrupt across turn start, so it would abort this turn immediately.
533
+ clear_interrupt = getattr(agent, "clear_interrupt", None)
534
+ if callable(clear_interrupt):
535
+ try:
536
+ clear_interrupt()
537
+ except Exception: # noqa: BLE001
538
+ log.debug("agent.clear_interrupt failed", exc_info=True)
539
+
540
+ def _watch_cancel():
541
+ while not run.cancel.wait(0.25):
542
+ if run.finished.is_set():
543
+ return
544
+ if ctx.cancelled:
545
+ run.cancel.set()
546
+ break
547
+ if run.finished.is_set() and not run.cancel.is_set():
548
+ return
549
+ try:
550
+ agent.interrupt("Cancelled by user", hard_cancel=True)
551
+ except TypeError:
552
+ agent.interrupt("Cancelled by user")
553
+ except Exception: # noqa: BLE001
554
+ log.debug("agent.interrupt failed", exc_info=True)
555
+ with run.lock:
556
+ for entry in list(run.clarify_entries.values()):
557
+ entry.event.set()
558
+
559
+ watcher = threading.Thread(target=_watch_cancel, daemon=True, name=f"chat-cancel-{stream_id[:8]}")
560
+ watcher.start()
561
+ run_kwargs: dict = {"user_message": user_message, "conversation_history": history, "task_id": session_id}
562
+ try:
563
+ run_params = set(inspect.signature(agent.run_conversation).parameters)
564
+ except (TypeError, ValueError):
565
+ run_params = set()
566
+ if system_message and ("system_message" in run_params or not run_params):
567
+ run_kwargs["system_message"] = system_message
568
+ if "persist_user_message" in run_params and isinstance(user_message, str):
569
+ run_kwargs["persist_user_message"] = user_message
570
+ error: str | None = None
571
+ result: dict = {}
572
+ try:
573
+ raw = agent.run_conversation(**run_kwargs)
574
+ result = raw if isinstance(raw, dict) else {}
575
+ except Exception as exc: # noqa: BLE001
576
+ log.warning("agent turn failed for %s: %s", session_id, exc)
577
+ error = f"{type(exc).__name__}: {exc}"
578
+ finally:
579
+ run.finished.set()
580
+ watcher.join(timeout=2)
581
+ # A successor turn for the same session (admitted past the cancel-unwind ceiling) may have registered
582
+ # its own callback meanwhile: compare-and-unregister under the same lock registration takes.
583
+ if unregister_gateway_notify is not None:
584
+ with _APPROVAL_CB_LOCK:
585
+ if _APPROVAL_CB_OWNER.get(session_id) == stream_id:
586
+ _APPROVAL_CB_OWNER.pop(session_id, None)
587
+ try:
588
+ unregister_gateway_notify(session_id)
589
+ except Exception: # noqa: BLE001
590
+ pass
591
+ cancelled = ctx.cancelled or run.cancel.is_set() or (bool(getattr(agent, "_interrupt_requested", False)) and error is None and not result.get("final_response"))
592
+ compressions_after = int(getattr(getattr(agent, "context_compressor", None), "compression_count", 0) or 0)
593
+ last_error = getattr(agent, "_last_error", None)
594
+ if not error and last_error:
595
+ error = str(last_error)
596
+ if not error and isinstance(result.get("error"), str) and result.get("error"):
597
+ error = str(result["error"])
598
+ status = "cancelled" if cancelled else ("error" if error and not result.get("messages") else "completed")
599
+ pending_steer = str(result.get("pending_steer") or "") if isinstance(result, dict) else ""
600
+ return {
601
+ "status": status,
602
+ "messages": [m for m in (result.get("messages") or []) if isinstance(m, dict)],
603
+ "final_response": str(result.get("final_response") or ""),
604
+ "error": error,
605
+ "result_status": str(result.get("status") or result.get("state") or ""),
606
+ "tool_limit_reached": bool(result.get("tool_limit_reached") or result.get("max_iterations_reached")),
607
+ "usage": _usage(agent),
608
+ "context": _context_length(agent),
609
+ "model": str(getattr(agent, "model", None) or resolved_model),
610
+ "provider": str(resolved_provider or ""),
611
+ "compressed": compressions_after > compressions_before,
612
+ "agent_session_id": str(getattr(agent, "session_id", None) or session_id),
613
+ "token_sent": token_sent[0],
614
+ "pending_steer": pending_steer,
615
+ "live_tool_calls": live_tool_calls,
616
+ }
617
+ finally:
618
+ with _RUNS_LOCK:
619
+ _RUNS.pop(stream_id, None)
620
+ if _RUNS_BY_SESSION.get(session_id) == stream_id:
621
+ _RUNS_BY_SESSION.pop(session_id, None)
622
+
623
+
624
+ def _run_for(params: dict) -> _Run | None:
625
+ stream_id = str(params.get("stream_id") or "").strip()
626
+ session_id = str(params.get("session_id") or "").strip()
627
+ with _RUNS_LOCK:
628
+ if stream_id:
629
+ return _RUNS.get(stream_id)
630
+ if session_id:
631
+ sid = _RUNS_BY_SESSION.get(session_id)
632
+ return _RUNS.get(sid) if sid else None
633
+ return None
634
+
635
+
636
+ def register(registry) -> None:
637
+ @registry.method("chat.start")
638
+ def start_(ctx: CallContext, params: dict) -> dict:
639
+ session_id = str(params.get("session_id") or "").strip()
640
+ workspace = params.get("workspace")
641
+ if not isinstance(workspace, str) or not workspace.strip():
642
+ raise InvalidParams("workspace is required")
643
+ with scoped_home(profile_home_param(params)):
644
+ with _turn_identity(session_id, workspace):
645
+ return start(ctx, params)
646
+
647
+ @registry.method("chat.interrupt", requires_agent=False)
648
+ def interrupt_(ctx: CallContext, params: dict) -> dict:
649
+ run = _run_for(params)
650
+ if run is None:
651
+ return {"ok": False, "reason": "not_running"}
652
+ run.cancel.set()
653
+ # Predecessor ``_finalize_webui_steers``: drain the Agent's not-yet-applied steer text so the server can
654
+ # settle queued steers (consumed vs leftover) before it writes the terminal cancel row.
655
+ pending = ""
656
+ agent = run.agent
657
+ if agent is not None:
658
+ drain = getattr(agent, "_drain_pending_steer", None)
659
+ try:
660
+ pending = str(drain() or "") if callable(drain) else _agent_pending_steer_text(agent)
661
+ except Exception: # noqa: BLE001
662
+ pending = _agent_pending_steer_text(agent)
663
+ return {"ok": True, "pending_steer": pending}
664
+
665
+ @registry.method("chat.steer", requires_agent=False)
666
+ def steer_(ctx: CallContext, params: dict) -> dict:
667
+ text = str(params.get("text") or "").strip()
668
+ if not text:
669
+ raise InvalidParams("text is required")
670
+ run = _run_for(params)
671
+ if run is None or run.agent is None:
672
+ return {"accepted": False, "fallback": "not_running"}
673
+ if not hasattr(run.agent, "steer"):
674
+ return {"accepted": False, "fallback": "agent_lacks_steer"}
675
+ try:
676
+ accepted = bool(run.agent.steer(text))
677
+ except Exception as exc: # noqa: BLE001
678
+ log.debug("steer failed: %s", exc)
679
+ return {"accepted": False, "fallback": "steer_error"}
680
+ return {"accepted": accepted, "fallback": None if accepted else "not_running"}
681
+
682
+ @registry.method("chat.evict_agent", requires_agent=False)
683
+ def evict_(ctx: CallContext, params: dict) -> dict:
684
+ session_id = str(params.get("session_id") or "").strip()
685
+ with _AGENT_CACHE_LOCK:
686
+ evicted = _AGENT_CACHE.pop(session_id, None) is not None
687
+ try:
688
+ from tools.approval import clear_session
689
+ clear_session(session_id)
690
+ except Exception: # noqa: BLE001
691
+ pass
692
+ return {"evicted": evicted}
693
+
694
+ @registry.method("chat.commit_memory", requires_agent=False)
695
+ def commit_memory_(ctx: CallContext, params: dict) -> dict:
696
+ """Predecessor ``commit_session_memory``: flush the cached Agent's memory for a session the user just left."""
697
+ session_id = str(params.get("session_id") or "").strip()
698
+ with _AGENT_CACHE_LOCK:
699
+ cached = _AGENT_CACHE.get(session_id)
700
+ with _RUNS_LOCK:
701
+ busy = (_RUNS_BY_SESSION.get(session_id) or "") in _RUNS
702
+ agent = cached[0] if cached else None
703
+ commit = getattr(agent, "commit_memory_session", None) if agent is not None else None
704
+ if commit is None or busy:
705
+ return {"committed": False}
706
+ try:
707
+ commit()
708
+ except Exception as exc: # noqa: BLE001
709
+ log.warning("commit_memory_session() failed for session %s: %s", session_id, exc)
710
+ return {"committed": False}
711
+ return {"committed": True}
712
+
713
+ @registry.method("approval.respond", requires_agent=True)
714
+ def approval_respond_(ctx: CallContext, params: dict) -> dict:
715
+ session_id = str(params.get("session_id") or "").strip()
716
+ choice = str(params.get("choice") or "deny").strip()
717
+ request_id = str(params.get("request_id") or "").strip() or None
718
+ if choice not in ("once", "session", "always", "deny"):
719
+ raise InvalidParams(f"Invalid choice: {choice}")
720
+ try:
721
+ from tools import approval as approval_mod
722
+ except Exception as exc: # noqa: BLE001
723
+ raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
724
+ with scoped_home(profile_home_param(params)):
725
+ entries = approval_mod.list_gateway_approvals(session_id)
726
+ targets = [e for e in entries if not request_id or e.get("request_id") == request_id]
727
+ keys = []
728
+ for entry in targets:
729
+ keys.extend(entry.get("pattern_keys") or [entry.get("pattern_key", "")])
730
+ keys = [k for k in keys if k]
731
+ if choice == "session":
732
+ for k in keys:
733
+ approval_mod.approve_session(session_id, k)
734
+ elif choice == "always":
735
+ for k in keys:
736
+ approval_mod.approve_session(session_id, k)
737
+ approval_mod.approve_permanent(k)
738
+ try:
739
+ # Persist the set that governs THIS home (per-profile under the home override), not the launch
740
+ # profile's module-level set, which would overwrite a named profile's allowlist with the wrong keys.
741
+ permanent_set = getattr(approval_mod, "_permanent_set", None)
742
+ with approval_mod._lock:
743
+ snapshot = set(permanent_set()) if callable(permanent_set) else set(approval_mod._permanent_approved)
744
+ approval_mod.save_permanent_allowlist(snapshot)
745
+ except Exception: # noqa: BLE001
746
+ log.debug("save_permanent_allowlist failed", exc_info=True)
747
+ resolved = approval_mod.resolve_gateway_approval(session_id, choice, request_id=request_id)
748
+ return {"ok": bool(resolved), "resolved": int(resolved or 0), "choice": choice}
749
+
750
+ @registry.method("approval.pending", requires_agent=True)
751
+ def approval_pending_(ctx: CallContext, params: dict) -> dict:
752
+ session_id = str(params.get("session_id") or "").strip()
753
+ try:
754
+ from tools.approval import list_gateway_approvals
755
+ except Exception as exc: # noqa: BLE001
756
+ raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
757
+ return {"pending": list_gateway_approvals(session_id)}
758
+
759
+ @registry.method("approval.set_yolo", requires_agent=True)
760
+ def set_yolo_(ctx: CallContext, params: dict) -> dict:
761
+ session_id = str(params.get("session_id") or "").strip()
762
+ enabled = bool(params.get("enabled"))
763
+ try:
764
+ from tools.approval import disable_session_yolo, enable_session_yolo, is_session_yolo_enabled, resolve_gateway_approval
765
+ except Exception as exc: # noqa: BLE001
766
+ raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
767
+ (enable_session_yolo if enabled else disable_session_yolo)(session_id)
768
+ released = resolve_gateway_approval(session_id, "session", resolve_all=True) if enabled else 0
769
+ return {"yolo_enabled": bool(is_session_yolo_enabled(session_id)), "released": int(released or 0)}
770
+
771
+ @registry.method("clarify.respond", requires_agent=False)
772
+ def clarify_respond_(ctx: CallContext, params: dict) -> dict:
773
+ response = str(params.get("response") or "").strip()
774
+ clarify_id = str(params.get("clarify_id") or "").strip()
775
+ if not response:
776
+ raise InvalidParams("response is required")
777
+ run = _run_for(params)
778
+ if run is None:
779
+ return {"ok": False}
780
+ with run.lock:
781
+ entries = list(run.clarify_entries.values())
782
+ target = None
783
+ if clarify_id:
784
+ target = next((e for e in entries if e.clarify_id == clarify_id), None)
785
+ elif entries:
786
+ target = entries[0]
787
+ if target is None:
788
+ return {"ok": False}
789
+ target.result = response
790
+ target.event.set()
791
+ return {"ok": True, "clarify_id": target.clarify_id}