@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,13 +28,563 @@ 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/project-orientation/source/index.ts
|
|
24
582
|
var index_exports = {};
|
|
25
583
|
__export(index_exports, {
|
|
26
584
|
default: () => index_default
|
|
27
585
|
});
|
|
28
586
|
module.exports = __toCommonJS(index_exports);
|
|
29
|
-
var
|
|
587
|
+
var import_promises5 = require("node:fs/promises");
|
|
30
588
|
|
|
31
589
|
// src/plugin-sdk/bounds.ts
|
|
32
590
|
function boundText(value, options) {
|
|
@@ -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
|
}
|
|
@@ -352,9 +914,60 @@ function failureFromError(error, options) {
|
|
|
352
914
|
// src/capabilities/tool-media.ts
|
|
353
915
|
var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
|
|
354
916
|
|
|
917
|
+
// plugins/project-orientation/source/inspection-failure.ts
|
|
918
|
+
var ProjectInspectionError = class extends Error {
|
|
919
|
+
constructor(code, message) {
|
|
920
|
+
super(message);
|
|
921
|
+
this.code = code;
|
|
922
|
+
this.name = "ProjectInspectionError";
|
|
923
|
+
}
|
|
924
|
+
code;
|
|
925
|
+
};
|
|
926
|
+
function throwIfProjectInspectionCancelled(signal) {
|
|
927
|
+
signal?.throwIfAborted();
|
|
928
|
+
}
|
|
929
|
+
function isProjectInspectionCancelled(error, signal) {
|
|
930
|
+
if (signal?.aborted) return true;
|
|
931
|
+
if (!(error instanceof Error)) return false;
|
|
932
|
+
if (error.name === "AbortError") return true;
|
|
933
|
+
return "code" in error && error.code === "ABORT_ERR";
|
|
934
|
+
}
|
|
935
|
+
function failProjectManifestRead(file) {
|
|
936
|
+
if (file.reason === "safe_open_unsupported") {
|
|
937
|
+
throw new ProjectInspectionError(
|
|
938
|
+
"project_safe_read_unavailable",
|
|
939
|
+
"Safe project manifest 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 system requirements or contact their administrator."
|
|
940
|
+
);
|
|
941
|
+
}
|
|
942
|
+
if (file.reason === "outside_root") {
|
|
943
|
+
throw new ProjectInspectionError(
|
|
944
|
+
"project_outside_root",
|
|
945
|
+
"The project manifest resolves outside its authorized root. Do not retry this target or bypass the path restriction."
|
|
946
|
+
);
|
|
947
|
+
}
|
|
948
|
+
throw new Error("Project manifest changed while it was being read.");
|
|
949
|
+
}
|
|
950
|
+
function projectInspectionFailure(error, signal) {
|
|
951
|
+
if (isProjectInspectionCancelled(error, signal)) {
|
|
952
|
+
return failureResult({
|
|
953
|
+
errorCode: "project_inspection_cancelled",
|
|
954
|
+
message: "Project inspection was cancelled.",
|
|
955
|
+
interruption: "aborted"
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
if (error instanceof ProjectInspectionError) {
|
|
959
|
+
return failureResult({ errorCode: error.code, message: error.message });
|
|
960
|
+
}
|
|
961
|
+
return failureFromError(error, {
|
|
962
|
+
fallbackCode: "project_orientation_failed",
|
|
963
|
+
fallbackMessage: "Project orientation failed.",
|
|
964
|
+
operation: "inspect_project"
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
|
|
355
968
|
// plugins/project-orientation/source/manifest-summary.ts
|
|
356
|
-
var
|
|
357
|
-
var
|
|
969
|
+
var import_promises3 = require("node:fs/promises");
|
|
970
|
+
var import_node_path4 = require("node:path");
|
|
358
971
|
var PACKAGE_JSON_MAX_BYTES = 256 * 1024;
|
|
359
972
|
var PACKAGE_SCRIPT_LIMIT = 100;
|
|
360
973
|
var MANIFEST_IDENTITY_MAX_CHARS = 256;
|
|
@@ -370,7 +983,7 @@ var KNOWN_MANIFESTS = Object.freeze([
|
|
|
370
983
|
"vite.config.js"
|
|
371
984
|
]);
|
|
372
985
|
function logicalChild(parent, name) {
|
|
373
|
-
return parent.logicalPath === "." ? name :
|
|
986
|
+
return parent.logicalPath === "." ? name : import_node_path4.posix.join(parent.logicalPath, name);
|
|
374
987
|
}
|
|
375
988
|
function stringField(record, key) {
|
|
376
989
|
const value = record[key];
|
|
@@ -385,7 +998,7 @@ async function existingChild(context, root, name) {
|
|
|
385
998
|
requirePath: true,
|
|
386
999
|
allowedLocations: ["agent_work", "workspace"]
|
|
387
1000
|
});
|
|
388
|
-
const info = await (0,
|
|
1001
|
+
const info = await (0, import_promises3.stat)(child.absolutePath);
|
|
389
1002
|
return info.isFile() ? child : void 0;
|
|
390
1003
|
} catch (error) {
|
|
391
1004
|
if (isRuntimeToolPathError(error)) throw error;
|
|
@@ -394,9 +1007,10 @@ async function existingChild(context, root, name) {
|
|
|
394
1007
|
throw error;
|
|
395
1008
|
}
|
|
396
1009
|
}
|
|
397
|
-
async function readProjectManifests(context, root) {
|
|
1010
|
+
async function readProjectManifests(context, root, signal) {
|
|
398
1011
|
const summaries = [];
|
|
399
1012
|
for (const name of KNOWN_MANIFESTS) {
|
|
1013
|
+
throwIfProjectInspectionCancelled(signal);
|
|
400
1014
|
const target = await existingChild(context, root, name);
|
|
401
1015
|
if (!target) continue;
|
|
402
1016
|
if (name !== "package.json") {
|
|
@@ -405,7 +1019,8 @@ async function readProjectManifests(context, root) {
|
|
|
405
1019
|
}
|
|
406
1020
|
const file = await readBoundedRegularFile(target.absolutePath, {
|
|
407
1021
|
maxBytes: PACKAGE_JSON_MAX_BYTES,
|
|
408
|
-
rootPath: target.rootPath
|
|
1022
|
+
rootPath: target.rootPath,
|
|
1023
|
+
...signal ? { signal } : {}
|
|
409
1024
|
});
|
|
410
1025
|
if (!file.ok && file.reason === "too_large") {
|
|
411
1026
|
summaries.push(
|
|
@@ -413,8 +1028,7 @@ async function readProjectManifests(context, root) {
|
|
|
413
1028
|
);
|
|
414
1029
|
continue;
|
|
415
1030
|
}
|
|
416
|
-
if (!file.ok)
|
|
417
|
-
throw new Error("Project manifest changed while it was being read.");
|
|
1031
|
+
if (!file.ok) failProjectManifestRead(file);
|
|
418
1032
|
try {
|
|
419
1033
|
const parsed = JSON.parse(file.bytes.toString("utf8"));
|
|
420
1034
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
@@ -452,13 +1066,13 @@ async function readProjectManifests(context, root) {
|
|
|
452
1066
|
}
|
|
453
1067
|
|
|
454
1068
|
// plugins/project-orientation/source/tree.ts
|
|
455
|
-
var
|
|
456
|
-
var
|
|
1069
|
+
var import_promises4 = require("node:fs/promises");
|
|
1070
|
+
var import_node_path5 = require("node:path");
|
|
457
1071
|
var IGNORED_NAMES = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage"]);
|
|
458
1072
|
var DISPLAY_PATH_MAX_CHARS = 64;
|
|
459
1073
|
function childLogicalPath(parent, childName) {
|
|
460
1074
|
if (parent.logicalPath === ".") return childName;
|
|
461
|
-
return
|
|
1075
|
+
return import_node_path5.posix.join(parent.logicalPath, childName);
|
|
462
1076
|
}
|
|
463
1077
|
function relativeDisplayPath(root, child) {
|
|
464
1078
|
if (child.logicalPath === root.logicalPath) return ".";
|
|
@@ -478,7 +1092,7 @@ function boundedDisplayPath(path) {
|
|
|
478
1092
|
truncated: true
|
|
479
1093
|
});
|
|
480
1094
|
}
|
|
481
|
-
async function collectProjectTree(context, root, depth, maxEntries) {
|
|
1095
|
+
async function collectProjectTree(context, root, depth, maxEntries, signal) {
|
|
482
1096
|
const directories = [];
|
|
483
1097
|
const files = [];
|
|
484
1098
|
let entries = 0;
|
|
@@ -486,11 +1100,13 @@ async function collectProjectTree(context, root, depth, maxEntries) {
|
|
|
486
1100
|
let truncatedPathCount = 0;
|
|
487
1101
|
const queue = [{ target: root, remainingDepth: depth }];
|
|
488
1102
|
while (queue.length > 0 && entries < maxEntries) {
|
|
1103
|
+
throwIfProjectInspectionCancelled(signal);
|
|
489
1104
|
const current = queue.shift();
|
|
490
1105
|
if (!current) break;
|
|
491
1106
|
const sampled = [];
|
|
492
|
-
const directory = await (0,
|
|
1107
|
+
const directory = await (0, import_promises4.opendir)(current.target.absolutePath);
|
|
493
1108
|
for await (const entry of directory) {
|
|
1109
|
+
throwIfProjectInspectionCancelled(signal);
|
|
494
1110
|
if (entry.isDirectory() && IGNORED_NAMES.has(entry.name)) continue;
|
|
495
1111
|
if (entries + sampled.length >= maxEntries) {
|
|
496
1112
|
truncated = true;
|
|
@@ -500,6 +1116,7 @@ async function collectProjectTree(context, root, depth, maxEntries) {
|
|
|
500
1116
|
}
|
|
501
1117
|
sampled.sort((left, right) => left.name.localeCompare(right.name));
|
|
502
1118
|
for (const entry of sampled) {
|
|
1119
|
+
throwIfProjectInspectionCancelled(signal);
|
|
503
1120
|
const child = resolvePluginPath(
|
|
504
1121
|
context,
|
|
505
1122
|
childLogicalPath(current.target, entry.name),
|
|
@@ -508,7 +1125,7 @@ async function collectProjectTree(context, root, depth, maxEntries) {
|
|
|
508
1125
|
allowedLocations: ["agent_work", "workspace"]
|
|
509
1126
|
}
|
|
510
1127
|
);
|
|
511
|
-
const info = await (0,
|
|
1128
|
+
const info = await (0, import_promises4.stat)(child.absolutePath);
|
|
512
1129
|
const display = boundedDisplayPath(relativeDisplayPath(root, child));
|
|
513
1130
|
if (display.truncated) truncatedPathCount += 1;
|
|
514
1131
|
entries += 1;
|
|
@@ -564,13 +1181,15 @@ var index_default = defineRuntimePlugin((context) => {
|
|
|
564
1181
|
...context,
|
|
565
1182
|
runtimePathResolver: executionContext?.runtimePathResolver ?? context.runtimePathResolver
|
|
566
1183
|
};
|
|
1184
|
+
const signal = executionContext?.abortSignal;
|
|
567
1185
|
try {
|
|
1186
|
+
throwIfProjectInspectionCancelled(signal);
|
|
568
1187
|
const requestedPath = readOptionalString(params.path) ?? ".";
|
|
569
1188
|
const target = resolvePluginPath(pathContext, requestedPath, {
|
|
570
1189
|
defaultPath: ".",
|
|
571
1190
|
allowedLocations: ["agent_work", "workspace"]
|
|
572
1191
|
});
|
|
573
|
-
const info = await (0,
|
|
1192
|
+
const info = await (0, import_promises5.stat)(target.absolutePath);
|
|
574
1193
|
if (!info.isDirectory()) {
|
|
575
1194
|
return failureResult({
|
|
576
1195
|
errorCode: "project_target_not_directory",
|
|
@@ -590,9 +1209,10 @@ var index_default = defineRuntimePlugin((context) => {
|
|
|
590
1209
|
name: "maxEntries"
|
|
591
1210
|
});
|
|
592
1211
|
const [tree, manifests] = await Promise.all([
|
|
593
|
-
collectProjectTree(pathContext, target, depth, maxEntries),
|
|
594
|
-
readProjectManifests(pathContext, target)
|
|
1212
|
+
collectProjectTree(pathContext, target, depth, maxEntries, signal),
|
|
1213
|
+
readProjectManifests(pathContext, target, signal)
|
|
595
1214
|
]);
|
|
1215
|
+
throwIfProjectInspectionCancelled(signal);
|
|
596
1216
|
const packageManifest = manifests.find(
|
|
597
1217
|
({ file }) => file === "package.json"
|
|
598
1218
|
);
|
|
@@ -629,11 +1249,7 @@ var index_default = defineRuntimePlugin((context) => {
|
|
|
629
1249
|
}
|
|
630
1250
|
});
|
|
631
1251
|
} catch (error) {
|
|
632
|
-
return
|
|
633
|
-
fallbackCode: "project_orientation_failed",
|
|
634
|
-
fallbackMessage: "Project orientation failed.",
|
|
635
|
-
operation: "inspect_project"
|
|
636
|
-
});
|
|
1252
|
+
return projectInspectionFailure(error, signal);
|
|
637
1253
|
}
|
|
638
1254
|
}
|
|
639
1255
|
}
|