@abot-ai/runtime 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/scripts/init-runtime.js +4 -13
- package/dist/scripts/runtime-setup-directories.d.ts +2 -0
- package/dist/scripts/runtime-setup-directories.js +38 -0
- package/dist/src/bridge/request-steering.d.ts +2 -1
- package/dist/src/bridge/request-steering.js +4 -2
- package/dist/src/bridge/runtime-replay.js +2 -19
- package/dist/src/bridge/start-agent-bridge.js +1 -1
- package/dist/src/capabilities/normal-invocation/validator.js +1 -1
- package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
- package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
- package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
- package/dist/src/capabilities/tool-event-metadata.js +3 -0
- package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
- package/dist/src/capabilities/tool-result-event-projection.js +82 -0
- package/dist/src/capabilities/tool-types.d.ts +5 -0
- package/dist/src/cli/abot.js +2 -11
- package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
- package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
- package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
- package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
- package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
- package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
- package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
- package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
- package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
- package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
- package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
- package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
- package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
- package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
- package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
- package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
- package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
- package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
- package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
- package/dist/src/runtime/composition.d.ts +23 -3
- package/dist/src/runtime/composition.js +12 -17
- package/dist/src/runtime/config/environment-paths.d.ts +10 -0
- package/dist/src/runtime/config/environment-paths.js +31 -0
- package/dist/src/runtime/config/environment-storage.d.ts +9 -0
- package/dist/src/runtime/config/environment-storage.js +65 -0
- package/dist/src/runtime/config/fields.js +7 -0
- package/dist/src/runtime/config/long-term-memory.js +15 -0
- package/dist/src/runtime/config/schema.js +8 -0
- package/dist/src/runtime/config.js +9 -5
- package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
- package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
- package/dist/src/runtime/default-adapters.d.ts +3 -32
- package/dist/src/runtime/default-adapters.js +3 -270
- package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
- package/dist/src/runtime/default-environment-adapters.js +144 -0
- package/dist/src/runtime/index.d.ts +5 -0
- package/dist/src/runtime/index.js +4 -0
- package/dist/src/runtime/local-application.d.ts +22 -0
- package/dist/src/runtime/local-application.js +81 -0
- package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
- package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
- package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
- package/dist/src/runtime/local-host/app-owner.js +119 -0
- package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
- package/dist/src/runtime/local-host/app-request-control.js +135 -0
- package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
- package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
- package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
- package/dist/src/runtime/local-host/client-identity.js +17 -0
- package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
- package/dist/src/runtime/local-host/client-memory.js +54 -0
- package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
- package/dist/src/runtime/local-host/client-requests.js +145 -0
- package/dist/src/runtime/local-host/client-services.d.ts +10 -0
- package/dist/src/runtime/local-host/client-services.js +14 -0
- package/dist/src/runtime/local-host/contracts.d.ts +36 -0
- package/dist/src/runtime/local-host/contracts.js +1 -0
- package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
- package/dist/src/runtime/local-host/endpoint.js +79 -0
- package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
- package/dist/src/runtime/local-host/owner-activity.js +30 -0
- package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
- package/dist/src/runtime/local-host/owner-retirement.js +15 -0
- package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
- package/dist/src/runtime/local-host/owner-server.js +88 -0
- package/dist/src/runtime/local-host/private-access.d.ts +2 -0
- package/dist/src/runtime/local-host/private-access.js +16 -0
- package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
- package/dist/src/runtime/local-host/private-directory.js +57 -0
- package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
- package/dist/src/runtime/local-host/rpc-peer.js +168 -0
- package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
- package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
- package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
- package/dist/src/runtime/local-host/startup-connection.js +72 -0
- package/dist/src/runtime/local-host/transport.d.ts +3 -0
- package/dist/src/runtime/local-host/transport.js +88 -0
- package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
- package/dist/src/runtime/local-host/windows-private-access.js +51 -0
- package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
- package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
- package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
- package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
- package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
- package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
- package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
- package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
- package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
- package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
- package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
- package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
- package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
- package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
- package/dist/src/runtime/model/invoke-raw-step.js +1 -0
- package/dist/src/runtime/model/invoke-step.js +6 -0
- package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
- package/dist/src/runtime/model/invoke-structured-step.js +1 -0
- package/dist/src/runtime/model/model-step-port.d.ts +2 -0
- package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
- package/dist/src/runtime/model/model-step-steering.js +19 -0
- package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
- package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
- package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
- package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
- package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
- package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
- package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
- package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
- package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
- package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
- package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
- package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
- package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
- package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
- package/dist/src/runtime/plugins/manifest-validator.js +4 -1
- package/dist/src/runtime/ports.d.ts +4 -0
- package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
- package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
- package/dist/src/runtime/request/contracts.d.ts +6 -0
- package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
- package/dist/src/runtime/request/execution-facets.js +6 -0
- package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
- package/dist/src/runtime/request/execution-scope.d.ts +1 -1
- package/dist/src/runtime/request/handler.js +6 -0
- package/dist/src/runtime/request/root-contract.d.ts +7 -1
- package/dist/src/runtime/request/root-execution-kernel.js +33 -37
- package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
- package/dist/src/runtime/request/root-memory-recall.js +71 -0
- package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
- package/dist/src/runtime/request/root-observation-handoff.js +44 -0
- package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
- package/dist/src/runtime/request/scheduled-execution.js +32 -0
- package/dist/src/runtime/request/session-admission.d.ts +17 -0
- package/dist/src/runtime/request/session-admission.js +88 -0
- package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
- package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
- package/dist/src/runtime/runtime-environment.d.ts +31 -0
- package/dist/src/runtime/runtime-environment.js +102 -0
- package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
- package/dist/src/runtime/runtime-host-environment.js +57 -0
- package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
- package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
- package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
- package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
- package/dist/src/runtime/runtime-host.d.ts +19 -0
- package/dist/src/runtime/runtime-host.js +63 -0
- package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
- package/dist/src/runtime/scheduler/calendar-time.js +58 -0
- package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
- package/dist/src/runtime/scheduler/contracts.js +1 -0
- package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
- package/dist/src/runtime/scheduler/file-store.js +76 -0
- package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
- package/dist/src/runtime/scheduler/instant-validation.js +69 -0
- package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
- package/dist/src/runtime/scheduler/interval-range.js +24 -0
- package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
- package/dist/src/runtime/scheduler/job-management.js +212 -0
- package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
- package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
- package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
- package/dist/src/runtime/scheduler/journal-durability.js +59 -0
- package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
- package/dist/src/runtime/scheduler/journal-files.js +59 -0
- package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
- package/dist/src/runtime/scheduler/journal-head.js +81 -0
- package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
- package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
- package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
- package/dist/src/runtime/scheduler/journal-index.js +195 -0
- package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
- package/dist/src/runtime/scheduler/journal-store.js +184 -0
- package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
- package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
- package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
- package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
- package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
- package/dist/src/runtime/scheduler/run-completion.js +77 -0
- package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
- package/dist/src/runtime/scheduler/run-list-query.js +38 -0
- package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
- package/dist/src/runtime/scheduler/run-records.js +41 -0
- package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
- package/dist/src/runtime/scheduler/schedule-update.js +22 -0
- package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
- package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
- package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
- package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
- package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
- package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
- package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
- package/dist/src/runtime/scheduler/service-context.js +26 -0
- package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
- package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
- package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
- package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
- package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
- package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
- package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
- package/dist/src/runtime/scheduler/validation-error.js +8 -0
- package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
- 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 +14 -1
- package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
- package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
- package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
- package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
- package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
- package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
- package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
- package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
- package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
- package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
- package/dist/src/runtime/session/session-mutation-queue.js +15 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
- package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
- package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
- package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
- package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/format.js +12 -0
- package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
- package/dist/src/runtime/steps/execution-agent/input.js +17 -2
- package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
- package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
- package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
- package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
- package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
- package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/run.js +2 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
- package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
- package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
- package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
- package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
- package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
- package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
- package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
- package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
- package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
- package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
- package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
- package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
- package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
- package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
- package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
- package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
- package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
- package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
- package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
- package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
- package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
- package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
- package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
- package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
- package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
- package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
- package/dist/src/sessions/record/projection.js +1 -0
- package/dist/src/sessions/schedule-metadata.d.ts +8 -0
- package/dist/src/sessions/schedule-metadata.js +1 -0
- package/dist/src/sessions/session-service.d.ts +1 -0
- package/dist/src/sessions/session-service.js +1 -0
- package/dist/src/sessions/types.d.ts +2 -0
- package/dist/src/shared/directory-authority/bootstrap.d.ts +1 -0
- package/dist/src/shared/directory-authority/bootstrap.js +118 -0
- package/dist/src/shared/directory-authority/command.d.ts +8 -0
- package/dist/src/shared/directory-authority/command.js +27 -0
- package/dist/src/shared/directory-authority/errors.d.ts +5 -0
- package/dist/src/shared/directory-authority/errors.js +10 -0
- package/dist/src/shared/directory-authority/index.d.ts +3 -0
- package/dist/src/shared/directory-authority/index.js +3 -0
- package/dist/src/shared/directory-authority/protocol.d.ts +11 -0
- package/dist/src/shared/directory-authority/protocol.js +62 -0
- package/dist/src/shared/directory-authority/task.d.ts +7 -0
- package/dist/src/shared/directory-authority/task.js +97 -0
- package/dist/src/shared/http-server-shutdown.d.ts +4 -0
- package/dist/src/shared/http-server-shutdown.js +17 -0
- package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
- package/dist/src/shared/public-http/aggregate-gate.js +87 -0
- package/dist/src/shared/public-http/deadline.d.ts +2 -0
- package/dist/src/shared/public-http/deadline.js +29 -0
- package/dist/src/shared/public-http/errors.d.ts +6 -0
- package/dist/src/shared/public-http/errors.js +11 -0
- package/dist/src/shared/public-http/limits.d.ts +8 -0
- package/dist/src/shared/public-http/limits.js +8 -0
- package/dist/src/shared/public-http/network-policy.d.ts +11 -0
- package/dist/src/shared/public-http/network-policy.js +178 -0
- package/dist/src/shared/public-http/public-http.d.ts +24 -0
- package/dist/src/shared/public-http/public-http.js +85 -0
- package/dist/src/shared/public-http/request-hop.d.ts +18 -0
- package/dist/src/shared/public-http/request-hop.js +140 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
- package/dist/src/web-ui/app/app-bootstrap.js +53 -0
- package/dist/src/web-ui/app/app-dom.js +80 -0
- package/dist/src/web-ui/app/app.js +195 -212
- package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
- package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
- package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
- package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
- package/dist/src/web-ui/app/components/conversation-status.js +65 -0
- package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
- package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
- package/dist/src/web-ui/app/components/conversation-view.js +39 -11
- package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
- package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
- package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
- package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
- package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
- package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
- package/dist/src/web-ui/app/components/schedules/details.js +101 -0
- package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
- package/dist/src/web-ui/app/components/schedules/form.js +246 -0
- package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
- package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
- package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
- package/dist/src/web-ui/app/configuration-feature.js +72 -0
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
- package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
- package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
- package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
- package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
- package/dist/src/web-ui/app/dashboard-feature.js +44 -0
- package/dist/src/web-ui/app/index.html +53 -1
- package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
- package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
- package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
- package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
- package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
- package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
- package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
- package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
- package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
- package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
- package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
- package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
- package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
- package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
- package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
- package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
- package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
- package/dist/src/web-ui/app/lib/text-format.js +2 -143
- package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
- package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
- package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
- package/dist/src/web-ui/app/schedules-feature.js +87 -0
- package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
- package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
- package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
- package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
- package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
- package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
- package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
- package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
- package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
- package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
- package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
- package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
- package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
- package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
- package/dist/src/web-ui/app/styles.css +8 -0
- package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
- package/dist/src/web-ui/app/ui-behavior.js +3 -1
- package/dist/src/web-ui/app/vendor/README.md +15 -0
- package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
- package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
- package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
- package/dist/src/web-ui/link-preview/metadata.js +97 -0
- package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
- package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
- package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
- package/dist/src/web-ui/link-preview/raster-response.js +49 -0
- package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
- package/dist/src/web-ui/link-preview/routes.js +97 -0
- package/dist/src/web-ui/link-preview/service.d.ts +11 -0
- package/dist/src/web-ui/link-preview/service.js +117 -0
- package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
- package/dist/src/web-ui/local-runtime/api-router.js +42 -73
- package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
- package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
- package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
- package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
- package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
- package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
- package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
- package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
- package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
- package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
- package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
- package/dist/src/web-ui/local-runtime-backend.js +11 -1
- package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
- package/dist/src/web-ui/schedule-creation-contract.js +1 -0
- package/dist/src/web-ui/server-shutdown.d.ts +4 -0
- package/dist/src/web-ui/server-shutdown.js +32 -0
- package/dist/src/web-ui/server.js +13 -10
- package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
- package/dist/src/web-ui/session-read-state/availability.js +20 -0
- package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
- package/dist/src/web-ui/session-read-state/projection.js +71 -0
- package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
- package/dist/src/web-ui/session-read-state/service.js +89 -0
- package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
- package/dist/src/web-ui/session-read-state/store.js +110 -0
- package/docs/configuration.md +41 -1
- package/docs/long-term-memory.md +46 -5
- package/docs/plugins.md +15 -9
- package/docs/runtime-invariant-coverage.md +1 -1
- package/docs/runtime-library.md +23 -0
- package/docs/runtime-public-contracts.md +32 -1
- package/package.json +3 -1
- package/plugins/code-outline/plugin.json +15 -0
- package/plugins/document-reader/plugin.json +17 -0
- package/plugins/exec/plugin.json +3 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +1 -1
- package/plugins/exec/source/process-manager.ts +1 -20
- package/plugins/exec/source/shell-platform.ts +29 -0
- package/plugins/exec/src/index.cjs +25 -18
- package/plugins/filesystem/plugin.json +17 -2
- package/plugins/filesystem/source/atomic-write.ts +9 -0
- package/plugins/filesystem/source/bounded-io.ts +5 -99
- package/plugins/filesystem/source/directory-authority-write.ts +64 -0
- package/plugins/filesystem/source/directory-sample-task.ts +23 -0
- package/plugins/filesystem/source/directory-sample.ts +132 -0
- package/plugins/filesystem/source/directory-write-task.ts +160 -0
- package/plugins/filesystem/source/mutation-parent.ts +11 -0
- package/plugins/filesystem/src/index.cjs +693 -118
- package/plugins/json-inspector/plugin.json +12 -0
- package/plugins/local-search/plugin.json +12 -0
- package/plugins/local-search/source/index.ts +2 -0
- package/plugins/local-search/source/paths.ts +30 -7
- package/plugins/local-search/source/ripgrep-process.ts +69 -0
- package/plugins/local-search/source/ripgrep.ts +19 -23
- package/plugins/local-search/src/index.cjs +295 -32
- package/plugins/memory/plugin.json +26 -1
- package/plugins/memory/source/index.ts +10 -6
- package/plugins/memory/src/index.cjs +11 -7
- package/plugins/project-orientation/plugin.json +14 -0
- package/plugins/web/source/aggregate-gate.ts +8 -130
- package/plugins/web/source/deadline.ts +14 -50
- package/plugins/web/source/errors.ts +17 -11
- package/plugins/web/source/limits.ts +3 -6
- package/plugins/web/source/network-policy.ts +28 -226
- package/plugins/web/source/public-http.ts +17 -142
- package/plugins/web/source/request-hop.ts +11 -191
- package/plugins/web/src/index.cjs +119 -59
- package/runtime.config.schema.json +7 -0
- package/src/runtime/README.md +105 -1
- package/src/runtime/local-host/README.md +86 -0
- package/src/runtime/scheduler/README.md +166 -0
|
@@ -10,7 +10,7 @@ the default `supervisor-worker-v1` policy and the opt-in
|
|
|
10
10
|
| The handler resolves one compiled execution policy from the selected model profile and supplies its same authority to capability composition and the runner. Omission remains `supervisor-worker-v1`. | `src/runtime/model/model-selection.ts`, `src/runtime/request/handler.ts`, `src/runtime/request/role-executor-composition.ts` | `model-execution-policy.test.ts`, `request-execution-policy-composition.test.ts` |
|
|
11
11
|
| `supervisor-worker-v1` retains the delegated Supervisor, Planner, Worker, and Reviewer contracts; `execution-agent-v1` changes model-facing contracts and authority without adding another runner, ledger, reducer, capability engine, or finalizer. | `src/runtime/request/root-execution-kernel.ts`, `src/runtime/request/role-executor-composition.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `supervisor-request-runner.test.ts`, `execution-agent-request-runner.test.ts` |
|
|
12
12
|
| Role choice is model-owned and limited to the exact subordinate contracts registered by the frozen policy. | `src/runtime/steps/*`, `src/runtime/orchestration/role-executors/`, `src/runtime/orchestration/role-calls/` | `role-executor-registry.test.ts`, `planner-decision.test.ts`, `execution-agent-advisory-executors.test.ts` |
|
|
13
|
-
| Every subordinate result returns to its exact caller through an exact-head ledger
|
|
13
|
+
| Every subordinate result returns to its exact caller through an exact-head ledger v18 commit. Under `supervisor-worker-v1`, terminal Planner and Worker results receive a runtime-owned, constant-size `work_result_v1` receipt; supplied work receipts are rejected, lineage is derived and fingerprint-verified from that ledger, and `execution-agent-v1` receives none. Planner Graph and Auditor outputs remain passive terminal child results. | `src/runtime/orchestration/role-calls/`, `src/runtime/steps/planner-graph/`, `src/runtime/steps/auditor-decision/` | `role-call-ledger.test.ts`, `role-call-work-result-receipt-reducer.test.ts`, `role-call-planner-work-result-receipt.test.ts`, `execution-agent-advisory-executors.test.ts`, `supervisor-request-runner.test.ts` |
|
|
14
14
|
| Planner's semantic contract requires declaring every currently known execution outcome before the first child dispatch; schema and parser mechanically bind exactly one independently completable production item per Worker dispatch. A directly bound Worker receives that item, explicit dependencies, supervision evidence, and its own capability-result lane without the broader request, Planner objective, or sibling execution summaries. | `src/runtime/steps/planner-decision/`, `src/runtime/steps/worker-decision/`, `src/runtime/context/request-tool-results.ts` | `planner-plan-contract.test.ts`, `planner-single-item-dispatch.test.ts`, `planner-worker-context-isolation.test.ts`, `planner-worker-tool-result-scope.test.ts` |
|
|
15
15
|
| Capability authority is validated against the frozen policy and bound to the exact authorized call and activation: Worker for the default policy, canonical root for the direct policy. Both use the same binding and adapter engine. | `src/runtime/orchestration/role-calls/`, `src/runtime/orchestration/worker-capabilities/`, `src/runtime/request/root-execution-kernel.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `worker-capability-binding.test.ts`, `execution-agent-request-runner.test.ts` |
|
|
16
16
|
| Worker and root payloads use the same `tool_payload.raw` author; principal, controls, runtime-issued direct-Planner-item receipt, and admitted evidence are mechanically bounded before model invocation. Root and non-Planner Worker payloads retain the exact request source; a canonically bound Planner item omits it. Work-result receipts and derived lineage are stripped before Worker raw payload and result authoring while optional semantic checkpoints remain. | `src/runtime/orchestration/worker-capabilities/payload-author.ts`, `src/runtime/request/worker-capability-payload.ts`, `src/runtime/steps/worker-decision/` | `planner-worker-context-isolation.test.ts`, `registered-tool-worker-assignment-provenance.test.ts`, `worker-capability-payload-author.test.ts`, `worker-payload-dependency-projection-pr1.test.ts`, `execution-agent-request-runner.test.ts` |
|
package/docs/runtime-library.md
CHANGED
|
@@ -41,12 +41,35 @@ const handle = runtime.host.start({
|
|
|
41
41
|
toolRegistry: runtime.tools,
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
await handle.ready;
|
|
45
|
+
|
|
44
46
|
process.on("SIGINT", async () => {
|
|
45
47
|
await handle.stop();
|
|
46
48
|
process.exit(0);
|
|
47
49
|
});
|
|
48
50
|
```
|
|
49
51
|
|
|
52
|
+
The default host starts the scheduler automatically, including persisted Jobs.
|
|
53
|
+
Overlapping handles for the same scheduler share its lifetime: `stop()` closes
|
|
54
|
+
that handle's Bridge, and only the last handle stops the scheduler. `start()` remains
|
|
55
|
+
synchronous for compatibility; the optional `ready` promise exposes asynchronous
|
|
56
|
+
startup errors and requests wait for readiness. A failed startup releases its own
|
|
57
|
+
resources even when a consumer does not read `ready`. Custom injected hosts may
|
|
58
|
+
keep the existing `{ stop }` handle.
|
|
59
|
+
|
|
60
|
+
Supply adapter overrides before starting a host. A different session store,
|
|
61
|
+
configuration, model client, attachment store, tool registry or memory service
|
|
62
|
+
rebuilds the scheduler's request graph as well as ordinary requests. Session
|
|
63
|
+
storage remains backed by the injected store, through the composed deletion
|
|
64
|
+
guard. Use the host's effective graph consistently; do not start the original
|
|
65
|
+
graph alongside its replacement against the same scheduler directory. An event
|
|
66
|
+
observer override alone keeps the existing admission and scheduler lifetime.
|
|
67
|
+
|
|
68
|
+
Session deletion finishes attachment cleanup before acknowledging the deletion
|
|
69
|
+
receipt. An explicit repeat retries only failed cleanup, through the same owner
|
|
70
|
+
for Web, Bridge and local clients. Web shutdown closes HTTP/WebSocket intake and
|
|
71
|
+
prevents new environment initialization before awaiting pending startup work.
|
|
72
|
+
|
|
50
73
|
## Runtime Config
|
|
51
74
|
|
|
52
75
|
The default host reads `runtime.config.json`, then lets environment variables
|
|
@@ -131,7 +131,9 @@ not create `planner.plan.*` state or events.
|
|
|
131
131
|
Runtime capabilities use the stable tool event envelope. Adapter-owned
|
|
132
132
|
presentation metadata supplies the tool, operation and action type; target
|
|
133
133
|
metadata contains only resolved logical paths. Physical
|
|
134
|
-
roots
|
|
134
|
+
roots and opaque subject identities are never exposed. A plugin may opt into
|
|
135
|
+
bounded input or result excerpts through its declared event presentation.
|
|
136
|
+
These excerpts are display data, not additional model instructions or evidence.
|
|
135
137
|
These events describe capability execution only. Only `planner.plan.*` events
|
|
136
138
|
report canonical item-status changes or semantic progress.
|
|
137
139
|
|
|
@@ -146,6 +148,31 @@ Tool events use the current tool execution boundary:
|
|
|
146
148
|
A `tool.completed` event with `ok: true` proves only that the tool step
|
|
147
149
|
succeeded. It does not prove the user request is complete.
|
|
148
150
|
|
|
151
|
+
Registered-tool events may include an optional `executionId` shared by their
|
|
152
|
+
payload, approval and execution stages. Clients correlate with
|
|
153
|
+
`(requestId, executionId)` rather than matching tool names or arrival order.
|
|
154
|
+
Payload publication still occurs after canonical admission. Older events without
|
|
155
|
+
this field do not establish a lifecycle pairing.
|
|
156
|
+
|
|
157
|
+
The same adapter boundary may include `executorRole` and `roleCallId` from the
|
|
158
|
+
canonical role call. Clients can place the action under its executor even when
|
|
159
|
+
the active role has changed before completion. These fields are display identity;
|
|
160
|
+
they do not change runtime stages, tool parameters, approval inputs or evidence.
|
|
161
|
+
The root role identifier remains `supervisor` regardless of its selected contract.
|
|
162
|
+
|
|
163
|
+
`eventPresentation.resultMetadata` maps optional display keys to existing tool
|
|
164
|
+
result fields through `{path, kind}` descriptors. Paths select `output` or an
|
|
165
|
+
own-property path under `data` (at most four segments). Kinds are `preview`,
|
|
166
|
+
`number` and `boolean`, with at most 16 mappings. A preview is limited to 1,200
|
|
167
|
+
characters and 20 lines, with a 2,400-character total preview budget per event;
|
|
168
|
+
its companion `<key>Truncated` flag describes preview clipping, independently
|
|
169
|
+
of source-result truncation. Missing or mismatched fields are omitted. Valid
|
|
170
|
+
declared values take precedence over generic metadata; omitted fields retain
|
|
171
|
+
the existing fallback metadata. Projection
|
|
172
|
+
does not mutate tool results, canonical evidence, action references or model
|
|
173
|
+
context. The client renders excerpts as inert text and never reconstructs an
|
|
174
|
+
old result by re-reading the current file or memory store.
|
|
175
|
+
|
|
149
176
|
## ToolRegistry
|
|
150
177
|
|
|
151
178
|
`ToolRegistry` owns active tool capability discovery and execution:
|
|
@@ -177,6 +204,10 @@ retained for compatibility. They must not select a request path or role.
|
|
|
177
204
|
Model-facing availability and controls come from the registered
|
|
178
205
|
`normalInvocation` contract.
|
|
179
206
|
|
|
207
|
+
A normal-invocation contract accepts at most 32 operations. This bounds the
|
|
208
|
+
registered operation catalog; it does not limit invocation frequency or the
|
|
209
|
+
number of user-created scheduled Jobs.
|
|
210
|
+
|
|
180
211
|
Every plugin-handler return is normalized by `ToolRegistry` into one complete
|
|
181
212
|
`ToolExecutionResult`, whether the operation succeeds or fails. The selected
|
|
182
213
|
tool identity is Runtime-owned; plugins provide the operation result. The
|
package/package.json
CHANGED
|
@@ -83,6 +83,8 @@
|
|
|
83
83
|
"dist/src/web-ui/",
|
|
84
84
|
"runtime.config.schema.json",
|
|
85
85
|
"src/runtime/README.md",
|
|
86
|
+
"src/runtime/scheduler/README.md",
|
|
87
|
+
"src/runtime/local-host/README.md",
|
|
86
88
|
"LICENSE",
|
|
87
89
|
"docs/architecture.md",
|
|
88
90
|
"docs/bridge-compatibility.md",
|
|
@@ -172,5 +174,5 @@
|
|
|
172
174
|
},
|
|
173
175
|
"type": "module",
|
|
174
176
|
"types": "./dist/src/runtime/index.d.ts",
|
|
175
|
-
"version": "1.
|
|
177
|
+
"version": "1.3.1"
|
|
176
178
|
}
|
|
@@ -17,6 +17,21 @@
|
|
|
17
17
|
"inspect_code_outline": {
|
|
18
18
|
"description": "Extract a bounded outline of symbols, selectors, elements, and imports from one source file beneath the configured agent work directory or configured workspace sources, without returning the full file.",
|
|
19
19
|
"routingCapability": "semantic_lookup",
|
|
20
|
+
"eventPresentation": {
|
|
21
|
+
"metadata": {
|
|
22
|
+
"displayTarget": { "param": "path", "kind": "string" },
|
|
23
|
+
"maxSymbols": { "param": "maxSymbols", "kind": "number" }
|
|
24
|
+
},
|
|
25
|
+
"resultMetadata": {
|
|
26
|
+
"outputPreview": { "path": "output", "kind": "preview" },
|
|
27
|
+
"lineCount": { "path": "data.lineCount", "kind": "number" },
|
|
28
|
+
"returnedItemCount": { "path": "data.truncation.returnedSymbols", "kind": "number" },
|
|
29
|
+
"totalItemCount": { "path": "data.truncation.totalSymbols", "kind": "number" },
|
|
30
|
+
"sourceTruncated": { "path": "data.truncation.symbolsTruncated", "kind": "boolean" },
|
|
31
|
+
"importsTruncated": { "path": "data.truncation.importsTruncated", "kind": "boolean" },
|
|
32
|
+
"outputTruncated": { "path": "data.truncation.output.truncated", "kind": "boolean" }
|
|
33
|
+
}
|
|
34
|
+
},
|
|
20
35
|
"runtimePathBindings": [
|
|
21
36
|
{
|
|
22
37
|
"operationId": "inspect_code_outline",
|
|
@@ -13,6 +13,23 @@
|
|
|
13
13
|
"description": "Extract bounded text from an attached or configured-root PDF, DOCX, XLSX, PPTX, TXT, CSV, Markdown, JSON, or RTF document. Use source for an attachment id/name or configured-root path. Use source_mode=working_path with path for a runtime/session artifact beneath the current execution working directory. Document bytes remain outside model context, and results expose only attachment identities or logical runtime paths.",
|
|
14
14
|
"routingCapability": "filesystem_inspection",
|
|
15
15
|
"developmentRoles": ["inspect", "verify"],
|
|
16
|
+
"eventPresentation": {
|
|
17
|
+
"metadata": {
|
|
18
|
+
"source": { "param": "source", "kind": "string" },
|
|
19
|
+
"displayTarget": { "param": "path", "kind": "string" },
|
|
20
|
+
"sourceMode": { "param": "source_mode", "kind": "string" },
|
|
21
|
+
"startChar": { "param": "start_char", "kind": "number" },
|
|
22
|
+
"maxChars": { "param": "max_chars", "kind": "number" }
|
|
23
|
+
},
|
|
24
|
+
"resultMetadata": {
|
|
25
|
+
"outputPreview": { "path": "output", "kind": "preview" },
|
|
26
|
+
"startChar": { "path": "data.startChar", "kind": "number" },
|
|
27
|
+
"endChar": { "path": "data.endChar", "kind": "number" },
|
|
28
|
+
"totalCharacters": { "path": "data.totalCharacters", "kind": "number" },
|
|
29
|
+
"inputBytes": { "path": "data.inputBytes", "kind": "number" },
|
|
30
|
+
"sourceTruncated": { "path": "data.truncated", "kind": "boolean" }
|
|
31
|
+
}
|
|
32
|
+
},
|
|
16
33
|
"runtimePathBindings": [
|
|
17
34
|
{
|
|
18
35
|
"operationId": "read_document",
|
package/plugins/exec/plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "exec",
|
|
4
4
|
"version": "1.0.0",
|
|
5
|
-
"description": "Execute, observe, and cancel bounded non-interactive
|
|
5
|
+
"description": "Execute, observe, and cancel bounded non-interactive /bin/bash processes on Linux and macOS.",
|
|
6
6
|
"extensions": {
|
|
7
7
|
"ai.abot.runtime": {
|
|
8
8
|
"version": 1,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"capabilities": {
|
|
20
20
|
"exec": {
|
|
21
21
|
"catalogGroups": ["read", "write", "exec"],
|
|
22
|
-
"description": "Execute one bounded non-interactive
|
|
22
|
+
"description": "Execute one bounded non-interactive /bin/bash command on Linux or macOS. The explicit cwd must resolve inside agent work or the configured workspace; `.` means the agent-work root and `workspace/...` selects the workspace. The shell itself runs with the runtime process permissions and is not an operating-system sandbox. A command still running after the foreground window yields a process ID and cursor that exec_wait can resume without restarting it. Prefer dedicated inspection and file-mutation capabilities when they can express the task.",
|
|
23
23
|
"routingCapability": "filesystem_inspection",
|
|
24
24
|
"developmentRoles": ["inspect", "establish", "verify", "auxiliary"],
|
|
25
25
|
"eventPresentation": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"skills": ["exec_skill"],
|
|
32
32
|
"operations": {
|
|
33
33
|
"execute_command": {
|
|
34
|
-
"summary": "Execute one bounded non-interactive
|
|
34
|
+
"summary": "Execute one bounded non-interactive /bin/bash command on Linux or macOS in an explicit existing agent-work or workspace directory. The cwd boundary is not an OS sandbox. Full-access availability does not authorize servers, GUI automation, installs, service changes, background work, or other sensitive effects.",
|
|
35
35
|
"input": {
|
|
36
36
|
"type": "object",
|
|
37
37
|
"additionalProperties": false,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Exec Skill
|
|
2
2
|
|
|
3
3
|
- Use `exec` for narrow shell-native discovery or verification when a dedicated tool is insufficient.
|
|
4
|
-
- `exec`
|
|
4
|
+
- `exec` is available on Linux and macOS with executable `/bin/bash`; it does not select a Windows shell or another fallback shell. Commands must use the utilities and options available on the host.
|
|
5
5
|
- Resolve `.` and ordinary relative `cwd` values from the configured agent work directory. They are never rewritten to the active Worker working directory. Use `workspace/...` only when the configured workspace is explicitly intended.
|
|
6
6
|
- Always provide an explicit existing `cwd`. For an existing project, use its project path. To create a new project, use an existing parent `cwd` (normally `.`) and create the project path in the command.
|
|
7
7
|
- The cwd is restricted to configured roots, but the shell runs with the runtime process permissions and is not an operating-system sandbox.
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { spawn, type ChildProcessByStdio } from "node:child_process";
|
|
2
|
-
import { constants } from "node:fs";
|
|
3
|
-
import { access } from "node:fs/promises";
|
|
4
2
|
import { randomUUID } from "node:crypto";
|
|
5
3
|
import type { Readable } from "node:stream";
|
|
6
4
|
import { StringDecoder } from "node:string_decoder";
|
|
@@ -8,13 +6,13 @@ import { StringDecoder } from "node:string_decoder";
|
|
|
8
6
|
import { sanitizeJsonText } from "../../../src/plugin-sdk/index.js";
|
|
9
7
|
|
|
10
8
|
import { ExecPluginError } from "./errors.js";
|
|
9
|
+
import { assertSupportedShell, EXEC_SHELL } from "./shell-platform.js";
|
|
11
10
|
import type {
|
|
12
11
|
ExecProcessSnapshot,
|
|
13
12
|
ExecStreamSnapshot,
|
|
14
13
|
ExecTerminationReason,
|
|
15
14
|
} from "./types.js";
|
|
16
15
|
|
|
17
|
-
const EXEC_SHELL = "/bin/bash";
|
|
18
16
|
const COMPLETED_PROCESS_RETENTION_MS = 5 * 60_000;
|
|
19
17
|
const MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
|
|
20
18
|
|
|
@@ -115,23 +113,6 @@ export type ExecProcessManager = Readonly<{
|
|
|
115
113
|
release(processId: string, scope: string): Promise<void>;
|
|
116
114
|
}>;
|
|
117
115
|
|
|
118
|
-
async function assertSupportedShell(): Promise<void> {
|
|
119
|
-
if (process.platform !== "linux") {
|
|
120
|
-
throw new ExecPluginError(
|
|
121
|
-
"exec_platform_unsupported",
|
|
122
|
-
"The exec plugin v1 requires Linux and /bin/bash.",
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
await access(EXEC_SHELL, constants.X_OK);
|
|
127
|
-
} catch {
|
|
128
|
-
throw new ExecPluginError(
|
|
129
|
-
"exec_shell_unavailable",
|
|
130
|
-
"The exec plugin cannot start because executable /bin/bash is unavailable.",
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
116
|
export function createExecProcessManager(): ExecProcessManager {
|
|
136
117
|
const processes = new Map<string, ManagedExecProcess>();
|
|
137
118
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
import { ExecPluginError } from "./errors.js";
|
|
5
|
+
|
|
6
|
+
export const EXEC_SHELL = "/bin/bash";
|
|
7
|
+
|
|
8
|
+
function isSupportedExecPlatform(platform: NodeJS.Platform): boolean {
|
|
9
|
+
return platform === "linux" || platform === "darwin";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function assertSupportedShell(
|
|
13
|
+
platform: NodeJS.Platform = process.platform,
|
|
14
|
+
): Promise<void> {
|
|
15
|
+
if (!isSupportedExecPlatform(platform)) {
|
|
16
|
+
throw new ExecPluginError(
|
|
17
|
+
"exec_platform_unsupported",
|
|
18
|
+
"The exec plugin requires Linux or macOS and executable /bin/bash.",
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
await access(EXEC_SHELL, constants.X_OK);
|
|
23
|
+
} catch {
|
|
24
|
+
throw new ExecPluginError(
|
|
25
|
+
"exec_shell_unavailable",
|
|
26
|
+
"The exec plugin cannot start because executable /bin/bash is unavailable.",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -558,11 +558,34 @@ function resolveExecScopedPath(pluginContext, executionContext, rawPath, cwd) {
|
|
|
558
558
|
|
|
559
559
|
// plugins/exec/source/process-manager.ts
|
|
560
560
|
var import_node_child_process = require("node:child_process");
|
|
561
|
-
var import_node_fs2 = require("node:fs");
|
|
562
|
-
var import_promises3 = require("node:fs/promises");
|
|
563
561
|
var import_node_crypto2 = require("node:crypto");
|
|
564
562
|
var import_node_string_decoder = require("node:string_decoder");
|
|
563
|
+
|
|
564
|
+
// plugins/exec/source/shell-platform.ts
|
|
565
|
+
var import_node_fs2 = require("node:fs");
|
|
566
|
+
var import_promises3 = require("node:fs/promises");
|
|
565
567
|
var EXEC_SHELL = "/bin/bash";
|
|
568
|
+
function isSupportedExecPlatform(platform) {
|
|
569
|
+
return platform === "linux" || platform === "darwin";
|
|
570
|
+
}
|
|
571
|
+
async function assertSupportedShell(platform = process.platform) {
|
|
572
|
+
if (!isSupportedExecPlatform(platform)) {
|
|
573
|
+
throw new ExecPluginError(
|
|
574
|
+
"exec_platform_unsupported",
|
|
575
|
+
"The exec plugin requires Linux or macOS and executable /bin/bash."
|
|
576
|
+
);
|
|
577
|
+
}
|
|
578
|
+
try {
|
|
579
|
+
await (0, import_promises3.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
|
|
580
|
+
} catch {
|
|
581
|
+
throw new ExecPluginError(
|
|
582
|
+
"exec_shell_unavailable",
|
|
583
|
+
"The exec plugin cannot start because executable /bin/bash is unavailable."
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// plugins/exec/source/process-manager.ts
|
|
566
589
|
var COMPLETED_PROCESS_RETENTION_MS = 5 * 6e4;
|
|
567
590
|
var MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
|
|
568
591
|
var CappedTextBuffer = class {
|
|
@@ -602,22 +625,6 @@ var CappedTextBuffer = class {
|
|
|
602
625
|
});
|
|
603
626
|
}
|
|
604
627
|
};
|
|
605
|
-
async function assertSupportedShell() {
|
|
606
|
-
if (process.platform !== "linux") {
|
|
607
|
-
throw new ExecPluginError(
|
|
608
|
-
"exec_platform_unsupported",
|
|
609
|
-
"The exec plugin v1 requires Linux and /bin/bash."
|
|
610
|
-
);
|
|
611
|
-
}
|
|
612
|
-
try {
|
|
613
|
-
await (0, import_promises3.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
|
|
614
|
-
} catch {
|
|
615
|
-
throw new ExecPluginError(
|
|
616
|
-
"exec_shell_unavailable",
|
|
617
|
-
"The exec plugin cannot start because executable /bin/bash is unavailable."
|
|
618
|
-
);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
628
|
function createExecProcessManager() {
|
|
622
629
|
const processes = /* @__PURE__ */ new Map();
|
|
623
630
|
const unknownProcess = () => new ExecPluginError(
|
|
@@ -26,6 +26,9 @@
|
|
|
26
26
|
"startLine": { "param": "start_line", "kind": "number" },
|
|
27
27
|
"endLine": { "param": "end_line", "kind": "number" },
|
|
28
28
|
"locator": { "param": "locator", "kind": "string" }
|
|
29
|
+
},
|
|
30
|
+
"resultMetadata": {
|
|
31
|
+
"outputPreview": { "path": "output", "kind": "preview" }
|
|
29
32
|
}
|
|
30
33
|
},
|
|
31
34
|
"skills": [],
|
|
@@ -77,7 +80,11 @@
|
|
|
77
80
|
"developmentRoles": ["mutate"],
|
|
78
81
|
"eventPresentation": {
|
|
79
82
|
"metadata": {
|
|
80
|
-
"path": { "param": "path", "kind": "string" }
|
|
83
|
+
"path": { "param": "path", "kind": "string" },
|
|
84
|
+
"inputPreview": { "param": "instruction", "kind": "string" }
|
|
85
|
+
},
|
|
86
|
+
"resultMetadata": {
|
|
87
|
+
"outputPreview": { "path": "output", "kind": "preview" }
|
|
81
88
|
}
|
|
82
89
|
},
|
|
83
90
|
"payloadChannelSpec": {
|
|
@@ -177,6 +184,10 @@
|
|
|
177
184
|
"eventPresentation": {
|
|
178
185
|
"metadata": {
|
|
179
186
|
"path": { "param": "path", "kind": "string" }
|
|
187
|
+
},
|
|
188
|
+
"resultMetadata": {
|
|
189
|
+
"outputPreview": { "path": "output", "kind": "preview" },
|
|
190
|
+
"sourceTruncated": { "path": "data.truncation.truncated", "kind": "boolean" }
|
|
180
191
|
}
|
|
181
192
|
},
|
|
182
193
|
"skills": ["read_file_skill"],
|
|
@@ -208,7 +219,11 @@
|
|
|
208
219
|
"developmentRoles": ["establish", "mutate"],
|
|
209
220
|
"eventPresentation": {
|
|
210
221
|
"metadata": {
|
|
211
|
-
"path": { "param": "path", "kind": "string" }
|
|
222
|
+
"path": { "param": "path", "kind": "string" },
|
|
223
|
+
"inputPreview": { "param": "content", "kind": "string" }
|
|
224
|
+
},
|
|
225
|
+
"resultMetadata": {
|
|
226
|
+
"outputPreview": { "path": "output", "kind": "preview" }
|
|
212
227
|
}
|
|
213
228
|
},
|
|
214
229
|
"payloadChannelSpec": {
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "./bounded-io.js";
|
|
12
12
|
import { fail, isNodeErrorCode, rethrowFilesystemError } from "./errors.js";
|
|
13
13
|
import { openMutationParent } from "./mutation-parent.js";
|
|
14
|
+
import { writeWithDirectoryAuthority } from "./directory-authority-write.js";
|
|
14
15
|
|
|
15
16
|
export async function atomicWriteText(
|
|
16
17
|
input: Readonly<{
|
|
@@ -20,6 +21,10 @@ export async function atomicWriteText(
|
|
|
20
21
|
}>,
|
|
21
22
|
): Promise<void> {
|
|
22
23
|
assertMutationContentSize(input.content);
|
|
24
|
+
if (requiresIsolatedDirectoryAuthority()) {
|
|
25
|
+
await writeWithDirectoryAuthority(input);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
23
28
|
const parent = await openMutationParent(input.target);
|
|
24
29
|
const targetPath = `${parent.procPath}/${parent.targetName}`;
|
|
25
30
|
const anchoredTarget = Object.freeze({
|
|
@@ -113,3 +118,7 @@ async function syncDirectoryBestEffort(
|
|
|
113
118
|
// The prepared file itself is always synced before the atomic install.
|
|
114
119
|
}
|
|
115
120
|
}
|
|
121
|
+
|
|
122
|
+
function requiresIsolatedDirectoryAuthority(): boolean {
|
|
123
|
+
return process.platform === "darwin";
|
|
124
|
+
}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { constants, type BigIntStats } from "node:fs";
|
|
3
|
-
import {
|
|
4
|
-
opendir,
|
|
5
|
-
open,
|
|
6
|
-
realpath,
|
|
7
|
-
stat,
|
|
8
|
-
type FileHandle,
|
|
9
|
-
} from "node:fs/promises";
|
|
3
|
+
import { open, realpath, stat, type FileHandle } from "node:fs/promises";
|
|
10
4
|
import { relative, sep } from "node:path";
|
|
11
5
|
import { StringDecoder } from "node:string_decoder";
|
|
12
6
|
import { TextDecoder } from "node:util";
|
|
@@ -19,7 +13,10 @@ export const MAX_MUTATION_BYTES = 1_048_576;
|
|
|
19
13
|
export const READ_HEAD_BYTES = 24_576;
|
|
20
14
|
export const READ_TAIL_BYTES = 12_288;
|
|
21
15
|
export const DEV_SCAN_BYTES = 1_048_576;
|
|
22
|
-
export
|
|
16
|
+
export {
|
|
17
|
+
readDirectorySample,
|
|
18
|
+
DIRECTORY_ENTRY_LIMIT,
|
|
19
|
+
} from "./directory-sample.js";
|
|
23
20
|
|
|
24
21
|
export type BoundedText = Readonly<{
|
|
25
22
|
text: string;
|
|
@@ -350,97 +347,6 @@ export function assertMutationContentSize(content: string): number {
|
|
|
350
347
|
return byteCount;
|
|
351
348
|
}
|
|
352
349
|
|
|
353
|
-
export async function readDirectorySample(
|
|
354
|
-
target: ResolvedRuntimeToolPath,
|
|
355
|
-
): Promise<Readonly<{ entries: readonly string[]; truncated: boolean }>> {
|
|
356
|
-
const entries: string[] = [];
|
|
357
|
-
let handle: FileHandle | undefined;
|
|
358
|
-
try {
|
|
359
|
-
if (
|
|
360
|
-
typeof constants.O_DIRECTORY !== "number" ||
|
|
361
|
-
typeof constants.O_NOFOLLOW !== "number"
|
|
362
|
-
) {
|
|
363
|
-
fail(
|
|
364
|
-
"filesystem_safe_io_unsupported",
|
|
365
|
-
"This platform does not provide the no-follow directory operation required for a safe read.",
|
|
366
|
-
);
|
|
367
|
-
}
|
|
368
|
-
handle = await open(
|
|
369
|
-
target.absolutePath,
|
|
370
|
-
constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW,
|
|
371
|
-
);
|
|
372
|
-
const before = await handle.stat({ bigint: true });
|
|
373
|
-
if (!before.isDirectory()) {
|
|
374
|
-
fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
|
|
375
|
-
}
|
|
376
|
-
const [canonicalRoot, canonicalTarget] = await Promise.all([
|
|
377
|
-
realpath(target.rootPath),
|
|
378
|
-
realpath(target.absolutePath),
|
|
379
|
-
]);
|
|
380
|
-
const rootRelative = relative(canonicalRoot, canonicalTarget);
|
|
381
|
-
if (
|
|
382
|
-
rootRelative === ".." ||
|
|
383
|
-
rootRelative.startsWith(`..${sep}`) ||
|
|
384
|
-
rootRelative.startsWith(sep)
|
|
385
|
-
) {
|
|
386
|
-
fail(
|
|
387
|
-
"filesystem_path_changed",
|
|
388
|
-
`Directory changed outside its configured root: ${target.logicalPath}`,
|
|
389
|
-
);
|
|
390
|
-
}
|
|
391
|
-
const pathIdentity = await stat(canonicalTarget, { bigint: true });
|
|
392
|
-
if (
|
|
393
|
-
!pathIdentity.isDirectory() ||
|
|
394
|
-
pathIdentity.dev !== before.dev ||
|
|
395
|
-
pathIdentity.ino !== before.ino
|
|
396
|
-
) {
|
|
397
|
-
fail(
|
|
398
|
-
"filesystem_path_changed",
|
|
399
|
-
`Directory changed while it was being opened: ${target.logicalPath}`,
|
|
400
|
-
);
|
|
401
|
-
}
|
|
402
|
-
const directory = await opendir(`/proc/self/fd/${handle.fd}`);
|
|
403
|
-
for await (const entry of directory) {
|
|
404
|
-
if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
|
|
405
|
-
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
406
|
-
entries.sort((left, right) => left.localeCompare(right));
|
|
407
|
-
return Object.freeze({
|
|
408
|
-
entries: Object.freeze(entries),
|
|
409
|
-
truncated: true,
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
413
|
-
}
|
|
414
|
-
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
415
|
-
entries.sort((left, right) => left.localeCompare(right));
|
|
416
|
-
return Object.freeze({ entries: Object.freeze(entries), truncated: false });
|
|
417
|
-
} catch (error: unknown) {
|
|
418
|
-
return rethrowFilesystemError(error, "inspect", target.logicalPath);
|
|
419
|
-
} finally {
|
|
420
|
-
await handle?.close().catch(() => undefined);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
async function assertDirectoryStable(
|
|
425
|
-
handle: FileHandle,
|
|
426
|
-
before: BigIntStats,
|
|
427
|
-
logicalPath: string,
|
|
428
|
-
): Promise<void> {
|
|
429
|
-
const after = await handle.stat({ bigint: true });
|
|
430
|
-
if (
|
|
431
|
-
!after.isDirectory() ||
|
|
432
|
-
after.dev !== before.dev ||
|
|
433
|
-
after.ino !== before.ino ||
|
|
434
|
-
after.mtimeNs !== before.mtimeNs ||
|
|
435
|
-
after.ctimeNs !== before.ctimeNs
|
|
436
|
-
) {
|
|
437
|
-
fail(
|
|
438
|
-
"filesystem_read_changed",
|
|
439
|
-
`Directory changed while it was being read: ${logicalPath}`,
|
|
440
|
-
);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
350
|
function rejectBinary(buffer: Buffer, logicalPath: string): void {
|
|
445
351
|
if (buffer.includes(0)) {
|
|
446
352
|
fail(
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ResolvedRuntimeToolPath } from "../../../src/plugin-sdk/index.js";
|
|
2
|
+
import {
|
|
3
|
+
DirectoryAuthorityError,
|
|
4
|
+
runDirectoryAuthorityTask,
|
|
5
|
+
} from "../../../src/shared/directory-authority/index.js";
|
|
6
|
+
import type { MutationTargetVersion } from "./bounded-io.js";
|
|
7
|
+
import { fail, rethrowFilesystemError } from "./errors.js";
|
|
8
|
+
import { openMutationRoot } from "./mutation-parent.js";
|
|
9
|
+
import {
|
|
10
|
+
commitDirectoryWrite,
|
|
11
|
+
type DirectoryWriteInput,
|
|
12
|
+
} from "./directory-write-task.js";
|
|
13
|
+
|
|
14
|
+
export async function writeWithDirectoryAuthority(
|
|
15
|
+
input: Readonly<{
|
|
16
|
+
target: ResolvedRuntimeToolPath;
|
|
17
|
+
content: string;
|
|
18
|
+
expectedVersion: MutationTargetVersion;
|
|
19
|
+
}>,
|
|
20
|
+
): Promise<void> {
|
|
21
|
+
const root = await openMutationRoot(input.target);
|
|
22
|
+
const expected = input.expectedVersion;
|
|
23
|
+
const expectedVersion: DirectoryWriteInput["expectedVersion"] =
|
|
24
|
+
expected.kind === "absent"
|
|
25
|
+
? { kind: "absent" }
|
|
26
|
+
: {
|
|
27
|
+
...expected,
|
|
28
|
+
device: String(expected.device),
|
|
29
|
+
inode: String(expected.inode),
|
|
30
|
+
modifiedNs: String(expected.modifiedNs),
|
|
31
|
+
changedNs: String(expected.changedNs),
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
await runDirectoryAuthorityTask({
|
|
35
|
+
directoryPath: input.target.rootPath,
|
|
36
|
+
directoryFd: root.fd,
|
|
37
|
+
input: {
|
|
38
|
+
relativePath: input.target.relativePath,
|
|
39
|
+
content: input.content,
|
|
40
|
+
expectedVersion,
|
|
41
|
+
},
|
|
42
|
+
task: commitDirectoryWrite,
|
|
43
|
+
});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (error instanceof DirectoryAuthorityError) {
|
|
46
|
+
if (error.code.startsWith("filesystem_")) {
|
|
47
|
+
fail(
|
|
48
|
+
error.code,
|
|
49
|
+
`Safe write failed: ${input.target.logicalPath}`,
|
|
50
|
+
error.data,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
if (error.code.startsWith("directory_authority_")) {
|
|
54
|
+
fail(
|
|
55
|
+
"filesystem_path_changed",
|
|
56
|
+
`Directory authority was lost: ${input.target.logicalPath}`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
rethrowFilesystemError(error, "write", input.target.logicalPath);
|
|
61
|
+
} finally {
|
|
62
|
+
await root.close().catch(() => undefined);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Self-contained trusted task, run with an already verified directory cwd. */
|
|
2
|
+
export async function sampleDirectoryTask(
|
|
3
|
+
input: Readonly<{ maxEntries: number }>,
|
|
4
|
+
): Promise<
|
|
5
|
+
Readonly<{
|
|
6
|
+
entries: readonly string[];
|
|
7
|
+
truncated: boolean;
|
|
8
|
+
}>
|
|
9
|
+
> {
|
|
10
|
+
const { opendir } =
|
|
11
|
+
require("node:fs/promises") as typeof import("node:fs/promises");
|
|
12
|
+
const entries: string[] = [];
|
|
13
|
+
const directory = await opendir(".");
|
|
14
|
+
for await (const entry of directory) {
|
|
15
|
+
if (entries.length >= input.maxEntries) {
|
|
16
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
17
|
+
return { entries, truncated: true };
|
|
18
|
+
}
|
|
19
|
+
entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
20
|
+
}
|
|
21
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
22
|
+
return { entries, truncated: false };
|
|
23
|
+
}
|