@abot-ai/runtime 1.6.0 → 1.7.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/README.md +2 -0
- package/dist/src/bridge/request-steering.js +60 -15
- package/dist/src/capabilities/normal-invocation/contracts.d.ts +3 -0
- package/dist/src/capabilities/normal-invocation/output-channels.d.ts +10 -0
- package/dist/src/capabilities/normal-invocation/output-channels.js +29 -0
- package/dist/src/capabilities/normal-invocation/validator.js +4 -2
- package/dist/src/capabilities/tool-types.d.ts +1 -1
- package/dist/src/cli/host-companion-bundle.mjs +7570 -6781
- package/dist/src/cli/host-companion-entry.js +5 -22
- package/dist/src/cli/host-companion-input.d.ts +3 -0
- package/dist/src/cli/host-companion-input.js +21 -0
- package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
- package/dist/src/cli/host-companion-lifecycle.js +32 -0
- package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
- package/dist/src/cli/host-companion-setup-target.js +17 -0
- package/dist/src/cli/host-companion-startup.d.ts +2 -0
- package/dist/src/cli/host-companion-startup.js +7 -2
- package/dist/src/cli/host-companion.d.ts +6 -0
- package/dist/src/cli/host-companion.js +30 -27
- package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
- package/dist/src/cli/windows-companion-store-entry.js +67 -0
- package/dist/src/computer-access/command-output-capture.d.ts +37 -0
- package/dist/src/computer-access/command-output-capture.js +136 -0
- package/dist/src/computer-access/command-output-retention.d.ts +5 -0
- package/dist/src/computer-access/command-output-retention.js +90 -0
- package/dist/src/computer-access/command-output.d.ts +7 -0
- package/dist/src/computer-access/command-output.js +1 -0
- package/dist/src/computer-access/commands.d.ts +1 -0
- package/dist/src/computer-access/commands.js +1 -1
- package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
- package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
- package/dist/src/computer-access/companion/command-output.d.ts +13 -0
- package/dist/src/computer-access/companion/command-output.js +110 -0
- package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
- package/dist/src/computer-access/companion/install-link-macos.js +48 -0
- package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
- package/dist/src/computer-access/companion/install-link-registration.js +184 -0
- package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
- package/dist/src/computer-access/companion/install-link-windows.js +65 -0
- package/dist/src/computer-access/companion/install-link.d.ts +9 -0
- package/dist/src/computer-access/companion/install-link.js +54 -0
- package/dist/src/computer-access/companion/native-messages.js +3 -0
- package/dist/src/computer-access/companion/native-session.d.ts +1 -0
- package/dist/src/computer-access/companion/native-session.js +14 -2
- package/dist/src/computer-access/companion/native-supervisor.js +1 -0
- package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
- package/dist/src/computer-access/companion/notification-windows.js +8 -3
- package/dist/src/computer-access/companion/protocol.d.ts +1 -1
- package/dist/src/computer-access/companion/protocol.js +6 -0
- package/dist/src/computer-access/companion/release-version.d.ts +1 -1
- package/dist/src/computer-access/companion/release-version.js +1 -1
- package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
- package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
- package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
- package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
- package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
- package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
- package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
- package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
- package/dist/src/computer-access/contracts.d.ts +1 -1
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +5 -1
- package/dist/src/computer-access/process-capture.d.ts +6 -0
- package/dist/src/computer-access/process-capture.js +1 -0
- package/dist/src/computer-access/process-result.d.ts +2 -0
- package/dist/src/computer-access/process-result.js +14 -6
- package/dist/src/computer-access/process-runner.d.ts +2 -1
- package/dist/src/computer-access/process-runner.js +21 -13
- package/dist/src/model-gateway/server/configuration.d.ts +2 -0
- package/dist/src/model-gateway/server/configuration.js +73 -21
- package/dist/src/plugin-contract/install-source.d.ts +13 -0
- package/dist/src/plugin-contract/install-source.js +99 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -1
- package/dist/src/plugin-sdk/computer-access.d.ts +8 -0
- package/dist/src/plugin-sdk/computer-access.js +5 -0
- package/dist/src/runtime/adapters/in-memory-session-store.js +6 -16
- package/dist/src/runtime/admin/config-control.js +2 -1
- package/dist/src/runtime/automations/catalog.d.ts +3 -0
- package/dist/src/runtime/automations/catalog.js +1 -0
- package/dist/src/runtime/automations/model-dependency-projection.d.ts +2 -0
- package/dist/src/runtime/automations/service.d.ts +2 -0
- package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +10 -5
- package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +8 -7
- package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +2 -2
- package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +2 -2
- package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +2 -2
- package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -1
- package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +11 -5
- package/dist/src/runtime/capabilities/automations/tool-module.js +1 -1
- package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
- package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
- package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
- package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
- package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +6 -0
- package/dist/src/runtime/config/builders.js +6 -5
- package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
- package/dist/src/runtime/config/fields.js +15 -0
- package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
- package/dist/src/runtime/config/model-context-capacity.js +55 -0
- package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
- package/dist/src/runtime/config/model-execution-policy.js +16 -0
- package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
- package/dist/src/runtime/config/model-plugin-config.js +40 -0
- package/dist/src/runtime/config/schema.js +5 -1
- package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
- package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
- package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
- package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
- package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
- package/dist/src/runtime/config/web-ui.d.ts +5 -0
- package/dist/src/runtime/config/web-ui.js +5 -0
- package/dist/src/runtime/config.js +2 -0
- package/dist/src/runtime/local-application.d.ts +2 -0
- package/dist/src/runtime/local-host/app-owner.js +50 -6
- package/dist/src/runtime/local-host/app-request-control.d.ts +3 -1
- package/dist/src/runtime/local-host/app-request-control.js +91 -11
- package/dist/src/runtime/local-host/client-requests.js +32 -5
- package/dist/src/runtime/local-host/client-services.d.ts +2 -0
- package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
- package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
- package/dist/src/runtime/local-host/saved-approvals.js +23 -2
- package/dist/src/runtime/model/model-selection.js +4 -1
- package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
- package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
- package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
- package/dist/src/runtime/plugins/configuration-context.js +42 -0
- package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
- package/dist/src/runtime/plugins/configuration-settings.js +26 -0
- package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
- package/dist/src/runtime/plugins/configuration-store.js +100 -0
- package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
- package/dist/src/runtime/plugins/configuration-write.js +58 -0
- package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
- package/dist/src/runtime/plugins/installation/archive.js +107 -0
- package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
- package/dist/src/runtime/plugins/installation/github-download.js +72 -0
- package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
- package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +45 -0
- package/dist/src/runtime/plugins/installation/package.js +79 -0
- package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
- package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
- package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
- package/dist/src/runtime/plugins/installation/publication.js +17 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +41 -0
- package/dist/src/runtime/plugins/installation/service.js +80 -0
- package/dist/src/runtime/plugins/loader.js +15 -29
- package/dist/src/runtime/plugins/manifest-projection.js +1 -0
- package/dist/src/runtime/plugins/manifest-validator.js +3 -0
- package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
- package/dist/src/runtime/plugins/module-cache.js +19 -0
- package/dist/src/runtime/plugins/selection.d.ts +2 -0
- package/dist/src/runtime/plugins/selection.js +16 -11
- package/dist/src/runtime/ports.d.ts +6 -4
- package/dist/src/runtime/request/dependencies.d.ts +2 -1
- package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +1 -1
- package/dist/src/runtime/request/handler.js +8 -0
- package/dist/src/runtime/request/prepared-execution.js +6 -1
- package/dist/src/runtime/request/request-steering.d.ts +4 -0
- package/dist/src/runtime/request/request-steering.js +37 -12
- package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -0
- package/dist/src/runtime/request/worker-capability-composition.js +4 -1
- package/dist/src/runtime/scheduler/journal-index-state.d.ts +1 -1
- package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
- package/dist/src/sessions/assistant-initiative-message.js +12 -0
- package/dist/src/sessions/assistant-initiative.d.ts +2 -2
- package/dist/src/sessions/assistant-initiative.js +1 -7
- package/dist/src/sessions/durable-session-commit.d.ts +2 -1
- package/dist/src/sessions/durable-session-commit.js +6 -1
- package/dist/src/sessions/metadata/projection.d.ts +15 -0
- package/dist/src/sessions/metadata/projection.js +55 -0
- package/dist/src/sessions/metadata/publication.d.ts +12 -0
- package/dist/src/sessions/metadata/publication.js +78 -0
- package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
- package/dist/src/sessions/metadata/source-receipt.js +42 -0
- package/dist/src/sessions/metadata/store.d.ts +7 -0
- package/dist/src/sessions/metadata/store.js +119 -0
- package/dist/src/sessions/record/projection.d.ts +3 -1
- package/dist/src/sessions/record/projection.js +26 -18
- package/dist/src/sessions/request-lifecycle/service.js +3 -3
- package/dist/src/sessions/session-service.d.ts +2 -4
- package/dist/src/sessions/session-service.js +4 -16
- package/dist/src/sessions/session-store.d.ts +2 -1
- package/dist/src/sessions/session-store.js +9 -3
- package/dist/src/sessions/snapshot.d.ts +17 -0
- package/dist/src/sessions/snapshot.js +105 -0
- package/dist/src/sessions/types.d.ts +2 -0
- package/dist/src/shared/tool-selection.d.ts +2 -0
- package/dist/src/shared/tool-selection.js +7 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +14 -0
- package/dist/src/web-ui/app/app.js +6 -3
- package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +130 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
- package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +3 -0
- package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
- package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
- package/dist/src/web-ui/app/components/config-workspace.js +11 -2
- package/dist/src/web-ui/app/components/conversation-view.js +36 -5
- package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
- package/dist/src/web-ui/app/components/dashboard/workspace.js +2 -1
- package/dist/src/web-ui/app/components/operations-summary.js +105 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +1 -9
- package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
- package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
- package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
- package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
- package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +37 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +212 -0
- package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
- package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
- package/dist/src/web-ui/app/components/plugins/rendering.js +14 -2
- package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
- package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
- package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
- package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
- package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +2 -0
- package/dist/src/web-ui/app/components/runtime-setup-guide.js +15 -3
- package/dist/src/web-ui/app/components/spark-chat/empty-state.js +1 -0
- package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -0
- package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
- package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
- package/dist/src/web-ui/app/components/system-host/manager.js +45 -12
- package/dist/src/web-ui/app/components/system-host/rendering.js +111 -106
- package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
- package/dist/src/web-ui/app/components/workspace-shell.js +6 -0
- package/dist/src/web-ui/app/computer-access-feature.js +22 -5
- package/dist/src/web-ui/app/configuration-feature.js +35 -2
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +4 -1
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +88 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +9 -3
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +52 -144
- package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
- package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
- package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +11 -0
- package/dist/src/web-ui/app/controllers/session-controller.js +10 -2
- package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +6 -4
- package/dist/src/web-ui/app/controllers/spark-chat-reading.js +1 -0
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +24 -5
- package/dist/src/web-ui/app/controllers/workspace-route-controller.js +21 -19
- package/dist/src/web-ui/app/dashboard-feature.js +2 -2
- package/dist/src/web-ui/app/index.html +6 -2
- package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
- package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
- package/dist/src/web-ui/app/lib/workspace-route.d.ts +3 -0
- package/dist/src/web-ui/app/lib/workspace-route.js +4 -0
- package/dist/src/web-ui/app/passive-learning-feature.js +0 -1
- package/dist/src/web-ui/app/runtime-onboarding-feature.js +3 -0
- package/dist/src/web-ui/app/schedules-feature.js +1 -1
- package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
- package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
- package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +4 -4
- 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 +6 -1
- package/dist/src/web-ui/app/services/runtime-web-client.js +12 -3
- package/dist/src/web-ui/app/spark-chat-feature.js +76 -19
- package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
- package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
- package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +6 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +173 -0
- package/dist/src/web-ui/app/styles/46-system-host.css +61 -107
- package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
- package/dist/src/web-ui/app/styles/54-spark-chat.css +33 -1
- package/dist/src/web-ui/app/styles.css +4 -0
- package/dist/src/web-ui/local-runtime/api-router.js +11 -6
- package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
- package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +9 -3
- package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +5 -1
- package/dist/src/web-ui/local-runtime/environment-registry.js +53 -11
- package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
- package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
- package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
- package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
- package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
- package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
- package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
- package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
- package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
- package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
- package/dist/src/web-ui/local-runtime/request-execution.js +69 -37
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +44 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
- package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/session-routes.js +16 -4
- package/dist/src/web-ui/local-runtime/spark-chat-routes.js +4 -3
- package/dist/src/web-ui/plugin-capability-selection.js +4 -1
- package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
- package/dist/src/web-ui/plugin-configuration-input.js +68 -0
- package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
- package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
- package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
- package/dist/src/web-ui/plugin-configuration-service.js +66 -0
- package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
- package/dist/src/web-ui/plugin-configuration-view.js +45 -0
- package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
- package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +11 -1
- package/dist/src/web-ui/plugin-management-selection.js +22 -9
- package/dist/src/web-ui/plugin-management-service.d.ts +5 -1
- package/dist/src/web-ui/plugin-management-service.js +11 -7
- package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
- package/dist/src/web-ui/plugin-removal-error.js +16 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +30 -0
- package/dist/src/web-ui/plugin-removal-service.js +109 -0
- package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
- package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
- package/dist/src/web-ui/server.js +6 -2
- package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
- package/dist/src/web-ui/session-read-state/overview.js +16 -0
- package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
- package/dist/src/web-ui/session-read-state/pagination.js +42 -0
- package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
- package/dist/src/web-ui/session-read-state/service.d.ts +213 -20
- package/dist/src/web-ui/session-read-state/service.js +25 -23
- package/dist/src/web-ui/session-read-state/visible-messages.d.ts +3 -3
- package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
- package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
- package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
- package/dist/src/web-ui/system-host-setup/installers.js +0 -7
- package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
- package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
- package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/routes.js +32 -9
- package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
- package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
- package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
- package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
- package/docs/configuration.md +46 -0
- package/docs/installation.md +45 -24
- package/docs/plugins.md +165 -2
- package/docs/projects-and-full-plus.md +2 -6
- package/docs/runtime-library.md +0 -1
- package/docs/windows-companion-store.md +127 -0
- package/package.json +3 -3
- package/plugins/document-reader/plugin.json +1 -0
- package/plugins/exec/plugin.json +3 -0
- package/plugins/filesystem/plugin.json +2 -0
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/system/README.md +43 -3
- package/plugins/system/plugin.json +5 -0
- package/plugins/system/source/companion-command-output.ts +82 -0
- package/plugins/system/source/host-dispatch.ts +4 -0
- package/plugins/system/source/index.ts +11 -5
- package/plugins/system/source/local-command-output.ts +61 -0
- package/plugins/system/source/request-system-modules.ts +2 -0
- package/plugins/system/src/index.cjs +474 -39
- package/plugins/web/README.md +2 -2
- package/plugins/web/plugin.json +4 -0
- package/runtime.config.schema.json +25 -1
- package/src/runtime/README.md +12 -2
- package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
- package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
- package/docs/publishing.md +0 -167
|
@@ -234,6 +234,21 @@ function failureFromError(error, options) {
|
|
|
234
234
|
});
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
+
// src/plugin-sdk/context-text-result.ts
|
|
238
|
+
function deliverPluginTextResult(result, fields, budget) {
|
|
239
|
+
const assessed = enforcePluginResultByteBudget(result, budget);
|
|
240
|
+
if (!canHandOffContextText(result, assessed, budget)) return assessed;
|
|
241
|
+
return enforcePluginResultByteBudget(
|
|
242
|
+
{ ...result, contextTextFields: Object.freeze([...fields]) },
|
|
243
|
+
budget
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
function canHandOffContextText(original, assessed, budget) {
|
|
247
|
+
if (budget?.acceptsContextText !== true) return false;
|
|
248
|
+
if (assessed === original) return false;
|
|
249
|
+
return assessed.errorCode === "plugin_result_too_large";
|
|
250
|
+
}
|
|
251
|
+
|
|
237
252
|
// src/capabilities/tool-media.ts
|
|
238
253
|
var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
|
|
239
254
|
|
|
@@ -255,25 +270,25 @@ function hostStateDirectory(rootDir) {
|
|
|
255
270
|
}
|
|
256
271
|
function ensureHostStateDirectory(directory) {
|
|
257
272
|
(0, import_node_fs.mkdirSync)(directory, { recursive: true, mode: 448 });
|
|
258
|
-
const
|
|
259
|
-
if (!
|
|
273
|
+
const stat4 = (0, import_node_fs.lstatSync)(directory);
|
|
274
|
+
if (!stat4.isDirectory()) throw new Error("host_state_directory_invalid");
|
|
260
275
|
if (process.platform === "win32") return;
|
|
261
|
-
if (
|
|
276
|
+
if (stat4.uid !== process.getuid?.())
|
|
262
277
|
throw new Error("host_state_owner_invalid");
|
|
263
|
-
if ((
|
|
278
|
+
if ((stat4.mode & 63) !== 0)
|
|
264
279
|
throw new Error("host_state_directory_not_private");
|
|
265
280
|
}
|
|
266
281
|
function readHostPrivateJson(path) {
|
|
267
282
|
try {
|
|
268
|
-
const
|
|
269
|
-
if (!
|
|
283
|
+
const stat4 = (0, import_node_fs.lstatSync)(path);
|
|
284
|
+
if (!stat4.isFile()) throw new Error("host_state_file_invalid");
|
|
270
285
|
if (process.platform !== "win32") {
|
|
271
|
-
if (
|
|
286
|
+
if (stat4.uid !== process.getuid?.())
|
|
272
287
|
throw new Error("host_state_owner_invalid");
|
|
273
|
-
if ((
|
|
288
|
+
if ((stat4.mode & 63) !== 0)
|
|
274
289
|
throw new Error("host_state_file_not_private");
|
|
275
290
|
}
|
|
276
|
-
if (
|
|
291
|
+
if (stat4.size > 16384) throw new Error("host_state_file_too_large");
|
|
277
292
|
return JSON.parse((0, import_node_fs.readFileSync)(path, "utf8"));
|
|
278
293
|
} catch (error) {
|
|
279
294
|
if (error.code === "ENOENT") return void 0;
|
|
@@ -4259,7 +4274,7 @@ var import_node_path4 = require("node:path");
|
|
|
4259
4274
|
// src/computer-access/process-runner.ts
|
|
4260
4275
|
var import_node_child_process4 = require("node:child_process");
|
|
4261
4276
|
var STREAM_MAX_CHARS = 16e3;
|
|
4262
|
-
function runSystemProcess(input) {
|
|
4277
|
+
function runSystemProcess(input, capture) {
|
|
4263
4278
|
if (input.abortSignal?.aborted)
|
|
4264
4279
|
return Promise.resolve({
|
|
4265
4280
|
exitCode: null,
|
|
@@ -4287,6 +4302,7 @@ function runSystemProcess(input) {
|
|
|
4287
4302
|
if (timeout) clearTimeout(timeout);
|
|
4288
4303
|
if (stopGrace) clearTimeout(stopGrace);
|
|
4289
4304
|
input.abortSignal?.removeEventListener("abort", abort);
|
|
4305
|
+
capture?.end();
|
|
4290
4306
|
resolve(
|
|
4291
4307
|
Object.freeze({
|
|
4292
4308
|
exitCode,
|
|
@@ -4330,18 +4346,25 @@ function runSystemProcess(input) {
|
|
|
4330
4346
|
stopGrace.unref();
|
|
4331
4347
|
};
|
|
4332
4348
|
const abort = () => stop("aborted");
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
stdout
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
|
|
4349
|
+
const attachOutput = () => {
|
|
4350
|
+
if (capture) {
|
|
4351
|
+
capture.attach(child.stdout, child.stderr, () => stop("output_failed"));
|
|
4352
|
+
return;
|
|
4353
|
+
}
|
|
4354
|
+
child.stdout.setEncoding("utf8");
|
|
4355
|
+
child.stderr.setEncoding("utf8");
|
|
4356
|
+
child.stdout.on("data", (chunk) => {
|
|
4357
|
+
const remaining = streamMaxChars - stdout.length;
|
|
4358
|
+
truncated ||= chunk.length > remaining;
|
|
4359
|
+
stdout += chunk.slice(0, remaining);
|
|
4360
|
+
});
|
|
4361
|
+
child.stderr.on("data", (chunk) => {
|
|
4362
|
+
const remaining = streamMaxChars - stderr.length;
|
|
4363
|
+
truncated ||= chunk.length > remaining;
|
|
4364
|
+
stderr += chunk.slice(0, remaining);
|
|
4365
|
+
});
|
|
4366
|
+
};
|
|
4367
|
+
attachOutput();
|
|
4345
4368
|
child.once("error", (error) => {
|
|
4346
4369
|
status = "spawn_failed";
|
|
4347
4370
|
stderr = error.message.slice(0, STREAM_MAX_CHARS);
|
|
@@ -4963,7 +4986,7 @@ async function executeSystemCommand(input) {
|
|
|
4963
4986
|
);
|
|
4964
4987
|
await requireNativeWorkingDirectory(target, cwd);
|
|
4965
4988
|
const plan = params.elevated === true ? await elevatedSystemCommand({ target, command, cwd, run }) : unprivilegedSystemCommand(target, command, cwd);
|
|
4966
|
-
return run({
|
|
4989
|
+
return (input.runCommand ?? run)({
|
|
4967
4990
|
...plan,
|
|
4968
4991
|
timeoutMs,
|
|
4969
4992
|
...input.abortSignal ? { abortSignal: input.abortSignal } : {}
|
|
@@ -5007,6 +5030,11 @@ var LEGACY_EVIDENCE_LABELS = {
|
|
|
5007
5030
|
launch_request_dispatch: "application launch request dispatch"
|
|
5008
5031
|
};
|
|
5009
5032
|
function systemProcessResult(target, result, evidenceScope, application) {
|
|
5033
|
+
return enforcePluginResultByteBudget(
|
|
5034
|
+
buildSystemProcessResult(target, result, evidenceScope, application)
|
|
5035
|
+
);
|
|
5036
|
+
}
|
|
5037
|
+
function buildSystemProcessResult(target, result, evidenceScope, application) {
|
|
5010
5038
|
const stdoutOmittedChars = Math.max(
|
|
5011
5039
|
0,
|
|
5012
5040
|
result.stdout.length - STREAM_EXCERPT_CHARS
|
|
@@ -5049,24 +5077,28 @@ function systemProcessResult(target, result, evidenceScope, application) {
|
|
|
5049
5077
|
`Summary omitted characters: stdout=${stdoutOmittedChars}, stderr=${stderrOmittedChars}. Raw stream capture truncated: ${result.outputTruncated}.`
|
|
5050
5078
|
].join("\n");
|
|
5051
5079
|
if (hasSuccessfulSystemObservation(result)) {
|
|
5052
|
-
return
|
|
5080
|
+
return {
|
|
5081
|
+
ok: true,
|
|
5082
|
+
producedNewInformation: true,
|
|
5053
5083
|
output,
|
|
5054
5084
|
stdout: result.stdout,
|
|
5055
5085
|
stderr: result.stderr,
|
|
5056
5086
|
exitCode: 0,
|
|
5057
5087
|
data
|
|
5058
|
-
}
|
|
5088
|
+
};
|
|
5059
5089
|
}
|
|
5060
5090
|
const errorCode = result.status === "completed" ? "system_command_failed" : `system_${result.status}`;
|
|
5061
|
-
return
|
|
5091
|
+
return {
|
|
5092
|
+
ok: false,
|
|
5093
|
+
producedNewInformation: false,
|
|
5062
5094
|
errorCode,
|
|
5063
|
-
|
|
5095
|
+
error: hasUncertainDescendantState(result) ? "System command observation stopped. External or detached descendants may remain; inspect the target before retrying." : "The target did not report successful command completion.",
|
|
5064
5096
|
output,
|
|
5065
5097
|
stdout: result.stdout,
|
|
5066
5098
|
stderr: result.stderr,
|
|
5067
5099
|
...result.exitCode !== null ? { exitCode: result.exitCode } : {},
|
|
5068
5100
|
data
|
|
5069
|
-
}
|
|
5101
|
+
};
|
|
5070
5102
|
}
|
|
5071
5103
|
function hasSuccessfulSystemObservation(result) {
|
|
5072
5104
|
if (result.status !== "completed") return false;
|
|
@@ -5103,7 +5135,7 @@ function withSystemOperationErrors(operation) {
|
|
|
5103
5135
|
}
|
|
5104
5136
|
};
|
|
5105
5137
|
}
|
|
5106
|
-
function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run)) {
|
|
5138
|
+
function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run), commandOutput) {
|
|
5107
5139
|
const targets = async () => {
|
|
5108
5140
|
const observation = await observeSystemTargets(run);
|
|
5109
5141
|
return successResult({
|
|
@@ -5116,12 +5148,15 @@ function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => re
|
|
|
5116
5148
|
};
|
|
5117
5149
|
const command = async (params, context) => {
|
|
5118
5150
|
const target = await resolveTarget(readSystemTargetId(params.target));
|
|
5151
|
+
const output = commandOutput?.(context);
|
|
5119
5152
|
const result = await executeSystemCommand({
|
|
5120
5153
|
target,
|
|
5121
5154
|
params,
|
|
5122
5155
|
run,
|
|
5156
|
+
...output ? { runCommand: output.run } : {},
|
|
5123
5157
|
...context?.abortSignal ? { abortSignal: context.abortSignal } : {}
|
|
5124
5158
|
});
|
|
5159
|
+
if (output) return output.present(target, result);
|
|
5125
5160
|
return systemProcessResult(target, result, "command_process_completion");
|
|
5126
5161
|
};
|
|
5127
5162
|
const applications = async (params) => {
|
|
@@ -5170,6 +5205,255 @@ function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => re
|
|
|
5170
5205
|
};
|
|
5171
5206
|
}
|
|
5172
5207
|
|
|
5208
|
+
// src/computer-access/command-output-capture.ts
|
|
5209
|
+
var import_node_crypto6 = require("node:crypto");
|
|
5210
|
+
var import_node_events = require("node:events");
|
|
5211
|
+
var import_node_fs5 = require("node:fs");
|
|
5212
|
+
var import_promises6 = require("node:fs/promises");
|
|
5213
|
+
var import_node_path8 = require("node:path");
|
|
5214
|
+
var import_promises7 = require("node:stream/promises");
|
|
5215
|
+
|
|
5216
|
+
// src/computer-access/command-output-retention.ts
|
|
5217
|
+
var import_promises5 = require("node:fs/promises");
|
|
5218
|
+
var import_node_path7 = require("node:path");
|
|
5219
|
+
var DEFAULT_SYSTEM_OUTPUT_RETENTION_MS = 7 * 24 * 60 * 6e4;
|
|
5220
|
+
var activeSystemCaptures = /* @__PURE__ */ new Set();
|
|
5221
|
+
var jobs = /* @__PURE__ */ new Map();
|
|
5222
|
+
var CAPTURE_ID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;
|
|
5223
|
+
async function cleanupSystemOutput(root, retentionMs) {
|
|
5224
|
+
const entries = await (0, import_promises5.readdir)(root, { withFileTypes: true }).catch((error) => {
|
|
5225
|
+
if (error.code === "ENOENT") return [];
|
|
5226
|
+
throw error;
|
|
5227
|
+
});
|
|
5228
|
+
let removed = 0;
|
|
5229
|
+
for (const entry of entries) {
|
|
5230
|
+
if (!entry.isDirectory() || !CAPTURE_ID.test(entry.name)) continue;
|
|
5231
|
+
const directory = (0, import_node_path7.join)(root, entry.name);
|
|
5232
|
+
if (activeSystemCaptures.has(directory)) continue;
|
|
5233
|
+
const files = await (0, import_promises5.readdir)(directory);
|
|
5234
|
+
const times = await Promise.all(files.map(async (file) => (await (0, import_promises5.stat)((0, import_node_path7.join)(directory, file))).mtimeMs));
|
|
5235
|
+
const completedAt = Math.max((await (0, import_promises5.stat)(directory)).mtimeMs, ...times);
|
|
5236
|
+
const captureRetentionMs = await readCaptureRetention(directory, entry.name, retentionMs);
|
|
5237
|
+
if (Date.now() - completedAt < captureRetentionMs) continue;
|
|
5238
|
+
if (activeSystemCaptures.has(directory)) continue;
|
|
5239
|
+
await (0, import_promises5.rm)(directory, { recursive: true });
|
|
5240
|
+
removed += 1;
|
|
5241
|
+
}
|
|
5242
|
+
return removed;
|
|
5243
|
+
}
|
|
5244
|
+
async function readCaptureRetention(directory, id, fallbackMs) {
|
|
5245
|
+
let receipt;
|
|
5246
|
+
try {
|
|
5247
|
+
receipt = JSON.parse(await (0, import_promises5.readFile)((0, import_node_path7.join)(directory, "receipt.json"), "utf8"));
|
|
5248
|
+
} catch (error) {
|
|
5249
|
+
if (error.code === "ENOENT") return fallbackMs;
|
|
5250
|
+
if (error instanceof SyntaxError) return fallbackMs;
|
|
5251
|
+
throw error;
|
|
5252
|
+
}
|
|
5253
|
+
if (receipt === null || typeof receipt !== "object") return fallbackMs;
|
|
5254
|
+
if (!("kind" in receipt) || receipt.kind !== "system_command_output_v1") return fallbackMs;
|
|
5255
|
+
if (!("id" in receipt) || receipt.id !== id) return fallbackMs;
|
|
5256
|
+
if (!("retentionMs" in receipt) || typeof receipt.retentionMs !== "number") return fallbackMs;
|
|
5257
|
+
if (!Number.isSafeInteger(receipt.retentionMs) || receipt.retentionMs < 1) return fallbackMs;
|
|
5258
|
+
return receipt.retentionMs;
|
|
5259
|
+
}
|
|
5260
|
+
function scheduleSystemOutputCleanup(root, retentionMs) {
|
|
5261
|
+
const previous = jobs.get(root);
|
|
5262
|
+
if (previous) {
|
|
5263
|
+
previous.retentionMs = retentionMs;
|
|
5264
|
+
previous.requested = true;
|
|
5265
|
+
return;
|
|
5266
|
+
}
|
|
5267
|
+
const job = { retentionMs, requested: false };
|
|
5268
|
+
jobs.set(root, job);
|
|
5269
|
+
const sweep = async () => {
|
|
5270
|
+
job.requested = false;
|
|
5271
|
+
let empty = false;
|
|
5272
|
+
try {
|
|
5273
|
+
await cleanupSystemOutput(root, job.retentionMs);
|
|
5274
|
+
empty = (await (0, import_promises5.readdir)(root).catch((error) => {
|
|
5275
|
+
if (error.code === "ENOENT") return [];
|
|
5276
|
+
throw error;
|
|
5277
|
+
})).length === 0;
|
|
5278
|
+
} catch {
|
|
5279
|
+
process.emitWarning("SYSTEM output cleanup failed; retained output was not confirmed removed.", { code: "SYSTEM_OUTPUT_CLEANUP_FAILED" });
|
|
5280
|
+
}
|
|
5281
|
+
if (empty && !job.requested) {
|
|
5282
|
+
jobs.delete(root);
|
|
5283
|
+
return;
|
|
5284
|
+
}
|
|
5285
|
+
const timer = setTimeout(() => {
|
|
5286
|
+
void sweep();
|
|
5287
|
+
}, Math.max(1, Math.min(job.retentionMs, 60 * 6e4)));
|
|
5288
|
+
timer.unref();
|
|
5289
|
+
};
|
|
5290
|
+
void sweep();
|
|
5291
|
+
}
|
|
5292
|
+
|
|
5293
|
+
// src/computer-access/command-output-capture.ts
|
|
5294
|
+
var OUTPUT_IO_CHUNK_BYTES = 64 * 1024;
|
|
5295
|
+
async function createSystemOutputCapture(root, retentionMs) {
|
|
5296
|
+
const id = (0, import_node_crypto6.randomUUID)();
|
|
5297
|
+
const directory = (0, import_node_path8.join)(root, id);
|
|
5298
|
+
activeSystemCaptures.add(directory);
|
|
5299
|
+
try {
|
|
5300
|
+
await (0, import_promises6.mkdir)(directory, { recursive: true, mode: 448 });
|
|
5301
|
+
} catch {
|
|
5302
|
+
activeSystemCaptures.delete(directory);
|
|
5303
|
+
throw new SystemOperationError("system_output_storage_failed", "Output storage could not be prepared. The command was not dispatched.");
|
|
5304
|
+
}
|
|
5305
|
+
let failure;
|
|
5306
|
+
let stop;
|
|
5307
|
+
let ended = false;
|
|
5308
|
+
let retained = false;
|
|
5309
|
+
const sources = [];
|
|
5310
|
+
const streams = ["stdout", "stderr"].map((name) => {
|
|
5311
|
+
const path = (0, import_node_path8.join)(directory, name + ".bytes");
|
|
5312
|
+
const sink = (0, import_node_fs5.createWriteStream)(path, { flags: "wx", mode: 384, highWaterMark: OUTPUT_IO_CHUNK_BYTES, flush: true });
|
|
5313
|
+
const completion = (0, import_promises7.finished)(sink).catch(() => {
|
|
5314
|
+
failure ??= "write_failed";
|
|
5315
|
+
stop?.();
|
|
5316
|
+
});
|
|
5317
|
+
return { name, path, sink, completion, hash: (0, import_node_crypto6.createHash)("sha256") };
|
|
5318
|
+
});
|
|
5319
|
+
try {
|
|
5320
|
+
await Promise.all(streams.map(({ sink }) => (0, import_node_events.once)(sink, "open")));
|
|
5321
|
+
} catch {
|
|
5322
|
+
for (const { sink } of streams) sink.destroy();
|
|
5323
|
+
await Promise.all(streams.map(({ completion }) => completion));
|
|
5324
|
+
activeSystemCaptures.delete(directory);
|
|
5325
|
+
scheduleSystemOutputCleanup(root, retentionMs);
|
|
5326
|
+
throw new SystemOperationError("system_output_storage_failed", "Output files could not be opened. The command was not dispatched.");
|
|
5327
|
+
}
|
|
5328
|
+
scheduleSystemOutputCleanup(root, retentionMs);
|
|
5329
|
+
const capture = {
|
|
5330
|
+
attach(stdout, stderr, onFailure) {
|
|
5331
|
+
stop = onFailure;
|
|
5332
|
+
sources.push(stdout, stderr);
|
|
5333
|
+
stdout.on("data", (bytes) => streams[0].hash.update(bytes));
|
|
5334
|
+
stderr.on("data", (bytes) => streams[1].hash.update(bytes));
|
|
5335
|
+
stdout.pipe(streams[0].sink);
|
|
5336
|
+
stderr.pipe(streams[1].sink);
|
|
5337
|
+
if (failure) onFailure();
|
|
5338
|
+
},
|
|
5339
|
+
end() {
|
|
5340
|
+
if (ended) return;
|
|
5341
|
+
ended = true;
|
|
5342
|
+
for (const source of sources) {
|
|
5343
|
+
source.unpipe();
|
|
5344
|
+
source.destroy();
|
|
5345
|
+
}
|
|
5346
|
+
for (const { sink } of streams) if (!sink.destroyed && !sink.writableEnded) sink.end();
|
|
5347
|
+
}
|
|
5348
|
+
};
|
|
5349
|
+
let receipt;
|
|
5350
|
+
return {
|
|
5351
|
+
capture,
|
|
5352
|
+
get receipt() {
|
|
5353
|
+
return receipt;
|
|
5354
|
+
},
|
|
5355
|
+
get failure() {
|
|
5356
|
+
return failure;
|
|
5357
|
+
},
|
|
5358
|
+
retain() {
|
|
5359
|
+
retained = true;
|
|
5360
|
+
activeSystemCaptures.add(directory);
|
|
5361
|
+
},
|
|
5362
|
+
release() {
|
|
5363
|
+
retained = false;
|
|
5364
|
+
activeSystemCaptures.delete(directory);
|
|
5365
|
+
},
|
|
5366
|
+
async read(stream, offset, length) {
|
|
5367
|
+
const path = streams.find((entry) => entry.name === stream).path;
|
|
5368
|
+
const file = await (0, import_promises6.open)(path, "r");
|
|
5369
|
+
try {
|
|
5370
|
+
const bytes = Buffer.alloc(length);
|
|
5371
|
+
const { bytesRead } = await file.read(bytes, 0, length, offset);
|
|
5372
|
+
return bytes.subarray(0, bytesRead);
|
|
5373
|
+
} finally {
|
|
5374
|
+
await file.close();
|
|
5375
|
+
}
|
|
5376
|
+
},
|
|
5377
|
+
async finish(result, materialize = true) {
|
|
5378
|
+
capture.end();
|
|
5379
|
+
try {
|
|
5380
|
+
await Promise.all(streams.map(({ completion }) => completion));
|
|
5381
|
+
const sizes = await Promise.all(streams.map(async ({ path }) => {
|
|
5382
|
+
try {
|
|
5383
|
+
return (await (0, import_promises6.stat)(path)).size;
|
|
5384
|
+
} catch {
|
|
5385
|
+
failure ??= "read_failed";
|
|
5386
|
+
return 0;
|
|
5387
|
+
}
|
|
5388
|
+
}));
|
|
5389
|
+
let stdout = "", stderr = "";
|
|
5390
|
+
if (!failure && materialize) {
|
|
5391
|
+
try {
|
|
5392
|
+
[stdout, stderr] = await Promise.all(streams.map(({ path }) => (0, import_promises6.readFile)(path, "utf8")));
|
|
5393
|
+
} catch {
|
|
5394
|
+
failure = "read_failed";
|
|
5395
|
+
}
|
|
5396
|
+
}
|
|
5397
|
+
const completedAt = Date.now();
|
|
5398
|
+
receipt = {
|
|
5399
|
+
id,
|
|
5400
|
+
stdoutBytes: sizes[0],
|
|
5401
|
+
stderrBytes: sizes[1],
|
|
5402
|
+
completedAt: new Date(completedAt).toISOString(),
|
|
5403
|
+
retentionMs,
|
|
5404
|
+
complete: !failure,
|
|
5405
|
+
...!materialize ? { stdoutSha256: streams[0].hash.digest("hex"), stderrSha256: streams[1].hash.digest("hex") } : {}
|
|
5406
|
+
};
|
|
5407
|
+
try {
|
|
5408
|
+
const temporary = (0, import_node_path8.join)(directory, "receipt.tmp");
|
|
5409
|
+
await (0, import_promises6.writeFile)(temporary, JSON.stringify({
|
|
5410
|
+
kind: "system_command_output_v1",
|
|
5411
|
+
...receipt,
|
|
5412
|
+
processStatus: result?.status,
|
|
5413
|
+
exitCode: result?.exitCode,
|
|
5414
|
+
spawnedProcess: result?.spawnedProcess,
|
|
5415
|
+
...failure ? { storageFailure: failure } : {}
|
|
5416
|
+
}), { flag: "wx", mode: 384, flush: true });
|
|
5417
|
+
await (0, import_promises6.rename)(temporary, (0, import_node_path8.join)(directory, "receipt.json"));
|
|
5418
|
+
} catch {
|
|
5419
|
+
failure ??= "receipt_write_failed";
|
|
5420
|
+
receipt = { ...receipt, complete: false };
|
|
5421
|
+
}
|
|
5422
|
+
return { stdout, stderr };
|
|
5423
|
+
} finally {
|
|
5424
|
+
if (!retained) activeSystemCaptures.delete(directory);
|
|
5425
|
+
}
|
|
5426
|
+
}
|
|
5427
|
+
};
|
|
5428
|
+
}
|
|
5429
|
+
|
|
5430
|
+
// src/computer-access/companion/command-output-protocol.ts
|
|
5431
|
+
var SYSTEM_OUTPUT_CAPABILITY = "system_command_output_v1";
|
|
5432
|
+
var SYSTEM_OUTPUT_CHUNK_BYTES = 64 * 1024;
|
|
5433
|
+
function isStreamByteCount(value) {
|
|
5434
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
5435
|
+
}
|
|
5436
|
+
function isStreamDigest(value) {
|
|
5437
|
+
return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
|
|
5438
|
+
}
|
|
5439
|
+
function readSystemOutputTransfer(value) {
|
|
5440
|
+
if (!isHostRecord(value)) throw new Error("system_output_receipt_invalid");
|
|
5441
|
+
if (value.kind !== SYSTEM_OUTPUT_CAPABILITY) throw new Error("system_output_receipt_invalid");
|
|
5442
|
+
if (!isHostIdentifier(value.id)) throw new Error("system_output_receipt_invalid");
|
|
5443
|
+
if (!isStreamByteCount(value.stdoutBytes)) throw new Error("system_output_receipt_invalid");
|
|
5444
|
+
if (!isStreamByteCount(value.stderrBytes)) throw new Error("system_output_receipt_invalid");
|
|
5445
|
+
if (!isStreamDigest(value.stdoutSha256)) throw new Error("system_output_receipt_invalid");
|
|
5446
|
+
if (!isStreamDigest(value.stderrSha256)) throw new Error("system_output_receipt_invalid");
|
|
5447
|
+
return {
|
|
5448
|
+
kind: SYSTEM_OUTPUT_CAPABILITY,
|
|
5449
|
+
id: value.id,
|
|
5450
|
+
stdoutBytes: value.stdoutBytes,
|
|
5451
|
+
stderrBytes: value.stderrBytes,
|
|
5452
|
+
stdoutSha256: value.stdoutSha256,
|
|
5453
|
+
stderrSha256: value.stderrSha256
|
|
5454
|
+
};
|
|
5455
|
+
}
|
|
5456
|
+
|
|
5173
5457
|
// plugins/system/source/computer/public-action.ts
|
|
5174
5458
|
function readPublicComputerAction(params) {
|
|
5175
5459
|
const fields = ["desktop_ref", "observation_ref", "action_kind"];
|
|
@@ -5332,7 +5616,7 @@ function fits(value) {
|
|
|
5332
5616
|
}
|
|
5333
5617
|
|
|
5334
5618
|
// plugins/system/source/computer/request-computers.ts
|
|
5335
|
-
var
|
|
5619
|
+
var import_node_crypto8 = require("node:crypto");
|
|
5336
5620
|
|
|
5337
5621
|
// plugins/system/source/request-target-snapshot.ts
|
|
5338
5622
|
async function captureSystemTargetSnapshot(input) {
|
|
@@ -5449,14 +5733,14 @@ function modelSafeRouteObservation(route) {
|
|
|
5449
5733
|
}
|
|
5450
5734
|
|
|
5451
5735
|
// plugins/system/source/computer/desktop-bindings.ts
|
|
5452
|
-
var
|
|
5736
|
+
var import_node_crypto7 = require("node:crypto");
|
|
5453
5737
|
var DesktopBindings = class {
|
|
5454
5738
|
current;
|
|
5455
5739
|
windows = /* @__PURE__ */ new Map();
|
|
5456
5740
|
observe(result) {
|
|
5457
5741
|
this.windows.clear();
|
|
5458
5742
|
const windows = result.windows.map((window) => {
|
|
5459
|
-
const id2 = (0,
|
|
5743
|
+
const id2 = (0, import_node_crypto7.randomUUID)();
|
|
5460
5744
|
this.windows.set(id2, window.binding);
|
|
5461
5745
|
const { binding: _binding, ...details } = window;
|
|
5462
5746
|
return {
|
|
@@ -5472,7 +5756,7 @@ var DesktopBindings = class {
|
|
|
5472
5756
|
observation_ref: void 0,
|
|
5473
5757
|
coordinateSpace: result.desktop.coordinateSpace ?? "native_desktop"
|
|
5474
5758
|
};
|
|
5475
|
-
const id = (0,
|
|
5759
|
+
const id = (0, import_node_crypto7.randomUUID)();
|
|
5476
5760
|
this.current = {
|
|
5477
5761
|
id,
|
|
5478
5762
|
issuedAt: Date.now(),
|
|
@@ -5657,7 +5941,7 @@ var RequestComputers = class {
|
|
|
5657
5941
|
this.connection = connection;
|
|
5658
5942
|
this.nativeFactory = nativeFactory;
|
|
5659
5943
|
this.entries = snapshot === void 0 ? routes.map((route) => ({
|
|
5660
|
-
ref: (0,
|
|
5944
|
+
ref: (0, import_node_crypto8.randomUUID)(),
|
|
5661
5945
|
route,
|
|
5662
5946
|
bindings: new DesktopBindings()
|
|
5663
5947
|
})) : restoreComputers(routes, snapshot);
|
|
@@ -6026,6 +6310,77 @@ function prepareComputerModules(rootDir, modules, routes, connection, preparatio
|
|
|
6026
6310
|
}));
|
|
6027
6311
|
}
|
|
6028
6312
|
|
|
6313
|
+
// plugins/system/source/companion-command-output.ts
|
|
6314
|
+
var import_node_crypto9 = require("node:crypto");
|
|
6315
|
+
var import_node_string_decoder = require("node:string_decoder");
|
|
6316
|
+
function supportsCompanionCommandOutput(route) {
|
|
6317
|
+
return route.capabilities?.includes(SYSTEM_OUTPUT_CAPABILITY) === true;
|
|
6318
|
+
}
|
|
6319
|
+
async function executeCompanionCommand(input) {
|
|
6320
|
+
const { route, context } = input;
|
|
6321
|
+
const call = (operation, params, signal) => input.connection.executeHostOperation(input.rootDir, {
|
|
6322
|
+
hostId: route.hostId,
|
|
6323
|
+
connectionId: route.connectionId,
|
|
6324
|
+
operation,
|
|
6325
|
+
params: { ...params, target: route.target },
|
|
6326
|
+
...signal ? { abortSignal: signal } : {}
|
|
6327
|
+
});
|
|
6328
|
+
const receipt = await call("system_command_capture", {
|
|
6329
|
+
...input.params,
|
|
6330
|
+
...input.outputRetentionMs !== void 0 ? { outputRetentionMs: input.outputRetentionMs } : {}
|
|
6331
|
+
}, context?.abortSignal);
|
|
6332
|
+
if (!receipt.data?.outputTransfer && !receipt.ok) return receipt;
|
|
6333
|
+
let transfer;
|
|
6334
|
+
try {
|
|
6335
|
+
transfer = readSystemOutputTransfer(receipt.data?.outputTransfer);
|
|
6336
|
+
const stdout = await readStream(call, transfer, "stdout", context?.abortSignal);
|
|
6337
|
+
const stderr = await readStream(call, transfer, "stderr", context?.abortSignal);
|
|
6338
|
+
const { outputTransfer: _transfer, ...data } = receipt.data ?? {};
|
|
6339
|
+
const delivered = deliverPluginTextResult({
|
|
6340
|
+
...receipt,
|
|
6341
|
+
stdout,
|
|
6342
|
+
stderr: stderr || receipt.stderr,
|
|
6343
|
+
data: { ...data, outputDelivery: "complete", summaryOmittedChars: { stdout: stdout.length, stderr: stderr.length } }
|
|
6344
|
+
}, ["stdout", "stderr"], context?.resultBudget);
|
|
6345
|
+
if (delivered.errorCode === "plugin_result_too_large") return transferFailure(receipt, context);
|
|
6346
|
+
return delivered;
|
|
6347
|
+
} catch {
|
|
6348
|
+
return transferFailure(receipt, context);
|
|
6349
|
+
} finally {
|
|
6350
|
+
if (transfer) await call("system_command_output_close", { captureId: transfer.id }, AbortSignal.timeout(3e3)).catch(() => void 0);
|
|
6351
|
+
}
|
|
6352
|
+
}
|
|
6353
|
+
async function readStream(call, transfer, stream, signal) {
|
|
6354
|
+
const size = stream === "stdout" ? transfer.stdoutBytes : transfer.stderrBytes;
|
|
6355
|
+
const digest = stream === "stdout" ? transfer.stdoutSha256 : transfer.stderrSha256;
|
|
6356
|
+
const hash = (0, import_node_crypto9.createHash)("sha256");
|
|
6357
|
+
const decoder = new import_node_string_decoder.StringDecoder("utf8");
|
|
6358
|
+
let text = "";
|
|
6359
|
+
for (let offset = 0; offset < size; offset += SYSTEM_OUTPUT_CHUNK_BYTES) {
|
|
6360
|
+
signal?.throwIfAborted();
|
|
6361
|
+
const part = await call("system_command_output", { captureId: transfer.id, stream, offset }, signal);
|
|
6362
|
+
if (!part.ok) throw new Error("system_output_transfer_failed");
|
|
6363
|
+
const data = part.data;
|
|
6364
|
+
if (data?.captureId !== transfer.id || data.stream !== stream || data.offset !== offset) throw new Error("system_output_chunk_binding_invalid");
|
|
6365
|
+
if (typeof data.bytes !== "string" || data.bytes.length > SYSTEM_OUTPUT_CHUNK_BYTES * 2) throw new Error("system_output_chunk_invalid");
|
|
6366
|
+
const bytes = Buffer.from(data.bytes, "base64");
|
|
6367
|
+
if (bytes.toString("base64") !== data.bytes) throw new Error("system_output_chunk_invalid");
|
|
6368
|
+
if (bytes.length !== Math.min(SYSTEM_OUTPUT_CHUNK_BYTES, size - offset)) throw new Error("system_output_chunk_size_invalid");
|
|
6369
|
+
hash.update(bytes);
|
|
6370
|
+
text += decoder.write(bytes);
|
|
6371
|
+
}
|
|
6372
|
+
if (hash.digest("hex") !== digest) throw new Error("system_output_digest_invalid");
|
|
6373
|
+
return text + decoder.end();
|
|
6374
|
+
}
|
|
6375
|
+
function transferFailure(receipt, context) {
|
|
6376
|
+
return failureResult({
|
|
6377
|
+
errorCode: "system_output_delivery_pending",
|
|
6378
|
+
message: "The command settled, but its retained output could not be delivered completely. Process receipt is preserved; the command was not replayed.",
|
|
6379
|
+
...receipt.exitCode !== void 0 ? { exitCode: receipt.exitCode } : {},
|
|
6380
|
+
data: { ...receipt.data, outputDelivery: "pending", commandOk: receipt.ok, commandErrorCode: receipt.errorCode ?? null }
|
|
6381
|
+
}, context?.resultBudget);
|
|
6382
|
+
}
|
|
6383
|
+
|
|
6029
6384
|
// plugins/system/source/host-dispatch.ts
|
|
6030
6385
|
var defaultSystemHostConnection = {
|
|
6031
6386
|
readHostStatus,
|
|
@@ -6060,6 +6415,8 @@ function boundOperation(input, operation) {
|
|
|
6060
6415
|
const route = requireSystemRequestRoute(input.snapshot, params.target);
|
|
6061
6416
|
if (route.kind === "native")
|
|
6062
6417
|
return await input.nativeHandlers[operation](params, context);
|
|
6418
|
+
if (operation === "system_command" && supportsCompanionCommandOutput(route))
|
|
6419
|
+
return await executeCompanionCommand({ ...input, route, params, context });
|
|
6063
6420
|
return await input.connection.executeHostOperation(input.rootDir, {
|
|
6064
6421
|
hostId: route.hostId,
|
|
6065
6422
|
connectionId: route.connectionId,
|
|
@@ -6112,7 +6469,8 @@ async function prepareSystemRequestModules(rootDir, modules, dependencies = {},
|
|
|
6112
6469
|
rootDir,
|
|
6113
6470
|
snapshot,
|
|
6114
6471
|
connection,
|
|
6115
|
-
nativeHandlers
|
|
6472
|
+
nativeHandlers,
|
|
6473
|
+
outputRetentionMs: dependencies.outputRetentionMs
|
|
6116
6474
|
});
|
|
6117
6475
|
return Object.freeze([
|
|
6118
6476
|
...modules.filter((module2) => !isComputerTool(module2.definition.name)).map((module2) => projectSystemRequestModule(module2, snapshot, handlers)),
|
|
@@ -6173,8 +6531,85 @@ function systemExecutionBinding(snapshot) {
|
|
|
6173
6531
|
};
|
|
6174
6532
|
}
|
|
6175
6533
|
|
|
6534
|
+
// plugins/system/source/local-command-output.ts
|
|
6535
|
+
var import_node_path9 = require("node:path");
|
|
6536
|
+
var CONTEXT_STREAMS = Object.freeze(["stdout", "stderr"]);
|
|
6537
|
+
function createLocalSystemCommandOutput(plugin) {
|
|
6538
|
+
const root = (0, import_node_path9.join)(plugin.stateDir, "command-output");
|
|
6539
|
+
const retentionMs = systemCommandOutputRetentionMs(plugin);
|
|
6540
|
+
scheduleSystemOutputCleanup(root, retentionMs);
|
|
6541
|
+
return (context) => {
|
|
6542
|
+
let captured;
|
|
6543
|
+
return {
|
|
6544
|
+
async run(input) {
|
|
6545
|
+
if (input.abortSignal?.aborted) return runSystemProcess(input);
|
|
6546
|
+
captured = await createSystemOutputCapture(root, retentionMs);
|
|
6547
|
+
let result;
|
|
6548
|
+
try {
|
|
6549
|
+
result = await runSystemProcess(input, captured.capture);
|
|
6550
|
+
} catch (error) {
|
|
6551
|
+
await captured.finish();
|
|
6552
|
+
throw error;
|
|
6553
|
+
}
|
|
6554
|
+
const streams = await captured.finish(result);
|
|
6555
|
+
return {
|
|
6556
|
+
...result,
|
|
6557
|
+
stdout: streams.stdout,
|
|
6558
|
+
stderr: streams.stderr || result.stderr,
|
|
6559
|
+
outputTruncated: Boolean(captured.failure)
|
|
6560
|
+
};
|
|
6561
|
+
},
|
|
6562
|
+
async present(target, result) {
|
|
6563
|
+
if (captured?.failure) return outputFailure(target, result, context, captured.receipt, captured.failure);
|
|
6564
|
+
const receipt = buildSystemProcessResult(target, result, "command_process_completion");
|
|
6565
|
+
const delivered = deliverPluginTextResult({
|
|
6566
|
+
...receipt,
|
|
6567
|
+
data: { ...receipt.data, ...captured?.receipt ? { outputCapture: captured.receipt } : {} }
|
|
6568
|
+
}, CONTEXT_STREAMS, context?.resultBudget);
|
|
6569
|
+
if (delivered.errorCode === "plugin_result_too_large")
|
|
6570
|
+
return outputFailure(target, result, context, captured?.receipt);
|
|
6571
|
+
return delivered;
|
|
6572
|
+
}
|
|
6573
|
+
};
|
|
6574
|
+
};
|
|
6575
|
+
}
|
|
6576
|
+
function outputFailure(target, result, context, capture, storageFailure) {
|
|
6577
|
+
return failureResult({
|
|
6578
|
+
errorCode: storageFailure ? "system_output_storage_failed" : "system_output_delivery_pending",
|
|
6579
|
+
message: "The command was dispatched. Its output could not be delivered completely; do not repeat the command just to retrieve output. Inspect the process receipt and retained capture.",
|
|
6580
|
+
...result.exitCode !== null ? { exitCode: result.exitCode } : {},
|
|
6581
|
+
data: {
|
|
6582
|
+
target: target.id,
|
|
6583
|
+
transport: target.transport,
|
|
6584
|
+
processStatus: result.status,
|
|
6585
|
+
spawnedProcess: result.spawnedProcess ?? null,
|
|
6586
|
+
exitCode: result.exitCode,
|
|
6587
|
+
outputCapture: capture ?? null,
|
|
6588
|
+
...storageFailure ? { storageFailure } : {},
|
|
6589
|
+
outputDelivery: "pending",
|
|
6590
|
+
evidenceScope: "command_process_completion",
|
|
6591
|
+
independentOutcomeCheck: "not_performed",
|
|
6592
|
+
observationMeta: { kind: "volatile_external", carryPolicy: "never" }
|
|
6593
|
+
}
|
|
6594
|
+
}, context?.resultBudget);
|
|
6595
|
+
}
|
|
6596
|
+
function systemCommandOutputRetentionMs(plugin) {
|
|
6597
|
+
return readBoundedInteger(plugin.config?.outputRetentionMs, {
|
|
6598
|
+
name: "outputRetentionMs",
|
|
6599
|
+
defaultValue: DEFAULT_SYSTEM_OUTPUT_RETENTION_MS,
|
|
6600
|
+
minimum: 1,
|
|
6601
|
+
maximum: Number.MAX_SAFE_INTEGER
|
|
6602
|
+
});
|
|
6603
|
+
}
|
|
6604
|
+
|
|
6176
6605
|
// plugins/system/source/index.ts
|
|
6177
|
-
var index_default = defineRuntimePlugin((
|
|
6178
|
-
|
|
6179
|
-
|
|
6180
|
-
|
|
6606
|
+
var index_default = defineRuntimePlugin((context) => {
|
|
6607
|
+
const output = createLocalSystemCommandOutput(context);
|
|
6608
|
+
return {
|
|
6609
|
+
handlers: { ...createSystemHandlers(void 0, void 0, output), ...unboundComputerHandlers() },
|
|
6610
|
+
prepareRequest: (modules, preparation) => prepareSystemRequestModules(context.rootDir, modules, {
|
|
6611
|
+
outputRetentionMs: systemCommandOutputRetentionMs(context),
|
|
6612
|
+
createNativeHandlers: (resolve) => createSystemHandlers(void 0, resolve, output)
|
|
6613
|
+
}, preparation)
|
|
6614
|
+
};
|
|
6615
|
+
});
|
package/plugins/web/README.md
CHANGED
|
@@ -130,5 +130,5 @@ discovery of a URL absent from the catalog. It does not require a search key,
|
|
|
130
130
|
external network, or model invocation.
|
|
131
131
|
|
|
132
132
|
Run `npm run build:plugins` followed by `npm run validate` from the repository
|
|
133
|
-
root.
|
|
134
|
-
model
|
|
133
|
+
root. These offline checks do not establish availability of external sources or
|
|
134
|
+
model behavior in a live client session.
|