@xopcai/xopc 0.0.105 → 0.0.107

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 (430) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/xopc.extension.json +7 -2
  3. package/dist/extensions/fal/xopc.extension.json +7 -2
  4. package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
  5. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
  6. package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
  7. package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
  8. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  9. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
  10. package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
  11. package/dist/extensions/feishu/src/plugin.d.ts +6 -3
  12. package/dist/extensions/feishu/src/plugin.js +59 -40
  13. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  14. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
  15. package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
  16. package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
  17. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  18. package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
  19. package/dist/extensions/feishu/src/workflow-progress.js +3 -3
  20. package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +458 -26
  22. package/dist/extensions/google/xopc.extension.json +7 -2
  23. package/dist/extensions/minimax/xopc.extension.json +8 -2
  24. package/dist/extensions/openai/xopc.extension.json +7 -2
  25. package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
  26. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
  27. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  28. package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
  29. package/dist/extensions/telegram/src/command-handler.js +11 -9
  30. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  31. package/dist/extensions/telegram/src/inbound-processor.js +2 -3
  32. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  33. package/dist/extensions/telegram/src/plugin.d.ts +1 -0
  34. package/dist/extensions/telegram/src/plugin.js +7 -7
  35. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  36. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  37. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  38. package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
  39. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  40. package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
  41. package/dist/extensions/telegram/xopc.extension.json +10 -2
  42. package/dist/extensions/weixin/src/api/api.js +2 -2
  43. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  44. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  45. package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
  46. package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
  47. package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
  48. package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
  49. package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
  50. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  51. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  52. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  53. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  54. package/dist/extensions/weixin/src/plugin.d.ts +1 -0
  55. package/dist/extensions/weixin/src/plugin.js +8 -7
  56. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  57. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  58. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  59. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  60. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  61. package/dist/extensions/weixin/xopc.extension.json +57 -14
  62. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  63. package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
  64. package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
  65. package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
  66. package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
  67. package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-CZh0c-s8.js} +1 -1
  68. package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-DyJQR0SR.js} +1 -1
  69. package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CDTuUr9B.js} +1 -1
  70. package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-DszZ8zHD.js} +1 -1
  71. package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
  72. package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
  73. package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-U10wnPdc.js} +1 -1
  74. package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
  75. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
  76. package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-B6js8Bfi.js} +2 -2
  77. package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-DFzAXR35.js} +4 -4
  78. package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-DOiSU-10.js} +1 -1
  79. package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
  80. package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-zM36dvbY.js} +1 -1
  81. package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BCvObK1y.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-Bvl-RInc.js} +1 -1
  84. package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
  85. package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-rpL4DDTO.js} +1 -1
  86. package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
  87. package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
  88. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
  89. package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-BxacHYen.js} +1 -1
  91. package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
  92. package/dist/gateway/static/root/favicon-16.png +0 -0
  93. package/dist/gateway/static/root/favicon-32.png +0 -0
  94. package/dist/gateway/static/root/favicon.ico +0 -0
  95. package/dist/gateway/static/root/favicon.svg +18 -0
  96. package/dist/gateway/static/root/index.html +11 -10
  97. package/dist/package.js +1 -1
  98. package/dist/src/agent/agent-manager.js +7 -7
  99. package/dist/src/agent/agent-scope.js +1 -1
  100. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  101. package/dist/src/agent/context/workspace-seed.js +2 -2
  102. package/dist/src/agent/context/workspace-state.js +1 -1
  103. package/dist/src/agent/goals/goal-run-store.js +4 -4
  104. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  105. package/dist/src/agent/goals/post-turn.js +2 -2
  106. package/dist/src/agent/image/load-image-media.js +2 -2
  107. package/dist/src/agent/ipc/bus.js +1 -1
  108. package/dist/src/agent/ipc/inbox.js +2 -2
  109. package/dist/src/agent/ipc/socket.js +1 -1
  110. package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
  111. package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  113. package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
  114. package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
  115. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  116. package/dist/src/agent/mcp/mcp-http.js +1 -1
  117. package/dist/src/agent/mcp/mcp-http.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +3 -7
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  121. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  122. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  123. package/dist/src/agent/memory/dreaming/events.js +1 -1
  124. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  125. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  126. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  127. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  128. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  129. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  130. package/dist/src/agent/memory/memory-flush.js +1 -1
  131. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  132. package/dist/src/agent/models/manager.js +1 -1
  133. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +2 -2
  137. package/dist/src/agent/service.js +4 -4
  138. package/dist/src/agent/session/session-inspector.js +1 -1
  139. package/dist/src/agent/skills/config.js +1 -1
  140. package/dist/src/agent/skills/hub-hash.js +2 -2
  141. package/dist/src/agent/skills/hub-lock.js +1 -1
  142. package/dist/src/agent/skills/hub-pull.js +2 -2
  143. package/dist/src/agent/skills/index.js +1 -1
  144. package/dist/src/agent/skills/managed-store.js +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
  146. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
  147. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  148. package/dist/src/agent/skills/scanner.js +1 -1
  149. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  150. package/dist/src/agent/skills/skill-manager.js +1 -1
  151. package/dist/src/agent/starter-agents.d.ts +19 -0
  152. package/dist/src/agent/starter-agents.js +190 -0
  153. package/dist/src/agent/starter-agents.js.map +1 -0
  154. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  155. package/dist/src/agent/tools/factory.js +1 -1
  156. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  157. package/dist/src/agent/tools/send-media.js +1 -1
  158. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  159. package/dist/src/agent/tools/workflow-tool.js +1 -1
  160. package/dist/src/agent/tools/write.js +1 -1
  161. package/dist/src/agent/workflow/catalog.js +1 -1
  162. package/dist/src/agent/workflow/index.js +2 -1
  163. package/dist/src/agent/workflow/runtime.d.ts +2 -2
  164. package/dist/src/agent/workflow/runtime.js +50 -29
  165. package/dist/src/agent/workflow/runtime.js.map +1 -1
  166. package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
  167. package/dist/src/agent/workflow/snapshot-empty.js +19 -0
  168. package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
  169. package/dist/src/agent/workflow/snapshot.js +1 -1
  170. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  171. package/dist/src/agent/workflow/types.d.ts +11 -0
  172. package/dist/src/auth/credentials.js +3 -3
  173. package/dist/src/auth/profiles/store.js +2 -2
  174. package/dist/src/auth/sync-provider-auth.js +1 -1
  175. package/dist/src/browser/cache-dir-policy.js +1 -1
  176. package/dist/src/browser/cdp-local-launcher.js +2 -2
  177. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  178. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  179. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  180. package/dist/src/browser/stealth.js +1 -1
  181. package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
  182. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  183. package/dist/src/channels/outbound/persist-store.js +1 -1
  184. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  185. package/dist/src/channels/pairing/pairing-store.js +2 -2
  186. package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
  187. package/dist/src/chat-commands/agent-edit.js +2 -2
  188. package/dist/src/chat-commands/builtins/config.js +2 -2
  189. package/dist/src/chat-commands/context.js +1 -1
  190. package/dist/src/cli/commands/config.js +1 -1
  191. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  192. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  194. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  195. package/dist/src/cli/commands/extension-create.d.ts +2 -0
  196. package/dist/src/cli/commands/extension-create.js +165 -0
  197. package/dist/src/cli/commands/extension-create.js.map +1 -0
  198. package/dist/src/cli/commands/extension-dev.js +1 -3
  199. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  200. package/dist/src/cli/commands/extension-marketplace.js +105 -81
  201. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  202. package/dist/src/cli/commands/extension-pack.d.ts +13 -0
  203. package/dist/src/cli/commands/extension-pack.js +159 -91
  204. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  205. package/dist/src/cli/commands/extension.d.ts +2 -0
  206. package/dist/src/cli/commands/extension.js +375 -3
  207. package/dist/src/cli/commands/extension.js.map +1 -1
  208. package/dist/src/cli/commands/gateway/logs.js +1 -1
  209. package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
  210. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  211. package/dist/src/cli/commands/image.js +1 -1
  212. package/dist/src/cli/commands/init.js +3 -3
  213. package/dist/src/cli/commands/models.js +1 -1
  214. package/dist/src/cli/commands/onboard/model.js +2 -2
  215. package/dist/src/cli/commands/onboard.js +0 -2
  216. package/dist/src/cli/commands/onboard.js.map +1 -1
  217. package/dist/src/cli/commands/setup.js +0 -2
  218. package/dist/src/cli/commands/setup.js.map +1 -1
  219. package/dist/src/cli/utils/init-workspace-core.js +10 -7
  220. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  221. package/dist/src/config/agent-profile.js +1 -1
  222. package/dist/src/config/agent-typed-models.js +1 -1
  223. package/dist/src/config/gateway-bind.js +1 -1
  224. package/dist/src/config/index.js +5 -5
  225. package/dist/src/config/loader.js +2 -2
  226. package/dist/src/config/models-json.js +2 -2
  227. package/dist/src/config/paths-state.js +1 -1
  228. package/dist/src/config/paths.d.ts +2 -2
  229. package/dist/src/config/paths.js +6 -5
  230. package/dist/src/config/paths.js.map +1 -1
  231. package/dist/src/config/profile.js +2 -2
  232. package/dist/src/config/schema.d.ts +2 -0
  233. package/dist/src/config/schema.js +3 -1
  234. package/dist/src/config/schema.js.map +1 -1
  235. package/dist/src/config/workspace-path.js +1 -1
  236. package/dist/src/connectors/health.js +1 -1
  237. package/dist/src/connectors/install.js +1 -1
  238. package/dist/src/cron/executor.js +2 -2
  239. package/dist/src/cron/persistence.js +1 -1
  240. package/dist/src/daemon/constants.js +1 -1
  241. package/dist/src/daemon/install-plan.js +2 -2
  242. package/dist/src/daemon/launchd.js +2 -2
  243. package/dist/src/daemon/schtasks.js +2 -2
  244. package/dist/src/daemon/systemd.js +2 -2
  245. package/dist/src/extensions/api.d.ts +4 -2
  246. package/dist/src/extensions/api.js +31 -12
  247. package/dist/src/extensions/api.js.map +1 -1
  248. package/dist/src/extensions/bundle-mcp.js +1 -1
  249. package/dist/src/extensions/discover-extensions.js +2 -1
  250. package/dist/src/extensions/discover-extensions.js.map +1 -1
  251. package/dist/src/extensions/health.js +1 -1
  252. package/dist/src/extensions/install.d.ts +1 -0
  253. package/dist/src/extensions/install.js +51 -8
  254. package/dist/src/extensions/install.js.map +1 -1
  255. package/dist/src/extensions/loader.d.ts +0 -4
  256. package/dist/src/extensions/loader.js +55 -88
  257. package/dist/src/extensions/loader.js.map +1 -1
  258. package/dist/src/extensions/lockfile.d.ts +9 -1
  259. package/dist/src/extensions/lockfile.js +2 -2
  260. package/dist/src/extensions/lockfile.js.map +1 -1
  261. package/dist/src/extensions/normalize-manifest.js +20 -4
  262. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  263. package/dist/src/extensions/package-contract.d.ts +12 -0
  264. package/dist/src/extensions/package-contract.js +59 -0
  265. package/dist/src/extensions/package-contract.js.map +1 -0
  266. package/dist/src/extensions/sdk/core.d.ts +1 -1
  267. package/dist/src/extensions/sdk/index.d.ts +1 -1
  268. package/dist/src/extensions/sdk/index.js.map +1 -1
  269. package/dist/src/extensions/types/manifest.d.ts +15 -0
  270. package/dist/src/extensions/update.js +1 -1
  271. package/dist/src/gateway/agents-admin.d.ts +0 -8
  272. package/dist/src/gateway/agents-admin.js +3 -28
  273. package/dist/src/gateway/agents-admin.js.map +1 -1
  274. package/dist/src/gateway/file-path-classifier.js +2 -2
  275. package/dist/src/gateway/heartbeat/service.js +1 -1
  276. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  277. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  278. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  279. package/dist/src/gateway/hono/oauth-async.js +1 -1
  280. package/dist/src/gateway/hono/oauth.js +1 -1
  281. package/dist/src/gateway/hono/routes/agents.js +2 -56
  282. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  283. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  284. package/dist/src/gateway/hono/routes/channels.js +10 -1
  285. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  287. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  288. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  289. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  290. package/dist/src/gateway/hono/routes/models.js +1 -1
  291. package/dist/src/gateway/hono/routes/shares.js +1 -1
  292. package/dist/src/gateway/hono/routes/workflows.js +130 -0
  293. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  295. package/dist/src/gateway/lock.js +3 -3
  296. package/dist/src/gateway/ports.js +1 -1
  297. package/dist/src/gateway/service/agent-runner.js +2 -2
  298. package/dist/src/gateway/service/marketplace-service.js +2 -2
  299. package/dist/src/gateway/service.d.ts +2 -0
  300. package/dist/src/gateway/service.js +45 -1
  301. package/dist/src/gateway/service.js.map +1 -1
  302. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  303. package/dist/src/heartbeat/index.js +1 -1
  304. package/dist/src/infra/brew.js +1 -1
  305. package/dist/src/infra/package-json.js +1 -1
  306. package/dist/src/infra/package-update-steps.js +1 -1
  307. package/dist/src/infra/path-env.js +2 -2
  308. package/dist/src/infra/restart.js +2 -2
  309. package/dist/src/infra/stable-node-path.js +1 -1
  310. package/dist/src/infra/update-check.js +1 -1
  311. package/dist/src/infra/update-global.js +1 -1
  312. package/dist/src/infra/update-lock.js +3 -3
  313. package/dist/src/infra/update-runner.js +1 -1
  314. package/dist/src/infra/update-startup.js +2 -2
  315. package/dist/src/infra/write-file-atomic.js +2 -2
  316. package/dist/src/media/store.js +1 -1
  317. package/dist/src/notes/agent-context.d.ts +12 -4
  318. package/dist/src/notes/agent-context.js +1 -1
  319. package/dist/src/notes/agent-context.js.map +1 -1
  320. package/dist/src/notes/store.js +2 -2
  321. package/dist/src/project-trust/trust-store.js +2 -2
  322. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  323. package/dist/src/providers/index.js +2 -2
  324. package/dist/src/providers/model-registry.js +1 -1
  325. package/dist/src/session/init-session-turn.js +2 -2
  326. package/dist/src/session/resolve-session.js +3 -3
  327. package/dist/src/session/session-title.js +2 -2
  328. package/dist/src/session/store.js +2 -2
  329. package/dist/src/share/share-auto.js +2 -2
  330. package/dist/src/share/share-store.js +3 -3
  331. package/dist/src/share/share-thumbnail.js +2 -2
  332. package/dist/src/share/share-zip.js +1 -1
  333. package/dist/src/share/site-share-store.js +3 -3
  334. package/dist/src/share/site-static-serve.js +1 -1
  335. package/dist/src/storage/sqlite/connection.js +2 -2
  336. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  337. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  338. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  339. package/dist/src/storage/sqlite/schema.js +1 -1
  340. package/dist/src/tui/backends/embedded-backend.js +1 -8
  341. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  342. package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/clipboard-image.js +3 -3
  345. package/dist/src/tui/theme-manager.js +1 -1
  346. package/dist/src/tui/tui-backend.d.ts +0 -1
  347. package/dist/src/tui/tui-command-formatters.js +3 -3
  348. package/dist/src/tui/tui-commands.js +3 -3
  349. package/dist/src/tui/tui-commands.js.map +1 -1
  350. package/dist/src/tui/tui-keybindings-file.js +1 -1
  351. package/dist/src/tui/tui-picker-overlay.js +1 -1
  352. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  353. package/dist/src/tui/tui-scoped-models.js +2 -2
  354. package/dist/src/tui/tui-settings.js +1 -1
  355. package/dist/src/tui/tui-startup-resources.js +2 -2
  356. package/dist/src/tui/tui.js +5 -5
  357. package/dist/src/tunnel/frpc-binary.js +3 -3
  358. package/dist/src/tunnel/frpc-config.js +1 -1
  359. package/dist/src/tunnel/frpc-extract.js +1 -1
  360. package/dist/src/tunnel/tunnel-state.js +1 -1
  361. package/dist/src/utils/logger/audit.js +1 -1
  362. package/dist/src/utils/logger/log-store.js +1 -1
  363. package/dist/src/utils/logger/rotation.js +1 -1
  364. package/dist/src/voice/stt/availability.d.ts +6 -0
  365. package/dist/src/voice/stt/availability.js +14 -6
  366. package/dist/src/voice/stt/availability.js.map +1 -1
  367. package/dist/src/voice/stt/index.js +2 -1
  368. package/dist/src/voice/stt/index.js.map +1 -1
  369. package/dist/src/voice/stt/mention.d.ts +2 -0
  370. package/dist/src/voice/stt/mention.js +20 -0
  371. package/dist/src/voice/stt/mention.js.map +1 -0
  372. package/dist/src/voice/stt/preflight.d.ts +1 -4
  373. package/dist/src/voice/stt/preflight.js +1 -18
  374. package/dist/src/voice/stt/preflight.js.map +1 -1
  375. package/dist/src/voice/tts/audio.js +1 -1
  376. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  377. package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
  378. package/dist/src/workflows/domain/definition-utils.js +32 -2
  379. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  380. package/dist/src/workflows/domain/definition.d.ts +2 -0
  381. package/dist/src/workflows/domain/event.d.ts +2 -1
  382. package/dist/src/workflows/domain/index.d.ts +1 -0
  383. package/dist/src/workflows/domain/index.js +3 -2
  384. package/dist/src/workflows/domain/run.d.ts +27 -1
  385. package/dist/src/workflows/domain/run.js.map +1 -1
  386. package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
  387. package/dist/src/workflows/domain/schema-validation.js +28 -0
  388. package/dist/src/workflows/domain/schema-validation.js.map +1 -0
  389. package/dist/src/workflows/draft/index.d.ts +3 -0
  390. package/dist/src/workflows/draft/index.js +3 -0
  391. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
  392. package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
  393. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
  394. package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
  395. package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
  396. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
  397. package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
  398. package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
  399. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
  400. package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
  401. package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
  402. package/dist/src/workflows/engine/projector.js +1 -0
  403. package/dist/src/workflows/engine/projector.js.map +1 -1
  404. package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
  405. package/dist/src/workflows/engine/workflow-engine.js +320 -11
  406. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  407. package/dist/src/workflows/index.js +4 -3
  408. package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
  409. package/dist/src/workflows/service/workflow-run-service.js +227 -6
  410. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  411. package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
  412. package/dist/src/workflows/store/event-store.js +1 -1
  413. package/dist/src/workflows/store/run-store.js +1 -1
  414. package/package.json +5 -3
  415. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +0 -396
  416. package/dist/gateway/static/root/assets/apps-page-B7Us3RMl.js +0 -1
  417. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +0 -1
  418. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +0 -1
  419. package/dist/gateway/static/root/assets/index-50FVtgXU.js +0 -4845
  420. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
  421. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +0 -1
  422. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +0 -1
  423. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +0 -3
  424. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +0 -2
  425. package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
  426. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +0 -1
  427. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +0 -27
  428. package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
  429. package/dist/src/agent/builtin-agent-ids.js +0 -17
  430. package/dist/src/agent/builtin-agent-ids.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-context.js","names":[],"sources":["../../../src/notes/agent-context.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\n\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../config/schema.js';\nimport type { AgentSourceContext } from '../agent/source-context/types.js';\nimport { getNoteAgentContextRecord, upsertNoteAgentContextRecord } from '../storage/sqlite/index.js';\nimport { mergeSttConfigFromAppConfig } from '../channels/attachments/voice-stt-webchat.js';\nimport { extractDocumentText } from '../document-understanding/extract.js';\nimport { describeImagesWithFallback } from '../agent/image/understanding/runtime.js';\nimport { resolveImageModelConfigForTool } from '../agent/image/tool-model-config.js';\nimport { isSTTAvailable, transcribe } from '../voice/stt/index.js';\nimport type { Note, NoteAttachment } from './types.js';\nimport type { NotesService } from './service.js';\n\nconst MAX_NOTE_MARKDOWN_CHARS = 40_000;\nconst MAX_TEXT_ATTACHMENT_CHARS = 20_000;\nconst MAX_TOTAL_CONTEXT_CHARS = 80_000;\nconst MAX_NATIVE_VISION_IMAGES = 4;\nconst MAX_NATIVE_VISION_IMAGE_BYTES = 8 * 1024 * 1024;\n\nexport interface NoteAgentAttachmentContext {\n attachmentId: string;\n type: NoteAttachment['type'];\n fileName: string;\n mimeType: string;\n size: number;\n status: 'ready' | 'unsupported' | 'failed';\n summary?: string;\n transcript?: string;\n extractedText?: string;\n error?: string;\n}\n\nexport interface NoteAgentContextArtifact {\n noteId: string;\n noteUpdatedAt: number;\n contextVersion: string;\n generatedAt: number;\n text: string;\n attachments: NoteAgentAttachmentContext[];\n tokenEstimate: number;\n truncated: boolean;\n status: 'ready' | 'partial' | 'failed';\n}\n\nconst TEXT_MIME_PREFIXES = ['text/'];\nconst TEXT_MIME_TYPES = new Set([\n 'application/json', 'application/ld+json', 'application/xml', 'application/yaml', 'application/x-yaml',\n 'application/javascript', 'application/typescript',\n]);\nconst TEXT_EXTENSIONS = new Set([\n '.txt', '.md', '.markdown', '.json', '.jsonl', '.csv', '.tsv', '.xml', '.yaml', '.yml', '.log', '.js', '.ts', '.tsx', '.jsx', '.css', '.html', '.sql',\n]);\nconst DOCUMENT_EXTENSIONS = new Set(['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx']);\n\nfunction truncateText(text: string, maxChars: number): { text: string; truncated: boolean } {\n if (text.length <= maxChars) return { text, truncated: false };\n return { text: `${text.slice(0, maxChars)}\\n\\n[truncated ${text.length - maxChars} chars]`, truncated: true };\n}\n\nfunction isTextLikeAttachment(att: NoteAttachment): boolean {\n const mime = att.mimeType.toLowerCase();\n if (TEXT_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix))) return true;\n if (TEXT_MIME_TYPES.has(mime)) return true;\n return TEXT_EXTENSIONS.has(extname(att.fileName).toLowerCase());\n}\n\nfunction isDocumentAttachment(att: NoteAttachment): boolean {\n const mime = att.mimeType.toLowerCase();\n return mime === 'application/pdf'\n || mime.includes('officedocument')\n || DOCUMENT_EXTENSIONS.has(extname(att.fileName).toLowerCase());\n}\n\nfunction formatTime(ms: number | undefined): string {\n return typeof ms === 'number' && Number.isFinite(ms) ? new Date(ms).toISOString() : 'unknown';\n}\n\nasync function readAttachmentBuffer(notesService: NotesService, noteId: string, att: NoteAttachment): Promise<Buffer | null> {\n const located = await notesService.getAttachmentPath(noteId, att.id);\n if (!located) return null;\n return readFile(located.filePath).catch(() => null);\n}\n\nasync function attachmentTextExcerpt(notesService: NotesService, noteId: string, att: NoteAttachment): Promise<string | null> {\n if (!isTextLikeAttachment(att)) return null;\n const located = await notesService.getAttachmentPath(noteId, att.id);\n if (!located) return null;\n const raw = await readFile(located.filePath, 'utf8').catch(() => null);\n if (raw === null) return null;\n return truncateText(raw, MAX_TEXT_ATTACHMENT_CHARS).text;\n}\n\nasync function ensureMediaTranscript(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NotesService;\n config?: Config;\n}): Promise<string | undefined> {\n const existing = params.att.transcript?.trim();\n if (existing) return existing;\n if (params.att.type !== 'audio' && params.att.type !== 'video') return undefined;\n\n const sttConfig = mergeSttConfigFromAppConfig(params.config?.tools?.media?.audio, params.config?.tools?.media);\n if (!isSTTAvailable(sttConfig)) return undefined;\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = await transcribe(buffer, sttConfig);\n const transcript = result.text?.trim();\n if (!transcript) return undefined;\n const attachments = (params.note.attachments ?? []).map((item) =>\n item.id === params.att.id ? { ...item, transcript } : item,\n );\n await params.notesService.updateNote(params.note.id, { attachments }, 'ai_edit').catch(() => null);\n params.att.transcript = transcript;\n return transcript;\n}\n\nasync function describeImageAttachment(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NotesService;\n config?: Config;\n}): Promise<string | undefined> {\n const toolCfg = resolveImageModelConfigForTool({ cfg: params.config });\n const primary = toolCfg?.primary;\n if (!primary) return undefined;\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = await describeImagesWithFallback({\n modelRef: primary,\n fallbacks: toolCfg.fallbacks ?? [],\n images: [{ buffer, mimeType: params.att.mimeType }],\n prompt: `Describe this note attachment for later AI discussion. File name: ${params.att.fileName}. Focus on visible text, diagrams, UI, objects, and any product-relevant details.`,\n maxTokens: 1024,\n timeoutMs: 30_000,\n });\n return result.text.trim() || undefined;\n}\n\nasync function extractDocumentAttachment(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NotesService;\n}): Promise<string | undefined> {\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = extractDocumentText({ buffer, fileName: params.att.fileName, mimeType: params.att.mimeType });\n if (!result.ok) return undefined;\n return truncateText(result.text, MAX_TEXT_ATTACHMENT_CHARS).text;\n}\n\nfunction fallbackImageSummary(att: NoteAttachment): string {\n return `Image attachment available for native vision models: ${att.fileName} (${att.mimeType}, ${att.size} bytes). Configure an image understanding model to persist a text summary for non-vision models.`;\n}\n\nfunction fallbackVideoSummary(att: NoteAttachment): string {\n return `Video attachment available: ${att.fileName} (${att.mimeType}, ${att.size} bytes). Audio transcription will be included when STT accepts this media.`;\n}\n\nfunction unsupportedDocumentSummary(att: NoteAttachment): string {\n return `Document extraction is not available for ${att.fileName} (${att.mimeType}).`;\n}\n\nasync function buildAttachmentContext(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NotesService;\n config?: Config;\n}): Promise<NoteAgentAttachmentContext> {\n const { note, att, notesService, config } = params;\n try {\n if (att.type === 'audio') {\n const transcript = await ensureMediaTranscript({ note, att, notesService, config });\n return transcript\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', transcript }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: 'Audio transcription is not configured or produced no transcript.' };\n }\n const extractedText = await attachmentTextExcerpt(notesService, note.id, att);\n if (extractedText) {\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', extractedText };\n }\n if (att.type === 'image') {\n const summary = await describeImageAttachment({ note, att, notesService, config }).catch(() => undefined);\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: summary ? 'ready' : 'unsupported', summary: summary ?? fallbackImageSummary(att) };\n }\n if (att.type === 'video') {\n const transcript = await ensureMediaTranscript({ note, att, notesService, config }).catch(() => undefined);\n return transcript\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', transcript, summary: fallbackVideoSummary(att) }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: fallbackVideoSummary(att) };\n }\n if (isDocumentAttachment(att)) {\n const extractedDocumentText = await extractDocumentAttachment({ note, att, notesService }).catch(() => undefined);\n return extractedDocumentText\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', extractedText: extractedDocumentText }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: unsupportedDocumentSummary(att) };\n }\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: 'No extractor is configured for this attachment type.' };\n } catch (err) {\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'failed', error: err instanceof Error ? err.message : String(err) };\n }\n}\n\nfunction renderAttachmentContext(att: NoteAgentAttachmentContext): string {\n const lines = [\n `### Attachment: ${att.fileName}`,\n `- id: ${att.attachmentId}`,\n `- type: ${att.type}`,\n `- mimeType: ${att.mimeType}`,\n `- size: ${att.size}`,\n `- status: ${att.status}`,\n ];\n if (att.transcript) lines.push('', 'Transcript:', truncateText(att.transcript, MAX_TEXT_ATTACHMENT_CHARS).text);\n if (att.extractedText) lines.push('', 'Extracted text:', truncateText(att.extractedText, MAX_TEXT_ATTACHMENT_CHARS).text);\n if (att.summary) lines.push('', 'Summary:', att.summary);\n if (att.error) lines.push('', 'Error:', att.error);\n return lines.join('\\n');\n}\n\nasync function loadNativeVisionImages(notesService: NotesService, note: Note): Promise<ImageContent[]> {\n const images: ImageContent[] = [];\n for (const att of note.attachments ?? []) {\n if (att.type !== 'image') continue;\n if (!att.mimeType.toLowerCase().startsWith('image/')) continue;\n if (att.size > MAX_NATIVE_VISION_IMAGE_BYTES) continue;\n const buffer = await readAttachmentBuffer(notesService, note.id, att);\n if (!buffer || buffer.length > MAX_NATIVE_VISION_IMAGE_BYTES) continue;\n images.push({ type: 'image', data: buffer.toString('base64'), mimeType: att.mimeType });\n if (images.length >= MAX_NATIVE_VISION_IMAGES) break;\n }\n return images;\n}\n\nexport async function buildNoteAgentContextArtifact(params: {\n note: Note;\n notesService: NotesService;\n config?: Config;\n force?: boolean;\n}): Promise<NoteAgentContextArtifact> {\n const { note, notesService, config, force } = params;\n if (!force) {\n const cached = getNoteAgentContextRecord<NoteAgentContextArtifact>(note.id);\n if (cached && cached.noteUpdatedAt === note.updatedAt && cached.contextVersion === String(note.updatedAt)) {\n return cached.payload;\n }\n }\n\n const markdown = truncateText(note.markdown.trim() || '(empty)', MAX_NOTE_MARKDOWN_CHARS);\n let truncated = markdown.truncated;\n const attachmentContexts: NoteAgentAttachmentContext[] = [];\n for (const att of note.attachments ?? []) {\n attachmentContexts.push(await buildAttachmentContext({ note, att, notesService, config }));\n }\n\n const blocks = [\n `# Source Note: ${note.title?.trim() || 'Untitled'}`,\n '',\n `- noteId: ${note.id}`,\n `- kind: ${note.kind}`,\n `- status: ${note.status}`,\n `- createdAt: ${formatTime(note.createdAt)}`,\n `- updatedAt: ${formatTime(note.updatedAt)}`,\n note.tags?.length ? `- tags: ${note.tags.join(', ')}` : '- tags: []',\n '',\n '## Markdown',\n markdown.text,\n ];\n if (attachmentContexts.length > 0) {\n blocks.push('', '## Attachments');\n for (const att of attachmentContexts) blocks.push('', renderAttachmentContext(att));\n }\n\n const finalText = truncateText(blocks.join('\\n'), MAX_TOTAL_CONTEXT_CHARS);\n truncated = truncated || finalText.truncated;\n const failed = attachmentContexts.filter((att) => att.status === 'failed').length;\n const unsupported = attachmentContexts.filter((att) => att.status === 'unsupported').length;\n const artifact: NoteAgentContextArtifact = {\n noteId: note.id,\n noteUpdatedAt: note.updatedAt,\n contextVersion: String(note.updatedAt),\n generatedAt: Date.now(),\n text: finalText.text,\n attachments: attachmentContexts,\n tokenEstimate: Math.ceil(finalText.text.length / 4),\n truncated,\n status: failed > 0 ? 'failed' : unsupported > 0 ? 'partial' : 'ready',\n };\n upsertNoteAgentContextRecord({\n noteId: note.id,\n noteUpdatedAt: note.updatedAt,\n contextVersion: artifact.contextVersion,\n generatedAt: artifact.generatedAt,\n payload: artifact,\n });\n return artifact;\n}\n\nexport async function buildNoteAgentContext(params: {\n note: Note;\n notesService: NotesService;\n config?: Config;\n force?: boolean;\n}): Promise<AgentSourceContext> {\n const artifact = await buildNoteAgentContextArtifact(params);\n const images = await loadNativeVisionImages(params.notesService, params.note);\n return {\n kind: 'note',\n sourceId: params.note.id,\n version: artifact.contextVersion,\n title: params.note.title?.trim() || 'Untitled',\n text: artifact.text,\n ...(images.length ? { images } : {}),\n tokenEstimate: artifact.tokenEstimate,\n truncated: artifact.truncated,\n };\n}\n\nexport function getCachedNoteAgentContextArtifact(noteId: string): NoteAgentContextArtifact | null {\n return getNoteAgentContextRecord<NoteAgentContextArtifact>(noteId)?.payload ?? null;\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAM,0BAA0B;AAChC,MAAM,4BAA4B;AAClC,MAAM,0BAA0B;AAChC,MAAM,2BAA2B;AACjC,MAAM,gCAAgC,IAAI,OAAO;AA2BjD,MAAM,qBAAqB,CAAC,QAAQ;AACpC,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CAAoB;CAAuB;CAAmB;CAAoB;CAClF;CAA0B;CAC3B,CAAC;AACF,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CAAQ;CAAO;CAAa;CAAS;CAAU;CAAQ;CAAQ;CAAQ;CAAS;CAAQ;CAAQ;CAAO;CAAO;CAAQ;CAAQ;CAAQ;CAAS;CAChJ,CAAC;AACF,MAAM,sBAAsB,IAAI,IAAI;CAAC;CAAQ;CAAQ;CAAS;CAAQ;CAAS;CAAQ;CAAQ,CAAC;AAEhG,SAAS,aAAa,MAAc,UAAwD;AAC1F,KAAI,KAAK,UAAU,SAAU,QAAO;EAAE;EAAM,WAAW;EAAO;AAC9D,QAAO;EAAE,MAAM,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC,iBAAiB,KAAK,SAAS,SAAS;EAAU,WAAW;EAAM;;AAG/G,SAAS,qBAAqB,KAA8B;CAC1D,MAAM,OAAO,IAAI,SAAS,aAAa;AACvC,KAAI,mBAAmB,MAAM,WAAW,KAAK,WAAW,OAAO,CAAC,CAAE,QAAO;AACzE,KAAI,gBAAgB,IAAI,KAAK,CAAE,QAAO;AACtC,QAAO,gBAAgB,IAAI,QAAQ,IAAI,SAAS,CAAC,aAAa,CAAC;;AAGjE,SAAS,qBAAqB,KAA8B;CAC1D,MAAM,OAAO,IAAI,SAAS,aAAa;AACvC,QAAO,SAAS,qBACX,KAAK,SAAS,iBAAiB,IAC/B,oBAAoB,IAAI,QAAQ,IAAI,SAAS,CAAC,aAAa,CAAC;;AAGnE,SAAS,WAAW,IAAgC;AAClD,QAAO,OAAO,OAAO,YAAY,OAAO,SAAS,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,aAAa,GAAG;;AAGtF,eAAe,qBAAqB,cAA4B,QAAgB,KAA6C;CAC3H,MAAM,UAAU,MAAM,aAAa,kBAAkB,QAAQ,IAAI,GAAG;AACpE,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,SAAS,QAAQ,SAAS,CAAC,YAAY,KAAK;;AAGrD,eAAe,sBAAsB,cAA4B,QAAgB,KAA6C;AAC5H,KAAI,CAAC,qBAAqB,IAAI,CAAE,QAAO;CACvC,MAAM,UAAU,MAAM,aAAa,kBAAkB,QAAQ,IAAI,GAAG;AACpE,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,OAAO,CAAC,YAAY,KAAK;AACtE,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,aAAa,KAAK,0BAA0B,CAAC;;AAGtD,eAAe,sBAAsB,QAKL;CAC9B,MAAM,WAAW,OAAO,IAAI,YAAY,MAAM;AAC9C,KAAI,SAAU,QAAO;AACrB,KAAI,OAAO,IAAI,SAAS,WAAW,OAAO,IAAI,SAAS,QAAS,QAAO,KAAA;CAEvE,MAAM,YAAY,4BAA4B,OAAO,QAAQ,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,MAAM;AAC9G,KAAI,CAAC,eAAe,UAAU,CAAE,QAAO,KAAA;CACvC,MAAM,SAAS,MAAM,qBAAqB,OAAO,cAAc,OAAO,KAAK,IAAI,OAAO,IAAI;AAC1F,KAAI,CAAC,OAAQ,QAAO,KAAA;CAEpB,MAAM,cAAa,MADE,WAAW,QAAQ,UAAU,EACxB,MAAM,MAAM;AACtC,KAAI,CAAC,WAAY,QAAO,KAAA;CACxB,MAAM,eAAe,OAAO,KAAK,eAAe,EAAE,EAAE,KAAK,SACvD,KAAK,OAAO,OAAO,IAAI,KAAK;EAAE,GAAG;EAAM;EAAY,GAAG,KACvD;AACD,OAAM,OAAO,aAAa,WAAW,OAAO,KAAK,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,YAAY,KAAK;AAClG,QAAO,IAAI,aAAa;AACxB,QAAO;;AAGT,eAAe,wBAAwB,QAKP;CAC9B,MAAM,UAAU,+BAA+B,EAAE,KAAK,OAAO,QAAQ,CAAC;CACtE,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,QAAS,QAAO,KAAA;CACrB,MAAM,SAAS,MAAM,qBAAqB,OAAO,cAAc,OAAO,KAAK,IAAI,OAAO,IAAI;AAC1F,KAAI,CAAC,OAAQ,QAAO,KAAA;AASpB,SAAO,MARc,2BAA2B;EAC9C,UAAU;EACV,WAAW,QAAQ,aAAa,EAAE;EAClC,QAAQ,CAAC;GAAE;GAAQ,UAAU,OAAO,IAAI;GAAU,CAAC;EACnD,QAAQ,qEAAqE,OAAO,IAAI,SAAS;EACjG,WAAW;EACX,WAAW;EACZ,CAAC,EACY,KAAK,MAAM,IAAI,KAAA;;AAG/B,eAAe,0BAA0B,QAIT;CAC9B,MAAM,SAAS,MAAM,qBAAqB,OAAO,cAAc,OAAO,KAAK,IAAI,OAAO,IAAI;AAC1F,KAAI,CAAC,OAAQ,QAAO,KAAA;CACpB,MAAM,SAAS,oBAAoB;EAAE;EAAQ,UAAU,OAAO,IAAI;EAAU,UAAU,OAAO,IAAI;EAAU,CAAC;AAC5G,KAAI,CAAC,OAAO,GAAI,QAAO,KAAA;AACvB,QAAO,aAAa,OAAO,MAAM,0BAA0B,CAAC;;AAG9D,SAAS,qBAAqB,KAA6B;AACzD,QAAO,wDAAwD,IAAI,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,KAAK;;AAG5G,SAAS,qBAAqB,KAA6B;AACzD,QAAO,+BAA+B,IAAI,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,KAAK;;AAGnF,SAAS,2BAA2B,KAA6B;AAC/D,QAAO,4CAA4C,IAAI,SAAS,IAAI,IAAI,SAAS;;AAGnF,eAAe,uBAAuB,QAKE;CACtC,MAAM,EAAE,MAAM,KAAK,cAAc,WAAW;AAC5C,KAAI;AACF,MAAI,IAAI,SAAS,SAAS;GACxB,MAAM,aAAa,MAAM,sBAAsB;IAAE;IAAM;IAAK;IAAc;IAAQ,CAAC;AACnF,UAAO,aACH;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAS;IAAY,GACrI;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAe,SAAS;IAAoE;;EAElN,MAAM,gBAAgB,MAAM,sBAAsB,cAAc,KAAK,IAAI,IAAI;AAC7E,MAAI,cACF,QAAO;GAAE,cAAc,IAAI;GAAI,MAAM,IAAI;GAAM,UAAU,IAAI;GAAU,UAAU,IAAI;GAAU,MAAM,IAAI;GAAM,QAAQ;GAAS;GAAe;AAEjJ,MAAI,IAAI,SAAS,SAAS;GACxB,MAAM,UAAU,MAAM,wBAAwB;IAAE;IAAM;IAAK;IAAc;IAAQ,CAAC,CAAC,YAAY,KAAA,EAAU;AACzG,UAAO;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ,UAAU,UAAU;IAAe,SAAS,WAAW,qBAAqB,IAAI;IAAE;;AAE3M,MAAI,IAAI,SAAS,SAAS;GACxB,MAAM,aAAa,MAAM,sBAAsB;IAAE;IAAM;IAAK;IAAc;IAAQ,CAAC,CAAC,YAAY,KAAA,EAAU;AAC1G,UAAO,aACH;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAS;IAAY,SAAS,qBAAqB,IAAI;IAAE,GACzK;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAe,SAAS,qBAAqB,IAAI;IAAE;;AAEzK,MAAI,qBAAqB,IAAI,EAAE;GAC7B,MAAM,wBAAwB,MAAM,0BAA0B;IAAE;IAAM;IAAK;IAAc,CAAC,CAAC,YAAY,KAAA,EAAU;AACjH,UAAO,wBACH;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAS,eAAe;IAAuB,GAC/J;IAAE,cAAc,IAAI;IAAI,MAAM,IAAI;IAAM,UAAU,IAAI;IAAU,UAAU,IAAI;IAAU,MAAM,IAAI;IAAM,QAAQ;IAAe,SAAS,2BAA2B,IAAI;IAAE;;AAE/K,SAAO;GAAE,cAAc,IAAI;GAAI,MAAM,IAAI;GAAM,UAAU,IAAI;GAAU,UAAU,IAAI;GAAU,MAAM,IAAI;GAAM,QAAQ;GAAe,SAAS;GAAwD;UAChM,KAAK;AACZ,SAAO;GAAE,cAAc,IAAI;GAAI,MAAM,IAAI;GAAM,UAAU,IAAI;GAAU,UAAU,IAAI;GAAU,MAAM,IAAI;GAAM,QAAQ;GAAU,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GAAE;;;AAI9L,SAAS,wBAAwB,KAAyC;CACxE,MAAM,QAAQ;EACZ,mBAAmB,IAAI;EACvB,SAAS,IAAI;EACb,WAAW,IAAI;EACf,eAAe,IAAI;EACnB,WAAW,IAAI;EACf,aAAa,IAAI;EAClB;AACD,KAAI,IAAI,WAAY,OAAM,KAAK,IAAI,eAAe,aAAa,IAAI,YAAY,0BAA0B,CAAC,KAAK;AAC/G,KAAI,IAAI,cAAe,OAAM,KAAK,IAAI,mBAAmB,aAAa,IAAI,eAAe,0BAA0B,CAAC,KAAK;AACzH,KAAI,IAAI,QAAS,OAAM,KAAK,IAAI,YAAY,IAAI,QAAQ;AACxD,KAAI,IAAI,MAAO,OAAM,KAAK,IAAI,UAAU,IAAI,MAAM;AAClD,QAAO,MAAM,KAAK,KAAK;;AAGzB,eAAe,uBAAuB,cAA4B,MAAqC;CACrG,MAAM,SAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,KAAK,eAAe,EAAE,EAAE;AACxC,MAAI,IAAI,SAAS,QAAS;AAC1B,MAAI,CAAC,IAAI,SAAS,aAAa,CAAC,WAAW,SAAS,CAAE;AACtD,MAAI,IAAI,OAAO,8BAA+B;EAC9C,MAAM,SAAS,MAAM,qBAAqB,cAAc,KAAK,IAAI,IAAI;AACrE,MAAI,CAAC,UAAU,OAAO,SAAS,8BAA+B;AAC9D,SAAO,KAAK;GAAE,MAAM;GAAS,MAAM,OAAO,SAAS,SAAS;GAAE,UAAU,IAAI;GAAU,CAAC;AACvF,MAAI,OAAO,UAAU,yBAA0B;;AAEjD,QAAO;;AAGT,eAAsB,8BAA8B,QAKd;CACpC,MAAM,EAAE,MAAM,cAAc,QAAQ,UAAU;AAC9C,KAAI,CAAC,OAAO;EACV,MAAM,SAAS,0BAAoD,KAAK,GAAG;AAC3E,MAAI,UAAU,OAAO,kBAAkB,KAAK,aAAa,OAAO,mBAAmB,OAAO,KAAK,UAAU,CACvG,QAAO,OAAO;;CAIlB,MAAM,WAAW,aAAa,KAAK,SAAS,MAAM,IAAI,WAAW,wBAAwB;CACzF,IAAI,YAAY,SAAS;CACzB,MAAM,qBAAmD,EAAE;AAC3D,MAAK,MAAM,OAAO,KAAK,eAAe,EAAE,CACtC,oBAAmB,KAAK,MAAM,uBAAuB;EAAE;EAAM;EAAK;EAAc;EAAQ,CAAC,CAAC;CAG5F,MAAM,SAAS;EACb,kBAAkB,KAAK,OAAO,MAAM,IAAI;EACxC;EACA,aAAa,KAAK;EAClB,WAAW,KAAK;EAChB,aAAa,KAAK;EAClB,gBAAgB,WAAW,KAAK,UAAU;EAC1C,gBAAgB,WAAW,KAAK,UAAU;EAC1C,KAAK,MAAM,SAAS,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK;EACxD;EACA;EACA,SAAS;EACV;AACD,KAAI,mBAAmB,SAAS,GAAG;AACjC,SAAO,KAAK,IAAI,iBAAiB;AACjC,OAAK,MAAM,OAAO,mBAAoB,QAAO,KAAK,IAAI,wBAAwB,IAAI,CAAC;;CAGrF,MAAM,YAAY,aAAa,OAAO,KAAK,KAAK,EAAE,wBAAwB;AAC1E,aAAY,aAAa,UAAU;CACnC,MAAM,SAAS,mBAAmB,QAAQ,QAAQ,IAAI,WAAW,SAAS,CAAC;CAC3E,MAAM,cAAc,mBAAmB,QAAQ,QAAQ,IAAI,WAAW,cAAc,CAAC;CACrF,MAAM,WAAqC;EACzC,QAAQ,KAAK;EACb,eAAe,KAAK;EACpB,gBAAgB,OAAO,KAAK,UAAU;EACtC,aAAa,KAAK,KAAK;EACvB,MAAM,UAAU;EAChB,aAAa;EACb,eAAe,KAAK,KAAK,UAAU,KAAK,SAAS,EAAE;EACnD;EACA,QAAQ,SAAS,IAAI,WAAW,cAAc,IAAI,YAAY;EAC/D;AACD,8BAA6B;EAC3B,QAAQ,KAAK;EACb,eAAe,KAAK;EACpB,gBAAgB,SAAS;EACzB,aAAa,SAAS;EACtB,SAAS;EACV,CAAC;AACF,QAAO;;AAGT,eAAsB,sBAAsB,QAKZ;CAC9B,MAAM,WAAW,MAAM,8BAA8B,OAAO;CAC5D,MAAM,SAAS,MAAM,uBAAuB,OAAO,cAAc,OAAO,KAAK;AAC7E,QAAO;EACL,MAAM;EACN,UAAU,OAAO,KAAK;EACtB,SAAS,SAAS;EAClB,OAAO,OAAO,KAAK,OAAO,MAAM,IAAI;EACpC,MAAM,SAAS;EACf,GAAI,OAAO,SAAS,EAAE,QAAQ,GAAG,EAAE;EACnC,eAAe,SAAS;EACxB,WAAW,SAAS;EACrB;;AAGH,SAAgB,kCAAkC,QAAiD;AACjG,QAAO,0BAAoD,OAAO,EAAE,WAAW"}
1
+ {"version":3,"file":"agent-context.js","names":[],"sources":["../../../src/notes/agent-context.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\n\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../config/schema.js';\nimport type { AgentSourceContext } from '../agent/source-context/types.js';\nimport { getNoteAgentContextRecord, upsertNoteAgentContextRecord } from '../storage/sqlite/index.js';\nimport { mergeSttConfigFromAppConfig } from '../channels/attachments/voice-stt-webchat.js';\nimport { extractDocumentText } from '../document-understanding/extract.js';\nimport { describeImagesWithFallback } from '../agent/image/understanding/runtime.js';\nimport { resolveImageModelConfigForTool } from '../agent/image/tool-model-config.js';\nimport { isSTTAvailable, transcribe } from '../voice/stt/index.js';\nimport type { Note, NoteAttachment, SnapshotTrigger } from './types.js';\n\nconst MAX_NOTE_MARKDOWN_CHARS = 40_000;\nconst MAX_TEXT_ATTACHMENT_CHARS = 20_000;\nconst MAX_TOTAL_CONTEXT_CHARS = 80_000;\nconst MAX_NATIVE_VISION_IMAGES = 4;\nconst MAX_NATIVE_VISION_IMAGE_BYTES = 8 * 1024 * 1024;\n\nexport interface NoteAgentAttachmentContext {\n attachmentId: string;\n type: NoteAttachment['type'];\n fileName: string;\n mimeType: string;\n size: number;\n status: 'ready' | 'unsupported' | 'failed';\n summary?: string;\n transcript?: string;\n extractedText?: string;\n error?: string;\n}\n\nexport interface NoteAgentContextArtifact {\n noteId: string;\n noteUpdatedAt: number;\n contextVersion: string;\n generatedAt: number;\n text: string;\n attachments: NoteAgentAttachmentContext[];\n tokenEstimate: number;\n truncated: boolean;\n status: 'ready' | 'partial' | 'failed';\n}\n\ninterface NoteAgentContextNotesService {\n getAttachmentPath(noteId: string, attachmentId: string): Promise<{ filePath: string; mimeType: string; fileName: string } | null>;\n updateNote(id: string, patch: Partial<Note>, trigger?: SnapshotTrigger): Promise<Note | null>;\n}\n\nconst TEXT_MIME_PREFIXES = ['text/'];\nconst TEXT_MIME_TYPES = new Set([\n 'application/json', 'application/ld+json', 'application/xml', 'application/yaml', 'application/x-yaml',\n 'application/javascript', 'application/typescript',\n]);\nconst TEXT_EXTENSIONS = new Set([\n '.txt', '.md', '.markdown', '.json', '.jsonl', '.csv', '.tsv', '.xml', '.yaml', '.yml', '.log', '.js', '.ts', '.tsx', '.jsx', '.css', '.html', '.sql',\n]);\nconst DOCUMENT_EXTENSIONS = new Set(['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx']);\n\nfunction truncateText(text: string, maxChars: number): { text: string; truncated: boolean } {\n if (text.length <= maxChars) return { text, truncated: false };\n return { text: `${text.slice(0, maxChars)}\\n\\n[truncated ${text.length - maxChars} chars]`, truncated: true };\n}\n\nfunction isTextLikeAttachment(att: NoteAttachment): boolean {\n const mime = att.mimeType.toLowerCase();\n if (TEXT_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix))) return true;\n if (TEXT_MIME_TYPES.has(mime)) return true;\n return TEXT_EXTENSIONS.has(extname(att.fileName).toLowerCase());\n}\n\nfunction isDocumentAttachment(att: NoteAttachment): boolean {\n const mime = att.mimeType.toLowerCase();\n return mime === 'application/pdf'\n || mime.includes('officedocument')\n || DOCUMENT_EXTENSIONS.has(extname(att.fileName).toLowerCase());\n}\n\nfunction formatTime(ms: number | undefined): string {\n return typeof ms === 'number' && Number.isFinite(ms) ? new Date(ms).toISOString() : 'unknown';\n}\n\nasync function readAttachmentBuffer(notesService: NoteAgentContextNotesService, noteId: string, att: NoteAttachment): Promise<Buffer | null> {\n const located = await notesService.getAttachmentPath(noteId, att.id);\n if (!located) return null;\n return readFile(located.filePath).catch(() => null);\n}\n\nasync function attachmentTextExcerpt(notesService: NoteAgentContextNotesService, noteId: string, att: NoteAttachment): Promise<string | null> {\n if (!isTextLikeAttachment(att)) return null;\n const located = await notesService.getAttachmentPath(noteId, att.id);\n if (!located) return null;\n const raw = await readFile(located.filePath, 'utf8').catch(() => null);\n if (raw === null) return null;\n return truncateText(raw, MAX_TEXT_ATTACHMENT_CHARS).text;\n}\n\nasync function ensureMediaTranscript(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NoteAgentContextNotesService;\n config?: Config;\n}): Promise<string | undefined> {\n const existing = params.att.transcript?.trim();\n if (existing) return existing;\n if (params.att.type !== 'audio' && params.att.type !== 'video') return undefined;\n\n const sttConfig = mergeSttConfigFromAppConfig(params.config?.tools?.media?.audio, params.config?.tools?.media);\n if (!isSTTAvailable(sttConfig)) return undefined;\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = await transcribe(buffer, sttConfig);\n const transcript = result.text?.trim();\n if (!transcript) return undefined;\n const attachments = (params.note.attachments ?? []).map((item) =>\n item.id === params.att.id ? { ...item, transcript } : item,\n );\n await params.notesService.updateNote(params.note.id, { attachments }, 'ai_edit').catch(() => null);\n params.att.transcript = transcript;\n return transcript;\n}\n\nasync function describeImageAttachment(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NoteAgentContextNotesService;\n config?: Config;\n}): Promise<string | undefined> {\n const toolCfg = resolveImageModelConfigForTool({ cfg: params.config });\n const primary = toolCfg?.primary;\n if (!primary) return undefined;\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = await describeImagesWithFallback({\n modelRef: primary,\n fallbacks: toolCfg.fallbacks ?? [],\n images: [{ buffer, mimeType: params.att.mimeType }],\n prompt: `Describe this note attachment for later AI discussion. File name: ${params.att.fileName}. Focus on visible text, diagrams, UI, objects, and any product-relevant details.`,\n maxTokens: 1024,\n timeoutMs: 30_000,\n });\n return result.text.trim() || undefined;\n}\n\nasync function extractDocumentAttachment(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NoteAgentContextNotesService;\n}): Promise<string | undefined> {\n const buffer = await readAttachmentBuffer(params.notesService, params.note.id, params.att);\n if (!buffer) return undefined;\n const result = extractDocumentText({ buffer, fileName: params.att.fileName, mimeType: params.att.mimeType });\n if (!result.ok) return undefined;\n return truncateText(result.text, MAX_TEXT_ATTACHMENT_CHARS).text;\n}\n\nfunction fallbackImageSummary(att: NoteAttachment): string {\n return `Image attachment available for native vision models: ${att.fileName} (${att.mimeType}, ${att.size} bytes). Configure an image understanding model to persist a text summary for non-vision models.`;\n}\n\nfunction fallbackVideoSummary(att: NoteAttachment): string {\n return `Video attachment available: ${att.fileName} (${att.mimeType}, ${att.size} bytes). Audio transcription will be included when STT accepts this media.`;\n}\n\nfunction unsupportedDocumentSummary(att: NoteAttachment): string {\n return `Document extraction is not available for ${att.fileName} (${att.mimeType}).`;\n}\n\nasync function buildAttachmentContext(params: {\n note: Note;\n att: NoteAttachment;\n notesService: NoteAgentContextNotesService;\n config?: Config;\n}): Promise<NoteAgentAttachmentContext> {\n const { note, att, notesService, config } = params;\n try {\n if (att.type === 'audio') {\n const transcript = await ensureMediaTranscript({ note, att, notesService, config });\n return transcript\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', transcript }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: 'Audio transcription is not configured or produced no transcript.' };\n }\n const extractedText = await attachmentTextExcerpt(notesService, note.id, att);\n if (extractedText) {\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', extractedText };\n }\n if (att.type === 'image') {\n const summary = await describeImageAttachment({ note, att, notesService, config }).catch(() => undefined);\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: summary ? 'ready' : 'unsupported', summary: summary ?? fallbackImageSummary(att) };\n }\n if (att.type === 'video') {\n const transcript = await ensureMediaTranscript({ note, att, notesService, config }).catch(() => undefined);\n return transcript\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', transcript, summary: fallbackVideoSummary(att) }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: fallbackVideoSummary(att) };\n }\n if (isDocumentAttachment(att)) {\n const extractedDocumentText = await extractDocumentAttachment({ note, att, notesService }).catch(() => undefined);\n return extractedDocumentText\n ? { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'ready', extractedText: extractedDocumentText }\n : { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: unsupportedDocumentSummary(att) };\n }\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'unsupported', summary: 'No extractor is configured for this attachment type.' };\n } catch (err) {\n return { attachmentId: att.id, type: att.type, fileName: att.fileName, mimeType: att.mimeType, size: att.size, status: 'failed', error: err instanceof Error ? err.message : String(err) };\n }\n}\n\nfunction renderAttachmentContext(att: NoteAgentAttachmentContext): string {\n const lines = [\n `### Attachment: ${att.fileName}`,\n `- id: ${att.attachmentId}`,\n `- type: ${att.type}`,\n `- mimeType: ${att.mimeType}`,\n `- size: ${att.size}`,\n `- status: ${att.status}`,\n ];\n if (att.transcript) lines.push('', 'Transcript:', truncateText(att.transcript, MAX_TEXT_ATTACHMENT_CHARS).text);\n if (att.extractedText) lines.push('', 'Extracted text:', truncateText(att.extractedText, MAX_TEXT_ATTACHMENT_CHARS).text);\n if (att.summary) lines.push('', 'Summary:', att.summary);\n if (att.error) lines.push('', 'Error:', att.error);\n return lines.join('\\n');\n}\n\nasync function loadNativeVisionImages(notesService: NoteAgentContextNotesService, note: Note): Promise<ImageContent[]> {\n const images: ImageContent[] = [];\n for (const att of note.attachments ?? []) {\n if (att.type !== 'image') continue;\n if (!att.mimeType.toLowerCase().startsWith('image/')) continue;\n if (att.size > MAX_NATIVE_VISION_IMAGE_BYTES) continue;\n const buffer = await readAttachmentBuffer(notesService, note.id, att);\n if (!buffer || buffer.length > MAX_NATIVE_VISION_IMAGE_BYTES) continue;\n images.push({ type: 'image', data: buffer.toString('base64'), mimeType: att.mimeType });\n if (images.length >= MAX_NATIVE_VISION_IMAGES) break;\n }\n return images;\n}\n\nexport async function buildNoteAgentContextArtifact(params: {\n note: Note;\n notesService: NoteAgentContextNotesService;\n config?: Config;\n force?: boolean;\n}): Promise<NoteAgentContextArtifact> {\n const { note, notesService, config, force } = params;\n if (!force) {\n const cached = getNoteAgentContextRecord<NoteAgentContextArtifact>(note.id);\n if (cached && cached.noteUpdatedAt === note.updatedAt && cached.contextVersion === String(note.updatedAt)) {\n return cached.payload;\n }\n }\n\n const markdown = truncateText(note.markdown.trim() || '(empty)', MAX_NOTE_MARKDOWN_CHARS);\n let truncated = markdown.truncated;\n const attachmentContexts: NoteAgentAttachmentContext[] = [];\n for (const att of note.attachments ?? []) {\n attachmentContexts.push(await buildAttachmentContext({ note, att, notesService, config }));\n }\n\n const blocks = [\n `# Source Note: ${note.title?.trim() || 'Untitled'}`,\n '',\n `- noteId: ${note.id}`,\n `- kind: ${note.kind}`,\n `- status: ${note.status}`,\n `- createdAt: ${formatTime(note.createdAt)}`,\n `- updatedAt: ${formatTime(note.updatedAt)}`,\n note.tags?.length ? `- tags: ${note.tags.join(', ')}` : '- tags: []',\n '',\n '## Markdown',\n markdown.text,\n ];\n if (attachmentContexts.length > 0) {\n blocks.push('', '## Attachments');\n for (const att of attachmentContexts) blocks.push('', renderAttachmentContext(att));\n }\n\n const finalText = truncateText(blocks.join('\\n'), MAX_TOTAL_CONTEXT_CHARS);\n truncated = truncated || finalText.truncated;\n const failed = attachmentContexts.filter((att) => att.status === 'failed').length;\n const unsupported = attachmentContexts.filter((att) => att.status === 'unsupported').length;\n const artifact: NoteAgentContextArtifact = {\n noteId: note.id,\n noteUpdatedAt: note.updatedAt,\n contextVersion: String(note.updatedAt),\n generatedAt: Date.now(),\n text: finalText.text,\n attachments: attachmentContexts,\n tokenEstimate: Math.ceil(finalText.text.length / 4),\n truncated,\n status: failed > 0 ? 'failed' : unsupported > 0 ? 'partial' : 'ready',\n };\n upsertNoteAgentContextRecord({\n noteId: note.id,\n noteUpdatedAt: note.updatedAt,\n contextVersion: artifact.contextVersion,\n generatedAt: artifact.generatedAt,\n payload: artifact,\n });\n return artifact;\n}\n\nexport async function buildNoteAgentContext(params: {\n note: Note;\n notesService: NoteAgentContextNotesService;\n config?: Config;\n force?: boolean;\n}): Promise<AgentSourceContext> {\n const artifact = await buildNoteAgentContextArtifact(params);\n const images = await loadNativeVisionImages(params.notesService, params.note);\n return {\n kind: 'note',\n sourceId: params.note.id,\n version: artifact.contextVersion,\n title: params.note.title?.trim() || 'Untitled',\n text: artifact.text,\n ...(images.length ? { images } : {}),\n tokenEstimate: artifact.tokenEstimate,\n truncated: artifact.truncated,\n };\n}\n\nexport function getCachedNoteAgentContextArtifact(noteId: string): NoteAgentContextArtifact | null {\n return getNoteAgentContextRecord<NoteAgentContextArtifact>(noteId)?.payload ?? null;\n}\n"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
5
  import { buildNoteIndexMeta } from "./note-index-meta.js";
6
6
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
7
7
  import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
8
8
  import "../storage/sqlite/index.js";
9
9
  import { resolveNoteHistoryDir, resolveNoteMediaDir } from "./paths.js";
10
+ import { join } from "node:path";
10
11
  import { randomUUID } from "node:crypto";
11
12
  import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
12
- import { join } from "node:path";
13
13
  //#region src/notes/store.ts
14
14
  init_write_file_atomic();
15
15
  init_logger();
@@ -1,8 +1,8 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
- import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
4
- import { dirname, join, resolve } from "node:path";
5
3
  import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
6
6
  import lockfile from "proper-lockfile";
7
7
  //#region src/project-trust/trust-store.ts
8
8
  init_paths();
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
4
3
  import { dirname, join } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
5
5
  //#region src/providers/auth-runtime/auth-profile-store.ts
6
6
  /**
7
7
  * {@link AuthProfileStore} implementations.
@@ -1,8 +1,8 @@
1
1
  import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
- import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
3
- import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
4
2
  import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
3
+ import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
5
4
  import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
5
+ import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
6
6
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
7
7
  import { getModel, getModels, getProviders } from "@earendil-works/pi-ai";
8
8
  //#region src/providers/index.ts
@@ -1,10 +1,10 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
5
4
  import { resolveModelsJsonPath } from "../config/paths.js";
6
5
  import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
7
6
  import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
7
+ import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
8
8
  import { existsSync, readFileSync } from "fs";
9
9
  import { getModels, getProviders } from "@earendil-works/pi-ai";
10
10
  //#region src/providers/model-registry.ts
@@ -1,7 +1,7 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
1
  import { SessionConfigSchema, init_schema } from "../config/schema.js";
4
2
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
3
+ import { createLogger } from "../utils/logger/index.js";
4
+ import { init_logger } from "../utils/logger.js";
5
5
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
6
6
  import "../storage/sqlite/index.js";
7
7
  import { evaluateSessionFreshness, resolveSessionResetPolicy } from "./reset-policy.js";
@@ -1,9 +1,9 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
- import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
4
1
  import { SessionConfigSchema, init_schema } from "../config/schema.js";
2
+ import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
5
3
  import { init_agent_session_key, normalizeAgentId, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
6
4
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
5
+ import { createLogger } from "../utils/logger/index.js";
6
+ import { init_logger } from "../utils/logger.js";
7
7
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
8
8
  import { findSessionKeyByTranscriptId, getSessionMetadata, getSessionPersistedLevels } from "../storage/sqlite/session-repository.js";
9
9
  import "../storage/sqlite/index.js";
@@ -1,7 +1,7 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
1
  import { isCronSessionKey } from "../routing/session-key-utils.js";
4
2
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
3
+ import { createLogger } from "../utils/logger/index.js";
4
+ import { init_logger } from "../utils/logger.js";
5
5
  import { init_providers, resolveModel } from "../providers/index.js";
6
6
  import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
7
7
  import { stripSessionStartupContextFromUserText } from "../agent/reply/startup-context.js";
@@ -1,7 +1,7 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
1
  import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
4
2
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
+ import { createLogger } from "../utils/logger/index.js";
4
+ import { init_logger } from "../utils/logger.js";
5
5
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
6
6
  import "./types.js";
7
7
  import { buildSessionContextForLlm, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
@@ -1,8 +1,8 @@
1
1
  import { resolveMimeType } from "./share-store.js";
2
- import { randomUUID } from "node:crypto";
2
+ import { basename, join, resolve } from "node:path";
3
3
  import { readdirSync } from "node:fs";
4
+ import { randomUUID } from "node:crypto";
4
5
  import { copyFile, mkdir, rm, stat } from "node:fs/promises";
5
- import { basename, join, resolve } from "node:path";
6
6
  //#region src/share/share-auto.ts
7
7
  /**
8
8
  * Smart-share decision layer.
@@ -1,14 +1,14 @@
1
+ import { resolveStateDir } from "../config/paths-state.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { resolveStateDir } from "../config/paths-state.js";
4
4
  import { init_paths } from "../config/paths.js";
5
5
  import { SHARE_CONFIG_DEFAULTS } from "./share-types.js";
6
6
  import { isPathUnderWorkspace } from "../gateway/workspace-editor-path.js";
7
7
  import { logShareAudit } from "./share-audit.js";
8
- import { randomBytes, randomUUID } from "node:crypto";
8
+ import { join, relative, resolve } from "node:path";
9
9
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import { randomBytes, randomUUID } from "node:crypto";
10
11
  import { lstat, readdir, realpath, stat } from "node:fs/promises";
11
- import { join, relative, resolve } from "node:path";
12
12
  //#region src/share/share-store.ts
13
13
  init_paths();
14
14
  init_logger();
@@ -1,12 +1,12 @@
1
+ import { resolveStateDir } from "../config/paths-state.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { resolveStateDir } from "../config/paths-state.js";
4
4
  import { init_paths } from "../config/paths.js";
5
5
  import { getShareStore } from "./share-store.js";
6
6
  import { getSiteShareStore } from "./site-share-store.js";
7
7
  import { loadPlaywrightCoreModule } from "../browser/providers/playwright-doctor.js";
8
- import { mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
9
8
  import { join } from "node:path";
9
+ import { mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
10
10
  //#region src/share/share-thumbnail.ts
11
11
  /**
12
12
  * Thumbnail generator for shares.
@@ -1,7 +1,7 @@
1
1
  import { isPathUnderWorkspace } from "../gateway/workspace-editor-path.js";
2
+ import { relative, resolve } from "node:path";
2
3
  import { createReadStream } from "node:fs";
3
4
  import { lstat, readdir, realpath, stat } from "node:fs/promises";
4
- import { relative, resolve } from "node:path";
5
5
  import { Readable, Transform } from "node:stream";
6
6
  import { pipeline } from "node:stream/promises";
7
7
  import { crc32, createDeflateRaw } from "node:zlib";
@@ -1,13 +1,13 @@
1
+ import { resolveStateDir } from "../config/paths-state.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { resolveStateDir } from "../config/paths-state.js";
4
4
  import { init_paths } from "../config/paths.js";
5
5
  import { SITE_SHARE_CONFIG_DEFAULTS } from "./site-share-types.js";
6
6
  import { isPathUnderWorkspace } from "../gateway/workspace-editor-path.js";
7
- import { randomBytes, randomUUID } from "node:crypto";
7
+ import { join, relative, resolve } from "node:path";
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+ import { randomBytes, randomUUID } from "node:crypto";
9
10
  import { lstat, readdir, realpath, stat } from "node:fs/promises";
10
- import { join, relative, resolve } from "node:path";
11
11
  //#region src/share/site-share-store.ts
12
12
  init_paths();
13
13
  init_logger();
@@ -1,8 +1,8 @@
1
1
  import { isPathUnderWorkspace } from "../gateway/workspace-editor-path.js";
2
2
  import { resolveMimeType, shareResponseContentType } from "./share-store.js";
3
+ import { join, relative, resolve } from "node:path";
3
4
  import { createReadStream } from "node:fs";
4
5
  import { readFile, stat } from "node:fs/promises";
5
- import { join, relative, resolve } from "node:path";
6
6
  import { Readable } from "node:stream";
7
7
  //#region src/share/site-static-serve.ts
8
8
  const HASHED_ASSET_RE = /\.[a-f0-9]{8,}\.(?:js|mjs|css|woff2?|ttf|otf|svg|png|jpg|jpeg|gif|webp|avif|ico)$/i;
@@ -1,11 +1,11 @@
1
+ import { resolveXopcDatabasePath } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveXopcDatabasePath } from "../../config/paths-state.js";
4
4
  import { ensureXopcDatabaseSchema } from "./schema.js";
5
5
  import { requireNodeSqlite } from "../../infra/node-sqlite.js";
6
6
  import { installSqliteTransientRejectionHandler } from "../../infra/unhandled-rejections.js";
7
- import fs from "node:fs";
8
7
  import path from "node:path";
8
+ import fs from "node:fs";
9
9
  import childProcess from "node:child_process";
10
10
  //#region src/storage/sqlite/connection.ts
11
11
  init_logger();
@@ -1,8 +1,8 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
2
  import { escapeFts5Query } from "./fts.js";
3
- import { createHash } from "node:crypto";
4
- import { existsSync, readFileSync, statSync } from "node:fs";
5
3
  import { join, relative } from "node:path";
4
+ import { existsSync, readFileSync, statSync } from "node:fs";
5
+ import { createHash } from "node:crypto";
6
6
  //#region src/storage/sqlite/memory-index-repository.ts
7
7
  const CURATED_MEMORY_FILENAMES = new Set(["MEMORY.md", "USER.md"]);
8
8
  const MEMORY_SYNC_CACHE_TTL_MS = 3e4;
@@ -1,5 +1,5 @@
1
- import { existsSync, readFileSync, readdirSync } from "node:fs";
2
1
  import { join } from "node:path";
2
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
3
3
  //#region src/storage/sqlite/migrations/discover.ts
4
4
  /** Matches `002_add_notes_index.sql` → target version 2. */
5
5
  const MIGRATION_FILENAME = /^(\d{3})_[\w-]+\.sql$/;
@@ -3,8 +3,8 @@ import { init_logger } from "../../../utils/logger.js";
3
3
  import { readSchemaVersion, setSchemaVersion } from "../schema-version.js";
4
4
  import { discoverSqlMigrations } from "./discover.js";
5
5
  import { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError } from "./errors.js";
6
- import { existsSync } from "node:fs";
7
6
  import { dirname, join } from "node:path";
7
+ import { existsSync } from "node:fs";
8
8
  import { fileURLToPath } from "node:url";
9
9
  //#region src/storage/sqlite/migrations/runner.ts
10
10
  init_logger();
@@ -1,7 +1,7 @@
1
1
  import { SCHEMA_META_SCHEMA_VERSION_KEY, ensureSchemaMetaTable, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion } from "./schema-version.js";
2
2
  import { XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, applyPendingMigrations } from "./migrations/runner.js";
3
- import { readFileSync } from "node:fs";
4
3
  import { dirname, join } from "node:path";
4
+ import { readFileSync } from "node:fs";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/storage/sqlite/schema.ts
7
7
  const SCHEMA_DIR = dirname(fileURLToPath(import.meta.url));
@@ -1,11 +1,10 @@
1
+ import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../../agent/agent-scope.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../../agent/agent-scope.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
5
  import { getAvailableModels, init_providers } from "../../providers/index.js";
6
6
  import { createCreateShareTool, isShareToolAvailable } from "../../agent/tools/create-share-tool.js";
7
7
  import { evictEmbeddedSessionRunner } from "../../agent/embedded/session-runner.js";
8
- import { BUILTIN_AGENT_IDS } from "../../agent/builtin-agent-ids.js";
9
8
  import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
10
9
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
11
10
  import { parseModelRef } from "../../agent/models/selection.js";
@@ -211,17 +210,11 @@ var EmbeddedBackend = class {
211
210
  async listAgents() {
212
211
  const config = loadConfig();
213
212
  const agents = /* @__PURE__ */ new Map();
214
- for (const id of BUILTIN_AGENT_IDS) agents.set(id, {
215
- id,
216
- source: "builtin",
217
- enabled: true
218
- });
219
213
  for (const entry of listAgentEntries(config)) {
220
214
  if (entry.enabled === false) continue;
221
215
  const id = normalizeAgentId(entry.id);
222
216
  agents.set(id, {
223
217
  id,
224
- source: "configured",
225
218
  enabled: true
226
219
  });
227
220
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embedded-backend.js","names":[],"sources":["../../../../src/tui/backends/embedded-backend.ts"],"sourcesContent":["import type { ExtensionRegistryImpl } from '../../extensions/loader.js';\nimport { BUILTIN_AGENT_IDS } from '../../agent/builtin-agent-ids.js';\nimport { AgentService } from '../../agent/index.js';\nimport { listAgentEntries, normalizeAgentId } from '../../agent/agent-scope.js';\nimport { parseModelRef } from '../../agent/models/selection.js';\nimport { createCreateShareTool, isShareToolAvailable } from '../../agent/tools/create-share-tool.js';\nimport { transcriptRowsToClientHistory } from '../../session/client-history.js';\nimport { prependEnvelopeTimestamp } from '../../channels/envelope-timestamp.js';\nimport { loadConfig, getWorkspacePath } from '../../config/index.js';\nimport { MessageBus, MessageBusShutdownError } from '../../infra/bus/index.js';\nimport { getAvailableModels } from '../../providers/index.js';\nimport { evictEmbeddedSessionRunner } from '../../agent/embedded/session-runner.js';\nimport type { ExportFormat } from '../../session/types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type {\n ChatSendOptions,\n HistoryMessage,\n TuiBackend,\n TuiCompactionResult,\n TuiEvent,\n TuiModelChoice,\n TuiShareRequest,\n TuiShareResult,\n TuiSessionStats,\n TuiSessionItem,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from '../tui-backend.js';\nimport type { SessionInfo } from '../tui-types.js';\nimport { sessionMetadataToTuiItem } from '../tui-session-format.js';\nimport { computeTuiSessionStats } from '../tui-session-stats.js';\nimport { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from '../tui-transcript-tree.js';\nimport { ChatStreamMapper } from '../../gateway/chat-stream/mapper.js';\nimport { collectTuiStartupResources } from '../tui-startup-resources.js';\n\nconst log = createLogger('TUI:Embedded');\n\n/**\n * TUI backend that runs the agent in-process (no gateway required).\n *\n * Wraps `AgentService` directly and emits TuiEvents by observing the\n * `MessageBus` output stream.\n */\nexport class EmbeddedBackend implements TuiBackend {\n private bus: MessageBus;\n private agent: AgentService | null = null;\n private running = false;\n private chatAbort: AbortController | null = null;\n\n onEvent?: (evt: TuiEvent) => void;\n onConnected?: () => void;\n onDisconnected?: (reason: string) => void;\n\n constructor(private readonly opts?: { extensionRegistry?: ExtensionRegistryImpl }) {\n this.bus = new MessageBus();\n }\n\n get connectionLabel(): string {\n return 'local embedded';\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n const config = loadConfig();\n const workspace = getWorkspacePath(config);\n const modelId = config.agents?.defaults?.models?.chat?.primary;\n\n this.agent = new AgentService(this.bus, {\n workspace,\n model: modelId,\n config,\n extensionRegistry: this.opts?.extensionRegistry,\n });\n\n this.agent.start().then(() => {\n this.onConnected?.();\n }).catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.error({ err, errorMessage }, `Embedded agent failed: ${errorMessage}`);\n this.onDisconnected?.(errorMessage);\n });\n\n // Process outbound messages in background\n this.processOutbound();\n }\n\n stop(): void {\n this.running = false;\n this.chatAbort?.abort();\n this.chatAbort = null;\n this.bus.shutdown();\n void this.agent?.stop();\n this.agent = null;\n }\n\n getActiveSignal(): AbortSignal | undefined {\n const signal = this.chatAbort?.signal;\n return signal && !signal.aborted ? signal : undefined;\n }\n\n async getStartupResources(sessionKey: string) {\n return collectTuiStartupResources(loadConfig(), sessionKey);\n }\n\n async sendChat(opts: ChatSendOptions): Promise<{ runId: string }> {\n if (!this.agent) throw new Error('Agent not started');\n\n const runId = crypto.randomUUID();\n this.chatAbort?.abort();\n this.chatAbort = new AbortController();\n const signal = this.chatAbort.signal;\n\n const mapper = new ChatStreamMapper({ runId, sessionKey: opts.sessionKey, channel: 'tui' });\n for (const event of mapper.start()) {\n this.onEvent?.({ event: event.type, data: event, source: 'embedded' });\n }\n\n // Run the stream in background so the TUI event loop stays responsive.\n void (async () => {\n try {\n // Prepend envelope timestamp so the model knows the current date/time,\n // matching the behavior of channel pipelines (Telegram, Weixin, etc.).\n // Skip for slash commands — parseSlashCommand requires lines starting with '/'.\n const messageForAgent = opts.message.trimStart().startsWith('/')\n ? opts.message\n : prependEnvelopeTimestamp(opts.message);\n\n const stream = this.agent!.turnDispatcher.processDirectStreaming(\n messageForAgent,\n opts.sessionKey,\n opts.attachments,\n opts.thinking,\n { signal, runId },\n );\n\n for await (const event of stream) {\n if (signal.aborted) break;\n for (const mapped of mapper.map(event)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n\n if (!signal.aborted) {\n for (const mapped of mapper.end('success')) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n } catch (error) {\n if (signal.aborted) return;\n const errorMessage = error instanceof Error ? error.message : String(error);\n for (const mapped of mapper.error(errorMessage)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n for (const mapped of mapper.end('error', errorMessage)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n })();\n\n return { runId };\n }\n\n async abortChat(_opts: { sessionKey: string; runId: string }): Promise<{ ok: boolean }> {\n if (this.chatAbort) {\n this.chatAbort.abort();\n this.chatAbort = null;\n return { ok: true };\n }\n return { ok: false };\n }\n\n async steerChat(opts: { sessionKey: string; message: string }): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n const ok = await this.agent.turnDispatcher.steerWebchatSession(opts.sessionKey, opts.message);\n return { ok };\n }\n\n async loadHistory(opts: {\n sessionKey: string;\n limit?: number;\n }): Promise<{ messages: HistoryMessage[] }> {\n if (!this.agent) {\n return { messages: [] };\n }\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(opts.sessionKey);\n return {\n messages: transcriptRowsToClientHistory(rows, { limit: opts.limit }),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded loadHistory failed: ${errorMessage}`);\n return { messages: [] };\n }\n }\n\n async loadTranscriptTree(sessionKey: string): Promise<TuiTranscriptTreeEntry[]> {\n if (!this.agent) return [];\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(sessionKey);\n return buildTuiTranscriptTree(rows);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded loadTranscriptTree failed: ${errorMessage}`);\n return [];\n }\n }\n\n async getSessionStats(sessionKey: string): Promise<TuiSessionStats> {\n if (!this.agent) return computeTuiSessionStats([]);\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(sessionKey);\n return computeTuiSessionStats(rows);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded getSessionStats failed: ${errorMessage}`);\n return computeTuiSessionStats([]);\n }\n }\n\n async listSessions(): Promise<TuiSessionItem[]> {\n if (!this.agent) return [];\n try {\n const result = await this.agent.sessionStore.list({\n limit: 200,\n sortBy: 'updatedAt',\n sortOrder: 'desc',\n });\n return result.items.map(sessionMetadataToTuiItem);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded listSessions failed: ${errorMessage}`);\n return [];\n }\n }\n\n async listAgents(): Promise<TuiAgentInfo[]> {\n const config = loadConfig();\n const agents = new Map<string, TuiAgentInfo>();\n for (const id of BUILTIN_AGENT_IDS) {\n agents.set(id, { id, source: 'builtin', enabled: true });\n }\n for (const entry of listAgentEntries(config)) {\n if (entry.enabled === false) continue;\n const id = normalizeAgentId(entry.id);\n agents.set(id, {\n id,\n source: 'configured',\n enabled: true,\n });\n }\n return [...agents.values()].sort((a, b) => a.id.localeCompare(b.id));\n }\n\n async renameSession(sessionKey: string, name: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n await this.agent.sessionStore.updateMetadata(sessionKey, { name: name.trim() });\n return { ok: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded renameSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async deleteSession(sessionKey: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n const ok = await this.agent.sessionStore.deleteSession(sessionKey);\n return { ok };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded deleteSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async getSessionInfo(sessionKey: string): Promise<SessionInfo> {\n if (!this.agent) {\n const config = loadConfig();\n const model = config.agents?.defaults?.models?.chat?.primary;\n return { model: model ?? undefined };\n }\n try {\n const cfg = await this.agent.sessionInspector.agentConfig(sessionKey);\n const parsed = parseModelRef(cfg.model);\n const usage = await this.agent.sessionInspector.contextUsage(sessionKey);\n return {\n model: parsed?.model ?? cfg.model,\n modelProvider: parsed?.provider,\n thinkingLevel: cfg.thinkingLevel,\n reasoningLevel: cfg.reasoningLevel,\n verboseLevel: cfg.verboseLevel,\n totalTokens: usage.estimatedTokens,\n contextWindow: usage.contextWindow,\n contextUsagePercent: usage.usagePercent,\n effectiveWorkspacePath: cfg.effectiveWorkspacePath,\n workingDirectoryLocked: cfg.workingDirectoryLocked,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey, errorMessage }, `getSessionInfo failed: ${errorMessage}`);\n const config = loadConfig();\n const model = config.agents?.defaults?.models?.chat?.primary;\n return { model: model ?? undefined };\n }\n }\n\n async listModels(): Promise<TuiModelChoice[]> {\n const models = await getAvailableModels();\n return models.map((model) => ({\n id: model.id,\n name: model.name ?? model.id,\n provider: model.provider,\n contextWindow: model.contextWindow,\n }));\n }\n\n async resetSession(sessionKey: string): Promise<void> {\n if (!this.agent) return;\n await this.agent.resetSession(sessionKey);\n }\n\n async patchSession(\n sessionKey: string,\n patch: Record<string, unknown>,\n ): Promise<void> {\n if (!this.agent) return;\n const result = await this.agent.sessionConfig.patch(sessionKey, {\n model: typeof patch.model === 'string' ? patch.model : undefined,\n thinkingLevel: typeof patch.thinkingLevel === 'string' ? patch.thinkingLevel : undefined,\n reasoningLevel: typeof patch.reasoningLevel === 'string' ? patch.reasoningLevel : undefined,\n verboseLevel: typeof patch.verboseLevel === 'string' ? patch.verboseLevel : undefined,\n workingDirectory: typeof patch.workingDirectory === 'string' ? patch.workingDirectory : undefined,\n });\n if (!result.ok) {\n throw new Error(result.error);\n }\n }\n\n async compactSession(\n sessionKey: string,\n options?: { force?: boolean; instructions?: string },\n ): Promise<TuiCompactionResult> {\n if (!this.agent) return { compacted: false, summary: 'Agent not started' };\n try {\n const result = await this.agent.sessionInspector.compact(sessionKey, {\n force: options?.force ?? true,\n instructions: options?.instructions,\n });\n if (!result.compacted) return { compacted: false, summary: 'Nothing to compact' };\n return {\n compacted: true,\n summary: `Compacted (${result.tokensBefore ?? '?'} → ${result.tokensAfter ?? '?'} tokens)`,\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n transcriptSummary: result.summary,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return { compacted: false, summary: errorMessage };\n }\n }\n\n async exportSession(sessionKey: string, format: ExportFormat): Promise<string> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.exportSession(sessionKey, format);\n }\n\n async importSession(\n targetSessionKey: string,\n jsonContent: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.importSessionExport(targetSessionKey, jsonContent);\n }\n\n async createShare(\n _sessionKey: string,\n request: TuiShareRequest,\n _options?: { agentId?: string },\n ): Promise<TuiShareResult> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n const config = loadConfig();\n if (!isShareToolAvailable(config)) {\n throw new Error('Sharing is disabled in gateway config');\n }\n const workspace = getWorkspacePath(config);\n const tool = createCreateShareTool({\n workspace,\n getConfig: () => config,\n getAgentId: () => 'tui',\n });\n const result = await tool.execute(\n 'tui-share',\n {\n filePath: request.path,\n audience: request.audience,\n mode: request.mode,\n title: request.title,\n description: request.description,\n },\n );\n const details = (result.details ?? {}) as Record<string, unknown>;\n const error = typeof details.error === 'string' ? details.error : undefined;\n if (error) {\n throw new Error(error);\n }\n const shareUrl = typeof details.shareUrl === 'string' ? details.shareUrl : undefined;\n if (!shareUrl) {\n const text = result.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .join('\\n')\n .trim();\n throw new Error(text || 'Share failed');\n }\n return {\n kind: typeof details.kind === 'string' ? details.kind : 'share',\n shareUrl,\n title: typeof details.title === 'string' ? details.title : undefined,\n description: typeof details.description === 'string' ? details.description : undefined,\n thumbnailUrl: typeof details.thumbnailUrl === 'string' ? details.thumbnailUrl : undefined,\n reachability: typeof details.reachability === 'string' ? details.reachability : undefined,\n reachabilityHint:\n typeof details.reachabilityHint === 'string' ? details.reachabilityHint : undefined,\n expiresAt: typeof details.expiresAt === 'string' ? details.expiresAt : undefined,\n maxViews: typeof details.maxViews === 'number' ? details.maxViews : null,\n routingReason:\n typeof (details.routing as { reason?: unknown } | undefined)?.reason === 'string'\n ? ((details.routing as { reason: string }).reason)\n : undefined,\n routingHint:\n typeof (details.routing as { hint?: unknown } | undefined)?.hint === 'string'\n ? ((details.routing as { hint: string }).hint)\n : undefined,\n };\n }\n\n async btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n if (!this.agent) {\n return { text: '', error: 'Agent not started' };\n }\n return this.agent.sessionInspector.btwQuery(sessionKey, question);\n }\n\n async forkSession(\n sourceSessionKey: string,\n targetSessionKey: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.forkSession(sourceSessionKey, targetSessionKey);\n }\n\n async forkSessionAt(\n sourceSessionKey: string,\n targetSessionKey: string,\n entryId: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n const throughRow = transcriptTreeEntryIdToRowNumber(entryId);\n if (throughRow == null) {\n throw new Error(`Invalid transcript entry: ${entryId}`);\n }\n return this.agent.sessionStore.forkSessionRows(sourceSessionKey, targetSessionKey, { throughRow });\n }\n\n async setTranscriptLabel(\n sessionKey: string,\n entryId: string,\n label: string | undefined,\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptLabelEntry(sessionKey, { targetId: entryId, label });\n return { ok: true };\n }\n\n async appendCustomEntry(\n sessionKey: string,\n customType: string,\n data?: unknown,\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptCustomEntry(sessionKey, { customType, data });\n return { ok: true };\n }\n\n async appendCustomMessage(\n sessionKey: string,\n message: {\n customType: string;\n content?: string | unknown[];\n display?: boolean;\n details?: unknown;\n },\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptCustomMessageEntry(sessionKey, message);\n evictEmbeddedSessionRunner(sessionKey, 'tui_custom_message_appended');\n return { ok: true };\n }\n\n async appendBashExecution(\n sessionKey: string,\n entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext?: boolean;\n truncated?: boolean;\n fullOutputPath?: string;\n },\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptBashExecutionEntry(sessionKey, entry);\n evictEmbeddedSessionRunner(sessionKey, 'tui_bash_execution_appended');\n return { ok: true };\n }\n\n private processOutbound(): void {\n void (async () => {\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n log.debug({ channel: msg.channel, chatId: msg.chat_id }, 'Outbound message');\n } catch (error) {\n if (error instanceof MessageBusShutdownError) break;\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Outbound processor failed: ${errorMessage}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n })();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"embedded-backend.js","names":[],"sources":["../../../../src/tui/backends/embedded-backend.ts"],"sourcesContent":["import type { ExtensionRegistryImpl } from '../../extensions/loader.js';\nimport { AgentService } from '../../agent/index.js';\nimport { listAgentEntries, normalizeAgentId } from '../../agent/agent-scope.js';\nimport { parseModelRef } from '../../agent/models/selection.js';\nimport { createCreateShareTool, isShareToolAvailable } from '../../agent/tools/create-share-tool.js';\nimport { transcriptRowsToClientHistory } from '../../session/client-history.js';\nimport { prependEnvelopeTimestamp } from '../../channels/envelope-timestamp.js';\nimport { loadConfig, getWorkspacePath } from '../../config/index.js';\nimport { MessageBus, MessageBusShutdownError } from '../../infra/bus/index.js';\nimport { getAvailableModels } from '../../providers/index.js';\nimport { evictEmbeddedSessionRunner } from '../../agent/embedded/session-runner.js';\nimport type { ExportFormat } from '../../session/types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type {\n ChatSendOptions,\n HistoryMessage,\n TuiBackend,\n TuiCompactionResult,\n TuiEvent,\n TuiModelChoice,\n TuiShareRequest,\n TuiShareResult,\n TuiSessionStats,\n TuiSessionItem,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from '../tui-backend.js';\nimport type { SessionInfo } from '../tui-types.js';\nimport { sessionMetadataToTuiItem } from '../tui-session-format.js';\nimport { computeTuiSessionStats } from '../tui-session-stats.js';\nimport { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from '../tui-transcript-tree.js';\nimport { ChatStreamMapper } from '../../gateway/chat-stream/mapper.js';\nimport { collectTuiStartupResources } from '../tui-startup-resources.js';\n\nconst log = createLogger('TUI:Embedded');\n\n/**\n * TUI backend that runs the agent in-process (no gateway required).\n *\n * Wraps `AgentService` directly and emits TuiEvents by observing the\n * `MessageBus` output stream.\n */\nexport class EmbeddedBackend implements TuiBackend {\n private bus: MessageBus;\n private agent: AgentService | null = null;\n private running = false;\n private chatAbort: AbortController | null = null;\n\n onEvent?: (evt: TuiEvent) => void;\n onConnected?: () => void;\n onDisconnected?: (reason: string) => void;\n\n constructor(private readonly opts?: { extensionRegistry?: ExtensionRegistryImpl }) {\n this.bus = new MessageBus();\n }\n\n get connectionLabel(): string {\n return 'local embedded';\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n const config = loadConfig();\n const workspace = getWorkspacePath(config);\n const modelId = config.agents?.defaults?.models?.chat?.primary;\n\n this.agent = new AgentService(this.bus, {\n workspace,\n model: modelId,\n config,\n extensionRegistry: this.opts?.extensionRegistry,\n });\n\n this.agent.start().then(() => {\n this.onConnected?.();\n }).catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.error({ err, errorMessage }, `Embedded agent failed: ${errorMessage}`);\n this.onDisconnected?.(errorMessage);\n });\n\n // Process outbound messages in background\n this.processOutbound();\n }\n\n stop(): void {\n this.running = false;\n this.chatAbort?.abort();\n this.chatAbort = null;\n this.bus.shutdown();\n void this.agent?.stop();\n this.agent = null;\n }\n\n getActiveSignal(): AbortSignal | undefined {\n const signal = this.chatAbort?.signal;\n return signal && !signal.aborted ? signal : undefined;\n }\n\n async getStartupResources(sessionKey: string) {\n return collectTuiStartupResources(loadConfig(), sessionKey);\n }\n\n async sendChat(opts: ChatSendOptions): Promise<{ runId: string }> {\n if (!this.agent) throw new Error('Agent not started');\n\n const runId = crypto.randomUUID();\n this.chatAbort?.abort();\n this.chatAbort = new AbortController();\n const signal = this.chatAbort.signal;\n\n const mapper = new ChatStreamMapper({ runId, sessionKey: opts.sessionKey, channel: 'tui' });\n for (const event of mapper.start()) {\n this.onEvent?.({ event: event.type, data: event, source: 'embedded' });\n }\n\n // Run the stream in background so the TUI event loop stays responsive.\n void (async () => {\n try {\n // Prepend envelope timestamp so the model knows the current date/time,\n // matching the behavior of channel pipelines (Telegram, Weixin, etc.).\n // Skip for slash commands — parseSlashCommand requires lines starting with '/'.\n const messageForAgent = opts.message.trimStart().startsWith('/')\n ? opts.message\n : prependEnvelopeTimestamp(opts.message);\n\n const stream = this.agent!.turnDispatcher.processDirectStreaming(\n messageForAgent,\n opts.sessionKey,\n opts.attachments,\n opts.thinking,\n { signal, runId },\n );\n\n for await (const event of stream) {\n if (signal.aborted) break;\n for (const mapped of mapper.map(event)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n\n if (!signal.aborted) {\n for (const mapped of mapper.end('success')) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n } catch (error) {\n if (signal.aborted) return;\n const errorMessage = error instanceof Error ? error.message : String(error);\n for (const mapped of mapper.error(errorMessage)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n for (const mapped of mapper.end('error', errorMessage)) {\n this.onEvent?.({ event: mapped.type, data: mapped, source: 'embedded' });\n }\n }\n })();\n\n return { runId };\n }\n\n async abortChat(_opts: { sessionKey: string; runId: string }): Promise<{ ok: boolean }> {\n if (this.chatAbort) {\n this.chatAbort.abort();\n this.chatAbort = null;\n return { ok: true };\n }\n return { ok: false };\n }\n\n async steerChat(opts: { sessionKey: string; message: string }): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n const ok = await this.agent.turnDispatcher.steerWebchatSession(opts.sessionKey, opts.message);\n return { ok };\n }\n\n async loadHistory(opts: {\n sessionKey: string;\n limit?: number;\n }): Promise<{ messages: HistoryMessage[] }> {\n if (!this.agent) {\n return { messages: [] };\n }\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(opts.sessionKey);\n return {\n messages: transcriptRowsToClientHistory(rows, { limit: opts.limit }),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded loadHistory failed: ${errorMessage}`);\n return { messages: [] };\n }\n }\n\n async loadTranscriptTree(sessionKey: string): Promise<TuiTranscriptTreeEntry[]> {\n if (!this.agent) return [];\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(sessionKey);\n return buildTuiTranscriptTree(rows);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded loadTranscriptTree failed: ${errorMessage}`);\n return [];\n }\n }\n\n async getSessionStats(sessionKey: string): Promise<TuiSessionStats> {\n if (!this.agent) return computeTuiSessionStats([]);\n try {\n const rows = await this.agent.sessionStore.loadTranscriptRows(sessionKey);\n return computeTuiSessionStats(rows);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded getSessionStats failed: ${errorMessage}`);\n return computeTuiSessionStats([]);\n }\n }\n\n async listSessions(): Promise<TuiSessionItem[]> {\n if (!this.agent) return [];\n try {\n const result = await this.agent.sessionStore.list({\n limit: 200,\n sortBy: 'updatedAt',\n sortOrder: 'desc',\n });\n return result.items.map(sessionMetadataToTuiItem);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded listSessions failed: ${errorMessage}`);\n return [];\n }\n }\n\n async listAgents(): Promise<TuiAgentInfo[]> {\n const config = loadConfig();\n const agents = new Map<string, TuiAgentInfo>();\n for (const entry of listAgentEntries(config)) {\n if (entry.enabled === false) continue;\n const id = normalizeAgentId(entry.id);\n agents.set(id, {\n id,\n enabled: true,\n });\n }\n return [...agents.values()].sort((a, b) => a.id.localeCompare(b.id));\n }\n\n async renameSession(sessionKey: string, name: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n await this.agent.sessionStore.updateMetadata(sessionKey, { name: name.trim() });\n return { ok: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded renameSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async deleteSession(sessionKey: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n const ok = await this.agent.sessionStore.deleteSession(sessionKey);\n return { ok };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded deleteSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async getSessionInfo(sessionKey: string): Promise<SessionInfo> {\n if (!this.agent) {\n const config = loadConfig();\n const model = config.agents?.defaults?.models?.chat?.primary;\n return { model: model ?? undefined };\n }\n try {\n const cfg = await this.agent.sessionInspector.agentConfig(sessionKey);\n const parsed = parseModelRef(cfg.model);\n const usage = await this.agent.sessionInspector.contextUsage(sessionKey);\n return {\n model: parsed?.model ?? cfg.model,\n modelProvider: parsed?.provider,\n thinkingLevel: cfg.thinkingLevel,\n reasoningLevel: cfg.reasoningLevel,\n verboseLevel: cfg.verboseLevel,\n totalTokens: usage.estimatedTokens,\n contextWindow: usage.contextWindow,\n contextUsagePercent: usage.usagePercent,\n effectiveWorkspacePath: cfg.effectiveWorkspacePath,\n workingDirectoryLocked: cfg.workingDirectoryLocked,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey, errorMessage }, `getSessionInfo failed: ${errorMessage}`);\n const config = loadConfig();\n const model = config.agents?.defaults?.models?.chat?.primary;\n return { model: model ?? undefined };\n }\n }\n\n async listModels(): Promise<TuiModelChoice[]> {\n const models = await getAvailableModels();\n return models.map((model) => ({\n id: model.id,\n name: model.name ?? model.id,\n provider: model.provider,\n contextWindow: model.contextWindow,\n }));\n }\n\n async resetSession(sessionKey: string): Promise<void> {\n if (!this.agent) return;\n await this.agent.resetSession(sessionKey);\n }\n\n async patchSession(\n sessionKey: string,\n patch: Record<string, unknown>,\n ): Promise<void> {\n if (!this.agent) return;\n const result = await this.agent.sessionConfig.patch(sessionKey, {\n model: typeof patch.model === 'string' ? patch.model : undefined,\n thinkingLevel: typeof patch.thinkingLevel === 'string' ? patch.thinkingLevel : undefined,\n reasoningLevel: typeof patch.reasoningLevel === 'string' ? patch.reasoningLevel : undefined,\n verboseLevel: typeof patch.verboseLevel === 'string' ? patch.verboseLevel : undefined,\n workingDirectory: typeof patch.workingDirectory === 'string' ? patch.workingDirectory : undefined,\n });\n if (!result.ok) {\n throw new Error(result.error);\n }\n }\n\n async compactSession(\n sessionKey: string,\n options?: { force?: boolean; instructions?: string },\n ): Promise<TuiCompactionResult> {\n if (!this.agent) return { compacted: false, summary: 'Agent not started' };\n try {\n const result = await this.agent.sessionInspector.compact(sessionKey, {\n force: options?.force ?? true,\n instructions: options?.instructions,\n });\n if (!result.compacted) return { compacted: false, summary: 'Nothing to compact' };\n return {\n compacted: true,\n summary: `Compacted (${result.tokensBefore ?? '?'} → ${result.tokensAfter ?? '?'} tokens)`,\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n transcriptSummary: result.summary,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return { compacted: false, summary: errorMessage };\n }\n }\n\n async exportSession(sessionKey: string, format: ExportFormat): Promise<string> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.exportSession(sessionKey, format);\n }\n\n async importSession(\n targetSessionKey: string,\n jsonContent: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.importSessionExport(targetSessionKey, jsonContent);\n }\n\n async createShare(\n _sessionKey: string,\n request: TuiShareRequest,\n _options?: { agentId?: string },\n ): Promise<TuiShareResult> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n const config = loadConfig();\n if (!isShareToolAvailable(config)) {\n throw new Error('Sharing is disabled in gateway config');\n }\n const workspace = getWorkspacePath(config);\n const tool = createCreateShareTool({\n workspace,\n getConfig: () => config,\n getAgentId: () => 'tui',\n });\n const result = await tool.execute(\n 'tui-share',\n {\n filePath: request.path,\n audience: request.audience,\n mode: request.mode,\n title: request.title,\n description: request.description,\n },\n );\n const details = (result.details ?? {}) as Record<string, unknown>;\n const error = typeof details.error === 'string' ? details.error : undefined;\n if (error) {\n throw new Error(error);\n }\n const shareUrl = typeof details.shareUrl === 'string' ? details.shareUrl : undefined;\n if (!shareUrl) {\n const text = result.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .join('\\n')\n .trim();\n throw new Error(text || 'Share failed');\n }\n return {\n kind: typeof details.kind === 'string' ? details.kind : 'share',\n shareUrl,\n title: typeof details.title === 'string' ? details.title : undefined,\n description: typeof details.description === 'string' ? details.description : undefined,\n thumbnailUrl: typeof details.thumbnailUrl === 'string' ? details.thumbnailUrl : undefined,\n reachability: typeof details.reachability === 'string' ? details.reachability : undefined,\n reachabilityHint:\n typeof details.reachabilityHint === 'string' ? details.reachabilityHint : undefined,\n expiresAt: typeof details.expiresAt === 'string' ? details.expiresAt : undefined,\n maxViews: typeof details.maxViews === 'number' ? details.maxViews : null,\n routingReason:\n typeof (details.routing as { reason?: unknown } | undefined)?.reason === 'string'\n ? ((details.routing as { reason: string }).reason)\n : undefined,\n routingHint:\n typeof (details.routing as { hint?: unknown } | undefined)?.hint === 'string'\n ? ((details.routing as { hint: string }).hint)\n : undefined,\n };\n }\n\n async btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n if (!this.agent) {\n return { text: '', error: 'Agent not started' };\n }\n return this.agent.sessionInspector.btwQuery(sessionKey, question);\n }\n\n async forkSession(\n sourceSessionKey: string,\n targetSessionKey: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n return this.agent.sessionStore.forkSession(sourceSessionKey, targetSessionKey);\n }\n\n async forkSessionAt(\n sourceSessionKey: string,\n targetSessionKey: string,\n entryId: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n const throughRow = transcriptTreeEntryIdToRowNumber(entryId);\n if (throughRow == null) {\n throw new Error(`Invalid transcript entry: ${entryId}`);\n }\n return this.agent.sessionStore.forkSessionRows(sourceSessionKey, targetSessionKey, { throughRow });\n }\n\n async setTranscriptLabel(\n sessionKey: string,\n entryId: string,\n label: string | undefined,\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptLabelEntry(sessionKey, { targetId: entryId, label });\n return { ok: true };\n }\n\n async appendCustomEntry(\n sessionKey: string,\n customType: string,\n data?: unknown,\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptCustomEntry(sessionKey, { customType, data });\n return { ok: true };\n }\n\n async appendCustomMessage(\n sessionKey: string,\n message: {\n customType: string;\n content?: string | unknown[];\n display?: boolean;\n details?: unknown;\n },\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptCustomMessageEntry(sessionKey, message);\n evictEmbeddedSessionRunner(sessionKey, 'tui_custom_message_appended');\n return { ok: true };\n }\n\n async appendBashExecution(\n sessionKey: string,\n entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext?: boolean;\n truncated?: boolean;\n fullOutputPath?: string;\n },\n ): Promise<{ ok: boolean }> {\n if (!this.agent) {\n throw new Error('Agent not started');\n }\n await this.agent.sessionStore.appendTranscriptBashExecutionEntry(sessionKey, entry);\n evictEmbeddedSessionRunner(sessionKey, 'tui_bash_execution_appended');\n return { ok: true };\n }\n\n private processOutbound(): void {\n void (async () => {\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n log.debug({ channel: msg.channel, chatId: msg.chat_id }, 'Outbound message');\n } catch (error) {\n if (error instanceof MessageBusShutdownError) break;\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Outbound processor failed: ${errorMessage}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n })();\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { BUILTIN_AGENT_IDS } from "../../agent/builtin-agent-ids.js";
4
3
  import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
5
4
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
6
5
  import { parseModelRef } from "../../agent/models/selection.js";
@@ -391,11 +390,6 @@ var GatewaySseBackend = class {
391
390
  }
392
391
  async listAgents() {
393
392
  const agents = /* @__PURE__ */ new Map();
394
- for (const id of BUILTIN_AGENT_IDS) agents.set(id, {
395
- id,
396
- source: "builtin",
397
- enabled: true
398
- });
399
393
  try {
400
394
  const res = await gatewayFetch(this.baseUrl, "/api/agents", this.token);
401
395
  if (res.ok) {
@@ -405,7 +399,6 @@ var GatewaySseBackend = class {
405
399
  const id = row.id.trim().toLowerCase();
406
400
  agents.set(id, {
407
401
  id,
408
- source: "configured",
409
402
  enabled: true,
410
403
  ...typeof row.name === "string" && row.name.trim() ? { displayName: row.name.trim() } : {}
411
404
  });