@abot-ai/runtime 1.3.0 → 1.4.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/dist/plugins/system/source/application-catalog.d.ts +14 -0
- package/dist/plugins/system/source/application-catalog.js +185 -0
- package/dist/plugins/system/source/application-launch.d.ts +10 -0
- package/dist/plugins/system/source/application-launch.js +80 -0
- package/dist/plugins/system/source/application-observation.d.ts +25 -0
- package/dist/plugins/system/source/application-observation.js +53 -0
- package/dist/plugins/system/source/commands.d.ts +7 -0
- package/dist/plugins/system/source/commands.js +71 -0
- package/dist/plugins/system/source/companion/autostart.d.ts +16 -0
- package/dist/plugins/system/source/companion/autostart.js +146 -0
- package/dist/plugins/system/source/companion/broker-location.d.ts +11 -0
- package/dist/plugins/system/source/companion/broker-location.js +76 -0
- package/dist/plugins/system/source/companion/broker-server.d.ts +4 -0
- package/dist/plugins/system/source/companion/broker-server.js +147 -0
- package/dist/plugins/system/source/companion/connection.d.ts +25 -0
- package/dist/plugins/system/source/companion/connection.js +182 -0
- package/dist/plugins/system/source/companion/liveness.d.ts +3 -0
- package/dist/plugins/system/source/companion/liveness.js +20 -0
- package/dist/plugins/system/source/companion/native-address.d.ts +12 -0
- package/dist/plugins/system/source/companion/native-address.js +41 -0
- package/dist/plugins/system/source/companion/native-identity.d.ts +2 -0
- package/dist/plugins/system/source/companion/native-identity.js +23 -0
- package/dist/plugins/system/source/companion/native-messages.d.ts +9 -0
- package/dist/plugins/system/source/companion/native-messages.js +77 -0
- package/dist/plugins/system/source/companion/native-session.d.ts +19 -0
- package/dist/plugins/system/source/companion/native-session.js +205 -0
- package/dist/plugins/system/source/companion/native-state.d.ts +22 -0
- package/dist/plugins/system/source/companion/native-state.js +126 -0
- package/dist/plugins/system/source/companion/native-supervisor.d.ts +10 -0
- package/dist/plugins/system/source/companion/native-supervisor.js +93 -0
- package/dist/plugins/system/source/companion/pairing-store.d.ts +22 -0
- package/dist/plugins/system/source/companion/pairing-store.js +102 -0
- package/dist/plugins/system/source/companion/private-store.d.ts +4 -0
- package/dist/plugins/system/source/companion/private-store.js +59 -0
- package/dist/plugins/system/source/companion/process-owner-identity.d.ts +22 -0
- package/dist/plugins/system/source/companion/process-owner-identity.js +144 -0
- package/dist/plugins/system/source/companion/protocol.d.ts +57 -0
- package/dist/plugins/system/source/companion/protocol.js +66 -0
- package/dist/plugins/system/source/contracts.d.ts +38 -0
- package/dist/plugins/system/source/contracts.js +7 -0
- package/dist/plugins/system/source/elevation.d.ts +8 -0
- package/dist/plugins/system/source/elevation.js +57 -0
- package/dist/plugins/system/source/handlers.d.ts +3 -0
- package/dist/plugins/system/source/handlers.js +90 -0
- package/dist/plugins/system/source/host-evidence.d.ts +4 -0
- package/dist/plugins/system/source/host-evidence.js +52 -0
- package/dist/plugins/system/source/host-observation.d.ts +25 -0
- package/dist/plugins/system/source/host-observation.js +59 -0
- package/dist/plugins/system/source/process-result.d.ts +4 -0
- package/dist/plugins/system/source/process-result.js +86 -0
- package/dist/plugins/system/source/process-runner.d.ts +3 -0
- package/dist/plugins/system/source/process-runner.js +103 -0
- package/dist/plugins/system/source/target-observation.d.ts +18 -0
- package/dist/plugins/system/source/target-observation.js +29 -0
- package/dist/plugins/system/source/targets.d.ts +8 -0
- package/dist/plugins/system/source/targets.js +101 -0
- package/dist/scripts/add-runtime-model.js +10 -53
- package/dist/scripts/init-runtime.js +4 -13
- package/dist/scripts/runtime-model-addition.d.ts +13 -0
- package/dist/scripts/runtime-model-addition.js +53 -0
- package/dist/scripts/runtime-setup-directories.d.ts +2 -0
- package/dist/scripts/runtime-setup-directories.js +38 -0
- package/dist/scripts/runtime-setup-files.d.ts +3 -1
- package/dist/scripts/runtime-setup-files.js +18 -1
- package/dist/src/capabilities/file-output-presentation.d.ts +43 -0
- package/dist/src/capabilities/file-output-presentation.js +133 -0
- package/dist/src/capabilities/tool-definition-validator/definition-parser.js +2 -0
- package/dist/src/capabilities/tool-definition-validator/event-input-text-options.d.ts +5 -0
- package/dist/src/capabilities/tool-definition-validator/event-input-text-options.js +37 -0
- package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
- package/dist/src/capabilities/tool-definition-validator/module-registry.js +12 -0
- package/dist/src/capabilities/tool-event-input-text.d.ts +9 -0
- package/dist/src/capabilities/tool-event-input-text.js +64 -0
- package/dist/src/capabilities/tool-event-metadata.js +10 -0
- package/dist/src/capabilities/tool-executor.d.ts +1 -0
- package/dist/src/capabilities/tool-executor.js +1 -0
- package/dist/src/capabilities/tool-permission-mode.d.ts +7 -0
- package/dist/src/capabilities/tool-permission-mode.js +27 -0
- package/dist/src/capabilities/tool-types.d.ts +18 -2
- package/dist/src/cli/abot.js +18 -15
- package/dist/src/cli/host-companion-bundle.mjs +5201 -0
- package/dist/src/cli/host-companion-entry.d.ts +8 -0
- package/dist/src/cli/host-companion-entry.js +70 -0
- package/dist/src/cli/host-companion-startup.d.ts +4 -0
- package/dist/src/cli/host-companion-startup.js +35 -0
- package/dist/src/cli/host-companion.d.ts +5 -0
- package/dist/src/cli/host-companion.js +203 -0
- package/dist/src/model-gateway/server/configuration.js +4 -1
- package/dist/src/model-gateway/server/contracts.d.ts +2 -0
- package/dist/src/plugin-contract/entrypoint.d.ts +4 -2
- package/dist/src/plugin-contract/manifest.d.ts +1 -0
- package/dist/src/runtime/adapters/config-file-transaction.d.ts +46 -0
- package/dist/src/runtime/adapters/config-file-transaction.js +158 -0
- package/dist/src/runtime/adapters/configured-skill-provider.js +3 -3
- package/dist/src/runtime/adapters/in-memory-session-store.js +11 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +7 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +4 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/install.d.ts +1 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/install.js +5 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.js +15 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +2 -0
- package/dist/src/runtime/adapters/long-term-memory/onboarding-config-repository.js +17 -43
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/catalog/registrations.js +6 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +10 -1
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.d.ts +11 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.js +37 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.d.ts +7 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.js +105 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +29 -3
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.d.ts +1 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.js +1 -0
- package/dist/src/runtime/capabilities/configured-tool-registry.js +9 -1
- package/dist/src/runtime/capabilities/file-output-root-identity.d.ts +5 -0
- package/dist/src/runtime/capabilities/file-output-root-identity.js +146 -0
- package/dist/src/runtime/capabilities/file-output-root-marker-creation.d.ts +5 -0
- package/dist/src/runtime/capabilities/file-output-root-marker-creation.js +63 -0
- package/dist/src/runtime/capabilities/request-bound-tool-registry.d.ts +1 -0
- package/dist/src/runtime/capabilities/request-bound-tool-registry.js +6 -1
- package/dist/src/runtime/capabilities/request-module-preparation.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-module-preparation.js +102 -0
- package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +10 -0
- package/dist/src/runtime/capabilities/request-permission-catalog.js +50 -0
- package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +4 -0
- package/dist/src/runtime/capabilities/request-permission-tool-registry.js +61 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +5 -2
- package/dist/src/runtime/capabilities/request-working-directory.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-working-directory.js +12 -0
- package/dist/src/runtime/composition.d.ts +2 -0
- package/dist/src/runtime/config/runner/loader.d.ts +4 -0
- package/dist/src/runtime/config/runner/loader.js +23 -3
- package/dist/src/runtime/context/capability-brief-budget.d.ts +18 -0
- package/dist/src/runtime/context/capability-brief-budget.js +38 -0
- package/dist/src/runtime/context/capability-brief-readmission.d.ts +21 -0
- package/dist/src/runtime/context/capability-brief-readmission.js +47 -0
- package/dist/src/runtime/context/capability-brief.d.ts +9 -2
- package/dist/src/runtime/context/capability-brief.js +21 -39
- package/dist/src/runtime/context/capability-descriptions.d.ts +3 -0
- package/dist/src/runtime/context/capability-descriptions.js +23 -0
- package/dist/src/runtime/default-environment-adapters.js +3 -4
- package/dist/src/runtime/local-application.d.ts +18 -0
- package/dist/src/runtime/local-application.js +12 -0
- package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -0
- package/dist/src/runtime/local-host/app-service-dispatch.js +9 -0
- package/dist/src/runtime/local-host/client-services.d.ts +16 -0
- package/dist/src/runtime/local-host/client-services.js +3 -2
- package/dist/src/runtime/local-host/contracts.d.ts +4 -0
- package/dist/src/runtime/local-host/startup-connection.js +22 -7
- package/dist/src/runtime/local-host/transport.js +14 -2
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +5 -2
- package/dist/src/runtime/orchestration/role-calls/command-decoder.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.js +46 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +8 -4
- package/dist/src/runtime/orchestration/role-calls/transactions.js +2 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.d.ts +48 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.js +9 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-source.d.ts +7 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-source.js +85 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.js +17 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-validation.d.ts +10 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-validation.js +149 -0
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +1 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
- package/dist/src/runtime/plugins/compiled-catalog.d.ts +2 -1
- package/dist/src/runtime/plugins/configured-manifests.d.ts +3 -0
- package/dist/src/runtime/plugins/configured-manifests.js +37 -0
- package/dist/src/runtime/plugins/entrypoint-validation.d.ts +6 -0
- package/dist/src/runtime/plugins/entrypoint-validation.js +74 -0
- package/dist/src/runtime/plugins/loader.js +11 -123
- package/dist/src/runtime/plugins/manifest-discovery.d.ts +4 -1
- package/dist/src/runtime/plugins/manifest-discovery.js +8 -1
- package/dist/src/runtime/plugins/manifest-projection.js +3 -0
- package/dist/src/runtime/plugins/manifest-validator.js +7 -1
- package/dist/src/runtime/plugins/runtime-capability-plugins.d.ts +4 -0
- package/dist/src/runtime/plugins/runtime-capability-plugins.js +7 -0
- package/dist/src/runtime/plugins/selection.d.ts +14 -0
- package/dist/src/runtime/plugins/selection.js +38 -0
- package/dist/src/runtime/ports.d.ts +8 -2
- package/dist/src/runtime/projects/contracts.d.ts +40 -0
- package/dist/src/runtime/projects/contracts.js +10 -0
- package/dist/src/runtime/projects/folders.d.ts +7 -0
- package/dist/src/runtime/projects/folders.js +110 -0
- package/dist/src/runtime/projects/repository.d.ts +10 -0
- package/dist/src/runtime/projects/repository.js +54 -0
- package/dist/src/runtime/projects/service.d.ts +3 -0
- package/dist/src/runtime/projects/service.js +34 -0
- package/dist/src/runtime/projects/session-paths.d.ts +5 -0
- package/dist/src/runtime/projects/session-paths.js +13 -0
- package/dist/src/runtime/request/execution-agent-plan-update.d.ts +4 -0
- package/dist/src/runtime/request/execution-agent-plan-update.js +13 -0
- package/dist/src/runtime/request/execution-agent-root-execution.js +9 -1
- package/dist/src/runtime/request/handler.js +9 -2
- package/dist/src/runtime/request/input.d.ts +2 -1
- package/dist/src/runtime/request/input.js +1 -6
- package/dist/src/runtime/request/role-call-planner-events.js +4 -0
- package/dist/src/runtime/request/role-executor-composition.js +9 -1
- package/dist/src/runtime/request/root-contract.d.ts +6 -1
- package/dist/src/runtime/request/root-execution-kernel.js +17 -0
- package/dist/src/runtime/request/root-plan-event-projection.d.ts +3 -0
- package/dist/src/runtime/request/root-plan-event-projection.js +32 -0
- package/dist/src/runtime/request/root-plan-update.d.ts +15 -0
- package/dist/src/runtime/request/root-plan-update.js +20 -0
- package/dist/src/runtime/request/worker-capability-composition.d.ts +1 -0
- package/dist/src/runtime/request/worker-capability-composition.js +2 -0
- package/dist/src/runtime/runtime-environment.d.ts +1 -0
- package/dist/src/runtime/runtime-environment.js +2 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.d.ts +32 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.js +106 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.d.ts +5 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.js +40 -0
- package/dist/src/runtime/steps/auditor-decision/audit-input-state.d.ts +12 -0
- package/dist/src/runtime/steps/auditor-decision/audit-input-state.js +101 -0
- package/dist/src/runtime/steps/auditor-decision/contracts.d.ts +31 -16
- package/dist/src/runtime/steps/auditor-decision/contracts.js +3 -3
- package/dist/src/runtime/steps/auditor-decision/evidence-binding.d.ts +5 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-binding.js +43 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-coverage.d.ts +2 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-coverage.js +71 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.d.ts +13 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.js +89 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.d.ts +10 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.js +56 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-selection.d.ts +9 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-selection.js +71 -0
- package/dist/src/runtime/steps/auditor-decision/format.js +44 -2
- package/dist/src/runtime/steps/auditor-decision/index.d.ts +3 -0
- package/dist/src/runtime/steps/auditor-decision/index.js +3 -0
- package/dist/src/runtime/steps/auditor-decision/input.d.ts +2 -2
- package/dist/src/runtime/steps/auditor-decision/input.js +64 -20
- package/dist/src/runtime/steps/auditor-decision/parser.js +38 -23
- package/dist/src/runtime/steps/auditor-decision/projection.js +49 -99
- package/dist/src/runtime/steps/auditor-decision/prompt.d.ts +1 -1
- package/dist/src/runtime/steps/auditor-decision/prompt.js +9 -4
- package/dist/src/runtime/steps/auditor-decision/run.js +79 -47
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +8 -1
- package/dist/src/runtime/steps/execution-agent/contracts.js +2 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +4 -0
- package/dist/src/runtime/steps/execution-agent/format.js +4 -3
- package/dist/src/runtime/steps/execution-agent/input.js +10 -11
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +11 -4
- package/dist/src/runtime/steps/execution-agent/state-context.js +10 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +18 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +86 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.js +38 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-sources.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-sources.js +54 -0
- package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +40 -0
- package/dist/src/runtime/steps/planner-decision/capability-brief.js +47 -0
- package/dist/src/runtime/steps/planner-decision/input.d.ts +4 -2
- package/dist/src/runtime/steps/planner-decision/input.js +23 -13
- package/dist/src/runtime/steps/planner-decision/prompt.js +2 -2
- package/dist/src/runtime/steps/planner-decision/run.js +11 -7
- package/dist/src/runtime/steps/planner-graph/parser.js +0 -11
- package/dist/src/runtime/steps/planner-graph/prompt.js +2 -1
- package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.js +39 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +2 -1
- package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.d.ts +3 -1
- package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.js +20 -1
- package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.d.ts +1 -1
- package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.js +6 -6
- package/dist/src/runtime/steps/worker-decision/parser/capability-invocation-validation.js +2 -1
- package/dist/src/sessions/project-binding.d.ts +12 -0
- package/dist/src/sessions/project-binding.js +49 -0
- package/dist/src/sessions/record/projection.d.ts +6 -1
- package/dist/src/sessions/record/projection.js +1 -0
- package/dist/src/sessions/session-service.d.ts +2 -1
- package/dist/src/sessions/session-service.js +11 -1
- package/dist/src/sessions/types.d.ts +7 -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/web-ui/app/ARCHITECTURE.md +121 -1
- package/dist/src/web-ui/app/app-bootstrap.js +3 -0
- package/dist/src/web-ui/app/app-dom.js +3 -0
- package/dist/src/web-ui/app/app-state.js +38 -0
- package/dist/src/web-ui/app/app.js +76 -67
- package/dist/src/web-ui/app/components/config-workspace/config-model.js +23 -3
- package/dist/src/web-ui/app/components/config-workspace/dashboard-rendering.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/field-rendering.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +6 -0
- package/dist/src/web-ui/app/components/config-workspace/model-setup-entry.js +27 -0
- package/dist/src/web-ui/app/components/config-workspace/raw-config-repair.js +28 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +5 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +23 -3
- package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +26 -8
- package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +56 -0
- package/dist/src/web-ui/app/components/config-workspace.js +11 -0
- package/dist/src/web-ui/app/components/conversation-activity.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-activity.js +10 -2
- package/dist/src/web-ui/app/components/conversation-file-action.js +33 -0
- package/dist/src/web-ui/app/components/conversation-file-focus.d.ts +12 -0
- package/dist/src/web-ui/app/components/conversation-file-focus.js +149 -0
- package/dist/src/web-ui/app/components/conversation-file-preview.d.ts +23 -0
- package/dist/src/web-ui/app/components/conversation-file-preview.js +247 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.js +10 -2
- package/dist/src/web-ui/app/components/conversation-tool-evidence.d.ts +9 -0
- package/dist/src/web-ui/app/components/conversation-tool-evidence.js +129 -0
- package/dist/src/web-ui/app/components/conversation-tools.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-tools.js +25 -105
- package/dist/src/web-ui/app/components/conversation-view.js +10 -1
- package/dist/src/web-ui/app/components/dashboard/workspace.js +19 -7
- package/dist/src/web-ui/app/components/model-setup/rendering.js +99 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +111 -0
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +16 -0
- package/dist/src/web-ui/app/components/model-setup/validation.js +125 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +44 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +370 -0
- package/dist/src/web-ui/app/components/plugins/manager.js +200 -0
- package/dist/src/web-ui/app/components/plugins/rendering.js +124 -0
- package/dist/src/web-ui/app/components/plugins/view-state.js +123 -0
- package/dist/src/web-ui/app/components/project-creation.js +119 -0
- package/dist/src/web-ui/app/components/project-session-groups.js +95 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +83 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.d.ts +9 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.js +198 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-rendering.js +107 -0
- package/dist/src/web-ui/app/components/runtime-setup/commands.js +54 -0
- package/dist/src/web-ui/app/components/runtime-setup/configuration-recovery.js +25 -0
- package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +154 -0
- package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +71 -0
- package/dist/src/web-ui/app/components/runtime-setup/context-window.js +18 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.d.ts +15 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +87 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +30 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +57 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding.js +284 -0
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +117 -0
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +173 -0
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +141 -0
- package/dist/src/web-ui/app/components/runtime-setup/validation.js +69 -0
- package/dist/src/web-ui/app/components/runtime-setup/view-state.js +58 -0
- package/dist/src/web-ui/app/components/runtime-setup/wizard-shell.js +27 -0
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +66 -5
- package/dist/src/web-ui/app/components/runtime-setup-guide.js +415 -461
- package/dist/src/web-ui/app/components/system-host/download.js +38 -0
- package/dist/src/web-ui/app/components/system-host/manager.js +249 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +88 -0
- package/dist/src/web-ui/app/components/system-host/setup-notice.js +87 -0
- package/dist/src/web-ui/app/components/system-host/visibility.js +35 -0
- package/dist/src/web-ui/app/components/tool-approval-card.d.ts +4 -0
- package/dist/src/web-ui/app/components/tool-approval-card.js +15 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +118 -0
- package/dist/src/web-ui/app/configuration-feature.js +125 -4
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +2 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +4 -3
- package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.d.ts +24 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.js +158 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.d.ts +19 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.js +63 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +2 -0
- package/dist/src/web-ui/app/controllers/conversation-view-feature.js +28 -0
- package/dist/src/web-ui/app/controllers/dashboard-controller.js +17 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +45 -0
- package/dist/src/web-ui/app/controllers/projects-controller.js +278 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.js +3 -0
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +13 -6
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -1
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +11 -95
- package/dist/src/web-ui/app/controllers/session-controller.js +64 -57
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.d.ts +20 -0
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +116 -0
- package/dist/src/web-ui/app/dashboard-feature.js +32 -10
- package/dist/src/web-ui/app/index.html +44 -7
- package/dist/src/web-ui/app/lib/conversation-file-preview.d.ts +12 -0
- package/dist/src/web-ui/app/lib/conversation-file-reference.d.ts +30 -0
- package/dist/src/web-ui/app/lib/conversation-file-reference.js +66 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +2 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.js +18 -6
- package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +2 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.js +4 -2
- package/dist/src/web-ui/app/lib/tool-permission-mode.d.ts +16 -0
- package/dist/src/web-ui/app/lib/tool-permission-mode.js +60 -0
- package/dist/src/web-ui/app/lib/tool-process-activity-fields.js +102 -0
- package/dist/src/web-ui/app/projects-feature.js +134 -0
- package/dist/src/web-ui/app/runtime-onboarding-feature.d.ts +34 -0
- package/dist/src/web-ui/app/runtime-onboarding-feature.js +92 -0
- package/dist/src/web-ui/app/runtime-setup-page-lifecycle.d.ts +5 -0
- package/dist/src/web-ui/app/runtime-setup-page-lifecycle.js +13 -0
- package/dist/src/web-ui/app/services/client-preferences.d.ts +24 -0
- package/dist/src/web-ui/app/services/client-preferences.js +32 -19
- package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +46 -0
- package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.d.ts +28 -0
- package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.js +75 -0
- package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +19 -0
- package/dist/src/web-ui/app/services/runtime-web-client/projects.js +34 -0
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +27 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +52 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +35 -4
- package/dist/src/web-ui/app/styles/13-projects.css +272 -0
- package/dist/src/web-ui/app/styles/18-dashboard.css +0 -5
- package/dist/src/web-ui/app/styles/19-runtime-setup.css +411 -0
- package/dist/src/web-ui/app/styles/20-chat-composer.css +0 -384
- package/dist/src/web-ui/app/styles/29-conversation-file-preview.css +254 -0
- package/dist/src/web-ui/app/styles/37-runtime-activation.css +26 -0
- package/dist/src/web-ui/app/styles/38-schedule-workspace.css +1 -10
- package/dist/src/web-ui/app/styles/41-plugin-management.css +351 -0
- package/dist/src/web-ui/app/styles/42-runtime-setup-plugins.css +179 -0
- package/dist/src/web-ui/app/styles/43-model-setup.css +73 -0
- package/dist/src/web-ui/app/styles/44-model-provider-cards.css +63 -0
- package/dist/src/web-ui/app/styles/45-bridge-setup.css +44 -0
- package/dist/src/web-ui/app/styles/46-system-host.css +132 -0
- package/dist/src/web-ui/app/styles.css +10 -0
- package/dist/src/web-ui/config-dashboard-backend.d.ts +5 -0
- package/dist/src/web-ui/config-dashboard-backend.js +94 -114
- package/dist/src/web-ui/config-dashboard-model-identity.d.ts +7 -0
- package/dist/src/web-ui/config-dashboard-model-identity.js +45 -0
- package/dist/src/web-ui/config-dashboard-save-transaction.d.ts +5 -0
- package/dist/src/web-ui/config-dashboard-save-transaction.js +21 -0
- package/dist/src/web-ui/environment-config.d.ts +17 -0
- package/dist/src/web-ui/environment-config.js +60 -0
- package/dist/src/web-ui/forwarded-loopback-policy.d.ts +2 -0
- package/dist/src/web-ui/forwarded-loopback-policy.js +14 -0
- package/dist/src/web-ui/local-runtime/api-router.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/api-router.js +136 -12
- package/dist/src/web-ui/local-runtime/config-mutation-request.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/config-mutation-request.js +55 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-environments.d.ts +22 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-environments.js +106 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +36 -0
- package/dist/src/web-ui/local-runtime/configuration-activation.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/configuration-activation.js +107 -0
- package/dist/src/web-ui/local-runtime/contracts.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/conversation-file-access.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/conversation-file-access.js +131 -0
- package/dist/src/web-ui/local-runtime/conversation-file-content.d.ts +21 -0
- package/dist/src/web-ui/local-runtime/conversation-file-content.js +75 -0
- package/dist/src/web-ui/local-runtime/conversation-file-format.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/conversation-file-format.js +87 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-open.d.ts +10 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-open.js +94 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-request.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-request.js +72 -0
- package/dist/src/web-ui/local-runtime/conversation-file-routes.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/conversation-file-routes.js +105 -0
- package/dist/src/web-ui/local-runtime/conversation-file-target.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/conversation-file-target.js +158 -0
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/environment-registry.js +121 -6
- package/dist/src/web-ui/local-runtime/memory-onboarding-routes.d.ts +2 -1
- package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +15 -10
- package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/model-setup-catalog.js +45 -0
- package/dist/src/web-ui/local-runtime/model-setup-identity.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/model-setup-identity.js +20 -0
- package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +24 -0
- package/dist/src/web-ui/local-runtime/model-setup-input.js +107 -0
- package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/model-setup-provider.js +68 -0
- package/dist/src/web-ui/local-runtime/model-setup-retry.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-setup-retry.js +47 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +50 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +93 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +5 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +33 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.js +50 -0
- package/dist/src/web-ui/local-runtime/project-routes.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/project-routes.js +93 -0
- package/dist/src/web-ui/local-runtime/provider-credential-identity.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/provider-credential-identity.js +18 -0
- package/dist/src/web-ui/local-runtime/request-execution.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/request-execution.js +8 -0
- package/dist/src/web-ui/local-runtime/runtime-availability.js +36 -7
- package/dist/src/web-ui/local-runtime/runtime-setup-completion.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-completion.js +28 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +110 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +21 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +148 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.js +18 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft.d.ts +21 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft.js +105 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.js +40 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.js +27 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +19 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-input.js +82 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-model-file.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-model-file.js +35 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.js +23 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.js +31 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +60 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.js +77 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +35 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +56 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +229 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +65 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +195 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +35 -0
- package/dist/src/web-ui/local-runtime/saved-model-catalog.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/saved-model-catalog.js +20 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-input.js +71 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-provider.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +114 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +53 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +32 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-service.js +59 -0
- package/dist/src/web-ui/local-runtime-backend.d.ts +1 -0
- package/dist/src/web-ui/local-runtime-backend.js +3 -0
- package/dist/src/web-ui/plugin-capability-selection.d.ts +14 -0
- package/dist/src/web-ui/plugin-capability-selection.js +48 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +26 -0
- package/dist/src/web-ui/plugin-management-catalog.js +56 -0
- package/dist/src/web-ui/plugin-management-selection.d.ts +16 -0
- package/dist/src/web-ui/plugin-management-selection.js +71 -0
- package/dist/src/web-ui/plugin-management-service.d.ts +29 -0
- package/dist/src/web-ui/plugin-management-service.js +150 -0
- package/dist/src/web-ui/request-authority.d.ts +8 -0
- package/dist/src/web-ui/request-authority.js +129 -0
- package/dist/src/web-ui/runtime-setup-gateway-address.d.ts +3 -0
- package/dist/src/web-ui/runtime-setup-gateway-address.js +26 -0
- package/dist/src/web-ui/runtime-setup-gateway.d.ts +29 -0
- package/dist/src/web-ui/runtime-setup-gateway.js +177 -0
- package/dist/src/web-ui/runtime-setup-shutdown.d.ts +2 -0
- package/dist/src/web-ui/runtime-setup-shutdown.js +20 -0
- package/dist/src/web-ui/server.d.ts +7 -14
- package/dist/src/web-ui/server.js +53 -63
- package/dist/src/web-ui/session-read-state/service.d.ts +12 -2
- package/dist/src/web-ui/system-host-service.d.ts +19 -0
- package/dist/src/web-ui/system-host-service.js +159 -0
- package/dist/src/web-ui/system-host-setup/companion-bundle.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-bundle.js +12 -0
- package/dist/src/web-ui/system-host-setup/companion-macos.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-macos.js +74 -0
- package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-windows.js +105 -0
- package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +18 -0
- package/dist/src/web-ui/system-host-setup/installer-contract.js +51 -0
- package/dist/src/web-ui/system-host-setup/installers.d.ts +6 -0
- package/dist/src/web-ui/system-host-setup/installers.js +30 -0
- package/dist/src/web-ui/system-host-setup/native-authorization.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/native-authorization.js +11 -0
- package/dist/src/web-ui/system-host-setup/node-distribution.d.ts +19 -0
- package/dist/src/web-ui/system-host-setup/node-distribution.js +9 -0
- package/dist/src/web-ui/system-host-setup/readiness.d.ts +18 -0
- package/dist/src/web-ui/system-host-setup/readiness.js +70 -0
- package/dist/src/web-ui/system-host-setup/routes.d.ts +20 -0
- package/dist/src/web-ui/system-host-setup/routes.js +121 -0
- package/dist/src/web-ui/system-host-setup/windows-script-wrapper.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/windows-script-wrapper.js +17 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-config.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-config.js +67 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-windows.d.ts +1 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-windows.js +49 -0
- package/dist/src/web-ui/system-host-upgrade-authority.d.ts +5 -0
- package/dist/src/web-ui/system-host-upgrade-authority.js +13 -0
- package/docs/architecture.md +6 -1
- package/docs/installation.md +53 -17
- package/docs/known-limitations.md +14 -0
- package/docs/plugins.md +137 -26
- package/docs/projects-and-full-plus.md +218 -0
- package/docs/runtime-invariant-coverage.md +6 -3
- package/docs/runtime-prompt-policy-contracts.md +37 -5
- package/docs/runtime-public-contracts.md +17 -0
- package/package.json +5 -2
- package/plugins/exec/plugin.json +30 -9
- package/plugins/exec/skills/exec_process_skill/SKILL.md +1 -0
- package/plugins/exec/skills/exec_skill/SKILL.md +9 -10
- package/plugins/exec/source/handlers.ts +4 -38
- package/plugins/exec/source/paths.ts +53 -49
- package/plugins/exec/source/process-manager.ts +1 -20
- package/plugins/exec/source/shell-platform.ts +29 -0
- package/plugins/exec/source/types.ts +6 -4
- package/plugins/exec/source/validation.ts +33 -198
- package/plugins/exec/src/index.cjs +87 -222
- package/plugins/filesystem/plugin.json +1 -1
- package/plugins/filesystem/skills/dev_view_skill/SKILL.md +7 -0
- package/plugins/filesystem/source/atomic-write.ts +15 -3
- package/plugins/filesystem/source/bounded-io.ts +5 -99
- package/plugins/filesystem/source/dev-view.ts +2 -1
- package/plugins/filesystem/source/directory-authority-write.ts +68 -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/edit-file.ts +3 -0
- package/plugins/filesystem/source/file-output-presentation.ts +42 -0
- package/plugins/filesystem/source/mutation-parent.ts +29 -9
- package/plugins/filesystem/source/view-locator.ts +141 -0
- package/plugins/filesystem/source/view-window.ts +12 -25
- package/plugins/filesystem/source/write-file.ts +8 -0
- package/plugins/filesystem/src/index.cjs +855 -153
- 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/system/plugin.json +374 -0
- package/plugins/system/skills/system_actions/SKILL.md +31 -0
- package/plugins/system/source/application-catalog.ts +237 -0
- package/plugins/system/source/application-launch.ts +113 -0
- package/plugins/system/source/application-observation.ts +78 -0
- package/plugins/system/source/commands.ts +106 -0
- package/plugins/system/source/companion/autostart.ts +185 -0
- package/plugins/system/source/companion/broker-client.ts +183 -0
- package/plugins/system/source/companion/broker-location.ts +89 -0
- package/plugins/system/source/companion/broker-server.ts +169 -0
- package/plugins/system/source/companion/connection.ts +211 -0
- package/plugins/system/source/companion/liveness.ts +23 -0
- package/plugins/system/source/companion/native-address.ts +55 -0
- package/plugins/system/source/companion/native-identity.ts +26 -0
- package/plugins/system/source/companion/native-messages.ts +100 -0
- package/plugins/system/source/companion/native-session.ts +268 -0
- package/plugins/system/source/companion/native-state.ts +135 -0
- package/plugins/system/source/companion/native-supervisor.ts +98 -0
- package/plugins/system/source/companion/pairing-store.ts +110 -0
- package/plugins/system/source/companion/private-store.ts +58 -0
- package/plugins/system/source/companion/process-owner-identity.ts +190 -0
- package/plugins/system/source/companion/protocol.ts +108 -0
- package/plugins/system/source/contracts.ts +44 -0
- package/plugins/system/source/elevation.ts +88 -0
- package/plugins/system/source/handlers.ts +120 -0
- package/plugins/system/source/host-dispatch.ts +106 -0
- package/plugins/system/source/host-evidence.ts +72 -0
- package/plugins/system/source/host-observation.ts +66 -0
- package/plugins/system/source/index.ts +8 -0
- package/plugins/system/source/process-result.ts +111 -0
- package/plugins/system/source/process-runner.ts +104 -0
- package/plugins/system/source/request-system-modules.ts +117 -0
- package/plugins/system/source/request-target-snapshot.ts +163 -0
- package/plugins/system/source/target-observation.ts +43 -0
- package/plugins/system/source/targets.ts +147 -0
- package/plugins/system/src/index.cjs +1730 -0
- package/src/runtime/README.md +36 -8
- package/src/runtime/local-host/README.md +7 -0
- package/dist/src/runtime/steps/planner-decision/capability-catalog-context.d.ts +0 -14
- package/dist/src/runtime/steps/planner-decision/capability-catalog-context.js +0 -87
|
@@ -253,13 +253,13 @@ var writeFileAdapter = Object.freeze({
|
|
|
253
253
|
});
|
|
254
254
|
|
|
255
255
|
// plugins/filesystem/source/dev-view.ts
|
|
256
|
-
var
|
|
256
|
+
var import_promises3 = require("node:fs/promises");
|
|
257
257
|
|
|
258
258
|
// plugins/filesystem/source/bounded-io.ts
|
|
259
259
|
var import_node_crypto = require("node:crypto");
|
|
260
|
-
var
|
|
261
|
-
var
|
|
262
|
-
var
|
|
260
|
+
var import_node_fs2 = require("node:fs");
|
|
261
|
+
var import_promises2 = require("node:fs/promises");
|
|
262
|
+
var import_node_path3 = require("node:path");
|
|
263
263
|
var import_node_string_decoder = require("node:string_decoder");
|
|
264
264
|
var import_node_util = require("node:util");
|
|
265
265
|
|
|
@@ -302,12 +302,462 @@ function rethrowFilesystemError(error, operation, logicalPath) {
|
|
|
302
302
|
);
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
+
// plugins/filesystem/source/directory-sample.ts
|
|
306
|
+
var import_node_fs = require("node:fs");
|
|
307
|
+
var import_promises = require("node:fs/promises");
|
|
308
|
+
var import_node_path2 = require("node:path");
|
|
309
|
+
|
|
310
|
+
// src/shared/directory-authority/bootstrap.ts
|
|
311
|
+
function directoryAuthorityBootstrap(mode, messageLimit, task) {
|
|
312
|
+
const fs = require("node:fs");
|
|
313
|
+
function fail2(code, message) {
|
|
314
|
+
throw Object.assign(new Error(message), { code });
|
|
315
|
+
}
|
|
316
|
+
function verifyDirectoryAuthority() {
|
|
317
|
+
const expected = fs.fstatSync(3, { bigint: true });
|
|
318
|
+
const actual = fs.statSync(".", { bigint: true });
|
|
319
|
+
const matchesHeldDirectory = expected.isDirectory() && actual.isDirectory() && expected.dev === actual.dev && expected.ino === actual.ino;
|
|
320
|
+
if (matchesHeldDirectory) return;
|
|
321
|
+
fail2(
|
|
322
|
+
"directory_authority_changed",
|
|
323
|
+
"The directory changed before the operation could establish its authority."
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
function readRequest() {
|
|
327
|
+
const fd = mode === "task" ? 0 : 4;
|
|
328
|
+
const chunk = Buffer.alloc(64 * 1024);
|
|
329
|
+
const chunks = [];
|
|
330
|
+
let total = 0;
|
|
331
|
+
for (; ; ) {
|
|
332
|
+
const length = fs.readSync(fd, chunk, 0, chunk.length, null);
|
|
333
|
+
if (length === 0) break;
|
|
334
|
+
total += length;
|
|
335
|
+
if (total > messageLimit) {
|
|
336
|
+
fail2(
|
|
337
|
+
"directory_authority_request_too_large",
|
|
338
|
+
"The directory operation input exceeds the bridge byte limit."
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
chunks.push(Buffer.from(chunk.subarray(0, length)));
|
|
342
|
+
}
|
|
343
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
344
|
+
}
|
|
345
|
+
function reportFailure(error) {
|
|
346
|
+
const detail = error;
|
|
347
|
+
const code = typeof detail?.code === "string" ? detail.code.slice(0, 256) : "directory_authority_failed";
|
|
348
|
+
const message = typeof detail?.message === "string" ? detail.message.slice(0, 4096) : "The directory operation failed.";
|
|
349
|
+
let encoded;
|
|
350
|
+
try {
|
|
351
|
+
encoded = JSON.stringify({
|
|
352
|
+
ok: false,
|
|
353
|
+
error: { code, message, data: detail?.data }
|
|
354
|
+
});
|
|
355
|
+
if (Buffer.byteLength(encoded) > messageLimit) throw new Error();
|
|
356
|
+
} catch {
|
|
357
|
+
encoded = JSON.stringify({ ok: false, error: { code, message } });
|
|
358
|
+
}
|
|
359
|
+
writeResponse(mode === "task" ? 1 : 2, encoded);
|
|
360
|
+
process.exitCode = mode === "task" ? 0 : 125;
|
|
361
|
+
}
|
|
362
|
+
function writeResponse(fd, encoded) {
|
|
363
|
+
const bytes = Buffer.from(encoded);
|
|
364
|
+
let offset = 0;
|
|
365
|
+
while (offset < bytes.length) {
|
|
366
|
+
offset += fs.writeSync(fd, bytes, offset, bytes.length - offset);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async function runTask(input) {
|
|
370
|
+
if (!task)
|
|
371
|
+
fail2("directory_authority_failed", "The directory task is missing.");
|
|
372
|
+
const result = await task(input);
|
|
373
|
+
const encoded = JSON.stringify({ ok: true, result });
|
|
374
|
+
if (Buffer.byteLength(encoded) > messageLimit) {
|
|
375
|
+
fail2(
|
|
376
|
+
"directory_authority_result_too_large",
|
|
377
|
+
"The directory operation result exceeds the bridge byte limit."
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
writeResponse(1, encoded);
|
|
381
|
+
}
|
|
382
|
+
function runCommand(input) {
|
|
383
|
+
const { spawn: spawn2 } = require("node:child_process");
|
|
384
|
+
const command = input;
|
|
385
|
+
const child = spawn2(command.command, command.args, {
|
|
386
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
387
|
+
env: process.env
|
|
388
|
+
});
|
|
389
|
+
child.once("error", reportFailure);
|
|
390
|
+
child.once("exit", (code, signal) => {
|
|
391
|
+
if (signal) {
|
|
392
|
+
process.kill(process.pid, signal);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (typeof code === "number") process.exitCode = code;
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
try {
|
|
399
|
+
verifyDirectoryAuthority();
|
|
400
|
+
const input = readRequest();
|
|
401
|
+
if (mode === "command") {
|
|
402
|
+
runCommand(input);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
void runTask(input).catch(reportFailure);
|
|
406
|
+
} catch (error) {
|
|
407
|
+
reportFailure(error);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function directoryAuthorityScript(mode, messageLimit, task) {
|
|
411
|
+
const taskSource = task ? `(${task.toString()})` : "undefined";
|
|
412
|
+
const preserveFunctionName = "const __name=(target,value)=>Object.defineProperty(target,'name',{value,configurable:true});";
|
|
413
|
+
return `${preserveFunctionName}(${directoryAuthorityBootstrap.toString()})(${JSON.stringify(mode)},${messageLimit},${taskSource});`;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// src/shared/directory-authority/protocol.ts
|
|
417
|
+
var import_node_path = require("node:path");
|
|
418
|
+
|
|
419
|
+
// src/shared/directory-authority/errors.ts
|
|
420
|
+
var DirectoryAuthorityError = class extends Error {
|
|
421
|
+
constructor(code, message, data) {
|
|
422
|
+
super(message);
|
|
423
|
+
this.code = code;
|
|
424
|
+
this.data = data;
|
|
425
|
+
this.name = "DirectoryAuthorityError";
|
|
426
|
+
}
|
|
427
|
+
code;
|
|
428
|
+
data;
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
// src/shared/directory-authority/protocol.ts
|
|
432
|
+
var AUTHORITY_MESSAGE_LIMIT = 8 * 1024 * 1024;
|
|
433
|
+
var AUTHORITY_STDERR_LIMIT = 16 * 1024;
|
|
434
|
+
var AUTHORITY_TASK_TIMEOUT_MS = 3e4;
|
|
435
|
+
function assertDirectoryAuthorityLocation(location) {
|
|
436
|
+
if (!(0, import_node_path.isAbsolute)(location.directoryPath)) {
|
|
437
|
+
throw new DirectoryAuthorityError(
|
|
438
|
+
"directory_authority_invalid_path",
|
|
439
|
+
"The directory authority requires an absolute starting path."
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
const hasOpenDescriptorNumber = Number.isInteger(location.directoryFd) && location.directoryFd >= 0;
|
|
443
|
+
if (hasOpenDescriptorNumber) return;
|
|
444
|
+
throw new DirectoryAuthorityError(
|
|
445
|
+
"directory_authority_invalid_fd",
|
|
446
|
+
"The directory authority requires an open directory descriptor."
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
function authorityEnvironment(environment = process.env) {
|
|
450
|
+
const sanitized = { ...environment };
|
|
451
|
+
delete sanitized.NODE_OPTIONS;
|
|
452
|
+
delete sanitized.NODE_PATH;
|
|
453
|
+
return sanitized;
|
|
454
|
+
}
|
|
455
|
+
function encodeAuthorityRequest(input) {
|
|
456
|
+
let encoded;
|
|
457
|
+
try {
|
|
458
|
+
encoded = JSON.stringify(input);
|
|
459
|
+
} catch {
|
|
460
|
+
throw new DirectoryAuthorityError(
|
|
461
|
+
"directory_authority_invalid_request",
|
|
462
|
+
"The directory operation input must be JSON serializable."
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
if (encoded === void 0) {
|
|
466
|
+
throw new DirectoryAuthorityError(
|
|
467
|
+
"directory_authority_invalid_request",
|
|
468
|
+
"The directory operation input must be JSON serializable."
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
if (Buffer.byteLength(encoded) <= AUTHORITY_MESSAGE_LIMIT) return encoded;
|
|
472
|
+
throw new DirectoryAuthorityError(
|
|
473
|
+
"directory_authority_request_too_large",
|
|
474
|
+
"The directory operation input exceeds the bridge byte limit."
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
function isAuthorityMessageObject(value) {
|
|
478
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
479
|
+
}
|
|
480
|
+
function decodeAuthorityResult(output) {
|
|
481
|
+
let message;
|
|
482
|
+
try {
|
|
483
|
+
message = JSON.parse(output);
|
|
484
|
+
} catch {
|
|
485
|
+
throw new DirectoryAuthorityError(
|
|
486
|
+
"directory_authority_protocol_error",
|
|
487
|
+
"The directory operation returned an invalid response."
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
if (!isAuthorityMessageObject(message)) {
|
|
491
|
+
throw new DirectoryAuthorityError(
|
|
492
|
+
"directory_authority_protocol_error",
|
|
493
|
+
"The directory operation returned an invalid response."
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
if (message.ok === true) return message.result;
|
|
497
|
+
const hasAuthorityError = message.ok === false && isAuthorityMessageObject(message.error);
|
|
498
|
+
if (!hasAuthorityError) {
|
|
499
|
+
throw new DirectoryAuthorityError(
|
|
500
|
+
"directory_authority_protocol_error",
|
|
501
|
+
"The directory operation returned an invalid response."
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
const {
|
|
505
|
+
code,
|
|
506
|
+
message: explanation,
|
|
507
|
+
data
|
|
508
|
+
} = message.error;
|
|
509
|
+
const hasErrorDescription = typeof code === "string" && typeof explanation === "string";
|
|
510
|
+
if (!hasErrorDescription) {
|
|
511
|
+
throw new DirectoryAuthorityError(
|
|
512
|
+
"directory_authority_protocol_error",
|
|
513
|
+
"The directory operation returned an invalid error response."
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
throw new DirectoryAuthorityError(
|
|
517
|
+
code,
|
|
518
|
+
explanation,
|
|
519
|
+
isAuthorityMessageObject(data) ? data : void 0
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// src/shared/directory-authority/task.ts
|
|
524
|
+
var import_node_child_process = require("node:child_process");
|
|
525
|
+
async function runDirectoryAuthorityTask(input) {
|
|
526
|
+
assertDirectoryAuthorityLocation(input);
|
|
527
|
+
const request = encodeAuthorityRequest(input.input);
|
|
528
|
+
const timeoutMs = input.timeoutMs ?? AUTHORITY_TASK_TIMEOUT_MS;
|
|
529
|
+
const hasPositiveDeadline = Number.isFinite(timeoutMs) && timeoutMs > 0;
|
|
530
|
+
if (!hasPositiveDeadline) {
|
|
531
|
+
throw new DirectoryAuthorityError(
|
|
532
|
+
"directory_authority_invalid_timeout",
|
|
533
|
+
"The directory operation deadline must be a positive finite duration."
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
if (input.signal?.aborted) {
|
|
537
|
+
throw new DirectoryAuthorityError(
|
|
538
|
+
"directory_authority_aborted",
|
|
539
|
+
"The directory operation was cancelled before it started."
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
const child = (0, import_node_child_process.spawn)(
|
|
543
|
+
process.execPath,
|
|
544
|
+
[
|
|
545
|
+
"--input-type=commonjs",
|
|
546
|
+
"-e",
|
|
547
|
+
directoryAuthorityScript("task", AUTHORITY_MESSAGE_LIMIT, input.task)
|
|
548
|
+
],
|
|
549
|
+
{
|
|
550
|
+
cwd: input.directoryPath,
|
|
551
|
+
env: authorityEnvironment(),
|
|
552
|
+
detached: true,
|
|
553
|
+
windowsHide: true,
|
|
554
|
+
stdio: ["pipe", "pipe", "pipe", input.directoryFd]
|
|
555
|
+
}
|
|
556
|
+
);
|
|
557
|
+
return new Promise((resolve, reject) => {
|
|
558
|
+
const chunks = [];
|
|
559
|
+
const stderrChunks = [];
|
|
560
|
+
let bytes = 0;
|
|
561
|
+
let stderrBytes = 0;
|
|
562
|
+
let failure;
|
|
563
|
+
const stop = (error) => {
|
|
564
|
+
if (failure) return;
|
|
565
|
+
failure = error;
|
|
566
|
+
if (typeof child.pid === "number") {
|
|
567
|
+
try {
|
|
568
|
+
process.kill(-child.pid, "SIGKILL");
|
|
569
|
+
return;
|
|
570
|
+
} catch {
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
child.kill("SIGKILL");
|
|
574
|
+
};
|
|
575
|
+
const onAbort = () => stop(
|
|
576
|
+
new DirectoryAuthorityError(
|
|
577
|
+
"directory_authority_aborted",
|
|
578
|
+
"The directory operation was cancelled."
|
|
579
|
+
)
|
|
580
|
+
);
|
|
581
|
+
const timer = setTimeout(
|
|
582
|
+
() => stop(
|
|
583
|
+
new DirectoryAuthorityError(
|
|
584
|
+
"directory_authority_timeout",
|
|
585
|
+
"The directory operation exceeded its deadline."
|
|
586
|
+
)
|
|
587
|
+
),
|
|
588
|
+
timeoutMs
|
|
589
|
+
);
|
|
590
|
+
timer.unref();
|
|
591
|
+
input.signal?.addEventListener("abort", onAbort, { once: true });
|
|
592
|
+
if (input.signal?.aborted) onAbort();
|
|
593
|
+
child.stdout.on("data", (chunk) => {
|
|
594
|
+
bytes += chunk.length;
|
|
595
|
+
if (bytes > AUTHORITY_MESSAGE_LIMIT) {
|
|
596
|
+
stop(
|
|
597
|
+
new DirectoryAuthorityError(
|
|
598
|
+
"directory_authority_result_too_large",
|
|
599
|
+
"The directory operation result exceeds the bridge byte limit."
|
|
600
|
+
)
|
|
601
|
+
);
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
chunks.push(chunk);
|
|
605
|
+
});
|
|
606
|
+
child.stderr.on("data", (chunk) => {
|
|
607
|
+
const remaining = Math.max(AUTHORITY_STDERR_LIMIT - stderrBytes, 0);
|
|
608
|
+
if (remaining === 0) return;
|
|
609
|
+
stderrChunks.push(chunk.subarray(0, remaining));
|
|
610
|
+
stderrBytes += Math.min(chunk.length, remaining);
|
|
611
|
+
});
|
|
612
|
+
child.stdin.on("error", () => void 0);
|
|
613
|
+
child.once("error", (error) => {
|
|
614
|
+
failure ??= new DirectoryAuthorityError(
|
|
615
|
+
"directory_authority_unavailable",
|
|
616
|
+
`The directory operation could not start: ${error.message}`
|
|
617
|
+
);
|
|
618
|
+
});
|
|
619
|
+
child.once("close", (code, signal) => {
|
|
620
|
+
clearTimeout(timer);
|
|
621
|
+
input.signal?.removeEventListener("abort", onAbort);
|
|
622
|
+
if (failure) {
|
|
623
|
+
reject(failure);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
if (code !== 0) {
|
|
627
|
+
reject(
|
|
628
|
+
new DirectoryAuthorityError(
|
|
629
|
+
"directory_authority_failed",
|
|
630
|
+
"The directory operation process did not complete successfully.",
|
|
631
|
+
{
|
|
632
|
+
exitCode: code,
|
|
633
|
+
signal,
|
|
634
|
+
stderr: Buffer.concat(stderrChunks).toString("utf8")
|
|
635
|
+
}
|
|
636
|
+
)
|
|
637
|
+
);
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
try {
|
|
641
|
+
resolve(
|
|
642
|
+
decodeAuthorityResult(Buffer.concat(chunks).toString("utf8"))
|
|
643
|
+
);
|
|
644
|
+
} catch (error) {
|
|
645
|
+
reject(error);
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
child.stdin.end(request);
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// plugins/filesystem/source/directory-sample-task.ts
|
|
653
|
+
async function sampleDirectoryTask(input) {
|
|
654
|
+
const { opendir: opendir2 } = require("node:fs/promises");
|
|
655
|
+
const entries = [];
|
|
656
|
+
const directory = await opendir2(".");
|
|
657
|
+
for await (const entry of directory) {
|
|
658
|
+
if (entries.length >= input.maxEntries) {
|
|
659
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
660
|
+
return { entries, truncated: true };
|
|
661
|
+
}
|
|
662
|
+
entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
663
|
+
}
|
|
664
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
665
|
+
return { entries, truncated: false };
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// plugins/filesystem/source/directory-sample.ts
|
|
669
|
+
var DIRECTORY_ENTRY_LIMIT = 160;
|
|
670
|
+
async function readDirectorySample(target) {
|
|
671
|
+
const entries = [];
|
|
672
|
+
let handle;
|
|
673
|
+
try {
|
|
674
|
+
if (typeof import_node_fs.constants.O_DIRECTORY !== "number" || typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
|
|
675
|
+
fail(
|
|
676
|
+
"filesystem_safe_io_unsupported",
|
|
677
|
+
"This platform does not provide the no-follow directory operation required for a safe read."
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
handle = await (0, import_promises.open)(
|
|
681
|
+
target.absolutePath,
|
|
682
|
+
import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_DIRECTORY | import_node_fs.constants.O_NOFOLLOW
|
|
683
|
+
);
|
|
684
|
+
const before = await handle.stat({ bigint: true });
|
|
685
|
+
if (!before.isDirectory()) {
|
|
686
|
+
fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
|
|
687
|
+
}
|
|
688
|
+
const [canonicalRoot, canonicalTarget] = await Promise.all([
|
|
689
|
+
(0, import_promises.realpath)(target.rootPath),
|
|
690
|
+
(0, import_promises.realpath)(target.absolutePath)
|
|
691
|
+
]);
|
|
692
|
+
const rootRelative = (0, import_node_path2.relative)(canonicalRoot, canonicalTarget);
|
|
693
|
+
if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path2.sep}`) || rootRelative.startsWith(import_node_path2.sep)) {
|
|
694
|
+
fail(
|
|
695
|
+
"filesystem_path_changed",
|
|
696
|
+
`Directory changed outside its configured root: ${target.logicalPath}`
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
|
|
700
|
+
if (!pathIdentity.isDirectory() || pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino) {
|
|
701
|
+
fail(
|
|
702
|
+
"filesystem_path_changed",
|
|
703
|
+
`Directory changed while it was being opened: ${target.logicalPath}`
|
|
704
|
+
);
|
|
705
|
+
}
|
|
706
|
+
if (requiresIsolatedDirectorySample()) {
|
|
707
|
+
const sample = await runDirectoryAuthorityTask({
|
|
708
|
+
directoryPath: target.absolutePath,
|
|
709
|
+
directoryFd: handle.fd,
|
|
710
|
+
input: { maxEntries: DIRECTORY_ENTRY_LIMIT },
|
|
711
|
+
task: sampleDirectoryTask
|
|
712
|
+
});
|
|
713
|
+
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
714
|
+
return sample;
|
|
715
|
+
}
|
|
716
|
+
const directory = await (0, import_promises.opendir)(`/proc/self/fd/${handle.fd}`);
|
|
717
|
+
for await (const entry of directory) {
|
|
718
|
+
if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
|
|
719
|
+
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
720
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
721
|
+
return Object.freeze({
|
|
722
|
+
entries: Object.freeze(entries),
|
|
723
|
+
truncated: true
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
727
|
+
}
|
|
728
|
+
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
729
|
+
entries.sort((left, right) => left.localeCompare(right));
|
|
730
|
+
return Object.freeze({ entries: Object.freeze(entries), truncated: false });
|
|
731
|
+
} catch (error) {
|
|
732
|
+
if (error instanceof DirectoryAuthorityError && error.code.startsWith("directory_authority_")) {
|
|
733
|
+
fail(
|
|
734
|
+
"filesystem_path_changed",
|
|
735
|
+
`Directory authority was lost: ${target.logicalPath}`
|
|
736
|
+
);
|
|
737
|
+
}
|
|
738
|
+
return rethrowFilesystemError(error, "inspect", target.logicalPath);
|
|
739
|
+
} finally {
|
|
740
|
+
await handle?.close().catch(() => void 0);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
async function assertDirectoryStable(handle, before, logicalPath) {
|
|
744
|
+
const after = await handle.stat({ bigint: true });
|
|
745
|
+
if (!after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
|
|
746
|
+
fail(
|
|
747
|
+
"filesystem_read_changed",
|
|
748
|
+
`Directory changed while it was being read: ${logicalPath}`
|
|
749
|
+
);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
function requiresIsolatedDirectorySample() {
|
|
753
|
+
return process.platform === "darwin";
|
|
754
|
+
}
|
|
755
|
+
|
|
305
756
|
// plugins/filesystem/source/bounded-io.ts
|
|
306
757
|
var MAX_MUTATION_BYTES = 1048576;
|
|
307
758
|
var READ_HEAD_BYTES = 24576;
|
|
308
759
|
var READ_TAIL_BYTES = 12288;
|
|
309
760
|
var DEV_SCAN_BYTES = 1048576;
|
|
310
|
-
var DIRECTORY_ENTRY_LIMIT = 160;
|
|
311
761
|
async function readExactBytes(reader, buffer, position, logicalPath) {
|
|
312
762
|
let offset = 0;
|
|
313
763
|
while (offset < buffer.length) {
|
|
@@ -349,15 +799,15 @@ function decodeMutationText(buffer, logicalPath) {
|
|
|
349
799
|
async function openRegularFile(target) {
|
|
350
800
|
let handle;
|
|
351
801
|
try {
|
|
352
|
-
if (typeof
|
|
802
|
+
if (typeof import_node_fs2.constants.O_NOFOLLOW !== "number") {
|
|
353
803
|
fail(
|
|
354
804
|
"filesystem_safe_io_unsupported",
|
|
355
805
|
"This platform does not provide the no-follow operation required for a safe read."
|
|
356
806
|
);
|
|
357
807
|
}
|
|
358
|
-
handle = await (0,
|
|
808
|
+
handle = await (0, import_promises2.open)(
|
|
359
809
|
target.absolutePath,
|
|
360
|
-
|
|
810
|
+
import_node_fs2.constants.O_RDONLY | import_node_fs2.constants.O_NOFOLLOW
|
|
361
811
|
);
|
|
362
812
|
const info = await handle.stat({ bigint: true });
|
|
363
813
|
if (!info.isFile()) {
|
|
@@ -365,17 +815,17 @@ async function openRegularFile(target) {
|
|
|
365
815
|
}
|
|
366
816
|
const metadata = metadataFromStat(info, target.logicalPath);
|
|
367
817
|
const [canonicalRoot, canonicalTarget] = await Promise.all([
|
|
368
|
-
(0,
|
|
369
|
-
(0,
|
|
818
|
+
(0, import_promises2.realpath)(target.rootPath),
|
|
819
|
+
(0, import_promises2.realpath)(target.absolutePath)
|
|
370
820
|
]);
|
|
371
|
-
const rootRelative = (0,
|
|
372
|
-
if (rootRelative === ".." || rootRelative.startsWith(`..${
|
|
821
|
+
const rootRelative = (0, import_node_path3.relative)(canonicalRoot, canonicalTarget);
|
|
822
|
+
if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path3.sep}`) || rootRelative.startsWith(import_node_path3.sep)) {
|
|
373
823
|
fail(
|
|
374
824
|
"filesystem_path_changed",
|
|
375
825
|
`File changed outside its configured root: ${target.logicalPath}`
|
|
376
826
|
);
|
|
377
827
|
}
|
|
378
|
-
const pathIdentity = await (0,
|
|
828
|
+
const pathIdentity = await (0, import_promises2.stat)(canonicalTarget, { bigint: true });
|
|
379
829
|
if (!pathIdentity.isFile() || pathIdentity.dev !== info.dev || pathIdentity.ino !== info.ino) {
|
|
380
830
|
fail(
|
|
381
831
|
"filesystem_path_changed",
|
|
@@ -546,72 +996,6 @@ function assertMutationContentSize(content) {
|
|
|
546
996
|
}
|
|
547
997
|
return byteCount;
|
|
548
998
|
}
|
|
549
|
-
async function readDirectorySample(target) {
|
|
550
|
-
const entries = [];
|
|
551
|
-
let handle;
|
|
552
|
-
try {
|
|
553
|
-
if (typeof import_node_fs.constants.O_DIRECTORY !== "number" || typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
|
|
554
|
-
fail(
|
|
555
|
-
"filesystem_safe_io_unsupported",
|
|
556
|
-
"This platform does not provide the no-follow directory operation required for a safe read."
|
|
557
|
-
);
|
|
558
|
-
}
|
|
559
|
-
handle = await (0, import_promises.open)(
|
|
560
|
-
target.absolutePath,
|
|
561
|
-
import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_DIRECTORY | import_node_fs.constants.O_NOFOLLOW
|
|
562
|
-
);
|
|
563
|
-
const before = await handle.stat({ bigint: true });
|
|
564
|
-
if (!before.isDirectory()) {
|
|
565
|
-
fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
|
|
566
|
-
}
|
|
567
|
-
const [canonicalRoot, canonicalTarget] = await Promise.all([
|
|
568
|
-
(0, import_promises.realpath)(target.rootPath),
|
|
569
|
-
(0, import_promises.realpath)(target.absolutePath)
|
|
570
|
-
]);
|
|
571
|
-
const rootRelative = (0, import_node_path.relative)(canonicalRoot, canonicalTarget);
|
|
572
|
-
if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path.sep}`) || rootRelative.startsWith(import_node_path.sep)) {
|
|
573
|
-
fail(
|
|
574
|
-
"filesystem_path_changed",
|
|
575
|
-
`Directory changed outside its configured root: ${target.logicalPath}`
|
|
576
|
-
);
|
|
577
|
-
}
|
|
578
|
-
const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
|
|
579
|
-
if (!pathIdentity.isDirectory() || pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino) {
|
|
580
|
-
fail(
|
|
581
|
-
"filesystem_path_changed",
|
|
582
|
-
`Directory changed while it was being opened: ${target.logicalPath}`
|
|
583
|
-
);
|
|
584
|
-
}
|
|
585
|
-
const directory = await (0, import_promises.opendir)(`/proc/self/fd/${handle.fd}`);
|
|
586
|
-
for await (const entry of directory) {
|
|
587
|
-
if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
|
|
588
|
-
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
589
|
-
entries.sort((left, right) => left.localeCompare(right));
|
|
590
|
-
return Object.freeze({
|
|
591
|
-
entries: Object.freeze(entries),
|
|
592
|
-
truncated: true
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
596
|
-
}
|
|
597
|
-
await assertDirectoryStable(handle, before, target.logicalPath);
|
|
598
|
-
entries.sort((left, right) => left.localeCompare(right));
|
|
599
|
-
return Object.freeze({ entries: Object.freeze(entries), truncated: false });
|
|
600
|
-
} catch (error) {
|
|
601
|
-
return rethrowFilesystemError(error, "inspect", target.logicalPath);
|
|
602
|
-
} finally {
|
|
603
|
-
await handle?.close().catch(() => void 0);
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
async function assertDirectoryStable(handle, before, logicalPath) {
|
|
607
|
-
const after = await handle.stat({ bigint: true });
|
|
608
|
-
if (!after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
|
|
609
|
-
fail(
|
|
610
|
-
"filesystem_read_changed",
|
|
611
|
-
`Directory changed while it was being read: ${logicalPath}`
|
|
612
|
-
);
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
999
|
function rejectBinary(buffer, logicalPath) {
|
|
616
1000
|
if (buffer.includes(0)) {
|
|
617
1001
|
fail(
|
|
@@ -659,6 +1043,107 @@ function failTargetChanged(logicalPath, expectedState, observedState) {
|
|
|
659
1043
|
);
|
|
660
1044
|
}
|
|
661
1045
|
|
|
1046
|
+
// plugins/filesystem/source/view-locator.ts
|
|
1047
|
+
var LOCATOR_CANDIDATE_LIMIT = 8;
|
|
1048
|
+
function selectViewLocatorWindow(input) {
|
|
1049
|
+
const offsets = collectLocatorOffsets(input.source.text, input.locator);
|
|
1050
|
+
const first = offsets[0];
|
|
1051
|
+
if (first === void 0) return null;
|
|
1052
|
+
if (hasAmbiguousLocatorMatches(offsets)) {
|
|
1053
|
+
rejectAmbiguousLocator(input, offsets);
|
|
1054
|
+
}
|
|
1055
|
+
const candidate = createLocatorCandidate(input, first);
|
|
1056
|
+
return {
|
|
1057
|
+
startLine: candidate.nextControls.start_line,
|
|
1058
|
+
endLine: candidate.nextControls.end_line,
|
|
1059
|
+
rangeTruncated: candidate.rangeTruncated
|
|
1060
|
+
};
|
|
1061
|
+
}
|
|
1062
|
+
function collectLocatorOffsets(text, locator) {
|
|
1063
|
+
const offsets = [];
|
|
1064
|
+
let start = 0;
|
|
1065
|
+
for (let count = 0; count <= LOCATOR_CANDIDATE_LIMIT; count += 1) {
|
|
1066
|
+
const offset = text.indexOf(locator, start);
|
|
1067
|
+
if (offset < 0) break;
|
|
1068
|
+
offsets.push(offset);
|
|
1069
|
+
start = offset + 1;
|
|
1070
|
+
}
|
|
1071
|
+
return offsets;
|
|
1072
|
+
}
|
|
1073
|
+
function hasAmbiguousLocatorMatches(offsets) {
|
|
1074
|
+
return offsets.length > 1;
|
|
1075
|
+
}
|
|
1076
|
+
function createLocatorCandidate(input, offset) {
|
|
1077
|
+
const matchStartLine = lineAtOffset(input.source.text, offset);
|
|
1078
|
+
const matchEndLine = lineAtOffset(
|
|
1079
|
+
input.source.text,
|
|
1080
|
+
offset + Math.max(input.locator.length - 1, 0)
|
|
1081
|
+
);
|
|
1082
|
+
const startLine = Math.max(1, matchStartLine - input.contextLines);
|
|
1083
|
+
const requestedEndLine = Math.min(
|
|
1084
|
+
input.lineCount,
|
|
1085
|
+
matchEndLine + input.contextLines
|
|
1086
|
+
);
|
|
1087
|
+
const endLine = Math.min(
|
|
1088
|
+
requestedEndLine,
|
|
1089
|
+
startLine + input.maxWindowLines - 1
|
|
1090
|
+
);
|
|
1091
|
+
return {
|
|
1092
|
+
matchStartLine,
|
|
1093
|
+
matchEndLine,
|
|
1094
|
+
rangeTruncated: requestedEndLine > endLine,
|
|
1095
|
+
nextControls: {
|
|
1096
|
+
path: input.path,
|
|
1097
|
+
start_line: startLine,
|
|
1098
|
+
end_line: endLine
|
|
1099
|
+
}
|
|
1100
|
+
};
|
|
1101
|
+
}
|
|
1102
|
+
function rejectAmbiguousLocator(input, offsets) {
|
|
1103
|
+
const candidates = offsets.slice(0, LOCATOR_CANDIDATE_LIMIT).map((offset) => createLocatorCandidate(input, offset));
|
|
1104
|
+
const candidatesTruncated = offsets.length > LOCATOR_CANDIDATE_LIMIT;
|
|
1105
|
+
const truncation = {
|
|
1106
|
+
candidateLimit: LOCATOR_CANDIDATE_LIMIT,
|
|
1107
|
+
candidatesTruncated,
|
|
1108
|
+
scanTruncated: input.source.truncated,
|
|
1109
|
+
omittedBytes: input.source.omittedBytes
|
|
1110
|
+
};
|
|
1111
|
+
fail(
|
|
1112
|
+
"ambiguous_text_locator",
|
|
1113
|
+
[
|
|
1114
|
+
"Locator matched multiple locations; no file window was selected.",
|
|
1115
|
+
"Choose a unique literal locator or select one candidate's numeric controls with locator omitted.",
|
|
1116
|
+
`Path: ${input.path}`,
|
|
1117
|
+
...candidates.map(
|
|
1118
|
+
({ matchStartLine, matchEndLine, nextControls }) => `Match lines ${matchStartLine}-${matchEndLine}: start_line=${nextControls.start_line}, end_line=${nextControls.end_line}`
|
|
1119
|
+
),
|
|
1120
|
+
`Candidate list truncated: ${candidatesTruncated}`,
|
|
1121
|
+
`Scan truncated: ${input.source.truncated}; bytes scanned: ${input.source.bytesRead}/${input.source.byteCount}`
|
|
1122
|
+
].join("\n"),
|
|
1123
|
+
{
|
|
1124
|
+
path: input.path,
|
|
1125
|
+
candidates,
|
|
1126
|
+
observedMatchCountLowerBound: offsets.length,
|
|
1127
|
+
truncation,
|
|
1128
|
+
eventMeta: {
|
|
1129
|
+
path: input.path,
|
|
1130
|
+
mode: "file",
|
|
1131
|
+
locatorAmbiguous: true,
|
|
1132
|
+
candidateCount: candidates.length,
|
|
1133
|
+
candidatesTruncated,
|
|
1134
|
+
scanTruncated: input.source.truncated
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
);
|
|
1138
|
+
}
|
|
1139
|
+
function lineAtOffset(content, offset) {
|
|
1140
|
+
let line = 1;
|
|
1141
|
+
for (let index = 0; index < offset; index += 1) {
|
|
1142
|
+
if (content.charCodeAt(index) === 10) line += 1;
|
|
1143
|
+
}
|
|
1144
|
+
return line;
|
|
1145
|
+
}
|
|
1146
|
+
|
|
662
1147
|
// plugins/filesystem/source/view-window.ts
|
|
663
1148
|
var MAX_VIEW_LINES = 240;
|
|
664
1149
|
var DEFAULT_CONTEXT_LINES = 8;
|
|
@@ -670,21 +1155,14 @@ function selectWindow(input) {
|
|
|
670
1155
|
let startLine = input.startLine ?? 1;
|
|
671
1156
|
let endLine = input.endLine ?? (input.startLine ? input.startLine + MAX_VIEW_LINES - 1 : MAX_VIEW_LINES);
|
|
672
1157
|
if (input.locator) {
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
}
|
|
681
|
-
const locatorStart = lineAtOffset(input.text, first);
|
|
682
|
-
const locatorEnd = lineAtOffset(
|
|
683
|
-
input.text,
|
|
684
|
-
first + Math.max(input.locator.length - 1, 0)
|
|
685
|
-
);
|
|
686
|
-
startLine = Math.max(1, locatorStart - input.contextLines);
|
|
687
|
-
endLine = Math.min(input.lines.length, locatorEnd + input.contextLines);
|
|
1158
|
+
return selectViewLocatorWindow({
|
|
1159
|
+
path: input.path,
|
|
1160
|
+
source: input.source,
|
|
1161
|
+
lineCount: input.lines.length,
|
|
1162
|
+
locator: input.locator,
|
|
1163
|
+
contextLines: input.contextLines,
|
|
1164
|
+
maxWindowLines: MAX_VIEW_LINES
|
|
1165
|
+
});
|
|
688
1166
|
}
|
|
689
1167
|
if (endLine < startLine) [startLine, endLine] = [endLine, startLine];
|
|
690
1168
|
const rangeTruncated = endLine - startLine + 1 > MAX_VIEW_LINES;
|
|
@@ -709,13 +1187,6 @@ function parseTrailingRange(value) {
|
|
|
709
1187
|
endLine: Number.parseInt(match[3] ?? match[2], 10)
|
|
710
1188
|
});
|
|
711
1189
|
}
|
|
712
|
-
function lineAtOffset(content, offset) {
|
|
713
|
-
let line = 1;
|
|
714
|
-
for (let index = 0; index < offset; index += 1) {
|
|
715
|
-
if (content.charCodeAt(index) === 10) line += 1;
|
|
716
|
-
}
|
|
717
|
-
return line;
|
|
718
|
-
}
|
|
719
1190
|
|
|
720
1191
|
// plugins/filesystem/source/dev-view.ts
|
|
721
1192
|
function createDevViewHandler(paths) {
|
|
@@ -725,7 +1196,7 @@ function createDevViewHandler(paths) {
|
|
|
725
1196
|
const target = paths.resolve(pathRange.path, context);
|
|
726
1197
|
let info;
|
|
727
1198
|
try {
|
|
728
|
-
info = await (0,
|
|
1199
|
+
info = await (0, import_promises3.stat)(target.absolutePath);
|
|
729
1200
|
} catch (error) {
|
|
730
1201
|
rethrowFilesystemError(error, "inspect", target.logicalPath);
|
|
731
1202
|
}
|
|
@@ -818,7 +1289,8 @@ async function viewFile(input) {
|
|
|
818
1289
|
const lines = completeScannedLines(source.text, source.truncated);
|
|
819
1290
|
const availableLineCount = Math.max(lines.length, 1);
|
|
820
1291
|
const selection = selectWindow({
|
|
821
|
-
|
|
1292
|
+
path: input.target.logicalPath,
|
|
1293
|
+
source,
|
|
822
1294
|
lines,
|
|
823
1295
|
startLine: input.startLine,
|
|
824
1296
|
endLine: input.endLine,
|
|
@@ -924,22 +1396,22 @@ async function viewFile(input) {
|
|
|
924
1396
|
|
|
925
1397
|
// plugins/filesystem/source/atomic-write.ts
|
|
926
1398
|
var import_node_crypto2 = require("node:crypto");
|
|
927
|
-
var
|
|
928
|
-
var
|
|
1399
|
+
var import_promises5 = require("node:fs/promises");
|
|
1400
|
+
var import_node_path5 = require("node:path");
|
|
929
1401
|
|
|
930
1402
|
// plugins/filesystem/source/mutation-parent.ts
|
|
931
|
-
var
|
|
932
|
-
var
|
|
933
|
-
var
|
|
1403
|
+
var import_node_fs3 = require("node:fs");
|
|
1404
|
+
var import_promises4 = require("node:fs/promises");
|
|
1405
|
+
var import_node_path4 = require("node:path");
|
|
934
1406
|
function isWithinRoot(target, root) {
|
|
935
|
-
const rel = (0,
|
|
936
|
-
return rel === "" || rel !== ".." && !rel.startsWith(`..${
|
|
1407
|
+
const rel = (0, import_node_path4.relative)(root, target);
|
|
1408
|
+
return rel === "" || rel !== ".." && !rel.startsWith(`..${import_node_path4.sep}`);
|
|
937
1409
|
}
|
|
938
1410
|
function sameIdentity(left, right) {
|
|
939
1411
|
return left.dev === right.dev && left.ino === right.ino;
|
|
940
1412
|
}
|
|
941
1413
|
async function openDirectory(path, rootPath, logicalPath, allowMissing = false) {
|
|
942
|
-
if (typeof
|
|
1414
|
+
if (typeof import_node_fs3.constants.O_DIRECTORY !== "number" || typeof import_node_fs3.constants.O_NOFOLLOW !== "number") {
|
|
943
1415
|
fail(
|
|
944
1416
|
"filesystem_safe_io_unsupported",
|
|
945
1417
|
"This platform does not provide the no-follow directory operations required for a safe write."
|
|
@@ -947,17 +1419,17 @@ async function openDirectory(path, rootPath, logicalPath, allowMissing = false)
|
|
|
947
1419
|
}
|
|
948
1420
|
let handle;
|
|
949
1421
|
try {
|
|
950
|
-
handle = await (0,
|
|
1422
|
+
handle = await (0, import_promises4.open)(
|
|
951
1423
|
path,
|
|
952
|
-
|
|
1424
|
+
import_node_fs3.constants.O_RDONLY | import_node_fs3.constants.O_DIRECTORY | import_node_fs3.constants.O_NOFOLLOW
|
|
953
1425
|
);
|
|
954
1426
|
const opened = await handle.stat({ bigint: true });
|
|
955
1427
|
if (!opened.isDirectory()) {
|
|
956
1428
|
fail("not_a_directory", `Expected a directory: ${logicalPath}`);
|
|
957
1429
|
}
|
|
958
1430
|
const [canonicalRoot, canonicalDirectory] = await Promise.all([
|
|
959
|
-
(0,
|
|
960
|
-
(0,
|
|
1431
|
+
(0, import_promises4.realpath)(rootPath),
|
|
1432
|
+
(0, import_promises4.realpath)(path)
|
|
961
1433
|
]);
|
|
962
1434
|
if (!isWithinRoot(canonicalDirectory, canonicalRoot)) {
|
|
963
1435
|
fail(
|
|
@@ -965,15 +1437,16 @@ async function openDirectory(path, rootPath, logicalPath, allowMissing = false)
|
|
|
965
1437
|
`Directory changed outside its configured root: ${logicalPath}`
|
|
966
1438
|
);
|
|
967
1439
|
}
|
|
968
|
-
const pathIdentity = await (0,
|
|
1440
|
+
const pathIdentity = await (0, import_promises4.stat)(canonicalDirectory, { bigint: true });
|
|
969
1441
|
if (!pathIdentity.isDirectory() || !sameIdentity(opened, pathIdentity)) {
|
|
970
1442
|
fail(
|
|
971
1443
|
"filesystem_path_changed",
|
|
972
1444
|
`Directory changed while it was being opened: ${logicalPath}`
|
|
973
1445
|
);
|
|
974
1446
|
}
|
|
1447
|
+
if (usesIsolatedDirectoryAuthority()) return handle;
|
|
975
1448
|
const procPath = `/proc/self/fd/${handle.fd}`;
|
|
976
|
-
const procIdentity = await (0,
|
|
1449
|
+
const procIdentity = await (0, import_promises4.stat)(procPath, { bigint: true });
|
|
977
1450
|
if (!procIdentity.isDirectory() || !sameIdentity(opened, procIdentity)) {
|
|
978
1451
|
fail(
|
|
979
1452
|
"filesystem_safe_io_unsupported",
|
|
@@ -1000,7 +1473,7 @@ async function openChildDirectory(parent, name, logicalPath) {
|
|
|
1000
1473
|
if (!isNodeErrorCode(error, "ENOENT")) throw error;
|
|
1001
1474
|
}
|
|
1002
1475
|
try {
|
|
1003
|
-
await (0,
|
|
1476
|
+
await (0, import_promises4.mkdir)(anchoredPath);
|
|
1004
1477
|
} catch (error) {
|
|
1005
1478
|
if (!isNodeErrorCode(error, "EEXIST")) {
|
|
1006
1479
|
rethrowFilesystemError(error, "write", logicalPath);
|
|
@@ -1022,35 +1495,253 @@ async function openMutationParent(target) {
|
|
|
1022
1495
|
`Path changed while preparing the write: ${target.logicalPath}`
|
|
1023
1496
|
);
|
|
1024
1497
|
}
|
|
1025
|
-
|
|
1498
|
+
const rootHandle = await openDirectory(
|
|
1026
1499
|
target.rootPath,
|
|
1027
1500
|
target.rootPath,
|
|
1028
1501
|
target.logicalPath
|
|
1029
1502
|
);
|
|
1503
|
+
let current = rootHandle;
|
|
1030
1504
|
try {
|
|
1031
1505
|
for (const segment of segments) {
|
|
1032
|
-
const
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
await current.close();
|
|
1038
|
-
current = next;
|
|
1506
|
+
const previous = current;
|
|
1507
|
+
current = await openChildDirectory(previous, segment, target.logicalPath);
|
|
1508
|
+
if (previous !== rootHandle) {
|
|
1509
|
+
await previous.close().catch(() => void 0);
|
|
1510
|
+
}
|
|
1039
1511
|
}
|
|
1040
1512
|
return Object.freeze({
|
|
1041
1513
|
handle: current,
|
|
1514
|
+
rootHandle,
|
|
1042
1515
|
procPath: `/proc/self/fd/${current.fd}`,
|
|
1043
1516
|
targetName
|
|
1044
1517
|
});
|
|
1045
1518
|
} catch (error) {
|
|
1046
|
-
await
|
|
1519
|
+
await closeMutationParent({ handle: current, rootHandle });
|
|
1047
1520
|
throw error;
|
|
1048
1521
|
}
|
|
1049
1522
|
}
|
|
1523
|
+
async function closeMutationParent(parent) {
|
|
1524
|
+
for (const handle of /* @__PURE__ */ new Set([parent.handle, parent.rootHandle])) {
|
|
1525
|
+
await handle.close().catch(() => void 0);
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
function usesIsolatedDirectoryAuthority() {
|
|
1529
|
+
return process.platform === "darwin";
|
|
1530
|
+
}
|
|
1531
|
+
function openMutationRoot(target) {
|
|
1532
|
+
return openDirectory(target.rootPath, target.rootPath, target.logicalPath);
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
// plugins/filesystem/source/file-output-presentation.ts
|
|
1536
|
+
var import_node_fs4 = require("node:fs");
|
|
1537
|
+
function reportCommittedFileOutput(context, target, operation, root) {
|
|
1538
|
+
if (!context?.reportFileOutput) return;
|
|
1539
|
+
try {
|
|
1540
|
+
const identity = (0, import_node_fs4.fstatSync)(root.fd, { bigint: true });
|
|
1541
|
+
context.reportFileOutput({
|
|
1542
|
+
target,
|
|
1543
|
+
operation,
|
|
1544
|
+
rootIdentity: {
|
|
1545
|
+
device: String(identity.dev),
|
|
1546
|
+
inode: String(identity.ino),
|
|
1547
|
+
birthtimeNs: String(identity.birthtimeNs)
|
|
1548
|
+
}
|
|
1549
|
+
});
|
|
1550
|
+
} catch {
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
function notifyCommittedFileOutput(root, onCommitted) {
|
|
1554
|
+
try {
|
|
1555
|
+
onCommitted?.(root);
|
|
1556
|
+
} catch {
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
// plugins/filesystem/source/directory-write-task.ts
|
|
1561
|
+
async function commitDirectoryWrite(input) {
|
|
1562
|
+
const fs = require("node:fs/promises");
|
|
1563
|
+
const { constants: constants4 } = require("node:fs");
|
|
1564
|
+
const { createHash: createHash3, randomUUID: randomUUID2 } = require("node:crypto");
|
|
1565
|
+
const expected = input.expectedVersion;
|
|
1566
|
+
function failWrite(code) {
|
|
1567
|
+
throw Object.assign(new Error(code), { code });
|
|
1568
|
+
}
|
|
1569
|
+
function hasNodeCode(error, code) {
|
|
1570
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
1571
|
+
}
|
|
1572
|
+
function isSingleComponent(value) {
|
|
1573
|
+
if (!value || value === "." || value === "..") return false;
|
|
1574
|
+
if (value.includes("/") || value.includes("\\")) return false;
|
|
1575
|
+
return !value.includes("\0");
|
|
1576
|
+
}
|
|
1577
|
+
const segments = input.relativePath.split("/");
|
|
1578
|
+
if (!segments.every(isSingleComponent)) failWrite("filesystem_path_changed");
|
|
1579
|
+
const targetName = segments.pop();
|
|
1580
|
+
if (Buffer.byteLength(input.content, "utf8") > 1048576) {
|
|
1581
|
+
failWrite("filesystem_file_too_large");
|
|
1582
|
+
}
|
|
1583
|
+
async function enterChildDirectory(name) {
|
|
1584
|
+
let handle;
|
|
1585
|
+
const flags = constants4.O_RDONLY | constants4.O_DIRECTORY | constants4.O_NOFOLLOW;
|
|
1586
|
+
try {
|
|
1587
|
+
handle = await fs.open(name, flags);
|
|
1588
|
+
} catch (error) {
|
|
1589
|
+
if (!hasNodeCode(error, "ENOENT")) throw error;
|
|
1590
|
+
try {
|
|
1591
|
+
await fs.mkdir(name);
|
|
1592
|
+
} catch (creationError) {
|
|
1593
|
+
if (!hasNodeCode(creationError, "EEXIST")) throw creationError;
|
|
1594
|
+
}
|
|
1595
|
+
handle = await fs.open(name, flags);
|
|
1596
|
+
}
|
|
1597
|
+
try {
|
|
1598
|
+
const held = await handle.stat({ bigint: true });
|
|
1599
|
+
if (!held.isDirectory()) failWrite("filesystem_path_changed");
|
|
1600
|
+
process.chdir(name);
|
|
1601
|
+
const entered = await fs.stat(".", { bigint: true });
|
|
1602
|
+
if (held.dev !== entered.dev || held.ino !== entered.ino) {
|
|
1603
|
+
failWrite("filesystem_path_changed");
|
|
1604
|
+
}
|
|
1605
|
+
} finally {
|
|
1606
|
+
await handle.close();
|
|
1607
|
+
}
|
|
1608
|
+
}
|
|
1609
|
+
for (const segment of segments) await enterChildDirectory(segment);
|
|
1610
|
+
function hasExpectedMetadata(info) {
|
|
1611
|
+
if (expected.kind !== "file" || !info.isFile()) return false;
|
|
1612
|
+
if (String(info.dev) !== expected.device) return false;
|
|
1613
|
+
if (String(info.ino) !== expected.inode) return false;
|
|
1614
|
+
if (Number(info.size) !== expected.size) return false;
|
|
1615
|
+
if ((Number(info.mode) & 4095) !== expected.mode) return false;
|
|
1616
|
+
if (String(info.mtimeNs) !== expected.modifiedNs) return false;
|
|
1617
|
+
return String(info.ctimeNs) === expected.changedNs;
|
|
1618
|
+
}
|
|
1619
|
+
async function assertExpectedTarget() {
|
|
1620
|
+
let target;
|
|
1621
|
+
try {
|
|
1622
|
+
target = await fs.open(
|
|
1623
|
+
targetName,
|
|
1624
|
+
constants4.O_RDONLY | constants4.O_NOFOLLOW | constants4.O_NONBLOCK
|
|
1625
|
+
);
|
|
1626
|
+
} catch (error) {
|
|
1627
|
+
if (hasNodeCode(error, "ENOENT") && expected.kind === "absent") return;
|
|
1628
|
+
failWrite("filesystem_target_changed");
|
|
1629
|
+
}
|
|
1630
|
+
try {
|
|
1631
|
+
const before = await target.stat({ bigint: true });
|
|
1632
|
+
if (!hasExpectedMetadata(before)) failWrite("filesystem_target_changed");
|
|
1633
|
+
if (expected.kind !== "file") failWrite("filesystem_target_changed");
|
|
1634
|
+
const bytes = Buffer.alloc(expected.size);
|
|
1635
|
+
let offset = 0;
|
|
1636
|
+
while (offset < bytes.length) {
|
|
1637
|
+
const { bytesRead } = await target.read(
|
|
1638
|
+
bytes,
|
|
1639
|
+
offset,
|
|
1640
|
+
bytes.length - offset,
|
|
1641
|
+
offset
|
|
1642
|
+
);
|
|
1643
|
+
if (bytesRead <= 0) failWrite("filesystem_target_changed");
|
|
1644
|
+
offset += bytesRead;
|
|
1645
|
+
}
|
|
1646
|
+
const after = await target.stat({ bigint: true });
|
|
1647
|
+
if (!hasExpectedMetadata(after)) failWrite("filesystem_target_changed");
|
|
1648
|
+
const digest2 = createHash3("sha256").update(bytes).digest("hex");
|
|
1649
|
+
if (digest2 !== expected.digest) failWrite("filesystem_target_changed");
|
|
1650
|
+
} finally {
|
|
1651
|
+
await target.close();
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
const parent = await fs.open(
|
|
1655
|
+
".",
|
|
1656
|
+
constants4.O_RDONLY | constants4.O_DIRECTORY | constants4.O_NOFOLLOW
|
|
1657
|
+
);
|
|
1658
|
+
const temporaryName = `.abot-${targetName}-${randomUUID2()}.tmp`;
|
|
1659
|
+
let temporaryCreated = false;
|
|
1660
|
+
try {
|
|
1661
|
+
const temporary = await fs.open(temporaryName, "wx");
|
|
1662
|
+
temporaryCreated = true;
|
|
1663
|
+
try {
|
|
1664
|
+
await temporary.writeFile(input.content, "utf8");
|
|
1665
|
+
if (expected.kind === "file") await temporary.chmod(expected.mode);
|
|
1666
|
+
await temporary.sync();
|
|
1667
|
+
} finally {
|
|
1668
|
+
await temporary.close();
|
|
1669
|
+
}
|
|
1670
|
+
await assertExpectedTarget();
|
|
1671
|
+
if (expected.kind === "file") {
|
|
1672
|
+
await fs.rename(temporaryName, targetName);
|
|
1673
|
+
temporaryCreated = false;
|
|
1674
|
+
} else {
|
|
1675
|
+
try {
|
|
1676
|
+
await fs.link(temporaryName, targetName);
|
|
1677
|
+
} catch (error) {
|
|
1678
|
+
if (hasNodeCode(error, "EEXIST"))
|
|
1679
|
+
failWrite("filesystem_target_changed");
|
|
1680
|
+
throw error;
|
|
1681
|
+
}
|
|
1682
|
+
const removed = await fs.rm(temporaryName, { force: true }).then(() => true).catch(() => false);
|
|
1683
|
+
temporaryCreated = !removed;
|
|
1684
|
+
}
|
|
1685
|
+
await parent.sync().catch(() => void 0);
|
|
1686
|
+
} finally {
|
|
1687
|
+
if (temporaryCreated)
|
|
1688
|
+
await fs.rm(temporaryName, { force: true }).catch(() => void 0);
|
|
1689
|
+
await parent.close().catch(() => void 0);
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
// plugins/filesystem/source/directory-authority-write.ts
|
|
1694
|
+
async function writeWithDirectoryAuthority(input) {
|
|
1695
|
+
const root = await openMutationRoot(input.target);
|
|
1696
|
+
const expected = input.expectedVersion;
|
|
1697
|
+
const expectedVersion = expected.kind === "absent" ? { kind: "absent" } : {
|
|
1698
|
+
...expected,
|
|
1699
|
+
device: String(expected.device),
|
|
1700
|
+
inode: String(expected.inode),
|
|
1701
|
+
modifiedNs: String(expected.modifiedNs),
|
|
1702
|
+
changedNs: String(expected.changedNs)
|
|
1703
|
+
};
|
|
1704
|
+
try {
|
|
1705
|
+
await runDirectoryAuthorityTask({
|
|
1706
|
+
directoryPath: input.target.rootPath,
|
|
1707
|
+
directoryFd: root.fd,
|
|
1708
|
+
input: {
|
|
1709
|
+
relativePath: input.target.relativePath,
|
|
1710
|
+
content: input.content,
|
|
1711
|
+
expectedVersion
|
|
1712
|
+
},
|
|
1713
|
+
task: commitDirectoryWrite
|
|
1714
|
+
});
|
|
1715
|
+
notifyCommittedFileOutput(root, input.onCommitted);
|
|
1716
|
+
} catch (error) {
|
|
1717
|
+
if (error instanceof DirectoryAuthorityError) {
|
|
1718
|
+
if (error.code.startsWith("filesystem_")) {
|
|
1719
|
+
fail(
|
|
1720
|
+
error.code,
|
|
1721
|
+
`Safe write failed: ${input.target.logicalPath}`,
|
|
1722
|
+
error.data
|
|
1723
|
+
);
|
|
1724
|
+
}
|
|
1725
|
+
if (error.code.startsWith("directory_authority_")) {
|
|
1726
|
+
fail(
|
|
1727
|
+
"filesystem_path_changed",
|
|
1728
|
+
`Directory authority was lost: ${input.target.logicalPath}`
|
|
1729
|
+
);
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
rethrowFilesystemError(error, "write", input.target.logicalPath);
|
|
1733
|
+
} finally {
|
|
1734
|
+
await root.close().catch(() => void 0);
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1050
1737
|
|
|
1051
1738
|
// plugins/filesystem/source/atomic-write.ts
|
|
1052
1739
|
async function atomicWriteText(input) {
|
|
1053
1740
|
assertMutationContentSize(input.content);
|
|
1741
|
+
if (requiresIsolatedDirectoryAuthority()) {
|
|
1742
|
+
await writeWithDirectoryAuthority(input);
|
|
1743
|
+
return;
|
|
1744
|
+
}
|
|
1054
1745
|
const parent = await openMutationParent(input.target);
|
|
1055
1746
|
const targetPath = `${parent.procPath}/${parent.targetName}`;
|
|
1056
1747
|
const anchoredTarget = Object.freeze({
|
|
@@ -1059,12 +1750,12 @@ async function atomicWriteText(input) {
|
|
|
1059
1750
|
absolutePath: targetPath,
|
|
1060
1751
|
relativePath: parent.targetName
|
|
1061
1752
|
});
|
|
1062
|
-
const temporaryName = `.abot-${
|
|
1753
|
+
const temporaryName = `.abot-${import_node_path5.posix.basename(parent.targetName)}-${(0, import_node_crypto2.randomUUID)()}.tmp`;
|
|
1063
1754
|
const temporaryPath = `${parent.procPath}/${temporaryName}`;
|
|
1064
1755
|
const existingMode = input.expectedVersion.kind === "file" ? input.expectedVersion.mode : void 0;
|
|
1065
1756
|
let temporaryCreated = false;
|
|
1066
1757
|
try {
|
|
1067
|
-
const temporaryHandle = await (0,
|
|
1758
|
+
const temporaryHandle = await (0, import_promises5.open)(temporaryPath, "wx");
|
|
1068
1759
|
temporaryCreated = true;
|
|
1069
1760
|
try {
|
|
1070
1761
|
await temporaryHandle.writeFile(input.content, "utf8");
|
|
@@ -1086,28 +1777,29 @@ async function atomicWriteText(input) {
|
|
|
1086
1777
|
if (input.expectedVersion.kind === "file") {
|
|
1087
1778
|
temporaryCreated = false;
|
|
1088
1779
|
} else {
|
|
1089
|
-
const removed = await (0,
|
|
1780
|
+
const removed = await (0, import_promises5.rm)(temporaryPath, { force: true }).then(() => true).catch(() => false);
|
|
1090
1781
|
temporaryCreated = !removed;
|
|
1091
1782
|
}
|
|
1092
1783
|
await syncDirectoryBestEffort(parent.handle);
|
|
1784
|
+
notifyCommittedFileOutput(parent.rootHandle, input.onCommitted);
|
|
1093
1785
|
} catch (error) {
|
|
1094
1786
|
rethrowFilesystemError(error, "write", input.target.logicalPath);
|
|
1095
1787
|
} finally {
|
|
1096
1788
|
if (temporaryCreated) {
|
|
1097
|
-
await (0,
|
|
1789
|
+
await (0, import_promises5.rm)(temporaryPath, { force: true }).catch(() => void 0);
|
|
1098
1790
|
}
|
|
1099
|
-
await parent
|
|
1791
|
+
await closeMutationParent(parent);
|
|
1100
1792
|
}
|
|
1101
1793
|
}
|
|
1102
1794
|
async function installPreparedFile(input) {
|
|
1103
1795
|
const temporaryPath = `${input.parentProcPath}/${input.temporaryName}`;
|
|
1104
1796
|
const targetPath = `${input.parentProcPath}/${input.targetName}`;
|
|
1105
1797
|
if (input.expectedKind === "file") {
|
|
1106
|
-
await (0,
|
|
1798
|
+
await (0, import_promises5.rename)(temporaryPath, targetPath);
|
|
1107
1799
|
return;
|
|
1108
1800
|
}
|
|
1109
1801
|
try {
|
|
1110
|
-
await (0,
|
|
1802
|
+
await (0, import_promises5.link)(temporaryPath, targetPath);
|
|
1111
1803
|
} catch (error) {
|
|
1112
1804
|
if (isNodeErrorCode(error, "EEXIST")) {
|
|
1113
1805
|
fail(
|
|
@@ -1124,10 +1816,13 @@ async function syncDirectoryBestEffort(handle) {
|
|
|
1124
1816
|
} catch {
|
|
1125
1817
|
}
|
|
1126
1818
|
}
|
|
1819
|
+
function requiresIsolatedDirectoryAuthority() {
|
|
1820
|
+
return process.platform === "darwin";
|
|
1821
|
+
}
|
|
1127
1822
|
|
|
1128
1823
|
// plugins/filesystem/source/draft/grounding.ts
|
|
1129
1824
|
var import_node_crypto3 = require("node:crypto");
|
|
1130
|
-
var
|
|
1825
|
+
var import_node_path6 = require("node:path");
|
|
1131
1826
|
var GROUNDING_MAX_CHARS = 32768;
|
|
1132
1827
|
var SNAPSHOT_MAX_CHARS = 3e4;
|
|
1133
1828
|
var SNAPSHOT_SEGMENT_CHARS = Math.floor(SNAPSHOT_MAX_CHARS / 2);
|
|
@@ -1136,7 +1831,7 @@ function buildMutationGrounding(input) {
|
|
|
1136
1831
|
const byteCount = Buffer.byteLength(input.content, "utf8");
|
|
1137
1832
|
const lineCount = input.content.length ? input.content.split(/\r?\n/u).length : 0;
|
|
1138
1833
|
const sha256 = (0, import_node_crypto3.createHash)("sha256").update(input.content).digest("hex");
|
|
1139
|
-
const extension = (0,
|
|
1834
|
+
const extension = (0, import_node_path6.extname)(input.logicalPath).toLowerCase() || "none";
|
|
1140
1835
|
const snapshot = projectSnapshot(input.content, input.previousContent);
|
|
1141
1836
|
const summary = bound(
|
|
1142
1837
|
[
|
|
@@ -1380,7 +2075,7 @@ function scopeError(message) {
|
|
|
1380
2075
|
// plugins/filesystem/source/draft/validators.ts
|
|
1381
2076
|
var import_parser = require("@babel/parser");
|
|
1382
2077
|
var import_postcss = require("postcss");
|
|
1383
|
-
var
|
|
2078
|
+
var import_node_path7 = require("node:path");
|
|
1384
2079
|
var SCRIPT_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
1385
2080
|
".js",
|
|
1386
2081
|
".jsx",
|
|
@@ -1420,7 +2115,7 @@ function lineColumnAt(content, offset) {
|
|
|
1420
2115
|
});
|
|
1421
2116
|
}
|
|
1422
2117
|
function scriptOptions(targetPath) {
|
|
1423
|
-
const extension = (0,
|
|
2118
|
+
const extension = (0, import_node_path7.extname)(targetPath).toLowerCase();
|
|
1424
2119
|
const plugins = [];
|
|
1425
2120
|
if ([".js", ".jsx", ".mjs", ".cjs", ".tsx"].includes(extension)) {
|
|
1426
2121
|
plugins.push("jsx");
|
|
@@ -1483,7 +2178,7 @@ function foreignScriptWrapper(content, targetPath, originalError) {
|
|
|
1483
2178
|
return parseScript(projected.join("\n"), targetPath) === void 0;
|
|
1484
2179
|
};
|
|
1485
2180
|
if (opening && closing && first < last && parsesWithout(first, last)) {
|
|
1486
|
-
const extension = (0,
|
|
2181
|
+
const extension = (0, import_node_path7.extname)(targetPath).toLowerCase();
|
|
1487
2182
|
if (!originalError && [".jsx", ".tsx"].includes(extension))
|
|
1488
2183
|
return void 0;
|
|
1489
2184
|
return wrapperDiagnostic(lines[first], first, "opening", 2);
|
|
@@ -1501,14 +2196,14 @@ var validators = Object.freeze([
|
|
|
1501
2196
|
id: "json",
|
|
1502
2197
|
label: "strict JSON",
|
|
1503
2198
|
authoritativeStructure: true,
|
|
1504
|
-
matchesTarget: (targetPath) => (0,
|
|
2199
|
+
matchesTarget: (targetPath) => (0, import_node_path7.extname)(targetPath).toLowerCase() === ".json",
|
|
1505
2200
|
validate: (content) => validateJson(content)
|
|
1506
2201
|
}),
|
|
1507
2202
|
Object.freeze({
|
|
1508
2203
|
id: "css",
|
|
1509
2204
|
label: "CSS",
|
|
1510
2205
|
authoritativeStructure: true,
|
|
1511
|
-
matchesTarget: (targetPath) => (0,
|
|
2206
|
+
matchesTarget: (targetPath) => (0, import_node_path7.extname)(targetPath).toLowerCase() === ".css",
|
|
1512
2207
|
validate(content, targetPath) {
|
|
1513
2208
|
try {
|
|
1514
2209
|
(0, import_postcss.parse)(content, { from: targetPath });
|
|
@@ -1528,7 +2223,7 @@ var validators = Object.freeze([
|
|
|
1528
2223
|
id: "script",
|
|
1529
2224
|
label: "JavaScript/TypeScript",
|
|
1530
2225
|
authoritativeStructure: true,
|
|
1531
|
-
matchesTarget: (targetPath) => SCRIPT_EXTENSIONS.has((0,
|
|
2226
|
+
matchesTarget: (targetPath) => SCRIPT_EXTENSIONS.has((0, import_node_path7.extname)(targetPath).toLowerCase()),
|
|
1532
2227
|
validate(content, targetPath) {
|
|
1533
2228
|
const error = parseScript(content, targetPath);
|
|
1534
2229
|
return foreignScriptWrapper(content, targetPath, error) ?? (error ? scriptDiagnostic(error) : void 0);
|
|
@@ -1797,7 +2492,8 @@ function createEditFileHandler(paths, mutations) {
|
|
|
1797
2492
|
await atomicWriteText({
|
|
1798
2493
|
target,
|
|
1799
2494
|
content: prepared2.content,
|
|
1800
|
-
expectedVersion: snapshot.version
|
|
2495
|
+
expectedVersion: snapshot.version,
|
|
2496
|
+
onCommitted: (root) => reportCommittedFileOutput(context, target, "updated", root)
|
|
1801
2497
|
});
|
|
1802
2498
|
return result;
|
|
1803
2499
|
});
|
|
@@ -1877,17 +2573,17 @@ function delimiterRegressions(previous, updated) {
|
|
|
1877
2573
|
["square", "[", "]"],
|
|
1878
2574
|
["paren", "(", ")"]
|
|
1879
2575
|
];
|
|
1880
|
-
return delimiters.flatMap(([name,
|
|
1881
|
-
if (!previous.includes(
|
|
1882
|
-
const before = balance(previous,
|
|
1883
|
-
const after = balance(updated,
|
|
2576
|
+
return delimiters.flatMap(([name, open5, close]) => {
|
|
2577
|
+
if (!previous.includes(open5) || !previous.includes(close)) return [];
|
|
2578
|
+
const before = balance(previous, open5, close);
|
|
2579
|
+
const after = balance(updated, open5, close);
|
|
1884
2580
|
return before === 0 && after !== 0 ? [`${name} delimiter balance changed from 0 to ${after}`] : [];
|
|
1885
2581
|
});
|
|
1886
2582
|
}
|
|
1887
|
-
function balance(content,
|
|
2583
|
+
function balance(content, open5, close) {
|
|
1888
2584
|
let count = 0;
|
|
1889
2585
|
for (const character of content) {
|
|
1890
|
-
if (character ===
|
|
2586
|
+
if (character === open5) count += 1;
|
|
1891
2587
|
else if (character === close) count -= 1;
|
|
1892
2588
|
}
|
|
1893
2589
|
return count;
|
|
@@ -1933,7 +2629,7 @@ function getProcessFilesystemMutationCoordinator() {
|
|
|
1933
2629
|
}
|
|
1934
2630
|
|
|
1935
2631
|
// plugins/filesystem/source/path-service.ts
|
|
1936
|
-
var
|
|
2632
|
+
var import_node_path8 = require("node:path");
|
|
1937
2633
|
var FILESYSTEM_LOCATIONS = Object.freeze([
|
|
1938
2634
|
"agent_work",
|
|
1939
2635
|
"workspace"
|
|
@@ -1951,7 +2647,7 @@ function logicalParent(logicalPath) {
|
|
|
1951
2647
|
if (logicalPath === "." || logicalPath === "workspace") {
|
|
1952
2648
|
return logicalPath;
|
|
1953
2649
|
}
|
|
1954
|
-
return
|
|
2650
|
+
return import_node_path8.posix.dirname(logicalPath);
|
|
1955
2651
|
}
|
|
1956
2652
|
function createFilesystemPathService(fallbackResolver) {
|
|
1957
2653
|
return Object.freeze({
|
|
@@ -1966,7 +2662,7 @@ function createFilesystemPathService(fallbackResolver) {
|
|
|
1966
2662
|
},
|
|
1967
2663
|
sibling(target, name, context) {
|
|
1968
2664
|
const parent = logicalParent(target.logicalPath);
|
|
1969
|
-
const logicalPath = parent === "." ? name :
|
|
2665
|
+
const logicalPath = parent === "." ? name : import_node_path8.posix.join(parent, name);
|
|
1970
2666
|
return resolveWith(resolverFor(fallbackResolver, context), logicalPath);
|
|
1971
2667
|
}
|
|
1972
2668
|
});
|
|
@@ -2116,7 +2812,13 @@ function createWriteFileHandler(paths, mutations) {
|
|
|
2116
2812
|
await atomicWriteText({
|
|
2117
2813
|
target,
|
|
2118
2814
|
content: prepared2.content,
|
|
2119
|
-
expectedVersion: snapshot.version
|
|
2815
|
+
expectedVersion: snapshot.version,
|
|
2816
|
+
onCommitted: (root) => reportCommittedFileOutput(
|
|
2817
|
+
context,
|
|
2818
|
+
target,
|
|
2819
|
+
previousContent === null ? "created" : "updated",
|
|
2820
|
+
root
|
|
2821
|
+
)
|
|
2120
2822
|
});
|
|
2121
2823
|
return result;
|
|
2122
2824
|
});
|