@abot-ai/runtime 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/cli/abot.js +2 -0
- package/dist/src/cli/host-companion-bundle.mjs +751 -333
- package/dist/src/computer-access/collection-consent.d.ts +9 -0
- package/dist/src/computer-access/collection-consent.js +47 -0
- package/dist/src/computer-access/command-output-capture.d.ts +17 -6
- package/dist/src/computer-access/command-output-capture.js +134 -68
- package/dist/src/computer-access/command-output-protection.d.ts +17 -0
- package/dist/src/computer-access/command-output-protection.js +59 -0
- package/dist/src/computer-access/companion/command-output.d.ts +1 -0
- package/dist/src/computer-access/companion/command-output.js +23 -6
- package/dist/src/computer-access/companion/install-link-macos.js +2 -1
- package/dist/src/computer-access/companion/native-notifications.js +3 -2
- package/dist/src/computer-access/companion/native-session.js +6 -2
- package/dist/src/computer-access/companion/observation-filter.js +2 -26
- package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
- package/dist/src/computer-access/companion/observation-process.js +51 -25
- package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
- package/dist/src/computer-access/companion/observation-redaction.js +2 -111
- package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
- package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
- package/dist/src/computer-access/computer/companion-sessions.js +7 -6
- package/dist/src/computer-access/computer/unix-native-process.js +23 -11
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +79 -11
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
- package/dist/src/computer-access/native-observation-connection.js +78 -0
- package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
- package/dist/src/computer-access/native-observation-ownership.js +55 -0
- package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
- package/dist/src/computer-access/native-observation-shutdown.js +58 -0
- package/dist/src/computer-access/observation-source.d.ts +6 -0
- package/dist/src/computer-access/observation-source.js +10 -0
- package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
- package/dist/src/computer-access/security/desktop-result.js +146 -0
- package/dist/src/computer-access/security/observed-error.d.ts +2 -0
- package/dist/src/computer-access/security/observed-error.js +10 -0
- package/dist/src/computer-access/security/secret-text.d.ts +7 -0
- package/dist/src/computer-access/security/secret-text.js +111 -0
- package/dist/src/computer-access/security/system-results.d.ts +2 -0
- package/dist/src/computer-access/security/system-results.js +53 -0
- package/dist/src/computer-access/system-result-protection.d.ts +11 -0
- package/dist/src/computer-access/system-result-protection.js +1 -0
- package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
- package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
- package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
- package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
- package/dist/src/model-gateway/observability/provider-trace.js +30 -8
- package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
- package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
- package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
- package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
- package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
- package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
- package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
- package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
- package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
- package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
- package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
- package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
- package/dist/src/model-gateway/providers/openai/payload.js +6 -23
- package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
- package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
- package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
- package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
- package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
- package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
- package/dist/src/model-gateway/providers/openai/stream.js +13 -41
- package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
- package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
- package/dist/src/model-gateway/server.js +5 -1
- package/dist/src/plugin-contract/index.d.ts +1 -0
- package/dist/src/plugin-contract/index.js +1 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -0
- package/dist/src/plugin-contract/manifest.js +1 -0
- package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
- package/dist/src/plugin-contract/platform-compatibility.js +3 -0
- package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
- package/dist/src/plugin-sdk/computer-access.js +1 -0
- package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
- package/dist/src/plugin-sdk/files-windows/process.js +93 -0
- package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
- package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
- package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
- package/dist/src/plugin-sdk/files-windows/read.js +56 -0
- package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
- package/dist/src/plugin-sdk/files-windows/result.js +67 -0
- package/dist/src/plugin-sdk/files.js +4 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
- package/dist/src/plugin-sdk/mutation-result.js +11 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
- package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
- package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
- package/dist/src/runtime/passive-learning/collection-source.js +7 -0
- package/dist/src/runtime/passive-learning/service.js +2 -3
- package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
- package/dist/src/runtime/passive-learning/status-projection.js +9 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
- package/dist/src/runtime/plugins/installation/package.js +2 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
- package/dist/src/runtime/plugins/loader.js +24 -14
- package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
- package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
- package/dist/src/runtime/plugins/manifest-validator.js +9 -1
- package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
- package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
- package/dist/src/runtime/steps/execution-agent/format.js +2 -3
- package/dist/src/runtime/steps/execution-agent/input.js +1 -1
- package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
- package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
- package/dist/src/sessions/durable-session-commit.js +3 -3
- package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
- package/dist/src/sessions/prepared-session-replacement.js +46 -0
- package/dist/src/sessions/session-store.js +3 -3
- package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
- package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
- package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/authority-script.js +94 -0
- package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
- package/dist/src/shared/windows-file-io/native-script.js +120 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
- package/dist/src/shared/windows-job-object.d.ts +2 -0
- package/dist/src/shared/windows-job-object.js +66 -0
- package/dist/src/web-ui/app/app-bootstrap.js +14 -1
- package/dist/src/web-ui/app/app-state.js +0 -7
- package/dist/src/web-ui/app/app.js +53 -156
- package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
- package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
- package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
- package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
- package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
- package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
- package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
- package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
- package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
- package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
- package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
- package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
- package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
- package/dist/src/web-ui/app/components/schedules/form.js +10 -8
- package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
- package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
- package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
- package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +9 -1
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
- package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
- package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
- package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
- package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
- package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
- package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
- package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
- package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
- package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
- package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
- package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
- package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
- package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
- package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
- package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
- package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
- package/dist/src/web-ui/app/dashboard-feature.js +3 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
- package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
- package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
- package/dist/src/web-ui/app/schedules-feature.js +5 -3
- package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
- package/dist/src/web-ui/app/services/client-preferences.js +25 -16
- package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
- package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
- package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
- package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
- package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
- package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
- package/dist/src/web-ui/app/services/workspace-state.js +27 -0
- package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
- package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
- package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
- package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
- package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
- package/dist/src/web-ui/app/styles.css +2 -0
- package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
- package/dist/src/web-ui/client-state/contracts.js +13 -0
- package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
- package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
- package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
- package/dist/src/web-ui/client-state/preferences.js +84 -0
- package/dist/src/web-ui/client-state/queue.d.ts +3 -0
- package/dist/src/web-ui/client-state/queue.js +43 -0
- package/dist/src/web-ui/client-state/routes.d.ts +7 -0
- package/dist/src/web-ui/client-state/routes.js +58 -0
- package/dist/src/web-ui/client-state/store.d.ts +14 -0
- package/dist/src/web-ui/client-state/store.js +88 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
- package/dist/src/web-ui/local-runtime/http.js +11 -2
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
- package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
- package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +14 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +3 -1
- package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
- package/dist/src/web-ui/server-readiness.d.ts +3 -0
- package/dist/src/web-ui/server-readiness.js +36 -0
- package/dist/src/web-ui/server.d.ts +2 -0
- package/dist/src/web-ui/server.js +23 -1
- package/dist/src/web-ui/system-host-service.js +13 -2
- package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
- package/docs/installation.md +44 -5
- package/docs/plugins.md +145 -4
- package/docs/tool-execution-result-evidence-contract.md +57 -0
- package/docs/windows-companion-store.md +5 -0
- package/package.json +4 -2
- package/plugins/capability-brief/plugin.json +4 -0
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +1 -0
- package/plugins/code-outline/source/index.ts +16 -20
- package/plugins/code-outline/source/read-failure.ts +40 -0
- package/plugins/code-outline/src/index.cjs +614 -29
- package/plugins/document-reader/README.md +33 -0
- package/plugins/document-reader/plugin.json +1 -0
- package/plugins/document-reader/source/pdf-contract.ts +57 -0
- package/plugins/document-reader/source/pdf-parser.ts +139 -0
- package/plugins/document-reader/source/pdf-process-main.ts +56 -0
- package/plugins/document-reader/source/pdf-process.ts +207 -0
- package/plugins/document-reader/source/pdf-result.ts +79 -0
- package/plugins/document-reader/source/pdf-worker.ts +39 -303
- package/plugins/document-reader/source/pdf.ts +4 -1
- package/plugins/document-reader/source/read-failure.ts +37 -0
- package/plugins/document-reader/source/reader.ts +3 -19
- package/plugins/document-reader/src/index.cjs +995 -211
- package/plugins/exec/README.md +19 -0
- package/plugins/exec/plugin.json +4 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
- package/plugins/exec/source/filesystem-file-observer.ts +98 -0
- package/plugins/exec/source/filesystem-observer.ts +8 -79
- package/plugins/exec/source/output-files.ts +12 -6
- package/plugins/exec/source/paths.ts +3 -1
- package/plugins/exec/source/process-manager.ts +8 -24
- package/plugins/exec/source/shell-platform.ts +19 -3
- package/plugins/exec/source/shell-process.ts +55 -0
- package/plugins/exec/source/windows-job-source.ts +1 -0
- package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
- package/plugins/exec/src/index.cjs +252 -96
- package/plugins/filesystem/README.md +65 -0
- package/plugins/filesystem/plugin.json +6 -2
- package/plugins/filesystem/source/atomic-write.ts +2 -0
- package/plugins/filesystem/source/bounded-io.ts +80 -306
- package/plugins/filesystem/source/directory-sample.ts +2 -0
- package/plugins/filesystem/source/errors.ts +14 -0
- package/plugins/filesystem/source/file-observation.ts +151 -0
- package/plugins/filesystem/source/file-version.ts +41 -0
- package/plugins/filesystem/source/index.ts +6 -0
- package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
- package/plugins/filesystem/source/windows/authority-script.ts +1 -0
- package/plugins/filesystem/source/windows/native-script.ts +1 -0
- package/plugins/filesystem/source/windows/operations.ts +197 -0
- package/plugins/filesystem/source/windows/process.ts +214 -0
- package/plugins/filesystem/source/windows/publication-script.ts +29 -0
- package/plugins/filesystem/source/windows/read-script.ts +63 -0
- package/plugins/filesystem/source/windows/request-availability.ts +67 -0
- package/plugins/filesystem/source/windows/source.ts +42 -0
- package/plugins/filesystem/source/windows/storage-script.ts +11 -0
- package/plugins/filesystem/source/windows/streams-script.ts +24 -0
- package/plugins/filesystem/source/windows/write-script.ts +86 -0
- package/plugins/filesystem/src/index.cjs +1208 -322
- package/plugins/json-inspector/README.md +18 -0
- package/plugins/json-inspector/plugin.json +1 -0
- package/plugins/json-inspector/source/index.ts +16 -19
- package/plugins/json-inspector/source/read-failure.ts +42 -0
- package/plugins/json-inspector/src/index.cjs +612 -27
- package/plugins/local-search/README.md +29 -0
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/local-search/source/errors.ts +2 -0
- package/plugins/local-search/source/paths.ts +3 -0
- package/plugins/local-search/source/ripgrep-process.ts +31 -5
- package/plugins/local-search/source/ripgrep.ts +3 -3
- package/plugins/local-search/source/windows-authority.ts +99 -0
- package/plugins/local-search/source/windows-search-lease.ts +49 -0
- package/plugins/local-search/source/windows-search-process.ts +91 -0
- package/plugins/local-search/source/windows-search-script.ts +52 -0
- package/plugins/local-search/src/index.cjs +595 -26
- package/plugins/memory/plugin.json +4 -0
- package/plugins/memory/source/lock-directory-claim.ts +56 -0
- package/plugins/memory/source/lock-owner-file.ts +71 -0
- package/plugins/memory/source/lock-path-observation.ts +26 -0
- package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
- package/plugins/memory/source/store-lock.ts +12 -7
- package/plugins/memory/source/store.ts +3 -2
- package/plugins/memory/src/index.cjs +174 -25
- package/plugins/project-orientation/README.md +23 -0
- package/plugins/project-orientation/plugin.json +1 -0
- package/plugins/project-orientation/source/index.ts +12 -9
- package/plugins/project-orientation/source/inspection-failure.ts +70 -0
- package/plugins/project-orientation/source/manifest-summary.ts +9 -2
- package/plugins/project-orientation/source/tree.ts +6 -0
- package/plugins/project-orientation/src/index.cjs +647 -31
- package/plugins/system/README.md +51 -15
- package/plugins/system/plugin.json +5 -1
- package/plugins/system/skills/system_actions/SKILL.md +1 -1
- package/plugins/system/source/command-working-directory.ts +47 -0
- package/plugins/system/source/computer/handlers.ts +13 -9
- package/plugins/system/source/computer/observation-result.ts +10 -5
- package/plugins/system/source/computer/request-computers.ts +10 -3
- package/plugins/system/source/computer/request-modules.ts +3 -6
- package/plugins/system/source/computer/runtime-platform.ts +18 -0
- package/plugins/system/source/host-dispatch.ts +18 -2
- package/plugins/system/source/index.ts +5 -3
- package/plugins/system/source/local-command-output-retention.ts +16 -0
- package/plugins/system/source/local-command-output.ts +16 -8
- package/plugins/system/source/request-system-modules.ts +12 -2
- package/plugins/system/source/request-target-snapshot.ts +2 -1
- package/plugins/system/source/security/desktop-result.ts +177 -0
- package/plugins/system/source/security/observed-error.ts +10 -0
- package/plugins/system/source/security/secret-text.ts +118 -0
- package/plugins/system/source/security/system-results.ts +62 -0
- package/plugins/system/source/security/windows-output-directory.ts +82 -0
- package/plugins/system/src/index.cjs +837 -151
- package/plugins/system-probe/plugin.json +8 -2
- package/plugins/system-probe/source/disk-path.ts +8 -0
- package/plugins/system-probe/source/index.ts +10 -5
- package/plugins/system-probe/source/machine-load.ts +33 -0
- package/plugins/system-probe/source/metrics.ts +6 -8
- package/plugins/system-probe/src/index.cjs +49 -16
- package/plugins/web/plugin.json +4 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Local Search
|
|
2
|
+
|
|
3
|
+
Searches file names and file contents on Linux, macOS and native Windows using
|
|
4
|
+
bundled ripgrep. Paths remain relative to the configured agent work directory;
|
|
5
|
+
`workspace/...` selects configured workspace sources. Absolute paths and
|
|
6
|
+
request-specific roots use the same Runtime authorization checks.
|
|
7
|
+
|
|
8
|
+
The existing query modes, literal matching, 200-result ceiling, bounded streamed
|
|
9
|
+
records, output budget and ten-second search deadline apply on every platform.
|
|
10
|
+
Inherited ripgrep configuration is ignored. Search does not execute project
|
|
11
|
+
scripts or modify files. Directory links are not followed by ripgrep.
|
|
12
|
+
|
|
13
|
+
## Windows requirements
|
|
14
|
+
|
|
15
|
+
Built-in Windows PowerShell and its C# helper hold the selected path and its
|
|
16
|
+
ancestors open while the search runs. Their identities are checked before
|
|
17
|
+
starting ripgrep. Moving or replacing that path is temporarily blocked until
|
|
18
|
+
the search finishes; a selected individual file is also protected against
|
|
19
|
+
writes while it is being searched.
|
|
20
|
+
|
|
21
|
+
The helper uses the same Job Object mechanism as EXEC. Cancellation, timeout
|
|
22
|
+
and reaching the result limit terminate its child processes. This requires no
|
|
23
|
+
Companion, WSL, Docker, elevation, policy bypass or separately installed shell.
|
|
24
|
+
If policy blocks the helper, `local_search_windows_unavailable` tells the model
|
|
25
|
+
not to retry or bypass the restriction. Failure to retain the path authority
|
|
26
|
+
returns `local_search_authority_unavailable` and no partial results.
|
|
27
|
+
|
|
28
|
+
Linux retains its descriptor-based execution; macOS retains its existing
|
|
29
|
+
directory-authority bridge. Windows support does not change those paths.
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"description": "Search filenames and textual content beneath configured agent data roots.",
|
|
6
6
|
"extensions": {
|
|
7
|
+
"ai.abot.compatibility": { "version": 1, "runtimePlatforms": ["linux", "darwin", "win32"] },
|
|
7
8
|
"ai.abot.runtime": {
|
|
8
9
|
"version": 1,
|
|
9
10
|
"entrypoint": "./src/index.cjs",
|
|
@@ -4,6 +4,8 @@ export type LocalSearchErrorCode =
|
|
|
4
4
|
| "local_search_result_encoding_unsupported"
|
|
5
5
|
| "local_search_result_invalid"
|
|
6
6
|
| "local_search_path_roundtrip_unsafe"
|
|
7
|
+
| "local_search_authority_unavailable"
|
|
8
|
+
| "local_search_windows_unavailable"
|
|
7
9
|
| "local_search_failed";
|
|
8
10
|
|
|
9
11
|
export class LocalSearchError extends Error {
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
} from "../../../src/plugin-sdk/index.js";
|
|
9
9
|
import { resolvePluginPath } from "../../../src/plugin-sdk/index.js";
|
|
10
10
|
|
|
11
|
+
import { openWindowsSearchAuthority } from "./windows-authority.js";
|
|
11
12
|
import { LocalSearchError } from "./errors.js";
|
|
12
13
|
import type { SearchDirectoryAuthority } from "./ripgrep-process.js";
|
|
13
14
|
|
|
@@ -164,6 +165,8 @@ export async function resolveSearchRoot(
|
|
|
164
165
|
requirePath: true,
|
|
165
166
|
allowedLocations: ["agent_work", "workspace"],
|
|
166
167
|
});
|
|
168
|
+
const needsWindowsSearchAuthority = process.platform === "win32";
|
|
169
|
+
if (needsWindowsSearchAuthority) return openWindowsSearchAuthority(target);
|
|
167
170
|
return openSearchAuthority(target);
|
|
168
171
|
}
|
|
169
172
|
|
|
@@ -5,10 +5,22 @@ import { rgPath } from "@vscode/ripgrep";
|
|
|
5
5
|
|
|
6
6
|
import { spawnDirectoryAuthorityCommand } from "../../../src/shared/directory-authority/index.js";
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
import type { WindowsSearchAuthority } from "./windows-authority.js";
|
|
9
|
+
import { spawnWindowsSearch } from "./windows-search-process.js";
|
|
10
|
+
import type { LocalSearchError } from "./errors.js";
|
|
11
|
+
|
|
12
|
+
export type SearchDirectoryAuthority =
|
|
13
|
+
| WindowsSearchAuthority
|
|
14
|
+
| Readonly<{
|
|
15
|
+
directoryPath: string;
|
|
16
|
+
directoryFd: number;
|
|
17
|
+
}>;
|
|
18
|
+
|
|
19
|
+
function isWindowsSearchAuthority(
|
|
20
|
+
authority?: SearchDirectoryAuthority,
|
|
21
|
+
): authority is WindowsSearchAuthority {
|
|
22
|
+
return authority !== undefined && "platform" in authority;
|
|
23
|
+
}
|
|
12
24
|
|
|
13
25
|
function controlledRipgrepEnvironment(): NodeJS.ProcessEnv {
|
|
14
26
|
const environment = { ...process.env };
|
|
@@ -37,14 +49,28 @@ function terminateAuthorityGroup(
|
|
|
37
49
|
}
|
|
38
50
|
}
|
|
39
51
|
|
|
52
|
+
type RipgrepInvocation = Readonly<{
|
|
53
|
+
child: ChildProcessByStdio<null, Readable, Readable>;
|
|
54
|
+
terminate(): void;
|
|
55
|
+
failureForExit?: (code: number | null | undefined) => LocalSearchError;
|
|
56
|
+
}>;
|
|
57
|
+
|
|
40
58
|
export function spawnRipgrepProcess(
|
|
41
59
|
args: readonly string[],
|
|
42
60
|
cwd: string,
|
|
43
61
|
stdinFd?: number,
|
|
44
62
|
directoryAuthority?: SearchDirectoryAuthority,
|
|
45
|
-
) {
|
|
63
|
+
): RipgrepInvocation {
|
|
46
64
|
const commandArgs = ["--no-config", ...args];
|
|
47
65
|
const env = controlledRipgrepEnvironment();
|
|
66
|
+
if (isWindowsSearchAuthority(directoryAuthority)) {
|
|
67
|
+
return spawnWindowsSearch({
|
|
68
|
+
authority: directoryAuthority,
|
|
69
|
+
command: rgPath,
|
|
70
|
+
args: commandArgs,
|
|
71
|
+
env,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
48
74
|
if (directoryAuthority) {
|
|
49
75
|
const child = spawnDirectoryAuthorityCommand({
|
|
50
76
|
...directoryAuthority,
|
|
@@ -134,7 +134,7 @@ async function runRipgrepBounded<T>(
|
|
|
134
134
|
let timedOut = false;
|
|
135
135
|
let aborted = false;
|
|
136
136
|
let parserError: unknown;
|
|
137
|
-
const { child, terminate } = spawnRipgrepProcess(
|
|
137
|
+
const { child, terminate, failureForExit } = spawnRipgrepProcess(
|
|
138
138
|
args,
|
|
139
139
|
cwd,
|
|
140
140
|
stdinFd,
|
|
@@ -194,7 +194,7 @@ async function runRipgrepBounded<T>(
|
|
|
194
194
|
});
|
|
195
195
|
// Always drain stderr so the child cannot block on its diagnostic pipe.
|
|
196
196
|
child.stderr.on("data", () => undefined);
|
|
197
|
-
child.on("error", (error) => settleFailure(error));
|
|
197
|
+
child.on("error", (error) => settleFailure(failureForExit?.(undefined) ?? error));
|
|
198
198
|
child.on("close", (code) => {
|
|
199
199
|
if (completed) return;
|
|
200
200
|
if (parserError) {
|
|
@@ -214,7 +214,7 @@ async function runRipgrepBounded<T>(
|
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
if (!stoppedAfterExtraResult && code !== 0 && code !== 1) {
|
|
217
|
-
settleFailure();
|
|
217
|
+
settleFailure(failureForExit?.(code));
|
|
218
218
|
return;
|
|
219
219
|
}
|
|
220
220
|
completed = true;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { open, realpath, type FileHandle } from "node:fs/promises";
|
|
2
|
+
import { win32 } from "node:path";
|
|
3
|
+
import type { BigIntStats } from "node:fs";
|
|
4
|
+
import type { ResolvedRuntimeToolPath } from "../../../src/plugin-sdk/index.js";
|
|
5
|
+
import { LocalSearchError } from "./errors.js";
|
|
6
|
+
import type { SearchRoot } from "./paths.js";
|
|
7
|
+
|
|
8
|
+
export type WindowsSearchIdentity = Readonly<{
|
|
9
|
+
device: string;
|
|
10
|
+
inode: string;
|
|
11
|
+
birthtimeNs: string;
|
|
12
|
+
}>;
|
|
13
|
+
export type WindowsSearchAuthority = Readonly<{
|
|
14
|
+
platform: "win32";
|
|
15
|
+
rootPath: string;
|
|
16
|
+
targetPath: string;
|
|
17
|
+
rootIdentity: WindowsSearchIdentity;
|
|
18
|
+
targetIdentity: WindowsSearchIdentity;
|
|
19
|
+
isFile: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
|
|
22
|
+
function identity(stats: BigIntStats): WindowsSearchIdentity {
|
|
23
|
+
return {
|
|
24
|
+
device: String(stats.dev),
|
|
25
|
+
inode: String(stats.ino),
|
|
26
|
+
birthtimeNs: String(stats.birthtimeNs),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function sameWindowsPath(left: string, right: string): boolean {
|
|
31
|
+
return (
|
|
32
|
+
win32.resolve(left).toLowerCase() === win32.resolve(right).toLowerCase()
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function windowsSearchAuthorityUnavailable(): LocalSearchError {
|
|
37
|
+
return new LocalSearchError(
|
|
38
|
+
"local_search_authority_unavailable",
|
|
39
|
+
"Local search could not keep the selected Windows path safely bound to its authorized root. No results were returned. Do not retry or bypass this restriction with another tool; ask the user to check the path and access permissions.",
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function openWindowsSearchAuthority(
|
|
44
|
+
target: ResolvedRuntimeToolPath,
|
|
45
|
+
): Promise<SearchRoot> {
|
|
46
|
+
const handles: FileHandle[] = [];
|
|
47
|
+
try {
|
|
48
|
+
const root = await open(target.rootPath, "r");
|
|
49
|
+
handles.push(root);
|
|
50
|
+
const selected = await open(target.absolutePath, "r");
|
|
51
|
+
handles.push(selected);
|
|
52
|
+
const [rootStats, selectedStats, rootPath, targetPath] = await Promise.all([
|
|
53
|
+
root.stat({ bigint: true }),
|
|
54
|
+
selected.stat({ bigint: true }),
|
|
55
|
+
realpath(target.rootPath),
|
|
56
|
+
realpath(target.absolutePath),
|
|
57
|
+
]);
|
|
58
|
+
if (!rootStats.isDirectory()) throw windowsSearchAuthorityUnavailable();
|
|
59
|
+
if (!sameWindowsPath(rootPath, target.rootPath))
|
|
60
|
+
throw windowsSearchAuthorityUnavailable();
|
|
61
|
+
if (!sameWindowsPath(targetPath, target.absolutePath))
|
|
62
|
+
throw windowsSearchAuthorityUnavailable();
|
|
63
|
+
if (!selectedStats.isFile() && !selectedStats.isDirectory()) {
|
|
64
|
+
throw new LocalSearchError(
|
|
65
|
+
"local_search_target_invalid",
|
|
66
|
+
"The selected search target must be a regular file or directory.",
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const isFile = selectedStats.isFile();
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
target,
|
|
72
|
+
isFile,
|
|
73
|
+
commandDirectory: isFile ? win32.dirname(targetPath) : targetPath,
|
|
74
|
+
commandTarget: isFile ? win32.basename(targetPath) : ".",
|
|
75
|
+
directoryAuthority: {
|
|
76
|
+
platform: "win32" as const,
|
|
77
|
+
rootPath,
|
|
78
|
+
targetPath,
|
|
79
|
+
rootIdentity: identity(rootStats),
|
|
80
|
+
targetIdentity: identity(selectedStats),
|
|
81
|
+
isFile,
|
|
82
|
+
},
|
|
83
|
+
close: async () => {
|
|
84
|
+
for (const handle of handles.splice(0)) await handle.close();
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
await Promise.all(handles.splice(0).map((handle) => handle.close()));
|
|
89
|
+
if (error instanceof LocalSearchError) throw error;
|
|
90
|
+
const code = (error as NodeJS.ErrnoException)?.code;
|
|
91
|
+
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
92
|
+
throw new LocalSearchError(
|
|
93
|
+
"local_search_root_not_found",
|
|
94
|
+
"The selected logical search root does not exist.",
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
throw windowsSearchAuthorityUnavailable();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// The external search program uses paths, so pin every ancestor from the volume
|
|
2
|
+
// root. The ordinary SDK reader instead reads through handles relative to its root.
|
|
3
|
+
export const WINDOWS_SEARCH_LEASE = String.raw`
|
|
4
|
+
public static partial class AbotFilesystem {
|
|
5
|
+
sealed class SearchPathLease : IDisposable {
|
|
6
|
+
readonly List<SafeFileHandle> held = new List<SafeFileHandle>();
|
|
7
|
+
public readonly string Target;
|
|
8
|
+
public readonly bool IsFile;
|
|
9
|
+
public SearchPathLease(Dictionary<string,object> request) {
|
|
10
|
+
try {
|
|
11
|
+
Target = Path.GetFullPath(Text(request, "targetPath"));
|
|
12
|
+
string root = Path.GetFullPath(Text(request, "rootPath")).TrimEnd('\\');
|
|
13
|
+
if (!String.Equals(Target.TrimEnd('\\'), root, StringComparison.OrdinalIgnoreCase) &&
|
|
14
|
+
!Target.StartsWith(root + "\\", StringComparison.OrdinalIgnoreCase))
|
|
15
|
+
throw new FsFault("filesystem_invalid_path");
|
|
16
|
+
IsFile = (bool)request["isFile"];
|
|
17
|
+
string current = Path.GetPathRoot(Target);
|
|
18
|
+
var handle = OpenHandle(null, NativePath(current), true, 1, 0x80000000, 3);
|
|
19
|
+
held.Add(handle);
|
|
20
|
+
bool foundRoot = VerifyRoot(current, root, handle, request);
|
|
21
|
+
string rest = Target.Substring(current.Length).TrimEnd('\\');
|
|
22
|
+
string[] parts = rest.Length == 0 ? new string[0] : rest.Split('\\');
|
|
23
|
+
for (int i = 0; i < parts.Length; i++) {
|
|
24
|
+
ValidateComponent(parts[i]);
|
|
25
|
+
bool isFile = IsFile && i == parts.Length - 1;
|
|
26
|
+
handle = OpenHandle(handle, parts[i], !isFile, 1, 0x80000000, isFile ? 1u : 3u);
|
|
27
|
+
held.Add(handle);
|
|
28
|
+
current = Path.Combine(current, parts[i]);
|
|
29
|
+
if (!String.Equals(FinalPath(handle).TrimEnd('\\'), current.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase))
|
|
30
|
+
throw new FsFault("filesystem_path_changed");
|
|
31
|
+
foundRoot |= VerifyRoot(current, root, handle, request);
|
|
32
|
+
}
|
|
33
|
+
if (!foundRoot || !MatchesIdentity(Identity(handle), request["targetIdentity"] as Dictionary<string,object>))
|
|
34
|
+
throw new FsFault("filesystem_path_changed");
|
|
35
|
+
} catch { Dispose(); throw; }
|
|
36
|
+
}
|
|
37
|
+
static bool VerifyRoot(string current, string root, SafeFileHandle handle, Dictionary<string,object> request) {
|
|
38
|
+
if (!String.Equals(current.TrimEnd('\\'), root, StringComparison.OrdinalIgnoreCase)) return false;
|
|
39
|
+
var expected = request["rootIdentity"] as Dictionary<string,object>;
|
|
40
|
+
if (expected == null || !MatchesIdentity(Identity(handle), expected)) throw new FsFault("filesystem_path_changed");
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
public void Dispose() {
|
|
44
|
+
for (int i = held.Count - 1; i >= 0; i--) held[i].Dispose();
|
|
45
|
+
held.Clear();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { spawn, type ChildProcessByStdio } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import type { Readable } from "node:stream";
|
|
4
|
+
import { WINDOWS_EXEC_JOB_SOURCE } from "../../../src/shared/windows-job-object.js";
|
|
5
|
+
import { LocalSearchError } from "./errors.js";
|
|
6
|
+
import {
|
|
7
|
+
windowsSearchAuthorityUnavailable,
|
|
8
|
+
type WindowsSearchAuthority,
|
|
9
|
+
} from "./windows-authority.js";
|
|
10
|
+
import { WINDOWS_SEARCH_SOURCE } from "./windows-search-script.js";
|
|
11
|
+
|
|
12
|
+
const BOOTSTRAP = [
|
|
13
|
+
"$ErrorActionPreference='Stop'",
|
|
14
|
+
"$ProgressPreference='SilentlyContinue'",
|
|
15
|
+
"if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage') { exit 126 }",
|
|
16
|
+
"$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
|
|
17
|
+
"try {",
|
|
18
|
+
"[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
|
|
19
|
+
"$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
|
|
20
|
+
"Add-Type -TypeDefinition $envelope.jobSource",
|
|
21
|
+
"[AbotExecJob]::Attach()",
|
|
22
|
+
"Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
|
|
23
|
+
"$result=[AbotFilesystem]::Search($envelope.request)",
|
|
24
|
+
"exit $result",
|
|
25
|
+
"} catch { exit 126 }",
|
|
26
|
+
].join(";\n");
|
|
27
|
+
|
|
28
|
+
function windowsSearchUnavailable(): LocalSearchError {
|
|
29
|
+
return new LocalSearchError(
|
|
30
|
+
"local_search_windows_unavailable",
|
|
31
|
+
"The Windows local-search helper is unavailable or blocked by computer policy. No results were returned. Do not retry or bypass this restriction with another tool; ask the user to check PowerShell/C# availability or contact their administrator.",
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function windowsSearchExitFailure(
|
|
36
|
+
code: number | null | undefined,
|
|
37
|
+
): LocalSearchError {
|
|
38
|
+
if (code === 125) return windowsSearchAuthorityUnavailable();
|
|
39
|
+
const helperUnavailable = code === 126 || code === undefined;
|
|
40
|
+
if (helperUnavailable) return windowsSearchUnavailable();
|
|
41
|
+
return new LocalSearchError(
|
|
42
|
+
"local_search_failed",
|
|
43
|
+
"Local search could not complete under the selected logical root.",
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function spawnWindowsSearch(
|
|
48
|
+
params: Readonly<{
|
|
49
|
+
authority: WindowsSearchAuthority;
|
|
50
|
+
command: string;
|
|
51
|
+
args: readonly string[];
|
|
52
|
+
env: NodeJS.ProcessEnv;
|
|
53
|
+
}>,
|
|
54
|
+
) {
|
|
55
|
+
const input = JSON.stringify({
|
|
56
|
+
source: WINDOWS_SEARCH_SOURCE,
|
|
57
|
+
jobSource: WINDOWS_EXEC_JOB_SOURCE,
|
|
58
|
+
request: JSON.stringify({
|
|
59
|
+
...params.authority,
|
|
60
|
+
command: params.command,
|
|
61
|
+
args: params.args,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (Buffer.byteLength(input) > 2 * 1024 * 1024)
|
|
65
|
+
throw windowsSearchUnavailable();
|
|
66
|
+
const executable = join(
|
|
67
|
+
process.env.SystemRoot ?? "C:\\Windows",
|
|
68
|
+
"System32",
|
|
69
|
+
"WindowsPowerShell",
|
|
70
|
+
"v1.0",
|
|
71
|
+
"powershell.exe",
|
|
72
|
+
);
|
|
73
|
+
const child = spawn(
|
|
74
|
+
executable,
|
|
75
|
+
["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP],
|
|
76
|
+
{
|
|
77
|
+
env: params.env,
|
|
78
|
+
windowsHide: true,
|
|
79
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
child.stdin.on("error", () => undefined);
|
|
83
|
+
child.stdin.end(input, "utf8");
|
|
84
|
+
return {
|
|
85
|
+
child: child as unknown as ChildProcessByStdio<null, Readable, Readable>,
|
|
86
|
+
terminate: () => {
|
|
87
|
+
child.kill("SIGKILL");
|
|
88
|
+
},
|
|
89
|
+
failureForExit: windowsSearchExitFailure,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { WINDOWS_FILESYSTEM_NATIVE } from "../../../src/shared/windows-file-io/native-script.js";
|
|
2
|
+
import { WINDOWS_FILESYSTEM_AUTHORITY } from "../../../src/shared/windows-file-io/authority-script.js";
|
|
3
|
+
|
|
4
|
+
import { WINDOWS_SEARCH_LEASE } from "./windows-search-lease.js";
|
|
5
|
+
|
|
6
|
+
const SEARCH_COMMAND = String.raw`
|
|
7
|
+
public static partial class AbotFilesystem {
|
|
8
|
+
static string QuoteSearchArgument(string value) {
|
|
9
|
+
var quoted = new StringBuilder("\"");
|
|
10
|
+
int slashes = 0;
|
|
11
|
+
foreach (char c in value) {
|
|
12
|
+
if (c == '\\') { slashes++; continue; }
|
|
13
|
+
if (c == '"') { quoted.Append('\\', slashes * 2 + 1); quoted.Append(c); slashes = 0; continue; }
|
|
14
|
+
quoted.Append('\\', slashes); slashes = 0; quoted.Append(c);
|
|
15
|
+
}
|
|
16
|
+
quoted.Append('\\', slashes * 2); quoted.Append('"');
|
|
17
|
+
return quoted.ToString();
|
|
18
|
+
}
|
|
19
|
+
public static int Search(string input) {
|
|
20
|
+
var json = new JavaScriptSerializer { MaxJsonLength = 2 * 1024 * 1024 };
|
|
21
|
+
try {
|
|
22
|
+
var request = json.Deserialize<Dictionary<string,object>>(input);
|
|
23
|
+
using (var lease = new SearchPathLease(request)) {
|
|
24
|
+
var args = (System.Collections.IEnumerable)request["args"];
|
|
25
|
+
var quoted = new List<string>();
|
|
26
|
+
foreach (object arg in args) quoted.Add(QuoteSearchArgument((string)arg));
|
|
27
|
+
var start = new System.Diagnostics.ProcessStartInfo {
|
|
28
|
+
FileName = Text(request, "command"), Arguments = String.Join(" ", quoted),
|
|
29
|
+
WorkingDirectory = lease.IsFile ? Path.GetDirectoryName(lease.Target) : lease.Target,
|
|
30
|
+
UseShellExecute = false, CreateNoWindow = true,
|
|
31
|
+
RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true
|
|
32
|
+
};
|
|
33
|
+
using (var process = System.Diagnostics.Process.Start(start)) {
|
|
34
|
+
process.StandardInput.Close();
|
|
35
|
+
var output = process.StandardOutput.BaseStream.CopyToAsync(Console.OpenStandardOutput());
|
|
36
|
+
var errors = process.StandardError.BaseStream.CopyToAsync(Console.OpenStandardError());
|
|
37
|
+
process.WaitForExit();
|
|
38
|
+
System.Threading.Tasks.Task.WaitAll(output, errors);
|
|
39
|
+
return process.ExitCode;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch { return 125; }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
export const WINDOWS_SEARCH_SOURCE = [
|
|
48
|
+
WINDOWS_FILESYSTEM_NATIVE,
|
|
49
|
+
WINDOWS_FILESYSTEM_AUTHORITY,
|
|
50
|
+
WINDOWS_SEARCH_LEASE,
|
|
51
|
+
SEARCH_COMMAND,
|
|
52
|
+
].join("\n");
|