@abot-ai/runtime 1.7.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +216 -222
- package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
- package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/capabilities/tool-types.d.ts +4 -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/protocol/message-contract.d.ts +1 -0
- package/dist/src/model-gateway/protocol/message-contract.js +1 -1
- 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/chat-handler.js +5 -7
- package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
- package/dist/src/model-gateway/server/chat-stream-response.js +25 -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/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
- 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/capabilities/tool-availability.js +6 -0
- package/dist/src/runtime/context/capability-brief.d.ts +2 -2
- package/dist/src/runtime/context/capability-brief.js +3 -3
- package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
- package/dist/src/runtime/context/capability-descriptions.js +57 -20
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
- package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
- package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
- package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
- package/dist/src/runtime/long-term-memory/projection.js +1 -1
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
- package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
- package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
- package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
- package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
- package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
- package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
- package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
- package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
- package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -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-projection.js +3 -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/capability-execution-freshness.js +6 -1
- package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/request/root-contract.d.ts +2 -0
- package/dist/src/runtime/request/root-execution-kernel.js +1 -0
- package/dist/src/runtime/request/runner.js +9 -3
- package/dist/src/runtime/request/supervisor-root-execution.js +6 -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/contracts.d.ts +10 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
- package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
- package/dist/src/runtime/steps/execution-agent/format.js +4 -3
- package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/input.js +22 -1
- package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
- package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
- package/dist/src/runtime/steps/execution-agent/run.js +4 -1
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
- package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
- 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/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
- package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
- package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
- package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
- package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
- 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/ARCHITECTURE.md +1 -1
- 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 +54 -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/automations/timeline.js +3 -2
- 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/dashboard/compact-layout.js +137 -0
- package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
- package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
- package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
- package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
- package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
- 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/operations-summary.js +2 -1
- 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-widget-preview.js +32 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
- 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/details.js +3 -2
- 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/panel.js +1 -1
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
- package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
- package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
- package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
- 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 +6 -3
- package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/computer-access-feature.js +13 -1
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +11 -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/operations-controller.js +2 -1
- 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 +12 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -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 +18 -5
- 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/95-home-widgets.css +109 -0
- package/dist/src/web-ui/app/styles.css +3 -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 +174 -28
- 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 +5 -1
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +2 -1
- 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 +2 -1
- 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 +7 -3
- 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 +2 -1
- 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 +2 -1
- 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 +5 -1
- 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 +2 -1
- 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 +6 -2
- 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 +9 -3
- 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 +5 -1
|
@@ -6,6 +6,14 @@ var __defProp = Object.defineProperty;
|
|
|
6
6
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
7
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __esm = (fn, res, err) => function __init() {
|
|
10
|
+
if (err) throw err[0];
|
|
11
|
+
try {
|
|
12
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
13
|
+
} catch (e) {
|
|
14
|
+
throw err = [e], e;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
9
17
|
var __export = (target, all) => {
|
|
10
18
|
for (var name in all)
|
|
11
19
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -20,6 +28,556 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
20
28
|
};
|
|
21
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
30
|
|
|
31
|
+
// src/shared/windows-file-io/native-script.ts
|
|
32
|
+
var WINDOWS_FILESYSTEM_NATIVE;
|
|
33
|
+
var init_native_script = __esm({
|
|
34
|
+
"src/shared/windows-file-io/native-script.ts"() {
|
|
35
|
+
"use strict";
|
|
36
|
+
WINDOWS_FILESYSTEM_NATIVE = String.raw`
|
|
37
|
+
using System;
|
|
38
|
+
using System.IO;
|
|
39
|
+
using System.Text;
|
|
40
|
+
using System.Linq;
|
|
41
|
+
using System.Collections.Generic;
|
|
42
|
+
using System.ComponentModel;
|
|
43
|
+
using System.Runtime.InteropServices;
|
|
44
|
+
using System.Security.AccessControl;
|
|
45
|
+
using System.Security.Principal;
|
|
46
|
+
using System.Web.Script.Serialization;
|
|
47
|
+
using Microsoft.Win32.SafeHandles;
|
|
48
|
+
|
|
49
|
+
public sealed class FsFault : Exception {
|
|
50
|
+
public readonly string Code;
|
|
51
|
+
public FsFault(string code) : base(code) { Code = code; }
|
|
52
|
+
}
|
|
53
|
+
public static partial class AbotFilesystem {
|
|
54
|
+
[StructLayout(LayoutKind.Sequential)] struct UnicodeString { public ushort Length, MaximumLength; public IntPtr Buffer; }
|
|
55
|
+
[StructLayout(LayoutKind.Sequential)] struct ObjectAttributes {
|
|
56
|
+
public int Length; public IntPtr Root, Name; public uint Attributes; public IntPtr Security, Qos;
|
|
57
|
+
}
|
|
58
|
+
[StructLayout(LayoutKind.Sequential)] struct IoStatus { public IntPtr Status, Information; }
|
|
59
|
+
[StructLayout(LayoutKind.Sequential)] struct BasicInfo {
|
|
60
|
+
public long Created, Accessed, Modified, Changed; public uint Attributes;
|
|
61
|
+
}
|
|
62
|
+
[StructLayout(LayoutKind.Sequential)] struct FileInfo {
|
|
63
|
+
public uint Attributes; public System.Runtime.InteropServices.ComTypes.FILETIME Created, Accessed, Modified;
|
|
64
|
+
public uint Volume, SizeHigh, SizeLow, Links, IndexHigh, IndexLow;
|
|
65
|
+
}
|
|
66
|
+
[DllImport("ntdll.dll")] static extern int NtCreateFile(out SafeFileHandle file, uint access,
|
|
67
|
+
ref ObjectAttributes attributes, out IoStatus status, IntPtr allocation, uint fileAttributes,
|
|
68
|
+
uint share, uint disposition, uint options, IntPtr ea, uint eaLength);
|
|
69
|
+
[DllImport("ntdll.dll")] static extern uint RtlNtStatusToDosError(int status);
|
|
70
|
+
[DllImport("ntdll.dll")] static extern int NtSetInformationFile(SafeFileHandle file,
|
|
71
|
+
out IoStatus status, IntPtr info, uint length, int kind);
|
|
72
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandle(SafeFileHandle file, out FileInfo info);
|
|
73
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandleEx(SafeFileHandle file, int kind, IntPtr data, uint length);
|
|
74
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFileInformationByHandle(SafeFileHandle file, int kind, ref BasicInfo info, uint length);
|
|
75
|
+
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern uint GetFinalPathNameByHandle(SafeFileHandle file, StringBuilder name, uint length, uint flags);
|
|
76
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFilePointerEx(SafeFileHandle file, long position, out long result, uint method);
|
|
77
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool ReadFile(SafeFileHandle file, byte[] bytes, uint count, out uint read, IntPtr overlapped);
|
|
78
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool WriteFile(SafeFileHandle file, byte[] bytes, uint count, out uint written, IntPtr overlapped);
|
|
79
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool FlushFileBuffers(SafeFileHandle file);
|
|
80
|
+
[DllImport("advapi32.dll")] static extern uint GetSecurityInfo(SafeFileHandle file, int kind, uint information,
|
|
81
|
+
out IntPtr owner, out IntPtr group, out IntPtr dacl, out IntPtr sacl, out IntPtr descriptor);
|
|
82
|
+
[DllImport("advapi32.dll")] static extern uint SetSecurityInfo(SafeFileHandle file, int kind, uint information,
|
|
83
|
+
IntPtr owner, IntPtr group, IntPtr dacl, IntPtr sacl);
|
|
84
|
+
[DllImport("advapi32.dll", SetLastError=true)] static extern bool GetSecurityDescriptorControl(IntPtr descriptor, out ushort control, out uint revision);
|
|
85
|
+
[DllImport("kernel32.dll")] static extern IntPtr LocalFree(IntPtr value);
|
|
86
|
+
|
|
87
|
+
static void Check(bool success) { if (!success) NativeFailure((uint)Marshal.GetLastWin32Error()); }
|
|
88
|
+
static bool IsNotDirectoryError(uint code) { return code == 267; } // ERROR_DIRECTORY
|
|
89
|
+
static void NativeFailure(uint code) {
|
|
90
|
+
if (IsNotDirectoryError(code)) throw new FsFault("not_a_directory");
|
|
91
|
+
if (code == 2 || code == 3) throw new FsFault("file_not_found");
|
|
92
|
+
if (code == 80 || code == 183) throw new FsFault("filesystem_target_changed");
|
|
93
|
+
if (code == 5 || code == 32 || code == 33) throw new FsFault("filesystem_access_denied");
|
|
94
|
+
throw new FsFault("filesystem_native_operation_failed");
|
|
95
|
+
}
|
|
96
|
+
static void CheckNt(int status) { if (status < 0) NativeFailure(RtlNtStatusToDosError(status)); }
|
|
97
|
+
static SafeFileHandle OpenHandle(SafeFileHandle root, string name, bool directory,
|
|
98
|
+
uint disposition, uint access, uint share, byte[] securityDescriptor = null, bool deleteOnClose = false) {
|
|
99
|
+
IntPtr text = Marshal.StringToHGlobalUni(name), unicodePointer = IntPtr.Zero, securityPointer = IntPtr.Zero;
|
|
100
|
+
try {
|
|
101
|
+
int length = Encoding.Unicode.GetByteCount(name);
|
|
102
|
+
if (length > 65532) throw new FsFault("filesystem_invalid_path");
|
|
103
|
+
UnicodeString unicode = new UnicodeString { Length=(ushort)length, MaximumLength=(ushort)(length+2), Buffer=text };
|
|
104
|
+
unicodePointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UnicodeString)));
|
|
105
|
+
Marshal.StructureToPtr(unicode, unicodePointer, false);
|
|
106
|
+
if (securityDescriptor != null) {
|
|
107
|
+
securityPointer = Marshal.AllocHGlobal(securityDescriptor.Length);
|
|
108
|
+
Marshal.Copy(securityDescriptor, 0, securityPointer, securityDescriptor.Length);
|
|
109
|
+
}
|
|
110
|
+
ObjectAttributes attributes = new ObjectAttributes {
|
|
111
|
+
Length=Marshal.SizeOf(typeof(ObjectAttributes)), Root=root == null ? IntPtr.Zero : root.DangerousGetHandle(),
|
|
112
|
+
Name=unicodePointer, Attributes=0x40, Security=securityPointer
|
|
113
|
+
};
|
|
114
|
+
SafeFileHandle file;
|
|
115
|
+
IoStatus status;
|
|
116
|
+
int result = NtCreateFile(out file, access | 0x100000, ref attributes, out status,
|
|
117
|
+
IntPtr.Zero, 0x80, share, disposition, 0x200020u | (directory ? 1u : 0x40u) | (deleteOnClose ? 0x1000u : 0u), IntPtr.Zero, 0);
|
|
118
|
+
if (result < 0) { if (file != null) file.Dispose(); CheckNt(result); }
|
|
119
|
+
try {
|
|
120
|
+
FileInfo info; Check(GetFileInformationByHandle(file, out info));
|
|
121
|
+
if ((info.Attributes & 0x400) != 0) throw new FsFault("filesystem_path_changed");
|
|
122
|
+
if (((info.Attributes & 0x10) != 0) != directory) throw new FsFault("filesystem_path_changed");
|
|
123
|
+
return file;
|
|
124
|
+
} catch { file.Dispose(); throw; }
|
|
125
|
+
} finally {
|
|
126
|
+
if (securityPointer != IntPtr.Zero) Marshal.FreeHGlobal(securityPointer);
|
|
127
|
+
if (unicodePointer != IntPtr.Zero) Marshal.FreeHGlobal(unicodePointer);
|
|
128
|
+
Marshal.FreeHGlobal(text);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
static BasicInfo Basic(SafeFileHandle file) {
|
|
132
|
+
IntPtr buffer = Marshal.AllocHGlobal(40);
|
|
133
|
+
try { Check(GetFileInformationByHandleEx(file, 0, buffer, 40)); return (BasicInfo)Marshal.PtrToStructure(buffer, typeof(BasicInfo)); }
|
|
134
|
+
finally { Marshal.FreeHGlobal(buffer); }
|
|
135
|
+
}
|
|
136
|
+
static Dictionary<string,object> Record(params object[] pairs) {
|
|
137
|
+
var result = new Dictionary<string,object>();
|
|
138
|
+
for (int i=0;i<pairs.Length;i+=2) result.Add((string)pairs[i], pairs[i+1]);
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
static string Text(Dictionary<string,object> request, string key) {
|
|
142
|
+
object value;
|
|
143
|
+
if (!request.TryGetValue(key, out value) || !(value is string)) throw new FsFault("filesystem_invalid_request");
|
|
144
|
+
return (string)value;
|
|
145
|
+
}
|
|
146
|
+
static int Limit(Dictionary<string,object> request, string key, int maximum) {
|
|
147
|
+
object value;
|
|
148
|
+
if (!request.TryGetValue(key, out value) || !(value is int)) throw new FsFault("filesystem_invalid_request");
|
|
149
|
+
int number = (int)value;
|
|
150
|
+
if (number < 0 || number > maximum) throw new FsFault("filesystem_invalid_request");
|
|
151
|
+
return number;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// src/shared/windows-file-io/authority-script.ts
|
|
159
|
+
var WINDOWS_FILESYSTEM_AUTHORITY;
|
|
160
|
+
var init_authority_script = __esm({
|
|
161
|
+
"src/shared/windows-file-io/authority-script.ts"() {
|
|
162
|
+
"use strict";
|
|
163
|
+
WINDOWS_FILESYSTEM_AUTHORITY = String.raw`
|
|
164
|
+
public static partial class AbotFilesystem {
|
|
165
|
+
static string NativePath(string path) {
|
|
166
|
+
string full = Path.GetFullPath(path);
|
|
167
|
+
if (full.StartsWith(@"\\?\") || full.StartsWith(@"\\.\")) throw new FsFault("filesystem_invalid_path");
|
|
168
|
+
if (full.StartsWith(@"\\")) return @"\??\UNC\" + full.Substring(2);
|
|
169
|
+
if (full.Length < 3 || full[1] != ':' || full[2] != '\\') throw new FsFault("filesystem_invalid_path");
|
|
170
|
+
return @"\??\" + full;
|
|
171
|
+
}
|
|
172
|
+
static string FinalPath(SafeFileHandle handle) {
|
|
173
|
+
var value = new StringBuilder(32768);
|
|
174
|
+
uint length = GetFinalPathNameByHandle(handle, value, (uint)value.Capacity, 0);
|
|
175
|
+
Check(length != 0);
|
|
176
|
+
if (length >= value.Capacity) throw new FsFault("filesystem_invalid_path");
|
|
177
|
+
string path = value.ToString();
|
|
178
|
+
if (path.StartsWith(@"\\?\UNC\")) return @"\\" + path.Substring(8);
|
|
179
|
+
if (path.StartsWith(@"\\?\")) return path.Substring(4);
|
|
180
|
+
throw new FsFault("filesystem_path_changed");
|
|
181
|
+
}
|
|
182
|
+
static SafeFileHandle OpenRoot(Dictionary<string,object> request) {
|
|
183
|
+
string path = Path.GetFullPath(Text(request, "rootPath"));
|
|
184
|
+
SafeFileHandle root = OpenHandle(null, NativePath(path), true, 1, 0x80000000, 7);
|
|
185
|
+
try {
|
|
186
|
+
if (!String.Equals(FinalPath(root).TrimEnd('\\'), path.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase))
|
|
187
|
+
throw new FsFault("filesystem_path_changed");
|
|
188
|
+
var expected = request["rootIdentity"] as Dictionary<string,object>;
|
|
189
|
+
if (expected == null || !MatchesIdentity(Identity(root), expected)) throw new FsFault("filesystem_path_changed");
|
|
190
|
+
return root;
|
|
191
|
+
} catch { root.Dispose(); throw; }
|
|
192
|
+
}
|
|
193
|
+
static string[] Components(Dictionary<string,object> request) {
|
|
194
|
+
string relative = Text(request, "relativePath");
|
|
195
|
+
if (relative == "") return new string[0];
|
|
196
|
+
string[] parts = relative.Split('/');
|
|
197
|
+
foreach (string part in parts) ValidateComponent(part);
|
|
198
|
+
return parts;
|
|
199
|
+
}
|
|
200
|
+
static void ValidateComponent(string name) {
|
|
201
|
+
if (name.Length == 0 || name == "." || name == "..") throw new FsFault("filesystem_invalid_path");
|
|
202
|
+
if (name.EndsWith(".") || name.EndsWith(" ")) throw new FsFault("filesystem_invalid_path");
|
|
203
|
+
foreach (char c in name) {
|
|
204
|
+
if (c < 32 || "\\/:*?\"<>|".IndexOf(c) >= 0) throw new FsFault("filesystem_invalid_path");
|
|
205
|
+
}
|
|
206
|
+
string stem = name.Split('.')[0].ToUpperInvariant();
|
|
207
|
+
if (stem == "CON" || stem == "PRN" || stem == "AUX" || stem == "NUL" ||
|
|
208
|
+
stem == "CONIN$" || stem == "CONOUT$") throw new FsFault("filesystem_invalid_path");
|
|
209
|
+
if (stem.Length == 4 && (stem.StartsWith("COM") || stem.StartsWith("LPT")) &&
|
|
210
|
+
"123456789\u00b9\u00b2\u00b3".IndexOf(stem[3]) >= 0) throw new FsFault("filesystem_invalid_path");
|
|
211
|
+
}
|
|
212
|
+
sealed class DirectoryChain : IDisposable {
|
|
213
|
+
public readonly SafeFileHandle Root;
|
|
214
|
+
readonly List<SafeFileHandle> children = new List<SafeFileHandle>();
|
|
215
|
+
public SafeFileHandle Current { get { return children.Count == 0 ? Root : children[children.Count-1]; } }
|
|
216
|
+
public DirectoryChain(Dictionary<string,object> request) { Root = OpenRoot(request); }
|
|
217
|
+
public void Walk(string[] parts, int count, bool create) {
|
|
218
|
+
for (int i=0;i<count;i++) children.Add(OpenHandle(Current, parts[i], true, create ? 3u : 1u, 0x80000000, 7));
|
|
219
|
+
}
|
|
220
|
+
public void Dispose() { for (int i=children.Count-1;i>=0;i--) children[i].Dispose(); Root.Dispose(); }
|
|
221
|
+
}
|
|
222
|
+
static ulong FileId(FileInfo info) {
|
|
223
|
+
ulong id=((ulong)info.IndexHigh << 32) | info.IndexLow;
|
|
224
|
+
if (id == 0) throw new FsFault("filesystem_safe_io_unsupported");
|
|
225
|
+
return id;
|
|
226
|
+
}
|
|
227
|
+
static Dictionary<string,object> Identity(SafeFileHandle file) {
|
|
228
|
+
FileInfo info; Check(GetFileInformationByHandle(file, out info));
|
|
229
|
+
BasicInfo basic = Basic(file);
|
|
230
|
+
return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
|
|
231
|
+
"birthtimeNs", ((basic.Created - 116444736000000000L) * 100L).ToString());
|
|
232
|
+
}
|
|
233
|
+
static bool MatchesIdentity(Dictionary<string,object> left, Dictionary<string,object> right) {
|
|
234
|
+
foreach (string key in new [] {"device", "inode", "birthtimeNs"}) {
|
|
235
|
+
if (!right.ContainsKey(key) || !Object.Equals(left[key], right[key])) return false;
|
|
236
|
+
}
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
static Dictionary<string,object> Metadata(SafeFileHandle file) {
|
|
240
|
+
FileInfo info; Check(GetFileInformationByHandle(file, out info));
|
|
241
|
+
BasicInfo basic = Basic(file);
|
|
242
|
+
ulong size = ((ulong)info.SizeHigh << 32) | info.SizeLow;
|
|
243
|
+
if (size > 9007199254740991UL) throw new FsFault("file_too_large");
|
|
244
|
+
return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
|
|
245
|
+
"size", (long)size, "mode", (basic.Attributes & 1) != 0 ? 292 : 438,
|
|
246
|
+
"modifiedNs", ((basic.Modified - 116444736000000000L) * 100L).ToString(),
|
|
247
|
+
"changedNs", ((basic.Changed - 116444736000000000L) * 100L).ToString());
|
|
248
|
+
}
|
|
249
|
+
static bool SameMetadata(Dictionary<string,object> left, Dictionary<string,object> right) {
|
|
250
|
+
foreach (string key in new [] {"device", "inode", "size", "mode", "modifiedNs", "changedNs"}) {
|
|
251
|
+
if (!right.ContainsKey(key) || Convert.ToString(left[key]) != Convert.ToString(right[key])) return false;
|
|
252
|
+
}
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
`;
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// src/shared/windows-file-io/read-bytes-script.ts
|
|
261
|
+
var WINDOWS_FILE_READ_BYTES;
|
|
262
|
+
var init_read_bytes_script = __esm({
|
|
263
|
+
"src/shared/windows-file-io/read-bytes-script.ts"() {
|
|
264
|
+
"use strict";
|
|
265
|
+
WINDOWS_FILE_READ_BYTES = String.raw`
|
|
266
|
+
public static partial class AbotFilesystem {
|
|
267
|
+
static byte[] ReadBytes(SafeFileHandle file, long position, int length) {
|
|
268
|
+
long actual; Check(SetFilePointerEx(file, position, out actual, 0));
|
|
269
|
+
if (actual != position) throw new FsFault("filesystem_read_incomplete");
|
|
270
|
+
var bytes = new byte[length];
|
|
271
|
+
int offset = 0;
|
|
272
|
+
while (offset < length) {
|
|
273
|
+
var chunk = new byte[Math.Min(65536, length-offset)];
|
|
274
|
+
uint read; Check(ReadFile(file, chunk, (uint)chunk.Length, out read, IntPtr.Zero));
|
|
275
|
+
if (read == 0 || read > chunk.Length) throw new FsFault("filesystem_read_incomplete");
|
|
276
|
+
Buffer.BlockCopy(chunk, 0, bytes, offset, (int)read);
|
|
277
|
+
offset += (int)read;
|
|
278
|
+
}
|
|
279
|
+
return bytes;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
`;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// src/plugin-sdk/files-windows/read-script.ts
|
|
287
|
+
var BOUNDED_READ, WINDOWS_BOUNDED_READ_SOURCE;
|
|
288
|
+
var init_read_script = __esm({
|
|
289
|
+
"src/plugin-sdk/files-windows/read-script.ts"() {
|
|
290
|
+
"use strict";
|
|
291
|
+
init_native_script();
|
|
292
|
+
init_authority_script();
|
|
293
|
+
init_read_bytes_script();
|
|
294
|
+
BOUNDED_READ = String.raw`
|
|
295
|
+
public static partial class AbotFilesystem {
|
|
296
|
+
static object ReadBounded(Dictionary<string,object> request) {
|
|
297
|
+
long maximum;
|
|
298
|
+
if (!Int64.TryParse(Text(request, "maxBytes"), out maximum) || maximum < 0 ||
|
|
299
|
+
maximum > 9007199254740991L) throw new FsFault("filesystem_invalid_request");
|
|
300
|
+
string[] parts=Components(request);
|
|
301
|
+
if (parts.Length == 0) return Record("ok", false, "reason", "not_regular_file");
|
|
302
|
+
using (var chain=new DirectoryChain(request)) {
|
|
303
|
+
chain.Walk(parts, parts.Length-1, false);
|
|
304
|
+
using (var file=OpenHandle(chain.Current, parts[parts.Length-1], false, 1, 0x80000000, 1)) {
|
|
305
|
+
var expected=request["targetIdentity"] as Dictionary<string,object>;
|
|
306
|
+
if (expected == null || !MatchesIdentity(Identity(file), expected))
|
|
307
|
+
return Record("ok", false, "reason", "changed_during_read");
|
|
308
|
+
var before=Metadata(file);
|
|
309
|
+
long size=Convert.ToInt64(before["size"]);
|
|
310
|
+
// Both the byte array and the base64 JSON response must fit .NET strings.
|
|
311
|
+
if (size > maximum || size > (Int32.MaxValue-4096L)/4*3)
|
|
312
|
+
return Record("ok", false, "reason", "too_large", "byteCount", size);
|
|
313
|
+
var bytes=ReadBytes(file, 0, (int)size);
|
|
314
|
+
if (!SameMetadata(before, Metadata(file)))
|
|
315
|
+
return Record("ok", false, "reason", "changed_during_read");
|
|
316
|
+
return Record("ok", true, "bytes", Convert.ToBase64String(bytes), "byteCount", size);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
public static string Run(string input) {
|
|
321
|
+
var json=new JavaScriptSerializer { MaxJsonLength=Int32.MaxValue };
|
|
322
|
+
try { return json.Serialize(ReadBounded(json.Deserialize<Dictionary<string,object>>(input))); }
|
|
323
|
+
catch (FsFault error) { return json.Serialize(Record("ok", false, "code", error.Code)); }
|
|
324
|
+
catch { return json.Serialize(Record("ok", false, "code", "filesystem_native_operation_failed")); }
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
`;
|
|
328
|
+
WINDOWS_BOUNDED_READ_SOURCE = [
|
|
329
|
+
WINDOWS_FILESYSTEM_NATIVE,
|
|
330
|
+
WINDOWS_FILESYSTEM_AUTHORITY,
|
|
331
|
+
WINDOWS_FILE_READ_BYTES,
|
|
332
|
+
BOUNDED_READ
|
|
333
|
+
].join("\n");
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// src/plugin-sdk/files-windows/result.ts
|
|
338
|
+
function windowsReadError(code) {
|
|
339
|
+
const error = new Error(
|
|
340
|
+
"The Windows safe file read failed (" + code + "). No fallback read was attempted."
|
|
341
|
+
);
|
|
342
|
+
return Object.assign(error, { code });
|
|
343
|
+
}
|
|
344
|
+
function windowsReadAbortError() {
|
|
345
|
+
const error = new Error("The file read was cancelled.");
|
|
346
|
+
error.name = "AbortError";
|
|
347
|
+
return error;
|
|
348
|
+
}
|
|
349
|
+
function hasByteCount(value) {
|
|
350
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
351
|
+
}
|
|
352
|
+
function decodeNativeFailure(code) {
|
|
353
|
+
switch (code) {
|
|
354
|
+
case "filesystem_windows_policy_blocked":
|
|
355
|
+
case "filesystem_windows_helper_unavailable":
|
|
356
|
+
case "filesystem_safe_io_unsupported":
|
|
357
|
+
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
358
|
+
case "filesystem_path_changed":
|
|
359
|
+
case "filesystem_target_changed":
|
|
360
|
+
case "filesystem_read_changed":
|
|
361
|
+
case "filesystem_read_incomplete":
|
|
362
|
+
return Object.freeze({ ok: false, reason: "changed_during_read" });
|
|
363
|
+
case "file_too_large":
|
|
364
|
+
return Object.freeze({ ok: false, reason: "too_large" });
|
|
365
|
+
case "file_not_found":
|
|
366
|
+
throw windowsReadError("ENOENT");
|
|
367
|
+
case "filesystem_access_denied":
|
|
368
|
+
throw windowsReadError("EACCES");
|
|
369
|
+
default:
|
|
370
|
+
throw windowsReadError("EIO");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function decodeWindowsReadResult(raw, maxBytes) {
|
|
374
|
+
let value;
|
|
375
|
+
try {
|
|
376
|
+
value = JSON.parse(raw);
|
|
377
|
+
} catch {
|
|
378
|
+
throw windowsReadError("EIO");
|
|
379
|
+
}
|
|
380
|
+
if (value?.ok === false && typeof value.code === "string")
|
|
381
|
+
return decodeNativeFailure(value.code);
|
|
382
|
+
if (value?.ok === false && FAILURE_REASONS.has(value.reason)) {
|
|
383
|
+
if (value.byteCount !== void 0 && !hasByteCount(value.byteCount))
|
|
384
|
+
throw windowsReadError("EIO");
|
|
385
|
+
return Object.freeze({
|
|
386
|
+
ok: false,
|
|
387
|
+
reason: value.reason,
|
|
388
|
+
...value.byteCount !== void 0 ? { byteCount: value.byteCount } : {}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
if (value?.ok !== true || !hasByteCount(value.byteCount))
|
|
392
|
+
throw windowsReadError("EIO");
|
|
393
|
+
if (value.byteCount > maxBytes || typeof value.bytes !== "string")
|
|
394
|
+
throw windowsReadError("EIO");
|
|
395
|
+
if (value.bytes.length !== 4 * Math.ceil(value.byteCount / 3))
|
|
396
|
+
throw windowsReadError("EIO");
|
|
397
|
+
const bytes = Buffer.from(value.bytes, "base64");
|
|
398
|
+
if (bytes.length !== value.byteCount || bytes.toString("base64") !== value.bytes)
|
|
399
|
+
throw windowsReadError("EIO");
|
|
400
|
+
return Object.freeze({ ok: true, bytes, byteCount: value.byteCount });
|
|
401
|
+
}
|
|
402
|
+
var FAILURE_REASONS;
|
|
403
|
+
var init_result = __esm({
|
|
404
|
+
"src/plugin-sdk/files-windows/result.ts"() {
|
|
405
|
+
"use strict";
|
|
406
|
+
FAILURE_REASONS = /* @__PURE__ */ new Set([
|
|
407
|
+
"not_regular_file",
|
|
408
|
+
"too_large",
|
|
409
|
+
"changed_during_read",
|
|
410
|
+
"outside_root",
|
|
411
|
+
"safe_open_unsupported"
|
|
412
|
+
]);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// src/plugin-sdk/files-windows/process.ts
|
|
417
|
+
async function runWindowsBoundedRead(request, maxBytes, signal, spawnProcess = import_node_child_process.spawn) {
|
|
418
|
+
if (signal?.aborted) throw windowsReadAbortError();
|
|
419
|
+
const input = JSON.stringify({
|
|
420
|
+
source: WINDOWS_BOUNDED_READ_SOURCE,
|
|
421
|
+
request: JSON.stringify(request)
|
|
422
|
+
});
|
|
423
|
+
if (Buffer.byteLength(input) > 2 * 1024 * 1024)
|
|
424
|
+
throw windowsReadError("EINVAL");
|
|
425
|
+
const outputLimit = 4 * Math.ceil(Math.min(maxBytes, 2147483647) / 3) + 4096;
|
|
426
|
+
const executable = (0, import_node_path.join)(
|
|
427
|
+
process.env.SystemRoot ?? "C:\\Windows",
|
|
428
|
+
"System32",
|
|
429
|
+
"WindowsPowerShell",
|
|
430
|
+
"v1.0",
|
|
431
|
+
"powershell.exe"
|
|
432
|
+
);
|
|
433
|
+
return new Promise((resolve, reject) => {
|
|
434
|
+
const child = spawnProcess(
|
|
435
|
+
executable,
|
|
436
|
+
["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP],
|
|
437
|
+
{ windowsHide: true, stdio: ["pipe", "pipe", "pipe"] }
|
|
438
|
+
);
|
|
439
|
+
const chunks = [];
|
|
440
|
+
let byteCount = 0;
|
|
441
|
+
let failure;
|
|
442
|
+
let unavailable = false;
|
|
443
|
+
const stop = (error) => {
|
|
444
|
+
failure ??= error;
|
|
445
|
+
child.kill("SIGKILL");
|
|
446
|
+
};
|
|
447
|
+
const abort = () => stop(windowsReadAbortError());
|
|
448
|
+
const timer = setTimeout(() => stop(windowsReadError("ETIMEDOUT")), 15e3);
|
|
449
|
+
timer.unref();
|
|
450
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
451
|
+
child.stdout.on("data", (chunk) => {
|
|
452
|
+
if (failure) return;
|
|
453
|
+
byteCount += chunk.length;
|
|
454
|
+
if (byteCount > outputLimit) {
|
|
455
|
+
stop(windowsReadError("EOVERFLOW"));
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
chunks.push(chunk);
|
|
459
|
+
});
|
|
460
|
+
child.stderr.resume();
|
|
461
|
+
child.stdin.on("error", () => {
|
|
462
|
+
if (child.pid === void 0) return;
|
|
463
|
+
stop(windowsReadError("EIO"));
|
|
464
|
+
});
|
|
465
|
+
child.once("error", () => {
|
|
466
|
+
if (child.pid === void 0) {
|
|
467
|
+
unavailable = true;
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
stop(windowsReadError("EIO"));
|
|
471
|
+
});
|
|
472
|
+
child.once("close", (code) => {
|
|
473
|
+
clearTimeout(timer);
|
|
474
|
+
signal?.removeEventListener("abort", abort);
|
|
475
|
+
if (failure) {
|
|
476
|
+
reject(failure);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
if (unavailable) {
|
|
480
|
+
resolve(UNAVAILABLE);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
if (code !== 0) {
|
|
484
|
+
reject(windowsReadError("EIO"));
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
resolve(Buffer.concat(chunks).toString("utf8"));
|
|
488
|
+
});
|
|
489
|
+
if (signal?.aborted) {
|
|
490
|
+
abort();
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
child.stdin.end(input, "utf8");
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
var import_node_child_process, import_node_path, BOOTSTRAP, UNAVAILABLE;
|
|
497
|
+
var init_process = __esm({
|
|
498
|
+
"src/plugin-sdk/files-windows/process.ts"() {
|
|
499
|
+
"use strict";
|
|
500
|
+
import_node_child_process = require("node:child_process");
|
|
501
|
+
import_node_path = require("node:path");
|
|
502
|
+
init_read_script();
|
|
503
|
+
init_result();
|
|
504
|
+
BOOTSTRAP = [
|
|
505
|
+
"$ErrorActionPreference='Stop'",
|
|
506
|
+
`if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage') { Write-Output '{"ok":false,"code":"filesystem_windows_policy_blocked"}'; exit 0 }`,
|
|
507
|
+
"$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
|
|
508
|
+
"[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
|
|
509
|
+
"[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
|
|
510
|
+
"$started=$false",
|
|
511
|
+
"try {",
|
|
512
|
+
"$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
|
|
513
|
+
"Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
|
|
514
|
+
"$started=$true",
|
|
515
|
+
"[Console]::Write([AbotFilesystem]::Run($envelope.request))",
|
|
516
|
+
`} catch { if ($started) { [Console]::Write('{"ok":false,"code":"filesystem_native_operation_failed"}') } else { [Console]::Write('{"ok":false,"code":"filesystem_windows_helper_unavailable"}') } }`
|
|
517
|
+
].join(";");
|
|
518
|
+
UNAVAILABLE = '{"ok":false,"code":"filesystem_windows_helper_unavailable"}';
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
// src/plugin-sdk/files-windows/read.ts
|
|
523
|
+
var read_exports = {};
|
|
524
|
+
__export(read_exports, {
|
|
525
|
+
readWindowsBoundedRegularFile: () => readWindowsBoundedRegularFile
|
|
526
|
+
});
|
|
527
|
+
function isOutsideRoot(rootRelative) {
|
|
528
|
+
if (import_node_path2.win32.isAbsolute(rootRelative)) return true;
|
|
529
|
+
if (rootRelative === "..") return true;
|
|
530
|
+
return rootRelative.startsWith("..\\");
|
|
531
|
+
}
|
|
532
|
+
function identity(stats) {
|
|
533
|
+
return {
|
|
534
|
+
device: String(stats.dev),
|
|
535
|
+
inode: String(stats.ino),
|
|
536
|
+
birthtimeNs: String(stats.birthtimeNs)
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
async function readWindowsBoundedRegularFile(absolutePath, options) {
|
|
540
|
+
const relativePath = import_node_path2.win32.relative(options.rootPath, absolutePath);
|
|
541
|
+
if (isOutsideRoot(relativePath)) return Object.freeze({ ok: false, reason: "outside_root" });
|
|
542
|
+
if (relativePath === "") return Object.freeze({ ok: false, reason: "not_regular_file" });
|
|
543
|
+
let root;
|
|
544
|
+
try {
|
|
545
|
+
const canonicalRoot = await (0, import_promises.realpath)(options.rootPath);
|
|
546
|
+
root = await (0, import_promises.open)(canonicalRoot, "r");
|
|
547
|
+
const rootStats = await root.stat({ bigint: true });
|
|
548
|
+
if (!rootStats.isDirectory() || rootStats.ino <= 0n)
|
|
549
|
+
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
550
|
+
const targetPath = import_node_path2.win32.resolve(canonicalRoot, relativePath);
|
|
551
|
+
const target = await (0, import_promises.lstat)(targetPath, { bigint: true });
|
|
552
|
+
if (!target.isFile()) return Object.freeze({ ok: false, reason: "not_regular_file" });
|
|
553
|
+
const canonicalTarget = await (0, import_promises.realpath)(targetPath);
|
|
554
|
+
if (isOutsideRoot(import_node_path2.win32.relative(canonicalRoot, canonicalTarget)))
|
|
555
|
+
return Object.freeze({ ok: false, reason: "outside_root" });
|
|
556
|
+
if (options.signal?.aborted) throw windowsReadAbortError();
|
|
557
|
+
const raw = await runWindowsBoundedRead({
|
|
558
|
+
rootPath: canonicalRoot,
|
|
559
|
+
relativePath: relativePath.split(import_node_path2.win32.sep).join("/"),
|
|
560
|
+
rootIdentity: identity(rootStats),
|
|
561
|
+
targetIdentity: identity(target),
|
|
562
|
+
maxBytes: String(options.maxBytes)
|
|
563
|
+
}, options.maxBytes, options.signal);
|
|
564
|
+
if (options.signal?.aborted) throw windowsReadAbortError();
|
|
565
|
+
return decodeWindowsReadResult(raw, options.maxBytes);
|
|
566
|
+
} finally {
|
|
567
|
+
await root?.close();
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
var import_promises, import_node_path2;
|
|
571
|
+
var init_read = __esm({
|
|
572
|
+
"src/plugin-sdk/files-windows/read.ts"() {
|
|
573
|
+
"use strict";
|
|
574
|
+
import_promises = require("node:fs/promises");
|
|
575
|
+
import_node_path2 = require("node:path");
|
|
576
|
+
init_process();
|
|
577
|
+
init_result();
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
|
|
23
581
|
// plugins/json-inspector/source/index.ts
|
|
24
582
|
var index_exports = {};
|
|
25
583
|
__export(index_exports, {
|
|
@@ -60,8 +618,8 @@ function sanitizeJsonText(value) {
|
|
|
60
618
|
|
|
61
619
|
// src/plugin-sdk/files.ts
|
|
62
620
|
var import_node_fs = require("node:fs");
|
|
63
|
-
var
|
|
64
|
-
var
|
|
621
|
+
var import_promises2 = require("node:fs/promises");
|
|
622
|
+
var import_node_path3 = require("node:path");
|
|
65
623
|
function throwIfAborted(signal) {
|
|
66
624
|
if (!signal?.aborted) return;
|
|
67
625
|
const error = new Error("The file read was cancelled.");
|
|
@@ -88,12 +646,16 @@ async function readBoundedRegularFile(absolutePath, options) {
|
|
|
88
646
|
throw new RangeError("maxBytes must be a non-negative safe integer");
|
|
89
647
|
}
|
|
90
648
|
throwIfAborted(options.signal);
|
|
649
|
+
if (process.platform === "win32") {
|
|
650
|
+
const { readWindowsBoundedRegularFile: readWindowsBoundedRegularFile2 } = await Promise.resolve().then(() => (init_read(), read_exports));
|
|
651
|
+
return readWindowsBoundedRegularFile2(absolutePath, options);
|
|
652
|
+
}
|
|
91
653
|
if (typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
|
|
92
654
|
return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
|
|
93
655
|
}
|
|
94
656
|
let handle;
|
|
95
657
|
try {
|
|
96
|
-
handle = await (0,
|
|
658
|
+
handle = await (0, import_promises2.open)(
|
|
97
659
|
absolutePath,
|
|
98
660
|
import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_NOFOLLOW
|
|
99
661
|
);
|
|
@@ -102,14 +664,14 @@ async function readBoundedRegularFile(absolutePath, options) {
|
|
|
102
664
|
return Object.freeze({ ok: false, reason: "not_regular_file" });
|
|
103
665
|
}
|
|
104
666
|
const [canonicalRoot, canonicalTarget] = await Promise.all([
|
|
105
|
-
(0,
|
|
106
|
-
(0,
|
|
667
|
+
(0, import_promises2.realpath)(options.rootPath),
|
|
668
|
+
(0, import_promises2.realpath)(absolutePath)
|
|
107
669
|
]);
|
|
108
|
-
const rootRelative = (0,
|
|
109
|
-
if (rootRelative === ".." || rootRelative.startsWith(`..${
|
|
670
|
+
const rootRelative = (0, import_node_path3.relative)(canonicalRoot, canonicalTarget);
|
|
671
|
+
if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path3.sep}`) || rootRelative.startsWith(import_node_path3.sep)) {
|
|
110
672
|
return Object.freeze({ ok: false, reason: "outside_root" });
|
|
111
673
|
}
|
|
112
|
-
const pathIdentity = await (0,
|
|
674
|
+
const pathIdentity = await (0, import_promises2.stat)(canonicalTarget, { bigint: true });
|
|
113
675
|
if (pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino || !pathIdentity.isFile()) {
|
|
114
676
|
return Object.freeze({ ok: false, reason: "changed_during_read" });
|
|
115
677
|
}
|
|
@@ -461,6 +1023,37 @@ function parseJsonErrorPosition(error, source) {
|
|
|
461
1023
|
});
|
|
462
1024
|
}
|
|
463
1025
|
|
|
1026
|
+
// plugins/json-inspector/source/read-failure.ts
|
|
1027
|
+
function jsonReadFailure(file, maxBytes) {
|
|
1028
|
+
switch (file.reason) {
|
|
1029
|
+
case "not_regular_file":
|
|
1030
|
+
return failureResult({
|
|
1031
|
+
errorCode: "json_target_not_file",
|
|
1032
|
+
message: "The requested JSON target is not a regular file."
|
|
1033
|
+
});
|
|
1034
|
+
case "too_large":
|
|
1035
|
+
return failureResult({
|
|
1036
|
+
errorCode: "json_file_too_large",
|
|
1037
|
+
message: "The requested file exceeds the " + maxBytes + "-byte JSON inspection limit."
|
|
1038
|
+
});
|
|
1039
|
+
case "outside_root":
|
|
1040
|
+
return failureResult({
|
|
1041
|
+
errorCode: "json_outside_root",
|
|
1042
|
+
message: "The requested file resolves outside its authorized root. Do not retry this target or bypass the path restriction."
|
|
1043
|
+
});
|
|
1044
|
+
case "safe_open_unsupported":
|
|
1045
|
+
return failureResult({
|
|
1046
|
+
errorCode: "json_safe_read_unavailable",
|
|
1047
|
+
message: "Safe file reading is unavailable on this system. On Windows, computer policy may block the required PowerShell/C# helper. Do not retry or bypass this restriction with another tool; ask the user to check the system requirements or contact their administrator."
|
|
1048
|
+
});
|
|
1049
|
+
case "changed_during_read":
|
|
1050
|
+
return failureResult({
|
|
1051
|
+
errorCode: "json_file_changed",
|
|
1052
|
+
message: "The requested JSON file changed while it was read."
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
|
|
464
1057
|
// plugins/json-inspector/source/index.ts
|
|
465
1058
|
var MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
466
1059
|
var MAX_DEPTH = 6;
|
|
@@ -487,26 +1080,10 @@ var index_default = defineRuntimePlugin((context) => {
|
|
|
487
1080
|
});
|
|
488
1081
|
const file = await readBoundedRegularFile(target.absolutePath, {
|
|
489
1082
|
maxBytes: MAX_FILE_BYTES,
|
|
490
|
-
rootPath: target.rootPath
|
|
1083
|
+
rootPath: target.rootPath,
|
|
1084
|
+
signal: executionContext?.abortSignal
|
|
491
1085
|
});
|
|
492
|
-
if (!file.ok
|
|
493
|
-
return failureResult({
|
|
494
|
-
errorCode: "json_target_not_file",
|
|
495
|
-
message: "The requested JSON target is not a regular file."
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
if (!file.ok && file.reason === "too_large") {
|
|
499
|
-
return failureResult({
|
|
500
|
-
errorCode: "json_file_too_large",
|
|
501
|
-
message: `The requested file exceeds the ${MAX_FILE_BYTES}-byte JSON inspection limit.`
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
if (!file.ok) {
|
|
505
|
-
return failureResult({
|
|
506
|
-
errorCode: "json_file_changed",
|
|
507
|
-
message: "The requested JSON file changed while it was read."
|
|
508
|
-
});
|
|
509
|
-
}
|
|
1086
|
+
if (!file.ok) return jsonReadFailure(file, MAX_FILE_BYTES);
|
|
510
1087
|
let source;
|
|
511
1088
|
try {
|
|
512
1089
|
source = new import_node_util.TextDecoder("utf-8", { fatal: true }).decode(
|
|
@@ -581,6 +1158,14 @@ var index_default = defineRuntimePlugin((context) => {
|
|
|
581
1158
|
}
|
|
582
1159
|
});
|
|
583
1160
|
} catch (error) {
|
|
1161
|
+
const readWasAborted = executionContext?.abortSignal?.aborted && error instanceof Error && error.name === "AbortError";
|
|
1162
|
+
if (readWasAborted) {
|
|
1163
|
+
return failureResult({
|
|
1164
|
+
errorCode: "json_inspection_cancelled",
|
|
1165
|
+
message: "JSON inspection was cancelled.",
|
|
1166
|
+
interruption: "aborted"
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
584
1169
|
return failureFromError(error, {
|
|
585
1170
|
fallbackCode: "json_inspection_failed",
|
|
586
1171
|
fallbackMessage: "JSON inspection failed.",
|