@xopcai/xopc 0.0.112 → 0.0.114

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 (351) hide show
  1. package/dist/browser-ext/icons/icon-128.png +0 -0
  2. package/dist/browser-ext/icons/icon-16.png +0 -0
  3. package/dist/browser-ext/icons/icon-32.png +0 -0
  4. package/dist/browser-ext/icons/icon-48.png +0 -0
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/extensions/weixin/src/delivery-to.d.ts +3 -3
  8. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  9. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  10. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-EhRp-ZMa.js → agent-avatar-dicebear-Fp-p7bP1.js} +1 -1
  11. package/dist/gateway/static/root/assets/agent-browser-settings-page-CWh7trjd.js +6 -0
  12. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-kC8OuLoj.js +1 -0
  13. package/dist/gateway/static/root/assets/agents-DJWG26Si.js +71 -0
  14. package/dist/gateway/static/root/assets/{app-management-settings-panel-BIy7KEsM.js → app-management-settings-panel-v24i25Oj.js} +1 -1
  15. package/dist/gateway/static/root/assets/{appearance-settings-DGQG8NwA.js → appearance-settings-ycbdJRuZ.js} +1 -1
  16. package/dist/gateway/static/root/assets/apps-page-0V3DXZ7J.js +1 -0
  17. package/dist/gateway/static/root/assets/{archive-plugin-uuQPupqx.js → archive-plugin-CJzSADJo.js} +1 -1
  18. package/dist/gateway/static/root/assets/{attachment-load-DBkv0cAv.js → attachment-load-BTAB4zGS.js} +1 -1
  19. package/dist/gateway/static/root/assets/{binary-plugins-DxxN_VAR.js → binary-plugins-DXR1-mct.js} +1 -1
  20. package/dist/gateway/static/root/assets/{block-editor-CwnUlRmO.js → block-editor-CzQri9h2.js} +44 -44
  21. package/dist/gateway/static/root/assets/channels-settings-CIKOkYdO.js +1 -0
  22. package/dist/gateway/static/root/assets/{config-api-BD-NcD5d.js → config-api-DRqjEvAx.js} +1 -1
  23. package/dist/gateway/static/root/assets/connectors-settings-ClrDS5jH.js +2 -0
  24. package/dist/gateway/static/root/assets/{cron-api-C5DoipZA.js → cron-api-BXaZXv1o.js} +1 -1
  25. package/dist/gateway/static/root/assets/cron-page-Chi_4u4P.js +3 -0
  26. package/dist/gateway/static/root/assets/dreaming-settings-B0_rs2tj.js +1 -0
  27. package/dist/gateway/static/root/assets/{extension-debug-page-BDHA9o_e.js → extension-debug-page-DSkqMYo7.js} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-page-DmDLVSPE.js → extension-page-h2dGDbMN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-settings-page-1124aHw_.js → extension-settings-page-hN99RhOi.js} +1 -1
  30. package/dist/gateway/static/root/assets/{fetch-DOe56Wmy.js → fetch-D9QqUtzZ.js} +1 -1
  31. package/dist/gateway/static/root/assets/{format-interval-label-tsMSvBSR.js → format-interval-label-D6E687rG.js} +1 -1
  32. package/dist/gateway/static/root/assets/{gateway-config-api-CsD4FC9D.js → gateway-config-api-CLt_SKTC.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-settings-HQ8FBhY2.js → gateway-settings-1PDi4lI0.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-startup-retry-C1zg7pH3.js → gateway-startup-retry-N7Z_sz7p.js} +1 -1
  35. package/dist/gateway/static/root/assets/goal-detail-page-D_wwXL-t.js +1 -0
  36. package/dist/gateway/static/root/assets/goals-page-DZ2toZ8y.js +2 -0
  37. package/dist/gateway/static/root/assets/{goals-settings-B5nI6lgz.js → goals-settings-LFlwtIKE.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-config-api-CIv42nJD.js → heartbeat-config-api-DGPadTw-.js} +1 -1
  39. package/dist/gateway/static/root/assets/{heartbeat-settings-DFcVuJ3M.js → heartbeat-settings-BHHAs8ZX.js} +1 -1
  40. package/dist/gateway/static/root/assets/index-DefIdW9q.js +122 -0
  41. package/dist/gateway/static/root/assets/index-DzmWBkq-.css +1 -0
  42. package/dist/gateway/static/root/assets/{interval-presets-DGP3S7OB.js → interval-presets-CEklPQ_r.js} +1 -1
  43. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-fETaDYQP.js → keyboard-shortcuts-settings-Ce_aQ8Iv.js} +1 -1
  44. package/dist/gateway/static/root/assets/logs-page-j_D2QTuQ.js +2 -0
  45. package/dist/gateway/static/root/assets/{markdown-split-CgeBJMOD.js → markdown-split-BMz3xPXO.js} +1 -1
  46. package/dist/gateway/static/root/assets/{media-plugins-C30GzlV2.js → media-plugins-BalOSoz9.js} +1 -1
  47. package/dist/gateway/static/root/assets/messages-BN_WiUg0.js +3 -0
  48. package/dist/gateway/static/root/assets/models-hub-panel-CMH_TmZz.js +2 -0
  49. package/dist/gateway/static/root/assets/note-detail-page-O18BrQPq.js +2 -0
  50. package/dist/gateway/static/root/assets/{note-image-lightbox-t1g0qZYh.js → note-image-lightbox-C5D1Q5mY.js} +1 -1
  51. package/dist/gateway/static/root/assets/notes-page-B_ZYCmY9.js +1 -0
  52. package/dist/gateway/static/root/assets/{preview-open-alternatives-DeWp9x5g.js → preview-open-alternatives-CYFR5U9l.js} +1 -1
  53. package/dist/gateway/static/root/assets/remote-access-hub-CwKgWixY.js +1 -0
  54. package/dist/gateway/static/root/assets/{save-bar-controls-BOaAOJI3.js → save-bar-controls-BQ79Z5IP.js} +1 -1
  55. package/dist/gateway/static/root/assets/{schedule-field-BLWLKqgw.js → schedule-field-Bgk6Emue.js} +1 -1
  56. package/dist/gateway/static/root/assets/{schema-form-plqRFYT8.js → schema-form-DzS36TMa.js} +1 -1
  57. package/dist/gateway/static/root/assets/sessions-page-C4fcD-7B.js +1 -0
  58. package/dist/gateway/static/root/assets/settings-advanced-gate-Ad2OJ86w.js +1 -0
  59. package/dist/gateway/static/root/assets/{settings-collapsible-section-BP5zRrDI.js → settings-collapsible-section-CdjFnSAy.js} +1 -1
  60. package/dist/gateway/static/root/assets/{settings-form-section-Bv8MZplG.js → settings-form-section-DZLy_exu.js} +1 -1
  61. package/dist/gateway/static/root/assets/settings-page-D2BMY5wo.js +1 -0
  62. package/dist/gateway/static/root/assets/setup-status-panel-aWwxl_E1.js +1 -0
  63. package/dist/gateway/static/root/assets/{share-preview-page-4OX1YCgp.js → share-preview-page-_qRDr4g_.js} +1 -1
  64. package/dist/gateway/static/root/assets/shares-settings-DUE83uIf.js +1 -0
  65. package/dist/gateway/static/root/assets/skill-reload-api-mWKJcrog.js +1 -0
  66. package/dist/gateway/static/root/assets/skills-page-0Sx1Q58n.js +2 -0
  67. package/dist/gateway/static/root/assets/{system-settings-panel-CGy4f_s2.js → system-settings-panel-hqaBF5aG.js} +1 -1
  68. package/dist/gateway/static/root/assets/use-agent-defaults-form-zbVIQLOA.js +1 -0
  69. package/dist/gateway/static/root/assets/{use-channel-catalog-CjGHnDvN.js → use-channel-catalog-CbXq97rT.js} +1 -1
  70. package/dist/gateway/static/root/assets/{use-settings-tab-guard-BMMFa0oA.js → use-settings-tab-guard-DwS3drWK.js} +1 -1
  71. package/dist/gateway/static/root/assets/voice-api-key-field-D6HR0hR2.js +1 -0
  72. package/dist/gateway/static/root/assets/{voice-player-store-D5vzWwls.js → voice-player-store-DSuOd9zy.js} +1 -1
  73. package/dist/gateway/static/root/assets/workflow-page.utils-C0Uq3xyq.js +1 -0
  74. package/dist/gateway/static/root/assets/workflows-page-DW0fmWhQ.js +18 -0
  75. package/dist/gateway/static/root/favicon-16x16.png +0 -0
  76. package/dist/gateway/static/root/favicon-32x32.png +0 -0
  77. package/dist/gateway/static/root/favicon-icon.svg +1 -0
  78. package/dist/gateway/static/root/favicon.ico +0 -0
  79. package/dist/gateway/static/root/favicon.png +0 -0
  80. package/dist/gateway/static/root/favicon.svg +24 -17
  81. package/dist/gateway/static/root/index.html +5 -5
  82. package/dist/gateway/static/root/logo-dark.svg +23 -15
  83. package/dist/gateway/static/root/logo.svg +23 -16
  84. package/dist/package.js +1 -1
  85. package/dist/src/agent/agent-manager.d.ts +8 -0
  86. package/dist/src/agent/agent-manager.js +57 -22
  87. package/dist/src/agent/agent-manager.js.map +1 -1
  88. package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
  89. package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
  90. package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
  91. package/dist/src/agent/goals/persistent-goal-service.js +2 -4
  92. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  93. package/dist/src/agent/inbound/inbound-loop.js +5 -1
  94. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  95. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
  96. package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
  97. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  98. package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
  99. package/dist/src/agent/mcp/bundle-mcp-materialize.js +49 -1
  100. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  101. package/dist/src/agent/mcp/bundle-mcp-runtime.js +78 -3
  102. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  103. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
  104. package/dist/src/agent/service/btw-query.js +11 -3
  105. package/dist/src/agent/service/btw-query.js.map +1 -1
  106. package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
  107. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
  108. package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
  109. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  110. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  111. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  112. package/dist/src/agent/service/process-direct-streaming.js +10 -5
  113. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  114. package/dist/src/agent/service.d.ts +1 -1
  115. package/dist/src/agent/service.js +9 -5
  116. package/dist/src/agent/service.js.map +1 -1
  117. package/dist/src/agent/service.types.d.ts +5 -0
  118. package/dist/src/agent/skills/filesystem-watcher.js +4 -3
  119. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
  120. package/dist/src/agent/skills/index.js +2 -1
  121. package/dist/src/agent/skills/index.js.map +1 -1
  122. package/dist/src/agent/skills/skill-manage-ops.js +2 -1
  123. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  124. package/dist/src/agent/skills/types.d.ts +1 -1
  125. package/dist/src/agent/skills/watcher.js +2 -5
  126. package/dist/src/agent/skills/watcher.js.map +1 -1
  127. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  128. package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
  129. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
  130. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  131. package/dist/src/agent/tool-manuals/browser.js +62 -3
  132. package/dist/src/agent/tool-manuals/browser.js.map +1 -1
  133. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
  134. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
  135. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  136. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
  137. package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
  138. package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
  139. package/dist/src/agent/tools/factory.js +1 -10
  140. package/dist/src/agent/tools/factory.js.map +1 -1
  141. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  142. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  143. package/dist/src/agent/workflow/subagent-runner.js +18 -1
  144. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  145. package/dist/src/ai-assist/text-assist.d.ts +3 -0
  146. package/dist/src/ai-assist/text-assist.js +25 -7
  147. package/dist/src/ai-assist/text-assist.js.map +1 -1
  148. package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
  149. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  150. package/dist/src/browser/actions/registry.js +383 -7
  151. package/dist/src/browser/actions/registry.js.map +1 -1
  152. package/dist/src/browser/actions/types.d.ts +11 -3
  153. package/dist/src/browser/index.js +2 -2
  154. package/dist/src/browser/pipeline/output.d.ts +18 -16
  155. package/dist/src/browser/pipeline/output.js +28 -20
  156. package/dist/src/browser/pipeline/output.js.map +1 -1
  157. package/dist/src/browser/pipeline/runner.d.ts +7 -14
  158. package/dist/src/browser/pipeline/runner.js +349 -102
  159. package/dist/src/browser/pipeline/runner.js.map +1 -1
  160. package/dist/src/browser/pipeline/schema.d.ts +1 -0
  161. package/dist/src/browser/pipeline/schema.js +35 -58
  162. package/dist/src/browser/pipeline/schema.js.map +1 -1
  163. package/dist/src/browser/pipeline/source.d.ts +2 -0
  164. package/dist/src/browser/pipeline/source.js +10 -1
  165. package/dist/src/browser/pipeline/source.js.map +1 -1
  166. package/dist/src/browser/pipeline/template.d.ts +10 -2
  167. package/dist/src/browser/pipeline/template.js +50 -8
  168. package/dist/src/browser/pipeline/template.js.map +1 -1
  169. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  170. package/dist/src/chat-commands/builtins/config.js +3 -5
  171. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  172. package/dist/src/chat-commands/context.d.ts +5 -0
  173. package/dist/src/chat-commands/context.js +18 -9
  174. package/dist/src/chat-commands/context.js.map +1 -1
  175. package/dist/src/chat-commands/index.d.ts +1 -1
  176. package/dist/src/chat-commands/index.js +2 -2
  177. package/dist/src/chat-commands/index.js.map +1 -1
  178. package/dist/src/chat-commands/processor.js +22 -21
  179. package/dist/src/chat-commands/processor.js.map +1 -1
  180. package/dist/src/chat-commands/session-key.d.ts +3 -15
  181. package/dist/src/chat-commands/session-key.js +3 -49
  182. package/dist/src/chat-commands/session-key.js.map +1 -1
  183. package/dist/src/chat-commands/types.d.ts +4 -0
  184. package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
  185. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  186. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  187. package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
  188. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  189. package/dist/src/config/rules.js +5 -0
  190. package/dist/src/config/rules.js.map +1 -1
  191. package/dist/src/connectors/builtin-catalog.js +180 -1
  192. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  193. package/dist/src/connectors/health.js +18 -9
  194. package/dist/src/connectors/health.js.map +1 -1
  195. package/dist/src/connectors/types.d.ts +19 -0
  196. package/dist/src/connectors/usage.js +12 -4
  197. package/dist/src/connectors/usage.js.map +1 -1
  198. package/dist/src/cron/executor.js.map +1 -1
  199. package/dist/src/cron/types.d.ts +2 -2
  200. package/dist/src/extensions/types/tui.d.ts +2 -0
  201. package/dist/src/gateway/heartbeat/service.js +13 -1
  202. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  203. package/dist/src/gateway/hono/app.js +13 -4
  204. package/dist/src/gateway/hono/app.js.map +1 -1
  205. package/dist/src/gateway/hono/oauth-async.js +1 -1
  206. package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
  207. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  208. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  209. package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
  210. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  211. package/dist/src/gateway/hono/routes/goals.js +16 -3
  212. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  213. package/dist/src/gateway/hono/routes/logs.js +1 -0
  214. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  215. package/dist/src/gateway/hono/routes/mcp.js +27 -8
  216. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  217. package/dist/src/gateway/hono/routes/notes.js +14 -2
  218. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  219. package/dist/src/gateway/hono/routes/sessions.js +62 -4
  220. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  221. package/dist/src/gateway/hono/routes/workspace.js +3 -66
  222. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  223. package/dist/src/gateway/hono/sse.d.ts +2 -2
  224. package/dist/src/gateway/hono/sse.js +7 -15
  225. package/dist/src/gateway/hono/sse.js.map +1 -1
  226. package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
  227. package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
  228. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
  229. package/dist/src/gateway/service/agent-runner.d.ts +2 -3
  230. package/dist/src/gateway/service/agent-runner.js +9 -22
  231. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  232. package/dist/src/gateway/service/run-gateway-agent.js +9 -7
  233. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  234. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  235. package/dist/src/gateway/service/sessions-api.js +11 -0
  236. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  237. package/dist/src/gateway/service.d.ts +1 -1
  238. package/dist/src/gateway/service.js +19 -5
  239. package/dist/src/gateway/service.js.map +1 -1
  240. package/dist/src/gateway/workspace-file-search.d.ts +9 -0
  241. package/dist/src/gateway/workspace-file-search.js +76 -0
  242. package/dist/src/gateway/workspace-file-search.js.map +1 -0
  243. package/dist/src/goals/goal-notifications.d.ts +2 -0
  244. package/dist/src/goals/goal-notifications.js +16 -11
  245. package/dist/src/goals/goal-notifications.js.map +1 -1
  246. package/dist/src/goals/goal-service.js +1 -6
  247. package/dist/src/goals/goal-service.js.map +1 -1
  248. package/dist/src/project-trust/trust-store.js +2 -0
  249. package/dist/src/project-trust/trust-store.js.map +1 -1
  250. package/dist/src/session/index.d.ts +1 -1
  251. package/dist/src/session/index.js +2 -2
  252. package/dist/src/session/init-session-turn.js +6 -9
  253. package/dist/src/session/init-session-turn.js.map +1 -1
  254. package/dist/src/session/manager.d.ts +5 -1
  255. package/dist/src/session/manager.js +5 -2
  256. package/dist/src/session/manager.js.map +1 -1
  257. package/dist/src/session/reset-type.d.ts +0 -2
  258. package/dist/src/session/reset-type.js +3 -9
  259. package/dist/src/session/reset-type.js.map +1 -1
  260. package/dist/src/session/resolve-session.js +9 -20
  261. package/dist/src/session/resolve-session.js.map +1 -1
  262. package/dist/src/session/store-reader.d.ts +5 -0
  263. package/dist/src/session/store-reader.js +1 -0
  264. package/dist/src/session/store.d.ts +11 -3
  265. package/dist/src/session/store.js +29 -13
  266. package/dist/src/session/store.js.map +1 -1
  267. package/dist/src/session/types.d.ts +2 -4
  268. package/dist/src/session/types.js.map +1 -1
  269. package/dist/src/storage/sqlite/index.d.ts +2 -2
  270. package/dist/src/storage/sqlite/index.js +3 -3
  271. package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
  272. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  273. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  274. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  275. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  276. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
  277. package/dist/src/storage/sqlite/row-mappers.js +11 -14
  278. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  279. package/dist/src/storage/sqlite/schema.js +3 -3
  280. package/dist/src/storage/sqlite/schema.js.map +1 -1
  281. package/dist/src/storage/sqlite/schema.sql +37 -10
  282. package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
  283. package/dist/src/storage/sqlite/session-metadata.js +18 -72
  284. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  285. package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
  286. package/dist/src/storage/sqlite/session-repository.js +34 -40
  287. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  288. package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
  289. package/dist/src/storage/sqlite/transcript-repository.js +52 -52
  290. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  291. package/dist/src/tui/backends/embedded-backend.d.ts +11 -4
  292. package/dist/src/tui/backends/embedded-backend.js +27 -1
  293. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  294. package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -1
  295. package/dist/src/tui/backends/gateway-sse-backend.js +21 -2
  296. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  297. package/dist/src/tui/extension-host/autocomplete.js +13 -10
  298. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  299. package/dist/src/tui/extension-host/runtime.d.ts +7 -0
  300. package/dist/src/tui/extension-host/runtime.js +6 -4
  301. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  302. package/dist/src/tui/tui-backend.d.ts +9 -0
  303. package/dist/src/tui/tui-commands.js +85 -6
  304. package/dist/src/tui/tui-commands.js.map +1 -1
  305. package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
  306. package/dist/src/tui/tui-file-autocomplete.js +26 -0
  307. package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
  308. package/dist/src/tui/tui-picker-overlay.js +1 -1
  309. package/dist/src/tui/tui.js +29 -11
  310. package/dist/src/tui/tui.js.map +1 -1
  311. package/dist/src/utils/logger/context.d.ts +2 -2
  312. package/dist/src/utils/logger/context.js +2 -1
  313. package/dist/src/utils/logger/context.js.map +1 -1
  314. package/dist/src/utils/logger/log-store.js +1 -0
  315. package/dist/src/utils/logger/log-store.js.map +1 -1
  316. package/dist/src/utils/logger/pino-record.js +3 -0
  317. package/dist/src/utils/logger/pino-record.js.map +1 -1
  318. package/dist/src/utils/logger/types.d.ts +5 -0
  319. package/dist/src/utils/logger/types.js.map +1 -1
  320. package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
  321. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  322. package/package.json +1 -1
  323. package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +0 -6
  324. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +0 -1
  325. package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +0 -71
  326. package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +0 -1
  327. package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +0 -1
  328. package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +0 -2
  329. package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +0 -3
  330. package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +0 -1
  331. package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +0 -1
  332. package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +0 -2
  333. package/dist/gateway/static/root/assets/index-5A_ZaABy.css +0 -1
  334. package/dist/gateway/static/root/assets/index-BTmbp2AU.js +0 -121
  335. package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +0 -2
  336. package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +0 -3
  337. package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +0 -2
  338. package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +0 -2
  339. package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +0 -1
  340. package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +0 -1
  341. package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +0 -1
  342. package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +0 -1
  343. package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +0 -1
  344. package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +0 -1
  345. package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +0 -1
  346. package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +0 -1
  347. package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +0 -2
  348. package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +0 -1
  349. package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +0 -1
  350. package/dist/gateway/static/root/assets/workflow-page.utils-tjGpRVnw.js +0 -1
  351. package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.js +0 -18
@@ -1,7 +1,7 @@
1
1
  import { init_loader, loadConfig } from "../../../../config/loader.js";
2
2
  import { requireXopcDatabase } from "../../../../storage/sqlite/connection.js";
3
3
  import { getSqliteDatabase } from "../../../../storage/sqlite/transaction.js";
4
- import { getCurrentTranscriptId, listSessionMetadata } from "../../../../storage/sqlite/session-repository.js";
4
+ import { getCurrentSessionId, listSessionMetadata } from "../../../../storage/sqlite/session-repository.js";
5
5
  import "../../../../storage/sqlite/index.js";
6
6
  import { existsSync } from "node:fs";
7
7
  //#region src/cli/commands/doctor/checks/session-integrity.ts
@@ -39,18 +39,18 @@ async function checkSessionIntegrity(ctx) {
39
39
  for (const failure of integrityFailures) issues.push(`database integrity: ${failure}`);
40
40
  const { items } = listSessionMetadata({ limit: 1e5 });
41
41
  for (const session of items) {
42
- const transcriptId = getCurrentTranscriptId(session.key);
43
- if (!transcriptId) {
42
+ const sessionId = getCurrentSessionId(session.key);
43
+ if (!sessionId) {
44
44
  issues.push(`missing transcript for ${session.key}`);
45
45
  continue;
46
46
  }
47
- if (transcriptId !== session.transcriptId) issues.push(`transcript id mismatch for ${session.key}`);
48
- if (!db.prepare(`SELECT transcript_id FROM transcripts WHERE transcript_id = ? AND status = 'active'`).get(transcriptId)?.transcript_id) issues.push(`active transcript row missing for ${session.key}`);
47
+ if (sessionId !== session.sessionId) issues.push(`session id mismatch for ${session.key}`);
48
+ if (!db.prepare(`SELECT session_id FROM transcripts WHERE session_id = ? AND status = 'active'`).get(sessionId)?.session_id) issues.push(`active transcript row missing for ${session.key}`);
49
49
  }
50
- const orphanTranscripts = db.prepare(`SELECT t.transcript_id FROM transcripts t
51
- LEFT JOIN sessions s ON s.current_transcript_id = t.transcript_id
50
+ const orphanTranscripts = db.prepare(`SELECT t.session_id FROM transcripts t
51
+ LEFT JOIN sessions s ON s.session_id = t.session_id
52
52
  WHERE t.status = 'active' AND s.session_key IS NULL`).all();
53
- for (const row of orphanTranscripts) issues.push(`orphan active transcript ${row.transcript_id}`);
53
+ for (const row of orphanTranscripts) issues.push(`orphan active transcript ${row.session_id}`);
54
54
  if (issues.length === 0) return {
55
55
  id: "session-integrity",
56
56
  label: "Sessions",
@@ -1 +1 @@
1
- {"version":3,"file":"session-integrity.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/session-integrity.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport {\n getCurrentTranscriptId,\n getSqliteDatabase,\n requireXopcDatabase,\n listSessionMetadata,\n} from '../../../../storage/sqlite/index.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkSessionIntegrity(ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.options.deep) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'skip',\n message: 'Deep mode off; session scan skipped.',\n hints: ['Run: xopc doctor --deep'],\n };\n }\n\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n try {\n loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'warn',\n message: 'Config invalid; session scan skipped.',\n hints: ['Fix xopc.json before running session integrity checks.'],\n };\n }\n\n requireXopcDatabase();\n\n const issues: string[] = [];\n const db = getSqliteDatabase();\n\n const integrity = db.prepare('PRAGMA integrity_check').all() as Array<{ integrity_check: string }>;\n const integrityFailures = integrity\n .map((row) => row.integrity_check)\n .filter((value) => value !== 'ok');\n for (const failure of integrityFailures) {\n issues.push(`database integrity: ${failure}`);\n }\n\n const { items } = listSessionMetadata({ limit: 100_000 });\n\n for (const session of items) {\n const transcriptId = getCurrentTranscriptId(session.key);\n if (!transcriptId) {\n issues.push(`missing transcript for ${session.key}`);\n continue;\n }\n if (transcriptId !== session.transcriptId) {\n issues.push(`transcript id mismatch for ${session.key}`);\n }\n const transcript = db\n .prepare(`SELECT transcript_id FROM transcripts WHERE transcript_id = ? AND status = 'active'`)\n .get(transcriptId) as { transcript_id?: string } | undefined;\n if (!transcript?.transcript_id) {\n issues.push(`active transcript row missing for ${session.key}`);\n }\n }\n\n const orphanTranscripts = db\n .prepare(\n `SELECT t.transcript_id FROM transcripts t\n LEFT JOIN sessions s ON s.current_transcript_id = t.transcript_id\n WHERE t.status = 'active' AND s.session_key IS NULL`,\n )\n .all() as Array<{ transcript_id: string }>;\n for (const row of orphanTranscripts) {\n issues.push(`orphan active transcript ${row.transcript_id}`);\n }\n\n if (issues.length === 0) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'pass',\n message: `SQLite session store OK (${items.length} session(s)).`,\n hints: [],\n };\n }\n\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'warn',\n message: `${issues.length} session integrity issue(s).`,\n hints: issues.slice(0, 8),\n };\n}\n"],"mappings":";;;;;;;aAE0D;AAS1D,eAAsB,sBAAsB,KAA0C;AACpF,KAAI,CAAC,IAAI,QAAQ,KACf,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,0BAA0B;EACnC;AAGH,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI;AACF,aAAW,IAAI,WAAW;SACpB;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,CAAC,yDAAyD;GAClE;;AAGH,sBAAqB;CAErB,MAAM,SAAmB,EAAE;CAC3B,MAAM,KAAK,mBAAmB;CAG9B,MAAM,oBADY,GAAG,QAAQ,yBAAyB,CAAC,KACpB,CAChC,KAAK,QAAQ,IAAI,gBAAgB,CACjC,QAAQ,UAAU,UAAU,KAAK;AACpC,MAAK,MAAM,WAAW,kBACpB,QAAO,KAAK,uBAAuB,UAAU;CAG/C,MAAM,EAAE,UAAU,oBAAoB,EAAE,OAAO,KAAS,CAAC;AAEzD,MAAK,MAAM,WAAW,OAAO;EAC3B,MAAM,eAAe,uBAAuB,QAAQ,IAAI;AACxD,MAAI,CAAC,cAAc;AACjB,UAAO,KAAK,0BAA0B,QAAQ,MAAM;AACpD;;AAEF,MAAI,iBAAiB,QAAQ,aAC3B,QAAO,KAAK,8BAA8B,QAAQ,MAAM;AAK1D,MAAI,CAHe,GAChB,QAAQ,sFAAsF,CAC9F,IAAI,aACQ,EAAE,cACf,QAAO,KAAK,qCAAqC,QAAQ,MAAM;;CAInE,MAAM,oBAAoB,GACvB,QACC;;4DAGD,CACA,KAAK;AACR,MAAK,MAAM,OAAO,kBAChB,QAAO,KAAK,4BAA4B,IAAI,gBAAgB;AAG9D,KAAI,OAAO,WAAW,EACpB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,4BAA4B,MAAM,OAAO;EAClD,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,GAAG,OAAO,OAAO;EAC1B,OAAO,OAAO,MAAM,GAAG,EAAE;EAC1B"}
1
+ {"version":3,"file":"session-integrity.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/session-integrity.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport {\n getCurrentSessionId,\n getSqliteDatabase,\n requireXopcDatabase,\n listSessionMetadata,\n} from '../../../../storage/sqlite/index.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkSessionIntegrity(ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.options.deep) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'skip',\n message: 'Deep mode off; session scan skipped.',\n hints: ['Run: xopc doctor --deep'],\n };\n }\n\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n try {\n loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'warn',\n message: 'Config invalid; session scan skipped.',\n hints: ['Fix xopc.json before running session integrity checks.'],\n };\n }\n\n requireXopcDatabase();\n\n const issues: string[] = [];\n const db = getSqliteDatabase();\n\n const integrity = db.prepare('PRAGMA integrity_check').all() as Array<{ integrity_check: string }>;\n const integrityFailures = integrity\n .map((row) => row.integrity_check)\n .filter((value) => value !== 'ok');\n for (const failure of integrityFailures) {\n issues.push(`database integrity: ${failure}`);\n }\n\n const { items } = listSessionMetadata({ limit: 100_000 });\n\n for (const session of items) {\n const sessionId = getCurrentSessionId(session.key);\n if (!sessionId) {\n issues.push(`missing transcript for ${session.key}`);\n continue;\n }\n if (sessionId !== session.sessionId) {\n issues.push(`session id mismatch for ${session.key}`);\n }\n const transcript = db\n .prepare(`SELECT session_id FROM transcripts WHERE session_id = ? AND status = 'active'`)\n .get(sessionId) as { session_id?: string } | undefined;\n if (!transcript?.session_id) {\n issues.push(`active transcript row missing for ${session.key}`);\n }\n }\n\n const orphanTranscripts = db\n .prepare(\n `SELECT t.session_id FROM transcripts t\n LEFT JOIN sessions s ON s.session_id = t.session_id\n WHERE t.status = 'active' AND s.session_key IS NULL`,\n )\n .all() as Array<{ session_id: string }>;\n for (const row of orphanTranscripts) {\n issues.push(`orphan active transcript ${row.session_id}`);\n }\n\n if (issues.length === 0) {\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'pass',\n message: `SQLite session store OK (${items.length} session(s)).`,\n hints: [],\n };\n }\n\n return {\n id: 'session-integrity',\n label: 'Sessions',\n status: 'warn',\n message: `${issues.length} session integrity issue(s).`,\n hints: issues.slice(0, 8),\n };\n}\n"],"mappings":";;;;;;;aAE0D;AAS1D,eAAsB,sBAAsB,KAA0C;AACpF,KAAI,CAAC,IAAI,QAAQ,KACf,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,0BAA0B;EACnC;AAGH,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI;AACF,aAAW,IAAI,WAAW;SACpB;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,CAAC,yDAAyD;GAClE;;AAGH,sBAAqB;CAErB,MAAM,SAAmB,EAAE;CAC3B,MAAM,KAAK,mBAAmB;CAG9B,MAAM,oBADY,GAAG,QAAQ,yBAAyB,CAAC,KACpB,CAChC,KAAK,QAAQ,IAAI,gBAAgB,CACjC,QAAQ,UAAU,UAAU,KAAK;AACpC,MAAK,MAAM,WAAW,kBACpB,QAAO,KAAK,uBAAuB,UAAU;CAG/C,MAAM,EAAE,UAAU,oBAAoB,EAAE,OAAO,KAAS,CAAC;AAEzD,MAAK,MAAM,WAAW,OAAO;EAC3B,MAAM,YAAY,oBAAoB,QAAQ,IAAI;AAClD,MAAI,CAAC,WAAW;AACd,UAAO,KAAK,0BAA0B,QAAQ,MAAM;AACpD;;AAEF,MAAI,cAAc,QAAQ,UACxB,QAAO,KAAK,2BAA2B,QAAQ,MAAM;AAKvD,MAAI,CAHe,GAChB,QAAQ,gFAAgF,CACxF,IAAI,UACQ,EAAE,WACf,QAAO,KAAK,qCAAqC,QAAQ,MAAM;;CAInE,MAAM,oBAAoB,GACvB,QACC;;4DAGD,CACA,KAAK;AACR,MAAK,MAAM,OAAO,kBAChB,QAAO,KAAK,4BAA4B,IAAI,aAAa;AAG3D,KAAI,OAAO,WAAW,EACpB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,4BAA4B,MAAM,OAAO;EAClD,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,GAAG,OAAO,OAAO;EAC1B,OAAO,OAAO,MAAM,GAAG,EAAE;EAC1B"}
@@ -168,6 +168,11 @@ const BASE_RELOAD_RULES = [
168
168
  kind: "restart",
169
169
  description: "File share policy"
170
170
  },
171
+ {
172
+ prefix: "gateway.siteShare",
173
+ kind: "restart",
174
+ description: "Site share policy"
175
+ },
171
176
  {
172
177
  prefix: "gateway.skillsStoreBaseUrl",
173
178
  kind: "restart",
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","names":[],"sources":["../../../src/config/rules.ts"],"sourcesContent":["/**\n * Configuration reload rules\n * \n * Defines how different config paths are handled:\n * - hot: Apply changes immediately without restart\n * - restart: Require gateway restart\n * - none: Ignore changes (no action needed)\n */\n\nexport type ReloadKind = 'hot' | 'restart' | 'none';\n\nexport interface ReloadRule {\n prefix: string;\n kind: ReloadKind;\n description?: string;\n}\n\nexport interface ReloadPlan {\n changedPaths: string[];\n hotPaths: string[];\n restartPaths: string[];\n noopPaths: string[];\n requiresRestart: boolean;\n requiresHotReload: boolean;\n}\n\n/**\n * Base reload rules for config paths\n */\nexport const BASE_RELOAD_RULES: ReloadRule[] = [\n // Models config - hot reload\n { prefix: 'models.providers', kind: 'hot', description: 'Model provider API keys, base URLs' },\n { prefix: 'models.mode', kind: 'hot', description: 'Model merge mode' },\n \n // Agent defaults - hot reload\n { prefix: 'agents.defaults.models', kind: 'hot', description: 'Model configuration' },\n { prefix: 'agents.defaults.maxTaskDurationMs', kind: 'hot', description: 'Per-turn wall-clock timeout (ms)' },\n { prefix: 'agents.defaults.maxTokens', kind: 'hot', description: 'Max tokens' },\n { prefix: 'agents.defaults.temperature', kind: 'hot', description: 'Temperature' },\n { prefix: 'agents.defaults.maxToolIterations', kind: 'hot', description: 'Max tool iterations' },\n { prefix: 'agents.defaults.compaction', kind: 'hot', description: 'Compaction settings' },\n { prefix: 'agents.defaults.pruning', kind: 'hot', description: 'Pruning settings' },\n { prefix: 'agents.defaults.webExtract', kind: 'hot', description: 'Web extract model and limits' },\n { prefix: 'agents.defaults.browser', kind: 'hot', description: 'Browser automation (Playwright) tools' },\n { prefix: 'agents.defaults.delegate', kind: 'hot', description: 'delegate_task sub-agent tool' },\n { prefix: 'agents.defaults.executeCode', kind: 'hot', description: 'execute_code sandbox tool' },\n {\n prefix: 'agents.defaults.backgroundReview',\n kind: 'hot',\n description: 'Post-turn memory/skill nudge + background review',\n },\n { prefix: 'agents.defaults.workspace', kind: 'none', description: 'Workspace path - no runtime effect' },\n \n // Gateway - restart required\n { prefix: 'gateway.bind', kind: 'restart', description: 'Gateway bind mode' },\n { prefix: 'gateway.customBindHost', kind: 'restart', description: 'Gateway custom bind host' },\n { prefix: 'gateway.port', kind: 'restart', description: 'Port number' },\n { prefix: 'gateway.mode', kind: 'restart', description: 'Gateway local/remote CLI mode' },\n { prefix: 'gateway.remote', kind: 'restart', description: 'Remote gateway CLI target' },\n { prefix: 'gateway.tailscale', kind: 'restart', description: 'Tailscale Serve/Funnel exposure' },\n { prefix: 'gateway.tls', kind: 'restart', description: 'Gateway native TLS' },\n { prefix: 'gateway.auth', kind: 'restart', description: 'Authentication settings' },\n { prefix: 'gateway.security', kind: 'restart', description: 'Gateway security policy' },\n { prefix: 'gateway.corsOrigins', kind: 'restart', description: 'CORS settings' },\n { prefix: 'gateway.trustedProxies', kind: 'restart', description: 'Trusted reverse proxy CIDRs' },\n {\n prefix: 'gateway.allowRealIpFallback',\n kind: 'restart',\n description: 'Trusted-proxy X-Real-IP fallback',\n },\n {\n prefix: 'gateway.dangerouslyAllowHostHeaderOriginFallback',\n kind: 'restart',\n description: 'Host-header origin fallback',\n },\n { prefix: 'gateway.maxSseConnections', kind: 'restart', description: 'SSE connection limit' },\n { prefix: 'gateway.channelConnectDeferMode', kind: 'restart', description: 'Channel connect defer mode' },\n { prefix: 'gateway.channelConnectDeferIds', kind: 'restart', description: 'Explicit channel connect defer list' },\n { prefix: 'gateway.channelConnectDeferSkipIds', kind: 'restart', description: 'Channel connect defer skip list' },\n { prefix: 'gateway.share', kind: 'restart', description: 'File share policy' },\n {\n prefix: 'gateway.skillsStoreBaseUrl',\n kind: 'restart',\n description: 'Skills marketplace API base URL',\n },\n { prefix: 'gateway.enableHotReload', kind: 'hot', description: 'Hot reload toggle' },\n \n // Channels - hot reload (channel-specific prefixes are registered by channel plugins)\n { prefix: 'channels', kind: 'hot', description: 'Any channel subtree (e.g. future extensions)' },\n \n // Cron - hot reload\n { prefix: 'cron', kind: 'hot', description: 'Scheduled tasks' },\n \n // Heartbeat lives under gateway.heartbeat in config JSON (not top-level `heartbeat`)\n { prefix: 'gateway.heartbeat', kind: 'hot', description: 'Heartbeat settings' },\n \n // Web search - hot reload\n { prefix: 'webSearch', kind: 'hot', description: 'Web search settings' },\n { prefix: 'webTools', kind: 'hot', description: 'Web tools settings' },\n \n // Extension list toggles — still require process restart to load/unload modules\n {\n prefix: 'extensions.enabled',\n kind: 'restart',\n description: 'Extension enable list (requires restart)',\n },\n {\n prefix: 'extensions.disabled',\n kind: 'restart',\n description: 'Extension disable list (requires restart)',\n },\n // Extension instance config — hot-reloaded via extension registerReload handlers\n {\n prefix: 'extensions',\n kind: 'hot',\n description: 'Extension configuration (hot-reloaded via extension handlers)',\n },\n \n // Tools - hot reload (for tool-specific settings)\n { prefix: 'tools', kind: 'hot', description: 'Tools configuration' },\n\n // MCP servers - hot reload (dispose and reconnect runtimes)\n { prefix: 'mcp', kind: 'hot', description: 'MCP server definitions and idle TTL' },\n\n // Tunnel E2E TLS — restart (local HTTPS terminator port)\n { prefix: 'tunnel', kind: 'hot', description: 'Tunnel broker and auto-start settings' },\n];\n\nfunction getChannelReloadRules(): ReloadRule[] {\n return [];\n}\n\nfunction mergedReloadRules(): ReloadRule[] {\n return [...BASE_RELOAD_RULES, ...getChannelReloadRules()];\n}\n\n/**\n * Find matching rule for a config path\n */\nexport function matchReloadRule(path: string): ReloadRule | null {\n const merged = mergedReloadRules();\n const exact = merged.find((r) => r.prefix === path);\n if (exact) return exact;\n const sorted = [...merged].sort((a, b) => b.prefix.length - a.prefix.length);\n for (const rule of sorted) {\n if (path === rule.prefix || path.startsWith(`${rule.prefix}.`)) {\n return rule;\n }\n }\n return null;\n}\n\n/**\n * Build reload plan from changed paths\n */\nexport function buildReloadPlan(changedPaths: string[]): ReloadPlan {\n const plan: ReloadPlan = {\n changedPaths,\n hotPaths: [],\n restartPaths: [],\n noopPaths: [],\n requiresRestart: false,\n requiresHotReload: false,\n };\n\n for (const path of changedPaths) {\n const rule = matchReloadRule(path);\n \n if (!rule) {\n // No rule matched - default to restart for safety\n plan.restartPaths.push(path);\n plan.requiresRestart = true;\n continue;\n }\n\n switch (rule.kind) {\n case 'hot':\n plan.hotPaths.push(path);\n plan.requiresHotReload = true;\n break;\n case 'restart':\n plan.restartPaths.push(path);\n plan.requiresRestart = true;\n break;\n case 'none':\n plan.noopPaths.push(path);\n break;\n }\n }\n\n return plan;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","names":[],"sources":["../../../src/config/rules.ts"],"sourcesContent":["/**\n * Configuration reload rules\n * \n * Defines how different config paths are handled:\n * - hot: Apply changes immediately without restart\n * - restart: Require gateway restart\n * - none: Ignore changes (no action needed)\n */\n\nexport type ReloadKind = 'hot' | 'restart' | 'none';\n\nexport interface ReloadRule {\n prefix: string;\n kind: ReloadKind;\n description?: string;\n}\n\nexport interface ReloadPlan {\n changedPaths: string[];\n hotPaths: string[];\n restartPaths: string[];\n noopPaths: string[];\n requiresRestart: boolean;\n requiresHotReload: boolean;\n}\n\n/**\n * Base reload rules for config paths\n */\nexport const BASE_RELOAD_RULES: ReloadRule[] = [\n // Models config - hot reload\n { prefix: 'models.providers', kind: 'hot', description: 'Model provider API keys, base URLs' },\n { prefix: 'models.mode', kind: 'hot', description: 'Model merge mode' },\n \n // Agent defaults - hot reload\n { prefix: 'agents.defaults.models', kind: 'hot', description: 'Model configuration' },\n { prefix: 'agents.defaults.maxTaskDurationMs', kind: 'hot', description: 'Per-turn wall-clock timeout (ms)' },\n { prefix: 'agents.defaults.maxTokens', kind: 'hot', description: 'Max tokens' },\n { prefix: 'agents.defaults.temperature', kind: 'hot', description: 'Temperature' },\n { prefix: 'agents.defaults.maxToolIterations', kind: 'hot', description: 'Max tool iterations' },\n { prefix: 'agents.defaults.compaction', kind: 'hot', description: 'Compaction settings' },\n { prefix: 'agents.defaults.pruning', kind: 'hot', description: 'Pruning settings' },\n { prefix: 'agents.defaults.webExtract', kind: 'hot', description: 'Web extract model and limits' },\n { prefix: 'agents.defaults.browser', kind: 'hot', description: 'Browser automation (Playwright) tools' },\n { prefix: 'agents.defaults.delegate', kind: 'hot', description: 'delegate_task sub-agent tool' },\n { prefix: 'agents.defaults.executeCode', kind: 'hot', description: 'execute_code sandbox tool' },\n {\n prefix: 'agents.defaults.backgroundReview',\n kind: 'hot',\n description: 'Post-turn memory/skill nudge + background review',\n },\n { prefix: 'agents.defaults.workspace', kind: 'none', description: 'Workspace path - no runtime effect' },\n \n // Gateway - restart required\n { prefix: 'gateway.bind', kind: 'restart', description: 'Gateway bind mode' },\n { prefix: 'gateway.customBindHost', kind: 'restart', description: 'Gateway custom bind host' },\n { prefix: 'gateway.port', kind: 'restart', description: 'Port number' },\n { prefix: 'gateway.mode', kind: 'restart', description: 'Gateway local/remote CLI mode' },\n { prefix: 'gateway.remote', kind: 'restart', description: 'Remote gateway CLI target' },\n { prefix: 'gateway.tailscale', kind: 'restart', description: 'Tailscale Serve/Funnel exposure' },\n { prefix: 'gateway.tls', kind: 'restart', description: 'Gateway native TLS' },\n { prefix: 'gateway.auth', kind: 'restart', description: 'Authentication settings' },\n { prefix: 'gateway.security', kind: 'restart', description: 'Gateway security policy' },\n { prefix: 'gateway.corsOrigins', kind: 'restart', description: 'CORS settings' },\n { prefix: 'gateway.trustedProxies', kind: 'restart', description: 'Trusted reverse proxy CIDRs' },\n {\n prefix: 'gateway.allowRealIpFallback',\n kind: 'restart',\n description: 'Trusted-proxy X-Real-IP fallback',\n },\n {\n prefix: 'gateway.dangerouslyAllowHostHeaderOriginFallback',\n kind: 'restart',\n description: 'Host-header origin fallback',\n },\n { prefix: 'gateway.maxSseConnections', kind: 'restart', description: 'SSE connection limit' },\n { prefix: 'gateway.channelConnectDeferMode', kind: 'restart', description: 'Channel connect defer mode' },\n { prefix: 'gateway.channelConnectDeferIds', kind: 'restart', description: 'Explicit channel connect defer list' },\n { prefix: 'gateway.channelConnectDeferSkipIds', kind: 'restart', description: 'Channel connect defer skip list' },\n { prefix: 'gateway.share', kind: 'restart', description: 'File share policy' },\n { prefix: 'gateway.siteShare', kind: 'restart', description: 'Site share policy' },\n {\n prefix: 'gateway.skillsStoreBaseUrl',\n kind: 'restart',\n description: 'Skills marketplace API base URL',\n },\n { prefix: 'gateway.enableHotReload', kind: 'hot', description: 'Hot reload toggle' },\n \n // Channels - hot reload (channel-specific prefixes are registered by channel plugins)\n { prefix: 'channels', kind: 'hot', description: 'Any channel subtree (e.g. future extensions)' },\n \n // Cron - hot reload\n { prefix: 'cron', kind: 'hot', description: 'Scheduled tasks' },\n \n // Heartbeat lives under gateway.heartbeat in config JSON (not top-level `heartbeat`)\n { prefix: 'gateway.heartbeat', kind: 'hot', description: 'Heartbeat settings' },\n \n // Web search - hot reload\n { prefix: 'webSearch', kind: 'hot', description: 'Web search settings' },\n { prefix: 'webTools', kind: 'hot', description: 'Web tools settings' },\n \n // Extension list toggles — still require process restart to load/unload modules\n {\n prefix: 'extensions.enabled',\n kind: 'restart',\n description: 'Extension enable list (requires restart)',\n },\n {\n prefix: 'extensions.disabled',\n kind: 'restart',\n description: 'Extension disable list (requires restart)',\n },\n // Extension instance config — hot-reloaded via extension registerReload handlers\n {\n prefix: 'extensions',\n kind: 'hot',\n description: 'Extension configuration (hot-reloaded via extension handlers)',\n },\n \n // Tools - hot reload (for tool-specific settings)\n { prefix: 'tools', kind: 'hot', description: 'Tools configuration' },\n\n // MCP servers - hot reload (dispose and reconnect runtimes)\n { prefix: 'mcp', kind: 'hot', description: 'MCP server definitions and idle TTL' },\n\n // Tunnel E2E TLS — restart (local HTTPS terminator port)\n { prefix: 'tunnel', kind: 'hot', description: 'Tunnel broker and auto-start settings' },\n];\n\nfunction getChannelReloadRules(): ReloadRule[] {\n return [];\n}\n\nfunction mergedReloadRules(): ReloadRule[] {\n return [...BASE_RELOAD_RULES, ...getChannelReloadRules()];\n}\n\n/**\n * Find matching rule for a config path\n */\nexport function matchReloadRule(path: string): ReloadRule | null {\n const merged = mergedReloadRules();\n const exact = merged.find((r) => r.prefix === path);\n if (exact) return exact;\n const sorted = [...merged].sort((a, b) => b.prefix.length - a.prefix.length);\n for (const rule of sorted) {\n if (path === rule.prefix || path.startsWith(`${rule.prefix}.`)) {\n return rule;\n }\n }\n return null;\n}\n\n/**\n * Build reload plan from changed paths\n */\nexport function buildReloadPlan(changedPaths: string[]): ReloadPlan {\n const plan: ReloadPlan = {\n changedPaths,\n hotPaths: [],\n restartPaths: [],\n noopPaths: [],\n requiresRestart: false,\n requiresHotReload: false,\n };\n\n for (const path of changedPaths) {\n const rule = matchReloadRule(path);\n \n if (!rule) {\n // No rule matched - default to restart for safety\n plan.restartPaths.push(path);\n plan.requiresRestart = true;\n continue;\n }\n\n switch (rule.kind) {\n case 'hot':\n plan.hotPaths.push(path);\n plan.requiresHotReload = true;\n break;\n case 'restart':\n plan.restartPaths.push(path);\n plan.requiresRestart = true;\n break;\n case 'none':\n plan.noopPaths.push(path);\n break;\n }\n }\n\n return plan;\n}\n"],"mappings":"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"}
@@ -1,4 +1,49 @@
1
1
  //#region src/connectors/builtin-catalog.ts
2
+ function remoteMcpConnector(params) {
3
+ return {
4
+ id: params.id,
5
+ version: "1.0.0",
6
+ displayName: params.displayName,
7
+ description: params.description,
8
+ category: params.category,
9
+ kind: "mcp",
10
+ source: "builtin",
11
+ capabilities: [
12
+ "tools",
13
+ "resources",
14
+ "prompts",
15
+ "auth.apiKey",
16
+ "runtime.mcp.streamableHttp"
17
+ ],
18
+ tags: params.tags,
19
+ auth: { mode: "apiKey" },
20
+ setup: {
21
+ secrets: [{
22
+ key: "AUTHORIZATION_HEADER",
23
+ label: "Authorization header value",
24
+ description: "Full Authorization header value for the remote MCP endpoint, for example \"Bearer ...\".",
25
+ required: true
26
+ }],
27
+ config: [{
28
+ key: "url",
29
+ label: "MCP endpoint URL",
30
+ type: "string",
31
+ required: true,
32
+ placeholder: "https://example.com/mcp",
33
+ description: "Streamable HTTP MCP endpoint exposed by your provider or gateway."
34
+ }]
35
+ },
36
+ runtime: {
37
+ type: "mcp",
38
+ serverId: params.id,
39
+ serverTemplate: {
40
+ url: "{{config.url}}",
41
+ transport: "streamable-http",
42
+ headers: { Authorization: "{{secrets.AUTHORIZATION_HEADER}}" }
43
+ }
44
+ }
45
+ };
46
+ }
2
47
  const BUILTIN_CONNECTORS = [
3
48
  {
4
49
  id: "fetch",
@@ -144,7 +189,141 @@ const BUILTIN_CONNECTORS = [
144
189
  env: { GITHUB_PERSONAL_ACCESS_TOKEN: "{{secrets.GITHUB_PERSONAL_ACCESS_TOKEN}}" }
145
190
  }
146
191
  }
147
- }
192
+ },
193
+ {
194
+ id: "memory",
195
+ version: "1.0.0",
196
+ displayName: "Memory",
197
+ description: "Give the agent a simple MCP knowledge graph memory store.",
198
+ category: "data",
199
+ kind: "mcp",
200
+ source: "builtin",
201
+ capabilities: [
202
+ "tools",
203
+ "resources",
204
+ "runtime.mcp.stdio",
205
+ "memory_source"
206
+ ],
207
+ tags: [
208
+ "memory",
209
+ "knowledge",
210
+ "personalization"
211
+ ],
212
+ auth: { mode: "none" },
213
+ setup: {},
214
+ runtime: {
215
+ type: "mcp",
216
+ serverId: "memory",
217
+ serverTemplate: {
218
+ command: "npx",
219
+ args: ["-y", "@modelcontextprotocol/server-memory"]
220
+ }
221
+ }
222
+ },
223
+ {
224
+ id: "sequential-thinking",
225
+ version: "1.0.0",
226
+ displayName: "Sequential Thinking",
227
+ description: "Add a structured reasoning scratchpad MCP server for multi-step tasks.",
228
+ category: "automation",
229
+ kind: "mcp",
230
+ source: "builtin",
231
+ capabilities: ["tools", "runtime.mcp.stdio"],
232
+ tags: [
233
+ "reasoning",
234
+ "planning",
235
+ "utility"
236
+ ],
237
+ auth: { mode: "none" },
238
+ setup: {},
239
+ runtime: {
240
+ type: "mcp",
241
+ serverId: "sequential-thinking",
242
+ serverTemplate: {
243
+ command: "npx",
244
+ args: ["-y", "@modelcontextprotocol/server-sequential-thinking"]
245
+ }
246
+ }
247
+ },
248
+ {
249
+ id: "brave-search",
250
+ version: "1.0.0",
251
+ displayName: "Brave Search",
252
+ description: "Search the web through the Brave Search MCP server.",
253
+ category: "docs",
254
+ kind: "mcp",
255
+ source: "builtin",
256
+ capabilities: [
257
+ "tools",
258
+ "auth.apiKey",
259
+ "runtime.mcp.stdio"
260
+ ],
261
+ tags: [
262
+ "search",
263
+ "web",
264
+ "research"
265
+ ],
266
+ auth: { mode: "apiKey" },
267
+ setup: { secrets: [{
268
+ key: "BRAVE_API_KEY",
269
+ label: "Brave API key",
270
+ description: "Stored in the xopc credential store and passed to the MCP server at runtime.",
271
+ required: true
272
+ }] },
273
+ runtime: {
274
+ type: "mcp",
275
+ serverId: "brave-search",
276
+ serverTemplate: {
277
+ command: "npx",
278
+ args: ["-y", "@modelcontextprotocol/server-brave-search"],
279
+ env: { BRAVE_API_KEY: "{{secrets.BRAVE_API_KEY}}" }
280
+ }
281
+ }
282
+ },
283
+ remoteMcpConnector({
284
+ id: "notion",
285
+ displayName: "Notion",
286
+ description: "Connect a Notion-compatible remote MCP endpoint for pages, databases, and workspace context.",
287
+ category: "docs",
288
+ tags: [
289
+ "notion",
290
+ "docs",
291
+ "workspace"
292
+ ]
293
+ }),
294
+ remoteMcpConnector({
295
+ id: "slack",
296
+ displayName: "Slack",
297
+ description: "Connect a Slack-compatible remote MCP endpoint for workspace messages and actions.",
298
+ category: "automation",
299
+ tags: [
300
+ "slack",
301
+ "messages",
302
+ "work"
303
+ ]
304
+ }),
305
+ remoteMcpConnector({
306
+ id: "linear",
307
+ displayName: "Linear",
308
+ description: "Connect a Linear-compatible remote MCP endpoint for issues, projects, and triage workflows.",
309
+ category: "code",
310
+ tags: [
311
+ "linear",
312
+ "issues",
313
+ "work"
314
+ ]
315
+ }),
316
+ remoteMcpConnector({
317
+ id: "google-drive",
318
+ displayName: "Google Drive",
319
+ description: "Connect a Google Drive-compatible remote MCP endpoint for documents and shared files.",
320
+ category: "docs",
321
+ tags: [
322
+ "google",
323
+ "drive",
324
+ "docs"
325
+ ]
326
+ })
148
327
  ];
149
328
  //#endregion
150
329
  export { BUILTIN_CONNECTORS };
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-catalog.js","names":[],"sources":["../../../src/connectors/builtin-catalog.ts"],"sourcesContent":["import type { ConnectorDefinition } from './types.js';\n\nexport const BUILTIN_CONNECTORS: readonly ConnectorDefinition[] = [\n {\n id: 'fetch',\n version: '1.0.0',\n displayName: 'Fetch',\n description: 'Fetch and read web pages through the official MCP fetch server.',\n category: 'docs',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['web', 'docs', 'http'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'fetch',\n serverTemplate: {\n command: 'uvx',\n args: ['mcp-server-fetch'],\n },\n },\n },\n {\n id: 'filesystem',\n version: '1.0.0',\n displayName: 'Filesystem',\n description: 'Read and search files from an explicitly selected local directory.',\n category: 'docs',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'resources', 'runtime.mcp.stdio'],\n tags: ['files', 'local', 'docs'],\n auth: { mode: 'none' },\n setup: {\n config: [\n {\n key: 'rootPath',\n label: 'Allowed directory',\n type: 'path',\n required: true,\n placeholder: '/Users/you/project',\n description: 'The only directory this connector can expose to the MCP runtime.',\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId: 'filesystem',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '{{config.rootPath}}'],\n },\n },\n },\n {\n id: 'time',\n version: '1.0.0',\n displayName: 'Time',\n description: 'Convert time zones and answer current-time questions through an MCP time server.',\n category: 'automation',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['time', 'timezone', 'utility'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'time',\n serverTemplate: {\n command: 'uvx',\n args: ['mcp-server-time'],\n },\n },\n },\n {\n id: 'playwright',\n version: '1.0.0',\n displayName: 'Playwright',\n description: 'Automate and inspect browser pages through the official Playwright MCP server.',\n category: 'browser',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['browser', 'automation', 'testing'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'playwright',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@playwright/mcp@latest'],\n },\n },\n },\n {\n id: 'github',\n version: '1.0.0',\n displayName: 'GitHub',\n description: 'Work with GitHub repositories, issues, pull requests, and code search.',\n category: 'code',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'auth.oauth', 'runtime.mcp.stdio'],\n tags: ['code', 'repository', 'issues'],\n auth: { mode: 'oauth' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'github',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: {\n GITHUB_PERSONAL_ACCESS_TOKEN: '{{secrets.GITHUB_PERSONAL_ACCESS_TOKEN}}',\n },\n },\n },\n },\n];\n"],"mappings":";AAEA,MAAa,qBAAqD;CAChE;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAO;GAAQ;GAAO;EAC7B,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,mBAAmB;IAC3B;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAoB;EACzD,MAAM;GAAC;GAAS;GAAS;GAAO;EAChC,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EACL,QAAQ,CACN;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,aAAa;GACd,CACF,EACF;EACD,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM;KAAC;KAAM;KAA2C;KAAsB;IAC/E;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAQ;GAAY;GAAU;EACrC,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,kBAAkB;IAC1B;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAW;GAAc;GAAU;EAC1C,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,yBAAyB;IACvC;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAc;GAAoB;EAC1D,MAAM;GAAC;GAAQ;GAAc;GAAS;EACtC,MAAM,EAAE,MAAM,SAAS;EACvB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,sCAAsC;IACnD,KAAK,EACH,8BAA8B,4CAC/B;IACF;GACF;EACF;CACF"}
1
+ {"version":3,"file":"builtin-catalog.js","names":[],"sources":["../../../src/connectors/builtin-catalog.ts"],"sourcesContent":["import type { ConnectorDefinition } from './types.js';\n\nfunction remoteMcpConnector(params: {\n id: string;\n displayName: string;\n description: string;\n category: ConnectorDefinition['category'];\n tags: string[];\n}): ConnectorDefinition {\n return {\n id: params.id,\n version: '1.0.0',\n displayName: params.displayName,\n description: params.description,\n category: params.category,\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'resources', 'prompts', 'auth.apiKey', 'runtime.mcp.streamableHttp'],\n tags: params.tags,\n auth: { mode: 'apiKey' },\n setup: {\n secrets: [\n {\n key: 'AUTHORIZATION_HEADER',\n label: 'Authorization header value',\n description: 'Full Authorization header value for the remote MCP endpoint, for example \"Bearer ...\".',\n required: true,\n },\n ],\n config: [\n {\n key: 'url',\n label: 'MCP endpoint URL',\n type: 'string',\n required: true,\n placeholder: 'https://example.com/mcp',\n description: 'Streamable HTTP MCP endpoint exposed by your provider or gateway.',\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId: params.id,\n serverTemplate: {\n url: '{{config.url}}',\n transport: 'streamable-http',\n headers: {\n Authorization: '{{secrets.AUTHORIZATION_HEADER}}',\n },\n },\n },\n };\n}\n\nexport const BUILTIN_CONNECTORS: readonly ConnectorDefinition[] = [\n {\n id: 'fetch',\n version: '1.0.0',\n displayName: 'Fetch',\n description: 'Fetch and read web pages through the official MCP fetch server.',\n category: 'docs',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['web', 'docs', 'http'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'fetch',\n serverTemplate: {\n command: 'uvx',\n args: ['mcp-server-fetch'],\n },\n },\n },\n {\n id: 'filesystem',\n version: '1.0.0',\n displayName: 'Filesystem',\n description: 'Read and search files from an explicitly selected local directory.',\n category: 'docs',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'resources', 'runtime.mcp.stdio'],\n tags: ['files', 'local', 'docs'],\n auth: { mode: 'none' },\n setup: {\n config: [\n {\n key: 'rootPath',\n label: 'Allowed directory',\n type: 'path',\n required: true,\n placeholder: '/Users/you/project',\n description: 'The only directory this connector can expose to the MCP runtime.',\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId: 'filesystem',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '{{config.rootPath}}'],\n },\n },\n },\n {\n id: 'time',\n version: '1.0.0',\n displayName: 'Time',\n description: 'Convert time zones and answer current-time questions through an MCP time server.',\n category: 'automation',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['time', 'timezone', 'utility'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'time',\n serverTemplate: {\n command: 'uvx',\n args: ['mcp-server-time'],\n },\n },\n },\n {\n id: 'playwright',\n version: '1.0.0',\n displayName: 'Playwright',\n description: 'Automate and inspect browser pages through the official Playwright MCP server.',\n category: 'browser',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['browser', 'automation', 'testing'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'playwright',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@playwright/mcp@latest'],\n },\n },\n },\n {\n id: 'github',\n version: '1.0.0',\n displayName: 'GitHub',\n description: 'Work with GitHub repositories, issues, pull requests, and code search.',\n category: 'code',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'auth.oauth', 'runtime.mcp.stdio'],\n tags: ['code', 'repository', 'issues'],\n auth: { mode: 'oauth' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'github',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: {\n GITHUB_PERSONAL_ACCESS_TOKEN: '{{secrets.GITHUB_PERSONAL_ACCESS_TOKEN}}',\n },\n },\n },\n },\n {\n id: 'memory',\n version: '1.0.0',\n displayName: 'Memory',\n description: 'Give the agent a simple MCP knowledge graph memory store.',\n category: 'data',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'resources', 'runtime.mcp.stdio', 'memory_source'],\n tags: ['memory', 'knowledge', 'personalization'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'memory',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-memory'],\n },\n },\n },\n {\n id: 'sequential-thinking',\n version: '1.0.0',\n displayName: 'Sequential Thinking',\n description: 'Add a structured reasoning scratchpad MCP server for multi-step tasks.',\n category: 'automation',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'runtime.mcp.stdio'],\n tags: ['reasoning', 'planning', 'utility'],\n auth: { mode: 'none' },\n setup: {},\n runtime: {\n type: 'mcp',\n serverId: 'sequential-thinking',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-sequential-thinking'],\n },\n },\n },\n {\n id: 'brave-search',\n version: '1.0.0',\n displayName: 'Brave Search',\n description: 'Search the web through the Brave Search MCP server.',\n category: 'docs',\n kind: 'mcp',\n source: 'builtin',\n capabilities: ['tools', 'auth.apiKey', 'runtime.mcp.stdio'],\n tags: ['search', 'web', 'research'],\n auth: { mode: 'apiKey' },\n setup: {\n secrets: [\n {\n key: 'BRAVE_API_KEY',\n label: 'Brave API key',\n description: 'Stored in the xopc credential store and passed to the MCP server at runtime.',\n required: true,\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId: 'brave-search',\n serverTemplate: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-brave-search'],\n env: {\n BRAVE_API_KEY: '{{secrets.BRAVE_API_KEY}}',\n },\n },\n },\n },\n remoteMcpConnector({\n id: 'notion',\n displayName: 'Notion',\n description: 'Connect a Notion-compatible remote MCP endpoint for pages, databases, and workspace context.',\n category: 'docs',\n tags: ['notion', 'docs', 'workspace'],\n }),\n remoteMcpConnector({\n id: 'slack',\n displayName: 'Slack',\n description: 'Connect a Slack-compatible remote MCP endpoint for workspace messages and actions.',\n category: 'automation',\n tags: ['slack', 'messages', 'work'],\n }),\n remoteMcpConnector({\n id: 'linear',\n displayName: 'Linear',\n description: 'Connect a Linear-compatible remote MCP endpoint for issues, projects, and triage workflows.',\n category: 'code',\n tags: ['linear', 'issues', 'work'],\n }),\n remoteMcpConnector({\n id: 'google-drive',\n displayName: 'Google Drive',\n description: 'Connect a Google Drive-compatible remote MCP endpoint for documents and shared files.',\n category: 'docs',\n tags: ['google', 'drive', 'docs'],\n }),\n];\n"],"mappings":";AAEA,SAAS,mBAAmB,QAMJ;AACtB,QAAO;EACL,IAAI,OAAO;EACX,SAAS;EACT,aAAa,OAAO;EACpB,aAAa,OAAO;EACpB,UAAU,OAAO;EACjB,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAW;GAAe;GAA6B;EAC5F,MAAM,OAAO;EACb,MAAM,EAAE,MAAM,UAAU;EACxB,OAAO;GACL,SAAS,CACP;IACE,KAAK;IACL,OAAO;IACP,aAAa;IACb,UAAU;IACX,CACF;GACD,QAAQ,CACN;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,UAAU;IACV,aAAa;IACb,aAAa;IACd,CACF;GACF;EACD,SAAS;GACP,MAAM;GACN,UAAU,OAAO;GACjB,gBAAgB;IACd,KAAK;IACL,WAAW;IACX,SAAS,EACP,eAAe,oCAChB;IACF;GACF;EACF;;AAGH,MAAa,qBAAqD;CAChE;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAO;GAAQ;GAAO;EAC7B,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,mBAAmB;IAC3B;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAoB;EACzD,MAAM;GAAC;GAAS;GAAS;GAAO;EAChC,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EACL,QAAQ,CACN;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,aAAa;GACd,CACF,EACF;EACD,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM;KAAC;KAAM;KAA2C;KAAsB;IAC/E;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAQ;GAAY;GAAU;EACrC,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,kBAAkB;IAC1B;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAW;GAAc;GAAU;EAC1C,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,yBAAyB;IACvC;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAc;GAAoB;EAC1D,MAAM;GAAC;GAAQ;GAAc;GAAS;EACtC,MAAM,EAAE,MAAM,SAAS;EACvB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,sCAAsC;IACnD,KAAK,EACH,8BAA8B,4CAC/B;IACF;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAqB;GAAgB;EAC1E,MAAM;GAAC;GAAU;GAAa;GAAkB;EAChD,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,sCAAsC;IACpD;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc,CAAC,SAAS,oBAAoB;EAC5C,MAAM;GAAC;GAAa;GAAY;GAAU;EAC1C,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,EAAE;EACT,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,mDAAmD;IACjE;GACF;EACF;CACD;EACE,IAAI;EACJ,SAAS;EACT,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAe;GAAoB;EAC3D,MAAM;GAAC;GAAU;GAAO;GAAW;EACnC,MAAM,EAAE,MAAM,UAAU;EACxB,OAAO,EACL,SAAS,CACP;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,UAAU;GACX,CACF,EACF;EACD,SAAS;GACP,MAAM;GACN,UAAU;GACV,gBAAgB;IACd,SAAS;IACT,MAAM,CAAC,MAAM,4CAA4C;IACzD,KAAK,EACH,eAAe,6BAChB;IACF;GACF;EACF;CACD,mBAAmB;EACjB,IAAI;EACJ,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;GAAC;GAAU;GAAQ;GAAY;EACtC,CAAC;CACF,mBAAmB;EACjB,IAAI;EACJ,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;GAAC;GAAS;GAAY;GAAO;EACpC,CAAC;CACF,mBAAmB;EACjB,IAAI;EACJ,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;GAAC;GAAU;GAAU;GAAO;EACnC,CAAC;CACF,mBAAmB;EACjB,IAAI;EACJ,aAAa;EACb,aAAa;EACb,UAAU;EACV,MAAM;GAAC;GAAU;GAAS;GAAO;EAClC,CAAC;CACH"}
@@ -1,4 +1,4 @@
1
- import { createBundleMcpToolRuntime, mapBundleMcpToolsForGateway } from "../agent/mcp/bundle-mcp-materialize.js";
1
+ import { listBundleMcpServerCapabilitiesForGateway } from "../agent/mcp/bundle-mcp-materialize.js";
2
2
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
3
3
  import { getConnectorInstance } from "./instances.js";
4
4
  //#region src/connectors/health.ts
@@ -22,23 +22,30 @@ async function testConnectorInstance(config, serverId) {
22
22
  ok: false,
23
23
  status: "server_not_found",
24
24
  toolCount: 0,
25
+ resourceCount: 0,
26
+ promptCount: 0,
25
27
  tools: [],
28
+ resources: [],
29
+ prompts: [],
26
30
  error: `Connector instance not found: ${serverId}`
27
31
  };
28
32
  const workspaceDir = getWorkspacePath(config) || "./workspace";
29
- let runtime;
30
33
  try {
31
- runtime = await createBundleMcpToolRuntime({
34
+ const capabilities = await listBundleMcpServerCapabilitiesForGateway({
32
35
  workspaceDir,
33
- cfg: config
36
+ cfg: config,
37
+ serverId
34
38
  });
35
- const tools = mapBundleMcpToolsForGateway(runtime.tools, serverId);
36
39
  return {
37
40
  serverId,
38
41
  ok: true,
39
42
  status: "ok",
40
- toolCount: tools.length,
41
- tools
43
+ toolCount: capabilities.toolCount,
44
+ resourceCount: capabilities.resourceCount,
45
+ promptCount: capabilities.promptCount,
46
+ tools: capabilities.tools,
47
+ resources: capabilities.resources,
48
+ prompts: capabilities.prompts
42
49
  };
43
50
  } catch (error) {
44
51
  const status = classifyConnectorHealthError(error);
@@ -47,12 +54,14 @@ async function testConnectorInstance(config, serverId) {
47
54
  ok: false,
48
55
  status,
49
56
  toolCount: 0,
57
+ resourceCount: 0,
58
+ promptCount: 0,
50
59
  tools: [],
60
+ resources: [],
61
+ prompts: [],
51
62
  error: error instanceof Error ? error.message : String(error),
52
63
  action: healthActionForStatus(status)
53
64
  };
54
- } finally {
55
- await runtime?.dispose();
56
65
  }
57
66
  }
58
67
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","names":[],"sources":["../../../src/connectors/health.ts"],"sourcesContent":["import { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport {\n createBundleMcpToolRuntime,\n mapBundleMcpToolsForGateway,\n} from '../agent/mcp/bundle-mcp-materialize.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorInstance } from './instances.js';\nimport type { ConnectorHealthResult, ConnectorHealthStatus } from './types.js';\n\nfunction classifyConnectorHealthError(error: unknown): ConnectorHealthStatus {\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return 'timeout';\n }\n if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) {\n return 'network_failed';\n }\n if (/missing|required|credential|api key|token/i.test(message)) {\n return 'missing_secret';\n }\n if (/tools|listTools/i.test(message)) {\n return 'tools_list_failed';\n }\n if (/spawn|command|start|connect/i.test(message)) {\n return 'startup_failed';\n }\n return 'unknown_error';\n}\n\nfunction healthActionForStatus(status: ConnectorHealthStatus): string | undefined {\n if (status === 'missing_secret') {\n return 'Reconnect the connector and provide the required secret.';\n }\n if (status === 'timeout' || status === 'network_failed') {\n return 'Check network access and retry the connector health check.';\n }\n if (status === 'startup_failed') {\n return 'Verify the connector runtime dependency is installed and reachable.';\n }\n return undefined;\n}\n\nexport async function testConnectorInstance(config: Config, serverId: string): Promise<ConnectorHealthResult> {\n const instance = getConnectorInstance(config, serverId);\n if (!instance) {\n return {\n serverId,\n ok: false,\n status: 'server_not_found',\n toolCount: 0,\n tools: [],\n error: `Connector instance not found: ${serverId}`,\n };\n }\n\n const workspaceDir = getWorkspacePath(config) || './workspace';\n let runtime: Awaited<ReturnType<typeof createBundleMcpToolRuntime>> | undefined;\n try {\n runtime = await createBundleMcpToolRuntime({\n workspaceDir,\n cfg: config,\n });\n const tools = mapBundleMcpToolsForGateway(runtime.tools, serverId);\n return {\n serverId,\n ok: true,\n status: 'ok',\n toolCount: tools.length,\n tools,\n };\n } catch (error) {\n const status = classifyConnectorHealthError(error);\n return {\n serverId,\n ok: false,\n status,\n toolCount: 0,\n tools: [],\n error: error instanceof Error ? error.message : String(error),\n action: healthActionForStatus(status),\n };\n } finally {\n await runtime?.dispose();\n }\n}\n"],"mappings":";;;;AASA,SAAS,6BAA6B,OAAuC;CAC3E,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,KAAI,qBAAqB,KAAK,QAAQ,CACpC,QAAO;AAET,KAAI,wCAAwC,KAAK,QAAQ,CACvD,QAAO;AAET,KAAI,6CAA6C,KAAK,QAAQ,CAC5D,QAAO;AAET,KAAI,mBAAmB,KAAK,QAAQ,CAClC,QAAO;AAET,KAAI,+BAA+B,KAAK,QAAQ,CAC9C,QAAO;AAET,QAAO;;AAGT,SAAS,sBAAsB,QAAmD;AAChF,KAAI,WAAW,iBACb,QAAO;AAET,KAAI,WAAW,aAAa,WAAW,iBACrC,QAAO;AAET,KAAI,WAAW,iBACb,QAAO;;AAKX,eAAsB,sBAAsB,QAAgB,UAAkD;AAE5G,KAAI,CADa,qBAAqB,QAAQ,SACjC,CACX,QAAO;EACL;EACA,IAAI;EACJ,QAAQ;EACR,WAAW;EACX,OAAO,EAAE;EACT,OAAO,iCAAiC;EACzC;CAGH,MAAM,eAAe,iBAAiB,OAAO,IAAI;CACjD,IAAI;AACJ,KAAI;AACF,YAAU,MAAM,2BAA2B;GACzC;GACA,KAAK;GACN,CAAC;EACF,MAAM,QAAQ,4BAA4B,QAAQ,OAAO,SAAS;AAClE,SAAO;GACL;GACA,IAAI;GACJ,QAAQ;GACR,WAAW,MAAM;GACjB;GACD;UACM,OAAO;EACd,MAAM,SAAS,6BAA6B,MAAM;AAClD,SAAO;GACL;GACA,IAAI;GACJ;GACA,WAAW;GACX,OAAO,EAAE;GACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC7D,QAAQ,sBAAsB,OAAO;GACtC;WACO;AACR,QAAM,SAAS,SAAS"}
1
+ {"version":3,"file":"health.js","names":[],"sources":["../../../src/connectors/health.ts"],"sourcesContent":["import { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport {\n listBundleMcpServerCapabilitiesForGateway,\n} from '../agent/mcp/bundle-mcp-materialize.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorInstance } from './instances.js';\nimport type { ConnectorHealthResult, ConnectorHealthStatus } from './types.js';\n\nfunction classifyConnectorHealthError(error: unknown): ConnectorHealthStatus {\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return 'timeout';\n }\n if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) {\n return 'network_failed';\n }\n if (/missing|required|credential|api key|token/i.test(message)) {\n return 'missing_secret';\n }\n if (/tools|listTools/i.test(message)) {\n return 'tools_list_failed';\n }\n if (/spawn|command|start|connect/i.test(message)) {\n return 'startup_failed';\n }\n return 'unknown_error';\n}\n\nfunction healthActionForStatus(status: ConnectorHealthStatus): string | undefined {\n if (status === 'missing_secret') {\n return 'Reconnect the connector and provide the required secret.';\n }\n if (status === 'timeout' || status === 'network_failed') {\n return 'Check network access and retry the connector health check.';\n }\n if (status === 'startup_failed') {\n return 'Verify the connector runtime dependency is installed and reachable.';\n }\n return undefined;\n}\n\nexport async function testConnectorInstance(config: Config, serverId: string): Promise<ConnectorHealthResult> {\n const instance = getConnectorInstance(config, serverId);\n if (!instance) {\n return {\n serverId,\n ok: false,\n status: 'server_not_found',\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: `Connector instance not found: ${serverId}`,\n };\n }\n\n const workspaceDir = getWorkspacePath(config) || './workspace';\n try {\n const capabilities = await listBundleMcpServerCapabilitiesForGateway({\n workspaceDir,\n cfg: config,\n serverId,\n });\n return {\n serverId,\n ok: true,\n status: 'ok',\n toolCount: capabilities.toolCount,\n resourceCount: capabilities.resourceCount,\n promptCount: capabilities.promptCount,\n tools: capabilities.tools,\n resources: capabilities.resources,\n prompts: capabilities.prompts,\n };\n } catch (error) {\n const status = classifyConnectorHealthError(error);\n return {\n serverId,\n ok: false,\n status,\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: error instanceof Error ? error.message : String(error),\n action: healthActionForStatus(status),\n };\n }\n}\n"],"mappings":";;;;AAQA,SAAS,6BAA6B,OAAuC;CAC3E,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,KAAI,qBAAqB,KAAK,QAAQ,CACpC,QAAO;AAET,KAAI,wCAAwC,KAAK,QAAQ,CACvD,QAAO;AAET,KAAI,6CAA6C,KAAK,QAAQ,CAC5D,QAAO;AAET,KAAI,mBAAmB,KAAK,QAAQ,CAClC,QAAO;AAET,KAAI,+BAA+B,KAAK,QAAQ,CAC9C,QAAO;AAET,QAAO;;AAGT,SAAS,sBAAsB,QAAmD;AAChF,KAAI,WAAW,iBACb,QAAO;AAET,KAAI,WAAW,aAAa,WAAW,iBACrC,QAAO;AAET,KAAI,WAAW,iBACb,QAAO;;AAKX,eAAsB,sBAAsB,QAAgB,UAAkD;AAE5G,KAAI,CADa,qBAAqB,QAAQ,SACjC,CACX,QAAO;EACL;EACA,IAAI;EACJ,QAAQ;EACR,WAAW;EACX,eAAe;EACf,aAAa;EACb,OAAO,EAAE;EACT,WAAW,EAAE;EACb,SAAS,EAAE;EACX,OAAO,iCAAiC;EACzC;CAGH,MAAM,eAAe,iBAAiB,OAAO,IAAI;AACjD,KAAI;EACF,MAAM,eAAe,MAAM,0CAA0C;GACnE;GACA,KAAK;GACL;GACD,CAAC;AACF,SAAO;GACL;GACA,IAAI;GACJ,QAAQ;GACR,WAAW,aAAa;GACxB,eAAe,aAAa;GAC5B,aAAa,aAAa;GAC1B,OAAO,aAAa;GACpB,WAAW,aAAa;GACxB,SAAS,aAAa;GACvB;UACM,OAAO;EACd,MAAM,SAAS,6BAA6B,MAAM;AAClD,SAAO;GACL;GACA,IAAI;GACJ;GACA,WAAW;GACX,eAAe;GACf,aAAa;GACb,OAAO,EAAE;GACT,WAAW,EAAE;GACb,SAAS,EAAE;GACX,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC7D,QAAQ,sBAAsB,OAAO;GACtC"}
@@ -55,6 +55,8 @@ export type ConnectorUsageRecord = {
55
55
  lastHealthCheckAt?: string;
56
56
  lastHealthStatus?: ConnectorHealthStatus;
57
57
  lastToolCount?: number;
58
+ lastResourceCount?: number;
59
+ lastPromptCount?: number;
58
60
  };
59
61
  export type ConnectorAuditRecord = {
60
62
  at: string;
@@ -62,6 +64,8 @@ export type ConnectorAuditRecord = {
62
64
  status?: ConnectorHealthStatus;
63
65
  ok?: boolean;
64
66
  toolCount?: number;
67
+ resourceCount?: number;
68
+ promptCount?: number;
65
69
  };
66
70
  export type ConnectorInstance = {
67
71
  instanceId: string;
@@ -83,11 +87,26 @@ export type ConnectorHealthResult = {
83
87
  ok: boolean;
84
88
  status: ConnectorHealthStatus;
85
89
  toolCount: number;
90
+ resourceCount: number;
91
+ promptCount: number;
86
92
  tools: Array<{
87
93
  name: string;
88
94
  shortName?: string;
89
95
  description?: string;
90
96
  }>;
97
+ resources: Array<{
98
+ uri: string;
99
+ name: string;
100
+ title?: string;
101
+ description?: string;
102
+ mimeType?: string;
103
+ }>;
104
+ prompts: Array<{
105
+ name: string;
106
+ title?: string;
107
+ description?: string;
108
+ argumentCount: number;
109
+ }>;
91
110
  error?: string;
92
111
  action?: string;
93
112
  };
@@ -14,7 +14,9 @@ function getConnectorUsageFromMarker(marker) {
14
14
  return {
15
15
  lastHealthCheckAt: typeof record.lastHealthCheckAt === "string" ? record.lastHealthCheckAt : void 0,
16
16
  lastHealthStatus: typeof record.lastHealthStatus === "string" ? record.lastHealthStatus : void 0,
17
- lastToolCount: typeof record.lastToolCount === "number" ? record.lastToolCount : void 0
17
+ lastToolCount: typeof record.lastToolCount === "number" ? record.lastToolCount : void 0,
18
+ lastResourceCount: typeof record.lastResourceCount === "number" ? record.lastResourceCount : void 0,
19
+ lastPromptCount: typeof record.lastPromptCount === "number" ? record.lastPromptCount : void 0
18
20
  };
19
21
  }
20
22
  function getConnectorAuditFromMarker(marker) {
@@ -30,7 +32,9 @@ function getConnectorAuditFromMarker(marker) {
30
32
  action: record.action,
31
33
  status: typeof record.status === "string" ? record.status : void 0,
32
34
  ok: typeof record.ok === "boolean" ? record.ok : void 0,
33
- toolCount: typeof record.toolCount === "number" ? record.toolCount : void 0
35
+ toolCount: typeof record.toolCount === "number" ? record.toolCount : void 0,
36
+ resourceCount: typeof record.resourceCount === "number" ? record.resourceCount : void 0,
37
+ promptCount: typeof record.promptCount === "number" ? record.promptCount : void 0
34
38
  }];
35
39
  });
36
40
  }
@@ -48,13 +52,17 @@ function recordConnectorHealthUsage(config, instanceId, result) {
48
52
  marker.usage = {
49
53
  lastHealthCheckAt: (/* @__PURE__ */ new Date()).toISOString(),
50
54
  lastHealthStatus: result.status,
51
- lastToolCount: result.toolCount
55
+ lastToolCount: result.toolCount,
56
+ lastResourceCount: result.resourceCount,
57
+ lastPromptCount: result.promptCount
52
58
  };
53
59
  appendConnectorAuditRecord(config, instanceId, {
54
60
  action: "health_check",
55
61
  status: result.status,
56
62
  ok: result.ok,
57
- toolCount: result.toolCount
63
+ toolCount: result.toolCount,
64
+ resourceCount: result.resourceCount,
65
+ promptCount: result.promptCount
58
66
  });
59
67
  }
60
68
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","names":[],"sources":["../../../src/connectors/usage.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport type { ConnectorAuditRecord, ConnectorHealthResult, ConnectorUsageRecord } from './types.js';\n\nconst MAX_AUDIT_RECORDS = 50;\n\nfunction getManagedConnectorMarker(config: Config, instanceId: string): Record<string, unknown> | undefined {\n const server = config.mcp?.servers?.[instanceId];\n if (!isManagedConnectorServer(server)) {\n return undefined;\n }\n return server.xopcConnector as Record<string, unknown>;\n}\n\nexport function getConnectorUsageFromMarker(marker: unknown): ConnectorUsageRecord {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return {};\n }\n const usage = (marker as Record<string, unknown>).usage;\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) {\n return {};\n }\n const record = usage as Record<string, unknown>;\n return {\n lastHealthCheckAt: typeof record.lastHealthCheckAt === 'string' ? record.lastHealthCheckAt : undefined,\n lastHealthStatus: typeof record.lastHealthStatus === 'string' ? record.lastHealthStatus as ConnectorUsageRecord['lastHealthStatus'] : undefined,\n lastToolCount: typeof record.lastToolCount === 'number' ? record.lastToolCount : undefined,\n };\n}\n\nexport function getConnectorAuditFromMarker(marker: unknown): ConnectorAuditRecord[] {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return [];\n }\n const audit = (marker as Record<string, unknown>).audit;\n if (!Array.isArray(audit)) {\n return [];\n }\n return audit.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {\n return [];\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.at !== 'string' || typeof record.action !== 'string') {\n return [];\n }\n return [{\n at: record.at,\n action: record.action as ConnectorAuditRecord['action'],\n status: typeof record.status === 'string' ? record.status as ConnectorAuditRecord['status'] : undefined,\n ok: typeof record.ok === 'boolean' ? record.ok : undefined,\n toolCount: typeof record.toolCount === 'number' ? record.toolCount : undefined,\n }];\n });\n}\n\nexport function appendConnectorAuditRecord(\n config: Config,\n instanceId: string,\n record: Omit<ConnectorAuditRecord, 'at'>,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n const existing = Array.isArray(marker.audit) ? marker.audit : [];\n marker.audit = [\n ...existing.slice(-MAX_AUDIT_RECORDS + 1),\n { ...record, at: new Date().toISOString() },\n ];\n}\n\nexport function recordConnectorHealthUsage(\n config: Config,\n instanceId: string,\n result: ConnectorHealthResult,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n marker.usage = {\n lastHealthCheckAt: new Date().toISOString(),\n lastHealthStatus: result.status,\n lastToolCount: result.toolCount,\n } satisfies ConnectorUsageRecord;\n appendConnectorAuditRecord(config, instanceId, {\n action: 'health_check',\n status: result.status,\n ok: result.ok,\n toolCount: result.toolCount,\n });\n}\n"],"mappings":";;AAIA,MAAM,oBAAoB;AAE1B,SAAS,0BAA0B,QAAgB,YAAyD;CAC1G,MAAM,SAAS,OAAO,KAAK,UAAU;AACrC,KAAI,CAAC,yBAAyB,OAAO,CACnC;AAEF,QAAO,OAAO;;AAGhB,SAAgB,4BAA4B,QAAuC;AACjF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;CAEX,MAAM,SAAS;AACf,QAAO;EACL,mBAAmB,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;EAC7F,kBAAkB,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAA+D,KAAA;EACtI,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;EAClF;;AAGH,SAAgB,4BAA4B,QAAyC;AACnF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;AAEX,QAAO,MAAM,SAAS,UAAU;AAC9B,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;EAEX,MAAM,SAAS;AACf,MAAI,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,WAAW,SAC5D,QAAO,EAAE;AAEX,SAAO,CAAC;GACN,IAAI,OAAO;GACX,QAAQ,OAAO;GACf,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAA2C,KAAA;GAC9F,IAAI,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,KAAA;GACjD,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;GACtE,CAAC;GACF;;AAGJ,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;AAGF,QAAO,QAAQ,CACb,IAFe,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO,QAAQ,EAAE,EAElD,MAAM,CAAC,oBAAoB,EAAE,EACzC;EAAE,GAAG;EAAQ,qBAAI,IAAI,MAAM,EAAC,aAAa;EAAE,CAC5C;;AAGH,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;AAEF,QAAO,QAAQ;EACb,oCAAmB,IAAI,MAAM,EAAC,aAAa;EAC3C,kBAAkB,OAAO;EACzB,eAAe,OAAO;EACvB;AACD,4BAA2B,QAAQ,YAAY;EAC7C,QAAQ;EACR,QAAQ,OAAO;EACf,IAAI,OAAO;EACX,WAAW,OAAO;EACnB,CAAC"}
1
+ {"version":3,"file":"usage.js","names":[],"sources":["../../../src/connectors/usage.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport type { ConnectorAuditRecord, ConnectorHealthResult, ConnectorUsageRecord } from './types.js';\n\nconst MAX_AUDIT_RECORDS = 50;\n\nfunction getManagedConnectorMarker(config: Config, instanceId: string): Record<string, unknown> | undefined {\n const server = config.mcp?.servers?.[instanceId];\n if (!isManagedConnectorServer(server)) {\n return undefined;\n }\n return server.xopcConnector as Record<string, unknown>;\n}\n\nexport function getConnectorUsageFromMarker(marker: unknown): ConnectorUsageRecord {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return {};\n }\n const usage = (marker as Record<string, unknown>).usage;\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) {\n return {};\n }\n const record = usage as Record<string, unknown>;\n return {\n lastHealthCheckAt: typeof record.lastHealthCheckAt === 'string' ? record.lastHealthCheckAt : undefined,\n lastHealthStatus: typeof record.lastHealthStatus === 'string' ? record.lastHealthStatus as ConnectorUsageRecord['lastHealthStatus'] : undefined,\n lastToolCount: typeof record.lastToolCount === 'number' ? record.lastToolCount : undefined,\n lastResourceCount: typeof record.lastResourceCount === 'number' ? record.lastResourceCount : undefined,\n lastPromptCount: typeof record.lastPromptCount === 'number' ? record.lastPromptCount : undefined,\n };\n}\n\nexport function getConnectorAuditFromMarker(marker: unknown): ConnectorAuditRecord[] {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return [];\n }\n const audit = (marker as Record<string, unknown>).audit;\n if (!Array.isArray(audit)) {\n return [];\n }\n return audit.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {\n return [];\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.at !== 'string' || typeof record.action !== 'string') {\n return [];\n }\n return [{\n at: record.at,\n action: record.action as ConnectorAuditRecord['action'],\n status: typeof record.status === 'string' ? record.status as ConnectorAuditRecord['status'] : undefined,\n ok: typeof record.ok === 'boolean' ? record.ok : undefined,\n toolCount: typeof record.toolCount === 'number' ? record.toolCount : undefined,\n resourceCount: typeof record.resourceCount === 'number' ? record.resourceCount : undefined,\n promptCount: typeof record.promptCount === 'number' ? record.promptCount : undefined,\n }];\n });\n}\n\nexport function appendConnectorAuditRecord(\n config: Config,\n instanceId: string,\n record: Omit<ConnectorAuditRecord, 'at'>,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n const existing = Array.isArray(marker.audit) ? marker.audit : [];\n marker.audit = [\n ...existing.slice(-MAX_AUDIT_RECORDS + 1),\n { ...record, at: new Date().toISOString() },\n ];\n}\n\nexport function recordConnectorHealthUsage(\n config: Config,\n instanceId: string,\n result: ConnectorHealthResult,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n marker.usage = {\n lastHealthCheckAt: new Date().toISOString(),\n lastHealthStatus: result.status,\n lastToolCount: result.toolCount,\n lastResourceCount: result.resourceCount,\n lastPromptCount: result.promptCount,\n } satisfies ConnectorUsageRecord;\n appendConnectorAuditRecord(config, instanceId, {\n action: 'health_check',\n status: result.status,\n ok: result.ok,\n toolCount: result.toolCount,\n resourceCount: result.resourceCount,\n promptCount: result.promptCount,\n });\n}\n"],"mappings":";;AAIA,MAAM,oBAAoB;AAE1B,SAAS,0BAA0B,QAAgB,YAAyD;CAC1G,MAAM,SAAS,OAAO,KAAK,UAAU;AACrC,KAAI,CAAC,yBAAyB,OAAO,CACnC;AAEF,QAAO,OAAO;;AAGhB,SAAgB,4BAA4B,QAAuC;AACjF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;CAEX,MAAM,SAAS;AACf,QAAO;EACL,mBAAmB,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;EAC7F,kBAAkB,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAA+D,KAAA;EACtI,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;EACjF,mBAAmB,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;EAC7F,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB,KAAA;EACxF;;AAGH,SAAgB,4BAA4B,QAAyC;AACnF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;AAEX,QAAO,MAAM,SAAS,UAAU;AAC9B,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;EAEX,MAAM,SAAS;AACf,MAAI,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,WAAW,SAC5D,QAAO,EAAE;AAEX,SAAO,CAAC;GACN,IAAI,OAAO;GACX,QAAQ,OAAO;GACf,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAA2C,KAAA;GAC9F,IAAI,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,KAAA;GACjD,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;GACrE,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;GACjF,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc,KAAA;GAC5E,CAAC;GACF;;AAGJ,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;AAGF,QAAO,QAAQ,CACb,IAFe,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO,QAAQ,EAAE,EAElD,MAAM,CAAC,oBAAoB,EAAE,EACzC;EAAE,GAAG;EAAQ,qBAAI,IAAI,MAAM,EAAC,aAAa;EAAE,CAC5C;;AAGH,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;AAEF,QAAO,QAAQ;EACb,oCAAmB,IAAI,MAAM,EAAC,aAAa;EAC3C,kBAAkB,OAAO;EACzB,eAAe,OAAO;EACtB,mBAAmB,OAAO;EAC1B,iBAAiB,OAAO;EACzB;AACD,4BAA2B,QAAQ,YAAY;EAC7C,QAAQ;EACR,QAAQ,OAAO;EACf,IAAI,OAAO;EACX,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,aAAa,OAAO;EACrB,CAAC"}