@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,231 @@
|
|
|
1
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
2
|
+
import { prepareAgentComposition } from './composition.js';
|
|
3
|
+
import { executeClaimed, executeOwnedTurn } from './execute.js';
|
|
4
|
+
import { activeExecution, currentRun, isPausedActive } from './execution-state.js';
|
|
5
|
+
import { continuationPrompt } from './report.js';
|
|
6
|
+
import { preparePausedResume } from './resume.js';
|
|
7
|
+
/** Durable dispatcher composed from the Host's configured DSH Agent, preset, model, Session, and workspace services. */
|
|
8
|
+
export class Dispatch extends Service {
|
|
9
|
+
static inject = [
|
|
10
|
+
'admission',
|
|
11
|
+
'agents',
|
|
12
|
+
'agentDefaultModel',
|
|
13
|
+
'agentPresets',
|
|
14
|
+
'permissionPresets',
|
|
15
|
+
'sessions',
|
|
16
|
+
'sessionPersistence',
|
|
17
|
+
'workspaceRegistry',
|
|
18
|
+
'tools',
|
|
19
|
+
'llm',
|
|
20
|
+
'subprocess',
|
|
21
|
+
'autopilotWorkflow',
|
|
22
|
+
'runtimeOwner',
|
|
23
|
+
'autopilotOperations',
|
|
24
|
+
];
|
|
25
|
+
active = new Map();
|
|
26
|
+
starts = new Set();
|
|
27
|
+
accepting = false;
|
|
28
|
+
constructor(ctx) {
|
|
29
|
+
super(ctx, 'dispatch');
|
|
30
|
+
}
|
|
31
|
+
async *[Service.init]() {
|
|
32
|
+
const releaseOwnerHold = this.ctx.runtimeOwner.hold();
|
|
33
|
+
this.accepting = true;
|
|
34
|
+
yield async () => {
|
|
35
|
+
try {
|
|
36
|
+
this.accepting = false;
|
|
37
|
+
await Promise.all([...this.starts]);
|
|
38
|
+
const owned = [...this.active.values()];
|
|
39
|
+
const pausingRunIds = await this.ctx.admission.requestServiceWithdrawalPause();
|
|
40
|
+
const settled = await Promise.allSettled([
|
|
41
|
+
...pausingRunIds.map((runId) => this.pauseOwnedExecution(runId, 'required execution service withdrawn')),
|
|
42
|
+
...owned.map((execution) => execution.completion),
|
|
43
|
+
]);
|
|
44
|
+
const failures = settled.flatMap((result) => (result.status === 'rejected' ? [result.reason] : []));
|
|
45
|
+
if (failures.length > 0)
|
|
46
|
+
throw new AggregateError(failures, 'dispatcher withdrawal did not quiesce cleanly');
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
releaseOwnerHold();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Claim and execute the next queued run through the Host's configured DSH preset and model, or return undefined when
|
|
55
|
+
* the queue is empty. Requires the injected DSH execution services, valid execution Settings, and Git.
|
|
56
|
+
* The method reserves durable budget before Git/model effects, owns the root Agent to quiescence, flushes its Session,
|
|
57
|
+
* records final Git facts, and settles a structured terminal outcome. Setup/model/Git failures become a failed run
|
|
58
|
+
* when the aggregate remains writable; an aggregate write failure rejects for explicit recovery. The operation
|
|
59
|
+
* accepts no caller cancellation signal.
|
|
60
|
+
*/
|
|
61
|
+
async dispatchNext() {
|
|
62
|
+
this.assertAccepting();
|
|
63
|
+
return await this.ctx.autopilotWorkflow.guardDispatch(() => this.prepareNext());
|
|
64
|
+
}
|
|
65
|
+
async prepareNext() {
|
|
66
|
+
this.assertAccepting();
|
|
67
|
+
if (!this.hasRunningCapacity())
|
|
68
|
+
return undefined;
|
|
69
|
+
const snapshot = this.ctx.admission.snapshot();
|
|
70
|
+
if (snapshot.scheduler.mode === 'enabled') {
|
|
71
|
+
const continuation = snapshot.runs.find((run) => isPausedActive(run) && !run.pause.operatorHold && run.execution.recovery === undefined);
|
|
72
|
+
if (continuation !== undefined)
|
|
73
|
+
return await this.prepareResume(continuation.runId, 'scheduler');
|
|
74
|
+
}
|
|
75
|
+
const finishStart = this.beginStart();
|
|
76
|
+
let claimed;
|
|
77
|
+
let active;
|
|
78
|
+
try {
|
|
79
|
+
await this.assertExecutionStartReady();
|
|
80
|
+
claimed = await this.ctx.admission.claimNext(await prepareAgentComposition(this.ctx));
|
|
81
|
+
if (claimed === undefined) {
|
|
82
|
+
finishStart();
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
active = activeExecution();
|
|
86
|
+
this.active.set(claimed.runId, active);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
finishStart();
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
return async () => {
|
|
93
|
+
try {
|
|
94
|
+
return await executeClaimed(this.ctx, claimed, active, finishStart);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
finishStart();
|
|
98
|
+
this.active.delete(claimed.runId);
|
|
99
|
+
active.complete();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Atomically disable scheduler admission/dequeue, request native cancellation for every live root, and resolve only
|
|
105
|
+
* after each owned execution has reached a durable pause checkpoint. Cancellation-resistant work remains `pausing`
|
|
106
|
+
* and keeps its reservation while this operation waits. Recovered runs without a live owner remain explicit recovery.
|
|
107
|
+
*/
|
|
108
|
+
async disableScheduler() {
|
|
109
|
+
this.assertAccepting();
|
|
110
|
+
const requested = await this.ctx.admission.requestSchedulerDisable();
|
|
111
|
+
await Promise.all(requested.pausingRunIds.map((runId) => this.pauseOwnedExecution(runId, 'scheduler disabled')));
|
|
112
|
+
return this.ctx.admission.snapshot();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Request an operator hold for one live allocated run, cancel its native root, and resolve only after its Session and
|
|
116
|
+
* Autopilot checkpoint are durable. Queued work must use `Admission.holdQueued`; absent live ownership rejects.
|
|
117
|
+
*/
|
|
118
|
+
async stopRun(runId) {
|
|
119
|
+
this.assertAccepting();
|
|
120
|
+
const active = this.active.get(runId);
|
|
121
|
+
if (active === undefined)
|
|
122
|
+
throw new Error(`run "${runId}" has no live execution owner`);
|
|
123
|
+
const requested = await this.ctx.admission.requestRunPause(runId);
|
|
124
|
+
if (requested.state === 'paused')
|
|
125
|
+
return requested;
|
|
126
|
+
await this.pauseOwnedExecution(runId, 'operator requested a checkpoint stop');
|
|
127
|
+
const paused = this.ctx.admission.snapshot().runs.find((run) => run.runId === runId);
|
|
128
|
+
if (!isPausedActive(paused))
|
|
129
|
+
throw new Error(`run "${runId}" did not reach a durable pause checkpoint`);
|
|
130
|
+
return paused;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resume one allocated pause through DSH's persisted Session path after proving the retained Session and Git worktree
|
|
134
|
+
* are still usable. The same run, Session, worktree, and branch are retained; no fallback identity is created. Tracker,
|
|
135
|
+
* scheduler, routing, Git, and budget gates are revalidated before the resumed Agent receives continuation input.
|
|
136
|
+
* Definite retained-resource failures persist an explicit recovery requirement; other preflight failures preserve the
|
|
137
|
+
* pause. The operation owns the resumed root through disposal. Caller cancellation becomes a durable operator pause
|
|
138
|
+
* before the resumed root is cancelled and drained.
|
|
139
|
+
*/
|
|
140
|
+
async resumeRun(runId, signal) {
|
|
141
|
+
this.assertAccepting();
|
|
142
|
+
signal?.throwIfAborted();
|
|
143
|
+
const resumed = await this.ctx.autopilotWorkflow.guardDispatch(() => this.prepareResume(runId, 'operator', signal));
|
|
144
|
+
if (resumed === undefined)
|
|
145
|
+
throw new Error(`run "${runId}" could not be prepared for execution`);
|
|
146
|
+
return resumed;
|
|
147
|
+
}
|
|
148
|
+
async prepareResume(runId, authorization, signal) {
|
|
149
|
+
if (!this.hasRunningCapacity())
|
|
150
|
+
throw new Error('maximum concurrent runs are already active');
|
|
151
|
+
const finishStart = this.beginStart();
|
|
152
|
+
let prepared;
|
|
153
|
+
try {
|
|
154
|
+
await this.assertExecutionStartReady();
|
|
155
|
+
prepared = await preparePausedResume(this.ctx, this.active, runId, authorization);
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
finishStart();
|
|
159
|
+
}
|
|
160
|
+
return () => this.executePreparedResume(prepared, signal);
|
|
161
|
+
}
|
|
162
|
+
async executePreparedResume(prepared, signal) {
|
|
163
|
+
const { run, active, handle, usage, report, baseHead, workspace } = prepared;
|
|
164
|
+
let cancellation;
|
|
165
|
+
const requestCancellation = () => {
|
|
166
|
+
if (cancellation !== undefined)
|
|
167
|
+
return;
|
|
168
|
+
active.pauseRequested = true;
|
|
169
|
+
handle.agent.cancel({ kind: 'hook', reason: 'operator command owner withdrew while resuming this run' }, { keepInbox: true });
|
|
170
|
+
cancellation = this.ctx.admission.requestRunPause(run.runId).then(() => undefined);
|
|
171
|
+
};
|
|
172
|
+
signal?.addEventListener('abort', requestCancellation);
|
|
173
|
+
if (signal?.aborted === true)
|
|
174
|
+
requestCancellation();
|
|
175
|
+
try {
|
|
176
|
+
return await executeOwnedTurn(this.ctx, run, active, handle, usage, report, baseHead, continuationPrompt(run), 'pause requested before continuation', 'Agent continuation failed.', workspace, () => cancellation ?? Promise.resolve());
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
signal?.removeEventListener('abort', requestCancellation);
|
|
180
|
+
await cancellation;
|
|
181
|
+
this.active.delete(run.runId);
|
|
182
|
+
active.complete();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async pauseOwnedExecution(runId, reason) {
|
|
186
|
+
const active = this.active.get(runId);
|
|
187
|
+
if (active === undefined) {
|
|
188
|
+
const run = currentRun(this.ctx.admission.snapshot(), runId);
|
|
189
|
+
if (run.state === 'pausing' && run.execution.recovery === undefined) {
|
|
190
|
+
throw new Error(`run "${runId}" is pausing without a live execution owner`);
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
active.pauseRequested = true;
|
|
195
|
+
active.handle?.agent.cancel({ kind: 'hook', reason }, { keepInbox: true });
|
|
196
|
+
await active.completion;
|
|
197
|
+
const run = currentRun(this.ctx.admission.snapshot(), runId);
|
|
198
|
+
if (run.state === 'pausing' && run.execution.recovery === undefined) {
|
|
199
|
+
throw new Error(`run "${runId}" quiesced without a durable pause checkpoint`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
assertAccepting() {
|
|
203
|
+
if (!this.accepting)
|
|
204
|
+
throw new Error('dispatcher is unavailable while its required services are changing');
|
|
205
|
+
}
|
|
206
|
+
hasRunningCapacity() {
|
|
207
|
+
return this.active.size < this.ctx.autopilotConfig.get().maxRunning;
|
|
208
|
+
}
|
|
209
|
+
async assertExecutionStartReady() {
|
|
210
|
+
await this.ctx.runtimeOwner.ensureOwned();
|
|
211
|
+
await this.ctx.autopilotOperations.assertDispatchReady();
|
|
212
|
+
}
|
|
213
|
+
beginStart() {
|
|
214
|
+
this.assertAccepting();
|
|
215
|
+
let resolve;
|
|
216
|
+
const barrier = new Promise((settled) => {
|
|
217
|
+
resolve = settled;
|
|
218
|
+
});
|
|
219
|
+
this.starts.add(barrier);
|
|
220
|
+
let finished = false;
|
|
221
|
+
return () => {
|
|
222
|
+
if (finished)
|
|
223
|
+
return;
|
|
224
|
+
finished = true;
|
|
225
|
+
this.starts.delete(barrier);
|
|
226
|
+
resolve?.();
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export default Dispatch;
|
|
231
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/dispatch/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { TokenUsage } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
import type { AgentExecutionComposition, ImplementingRun, PausedActiveRun, PausingRun, RunUsageSettlement } from '../admission.js';
|
|
4
|
+
export interface UsageRecorder {
|
|
5
|
+
readonly usage: TokenUsage[];
|
|
6
|
+
requests: number;
|
|
7
|
+
uncertainty?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function registerUsageRecorder(agentCtx: Context, run: ImplementingRun | PausingRun | PausedActiveRun, composition: AgentExecutionComposition, recorder: UsageRecorder): void;
|
|
10
|
+
export declare function usageSettlement(recorder: UsageRecorder): RunUsageSettlement;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function registerUsageRecorder(agentCtx, run, composition, recorder) {
|
|
2
|
+
agentCtx.on('llm/stream', async function* (options, next) {
|
|
3
|
+
recorder.requests += 1;
|
|
4
|
+
if (options.provider !== composition.model.provider ||
|
|
5
|
+
options.model !== composition.model.model ||
|
|
6
|
+
options.reasoningEffort !== composition.model.reasoningEffort ||
|
|
7
|
+
options.sessionId !== run.execution.sessionId) {
|
|
8
|
+
recorder.uncertainty = 'a model request escaped the claimed provider, model, reasoning, or session identity';
|
|
9
|
+
}
|
|
10
|
+
let usageChunks = 0;
|
|
11
|
+
try {
|
|
12
|
+
for await (const chunk of next()) {
|
|
13
|
+
if (chunk.type === 'usage') {
|
|
14
|
+
usageChunks += 1;
|
|
15
|
+
if (validTokenUsage(chunk.usage))
|
|
16
|
+
recorder.usage.push(structuredClone(chunk.usage));
|
|
17
|
+
else
|
|
18
|
+
recorder.uncertainty = 'the model provider returned invalid token usage';
|
|
19
|
+
}
|
|
20
|
+
yield chunk;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
if (usageChunks !== 1)
|
|
25
|
+
recorder.uncertainty = 'a model request did not return exactly one usage record';
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function usageSettlement(recorder) {
|
|
30
|
+
if (recorder.uncertainty !== undefined)
|
|
31
|
+
return { kind: 'uncertain', reason: recorder.uncertainty };
|
|
32
|
+
if (recorder.usage.length !== recorder.requests) {
|
|
33
|
+
return { kind: 'uncertain', reason: 'provider usage records did not match the number of model requests' };
|
|
34
|
+
}
|
|
35
|
+
const tokens = recorder.usage.reduce((total, current) => total +
|
|
36
|
+
current.inputTokens +
|
|
37
|
+
current.outputTokens +
|
|
38
|
+
(current.cacheReadTokens ?? 0) +
|
|
39
|
+
(current.cacheWriteTokens ?? 0), 0);
|
|
40
|
+
return Number.isSafeInteger(tokens)
|
|
41
|
+
? { kind: 'known', tokens }
|
|
42
|
+
: { kind: 'uncertain', reason: 'provider usage overflowed the safe integer range' };
|
|
43
|
+
}
|
|
44
|
+
function validTokenUsage(usage) {
|
|
45
|
+
return [usage.inputTokens, usage.outputTokens, usage.cacheReadTokens ?? 0, usage.cacheWriteTokens ?? 0].every((value) => Number.isSafeInteger(value) && value >= 0);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/dispatch/usage.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,qBAAqB,CACnC,QAAiB,EACjB,GAAmD,EACnD,WAAsC,EACtC,QAAuB;IAEvB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,SAAS,CAAC,EAAE,OAAwB,EAAE,IAAI;QACvE,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAA;QACtB,IACE,OAAO,CAAC,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,QAAQ;YAC/C,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,KAAK;YACzC,OAAO,CAAC,eAAe,KAAK,WAAW,CAAC,KAAK,CAAC,eAAe;YAC7D,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,SAAS,EAC7C,CAAC;YACD,QAAQ,CAAC,WAAW,GAAG,qFAAqF,CAAA;QAC9G,CAAC;QACD,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,WAAW,IAAI,CAAC,CAAA;oBAChB,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;wBAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;;wBAC9E,QAAQ,CAAC,WAAW,GAAG,iDAAiD,CAAA;gBAC/E,CAAC;gBACD,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,KAAK,CAAC;gBAAE,QAAQ,CAAC,WAAW,GAAG,yDAAyD,CAAA;QACzG,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAA;IAClG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,mEAAmE,EAAE,CAAA;IAC3G,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAClC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACjB,KAAK;QACL,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,YAAY;QACpB,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;QAC9B,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC,EACjC,CAAC,CACF,CAAA;IACD,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QACjC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAA;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,KAAK,CAC3G,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CACrD,CAAA;AACH,CAAC"}
|
package/lib/dispatch.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './providers/github-code-host/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-code-host.js","sourceRoot":"","sources":["../src/github-code-host.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './providers/github-issues/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-issues.js","sourceRoot":"","sources":["../src/github-issues.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAA"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
export declare const name = "dsh-autopilot";
|
|
3
|
+
export declare const inject: string[];
|
|
4
|
+
export interface AutopilotOptions {
|
|
5
|
+
/** Programmatic Host proof when the composition does not have a DSH Loader. */
|
|
6
|
+
readonly authoritativeStorePath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function apply(ctx: Context, options?: AutopilotOptions): Promise<void>;
|
|
9
|
+
export * from './admission.js';
|
|
10
|
+
export * from './code-host.js';
|
|
11
|
+
export * from './config.js';
|
|
12
|
+
export * from './delivery.js';
|
|
13
|
+
export * from './dispatch.js';
|
|
14
|
+
export * from './ingress.js';
|
|
15
|
+
export * from './notification.js';
|
|
16
|
+
export * from './operations.js';
|
|
17
|
+
export * from './publication.js';
|
|
18
|
+
export * from './reconciliation.js';
|
|
19
|
+
export * from './tracker.js';
|
|
20
|
+
export * from './web.js';
|
|
21
|
+
export * from './workflow.js';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Admission } from './admission.js';
|
|
2
|
+
import { CodeHost } from './code-host.js';
|
|
3
|
+
import { AutopilotConfig } from './config.js';
|
|
4
|
+
import { Delivery } from './delivery.js';
|
|
5
|
+
import { Dispatch } from './dispatch.js';
|
|
6
|
+
import { Ingress } from './ingress.js';
|
|
7
|
+
import { Notifications } from './notification.js';
|
|
8
|
+
import { AutopilotOperations, PullRequestDispositionRegistry, RuntimeOwner } from './operations.js';
|
|
9
|
+
import { Publication } from './publication.js';
|
|
10
|
+
import { Reconciliation } from './reconciliation.js';
|
|
11
|
+
import { Tracker } from './tracker.js';
|
|
12
|
+
import { AutopilotWeb, AutopilotWebContributions, AutopilotWebIntegrations } from './web.js';
|
|
13
|
+
import { Workflow } from './workflow.js';
|
|
14
|
+
export const name = 'dsh-autopilot';
|
|
15
|
+
export const inject = ['settings', 'storageDomain'];
|
|
16
|
+
export async function apply(ctx, options = {}) {
|
|
17
|
+
await ctx.plugin(Tracker);
|
|
18
|
+
await ctx.plugin(CodeHost);
|
|
19
|
+
await ctx.plugin(Notifications);
|
|
20
|
+
await ctx.plugin(AutopilotWebContributions);
|
|
21
|
+
await ctx.plugin(AutopilotConfig);
|
|
22
|
+
await ctx.plugin(RuntimeOwner, options);
|
|
23
|
+
await ctx.plugin(Admission);
|
|
24
|
+
await ctx.plugin(Ingress);
|
|
25
|
+
await ctx.plugin(PullRequestDispositionRegistry);
|
|
26
|
+
await ctx.plugin(AutopilotOperations);
|
|
27
|
+
await ctx.plugin(Dispatch);
|
|
28
|
+
await ctx.plugin(Publication);
|
|
29
|
+
await ctx.plugin(Delivery);
|
|
30
|
+
await ctx.plugin(Workflow);
|
|
31
|
+
await ctx.plugin(Reconciliation);
|
|
32
|
+
await ctx.plugin(AutopilotWebIntegrations);
|
|
33
|
+
await ctx.plugin(AutopilotWeb);
|
|
34
|
+
}
|
|
35
|
+
export * from './admission.js';
|
|
36
|
+
export * from './code-host.js';
|
|
37
|
+
export * from './config.js';
|
|
38
|
+
export * from './delivery.js';
|
|
39
|
+
export * from './dispatch.js';
|
|
40
|
+
export * from './ingress.js';
|
|
41
|
+
export * from './notification.js';
|
|
42
|
+
export * from './operations.js';
|
|
43
|
+
export * from './publication.js';
|
|
44
|
+
export * from './reconciliation.js';
|
|
45
|
+
export * from './tracker.js';
|
|
46
|
+
export * from './web.js';
|
|
47
|
+
export * from './workflow.js';
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,CAAC,MAAM,IAAI,GAAG,eAAe,CAAA;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;AAOnD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,OAAO,GAAqB,EAAE;IACtE,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzB,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC/B,MAAM,GAAG,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAA;IAC3C,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACjC,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC3B,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzB,MAAM,GAAG,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAA;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;IACrC,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC7B,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAChC,MAAM,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAA;IAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;AAChC,CAAC;AAED,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA"}
|
package/lib/ingress.d.ts
ADDED
package/lib/ingress.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA"}
|
package/lib/jira.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './providers/jira/index.js';
|
package/lib/jira.js
ADDED
package/lib/jira.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.js","sourceRoot":"","sources":["../src/jira.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
2
|
+
/** Canonical value produced by DSH's MCP tool bridge. */
|
|
3
|
+
export interface McpResult {
|
|
4
|
+
readonly content: readonly unknown[];
|
|
5
|
+
readonly structuredContent?: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** One closed semantic operation backed by a version-pinned MCP tool contract. */
|
|
8
|
+
export interface McpContract<Input, Output> {
|
|
9
|
+
readonly rawName: string;
|
|
10
|
+
readonly maxResultBytes: number;
|
|
11
|
+
acceptsDefinition(definition: ToolDefinition): boolean;
|
|
12
|
+
encode(input: Input): unknown;
|
|
13
|
+
decode(result: McpResult): Output;
|
|
14
|
+
}
|
|
15
|
+
export type McpContractMap = Readonly<Record<string, McpContract<unknown, unknown>>>;
|
|
16
|
+
export type McpContractInput<Contract> = Contract extends McpContract<infer Input, unknown> ? Input : never;
|
|
17
|
+
export type McpContractOutput<Contract> = Contract extends McpContract<unknown, infer Output> ? Output : never;
|
|
18
|
+
/** Preserve a provider's closed semantic-operation keys while validating its static contract declarations. */
|
|
19
|
+
export declare function defineMcpContracts<const Contracts extends McpContractMap>(contracts: Contracts): Contracts;
|
|
20
|
+
/** Resolve only names that DSH publishes verbatim, avoiding a duplicate of its lossy name-normalization algorithm. */
|
|
21
|
+
export declare function exactMcpToolName(serverName: string, rawName: string): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const SERVER_NAME = /^[A-Za-z0-9_-]{1,32}$/;
|
|
2
|
+
const RAW_TOOL_NAME = /^[A-Za-z0-9_-]+$/;
|
|
3
|
+
const MAX_PUBLIC_TOOL_NAME_LENGTH = 64;
|
|
4
|
+
/** Preserve a provider's closed semantic-operation keys while validating its static contract declarations. */
|
|
5
|
+
export function defineMcpContracts(contracts) {
|
|
6
|
+
if (Object.keys(contracts).length === 0)
|
|
7
|
+
throw new TypeError('MCP read contracts must not be empty');
|
|
8
|
+
for (const [operation, contract] of Object.entries(contracts)) {
|
|
9
|
+
if (!/^[A-Za-z][A-Za-z0-9]*$/.test(operation)) {
|
|
10
|
+
throw new TypeError('MCP semantic operation names must be alphanumeric identifiers');
|
|
11
|
+
}
|
|
12
|
+
if (!RAW_TOOL_NAME.test(contract.rawName)) {
|
|
13
|
+
throw new TypeError(`MCP operation "${operation}" has an invalid raw tool name`);
|
|
14
|
+
}
|
|
15
|
+
if (!Number.isSafeInteger(contract.maxResultBytes) || contract.maxResultBytes < 1) {
|
|
16
|
+
throw new TypeError(`MCP operation "${operation}" must declare a positive result-byte bound`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return contracts;
|
|
20
|
+
}
|
|
21
|
+
/** Resolve only names that DSH publishes verbatim, avoiding a duplicate of its lossy name-normalization algorithm. */
|
|
22
|
+
export function exactMcpToolName(serverName, rawName) {
|
|
23
|
+
if (!SERVER_NAME.test(serverName))
|
|
24
|
+
throw new TypeError('MCP server name is invalid');
|
|
25
|
+
if (!RAW_TOOL_NAME.test(rawName))
|
|
26
|
+
throw new TypeError('MCP raw tool name is invalid');
|
|
27
|
+
const name = `mcp__${serverName}__${rawName}`;
|
|
28
|
+
if (name.length > MAX_PUBLIC_TOOL_NAME_LENGTH) {
|
|
29
|
+
throw new TypeError('MCP tool name requires unsupported lossy normalization');
|
|
30
|
+
}
|
|
31
|
+
return name;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/mcp/contracts.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,uBAAuB,CAAA;AAC3C,MAAM,aAAa,GAAG,kBAAkB,CAAA;AACxC,MAAM,2BAA2B,GAAG,EAAE,CAAA;AAsBtC,8GAA8G;AAC9G,MAAM,UAAU,kBAAkB,CAAyC,SAAoB;IAC7F,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAA;IACpG,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CAAC,kBAAkB,SAAS,gCAAgC,CAAC,CAAA;QAClF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,SAAS,CAAC,kBAAkB,SAAS,6CAA6C,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,OAAe;IAClE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAA;IACrF,MAAM,IAAI,GAAG,QAAQ,UAAU,KAAK,OAAO,EAAE,CAAA;IAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,2BAA2B,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,wDAAwD,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface McpTraversalCursor {
|
|
2
|
+
readonly vendorCursor: string;
|
|
3
|
+
readonly pagesRead: number;
|
|
4
|
+
readonly itemsRead: number;
|
|
5
|
+
}
|
|
6
|
+
/** Create a generation-local authenticated codec for untrusted provider continuation cursors. */
|
|
7
|
+
export declare function createMcpTraversalCursorCodec(): {
|
|
8
|
+
encode(state: McpTraversalCursor): string;
|
|
9
|
+
decode(value: string): McpTraversalCursor;
|
|
10
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { TrackerProviderError } from '../tracker.js';
|
|
3
|
+
const CURSOR_VERSION = 1;
|
|
4
|
+
const MAX_CURSOR_BYTES = 4_096;
|
|
5
|
+
/** Create a generation-local authenticated codec for untrusted provider continuation cursors. */
|
|
6
|
+
export function createMcpTraversalCursorCodec() {
|
|
7
|
+
const key = randomBytes(32);
|
|
8
|
+
return {
|
|
9
|
+
encode(state) {
|
|
10
|
+
const payload = Buffer.from(JSON.stringify({ version: CURSOR_VERSION, ...state })).toString('base64url');
|
|
11
|
+
const signature = createHmac('sha256', key).update(payload).digest('base64url');
|
|
12
|
+
const cursor = `${payload}.${signature}`;
|
|
13
|
+
if (Buffer.byteLength(cursor) > MAX_CURSOR_BYTES)
|
|
14
|
+
throw invalidCursor();
|
|
15
|
+
return cursor;
|
|
16
|
+
},
|
|
17
|
+
decode(value) {
|
|
18
|
+
if (Buffer.byteLength(value) > MAX_CURSOR_BYTES)
|
|
19
|
+
throw invalidCursor();
|
|
20
|
+
const [payload, signature, extra] = value.split('.');
|
|
21
|
+
if (payload === undefined || signature === undefined || extra !== undefined)
|
|
22
|
+
throw invalidCursor();
|
|
23
|
+
const expected = createHmac('sha256', key).update(payload).digest();
|
|
24
|
+
let actual;
|
|
25
|
+
try {
|
|
26
|
+
actual = Buffer.from(signature, 'base64url');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw invalidCursor();
|
|
30
|
+
}
|
|
31
|
+
if (actual.byteLength !== expected.byteLength || !timingSafeEqual(actual, expected))
|
|
32
|
+
throw invalidCursor();
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw invalidCursor();
|
|
39
|
+
}
|
|
40
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
41
|
+
throw invalidCursor();
|
|
42
|
+
const candidate = parsed;
|
|
43
|
+
if (candidate.version !== CURSOR_VERSION ||
|
|
44
|
+
typeof candidate.vendorCursor !== 'string' ||
|
|
45
|
+
candidate.vendorCursor.length === 0 ||
|
|
46
|
+
candidate.vendorCursor.length > MAX_CURSOR_BYTES ||
|
|
47
|
+
!positiveInteger(candidate.pagesRead) ||
|
|
48
|
+
!nonNegativeInteger(candidate.itemsRead)) {
|
|
49
|
+
throw invalidCursor();
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
vendorCursor: candidate.vendorCursor,
|
|
53
|
+
pagesRead: candidate.pagesRead,
|
|
54
|
+
itemsRead: candidate.itemsRead,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function positiveInteger(value) {
|
|
60
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
|
|
61
|
+
}
|
|
62
|
+
function nonNegativeInteger(value) {
|
|
63
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
64
|
+
}
|
|
65
|
+
function invalidCursor() {
|
|
66
|
+
return new TrackerProviderError('invalid-response', 'MCP tracker candidate cursor was invalid');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/mcp/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
2
|
+
/** Require a zero-argument object input before binding an MCP identity operation. */
|
|
3
|
+
export declare function hasNoArgumentObjectInput(definition: ToolDefinition): boolean;
|
|
4
|
+
/** Check the top-level shape used by a pinned MCP operation contract. */
|
|
5
|
+
export declare function hasInputShape(definition: ToolDefinition, requiredNames: readonly string[], propertyTypes: Readonly<Record<string, string>>): boolean;
|
|
6
|
+
export declare function propertyEnumIncludes(definition: ToolDefinition, name: string, value: string): boolean;
|
|
7
|
+
export declare function arrayItemsAreStrings(definition: ToolDefinition, name: string): boolean;
|
|
8
|
+
export declare function arrayItemEnumIncludes(definition: ToolDefinition, name: string, value: string): boolean;
|