@xopcai/xopc 0.0.282 → 0.0.284

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 (184) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-iPtG94qr.js → activity-store-CwbIMGLY.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Cny5rATT.js → agent-avatar-dicebear-DjiOld-S.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-OyQ8OVZv.js → agent-defaults-settings-panel-D9qP10BK.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agents-DJeh_Ewo.js → agents-D-bkOuAl.js} +1 -1
  7. package/dist/gateway/static/root/assets/{api-KMJzMqvZ.js → api-3lphBVuY.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-ZqQKaZEI.js → app-management-settings-panel-B2nwCXxE.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-CfXsQkKO.js → appearance-settings-BXO4Ej88.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-k-QnVhKW.js → apps-page-BKwBBwJN.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-BrW53Hap.js → archive-plugin-6ZRqNjla.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-DkfFWHiS.js → attachment-load-CmPZalcW.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CfEDFYPE.js → attachment-preview-renderer-wzIchDSv.js} +4 -4
  14. package/dist/gateway/static/root/assets/attachment-process-heavy-Db4nTY5N.js +5 -0
  15. package/dist/gateway/static/root/assets/{automations-page-e-5we6kD.js → automations-page-Bc3WbK5n.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-workspace-DPnlkws1.js → automations-workspace-B2-f9qZu.js} +1 -1
  17. package/dist/gateway/static/root/assets/binary-plugins-OWR6cxpc.js +2 -0
  18. package/dist/gateway/static/root/assets/{block-editor-CfeF1OmA.js → block-editor-Ca-tDQXm.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-automation-inputs-BTIufVbM.js → browser-automation-inputs-Dxy2_p3U.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-automations-page-DnsuWKRu.js → browser-automations-page-CibQIxpi.js} +1 -1
  21. package/dist/gateway/static/root/assets/{browser-settings-page-C8xyhnxx.js → browser-settings-page-Dtn4rMeq.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capabilities-settings-panel-CBllOLTT.js → capabilities-settings-panel-DiwtR9MD.js} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-C-A-VUE2.js → channels-settings-pTdR1q1K.js} +1 -1
  24. package/dist/gateway/static/root/assets/{channels-status-swr-DMYQNs-J.js → channels-status-swr-Bh-G9mdZ.js} +1 -1
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-C_Fw1R3A.js → chat-terminal-dock-lbzbSpV3.js} +1 -1
  26. package/dist/gateway/static/root/assets/{connectors-page-CtsMo3H4.js → connectors-page-BSQ7Hs2w.js} +1 -1
  27. package/dist/gateway/static/root/assets/{date-picker-CPFxjTrN.js → date-picker-tYvbTfZT.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dependency-picker-C_5KqzjI.js → dependency-picker-B8yo7-7V.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-DLJsC5D6.js → desktop-pet-BUGkGB4-.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-BdI1iSgz.js → desktop-pet-settings-DNeVGZNp.js} +1 -1
  31. package/dist/gateway/static/root/assets/{device-pairing-wizard-BnvPLhc9.js → device-pairing-wizard-CYkT7ecp.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-BNS_TkZQ.js → extension-debug-page-CiK0QI2p.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-DMSDZ7Mb.js → extension-page-CirPNHJd.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-settings-page-CeGCWMt0.js → extension-settings-page-Baua1_Le.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-config-swr-Cpmyrr6j.js → gateway-config-swr-Co4hHe0i.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-DKOTYUma.js → gateway-settings-CzpSYWex.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-DoiPeb65.js → gateway-startup-retry-DBPNJG-e.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-settings-gsdL_Yij.js → heartbeat-settings-DTM_kYpE.js} +1 -1
  39. package/dist/gateway/static/root/assets/{home-page-CbeAdS1T.js → home-page-CSSJvdd6.js} +1 -1
  40. package/dist/gateway/static/root/assets/{image-generation-api-CqjHWl2T.js → image-generation-api-D0rMTumD.js} +1 -1
  41. package/dist/gateway/static/root/assets/imports-page-XqVVYbAp.js +1 -0
  42. package/dist/gateway/static/root/assets/{index-enFXJJCU.js → index-C9aQA4Dr.js} +10 -10
  43. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CCLtJ8s8.js → keyboard-shortcuts-settings-CMUaF61L.js} +1 -1
  44. package/dist/gateway/static/root/assets/{local-app-workbench-page-DzC6SrXj.js → local-app-workbench-page-CZSgTYuI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{local-apps-page-3LdgP3NO.js → local-apps-page-CHxyT09t.js} +1 -1
  46. package/dist/gateway/static/root/assets/{locale-store-1urrBBCQ.js → locale-store-DO6JJ1l2.js} +1 -1
  47. package/dist/gateway/static/root/assets/{logs-page-DHClKtm6.js → logs-page-z5ktnEzX.js} +1 -1
  48. package/dist/gateway/static/root/assets/{management-settings-BaCo9Nuo.js → management-settings-jXbA2S54.js} +1 -1
  49. package/dist/gateway/static/root/assets/{markdown-view-BZmcFIWa.js → markdown-view-CKInRsDh.js} +1 -1
  50. package/dist/gateway/static/root/assets/{media-plugins-BMjJppvG.js → media-plugins-BaPkSvW7.js} +1 -1
  51. package/dist/gateway/static/root/assets/messages-BgZRsCkG.js +3 -0
  52. package/dist/gateway/static/root/assets/{note-detail-panel-hYO2jNhL.js → note-detail-panel-DSaZfkna.js} +3 -3
  53. package/dist/gateway/static/root/assets/{notes-page-BT66x22W.js → notes-page-CePEyv_C.js} +1 -1
  54. package/dist/gateway/static/root/assets/{page-tabs-BCszXX_F.js → page-tabs-CdYemUOu.js} +1 -1
  55. package/dist/gateway/static/root/assets/pdf-runtime-DU_sMPjG.js +2 -0
  56. package/dist/gateway/static/root/assets/pdf.worker.min-B4E34YdZ.js +48 -0
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-CyM0sanh.js → preview-open-alternatives-DzgF1yYO.js} +1 -1
  58. package/dist/gateway/static/root/assets/{proactive-page-CVDGA5sB.js → proactive-page-Cy2Gm2f8.js} +1 -1
  59. package/dist/gateway/static/root/assets/{product-open-page-lXAbj85Z.js → product-open-page-iQ-eW6Aj.js} +1 -1
  60. package/dist/gateway/static/root/assets/{project-detail-page-Bp6TAMPM.js → project-detail-page-BliwYpns.js} +1 -1
  61. package/dist/gateway/static/root/assets/{projects-page-UhOIiDcg.js → projects-page-Dm-BqnQn.js} +1 -1
  62. package/dist/gateway/static/root/assets/{registry-api-CxQstD00.js → registry-api-DMNudT60.js} +1 -1
  63. package/dist/gateway/static/root/assets/{remote-access-hub-DJIkMFT4.js → remote-access-hub-C_XuQ9XR.js} +1 -1
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BUFCgRdZ.js → runtime-tools-settings-panel-u_wVepf7.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-B01ksA8M.js → schema-form-YdZj2xdI.js} +1 -1
  66. package/dist/gateway/static/root/assets/{sessions-page-CQOAwPDt.js → sessions-page-Drt1aS2G.js} +1 -1
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BAUd06_9.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-DvnjZBa3.js → settings-form-section-Bw6xKOX5.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-DZRkpbCh.js → settings-page-CV8kVdnE.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-DVaEiAVY.js → setup-status-panel-BHI9e5Tw.js} +1 -1
  71. package/dist/gateway/static/root/assets/share-preview-page-BHwjHlrV.js +2 -0
  72. package/dist/gateway/static/root/assets/{shares-settings-XiCqMDAe.js → shares-settings-DOAOjZBQ.js} +1 -1
  73. package/dist/gateway/static/root/assets/skill-reload-api-DU0VQpHj.js +1 -0
  74. package/dist/gateway/static/root/assets/skills-page-DRKdb6O5.js +2 -0
  75. package/dist/gateway/static/root/assets/{skills-page.utils-BryVNYll.js → skills-page.utils-DYfaLtts.js} +1 -1
  76. package/dist/gateway/static/root/assets/{system-settings-panel-mKFDe6aZ.js → system-settings-panel-CWrWpKV-.js} +1 -1
  77. package/dist/gateway/static/root/assets/{task-detail-page-Cb0RZNcJ.js → task-detail-page-DiPgMmBM.js} +1 -1
  78. package/dist/gateway/static/root/assets/{theme-store-Dc5s20V3.js → theme-store-CDc7Wqy5.js} +1 -1
  79. package/dist/gateway/static/root/assets/{tunnel-api-FcI3wKy3.js → tunnel-api-Bmsy-5Fs.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-autosave-CDgdtjTC.js → use-autosave-D-FRib85.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-model-page-Cnshc-Un.js → user-model-page-DxRaRdA0.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-Ce8cb5mN.js → voice-api-key-field-iQ7EBzII.js} +1 -1
  83. package/dist/gateway/static/root/assets/{voice-config-api-Mk78BrpP.js → voice-config-api-DNMWA2tx.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-discovery-overlay-CacFTtXe.js → work-discovery-overlay-BesuhDlH.js} +1 -1
  85. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-V-5HuEUq.js → workflow-run-setup-panel-Du81FoCy.js} +1 -1
  86. package/dist/gateway/static/root/assets/{workflows-page-1OJimIfo.js → workflows-page-CZikdgNw.js} +1 -1
  87. package/dist/gateway/static/root/index.html +9 -9
  88. package/dist/package.js +1 -1
  89. package/dist/src/agent/agent-manager.js +4 -4
  90. package/dist/src/agent/background-review/run-background-review.js +1 -1
  91. package/dist/src/agent/embedded/model-runtime.js +1 -1
  92. package/dist/src/agent/embedded/run-for-session.js +1 -1
  93. package/dist/src/agent/image/tool-model-config.js +1 -1
  94. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  95. package/dist/src/agent/service.js +2 -2
  96. package/dist/src/agent/session/session-inspector.js +1 -1
  97. package/dist/src/agent/skills/hub-lock.js +1 -1
  98. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  99. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  100. package/dist/src/ai-assist/text-assist.js +1 -1
  101. package/dist/src/auth/credentials.js +2 -2
  102. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  103. package/dist/src/auth/profiles/store.js +1 -1
  104. package/dist/src/auth/sync-provider-auth.js +2 -2
  105. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  106. package/dist/src/cli/command-loaders.js +1 -0
  107. package/dist/src/cli/command-manifest.js +4 -0
  108. package/dist/src/cli/commands/agent.js +2 -2
  109. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  110. package/dist/src/cli/commands/doctor/checks/provider-auth.js +3 -3
  111. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  112. package/dist/src/cli/commands/import.d.ts +2 -0
  113. package/dist/src/cli/commands/import.js +30 -0
  114. package/dist/src/cli/commands/models.js +2 -2
  115. package/dist/src/cli/commands/onboard.js +1 -1
  116. package/dist/src/cli/commands/platform.js +1 -1
  117. package/dist/src/cli/commands/profile.js +1 -1
  118. package/dist/src/cli/commands/tunnel.js +1 -1
  119. package/dist/src/cli/commands/update.js +1 -1
  120. package/dist/src/cli/extension-cli-register.js +1 -1
  121. package/dist/src/config/index.js +5 -5
  122. package/dist/src/config/loader.js +2 -2
  123. package/dist/src/config/models-json.js +1 -1
  124. package/dist/src/extensions/lockfile.js +1 -1
  125. package/dist/src/gateway/agents-admin.js +1 -1
  126. package/dist/src/gateway/file-path-classifier.js +1 -1
  127. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  128. package/dist/src/gateway/hono/routes/imports.d.ts +3 -0
  129. package/dist/src/gateway/hono/routes/imports.js +44 -0
  130. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  131. package/dist/src/gateway/hono/routes/models.js +1 -1
  132. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  133. package/dist/src/gateway/run-loop.js +1 -1
  134. package/dist/src/gateway/service/config-coordinator.js +1 -1
  135. package/dist/src/gateway/service.js +9 -7
  136. package/dist/src/imports/compatibility.d.ts +7 -0
  137. package/dist/src/imports/compatibility.js +174 -0
  138. package/dist/src/imports/contextImport.d.ts +3 -0
  139. package/dist/src/imports/contextImport.js +56 -0
  140. package/dist/src/imports/files.d.ts +13 -0
  141. package/dist/src/imports/files.js +77 -0
  142. package/dist/src/imports/importService.d.ts +45 -0
  143. package/dist/src/imports/importService.js +417 -0
  144. package/dist/src/imports/planner.d.ts +11 -0
  145. package/dist/src/imports/planner.js +98 -0
  146. package/dist/src/imports/productImport.d.ts +10 -0
  147. package/dist/src/imports/productImport.js +148 -0
  148. package/dist/src/imports/runtime.d.ts +5 -0
  149. package/dist/src/imports/runtime.js +56 -0
  150. package/dist/src/imports/scanner.d.ts +14 -0
  151. package/dist/src/imports/scanner.js +159 -0
  152. package/dist/src/imports/secrets.d.ts +2 -0
  153. package/dist/src/imports/secrets.js +9 -0
  154. package/dist/src/imports/sources.d.ts +37 -0
  155. package/dist/src/imports/sources.js +75 -0
  156. package/dist/src/imports/types.d.ts +91 -0
  157. package/dist/src/imports/types.js +11 -0
  158. package/dist/src/knowledge-memory/repository.js +4 -2
  159. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  160. package/dist/src/providers/index.js +2 -2
  161. package/dist/src/providers/model-registry.js +1 -1
  162. package/dist/src/providers/register-runtime-providers.js +1 -1
  163. package/dist/src/storage/sqlite/import-repository.d.ts +19 -0
  164. package/dist/src/storage/sqlite/import-repository.js +35 -0
  165. package/dist/src/storage/sqlite/migrations/174_capability_imports.sql +11 -0
  166. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  167. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  168. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  169. package/dist/src/storage/sqlite/schema.js +1 -1
  170. package/dist/src/tasks/home-query-service.js +2 -2
  171. package/dist/src/tui/tui-startup-resources.js +1 -1
  172. package/dist/src/tui/tui.js +1 -1
  173. package/dist/src/work-discovery/service.js +2 -2
  174. package/dist/src/workflows/service/workflow-run-service.js +2 -2
  175. package/package.json +4 -3
  176. package/dist/gateway/static/root/assets/attachment-process-heavy-C5CqLCsX.js +0 -5
  177. package/dist/gateway/static/root/assets/binary-plugins-CWIswfXA.js +0 -2
  178. package/dist/gateway/static/root/assets/excel-worksheet-utils-DpdB-DjU.js +0 -1
  179. package/dist/gateway/static/root/assets/messages-DYFcjtmG.js +0 -3
  180. package/dist/gateway/static/root/assets/pdf.worker.min-CHFwMXne.mjs +0 -29
  181. package/dist/gateway/static/root/assets/settings-advanced-gate-CFuqbGI-.js +0 -1
  182. package/dist/gateway/static/root/assets/share-preview-page-vz0UK56q.js +0 -2
  183. package/dist/gateway/static/root/assets/skill-reload-api-C3D8WanU.js +0 -1
  184. package/dist/gateway/static/root/assets/skills-page-CxMWwR6A.js +0 -2
@@ -7,10 +7,10 @@ import { WorkflowNameConflictError, WorkflowRevisionConflictError, createWorkflo
7
7
  import "../../../workflows/domain/index.js";
8
8
  import { resolveWorkflowRunArtifactsDir } from "../../../workflows/store/paths.js";
9
9
  import { WorkflowDraftService } from "../../../workflows/draft/workflow-draft-service.js";
10
- import "../../../workflows/draft/index.js";
11
- import { ProjectWorkflowPresetRepository } from "../../../workflows/project-presets/project-workflow-preset-repository.js";
12
10
  import { WorkflowDraftConflictError, WorkflowDraftStore } from "../../../workflows/authoring/workflow-draft-store.js";
13
11
  import "../../../workflows/authoring/index.js";
12
+ import "../../../workflows/draft/index.js";
13
+ import { ProjectWorkflowPresetRepository } from "../../../workflows/project-presets/project-workflow-preset-repository.js";
14
14
  import { basename, join } from "node:path";
15
15
  import { readFile, stat } from "node:fs/promises";
16
16
  //#region src/gateway/hono/routes/workflows.ts
@@ -1,6 +1,6 @@
1
1
  import { loadConfig } from "../config/loader.js";
2
- import "../config/index.js";
3
2
  import { isRestartEnabled } from "../config/commands.flags.js";
3
+ import "../config/index.js";
4
4
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
5
5
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
6
6
  import { acquireGatewayLock } from "./lock.js";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { getModelRegistry } from "../../providers/model-registry.js";
4
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
+ import { getModelRegistry } from "../../providers/model-registry.js";
5
5
  import { init_providers } from "../../providers/index.js";
6
6
  import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
7
7
  import { reloadImageGenerationProviders } from "../../agent/image/generation/provider-registry.js";
@@ -12,19 +12,16 @@ import { getSessionConfig } from "../storage/sqlite/config-repository.js";
12
12
  import "../storage/sqlite/index.js";
13
13
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
14
14
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
15
+ import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
16
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
17
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
15
18
  import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
16
- import { prewarmModelRegistry } from "../providers/model-registry.js";
17
19
  import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
18
20
  import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
19
21
  import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service } from "../channels/catalog/channel-catalog-service.js";
20
22
  import { loadConfig, saveConfig } from "../config/loader.js";
21
- import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
22
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
23
+ import { prewarmModelRegistry } from "../providers/model-registry.js";
23
24
  import { init_providers, providers_exports } from "../providers/index.js";
24
- import { AutomationService } from "../automations/service/automation-service.js";
25
- import { onAutomationProductEvent, publishAutomationProductEvent } from "../automations/product-events.js";
26
- import "../automations/index.js";
27
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
28
25
  import { TaskRepository } from "../tasks/task-repository.js";
29
26
  import { TaskConversationRepository } from "../tasks/task-conversation-repository.js";
30
27
  import { getEmbeddedExecutionSession } from "../agent/embedded/execution-context.js";
@@ -38,6 +35,9 @@ import { ProactiveScenarioService } from "../proactive/scenarios/service.js";
38
35
  import { ProactiveEventService } from "../proactive/service.js";
39
36
  import { TaskApplicationService } from "../tasks/task-application-service.js";
40
37
  import { ProactiveInboxService } from "../proactive/inbox/service.js";
38
+ import { AutomationService } from "../automations/service/automation-service.js";
39
+ import { onAutomationProductEvent, publishAutomationProductEvent } from "../automations/product-events.js";
40
+ import "../automations/index.js";
41
41
  import { TaskOutboxDispatcher } from "../tasks/task-outbox-dispatcher.js";
42
42
  import { TaskRunDispatcher } from "../tasks/task-run-dispatcher.js";
43
43
  import { TaskSignalService } from "../tasks/task-signal-service.js";
@@ -955,6 +955,8 @@ var GatewayService = class {
955
955
  });
956
956
  log.debug("Starting gateway service...");
957
957
  openXopcDatabase();
958
+ const { recoverCapabilityImports } = await import("../imports/runtime.js");
959
+ await recoverCapabilityImports();
958
960
  this.createNotificationService().start();
959
961
  this.startTime = Date.now();
960
962
  this.running = true;
@@ -0,0 +1,7 @@
1
+ import type { ImportCandidate, ImportFile } from './types.js';
2
+ export declare function parseSkill(raw: string): {
3
+ metadata: Record<string, unknown>;
4
+ body: string;
5
+ };
6
+ export declare function inspectSkill(base: Pick<ImportCandidate, 'id' | 'source' | 'scope' | 'location' | 'shared'>, files: ImportFile[]): ImportCandidate;
7
+ export declare function inspectMcp(base: Pick<ImportCandidate, 'id' | 'source' | 'scope' | 'location' | 'shared'>, name: string, raw: unknown): ImportCandidate;
@@ -0,0 +1,174 @@
1
+ import { McpServerSchema, init_schema } from "../config/schema.js";
2
+ import { isValidSkillId } from "../agent/skills/managed-store.js";
3
+ import { containsSecret, isCredentialPath } from "./secrets.js";
4
+ import { digest, fileHash } from "./files.js";
5
+ import yaml from "js-yaml";
6
+ //#region src/imports/compatibility.ts
7
+ init_schema();
8
+ function parseSkill(raw) {
9
+ const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/.exec(raw);
10
+ if (!match || match[1].length > 64 * 1024) throw new Error("A valid YAML header is required");
11
+ if (/(?:^|\s)[&*][\w-]+/.test(match[1])) throw new Error("YAML aliases are not supported");
12
+ let metadata;
13
+ try {
14
+ metadata = yaml.load(match[1], { schema: yaml.JSON_SCHEMA });
15
+ } catch {
16
+ throw new Error("Invalid YAML header");
17
+ }
18
+ if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) throw new Error("Invalid skill metadata");
19
+ return {
20
+ metadata,
21
+ body: match[2]
22
+ };
23
+ }
24
+ function inspectSkill(base, files) {
25
+ const item = {
26
+ ...base,
27
+ kind: "skill",
28
+ name: base.id,
29
+ description: "",
30
+ files,
31
+ hash: fileHash(files),
32
+ compatibility: "compatible",
33
+ findings: [],
34
+ requiredEnv: []
35
+ };
36
+ try {
37
+ if (files.reduce((n, f) => n + Buffer.byteLength(f.data, "base64"), 0) > 15 * 1024 * 1024) throw new Error("Skill exceeds 15 MiB");
38
+ if (files.some((f) => f.path.endsWith("/SKILL.md"))) throw new Error("Nested skill scopes need separate imports");
39
+ const primary = files.find((f) => f.path === "SKILL.md");
40
+ if (!primary || Buffer.byteLength(primary.data, "base64") > 1024 * 1024) throw new Error("SKILL.md is missing or exceeds 1 MiB");
41
+ const { metadata, body } = parseSkill(Buffer.from(primary.data, "base64").toString("utf8"));
42
+ if (typeof metadata.name !== "string" || !isValidSkillId(metadata.name)) throw new Error("Skill name must be a portable identifier");
43
+ item.name = metadata.name;
44
+ if (typeof metadata.description !== "string" || !metadata.description.trim() || metadata.description.length > 1024) throw new Error("Skill description must contain 1–1024 characters");
45
+ item.description = metadata.description;
46
+ const supported = new Set([
47
+ "name",
48
+ "description",
49
+ "license",
50
+ "compatibility",
51
+ "metadata",
52
+ "disable-model-invocation",
53
+ "allowed-tools"
54
+ ]);
55
+ for (const key of Object.keys(metadata)) if (!supported.has(key)) item.findings.push(`Unsupported skill field: ${key}`);
56
+ if (metadata["disable-model-invocation"] !== void 0 && typeof metadata["disable-model-invocation"] !== "boolean") item.findings.push("disable-model-invocation must be boolean");
57
+ if (/\$ARGUMENTS|\$\{?(?:CLAUDE_|CODEX_)|!`/.test(body)) item.findings.push("Product-specific variables or command expansion require adaptation");
58
+ const meta = metadata.metadata;
59
+ if (meta && (typeof meta !== "object" || Array.isArray(meta))) item.findings.push("Invalid metadata");
60
+ if (meta && Object.keys(meta).some((k) => ![
61
+ "author",
62
+ "version",
63
+ "short-description",
64
+ "short_description",
65
+ "category",
66
+ "tags",
67
+ "license",
68
+ "homepage"
69
+ ].includes(k))) item.findings.push("Extended metadata needs manual compatibility review");
70
+ for (const match of body.matchAll(/\[[^\]]*\]\(([^)\s]+)\)/g)) {
71
+ const ref = match[1].split("#")[0];
72
+ if (ref && !/^(?:[a-z]+:|#)/i.test(ref) && !files.some((f) => f.path === ref.replace(/^\.\//, ""))) item.findings.push("A referenced local file is missing or outside the skill");
73
+ }
74
+ if (item.findings.length) item.compatibility = "blocked";
75
+ if (metadata["allowed-tools"]) item.findings.push("Source tool pre-approvals are not transferred; xopc permissions apply");
76
+ for (const file of files) if (isCredentialPath(file.path) || containsSecret(Buffer.from(file.data, "base64").toString("utf8"))) {
77
+ item.compatibility = "blocked";
78
+ item.findings.push("Possible credentials found; remove them from the source and scan again");
79
+ item.files = [];
80
+ item.description = "";
81
+ break;
82
+ }
83
+ } catch (error) {
84
+ item.compatibility = "blocked";
85
+ item.findings.push(error instanceof Error ? error.message : "Invalid skill");
86
+ }
87
+ if (files.some((f) => containsSecret(Buffer.from(f.data, "base64").toString("utf8")))) {
88
+ item.files = [];
89
+ item.description = "";
90
+ item.compatibility = "blocked";
91
+ item.findings = ["Possible credentials found; remove them and scan again"];
92
+ }
93
+ return item;
94
+ }
95
+ function inspectMcp(base, name, raw) {
96
+ const item = {
97
+ ...base,
98
+ kind: "mcp",
99
+ name,
100
+ description: "MCP connection draft",
101
+ files: [],
102
+ hash: "",
103
+ compatibility: "needs_setup",
104
+ findings: [],
105
+ requiredEnv: []
106
+ };
107
+ const value = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
108
+ const draft = {};
109
+ const supported = new Set([
110
+ "command",
111
+ "args",
112
+ "cwd",
113
+ "url",
114
+ "type",
115
+ "env",
116
+ "headers",
117
+ "http_headers",
118
+ "startup_timeout_sec",
119
+ "tool_timeout_sec"
120
+ ]);
121
+ for (const [key, v] of Object.entries(value)) {
122
+ if (!supported.has(key)) {
123
+ item.compatibility = "blocked";
124
+ item.findings.push(`Unsupported MCP field: ${key}`);
125
+ continue;
126
+ }
127
+ if ([
128
+ "env",
129
+ "headers",
130
+ "http_headers"
131
+ ].includes(key)) {
132
+ if (v && typeof v === "object") item.requiredEnv.push(...Object.keys(v));
133
+ item.findings.push(`${key} values omitted; configure them in xopc`);
134
+ } else if (key === "type") {
135
+ if (v === "http") draft.transport = "streamable-http";
136
+ else if (v === "sse") draft.transport = "sse";
137
+ else if (v !== "stdio") {
138
+ item.compatibility = "blocked";
139
+ item.findings.push("Unsupported MCP transport");
140
+ }
141
+ } else if (key === "startup_timeout_sec" || key === "tool_timeout_sec") if (typeof v === "number") draft[key === "startup_timeout_sec" ? "connectionTimeoutMs" : "requestTimeoutMs"] = v * 1e3;
142
+ else {
143
+ item.compatibility = "blocked";
144
+ item.findings.push("Invalid MCP timeout");
145
+ }
146
+ else draft[key] = v;
147
+ }
148
+ if (typeof draft.url === "string") try {
149
+ const url = new URL(draft.url);
150
+ if (url.username || url.password || url.search || url.hash) {
151
+ delete draft.url;
152
+ item.findings.push("URL credentials or query parameters omitted; enter a clean endpoint");
153
+ }
154
+ } catch {
155
+ delete draft.url;
156
+ }
157
+ if (containsSecret(JSON.stringify(draft)) || /--?[a-z-]*(?:token|password|secret|api-key|authorization)(?:[=\s\"]|$)/i.test(JSON.stringify(draft))) {
158
+ Object.keys(draft).forEach((k) => delete draft[k]);
159
+ item.findings.push("Possible credentials omitted from connection fields");
160
+ }
161
+ if (!McpServerSchema.safeParse(draft).success || !draft.command && !draft.url) {
162
+ item.compatibility = "blocked";
163
+ item.findings.push("A valid command or URL is required");
164
+ }
165
+ if (base.scope === "project") {
166
+ item.compatibility = "blocked";
167
+ item.findings.push("Project-scoped MCP activation is not supported");
168
+ }
169
+ item.mcp = draft;
170
+ item.hash = digest(draft);
171
+ return item;
172
+ }
173
+ //#endregion
174
+ export { inspectMcp, inspectSkill, parseSkill };
@@ -0,0 +1,3 @@
1
+ import type { ImportCandidate } from './types.js';
2
+ /** Small source records fit the existing retrieval budget without injecting entire documents. */
3
+ export declare function importContextDocument(item: ImportCandidate, projectId?: string): 'created' | 'unchanged' | 'kept';
@@ -0,0 +1,56 @@
1
+ import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { listKnowledgeItems, writeKnowledgeItem } from "../knowledge-memory/repository.js";
3
+ import "../knowledge-memory/index.js";
4
+ import { digest } from "./files.js";
5
+ //#region src/imports/contextImport.ts
6
+ /** Small source records fit the existing retrieval budget without injecting entire documents. */
7
+ function importContextDocument(item, projectId) {
8
+ const content = item.content?.trim();
9
+ if (!content) throw new Error("Missing context");
10
+ const scope = projectId ? {
11
+ type: "project",
12
+ id: projectId
13
+ } : { type: "global" };
14
+ const canonicalKey = `product-import:${item.source}:${digest(item.location)}`;
15
+ return runSqliteWriteTransaction(() => {
16
+ const existing = listKnowledgeItems({
17
+ canonicalKey,
18
+ scope,
19
+ statuses: [
20
+ "active",
21
+ "candidate",
22
+ "needs_review",
23
+ "stale",
24
+ "archived",
25
+ "rejected"
26
+ ]
27
+ })[0];
28
+ if (existing) return existing.source.hash === item.hash ? "unchanged" : "kept";
29
+ for (let offset = 0, part = 0; offset < content.length; offset += 2e3, part++) {
30
+ const chunk = content.slice(offset, offset + 2e3).trim();
31
+ if (!chunk) continue;
32
+ writeKnowledgeItem({
33
+ kind: "note",
34
+ scope,
35
+ content: chunk,
36
+ canonicalKey: part === 0 ? canonicalKey : `${canonicalKey}:part:${part}`,
37
+ recordClass: "source_index",
38
+ status: "active",
39
+ confidence: .7,
40
+ importance: .7,
41
+ originClass: "system",
42
+ source: {
43
+ kind: "product_import",
44
+ product: item.source,
45
+ path: item.location,
46
+ hash: item.hash,
47
+ part,
48
+ importedAt: Date.now()
49
+ }
50
+ });
51
+ }
52
+ return "created";
53
+ });
54
+ }
55
+ //#endregion
56
+ export { importContextDocument };
@@ -0,0 +1,13 @@
1
+ import { type ImportFile } from './types.js';
2
+ export declare const IMPORT_LIMITS: {
3
+ file: number;
4
+ total: number;
5
+ count: number;
6
+ depth: number;
7
+ };
8
+ export declare function digest(value: unknown): string;
9
+ export declare function fileHash(files: ImportFile[]): string;
10
+ export declare function inside(root: string, path: string): boolean;
11
+ export declare function safePath(path: string): boolean;
12
+ export declare function readRegularFile(path: string, limit?: number): Buffer;
13
+ export declare function readTree(rootPath: string): ImportFile[];
@@ -0,0 +1,77 @@
1
+ import { ImportError } from "./types.js";
2
+ import { isAbsolute, join, relative } from "node:path";
3
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, readdirSync, realpathSync } from "node:fs";
4
+ import { createHash } from "node:crypto";
5
+ //#region src/imports/files.ts
6
+ const IMPORT_LIMITS = {
7
+ file: 15 * 1024 * 1024,
8
+ total: 100 * 1024 * 1024,
9
+ count: 5e3,
10
+ depth: 16
11
+ };
12
+ function digest(value) {
13
+ return createHash("sha256").update(JSON.stringify(value)).digest("hex");
14
+ }
15
+ function fileHash(files) {
16
+ return digest([...files].sort((a, b) => a.path.localeCompare(b.path, "en")));
17
+ }
18
+ function inside(root, path) {
19
+ const rel = relative(root, path);
20
+ return rel === "" || !isAbsolute(rel) && rel !== ".." && !rel.startsWith("../") && !rel.startsWith("..\\");
21
+ }
22
+ function safePath(path) {
23
+ return !!path && !path.includes("\\") && !path.includes("\0") && !path.startsWith("/") && path.split("/").every((p) => !!p && p !== "." && p !== ".." && !/[<>:"|?*]/.test(p) && !/[. ]$/.test(p) && !/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(p));
24
+ }
25
+ function readRegularFile(path, limit = IMPORT_LIMITS.file) {
26
+ if (!lstatSync(path).isFile()) throw new ImportError("unsafe_file", "Only regular files are supported");
27
+ const fd = openSync(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
28
+ try {
29
+ const before = fstatSync(fd);
30
+ if (!before.isFile() || before.size > limit) throw new ImportError("limit_exceeded", "File exceeds import limit", 413);
31
+ const data = readFileSync(fd);
32
+ const after = fstatSync(fd);
33
+ if (data.length > limit || before.size !== after.size || before.mtimeMs !== after.mtimeMs) throw new ImportError("source_changed", "Source changed while reading", 409);
34
+ return data;
35
+ } finally {
36
+ closeSync(fd);
37
+ }
38
+ }
39
+ function readTree(rootPath) {
40
+ const root = realpathSync(rootPath);
41
+ const files = [];
42
+ let total = 0;
43
+ const names = /* @__PURE__ */ new Set();
44
+ function walk(dir, prefix, depth) {
45
+ if (depth > IMPORT_LIMITS.depth) throw new ImportError("limit_exceeded", "Directory is too deep", 413);
46
+ for (const entry of readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
47
+ if ([
48
+ ".git",
49
+ ".DS_Store",
50
+ "__MACOSX"
51
+ ].includes(entry.name)) continue;
52
+ const rel = prefix + entry.name;
53
+ if (!safePath(rel)) throw new ImportError("unsafe_file", "Unsupported file name");
54
+ const key = rel.normalize("NFC").toLowerCase();
55
+ if (names.has(key)) throw new ImportError("conflict", "File names collide on the target filesystem", 409);
56
+ names.add(key);
57
+ if (names.size > IMPORT_LIMITS.count) throw new ImportError("limit_exceeded", "Too many files", 413);
58
+ const path = join(dir, entry.name);
59
+ if (entry.isSymbolicLink() || !inside(root, realpathSync(path))) throw new ImportError("unsafe_file", "Symbolic links must be replaced with local files before importing");
60
+ if (entry.isDirectory()) walk(path, rel + "/", depth + 1);
61
+ else {
62
+ const data = readRegularFile(path);
63
+ total += data.length;
64
+ if (total > IMPORT_LIMITS.total) throw new ImportError("limit_exceeded", "Import is too large", 413);
65
+ files.push({
66
+ path: rel,
67
+ data: data.toString("base64"),
68
+ executable: (lstatSync(path).mode & 73) !== 0
69
+ });
70
+ }
71
+ }
72
+ }
73
+ walk(root, "", 0);
74
+ return files;
75
+ }
76
+ //#endregion
77
+ export { IMPORT_LIMITS, digest, fileHash, inside, readRegularFile, readTree, safePath };
@@ -0,0 +1,45 @@
1
+ import { type ScanInput } from './scanner.js';
2
+ import { type ImportAction, type ImportJob, type ImportScan, type ImportTarget } from './types.js';
3
+ export interface ImportServiceOptions {
4
+ stateDir: string;
5
+ owner: string;
6
+ validateTarget?: (target: ImportTarget) => void;
7
+ isConnected?: (candidate: ImportScan['candidates'][number]) => boolean;
8
+ reservedNames?: (target: ImportTarget) => string[];
9
+ refreshSkills?: () => void | Promise<void>;
10
+ }
11
+ export declare class ImportService {
12
+ private readonly options;
13
+ private readonly repo;
14
+ private readonly root;
15
+ constructor(options: ImportServiceOptions);
16
+ scan(input: ScanInput): ImportScan;
17
+ getScan(id: string): ImportScan;
18
+ private storeScan;
19
+ plan(scanId: string, target: ImportTarget, choices: Array<Pick<ImportAction, 'candidateId' | 'operation'> & {
20
+ name?: string;
21
+ }>): import("./types.js").ImportPlan;
22
+ importSkills(scan: ImportScan, target: ImportTarget): Promise<{
23
+ imported: number;
24
+ skipped: number;
25
+ issues: Array<{
26
+ name: string;
27
+ reason: string;
28
+ }>;
29
+ }>;
30
+ getPlan(id: string): import("./types.js").ImportPlan;
31
+ apply(planId: string, key: string): ImportJob;
32
+ private renameSkill;
33
+ getJob(id: string): ImportJob;
34
+ recoverAndClean(): Promise<void>;
35
+ history(): ImportJob[];
36
+ activate(id: string, candidateIds: string[]): Promise<ImportJob>;
37
+ private publish;
38
+ rollback(id: string, candidateIds: string[]): Promise<ImportJob>;
39
+ private trashPath;
40
+ private recover;
41
+ private targetHash;
42
+ private assertLive;
43
+ private checkSelection;
44
+ private lock;
45
+ }