@abot-ai/runtime 1.7.0 → 1.8.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/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/cli/abot.js +2 -0
- package/dist/src/cli/host-companion-bundle.mjs +751 -333
- package/dist/src/computer-access/collection-consent.d.ts +9 -0
- package/dist/src/computer-access/collection-consent.js +47 -0
- package/dist/src/computer-access/command-output-capture.d.ts +17 -6
- package/dist/src/computer-access/command-output-capture.js +134 -68
- package/dist/src/computer-access/command-output-protection.d.ts +17 -0
- package/dist/src/computer-access/command-output-protection.js +59 -0
- package/dist/src/computer-access/companion/command-output.d.ts +1 -0
- package/dist/src/computer-access/companion/command-output.js +23 -6
- package/dist/src/computer-access/companion/install-link-macos.js +2 -1
- package/dist/src/computer-access/companion/native-notifications.js +3 -2
- package/dist/src/computer-access/companion/native-session.js +6 -2
- package/dist/src/computer-access/companion/observation-filter.js +2 -26
- package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
- package/dist/src/computer-access/companion/observation-process.js +51 -25
- package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
- package/dist/src/computer-access/companion/observation-redaction.js +2 -111
- package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
- package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
- package/dist/src/computer-access/computer/companion-sessions.js +7 -6
- package/dist/src/computer-access/computer/unix-native-process.js +23 -11
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +79 -11
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
- package/dist/src/computer-access/native-observation-connection.js +78 -0
- package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
- package/dist/src/computer-access/native-observation-ownership.js +55 -0
- package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
- package/dist/src/computer-access/native-observation-shutdown.js +58 -0
- package/dist/src/computer-access/observation-source.d.ts +6 -0
- package/dist/src/computer-access/observation-source.js +10 -0
- package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
- package/dist/src/computer-access/security/desktop-result.js +146 -0
- package/dist/src/computer-access/security/observed-error.d.ts +2 -0
- package/dist/src/computer-access/security/observed-error.js +10 -0
- package/dist/src/computer-access/security/secret-text.d.ts +7 -0
- package/dist/src/computer-access/security/secret-text.js +111 -0
- package/dist/src/computer-access/security/system-results.d.ts +2 -0
- package/dist/src/computer-access/security/system-results.js +53 -0
- package/dist/src/computer-access/system-result-protection.d.ts +11 -0
- package/dist/src/computer-access/system-result-protection.js +1 -0
- package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
- package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
- package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
- package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
- package/dist/src/model-gateway/observability/provider-trace.js +30 -8
- package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
- package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
- package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
- package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
- package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
- package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
- package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
- package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
- package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
- package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
- package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
- package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
- package/dist/src/model-gateway/providers/openai/payload.js +6 -23
- package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
- package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
- package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
- package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
- package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
- package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
- package/dist/src/model-gateway/providers/openai/stream.js +13 -41
- package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
- package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
- package/dist/src/model-gateway/server.js +5 -1
- package/dist/src/plugin-contract/index.d.ts +1 -0
- package/dist/src/plugin-contract/index.js +1 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -0
- package/dist/src/plugin-contract/manifest.js +1 -0
- package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
- package/dist/src/plugin-contract/platform-compatibility.js +3 -0
- package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
- package/dist/src/plugin-sdk/computer-access.js +1 -0
- package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
- package/dist/src/plugin-sdk/files-windows/process.js +93 -0
- package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
- package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
- package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
- package/dist/src/plugin-sdk/files-windows/read.js +56 -0
- package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
- package/dist/src/plugin-sdk/files-windows/result.js +67 -0
- package/dist/src/plugin-sdk/files.js +4 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
- package/dist/src/plugin-sdk/mutation-result.js +11 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
- package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
- package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
- package/dist/src/runtime/passive-learning/collection-source.js +7 -0
- package/dist/src/runtime/passive-learning/service.js +2 -3
- package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
- package/dist/src/runtime/passive-learning/status-projection.js +9 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
- package/dist/src/runtime/plugins/installation/package.js +2 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
- package/dist/src/runtime/plugins/loader.js +24 -14
- package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
- package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
- package/dist/src/runtime/plugins/manifest-validator.js +9 -1
- package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
- package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
- package/dist/src/runtime/steps/execution-agent/format.js +2 -3
- package/dist/src/runtime/steps/execution-agent/input.js +1 -1
- package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
- package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
- package/dist/src/sessions/durable-session-commit.js +3 -3
- package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
- package/dist/src/sessions/prepared-session-replacement.js +46 -0
- package/dist/src/sessions/session-store.js +3 -3
- package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
- package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
- package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/authority-script.js +94 -0
- package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
- package/dist/src/shared/windows-file-io/native-script.js +120 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
- package/dist/src/shared/windows-job-object.d.ts +2 -0
- package/dist/src/shared/windows-job-object.js +66 -0
- package/dist/src/web-ui/app/app-bootstrap.js +14 -1
- package/dist/src/web-ui/app/app-state.js +0 -7
- package/dist/src/web-ui/app/app.js +53 -156
- package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
- package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
- package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
- package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
- package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
- package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
- package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
- package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
- package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
- package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
- package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
- package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
- package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
- package/dist/src/web-ui/app/components/schedules/form.js +10 -8
- package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
- package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
- package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
- package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +9 -1
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
- package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
- package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
- package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
- package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
- package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
- package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
- package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
- package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
- package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
- package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
- package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
- package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
- package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
- package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
- package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
- package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
- package/dist/src/web-ui/app/dashboard-feature.js +3 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
- package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
- package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
- package/dist/src/web-ui/app/schedules-feature.js +5 -3
- package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
- package/dist/src/web-ui/app/services/client-preferences.js +25 -16
- package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
- package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
- package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
- package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
- package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
- package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
- package/dist/src/web-ui/app/services/workspace-state.js +27 -0
- package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
- package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
- package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
- package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
- package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
- package/dist/src/web-ui/app/styles.css +2 -0
- package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
- package/dist/src/web-ui/client-state/contracts.js +13 -0
- package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
- package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
- package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
- package/dist/src/web-ui/client-state/preferences.js +84 -0
- package/dist/src/web-ui/client-state/queue.d.ts +3 -0
- package/dist/src/web-ui/client-state/queue.js +43 -0
- package/dist/src/web-ui/client-state/routes.d.ts +7 -0
- package/dist/src/web-ui/client-state/routes.js +58 -0
- package/dist/src/web-ui/client-state/store.d.ts +14 -0
- package/dist/src/web-ui/client-state/store.js +88 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
- package/dist/src/web-ui/local-runtime/http.js +11 -2
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
- package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
- package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +14 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +3 -1
- package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
- package/dist/src/web-ui/server-readiness.d.ts +3 -0
- package/dist/src/web-ui/server-readiness.js +36 -0
- package/dist/src/web-ui/server.d.ts +2 -0
- package/dist/src/web-ui/server.js +23 -1
- package/dist/src/web-ui/system-host-service.js +13 -2
- package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
- package/docs/installation.md +44 -5
- package/docs/plugins.md +145 -4
- package/docs/tool-execution-result-evidence-contract.md +57 -0
- package/docs/windows-companion-store.md +5 -0
- package/package.json +4 -2
- package/plugins/capability-brief/plugin.json +4 -0
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +1 -0
- package/plugins/code-outline/source/index.ts +16 -20
- package/plugins/code-outline/source/read-failure.ts +40 -0
- package/plugins/code-outline/src/index.cjs +614 -29
- package/plugins/document-reader/README.md +33 -0
- package/plugins/document-reader/plugin.json +1 -0
- package/plugins/document-reader/source/pdf-contract.ts +57 -0
- package/plugins/document-reader/source/pdf-parser.ts +139 -0
- package/plugins/document-reader/source/pdf-process-main.ts +56 -0
- package/plugins/document-reader/source/pdf-process.ts +207 -0
- package/plugins/document-reader/source/pdf-result.ts +79 -0
- package/plugins/document-reader/source/pdf-worker.ts +39 -303
- package/plugins/document-reader/source/pdf.ts +4 -1
- package/plugins/document-reader/source/read-failure.ts +37 -0
- package/plugins/document-reader/source/reader.ts +3 -19
- package/plugins/document-reader/src/index.cjs +995 -211
- package/plugins/exec/README.md +19 -0
- package/plugins/exec/plugin.json +4 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
- package/plugins/exec/source/filesystem-file-observer.ts +98 -0
- package/plugins/exec/source/filesystem-observer.ts +8 -79
- package/plugins/exec/source/output-files.ts +12 -6
- package/plugins/exec/source/paths.ts +3 -1
- package/plugins/exec/source/process-manager.ts +8 -24
- package/plugins/exec/source/shell-platform.ts +19 -3
- package/plugins/exec/source/shell-process.ts +55 -0
- package/plugins/exec/source/windows-job-source.ts +1 -0
- package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
- package/plugins/exec/src/index.cjs +252 -96
- package/plugins/filesystem/README.md +65 -0
- package/plugins/filesystem/plugin.json +6 -2
- package/plugins/filesystem/source/atomic-write.ts +2 -0
- package/plugins/filesystem/source/bounded-io.ts +80 -306
- package/plugins/filesystem/source/directory-sample.ts +2 -0
- package/plugins/filesystem/source/errors.ts +14 -0
- package/plugins/filesystem/source/file-observation.ts +151 -0
- package/plugins/filesystem/source/file-version.ts +41 -0
- package/plugins/filesystem/source/index.ts +6 -0
- package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
- package/plugins/filesystem/source/windows/authority-script.ts +1 -0
- package/plugins/filesystem/source/windows/native-script.ts +1 -0
- package/plugins/filesystem/source/windows/operations.ts +197 -0
- package/plugins/filesystem/source/windows/process.ts +214 -0
- package/plugins/filesystem/source/windows/publication-script.ts +29 -0
- package/plugins/filesystem/source/windows/read-script.ts +63 -0
- package/plugins/filesystem/source/windows/request-availability.ts +67 -0
- package/plugins/filesystem/source/windows/source.ts +42 -0
- package/plugins/filesystem/source/windows/storage-script.ts +11 -0
- package/plugins/filesystem/source/windows/streams-script.ts +24 -0
- package/plugins/filesystem/source/windows/write-script.ts +86 -0
- package/plugins/filesystem/src/index.cjs +1208 -322
- package/plugins/json-inspector/README.md +18 -0
- package/plugins/json-inspector/plugin.json +1 -0
- package/plugins/json-inspector/source/index.ts +16 -19
- package/plugins/json-inspector/source/read-failure.ts +42 -0
- package/plugins/json-inspector/src/index.cjs +612 -27
- package/plugins/local-search/README.md +29 -0
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/local-search/source/errors.ts +2 -0
- package/plugins/local-search/source/paths.ts +3 -0
- package/plugins/local-search/source/ripgrep-process.ts +31 -5
- package/plugins/local-search/source/ripgrep.ts +3 -3
- package/plugins/local-search/source/windows-authority.ts +99 -0
- package/plugins/local-search/source/windows-search-lease.ts +49 -0
- package/plugins/local-search/source/windows-search-process.ts +91 -0
- package/plugins/local-search/source/windows-search-script.ts +52 -0
- package/plugins/local-search/src/index.cjs +595 -26
- package/plugins/memory/plugin.json +4 -0
- package/plugins/memory/source/lock-directory-claim.ts +56 -0
- package/plugins/memory/source/lock-owner-file.ts +71 -0
- package/plugins/memory/source/lock-path-observation.ts +26 -0
- package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
- package/plugins/memory/source/store-lock.ts +12 -7
- package/plugins/memory/source/store.ts +3 -2
- package/plugins/memory/src/index.cjs +174 -25
- package/plugins/project-orientation/README.md +23 -0
- package/plugins/project-orientation/plugin.json +1 -0
- package/plugins/project-orientation/source/index.ts +12 -9
- package/plugins/project-orientation/source/inspection-failure.ts +70 -0
- package/plugins/project-orientation/source/manifest-summary.ts +9 -2
- package/plugins/project-orientation/source/tree.ts +6 -0
- package/plugins/project-orientation/src/index.cjs +647 -31
- package/plugins/system/README.md +51 -15
- package/plugins/system/plugin.json +5 -1
- package/plugins/system/skills/system_actions/SKILL.md +1 -1
- package/plugins/system/source/command-working-directory.ts +47 -0
- package/plugins/system/source/computer/handlers.ts +13 -9
- package/plugins/system/source/computer/observation-result.ts +10 -5
- package/plugins/system/source/computer/request-computers.ts +10 -3
- package/plugins/system/source/computer/request-modules.ts +3 -6
- package/plugins/system/source/computer/runtime-platform.ts +18 -0
- package/plugins/system/source/host-dispatch.ts +18 -2
- package/plugins/system/source/index.ts +5 -3
- package/plugins/system/source/local-command-output-retention.ts +16 -0
- package/plugins/system/source/local-command-output.ts +16 -8
- package/plugins/system/source/request-system-modules.ts +12 -2
- package/plugins/system/source/request-target-snapshot.ts +2 -1
- package/plugins/system/source/security/desktop-result.ts +177 -0
- package/plugins/system/source/security/observed-error.ts +10 -0
- package/plugins/system/source/security/secret-text.ts +118 -0
- package/plugins/system/source/security/system-results.ts +62 -0
- package/plugins/system/source/security/windows-output-directory.ts +82 -0
- package/plugins/system/src/index.cjs +837 -151
- package/plugins/system-probe/plugin.json +8 -2
- package/plugins/system-probe/source/disk-path.ts +8 -0
- package/plugins/system-probe/source/index.ts +10 -5
- package/plugins/system-probe/source/machine-load.ts +33 -0
- package/plugins/system-probe/source/metrics.ts +6 -8
- package/plugins/system-probe/src/index.cjs +49 -16
- package/plugins/web/plugin.json +4 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
const IGNORED_OUTPUT_DIAGNOSTIC_LIMIT = 8;
|
|
2
|
+
function readRecord(value) {
|
|
3
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
4
|
+
return {};
|
|
5
|
+
}
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
function readMessagePhase(value) {
|
|
9
|
+
if (value === "commentary" || value === "final_answer")
|
|
10
|
+
return value;
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
function readOutputIndex(value) {
|
|
14
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function takePendingText(output) {
|
|
20
|
+
const pending = output.pending;
|
|
21
|
+
output.pending = [];
|
|
22
|
+
return pending.map((chunk) => chunk.text);
|
|
23
|
+
}
|
|
24
|
+
function describeOutput(output) {
|
|
25
|
+
return {
|
|
26
|
+
itemId: output.itemId?.slice(0, 160) ?? null,
|
|
27
|
+
outputIndex: output.outputIndex,
|
|
28
|
+
arrivalOrder: output.arrivalOrder,
|
|
29
|
+
textByteCount: output.textByteCount,
|
|
30
|
+
...(output.phase ? { phase: output.phase } : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** One invocation's structured result; never infer its phase from generated text. */
|
|
34
|
+
export class OpenAIStructuredMessageOutput {
|
|
35
|
+
outputs = [];
|
|
36
|
+
byItemId = new Map();
|
|
37
|
+
byOutputIndex = new Map();
|
|
38
|
+
unidentifiedOutput;
|
|
39
|
+
firstTextOutput;
|
|
40
|
+
selectedOutput;
|
|
41
|
+
hasExplicitPhase = false;
|
|
42
|
+
nextOutputOrder = 0;
|
|
43
|
+
nextChunkSequence = 0;
|
|
44
|
+
observeItem(event) {
|
|
45
|
+
const item = readRecord(event.item);
|
|
46
|
+
if (item.type !== "message")
|
|
47
|
+
return [];
|
|
48
|
+
const output = this.resolveOutput(item.id, event.output_index);
|
|
49
|
+
const phase = readMessagePhase(item.phase);
|
|
50
|
+
if (!phase)
|
|
51
|
+
return this.takeSelectedText(output);
|
|
52
|
+
this.hasExplicitPhase = true;
|
|
53
|
+
output.phase = phase;
|
|
54
|
+
if (phase === "commentary") {
|
|
55
|
+
output.pending = [];
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
this.selectFinalOutput(output);
|
|
59
|
+
return this.takeSelectedText(output);
|
|
60
|
+
}
|
|
61
|
+
observeResponse(value) {
|
|
62
|
+
const response = readRecord(value);
|
|
63
|
+
if (!Array.isArray(response.output))
|
|
64
|
+
return [];
|
|
65
|
+
return response.output.flatMap((item, outputIndex) => this.observeItem({ item, output_index: outputIndex }));
|
|
66
|
+
}
|
|
67
|
+
consumeDelta(event, text) {
|
|
68
|
+
const output = this.resolveOutput(event.item_id, event.output_index);
|
|
69
|
+
this.firstTextOutput ??= output;
|
|
70
|
+
output.textByteCount += Buffer.byteLength(text, "utf8");
|
|
71
|
+
if (output.phase === "commentary")
|
|
72
|
+
return [];
|
|
73
|
+
output.pending.push({ sequence: this.nextChunkSequence++, text });
|
|
74
|
+
return this.takeSelectedText(output);
|
|
75
|
+
}
|
|
76
|
+
finish() {
|
|
77
|
+
if (this.selectedOutput) {
|
|
78
|
+
return { text: takePendingText(this.selectedOutput) };
|
|
79
|
+
}
|
|
80
|
+
if (this.hasExplicitPhase) {
|
|
81
|
+
return { text: [], error: "openai structured response missing final_answer" };
|
|
82
|
+
}
|
|
83
|
+
// Older responses have no phase: retain the first text message, never join them.
|
|
84
|
+
this.selectedOutput = this.firstTextOutput;
|
|
85
|
+
return {
|
|
86
|
+
text: this.selectedOutput ? takePendingText(this.selectedOutput) : [],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
diagnostic() {
|
|
90
|
+
if (!this.selectedOutput || this.outputs.length < 2)
|
|
91
|
+
return undefined;
|
|
92
|
+
const ignored = this.outputs.filter((output) => output !== this.selectedOutput);
|
|
93
|
+
return {
|
|
94
|
+
outcome: "additional_message_outputs_ignored",
|
|
95
|
+
outputCount: this.outputs.length,
|
|
96
|
+
selectedOutput: describeOutput(this.selectedOutput),
|
|
97
|
+
ignoredOutputCount: ignored.length,
|
|
98
|
+
sampledIgnoredOutputs: ignored.slice(0, IGNORED_OUTPUT_DIAGNOSTIC_LIMIT).map(describeOutput),
|
|
99
|
+
omittedIgnoredOutputCount: Math.max(0, ignored.length - IGNORED_OUTPUT_DIAGNOSTIC_LIMIT),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
selectFinalOutput(output) {
|
|
103
|
+
if (this.selectedOutput)
|
|
104
|
+
return;
|
|
105
|
+
this.selectedOutput = output;
|
|
106
|
+
}
|
|
107
|
+
takeSelectedText(output) {
|
|
108
|
+
if (output !== this.selectedOutput)
|
|
109
|
+
return [];
|
|
110
|
+
// Keep partial identities buffered until both identifiers can join their chunks.
|
|
111
|
+
if (output.itemId === null)
|
|
112
|
+
return [];
|
|
113
|
+
if (output.outputIndex === null)
|
|
114
|
+
return [];
|
|
115
|
+
return takePendingText(output);
|
|
116
|
+
}
|
|
117
|
+
mergeOutputs(first, second) {
|
|
118
|
+
const [output, absorbed] = [first, second].sort((a, b) => a.arrivalOrder - b.arrivalOrder);
|
|
119
|
+
output.itemId ??= absorbed.itemId;
|
|
120
|
+
output.outputIndex ??= absorbed.outputIndex;
|
|
121
|
+
output.phase ??= absorbed.phase;
|
|
122
|
+
output.textByteCount += absorbed.textByteCount;
|
|
123
|
+
output.pending = [...output.pending, ...absorbed.pending]
|
|
124
|
+
.sort((a, b) => a.sequence - b.sequence);
|
|
125
|
+
this.outputs.splice(this.outputs.indexOf(absorbed), 1);
|
|
126
|
+
for (const [key, value] of this.byItemId) {
|
|
127
|
+
if (value === absorbed)
|
|
128
|
+
this.byItemId.set(key, output);
|
|
129
|
+
}
|
|
130
|
+
for (const [key, value] of this.byOutputIndex) {
|
|
131
|
+
if (value === absorbed)
|
|
132
|
+
this.byOutputIndex.set(key, output);
|
|
133
|
+
}
|
|
134
|
+
if (this.firstTextOutput === absorbed)
|
|
135
|
+
this.firstTextOutput = output;
|
|
136
|
+
if (this.selectedOutput === absorbed)
|
|
137
|
+
this.selectedOutput = output;
|
|
138
|
+
return output;
|
|
139
|
+
}
|
|
140
|
+
reconcileOutputs(itemOutput, indexedOutput) {
|
|
141
|
+
if (!itemOutput)
|
|
142
|
+
return indexedOutput;
|
|
143
|
+
if (!indexedOutput)
|
|
144
|
+
return itemOutput;
|
|
145
|
+
if (itemOutput === indexedOutput)
|
|
146
|
+
return itemOutput;
|
|
147
|
+
return this.mergeOutputs(itemOutput, indexedOutput);
|
|
148
|
+
}
|
|
149
|
+
resolveOutput(itemIdValue, outputIndexValue) {
|
|
150
|
+
const itemId = typeof itemIdValue === "string" && itemIdValue.length > 0
|
|
151
|
+
? itemIdValue : null;
|
|
152
|
+
const outputIndex = readOutputIndex(outputIndexValue);
|
|
153
|
+
const itemOutput = itemId === null ? undefined : this.byItemId.get(itemId);
|
|
154
|
+
const indexedOutput = outputIndex === null ? undefined : this.byOutputIndex.get(outputIndex);
|
|
155
|
+
let output = this.reconcileOutputs(itemOutput, indexedOutput);
|
|
156
|
+
if (itemId === null && outputIndex === null)
|
|
157
|
+
output = this.unidentifiedOutput;
|
|
158
|
+
if (!output) {
|
|
159
|
+
output = { itemId, outputIndex, arrivalOrder: ++this.nextOutputOrder,
|
|
160
|
+
textByteCount: 0, pending: [] };
|
|
161
|
+
this.outputs.push(output);
|
|
162
|
+
}
|
|
163
|
+
if (itemId !== null) {
|
|
164
|
+
output.itemId = itemId;
|
|
165
|
+
this.byItemId.set(itemId, output);
|
|
166
|
+
}
|
|
167
|
+
if (outputIndex !== null) {
|
|
168
|
+
output.outputIndex = outputIndex;
|
|
169
|
+
this.byOutputIndex.set(outputIndex, output);
|
|
170
|
+
}
|
|
171
|
+
if (itemId === null && outputIndex === null)
|
|
172
|
+
this.unidentifiedOutput = output;
|
|
173
|
+
return output;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { pathToFileURL } from "node:url";
|
|
2
|
+
import { recoverRuntimeSetupEdit } from "../web-ui/local-runtime/runtime-setup-edit-recovery.js";
|
|
1
3
|
import { createModelGatewayServer, resolveModelGatewayPort, } from "./server/index.js";
|
|
2
4
|
export * from "./server/index.js";
|
|
3
5
|
export { buildOllamaPayload, buildOllamaRawPayload, resolveFormat, } from "./providers/ollama.js";
|
|
4
|
-
|
|
6
|
+
const invokedPath = process.argv[1] ? pathToFileURL(process.argv[1]).href : "";
|
|
7
|
+
if (import.meta.url === invokedPath) {
|
|
8
|
+
await recoverRuntimeSetupEdit(process.cwd());
|
|
5
9
|
const port = resolveModelGatewayPort();
|
|
6
10
|
createModelGatewayServer().listen(port, () => {
|
|
7
11
|
console.log(`MODEL GATEWAY RUNNING ${port}`);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ToolCatalogGroup, ToolDevelopmentRole, ToolEventPresentation, ToolNormalInvocationApproval, ToolNormalInvocationAttachmentInput, ToolNormalInvocationEffect, ToolNormalInvocationFixedValue, ToolNormalInvocationInput, ToolNormalInvocationPayload, ToolNormalInvocationOutputChannels, ToolPayloadChannelSpec, ToolRoutingCapability, ToolRuntimePathBinding } from "../capabilities/tool-types.js";
|
|
2
|
+
import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, type PluginPlatformDeclaration } from "./platform-compatibility.js";
|
|
2
3
|
export declare const AGENT_PLUGIN_MANIFEST_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
|
|
3
4
|
export declare const ABOT_RUNTIME_EXTENSION = "ai.abot.runtime";
|
|
4
5
|
export declare const ABOT_RUNTIME_EXTENSION_VERSION: 1;
|
|
@@ -48,6 +49,7 @@ export type AgentPluginManifest = Readonly<{
|
|
|
48
49
|
description?: string;
|
|
49
50
|
extensions: Readonly<{
|
|
50
51
|
[ABOT_RUNTIME_EXTENSION]: AbotRuntimePluginExtension;
|
|
52
|
+
[ABOT_PLUGIN_COMPATIBILITY_EXTENSION]?: PluginPlatformDeclaration;
|
|
51
53
|
[namespace: string]: unknown;
|
|
52
54
|
}>;
|
|
53
55
|
}>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, } from "./platform-compatibility.js";
|
|
1
2
|
export const AGENT_PLUGIN_MANIFEST_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
|
|
2
3
|
export const ABOT_RUNTIME_EXTENSION = "ai.abot.runtime";
|
|
3
4
|
export const ABOT_RUNTIME_EXTENSION_VERSION = 1;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const ABOT_PLUGIN_COMPATIBILITY_EXTENSION = "ai.abot.compatibility";
|
|
2
|
+
export declare const ABOT_PLUGIN_COMPATIBILITY_VERSION: 1;
|
|
3
|
+
export declare const PLUGIN_RUNTIME_PLATFORMS: readonly ["linux", "darwin", "win32"];
|
|
4
|
+
export type PluginRuntimePlatform = (typeof PLUGIN_RUNTIME_PLATFORMS)[number];
|
|
5
|
+
/** The OS running Runtime, independent of a connected computer's OS. */
|
|
6
|
+
export type PluginPlatformDeclaration = Readonly<{
|
|
7
|
+
version: typeof ABOT_PLUGIN_COMPATIBILITY_VERSION;
|
|
8
|
+
runtimePlatforms: readonly PluginRuntimePlatform[];
|
|
9
|
+
}>;
|
|
10
|
+
export type PluginPlatformCompatibility = Readonly<{
|
|
11
|
+
supported: boolean;
|
|
12
|
+
status: "declared" | "legacy" | "unsupported" | "undeclared";
|
|
13
|
+
runtimePlatform: NodeJS.Platform;
|
|
14
|
+
runtimePlatforms?: readonly PluginRuntimePlatform[];
|
|
15
|
+
reason?: string;
|
|
16
|
+
}>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** Shared computer access. Import this subpath only when your plugin uses the host. */
|
|
2
|
+
export { HOST_SECRET_PROTECTION_CAPABILITY } from "../computer-access/companion/secret-protection-protocol.js";
|
|
2
3
|
export { executeHostOperation, readHostStatus, } from "../computer-access/companion/broker-client.js";
|
|
3
4
|
export { HOST_OPERATIONS, type HostIdentity, type HostOperation, type HostStatus, isHostIdentifier, isHostIdentity, isHostOperation, } from "../computer-access/companion/protocol.js";
|
|
4
5
|
export { computerFields, computerInputError, computerRecord, computerText, readNativeComputerAction, readPhysicalRectangle, } from "../computer-access/computer/action-input.js";
|
|
@@ -19,3 +20,6 @@ export type { SystemProcessResult } from "../computer-access/contracts.js";
|
|
|
19
20
|
export { createSystemOutputCapture, type SystemOutputReceipt } from "../computer-access/command-output-capture.js";
|
|
20
21
|
export { DEFAULT_SYSTEM_OUTPUT_RETENTION_MS, scheduleSystemOutputCleanup } from "../computer-access/command-output-retention.js";
|
|
21
22
|
export { SYSTEM_OUTPUT_CAPABILITY, SYSTEM_OUTPUT_CHUNK_BYTES, readSystemOutputTransfer } from "../computer-access/companion/command-output-protocol.js";
|
|
23
|
+
export type { SystemResultProtection } from "../computer-access/system-result-protection.js";
|
|
24
|
+
export type { SystemApplication } from "../computer-access/contracts.js";
|
|
25
|
+
export type { SystemApplicationCatalog, SystemApplicationCatalogScope } from "../computer-access/application-catalog.js";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** Shared computer access. Import this subpath only when your plugin uses the host. */
|
|
2
|
+
export { HOST_SECRET_PROTECTION_CAPABILITY } from "../computer-access/companion/secret-protection-protocol.js";
|
|
2
3
|
export { executeHostOperation, readHostStatus, } from "../computer-access/companion/broker-client.js";
|
|
3
4
|
export { HOST_OPERATIONS, isHostIdentifier, isHostIdentity, isHostOperation, } from "../computer-access/companion/protocol.js";
|
|
4
5
|
export { computerFields, computerInputError, computerRecord, computerText, readNativeComputerAction, readPhysicalRectangle, } from "../computer-access/computer/action-input.js";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/** Read-only helper. Never alters execution policy, retries, or reads through a fallback. */
|
|
3
|
+
export declare function runWindowsBoundedRead(request: Readonly<Record<string, unknown>>, maxBytes: number, signal?: AbortSignal, spawnProcess?: typeof spawn): Promise<string>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { WINDOWS_BOUNDED_READ_SOURCE } from "./read-script.js";
|
|
4
|
+
import { windowsReadAbortError, windowsReadError } from "./result.js";
|
|
5
|
+
const BOOTSTRAP = [
|
|
6
|
+
"$ErrorActionPreference='Stop'",
|
|
7
|
+
'if ($ExecutionContext.SessionState.LanguageMode -ne \'FullLanguage\') { Write-Output \'{"ok":false,"code":"filesystem_windows_policy_blocked"}\'; exit 0 }',
|
|
8
|
+
"$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
|
|
9
|
+
"[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
|
|
10
|
+
"[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
|
|
11
|
+
"$started=$false",
|
|
12
|
+
"try {",
|
|
13
|
+
"$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
|
|
14
|
+
"Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
|
|
15
|
+
"$started=$true",
|
|
16
|
+
"[Console]::Write([AbotFilesystem]::Run($envelope.request))",
|
|
17
|
+
'} catch { if ($started) { [Console]::Write(\'{"ok":false,"code":"filesystem_native_operation_failed"}\') } else { [Console]::Write(\'{"ok":false,"code":"filesystem_windows_helper_unavailable"}\') } }',
|
|
18
|
+
].join(";");
|
|
19
|
+
const UNAVAILABLE = '{"ok":false,"code":"filesystem_windows_helper_unavailable"}';
|
|
20
|
+
/** Read-only helper. Never alters execution policy, retries, or reads through a fallback. */
|
|
21
|
+
export async function runWindowsBoundedRead(request, maxBytes, signal, spawnProcess = spawn) {
|
|
22
|
+
if (signal?.aborted)
|
|
23
|
+
throw windowsReadAbortError();
|
|
24
|
+
const input = JSON.stringify({
|
|
25
|
+
source: WINDOWS_BOUNDED_READ_SOURCE,
|
|
26
|
+
request: JSON.stringify(request),
|
|
27
|
+
});
|
|
28
|
+
if (Buffer.byteLength(input) > 2 * 1024 * 1024)
|
|
29
|
+
throw windowsReadError("EINVAL");
|
|
30
|
+
const outputLimit = 4 * Math.ceil(Math.min(maxBytes, 2_147_483_647) / 3) + 4096;
|
|
31
|
+
const executable = join(process.env.SystemRoot ?? "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const child = spawnProcess(executable, ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP], { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
|
|
34
|
+
const chunks = [];
|
|
35
|
+
let byteCount = 0;
|
|
36
|
+
let failure;
|
|
37
|
+
let unavailable = false;
|
|
38
|
+
const stop = (error) => {
|
|
39
|
+
failure ??= error;
|
|
40
|
+
child.kill("SIGKILL");
|
|
41
|
+
};
|
|
42
|
+
const abort = () => stop(windowsReadAbortError());
|
|
43
|
+
const timer = setTimeout(() => stop(windowsReadError("ETIMEDOUT")), 15_000);
|
|
44
|
+
timer.unref();
|
|
45
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
46
|
+
child.stdout.on("data", (chunk) => {
|
|
47
|
+
if (failure)
|
|
48
|
+
return;
|
|
49
|
+
byteCount += chunk.length;
|
|
50
|
+
if (byteCount > outputLimit) {
|
|
51
|
+
stop(windowsReadError("EOVERFLOW"));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
chunks.push(chunk);
|
|
55
|
+
});
|
|
56
|
+
// Compiler/native diagnostics may contain private paths. Never expose them.
|
|
57
|
+
child.stderr.resume();
|
|
58
|
+
child.stdin.on("error", () => {
|
|
59
|
+
if (child.pid === undefined)
|
|
60
|
+
return;
|
|
61
|
+
stop(windowsReadError("EIO"));
|
|
62
|
+
});
|
|
63
|
+
child.once("error", () => {
|
|
64
|
+
if (child.pid === undefined) {
|
|
65
|
+
unavailable = true;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
stop(windowsReadError("EIO"));
|
|
69
|
+
});
|
|
70
|
+
child.once("close", (code) => {
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
signal?.removeEventListener("abort", abort);
|
|
73
|
+
if (failure) {
|
|
74
|
+
reject(failure);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (unavailable) {
|
|
78
|
+
resolve(UNAVAILABLE);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (code !== 0) {
|
|
82
|
+
reject(windowsReadError("EIO"));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
resolve(Buffer.concat(chunks).toString("utf8"));
|
|
86
|
+
});
|
|
87
|
+
if (signal?.aborted) {
|
|
88
|
+
abort();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
child.stdin.end(input, "utf8");
|
|
92
|
+
});
|
|
93
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WINDOWS_BOUNDED_READ_SOURCE: string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { WINDOWS_FILESYSTEM_NATIVE } from "../../shared/windows-file-io/native-script.js";
|
|
2
|
+
import { WINDOWS_FILESYSTEM_AUTHORITY } from "../../shared/windows-file-io/authority-script.js";
|
|
3
|
+
import { WINDOWS_FILE_READ_BYTES } from "../../shared/windows-file-io/read-bytes-script.js";
|
|
4
|
+
const BOUNDED_READ = String.raw `
|
|
5
|
+
public static partial class AbotFilesystem {
|
|
6
|
+
static object ReadBounded(Dictionary<string,object> request) {
|
|
7
|
+
long maximum;
|
|
8
|
+
if (!Int64.TryParse(Text(request, "maxBytes"), out maximum) || maximum < 0 ||
|
|
9
|
+
maximum > 9007199254740991L) throw new FsFault("filesystem_invalid_request");
|
|
10
|
+
string[] parts=Components(request);
|
|
11
|
+
if (parts.Length == 0) return Record("ok", false, "reason", "not_regular_file");
|
|
12
|
+
using (var chain=new DirectoryChain(request)) {
|
|
13
|
+
chain.Walk(parts, parts.Length-1, false);
|
|
14
|
+
using (var file=OpenHandle(chain.Current, parts[parts.Length-1], false, 1, 0x80000000, 1)) {
|
|
15
|
+
var expected=request["targetIdentity"] as Dictionary<string,object>;
|
|
16
|
+
if (expected == null || !MatchesIdentity(Identity(file), expected))
|
|
17
|
+
return Record("ok", false, "reason", "changed_during_read");
|
|
18
|
+
var before=Metadata(file);
|
|
19
|
+
long size=Convert.ToInt64(before["size"]);
|
|
20
|
+
// Both the byte array and the base64 JSON response must fit .NET strings.
|
|
21
|
+
if (size > maximum || size > (Int32.MaxValue-4096L)/4*3)
|
|
22
|
+
return Record("ok", false, "reason", "too_large", "byteCount", size);
|
|
23
|
+
var bytes=ReadBytes(file, 0, (int)size);
|
|
24
|
+
if (!SameMetadata(before, Metadata(file)))
|
|
25
|
+
return Record("ok", false, "reason", "changed_during_read");
|
|
26
|
+
return Record("ok", true, "bytes", Convert.ToBase64String(bytes), "byteCount", size);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
public static string Run(string input) {
|
|
31
|
+
var json=new JavaScriptSerializer { MaxJsonLength=Int32.MaxValue };
|
|
32
|
+
try { return json.Serialize(ReadBounded(json.Deserialize<Dictionary<string,object>>(input))); }
|
|
33
|
+
catch (FsFault error) { return json.Serialize(Record("ok", false, "code", error.Code)); }
|
|
34
|
+
catch { return json.Serialize(Record("ok", false, "code", "filesystem_native_operation_failed")); }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
export const WINDOWS_BOUNDED_READ_SOURCE = [
|
|
39
|
+
WINDOWS_FILESYSTEM_NATIVE,
|
|
40
|
+
WINDOWS_FILESYSTEM_AUTHORITY,
|
|
41
|
+
WINDOWS_FILE_READ_BYTES,
|
|
42
|
+
BOUNDED_READ,
|
|
43
|
+
].join("\n");
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BoundedRegularFileReadResult } from "../files.js";
|
|
2
|
+
export declare function readWindowsBoundedRegularFile(absolutePath: string, options: Readonly<{
|
|
3
|
+
maxBytes: number;
|
|
4
|
+
rootPath: string;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
}>): Promise<BoundedRegularFileReadResult>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { lstat, open, realpath } from "node:fs/promises";
|
|
2
|
+
import { win32 } from "node:path";
|
|
3
|
+
import { runWindowsBoundedRead } from "./process.js";
|
|
4
|
+
import { decodeWindowsReadResult, windowsReadAbortError } from "./result.js";
|
|
5
|
+
function isOutsideRoot(rootRelative) {
|
|
6
|
+
if (win32.isAbsolute(rootRelative))
|
|
7
|
+
return true;
|
|
8
|
+
if (rootRelative === "..")
|
|
9
|
+
return true;
|
|
10
|
+
return rootRelative.startsWith("..\\");
|
|
11
|
+
}
|
|
12
|
+
function identity(stats) {
|
|
13
|
+
return {
|
|
14
|
+
device: String(stats.dev),
|
|
15
|
+
inode: String(stats.ino),
|
|
16
|
+
birthtimeNs: String(stats.birthtimeNs),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function readWindowsBoundedRegularFile(absolutePath, options) {
|
|
20
|
+
const relativePath = win32.relative(options.rootPath, absolutePath);
|
|
21
|
+
if (isOutsideRoot(relativePath))
|
|
22
|
+
return Object.freeze({ ok: false, reason: "outside_root" });
|
|
23
|
+
if (relativePath === "")
|
|
24
|
+
return Object.freeze({ ok: false, reason: "not_regular_file" });
|
|
25
|
+
let root;
|
|
26
|
+
try {
|
|
27
|
+
const canonicalRoot = await realpath(options.rootPath);
|
|
28
|
+
root = await open(canonicalRoot, "r");
|
|
29
|
+
const rootStats = await root.stat({ bigint: true });
|
|
30
|
+
if (!rootStats.isDirectory() || rootStats.ino <= 0n)
|
|
31
|
+
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
32
|
+
// Metadata only: all content reads happen through the rooted native handles.
|
|
33
|
+
const targetPath = win32.resolve(canonicalRoot, relativePath);
|
|
34
|
+
const target = await lstat(targetPath, { bigint: true });
|
|
35
|
+
if (!target.isFile())
|
|
36
|
+
return Object.freeze({ ok: false, reason: "not_regular_file" });
|
|
37
|
+
const canonicalTarget = await realpath(targetPath);
|
|
38
|
+
if (isOutsideRoot(win32.relative(canonicalRoot, canonicalTarget)))
|
|
39
|
+
return Object.freeze({ ok: false, reason: "outside_root" });
|
|
40
|
+
if (options.signal?.aborted)
|
|
41
|
+
throw windowsReadAbortError();
|
|
42
|
+
const raw = await runWindowsBoundedRead({
|
|
43
|
+
rootPath: canonicalRoot,
|
|
44
|
+
relativePath: relativePath.split(win32.sep).join("/"),
|
|
45
|
+
rootIdentity: identity(rootStats),
|
|
46
|
+
targetIdentity: identity(target),
|
|
47
|
+
maxBytes: String(options.maxBytes),
|
|
48
|
+
}, options.maxBytes, options.signal);
|
|
49
|
+
if (options.signal?.aborted)
|
|
50
|
+
throw windowsReadAbortError();
|
|
51
|
+
return decodeWindowsReadResult(raw, options.maxBytes);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await root?.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BoundedRegularFileReadResult } from "../files.js";
|
|
2
|
+
export declare function windowsReadError(code: string): Error;
|
|
3
|
+
export declare function windowsReadAbortError(): Error;
|
|
4
|
+
export declare function decodeWindowsReadResult(raw: string, maxBytes: number): BoundedRegularFileReadResult;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export function windowsReadError(code) {
|
|
2
|
+
const error = new Error("The Windows safe file read failed (" + code + "). No fallback read was attempted.");
|
|
3
|
+
return Object.assign(error, { code });
|
|
4
|
+
}
|
|
5
|
+
export function windowsReadAbortError() {
|
|
6
|
+
const error = new Error("The file read was cancelled.");
|
|
7
|
+
error.name = "AbortError";
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
const FAILURE_REASONS = new Set([
|
|
11
|
+
"not_regular_file",
|
|
12
|
+
"too_large",
|
|
13
|
+
"changed_during_read",
|
|
14
|
+
"outside_root",
|
|
15
|
+
"safe_open_unsupported",
|
|
16
|
+
]);
|
|
17
|
+
function hasByteCount(value) {
|
|
18
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
19
|
+
}
|
|
20
|
+
function decodeNativeFailure(code) {
|
|
21
|
+
switch (code) {
|
|
22
|
+
case "filesystem_windows_policy_blocked":
|
|
23
|
+
case "filesystem_windows_helper_unavailable":
|
|
24
|
+
case "filesystem_safe_io_unsupported":
|
|
25
|
+
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
26
|
+
case "filesystem_path_changed":
|
|
27
|
+
case "filesystem_target_changed":
|
|
28
|
+
case "filesystem_read_changed":
|
|
29
|
+
case "filesystem_read_incomplete":
|
|
30
|
+
return Object.freeze({ ok: false, reason: "changed_during_read" });
|
|
31
|
+
case "file_too_large":
|
|
32
|
+
return Object.freeze({ ok: false, reason: "too_large" });
|
|
33
|
+
case "file_not_found": throw windowsReadError("ENOENT");
|
|
34
|
+
case "filesystem_access_denied": throw windowsReadError("EACCES");
|
|
35
|
+
default: throw windowsReadError("EIO");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function decodeWindowsReadResult(raw, maxBytes) {
|
|
39
|
+
let value;
|
|
40
|
+
try {
|
|
41
|
+
value = JSON.parse(raw);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw windowsReadError("EIO");
|
|
45
|
+
}
|
|
46
|
+
if (value?.ok === false && typeof value.code === "string")
|
|
47
|
+
return decodeNativeFailure(value.code);
|
|
48
|
+
if (value?.ok === false && FAILURE_REASONS.has(value.reason)) {
|
|
49
|
+
if (value.byteCount !== undefined && !hasByteCount(value.byteCount))
|
|
50
|
+
throw windowsReadError("EIO");
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
ok: false,
|
|
53
|
+
reason: value.reason,
|
|
54
|
+
...(value.byteCount !== undefined ? { byteCount: value.byteCount } : {}),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (value?.ok !== true || !hasByteCount(value.byteCount))
|
|
58
|
+
throw windowsReadError("EIO");
|
|
59
|
+
if (value.byteCount > maxBytes || typeof value.bytes !== "string")
|
|
60
|
+
throw windowsReadError("EIO");
|
|
61
|
+
if (value.bytes.length !== 4 * Math.ceil(value.byteCount / 3))
|
|
62
|
+
throw windowsReadError("EIO");
|
|
63
|
+
const bytes = Buffer.from(value.bytes, "base64");
|
|
64
|
+
if (bytes.length !== value.byteCount || bytes.toString("base64") !== value.bytes)
|
|
65
|
+
throw windowsReadError("EIO");
|
|
66
|
+
return Object.freeze({ ok: true, bytes, byteCount: value.byteCount });
|
|
67
|
+
}
|
|
@@ -24,6 +24,10 @@ export async function readBoundedRegularFile(absolutePath, options) {
|
|
|
24
24
|
throw new RangeError("maxBytes must be a non-negative safe integer");
|
|
25
25
|
}
|
|
26
26
|
throwIfAborted(options.signal);
|
|
27
|
+
if (process.platform === "win32") {
|
|
28
|
+
const { readWindowsBoundedRegularFile } = await import("./files-windows/read.js");
|
|
29
|
+
return readWindowsBoundedRegularFile(absolutePath, options);
|
|
30
|
+
}
|
|
27
31
|
if (typeof constants.O_NOFOLLOW !== "number") {
|
|
28
32
|
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
29
33
|
}
|
|
@@ -4,6 +4,7 @@ export * from "./parameters.js";
|
|
|
4
4
|
export * from "./paths.js";
|
|
5
5
|
export * from "./plugin.js";
|
|
6
6
|
export * from "./results.js";
|
|
7
|
+
export * from "./mutation-result.js";
|
|
7
8
|
export * from "./context-text-result.js";
|
|
8
9
|
export * from "../capabilities/tool-media.js";
|
|
9
10
|
export * from "./tool-availability-brief.js";
|
|
@@ -4,6 +4,7 @@ export * from "./parameters.js";
|
|
|
4
4
|
export * from "./paths.js";
|
|
5
5
|
export * from "./plugin.js";
|
|
6
6
|
export * from "./results.js";
|
|
7
|
+
export * from "./mutation-result.js";
|
|
7
8
|
export * from "./context-text-result.js";
|
|
8
9
|
export * from "../capabilities/tool-media.js";
|
|
9
10
|
export * from "./tool-availability-brief.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolImplementationOutput } from "../plugin-contract/entrypoint.js";
|
|
2
|
+
import { type SuccessResultInput, type ToolResultBudget } from "./results.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reports a mutation already confirmed by the owning plugin. This helper
|
|
5
|
+
* preserves its receipt; it does not execute or independently verify a change.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mutationSuccessResult(input: SuccessResultInput, resultBudget?: ToolResultBudget): ToolImplementationOutput;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { successResult, } from "./results.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reports a mutation already confirmed by the owning plugin. This helper
|
|
4
|
+
* preserves its receipt; it does not execute or independently verify a change.
|
|
5
|
+
*/
|
|
6
|
+
export function mutationSuccessResult(input, resultBudget) {
|
|
7
|
+
return successResult({
|
|
8
|
+
...input,
|
|
9
|
+
data: { ...input.data, mutationEvidence: true },
|
|
10
|
+
}, resultBudget);
|
|
11
|
+
}
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { removeEmptyLockTree, removeObservedOwner } from "./cleanup.js";
|
|
3
3
|
import { fileSystemErrorCode, INCOMPLETE_LOCK_GRACE_MS, LOCK_ACQUIRE_TIMEOUT_MS, LOCK_RETRY_DELAY_MS, ownerFileName, } from "./contracts.js";
|
|
4
4
|
import { installLockDirectory } from "./install.js";
|
|
5
|
+
import { isWindowsLockReadDenial } from "./path-observation.js";
|
|
5
6
|
import { readLockSnapshot } from "./snapshot.js";
|
|
6
7
|
import { removeObservedOwnerSynchronously } from "./synchronous-release.js";
|
|
7
8
|
export async function acquireFileLock(lockPath, options) {
|
|
@@ -18,7 +19,7 @@ export async function acquireFileLock(lockPath, options) {
|
|
|
18
19
|
catch (error) {
|
|
19
20
|
if (!isLockContention(error))
|
|
20
21
|
throw error;
|
|
21
|
-
const removed = await removeAbandonedLock(lockPath, processIsAlive);
|
|
22
|
+
const removed = await removeAbandonedLock(lockPath, processIsAlive, deadline, retryDelayMs);
|
|
22
23
|
if (removed)
|
|
23
24
|
continue;
|
|
24
25
|
if (Date.now() >= deadline) {
|
|
@@ -45,8 +46,8 @@ function createRelease(lockPath, token, releaseMode) {
|
|
|
45
46
|
function requiresSynchronousRelease(mode) {
|
|
46
47
|
return mode === "synchronous";
|
|
47
48
|
}
|
|
48
|
-
async function removeAbandonedLock(lockPath, processIsAlive) {
|
|
49
|
-
const snapshot = await
|
|
49
|
+
async function removeAbandonedLock(lockPath, processIsAlive, deadline, retryDelayMs) {
|
|
50
|
+
const snapshot = await readContendedSnapshot(lockPath, deadline, retryDelayMs);
|
|
50
51
|
if (!snapshot)
|
|
51
52
|
return true;
|
|
52
53
|
if (snapshot.kind === "legacy_file" || !snapshot.reclaimable)
|
|
@@ -64,6 +65,22 @@ async function removeAbandonedLock(lockPath, processIsAlive) {
|
|
|
64
65
|
}
|
|
65
66
|
return removeEmptyLockTree(lockPath, snapshot.hasLeaseDirectory);
|
|
66
67
|
}
|
|
68
|
+
async function readContendedSnapshot(lockPath, deadline, retryDelayMs) {
|
|
69
|
+
for (;;) {
|
|
70
|
+
try {
|
|
71
|
+
return await readLockSnapshot(lockPath);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (!isWindowsLockReadDenial(error))
|
|
75
|
+
throw error;
|
|
76
|
+
if (Date.now() >= deadline)
|
|
77
|
+
throw error;
|
|
78
|
+
// Windows can deny a pending deletion while stat still sees the directory.
|
|
79
|
+
// Wait within the acquisition budget; an unreadable owner is never reclaimed.
|
|
80
|
+
await delay(Math.min(retryDelayMs, Math.max(deadline - Date.now(), 0)));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
67
84
|
async function hasLiveObservedOwner(snapshot, processIsAlive) {
|
|
68
85
|
if (snapshot.ownerPid === undefined)
|
|
69
86
|
return false;
|