@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,16 +1,22 @@
1
- """``config.*`` and ``models.reasoning_efforts``: a profile's ``config.yaml`` and the
2
- Agent's per-model reasoning capability.
1
+ """``config.*``, ``models.reasoning_efforts`` and ``personalities.list``: a profile's ``config.yaml`` and ``.env``,
2
+ the Agent's per-model reasoning capability, and the personalities the Agent offers for a config.
3
3
 
4
4
  The TypeScript server owns every config.yaml *policy* (which keys mean what);
5
5
  the sidecar only parses and serialises YAML with the Agent's own parser so the
6
6
  Node side needs no YAML dependency. Writes are atomic and keep the file's mode.
7
+ ``.env`` edits use the Agent's own line helpers under the ``<.env>.lock`` the
8
+ gateway, CLI and plugins also take, so concurrent writers never drop a key.
7
9
  """
8
10
 
9
11
  from __future__ import annotations
10
12
 
13
+ import contextlib
14
+ import copy
11
15
  import importlib
16
+ import io
12
17
  import logging
13
18
  import os
19
+ import re
14
20
  import tempfile
15
21
  from pathlib import Path
16
22
 
@@ -69,12 +75,82 @@ def _write_target(path: Path) -> Path:
69
75
  return target
70
76
 
71
77
 
72
- def write_config(path: Path, config: dict) -> dict:
78
+ def _same_config_value(left, right) -> bool:
79
+ """Compare decoded JSON values without treating booleans as numbers."""
80
+ if type(left) is not type(right):
81
+ return False
82
+ if isinstance(left, dict):
83
+ return left.keys() == right.keys() and all(_same_config_value(left[key], right[key]) for key in left)
84
+ if isinstance(left, list):
85
+ return len(left) == len(right) and all(_same_config_value(a, b) for a, b in zip(left, right))
86
+ return left == right
87
+
88
+
89
+ def _split_config_aliases(text: str, desired: dict) -> str:
90
+ """Keep the Agent's round-trip document, separating aliases with different requested values."""
91
+ roundtrip = getattr(yaml_parser(), "roundtrip_yaml", None)
92
+ if roundtrip is None:
93
+ return text
94
+ parser = roundtrip()
95
+ document = parser.load(text)
96
+ seen = {}
97
+ changed = False
98
+
99
+ def split(node, value):
100
+ nonlocal changed
101
+ if not (isinstance(node, dict) and isinstance(value, dict) or isinstance(node, list) and isinstance(value, list)):
102
+ return node
103
+ previous = seen.get(id(node))
104
+ if previous is not None:
105
+ if _same_config_value(previous[1], value):
106
+ return node
107
+ node = copy.deepcopy(node)
108
+ # Copied explicit anchor names must not collide with the original subtree.
109
+ pending, cleared = [node], set()
110
+ while pending:
111
+ child = pending.pop()
112
+ if id(child) in cleared:
113
+ continue
114
+ cleared.add(id(child))
115
+ if hasattr(child, "yaml_set_anchor"):
116
+ child.yaml_set_anchor(None)
117
+ if isinstance(child, dict):
118
+ pending.extend(child.values())
119
+ elif isinstance(child, list):
120
+ pending.extend(child)
121
+ changed = True
122
+ seen[id(node)] = (node, value)
123
+ for key in value if isinstance(value, dict) else range(min(len(node), len(value))):
124
+ if not isinstance(node, dict) or key in node:
125
+ node[key] = split(node[key], value[key])
126
+ return node
127
+
128
+ split(document, desired)
129
+ if not changed:
130
+ return text
131
+ output = io.StringIO()
132
+ parser.dump(document, output)
133
+ return output.getvalue()
134
+
135
+
136
+ def write_config(path: Path, config: dict, *, profile_home: Path | None = None) -> dict:
73
137
  if not isinstance(config, dict):
74
138
  raise InvalidParams("config must be an object")
139
+ try:
140
+ managed = importlib.import_module("hermes_constants").get_managed_system(profile_home)
141
+ except Exception as exc: # noqa: BLE001
142
+ raise RpcError("Cannot verify config.yaml management policy; repair the Agent installation before saving.",
143
+ condition="config_policy_unavailable") from exc
144
+ if managed is not None:
145
+ raise RpcError("config.yaml is package-managed. Update the declarative configuration instead.",
146
+ condition="config_write_refused")
75
147
  target = _write_target(path)
76
148
  target.parent.mkdir(parents=True, exist_ok=True)
77
- text = yaml_parser().safe_dump(config, sort_keys=False, allow_unicode=True)
149
+ try:
150
+ replace = getattr(importlib.import_module("hermes_cli.config"), "atomic_config_replace", None)
151
+ except Exception: # noqa: BLE001
152
+ # Operator config must remain writable even when Agent imports are broken.
153
+ replace = None
78
154
  mode = None
79
155
  try:
80
156
  mode = target.stat().st_mode & 0o777
@@ -83,11 +159,24 @@ def write_config(path: Path, config: dict) -> dict:
83
159
  fd, tmp = tempfile.mkstemp(dir=str(target.parent), prefix=".config_", suffix=".tmp")
84
160
  try:
85
161
  with os.fdopen(fd, "w", encoding="utf-8") as handle:
86
- handle.write(text)
162
+ if replace is not None:
163
+ # Stage the original document so the Agent retains comments; check the real link before committing.
164
+ try:
165
+ handle.write(_split_config_aliases(target.read_text(encoding="utf-8"), config))
166
+ except FileNotFoundError:
167
+ pass
168
+ else:
169
+ parser = yaml_parser()
170
+ handle.write(parser.safe_dump(config, sort_keys=False, allow_unicode=True,
171
+ width=getattr(parser, "ROUNDTRIP_YAML_WIDTH", 2**31 - 1)))
87
172
  handle.flush()
88
173
  os.fsync(handle.fileno())
174
+ if replace is not None:
175
+ replace(Path(tmp), config)
89
176
  if mode is not None:
90
177
  os.chmod(tmp, mode)
178
+ if not _same_config_value(read_config(Path(tmp))["config"], config):
179
+ raise RpcError("Staged config.yaml does not match the requested values", condition="config_invalid")
91
180
  # A link retargeted while the temp file was being written would otherwise send the write to the wrong file.
92
181
  if _write_target(path) != target:
93
182
  raise RpcError(f"{path} was retargeted while config.yaml was being written; retry", condition="config_changed")
@@ -101,6 +190,88 @@ def write_config(path: Path, config: dict) -> dict:
101
190
  return {"ok": True, "path": str(path)}
102
191
 
103
192
 
193
+ _ENV_NAME = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
194
+
195
+
196
+ def _env_refusal(agent_config, key: str, action: str) -> str | None:
197
+ """The Agent's ``.env`` write-lock refusal (package-managed install or administrator-managed key)."""
198
+ refusal = getattr(agent_config, "env_write_refusal", None)
199
+ if refusal is not None:
200
+ return refusal(key, action)
201
+ # Agent 0.21.5 only reports the refusal on stderr.
202
+ return f"Cannot {action} {key}: this Hermes installation manages it" if agent_config._env_write_blocked(key, action) else None
203
+
204
+
205
+ def _env_lock(agent_config, path: Path):
206
+ """The Agent's ``<.env>.lock`` (Agent 0.21.6+); older Agents have none to share."""
207
+ lock = getattr(agent_config, "_env_write_lock", None)
208
+ return lock(path) if lock is not None else contextlib.nullcontext()
209
+
210
+
211
+ def env_write(home: Path, updates) -> dict:
212
+ """Upsert ``updates`` into ``home``'s ``.env`` (``None`` removes a key) with the Agent's own line helpers, under
213
+ the lock its ``save_env_value`` / ``remove_env_value`` take, in one atomic replace.
214
+
215
+ Unlike those two, nothing is published into ``os.environ``: other threads (a gateway spawn snapshotting the
216
+ environment) must never see another profile's key, and ``runtime.env`` alone owns this process's environment.
217
+ Values are trimmed and an empty one is skipped; a value the Agent would strip or quote is refused. Every key is
218
+ checked against the Agent's refusals before the write, and the file ends 0600.
219
+ """
220
+ if not isinstance(updates, dict) or not all(isinstance(k, str) and _ENV_NAME.match(k) and (v is None or isinstance(v, str)) for k, v in updates.items()):
221
+ raise InvalidParams("updates must map variable names to strings or null")
222
+ changes: dict[str, str | None] = {}
223
+ for key, value in updates.items():
224
+ if value is not None:
225
+ value = value.strip()
226
+ if not value:
227
+ continue
228
+ if "\n" in value or "\r" in value:
229
+ raise InvalidParams("API key must not contain newline characters.")
230
+ # The Agent would strip non-ASCII and quote the rest; refused instead, so the running process and the
231
+ # server's reader see exactly the bytes the file holds.
232
+ if any(not "!" <= c <= "~" or c in "#\"'" for c in value):
233
+ raise InvalidParams("API key must not contain spaces, quotes, '#' or non-ASCII characters.")
234
+ changes[key] = value
235
+ from hermes_cli import config as agent_config
236
+
237
+ with scoped_home(home):
238
+ for key, value in changes.items():
239
+ refusal = _env_refusal(agent_config, key, "remove" if value is None else "set")
240
+ if refusal:
241
+ raise RpcError(refusal, condition="env_write_refused")
242
+ try:
243
+ agent_config.ensure_hermes_home()
244
+ path = agent_config.get_env_path()
245
+ with _env_lock(agent_config, path):
246
+ existed = path.exists()
247
+ lines = agent_config._read_env_lines(path) if existed else []
248
+ before = list(lines)
249
+ for key, value in changes.items():
250
+ defines = agent_config._env_line_defines_key
251
+ if value is None:
252
+ lines = [line for line in lines if not defines(line, key)]
253
+ continue
254
+ agent_config.validate_env_var_name_for_write(key)
255
+ entry = f"{key}={value}\n"
256
+ at = next((i for i, line in enumerate(lines) if defines(line, key)), None)
257
+ if at is not None:
258
+ lines[at] = entry
259
+ else:
260
+ if lines and not lines[-1].endswith("\n"):
261
+ lines[-1] += "\n"
262
+ lines.append(entry)
263
+ if lines != before:
264
+ agent_config._write_env_lines(path, lines, preserve_mode=existed)
265
+ except TimeoutError as exc:
266
+ raise RpcError(str(exc), condition="env_locked") from exc
267
+ except ValueError as exc:
268
+ raise RpcError(str(exc), condition="env_write_refused") from exc
269
+ agent_config.invalidate_env_cache()
270
+ if path.exists():
271
+ os.chmod(path, 0o600)
272
+ return {"ok": True, "path": str(path)}
273
+
274
+
104
275
  def reasoning_efforts(model: str, provider: str) -> dict:
105
276
  """Levels the Agent would offer for ``model`` on ``provider`` (``hermes_cli.main_provider_setup``)."""
106
277
  efforts: list[str] | None = None
@@ -122,6 +293,16 @@ def reasoning_efforts(model: str, provider: str) -> dict:
122
293
  return {"efforts": [str(e) for e in (efforts or [])], "supports_reasoning": supports_reasoning}
123
294
 
124
295
 
296
+ def personalities(config) -> list[dict]:
297
+ """TAL-901: ``config``'s personalities as the Agent offers them (``hermes_cli.personality``), with its list preview
298
+ and rendered prompt."""
299
+ from hermes_cli.personality import available_personalities, describe_personality, render_personality_prompt
300
+
301
+ if not isinstance(config, dict):
302
+ raise InvalidParams("config must be a mapping")
303
+ return [{"name": name, "description": describe_personality(value), "prompt": render_personality_prompt(value)} for name, value in available_personalities(config).items()]
304
+
305
+
125
306
  def register(registry) -> None:
126
307
  @registry.method("config.get", requires_agent=False)
127
308
  def get(ctx: CallContext, params: dict) -> dict:
@@ -129,9 +310,17 @@ def register(registry) -> None:
129
310
 
130
311
  @registry.method("config.set", requires_agent=False)
131
312
  def set_(ctx: CallContext, params: dict) -> dict:
132
- return write_config(config_path_param(params), params.get("config"))
313
+ return write_config(config_path_param(params), params.get("config"), profile_home=profile_home_param(params))
314
+
315
+ @registry.method("config.env_write")
316
+ def env_write_(ctx: CallContext, params: dict) -> dict:
317
+ return env_write(profile_home_param(params), params.get("updates"))
133
318
 
134
319
  @registry.method("models.reasoning_efforts")
135
320
  def efforts(ctx: CallContext, params: dict) -> dict:
136
321
  with scoped_home(profile_home_param(params)):
137
322
  return reasoning_efforts(str(params.get("model") or ""), str(params.get("provider") or ""))
323
+
324
+ @registry.method("personalities.list")
325
+ def personalities_(ctx: CallContext, params: dict) -> dict:
326
+ return {"personalities": personalities(params.get("config"))}
@@ -0,0 +1,375 @@
1
+ """``connectors.*``: Nous tool-gateway apps over the Agent's portal client (TAL-818).
2
+
3
+ The page's reads and writes (catalog, accounts, remove, tools, policy) call ``PortalConnectorClient``; a connect
4
+ runs the Agent's account-owned operation (``tools.connectors.account``), and a chat's ``manage_connections`` card
5
+ registers its session operation here through ``remember_chat_operation``. Every call runs under the profile's
6
+ ``scoped_home``; the server composes what the page and card show.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import inspect
12
+ import json
13
+ import logging
14
+ import threading
15
+ from collections import OrderedDict
16
+ from pathlib import Path
17
+ from types import SimpleNamespace
18
+
19
+ from ..errors import InvalidParams, RpcError
20
+ from ..home import profile_home_param, scoped_home
21
+ from ..rpc import CallContext
22
+
23
+ log = logging.getLogger("talaria_sidecar.connectors")
24
+
25
+ # Operations the page or a chat card may still read, by (profile home, op_id). The Agent's ``live`` registry drops an
26
+ # operation once it settles, so its final state is kept here for the next poll. Only settled operations age out (oldest
27
+ # first, past 64): an open one is someone's card, and the Agent bounds those (one per session, settled by its deadline).
28
+ _OPS: OrderedDict[tuple[str, str], object] = OrderedDict()
29
+ _OPS_CAP = 64
30
+ _OPS_LOCK = threading.Lock()
31
+
32
+
33
+ def available() -> bool:
34
+ try:
35
+ from tools.connectors import connectors_available
36
+ except Exception: # noqa: BLE001 - an Agent without connectors
37
+ return False
38
+ return bool(connectors_available())
39
+
40
+
41
+ def _open(*, creates_guest: bool = False) -> None:
42
+ """Only explicit Connect may provision; every other page action is noncreating."""
43
+ if not available():
44
+ raise RpcError("Connectors are not available.", condition="connectors_unavailable")
45
+ if not creates_guest:
46
+ return
47
+ try:
48
+ from tools.connectors import ensure_guest_identity
49
+ except Exception: # noqa: BLE001 - an Agent before guest identities
50
+ return
51
+ if failure := ensure_guest_identity():
52
+ raise RpcError(failure, condition="connectors_failed")
53
+
54
+
55
+ def _portal(*, refresh_auth: bool = False):
56
+ from tools.connectors.portal.client import PortalConnectorClient
57
+
58
+ # Explicit writes retain native refresh; reads never acquire that authority.
59
+ if refresh_auth:
60
+ return PortalConnectorClient()
61
+ from tools.managed_tool_gateway import peek_nous_access_token
62
+
63
+ # The normal token reader may refresh and replace a dead guest. Page reads must never own auth writes.
64
+ def headers(_url):
65
+ token = peek_nous_access_token()
66
+ return {"Authorization": f"Bearer {token}"} if token else {}
67
+
68
+ return PortalConnectorClient(header_provider=headers)
69
+
70
+
71
+ def _authenticated(client) -> bool:
72
+ from tools.connectors.gateway.errors import GatewayAuthError
73
+
74
+ try:
75
+ client.require_authentication()
76
+ except GatewayAuthError as exc:
77
+ if getattr(exc, "code", None) == "NO_TOKEN":
78
+ return False
79
+ raise
80
+ return True
81
+
82
+
83
+ def _failure(exc: Exception) -> RpcError:
84
+ """The Agent's connector errors as RPC conditions (its desktop RPC's reasons)."""
85
+ from tools.connectors.gateway.errors import GatewayAuthError
86
+
87
+ code = getattr(exc, "code", None)
88
+ if isinstance(exc, GatewayAuthError):
89
+ if code in {"no_access", "ORG_ACCESS_DENIED", "forbidden"}:
90
+ return RpcError("This account cannot manage connectors.", condition="connectors_forbidden")
91
+ return RpcError("Sign in to Nous Portal to use connectors.", condition="connectors_sign_in")
92
+ if code == "policy_changed":
93
+ return RpcError("Connector rules changed. Refresh and try again.", condition="policy_conflict")
94
+ if code == "org_required":
95
+ return RpcError("Select an organization to manage connector rules.", condition="connectors_org_required")
96
+ if code in {"forbidden", "no_access"}:
97
+ return RpcError("Connector rules cannot be changed for this account.", condition="connectors_forbidden")
98
+ if code == "invalid_connector_policy" or (code == "HTTP_400" and getattr(exc, "status", None) == 400):
99
+ return RpcError("Connector rule change is invalid.", condition="policy_invalid")
100
+ if code == "connection_not_found":
101
+ return RpcError("Connector account not found.", condition="connection_not_found")
102
+ log.warning("connector request failed: %s", type(exc).__name__)
103
+ return RpcError("Connector request failed.", condition="connectors_failed")
104
+
105
+
106
+ def _slug(params: dict, key: str = "connector") -> str:
107
+ raw = params.get(key)
108
+ from tools.connectors.portal.client import validate_slug
109
+ from tools.connectors.portal.errors import InvalidConnectorSlug
110
+
111
+ try:
112
+ validate_slug(raw if isinstance(raw, str) else "")
113
+ except InvalidConnectorSlug as exc:
114
+ raise InvalidParams(f"{key} must be a connector slug") from exc
115
+ return raw
116
+
117
+
118
+ def catalog() -> dict:
119
+ client = _portal()
120
+ if _authenticated(client):
121
+ rows = client.catalog().connectors
122
+ elif callable(public_catalog := getattr(client, "public_catalog", None)):
123
+ rows = public_catalog().connectors
124
+ else:
125
+ raise RpcError("Sign in to Nous Portal to use connectors.", condition="connectors_sign_in")
126
+ return {"connectors": [row.model_dump(mode="json") for row in rows]}
127
+
128
+
129
+ def accounts() -> dict:
130
+ client = _portal()
131
+ if not _authenticated(client):
132
+ return {"accounts": []}
133
+ return {"accounts": [{
134
+ "connection_id": row["connectionId"], "connector": row["connector"], "status": row["status"],
135
+ "status_reason": row.get("statusReason"), "label": row["label"], "alias": row.get("alias"),
136
+ "active": bool(row["active"]), "disabled": bool(row.get("disabled")), "created_at": row["createdAt"],
137
+ } for row in client.list_accounts()]}
138
+
139
+
140
+ def remove(connection_id: str) -> dict:
141
+ removed = _portal(refresh_auth=True).delete_account(connection_id)
142
+ return {"connection_id": removed["connectionId"], "connector": removed["connector"], "status": removed["status"]}
143
+
144
+
145
+ def tools(slug: str, *, refresh: bool) -> dict:
146
+ from tools.connectors.gateway.errors import GatewayUnavailable
147
+ from tools.connectors.portal.tools_cache import read_tools
148
+
149
+ client = _portal()
150
+ client.require_authentication()
151
+ try:
152
+ listing = read_tools(slug, client=client, refresh=refresh)
153
+ except GatewayUnavailable as exc:
154
+ raise RpcError("Connector not found.", condition="connector_not_found") from exc
155
+ keep = ("slug", "name", "description", "facet", "hints", "categories", "deprecated")
156
+ return {"connector": listing.connector, "tools": [{k: v for k, v in tool.model_dump(mode="json").items() if k in keep} for tool in listing.tools]}
157
+
158
+
159
+ def policy() -> dict:
160
+ client = _portal()
161
+ client.require_authentication()
162
+ current = client.policy()
163
+ return {
164
+ "layers": [{"kind": layer.kind, "revision": layer.revision, "body": layer.body.model_dump(mode="json", exclude_none=True)} for layer in current.layers],
165
+ "effective": current.effective.model_dump(mode="json", exclude_none=True, exclude={"version", "issued_at_ms"}),
166
+ }
167
+
168
+
169
+ def set_policy(connector: str, expected_revision: str, *, enabled: bool | None = None, tool: str | None = None, tool_enabled: bool | None = None) -> dict:
170
+ """One member-layer change on top of the portal's current member rules: an app on or off, or one of its tools.
171
+ The portal refuses the write when ``expected_revision`` is no longer its member revision."""
172
+ from tools.connectors.portal.policy import InvalidMemberPolicy, compose_connector_write, compose_tools_write
173
+
174
+ client = _portal(refresh_auth=True)
175
+ client.require_authentication()
176
+ member = next((layer.body for layer in client.policy().layers if layer.kind == "member"), None)
177
+ try:
178
+ if tool is None:
179
+ body = compose_connector_write(member, SimpleNamespace(connector=connector, enabled=bool(enabled)))
180
+ else:
181
+ rule = (getattr(member, "tools", None) or {}).get(connector)
182
+ disabled = [name for name in (rule.disable if rule else []) if name != tool] + ([] if tool_enabled else [tool])
183
+ body = compose_tools_write(member, SimpleNamespace(connector=connector, disabled_tools=disabled))
184
+ except InvalidMemberPolicy as exc:
185
+ raise RpcError("Connector rule change is invalid.", condition="policy_invalid") from exc
186
+ body["expectedRevision"] = expected_revision
187
+ return {"revision": client.set_policy(body).revision}
188
+
189
+
190
+ def _remember(home: Path, operation) -> None:
191
+ with _OPS_LOCK:
192
+ _OPS[(str(home), operation.op_id)] = operation
193
+ _OPS.move_to_end((str(home), operation.op_id))
194
+ settled = [key for key, op in _OPS.items() if op.settled]
195
+ for key in settled[:max(0, len(_OPS) - _OPS_CAP)]:
196
+ del _OPS[key]
197
+
198
+
199
+ def _operation(home: Path, op_id: str):
200
+ with _OPS_LOCK:
201
+ operation = _OPS.get((str(home), op_id))
202
+ if operation is None:
203
+ raise RpcError("No connection operation with that id.", condition="operation_not_found")
204
+ return operation
205
+
206
+
207
+ def operation_view(operation) -> dict:
208
+ """The operation as the sidecar reports it: every target's state, the vendor's text, the authorization link while
209
+ the target waits on it (the Agent keeps a used link on a connected target), and the credentials an MCP install
210
+ still asks for."""
211
+ snapshot = operation.snapshot()
212
+ return {
213
+ "op_id": snapshot["op_id"],
214
+ "settled": snapshot.get("settled_at") is not None,
215
+ # The Connectors page's own operations are account-owned; a chat's carry the tool call that opened the card.
216
+ "owner": "account" if operation.session_key.startswith("account:") else "session",
217
+ "tool_call_id": operation.tool_call_id,
218
+ "targets": [{
219
+ "name": target["name"], "kind": target["kind"], "state": target["state"], "detail": target.get("detail") or "",
220
+ "connect_url": target.get("connect_url") if target["state"] == "initiated" else None,
221
+ "required_env": [{
222
+ "name": str(field.get("name") or ""), "prompt": str(field.get("prompt") or ""), "required": bool(field.get("required")),
223
+ "secret": bool(field.get("secret", True)),
224
+ } for field in target.get("required_env") or [] if isinstance(field, dict) and field.get("name")],
225
+ } for target in snapshot["targets"]],
226
+ }
227
+
228
+
229
+ def connect(home: Path, connector: str) -> dict:
230
+ """Start (or rejoin) the account-owned connect for ``connector`` and wait for its authorization link."""
231
+ from tools.connectors import account
232
+ from tools.connectors.contract import TargetState
233
+ from tools.connectors.run import reissue
234
+
235
+ # The gateway attributes each link to who asked; the Agent names its Connectors page ``desktop_page`` (v0.22.0).
236
+ page = {"initiator": "desktop_page"} if "initiator" in inspect.signature(account.find_or_start_operation).parameters else {}
237
+ start = account.find_or_start_operation([connector], action="connect", profile_home=str(home), **page)
238
+ _remember(home, start.operation)
239
+ if not start.started:
240
+ target = start.operation.target(connector)
241
+ if target is not None and target.state in (TargetState.failed, TargetState.expired) and reissue(start.operation, [connector], **page):
242
+ raise RpcError("This connection cannot be started again.", condition="operation_refused")
243
+ return operation_view(start.operation)
244
+ if account.wait_for_prepare(start) and start.failed:
245
+ raise RpcError("Connector request failed.", condition="connectors_failed")
246
+ return operation_view(start.operation)
247
+
248
+
249
+ def respond(home: Path, op_id: str, action: str, target: str | None, env: dict) -> dict:
250
+ """The card's move: Skip or Retry one target, Approve an MCP install with its credentials, or Continue."""
251
+ from tools.connectors.contract import SettleReason
252
+ from tools.connectors.operation import IllegalTransition
253
+ from tools.connectors.run import apply_answer, reissue
254
+
255
+ operation = _operation(home, op_id)
256
+ if operation.settled:
257
+ raise RpcError("The connection operation has settled.", condition="operation_settled")
258
+ row = operation.target(target) if target else None
259
+ if action != "continue" and row is None:
260
+ raise InvalidParams("target must name a target of the operation")
261
+ try:
262
+ if action == "continue":
263
+ apply_answer(operation, json.dumps({"settled_by": SettleReason.continue_.value}))
264
+ elif action == "retry" and row.kind == "connector":
265
+ if reissue(operation, [row.name]):
266
+ raise RpcError("This target cannot be run again.", condition="operation_refused")
267
+ else:
268
+ status = "skipped" if action == "skip" else "approved"
269
+ apply_answer(operation, json.dumps({"targets": [{"name": row.name, "status": status, "env": env}]}))
270
+ except IllegalTransition as exc:
271
+ # The operation moved between the server's check and this answer (the watcher connected the target meanwhile).
272
+ raise RpcError("That move is no longer open on this connection.", condition="operation_refused") from exc
273
+ operation.settle_if_all_resolved()
274
+ return operation_view(operation)
275
+
276
+
277
+ def remember_chat_operation(home: Path, payload: dict) -> dict | None:
278
+ """A chat's ``manage_connections`` card opened: keep its operation for the card's reads and moves, and answer the
279
+ frame the turn streams. None when the Agent's registry no longer holds it."""
280
+ from tools.connectors import live
281
+
282
+ op_id = payload.get("op_id") if isinstance(payload, dict) else None
283
+ operation = live.get_by_op_id(op_id, profile_home=str(home)) if isinstance(op_id, str) else None
284
+ if operation is None:
285
+ return None
286
+ _remember(home, operation)
287
+ return operation_view(operation)
288
+
289
+
290
+ def register(registry_) -> None:
291
+ def page(params: dict, read, *, creates_guest: bool = False):
292
+ with scoped_home(profile_home_param(params)):
293
+ _open(creates_guest=creates_guest)
294
+ try:
295
+ return read()
296
+ except RpcError:
297
+ raise
298
+ except Exception as exc: # noqa: BLE001 - the Agent's gateway errors become RPC conditions
299
+ raise _failure(exc) from exc
300
+
301
+ @registry_.method("connectors.available")
302
+ def available_(ctx: CallContext, params: dict) -> dict:
303
+ with scoped_home(profile_home_param(params)):
304
+ return {"available": available()}
305
+
306
+ @registry_.method("connectors.catalog")
307
+ def catalog_(ctx: CallContext, params: dict) -> dict:
308
+ return page(params, catalog)
309
+
310
+ @registry_.method("connectors.accounts")
311
+ def accounts_(ctx: CallContext, params: dict) -> dict:
312
+ return page(params, accounts)
313
+
314
+ @registry_.method("connectors.remove")
315
+ def remove_(ctx: CallContext, params: dict) -> dict:
316
+ connection_id = params.get("connection_id")
317
+ if not isinstance(connection_id, str) or not connection_id:
318
+ raise InvalidParams("connection_id is required")
319
+ return page(params, lambda: remove(connection_id))
320
+
321
+ @registry_.method("connectors.tools")
322
+ def tools_(ctx: CallContext, params: dict) -> dict:
323
+ slug = _slug(params)
324
+ return page(params, lambda: tools(slug, refresh=params.get("refresh") is True))
325
+
326
+ @registry_.method("connectors.policy.get")
327
+ def policy_(ctx: CallContext, params: dict) -> dict:
328
+ return page(params, policy)
329
+
330
+ @registry_.method("connectors.policy.set")
331
+ def set_policy_(ctx: CallContext, params: dict) -> dict:
332
+ slug = _slug(params)
333
+ revision = params.get("expected_revision")
334
+ if not isinstance(revision, str) or not revision:
335
+ raise InvalidParams("expected_revision is required")
336
+ tool = params.get("tool")
337
+ if tool is None:
338
+ if not isinstance(params.get("enabled"), bool):
339
+ raise InvalidParams("enabled is required")
340
+ return page(params, lambda: set_policy(slug, revision, enabled=params["enabled"]))
341
+ if not isinstance(tool, str) or not tool or not isinstance(params.get("tool_enabled"), bool):
342
+ raise InvalidParams("tool and tool_enabled are required together")
343
+ return page(params, lambda: set_policy(slug, revision, tool=tool, tool_enabled=params["tool_enabled"]))
344
+
345
+ @registry_.method("connectors.connect")
346
+ def connect_(ctx: CallContext, params: dict) -> dict:
347
+ slug = _slug(params)
348
+ home = profile_home_param(params)
349
+ return page(params, lambda: connect(home, slug), creates_guest=True)
350
+
351
+ def gated() -> None:
352
+ # Reads and moves on an operation pass the availability gate too, without creating an identity.
353
+ if not available():
354
+ raise RpcError("Connectors are not available.", condition="connectors_unavailable")
355
+
356
+ @registry_.method("connectors.operation")
357
+ def operation_(ctx: CallContext, params: dict) -> dict:
358
+ home = profile_home_param(params)
359
+ with scoped_home(home):
360
+ gated()
361
+ return operation_view(_operation(home, str(params.get("op_id") or "")))
362
+
363
+ @registry_.method("connectors.respond")
364
+ def respond_(ctx: CallContext, params: dict) -> dict:
365
+ home = profile_home_param(params)
366
+ action = params.get("action")
367
+ if action not in ("skip", "retry", "approve", "continue"):
368
+ raise InvalidParams("action must be skip, retry, approve or continue")
369
+ target = params.get("target")
370
+ env = params.get("env") or {}
371
+ if not isinstance(env, dict) or not all(isinstance(k, str) and isinstance(v, str) for k, v in env.items()):
372
+ raise InvalidParams("env must map names to strings")
373
+ with scoped_home(home):
374
+ gated()
375
+ return respond(home, str(params.get("op_id") or ""), action, target if isinstance(target, str) else None, env)