@canhta/dsh-autopilot 0.1.0-alpha.1
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.
- package/AGENTS.md +41 -0
- package/CONTEXT.md +39 -0
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/cordis.patch.yml +13 -0
- package/deploy/dsh-autopilot.service +26 -0
- package/docs/CONTRIBUTING.md +60 -0
- package/docs/README.md +34 -0
- package/docs/agents/domain.md +7 -0
- package/docs/agents/issue-tracker.md +21 -0
- package/docs/agents/triage-labels.md +13 -0
- package/docs/assets/banner.png +0 -0
- package/docs/deployment.md +138 -0
- package/docs/engineering.md +43 -0
- package/docs/specs/execution.md +65 -0
- package/docs/specs/integrations.md +89 -0
- package/docs/specs/lifecycle.md +81 -0
- package/docs/specs/operations.md +89 -0
- package/docs/specs/plugin.md +49 -0
- package/docs/specs/providers.md +62 -0
- package/docs/specs/scope.md +35 -0
- package/docs/specs/ui-components.md +96 -0
- package/docs/specs/web-ui.md +64 -0
- package/lib/admission/cancellation-control.d.ts +11 -0
- package/lib/admission/cancellation-control.js +72 -0
- package/lib/admission/cancellation-control.js.map +1 -0
- package/lib/admission/candidates.d.ts +2 -0
- package/lib/admission/candidates.js +23 -0
- package/lib/admission/candidates.js.map +1 -0
- package/lib/admission/composition-claim.d.ts +10 -0
- package/lib/admission/composition-claim.js +13 -0
- package/lib/admission/composition-claim.js.map +1 -0
- package/lib/admission/constants.d.ts +12 -0
- package/lib/admission/constants.js +13 -0
- package/lib/admission/constants.js.map +1 -0
- package/lib/admission/deliveries.d.ts +6 -0
- package/lib/admission/deliveries.js +175 -0
- package/lib/admission/deliveries.js.map +1 -0
- package/lib/admission/delivery-control.d.ts +28 -0
- package/lib/admission/delivery-control.js +294 -0
- package/lib/admission/delivery-control.js.map +1 -0
- package/lib/admission/execution-control.d.ts +29 -0
- package/lib/admission/execution-control.js +177 -0
- package/lib/admission/execution-control.js.map +1 -0
- package/lib/admission/index.d.ts +4 -0
- package/lib/admission/index.js +4 -0
- package/lib/admission/index.js.map +1 -0
- package/lib/admission/model.d.ts +296 -0
- package/lib/admission/model.js +13 -0
- package/lib/admission/model.js.map +1 -0
- package/lib/admission/pause-control.d.ts +44 -0
- package/lib/admission/pause-control.js +220 -0
- package/lib/admission/pause-control.js.map +1 -0
- package/lib/admission/policy.d.ts +39 -0
- package/lib/admission/policy.js +238 -0
- package/lib/admission/policy.js.map +1 -0
- package/lib/admission/ports.d.ts +13 -0
- package/lib/admission/ports.js +2 -0
- package/lib/admission/ports.js.map +1 -0
- package/lib/admission/publication-control.d.ts +16 -0
- package/lib/admission/publication-control.js +153 -0
- package/lib/admission/publication-control.js.map +1 -0
- package/lib/admission/reconciler.d.ts +7 -0
- package/lib/admission/reconciler.js +121 -0
- package/lib/admission/reconciler.js.map +1 -0
- package/lib/admission/resume-control.d.ts +27 -0
- package/lib/admission/resume-control.js +213 -0
- package/lib/admission/resume-control.js.map +1 -0
- package/lib/admission/run-fence.d.ts +11 -0
- package/lib/admission/run-fence.js +49 -0
- package/lib/admission/run-fence.js.map +1 -0
- package/lib/admission/service.d.ts +130 -0
- package/lib/admission/service.js +415 -0
- package/lib/admission/service.js.map +1 -0
- package/lib/admission/state-domain.d.ts +11 -0
- package/lib/admission/state-domain.js +33 -0
- package/lib/admission/state-domain.js.map +1 -0
- package/lib/admission/state-integrity.d.ts +19 -0
- package/lib/admission/state-integrity.js +102 -0
- package/lib/admission/state-integrity.js.map +1 -0
- package/lib/admission/state-migration.d.ts +4 -0
- package/lib/admission/state-migration.js +46 -0
- package/lib/admission/state-migration.js.map +1 -0
- package/lib/admission/state.d.ts +4524 -0
- package/lib/admission/state.js +394 -0
- package/lib/admission/state.js.map +1 -0
- package/lib/admission.d.ts +1 -0
- package/lib/admission.js +2 -0
- package/lib/admission.js.map +1 -0
- package/lib/client-types/client/OperationsAtoms.d.ts +30 -0
- package/lib/client-types/client/OperationsPanel.d.ts +34 -0
- package/lib/client-types/client/RunsView.d.ts +14 -0
- package/lib/client-types/client/SettingsCapabilitySections.d.ts +16 -0
- package/lib/client-types/client/SettingsPanel.d.ts +40 -0
- package/lib/client-types/client/SettingsPolicySections.d.ts +13 -0
- package/lib/client-types/client/SettingsProviderSection.d.ts +21 -0
- package/lib/client-types/client/SummaryView.d.ts +10 -0
- package/lib/client-types/client/WorktreesView.d.ts +9 -0
- package/lib/client-types/client/index.d.ts +9 -0
- package/lib/client-types/client/locales/en.d.ts +154 -0
- package/lib/client-types/client/locales/index.d.ts +9 -0
- package/lib/client-types/client/locales/zh.d.ts +155 -0
- package/lib/client-types/client/settings-draft.d.ts +29 -0
- package/lib/client-types/client/state.d.ts +63 -0
- package/lib/client-types/code-host/index.d.ts +2 -0
- package/lib/client-types/code-host/model.d.ts +118 -0
- package/lib/client-types/code-host/registry.d.ts +23 -0
- package/lib/client-types/code-host/validation.d.ts +51 -0
- package/lib/client-types/code-host.d.ts +2 -0
- package/lib/client-types/config/index.d.ts +2 -0
- package/lib/client-types/config/settings.d.ts +51 -0
- package/lib/client-types/config.d.ts +2 -0
- package/lib/client-types/notification/index.d.ts +2 -0
- package/lib/client-types/notification/model.d.ts +57 -0
- package/lib/client-types/notification/registry.d.ts +16 -0
- package/lib/client-types/notification.d.ts +2 -0
- package/lib/client-types/providers/generation-registry.d.ts +20 -0
- package/lib/client-types/remote.d.ts +65 -0
- package/lib/client-types/tracker/index.d.ts +2 -0
- package/lib/client-types/tracker/model.d.ts +222 -0
- package/lib/client-types/tracker/registry.d.ts +49 -0
- package/lib/client-types/tracker/validation.d.ts +60 -0
- package/lib/client-types/tracker.d.ts +2 -0
- package/lib/client-types/web/contract.d.ts +958 -0
- package/lib/client.js +7961 -0
- package/lib/client.js.map +1 -0
- package/lib/code-host/index.d.ts +2 -0
- package/lib/code-host/index.js +3 -0
- package/lib/code-host/index.js.map +1 -0
- package/lib/code-host/model.d.ts +118 -0
- package/lib/code-host/model.js +23 -0
- package/lib/code-host/model.js.map +1 -0
- package/lib/code-host/registry.d.ts +23 -0
- package/lib/code-host/registry.js +90 -0
- package/lib/code-host/registry.js.map +1 -0
- package/lib/code-host/validation.d.ts +51 -0
- package/lib/code-host/validation.js +30 -0
- package/lib/code-host/validation.js.map +1 -0
- package/lib/code-host.d.ts +2 -0
- package/lib/code-host.js +3 -0
- package/lib/code-host.js.map +1 -0
- package/lib/config/index.d.ts +2 -0
- package/lib/config/index.js +3 -0
- package/lib/config/index.js.map +1 -0
- package/lib/config/settings.d.ts +51 -0
- package/lib/config/settings.js +195 -0
- package/lib/config/settings.js.map +1 -0
- package/lib/config.d.ts +2 -0
- package/lib/config.js +3 -0
- package/lib/config.js.map +1 -0
- package/lib/delivery/index.d.ts +1 -0
- package/lib/delivery/index.js +2 -0
- package/lib/delivery/index.js.map +1 -0
- package/lib/delivery/service.d.ts +29 -0
- package/lib/delivery/service.js +140 -0
- package/lib/delivery/service.js.map +1 -0
- package/lib/delivery.d.ts +2 -0
- package/lib/delivery.js +3 -0
- package/lib/delivery.js.map +1 -0
- package/lib/dispatch/composition.d.ts +18 -0
- package/lib/dispatch/composition.js +109 -0
- package/lib/dispatch/composition.js.map +1 -0
- package/lib/dispatch/contract.d.ts +2 -0
- package/lib/dispatch/contract.js +2 -0
- package/lib/dispatch/contract.js.map +1 -0
- package/lib/dispatch/execute.d.ts +10 -0
- package/lib/dispatch/execute.js +138 -0
- package/lib/dispatch/execute.js.map +1 -0
- package/lib/dispatch/execution-state.d.ts +12 -0
- package/lib/dispatch/execution-state.js +24 -0
- package/lib/dispatch/execution-state.js.map +1 -0
- package/lib/dispatch/git.d.ts +5 -0
- package/lib/dispatch/git.js +95 -0
- package/lib/dispatch/git.js.map +1 -0
- package/lib/dispatch/index.d.ts +2 -0
- package/lib/dispatch/index.js +2 -0
- package/lib/dispatch/index.js.map +1 -0
- package/lib/dispatch/report.d.ts +11 -0
- package/lib/dispatch/report.js +141 -0
- package/lib/dispatch/report.js.map +1 -0
- package/lib/dispatch/resume.d.ts +17 -0
- package/lib/dispatch/resume.js +89 -0
- package/lib/dispatch/resume.js.map +1 -0
- package/lib/dispatch/service.d.ts +56 -0
- package/lib/dispatch/service.js +231 -0
- package/lib/dispatch/service.js.map +1 -0
- package/lib/dispatch/usage.d.ts +10 -0
- package/lib/dispatch/usage.js +47 -0
- package/lib/dispatch/usage.js.map +1 -0
- package/lib/dispatch.d.ts +2 -0
- package/lib/dispatch.js +3 -0
- package/lib/dispatch.js.map +1 -0
- package/lib/github-code-host.d.ts +1 -0
- package/lib/github-code-host.js +2 -0
- package/lib/github-code-host.js.map +1 -0
- package/lib/github-issues.d.ts +1 -0
- package/lib/github-issues.js +2 -0
- package/lib/github-issues.js.map +1 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.js +48 -0
- package/lib/index.js.map +1 -0
- package/lib/ingress.d.ts +2 -0
- package/lib/ingress.js +3 -0
- package/lib/ingress.js.map +1 -0
- package/lib/jira.d.ts +1 -0
- package/lib/jira.js +2 -0
- package/lib/jira.js.map +1 -0
- package/lib/mcp/contracts.d.ts +21 -0
- package/lib/mcp/contracts.js +33 -0
- package/lib/mcp/contracts.js.map +1 -0
- package/lib/mcp/cursor.d.ts +10 -0
- package/lib/mcp/cursor.js +68 -0
- package/lib/mcp/cursor.js.map +1 -0
- package/lib/mcp/definition.d.ts +8 -0
- package/lib/mcp/definition.js +43 -0
- package/lib/mcp/definition.js.map +1 -0
- package/lib/mcp/index.d.ts +6 -0
- package/lib/mcp/index.js +7 -0
- package/lib/mcp/index.js.map +1 -0
- package/lib/mcp/json.d.ts +4 -0
- package/lib/mcp/json.js +20 -0
- package/lib/mcp/json.js.map +1 -0
- package/lib/mcp/mount.d.ts +17 -0
- package/lib/mcp/mount.js +79 -0
- package/lib/mcp/mount.js.map +1 -0
- package/lib/mcp/read-tools.d.ts +27 -0
- package/lib/mcp/read-tools.js +149 -0
- package/lib/mcp/read-tools.js.map +1 -0
- package/lib/notification/index.d.ts +2 -0
- package/lib/notification/index.js +3 -0
- package/lib/notification/index.js.map +1 -0
- package/lib/notification/model.d.ts +57 -0
- package/lib/notification/model.js +20 -0
- package/lib/notification/model.js.map +1 -0
- package/lib/notification/registry.d.ts +16 -0
- package/lib/notification/registry.js +67 -0
- package/lib/notification/registry.js.map +1 -0
- package/lib/notification.d.ts +2 -0
- package/lib/notification.js +3 -0
- package/lib/notification.js.map +1 -0
- package/lib/ntfy-notification.d.ts +1 -0
- package/lib/ntfy-notification.js +2 -0
- package/lib/ntfy-notification.js.map +1 -0
- package/lib/operations/cleanup-inspector.d.ts +16 -0
- package/lib/operations/cleanup-inspector.js +132 -0
- package/lib/operations/cleanup-inspector.js.map +1 -0
- package/lib/operations/cleanup.d.ts +25 -0
- package/lib/operations/cleanup.js +151 -0
- package/lib/operations/cleanup.js.map +1 -0
- package/lib/operations/disposition.d.ts +46 -0
- package/lib/operations/disposition.js +89 -0
- package/lib/operations/disposition.js.map +1 -0
- package/lib/operations/health.d.ts +6 -0
- package/lib/operations/health.js +41 -0
- package/lib/operations/health.js.map +1 -0
- package/lib/operations/index.d.ts +6 -0
- package/lib/operations/index.js +7 -0
- package/lib/operations/index.js.map +1 -0
- package/lib/operations/inspection.d.ts +35 -0
- package/lib/operations/inspection.js +183 -0
- package/lib/operations/inspection.js.map +1 -0
- package/lib/operations/model.d.ts +77 -0
- package/lib/operations/model.js +2 -0
- package/lib/operations/model.js.map +1 -0
- package/lib/operations/recovery.d.ts +11 -0
- package/lib/operations/recovery.js +101 -0
- package/lib/operations/recovery.js.map +1 -0
- package/lib/operations/retention.d.ts +28 -0
- package/lib/operations/retention.js +105 -0
- package/lib/operations/retention.js.map +1 -0
- package/lib/operations/runtime-owner.d.ts +54 -0
- package/lib/operations/runtime-owner.js +281 -0
- package/lib/operations/runtime-owner.js.map +1 -0
- package/lib/operations/service.d.ts +55 -0
- package/lib/operations/service.js +154 -0
- package/lib/operations/service.js.map +1 -0
- package/lib/operations/state.d.ts +79 -0
- package/lib/operations/state.js +51 -0
- package/lib/operations/state.js.map +1 -0
- package/lib/operations/storage-composition.d.ts +16 -0
- package/lib/operations/storage-composition.js +61 -0
- package/lib/operations/storage-composition.js.map +1 -0
- package/lib/operations/store.d.ts +16 -0
- package/lib/operations/store.js +84 -0
- package/lib/operations/store.js.map +1 -0
- package/lib/operations.d.ts +2 -0
- package/lib/operations.js +3 -0
- package/lib/operations.js.map +1 -0
- package/lib/providers/generation-registry.d.ts +20 -0
- package/lib/providers/generation-registry.js +72 -0
- package/lib/providers/generation-registry.js.map +1 -0
- package/lib/providers/github-code-host/contracts.d.ts +224 -0
- package/lib/providers/github-code-host/contracts.js +144 -0
- package/lib/providers/github-code-host/contracts.js.map +1 -0
- package/lib/providers/github-code-host/index.d.ts +2 -0
- package/lib/providers/github-code-host/index.js +2 -0
- package/lib/providers/github-code-host/index.js.map +1 -0
- package/lib/providers/github-code-host/provider.d.ts +5 -0
- package/lib/providers/github-code-host/provider.js +289 -0
- package/lib/providers/github-code-host/provider.js.map +1 -0
- package/lib/providers/github-code-host/schemas.d.ts +81 -0
- package/lib/providers/github-code-host/schemas.js +39 -0
- package/lib/providers/github-code-host/schemas.js.map +1 -0
- package/lib/providers/github-code-host/settings.d.ts +16 -0
- package/lib/providers/github-code-host/settings.js +65 -0
- package/lib/providers/github-code-host/settings.js.map +1 -0
- package/lib/providers/github-issues/contracts.d.ts +151 -0
- package/lib/providers/github-issues/contracts.js +141 -0
- package/lib/providers/github-issues/contracts.js.map +1 -0
- package/lib/providers/github-issues/index.d.ts +1 -0
- package/lib/providers/github-issues/index.js +2 -0
- package/lib/providers/github-issues/index.js.map +1 -0
- package/lib/providers/github-issues/ingress.d.ts +8 -0
- package/lib/providers/github-issues/ingress.js +80 -0
- package/lib/providers/github-issues/ingress.js.map +1 -0
- package/lib/providers/github-issues/normalization.d.ts +11 -0
- package/lib/providers/github-issues/normalization.js +115 -0
- package/lib/providers/github-issues/normalization.js.map +1 -0
- package/lib/providers/github-issues/provider.d.ts +6 -0
- package/lib/providers/github-issues/provider.js +235 -0
- package/lib/providers/github-issues/provider.js.map +1 -0
- package/lib/providers/github-issues/schemas.d.ts +123 -0
- package/lib/providers/github-issues/schemas.js +58 -0
- package/lib/providers/github-issues/schemas.js.map +1 -0
- package/lib/providers/github-issues/settings.d.ts +27 -0
- package/lib/providers/github-issues/settings.js +154 -0
- package/lib/providers/github-issues/settings.js.map +1 -0
- package/lib/providers/jira/contracts.d.ts +193 -0
- package/lib/providers/jira/contracts.js +133 -0
- package/lib/providers/jira/contracts.js.map +1 -0
- package/lib/providers/jira/index.d.ts +1 -0
- package/lib/providers/jira/index.js +2 -0
- package/lib/providers/jira/index.js.map +1 -0
- package/lib/providers/jira/ingress.d.ts +4 -0
- package/lib/providers/jira/ingress.js +60 -0
- package/lib/providers/jira/ingress.js.map +1 -0
- package/lib/providers/jira/normalization.d.ts +8 -0
- package/lib/providers/jira/normalization.js +121 -0
- package/lib/providers/jira/normalization.js.map +1 -0
- package/lib/providers/jira/provider.d.ts +6 -0
- package/lib/providers/jira/provider.js +317 -0
- package/lib/providers/jira/provider.js.map +1 -0
- package/lib/providers/jira/schemas.d.ts +134 -0
- package/lib/providers/jira/schemas.js +76 -0
- package/lib/providers/jira/schemas.js.map +1 -0
- package/lib/providers/jira/settings.d.ts +32 -0
- package/lib/providers/jira/settings.js +163 -0
- package/lib/providers/jira/settings.js.map +1 -0
- package/lib/providers/notification-http.d.ts +13 -0
- package/lib/providers/notification-http.js +136 -0
- package/lib/providers/notification-http.js.map +1 -0
- package/lib/providers/ntfy-notification/index.d.ts +2 -0
- package/lib/providers/ntfy-notification/index.js +2 -0
- package/lib/providers/ntfy-notification/index.js.map +1 -0
- package/lib/providers/ntfy-notification/provider.d.ts +4 -0
- package/lib/providers/ntfy-notification/provider.js +89 -0
- package/lib/providers/ntfy-notification/provider.js.map +1 -0
- package/lib/providers/ntfy-notification/settings.d.ts +12 -0
- package/lib/providers/ntfy-notification/settings.js +34 -0
- package/lib/providers/ntfy-notification/settings.js.map +1 -0
- package/lib/providers/webhook-notification/index.d.ts +2 -0
- package/lib/providers/webhook-notification/index.js +2 -0
- package/lib/providers/webhook-notification/index.js.map +1 -0
- package/lib/providers/webhook-notification/provider.d.ts +4 -0
- package/lib/providers/webhook-notification/provider.js +57 -0
- package/lib/providers/webhook-notification/provider.js.map +1 -0
- package/lib/providers/webhook-notification/settings.d.ts +11 -0
- package/lib/providers/webhook-notification/settings.js +31 -0
- package/lib/providers/webhook-notification/settings.js.map +1 -0
- package/lib/publication/git.d.ts +7 -0
- package/lib/publication/git.js +154 -0
- package/lib/publication/git.js.map +1 -0
- package/lib/publication/index.d.ts +1 -0
- package/lib/publication/index.js +2 -0
- package/lib/publication/index.js.map +1 -0
- package/lib/publication/service.d.ts +27 -0
- package/lib/publication/service.js +166 -0
- package/lib/publication/service.js.map +1 -0
- package/lib/publication.d.ts +2 -0
- package/lib/publication.js +3 -0
- package/lib/publication.js.map +1 -0
- package/lib/reconciliation/index.d.ts +3 -0
- package/lib/reconciliation/index.js +4 -0
- package/lib/reconciliation/index.js.map +1 -0
- package/lib/reconciliation/ingress.d.ts +21 -0
- package/lib/reconciliation/ingress.js +168 -0
- package/lib/reconciliation/ingress.js.map +1 -0
- package/lib/reconciliation/service.d.ts +75 -0
- package/lib/reconciliation/service.js +228 -0
- package/lib/reconciliation/service.js.map +1 -0
- package/lib/reconciliation.d.ts +2 -0
- package/lib/reconciliation.js +3 -0
- package/lib/reconciliation.js.map +1 -0
- package/lib/remote.d.ts +65 -0
- package/lib/remote.js +135 -0
- package/lib/remote.js.map +1 -0
- package/lib/tracker/index.d.ts +2 -0
- package/lib/tracker/index.js +3 -0
- package/lib/tracker/index.js.map +1 -0
- package/lib/tracker/model.d.ts +222 -0
- package/lib/tracker/model.js +66 -0
- package/lib/tracker/model.js.map +1 -0
- package/lib/tracker/registry.d.ts +49 -0
- package/lib/tracker/registry.js +213 -0
- package/lib/tracker/registry.js.map +1 -0
- package/lib/tracker/validation.d.ts +60 -0
- package/lib/tracker/validation.js +52 -0
- package/lib/tracker/validation.js.map +1 -0
- package/lib/tracker.d.ts +2 -0
- package/lib/tracker.js +3 -0
- package/lib/tracker.js.map +1 -0
- package/lib/typert.d.ts +1 -0
- package/lib/typert.js +2 -0
- package/lib/typert.js.map +1 -0
- package/lib/web/commands.d.ts +18 -0
- package/lib/web/commands.js +231 -0
- package/lib/web/commands.js.map +1 -0
- package/lib/web/contract.d.ts +958 -0
- package/lib/web/contract.js +230 -0
- package/lib/web/contract.js.map +1 -0
- package/lib/web/contributions.d.ts +41 -0
- package/lib/web/contributions.js +61 -0
- package/lib/web/contributions.js.map +1 -0
- package/lib/web/integrations.d.ts +13 -0
- package/lib/web/integrations.js +95 -0
- package/lib/web/integrations.js.map +1 -0
- package/lib/web/projection.d.ts +10 -0
- package/lib/web/projection.js +192 -0
- package/lib/web/projection.js.map +1 -0
- package/lib/web/service.d.ts +31 -0
- package/lib/web/service.js +141 -0
- package/lib/web/service.js.map +1 -0
- package/lib/web.d.ts +5 -0
- package/lib/web.js +6 -0
- package/lib/web.js.map +1 -0
- package/lib/webhook-notification.d.ts +1 -0
- package/lib/webhook-notification.js +2 -0
- package/lib/webhook-notification.js.map +1 -0
- package/lib/workflow/index.d.ts +1 -0
- package/lib/workflow/index.js +2 -0
- package/lib/workflow/index.js.map +1 -0
- package/lib/workflow/service.d.ts +31 -0
- package/lib/workflow/service.js +220 -0
- package/lib/workflow/service.js.map +1 -0
- package/lib/workflow.d.ts +2 -0
- package/lib/workflow.js +3 -0
- package/lib/workflow.js.map +1 -0
- package/package.json +276 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Require a zero-argument object input before binding an MCP identity operation. */
|
|
2
|
+
export function hasNoArgumentObjectInput(definition) {
|
|
3
|
+
const properties = definition.parameters.properties;
|
|
4
|
+
const required = definition.parameters.required;
|
|
5
|
+
return (definition.parameters.type === 'object' &&
|
|
6
|
+
isRecord(properties) &&
|
|
7
|
+
(required === undefined || (Array.isArray(required) && required.length === 0)));
|
|
8
|
+
}
|
|
9
|
+
/** Check the top-level shape used by a pinned MCP operation contract. */
|
|
10
|
+
export function hasInputShape(definition, requiredNames, propertyTypes) {
|
|
11
|
+
const required = definition.parameters.required;
|
|
12
|
+
return (definition.parameters.type === 'object' &&
|
|
13
|
+
Array.isArray(required) &&
|
|
14
|
+
requiredNames.every((name) => required.includes(name)) &&
|
|
15
|
+
isRecord(definition.parameters.properties) &&
|
|
16
|
+
Object.entries(propertyTypes).every(([name, type]) => property(definition, name)?.type === type));
|
|
17
|
+
}
|
|
18
|
+
export function propertyEnumIncludes(definition, name, value) {
|
|
19
|
+
const values = property(definition, name)?.enum;
|
|
20
|
+
return Array.isArray(values) && values.includes(value);
|
|
21
|
+
}
|
|
22
|
+
export function arrayItemsAreStrings(definition, name) {
|
|
23
|
+
return arrayItems(definition, name)?.type === 'string';
|
|
24
|
+
}
|
|
25
|
+
export function arrayItemEnumIncludes(definition, name, value) {
|
|
26
|
+
const values = arrayItems(definition, name)?.enum;
|
|
27
|
+
return Array.isArray(values) && values.includes(value);
|
|
28
|
+
}
|
|
29
|
+
function arrayItems(definition, name) {
|
|
30
|
+
const items = property(definition, name)?.items;
|
|
31
|
+
return isRecord(items) ? items : undefined;
|
|
32
|
+
}
|
|
33
|
+
function property(definition, name) {
|
|
34
|
+
const properties = definition.parameters.properties;
|
|
35
|
+
if (!isRecord(properties))
|
|
36
|
+
return undefined;
|
|
37
|
+
const value = properties[name];
|
|
38
|
+
return isRecord(value) ? value : undefined;
|
|
39
|
+
}
|
|
40
|
+
function isRecord(value) {
|
|
41
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/mcp/definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { defineMcpContracts, exactMcpToolName, type McpContract, type McpContractInput, type McpContractMap, type McpContractOutput, type McpResult, } from './contracts.js';
|
|
2
|
+
export { createMcpTraversalCursorCodec, type McpTraversalCursor } from './cursor.js';
|
|
3
|
+
export { arrayItemEnumIncludes, arrayItemsAreStrings, hasInputShape, hasNoArgumentObjectInput, propertyEnumIncludes, } from './definition.js';
|
|
4
|
+
export { decodeMcpJson } from './json.js';
|
|
5
|
+
export { type McpTrackerMountOptions, mountMcpTracker } from './mount.js';
|
|
6
|
+
export { type McpErrorFactory, McpOperationError, type McpOperationErrorCode, type McpTools, type ResolvedMcpTools, resolveMcpTools, } from './read-tools.js';
|
package/lib/mcp/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { defineMcpContracts, exactMcpToolName, } from './contracts.js';
|
|
2
|
+
export { createMcpTraversalCursorCodec } from './cursor.js';
|
|
3
|
+
export { arrayItemEnumIncludes, arrayItemsAreStrings, hasInputShape, hasNoArgumentObjectInput, propertyEnumIncludes, } from './definition.js';
|
|
4
|
+
export { decodeMcpJson } from './json.js';
|
|
5
|
+
export { mountMcpTracker } from './mount.js';
|
|
6
|
+
export { McpOperationError, resolveMcpTools, } from './read-tools.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GAMjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,6BAA6B,EAA2B,MAAM,aAAa,CAAA;AACpF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAA+B,eAAe,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAEL,iBAAiB,EAIjB,eAAe,GAChB,MAAM,iBAAiB,CAAA"}
|
package/lib/mcp/json.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Decode one machine-readable MCP result without treating prose or mixed content as data. */
|
|
2
|
+
export function decodeMcpJson(result, schema) {
|
|
3
|
+
const candidate = result.structuredContent ?? parseSingleJsonText(result.content);
|
|
4
|
+
return schema.parse(candidate);
|
|
5
|
+
}
|
|
6
|
+
function parseSingleJsonText(content) {
|
|
7
|
+
if (content.length !== 1)
|
|
8
|
+
throw new TypeError('expected one MCP JSON text block');
|
|
9
|
+
const [block] = content;
|
|
10
|
+
if (typeof block !== 'object' ||
|
|
11
|
+
block === null ||
|
|
12
|
+
!Object.hasOwn(block, 'type') ||
|
|
13
|
+
!Object.hasOwn(block, 'text') ||
|
|
14
|
+
block.type !== 'text' ||
|
|
15
|
+
typeof block.text !== 'string') {
|
|
16
|
+
throw new TypeError('expected one MCP JSON text block');
|
|
17
|
+
}
|
|
18
|
+
return JSON.parse(block.text);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/mcp/json.ts"],"names":[],"mappings":"AAGA,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAI,MAAiB,EAAE,MAAoB;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjF,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA2B;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;IACjF,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;IACvB,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;QAC7B,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;QAC5B,KAA4B,CAAC,IAAI,KAAK,MAAM;QAC7C,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,EACtD,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAE,KAA0B,CAAC,IAAI,CAAY,CAAA;AAChE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { SettingsScope } from '@deepseek-ai/dsh-settings';
|
|
3
|
+
import type { TrackerProvider } from '../tracker.js';
|
|
4
|
+
import type { McpContractMap } from './contracts.js';
|
|
5
|
+
import { type McpTools } from './read-tools.js';
|
|
6
|
+
interface RequiredMcpToolset<Contracts extends McpContractMap> {
|
|
7
|
+
readonly serverName: string;
|
|
8
|
+
readonly contracts: Contracts;
|
|
9
|
+
}
|
|
10
|
+
export interface McpTrackerMountOptions<Settings, Contracts extends McpContractMap> {
|
|
11
|
+
readonly settings: SettingsScope<Settings>;
|
|
12
|
+
requiredToolset(settings: Readonly<Settings>): RequiredMcpToolset<Contracts>;
|
|
13
|
+
createProvider(settings: Readonly<Settings>, tools: McpTools<Contracts>): TrackerProvider;
|
|
14
|
+
}
|
|
15
|
+
/** Keep one tracker generation registered exactly while its Settings snapshot and required MCP tools remain current. */
|
|
16
|
+
export declare function mountMcpTracker<Settings, Contracts extends McpContractMap>(ctx: Context, options: McpTrackerMountOptions<Settings, Contracts>): Promise<() => Promise<void>>;
|
|
17
|
+
export {};
|
package/lib/mcp/mount.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
2
|
+
import { TrackerProviderError } from '../tracker.js';
|
|
3
|
+
import { resolveMcpTools } from './read-tools.js';
|
|
4
|
+
/** Keep one tracker generation registered exactly while its Settings snapshot and required MCP tools remain current. */
|
|
5
|
+
export async function mountMcpTracker(ctx, options) {
|
|
6
|
+
let active;
|
|
7
|
+
let revision = 0;
|
|
8
|
+
let stopped = false;
|
|
9
|
+
let queue = Promise.resolve();
|
|
10
|
+
const reconcile = async (requestedRevision) => {
|
|
11
|
+
if (stopped)
|
|
12
|
+
return;
|
|
13
|
+
let settings;
|
|
14
|
+
let required;
|
|
15
|
+
let resolved;
|
|
16
|
+
try {
|
|
17
|
+
settings = structuredClone(options.settings.get());
|
|
18
|
+
required = options.requiredToolset(settings);
|
|
19
|
+
resolved = resolveMcpTools(ctx, required.serverName, required.contracts, (code, message) => new TrackerProviderError(code, message));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
await withdraw();
|
|
23
|
+
ctx.logger.warn('autopilot MCP tracker configuration is invalid; provider remains unavailable');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (resolved !== undefined &&
|
|
27
|
+
active !== undefined &&
|
|
28
|
+
isDeepStrictEqual(active.settings, settings) &&
|
|
29
|
+
active.resolved.sameDefinitions(resolved)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
await withdraw();
|
|
33
|
+
if (stopped || requestedRevision !== revision || resolved === undefined || !resolved.isCurrent())
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
const provider = options.createProvider(settings, resolved.tools);
|
|
37
|
+
const disposeProvider = ctx.tracker.register(provider);
|
|
38
|
+
if (stopped || requestedRevision !== revision || !resolved.isCurrent()) {
|
|
39
|
+
await disposeProvider();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
active = { settings, resolved, disposeProvider };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
ctx.logger.warn('autopilot MCP tracker provider could not be activated');
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const withdraw = async () => {
|
|
49
|
+
const current = active;
|
|
50
|
+
active = undefined;
|
|
51
|
+
if (current !== undefined)
|
|
52
|
+
await current.disposeProvider();
|
|
53
|
+
};
|
|
54
|
+
const schedule = () => {
|
|
55
|
+
const requestedRevision = ++revision;
|
|
56
|
+
queue = queue
|
|
57
|
+
.then(() => reconcile(requestedRevision))
|
|
58
|
+
.catch(() => {
|
|
59
|
+
ctx.logger.warn('autopilot MCP tracker reconciliation failed; provider remains unavailable');
|
|
60
|
+
});
|
|
61
|
+
return queue;
|
|
62
|
+
};
|
|
63
|
+
const stopSettingsWatch = options.settings.watch(() => schedule());
|
|
64
|
+
const stopToolsWatch = ctx.on('tools/change', () => {
|
|
65
|
+
void schedule();
|
|
66
|
+
});
|
|
67
|
+
await schedule();
|
|
68
|
+
return async () => {
|
|
69
|
+
if (stopped)
|
|
70
|
+
return;
|
|
71
|
+
stopped = true;
|
|
72
|
+
revision += 1;
|
|
73
|
+
stopSettingsWatch();
|
|
74
|
+
stopToolsWatch();
|
|
75
|
+
await queue;
|
|
76
|
+
await withdraw();
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/mcp/mount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
3
|
+
import { type McpContractInput, type McpContractMap, type McpContractOutput } from './contracts.js';
|
|
4
|
+
interface BoundContract {
|
|
5
|
+
readonly definition: ToolDefinition;
|
|
6
|
+
readonly publicName: string;
|
|
7
|
+
}
|
|
8
|
+
declare const boundDefinitions: unique symbol;
|
|
9
|
+
/** A generation-fenced view that exposes only the provider's declared semantic operations. */
|
|
10
|
+
export interface McpTools<Contracts extends McpContractMap> {
|
|
11
|
+
call<Operation extends keyof Contracts>(operation: Operation, input: McpContractInput<Contracts[Operation]>, signal: AbortSignal): Promise<McpContractOutput<Contracts[Operation]>>;
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedMcpTools<Contracts extends McpContractMap> {
|
|
14
|
+
readonly tools: McpTools<Contracts>;
|
|
15
|
+
readonly [boundDefinitions]: ReadonlyMap<keyof Contracts, BoundContract>;
|
|
16
|
+
isCurrent(): boolean;
|
|
17
|
+
sameDefinitions(other: ResolvedMcpTools<Contracts>): boolean;
|
|
18
|
+
}
|
|
19
|
+
export type McpOperationErrorCode = 'authentication' | 'permission' | 'invalid-configuration' | 'invalid-response' | 'not-found' | 'conflict' | 'rate-limit' | 'timeout' | 'transient' | 'provider-unavailable';
|
|
20
|
+
export declare class McpOperationError extends Error {
|
|
21
|
+
readonly code: McpOperationErrorCode;
|
|
22
|
+
constructor(code: McpOperationErrorCode, message: string);
|
|
23
|
+
}
|
|
24
|
+
export type McpErrorFactory = (code: McpOperationErrorCode, message: string) => Error;
|
|
25
|
+
/** Bind compatible live DSH tool definitions, or return undefined while the required MCP generation is unavailable. */
|
|
26
|
+
export declare function resolveMcpTools<Contracts extends McpContractMap>(ctx: Context, serverName: string, contracts: Contracts, createError?: McpErrorFactory): ResolvedMcpTools<Contracts> | undefined;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ToolCallId } from '@deepseek-ai/dsh-llm';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { exactMcpToolName, } from './contracts.js';
|
|
4
|
+
const mcpResultSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
content: z.array(z.unknown()),
|
|
7
|
+
structuredContent: z.unknown().optional(),
|
|
8
|
+
})
|
|
9
|
+
.strict();
|
|
10
|
+
const boundDefinitions = Symbol('autopilot.mcp.bound-definitions');
|
|
11
|
+
export class McpOperationError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(code, message) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.name = 'McpOperationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Bind compatible live DSH tool definitions, or return undefined while the required MCP generation is unavailable. */
|
|
20
|
+
export function resolveMcpTools(ctx, serverName, contracts, createError = (code, message) => new McpOperationError(code, message)) {
|
|
21
|
+
const bound = new Map();
|
|
22
|
+
try {
|
|
23
|
+
for (const operation of Object.keys(contracts)) {
|
|
24
|
+
const contract = contracts[operation];
|
|
25
|
+
if (contract === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const publicName = exactMcpToolName(serverName, contract.rawName);
|
|
28
|
+
const definition = ctx.tools.get(publicName);
|
|
29
|
+
if (definition === undefined || !acceptsDefinition(contract, definition))
|
|
30
|
+
return undefined;
|
|
31
|
+
bound.set(operation, { definition, publicName });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const isCurrent = () => {
|
|
38
|
+
for (const entry of bound.values()) {
|
|
39
|
+
if (ctx.tools.get(entry.publicName) !== entry.definition)
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
};
|
|
44
|
+
const tools = {
|
|
45
|
+
async call(operation, input, signal) {
|
|
46
|
+
signal.throwIfAborted();
|
|
47
|
+
const contract = contracts[operation];
|
|
48
|
+
const entry = bound.get(operation);
|
|
49
|
+
if (contract === undefined || entry === undefined) {
|
|
50
|
+
throw createError('invalid-configuration', 'MCP operation is not declared');
|
|
51
|
+
}
|
|
52
|
+
if (ctx.tools.get(entry.publicName) !== entry.definition)
|
|
53
|
+
throw unavailable(createError);
|
|
54
|
+
let args;
|
|
55
|
+
try {
|
|
56
|
+
args = contract.encode(input);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw createError('invalid-configuration', 'MCP operation input is invalid');
|
|
60
|
+
}
|
|
61
|
+
const result = await ctx.tools.execute({
|
|
62
|
+
callId: ToolCallId(`autopilot-${crypto.randomUUID()}`),
|
|
63
|
+
name: entry.publicName,
|
|
64
|
+
arguments: args,
|
|
65
|
+
signal,
|
|
66
|
+
});
|
|
67
|
+
signal.throwIfAborted();
|
|
68
|
+
if (ctx.tools.get(entry.publicName) !== entry.definition)
|
|
69
|
+
throw unavailable(createError);
|
|
70
|
+
if (result.isError)
|
|
71
|
+
throw mapToolFailure(createError, result.error.info?.code);
|
|
72
|
+
const parsed = parseMcpResult(result.value, contract.maxResultBytes, createError);
|
|
73
|
+
try {
|
|
74
|
+
return contract.decode(parsed);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
throw createError('invalid-response', 'MCP result did not match its contract');
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
tools,
|
|
83
|
+
[boundDefinitions]: bound,
|
|
84
|
+
isCurrent,
|
|
85
|
+
sameDefinitions(other) {
|
|
86
|
+
for (const [operation, entry] of bound) {
|
|
87
|
+
if (other[boundDefinitions].get(operation)?.definition !== entry.definition)
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return other[boundDefinitions].size === bound.size;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function acceptsDefinition(contract, definition) {
|
|
95
|
+
try {
|
|
96
|
+
return contract.acceptsDefinition(definition);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function parseMcpResult(value, maxResultBytes, createError) {
|
|
103
|
+
let serialized;
|
|
104
|
+
try {
|
|
105
|
+
serialized = JSON.stringify(value);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw createError('invalid-response', 'MCP returned an invalid result');
|
|
109
|
+
}
|
|
110
|
+
if (serialized === undefined || Buffer.byteLength(serialized) > maxResultBytes) {
|
|
111
|
+
throw createError('invalid-response', 'MCP result exceeded its safety bound');
|
|
112
|
+
}
|
|
113
|
+
const parsed = mcpResultSchema.safeParse(value);
|
|
114
|
+
if (!parsed.success)
|
|
115
|
+
throw createError('invalid-response', 'MCP returned an invalid result');
|
|
116
|
+
return parsed.data;
|
|
117
|
+
}
|
|
118
|
+
function mapToolFailure(createError, code) {
|
|
119
|
+
switch (code) {
|
|
120
|
+
case 'UNKNOWN_TOOL':
|
|
121
|
+
return unavailable(createError);
|
|
122
|
+
case 'TOOL_TIMEOUT':
|
|
123
|
+
return createError('timeout', 'MCP operation timed out');
|
|
124
|
+
case 'UNAUTHENTICATED':
|
|
125
|
+
case 'UNAUTHORIZED':
|
|
126
|
+
return createError('authentication', 'MCP authentication failed');
|
|
127
|
+
case 'FORBIDDEN':
|
|
128
|
+
case 'PERMISSION_DENIED':
|
|
129
|
+
return createError('permission', 'MCP operation was denied');
|
|
130
|
+
case 'NOT_FOUND':
|
|
131
|
+
return createError('not-found', 'MCP resource was not found');
|
|
132
|
+
case 'CONFLICT':
|
|
133
|
+
return createError('conflict', 'MCP resource changed concurrently');
|
|
134
|
+
case 'RATE_LIMIT':
|
|
135
|
+
case 'RESOURCE_EXHAUSTED':
|
|
136
|
+
case 'TOO_MANY_REQUESTS':
|
|
137
|
+
return createError('rate-limit', 'MCP provider rate limit was reached');
|
|
138
|
+
case 'INVALID_ARGS':
|
|
139
|
+
return createError('invalid-configuration', 'MCP operation input was rejected');
|
|
140
|
+
case 'INVALID_TOOL_OUTPUT':
|
|
141
|
+
return createError('invalid-response', 'MCP returned an invalid result');
|
|
142
|
+
default:
|
|
143
|
+
return createError('transient', 'MCP operation failed');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function unavailable(createError) {
|
|
147
|
+
return createError('provider-unavailable', 'MCP tool generation is unavailable');
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=read-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-tools.js","sourceRoot":"","sources":["../../src/mcp/read-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notification/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
declare const notificationProviderIdBrand: unique symbol;
|
|
2
|
+
declare const notificationDestinationIdBrand: unique symbol;
|
|
3
|
+
export type NotificationProviderId = string & {
|
|
4
|
+
readonly [notificationProviderIdBrand]: true;
|
|
5
|
+
};
|
|
6
|
+
export type NotificationDestinationId = string & {
|
|
7
|
+
readonly [notificationDestinationIdBrand]: true;
|
|
8
|
+
};
|
|
9
|
+
export declare const notificationProviderId: (value: string) => NotificationProviderId;
|
|
10
|
+
export declare const notificationDestinationId: (value: string) => NotificationDestinationId;
|
|
11
|
+
export declare const NOTIFICATION_INTERFACE_VERSION: 1;
|
|
12
|
+
export interface NotificationEvent {
|
|
13
|
+
readonly version: 1;
|
|
14
|
+
readonly eventId: string;
|
|
15
|
+
readonly runId: string;
|
|
16
|
+
readonly timestamp: string;
|
|
17
|
+
readonly type: 'started' | 'blocked' | 'paused' | 'failed' | 'completed';
|
|
18
|
+
readonly issueIdentity: string;
|
|
19
|
+
readonly displayKey: string;
|
|
20
|
+
readonly summary: string;
|
|
21
|
+
readonly actionNeeded?: string | undefined;
|
|
22
|
+
readonly runUrl: string;
|
|
23
|
+
readonly issueUrl: string;
|
|
24
|
+
readonly pullRequestUrl?: string | undefined;
|
|
25
|
+
readonly usage: {
|
|
26
|
+
readonly kind: 'provider' | 'estimate' | 'unknown';
|
|
27
|
+
readonly tokens?: number | undefined;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface NotificationReceipt {
|
|
31
|
+
readonly receiptId: string;
|
|
32
|
+
readonly receivedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface NotificationProviderRequest {
|
|
35
|
+
readonly destinationId: NotificationDestinationId;
|
|
36
|
+
readonly event: NotificationEvent;
|
|
37
|
+
readonly signal: AbortSignal;
|
|
38
|
+
}
|
|
39
|
+
export interface NotificationProvider {
|
|
40
|
+
readonly id: NotificationProviderId;
|
|
41
|
+
readonly interfaceVersion: typeof NOTIFICATION_INTERFACE_VERSION;
|
|
42
|
+
readonly displayName: string;
|
|
43
|
+
readonly configurationNamespace: string;
|
|
44
|
+
reconcile(request: NotificationProviderRequest): Promise<NotificationReceipt | undefined>;
|
|
45
|
+
deliver(request: NotificationProviderRequest): Promise<NotificationReceipt>;
|
|
46
|
+
}
|
|
47
|
+
export interface NotificationSender {
|
|
48
|
+
reconcile(destinationId: NotificationDestinationId, event: NotificationEvent, signal?: AbortSignal): Promise<NotificationReceipt | undefined>;
|
|
49
|
+
deliver(destinationId: NotificationDestinationId, event: NotificationEvent, signal?: AbortSignal): Promise<NotificationReceipt>;
|
|
50
|
+
}
|
|
51
|
+
export type NotificationProviderErrorCode = 'authentication' | 'permission' | 'invalid-configuration' | 'permanent-rejection' | 'rate-limit' | 'timeout' | 'transient' | 'ambiguous-acknowledgement' | 'invalid-response' | 'provider-unavailable';
|
|
52
|
+
export declare class NotificationProviderError extends Error {
|
|
53
|
+
readonly code: NotificationProviderErrorCode;
|
|
54
|
+
readonly retryAfterMs?: number | undefined;
|
|
55
|
+
constructor(code: NotificationProviderErrorCode, message: string, retryAfterMs?: number | undefined);
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const ID_PATTERN = /^[a-z0-9][a-z0-9._:-]{0,255}$/;
|
|
2
|
+
function opaqueId(kind, value) {
|
|
3
|
+
if (!ID_PATTERN.test(value))
|
|
4
|
+
throw new TypeError(`${kind} must match ${String(ID_PATTERN)}`);
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
export const notificationProviderId = (value) => opaqueId('notification provider id', value);
|
|
8
|
+
export const notificationDestinationId = (value) => opaqueId('notification destination id', value);
|
|
9
|
+
export const NOTIFICATION_INTERFACE_VERSION = 1;
|
|
10
|
+
export class NotificationProviderError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
retryAfterMs;
|
|
13
|
+
constructor(code, message, retryAfterMs) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.retryAfterMs = retryAfterMs;
|
|
17
|
+
this.name = 'NotificationProviderError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/notification/model.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,GAAG,+BAA+B,CAAA;AAElD,SAAS,QAAQ,CAAmB,IAAY,EAAE,KAAa;IAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,eAAe,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC5F,OAAO,KAAU,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAA0B,EAAE,CAC9E,QAAQ,CAAyB,0BAA0B,EAAE,KAAK,CAAC,CAAA;AACrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAA6B,EAAE,CACpF,QAAQ,CAA4B,6BAA6B,EAAE,KAAK,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAU,CAAA;AA+DxD,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAEvC,IAAI;IAEJ,YAAY;IAHvB,YACW,IAAmC,EAC5C,OAAe,EACN,YAAqB;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;oBAJL,IAAI;4BAEJ,YAAY;QAGrB,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
2
|
+
import { type NotificationProvider, type NotificationProviderId, type NotificationSender } from './model.js';
|
|
3
|
+
declare module '@deepseek-ai/cordis' {
|
|
4
|
+
interface Context {
|
|
5
|
+
notifications: Notifications;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Registry for independently loaded notification transports; it stores no destinations, secrets, or delivery state. */
|
|
9
|
+
export declare class Notifications extends Service {
|
|
10
|
+
private readonly providers;
|
|
11
|
+
constructor(ctx: Context);
|
|
12
|
+
register(provider: NotificationProvider): () => Promise<void>;
|
|
13
|
+
withProvider<T>(id: NotificationProviderId, operation: (sender: NotificationSender) => Promise<T>): Promise<T>;
|
|
14
|
+
private invoke;
|
|
15
|
+
}
|
|
16
|
+
export default Notifications;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { GenerationRegistry } from '../providers/generation-registry.js';
|
|
4
|
+
import { NOTIFICATION_INTERFACE_VERSION, NotificationProviderError, } from './model.js';
|
|
5
|
+
const receiptSchema = z.object({
|
|
6
|
+
receiptId: z.string().min(1).max(512),
|
|
7
|
+
receivedAt: z.iso.datetime({ offset: true }),
|
|
8
|
+
});
|
|
9
|
+
/** Registry for independently loaded notification transports; it stores no destinations, secrets, or delivery state. */
|
|
10
|
+
export class Notifications extends Service {
|
|
11
|
+
providers = new GenerationRegistry();
|
|
12
|
+
constructor(ctx) {
|
|
13
|
+
super(ctx, 'notifications');
|
|
14
|
+
}
|
|
15
|
+
register(provider) {
|
|
16
|
+
if (provider.interfaceVersion !== NOTIFICATION_INTERFACE_VERSION) {
|
|
17
|
+
throw new TypeError(`notification provider "${provider.id}" uses interface version ${String(provider.interfaceVersion)}; expected ${String(NOTIFICATION_INTERFACE_VERSION)}`);
|
|
18
|
+
}
|
|
19
|
+
if (this.providers.has(provider.id))
|
|
20
|
+
throw new Error(`notification provider "${provider.id}" is already registered`);
|
|
21
|
+
return this.providers.register(provider.id, provider);
|
|
22
|
+
}
|
|
23
|
+
async withProvider(id, operation) {
|
|
24
|
+
const registered = this.providers.require(id, () => new NotificationProviderError('provider-unavailable', `notification provider "${id}" is unavailable`));
|
|
25
|
+
const sender = {
|
|
26
|
+
reconcile: (destinationId, event, signal) => this.invoke(registered, 'reconcile', destinationId, event, signal),
|
|
27
|
+
deliver: async (destinationId, event, signal) => {
|
|
28
|
+
const receipt = await this.invoke(registered, 'deliver', destinationId, event, signal);
|
|
29
|
+
if (receipt === undefined) {
|
|
30
|
+
throw new NotificationProviderError('invalid-response', 'notification provider omitted its delivery receipt');
|
|
31
|
+
}
|
|
32
|
+
return receipt;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return await this.providers.retain(registered, () => operation(sender));
|
|
36
|
+
}
|
|
37
|
+
async invoke(registered, operation, destinationId, event, callerSignal) {
|
|
38
|
+
callerSignal?.throwIfAborted();
|
|
39
|
+
const request = {
|
|
40
|
+
destinationId,
|
|
41
|
+
event: structuredClone(event),
|
|
42
|
+
signal: this.providers.signal(registered, callerSignal),
|
|
43
|
+
};
|
|
44
|
+
try {
|
|
45
|
+
const result = await registered.provider[operation](request);
|
|
46
|
+
this.providers.assertCurrent(registered, () => withdrawn(registered.provider.id, operation));
|
|
47
|
+
callerSignal?.throwIfAborted();
|
|
48
|
+
return result === undefined ? undefined : receiptSchema.parse(result);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (!registered.accepting)
|
|
52
|
+
throw withdrawn(registered.provider.id, operation);
|
|
53
|
+
callerSignal?.throwIfAborted();
|
|
54
|
+
if (error instanceof NotificationProviderError)
|
|
55
|
+
throw error;
|
|
56
|
+
if (error instanceof z.ZodError) {
|
|
57
|
+
throw new NotificationProviderError('invalid-response', 'notification provider returned an invalid receipt');
|
|
58
|
+
}
|
|
59
|
+
throw new NotificationProviderError('transient', 'notification provider delivery failed');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function withdrawn(id, operation) {
|
|
64
|
+
return new NotificationProviderError(operation === 'deliver' ? 'ambiguous-acknowledgement' : 'provider-unavailable', `notification provider "${id}" was withdrawn`);
|
|
65
|
+
}
|
|
66
|
+
export default Notifications;
|
|
67
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/notification/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './providers/ntfy-notification/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ntfy-notification.js","sourceRoot":"","sources":["../src/ntfy-notification.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { RunId } from '../admission.js';
|
|
3
|
+
import type { CleanupPreview } from './model.js';
|
|
4
|
+
import type { MaintenanceStateStore } from './store.js';
|
|
5
|
+
export declare class CleanupInspector {
|
|
6
|
+
private readonly ctx;
|
|
7
|
+
private readonly store;
|
|
8
|
+
private readonly now;
|
|
9
|
+
codeHostFailure: string | undefined;
|
|
10
|
+
constructor(ctx: Context, store: MaintenanceStateStore, now: () => number);
|
|
11
|
+
inspect(runId: RunId): Promise<{
|
|
12
|
+
preview: Omit<CleanupPreview, 'previewId'>;
|
|
13
|
+
fingerprint: string;
|
|
14
|
+
}>;
|
|
15
|
+
private observeMerged;
|
|
16
|
+
}
|