@abot-ai/runtime 1.5.0 → 1.7.0
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/README.md +2 -0
- package/dist/src/bridge/request-steering.js +60 -15
- package/dist/src/bridge/start-agent-bridge.js +22 -0
- package/dist/src/capabilities/normal-invocation/contracts.d.ts +14 -0
- package/dist/src/capabilities/normal-invocation/contracts.js +1 -0
- package/dist/src/capabilities/normal-invocation/output-channels.d.ts +10 -0
- package/dist/src/capabilities/normal-invocation/output-channels.js +29 -0
- package/dist/src/capabilities/normal-invocation/validator.js +42 -4
- package/dist/src/capabilities/result-budget.d.ts +17 -0
- package/dist/src/capabilities/result-budget.js +21 -0
- package/dist/src/capabilities/tool-context-text.d.ts +16 -0
- package/dist/src/capabilities/tool-context-text.js +30 -0
- package/dist/src/capabilities/tool-definition-validator/definition-parser.js +6 -0
- package/dist/src/capabilities/tool-definition-validator/event-input-text-options.js +3 -2
- package/dist/src/capabilities/tool-event-input-text.d.ts +1 -0
- package/dist/src/capabilities/tool-event-input-text.js +2 -1
- package/dist/src/capabilities/tool-executor.d.ts +3 -1
- package/dist/src/capabilities/tool-executor.js +29 -50
- package/dist/src/capabilities/tool-interruption.d.ts +3 -0
- package/dist/src/capabilities/tool-interruption.js +6 -0
- package/dist/src/capabilities/tool-result-normalization.d.ts +18 -0
- package/dist/src/capabilities/tool-result-normalization.js +68 -0
- package/dist/src/capabilities/tool-types.d.ts +25 -2
- package/dist/src/cli/host-companion-bundle.mjs +7623 -6572
- package/dist/src/cli/host-companion-entry.js +5 -22
- package/dist/src/cli/host-companion-input.d.ts +3 -0
- package/dist/src/cli/host-companion-input.js +21 -0
- package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
- package/dist/src/cli/host-companion-lifecycle.js +32 -0
- package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
- package/dist/src/cli/host-companion-setup-target.js +17 -0
- package/dist/src/cli/host-companion-startup.d.ts +2 -0
- package/dist/src/cli/host-companion-startup.js +7 -2
- package/dist/src/cli/host-companion.d.ts +6 -0
- package/dist/src/cli/host-companion.js +36 -27
- package/dist/src/cli/host-permissions.d.ts +7 -0
- package/dist/src/cli/host-permissions.js +24 -0
- package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
- package/dist/src/cli/windows-companion-store-entry.js +67 -0
- package/dist/src/computer-access/command-output-capture.d.ts +37 -0
- package/dist/src/computer-access/command-output-capture.js +136 -0
- package/dist/src/computer-access/command-output-retention.d.ts +5 -0
- package/dist/src/computer-access/command-output-retention.js +90 -0
- package/dist/src/computer-access/command-output.d.ts +7 -0
- package/dist/src/computer-access/command-output.js +1 -0
- package/dist/src/computer-access/commands.d.ts +1 -0
- package/dist/src/computer-access/commands.js +1 -1
- package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
- package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
- package/dist/src/computer-access/companion/command-output.d.ts +13 -0
- package/dist/src/computer-access/companion/command-output.js +110 -0
- package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
- package/dist/src/computer-access/companion/install-link-macos.js +48 -0
- package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
- package/dist/src/computer-access/companion/install-link-registration.js +184 -0
- package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
- package/dist/src/computer-access/companion/install-link-windows.js +65 -0
- package/dist/src/computer-access/companion/install-link.d.ts +9 -0
- package/dist/src/computer-access/companion/install-link.js +54 -0
- package/dist/src/computer-access/companion/native-messages.js +4 -0
- package/dist/src/computer-access/companion/native-permissions.d.ts +14 -0
- package/dist/src/computer-access/companion/native-permissions.js +49 -0
- package/dist/src/computer-access/companion/native-session.d.ts +1 -0
- package/dist/src/computer-access/companion/native-session.js +18 -2
- package/dist/src/computer-access/companion/native-supervisor.js +1 -0
- package/dist/src/computer-access/companion/notification-installation.js +2 -15
- package/dist/src/computer-access/companion/notification-macos-bundle.d.ts +3 -0
- package/dist/src/computer-access/companion/notification-macos-bundle.js +84 -0
- package/dist/src/computer-access/companion/notification-macos.js +1 -1
- package/dist/src/computer-access/companion/notification-protocol.d.ts +1 -1
- package/dist/src/computer-access/companion/notification-protocol.js +20 -1
- package/dist/src/computer-access/companion/notification-readiness.js +2 -1
- package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
- package/dist/src/computer-access/companion/notification-windows.js +8 -3
- package/dist/src/computer-access/companion/permission-protocol.d.ts +22 -0
- package/dist/src/computer-access/companion/permission-protocol.js +45 -0
- package/dist/src/computer-access/companion/protocol.d.ts +2 -1
- package/dist/src/computer-access/companion/protocol.js +9 -0
- package/dist/src/computer-access/companion/release-version.d.ts +1 -1
- package/dist/src/computer-access/companion/release-version.js +1 -1
- package/dist/src/computer-access/companion/spark-notification-query.d.ts +2 -0
- package/dist/src/computer-access/companion/spark-notification-query.js +62 -0
- package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
- package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
- package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
- package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
- package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
- package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
- package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
- package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
- package/dist/src/computer-access/computer/macos-desktop.js +1 -1
- package/dist/src/computer-access/computer/macos-input.js +2 -5
- package/dist/src/computer-access/computer/macos-permission-helper.d.ts +4 -0
- package/dist/src/computer-access/computer/macos-permission-helper.js +38 -0
- package/dist/src/computer-access/contracts.d.ts +1 -1
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +5 -1
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-permission-contract.d.ts +23 -0
- package/dist/src/computer-access/native-permission-contract.js +38 -0
- package/dist/src/computer-access/process-capture.d.ts +6 -0
- package/dist/src/computer-access/process-capture.js +1 -0
- package/dist/src/computer-access/process-result.d.ts +2 -0
- package/dist/src/computer-access/process-result.js +14 -6
- package/dist/src/computer-access/process-runner.d.ts +2 -1
- package/dist/src/computer-access/process-runner.js +21 -13
- package/dist/src/model-gateway/policy/invocation-policy.js +10 -1
- package/dist/src/model-gateway/providers/openai/payload.js +8 -0
- package/dist/src/model-gateway/server/configuration.d.ts +2 -0
- package/dist/src/model-gateway/server/configuration.js +73 -21
- package/dist/src/model-gateway/structured-output/ollama-format.js +5 -0
- package/dist/src/model-gateway/structured-output/openai-format.js +5 -0
- package/dist/src/model-gateway/types.d.ts +3 -0
- package/dist/src/plugin-contract/install-source.d.ts +13 -0
- package/dist/src/plugin-contract/install-source.js +99 -0
- package/dist/src/plugin-contract/manifest.d.ts +3 -1
- package/dist/src/plugin-sdk/computer-access.d.ts +8 -0
- package/dist/src/plugin-sdk/computer-access.js +5 -0
- package/dist/src/plugin-sdk/context-text-result.d.ts +10 -0
- package/dist/src/plugin-sdk/context-text-result.js +19 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/results.d.ts +7 -4
- package/dist/src/plugin-sdk/results.js +35 -10
- package/dist/src/runtime/adapters/co-worker-resources.d.ts +2 -0
- package/dist/src/runtime/adapters/co-worker-resources.js +2 -2
- package/dist/src/runtime/adapters/file-session-store.js +6 -0
- package/dist/src/runtime/adapters/in-memory-session-store.js +19 -16
- package/dist/src/runtime/adapters/long-term-memory/onboarding-service.d.ts +2 -1
- package/dist/src/runtime/adapters/long-term-memory/onboarding-service.js +5 -4
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +2 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +1 -1
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/prepared-execution.js +77 -26
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/result-budget.d.ts +11 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/result-budget.js +30 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +28 -1
- package/dist/src/runtime/adapters/registered-tool-payload-plan.d.ts +3 -3
- package/dist/src/runtime/adapters/registered-tool-payload-plan.js +4 -4
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/contracts.d.ts +2 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-authoring-result.js +4 -18
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +3 -3
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-envelope.d.ts +13 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-envelope.js +15 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-evidence.d.ts +3 -7
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-evidence.js +6 -38
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-observer.d.ts +2 -1
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-observer.js +14 -6
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-references.d.ts +9 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/result-references.js +29 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities.js +1 -0
- package/dist/src/runtime/adapters/scheduler-executor-dispatch.d.ts +11 -0
- package/dist/src/runtime/adapters/scheduler-executor-dispatch.js +10 -0
- package/dist/src/runtime/adapters/scheduler-runtime.d.ts +3 -1
- package/dist/src/runtime/adapters/scheduler-runtime.js +28 -12
- package/dist/src/runtime/admin/config-control.js +2 -1
- package/dist/src/runtime/automations/agent-assignment.d.ts +8 -0
- package/dist/src/runtime/automations/agent-assignment.js +29 -0
- package/dist/src/runtime/automations/agent-request-failure.d.ts +2 -0
- package/dist/src/runtime/automations/agent-request-failure.js +74 -0
- package/dist/src/runtime/automations/agent-session-lifetime.d.ts +11 -0
- package/dist/src/runtime/automations/agent-session-lifetime.js +46 -0
- package/dist/src/runtime/automations/agent-step-executor.d.ts +35 -0
- package/dist/src/runtime/automations/agent-step-executor.js +278 -0
- package/dist/src/runtime/automations/agent-tool-scope.d.ts +4 -0
- package/dist/src/runtime/automations/agent-tool-scope.js +73 -0
- package/dist/src/runtime/automations/archive-management.d.ts +26 -0
- package/dist/src/runtime/automations/archive-management.js +50 -0
- package/dist/src/runtime/automations/binding-resolution.d.ts +28 -0
- package/dist/src/runtime/automations/binding-resolution.js +115 -0
- package/dist/src/runtime/automations/branch-result-projection.d.ts +4 -0
- package/dist/src/runtime/automations/branch-result-projection.js +15 -0
- package/dist/src/runtime/automations/catalog.d.ts +79 -0
- package/dist/src/runtime/automations/catalog.js +68 -0
- package/dist/src/runtime/automations/definition-contracts.d.ts +128 -0
- package/dist/src/runtime/automations/definition-contracts.js +1 -0
- package/dist/src/runtime/automations/definition-input.d.ts +3 -0
- package/dist/src/runtime/automations/definition-input.js +283 -0
- package/dist/src/runtime/automations/dependency-fingerprint.d.ts +9 -0
- package/dist/src/runtime/automations/dependency-fingerprint.js +55 -0
- package/dist/src/runtime/automations/draft-batch-aliases.d.ts +12 -0
- package/dist/src/runtime/automations/draft-batch-aliases.js +94 -0
- package/dist/src/runtime/automations/draft-batch.d.ts +29 -0
- package/dist/src/runtime/automations/draft-batch.js +147 -0
- package/dist/src/runtime/automations/draft-management.d.ts +53 -0
- package/dist/src/runtime/automations/draft-management.js +164 -0
- package/dist/src/runtime/automations/draft-mutations.d.ts +29 -0
- package/dist/src/runtime/automations/draft-mutations.js +219 -0
- package/dist/src/runtime/automations/draft-restoration.d.ts +11 -0
- package/dist/src/runtime/automations/draft-restoration.js +44 -0
- package/dist/src/runtime/automations/effect-admission-lifetime.d.ts +9 -0
- package/dist/src/runtime/automations/effect-admission-lifetime.js +31 -0
- package/dist/src/runtime/automations/failure-policy.d.ts +8 -0
- package/dist/src/runtime/automations/failure-policy.js +9 -0
- package/dist/src/runtime/automations/graph-executor.d.ts +23 -0
- package/dist/src/runtime/automations/graph-executor.js +227 -0
- package/dist/src/runtime/automations/graph-validation.d.ts +29 -0
- package/dist/src/runtime/automations/graph-validation.js +271 -0
- package/dist/src/runtime/automations/input-batch-selection.d.ts +7 -0
- package/dist/src/runtime/automations/input-batch-selection.js +42 -0
- package/dist/src/runtime/automations/input-capacity.d.ts +9 -0
- package/dist/src/runtime/automations/input-capacity.js +38 -0
- package/dist/src/runtime/automations/input-ledger.d.ts +45 -0
- package/dist/src/runtime/automations/input-ledger.js +147 -0
- package/dist/src/runtime/automations/late-settlement.d.ts +9 -0
- package/dist/src/runtime/automations/late-settlement.js +42 -0
- package/dist/src/runtime/automations/limits.d.ts +25 -0
- package/dist/src/runtime/automations/limits.js +41 -0
- package/dist/src/runtime/automations/model-capacity.d.ts +9 -0
- package/dist/src/runtime/automations/model-capacity.js +67 -0
- package/dist/src/runtime/automations/model-dependency-projection.d.ts +58 -0
- package/dist/src/runtime/automations/model-dependency-projection.js +88 -0
- package/dist/src/runtime/automations/node-transactions.d.ts +57 -0
- package/dist/src/runtime/automations/node-transactions.js +223 -0
- package/dist/src/runtime/automations/occurrence-preparation.d.ts +12 -0
- package/dist/src/runtime/automations/occurrence-preparation.js +257 -0
- package/dist/src/runtime/automations/permission-grants.d.ts +27 -0
- package/dist/src/runtime/automations/permission-grants.js +72 -0
- package/dist/src/runtime/automations/persistence.d.ts +9 -0
- package/dist/src/runtime/automations/persistence.js +13 -0
- package/dist/src/runtime/automations/publication-validation.d.ts +16 -0
- package/dist/src/runtime/automations/publication-validation.js +162 -0
- package/dist/src/runtime/automations/publication.d.ts +33 -0
- package/dist/src/runtime/automations/publication.js +97 -0
- package/dist/src/runtime/automations/replay-preparation.d.ts +7 -0
- package/dist/src/runtime/automations/replay-preparation.js +59 -0
- package/dist/src/runtime/automations/result-capacity.d.ts +5 -0
- package/dist/src/runtime/automations/result-capacity.js +9 -0
- package/dist/src/runtime/automations/result-publication.d.ts +10 -0
- package/dist/src/runtime/automations/result-publication.js +21 -0
- package/dist/src/runtime/automations/result-store.d.ts +17 -0
- package/dist/src/runtime/automations/result-store.js +109 -0
- package/dist/src/runtime/automations/retention.d.ts +12 -0
- package/dist/src/runtime/automations/retention.js +134 -0
- package/dist/src/runtime/automations/run-file-binding.d.ts +3 -0
- package/dist/src/runtime/automations/run-file-binding.js +19 -0
- package/dist/src/runtime/automations/run-output-summary.d.ts +25 -0
- package/dist/src/runtime/automations/run-output-summary.js +54 -0
- package/dist/src/runtime/automations/run-report.d.ts +83 -0
- package/dist/src/runtime/automations/run-report.js +121 -0
- package/dist/src/runtime/automations/runtime-executor.d.ts +16 -0
- package/dist/src/runtime/automations/runtime-executor.js +260 -0
- package/dist/src/runtime/automations/saved-agent-management.d.ts +16 -0
- package/dist/src/runtime/automations/saved-agent-management.js +94 -0
- package/dist/src/runtime/automations/service.d.ts +288 -0
- package/dist/src/runtime/automations/service.js +330 -0
- package/dist/src/runtime/automations/snapshot-staging.d.ts +13 -0
- package/dist/src/runtime/automations/snapshot-staging.js +126 -0
- package/dist/src/runtime/automations/source-attachment-access.d.ts +23 -0
- package/dist/src/runtime/automations/source-attachment-access.js +70 -0
- package/dist/src/runtime/automations/source-discovery.d.ts +25 -0
- package/dist/src/runtime/automations/source-discovery.js +179 -0
- package/dist/src/runtime/automations/starter-template-builder.d.ts +5 -0
- package/dist/src/runtime/automations/starter-template-builder.js +78 -0
- package/dist/src/runtime/automations/starter-template-contracts.d.ts +42 -0
- package/dist/src/runtime/automations/starter-template-contracts.js +1 -0
- package/dist/src/runtime/automations/starter-template-definitions.d.ts +3 -0
- package/dist/src/runtime/automations/starter-template-definitions.js +100 -0
- package/dist/src/runtime/automations/starter-template-showcases.d.ts +3 -0
- package/dist/src/runtime/automations/starter-template-showcases.js +154 -0
- package/dist/src/runtime/automations/starter-template-structure.d.ts +4 -0
- package/dist/src/runtime/automations/starter-template-structure.js +11 -0
- package/dist/src/runtime/automations/starter-templates.d.ts +20 -0
- package/dist/src/runtime/automations/starter-templates.js +75 -0
- package/dist/src/runtime/automations/step-evidence-effects.d.ts +46 -0
- package/dist/src/runtime/automations/step-evidence-effects.js +173 -0
- package/dist/src/runtime/automations/step-evidence-inputs.d.ts +22 -0
- package/dist/src/runtime/automations/step-evidence-inputs.js +105 -0
- package/dist/src/runtime/automations/step-evidence-output.d.ts +17 -0
- package/dist/src/runtime/automations/step-evidence-output.js +43 -0
- package/dist/src/runtime/automations/step-evidence.d.ts +24 -0
- package/dist/src/runtime/automations/step-evidence.js +53 -0
- package/dist/src/runtime/automations/step-interruption.d.ts +3 -0
- package/dist/src/runtime/automations/step-interruption.js +26 -0
- package/dist/src/runtime/automations/step-runner.d.ts +57 -0
- package/dist/src/runtime/automations/step-runner.js +278 -0
- package/dist/src/runtime/automations/storage-records.d.ts +133 -0
- package/dist/src/runtime/automations/storage-records.js +286 -0
- package/dist/src/runtime/automations/terminal-admission-receipt.d.ts +12 -0
- package/dist/src/runtime/automations/terminal-admission-receipt.js +39 -0
- package/dist/src/runtime/automations/tool-lifetimes.d.ts +13 -0
- package/dist/src/runtime/automations/tool-lifetimes.js +56 -0
- package/dist/src/runtime/automations/tool-step-executor.d.ts +32 -0
- package/dist/src/runtime/automations/tool-step-executor.js +136 -0
- package/dist/src/runtime/automations/tool-step-outcome.d.ts +24 -0
- package/dist/src/runtime/automations/tool-step-outcome.js +32 -0
- package/dist/src/runtime/automations/trigger-schedule.d.ts +7 -0
- package/dist/src/runtime/automations/trigger-schedule.js +19 -0
- package/dist/src/runtime/automations/working-directory.d.ts +3 -0
- package/dist/src/runtime/automations/working-directory.js +13 -0
- package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +427 -0
- package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +131 -0
- package/dist/src/runtime/capabilities/automation-builder/creation-recipe.d.ts +9 -0
- package/dist/src/runtime/capabilities/automation-builder/creation-recipe.js +155 -0
- package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +6 -0
- package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +6 -0
- package/dist/src/runtime/capabilities/automation-builder/payload-schema.d.ts +3 -0
- package/dist/src/runtime/capabilities/automation-builder/payload-schema.js +105 -0
- package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +65 -0
- package/dist/src/runtime/capabilities/automation-builder/tool-contract.js +27 -0
- package/dist/src/runtime/capabilities/automation-builder/tool-module.d.ts +4 -0
- package/dist/src/runtime/capabilities/automation-builder/tool-module.js +108 -0
- package/dist/src/runtime/capabilities/automations/authoring-catalog-contract.d.ts +78 -0
- package/dist/src/runtime/capabilities/automations/authoring-catalog-contract.js +28 -0
- package/dist/src/runtime/capabilities/automations/authoring-catalog.d.ts +320 -0
- package/dist/src/runtime/capabilities/automations/authoring-catalog.js +158 -0
- package/dist/src/runtime/capabilities/automations/authoring-input-contracts.d.ts +140 -0
- package/dist/src/runtime/capabilities/automations/authoring-input-contracts.js +36 -0
- package/dist/src/runtime/capabilities/automations/authoring-inputs.d.ts +9 -0
- package/dist/src/runtime/capabilities/automations/authoring-inputs.js +86 -0
- package/dist/src/runtime/capabilities/automations/authoring-preparation-limits.d.ts +5 -0
- package/dist/src/runtime/capabilities/automations/authoring-preparation-limits.js +5 -0
- package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +489 -0
- package/dist/src/runtime/capabilities/automations/authoring-preparation.js +51 -0
- package/dist/src/runtime/capabilities/automations/draft-index.d.ts +14 -0
- package/dist/src/runtime/capabilities/automations/draft-index.js +26 -0
- package/dist/src/runtime/capabilities/automations/draft-operation-refs.d.ts +11 -0
- package/dist/src/runtime/capabilities/automations/draft-operation-refs.js +37 -0
- package/dist/src/runtime/capabilities/automations/draft-receipt-admission.d.ts +24 -0
- package/dist/src/runtime/capabilities/automations/draft-receipt-admission.js +36 -0
- package/dist/src/runtime/capabilities/automations/event-presentation.d.ts +3 -0
- package/dist/src/runtime/capabilities/automations/event-presentation.js +18 -0
- package/dist/src/runtime/capabilities/automations/model-tool-contract.d.ts +3 -0
- package/dist/src/runtime/capabilities/automations/model-tool-contract.js +34 -0
- package/dist/src/runtime/capabilities/automations/tool-contract.d.ts +3 -0
- package/dist/src/runtime/capabilities/automations/tool-contract.js +65 -0
- package/dist/src/runtime/capabilities/automations/tool-module.d.ts +4 -0
- package/dist/src/runtime/capabilities/automations/tool-module.js +286 -0
- package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
- package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
- package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
- package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
- package/dist/src/runtime/capabilities/runtime-path-namespace.d.ts +6 -0
- package/dist/src/runtime/capabilities/runtime-path-namespace.js +48 -0
- package/dist/src/runtime/capabilities/runtime-target-path.d.ts +1 -0
- package/dist/src/runtime/capabilities/runtime-target-path.js +16 -8
- package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +12 -0
- package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +4 -1
- package/dist/src/runtime/composition.d.ts +5 -2
- package/dist/src/runtime/config/builders.js +6 -5
- package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
- package/dist/src/runtime/config/fields.js +15 -0
- package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
- package/dist/src/runtime/config/model-context-capacity.js +55 -0
- package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
- package/dist/src/runtime/config/model-execution-policy.js +16 -0
- package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
- package/dist/src/runtime/config/model-plugin-config.js +40 -0
- package/dist/src/runtime/config/schema.js +5 -1
- package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
- package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
- package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
- package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
- package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
- package/dist/src/runtime/config/web-ui.d.ts +5 -0
- package/dist/src/runtime/config/web-ui.js +5 -0
- package/dist/src/runtime/config.js +2 -0
- package/dist/src/runtime/context/canonical-capability-result.d.ts +4 -0
- package/dist/src/runtime/context/canonical-capability-result.js +80 -0
- package/dist/src/runtime/context/capability-brief-readmission.js +2 -5
- package/dist/src/runtime/context/capability-result-compaction-source.d.ts +12 -0
- package/dist/src/runtime/context/capability-result-compaction-source.js +61 -0
- package/dist/src/runtime/context/compacted-capability-result-receipt.d.ts +7 -0
- package/dist/src/runtime/context/compacted-capability-result-receipt.js +29 -0
- package/dist/src/runtime/context/compaction-source-invariant.d.ts +6 -0
- package/dist/src/runtime/context/compaction-source-invariant.js +12 -0
- package/dist/src/runtime/context/execution-compacted-evidence.d.ts +29 -0
- package/dist/src/runtime/context/execution-compacted-evidence.js +87 -0
- package/dist/src/runtime/context/execution-compaction-objective.d.ts +11 -0
- package/dist/src/runtime/context/execution-compaction-objective.js +12 -0
- package/dist/src/runtime/context/model-step-compaction.d.ts +9 -0
- package/dist/src/runtime/context/model-step-compaction.js +115 -128
- package/dist/src/runtime/context/operation-supervision-compacted-evidence.d.ts +37 -0
- package/dist/src/runtime/context/operation-supervision-compacted-evidence.js +69 -0
- package/dist/src/runtime/context/operation-supervision-evidence-binding.d.ts +29 -0
- package/dist/src/runtime/context/operation-supervision-evidence-binding.js +66 -0
- package/dist/src/runtime/context/operation-supervision-evidence-projection.d.ts +5 -0
- package/dist/src/runtime/context/operation-supervision-evidence-projection.js +133 -0
- package/dist/src/runtime/context/operation-supervision-evidence.d.ts +2 -1
- package/dist/src/runtime/context/operation-supervision-evidence.js +38 -37
- package/dist/src/runtime/context/request-tool-results-checkpoint.d.ts +3 -0
- package/dist/src/runtime/context/request-tool-results-checkpoint.js +126 -0
- package/dist/src/runtime/context/request-tool-results-message-binding.d.ts +1 -0
- package/dist/src/runtime/context/request-tool-results-message-binding.js +10 -0
- package/dist/src/runtime/context/request-tool-results-supersession.d.ts +9 -0
- package/dist/src/runtime/context/request-tool-results-supersession.js +78 -0
- package/dist/src/runtime/context/request-tool-results.d.ts +3 -9
- package/dist/src/runtime/context/request-tool-results.js +15 -181
- package/dist/src/runtime/context/runtime-filesystem-scope.d.ts +21 -0
- package/dist/src/runtime/context/runtime-filesystem-scope.js +51 -0
- package/dist/src/runtime/context/semantic-compaction/checkpoint-message.d.ts +3 -0
- package/dist/src/runtime/context/semantic-compaction/checkpoint-message.js +22 -0
- package/dist/src/runtime/context/semantic-compaction/contracts.d.ts +0 -3
- package/dist/src/runtime/context/semantic-compaction/contracts.js +9 -20
- package/dist/src/runtime/context/semantic-compaction/dependency-results.js +15 -1
- package/dist/src/runtime/context/semantic-compaction/evidence-scope.d.ts +7 -0
- package/dist/src/runtime/context/semantic-compaction/evidence-scope.js +7 -0
- package/dist/src/runtime/context/semantic-compaction/format.d.ts +2 -1
- package/dist/src/runtime/context/semantic-compaction/format.js +27 -19
- package/dist/src/runtime/context/semantic-compaction/generation-contracts.d.ts +18 -0
- package/dist/src/runtime/context/semantic-compaction/generation-contracts.js +1 -0
- package/dist/src/runtime/context/semantic-compaction/generation-input.d.ts +11 -0
- package/dist/src/runtime/context/semantic-compaction/generation-input.js +74 -0
- package/dist/src/runtime/context/semantic-compaction/generation-source-registration.d.ts +3 -0
- package/dist/src/runtime/context/semantic-compaction/generation-source-registration.js +12 -0
- package/dist/src/runtime/context/semantic-compaction/output-validation.d.ts +10 -0
- package/dist/src/runtime/context/semantic-compaction/output-validation.js +75 -0
- package/dist/src/runtime/context/semantic-compaction/parser.d.ts +2 -2
- package/dist/src/runtime/context/semantic-compaction/parser.js +13 -26
- package/dist/src/runtime/context/semantic-compaction/prompt.js +18 -5
- package/dist/src/runtime/context/semantic-compaction/repair-headroom.d.ts +4 -3
- package/dist/src/runtime/context/semantic-compaction/repair-headroom.js +10 -4
- package/dist/src/runtime/context/semantic-compaction/replacement-budget.d.ts +25 -0
- package/dist/src/runtime/context/semantic-compaction/replacement-budget.js +55 -0
- package/dist/src/runtime/context/semantic-compaction/run.d.ts +3 -14
- package/dist/src/runtime/context/semantic-compaction/run.js +27 -186
- package/dist/src/runtime/context/semantic-compaction/scope-quarantine.d.ts +17 -0
- package/dist/src/runtime/context/semantic-compaction/scope-quarantine.js +37 -0
- package/dist/src/runtime/context/semantic-compaction/snapshot.d.ts +5 -1
- package/dist/src/runtime/context/semantic-compaction/snapshot.js +10 -2
- package/dist/src/runtime/context/semantic-compaction/source-registration.d.ts +3 -0
- package/dist/src/runtime/context/semantic-compaction/source-registration.js +34 -0
- package/dist/src/runtime/context/semantic-compaction/source-slots.d.ts +5 -0
- package/dist/src/runtime/context/semantic-compaction/source-slots.js +4 -0
- package/dist/src/runtime/context/semantic-compaction/store.d.ts +6 -1
- package/dist/src/runtime/context/semantic-compaction/store.js +54 -9
- package/dist/src/runtime/context/semantic-compaction/super-child-result-source.d.ts +8 -0
- package/dist/src/runtime/context/semantic-compaction/super-child-result-source.js +50 -0
- package/dist/src/runtime/context/semantic-compaction/super-operation-source.d.ts +8 -0
- package/dist/src/runtime/context/semantic-compaction/super-operation-source.js +99 -0
- package/dist/src/runtime/context/semantic-compaction/super-reviewer-source.d.ts +16 -0
- package/dist/src/runtime/context/semantic-compaction/super-reviewer-source.js +37 -0
- package/dist/src/runtime/context/semantic-compaction/super-source-integrity.d.ts +21 -0
- package/dist/src/runtime/context/semantic-compaction/super-source-integrity.js +169 -0
- package/dist/src/runtime/context/semantic-compaction/super-source-message.d.ts +4 -0
- package/dist/src/runtime/context/semantic-compaction/super-source-message.js +23 -0
- package/dist/src/runtime/context/session-memory/model-step-controller.js +34 -20
- package/dist/src/runtime/context/session-memory/selection.js +0 -2
- package/dist/src/runtime/context/spark-conversation-policy.d.ts +4 -0
- package/dist/src/runtime/context/spark-conversation-policy.js +16 -0
- package/dist/src/runtime/context/super-compaction-failure-owner.d.ts +10 -0
- package/dist/src/runtime/context/super-compaction-failure-owner.js +64 -0
- package/dist/src/runtime/context/super-context-failure.d.ts +28 -0
- package/dist/src/runtime/context/super-context-failure.js +37 -0
- package/dist/src/runtime/context/super-context-policy.d.ts +3 -0
- package/dist/src/runtime/context/super-context-policy.js +35 -0
- package/dist/src/runtime/context/super-request-tool-results-checkpoint.d.ts +6 -0
- package/dist/src/runtime/context/super-request-tool-results-checkpoint.js +29 -0
- package/dist/src/runtime/context/super-worker-compaction-failure.d.ts +5 -0
- package/dist/src/runtime/context/super-worker-compaction-failure.js +19 -0
- package/dist/src/runtime/context/super-worker-compaction-projection.d.ts +8 -0
- package/dist/src/runtime/context/super-worker-compaction-projection.js +41 -0
- package/dist/src/runtime/context/super-worker-compaction-sidecar.d.ts +21 -0
- package/dist/src/runtime/context/super-worker-compaction-sidecar.js +67 -0
- package/dist/src/runtime/context/verified-compaction-projection.d.ts +7 -0
- package/dist/src/runtime/context/verified-compaction-projection.js +16 -0
- package/dist/src/runtime/default-environment-adapters.d.ts +4 -0
- package/dist/src/runtime/default-environment-adapters.js +7 -1
- package/dist/src/runtime/local-application.d.ts +279 -0
- package/dist/src/runtime/local-application.js +7 -0
- package/dist/src/runtime/local-host/app-learning-dispatch.js +0 -8
- package/dist/src/runtime/local-host/app-native-permissions.d.ts +20 -0
- package/dist/src/runtime/local-host/app-native-permissions.js +76 -0
- package/dist/src/runtime/local-host/app-owner.js +59 -4
- package/dist/src/runtime/local-host/app-request-control.d.ts +4 -1
- package/dist/src/runtime/local-host/app-request-control.js +96 -11
- package/dist/src/runtime/local-host/app-service-dispatch.d.ts +2 -1
- package/dist/src/runtime/local-host/app-service-dispatch.js +31 -0
- package/dist/src/runtime/local-host/client-learning.d.ts +1 -1
- package/dist/src/runtime/local-host/client-learning.js +0 -1
- package/dist/src/runtime/local-host/client-native-permissions.d.ts +4 -0
- package/dist/src/runtime/local-host/client-native-permissions.js +37 -0
- package/dist/src/runtime/local-host/client-requests.js +32 -5
- package/dist/src/runtime/local-host/client-services.d.ts +275 -0
- package/dist/src/runtime/local-host/client-services.js +3 -2
- package/dist/src/runtime/local-host/learning-preferences-input.js +1 -0
- package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
- package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
- package/dist/src/runtime/local-host/saved-approvals.js +23 -2
- package/dist/src/runtime/model/context-compaction-admission.d.ts +21 -0
- package/dist/src/runtime/model/context-compaction-admission.js +214 -0
- package/dist/src/runtime/model/context-compaction-contracts.d.ts +32 -0
- package/dist/src/runtime/model/context-compaction-contracts.js +1 -0
- package/dist/src/runtime/model/context-compaction-diagnostics.d.ts +33 -0
- package/dist/src/runtime/model/context-compaction-diagnostics.js +97 -0
- package/dist/src/runtime/model/context-compaction-stage-plan.d.ts +3 -0
- package/dist/src/runtime/model/context-compaction-stage-plan.js +28 -0
- package/dist/src/runtime/model/input-token-count.d.ts +1 -0
- package/dist/src/runtime/model/input-token-count.js +4 -1
- package/dist/src/runtime/model/invoke-step.js +80 -126
- package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -1
- package/dist/src/runtime/model/invoke-structured-step.js +3 -2
- package/dist/src/runtime/model/model-context-assessment.d.ts +17 -0
- package/dist/src/runtime/model/model-context-assessment.js +51 -0
- package/dist/src/runtime/model/model-context-budget.js +1 -0
- package/dist/src/runtime/model/model-selection.js +4 -1
- package/dist/src/runtime/model/model-step-acceptance.d.ts +4 -0
- package/dist/src/runtime/model/model-step-acceptance.js +28 -0
- package/dist/src/runtime/model/model-step-port.d.ts +4 -15
- package/dist/src/runtime/model/model-step-steering.d.ts +14 -1
- package/dist/src/runtime/model/model-step-steering.js +23 -0
- package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
- package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
- package/dist/src/runtime/orchestration/capability-adapters/result.d.ts +4 -1
- package/dist/src/runtime/orchestration/capability-adapters/result.js +11 -7
- package/dist/src/runtime/orchestration/role-calls/child-return.d.ts +5 -1
- package/dist/src/runtime/orchestration/role-calls/child-return.js +2 -2
- package/dist/src/runtime/orchestration/worker-capabilities/binding/invocation-preparation.js +1 -8
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -4
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
- package/dist/src/runtime/orchestration/worker-capabilities/execution/context-projection.js +2 -1
- package/dist/src/runtime/orchestration/worker-capabilities/payload-assignment-validation.js +9 -9
- package/dist/src/runtime/orchestration/worker-capabilities/payload-author.js +9 -33
- package/dist/src/runtime/orchestration/worker-capabilities/payload-body-normalization.d.ts +12 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-body-normalization.js +80 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-compaction-transport.d.ts +3 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-compaction-transport.js +14 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-context-snapshot.d.ts +2 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-context-snapshot.js +12 -0
- package/dist/src/runtime/orchestration/worker-capabilities/payload-contracts.d.ts +5 -1
- package/dist/src/runtime/orchestration/worker-capabilities/payload-instructions.js +1 -1
- package/dist/src/runtime/passive-learning/background-dependencies.d.ts +0 -1
- package/dist/src/runtime/passive-learning/contracts.d.ts +2 -3
- package/dist/src/runtime/passive-learning/proactive/agent.d.ts +3 -0
- package/dist/src/runtime/passive-learning/proactive/agent.js +36 -14
- package/dist/src/runtime/passive-learning/proactive/contracts.d.ts +7 -1
- package/dist/src/runtime/passive-learning/proactive/contracts.js +8 -1
- package/dist/src/runtime/passive-learning/proactive/conversation-style-prompt.d.ts +1 -0
- package/dist/src/runtime/passive-learning/proactive/conversation-style-prompt.js +6 -0
- package/dist/src/runtime/passive-learning/proactive/conversation-style-reference.d.ts +30 -0
- package/dist/src/runtime/passive-learning/proactive/conversation-style-reference.js +61 -0
- package/dist/src/runtime/passive-learning/proactive/handoff-brief.d.ts +1 -0
- package/dist/src/runtime/passive-learning/proactive/handoff-brief.js +4 -0
- package/dist/src/runtime/passive-learning/proactive/model-output.d.ts +1 -1
- package/dist/src/runtime/passive-learning/proactive/model-output.js +5 -4
- package/dist/src/runtime/passive-learning/proactive/model.d.ts +7 -1
- package/dist/src/runtime/passive-learning/proactive/model.js +58 -32
- package/dist/src/runtime/passive-learning/proactive/prompt.d.ts +1 -1
- package/dist/src/runtime/passive-learning/proactive/prompt.js +4 -2
- package/dist/src/runtime/passive-learning/proactive/staged-authoring.d.ts +14 -0
- package/dist/src/runtime/passive-learning/proactive/staged-authoring.js +27 -0
- package/dist/src/runtime/passive-learning/proactive/staged-context.d.ts +13 -0
- package/dist/src/runtime/passive-learning/proactive/staged-context.js +39 -4
- package/dist/src/runtime/passive-learning/proactive/staged-contract.d.ts +3 -0
- package/dist/src/runtime/passive-learning/proactive/staged-contract.js +4 -0
- package/dist/src/runtime/passive-learning/proactive/staged-format.d.ts +5 -1
- package/dist/src/runtime/passive-learning/proactive/staged-format.js +2 -4
- package/dist/src/runtime/passive-learning/proactive/staged-output.d.ts +3 -4
- package/dist/src/runtime/passive-learning/proactive/staged-output.js +13 -5
- package/dist/src/runtime/passive-learning/proactive/staged-progress-store.d.ts +0 -1
- package/dist/src/runtime/passive-learning/proactive/staged-progress-store.js +2 -18
- package/dist/src/runtime/passive-learning/proactive/staged-prompt.d.ts +3 -1
- package/dist/src/runtime/passive-learning/proactive/staged-prompt.js +13 -4
- package/dist/src/runtime/passive-learning/proactive/staged-review.d.ts +1 -1
- package/dist/src/runtime/passive-learning/proactive/staged-review.js +10 -11
- package/dist/src/runtime/passive-learning/proactive/store.d.ts +1 -1
- package/dist/src/runtime/passive-learning/proactive/store.js +11 -5
- package/dist/src/runtime/passive-learning/review-progress.d.ts +1 -1
- package/dist/src/runtime/passive-learning/review-progress.js +2 -2
- package/dist/src/runtime/passive-learning/service-status.js +2 -2
- package/dist/src/runtime/passive-learning/service.js +0 -6
- package/dist/src/runtime/passive-learning/spark-chat-preferences.d.ts +3 -0
- package/dist/src/runtime/passive-learning/spark-chat-preferences.js +8 -0
- package/dist/src/runtime/passive-learning/staged-review-call.d.ts +3 -0
- package/dist/src/runtime/passive-learning/staged-review-call.js +19 -13
- package/dist/src/runtime/passive-learning/store.js +4 -0
- package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
- package/dist/src/runtime/plugins/configuration-context.js +42 -0
- package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
- package/dist/src/runtime/plugins/configuration-settings.js +26 -0
- package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
- package/dist/src/runtime/plugins/configuration-store.js +100 -0
- package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
- package/dist/src/runtime/plugins/configuration-write.js +58 -0
- package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
- package/dist/src/runtime/plugins/installation/archive.js +107 -0
- package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
- package/dist/src/runtime/plugins/installation/github-download.js +72 -0
- package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
- package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +45 -0
- package/dist/src/runtime/plugins/installation/package.js +79 -0
- package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
- package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
- package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
- package/dist/src/runtime/plugins/installation/publication.js +17 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +41 -0
- package/dist/src/runtime/plugins/installation/service.js +80 -0
- package/dist/src/runtime/plugins/loader.js +15 -29
- package/dist/src/runtime/plugins/manifest-projection.js +5 -0
- package/dist/src/runtime/plugins/manifest-validator.js +10 -0
- package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
- package/dist/src/runtime/plugins/module-cache.js +19 -0
- package/dist/src/runtime/plugins/selection.d.ts +2 -0
- package/dist/src/runtime/plugins/selection.js +16 -11
- package/dist/src/runtime/ports.d.ts +20 -5
- package/dist/src/runtime/request/approval-wait/activation-events.d.ts +5 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +4 -3
- package/dist/src/runtime/request/approval-wait/snapshot.d.ts +1 -1
- package/dist/src/runtime/request/approval-wait/snapshot.js +1 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +61 -0
- package/dist/src/runtime/request/automation-output-contract.d.ts +6 -0
- package/dist/src/runtime/request/automation-output-contract.js +33 -0
- package/dist/src/runtime/request/contracts.d.ts +16 -0
- package/dist/src/runtime/request/dependencies.d.ts +2 -1
- package/dist/src/runtime/request/execution-agent-root-execution.js +2 -0
- package/dist/src/runtime/request/execution-facets.js +7 -0
- package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +64 -0
- package/dist/src/runtime/request/execution-payload-compacted-evidence.js +46 -0
- package/dist/src/runtime/request/execution-scope-surfaces.d.ts +2 -0
- package/dist/src/runtime/request/execution-scope-surfaces.js +28 -0
- package/dist/src/runtime/request/execution-scope.d.ts +8 -2
- package/dist/src/runtime/request/execution-scope.js +14 -2
- package/dist/src/runtime/request/handler.d.ts +7 -0
- package/dist/src/runtime/request/handler.js +204 -35
- package/dist/src/runtime/request/locked-request-steering.d.ts +3 -0
- package/dist/src/runtime/request/locked-request-steering.js +12 -0
- package/dist/src/runtime/request/policy-degraded-finalization.d.ts +10 -0
- package/dist/src/runtime/request/policy-degraded-finalization.js +27 -0
- package/dist/src/runtime/request/prepared-execution.d.ts +10 -1
- package/dist/src/runtime/request/prepared-execution.js +48 -8
- package/dist/src/runtime/request/request-steering.d.ts +5 -1
- package/dist/src/runtime/request/request-steering.js +37 -12
- package/dist/src/runtime/request/result.d.ts +3 -0
- package/dist/src/runtime/request/role-executor-composition.js +4 -3
- package/dist/src/runtime/request/root-contract.d.ts +2 -0
- package/dist/src/runtime/request/root-execution-kernel.js +10 -9
- package/dist/src/runtime/request/root-invalid-output.js +16 -1
- package/dist/src/runtime/request/session-admission.d.ts +6 -0
- package/dist/src/runtime/request/session-admission.js +47 -14
- package/dist/src/runtime/request/super-checkpoint-quarantine.d.ts +8 -0
- package/dist/src/runtime/request/super-checkpoint-quarantine.js +76 -0
- package/dist/src/runtime/request/super-context-failure-executor.d.ts +4 -0
- package/dist/src/runtime/request/super-context-failure-executor.js +68 -0
- package/dist/src/runtime/request/super-context-failure-integrity.d.ts +16 -0
- package/dist/src/runtime/request/super-context-failure-integrity.js +130 -0
- package/dist/src/runtime/request/super-context-scope.d.ts +9 -0
- package/dist/src/runtime/request/super-context-scope.js +65 -0
- package/dist/src/runtime/request/super-failure-explanation.d.ts +22 -0
- package/dist/src/runtime/request/super-failure-explanation.js +77 -0
- package/dist/src/runtime/request/super-failure-message.d.ts +10 -0
- package/dist/src/runtime/request/super-failure-message.js +40 -0
- package/dist/src/runtime/request/super-payload-context-failure.d.ts +11 -0
- package/dist/src/runtime/request/super-payload-context-failure.js +55 -0
- package/dist/src/runtime/request/super-root-failure-finalization.d.ts +23 -0
- package/dist/src/runtime/request/super-root-failure-finalization.js +112 -0
- package/dist/src/runtime/request/worker-capability-composition.d.ts +4 -0
- package/dist/src/runtime/request/worker-capability-composition.js +8 -2
- package/dist/src/runtime/request/worker-capability-payload.d.ts +2 -1
- package/dist/src/runtime/request/worker-capability-payload.js +74 -48
- package/dist/src/runtime/runtime-environment.d.ts +3 -1
- package/dist/src/runtime/runtime-environment.js +167 -1
- package/dist/src/runtime/scheduler/automation-job-management.d.ts +12 -0
- package/dist/src/runtime/scheduler/automation-job-management.js +288 -0
- package/dist/src/runtime/scheduler/automation-rerun.d.ts +6 -0
- package/dist/src/runtime/scheduler/automation-rerun.js +95 -0
- package/dist/src/runtime/scheduler/automation-run-budget.d.ts +4 -0
- package/dist/src/runtime/scheduler/automation-run-budget.js +16 -0
- package/dist/src/runtime/scheduler/automation-run-change-events.d.ts +11 -0
- package/dist/src/runtime/scheduler/automation-run-change-events.js +77 -0
- package/dist/src/runtime/scheduler/automation-run-completion.d.ts +11 -0
- package/dist/src/runtime/scheduler/automation-run-completion.js +93 -0
- package/dist/src/runtime/scheduler/automation-run-control.d.ts +3 -0
- package/dist/src/runtime/scheduler/automation-run-control.js +48 -0
- package/dist/src/runtime/scheduler/automation-run-records.d.ts +5 -0
- package/dist/src/runtime/scheduler/automation-run-records.js +37 -0
- package/dist/src/runtime/scheduler/automation-schedule.d.ts +10 -0
- package/dist/src/runtime/scheduler/automation-schedule.js +48 -0
- package/dist/src/runtime/scheduler/automation-scheduler-engine.d.ts +4 -0
- package/dist/src/runtime/scheduler/automation-scheduler-engine.js +188 -0
- package/dist/src/runtime/scheduler/automation-snapshot-validation.d.ts +3 -0
- package/dist/src/runtime/scheduler/automation-snapshot-validation.js +106 -0
- package/dist/src/runtime/scheduler/contracts.d.ts +143 -3
- package/dist/src/runtime/scheduler/file-store.js +15 -1
- package/dist/src/runtime/scheduler/job-management.js +3 -2
- package/dist/src/runtime/scheduler/journal-automation-index.d.ts +23 -0
- package/dist/src/runtime/scheduler/journal-automation-index.js +205 -0
- package/dist/src/runtime/scheduler/journal-automation-transaction.d.ts +11 -0
- package/dist/src/runtime/scheduler/journal-automation-transaction.js +90 -0
- package/dist/src/runtime/scheduler/journal-checkpoint.js +5 -2
- package/dist/src/runtime/scheduler/journal-head.d.ts +1 -1
- package/dist/src/runtime/scheduler/journal-head.js +2 -2
- package/dist/src/runtime/scheduler/journal-index-state.d.ts +22 -11
- package/dist/src/runtime/scheduler/journal-index-state.js +76 -17
- package/dist/src/runtime/scheduler/journal-index.d.ts +9 -3
- package/dist/src/runtime/scheduler/journal-index.js +84 -9
- package/dist/src/runtime/scheduler/journal-store.d.ts +9 -1
- package/dist/src/runtime/scheduler/journal-store.js +110 -7
- package/dist/src/runtime/scheduler/journal-transaction.d.ts +7 -4
- package/dist/src/runtime/scheduler/journal-transaction.js +13 -2
- package/dist/src/runtime/scheduler/next-occurrence.js +2 -0
- package/dist/src/runtime/scheduler/run-completion.js +2 -1
- package/dist/src/runtime/scheduler/run-records.js +8 -3
- package/dist/src/runtime/scheduler/schedule-update.d.ts +2 -2
- package/dist/src/runtime/scheduler/schedule-validation.d.ts +2 -2
- package/dist/src/runtime/scheduler/schedule-validation.js +2 -0
- package/dist/src/runtime/scheduler/scheduler-engine.js +24 -8
- package/dist/src/runtime/scheduler/scheduler-service.d.ts +4 -1
- package/dist/src/runtime/scheduler/scheduler-service.js +83 -10
- package/dist/src/runtime/scheduler/scheduler-target.d.ts +9 -0
- package/dist/src/runtime/scheduler/scheduler-target.js +41 -0
- package/dist/src/runtime/scheduler/service-context.d.ts +6 -2
- package/dist/src/runtime/scheduler/service-context.js +6 -3
- package/dist/src/runtime/scheduler/snapshot-validation.d.ts +3 -3
- package/dist/src/runtime/scheduler/snapshot-validation.js +21 -1
- package/dist/src/runtime/scheduler/startup-recovery.d.ts +1 -1
- package/dist/src/runtime/scheduler/startup-recovery.js +15 -2
- package/dist/src/runtime/scheduler/working-store.js +8 -0
- package/dist/src/runtime/session/request-session.d.ts +1 -0
- package/dist/src/runtime/session/request-session.js +1 -0
- package/dist/src/runtime/session/session-deletion-boundary.d.ts +1 -1
- package/dist/src/runtime/session/session-deletion-boundary.js +6 -2
- package/dist/src/runtime/session/session-lifecycle-store.d.ts +4 -1
- package/dist/src/runtime/session/session-lifecycle-store.js +32 -4
- package/dist/src/runtime/session/spark-session-attachments.d.ts +4 -0
- package/dist/src/runtime/session/spark-session-attachments.js +28 -0
- package/dist/src/runtime/session/spark-session-cleanup-receipt.d.ts +7 -0
- package/dist/src/runtime/session/spark-session-cleanup-receipt.js +61 -0
- package/dist/src/runtime/session/spark-session-clear.d.ts +6 -0
- package/dist/src/runtime/session/spark-session-clear.js +36 -0
- package/dist/src/runtime/session/terminal-response.d.ts +21 -0
- package/dist/src/runtime/session/terminal-response.js +38 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.d.ts +1 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.js +12 -0
- package/dist/src/runtime/steps/auditor-decision/contracts.d.ts +4 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-coverage.js +5 -5
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.d.ts +2 -1
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.js +12 -1
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.d.ts +8 -2
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.js +14 -1
- package/dist/src/runtime/steps/auditor-decision/input.d.ts +2 -0
- package/dist/src/runtime/steps/auditor-decision/input.js +12 -3
- package/dist/src/runtime/steps/auditor-decision/projection.js +20 -1
- package/dist/src/runtime/steps/auditor-decision/prompt.js +6 -6
- package/dist/src/runtime/steps/auditor-decision/run.js +2 -3
- package/dist/src/runtime/steps/capability-execution-instructions.d.ts +5 -0
- package/dist/src/runtime/steps/capability-execution-instructions.js +5 -0
- package/dist/src/runtime/steps/degraded-finalization/contract.d.ts +3 -0
- package/dist/src/runtime/steps/degraded-finalization/fallback.js +14 -4
- package/dist/src/runtime/steps/degraded-finalization/input.js +11 -1
- package/dist/src/runtime/steps/degraded-finalization/output-limit-cause.d.ts +4 -0
- package/dist/src/runtime/steps/degraded-finalization/output-limit-cause.js +17 -0
- package/dist/src/runtime/steps/degraded-finalization/prompt.js +4 -1
- package/dist/src/runtime/steps/degraded-finalization/super.d.ts +20 -0
- package/dist/src/runtime/steps/degraded-finalization/super.js +128 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +21 -3
- package/dist/src/runtime/steps/execution-agent/capability-invocation-contract.d.ts +1 -1
- package/dist/src/runtime/steps/execution-agent/capability-invocation-contract.js +4 -2
- package/dist/src/runtime/steps/execution-agent/capability-selection-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/capability-selection-schema.js +72 -0
- package/dist/src/runtime/steps/execution-agent/compaction.d.ts +5 -2
- package/dist/src/runtime/steps/execution-agent/compaction.js +10 -4
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +14 -2
- package/dist/src/runtime/steps/execution-agent/controls-compacted-evidence.d.ts +16 -0
- package/dist/src/runtime/steps/execution-agent/controls-compacted-evidence.js +67 -0
- package/dist/src/runtime/steps/execution-agent/controls-evidence-contract.d.ts +21 -0
- package/dist/src/runtime/steps/execution-agent/controls-evidence-contract.js +64 -0
- package/dist/src/runtime/steps/execution-agent/controls-evidence.d.ts +32 -0
- package/dist/src/runtime/steps/execution-agent/controls-evidence.js +119 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +1 -0
- package/dist/src/runtime/steps/execution-agent/format.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/format.js +9 -68
- package/dist/src/runtime/steps/execution-agent/input.js +19 -2
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +15 -2
- package/dist/src/runtime/steps/execution-agent/refinement-input.d.ts +32 -0
- package/dist/src/runtime/steps/execution-agent/refinement-input.js +146 -0
- package/dist/src/runtime/steps/execution-agent/refinement-prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/refinement-prompt.js +11 -0
- package/dist/src/runtime/steps/execution-agent/refinement.d.ts +4 -4
- package/dist/src/runtime/steps/execution-agent/refinement.js +18 -108
- package/dist/src/runtime/steps/execution-agent/response-input.js +13 -6
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -1
- package/dist/src/runtime/steps/execution-agent/response-run.js +19 -5
- package/dist/src/runtime/steps/execution-agent/run.js +9 -3
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +1 -1
- package/dist/src/runtime/steps/execution-agent/state-context.js +20 -5
- package/dist/src/runtime/steps/planner-decision/input.js +7 -0
- package/dist/src/runtime/steps/planner-decision/resume.d.ts +2 -1
- package/dist/src/runtime/steps/planner-decision/resume.js +3 -3
- package/dist/src/runtime/steps/planner-decision/run.js +13 -0
- package/dist/src/runtime/steps/planner-graph/prompt.js +2 -0
- package/dist/src/runtime/steps/planner-graph/run.js +1 -0
- package/dist/src/runtime/steps/reviewer-decision/projection.js +5 -0
- package/dist/src/runtime/steps/reviewer-decision/run.js +13 -0
- package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -1
- package/dist/src/runtime/steps/supervisor-decision/input.js +2 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +14 -0
- package/dist/src/runtime/steps/supervisor-decision/working-directory.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/working-directory.js +6 -0
- package/dist/src/runtime/steps/supervisor-response/input.d.ts +1 -1
- package/dist/src/runtime/steps/supervisor-response/input.js +14 -7
- package/dist/src/runtime/steps/supervisor-response/run.js +39 -9
- package/dist/src/runtime/steps/worker-decision/compaction-integrity.d.ts +11 -0
- package/dist/src/runtime/steps/worker-decision/compaction-integrity.js +40 -0
- package/dist/src/runtime/steps/worker-decision/input/reference-context.js +7 -0
- package/dist/src/runtime/steps/worker-decision/input/types.d.ts +4 -1
- package/dist/src/runtime/steps/worker-decision/prompt.js +9 -2
- package/dist/src/runtime/steps/worker-decision/result-author.js +4 -0
- package/dist/src/runtime/steps/worker-decision/run.js +12 -49
- package/dist/src/runtime/steps/worker-decision/worker-handoff-compaction.d.ts +4 -0
- package/dist/src/runtime/steps/worker-decision/worker-handoff-compaction.js +69 -0
- package/dist/src/sessions/assistant-initiative-append.d.ts +14 -0
- package/dist/src/sessions/assistant-initiative-append.js +64 -0
- package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
- package/dist/src/sessions/assistant-initiative-message.js +12 -0
- package/dist/src/sessions/assistant-initiative.d.ts +6 -2
- package/dist/src/sessions/assistant-initiative.js +8 -8
- package/dist/src/sessions/automation-session-origin.d.ts +34 -0
- package/dist/src/sessions/automation-session-origin.js +78 -0
- package/dist/src/sessions/automation-session-store.d.ts +12 -0
- package/dist/src/sessions/automation-session-store.js +129 -0
- package/dist/src/sessions/durable-session-commit.d.ts +2 -1
- package/dist/src/sessions/durable-session-commit.js +6 -1
- package/dist/src/sessions/index.d.ts +1 -0
- package/dist/src/sessions/index.js +3 -0
- package/dist/src/sessions/memory/source.d.ts +1 -1
- package/dist/src/sessions/memory/source.js +4 -11
- package/dist/src/sessions/metadata/projection.d.ts +15 -0
- package/dist/src/sessions/metadata/projection.js +55 -0
- package/dist/src/sessions/metadata/publication.d.ts +12 -0
- package/dist/src/sessions/metadata/publication.js +78 -0
- package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
- package/dist/src/sessions/metadata/source-receipt.js +42 -0
- package/dist/src/sessions/metadata/store.d.ts +7 -0
- package/dist/src/sessions/metadata/store.js +119 -0
- package/dist/src/sessions/project-binding.d.ts +1 -0
- package/dist/src/sessions/record/projection.d.ts +4 -1
- package/dist/src/sessions/record/projection.js +27 -15
- package/dist/src/sessions/request-lifecycle/service.js +3 -3
- package/dist/src/sessions/session-service.d.ts +11 -4
- package/dist/src/sessions/session-service.js +56 -19
- package/dist/src/sessions/session-store.d.ts +2 -1
- package/dist/src/sessions/session-store.js +9 -3
- package/dist/src/sessions/snapshot.d.ts +17 -0
- package/dist/src/sessions/snapshot.js +105 -0
- package/dist/src/sessions/spark-handoff-brief.d.ts +3 -0
- package/dist/src/sessions/spark-handoff-brief.js +9 -0
- package/dist/src/sessions/spark-session.d.ts +13 -0
- package/dist/src/sessions/spark-session.js +25 -0
- package/dist/src/sessions/types.d.ts +7 -0
- package/dist/src/shared/tool-selection.d.ts +2 -0
- package/dist/src/shared/tool-selection.js +7 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +103 -0
- package/dist/src/web-ui/app/app-bootstrap.js +24 -2
- package/dist/src/web-ui/app/app-dom.js +5 -0
- package/dist/src/web-ui/app/app-realtime-transport.js +27 -2
- package/dist/src/web-ui/app/app.js +11 -13
- package/dist/src/web-ui/app/automations-feature.js +103 -0
- package/dist/src/web-ui/app/components/automations/archive-actions.js +20 -0
- package/dist/src/web-ui/app/components/automations/authoring-entry.js +25 -0
- package/dist/src/web-ui/app/components/automations/binding-editor.js +101 -0
- package/dist/src/web-ui/app/components/automations/binding-fields.js +166 -0
- package/dist/src/web-ui/app/components/automations/chat-run-projection.js +280 -0
- package/dist/src/web-ui/app/components/automations/draft-recovery-actions.js +28 -0
- package/dist/src/web-ui/app/components/automations/editor-action-icons.js +18 -0
- package/dist/src/web-ui/app/components/automations/editor-actions.js +57 -0
- package/dist/src/web-ui/app/components/automations/editor.js +218 -0
- package/dist/src/web-ui/app/components/automations/failure-presentation.js +299 -0
- package/dist/src/web-ui/app/components/automations/library-tabs.js +45 -0
- package/dist/src/web-ui/app/components/automations/list.js +58 -0
- package/dist/src/web-ui/app/components/automations/live-view.js +39 -0
- package/dist/src/web-ui/app/components/automations/node-inspector.js +251 -0
- package/dist/src/web-ui/app/components/automations/permission-selection.js +37 -0
- package/dist/src/web-ui/app/components/automations/rerun-confirmation.js +16 -0
- package/dist/src/web-ui/app/components/automations/run-output-view.js +100 -0
- package/dist/src/web-ui/app/components/automations/run-report-view.js +224 -0
- package/dist/src/web-ui/app/components/automations/run-step-selection.js +7 -0
- package/dist/src/web-ui/app/components/automations/run-steps-view.js +33 -0
- package/dist/src/web-ui/app/components/automations/run.js +38 -0
- package/dist/src/web-ui/app/components/automations/schema-literal-inputs.js +212 -0
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +243 -0
- package/dist/src/web-ui/app/components/automations/step-preview.js +48 -0
- package/dist/src/web-ui/app/components/automations/template-gallery.js +74 -0
- package/dist/src/web-ui/app/components/automations/timeline-camera.js +219 -0
- package/dist/src/web-ui/app/components/automations/timeline.js +141 -0
- package/dist/src/web-ui/app/components/automations/tool-identity.js +25 -0
- package/dist/src/web-ui/app/components/automations/workspace.js +462 -0
- package/dist/src/web-ui/app/components/composer-context-window.js +24 -13
- package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +130 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
- package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +5 -2
- package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
- package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
- package/dist/src/web-ui/app/components/config-workspace.js +11 -2
- package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -28
- package/dist/src/web-ui/app/components/conversation-activity.js +23 -60
- package/dist/src/web-ui/app/components/conversation-status.js +3 -2
- package/dist/src/web-ui/app/components/conversation-view.js +71 -18
- package/dist/src/web-ui/app/components/dashboard/automations.js +28 -0
- package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
- package/dist/src/web-ui/app/components/dashboard/workspace.js +11 -1
- package/dist/src/web-ui/app/components/notifications/dom.js +1 -1
- package/dist/src/web-ui/app/components/notifications/feedback.js +34 -0
- package/dist/src/web-ui/app/components/notifications/pagination.js +13 -0
- package/dist/src/web-ui/app/components/notifications/presentation.js +25 -4
- package/dist/src/web-ui/app/components/notifications/tabs.js +49 -0
- package/dist/src/web-ui/app/components/notifications/workspace.js +19 -26
- package/dist/src/web-ui/app/components/onboarding-workspace-access.js +1 -1
- package/dist/src/web-ui/app/components/operations-summary.js +105 -0
- package/dist/src/web-ui/app/components/passive-learning/agent-state.js +0 -5
- package/dist/src/web-ui/app/components/passive-learning/agent-view.js +1 -1
- package/dist/src/web-ui/app/components/passive-learning/home.js +1 -13
- package/dist/src/web-ui/app/components/passive-learning/memory.js +0 -3
- package/dist/src/web-ui/app/components/passive-learning/settings-view.js +2 -2
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +3 -3
- package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
- package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
- package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
- package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
- package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +37 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +212 -0
- package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
- package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
- package/dist/src/web-ui/app/components/plugins/rendering.js +14 -2
- package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
- package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
- package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
- package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
- package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +9 -1
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +5 -1
- package/dist/src/web-ui/app/components/runtime-setup-guide.js +20 -5
- package/dist/src/web-ui/app/components/schedules/details.js +3 -2
- package/dist/src/web-ui/app/components/schedules/form.js +4 -4
- package/dist/src/web-ui/app/components/spark-chat/empty-state.js +46 -0
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +59 -0
- package/dist/src/web-ui/app/components/spark-chat/mascot-activity.js +27 -0
- package/dist/src/web-ui/app/components/spark-chat/motion.js +52 -0
- package/dist/src/web-ui/app/components/spark-chat/panel.js +110 -0
- package/dist/src/web-ui/app/components/spark-chat/placement.js +198 -0
- package/dist/src/web-ui/app/components/spark-chat/results.js +44 -0
- package/dist/src/web-ui/app/components/spark-chat/settings.js +84 -0
- package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
- package/dist/src/web-ui/app/components/system-host/macos-permission-preparation.js +83 -0
- package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +85 -0
- package/dist/src/web-ui/app/components/system-host/macos-permission-scopes.js +51 -0
- package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
- package/dist/src/web-ui/app/components/system-host/manager.js +78 -11
- package/dist/src/web-ui/app/components/system-host/rendering.js +113 -100
- package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
- package/dist/src/web-ui/app/components/workspace-shell.js +45 -6
- package/dist/src/web-ui/app/computer-access-feature.js +27 -5
- package/dist/src/web-ui/app/configuration-feature.js +36 -2
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +28 -3
- package/dist/src/web-ui/app/controllers/automation-draft-actions.js +153 -0
- package/dist/src/web-ui/app/controllers/automation-management-actions.js +75 -0
- package/dist/src/web-ui/app/controllers/automation-mutation-lifecycle.js +32 -0
- package/dist/src/web-ui/app/controllers/automation-read-projection.js +63 -0
- package/dist/src/web-ui/app/controllers/automation-run-actions.js +54 -0
- package/dist/src/web-ui/app/controllers/automation-view-scope.js +19 -0
- package/dist/src/web-ui/app/controllers/automations-controller.js +395 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +18 -12
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +88 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +9 -3
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +89 -158
- package/dist/src/web-ui/app/controllers/conversation-view-feature.js +1 -14
- package/dist/src/web-ui/app/controllers/dashboard-controller.js +42 -1
- package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
- package/dist/src/web-ui/app/controllers/notifications-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
- package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +33 -85
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +2 -0
- package/dist/src/web-ui/app/controllers/projects-controller.js +53 -18
- package/dist/src/web-ui/app/controllers/realtime-event-controller.js +42 -160
- package/dist/src/web-ui/app/controllers/request-lifecycle-controller.js +2 -0
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +5 -1
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +25 -3
- package/dist/src/web-ui/app/controllers/schedules-controller.js +11 -19
- package/dist/src/web-ui/app/controllers/session-controller.js +10 -2
- package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +6 -4
- package/dist/src/web-ui/app/controllers/spark-chat-notices.js +34 -0
- package/dist/src/web-ui/app/controllers/spark-chat-reading.js +146 -0
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +170 -0
- package/dist/src/web-ui/app/controllers/spark-handoff-navigation.js +32 -0
- package/dist/src/web-ui/app/controllers/workspace-route-controller.js +42 -20
- package/dist/src/web-ui/app/dashboard-feature.js +2 -3
- package/dist/src/web-ui/app/index.html +18 -12
- package/dist/src/web-ui/app/lib/automation-binding-producers.js +47 -0
- package/dist/src/web-ui/app/lib/automation-graph-position.js +19 -0
- package/dist/src/web-ui/app/lib/automation-parallel-depth.js +19 -0
- package/dist/src/web-ui/app/lib/configuration-pages.js +3 -5
- package/dist/src/web-ui/app/lib/context-compaction-state.d.ts +41 -0
- package/dist/src/web-ui/app/lib/context-compaction-state.js +172 -0
- package/dist/src/web-ui/app/lib/context-window-measurement.d.ts +33 -0
- package/dist/src/web-ui/app/lib/context-window-measurement.js +99 -0
- package/dist/src/web-ui/app/lib/context-window-replay.d.ts +32 -0
- package/dist/src/web-ui/app/lib/context-window-replay.js +38 -0
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +16 -8
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +29 -9
- package/dist/src/web-ui/app/lib/context-window-state.d.ts +80 -0
- package/dist/src/web-ui/app/lib/context-window-state.js +341 -0
- package/dist/src/web-ui/app/lib/conversation-status-model.js +15 -3
- package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
- package/dist/src/web-ui/app/lib/realtime-message.js +9 -0
- package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
- package/dist/src/web-ui/app/lib/schedule-conversation-presentation.js +19 -0
- package/dist/src/web-ui/app/lib/schedule-presentation.js +2 -2
- package/dist/src/web-ui/app/lib/spark-chat-address.js +22 -0
- package/dist/src/web-ui/app/lib/spark-chat-presentation.js +16 -0
- package/dist/src/web-ui/app/lib/spark-chat-read-state.js +13 -0
- package/dist/src/web-ui/app/lib/spark-proposal-message.js +7 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +1 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.js +6 -2
- package/dist/src/web-ui/app/lib/tool-activity-model.js +1 -0
- package/dist/src/web-ui/app/lib/tool-approval-acknowledgement.js +7 -0
- package/dist/src/web-ui/app/lib/tool-automation-activity-fields.js +59 -0
- package/dist/src/web-ui/app/lib/tool-process-activity-fields.js +1 -1
- package/dist/src/web-ui/app/lib/workspace-change.js +2 -2
- package/dist/src/web-ui/app/lib/workspace-route.d.ts +6 -0
- package/dist/src/web-ui/app/lib/workspace-route.js +17 -2
- package/dist/src/web-ui/app/notifications-feature.js +13 -0
- package/dist/src/web-ui/app/passive-learning-feature.js +5 -31
- package/dist/src/web-ui/app/projects-feature.js +16 -5
- package/dist/src/web-ui/app/runtime-onboarding-feature.js +4 -0
- package/dist/src/web-ui/app/schedules-feature.js +1 -1
- package/dist/src/web-ui/app/services/client-preferences.d.ts +0 -2
- package/dist/src/web-ui/app/services/client-preferences.js +0 -2
- package/dist/src/web-ui/app/services/runtime-web-client/automations.d.ts +36 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +63 -0
- package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
- package/dist/src/web-ui/app/services/runtime-web-client/learning.js +0 -9
- package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
- package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.d.ts +22 -0
- package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +29 -0
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +6 -2
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +30 -5
- package/dist/src/web-ui/app/services/runtime-web-client.js +17 -4
- package/dist/src/web-ui/app/spark-chat-conversation.js +217 -0
- package/dist/src/web-ui/app/spark-chat-feature.js +244 -0
- package/dist/src/web-ui/app/spark-mascot.svg +12 -0
- package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
- package/dist/src/web-ui/app/styles/11-workspace-header-width.css +48 -14
- package/dist/src/web-ui/app/styles/11-workspace-rail.css +6 -0
- package/dist/src/web-ui/app/styles/19-dashboard-automations.css +32 -0
- package/dist/src/web-ui/app/styles/41-co-worker-agent.css +6 -25
- package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
- package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +6 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +173 -0
- package/dist/src/web-ui/app/styles/46-system-host.css +78 -107
- package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
- package/dist/src/web-ui/app/styles/48-notifications.css +14 -8
- package/dist/src/web-ui/app/styles/50-automations.css +353 -0
- package/dist/src/web-ui/app/styles/51-automation-editor-actions.css +35 -0
- package/dist/src/web-ui/app/styles/51-automation-templates.css +39 -0
- package/dist/src/web-ui/app/styles/52-automation-reports.css +84 -0
- package/dist/src/web-ui/app/styles/52-automation-step-editor.css +73 -0
- package/dist/src/web-ui/app/styles/53-automation-schema-inputs.css +21 -0
- package/dist/src/web-ui/app/styles/54-spark-chat.css +143 -0
- package/dist/src/web-ui/app/styles/94-automations-responsive.css +35 -0
- package/dist/src/web-ui/app/styles.css +13 -1
- package/dist/src/web-ui/app/ui-behavior.js +1 -0
- package/dist/src/web-ui/local-runtime/api-router.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/api-router.js +29 -6
- package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
- package/dist/src/web-ui/local-runtime/automation-routes.d.ts +27 -0
- package/dist/src/web-ui/local-runtime/automation-routes.js +227 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +9 -3
- package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +9 -1
- package/dist/src/web-ui/local-runtime/environment-registry.js +58 -11
- package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
- package/dist/src/web-ui/local-runtime/learning-notifications.js +1 -1
- package/dist/src/web-ui/local-runtime/learning-routes.js +0 -22
- package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
- package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
- package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
- package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
- package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
- package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
- package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
- package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
- package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
- package/dist/src/web-ui/local-runtime/request-execution.js +91 -24
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +44 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
- package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/session-routes.js +48 -6
- package/dist/src/web-ui/local-runtime/setup-embedding-config-repository.d.ts +6 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-config-repository.js +25 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-service.js +2 -0
- package/dist/src/web-ui/local-runtime/spark-chat-admission.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/spark-chat-admission.js +37 -0
- package/dist/src/web-ui/local-runtime/spark-chat-configuration.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/spark-chat-configuration.js +16 -0
- package/dist/src/web-ui/local-runtime/spark-chat-handoff.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/spark-chat-handoff.js +84 -0
- package/dist/src/web-ui/local-runtime/spark-chat-routes.d.ts +19 -0
- package/dist/src/web-ui/local-runtime/spark-chat-routes.js +63 -0
- package/dist/src/web-ui/local-runtime-backend.d.ts +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +3 -0
- package/dist/src/web-ui/notifications/automation-event-projection.d.ts +3 -0
- package/dist/src/web-ui/notifications/automation-event-projection.js +57 -0
- package/dist/src/web-ui/notifications/contracts.d.ts +20 -5
- package/dist/src/web-ui/notifications/contracts.js +7 -1
- package/dist/src/web-ui/notifications/conversation-source.d.ts +6 -0
- package/dist/src/web-ui/notifications/conversation-source.js +26 -0
- package/dist/src/web-ui/notifications/event-fields.d.ts +3 -0
- package/dist/src/web-ui/notifications/event-fields.js +12 -0
- package/dist/src/web-ui/notifications/event-projection.d.ts +2 -1
- package/dist/src/web-ui/notifications/event-projection.js +22 -20
- package/dist/src/web-ui/notifications/service.js +33 -2
- package/dist/src/web-ui/notifications/storage-schema.js +118 -21
- package/dist/src/web-ui/plugin-capability-selection.js +4 -1
- package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
- package/dist/src/web-ui/plugin-configuration-input.js +68 -0
- package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
- package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
- package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
- package/dist/src/web-ui/plugin-configuration-service.js +66 -0
- package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
- package/dist/src/web-ui/plugin-configuration-view.js +45 -0
- package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
- package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +11 -1
- package/dist/src/web-ui/plugin-management-selection.js +22 -9
- package/dist/src/web-ui/plugin-management-service.d.ts +5 -1
- package/dist/src/web-ui/plugin-management-service.js +11 -7
- package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
- package/dist/src/web-ui/plugin-removal-error.js +16 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +30 -0
- package/dist/src/web-ui/plugin-removal-service.js +109 -0
- package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
- package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
- package/dist/src/web-ui/server.js +7 -3
- package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
- package/dist/src/web-ui/session-read-state/overview.js +16 -0
- package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
- package/dist/src/web-ui/session-read-state/pagination.js +42 -0
- package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
- package/dist/src/web-ui/session-read-state/service.d.ts +246 -14
- package/dist/src/web-ui/session-read-state/service.js +38 -18
- package/dist/src/web-ui/session-read-state/store.d.ts +2 -0
- package/dist/src/web-ui/session-read-state/store.js +7 -0
- package/dist/src/web-ui/session-read-state/visible-messages.d.ts +30 -0
- package/dist/src/web-ui/session-read-state/visible-messages.js +119 -0
- package/dist/src/web-ui/system-host-service.d.ts +4 -1
- package/dist/src/web-ui/system-host-service.js +14 -3
- package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
- package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
- package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
- package/dist/src/web-ui/system-host-setup/installers.js +0 -7
- package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
- package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
- package/dist/src/web-ui/system-host-setup/local-request-authority.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/local-request-authority.js +15 -0
- package/dist/src/web-ui/system-host-setup/local-setup-availability.js +2 -12
- package/dist/src/web-ui/system-host-setup/native-permission-route.d.ts +26 -0
- package/dist/src/web-ui/system-host-setup/native-permission-route.js +96 -0
- package/dist/src/web-ui/system-host-setup/permission-route.d.ts +13 -0
- package/dist/src/web-ui/system-host-setup/permission-route.js +102 -0
- package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/routes.js +32 -9
- package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
- package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
- package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
- package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
- package/docs/configuration.md +46 -0
- package/docs/installation.md +87 -34
- package/docs/plugins.md +218 -13
- package/docs/projects-and-full-plus.md +2 -6
- package/docs/runtime-library.md +0 -1
- package/docs/runtime-public-contracts.md +7 -2
- package/docs/tool-execution-result-evidence-contract.md +11 -4
- package/docs/windows-companion-store.md +127 -0
- package/package.json +3 -3
- package/plugins/capability-brief/src/index.cjs +85 -37
- package/plugins/code-outline/source/index.ts +7 -2
- package/plugins/code-outline/src/index.cjs +91 -39
- package/plugins/document-reader/plugin.json +19 -3
- package/plugins/document-reader/skills/document_reader_skill/SKILL.md +6 -6
- package/plugins/document-reader/source/source-resolution.ts +1 -1
- package/plugins/document-reader/src/index.cjs +86 -38
- package/plugins/exec/plugin.json +6 -3
- package/plugins/exec/source/handlers.ts +78 -20
- package/plugins/exec/source/output-contracts.ts +45 -0
- package/plugins/exec/source/output-files.ts +161 -0
- package/plugins/exec/source/output-maintenance.ts +60 -0
- package/plugins/exec/source/output-range-reader.ts +97 -0
- package/plugins/exec/source/output-retention.ts +34 -0
- package/plugins/exec/source/output-snapshot.ts +54 -0
- package/plugins/exec/source/output-store.ts +182 -0
- package/plugins/exec/source/output-utf8-boundary.ts +14 -0
- package/plugins/exec/source/output-writer.ts +131 -0
- package/plugins/exec/source/process-manager.ts +142 -70
- package/plugins/exec/source/process-output-buffer.ts +13 -18
- package/plugins/exec/source/process-output.ts +158 -0
- package/plugins/exec/source/request-resources.ts +28 -12
- package/plugins/exec/source/result-presentation.ts +39 -39
- package/plugins/exec/source/retained-output-failure.ts +51 -0
- package/plugins/exec/source/settings.ts +9 -10
- package/plugins/exec/source/terminal-delivery.ts +49 -0
- package/plugins/exec/source/types.ts +12 -1
- package/plugins/exec/src/index.cjs +1112 -188
- package/plugins/filesystem/plugin.json +7 -5
- package/plugins/filesystem/skills/read_file_skill/SKILL.md +1 -1
- package/plugins/filesystem/src/index.cjs +85 -37
- package/plugins/json-inspector/source/index.ts +7 -2
- package/plugins/json-inspector/src/index.cjs +91 -39
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/local-search/source/index.ts +9 -4
- package/plugins/local-search/src/index.cjs +93 -41
- package/plugins/memory/src/index.cjs +85 -37
- package/plugins/project-orientation/source/index.ts +9 -4
- package/plugins/project-orientation/src/index.cjs +93 -41
- package/plugins/system/README.md +43 -3
- package/plugins/system/plugin.json +7 -2
- package/plugins/system/source/companion-command-output.ts +82 -0
- package/plugins/system/source/computer/observation-output.ts +1 -1
- package/plugins/system/source/host-dispatch.ts +4 -0
- package/plugins/system/source/index.ts +11 -5
- package/plugins/system/source/local-command-output.ts +61 -0
- package/plugins/system/source/request-system-modules.ts +2 -0
- package/plugins/system/src/index.cjs +562 -82
- package/plugins/system-probe/source/index.ts +7 -2
- package/plugins/system-probe/src/index.cjs +91 -39
- package/plugins/web/README.md +11 -2
- package/plugins/web/plugin.json +4 -0
- package/plugins/web/source/plugin.ts +5 -3
- package/plugins/web/source/research.ts +7 -7
- package/plugins/web/src/index.cjs +96 -43
- package/runtime.config.schema.json +25 -1
- package/src/runtime/README.md +112 -13
- package/src/runtime/scheduler/README.md +63 -0
- package/dist/src/web-ui/app/components/passive-learning/proposal-notifications.js +0 -106
- package/dist/src/web-ui/app/components/passive-learning/proposal-read-state.js +0 -23
- package/dist/src/web-ui/app/components/passive-learning/proposal-view.js +0 -23
- package/dist/src/web-ui/app/components/spark-conversation-actions.js +0 -62
- package/dist/src/web-ui/app/services/spark-conversation-preferences.js +0 -27
- package/dist/src/web-ui/app/styles/29-spark-conversation.css +0 -19
- package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
- package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
- package/docs/publishing.md +0 -167
|
@@ -138,8 +138,28 @@ function defineRuntimePlugin(definition) {
|
|
|
138
138
|
return definition;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
// src/capabilities/tool-context-text.ts
|
|
142
|
+
function hasValidToolContextText(carrier) {
|
|
143
|
+
const fields = carrier.contextTextFields;
|
|
144
|
+
if (fields === void 0) return true;
|
|
145
|
+
if (!Array.isArray(fields) || fields.length === 0 || fields.length > 3)
|
|
146
|
+
return false;
|
|
147
|
+
if (new Set(fields).size !== fields.length) return false;
|
|
148
|
+
for (const field of fields) {
|
|
149
|
+
if (!isContextTextField(field)) return false;
|
|
150
|
+
if (typeof carrier[field] !== "string") return false;
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
function isContextTextField(value) {
|
|
155
|
+
return value === "output" || value === "stdout" || value === "stderr";
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/capabilities/result-budget.ts
|
|
159
|
+
var CAPABILITY_RESULT_ENVELOPE_MAX_BYTES = 256 * 1024;
|
|
160
|
+
|
|
141
161
|
// src/plugin-sdk/results.ts
|
|
142
|
-
var PLUGIN_RESULT_SERIALIZED_MAX_BYTES =
|
|
162
|
+
var PLUGIN_RESULT_SERIALIZED_MAX_BYTES = CAPABILITY_RESULT_ENVELOPE_MAX_BYTES;
|
|
143
163
|
function resultBoundsFailure(code, message) {
|
|
144
164
|
return {
|
|
145
165
|
ok: false,
|
|
@@ -149,9 +169,27 @@ function resultBoundsFailure(code, message) {
|
|
|
149
169
|
errorCode: code
|
|
150
170
|
};
|
|
151
171
|
}
|
|
152
|
-
function enforcePluginResultByteBudget(result) {
|
|
153
|
-
let
|
|
172
|
+
function enforcePluginResultByteBudget(result, resultBudget) {
|
|
173
|
+
let requiresContextTextHost = false;
|
|
174
|
+
let serializedBytes;
|
|
175
|
+
let envelopeBytes;
|
|
176
|
+
let maxBytes = PLUGIN_RESULT_SERIALIZED_MAX_BYTES;
|
|
177
|
+
let fitsDeclaredBudget = true;
|
|
154
178
|
try {
|
|
179
|
+
if (!hasValidToolContextText(result)) {
|
|
180
|
+
return resultBoundsFailure(
|
|
181
|
+
"plugin_context_text_invalid",
|
|
182
|
+
"The plugin declared invalid context text fields."
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
requiresContextTextHost = result.contextTextFields !== void 0;
|
|
186
|
+
const lacksContextTextHost = requiresContextTextHost && resultBudget?.acceptsContextText !== true;
|
|
187
|
+
if (lacksContextTextHost) {
|
|
188
|
+
return resultBoundsFailure(
|
|
189
|
+
"plugin_context_text_unavailable",
|
|
190
|
+
"The host does not support context-managed tool text."
|
|
191
|
+
);
|
|
192
|
+
}
|
|
155
193
|
const candidate = JSON.stringify(result);
|
|
156
194
|
if (candidate === void 0) {
|
|
157
195
|
return resultBoundsFailure(
|
|
@@ -159,36 +197,43 @@ function enforcePluginResultByteBudget(result) {
|
|
|
159
197
|
"The plugin produced a result that is not JSON-safe."
|
|
160
198
|
);
|
|
161
199
|
}
|
|
162
|
-
|
|
200
|
+
const assessment = resultBudget?.assess(result);
|
|
201
|
+
serializedBytes = assessment?.serializedBytes ?? Buffer.byteLength(candidate, "utf8");
|
|
202
|
+
envelopeBytes = assessment?.envelopeBytes ?? serializedBytes;
|
|
203
|
+
maxBytes = Math.min(assessment?.maxBytes ?? maxBytes, maxBytes);
|
|
204
|
+
fitsDeclaredBudget = assessment?.fits ?? true;
|
|
163
205
|
} catch {
|
|
164
206
|
return resultBoundsFailure(
|
|
165
207
|
"plugin_result_not_json_safe",
|
|
166
208
|
"The plugin produced a result that is not JSON-safe."
|
|
167
209
|
);
|
|
168
210
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
);
|
|
211
|
+
const hasResultDeliveryHeadroom = fitsDeclaredBudget && envelopeBytes <= maxBytes;
|
|
212
|
+
if (!hasResultDeliveryHeadroom) {
|
|
213
|
+
const message = requiresContextTextHost ? `The plugin result envelope is ${envelopeBytes} bytes (${serializedBytes} total bytes) and exceeds the ${maxBytes}-byte delivery limit.` : `The plugin result is ${serializedBytes} bytes and exceeds the ${maxBytes}-byte delivery limit.`;
|
|
214
|
+
return resultBoundsFailure("plugin_result_too_large", message);
|
|
174
215
|
}
|
|
175
216
|
return result;
|
|
176
217
|
}
|
|
177
|
-
function failureResult(input) {
|
|
178
|
-
return enforcePluginResultByteBudget(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
218
|
+
function failureResult(input, resultBudget) {
|
|
219
|
+
return enforcePluginResultByteBudget(
|
|
220
|
+
{
|
|
221
|
+
ok: false,
|
|
222
|
+
...input.interruption ? { interruption: input.interruption } : {},
|
|
223
|
+
...input.media !== void 0 ? { media: input.media } : {},
|
|
224
|
+
output: input.output ?? input.message,
|
|
225
|
+
producedNewInformation: false,
|
|
226
|
+
...input.progress !== void 0 ? { progress: input.progress } : {},
|
|
227
|
+
...input.actions !== void 0 ? { actions: input.actions } : {},
|
|
228
|
+
...input.exitCode !== void 0 ? { exitCode: input.exitCode } : {},
|
|
229
|
+
...input.stdout !== void 0 ? { stdout: input.stdout } : {},
|
|
230
|
+
...input.stderr !== void 0 ? { stderr: input.stderr } : {},
|
|
231
|
+
...input.data !== void 0 ? { data: input.data } : {},
|
|
232
|
+
error: input.message,
|
|
233
|
+
errorCode: input.errorCode
|
|
234
|
+
},
|
|
235
|
+
resultBudget
|
|
236
|
+
);
|
|
192
237
|
}
|
|
193
238
|
function failureFromError(error, options) {
|
|
194
239
|
const pathCode = runtimeToolPathErrorCode(error);
|
|
@@ -202,6 +247,21 @@ function failureFromError(error, options) {
|
|
|
202
247
|
});
|
|
203
248
|
}
|
|
204
249
|
|
|
250
|
+
// src/plugin-sdk/context-text-result.ts
|
|
251
|
+
function deliverPluginTextResult(result, fields, budget) {
|
|
252
|
+
const assessed = enforcePluginResultByteBudget(result, budget);
|
|
253
|
+
if (!canHandOffContextText(result, assessed, budget)) return assessed;
|
|
254
|
+
return enforcePluginResultByteBudget(
|
|
255
|
+
{ ...result, contextTextFields: Object.freeze([...fields]) },
|
|
256
|
+
budget
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
function canHandOffContextText(original, assessed, budget) {
|
|
260
|
+
if (budget?.acceptsContextText !== true) return false;
|
|
261
|
+
if (assessed === original) return false;
|
|
262
|
+
return assessed.errorCode === "plugin_result_too_large";
|
|
263
|
+
}
|
|
264
|
+
|
|
205
265
|
// src/capabilities/tool-media.ts
|
|
206
266
|
var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
|
|
207
267
|
|
|
@@ -476,26 +536,32 @@ function diffExecFilesystemSnapshots(before, after) {
|
|
|
476
536
|
}
|
|
477
537
|
|
|
478
538
|
// plugins/exec/source/result-presentation.ts
|
|
479
|
-
|
|
480
|
-
|
|
539
|
+
var EXEC_CONTEXT_TEXT_FIELDS = Object.freeze(["stdout", "stderr"]);
|
|
540
|
+
function streamReceipt(snapshot, field) {
|
|
541
|
+
if (snapshot.text) return `See the ${field} field (${snapshot.text.length} characters).`;
|
|
481
542
|
return snapshot.sawOutput ? "(no new output; earlier output was already returned)" : "(empty)";
|
|
482
543
|
}
|
|
483
|
-
function renderedOutput(lines
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
544
|
+
function renderedOutput(lines) {
|
|
545
|
+
const output = lines.join("\n");
|
|
546
|
+
return Object.freeze({
|
|
547
|
+
output,
|
|
548
|
+
metadata: Object.freeze({
|
|
549
|
+
truncated: false,
|
|
550
|
+
originalChars: output.length,
|
|
551
|
+
returnedChars: output.length,
|
|
552
|
+
omittedChars: 0
|
|
553
|
+
})
|
|
487
554
|
});
|
|
488
|
-
return Object.freeze({ output: bounded.text, metadata: bounded.metadata });
|
|
489
555
|
}
|
|
490
|
-
function outputBoundsData(snapshot, rendered
|
|
556
|
+
function outputBoundsData(snapshot, rendered) {
|
|
491
557
|
return Object.freeze({
|
|
492
|
-
maxChars,
|
|
558
|
+
maxChars: null,
|
|
493
559
|
stdout: snapshot.stdout.metadata,
|
|
494
560
|
stderr: snapshot.stderr.metadata,
|
|
495
561
|
rendered
|
|
496
562
|
});
|
|
497
563
|
}
|
|
498
|
-
function runningResult(snapshot, execution) {
|
|
564
|
+
function runningResult(snapshot, execution, resultBudget) {
|
|
499
565
|
const nextCursor = snapshot.nextCursor ?? 1;
|
|
500
566
|
const rendered = renderedOutput(
|
|
501
567
|
[
|
|
@@ -505,16 +571,17 @@ function runningResult(snapshot, execution) {
|
|
|
505
571
|
`Process ID: ${snapshot.processId}`,
|
|
506
572
|
`Next cursor: ${nextCursor}`,
|
|
507
573
|
"STDOUT since the previous observation:",
|
|
508
|
-
|
|
574
|
+
streamReceipt(snapshot.stdout, "stdout"),
|
|
509
575
|
"STDERR since the previous observation:",
|
|
510
|
-
|
|
576
|
+
streamReceipt(snapshot.stderr, "stderr"),
|
|
511
577
|
"Continue this exact process with exec_wait; do not run the command again."
|
|
512
|
-
]
|
|
513
|
-
execution.outputMaxChars
|
|
578
|
+
]
|
|
514
579
|
);
|
|
515
|
-
return
|
|
580
|
+
return deliverPluginTextResult({
|
|
581
|
+
ok: false,
|
|
582
|
+
producedNewInformation: false,
|
|
516
583
|
errorCode: "exec_process_running",
|
|
517
|
-
|
|
584
|
+
error: "The command is still running. Continue it with exec_wait using the returned process ID and cursor.",
|
|
518
585
|
output: rendered.output,
|
|
519
586
|
stdout: snapshot.stdout.text,
|
|
520
587
|
stderr: snapshot.stderr.text,
|
|
@@ -522,17 +589,13 @@ function runningResult(snapshot, execution) {
|
|
|
522
589
|
processId: snapshot.processId,
|
|
523
590
|
processStatus: "running",
|
|
524
591
|
nextCursor,
|
|
525
|
-
outputBounds: outputBoundsData(
|
|
526
|
-
snapshot,
|
|
527
|
-
rendered.metadata,
|
|
528
|
-
execution.outputMaxChars
|
|
529
|
-
),
|
|
592
|
+
outputBounds: outputBoundsData(snapshot, rendered.metadata),
|
|
530
593
|
observationMeta: {
|
|
531
594
|
kind: "volatile_external",
|
|
532
595
|
carryPolicy: "never"
|
|
533
596
|
}
|
|
534
597
|
}
|
|
535
|
-
});
|
|
598
|
+
}, EXEC_CONTEXT_TEXT_FIELDS, resultBudget);
|
|
536
599
|
}
|
|
537
600
|
async function captureFilesystemDelta(execution) {
|
|
538
601
|
if (!execution.filesystemStateBefore) return null;
|
|
@@ -604,12 +667,11 @@ async function finalizeExecResult(params) {
|
|
|
604
667
|
`Exit code: ${exitCode}`,
|
|
605
668
|
...filesystemEvidence ? filesystemEvidence.outputLines : [],
|
|
606
669
|
"STDOUT:",
|
|
607
|
-
|
|
670
|
+
streamReceipt(snapshot.stdout, "stdout"),
|
|
608
671
|
"STDERR:",
|
|
609
|
-
|
|
672
|
+
streamReceipt(snapshot.stderr, "stderr"),
|
|
610
673
|
...resultSummary ? [resultSummary] : []
|
|
611
|
-
]
|
|
612
|
-
execution.outputMaxChars
|
|
674
|
+
]
|
|
613
675
|
);
|
|
614
676
|
const processStatus = snapshot.terminationReason ?? "completed";
|
|
615
677
|
const data = {
|
|
@@ -618,11 +680,7 @@ async function finalizeExecResult(params) {
|
|
|
618
680
|
...filesystemEvidence ? { mutationGrounding: filesystemEvidence.mutationGrounding } : {},
|
|
619
681
|
processId: snapshot.processId,
|
|
620
682
|
processStatus,
|
|
621
|
-
outputBounds: outputBoundsData(
|
|
622
|
-
snapshot,
|
|
623
|
-
rendered.metadata,
|
|
624
|
-
execution.outputMaxChars
|
|
625
|
-
),
|
|
683
|
+
outputBounds: outputBoundsData(snapshot, rendered.metadata),
|
|
626
684
|
...filesystemDelta ? { filesystemObservation: filesystemDelta.observation } : { filesystemObservation: { available: false } },
|
|
627
685
|
observationMeta: {
|
|
628
686
|
kind: "volatile_external",
|
|
@@ -640,16 +698,42 @@ async function finalizeExecResult(params) {
|
|
|
640
698
|
data
|
|
641
699
|
};
|
|
642
700
|
if (ok && (!inconclusiveSuccess || cancellationIsSuccess)) {
|
|
643
|
-
return
|
|
701
|
+
return deliverPluginTextResult({ ok: true, ...common }, EXEC_CONTEXT_TEXT_FIELDS, params.resultBudget);
|
|
644
702
|
}
|
|
645
703
|
const errorCode = inconclusiveSuccess ? "no_observable_result" : snapshot.terminationReason === "aborted" ? "exec_aborted" : snapshot.terminationReason === "spawn_failed" ? "exec_spawn_failed" : snapshot.terminationReason === "idle_timeout" ? "exec_idle_timeout" : snapshot.terminationReason === "hard_timeout" ? "exec_hard_timeout" : "non_zero_exit";
|
|
646
704
|
const error = inconclusiveSuccess ? resultSummary : errorCode === "exec_aborted" ? "The exec request was aborted." : errorCode === "exec_spawn_failed" ? "The runtime could not start the configured non-interactive shell." : errorCode === "exec_idle_timeout" ? `The command produced no output for ${execution.idleTimeoutMs}ms.` : errorCode === "exec_hard_timeout" ? `The command exceeded the ${execution.hardTimeoutMs}ms hard timeout.` : `The command exited with code ${exitCode}.`;
|
|
647
|
-
return
|
|
705
|
+
return deliverPluginTextResult({
|
|
648
706
|
ok: false,
|
|
649
707
|
...common,
|
|
650
708
|
error,
|
|
651
709
|
errorCode
|
|
652
|
-
});
|
|
710
|
+
}, EXEC_CONTEXT_TEXT_FIELDS, params.resultBudget);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// plugins/exec/source/retained-output-failure.ts
|
|
714
|
+
function retainedOutputFailure(snapshot, context) {
|
|
715
|
+
const expired = hasUnavailableOutput(snapshot);
|
|
716
|
+
return failureResult(
|
|
717
|
+
{
|
|
718
|
+
errorCode: expired ? "exec_output_expired" : snapshot.outputFailure ? "exec_output_storage_failed" : "exec_output_delivery_pending",
|
|
719
|
+
message: expired ? "The retained output expired or is no longer available. The command was already started; it has not been run again." : snapshot.outputFailure ? "Output storage or delivery failed. The command was already started; do not run it again. Any committed bytes are retained for the configured retention period; complete output delivery is not confirmed." : "The output exceeds the delivery envelope and remains retained. The command was already executed; do not run it again.",
|
|
720
|
+
data: {
|
|
721
|
+
processId: snapshot.processId,
|
|
722
|
+
processStatus: snapshot.status,
|
|
723
|
+
nextCursor: snapshot.nextCursor,
|
|
724
|
+
...snapshot.exitCode !== void 0 ? { exitCode: snapshot.exitCode } : {},
|
|
725
|
+
...snapshot.terminationReason ? { terminationReason: snapshot.terminationReason } : {},
|
|
726
|
+
outputDelivery: expired ? "expired" : "pending",
|
|
727
|
+
...snapshot.outputFailure ? { outputStorageFailure: snapshot.outputFailure } : {},
|
|
728
|
+
retainedCharacters: snapshot.stdout.text.length + snapshot.stderr.text.length
|
|
729
|
+
}
|
|
730
|
+
},
|
|
731
|
+
context?.resultBudget
|
|
732
|
+
);
|
|
733
|
+
}
|
|
734
|
+
function hasUnavailableOutput(snapshot) {
|
|
735
|
+
if (snapshot.outputFailure?.code === "exec_output_expired") return true;
|
|
736
|
+
return snapshot.outputFailure?.code === "exec_output_expired_or_unavailable";
|
|
653
737
|
}
|
|
654
738
|
|
|
655
739
|
// plugins/exec/source/errors.ts
|
|
@@ -676,6 +760,169 @@ function execFailureFromError(error, operation) {
|
|
|
676
760
|
});
|
|
677
761
|
}
|
|
678
762
|
|
|
763
|
+
// plugins/exec/source/terminal-delivery.ts
|
|
764
|
+
var import_node_crypto2 = require("node:crypto");
|
|
765
|
+
var ExecTerminalDelivery = class {
|
|
766
|
+
claim;
|
|
767
|
+
accepted = false;
|
|
768
|
+
get isClaimed() {
|
|
769
|
+
return this.claim !== void 0;
|
|
770
|
+
}
|
|
771
|
+
assertAvailable() {
|
|
772
|
+
if (this.isClaimed) throw this.unavailable();
|
|
773
|
+
}
|
|
774
|
+
reserve(snapshot) {
|
|
775
|
+
if (snapshot.status !== "settled") return snapshot;
|
|
776
|
+
this.assertAvailable();
|
|
777
|
+
this.claim = (0, import_node_crypto2.randomUUID)();
|
|
778
|
+
return Object.freeze({ ...snapshot, deliveryId: this.claim });
|
|
779
|
+
}
|
|
780
|
+
assertOwner(snapshot) {
|
|
781
|
+
if (snapshot.status !== "settled") return;
|
|
782
|
+
if (!this.claim || snapshot.deliveryId !== this.claim || this.accepted)
|
|
783
|
+
throw this.unavailable();
|
|
784
|
+
}
|
|
785
|
+
accept(snapshot) {
|
|
786
|
+
if (snapshot.status !== "settled") return;
|
|
787
|
+
this.assertOwner(snapshot);
|
|
788
|
+
this.accepted = true;
|
|
789
|
+
}
|
|
790
|
+
reject(snapshot) {
|
|
791
|
+
if (this.accepted) return;
|
|
792
|
+
if (snapshot.deliveryId !== this.claim) return;
|
|
793
|
+
this.claim = void 0;
|
|
794
|
+
}
|
|
795
|
+
unavailable() {
|
|
796
|
+
return new ExecPluginError(
|
|
797
|
+
"unknown_exec_process",
|
|
798
|
+
"The terminal exec result is already claimed by another observation."
|
|
799
|
+
);
|
|
800
|
+
}
|
|
801
|
+
};
|
|
802
|
+
|
|
803
|
+
// plugins/exec/source/output-files.ts
|
|
804
|
+
var import_node_crypto3 = require("node:crypto");
|
|
805
|
+
var import_promises2 = require("node:fs/promises");
|
|
806
|
+
var import_node_path2 = require("node:path");
|
|
807
|
+
var ID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;
|
|
808
|
+
function outputStorageRoot(stateDir) {
|
|
809
|
+
if (!stateDir.trim()) throw outputFailure("state_dir_invalid");
|
|
810
|
+
return (0, import_node_path2.resolve)(stateDir, "output");
|
|
811
|
+
}
|
|
812
|
+
function outputOwnerDirectory(root, ownerId) {
|
|
813
|
+
if (!ownerId.trim()) throw outputFailure("owner_invalid");
|
|
814
|
+
return (0, import_node_path2.join)(root, (0, import_node_crypto3.createHash)("sha256").update(ownerId).digest("hex"));
|
|
815
|
+
}
|
|
816
|
+
function outputStreamPath(directory, id) {
|
|
817
|
+
assertOutputId(id);
|
|
818
|
+
return (0, import_node_path2.join)(directory, `${id}.bytes`);
|
|
819
|
+
}
|
|
820
|
+
function outputSnapshotPath(directory, id) {
|
|
821
|
+
assertOutputId(id);
|
|
822
|
+
return (0, import_node_path2.join)(directory, `${id}.snapshot.json`);
|
|
823
|
+
}
|
|
824
|
+
function assertOutputId(id) {
|
|
825
|
+
if (typeof id !== "string" || !ID.test(id)) throw outputFailure("id_invalid");
|
|
826
|
+
}
|
|
827
|
+
function outputFailure(code, cause) {
|
|
828
|
+
const error = new ExecPluginError(
|
|
829
|
+
`exec_output_${code}`,
|
|
830
|
+
`Exec output storage failed: ${code}.`
|
|
831
|
+
);
|
|
832
|
+
if (cause !== void 0)
|
|
833
|
+
Object.defineProperty(error, "cause", { value: cause });
|
|
834
|
+
return error;
|
|
835
|
+
}
|
|
836
|
+
async function writeOutputMetadata(path, value) {
|
|
837
|
+
const temporary = `${path}.${(0, import_node_crypto3.randomUUID)()}.tmp`;
|
|
838
|
+
try {
|
|
839
|
+
const file = await (0, import_promises2.open)(temporary, "wx", 384);
|
|
840
|
+
try {
|
|
841
|
+
await file.writeFile(JSON.stringify(value));
|
|
842
|
+
await file.sync();
|
|
843
|
+
} finally {
|
|
844
|
+
await file.close();
|
|
845
|
+
}
|
|
846
|
+
await (0, import_promises2.rename)(temporary, path);
|
|
847
|
+
const directory = await (0, import_promises2.open)((0, import_node_path2.dirname)(path), "r");
|
|
848
|
+
try {
|
|
849
|
+
await directory.sync();
|
|
850
|
+
} finally {
|
|
851
|
+
await directory.close();
|
|
852
|
+
}
|
|
853
|
+
} catch (error) {
|
|
854
|
+
await (0, import_promises2.rm)(temporary, { force: true }).catch(() => void 0);
|
|
855
|
+
throw outputFailure("metadata_write_failed", error);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
async function prepareOutputOwnerDirectory(directory) {
|
|
859
|
+
try {
|
|
860
|
+
await (0, import_promises2.mkdir)(directory, { recursive: true, mode: 448 });
|
|
861
|
+
} catch (error) {
|
|
862
|
+
throw outputFailure("write_failed", error);
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
async function readOutputOwner(directory) {
|
|
866
|
+
let value;
|
|
867
|
+
try {
|
|
868
|
+
value = JSON.parse(await (0, import_promises2.readFile)((0, import_node_path2.join)(directory, "owner.json"), "utf8"));
|
|
869
|
+
} catch (error) {
|
|
870
|
+
if (error.code === "ENOENT") return void 0;
|
|
871
|
+
throw outputFailure("owner_read_failed", error);
|
|
872
|
+
}
|
|
873
|
+
if (!isOutputOwnerRecord(value)) throw outputFailure("owner_invalid");
|
|
874
|
+
return value;
|
|
875
|
+
}
|
|
876
|
+
function isOutputOwnerRecord(value) {
|
|
877
|
+
if (!value || typeof value !== "object") return false;
|
|
878
|
+
const owner = value;
|
|
879
|
+
if (owner.kind !== "exec_output_owner_v1") return false;
|
|
880
|
+
if (typeof owner.ownerId !== "string" || !owner.ownerId.trim()) return false;
|
|
881
|
+
return owner.completedAt === null || Number.isSafeInteger(owner.completedAt) && owner.completedAt >= 0;
|
|
882
|
+
}
|
|
883
|
+
async function lookupOutputSnapshot(directory, ownerId, id) {
|
|
884
|
+
let value;
|
|
885
|
+
try {
|
|
886
|
+
value = JSON.parse(
|
|
887
|
+
await (0, import_promises2.readFile)(outputSnapshotPath(directory, id), "utf8")
|
|
888
|
+
);
|
|
889
|
+
} catch (error) {
|
|
890
|
+
throw outputFailure("snapshot_unavailable", error);
|
|
891
|
+
}
|
|
892
|
+
if (!isStoredOutputSnapshot(value, ownerId, id))
|
|
893
|
+
throw outputFailure("snapshot_binding_invalid");
|
|
894
|
+
return value;
|
|
895
|
+
}
|
|
896
|
+
function isStoredOutputSnapshot(value, ownerId, id) {
|
|
897
|
+
if (!value || typeof value !== "object") return false;
|
|
898
|
+
const snapshot = value;
|
|
899
|
+
if (snapshot.kind !== "exec_output_snapshot_v1" || snapshot.ownerId !== ownerId)
|
|
900
|
+
return false;
|
|
901
|
+
if (typeof snapshot.streamId !== "string" || !ID.test(snapshot.streamId))
|
|
902
|
+
return false;
|
|
903
|
+
const body = snapshot.body;
|
|
904
|
+
if (!body || typeof body !== "object" || body.id !== id) return false;
|
|
905
|
+
return isExecOutputBody(body);
|
|
906
|
+
}
|
|
907
|
+
function isExecOutputBody(value) {
|
|
908
|
+
if (!value || typeof value !== "object") return false;
|
|
909
|
+
const body = value;
|
|
910
|
+
if (typeof body.id !== "string" || !ID.test(body.id)) return false;
|
|
911
|
+
if (body.stream !== "stdout" && body.stream !== "stderr") return false;
|
|
912
|
+
if (!Number.isSafeInteger(body.startByte) || body.startByte < 0) return false;
|
|
913
|
+
if (!Number.isSafeInteger(body.endByte) || body.endByte < body.startByte)
|
|
914
|
+
return false;
|
|
915
|
+
if (body.byteLength !== body.endByte - body.startByte) return false;
|
|
916
|
+
return typeof body.sha256 === "string" && /^sha256:[a-f0-9]{64}$/.test(body.sha256);
|
|
917
|
+
}
|
|
918
|
+
async function readOutputSnapshot(directory, ownerId, body) {
|
|
919
|
+
const snapshot = await lookupOutputSnapshot(directory, ownerId, body.id);
|
|
920
|
+
const stored = snapshot.body;
|
|
921
|
+
if (stored.stream !== body.stream || stored.startByte !== body.startByte || stored.endByte !== body.endByte || stored.byteLength !== body.byteLength || stored.sha256 !== body.sha256)
|
|
922
|
+
throw outputFailure("snapshot_binding_invalid");
|
|
923
|
+
return snapshot;
|
|
924
|
+
}
|
|
925
|
+
|
|
679
926
|
// plugins/exec/source/request-resources.ts
|
|
680
927
|
var ExecRequestResources = class {
|
|
681
928
|
constructor(manager, pending, preparation) {
|
|
@@ -694,6 +941,7 @@ var ExecRequestResources = class {
|
|
|
694
941
|
pending;
|
|
695
942
|
owned = /* @__PURE__ */ new Map();
|
|
696
943
|
restored = /* @__PURE__ */ new Map();
|
|
944
|
+
deliveries = /* @__PURE__ */ new Map();
|
|
697
945
|
started(processId, scope, settled, context) {
|
|
698
946
|
this.owned.set(processId, scope);
|
|
699
947
|
context?.requestWork?.trackUntil(settled);
|
|
@@ -701,6 +949,10 @@ var ExecRequestResources = class {
|
|
|
701
949
|
forget(processId) {
|
|
702
950
|
this.owned.delete(processId);
|
|
703
951
|
this.restored.delete(processId);
|
|
952
|
+
this.deliveries.delete(processId);
|
|
953
|
+
}
|
|
954
|
+
isRestored(processId) {
|
|
955
|
+
return this.restored.has(processId);
|
|
704
956
|
}
|
|
705
957
|
terminal(processId, scope, cursor) {
|
|
706
958
|
const entry = this.restored.get(processId);
|
|
@@ -715,10 +967,16 @@ var ExecRequestResources = class {
|
|
|
715
967
|
"stale_exec_process_cursor",
|
|
716
968
|
"The saved exec cursor is stale."
|
|
717
969
|
);
|
|
718
|
-
this.
|
|
719
|
-
|
|
970
|
+
return this.deliveries.get(processId).reserve({
|
|
971
|
+
...structuredClone(entry.snapshot),
|
|
972
|
+
nextCursor: entry.cursor
|
|
973
|
+
});
|
|
974
|
+
}
|
|
975
|
+
rejectTerminal(snapshot) {
|
|
976
|
+
this.deliveries.get(snapshot.processId)?.reject(snapshot);
|
|
720
977
|
}
|
|
721
978
|
snapshot() {
|
|
979
|
+
for (const delivery of this.deliveries.values()) delivery.assertAvailable();
|
|
722
980
|
const executions = [...this.restored.values()];
|
|
723
981
|
for (const [processId, scope] of this.owned) {
|
|
724
982
|
const execution = this.pending.get(processId);
|
|
@@ -735,16 +993,17 @@ var ExecRequestResources = class {
|
|
|
735
993
|
}
|
|
736
994
|
});
|
|
737
995
|
}
|
|
738
|
-
return { kind: "
|
|
996
|
+
return { kind: "exec_terminal_state_v2", executions };
|
|
739
997
|
}
|
|
740
998
|
restore(value) {
|
|
741
|
-
if (!isRecord(value) || value.kind !== "exec_terminal_state_v1" || !Array.isArray(value.executions))
|
|
999
|
+
if (!isRecord(value) || value.kind !== "exec_terminal_state_v1" && value.kind !== "exec_terminal_state_v2" || !Array.isArray(value.executions))
|
|
742
1000
|
throw invalid();
|
|
743
1001
|
for (const entry of value.executions) {
|
|
744
1002
|
if (!isSavedExecution(entry) || this.restored.has(entry.processId))
|
|
745
1003
|
throw invalid();
|
|
746
1004
|
const before = entry.execution.filesystemStateBefore;
|
|
747
1005
|
this.restored.set(entry.processId, structuredClone(entry));
|
|
1006
|
+
this.deliveries.set(entry.processId, new ExecTerminalDelivery());
|
|
748
1007
|
this.pending.set(entry.processId, {
|
|
749
1008
|
...structuredClone(entry.execution),
|
|
750
1009
|
filesystemStateBefore: before ? { ...before, entries: new Map(before.entries) } : null
|
|
@@ -766,16 +1025,15 @@ var ExecRequestResources = class {
|
|
|
766
1025
|
for (const id of this.restored.keys()) this.pending.delete(id);
|
|
767
1026
|
this.owned.clear();
|
|
768
1027
|
this.restored.clear();
|
|
1028
|
+
this.deliveries.clear();
|
|
769
1029
|
}
|
|
770
1030
|
};
|
|
771
1031
|
function isSavedExecution(value) {
|
|
772
|
-
if (!isRecord(value) || typeof value.processId !== "string" || typeof value.scope !== "string" || !Number.isSafeInteger(value.cursor) || value.cursor < 1 || !isRecord(value.snapshot) || value.snapshot.processId !== value.processId || value.snapshot.status !== "settled" || !isStream(value.snapshot.stdout) || !isStream(value.snapshot.stderr) || !Number.isFinite(value.snapshot.elapsedMs) || !isRecord(value.execution) || typeof value.execution.commandPreview !== "string" || !isRecord(value.execution.cwd) || typeof value.execution.cwd.absolutePath !== "string" || typeof value.execution.cwd.logicalPath !== "string")
|
|
1032
|
+
if (!isRecord(value) || typeof value.processId !== "string" || typeof value.scope !== "string" || !Number.isSafeInteger(value.cursor) || value.cursor < 1 || !isRecord(value.snapshot) || value.snapshot.processId !== value.processId || value.snapshot.status !== "settled" || !isStream(value.snapshot.stdout, "stdout") || !isStream(value.snapshot.stderr, "stderr") || !Number.isFinite(value.snapshot.elapsedMs) || !isRecord(value.execution) || typeof value.execution.commandPreview !== "string" || !isRecord(value.execution.cwd) || typeof value.execution.cwd.absolutePath !== "string" || typeof value.execution.cwd.logicalPath !== "string")
|
|
773
1033
|
return false;
|
|
774
|
-
if (![
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
value.execution.outputMaxChars
|
|
778
|
-
].every(Number.isFinite))
|
|
1034
|
+
if (![value.execution.hardTimeoutMs, value.execution.idleTimeoutMs].every(
|
|
1035
|
+
Number.isFinite
|
|
1036
|
+
))
|
|
779
1037
|
return false;
|
|
780
1038
|
const before = value.execution.filesystemStateBefore;
|
|
781
1039
|
return before === null || isRecord(before) && typeof before.absoluteRoot === "string" && typeof before.logicalRoot === "string" && typeof before.rootExists === "boolean" && typeof before.complete === "boolean" && Array.isArray(before.entries) && before.entries.every(
|
|
@@ -784,8 +1042,8 @@ function isSavedExecution(value) {
|
|
|
784
1042
|
)
|
|
785
1043
|
);
|
|
786
1044
|
}
|
|
787
|
-
function isStream(value) {
|
|
788
|
-
return isRecord(value) && typeof value.text === "string" && typeof value.sawOutput === "boolean" && isRecord(value.metadata) && typeof value.metadata.truncated === "boolean" && [
|
|
1045
|
+
function isStream(value, stream) {
|
|
1046
|
+
return isRecord(value) && typeof value.text === "string" && typeof value.sawOutput === "boolean" && (value.body === void 0 || isExecOutputBody(value.body) && value.body.stream === stream) && isRecord(value.metadata) && typeof value.metadata.truncated === "boolean" && [
|
|
789
1047
|
value.metadata.originalChars,
|
|
790
1048
|
value.metadata.returnedChars,
|
|
791
1049
|
value.metadata.omittedChars
|
|
@@ -799,10 +1057,10 @@ function invalid() {
|
|
|
799
1057
|
}
|
|
800
1058
|
|
|
801
1059
|
// plugins/exec/source/paths.ts
|
|
802
|
-
var
|
|
803
|
-
var
|
|
1060
|
+
var import_promises3 = require("node:fs/promises");
|
|
1061
|
+
var import_node_path3 = require("node:path");
|
|
804
1062
|
function resolveContextualDirectory(pluginContext, executionContext, requestedPath) {
|
|
805
|
-
if ((0,
|
|
1063
|
+
if ((0, import_node_path3.isAbsolute)(requestedPath)) return { absolutePath: requestedPath };
|
|
806
1064
|
const isWorkspaceAlias = requestedPath === "workspace" || requestedPath.startsWith("workspace/");
|
|
807
1065
|
const base = resolvePluginPath(
|
|
808
1066
|
{
|
|
@@ -812,18 +1070,18 @@ function resolveContextualDirectory(pluginContext, executionContext, requestedPa
|
|
|
812
1070
|
{ allowedLocations: [isWorkspaceAlias ? "workspace" : "agent_work"] }
|
|
813
1071
|
);
|
|
814
1072
|
const relativePath = isWorkspaceAlias ? requestedPath.slice("workspace".length + 1) || "." : requestedPath;
|
|
815
|
-
return { absolutePath: `${base.absolutePath}${
|
|
1073
|
+
return { absolutePath: `${base.absolutePath}${import_node_path3.sep}${relativePath}`, base };
|
|
816
1074
|
}
|
|
817
1075
|
function isOutsideExecContextBase(relativePath) {
|
|
818
1076
|
if (relativePath === "..") return true;
|
|
819
|
-
if (relativePath.startsWith(`..${
|
|
820
|
-
return (0,
|
|
1077
|
+
if (relativePath.startsWith(`..${import_node_path3.sep}`)) return true;
|
|
1078
|
+
return (0, import_node_path3.isAbsolute)(relativePath);
|
|
821
1079
|
}
|
|
822
1080
|
function logicalDirectory(absolutePath, base) {
|
|
823
1081
|
if (!base) return absolutePath;
|
|
824
|
-
const fromBase = (0,
|
|
1082
|
+
const fromBase = (0, import_node_path3.relative)(base.absolutePath, absolutePath);
|
|
825
1083
|
if (isOutsideExecContextBase(fromBase)) return absolutePath;
|
|
826
|
-
return
|
|
1084
|
+
return import_node_path3.posix.join(base.logicalPath, fromBase.split(import_node_path3.sep).join("/") || ".");
|
|
827
1085
|
}
|
|
828
1086
|
async function resolveExecWorkingDirectory(pluginContext, executionContext, rawPath) {
|
|
829
1087
|
const requestedPath = readRequiredString(rawPath, {
|
|
@@ -845,8 +1103,8 @@ async function resolveExecWorkingDirectory(pluginContext, executionContext, rawP
|
|
|
845
1103
|
let absolutePath;
|
|
846
1104
|
let info;
|
|
847
1105
|
try {
|
|
848
|
-
absolutePath = await (0,
|
|
849
|
-
info = await (0,
|
|
1106
|
+
absolutePath = await (0, import_promises3.realpath)(target.absolutePath);
|
|
1107
|
+
info = await (0, import_promises3.stat)(absolutePath);
|
|
850
1108
|
} catch (error) {
|
|
851
1109
|
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
852
1110
|
throw new ExecPluginError(
|
|
@@ -873,55 +1131,627 @@ async function resolveExecWorkingDirectory(pluginContext, executionContext, rawP
|
|
|
873
1131
|
|
|
874
1132
|
// plugins/exec/source/process-manager.ts
|
|
875
1133
|
var import_node_child_process = require("node:child_process");
|
|
876
|
-
var
|
|
1134
|
+
var import_node_crypto6 = require("node:crypto");
|
|
1135
|
+
var import_node_os = require("node:os");
|
|
1136
|
+
var import_node_path6 = require("node:path");
|
|
1137
|
+
|
|
1138
|
+
// plugins/exec/source/process-output.ts
|
|
1139
|
+
function streamReceipt2(body) {
|
|
1140
|
+
return {
|
|
1141
|
+
text: "",
|
|
1142
|
+
sawOutput: (body?.endByte ?? 0) > 0,
|
|
1143
|
+
metadata: {
|
|
1144
|
+
truncated: false,
|
|
1145
|
+
originalChars: 0,
|
|
1146
|
+
returnedChars: 0,
|
|
1147
|
+
omittedChars: 0
|
|
1148
|
+
},
|
|
1149
|
+
...body ? { body } : {}
|
|
1150
|
+
};
|
|
1151
|
+
}
|
|
1152
|
+
async function createExecProcessOutput(store, ownerId) {
|
|
1153
|
+
const stdout = await store.createWriter({ ownerId, stream: "stdout" });
|
|
1154
|
+
let stderr;
|
|
1155
|
+
try {
|
|
1156
|
+
stderr = await store.createWriter({ ownerId, stream: "stderr" });
|
|
1157
|
+
} catch (error) {
|
|
1158
|
+
await stdout.dispose();
|
|
1159
|
+
throw error;
|
|
1160
|
+
}
|
|
1161
|
+
const offsets = { stdout: 0, stderr: 0 };
|
|
1162
|
+
let settled;
|
|
1163
|
+
let failure;
|
|
1164
|
+
let finished2 = false;
|
|
1165
|
+
let tail = Promise.resolve();
|
|
1166
|
+
const serialize = async (operation) => {
|
|
1167
|
+
const previous = tail;
|
|
1168
|
+
let release = () => {
|
|
1169
|
+
};
|
|
1170
|
+
tail = new Promise((resolve2) => {
|
|
1171
|
+
release = resolve2;
|
|
1172
|
+
});
|
|
1173
|
+
await previous;
|
|
1174
|
+
try {
|
|
1175
|
+
return await operation();
|
|
1176
|
+
} finally {
|
|
1177
|
+
release();
|
|
1178
|
+
}
|
|
1179
|
+
};
|
|
1180
|
+
const recordFailure = (error) => {
|
|
1181
|
+
failure ??= error instanceof Error ? error.message : "exec_output_write_failed";
|
|
1182
|
+
};
|
|
1183
|
+
const capture = async () => {
|
|
1184
|
+
try {
|
|
1185
|
+
const out = await stdout.snapshot({
|
|
1186
|
+
startByte: offsets.stdout,
|
|
1187
|
+
endByte: finished2 ? stdout.byteLength : stdout.utf8ByteLength
|
|
1188
|
+
});
|
|
1189
|
+
const err = await stderr.snapshot({
|
|
1190
|
+
startByte: offsets.stderr,
|
|
1191
|
+
endByte: finished2 ? stderr.byteLength : stderr.utf8ByteLength
|
|
1192
|
+
});
|
|
1193
|
+
return {
|
|
1194
|
+
stdout: streamReceipt2(out),
|
|
1195
|
+
stderr: streamReceipt2(err),
|
|
1196
|
+
...failureReceipt()
|
|
1197
|
+
};
|
|
1198
|
+
} catch (error) {
|
|
1199
|
+
recordFailure(error);
|
|
1200
|
+
return {
|
|
1201
|
+
stdout: streamReceipt2(),
|
|
1202
|
+
stderr: streamReceipt2(),
|
|
1203
|
+
...failureReceipt()
|
|
1204
|
+
};
|
|
1205
|
+
}
|
|
1206
|
+
};
|
|
1207
|
+
const failureReceipt = () => failure ? {
|
|
1208
|
+
outputFailure: {
|
|
1209
|
+
code: failure,
|
|
1210
|
+
stdoutBytes: stdout.byteLength,
|
|
1211
|
+
stderrBytes: stderr.byteLength
|
|
1212
|
+
}
|
|
1213
|
+
} : {};
|
|
1214
|
+
return Object.freeze({
|
|
1215
|
+
attach(streams, onActivity, onFailure) {
|
|
1216
|
+
for (const name of ["stdout", "stderr"]) {
|
|
1217
|
+
const source = streams[name];
|
|
1218
|
+
const writer = name === "stdout" ? stdout : stderr;
|
|
1219
|
+
source.on("data", onActivity);
|
|
1220
|
+
const failed = (error) => {
|
|
1221
|
+
recordFailure(error);
|
|
1222
|
+
source.pause();
|
|
1223
|
+
onFailure();
|
|
1224
|
+
};
|
|
1225
|
+
writer.sink.on("error", failed);
|
|
1226
|
+
source.on("error", failed);
|
|
1227
|
+
source.pipe(writer.sink);
|
|
1228
|
+
}
|
|
1229
|
+
},
|
|
1230
|
+
async finish() {
|
|
1231
|
+
if (!stdout.sink.writableEnded) stdout.sink.end();
|
|
1232
|
+
if (!stderr.sink.writableEnded) stderr.sink.end();
|
|
1233
|
+
const outcomes = await Promise.allSettled([
|
|
1234
|
+
stdout.completion,
|
|
1235
|
+
stderr.completion
|
|
1236
|
+
]);
|
|
1237
|
+
for (const outcome of outcomes)
|
|
1238
|
+
if (outcome.status === "rejected") recordFailure(outcome.reason);
|
|
1239
|
+
await serialize(async () => {
|
|
1240
|
+
finished2 = true;
|
|
1241
|
+
settled = await capture();
|
|
1242
|
+
});
|
|
1243
|
+
},
|
|
1244
|
+
peek() {
|
|
1245
|
+
return serialize(async () => settled ?? await capture());
|
|
1246
|
+
},
|
|
1247
|
+
checkpoint() {
|
|
1248
|
+
if (!settled) throw new Error("exec_snapshot_not_quiescent");
|
|
1249
|
+
return settled;
|
|
1250
|
+
},
|
|
1251
|
+
accept(snapshot) {
|
|
1252
|
+
return serialize(async () => {
|
|
1253
|
+
if (snapshot.outputFailure)
|
|
1254
|
+
throw new Error("exec_output_not_delivered");
|
|
1255
|
+
for (const name of ["stdout", "stderr"]) {
|
|
1256
|
+
const body = snapshot[name].body;
|
|
1257
|
+
const writer = name === "stdout" ? stdout : stderr;
|
|
1258
|
+
if (!body || body.startByte !== offsets[name] || body.endByte > writer.byteLength)
|
|
1259
|
+
throw new Error("exec_output_snapshot_mismatch");
|
|
1260
|
+
}
|
|
1261
|
+
offsets.stdout = snapshot.stdout.body.endByte;
|
|
1262
|
+
offsets.stderr = snapshot.stderr.body.endByte;
|
|
1263
|
+
if (finished2) settled = await capture();
|
|
1264
|
+
});
|
|
1265
|
+
},
|
|
1266
|
+
async dispose() {
|
|
1267
|
+
await Promise.all([stdout.dispose(), stderr.dispose()]);
|
|
1268
|
+
}
|
|
1269
|
+
});
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
// plugins/exec/source/output-store.ts
|
|
1273
|
+
var import_promises9 = require("node:fs/promises");
|
|
1274
|
+
var import_node_path5 = require("node:path");
|
|
1275
|
+
|
|
1276
|
+
// plugins/exec/source/output-contracts.ts
|
|
1277
|
+
var DEFAULT_EXEC_OUTPUT_RETENTION_MS = 7 * 24 * 60 * 6e4;
|
|
1278
|
+
var EXEC_OUTPUT_IO_CHUNK_BYTES = 64 * 1024;
|
|
1279
|
+
|
|
1280
|
+
// plugins/exec/source/output-range-reader.ts
|
|
1281
|
+
var import_node_crypto4 = require("node:crypto");
|
|
1282
|
+
var import_promises4 = require("node:fs/promises");
|
|
1283
|
+
function assertOutputRange(startByte, endByte, availableBytes) {
|
|
1284
|
+
if (!Number.isSafeInteger(startByte) || startByte < 0)
|
|
1285
|
+
throw outputFailure("range_invalid");
|
|
1286
|
+
if (!Number.isSafeInteger(endByte) || endByte < startByte)
|
|
1287
|
+
throw outputFailure("range_invalid");
|
|
1288
|
+
if (endByte > availableBytes) throw outputFailure("range_invalid");
|
|
1289
|
+
}
|
|
1290
|
+
async function* readOutputFileRange(path, range) {
|
|
1291
|
+
assertOutputRange(
|
|
1292
|
+
range.offset,
|
|
1293
|
+
range.offset + range.length,
|
|
1294
|
+
Number.MAX_SAFE_INTEGER
|
|
1295
|
+
);
|
|
1296
|
+
if (!Number.isSafeInteger(range.maxChunkBytes) || range.maxChunkBytes < 1 || range.maxChunkBytes > EXEC_OUTPUT_IO_CHUNK_BYTES)
|
|
1297
|
+
throw outputFailure("chunk_size_invalid");
|
|
1298
|
+
range.signal?.throwIfAborted();
|
|
1299
|
+
const handle = await (0, import_promises4.open)(path, "r").catch((error) => {
|
|
1300
|
+
throw outputFailure("read_failed", error);
|
|
1301
|
+
});
|
|
1302
|
+
try {
|
|
1303
|
+
const end = range.offset + range.length;
|
|
1304
|
+
let position = range.offset;
|
|
1305
|
+
while (position < end) {
|
|
1306
|
+
range.signal?.throwIfAborted();
|
|
1307
|
+
const buffer = Buffer.allocUnsafe(
|
|
1308
|
+
Math.min(range.maxChunkBytes, end - position)
|
|
1309
|
+
);
|
|
1310
|
+
const { bytesRead } = await handle.read(
|
|
1311
|
+
buffer,
|
|
1312
|
+
0,
|
|
1313
|
+
buffer.length,
|
|
1314
|
+
position
|
|
1315
|
+
);
|
|
1316
|
+
if (bytesRead === 0) throw outputFailure("body_incomplete");
|
|
1317
|
+
position += bytesRead;
|
|
1318
|
+
yield buffer.subarray(0, bytesRead);
|
|
1319
|
+
}
|
|
1320
|
+
range.signal?.throwIfAborted();
|
|
1321
|
+
} catch (error) {
|
|
1322
|
+
if (range.signal?.aborted) throw error;
|
|
1323
|
+
if (error instanceof ExecPluginError) throw error;
|
|
1324
|
+
throw outputFailure("read_failed", error);
|
|
1325
|
+
} finally {
|
|
1326
|
+
await handle.close();
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
async function hashOutputRange(path, startByte, endByte, signal) {
|
|
1330
|
+
const hash = (0, import_node_crypto4.createHash)("sha256");
|
|
1331
|
+
for await (const chunk of readOutputFileRange(path, {
|
|
1332
|
+
offset: startByte,
|
|
1333
|
+
length: endByte - startByte,
|
|
1334
|
+
maxChunkBytes: EXEC_OUTPUT_IO_CHUNK_BYTES,
|
|
1335
|
+
...signal ? { signal } : {}
|
|
1336
|
+
}))
|
|
1337
|
+
hash.update(chunk);
|
|
1338
|
+
return `sha256:${hash.digest("hex")}`;
|
|
1339
|
+
}
|
|
1340
|
+
async function assertOutputBodyHash(path, body, signal) {
|
|
1341
|
+
assertOutputRange(body.startByte, body.endByte, Number.MAX_SAFE_INTEGER);
|
|
1342
|
+
if (body.byteLength !== body.endByte - body.startByte)
|
|
1343
|
+
throw outputFailure("snapshot_binding_invalid");
|
|
1344
|
+
if (await hashOutputRange(path, body.startByte, body.endByte, signal) !== body.sha256)
|
|
1345
|
+
throw outputFailure("body_hash_mismatch");
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
// plugins/exec/source/output-maintenance.ts
|
|
1349
|
+
var import_promises5 = require("node:fs/promises");
|
|
1350
|
+
var MAX_CLEANUP_INTERVAL_MS = 60 * 6e4;
|
|
1351
|
+
var jobs = /* @__PURE__ */ new Map();
|
|
1352
|
+
function scheduleExecOutputCleanup(root, retentionMs, cleanup) {
|
|
1353
|
+
const intervalMs = Math.max(
|
|
1354
|
+
1,
|
|
1355
|
+
Math.min(retentionMs, MAX_CLEANUP_INTERVAL_MS)
|
|
1356
|
+
);
|
|
1357
|
+
const previous = jobs.get(root);
|
|
1358
|
+
if (previous) {
|
|
1359
|
+
previous.cleanup = cleanup;
|
|
1360
|
+
previous.intervalMs = intervalMs;
|
|
1361
|
+
previous.requested = true;
|
|
1362
|
+
return;
|
|
1363
|
+
}
|
|
1364
|
+
const job = { cleanup, intervalMs, requested: false };
|
|
1365
|
+
jobs.set(root, job);
|
|
1366
|
+
const sweep = async () => {
|
|
1367
|
+
job.requested = false;
|
|
1368
|
+
let empty = false;
|
|
1369
|
+
try {
|
|
1370
|
+
await job.cleanup();
|
|
1371
|
+
empty = (await (0, import_promises5.readdir)(root).catch((error) => {
|
|
1372
|
+
if (error.code === "ENOENT") return [];
|
|
1373
|
+
throw error;
|
|
1374
|
+
})).length === 0;
|
|
1375
|
+
} catch {
|
|
1376
|
+
process.emitWarning(
|
|
1377
|
+
"EXEC output cleanup failed; a later sweep will retry.",
|
|
1378
|
+
{
|
|
1379
|
+
code: "EXEC_OUTPUT_CLEANUP_FAILED"
|
|
1380
|
+
}
|
|
1381
|
+
);
|
|
1382
|
+
}
|
|
1383
|
+
if (empty && !job.requested) {
|
|
1384
|
+
jobs.delete(root);
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
const timer = setTimeout(() => {
|
|
1388
|
+
void sweep();
|
|
1389
|
+
}, job.intervalMs);
|
|
1390
|
+
timer.unref();
|
|
1391
|
+
};
|
|
1392
|
+
void sweep();
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// plugins/exec/source/output-retention.ts
|
|
1396
|
+
var import_promises6 = require("node:fs/promises");
|
|
1397
|
+
var import_node_path4 = require("node:path");
|
|
1398
|
+
async function outputCaptureCompletedAt(directory, owner) {
|
|
1399
|
+
if (owner?.completedAt !== null && owner?.completedAt !== void 0)
|
|
1400
|
+
return owner.completedAt;
|
|
1401
|
+
const entries = await (0, import_promises6.readdir)(directory, { withFileTypes: true });
|
|
1402
|
+
const captures = entries.filter(
|
|
1403
|
+
(entry) => entry.isFile() && entry.name.endsWith(".bytes")
|
|
1404
|
+
);
|
|
1405
|
+
if (!captures.length) return (await (0, import_promises6.stat)(directory)).mtimeMs;
|
|
1406
|
+
const times = await Promise.all(
|
|
1407
|
+
captures.map(
|
|
1408
|
+
async (entry) => (await (0, import_promises6.stat)((0, import_node_path4.join)(directory, entry.name))).mtimeMs
|
|
1409
|
+
)
|
|
1410
|
+
);
|
|
1411
|
+
return Math.max(...times);
|
|
1412
|
+
}
|
|
1413
|
+
async function hasOutputExpired(directory, owner, now, retentionMs) {
|
|
1414
|
+
return now - await outputCaptureCompletedAt(directory, owner) >= retentionMs;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
// plugins/exec/source/output-utf8-boundary.ts
|
|
1418
|
+
function incompleteUtf8TailBytes(tail) {
|
|
1419
|
+
if (tail.length === 0) return 0;
|
|
1420
|
+
let lead = tail.length - 1;
|
|
1421
|
+
while (lead >= 0 && (tail[lead] & 192) === 128) lead -= 1;
|
|
1422
|
+
if (lead < 0) return 0;
|
|
1423
|
+
const byte = tail[lead];
|
|
1424
|
+
let expected = 1;
|
|
1425
|
+
if (byte >= 194 && byte <= 223) expected = 2;
|
|
1426
|
+
if (byte >= 224 && byte <= 239) expected = 3;
|
|
1427
|
+
if (byte >= 240 && byte <= 244) expected = 4;
|
|
1428
|
+
const available = tail.length - lead;
|
|
1429
|
+
return available < expected ? available : 0;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
// plugins/exec/source/output-writer.ts
|
|
1433
|
+
var import_node_crypto5 = require("node:crypto");
|
|
1434
|
+
var import_promises7 = require("node:fs/promises");
|
|
1435
|
+
var import_node_stream = require("node:stream");
|
|
1436
|
+
var import_promises8 = require("node:stream/promises");
|
|
1437
|
+
var OutputFileSink = class extends import_node_stream.Writable {
|
|
1438
|
+
constructor(file) {
|
|
1439
|
+
super({ highWaterMark: EXEC_OUTPUT_IO_CHUNK_BYTES });
|
|
1440
|
+
this.file = file;
|
|
1441
|
+
}
|
|
1442
|
+
file;
|
|
1443
|
+
committedBytes = 0;
|
|
1444
|
+
utf8ByteLength = 0;
|
|
1445
|
+
tail = Buffer.alloc(0);
|
|
1446
|
+
_write(chunk, _encoding, callback) {
|
|
1447
|
+
this.writeChunk(chunk).then(
|
|
1448
|
+
() => callback(),
|
|
1449
|
+
(error) => callback(outputFailure("write_failed", error))
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
async writeChunk(chunk) {
|
|
1453
|
+
let offset = 0;
|
|
1454
|
+
while (offset < chunk.length) {
|
|
1455
|
+
const length = Math.min(
|
|
1456
|
+
EXEC_OUTPUT_IO_CHUNK_BYTES,
|
|
1457
|
+
chunk.length - offset
|
|
1458
|
+
);
|
|
1459
|
+
const { bytesWritten } = await this.file.write(
|
|
1460
|
+
chunk,
|
|
1461
|
+
offset,
|
|
1462
|
+
length,
|
|
1463
|
+
this.committedBytes
|
|
1464
|
+
);
|
|
1465
|
+
if (bytesWritten === 0) throw outputFailure("write_zero_progress");
|
|
1466
|
+
const written = chunk.subarray(offset, offset + bytesWritten);
|
|
1467
|
+
this.tail = Buffer.concat([this.tail, written.subarray(-4)]).subarray(-4);
|
|
1468
|
+
offset += bytesWritten;
|
|
1469
|
+
this.committedBytes += bytesWritten;
|
|
1470
|
+
this.utf8ByteLength = this.committedBytes - incompleteUtf8TailBytes(this.tail);
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
_final(callback) {
|
|
1474
|
+
this.file.datasync().then(
|
|
1475
|
+
() => callback(),
|
|
1476
|
+
(error) => callback(outputFailure("write_failed", error))
|
|
1477
|
+
);
|
|
1478
|
+
}
|
|
1479
|
+
_destroy(error, callback) {
|
|
1480
|
+
this.file.close().then(
|
|
1481
|
+
() => callback(error),
|
|
1482
|
+
(cause) => callback(error ?? outputFailure("close_failed", cause))
|
|
1483
|
+
);
|
|
1484
|
+
}
|
|
1485
|
+
};
|
|
1486
|
+
async function createOutputWriter(params) {
|
|
1487
|
+
const streamId = (0, import_node_crypto5.randomUUID)();
|
|
1488
|
+
const path = outputStreamPath(params.directory, streamId);
|
|
1489
|
+
const file = await (0, import_promises7.open)(path, "wx+", 384).catch((error) => {
|
|
1490
|
+
throw outputFailure("write_failed", error);
|
|
1491
|
+
});
|
|
1492
|
+
const sink = new OutputFileSink(file);
|
|
1493
|
+
const completion = (0, import_promises8.finished)(sink).finally(params.onClosed);
|
|
1494
|
+
void completion.catch(() => void 0);
|
|
1495
|
+
return Object.freeze({
|
|
1496
|
+
sink,
|
|
1497
|
+
get byteLength() {
|
|
1498
|
+
return sink.committedBytes;
|
|
1499
|
+
},
|
|
1500
|
+
get utf8ByteLength() {
|
|
1501
|
+
return sink.utf8ByteLength;
|
|
1502
|
+
},
|
|
1503
|
+
completion,
|
|
1504
|
+
async snapshot(range = {
|
|
1505
|
+
startByte: 0
|
|
1506
|
+
}) {
|
|
1507
|
+
if (sink.errored) throw sink.errored;
|
|
1508
|
+
const startByte = range.startByte;
|
|
1509
|
+
const endByte = range.endByte ?? sink.committedBytes;
|
|
1510
|
+
assertOutputRange(startByte, endByte, sink.committedBytes);
|
|
1511
|
+
const body = Object.freeze({
|
|
1512
|
+
id: (0, import_node_crypto5.randomUUID)(),
|
|
1513
|
+
stream: params.stream,
|
|
1514
|
+
startByte,
|
|
1515
|
+
endByte,
|
|
1516
|
+
byteLength: endByte - startByte,
|
|
1517
|
+
sha256: await hashOutputRange(path, startByte, endByte)
|
|
1518
|
+
});
|
|
1519
|
+
await writeOutputMetadata(outputSnapshotPath(params.directory, body.id), {
|
|
1520
|
+
kind: "exec_output_snapshot_v1",
|
|
1521
|
+
ownerId: params.ownerId,
|
|
1522
|
+
streamId,
|
|
1523
|
+
body
|
|
1524
|
+
});
|
|
1525
|
+
return body;
|
|
1526
|
+
},
|
|
1527
|
+
async dispose() {
|
|
1528
|
+
if (!sink.destroyed) sink.destroy();
|
|
1529
|
+
await completion.catch(() => void 0);
|
|
1530
|
+
}
|
|
1531
|
+
});
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
// plugins/exec/source/output-store.ts
|
|
1535
|
+
var activeWriters = /* @__PURE__ */ new Map();
|
|
1536
|
+
var activeReaders = /* @__PURE__ */ new Map();
|
|
1537
|
+
var ownerOperations = /* @__PURE__ */ new Map();
|
|
1538
|
+
async function withOutputOwnerLock(directory, operation) {
|
|
1539
|
+
const previous = ownerOperations.get(directory) ?? Promise.resolve();
|
|
1540
|
+
let release = () => {
|
|
1541
|
+
};
|
|
1542
|
+
const current = new Promise((resolve2) => {
|
|
1543
|
+
release = resolve2;
|
|
1544
|
+
});
|
|
1545
|
+
ownerOperations.set(directory, current);
|
|
1546
|
+
await previous;
|
|
1547
|
+
try {
|
|
1548
|
+
return await operation();
|
|
1549
|
+
} finally {
|
|
1550
|
+
release();
|
|
1551
|
+
if (ownerOperations.get(directory) === current)
|
|
1552
|
+
ownerOperations.delete(directory);
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
function createExecOutputStore(params) {
|
|
1556
|
+
const root = outputStorageRoot(params.stateDir);
|
|
1557
|
+
const retentionMs = params.retentionMs ?? DEFAULT_EXEC_OUTPUT_RETENTION_MS;
|
|
1558
|
+
if (!Number.isSafeInteger(retentionMs) || retentionMs < 0)
|
|
1559
|
+
throw outputFailure("retention_invalid");
|
|
1560
|
+
const now = params.now ?? Date.now;
|
|
1561
|
+
async function retain(directory, ownerId) {
|
|
1562
|
+
await prepareOutputOwnerDirectory(directory);
|
|
1563
|
+
const previous = await readOutputOwner(directory);
|
|
1564
|
+
if (previous && previous.ownerId !== ownerId)
|
|
1565
|
+
throw outputFailure("owner_binding_invalid");
|
|
1566
|
+
if (previous?.completedAt === null) return;
|
|
1567
|
+
await writeOutputMetadata((0, import_node_path5.join)(directory, "owner.json"), {
|
|
1568
|
+
kind: "exec_output_owner_v1",
|
|
1569
|
+
ownerId,
|
|
1570
|
+
completedAt: null
|
|
1571
|
+
});
|
|
1572
|
+
}
|
|
1573
|
+
const store = Object.freeze({
|
|
1574
|
+
async createWriter(input) {
|
|
1575
|
+
if (input.stream !== "stdout" && input.stream !== "stderr")
|
|
1576
|
+
throw outputFailure("stream_invalid");
|
|
1577
|
+
const directory = outputOwnerDirectory(root, input.ownerId);
|
|
1578
|
+
return withOutputOwnerLock(directory, async () => {
|
|
1579
|
+
await retain(directory, input.ownerId);
|
|
1580
|
+
const writer = await createOutputWriter({
|
|
1581
|
+
directory,
|
|
1582
|
+
ownerId: input.ownerId,
|
|
1583
|
+
stream: input.stream,
|
|
1584
|
+
async onClosed() {
|
|
1585
|
+
await withOutputOwnerLock(directory, async () => {
|
|
1586
|
+
const count = (activeWriters.get(directory) ?? 1) - 1;
|
|
1587
|
+
if (count > 0) activeWriters.set(directory, count);
|
|
1588
|
+
if (count > 0) return;
|
|
1589
|
+
activeWriters.delete(directory);
|
|
1590
|
+
await writeOutputMetadata((0, import_node_path5.join)(directory, "owner.json"), {
|
|
1591
|
+
kind: "exec_output_owner_v1",
|
|
1592
|
+
ownerId: input.ownerId,
|
|
1593
|
+
completedAt: now()
|
|
1594
|
+
});
|
|
1595
|
+
});
|
|
1596
|
+
}
|
|
1597
|
+
});
|
|
1598
|
+
activeWriters.set(directory, (activeWriters.get(directory) ?? 0) + 1);
|
|
1599
|
+
store.startMaintenance();
|
|
1600
|
+
return writer;
|
|
1601
|
+
});
|
|
1602
|
+
},
|
|
1603
|
+
async *readRange(input) {
|
|
1604
|
+
const directory = outputOwnerDirectory(root, input.ownerId);
|
|
1605
|
+
assertOutputRange(
|
|
1606
|
+
input.offset,
|
|
1607
|
+
input.offset + input.length,
|
|
1608
|
+
input.body.byteLength
|
|
1609
|
+
);
|
|
1610
|
+
await withOutputOwnerLock(directory, async () => {
|
|
1611
|
+
const owner = await readOutputOwner(directory);
|
|
1612
|
+
if (!owner) throw outputFailure("expired_or_unavailable");
|
|
1613
|
+
if (owner.ownerId !== input.ownerId)
|
|
1614
|
+
throw outputFailure("owner_binding_invalid");
|
|
1615
|
+
if (!activeWriters.has(directory) && await hasOutputExpired(directory, owner, now(), retentionMs))
|
|
1616
|
+
throw outputFailure("expired");
|
|
1617
|
+
activeReaders.set(directory, (activeReaders.get(directory) ?? 0) + 1);
|
|
1618
|
+
});
|
|
1619
|
+
try {
|
|
1620
|
+
const snapshot = await readOutputSnapshot(
|
|
1621
|
+
directory,
|
|
1622
|
+
input.ownerId,
|
|
1623
|
+
input.body
|
|
1624
|
+
);
|
|
1625
|
+
const path = outputStreamPath(directory, snapshot.streamId);
|
|
1626
|
+
await assertOutputBodyHash(path, input.body, input.signal);
|
|
1627
|
+
yield* readOutputFileRange(path, {
|
|
1628
|
+
offset: input.body.startByte + input.offset,
|
|
1629
|
+
length: input.length,
|
|
1630
|
+
maxChunkBytes: input.maxChunkBytes,
|
|
1631
|
+
...input.signal ? { signal: input.signal } : {}
|
|
1632
|
+
});
|
|
1633
|
+
} finally {
|
|
1634
|
+
const count = (activeReaders.get(directory) ?? 1) - 1;
|
|
1635
|
+
if (count > 0) activeReaders.set(directory, count);
|
|
1636
|
+
if (count === 0) activeReaders.delete(directory);
|
|
1637
|
+
}
|
|
1638
|
+
},
|
|
1639
|
+
startMaintenance() {
|
|
1640
|
+
scheduleExecOutputCleanup(
|
|
1641
|
+
root,
|
|
1642
|
+
retentionMs,
|
|
1643
|
+
() => store.cleanupExpired()
|
|
1644
|
+
);
|
|
1645
|
+
},
|
|
1646
|
+
async cleanupExpired() {
|
|
1647
|
+
const directories = await (0, import_promises9.readdir)(root, { withFileTypes: true }).catch(
|
|
1648
|
+
(error) => {
|
|
1649
|
+
if (error.code === "ENOENT") return [];
|
|
1650
|
+
throw outputFailure("cleanup_failed", error);
|
|
1651
|
+
}
|
|
1652
|
+
);
|
|
1653
|
+
let removed = 0;
|
|
1654
|
+
for (const entry of directories) {
|
|
1655
|
+
if (!entry.isDirectory() || !/^[a-f0-9]{64}$/.test(entry.name))
|
|
1656
|
+
continue;
|
|
1657
|
+
const directory = (0, import_node_path5.join)(root, entry.name);
|
|
1658
|
+
await withOutputOwnerLock(directory, async () => {
|
|
1659
|
+
if (activeWriters.has(directory)) return;
|
|
1660
|
+
if (activeReaders.has(directory)) return;
|
|
1661
|
+
const owner = await readOutputOwner(directory);
|
|
1662
|
+
if (owner && outputOwnerDirectory(root, owner.ownerId) !== directory)
|
|
1663
|
+
throw outputFailure("owner_binding_invalid");
|
|
1664
|
+
if (!await hasOutputExpired(directory, owner, now(), retentionMs))
|
|
1665
|
+
return;
|
|
1666
|
+
await (0, import_promises9.rm)(directory, { recursive: true });
|
|
1667
|
+
removed += 1;
|
|
1668
|
+
});
|
|
1669
|
+
}
|
|
1670
|
+
return removed;
|
|
1671
|
+
}
|
|
1672
|
+
});
|
|
1673
|
+
return store;
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
// plugins/exec/source/output-snapshot.ts
|
|
877
1677
|
var import_node_string_decoder = require("node:string_decoder");
|
|
878
1678
|
|
|
879
1679
|
// plugins/exec/source/process-output-buffer.ts
|
|
880
|
-
var
|
|
881
|
-
constructor(maxChars) {
|
|
882
|
-
this.maxChars = maxChars;
|
|
883
|
-
}
|
|
884
|
-
maxChars;
|
|
1680
|
+
var ExecOutputBuffer = class {
|
|
885
1681
|
text = "";
|
|
886
|
-
originalChars = 0;
|
|
887
|
-
omittedChars = 0;
|
|
888
1682
|
sawOutput = false;
|
|
889
1683
|
append(chunk) {
|
|
890
1684
|
if (!chunk) return;
|
|
891
|
-
const safeChunk = sanitizeJsonText(chunk);
|
|
892
1685
|
this.sawOutput = true;
|
|
893
|
-
this.
|
|
894
|
-
const available = Math.max(this.maxChars - this.text.length, 0);
|
|
895
|
-
this.text += safeChunk.slice(0, available);
|
|
896
|
-
this.omittedChars += Math.max(safeChunk.length - available, 0);
|
|
1686
|
+
this.text += sanitizeJsonText(chunk);
|
|
897
1687
|
}
|
|
898
1688
|
peek() {
|
|
899
1689
|
const text = this.text;
|
|
900
|
-
const originalChars = this.originalChars;
|
|
901
|
-
const omittedChars = this.omittedChars;
|
|
902
1690
|
return Object.freeze({
|
|
903
1691
|
text,
|
|
904
1692
|
sawOutput: this.sawOutput,
|
|
905
1693
|
metadata: Object.freeze({
|
|
906
|
-
truncated:
|
|
907
|
-
originalChars,
|
|
1694
|
+
truncated: false,
|
|
1695
|
+
originalChars: text.length,
|
|
908
1696
|
returnedChars: text.length,
|
|
909
|
-
omittedChars
|
|
1697
|
+
omittedChars: 0
|
|
910
1698
|
})
|
|
911
1699
|
});
|
|
912
1700
|
}
|
|
1701
|
+
accept(snapshot) {
|
|
1702
|
+
if (!this.text.startsWith(snapshot.text)) {
|
|
1703
|
+
throw new Error("exec_output_snapshot_mismatch");
|
|
1704
|
+
}
|
|
1705
|
+
this.text = this.text.slice(snapshot.text.length);
|
|
1706
|
+
}
|
|
913
1707
|
consume() {
|
|
914
1708
|
const result = this.peek();
|
|
915
|
-
this.
|
|
916
|
-
this.originalChars = 0;
|
|
917
|
-
this.omittedChars = 0;
|
|
1709
|
+
this.accept(result);
|
|
918
1710
|
return result;
|
|
919
1711
|
}
|
|
920
1712
|
};
|
|
921
1713
|
|
|
1714
|
+
// plugins/exec/source/output-snapshot.ts
|
|
1715
|
+
function execOutputOwner(scope, processId) {
|
|
1716
|
+
return JSON.stringify([scope, processId]);
|
|
1717
|
+
}
|
|
1718
|
+
async function materializeExecOutput(store, scope, snapshot) {
|
|
1719
|
+
if (snapshot.outputFailure) return snapshot;
|
|
1720
|
+
const ownerId = execOutputOwner(scope, snapshot.processId);
|
|
1721
|
+
async function read(stream) {
|
|
1722
|
+
if (!stream.body) return stream;
|
|
1723
|
+
const decoder = new import_node_string_decoder.StringDecoder("utf8");
|
|
1724
|
+
const buffer = new ExecOutputBuffer();
|
|
1725
|
+
for await (const chunk of store.readRange({
|
|
1726
|
+
ownerId,
|
|
1727
|
+
body: stream.body,
|
|
1728
|
+
offset: 0,
|
|
1729
|
+
length: stream.body.byteLength,
|
|
1730
|
+
maxChunkBytes: EXEC_OUTPUT_IO_CHUNK_BYTES
|
|
1731
|
+
}))
|
|
1732
|
+
buffer.append(decoder.write(Buffer.from(chunk)));
|
|
1733
|
+
buffer.append(decoder.end());
|
|
1734
|
+
return { ...buffer.peek(), sawOutput: stream.sawOutput, body: stream.body };
|
|
1735
|
+
}
|
|
1736
|
+
try {
|
|
1737
|
+
const stdout = await read(snapshot.stdout);
|
|
1738
|
+
const stderr = await read(snapshot.stderr);
|
|
1739
|
+
return { ...snapshot, stdout, stderr };
|
|
1740
|
+
} catch (error) {
|
|
1741
|
+
return {
|
|
1742
|
+
...snapshot,
|
|
1743
|
+
outputFailure: {
|
|
1744
|
+
code: error instanceof ExecPluginError ? error.code : "exec_output_read_failed",
|
|
1745
|
+
stdoutBytes: snapshot.stdout.body?.byteLength ?? 0,
|
|
1746
|
+
stderrBytes: snapshot.stderr.body?.byteLength ?? 0
|
|
1747
|
+
}
|
|
1748
|
+
};
|
|
1749
|
+
}
|
|
1750
|
+
}
|
|
1751
|
+
|
|
922
1752
|
// plugins/exec/source/shell-platform.ts
|
|
923
1753
|
var import_node_fs2 = require("node:fs");
|
|
924
|
-
var
|
|
1754
|
+
var import_promises10 = require("node:fs/promises");
|
|
925
1755
|
var EXEC_SHELL = "/bin/bash";
|
|
926
1756
|
function isSupportedExecPlatform(platform) {
|
|
927
1757
|
return platform === "linux" || platform === "darwin";
|
|
@@ -934,7 +1764,7 @@ async function assertSupportedShell(platform = process.platform) {
|
|
|
934
1764
|
);
|
|
935
1765
|
}
|
|
936
1766
|
try {
|
|
937
|
-
await (0,
|
|
1767
|
+
await (0, import_promises10.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
|
|
938
1768
|
} catch {
|
|
939
1769
|
throw new ExecPluginError(
|
|
940
1770
|
"exec_shell_unavailable",
|
|
@@ -944,22 +1774,23 @@ async function assertSupportedShell(platform = process.platform) {
|
|
|
944
1774
|
}
|
|
945
1775
|
|
|
946
1776
|
// plugins/exec/source/process-manager.ts
|
|
947
|
-
var COMPLETED_PROCESS_RETENTION_MS = 5 * 6e4;
|
|
948
1777
|
var MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
|
|
949
|
-
function createExecProcessManager(
|
|
1778
|
+
function createExecProcessManager(store = createExecOutputStore({
|
|
1779
|
+
stateDir: (0, import_node_path6.join)((0, import_node_os.tmpdir)(), "abot-exec")
|
|
1780
|
+
})) {
|
|
950
1781
|
const processes = /* @__PURE__ */ new Map();
|
|
1782
|
+
const opening = /* @__PURE__ */ new Map();
|
|
951
1783
|
const unknownProcess = () => new ExecPluginError(
|
|
952
1784
|
"unknown_exec_process",
|
|
953
1785
|
"The exec process is unknown to this plugin instance and session."
|
|
954
1786
|
);
|
|
955
1787
|
const dispose = (managed) => {
|
|
956
|
-
if (managed.retentionTimeout) clearTimeout(managed.retentionTimeout);
|
|
957
1788
|
processes.delete(managed.processId);
|
|
958
1789
|
managed.onDisposed?.(managed.processId);
|
|
959
1790
|
};
|
|
960
1791
|
const activeProcessCount = (scope) => [...processes.values()].filter(
|
|
961
1792
|
(managed) => managed.scope === scope && !managed.settled
|
|
962
|
-
).length;
|
|
1793
|
+
).length + (opening.get(scope) ?? 0);
|
|
963
1794
|
const killProcessTree = (managed) => {
|
|
964
1795
|
const pid = managed.child.pid;
|
|
965
1796
|
if (typeof pid === "number") {
|
|
@@ -975,8 +1806,13 @@ function createExecProcessManager() {
|
|
|
975
1806
|
if (managed.settled || managed.terminationReason) return;
|
|
976
1807
|
managed.terminationReason = reason;
|
|
977
1808
|
killProcessTree(managed);
|
|
1809
|
+
if (reason === "output_storage_failed") {
|
|
1810
|
+
managed.child.stdout.destroy();
|
|
1811
|
+
managed.child.stderr.destroy();
|
|
1812
|
+
}
|
|
978
1813
|
};
|
|
979
1814
|
const scheduleIdleTimeout = (managed, idleTimeoutMs) => {
|
|
1815
|
+
if (managed.settling || managed.settled) return;
|
|
980
1816
|
if (managed.idleTimeout) clearTimeout(managed.idleTimeout);
|
|
981
1817
|
managed.idleTimeout = setTimeout(
|
|
982
1818
|
() => requestTermination(managed, "idle_timeout"),
|
|
@@ -984,11 +1820,17 @@ function createExecProcessManager() {
|
|
|
984
1820
|
);
|
|
985
1821
|
managed.idleTimeout.unref?.();
|
|
986
1822
|
};
|
|
987
|
-
const settle = (managed, exitCode, fallbackReason) => {
|
|
988
|
-
if (managed.settled) return;
|
|
1823
|
+
const settle = async (managed, exitCode, fallbackReason) => {
|
|
1824
|
+
if (managed.settling || managed.settled) return;
|
|
1825
|
+
managed.settling = true;
|
|
1826
|
+
if (managed.hardTimeout) clearTimeout(managed.hardTimeout);
|
|
1827
|
+
if (managed.idleTimeout) clearTimeout(managed.idleTimeout);
|
|
1828
|
+
await managed.output.finish();
|
|
989
1829
|
managed.settled = true;
|
|
1830
|
+
if (managed.output.checkpoint().outputFailure)
|
|
1831
|
+
managed.terminationReason = "output_storage_failed";
|
|
990
1832
|
managed.terminationReason ??= fallbackReason;
|
|
991
|
-
managed.exitCode = managed.terminationReason === "hard_timeout" || managed.terminationReason === "idle_timeout" ? 124 : managed.terminationReason === "cancelled" || managed.terminationReason === "aborted" ? 130 : exitCode;
|
|
1833
|
+
managed.exitCode = managed.terminationReason === "hard_timeout" || managed.terminationReason === "idle_timeout" ? 124 : managed.terminationReason === "cancelled" || managed.terminationReason === "aborted" ? 130 : managed.terminationReason === "output_storage_failed" ? -1 : exitCode;
|
|
992
1834
|
if (managed.hardTimeout) clearTimeout(managed.hardTimeout);
|
|
993
1835
|
if (managed.idleTimeout) clearTimeout(managed.idleTimeout);
|
|
994
1836
|
if (managed.abortSignal && managed.abortListener) {
|
|
@@ -999,35 +1841,43 @@ function createExecProcessManager() {
|
|
|
999
1841
|
dispose(managed);
|
|
1000
1842
|
return;
|
|
1001
1843
|
}
|
|
1002
|
-
managed.retentionTimeout = setTimeout(
|
|
1003
|
-
() => dispose(managed),
|
|
1004
|
-
COMPLETED_PROCESS_RETENTION_MS
|
|
1005
|
-
);
|
|
1006
|
-
managed.retentionTimeout.unref?.();
|
|
1007
1844
|
};
|
|
1008
|
-
const
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1845
|
+
const peekSnapshot = async (managed) => {
|
|
1846
|
+
managed.terminalDelivery.assertAvailable();
|
|
1847
|
+
const status = managed.settled ? "settled" : "running";
|
|
1848
|
+
const output = await managed.output.peek();
|
|
1849
|
+
if (output.outputFailure && !managed.settled) {
|
|
1850
|
+
requestTermination(managed, "output_storage_failed");
|
|
1851
|
+
await managed.settlePromise;
|
|
1852
|
+
return peekSnapshot(managed);
|
|
1012
1853
|
}
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1854
|
+
const snapshot = await materializeExecOutput(
|
|
1855
|
+
store,
|
|
1856
|
+
managed.scope,
|
|
1857
|
+
Object.freeze({
|
|
1858
|
+
processId: managed.processId,
|
|
1859
|
+
status,
|
|
1860
|
+
nextCursor: managed.cursor,
|
|
1861
|
+
...managed.exitCode === void 0 ? {} : { exitCode: managed.exitCode },
|
|
1862
|
+
...output,
|
|
1863
|
+
...managed.terminationReason ? { terminationReason: managed.terminationReason } : {},
|
|
1864
|
+
elapsedMs: Date.now() - managed.startedAt
|
|
1865
|
+
})
|
|
1866
|
+
);
|
|
1867
|
+
if (snapshot.outputFailure && !managed.settled) {
|
|
1868
|
+
requestTermination(managed, "output_storage_failed");
|
|
1869
|
+
await managed.settlePromise;
|
|
1870
|
+
return peekSnapshot(managed);
|
|
1871
|
+
}
|
|
1872
|
+
return managed.terminalDelivery.reserve(snapshot);
|
|
1023
1873
|
};
|
|
1024
1874
|
const waitForSettlement = async (managed, waitMs) => {
|
|
1025
1875
|
if (managed.settled) return;
|
|
1026
1876
|
let timeout;
|
|
1027
1877
|
await Promise.race([
|
|
1028
1878
|
managed.settlePromise,
|
|
1029
|
-
new Promise((
|
|
1030
|
-
timeout = setTimeout(
|
|
1879
|
+
new Promise((resolve2) => {
|
|
1880
|
+
timeout = setTimeout(resolve2, waitMs);
|
|
1031
1881
|
timeout.unref?.();
|
|
1032
1882
|
})
|
|
1033
1883
|
]);
|
|
@@ -1043,8 +1893,8 @@ function createExecProcessManager() {
|
|
|
1043
1893
|
const withProcessTransition = async (managed, operation) => {
|
|
1044
1894
|
const previous = managed.transitionTail;
|
|
1045
1895
|
let releaseTransition = () => void 0;
|
|
1046
|
-
managed.transitionTail = new Promise((
|
|
1047
|
-
releaseTransition =
|
|
1896
|
+
managed.transitionTail = new Promise((resolve2) => {
|
|
1897
|
+
releaseTransition = resolve2;
|
|
1048
1898
|
});
|
|
1049
1899
|
await previous;
|
|
1050
1900
|
try {
|
|
@@ -1063,9 +1913,27 @@ function createExecProcessManager() {
|
|
|
1063
1913
|
`The session already has ${MAX_ACTIVE_PROCESSES_PER_SCOPE} active exec processes.`
|
|
1064
1914
|
);
|
|
1065
1915
|
}
|
|
1916
|
+
opening.set(params.scope, (opening.get(params.scope) ?? 0) + 1);
|
|
1917
|
+
const processId = `exec_${(0, import_node_crypto6.randomUUID)()}`;
|
|
1918
|
+
let output;
|
|
1919
|
+
try {
|
|
1920
|
+
await store.cleanupExpired();
|
|
1921
|
+
output = await createExecProcessOutput(
|
|
1922
|
+
store,
|
|
1923
|
+
execOutputOwner(params.scope, processId)
|
|
1924
|
+
);
|
|
1925
|
+
if (params.abortSignal?.aborted) {
|
|
1926
|
+
await output.dispose();
|
|
1927
|
+
params.abortSignal.throwIfAborted();
|
|
1928
|
+
}
|
|
1929
|
+
} finally {
|
|
1930
|
+
const count = opening.get(params.scope) - 1;
|
|
1931
|
+
if (count) opening.set(params.scope, count);
|
|
1932
|
+
else opening.delete(params.scope);
|
|
1933
|
+
}
|
|
1066
1934
|
let resolveSettled = () => void 0;
|
|
1067
|
-
const settlePromise = new Promise((
|
|
1068
|
-
resolveSettled =
|
|
1935
|
+
const settlePromise = new Promise((resolve2) => {
|
|
1936
|
+
resolveSettled = resolve2;
|
|
1069
1937
|
});
|
|
1070
1938
|
let child;
|
|
1071
1939
|
try {
|
|
@@ -1075,51 +1943,41 @@ function createExecProcessManager() {
|
|
|
1075
1943
|
stdio: ["ignore", "pipe", "pipe"]
|
|
1076
1944
|
});
|
|
1077
1945
|
} catch {
|
|
1946
|
+
await output.dispose();
|
|
1078
1947
|
throw new ExecPluginError(
|
|
1079
1948
|
"exec_spawn_failed",
|
|
1080
1949
|
"The runtime could not start the configured non-interactive shell."
|
|
1081
1950
|
);
|
|
1082
1951
|
}
|
|
1083
1952
|
const managed = {
|
|
1084
|
-
processId
|
|
1953
|
+
processId,
|
|
1085
1954
|
scope: params.scope,
|
|
1086
1955
|
child,
|
|
1087
1956
|
startedAt: Date.now(),
|
|
1088
1957
|
cursor: 1,
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
stdoutDecoder: new import_node_string_decoder.StringDecoder("utf8"),
|
|
1092
|
-
stderrDecoder: new import_node_string_decoder.StringDecoder("utf8"),
|
|
1958
|
+
output,
|
|
1959
|
+
settling: false,
|
|
1093
1960
|
settled: false,
|
|
1094
1961
|
settlePromise,
|
|
1095
1962
|
resolveSettled,
|
|
1096
1963
|
transitionTail: Promise.resolve(),
|
|
1097
|
-
|
|
1964
|
+
terminalDelivery: new ExecTerminalDelivery(),
|
|
1098
1965
|
waitInFlight: false,
|
|
1099
1966
|
...params.abortSignal ? { abortSignal: params.abortSignal } : {},
|
|
1100
1967
|
...params.onDisposed ? { onDisposed: params.onDisposed } : {}
|
|
1101
1968
|
};
|
|
1102
1969
|
processes.set(managed.processId, managed);
|
|
1103
1970
|
params.onStarted?.(managed.processId, managed.settlePromise);
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
scheduleIdleTimeout(managed, params.idleTimeoutMs);
|
|
1109
|
-
};
|
|
1110
|
-
child.stdout.on(
|
|
1111
|
-
"data",
|
|
1112
|
-
(chunk) => observe("stdout", managed.stdoutDecoder.write(chunk))
|
|
1113
|
-
);
|
|
1114
|
-
child.stderr.on(
|
|
1115
|
-
"data",
|
|
1116
|
-
(chunk) => observe("stderr", managed.stderrDecoder.write(chunk))
|
|
1971
|
+
output.attach(
|
|
1972
|
+
child,
|
|
1973
|
+
() => scheduleIdleTimeout(managed, params.idleTimeoutMs),
|
|
1974
|
+
() => requestTermination(managed, "output_storage_failed")
|
|
1117
1975
|
);
|
|
1118
|
-
child.on("error", () =>
|
|
1976
|
+
child.on("error", () => {
|
|
1977
|
+
void settle(managed, -1, "spawn_failed");
|
|
1978
|
+
});
|
|
1119
1979
|
child.on("close", (code) => {
|
|
1120
|
-
|
|
1121
|
-
observe("stderr", managed.stderrDecoder.end());
|
|
1122
|
-
settle(managed, typeof code === "number" ? code : -1, "completed");
|
|
1980
|
+
void settle(managed, typeof code === "number" ? code : -1, "completed");
|
|
1123
1981
|
});
|
|
1124
1982
|
managed.hardTimeout = setTimeout(
|
|
1125
1983
|
() => requestTermination(managed, "hard_timeout"),
|
|
@@ -1141,12 +1999,12 @@ function createExecProcessManager() {
|
|
|
1141
1999
|
} else {
|
|
1142
2000
|
await waitForSettlement(managed, params.yieldAfterMs);
|
|
1143
2001
|
}
|
|
1144
|
-
return
|
|
2002
|
+
return peekSnapshot(managed);
|
|
1145
2003
|
},
|
|
1146
2004
|
async wait(params) {
|
|
1147
2005
|
const managed = getScopedProcess(params.processId, params.scope);
|
|
1148
2006
|
await withProcessTransition(managed, () => {
|
|
1149
|
-
|
|
2007
|
+
managed.terminalDelivery.assertAvailable();
|
|
1150
2008
|
if (managed.waitInFlight) {
|
|
1151
2009
|
throw new ExecPluginError(
|
|
1152
2010
|
"exec_wait_in_progress",
|
|
@@ -1165,24 +2023,24 @@ function createExecProcessManager() {
|
|
|
1165
2023
|
await waitForSettlement(managed, params.waitMs);
|
|
1166
2024
|
return withProcessTransition(managed, () => {
|
|
1167
2025
|
managed.waitInFlight = false;
|
|
1168
|
-
|
|
1169
|
-
return
|
|
2026
|
+
managed.terminalDelivery.assertAvailable();
|
|
2027
|
+
return peekSnapshot(managed);
|
|
1170
2028
|
});
|
|
1171
2029
|
},
|
|
1172
2030
|
async cancel(params) {
|
|
1173
2031
|
const managed = getScopedProcess(params.processId, params.scope);
|
|
1174
2032
|
return withProcessTransition(managed, async () => {
|
|
1175
|
-
|
|
2033
|
+
managed.terminalDelivery.assertAvailable();
|
|
1176
2034
|
if (!managed.settled) {
|
|
1177
2035
|
requestTermination(managed, "cancelled");
|
|
1178
2036
|
await managed.settlePromise;
|
|
1179
2037
|
}
|
|
1180
|
-
return
|
|
2038
|
+
return peekSnapshot(managed);
|
|
1181
2039
|
});
|
|
1182
2040
|
},
|
|
1183
2041
|
snapshotSettled(processId, scope) {
|
|
1184
2042
|
const managed = getScopedProcess(processId, scope);
|
|
1185
|
-
if (!managed.settled || managed.waitInFlight || managed.
|
|
2043
|
+
if (!managed.settled || managed.waitInFlight || managed.terminalDelivery.isClaimed)
|
|
1186
2044
|
throw new Error("exec_snapshot_not_quiescent");
|
|
1187
2045
|
return Object.freeze({
|
|
1188
2046
|
cursor: managed.cursor,
|
|
@@ -1190,13 +2048,36 @@ function createExecProcessManager() {
|
|
|
1190
2048
|
processId,
|
|
1191
2049
|
status: "settled",
|
|
1192
2050
|
...managed.exitCode === void 0 ? {} : { exitCode: managed.exitCode },
|
|
1193
|
-
|
|
1194
|
-
stderr: managed.stderr.peek(),
|
|
2051
|
+
...managed.output.checkpoint(),
|
|
1195
2052
|
...managed.terminationReason ? { terminationReason: managed.terminationReason } : {},
|
|
1196
2053
|
elapsedMs: Date.now() - managed.startedAt
|
|
1197
2054
|
})
|
|
1198
2055
|
});
|
|
1199
2056
|
},
|
|
2057
|
+
async accept(snapshot, scope) {
|
|
2058
|
+
const wasReleasedAfterAbort = snapshot.terminationReason === "aborted" && !processes.has(snapshot.processId);
|
|
2059
|
+
if (wasReleasedAfterAbort) return;
|
|
2060
|
+
const managed = getScopedProcess(snapshot.processId, scope);
|
|
2061
|
+
await withProcessTransition(managed, async () => {
|
|
2062
|
+
managed.terminalDelivery.assertOwner(snapshot);
|
|
2063
|
+
if (snapshot.nextCursor !== managed.cursor) {
|
|
2064
|
+
throw new ExecPluginError(
|
|
2065
|
+
"stale_exec_process_cursor",
|
|
2066
|
+
"The output receipt no longer matches the current exec cursor."
|
|
2067
|
+
);
|
|
2068
|
+
}
|
|
2069
|
+
await managed.output.accept(snapshot);
|
|
2070
|
+
managed.terminalDelivery.accept(snapshot);
|
|
2071
|
+
});
|
|
2072
|
+
},
|
|
2073
|
+
async reject(snapshot, scope) {
|
|
2074
|
+
const managed = processes.get(snapshot.processId);
|
|
2075
|
+
if (!managed) return;
|
|
2076
|
+
if (managed.scope !== scope) throw unknownProcess();
|
|
2077
|
+
await withProcessTransition(managed, () => {
|
|
2078
|
+
managed.terminalDelivery.reject(snapshot);
|
|
2079
|
+
});
|
|
2080
|
+
},
|
|
1200
2081
|
async release(processId, scope) {
|
|
1201
2082
|
const managed = processes.get(processId);
|
|
1202
2083
|
if (!managed) return;
|
|
@@ -1214,11 +2095,15 @@ function createExecProcessManager() {
|
|
|
1214
2095
|
var DEFAULT_EXEC_HARD_TIMEOUT_MS = 6e5;
|
|
1215
2096
|
var DEFAULT_EXEC_YIELD_AFTER_MS = 15e3;
|
|
1216
2097
|
var DEFAULT_EXEC_IDLE_TIMEOUT_MS = 12e4;
|
|
1217
|
-
var
|
|
1218
|
-
var EXEC_OUTPUT_MAX_CHARS = 8e3;
|
|
1219
|
-
var EXEC_COMMAND_MAX_CHARS = 4096;
|
|
2098
|
+
var EXEC_COMMAND_MAX_CHARS = 8192;
|
|
1220
2099
|
function readExecSettings(config) {
|
|
1221
2100
|
return Object.freeze({
|
|
2101
|
+
outputRetentionMs: readBoundedInteger(config?.outputRetentionMs, {
|
|
2102
|
+
defaultValue: DEFAULT_EXEC_OUTPUT_RETENTION_MS,
|
|
2103
|
+
minimum: 1,
|
|
2104
|
+
maximum: Number.MAX_SAFE_INTEGER,
|
|
2105
|
+
name: "outputRetentionMs"
|
|
2106
|
+
}),
|
|
1222
2107
|
hardTimeoutMs: readBoundedInteger(config?.timeoutMs, {
|
|
1223
2108
|
defaultValue: DEFAULT_EXEC_HARD_TIMEOUT_MS,
|
|
1224
2109
|
minimum: 1,
|
|
@@ -1236,12 +2121,6 @@ function readExecSettings(config) {
|
|
|
1236
2121
|
minimum: 1,
|
|
1237
2122
|
maximum: 36e5,
|
|
1238
2123
|
name: "idleTimeoutMs"
|
|
1239
|
-
}),
|
|
1240
|
-
outputMaxChars: readBoundedInteger(config?.outputMaxChars, {
|
|
1241
|
-
defaultValue: DEFAULT_EXEC_OUTPUT_MAX_CHARS,
|
|
1242
|
-
minimum: 64,
|
|
1243
|
-
maximum: EXEC_OUTPUT_MAX_CHARS,
|
|
1244
|
-
name: "outputMaxChars"
|
|
1245
2124
|
})
|
|
1246
2125
|
});
|
|
1247
2126
|
}
|
|
@@ -1293,7 +2172,12 @@ function processScope(context) {
|
|
|
1293
2172
|
return sessionId || "anonymous";
|
|
1294
2173
|
}
|
|
1295
2174
|
function createExecHandlers(pluginContext, settings, preparation) {
|
|
1296
|
-
const
|
|
2175
|
+
const outputStore = createExecOutputStore({
|
|
2176
|
+
stateDir: pluginContext.stateDir,
|
|
2177
|
+
retentionMs: settings.outputRetentionMs
|
|
2178
|
+
});
|
|
2179
|
+
outputStore.startMaintenance();
|
|
2180
|
+
const processManager = createExecProcessManager(outputStore);
|
|
1297
2181
|
const pendingExecutions = /* @__PURE__ */ new Map();
|
|
1298
2182
|
const requestResources = new ExecRequestResources(
|
|
1299
2183
|
processManager,
|
|
@@ -1301,13 +2185,52 @@ function createExecHandlers(pluginContext, settings, preparation) {
|
|
|
1301
2185
|
preparation
|
|
1302
2186
|
);
|
|
1303
2187
|
const finalizeAndRelease = async (params) => {
|
|
2188
|
+
pendingExecutions.set(params.snapshot.processId, params.execution);
|
|
1304
2189
|
try {
|
|
1305
|
-
|
|
1306
|
-
|
|
2190
|
+
if (params.snapshot.outputFailure) {
|
|
2191
|
+
return retainedOutputFailure(params.snapshot, params.context);
|
|
2192
|
+
}
|
|
2193
|
+
const result = await finalizeExecResult({
|
|
2194
|
+
...params,
|
|
2195
|
+
resultBudget: params.context?.resultBudget
|
|
2196
|
+
});
|
|
2197
|
+
if (result.errorCode === "plugin_result_too_large") {
|
|
2198
|
+
return retainedOutputFailure(params.snapshot, params.context);
|
|
2199
|
+
}
|
|
2200
|
+
try {
|
|
2201
|
+
if (!requestResources.isRestored(params.snapshot.processId)) {
|
|
2202
|
+
await processManager.accept(params.snapshot, params.scope);
|
|
2203
|
+
}
|
|
2204
|
+
} catch (error) {
|
|
2205
|
+
return retainedOutputFailure(
|
|
2206
|
+
{
|
|
2207
|
+
...params.snapshot,
|
|
2208
|
+
outputFailure: {
|
|
2209
|
+
code: error instanceof Error ? error.message : "exec_output_acknowledgement_failed",
|
|
2210
|
+
stdoutBytes: params.snapshot.stdout.body?.byteLength ?? 0,
|
|
2211
|
+
stderrBytes: params.snapshot.stderr.body?.byteLength ?? 0
|
|
2212
|
+
}
|
|
2213
|
+
},
|
|
2214
|
+
params.context
|
|
2215
|
+
);
|
|
2216
|
+
}
|
|
1307
2217
|
pendingExecutions.delete(params.snapshot.processId);
|
|
1308
2218
|
requestResources.forget(params.snapshot.processId);
|
|
1309
2219
|
await processManager.release(params.snapshot.processId, params.scope);
|
|
2220
|
+
return result;
|
|
2221
|
+
} finally {
|
|
2222
|
+
requestResources.rejectTerminal(params.snapshot);
|
|
2223
|
+
await processManager.reject(params.snapshot, params.scope);
|
|
2224
|
+
}
|
|
2225
|
+
};
|
|
2226
|
+
const deliverRunning = async (snapshot, execution, scope, context) => {
|
|
2227
|
+
if (snapshot.outputFailure) return retainedOutputFailure(snapshot, context);
|
|
2228
|
+
const result = runningResult(snapshot, execution, context?.resultBudget);
|
|
2229
|
+
if (result.errorCode === "plugin_result_too_large") {
|
|
2230
|
+
return retainedOutputFailure(snapshot, context);
|
|
1310
2231
|
}
|
|
2232
|
+
await processManager.accept(snapshot, scope);
|
|
2233
|
+
return result;
|
|
1311
2234
|
};
|
|
1312
2235
|
const exec = async (params, context) => {
|
|
1313
2236
|
try {
|
|
@@ -1330,15 +2253,13 @@ function createExecHandlers(pluginContext, settings, preparation) {
|
|
|
1330
2253
|
cwd,
|
|
1331
2254
|
filesystemStateBefore,
|
|
1332
2255
|
hardTimeoutMs: settings.hardTimeoutMs,
|
|
1333
|
-
idleTimeoutMs: Math.min(settings.idleTimeoutMs, settings.hardTimeoutMs)
|
|
1334
|
-
outputMaxChars: settings.outputMaxChars
|
|
2256
|
+
idleTimeoutMs: Math.min(settings.idleTimeoutMs, settings.hardTimeoutMs)
|
|
1335
2257
|
});
|
|
1336
2258
|
const scope = processScope(context);
|
|
1337
2259
|
const snapshot = await processManager.start({
|
|
1338
2260
|
scope,
|
|
1339
2261
|
shellCommand: command,
|
|
1340
2262
|
cwd: cwd.absolutePath,
|
|
1341
|
-
outputMaxChars: settings.outputMaxChars,
|
|
1342
2263
|
yieldAfterMs: Math.min(settings.yieldAfterMs, settings.hardTimeoutMs),
|
|
1343
2264
|
idleTimeoutMs: execution.idleTimeoutMs,
|
|
1344
2265
|
hardTimeoutMs: execution.hardTimeoutMs,
|
|
@@ -1351,9 +2272,9 @@ function createExecHandlers(pluginContext, settings, preparation) {
|
|
|
1351
2272
|
});
|
|
1352
2273
|
if (snapshot.status === "running") {
|
|
1353
2274
|
pendingExecutions.set(snapshot.processId, execution);
|
|
1354
|
-
return
|
|
2275
|
+
return deliverRunning(snapshot, execution, scope, context);
|
|
1355
2276
|
}
|
|
1356
|
-
return finalizeAndRelease({ snapshot, execution, scope });
|
|
2277
|
+
return finalizeAndRelease({ snapshot, execution, scope, context });
|
|
1357
2278
|
} catch (error) {
|
|
1358
2279
|
return execFailureFromError(error, "exec");
|
|
1359
2280
|
}
|
|
@@ -1377,13 +2298,14 @@ function createExecHandlers(pluginContext, settings, preparation) {
|
|
|
1377
2298
|
);
|
|
1378
2299
|
}
|
|
1379
2300
|
const scope = processScope(context);
|
|
1380
|
-
const
|
|
2301
|
+
const restored = requestResources.terminal(processId, scope, cursor);
|
|
2302
|
+
const snapshot = restored ? await materializeExecOutput(outputStore, scope, restored) : await processManager.wait({
|
|
1381
2303
|
processId,
|
|
1382
2304
|
scope,
|
|
1383
2305
|
cursor,
|
|
1384
2306
|
waitMs: settings.yieldAfterMs
|
|
1385
2307
|
});
|
|
1386
|
-
return snapshot.status === "running" ?
|
|
2308
|
+
return snapshot.status === "running" ? deliverRunning(snapshot, execution, scope, context) : finalizeAndRelease({ snapshot, execution, scope, context });
|
|
1387
2309
|
} catch (error) {
|
|
1388
2310
|
return execFailureFromError(error, "exec_wait");
|
|
1389
2311
|
}
|
|
@@ -1402,12 +2324,14 @@ function createExecHandlers(pluginContext, settings, preparation) {
|
|
|
1402
2324
|
);
|
|
1403
2325
|
}
|
|
1404
2326
|
const scope = processScope(context);
|
|
1405
|
-
const
|
|
2327
|
+
const restored = requestResources.terminal(processId, scope);
|
|
2328
|
+
const snapshot = restored ? await materializeExecOutput(outputStore, scope, restored) : await processManager.cancel({ processId, scope });
|
|
1406
2329
|
return finalizeAndRelease({
|
|
1407
2330
|
snapshot,
|
|
1408
2331
|
execution,
|
|
1409
2332
|
scope,
|
|
1410
|
-
cancellationIsSuccess: true
|
|
2333
|
+
cancellationIsSuccess: true,
|
|
2334
|
+
context
|
|
1411
2335
|
});
|
|
1412
2336
|
} catch (error) {
|
|
1413
2337
|
return execFailureFromError(error, "exec_cancel");
|