@xopcai/xopc 0.0.115 → 0.0.117

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 (578) hide show
  1. package/README.md +26 -10
  2. package/README.zh-CN.md +26 -10
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.d.ts +6 -0
  5. package/dist/extensions/demo-memory/src/index.js +132 -0
  6. package/dist/extensions/demo-memory/src/index.js.map +1 -0
  7. package/dist/extensions/demo-memory/xopc.extension.json +15 -0
  8. package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
  9. package/dist/extensions/telegram/src/command-handler.js +1 -2
  10. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  11. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  14. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
  15. package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
  16. package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
  17. package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
  21. package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
  22. package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
  23. package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
  24. package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
  25. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
  26. package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
  28. package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
  29. package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
  30. package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
  31. package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
  34. package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
  35. package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
  36. package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
  37. package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
  39. package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
  40. package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
  41. package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
  42. package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
  43. package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
  44. package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
  45. package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
  46. package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
  47. package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
  49. package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
  50. package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
  52. package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
  53. package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
  54. package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
  55. package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
  56. package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
  58. package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
  59. package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
  61. package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
  62. package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
  63. package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
  64. package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
  67. package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
  68. package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
  69. package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
  70. package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
  71. package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
  72. package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
  73. package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
  74. package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
  75. package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
  76. package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
  77. package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
  78. package/dist/gateway/static/root/index.html +5 -5
  79. package/dist/package.js +1 -1
  80. package/dist/src/agent/agent-manager.d.ts +1 -1
  81. package/dist/src/agent/agent-manager.js +7 -8
  82. package/dist/src/agent/agent-manager.js.map +1 -1
  83. package/dist/src/agent/agent-scope.js +6 -8
  84. package/dist/src/agent/agent-scope.js.map +1 -1
  85. package/dist/src/agent/background-review/coordinator.js +0 -1
  86. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  87. package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
  88. package/dist/src/agent/background-review/run-background-review.js +2 -4
  89. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  90. package/dist/src/agent/background-review/settings.js +8 -7
  91. package/dist/src/agent/background-review/settings.js.map +1 -1
  92. package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
  93. package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
  94. package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
  95. package/dist/src/agent/context/workspace-seed.js +1 -1
  96. package/dist/src/agent/embedded/run-for-session.js +1 -1
  97. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  98. package/dist/src/agent/fallback/candidates.js +6 -3
  99. package/dist/src/agent/fallback/candidates.js.map +1 -1
  100. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  101. package/dist/src/agent/goals/checklist-judge.js +1 -1
  102. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  103. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
  104. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  105. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  106. package/dist/src/agent/goals/post-turn.js +8 -1
  107. package/dist/src/agent/goals/post-turn.js.map +1 -1
  108. package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
  109. package/dist/src/agent/image/generation/runtime.js +1 -1
  110. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  111. package/dist/src/agent/image/image-helpers.d.ts +1 -1
  112. package/dist/src/agent/image/image-helpers.js +4 -17
  113. package/dist/src/agent/image/image-helpers.js.map +1 -1
  114. package/dist/src/agent/image/image-model-fallback.js +1 -1
  115. package/dist/src/agent/image/image-model-fallback.js.map +1 -1
  116. package/dist/src/agent/image/inbound-image-handling.js +1 -1
  117. package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
  118. package/dist/src/agent/image/tool-model-config.d.ts +1 -1
  119. package/dist/src/agent/image/tool-model-config.js +2 -2
  120. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  121. package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
  122. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  123. package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
  124. package/dist/src/agent/image/understanding/provider-registry.js +16 -2
  125. package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
  126. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
  127. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
  128. package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
  129. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  130. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
  132. package/dist/src/agent/memory/builtin-memory-store.js +4 -0
  133. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  134. package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
  135. package/dist/src/agent/memory/builtin-provider.js +261 -11
  136. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  137. package/dist/src/agent/memory/context-assembler.d.ts +10 -0
  138. package/dist/src/agent/memory/context-assembler.js +26 -0
  139. package/dist/src/agent/memory/context-assembler.js.map +1 -0
  140. package/dist/src/agent/memory/create-memory-manager.js +25 -7
  141. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  142. package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
  143. package/dist/src/agent/memory/dreaming/config.js +8 -8
  144. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  145. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
  146. package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
  147. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  148. package/dist/src/agent/memory/index.d.ts +1 -0
  149. package/dist/src/agent/memory/index.js +4 -3
  150. package/dist/src/agent/memory/inject-prefetch.js +6 -2
  151. package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
  152. package/dist/src/agent/memory/manager.d.ts +37 -1
  153. package/dist/src/agent/memory/manager.js +332 -40
  154. package/dist/src/agent/memory/manager.js.map +1 -1
  155. package/dist/src/agent/memory/memory-config.js +12 -15
  156. package/dist/src/agent/memory/memory-config.js.map +1 -1
  157. package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
  158. package/dist/src/agent/memory/plugin-discovery.js +97 -31
  159. package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
  160. package/dist/src/agent/memory/provider.d.ts +20 -15
  161. package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
  162. package/dist/src/agent/memory/stub-memory-provider.js +20 -3
  163. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  164. package/dist/src/agent/memory/types.d.ts +136 -0
  165. package/dist/src/agent/models/manager.d.ts +1 -1
  166. package/dist/src/agent/models/manager.js +1 -1
  167. package/dist/src/agent/models/manager.js.map +1 -1
  168. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
  169. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
  170. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  171. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
  172. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  173. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  174. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
  175. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
  176. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
  177. package/dist/src/agent/reply/post-compaction-context.js +11 -6
  178. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  179. package/dist/src/agent/reply/startup-context.js +8 -9
  180. package/dist/src/agent/reply/startup-context.js.map +1 -1
  181. package/dist/src/agent/service/process-direct-streaming.js +1 -4
  182. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  183. package/dist/src/agent/service/session-context-report.js +1 -1
  184. package/dist/src/agent/service/session-context-report.js.map +1 -1
  185. package/dist/src/agent/service.js +21 -25
  186. package/dist/src/agent/service.js.map +1 -1
  187. package/dist/src/agent/service.types.d.ts +1 -2
  188. package/dist/src/agent/session/session-hydrator.js +1 -2
  189. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  190. package/dist/src/agent/session/session-inspector.d.ts +1 -1
  191. package/dist/src/agent/session/session-inspector.js +9 -14
  192. package/dist/src/agent/session/session-inspector.js.map +1 -1
  193. package/dist/src/agent/skills/hub-pull.js +1 -1
  194. package/dist/src/agent/starter-agents.d.ts +1 -3
  195. package/dist/src/agent/starter-agents.js +13 -21
  196. package/dist/src/agent/starter-agents.js.map +1 -1
  197. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
  198. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  199. package/dist/src/agent/tools/composio-tool.d.ts +8 -0
  200. package/dist/src/agent/tools/composio-tool.js +46 -0
  201. package/dist/src/agent/tools/composio-tool.js.map +1 -0
  202. package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
  203. package/dist/src/agent/tools/curated-memory-tool.js +20 -16
  204. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  205. package/dist/src/agent/tools/factory.d.ts +0 -4
  206. package/dist/src/agent/tools/factory.js +32 -66
  207. package/dist/src/agent/tools/factory.js.map +1 -1
  208. package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
  209. package/dist/src/agent/tools/image-generate-tool.js +19 -14
  210. package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
  211. package/dist/src/agent/tools/image-tool.js +1 -3
  212. package/dist/src/agent/tools/image-tool.js.map +1 -1
  213. package/dist/src/agent/tools/index.d.ts +1 -0
  214. package/dist/src/agent/tools/index.js +2 -1
  215. package/dist/src/agent/tools/memory-tool.d.ts +2 -2
  216. package/dist/src/agent/tools/memory-tool.js +39 -14
  217. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  218. package/dist/src/agent/tools/session-search-tool.js +1 -3
  219. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  220. package/dist/src/agent/tools/web-extract.js +6 -5
  221. package/dist/src/agent/tools/web-extract.js.map +1 -1
  222. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  223. package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
  224. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  225. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
  226. package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
  227. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
  228. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
  229. package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
  230. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
  231. package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
  232. package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
  233. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
  234. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
  235. package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
  236. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
  237. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  238. package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
  239. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  240. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
  241. package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
  242. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
  243. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
  244. package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
  245. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
  246. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
  247. package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
  248. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
  249. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
  250. package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
  251. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
  252. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  253. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
  254. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  255. package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
  256. package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
  257. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
  258. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  259. package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
  260. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  261. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  262. package/dist/src/agent/workflow/builtins/release-check.js +10 -1
  263. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  264. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  265. package/dist/src/agent/workflow/builtins/research.js +16 -2
  266. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  267. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
  268. package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
  269. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
  270. package/dist/src/agent/workflow/subagent-runner.js +1 -3
  271. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  272. package/dist/src/agent-manifest/index.d.ts +4 -0
  273. package/dist/src/agent-manifest/index.js +10 -0
  274. package/dist/src/agent-manifest/index.js.map +1 -0
  275. package/dist/src/agent-manifest/prompt.d.ts +2 -0
  276. package/dist/src/agent-manifest/prompt.js +57 -0
  277. package/dist/src/agent-manifest/prompt.js.map +1 -0
  278. package/dist/src/agent-manifest/resolver.d.ts +11 -0
  279. package/dist/src/agent-manifest/resolver.js +93 -0
  280. package/dist/src/agent-manifest/resolver.js.map +1 -0
  281. package/dist/src/agent-manifest/schema.d.ts +778 -0
  282. package/dist/src/agent-manifest/schema.js +267 -0
  283. package/dist/src/agent-manifest/schema.js.map +1 -0
  284. package/dist/src/agent-manifest/validator.d.ts +24 -0
  285. package/dist/src/agent-manifest/validator.js +87 -0
  286. package/dist/src/agent-manifest/validator.js.map +1 -0
  287. package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
  288. package/dist/src/agent-runtime/boundary-guard.js +23 -0
  289. package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
  290. package/dist/src/agent-runtime/index.d.ts +7 -0
  291. package/dist/src/agent-runtime/index.js +8 -0
  292. package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
  293. package/dist/src/agent-runtime/memory-runtime.js +50 -0
  294. package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
  295. package/dist/src/agent-runtime/model-router.d.ts +11 -0
  296. package/dist/src/agent-runtime/model-router.js +16 -0
  297. package/dist/src/agent-runtime/model-router.js.map +1 -0
  298. package/dist/src/agent-runtime/run-trace.d.ts +27 -0
  299. package/dist/src/agent-runtime/run-trace.js +53 -0
  300. package/dist/src/agent-runtime/run-trace.js.map +1 -0
  301. package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
  302. package/dist/src/agent-runtime/runtime-profile.js +44 -0
  303. package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
  304. package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
  305. package/dist/src/agent-runtime/tool-registry.js +52 -0
  306. package/dist/src/agent-runtime/tool-registry.js.map +1 -0
  307. package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
  308. package/dist/src/agent-runtime/workflow-runtime.js +34 -0
  309. package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
  310. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  311. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  312. package/dist/src/browser/actions/registry.js +5 -8
  313. package/dist/src/browser/actions/registry.js.map +1 -1
  314. package/dist/src/browser/backend-from-config.d.ts +1 -1
  315. package/dist/src/browser/backend-from-config.js +50 -71
  316. package/dist/src/browser/backend-from-config.js.map +1 -1
  317. package/dist/src/browser/browser-command-timeout.d.ts +0 -1
  318. package/dist/src/browser/browser-command-timeout.js +3 -7
  319. package/dist/src/browser/browser-command-timeout.js.map +1 -1
  320. package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
  321. package/dist/src/browser/providers/browser-ext-install.js +3 -8
  322. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  323. package/dist/src/browser/readiness.js +16 -16
  324. package/dist/src/browser/readiness.js.map +1 -1
  325. package/dist/src/browser/schemas.js +1 -1
  326. package/dist/src/browser/schemas.js.map +1 -1
  327. package/dist/src/chat-commands/builtins/config.js +4 -4
  328. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  329. package/dist/src/chat-commands/builtins/thinking.js +16 -42
  330. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  331. package/dist/src/chat-commands/config-paths.js +1 -1
  332. package/dist/src/chat-commands/config-paths.js.map +1 -1
  333. package/dist/src/chat-commands/context.js +3 -4
  334. package/dist/src/chat-commands/context.js.map +1 -1
  335. package/dist/src/cli/command-manifest.js +1 -1
  336. package/dist/src/cli/command-manifest.js.map +1 -1
  337. package/dist/src/cli/commands/agent.js +3 -1
  338. package/dist/src/cli/commands/agent.js.map +1 -1
  339. package/dist/src/cli/commands/agents.js +3 -6
  340. package/dist/src/cli/commands/agents.js.map +1 -1
  341. package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
  342. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  343. package/dist/src/cli/commands/config.js +5 -5
  344. package/dist/src/cli/commands/config.js.map +1 -1
  345. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  346. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
  347. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  348. package/dist/src/cli/commands/goal.js +1 -1
  349. package/dist/src/cli/commands/image.js +13 -372
  350. package/dist/src/cli/commands/image.js.map +1 -1
  351. package/dist/src/cli/commands/models.js +26 -10
  352. package/dist/src/cli/commands/models.js.map +1 -1
  353. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  354. package/dist/src/cli/commands/onboard/model.js +20 -22
  355. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  356. package/dist/src/cli/commands/onboard.js +1 -1
  357. package/dist/src/cli/commands/onboard.js.map +1 -1
  358. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
  359. package/dist/src/cli/utils/init-workspace-core.js +7 -6
  360. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  361. package/dist/src/commands/agents.config.d.ts +0 -1
  362. package/dist/src/commands/agents.config.js +66 -12
  363. package/dist/src/commands/agents.config.js.map +1 -1
  364. package/dist/src/config/agent-profile.d.ts +5 -17
  365. package/dist/src/config/agent-profile.js +31 -64
  366. package/dist/src/config/agent-profile.js.map +1 -1
  367. package/dist/src/config/agent-typed-models.d.ts +1 -1
  368. package/dist/src/config/agent-typed-models.js +0 -1
  369. package/dist/src/config/agent-typed-models.js.map +1 -1
  370. package/dist/src/config/index.js +3 -3
  371. package/dist/src/config/integration.d.ts +1 -1
  372. package/dist/src/config/reload.js +1 -1
  373. package/dist/src/config/reload.js.map +1 -1
  374. package/dist/src/config/rules.js +6 -56
  375. package/dist/src/config/rules.js.map +1 -1
  376. package/dist/src/config/schema.d.ts +925 -781
  377. package/dist/src/config/schema.js +157 -424
  378. package/dist/src/config/schema.js.map +1 -1
  379. package/dist/src/connectors/composio-triggers.d.ts +10 -0
  380. package/dist/src/connectors/composio-triggers.js +32 -0
  381. package/dist/src/connectors/composio-triggers.js.map +1 -0
  382. package/dist/src/connectors/composio.d.ts +54 -0
  383. package/dist/src/connectors/composio.js +334 -0
  384. package/dist/src/connectors/composio.js.map +1 -0
  385. package/dist/src/connectors/health.js +16 -1
  386. package/dist/src/connectors/health.js.map +1 -1
  387. package/dist/src/connectors/install.d.ts +2 -1
  388. package/dist/src/connectors/install.js +50 -13
  389. package/dist/src/connectors/install.js.map +1 -1
  390. package/dist/src/connectors/instances.js +57 -6
  391. package/dist/src/connectors/instances.js.map +1 -1
  392. package/dist/src/connectors/lifecycle.d.ts +3 -0
  393. package/dist/src/connectors/lifecycle.js +23 -0
  394. package/dist/src/connectors/lifecycle.js.map +1 -0
  395. package/dist/src/connectors/materialize.js +2 -1
  396. package/dist/src/connectors/materialize.js.map +1 -1
  397. package/dist/src/connectors/providers.d.ts +1 -0
  398. package/dist/src/connectors/providers.js +10 -2
  399. package/dist/src/connectors/providers.js.map +1 -1
  400. package/dist/src/connectors/registries/modelscope.d.ts +2 -0
  401. package/dist/src/connectors/registries/modelscope.js +205 -0
  402. package/dist/src/connectors/registries/modelscope.js.map +1 -0
  403. package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
  404. package/dist/src/connectors/registries/official-mcp.js +142 -0
  405. package/dist/src/connectors/registries/official-mcp.js.map +1 -0
  406. package/dist/src/connectors/registries/search.d.ts +12 -0
  407. package/dist/src/connectors/registries/search.js +89 -0
  408. package/dist/src/connectors/registries/search.js.map +1 -0
  409. package/dist/src/connectors/registries/smithery.d.ts +2 -0
  410. package/dist/src/connectors/registries/smithery.js +98 -0
  411. package/dist/src/connectors/registries/smithery.js.map +1 -0
  412. package/dist/src/connectors/registries/types.d.ts +20 -0
  413. package/dist/src/connectors/registries/types.js +1 -0
  414. package/dist/src/connectors/secret-store.js +4 -2
  415. package/dist/src/connectors/secret-store.js.map +1 -1
  416. package/dist/src/connectors/setup-secrets.d.ts +15 -0
  417. package/dist/src/connectors/setup-secrets.js +64 -0
  418. package/dist/src/connectors/setup-secrets.js.map +1 -0
  419. package/dist/src/connectors/supervisor.d.ts +15 -0
  420. package/dist/src/connectors/supervisor.js +73 -0
  421. package/dist/src/connectors/supervisor.js.map +1 -0
  422. package/dist/src/connectors/types.d.ts +27 -3
  423. package/dist/src/connectors/usage.js +6 -1
  424. package/dist/src/connectors/usage.js.map +1 -1
  425. package/dist/src/cron/index.js +1 -1
  426. package/dist/src/cron/service.js +1 -1
  427. package/dist/src/cron/validation.d.ts +3 -3
  428. package/dist/src/extensions/activation-context.js +13 -7
  429. package/dist/src/extensions/activation-context.js.map +1 -1
  430. package/dist/src/gateway/agents-admin.d.ts +17 -18
  431. package/dist/src/gateway/agents-admin.js +123 -88
  432. package/dist/src/gateway/agents-admin.js.map +1 -1
  433. package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
  434. package/dist/src/gateway/capability-presets-admin.js +214 -0
  435. package/dist/src/gateway/capability-presets-admin.js.map +1 -0
  436. package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
  437. package/dist/src/gateway/hono/lib/agent-model.js +1 -1
  438. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  439. package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
  440. package/dist/src/gateway/hono/lib/config-payload.js +13 -37
  441. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/agents.js +56 -33
  443. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/browser.js +8 -15
  445. package/dist/src/gateway/hono/routes/browser.js.map +1 -1
  446. package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
  447. package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
  448. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
  449. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
  450. package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
  451. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  452. package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
  453. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  454. package/dist/src/gateway/hono/routes/config.js +1 -1
  455. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  456. package/dist/src/gateway/hono/routes/connectors.js +230 -3
  457. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  458. package/dist/src/gateway/hono/routes/dreaming.js +7 -0
  459. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  460. package/dist/src/gateway/hono/routes/goals.js +52 -5
  461. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  462. package/dist/src/gateway/hono/routes/index.js +2 -0
  463. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  464. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  465. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  466. package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
  467. package/dist/src/gateway/hono/routes/memory.js +290 -0
  468. package/dist/src/gateway/hono/routes/memory.js.map +1 -0
  469. package/dist/src/gateway/hono/routes/voice.js +14 -1
  470. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  471. package/dist/src/gateway/hono/sse.js.map +1 -1
  472. package/dist/src/gateway/service/agent-runner.d.ts +5 -12
  473. package/dist/src/gateway/service/agent-runner.js +8 -8
  474. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  475. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
  476. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  477. package/dist/src/gateway/service.d.ts +2 -2
  478. package/dist/src/gateway/service.js +20 -16
  479. package/dist/src/gateway/service.js.map +1 -1
  480. package/dist/src/gateway/user-turn-input.d.ts +18 -0
  481. package/dist/src/gateway/user-turn-input.js +16 -0
  482. package/dist/src/gateway/user-turn-input.js.map +1 -0
  483. package/dist/src/goals/goal-queue-store.d.ts +2 -1
  484. package/dist/src/goals/goal-queue-store.js +2 -2
  485. package/dist/src/goals/goal-queue-store.js.map +1 -1
  486. package/dist/src/goals/goal-queue-types.d.ts +4 -3
  487. package/dist/src/goals/goal-runner.js +25 -3
  488. package/dist/src/goals/goal-runner.js.map +1 -1
  489. package/dist/src/goals/goal-service.d.ts +6 -1
  490. package/dist/src/goals/goal-service.js +9 -2
  491. package/dist/src/goals/goal-service.js.map +1 -1
  492. package/dist/src/goals/goal-store.d.ts +7 -1
  493. package/dist/src/goals/goal-store.js +42 -0
  494. package/dist/src/goals/goal-store.js.map +1 -1
  495. package/dist/src/goals/types.d.ts +10 -0
  496. package/dist/src/notes/agent-context.js +2 -2
  497. package/dist/src/providers/index.d.ts +2 -2
  498. package/dist/src/providers/index.js +10 -14
  499. package/dist/src/providers/index.js.map +1 -1
  500. package/dist/src/session/index.js +1 -1
  501. package/dist/src/session/session-workspace.js +7 -2
  502. package/dist/src/session/session-workspace.js.map +1 -1
  503. package/dist/src/session/store.js +5 -0
  504. package/dist/src/session/store.js.map +1 -1
  505. package/dist/src/session/thinking-resolve.d.ts +1 -1
  506. package/dist/src/session/thinking-resolve.js +1 -1
  507. package/dist/src/session/thinking-resolve.js.map +1 -1
  508. package/dist/src/storage/sqlite/connection.js +1 -1
  509. package/dist/src/storage/sqlite/index.d.ts +1 -0
  510. package/dist/src/storage/sqlite/index.js +2 -1
  511. package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
  512. package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
  513. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
  514. package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
  515. package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
  516. package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
  517. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  518. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  519. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  520. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  521. package/dist/src/storage/sqlite/schema.js +3 -3
  522. package/dist/src/storage/sqlite/schema.sql +95 -0
  523. package/dist/src/tui/backends/embedded-backend.js +6 -4
  524. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  525. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  526. package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
  527. package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
  528. package/dist/src/voice/tts/providers/edge-speech.js +14 -2
  529. package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
  530. package/dist/src/voice/tts/speak-core.js +3 -3
  531. package/dist/src/voice/tts/speak-core.js.map +1 -1
  532. package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
  533. package/dist/src/voice/tts/types.js +1 -1
  534. package/dist/src/voice/tts/types.js.map +1 -1
  535. package/dist/src/workflows/domain/result.d.ts +0 -1
  536. package/dist/src/workflows/engine/workflow-engine.js +7 -23
  537. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  538. package/dist/src/workflows/service/workflow-run-service.js +3 -4
  539. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  540. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  541. package/package.json +4 -3
  542. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
  543. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
  544. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
  545. package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
  546. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
  547. package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
  548. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
  549. package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
  550. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
  551. package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
  552. package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
  553. package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
  554. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
  555. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
  556. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
  557. package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
  558. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
  559. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
  560. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
  561. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
  562. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
  563. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
  564. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
  565. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
  566. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
  567. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
  568. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
  569. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
  570. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
  571. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
  572. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
  573. package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
  574. package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
  575. package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
  576. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
  577. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
  578. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
@@ -0,0 +1,89 @@
1
+ import { createLogger } from "../../utils/logger/index.js";
2
+ import { init_logger } from "../../utils/logger.js";
3
+ import { modelscopeRegistryAdapter } from "./modelscope.js";
4
+ import { officialMcpRegistryAdapter } from "./official-mcp.js";
5
+ import { smitheryRegistryAdapter } from "./smithery.js";
6
+ //#region src/connectors/registries/search.ts
7
+ init_logger();
8
+ const log = createLogger("Connectors:Registry");
9
+ const registryAdapters = /* @__PURE__ */ new Map();
10
+ const REGISTRY_CACHE_TTL_MS = 600 * 1e3;
11
+ const registrySearchCache = /* @__PURE__ */ new Map();
12
+ function registerConnectorRegistryAdapter(registration) {
13
+ registryAdapters.set(registration.adapter.source, registration.adapter);
14
+ registrySearchCache.clear();
15
+ }
16
+ function unregisterConnectorRegistryAdapter(source) {
17
+ const removed = registryAdapters.delete(source);
18
+ if (removed) registrySearchCache.clear();
19
+ return removed;
20
+ }
21
+ registerConnectorRegistryAdapter({ adapter: officialMcpRegistryAdapter });
22
+ registerConnectorRegistryAdapter({ adapter: smitheryRegistryAdapter });
23
+ registerConnectorRegistryAdapter({ adapter: modelscopeRegistryAdapter });
24
+ function cacheKey(params) {
25
+ return JSON.stringify({
26
+ source: params.source ?? "all",
27
+ query: params.query?.trim() ?? "",
28
+ page: params.page ?? 1,
29
+ pageSize: params.pageSize ?? 24,
30
+ browse: params.browse ?? false
31
+ });
32
+ }
33
+ function listConnectorRegistries() {
34
+ return [...registryAdapters.values()].map((registry) => ({
35
+ id: registry.source,
36
+ displayName: registry.displayName
37
+ }));
38
+ }
39
+ function isConnectorRegistrySource(source) {
40
+ return registryAdapters.has(source);
41
+ }
42
+ async function runRegistrySearch(params) {
43
+ const source = params.source ?? "all";
44
+ const registries = source === "all" ? [...registryAdapters.values()] : [...registryAdapters.values()].filter((registry) => registry.source === source);
45
+ return Promise.all(registries.map(async (registry) => {
46
+ try {
47
+ return await registry.search(params);
48
+ } catch (error) {
49
+ const errorMessage = error instanceof Error ? error.message : String(error);
50
+ log.warn({
51
+ source: registry.source,
52
+ errorMessage
53
+ }, `Connector registry search failed: ${errorMessage}`);
54
+ return {
55
+ source: registry.source,
56
+ connectors: [],
57
+ error: errorMessage
58
+ };
59
+ }
60
+ }));
61
+ }
62
+ async function searchConnectorRegistries(params) {
63
+ if (!params.query?.trim() && !params.browse) {
64
+ const source = params.source ?? "all";
65
+ return (source === "all" ? [...registryAdapters.values()] : [...registryAdapters.values()].filter((registry) => registry.source === source)).map((registry) => ({
66
+ source: registry.source,
67
+ connectors: []
68
+ }));
69
+ }
70
+ const key = cacheKey(params);
71
+ const now = Date.now();
72
+ const cached = registrySearchCache.get(key);
73
+ if (cached && cached.expiresAt > now) return cached.promise;
74
+ const promise = runRegistrySearch(params);
75
+ registrySearchCache.set(key, {
76
+ expiresAt: now + REGISTRY_CACHE_TTL_MS,
77
+ promise
78
+ });
79
+ try {
80
+ return await promise;
81
+ } catch (error) {
82
+ registrySearchCache.delete(key);
83
+ throw error;
84
+ }
85
+ }
86
+ //#endregion
87
+ export { isConnectorRegistrySource, listConnectorRegistries, registerConnectorRegistryAdapter, searchConnectorRegistries, unregisterConnectorRegistryAdapter };
88
+
89
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","names":[],"sources":["../../../../src/connectors/registries/search.ts"],"sourcesContent":["import { createLogger } from '../../utils/logger.js';\nimport { modelscopeRegistryAdapter } from './modelscope.js';\nimport { officialMcpRegistryAdapter } from './official-mcp.js';\nimport { smitheryRegistryAdapter } from './smithery.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst log = createLogger('Connectors:Registry');\n\nconst registryAdapters = new Map<string, ConnectorRegistryAdapter>();\nconst REGISTRY_CACHE_TTL_MS = 10 * 60 * 1000;\nconst registrySearchCache = new Map<string, { expiresAt: number; promise: Promise<ConnectorRegistrySearchResult[]> }>();\n\nexport type ConnectorRegistryRegistration = {\n adapter: ConnectorRegistryAdapter;\n};\n\nexport function registerConnectorRegistryAdapter(registration: ConnectorRegistryRegistration): void {\n registryAdapters.set(registration.adapter.source, registration.adapter);\n registrySearchCache.clear();\n}\n\nexport function unregisterConnectorRegistryAdapter(source: string): boolean {\n const removed = registryAdapters.delete(source);\n if (removed) registrySearchCache.clear();\n return removed;\n}\n\nregisterConnectorRegistryAdapter({ adapter: officialMcpRegistryAdapter });\nregisterConnectorRegistryAdapter({ adapter: smitheryRegistryAdapter });\nregisterConnectorRegistryAdapter({ adapter: modelscopeRegistryAdapter });\n\nfunction cacheKey(params: ConnectorRegistrySearchParams): string {\n return JSON.stringify({\n source: params.source ?? 'all',\n query: params.query?.trim() ?? '',\n page: params.page ?? 1,\n pageSize: params.pageSize ?? 24,\n browse: params.browse ?? false,\n });\n}\n\nexport function listConnectorRegistries(): Array<{ id: string; displayName: string }> {\n return [...registryAdapters.values()].map((registry) => ({ id: registry.source, displayName: registry.displayName }));\n}\n\nexport function isConnectorRegistrySource(source: string): boolean {\n return registryAdapters.has(source);\n}\n\nasync function runRegistrySearch(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult[]> {\n const source = params.source ?? 'all';\n const registries = source === 'all'\n ? [...registryAdapters.values()]\n : [...registryAdapters.values()].filter((registry) => registry.source === source);\n return Promise.all(registries.map(async (registry) => {\n try {\n return await registry.search(params);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ source: registry.source, errorMessage }, `Connector registry search failed: ${errorMessage}`);\n return { source: registry.source, connectors: [], error: errorMessage } satisfies ConnectorRegistrySearchResult;\n }\n }));\n}\n\nexport async function searchConnectorRegistries(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult[]> {\n if (!params.query?.trim() && !params.browse) {\n const source = params.source ?? 'all';\n const registries = source === 'all'\n ? [...registryAdapters.values()]\n : [...registryAdapters.values()].filter((registry) => registry.source === source);\n return registries.map((registry) => ({ source: registry.source, connectors: [] }));\n }\n const key = cacheKey(params);\n const now = Date.now();\n const cached = registrySearchCache.get(key);\n if (cached && cached.expiresAt > now) {\n return cached.promise;\n }\n const promise = runRegistrySearch(params);\n registrySearchCache.set(key, { expiresAt: now + REGISTRY_CACHE_TTL_MS, promise });\n try {\n return await promise;\n } catch (error) {\n registrySearchCache.delete(key);\n throw error;\n }\n}\n"],"mappings":";;;;;;aAAqD;AAMrD,MAAM,MAAM,aAAa,sBAAsB;AAE/C,MAAM,mCAAmB,IAAI,KAAuC;AACpE,MAAM,wBAAwB,MAAU;AACxC,MAAM,sCAAsB,IAAI,KAAuF;AAMvH,SAAgB,iCAAiC,cAAmD;AAClG,kBAAiB,IAAI,aAAa,QAAQ,QAAQ,aAAa,QAAQ;AACvE,qBAAoB,OAAO;;AAG7B,SAAgB,mCAAmC,QAAyB;CAC1E,MAAM,UAAU,iBAAiB,OAAO,OAAO;AAC/C,KAAI,QAAS,qBAAoB,OAAO;AACxC,QAAO;;AAGT,iCAAiC,EAAE,SAAS,4BAA4B,CAAC;AACzE,iCAAiC,EAAE,SAAS,yBAAyB,CAAC;AACtE,iCAAiC,EAAE,SAAS,2BAA2B,CAAC;AAExE,SAAS,SAAS,QAA+C;AAC/D,QAAO,KAAK,UAAU;EACpB,QAAQ,OAAO,UAAU;EACzB,OAAO,OAAO,OAAO,MAAM,IAAI;EAC/B,MAAM,OAAO,QAAQ;EACrB,UAAU,OAAO,YAAY;EAC7B,QAAQ,OAAO,UAAU;EAC1B,CAAC;;AAGJ,SAAgB,0BAAsE;AACpF,QAAO,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,KAAK,cAAc;EAAE,IAAI,SAAS;EAAQ,aAAa,SAAS;EAAa,EAAE;;AAGvH,SAAgB,0BAA0B,QAAyB;AACjE,QAAO,iBAAiB,IAAI,OAAO;;AAGrC,eAAe,kBAAkB,QAAiF;CAChH,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,aAAa,WAAW,QAC1B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,GAC9B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,aAAa,SAAS,WAAW,OAAO;AACnF,QAAO,QAAQ,IAAI,WAAW,IAAI,OAAO,aAAa;AACpD,MAAI;AACF,UAAO,MAAM,SAAS,OAAO,OAAO;WAC7B,OAAO;GACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,OAAI,KAAK;IAAE,QAAQ,SAAS;IAAQ;IAAc,EAAE,qCAAqC,eAAe;AACxG,UAAO;IAAE,QAAQ,SAAS;IAAQ,YAAY,EAAE;IAAE,OAAO;IAAc;;GAEzE,CAAC;;AAGL,eAAsB,0BAA0B,QAAiF;AAC/H,KAAI,CAAC,OAAO,OAAO,MAAM,IAAI,CAAC,OAAO,QAAQ;EAC3C,MAAM,SAAS,OAAO,UAAU;AAIhC,UAHmB,WAAW,QAC1B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,GAC9B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,aAAa,SAAS,WAAW,OAAO,EACjE,KAAK,cAAc;GAAE,QAAQ,SAAS;GAAQ,YAAY,EAAE;GAAE,EAAE;;CAEpF,MAAM,MAAM,SAAS,OAAO;CAC5B,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,SAAS,oBAAoB,IAAI,IAAI;AAC3C,KAAI,UAAU,OAAO,YAAY,IAC/B,QAAO,OAAO;CAEhB,MAAM,UAAU,kBAAkB,OAAO;AACzC,qBAAoB,IAAI,KAAK;EAAE,WAAW,MAAM;EAAuB;EAAS,CAAC;AACjF,KAAI;AACF,SAAO,MAAM;UACN,OAAO;AACd,sBAAoB,OAAO,IAAI;AAC/B,QAAM"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorRegistryAdapter } from './types.js';
2
+ export declare const smitheryRegistryAdapter: ConnectorRegistryAdapter;
@@ -0,0 +1,98 @@
1
+ //#region src/connectors/registries/smithery.ts
2
+ const DEFAULT_BASE_URL = "https://registry.smithery.ai";
3
+ function smitheryApiKey() {
4
+ return process.env.XOPC_SMITHERY_API_KEY?.trim() || process.env.SMITHERY_API_KEY?.trim() || void 0;
5
+ }
6
+ function smitheryBaseUrl() {
7
+ return process.env.XOPC_SMITHERY_REGISTRY_URL?.trim().replace(/\/+$/, "") || DEFAULT_BASE_URL;
8
+ }
9
+ function readString(value) {
10
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
11
+ }
12
+ function slugFrom(value) {
13
+ return value.trim().toLowerCase().replace(/^@/, "").replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "smithery-mcp";
14
+ }
15
+ function connectorFromSmitheryServer(server, apiKey) {
16
+ const qualifiedName = readString(server.qualifiedName ?? server.qualified_name ?? server.name ?? server.id);
17
+ const displayName = readString(server.displayName ?? server.display_name ?? server.name) ?? qualifiedName;
18
+ if (!qualifiedName || !displayName) return void 0;
19
+ const serverId = slugFrom(qualifiedName);
20
+ const url = `https://server.smithery.ai/${qualifiedName.split("/").map((part) => encodeURIComponent(part)).join("/")}/mcp`;
21
+ return {
22
+ id: `smithery-${serverId}`,
23
+ version: readString(server.version) ?? "registry",
24
+ displayName,
25
+ description: readString(server.description) ?? "MCP server hosted through Smithery.",
26
+ category: "custom",
27
+ kind: "mcp",
28
+ source: "registry",
29
+ capabilities: [
30
+ "tools",
31
+ "resources",
32
+ "prompts",
33
+ "auth.apiKey",
34
+ "runtime.mcp.streamableHttp"
35
+ ],
36
+ tags: [
37
+ "smithery",
38
+ "registry",
39
+ "mcp"
40
+ ],
41
+ auth: { mode: "apiKey" },
42
+ setup: apiKey ? {} : { secrets: [{
43
+ key: "SMITHERY_AUTHORIZATION_HEADER",
44
+ label: "Smithery Authorization header",
45
+ description: "Full Authorization header used when launching hosted Smithery MCP servers, for example \"Bearer ...\".",
46
+ required: true
47
+ }] },
48
+ runtime: {
49
+ type: "mcp",
50
+ serverId,
51
+ serverTemplate: {
52
+ url,
53
+ transport: "streamable-http",
54
+ headers: { Authorization: apiKey ? `Bearer ${apiKey}` : "{{secrets.SMITHERY_AUTHORIZATION_HEADER}}" }
55
+ }
56
+ }
57
+ };
58
+ }
59
+ function extractServers(payload) {
60
+ if (Array.isArray(payload)) return payload.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item)));
61
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
62
+ const data = payload;
63
+ for (const key of [
64
+ "servers",
65
+ "items",
66
+ "results",
67
+ "data"
68
+ ]) {
69
+ const value = data[key];
70
+ if (Array.isArray(value)) return value.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item)));
71
+ }
72
+ return [];
73
+ }
74
+ const smitheryRegistryAdapter = {
75
+ source: "smithery",
76
+ displayName: "Smithery",
77
+ async search(params) {
78
+ const apiKey = smitheryApiKey();
79
+ const url = new URL("/servers", smitheryBaseUrl());
80
+ const query = params.query?.trim();
81
+ if (query) url.searchParams.set("q", query);
82
+ url.searchParams.set("pageSize", String(Math.min(Math.max(params.pageSize ?? 24, 1), 100)));
83
+ if (params.page && params.page > 1) url.searchParams.set("page", String(params.page));
84
+ const response = await fetch(url, { headers: {
85
+ Accept: "application/json",
86
+ ...apiKey ? { Authorization: `Bearer ${apiKey}` } : {}
87
+ } });
88
+ if (!response.ok) throw new Error(`Smithery registry returned ${response.status}`);
89
+ return {
90
+ source: "smithery",
91
+ connectors: extractServers(await response.json()).map((server) => connectorFromSmitheryServer(server, apiKey)).filter((item) => Boolean(item))
92
+ };
93
+ }
94
+ };
95
+ //#endregion
96
+ export { smitheryRegistryAdapter };
97
+
98
+ //# sourceMappingURL=smithery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smithery.js","names":[],"sources":["../../../../src/connectors/registries/smithery.ts"],"sourcesContent":["import type { ConnectorDefinition } from '../types.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://registry.smithery.ai';\n\nfunction smitheryApiKey(): string | undefined {\n return process.env.XOPC_SMITHERY_API_KEY?.trim() || process.env.SMITHERY_API_KEY?.trim() || undefined;\n}\n\nfunction smitheryBaseUrl(): string {\n return process.env.XOPC_SMITHERY_REGISTRY_URL?.trim().replace(/\\/+$/, '') || DEFAULT_BASE_URL;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction slugFrom(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^@/, '')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64) || 'smithery-mcp';\n}\n\nfunction connectorFromSmitheryServer(server: Record<string, unknown>, apiKey?: string): ConnectorDefinition | undefined {\n const qualifiedName = readString(server.qualifiedName ?? server.qualified_name ?? server.name ?? server.id);\n const displayName = readString(server.displayName ?? server.display_name ?? server.name) ?? qualifiedName;\n if (!qualifiedName || !displayName) return undefined;\n const serverId = slugFrom(qualifiedName);\n const encodedPath = qualifiedName.split('/').map((part) => encodeURIComponent(part)).join('/');\n const url = `https://server.smithery.ai/${encodedPath}/mcp`;\n return {\n id: `smithery-${serverId}`,\n version: readString(server.version) ?? 'registry',\n displayName,\n description: readString(server.description) ?? 'MCP server hosted through Smithery.',\n category: 'custom',\n kind: 'mcp',\n source: 'registry',\n capabilities: ['tools', 'resources', 'prompts', 'auth.apiKey', 'runtime.mcp.streamableHttp'],\n tags: ['smithery', 'registry', 'mcp'],\n auth: { mode: 'apiKey' },\n setup: apiKey\n ? {}\n : {\n secrets: [\n {\n key: 'SMITHERY_AUTHORIZATION_HEADER',\n label: 'Smithery Authorization header',\n description: 'Full Authorization header used when launching hosted Smithery MCP servers, for example \"Bearer ...\".',\n required: true,\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId,\n serverTemplate: {\n url,\n transport: 'streamable-http',\n headers: {\n Authorization: apiKey ? `Bearer ${apiKey}` : '{{secrets.SMITHERY_AUTHORIZATION_HEADER}}',\n },\n },\n },\n };\n}\n\nfunction extractServers(payload: unknown): Record<string, unknown>[] {\n if (Array.isArray(payload)) return payload.filter((item): item is Record<string, unknown> => Boolean(item && typeof item === 'object' && !Array.isArray(item)));\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return [];\n const data = payload as Record<string, unknown>;\n for (const key of ['servers', 'items', 'results', 'data']) {\n const value = data[key];\n if (Array.isArray(value)) {\n return value.filter((item): item is Record<string, unknown> => Boolean(item && typeof item === 'object' && !Array.isArray(item)));\n }\n }\n return [];\n}\n\nexport const smitheryRegistryAdapter: ConnectorRegistryAdapter = {\n source: 'smithery',\n displayName: 'Smithery',\n async search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult> {\n const apiKey = smitheryApiKey();\n const url = new URL('/servers', smitheryBaseUrl());\n const query = params.query?.trim();\n if (query) url.searchParams.set('q', query);\n url.searchParams.set('pageSize', String(Math.min(Math.max(params.pageSize ?? 24, 1), 100)));\n if (params.page && params.page > 1) url.searchParams.set('page', String(params.page));\n const response = await fetch(url, {\n headers: {\n Accept: 'application/json',\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n });\n if (!response.ok) throw new Error(`Smithery registry returned ${response.status}`);\n const payload = await response.json();\n return {\n source: 'smithery',\n connectors: extractServers(payload).map((server) => connectorFromSmitheryServer(server, apiKey)).filter((item): item is ConnectorDefinition => Boolean(item)),\n };\n },\n};\n"],"mappings":";AAGA,MAAM,mBAAmB;AAEzB,SAAS,iBAAqC;AAC5C,QAAO,QAAQ,IAAI,uBAAuB,MAAM,IAAI,QAAQ,IAAI,kBAAkB,MAAM,IAAI,KAAA;;AAG9F,SAAS,kBAA0B;AACjC,QAAO,QAAQ,IAAI,4BAA4B,MAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI;;AAG/E,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,SAAS,SAAS,OAAuB;AACvC,QAAO,MACJ,MAAM,CACN,aAAa,CACb,QAAQ,MAAM,GAAG,CACjB,QAAQ,iBAAiB,IAAI,CAC7B,QAAQ,YAAY,GAAG,CACvB,MAAM,GAAG,GAAG,IAAI;;AAGrB,SAAS,4BAA4B,QAAiC,QAAkD;CACtH,MAAM,gBAAgB,WAAW,OAAO,iBAAiB,OAAO,kBAAkB,OAAO,QAAQ,OAAO,GAAG;CAC3G,MAAM,cAAc,WAAW,OAAO,eAAe,OAAO,gBAAgB,OAAO,KAAK,IAAI;AAC5F,KAAI,CAAC,iBAAiB,CAAC,YAAa,QAAO,KAAA;CAC3C,MAAM,WAAW,SAAS,cAAc;CAExC,MAAM,MAAM,8BADQ,cAAc,MAAM,IAAI,CAAC,KAAK,SAAS,mBAAmB,KAAK,CAAC,CAAC,KAAK,IACrC,CAAC;AACtD,QAAO;EACL,IAAI,YAAY;EAChB,SAAS,WAAW,OAAO,QAAQ,IAAI;EACvC;EACA,aAAa,WAAW,OAAO,YAAY,IAAI;EAC/C,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAW;GAAe;GAA6B;EAC5F,MAAM;GAAC;GAAY;GAAY;GAAM;EACrC,MAAM,EAAE,MAAM,UAAU;EACxB,OAAO,SACH,EAAE,GACF,EACE,SAAS,CACP;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,UAAU;GACX,CACF,EACF;EACL,SAAS;GACP,MAAM;GACN;GACA,gBAAgB;IACd;IACA,WAAW;IACX,SAAS,EACP,eAAe,SAAS,UAAU,WAAW,6CAC9C;IACF;GACF;EACF;;AAGH,SAAS,eAAe,SAA6C;AACnE,KAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO,QAAQ,QAAQ,SAA0C,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC/J,KAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,CAAE,QAAO,EAAE;CAChF,MAAM,OAAO;AACb,MAAK,MAAM,OAAO;EAAC;EAAW;EAAS;EAAW;EAAO,EAAE;EACzD,MAAM,QAAQ,KAAK;AACnB,MAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,QAAQ,SAA0C,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;;AAGrI,QAAO,EAAE;;AAGX,MAAa,0BAAoD;CAC/D,QAAQ;CACR,aAAa;CACb,MAAM,OAAO,QAA+E;EAC1F,MAAM,SAAS,gBAAgB;EAC/B,MAAM,MAAM,IAAI,IAAI,YAAY,iBAAiB,CAAC;EAClD,MAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,MAAI,MAAO,KAAI,aAAa,IAAI,KAAK,MAAM;AAC3C,MAAI,aAAa,IAAI,YAAY,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3F,MAAI,OAAO,QAAQ,OAAO,OAAO,EAAG,KAAI,aAAa,IAAI,QAAQ,OAAO,OAAO,KAAK,CAAC;EACrF,MAAM,WAAW,MAAM,MAAM,KAAK,EAChC,SAAS;GACP,QAAQ;GACR,GAAI,SAAS,EAAE,eAAe,UAAU,UAAU,GAAG,EAAE;GACxD,EACF,CAAC;AACF,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8BAA8B,SAAS,SAAS;AAElF,SAAO;GACL,QAAQ;GACR,YAAY,eAAe,MAHP,SAAS,MAAM,CAGA,CAAC,KAAK,WAAW,4BAA4B,QAAQ,OAAO,CAAC,CAAC,QAAQ,SAAsC,QAAQ,KAAK,CAAC;GAC9J;;CAEJ"}
@@ -0,0 +1,20 @@
1
+ import type { ConnectorDefinition } from '../types.js';
2
+ export type ConnectorRegistrySource = string;
3
+ export type ConnectorRegistrySearchParams = {
4
+ query?: string;
5
+ page?: number;
6
+ pageSize?: number;
7
+ source?: ConnectorRegistrySource | 'all';
8
+ browse?: boolean;
9
+ };
10
+ export type ConnectorRegistrySearchResult = {
11
+ source: ConnectorRegistrySource;
12
+ connectors: ConnectorDefinition[];
13
+ totalPages?: number;
14
+ error?: string;
15
+ };
16
+ export type ConnectorRegistryAdapter = {
17
+ source: ConnectorRegistrySource;
18
+ displayName: string;
19
+ search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult>;
20
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
2
+ import { consumeConnectorSetupSecretRef } from "./setup-secrets.js";
2
3
  //#region src/connectors/secret-store.ts
3
4
  init_credentials();
4
5
  function normalizeSecretSegment(value) {
@@ -21,8 +22,9 @@ function isConnectorSecretReference(value) {
21
22
  async function saveConnectorSecrets(definition, input, resolver = new CredentialResolver()) {
22
23
  for (const secret of definition.setup.secrets ?? []) {
23
24
  const rawValue = input.secrets?.[secret.key];
24
- if (typeof rawValue !== "string" || rawValue.trim().length === 0) continue;
25
- await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), rawValue.trim(), { profileName: "default" });
25
+ const resolvedValue = typeof rawValue === "string" && rawValue.trim().startsWith("secret://") ? consumeConnectorSetupSecretRef(rawValue) : rawValue;
26
+ if (typeof resolvedValue !== "string" || resolvedValue.trim().length === 0) continue;
27
+ await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), resolvedValue.trim(), { profileName: "default" });
26
28
  }
27
29
  }
28
30
  async function resolveSecretReference(reference, resolver) {
@@ -1 +1 @@
1
- {"version":3,"file":"secret-store.js","names":[],"sources":["../../../src/connectors/secret-store.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';\n\nfunction normalizeSecretSegment(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nexport function connectorSecretProviderId(connectorId: string, fieldKey: string): string {\n const normalizedConnectorId = normalizeSecretSegment(connectorId);\n const normalizedFieldKey = normalizeSecretSegment(fieldKey);\n return `connector-${normalizedConnectorId}-${normalizedFieldKey}`;\n}\n\nexport function createConnectorSecretReference(connectorId: string, fieldKey: string): ConnectorSecretReference {\n return {\n xopcSecretRef: {\n provider: connectorSecretProviderId(connectorId, fieldKey),\n fieldKey,\n },\n };\n}\n\nexport function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const ref = (value as Record<string, unknown>).xopcSecretRef;\n return Boolean(\n ref &&\n typeof ref === 'object' &&\n !Array.isArray(ref) &&\n typeof (ref as Record<string, unknown>).provider === 'string' &&\n typeof (ref as Record<string, unknown>).fieldKey === 'string',\n );\n}\n\nexport async function saveConnectorSecrets(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<void> {\n for (const secret of definition.setup.secrets ?? []) {\n const rawValue = input.secrets?.[secret.key];\n if (typeof rawValue !== 'string' || rawValue.trim().length === 0) {\n continue;\n }\n await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), rawValue.trim(), {\n profileName: 'default',\n });\n }\n}\n\nasync function resolveSecretReference(\n reference: ConnectorSecretReference,\n resolver: CredentialResolver,\n): Promise<string | undefined> {\n const value = await resolver.resolveApiKey(reference.xopcSecretRef.provider);\n return value ?? undefined;\n}\n\nexport async function resolveConnectorSecretReferences(\n value: unknown,\n resolver = new CredentialResolver(),\n): Promise<unknown> {\n if (isConnectorSecretReference(value)) {\n return resolveSecretReference(value, resolver);\n }\n if (Array.isArray(value)) {\n const items = await Promise.all(value.map((item) => resolveConnectorSecretReferences(item, resolver)));\n return items.filter((item) => item !== undefined);\n }\n if (value && typeof value === 'object') {\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const resolved = await resolveConnectorSecretReferences(child, resolver);\n if (resolved !== undefined) {\n output[key] = resolved;\n }\n }\n return output;\n }\n return value;\n}\n"],"mappings":";;kBAA4D;AAG5D,SAAS,uBAAuB,OAAuB;AACrD,QAAO,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,iBAAiB,IAAI,CAAC,QAAQ,YAAY,GAAG;;AAGzF,SAAgB,0BAA0B,aAAqB,UAA0B;AAGvF,QAAO,aAFuB,uBAAuB,YAEZ,CAAC,GADf,uBAAuB,SACa;;AAGjE,SAAgB,+BAA+B,aAAqB,UAA4C;AAC9G,QAAO,EACL,eAAe;EACb,UAAU,0BAA0B,aAAa,SAAS;EAC1D;EACD,EACF;;AAGH,SAAgB,2BAA2B,OAAmD;AAC5F,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;CAET,MAAM,MAAO,MAAkC;AAC/C,QAAO,QACL,OACE,OAAO,QAAQ,YACf,CAAC,MAAM,QAAQ,IAAI,IACnB,OAAQ,IAAgC,aAAa,YACrD,OAAQ,IAAgC,aAAa,SACxD;;AAGH,eAAsB,qBACpB,YACA,OACA,WAAW,IAAI,oBAAoB,EACpB;AACf,MAAK,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE,EAAE;EACnD,MAAM,WAAW,MAAM,UAAU,OAAO;AACxC,MAAI,OAAO,aAAa,YAAY,SAAS,MAAM,CAAC,WAAW,EAC7D;AAEF,QAAM,SAAS,WAAW,0BAA0B,WAAW,IAAI,OAAO,IAAI,EAAE,SAAS,MAAM,EAAE,EAC/F,aAAa,WACd,CAAC;;;AAIN,eAAe,uBACb,WACA,UAC6B;AAE7B,QAAO,MADa,SAAS,cAAc,UAAU,cAAc,SAAS,IAC5D,KAAA;;AAGlB,eAAsB,iCACpB,OACA,WAAW,IAAI,oBAAoB,EACjB;AAClB,KAAI,2BAA2B,MAAM,CACnC,QAAO,uBAAuB,OAAO,SAAS;AAEhD,KAAI,MAAM,QAAQ,MAAM,CAEtB,SAAO,MADa,QAAQ,IAAI,MAAM,KAAK,SAAS,iCAAiC,MAAM,SAAS,CAAC,CAAC,EACzF,QAAQ,SAAS,SAAS,KAAA,EAAU;AAEnD,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAiC,EAAE;GAC3E,MAAM,WAAW,MAAM,iCAAiC,OAAO,SAAS;AACxE,OAAI,aAAa,KAAA,EACf,QAAO,OAAO;;AAGlB,SAAO;;AAET,QAAO"}
1
+ {"version":3,"file":"secret-store.js","names":[],"sources":["../../../src/connectors/secret-store.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport { consumeConnectorSetupSecretRef } from './setup-secrets.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';\n\nfunction normalizeSecretSegment(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nexport function connectorSecretProviderId(connectorId: string, fieldKey: string): string {\n const normalizedConnectorId = normalizeSecretSegment(connectorId);\n const normalizedFieldKey = normalizeSecretSegment(fieldKey);\n return `connector-${normalizedConnectorId}-${normalizedFieldKey}`;\n}\n\nexport function createConnectorSecretReference(connectorId: string, fieldKey: string): ConnectorSecretReference {\n return {\n xopcSecretRef: {\n provider: connectorSecretProviderId(connectorId, fieldKey),\n fieldKey,\n },\n };\n}\n\nexport function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const ref = (value as Record<string, unknown>).xopcSecretRef;\n return Boolean(\n ref &&\n typeof ref === 'object' &&\n !Array.isArray(ref) &&\n typeof (ref as Record<string, unknown>).provider === 'string' &&\n typeof (ref as Record<string, unknown>).fieldKey === 'string',\n );\n}\n\nexport async function saveConnectorSecrets(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<void> {\n for (const secret of definition.setup.secrets ?? []) {\n const rawValue = input.secrets?.[secret.key];\n const resolvedValue = typeof rawValue === 'string' && rawValue.trim().startsWith('secret://')\n ? consumeConnectorSetupSecretRef(rawValue)\n : rawValue;\n if (typeof resolvedValue !== 'string' || resolvedValue.trim().length === 0) {\n continue;\n }\n await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), resolvedValue.trim(), {\n profileName: 'default',\n });\n }\n}\n\nasync function resolveSecretReference(\n reference: ConnectorSecretReference,\n resolver: CredentialResolver,\n): Promise<string | undefined> {\n const value = await resolver.resolveApiKey(reference.xopcSecretRef.provider);\n return value ?? undefined;\n}\n\nexport async function resolveConnectorSecretReferences(\n value: unknown,\n resolver = new CredentialResolver(),\n): Promise<unknown> {\n if (isConnectorSecretReference(value)) {\n return resolveSecretReference(value, resolver);\n }\n if (Array.isArray(value)) {\n const items = await Promise.all(value.map((item) => resolveConnectorSecretReferences(item, resolver)));\n return items.filter((item) => item !== undefined);\n }\n if (value && typeof value === 'object') {\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const resolved = await resolveConnectorSecretReferences(child, resolver);\n if (resolved !== undefined) {\n output[key] = resolved;\n }\n }\n return output;\n }\n return value;\n}\n"],"mappings":";;;kBAA4D;AAI5D,SAAS,uBAAuB,OAAuB;AACrD,QAAO,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,iBAAiB,IAAI,CAAC,QAAQ,YAAY,GAAG;;AAGzF,SAAgB,0BAA0B,aAAqB,UAA0B;AAGvF,QAAO,aAFuB,uBAAuB,YAEZ,CAAC,GADf,uBAAuB,SACa;;AAGjE,SAAgB,+BAA+B,aAAqB,UAA4C;AAC9G,QAAO,EACL,eAAe;EACb,UAAU,0BAA0B,aAAa,SAAS;EAC1D;EACD,EACF;;AAGH,SAAgB,2BAA2B,OAAmD;AAC5F,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;CAET,MAAM,MAAO,MAAkC;AAC/C,QAAO,QACL,OACE,OAAO,QAAQ,YACf,CAAC,MAAM,QAAQ,IAAI,IACnB,OAAQ,IAAgC,aAAa,YACrD,OAAQ,IAAgC,aAAa,SACxD;;AAGH,eAAsB,qBACpB,YACA,OACA,WAAW,IAAI,oBAAoB,EACpB;AACf,MAAK,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE,EAAE;EACnD,MAAM,WAAW,MAAM,UAAU,OAAO;EACxC,MAAM,gBAAgB,OAAO,aAAa,YAAY,SAAS,MAAM,CAAC,WAAW,YAAY,GACzF,+BAA+B,SAAS,GACxC;AACJ,MAAI,OAAO,kBAAkB,YAAY,cAAc,MAAM,CAAC,WAAW,EACvE;AAEF,QAAM,SAAS,WAAW,0BAA0B,WAAW,IAAI,OAAO,IAAI,EAAE,cAAc,MAAM,EAAE,EACpG,aAAa,WACd,CAAC;;;AAIN,eAAe,uBACb,WACA,UAC6B;AAE7B,QAAO,MADa,SAAS,cAAc,UAAU,cAAc,SAAS,IAC5D,KAAA;;AAGlB,eAAsB,iCACpB,OACA,WAAW,IAAI,oBAAoB,EACjB;AAClB,KAAI,2BAA2B,MAAM,CACnC,QAAO,uBAAuB,OAAO,SAAS;AAEhD,KAAI,MAAM,QAAQ,MAAM,CAEtB,SAAO,MADa,QAAQ,IAAI,MAAM,KAAK,SAAS,iCAAiC,MAAM,SAAS,CAAC,CAAC,EACzF,QAAQ,SAAS,SAAS,KAAA,EAAU;AAEnD,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAiC,EAAE;GAC3E,MAAM,WAAW,MAAM,iCAAiC,OAAO,SAAS;AACxE,OAAI,aAAa,KAAA,EACf,QAAO,OAAO;;AAGlB,SAAO;;AAET,QAAO"}
@@ -0,0 +1,15 @@
1
+ export type ConnectorSetupSecretRequest = {
2
+ ref: string;
3
+ key: string;
4
+ label?: string;
5
+ createdAt: number;
6
+ expiresAt: number;
7
+ };
8
+ export declare function createConnectorSetupSecretRequest(params: {
9
+ key: string;
10
+ label?: string;
11
+ }): ConnectorSetupSecretRequest;
12
+ export declare function submitConnectorSetupSecret(ref: string, value: string): boolean;
13
+ export declare function resolveConnectorSetupSecretRef(ref: string): string | undefined;
14
+ export declare function consumeConnectorSetupSecretRef(ref: string): string | undefined;
15
+ export declare function sweepExpiredConnectorSetupSecrets(): number;
@@ -0,0 +1,64 @@
1
+ import crypto from "node:crypto";
2
+ //#region src/connectors/setup-secrets.ts
3
+ const REQUEST_TIMEOUT_MS = 300 * 1e3;
4
+ const IDLE_TTL_MS = 900 * 1e3;
5
+ const pendingSecrets = /* @__PURE__ */ new Map();
6
+ function nowMs() {
7
+ return Date.now();
8
+ }
9
+ function createSecretRef() {
10
+ return `secret://${crypto.randomBytes(6).toString("hex")}`;
11
+ }
12
+ function createConnectorSetupSecretRequest(params) {
13
+ sweepExpiredConnectorSetupSecrets();
14
+ const createdAt = nowMs();
15
+ const request = {
16
+ ref: createSecretRef(),
17
+ key: params.key,
18
+ label: params.label,
19
+ createdAt,
20
+ expiresAt: createdAt + REQUEST_TIMEOUT_MS,
21
+ lastTouchedAt: createdAt
22
+ };
23
+ pendingSecrets.set(request.ref, request);
24
+ return {
25
+ ref: request.ref,
26
+ key: request.key,
27
+ label: request.label,
28
+ createdAt: request.createdAt,
29
+ expiresAt: request.expiresAt
30
+ };
31
+ }
32
+ function submitConnectorSetupSecret(ref, value) {
33
+ sweepExpiredConnectorSetupSecrets();
34
+ const entry = pendingSecrets.get(ref.trim());
35
+ if (!entry || entry.expiresAt < nowMs() || typeof value !== "string" || value.length === 0) return false;
36
+ entry.value = value;
37
+ entry.lastTouchedAt = nowMs();
38
+ return true;
39
+ }
40
+ function resolveConnectorSetupSecretRef(ref) {
41
+ sweepExpiredConnectorSetupSecrets();
42
+ const entry = pendingSecrets.get(ref.trim());
43
+ if (!entry?.value) return void 0;
44
+ entry.lastTouchedAt = nowMs();
45
+ return entry.value;
46
+ }
47
+ function consumeConnectorSetupSecretRef(ref) {
48
+ const value = resolveConnectorSetupSecretRef(ref);
49
+ if (value !== void 0) pendingSecrets.delete(ref.trim());
50
+ return value;
51
+ }
52
+ function sweepExpiredConnectorSetupSecrets() {
53
+ const now = nowMs();
54
+ let removed = 0;
55
+ for (const [ref, entry] of pendingSecrets) if (entry.expiresAt < now || entry.lastTouchedAt + IDLE_TTL_MS < now) {
56
+ pendingSecrets.delete(ref);
57
+ removed += 1;
58
+ }
59
+ return removed;
60
+ }
61
+ //#endregion
62
+ export { consumeConnectorSetupSecretRef, createConnectorSetupSecretRequest, resolveConnectorSetupSecretRef, submitConnectorSetupSecret, sweepExpiredConnectorSetupSecrets };
63
+
64
+ //# sourceMappingURL=setup-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-secrets.js","names":[],"sources":["../../../src/connectors/setup-secrets.ts"],"sourcesContent":["import crypto from 'node:crypto';\n\nconst REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst IDLE_TTL_MS = 15 * 60 * 1000;\n\nexport type ConnectorSetupSecretRequest = {\n ref: string;\n key: string;\n label?: string;\n createdAt: number;\n expiresAt: number;\n};\n\ntype PendingSecret = ConnectorSetupSecretRequest & {\n value?: string;\n lastTouchedAt: number;\n};\n\nconst pendingSecrets = new Map<string, PendingSecret>();\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction createSecretRef(): string {\n return `secret://${crypto.randomBytes(6).toString('hex')}`;\n}\n\nexport function createConnectorSetupSecretRequest(params: { key: string; label?: string }): ConnectorSetupSecretRequest {\n sweepExpiredConnectorSetupSecrets();\n const createdAt = nowMs();\n const request: PendingSecret = {\n ref: createSecretRef(),\n key: params.key,\n label: params.label,\n createdAt,\n expiresAt: createdAt + REQUEST_TIMEOUT_MS,\n lastTouchedAt: createdAt,\n };\n pendingSecrets.set(request.ref, request);\n return { ref: request.ref, key: request.key, label: request.label, createdAt: request.createdAt, expiresAt: request.expiresAt };\n}\n\nexport function submitConnectorSetupSecret(ref: string, value: string): boolean {\n sweepExpiredConnectorSetupSecrets();\n const entry = pendingSecrets.get(ref.trim());\n if (!entry || entry.expiresAt < nowMs() || typeof value !== 'string' || value.length === 0) {\n return false;\n }\n entry.value = value;\n entry.lastTouchedAt = nowMs();\n return true;\n}\n\nexport function resolveConnectorSetupSecretRef(ref: string): string | undefined {\n sweepExpiredConnectorSetupSecrets();\n const entry = pendingSecrets.get(ref.trim());\n if (!entry?.value) return undefined;\n entry.lastTouchedAt = nowMs();\n return entry.value;\n}\n\nexport function consumeConnectorSetupSecretRef(ref: string): string | undefined {\n const value = resolveConnectorSetupSecretRef(ref);\n if (value !== undefined) {\n pendingSecrets.delete(ref.trim());\n }\n return value;\n}\n\nexport function sweepExpiredConnectorSetupSecrets(): number {\n const now = nowMs();\n let removed = 0;\n for (const [ref, entry] of pendingSecrets) {\n if (entry.expiresAt < now || entry.lastTouchedAt + IDLE_TTL_MS < now) {\n pendingSecrets.delete(ref);\n removed += 1;\n }\n }\n return removed;\n}\n"],"mappings":";;AAEA,MAAM,qBAAqB,MAAS;AACpC,MAAM,cAAc,MAAU;AAe9B,MAAM,iCAAiB,IAAI,KAA4B;AAEvD,SAAS,QAAgB;AACvB,QAAO,KAAK,KAAK;;AAGnB,SAAS,kBAA0B;AACjC,QAAO,YAAY,OAAO,YAAY,EAAE,CAAC,SAAS,MAAM;;AAG1D,SAAgB,kCAAkC,QAAsE;AACtH,oCAAmC;CACnC,MAAM,YAAY,OAAO;CACzB,MAAM,UAAyB;EAC7B,KAAK,iBAAiB;EACtB,KAAK,OAAO;EACZ,OAAO,OAAO;EACd;EACA,WAAW,YAAY;EACvB,eAAe;EAChB;AACD,gBAAe,IAAI,QAAQ,KAAK,QAAQ;AACxC,QAAO;EAAE,KAAK,QAAQ;EAAK,KAAK,QAAQ;EAAK,OAAO,QAAQ;EAAO,WAAW,QAAQ;EAAW,WAAW,QAAQ;EAAW;;AAGjI,SAAgB,2BAA2B,KAAa,OAAwB;AAC9E,oCAAmC;CACnC,MAAM,QAAQ,eAAe,IAAI,IAAI,MAAM,CAAC;AAC5C,KAAI,CAAC,SAAS,MAAM,YAAY,OAAO,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EACvF,QAAO;AAET,OAAM,QAAQ;AACd,OAAM,gBAAgB,OAAO;AAC7B,QAAO;;AAGT,SAAgB,+BAA+B,KAAiC;AAC9E,oCAAmC;CACnC,MAAM,QAAQ,eAAe,IAAI,IAAI,MAAM,CAAC;AAC5C,KAAI,CAAC,OAAO,MAAO,QAAO,KAAA;AAC1B,OAAM,gBAAgB,OAAO;AAC7B,QAAO,MAAM;;AAGf,SAAgB,+BAA+B,KAAiC;CAC9E,MAAM,QAAQ,+BAA+B,IAAI;AACjD,KAAI,UAAU,KAAA,EACZ,gBAAe,OAAO,IAAI,MAAM,CAAC;AAEnC,QAAO;;AAGT,SAAgB,oCAA4C;CAC1D,MAAM,MAAM,OAAO;CACnB,IAAI,UAAU;AACd,MAAK,MAAM,CAAC,KAAK,UAAU,eACzB,KAAI,MAAM,YAAY,OAAO,MAAM,gBAAgB,cAAc,KAAK;AACpE,iBAAe,OAAO,IAAI;AAC1B,aAAW;;AAGf,QAAO"}
@@ -0,0 +1,15 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export type ConnectorSupervisorOptions = {
3
+ getConfig: () => Config;
4
+ saveConfig: (config: Config) => Promise<{
5
+ saved: boolean;
6
+ error?: string;
7
+ }>;
8
+ intervalMs?: number;
9
+ initialDelayMs?: number;
10
+ };
11
+ export type ConnectorSupervisor = {
12
+ runNow(): Promise<void>;
13
+ stop(): void;
14
+ };
15
+ export declare function startConnectorSupervisor(options: ConnectorSupervisorOptions): ConnectorSupervisor;
@@ -0,0 +1,73 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { recordConnectorHealthUsage } from "./usage.js";
4
+ import { listConnectorInstances } from "./instances.js";
5
+ import { testConnectorInstance } from "./health.js";
6
+ //#region src/connectors/supervisor.ts
7
+ init_logger();
8
+ const log = createLogger("Connectors:Supervisor");
9
+ function resolveIntervalMs(input) {
10
+ const env = Number(process.env.XOPC_CONNECTOR_SUPERVISOR_INTERVAL_MS ?? "");
11
+ return Math.max(1e4, Math.min(input ?? (Number.isFinite(env) && env > 0 ? env : 6e4), 30 * 6e4));
12
+ }
13
+ function startConnectorSupervisor(options) {
14
+ const intervalMs = resolveIntervalMs(options.intervalMs);
15
+ let timer = null;
16
+ let running = false;
17
+ let stopped = false;
18
+ async function runNow() {
19
+ if (running || stopped) return;
20
+ running = true;
21
+ const config = options.getConfig();
22
+ let changed = false;
23
+ try {
24
+ const instances = listConnectorInstances(config).filter((instance) => instance.enabled);
25
+ for (const instance of instances) {
26
+ if (instance.materialized.type !== "mcp") continue;
27
+ try {
28
+ const result = await testConnectorInstance(config, instance.materialized.serverId);
29
+ recordConnectorHealthUsage(config, instance.instanceId, result);
30
+ changed = true;
31
+ if (!result.ok) log.warn({
32
+ instanceId: instance.instanceId,
33
+ status: result.status,
34
+ errorMessage: result.error
35
+ }, `Connector health check failed: ${result.status}`);
36
+ } catch (error) {
37
+ const errorMessage = error instanceof Error ? error.message : String(error);
38
+ log.warn({
39
+ instanceId: instance.instanceId,
40
+ errorMessage
41
+ }, `Connector supervisor check failed: ${errorMessage}`);
42
+ }
43
+ }
44
+ if (changed) {
45
+ const saved = await options.saveConfig(config);
46
+ if (!saved.saved) log.warn({ errorMessage: saved.error }, `Connector supervisor could not save health state: ${saved.error}`);
47
+ }
48
+ } finally {
49
+ running = false;
50
+ }
51
+ }
52
+ const initialDelayMs = options.initialDelayMs ?? 15e3;
53
+ timer = setTimeout(() => {
54
+ runNow();
55
+ timer = setInterval(() => void runNow(), intervalMs);
56
+ }, Math.max(0, initialDelayMs));
57
+ timer.unref?.();
58
+ return {
59
+ runNow,
60
+ stop() {
61
+ stopped = true;
62
+ if (timer) {
63
+ clearTimeout(timer);
64
+ clearInterval(timer);
65
+ timer = null;
66
+ }
67
+ }
68
+ };
69
+ }
70
+ //#endregion
71
+ export { startConnectorSupervisor };
72
+
73
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","names":[],"sources":["../../../src/connectors/supervisor.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { createLogger } from '../utils/logger.js';\nimport { testConnectorInstance } from './health.js';\nimport { listConnectorInstances } from './instances.js';\nimport { recordConnectorHealthUsage } from './usage.js';\n\nconst log = createLogger('Connectors:Supervisor');\n\nexport type ConnectorSupervisorOptions = {\n getConfig: () => Config;\n saveConfig: (config: Config) => Promise<{ saved: boolean; error?: string }>;\n intervalMs?: number;\n initialDelayMs?: number;\n};\n\nexport type ConnectorSupervisor = {\n runNow(): Promise<void>;\n stop(): void;\n};\n\nfunction resolveIntervalMs(input?: number): number {\n const env = Number(process.env.XOPC_CONNECTOR_SUPERVISOR_INTERVAL_MS ?? '');\n const value = input ?? (Number.isFinite(env) && env > 0 ? env : 60_000);\n return Math.max(10_000, Math.min(value, 30 * 60_000));\n}\n\nexport function startConnectorSupervisor(options: ConnectorSupervisorOptions): ConnectorSupervisor {\n const intervalMs = resolveIntervalMs(options.intervalMs);\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let stopped = false;\n\n async function runNow(): Promise<void> {\n if (running || stopped) return;\n running = true;\n const config = options.getConfig();\n let changed = false;\n try {\n const instances = listConnectorInstances(config).filter((instance) => instance.enabled);\n for (const instance of instances) {\n if (instance.materialized.type !== 'mcp') continue;\n try {\n const result = await testConnectorInstance(config, instance.materialized.serverId);\n recordConnectorHealthUsage(config, instance.instanceId, result);\n changed = true;\n if (!result.ok) {\n log.warn(\n { instanceId: instance.instanceId, status: result.status, errorMessage: result.error },\n `Connector health check failed: ${result.status}`,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ instanceId: instance.instanceId, errorMessage }, `Connector supervisor check failed: ${errorMessage}`);\n }\n }\n if (changed) {\n const saved = await options.saveConfig(config);\n if (!saved.saved) {\n log.warn({ errorMessage: saved.error }, `Connector supervisor could not save health state: ${saved.error}`);\n }\n }\n } finally {\n running = false;\n }\n }\n\n const initialDelayMs = options.initialDelayMs ?? 15_000;\n timer = setTimeout(() => {\n void runNow();\n timer = setInterval(() => void runNow(), intervalMs);\n }, Math.max(0, initialDelayMs));\n timer.unref?.();\n\n return {\n runNow,\n stop() {\n stopped = true;\n if (timer) {\n clearTimeout(timer);\n clearInterval(timer);\n timer = null;\n }\n },\n };\n}\n"],"mappings":";;;;;;aACkD;AAKlD,MAAM,MAAM,aAAa,wBAAwB;AAcjD,SAAS,kBAAkB,OAAwB;CACjD,MAAM,MAAM,OAAO,QAAQ,IAAI,yCAAyC,GAAG;AAE3E,QAAO,KAAK,IAAI,KAAQ,KAAK,IADf,UAAU,OAAO,SAAS,IAAI,IAAI,MAAM,IAAI,MAAM,MACxB,KAAK,IAAO,CAAC;;AAGvD,SAAgB,yBAAyB,SAA0D;CACjG,MAAM,aAAa,kBAAkB,QAAQ,WAAW;CACxD,IAAI,QAA+B;CACnC,IAAI,UAAU;CACd,IAAI,UAAU;CAEd,eAAe,SAAwB;AACrC,MAAI,WAAW,QAAS;AACxB,YAAU;EACV,MAAM,SAAS,QAAQ,WAAW;EAClC,IAAI,UAAU;AACd,MAAI;GACF,MAAM,YAAY,uBAAuB,OAAO,CAAC,QAAQ,aAAa,SAAS,QAAQ;AACvF,QAAK,MAAM,YAAY,WAAW;AAChC,QAAI,SAAS,aAAa,SAAS,MAAO;AAC1C,QAAI;KACF,MAAM,SAAS,MAAM,sBAAsB,QAAQ,SAAS,aAAa,SAAS;AAClF,gCAA2B,QAAQ,SAAS,YAAY,OAAO;AAC/D,eAAU;AACV,SAAI,CAAC,OAAO,GACV,KAAI,KACF;MAAE,YAAY,SAAS;MAAY,QAAQ,OAAO;MAAQ,cAAc,OAAO;MAAO,EACtF,kCAAkC,OAAO,SAC1C;aAEI,OAAO;KACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAI,KAAK;MAAE,YAAY,SAAS;MAAY;MAAc,EAAE,sCAAsC,eAAe;;;AAGrH,OAAI,SAAS;IACX,MAAM,QAAQ,MAAM,QAAQ,WAAW,OAAO;AAC9C,QAAI,CAAC,MAAM,MACT,KAAI,KAAK,EAAE,cAAc,MAAM,OAAO,EAAE,qDAAqD,MAAM,QAAQ;;YAGvG;AACR,aAAU;;;CAId,MAAM,iBAAiB,QAAQ,kBAAkB;AACjD,SAAQ,iBAAiB;AAClB,UAAQ;AACb,UAAQ,kBAAkB,KAAK,QAAQ,EAAE,WAAW;IACnD,KAAK,IAAI,GAAG,eAAe,CAAC;AAC/B,OAAM,SAAS;AAEf,QAAO;EACL;EACA,OAAO;AACL,aAAU;AACV,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,kBAAc,MAAM;AACpB,YAAQ;;;EAGb"}
@@ -1,4 +1,4 @@
1
- export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'extension' | 'builtin';
1
+ export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'extension' | 'builtin' | 'composio' | 'nativeTool' | 'memorySource';
2
2
  export type ConnectorCategory = 'code' | 'docs' | 'browser' | 'data' | 'automation' | 'custom';
3
3
  export type ConnectorCapability = 'tools' | 'resources' | 'prompts' | 'context' | 'channel' | 'events' | 'ui' | 'memory_source' | 'workflows' | 'auth.apiKey' | 'auth.oauth' | 'runtime.mcp.stdio' | 'runtime.mcp.sse' | 'runtime.mcp.streamableHttp';
4
4
  export type ConnectorAuthMode = 'none' | 'apiKey' | 'oauth';
@@ -27,6 +27,19 @@ export type ConnectorRuntimeDefinition = {
27
27
  type: 'mcp';
28
28
  serverId: string;
29
29
  serverTemplate: Record<string, unknown>;
30
+ } | {
31
+ type: 'channel';
32
+ channelId: string;
33
+ pluginId: string;
34
+ } | {
35
+ type: 'composio';
36
+ toolkit: string;
37
+ } | {
38
+ type: 'nativeTool';
39
+ toolsetId: string;
40
+ } | {
41
+ type: 'memorySource';
42
+ sourceKind: string;
30
43
  };
31
44
  export type ConnectorDefinition = {
32
45
  id: string;
@@ -72,16 +85,23 @@ export type ConnectorInstance = {
72
85
  connectorId: string;
73
86
  displayName: string;
74
87
  enabled: boolean;
75
- status: 'installed' | 'not_configured' | 'failed' | 'disabled';
88
+ status: 'installed' | 'not_configured' | 'failed' | 'disabled' | 'connecting' | 'connected' | 'unauthorized' | 'degraded';
89
+ connectionStatus?: 'unknown' | 'disconnected' | 'connecting' | 'connected' | 'unauthorized' | 'error' | 'disabled';
90
+ authStatus?: 'unknown' | 'none' | 'connected' | 'missing' | 'expired' | 'unauthorized';
91
+ lastConnectedAt?: string;
92
+ lastError?: string;
76
93
  secretStatus: Record<string, boolean>;
77
94
  materialized: {
78
95
  type: 'mcp';
79
96
  serverId: string;
97
+ } | {
98
+ type: 'channel' | 'composio' | 'nativeTool' | 'memorySource';
99
+ id: string;
80
100
  };
81
101
  usage: ConnectorUsageRecord;
82
102
  audit: ConnectorAuditRecord[];
83
103
  };
84
- export type ConnectorHealthStatus = 'ok' | 'server_not_found' | 'missing_secret' | 'startup_failed' | 'tools_list_failed' | 'timeout' | 'network_failed' | 'unknown_error';
104
+ export type ConnectorHealthStatus = 'ok' | 'server_not_found' | 'missing_secret' | 'startup_failed' | 'tools_list_failed' | 'timeout' | 'network_failed' | 'unauthorized' | 'disabled' | 'unknown_error';
85
105
  export type ConnectorHealthResult = {
86
106
  serverId: string;
87
107
  ok: boolean;
@@ -118,4 +138,8 @@ export type ManagedConnectorMarker = {
118
138
  managed: true;
119
139
  connectorId: string;
120
140
  version: string;
141
+ enabled?: boolean;
142
+ lastConnectedAt?: string;
143
+ lastError?: string;
144
+ displayName?: string;
121
145
  };
@@ -49,13 +49,18 @@ function appendConnectorAuditRecord(config, instanceId, record) {
49
49
  function recordConnectorHealthUsage(config, instanceId, result) {
50
50
  const marker = getManagedConnectorMarker(config, instanceId);
51
51
  if (!marker) return;
52
+ const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
52
53
  marker.usage = {
53
- lastHealthCheckAt: (/* @__PURE__ */ new Date()).toISOString(),
54
+ lastHealthCheckAt: checkedAt,
54
55
  lastHealthStatus: result.status,
55
56
  lastToolCount: result.toolCount,
56
57
  lastResourceCount: result.resourceCount,
57
58
  lastPromptCount: result.promptCount
58
59
  };
60
+ if (result.ok) {
61
+ marker.lastConnectedAt = checkedAt;
62
+ delete marker.lastError;
63
+ } else if (result.error) marker.lastError = result.error;
59
64
  appendConnectorAuditRecord(config, instanceId, {
60
65
  action: "health_check",
61
66
  status: result.status,
@@ -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 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"}
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 const checkedAt = new Date().toISOString();\n marker.usage = {\n lastHealthCheckAt: checkedAt,\n lastHealthStatus: result.status,\n lastToolCount: result.toolCount,\n lastResourceCount: result.resourceCount,\n lastPromptCount: result.promptCount,\n } satisfies ConnectorUsageRecord;\n if (result.ok) {\n marker.lastConnectedAt = checkedAt;\n delete marker.lastError;\n } else if (result.error) {\n marker.lastError = result.error;\n }\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;CAEF,MAAM,6BAAY,IAAI,MAAM,EAAC,aAAa;AAC1C,QAAO,QAAQ;EACb,mBAAmB;EACnB,kBAAkB,OAAO;EACzB,eAAe,OAAO;EACtB,mBAAmB,OAAO;EAC1B,iBAAiB,OAAO;EACzB;AACD,KAAI,OAAO,IAAI;AACb,SAAO,kBAAkB;AACzB,SAAO,OAAO;YACL,OAAO,MAChB,QAAO,YAAY,OAAO;AAE5B,4BAA2B,QAAQ,YAAY;EAC7C,QAAQ;EACR,QAAQ,OAAO;EACf,IAAI,OAAO;EACX,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,aAAa,OAAO;EACrB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
2
1
  import { describeSchedule } from "./schedule.js";
3
2
  import { getCronPayloadText } from "./job-content.js";
3
+ import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
4
4
  import { DefaultJobExecutor } from "./executor.js";
5
5
  import { CronRunLogStore } from "./run-log-store.js";
6
6
  import { CronService } from "./service.js";
@@ -2,10 +2,10 @@ import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
2
2
  import { buildSessionKey, init_session_key } from "../routing/session-key.js";
3
3
  import { createLogger } from "../utils/logger/index.js";
4
4
  import { init_logger } from "../utils/logger.js";
5
+ import { computeNextRunAtMs, describeSchedule, timerDelayUntil } from "./schedule.js";
5
6
  import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
6
7
  import { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs } from "../storage/sqlite/cron-job-repository.js";
7
8
  import "../storage/sqlite/index.js";
8
- import { computeNextRunAtMs, describeSchedule, timerDelayUntil } from "./schedule.js";
9
9
  import { DefaultJobExecutor } from "./executor.js";
10
10
  import { CronRunLogStore } from "./run-log-store.js";
11
11
  import { randomUUID } from "node:crypto";