@abot-ai/runtime 1.3.1 → 1.4.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/plugins/system/source/application-catalog.d.ts +14 -0
- package/dist/plugins/system/source/application-catalog.js +185 -0
- package/dist/plugins/system/source/application-launch.d.ts +10 -0
- package/dist/plugins/system/source/application-launch.js +80 -0
- package/dist/plugins/system/source/application-observation.d.ts +25 -0
- package/dist/plugins/system/source/application-observation.js +53 -0
- package/dist/plugins/system/source/commands.d.ts +7 -0
- package/dist/plugins/system/source/commands.js +71 -0
- package/dist/plugins/system/source/companion/autostart.d.ts +16 -0
- package/dist/plugins/system/source/companion/autostart.js +146 -0
- package/dist/plugins/system/source/companion/broker-location.d.ts +11 -0
- package/dist/plugins/system/source/companion/broker-location.js +76 -0
- package/dist/plugins/system/source/companion/broker-server.d.ts +4 -0
- package/dist/plugins/system/source/companion/broker-server.js +147 -0
- package/dist/plugins/system/source/companion/connection.d.ts +25 -0
- package/dist/plugins/system/source/companion/connection.js +182 -0
- package/dist/plugins/system/source/companion/liveness.d.ts +3 -0
- package/dist/plugins/system/source/companion/liveness.js +20 -0
- package/dist/plugins/system/source/companion/native-address.d.ts +12 -0
- package/dist/plugins/system/source/companion/native-address.js +41 -0
- package/dist/plugins/system/source/companion/native-identity.d.ts +2 -0
- package/dist/plugins/system/source/companion/native-identity.js +23 -0
- package/dist/plugins/system/source/companion/native-messages.d.ts +9 -0
- package/dist/plugins/system/source/companion/native-messages.js +77 -0
- package/dist/plugins/system/source/companion/native-session.d.ts +19 -0
- package/dist/plugins/system/source/companion/native-session.js +205 -0
- package/dist/plugins/system/source/companion/native-state.d.ts +22 -0
- package/dist/plugins/system/source/companion/native-state.js +126 -0
- package/dist/plugins/system/source/companion/native-supervisor.d.ts +10 -0
- package/dist/plugins/system/source/companion/native-supervisor.js +93 -0
- package/dist/plugins/system/source/companion/pairing-store.d.ts +22 -0
- package/dist/plugins/system/source/companion/pairing-store.js +102 -0
- package/dist/plugins/system/source/companion/private-store.d.ts +4 -0
- package/dist/plugins/system/source/companion/private-store.js +59 -0
- package/dist/plugins/system/source/companion/process-owner-identity.d.ts +22 -0
- package/dist/plugins/system/source/companion/process-owner-identity.js +144 -0
- package/dist/plugins/system/source/companion/protocol.d.ts +57 -0
- package/dist/plugins/system/source/companion/protocol.js +66 -0
- package/dist/plugins/system/source/contracts.d.ts +38 -0
- package/dist/plugins/system/source/contracts.js +7 -0
- package/dist/plugins/system/source/elevation.d.ts +8 -0
- package/dist/plugins/system/source/elevation.js +57 -0
- package/dist/plugins/system/source/handlers.d.ts +3 -0
- package/dist/plugins/system/source/handlers.js +90 -0
- package/dist/plugins/system/source/host-evidence.d.ts +4 -0
- package/dist/plugins/system/source/host-evidence.js +52 -0
- package/dist/plugins/system/source/host-observation.d.ts +25 -0
- package/dist/plugins/system/source/host-observation.js +59 -0
- package/dist/plugins/system/source/process-result.d.ts +4 -0
- package/dist/plugins/system/source/process-result.js +86 -0
- package/dist/plugins/system/source/process-runner.d.ts +3 -0
- package/dist/plugins/system/source/process-runner.js +103 -0
- package/dist/plugins/system/source/target-observation.d.ts +18 -0
- package/dist/plugins/system/source/target-observation.js +29 -0
- package/dist/plugins/system/source/targets.d.ts +8 -0
- package/dist/plugins/system/source/targets.js +101 -0
- package/dist/scripts/add-runtime-model.js +10 -53
- package/dist/scripts/runtime-model-addition.d.ts +13 -0
- package/dist/scripts/runtime-model-addition.js +53 -0
- package/dist/scripts/runtime-setup-files.d.ts +3 -1
- package/dist/scripts/runtime-setup-files.js +18 -1
- package/dist/src/capabilities/file-output-presentation.d.ts +43 -0
- package/dist/src/capabilities/file-output-presentation.js +133 -0
- package/dist/src/capabilities/tool-definition-validator/definition-parser.js +2 -0
- package/dist/src/capabilities/tool-definition-validator/event-input-text-options.d.ts +5 -0
- package/dist/src/capabilities/tool-definition-validator/event-input-text-options.js +37 -0
- package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
- package/dist/src/capabilities/tool-definition-validator/module-registry.js +12 -0
- package/dist/src/capabilities/tool-event-input-text.d.ts +9 -0
- package/dist/src/capabilities/tool-event-input-text.js +64 -0
- package/dist/src/capabilities/tool-event-metadata.js +10 -0
- package/dist/src/capabilities/tool-executor.d.ts +1 -0
- package/dist/src/capabilities/tool-executor.js +1 -0
- package/dist/src/capabilities/tool-permission-mode.d.ts +7 -0
- package/dist/src/capabilities/tool-permission-mode.js +27 -0
- package/dist/src/capabilities/tool-types.d.ts +18 -2
- package/dist/src/cli/abot.js +18 -15
- package/dist/src/cli/host-companion-bundle.mjs +5201 -0
- package/dist/src/cli/host-companion-entry.d.ts +8 -0
- package/dist/src/cli/host-companion-entry.js +70 -0
- package/dist/src/cli/host-companion-startup.d.ts +4 -0
- package/dist/src/cli/host-companion-startup.js +35 -0
- package/dist/src/cli/host-companion.d.ts +5 -0
- package/dist/src/cli/host-companion.js +203 -0
- package/dist/src/model-gateway/server/configuration.js +4 -1
- package/dist/src/model-gateway/server/contracts.d.ts +2 -0
- package/dist/src/plugin-contract/entrypoint.d.ts +4 -2
- package/dist/src/plugin-contract/manifest.d.ts +1 -0
- package/dist/src/runtime/adapters/config-file-transaction.d.ts +46 -0
- package/dist/src/runtime/adapters/config-file-transaction.js +158 -0
- package/dist/src/runtime/adapters/configured-skill-provider.js +3 -3
- package/dist/src/runtime/adapters/in-memory-session-store.js +11 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +7 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +4 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/install.d.ts +1 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/install.js +5 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.js +15 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +2 -0
- package/dist/src/runtime/adapters/long-term-memory/onboarding-config-repository.js +17 -43
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/catalog/registrations.js +6 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +10 -1
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.d.ts +11 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.js +37 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.d.ts +7 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.js +105 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +29 -3
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.d.ts +1 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.js +1 -0
- package/dist/src/runtime/capabilities/configured-tool-registry.js +9 -1
- package/dist/src/runtime/capabilities/file-output-root-identity.d.ts +5 -0
- package/dist/src/runtime/capabilities/file-output-root-identity.js +146 -0
- package/dist/src/runtime/capabilities/file-output-root-marker-creation.d.ts +5 -0
- package/dist/src/runtime/capabilities/file-output-root-marker-creation.js +63 -0
- package/dist/src/runtime/capabilities/request-bound-tool-registry.d.ts +1 -0
- package/dist/src/runtime/capabilities/request-bound-tool-registry.js +6 -1
- package/dist/src/runtime/capabilities/request-module-preparation.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-module-preparation.js +102 -0
- package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +10 -0
- package/dist/src/runtime/capabilities/request-permission-catalog.js +50 -0
- package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +4 -0
- package/dist/src/runtime/capabilities/request-permission-tool-registry.js +61 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +5 -2
- package/dist/src/runtime/capabilities/request-working-directory.d.ts +3 -0
- package/dist/src/runtime/capabilities/request-working-directory.js +12 -0
- package/dist/src/runtime/composition.d.ts +2 -0
- package/dist/src/runtime/config/runner/loader.d.ts +4 -0
- package/dist/src/runtime/config/runner/loader.js +23 -3
- package/dist/src/runtime/context/capability-brief-budget.d.ts +18 -0
- package/dist/src/runtime/context/capability-brief-budget.js +38 -0
- package/dist/src/runtime/context/capability-brief-readmission.d.ts +21 -0
- package/dist/src/runtime/context/capability-brief-readmission.js +47 -0
- package/dist/src/runtime/context/capability-brief.d.ts +9 -2
- package/dist/src/runtime/context/capability-brief.js +21 -39
- package/dist/src/runtime/context/capability-descriptions.d.ts +3 -0
- package/dist/src/runtime/context/capability-descriptions.js +23 -0
- package/dist/src/runtime/default-environment-adapters.js +3 -4
- package/dist/src/runtime/local-application.d.ts +18 -0
- package/dist/src/runtime/local-application.js +12 -0
- package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -0
- package/dist/src/runtime/local-host/app-service-dispatch.js +9 -0
- package/dist/src/runtime/local-host/client-services.d.ts +16 -0
- package/dist/src/runtime/local-host/client-services.js +3 -2
- package/dist/src/runtime/local-host/contracts.d.ts +4 -0
- package/dist/src/runtime/local-host/startup-connection.js +22 -7
- package/dist/src/runtime/local-host/transport.js +14 -2
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +5 -2
- package/dist/src/runtime/orchestration/role-calls/command-decoder.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.js +46 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +8 -4
- package/dist/src/runtime/orchestration/role-calls/transactions.js +2 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.d.ts +48 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.js +9 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-source.d.ts +7 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-source.js +85 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.js +17 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-validation.d.ts +10 -0
- package/dist/src/runtime/orchestration/role-calls/work-plan-validation.js +149 -0
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +1 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
- package/dist/src/runtime/plugins/compiled-catalog.d.ts +2 -1
- package/dist/src/runtime/plugins/configured-manifests.d.ts +3 -0
- package/dist/src/runtime/plugins/configured-manifests.js +37 -0
- package/dist/src/runtime/plugins/entrypoint-validation.d.ts +6 -0
- package/dist/src/runtime/plugins/entrypoint-validation.js +74 -0
- package/dist/src/runtime/plugins/loader.js +11 -123
- package/dist/src/runtime/plugins/manifest-discovery.d.ts +4 -1
- package/dist/src/runtime/plugins/manifest-discovery.js +8 -1
- package/dist/src/runtime/plugins/manifest-projection.js +3 -0
- package/dist/src/runtime/plugins/manifest-validator.js +7 -1
- package/dist/src/runtime/plugins/runtime-capability-plugins.d.ts +4 -0
- package/dist/src/runtime/plugins/runtime-capability-plugins.js +7 -0
- package/dist/src/runtime/plugins/selection.d.ts +14 -0
- package/dist/src/runtime/plugins/selection.js +38 -0
- package/dist/src/runtime/ports.d.ts +8 -2
- package/dist/src/runtime/projects/contracts.d.ts +40 -0
- package/dist/src/runtime/projects/contracts.js +10 -0
- package/dist/src/runtime/projects/folders.d.ts +7 -0
- package/dist/src/runtime/projects/folders.js +110 -0
- package/dist/src/runtime/projects/repository.d.ts +10 -0
- package/dist/src/runtime/projects/repository.js +54 -0
- package/dist/src/runtime/projects/service.d.ts +3 -0
- package/dist/src/runtime/projects/service.js +34 -0
- package/dist/src/runtime/projects/session-paths.d.ts +5 -0
- package/dist/src/runtime/projects/session-paths.js +13 -0
- package/dist/src/runtime/request/execution-agent-plan-update.d.ts +4 -0
- package/dist/src/runtime/request/execution-agent-plan-update.js +13 -0
- package/dist/src/runtime/request/execution-agent-root-execution.js +9 -1
- package/dist/src/runtime/request/handler.js +9 -2
- package/dist/src/runtime/request/input.d.ts +2 -1
- package/dist/src/runtime/request/input.js +1 -6
- package/dist/src/runtime/request/role-call-planner-events.js +4 -0
- package/dist/src/runtime/request/role-executor-composition.js +9 -1
- package/dist/src/runtime/request/root-contract.d.ts +6 -1
- package/dist/src/runtime/request/root-execution-kernel.js +17 -0
- package/dist/src/runtime/request/root-plan-event-projection.d.ts +3 -0
- package/dist/src/runtime/request/root-plan-event-projection.js +32 -0
- package/dist/src/runtime/request/root-plan-update.d.ts +15 -0
- package/dist/src/runtime/request/root-plan-update.js +20 -0
- package/dist/src/runtime/request/worker-capability-composition.d.ts +1 -0
- package/dist/src/runtime/request/worker-capability-composition.js +2 -0
- package/dist/src/runtime/runtime-environment.d.ts +1 -0
- package/dist/src/runtime/runtime-environment.js +2 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.d.ts +32 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-receipt.js +106 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.d.ts +5 -0
- package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.js +40 -0
- package/dist/src/runtime/steps/auditor-decision/audit-input-state.d.ts +12 -0
- package/dist/src/runtime/steps/auditor-decision/audit-input-state.js +101 -0
- package/dist/src/runtime/steps/auditor-decision/contracts.d.ts +31 -16
- package/dist/src/runtime/steps/auditor-decision/contracts.js +3 -3
- package/dist/src/runtime/steps/auditor-decision/evidence-binding.d.ts +5 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-binding.js +43 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-coverage.d.ts +2 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-coverage.js +71 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.d.ts +13 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-inventory.js +89 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.d.ts +10 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-representation.js +56 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-selection.d.ts +9 -0
- package/dist/src/runtime/steps/auditor-decision/evidence-selection.js +71 -0
- package/dist/src/runtime/steps/auditor-decision/format.js +44 -2
- package/dist/src/runtime/steps/auditor-decision/index.d.ts +3 -0
- package/dist/src/runtime/steps/auditor-decision/index.js +3 -0
- package/dist/src/runtime/steps/auditor-decision/input.d.ts +2 -2
- package/dist/src/runtime/steps/auditor-decision/input.js +64 -20
- package/dist/src/runtime/steps/auditor-decision/parser.js +38 -23
- package/dist/src/runtime/steps/auditor-decision/projection.js +49 -99
- package/dist/src/runtime/steps/auditor-decision/prompt.d.ts +1 -1
- package/dist/src/runtime/steps/auditor-decision/prompt.js +9 -4
- package/dist/src/runtime/steps/auditor-decision/run.js +79 -47
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +8 -1
- package/dist/src/runtime/steps/execution-agent/contracts.js +2 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +4 -0
- package/dist/src/runtime/steps/execution-agent/format.js +4 -3
- package/dist/src/runtime/steps/execution-agent/input.js +10 -11
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +11 -4
- package/dist/src/runtime/steps/execution-agent/state-context.js +10 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +18 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +86 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.js +38 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-sources.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-sources.js +54 -0
- package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +40 -0
- package/dist/src/runtime/steps/planner-decision/capability-brief.js +47 -0
- package/dist/src/runtime/steps/planner-decision/input.d.ts +4 -2
- package/dist/src/runtime/steps/planner-decision/input.js +23 -13
- package/dist/src/runtime/steps/planner-decision/prompt.js +2 -2
- package/dist/src/runtime/steps/planner-decision/run.js +11 -7
- package/dist/src/runtime/steps/planner-graph/parser.js +0 -11
- package/dist/src/runtime/steps/planner-graph/prompt.js +2 -1
- package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.js +39 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +2 -1
- package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.d.ts +3 -1
- package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.js +20 -1
- package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.d.ts +1 -1
- package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.js +6 -6
- package/dist/src/runtime/steps/worker-decision/parser/capability-invocation-validation.js +2 -1
- package/dist/src/sessions/project-binding.d.ts +12 -0
- package/dist/src/sessions/project-binding.js +49 -0
- package/dist/src/sessions/record/projection.d.ts +6 -1
- package/dist/src/sessions/record/projection.js +1 -0
- package/dist/src/sessions/session-service.d.ts +2 -1
- package/dist/src/sessions/session-service.js +11 -1
- package/dist/src/sessions/types.d.ts +7 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +121 -1
- package/dist/src/web-ui/app/app-bootstrap.js +3 -0
- package/dist/src/web-ui/app/app-dom.js +3 -0
- package/dist/src/web-ui/app/app-state.js +38 -0
- package/dist/src/web-ui/app/app.js +76 -67
- package/dist/src/web-ui/app/components/config-workspace/config-model.js +23 -3
- package/dist/src/web-ui/app/components/config-workspace/dashboard-rendering.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/field-rendering.js +2 -0
- package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +6 -0
- package/dist/src/web-ui/app/components/config-workspace/model-setup-entry.js +27 -0
- package/dist/src/web-ui/app/components/config-workspace/raw-config-repair.js +28 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +5 -0
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +23 -3
- package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +26 -8
- package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +56 -0
- package/dist/src/web-ui/app/components/config-workspace.js +11 -0
- package/dist/src/web-ui/app/components/conversation-activity.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-activity.js +10 -2
- package/dist/src/web-ui/app/components/conversation-file-action.js +33 -0
- package/dist/src/web-ui/app/components/conversation-file-focus.d.ts +12 -0
- package/dist/src/web-ui/app/components/conversation-file-focus.js +149 -0
- package/dist/src/web-ui/app/components/conversation-file-preview.d.ts +23 -0
- package/dist/src/web-ui/app/components/conversation-file-preview.js +247 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.js +10 -2
- package/dist/src/web-ui/app/components/conversation-tool-evidence.d.ts +9 -0
- package/dist/src/web-ui/app/components/conversation-tool-evidence.js +129 -0
- package/dist/src/web-ui/app/components/conversation-tools.d.ts +6 -0
- package/dist/src/web-ui/app/components/conversation-tools.js +25 -105
- package/dist/src/web-ui/app/components/conversation-view.js +10 -1
- package/dist/src/web-ui/app/components/dashboard/workspace.js +19 -7
- package/dist/src/web-ui/app/components/model-setup/rendering.js +99 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +111 -0
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +16 -0
- package/dist/src/web-ui/app/components/model-setup/validation.js +125 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +44 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +370 -0
- package/dist/src/web-ui/app/components/plugins/manager.js +200 -0
- package/dist/src/web-ui/app/components/plugins/rendering.js +124 -0
- package/dist/src/web-ui/app/components/plugins/view-state.js +123 -0
- package/dist/src/web-ui/app/components/project-creation.js +119 -0
- package/dist/src/web-ui/app/components/project-session-groups.js +95 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +83 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.d.ts +9 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.js +198 -0
- package/dist/src/web-ui/app/components/runtime-setup/bridge-rendering.js +107 -0
- package/dist/src/web-ui/app/components/runtime-setup/commands.js +54 -0
- package/dist/src/web-ui/app/components/runtime-setup/configuration-recovery.js +25 -0
- package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +154 -0
- package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +71 -0
- package/dist/src/web-ui/app/components/runtime-setup/context-window.js +18 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.d.ts +15 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +87 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +30 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +57 -0
- package/dist/src/web-ui/app/components/runtime-setup/embedding.js +284 -0
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +117 -0
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +173 -0
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +141 -0
- package/dist/src/web-ui/app/components/runtime-setup/validation.js +69 -0
- package/dist/src/web-ui/app/components/runtime-setup/view-state.js +58 -0
- package/dist/src/web-ui/app/components/runtime-setup/wizard-shell.js +27 -0
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +66 -5
- package/dist/src/web-ui/app/components/runtime-setup-guide.js +415 -461
- package/dist/src/web-ui/app/components/system-host/download.js +38 -0
- package/dist/src/web-ui/app/components/system-host/manager.js +249 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +88 -0
- package/dist/src/web-ui/app/components/system-host/setup-notice.js +87 -0
- package/dist/src/web-ui/app/components/system-host/visibility.js +35 -0
- package/dist/src/web-ui/app/components/tool-approval-card.d.ts +4 -0
- package/dist/src/web-ui/app/components/tool-approval-card.js +15 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +118 -0
- package/dist/src/web-ui/app/configuration-feature.js +125 -4
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +2 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +4 -3
- package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.d.ts +24 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.js +158 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.d.ts +19 -0
- package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.js +63 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +2 -0
- package/dist/src/web-ui/app/controllers/conversation-view-feature.js +28 -0
- package/dist/src/web-ui/app/controllers/dashboard-controller.js +17 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +45 -0
- package/dist/src/web-ui/app/controllers/projects-controller.js +278 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.js +3 -0
- package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +13 -6
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -1
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +11 -95
- package/dist/src/web-ui/app/controllers/session-controller.js +64 -57
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.d.ts +20 -0
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +116 -0
- package/dist/src/web-ui/app/dashboard-feature.js +32 -10
- package/dist/src/web-ui/app/index.html +44 -7
- package/dist/src/web-ui/app/lib/conversation-file-preview.d.ts +12 -0
- package/dist/src/web-ui/app/lib/conversation-file-reference.d.ts +30 -0
- package/dist/src/web-ui/app/lib/conversation-file-reference.js +66 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +2 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.js +18 -6
- package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +2 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.js +4 -2
- package/dist/src/web-ui/app/lib/tool-permission-mode.d.ts +16 -0
- package/dist/src/web-ui/app/lib/tool-permission-mode.js +60 -0
- package/dist/src/web-ui/app/lib/tool-process-activity-fields.js +102 -0
- package/dist/src/web-ui/app/projects-feature.js +134 -0
- package/dist/src/web-ui/app/runtime-onboarding-feature.d.ts +34 -0
- package/dist/src/web-ui/app/runtime-onboarding-feature.js +92 -0
- package/dist/src/web-ui/app/runtime-setup-page-lifecycle.d.ts +5 -0
- package/dist/src/web-ui/app/runtime-setup-page-lifecycle.js +13 -0
- package/dist/src/web-ui/app/services/client-preferences.d.ts +24 -0
- package/dist/src/web-ui/app/services/client-preferences.js +32 -19
- package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +46 -0
- package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.d.ts +28 -0
- package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.js +75 -0
- package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +19 -0
- package/dist/src/web-ui/app/services/runtime-web-client/projects.js +34 -0
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +27 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +52 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +35 -4
- package/dist/src/web-ui/app/styles/13-projects.css +272 -0
- package/dist/src/web-ui/app/styles/18-dashboard.css +0 -5
- package/dist/src/web-ui/app/styles/19-runtime-setup.css +411 -0
- package/dist/src/web-ui/app/styles/20-chat-composer.css +0 -384
- package/dist/src/web-ui/app/styles/29-conversation-file-preview.css +254 -0
- package/dist/src/web-ui/app/styles/37-runtime-activation.css +26 -0
- package/dist/src/web-ui/app/styles/38-schedule-workspace.css +1 -10
- package/dist/src/web-ui/app/styles/41-plugin-management.css +351 -0
- package/dist/src/web-ui/app/styles/42-runtime-setup-plugins.css +179 -0
- package/dist/src/web-ui/app/styles/43-model-setup.css +73 -0
- package/dist/src/web-ui/app/styles/44-model-provider-cards.css +63 -0
- package/dist/src/web-ui/app/styles/45-bridge-setup.css +44 -0
- package/dist/src/web-ui/app/styles/46-system-host.css +132 -0
- package/dist/src/web-ui/app/styles.css +10 -0
- package/dist/src/web-ui/config-dashboard-backend.d.ts +5 -0
- package/dist/src/web-ui/config-dashboard-backend.js +94 -114
- package/dist/src/web-ui/config-dashboard-model-identity.d.ts +7 -0
- package/dist/src/web-ui/config-dashboard-model-identity.js +45 -0
- package/dist/src/web-ui/config-dashboard-save-transaction.d.ts +5 -0
- package/dist/src/web-ui/config-dashboard-save-transaction.js +21 -0
- package/dist/src/web-ui/environment-config.d.ts +17 -0
- package/dist/src/web-ui/environment-config.js +60 -0
- package/dist/src/web-ui/forwarded-loopback-policy.d.ts +2 -0
- package/dist/src/web-ui/forwarded-loopback-policy.js +14 -0
- package/dist/src/web-ui/local-runtime/api-router.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/api-router.js +136 -12
- package/dist/src/web-ui/local-runtime/config-mutation-request.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/config-mutation-request.js +55 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-environments.d.ts +22 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-environments.js +106 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +36 -0
- package/dist/src/web-ui/local-runtime/configuration-activation.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/configuration-activation.js +107 -0
- package/dist/src/web-ui/local-runtime/contracts.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/conversation-file-access.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/conversation-file-access.js +131 -0
- package/dist/src/web-ui/local-runtime/conversation-file-content.d.ts +21 -0
- package/dist/src/web-ui/local-runtime/conversation-file-content.js +75 -0
- package/dist/src/web-ui/local-runtime/conversation-file-format.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/conversation-file-format.js +87 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-open.d.ts +10 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-open.js +94 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-request.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/conversation-file-native-request.js +72 -0
- package/dist/src/web-ui/local-runtime/conversation-file-routes.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/conversation-file-routes.js +105 -0
- package/dist/src/web-ui/local-runtime/conversation-file-target.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/conversation-file-target.js +158 -0
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/environment-registry.js +121 -6
- package/dist/src/web-ui/local-runtime/memory-onboarding-routes.d.ts +2 -1
- package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +15 -10
- package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/model-setup-catalog.js +45 -0
- package/dist/src/web-ui/local-runtime/model-setup-identity.d.ts +16 -0
- package/dist/src/web-ui/local-runtime/model-setup-identity.js +20 -0
- package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +24 -0
- package/dist/src/web-ui/local-runtime/model-setup-input.js +107 -0
- package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/model-setup-provider.js +68 -0
- package/dist/src/web-ui/local-runtime/model-setup-retry.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-setup-retry.js +47 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +50 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +93 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +5 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +33 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/plugin-management-routes.js +50 -0
- package/dist/src/web-ui/local-runtime/project-routes.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/project-routes.js +93 -0
- package/dist/src/web-ui/local-runtime/provider-credential-identity.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/provider-credential-identity.js +18 -0
- package/dist/src/web-ui/local-runtime/request-execution.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/request-execution.js +8 -0
- package/dist/src/web-ui/local-runtime/runtime-availability.js +36 -7
- package/dist/src/web-ui/local-runtime/runtime-setup-completion.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-completion.js +28 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +110 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +21 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +148 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.js +18 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft.d.ts +21 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-draft.js +105 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.js +40 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.js +27 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +19 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-input.js +82 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-model-file.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-model-file.js +35 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.d.ts +4 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.js +23 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.js +31 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +60 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.js +77 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +35 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +56 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +229 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +65 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +195 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +35 -0
- package/dist/src/web-ui/local-runtime/saved-model-catalog.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/saved-model-catalog.js +20 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +8 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-input.js +71 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-provider.d.ts +13 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +114 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +12 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +53 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +32 -0
- package/dist/src/web-ui/local-runtime/setup-embedding-service.js +59 -0
- package/dist/src/web-ui/local-runtime-backend.d.ts +1 -0
- package/dist/src/web-ui/local-runtime-backend.js +3 -0
- package/dist/src/web-ui/plugin-capability-selection.d.ts +14 -0
- package/dist/src/web-ui/plugin-capability-selection.js +48 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +26 -0
- package/dist/src/web-ui/plugin-management-catalog.js +56 -0
- package/dist/src/web-ui/plugin-management-selection.d.ts +16 -0
- package/dist/src/web-ui/plugin-management-selection.js +71 -0
- package/dist/src/web-ui/plugin-management-service.d.ts +29 -0
- package/dist/src/web-ui/plugin-management-service.js +150 -0
- package/dist/src/web-ui/request-authority.d.ts +8 -0
- package/dist/src/web-ui/request-authority.js +129 -0
- package/dist/src/web-ui/runtime-setup-gateway-address.d.ts +3 -0
- package/dist/src/web-ui/runtime-setup-gateway-address.js +26 -0
- package/dist/src/web-ui/runtime-setup-gateway.d.ts +29 -0
- package/dist/src/web-ui/runtime-setup-gateway.js +177 -0
- package/dist/src/web-ui/runtime-setup-shutdown.d.ts +2 -0
- package/dist/src/web-ui/runtime-setup-shutdown.js +20 -0
- package/dist/src/web-ui/server.d.ts +7 -14
- package/dist/src/web-ui/server.js +53 -63
- package/dist/src/web-ui/session-read-state/service.d.ts +12 -2
- package/dist/src/web-ui/system-host-service.d.ts +19 -0
- package/dist/src/web-ui/system-host-service.js +159 -0
- package/dist/src/web-ui/system-host-setup/companion-bundle.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-bundle.js +12 -0
- package/dist/src/web-ui/system-host-setup/companion-macos.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-macos.js +74 -0
- package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/companion-windows.js +105 -0
- package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +18 -0
- package/dist/src/web-ui/system-host-setup/installer-contract.js +51 -0
- package/dist/src/web-ui/system-host-setup/installers.d.ts +6 -0
- package/dist/src/web-ui/system-host-setup/installers.js +30 -0
- package/dist/src/web-ui/system-host-setup/native-authorization.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/native-authorization.js +11 -0
- package/dist/src/web-ui/system-host-setup/node-distribution.d.ts +19 -0
- package/dist/src/web-ui/system-host-setup/node-distribution.js +9 -0
- package/dist/src/web-ui/system-host-setup/readiness.d.ts +18 -0
- package/dist/src/web-ui/system-host-setup/readiness.js +70 -0
- package/dist/src/web-ui/system-host-setup/routes.d.ts +20 -0
- package/dist/src/web-ui/system-host-setup/routes.js +121 -0
- package/dist/src/web-ui/system-host-setup/windows-script-wrapper.d.ts +2 -0
- package/dist/src/web-ui/system-host-setup/windows-script-wrapper.js +17 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-config.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-config.js +67 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-windows.d.ts +1 -0
- package/dist/src/web-ui/system-host-setup/wsl-interop-windows.js +49 -0
- package/dist/src/web-ui/system-host-upgrade-authority.d.ts +5 -0
- package/dist/src/web-ui/system-host-upgrade-authority.js +13 -0
- package/docs/architecture.md +6 -1
- package/docs/installation.md +53 -17
- package/docs/known-limitations.md +14 -0
- package/docs/plugins.md +124 -19
- package/docs/projects-and-full-plus.md +218 -0
- package/docs/runtime-invariant-coverage.md +6 -3
- package/docs/runtime-prompt-policy-contracts.md +37 -5
- package/docs/runtime-public-contracts.md +17 -0
- package/package.json +5 -2
- package/plugins/exec/plugin.json +30 -9
- package/plugins/exec/skills/exec_process_skill/SKILL.md +1 -0
- package/plugins/exec/skills/exec_skill/SKILL.md +9 -10
- package/plugins/exec/source/handlers.ts +4 -38
- package/plugins/exec/source/paths.ts +53 -49
- package/plugins/exec/source/types.ts +6 -4
- package/plugins/exec/source/validation.ts +33 -198
- package/plugins/exec/src/index.cjs +62 -204
- package/plugins/filesystem/plugin.json +1 -1
- package/plugins/filesystem/skills/dev_view_skill/SKILL.md +7 -0
- package/plugins/filesystem/source/atomic-write.ts +6 -3
- package/plugins/filesystem/source/dev-view.ts +2 -1
- package/plugins/filesystem/source/directory-authority-write.ts +4 -0
- package/plugins/filesystem/source/edit-file.ts +3 -0
- package/plugins/filesystem/source/file-output-presentation.ts +42 -0
- package/plugins/filesystem/source/mutation-parent.ts +18 -9
- package/plugins/filesystem/source/view-locator.ts +141 -0
- package/plugins/filesystem/source/view-window.ts +12 -25
- package/plugins/filesystem/source/write-file.ts +8 -0
- package/plugins/filesystem/src/index.cjs +162 -35
- package/plugins/system/plugin.json +374 -0
- package/plugins/system/skills/system_actions/SKILL.md +31 -0
- package/plugins/system/source/application-catalog.ts +237 -0
- package/plugins/system/source/application-launch.ts +113 -0
- package/plugins/system/source/application-observation.ts +78 -0
- package/plugins/system/source/commands.ts +106 -0
- package/plugins/system/source/companion/autostart.ts +185 -0
- package/plugins/system/source/companion/broker-client.ts +183 -0
- package/plugins/system/source/companion/broker-location.ts +89 -0
- package/plugins/system/source/companion/broker-server.ts +169 -0
- package/plugins/system/source/companion/connection.ts +211 -0
- package/plugins/system/source/companion/liveness.ts +23 -0
- package/plugins/system/source/companion/native-address.ts +55 -0
- package/plugins/system/source/companion/native-identity.ts +26 -0
- package/plugins/system/source/companion/native-messages.ts +100 -0
- package/plugins/system/source/companion/native-session.ts +268 -0
- package/plugins/system/source/companion/native-state.ts +135 -0
- package/plugins/system/source/companion/native-supervisor.ts +98 -0
- package/plugins/system/source/companion/pairing-store.ts +110 -0
- package/plugins/system/source/companion/private-store.ts +58 -0
- package/plugins/system/source/companion/process-owner-identity.ts +190 -0
- package/plugins/system/source/companion/protocol.ts +108 -0
- package/plugins/system/source/contracts.ts +44 -0
- package/plugins/system/source/elevation.ts +88 -0
- package/plugins/system/source/handlers.ts +120 -0
- package/plugins/system/source/host-dispatch.ts +106 -0
- package/plugins/system/source/host-evidence.ts +72 -0
- package/plugins/system/source/host-observation.ts +66 -0
- package/plugins/system/source/index.ts +8 -0
- package/plugins/system/source/process-result.ts +111 -0
- package/plugins/system/source/process-runner.ts +104 -0
- package/plugins/system/source/request-system-modules.ts +117 -0
- package/plugins/system/source/request-target-snapshot.ts +163 -0
- package/plugins/system/source/target-observation.ts +43 -0
- package/plugins/system/source/targets.ts +147 -0
- package/plugins/system/src/index.cjs +1730 -0
- package/src/runtime/README.md +36 -8
- package/src/runtime/local-host/README.md +7 -0
- package/dist/src/runtime/steps/planner-decision/capability-catalog-context.d.ts +0 -14
- package/dist/src/runtime/steps/planner-decision/capability-catalog-context.js +0 -87
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { projectSessionRuntimePaths } from "../../runtime/projects/session-paths.js";
|
|
2
|
+
import { parseToolFileOutputReceipt, } from "../../capabilities/file-output-presentation.js";
|
|
3
|
+
import { ConversationFileError } from "./conversation-file-format.js";
|
|
4
|
+
function unavailable() {
|
|
5
|
+
throw new ConversationFileError("conversation_file_unavailable", 404, "This file is no longer available in this conversation.");
|
|
6
|
+
}
|
|
7
|
+
function isReferenceId(value) {
|
|
8
|
+
if (!value || value.length > 300)
|
|
9
|
+
return false;
|
|
10
|
+
if (value.includes("/"))
|
|
11
|
+
return false;
|
|
12
|
+
if (value.includes(String.fromCharCode(92)))
|
|
13
|
+
return false;
|
|
14
|
+
return ![...value].some((character) => character.charCodeAt(0) < 32);
|
|
15
|
+
}
|
|
16
|
+
export function readConversationFileReference(url) {
|
|
17
|
+
const environmentId = url.searchParams.get("environment");
|
|
18
|
+
const sessionId = url.searchParams.get("sessionId");
|
|
19
|
+
const requestId = url.searchParams.get("requestId");
|
|
20
|
+
const executionId = url.searchParams.get("executionId");
|
|
21
|
+
const values = [environmentId, sessionId, requestId, executionId];
|
|
22
|
+
if (!values.every(isReferenceId))
|
|
23
|
+
throw new ConversationFileError("file_reference_invalid", 400, "The file reference is incomplete. Open it from the conversation activity.");
|
|
24
|
+
return {
|
|
25
|
+
environmentId: environmentId,
|
|
26
|
+
sessionId: sessionId,
|
|
27
|
+
requestId: requestId,
|
|
28
|
+
executionId: executionId,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function belongsToConversation(replay, reference) {
|
|
32
|
+
if (!replay)
|
|
33
|
+
return false;
|
|
34
|
+
if (replay.requestId !== reference.requestId)
|
|
35
|
+
return false;
|
|
36
|
+
return replay.sessionId === reference.sessionId;
|
|
37
|
+
}
|
|
38
|
+
function hasRecordedCompletion(events, reference) {
|
|
39
|
+
return events.some((event) => event.name === "tool.completed" &&
|
|
40
|
+
event.executionId === reference.executionId &&
|
|
41
|
+
event.requestId === reference.requestId);
|
|
42
|
+
}
|
|
43
|
+
function completedFileReceipt(events, reference) {
|
|
44
|
+
const matches = events.filter((event) => isReferencedCompletion(event, reference));
|
|
45
|
+
if (matches.length !== 1)
|
|
46
|
+
return undefined;
|
|
47
|
+
const meta = matches[0]?.meta;
|
|
48
|
+
if (!meta || typeof meta !== "object" || Array.isArray(meta))
|
|
49
|
+
return undefined;
|
|
50
|
+
return parseToolFileOutputReceipt(meta.fileOutput);
|
|
51
|
+
}
|
|
52
|
+
function isReferencedCompletion(event, reference) {
|
|
53
|
+
if (event.type !== "event" || event.name !== "tool.completed")
|
|
54
|
+
return false;
|
|
55
|
+
if (event.requestId !== reference.requestId)
|
|
56
|
+
return false;
|
|
57
|
+
if (event.executionId !== reference.executionId)
|
|
58
|
+
return false;
|
|
59
|
+
return event.ok === true;
|
|
60
|
+
}
|
|
61
|
+
function sameFileReceipt(original, current) {
|
|
62
|
+
if (!current)
|
|
63
|
+
return false;
|
|
64
|
+
return Object.entries(original).every(([key, value]) => current[key] === value);
|
|
65
|
+
}
|
|
66
|
+
/** The recorded completion and its request generation own every file action. */
|
|
67
|
+
export class ConversationFileAccess {
|
|
68
|
+
environments;
|
|
69
|
+
requests;
|
|
70
|
+
defaultEnvironmentId;
|
|
71
|
+
constructor(environments, requests, defaultEnvironmentId) {
|
|
72
|
+
this.environments = environments;
|
|
73
|
+
this.requests = requests;
|
|
74
|
+
this.defaultEnvironmentId = defaultEnvironmentId;
|
|
75
|
+
}
|
|
76
|
+
async authorize(reference) {
|
|
77
|
+
const environment = this.resolveEnvironment(reference.environmentId);
|
|
78
|
+
const sessions = environment.services.sessions;
|
|
79
|
+
const session = await sessions.getSessionById(reference.sessionId);
|
|
80
|
+
if (!session)
|
|
81
|
+
unavailable();
|
|
82
|
+
const paths = projectSessionRuntimePaths(environment.services.config.paths, session);
|
|
83
|
+
const replay = await sessions.getRequestReplayById(reference.requestId);
|
|
84
|
+
if (!belongsToConversation(replay, reference))
|
|
85
|
+
unavailable();
|
|
86
|
+
// Late events after clear cannot recreate the explicitly started generation.
|
|
87
|
+
if (!replay.generation)
|
|
88
|
+
unavailable();
|
|
89
|
+
const wasRecorded = hasRecordedCompletion(replay.events, reference);
|
|
90
|
+
const receipt = this.fileReceipt(replay, reference, !wasRecorded);
|
|
91
|
+
if (!receipt)
|
|
92
|
+
unavailable();
|
|
93
|
+
return {
|
|
94
|
+
receipt,
|
|
95
|
+
paths,
|
|
96
|
+
assertCurrent: async () => {
|
|
97
|
+
if (this.resolveEnvironment(reference.environmentId) !== environment)
|
|
98
|
+
unavailable();
|
|
99
|
+
const current = await sessions.getRequestReplayById(reference.requestId);
|
|
100
|
+
if (this.resolveEnvironment(reference.environmentId) !== environment)
|
|
101
|
+
unavailable();
|
|
102
|
+
if (!belongsToConversation(current, reference))
|
|
103
|
+
unavailable();
|
|
104
|
+
if (current.generation !== replay.generation)
|
|
105
|
+
unavailable();
|
|
106
|
+
// A persisted completion must stay persisted; only the original gap may use live events.
|
|
107
|
+
if (!sameFileReceipt(receipt, this.fileReceipt(current, reference, !wasRecorded)))
|
|
108
|
+
unavailable();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
fileReceipt(replay, reference, allowActive) {
|
|
113
|
+
if (hasRecordedCompletion(replay.events, reference))
|
|
114
|
+
return completedFileReceipt(replay.events, reference);
|
|
115
|
+
if (!allowActive)
|
|
116
|
+
return undefined;
|
|
117
|
+
const active = this.requests.activeReplayForSession(reference.requestId, reference.sessionId, reference.environmentId);
|
|
118
|
+
return completedFileReceipt(active ?? [], reference);
|
|
119
|
+
}
|
|
120
|
+
resolveEnvironment(environmentId) {
|
|
121
|
+
const configured = this.environments.environmentConfig();
|
|
122
|
+
const available = configured
|
|
123
|
+
? configured.environments.some((item) => item.id === environmentId)
|
|
124
|
+
: environmentId === this.defaultEnvironmentId();
|
|
125
|
+
if (!available)
|
|
126
|
+
unavailable();
|
|
127
|
+
if (this.environments.setupRequirement(environmentId))
|
|
128
|
+
unavailable();
|
|
129
|
+
return this.environments.get(environmentId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolFileOutputReceipt } from "../../capabilities/file-output-presentation.js";
|
|
2
|
+
import type { RuntimePaths } from "../../runtime/ports.js";
|
|
3
|
+
import { type OpenedConversationFile } from "./conversation-file-target.js";
|
|
4
|
+
export type ConversationFileMode = "preview" | "image" | "download";
|
|
5
|
+
export type ConversationFileContent = {
|
|
6
|
+
file: {
|
|
7
|
+
name: string;
|
|
8
|
+
mimeType: string;
|
|
9
|
+
size: number;
|
|
10
|
+
kind: "text" | "image" | "unsupported";
|
|
11
|
+
operation: ToolFileOutputReceipt["operation"];
|
|
12
|
+
content?: string;
|
|
13
|
+
truncated: boolean;
|
|
14
|
+
location: string;
|
|
15
|
+
downloadAvailable: boolean;
|
|
16
|
+
nativeOpenAvailable: boolean;
|
|
17
|
+
};
|
|
18
|
+
bytes?: Buffer;
|
|
19
|
+
};
|
|
20
|
+
/** Reads current contents from the tool-owned root without following a replaced leaf. */
|
|
21
|
+
export declare function readConversationFile(receipt: ToolFileOutputReceipt, paths: RuntimePaths, mode: ConversationFileMode, canOpenNative?: (file: OpenedConversationFile) => boolean): Promise<ConversationFileContent>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { withConversationFileTarget, } from "./conversation-file-target.js";
|
|
3
|
+
import { ConversationFileError, MAX_CONVERSATION_DOWNLOAD_BYTES, MAX_CONVERSATION_IMAGE_BYTES, MAX_CONVERSATION_TEXT_BYTES, conversationFileMimeType, conversationTextPreview, rasterImageMimeType, } from "./conversation-file-format.js";
|
|
4
|
+
async function readFilePrefix(handle, size) {
|
|
5
|
+
const bytes = Buffer.alloc(size);
|
|
6
|
+
let offset = 0;
|
|
7
|
+
while (offset < size) {
|
|
8
|
+
const result = await handle.read(bytes, offset, size - offset, offset);
|
|
9
|
+
if (result.bytesRead <= 0)
|
|
10
|
+
throw new ConversationFileError("conversation_file_changed", 409, "The file changed while it was being read. Open it again to see the current content.");
|
|
11
|
+
offset += result.bytesRead;
|
|
12
|
+
}
|
|
13
|
+
return bytes;
|
|
14
|
+
}
|
|
15
|
+
function requestedReadLimit(mode) {
|
|
16
|
+
if (mode === "download")
|
|
17
|
+
return MAX_CONVERSATION_DOWNLOAD_BYTES;
|
|
18
|
+
if (mode === "image")
|
|
19
|
+
return MAX_CONVERSATION_IMAGE_BYTES;
|
|
20
|
+
return MAX_CONVERSATION_TEXT_BYTES;
|
|
21
|
+
}
|
|
22
|
+
function assertBoundedContent(mode, size) {
|
|
23
|
+
if (mode === "preview")
|
|
24
|
+
return;
|
|
25
|
+
if (size <= requestedReadLimit(mode))
|
|
26
|
+
return;
|
|
27
|
+
throw new ConversationFileError("conversation_file_too_large", 413, mode === "image"
|
|
28
|
+
? "This image is too large for an inline preview."
|
|
29
|
+
: "This file is too large to download through the Web UI. It remains on your computer.");
|
|
30
|
+
}
|
|
31
|
+
function previewKind(rasterMime, size, text) {
|
|
32
|
+
if (rasterMime && size <= MAX_CONVERSATION_IMAGE_BYTES)
|
|
33
|
+
return "image";
|
|
34
|
+
if (text !== undefined)
|
|
35
|
+
return "text";
|
|
36
|
+
return "unsupported";
|
|
37
|
+
}
|
|
38
|
+
function projectFileContent(receipt, size, bytes, mode, nativeOpenAvailable) {
|
|
39
|
+
const name = basename(receipt.relativePath);
|
|
40
|
+
const rasterMime = rasterImageMimeType(bytes);
|
|
41
|
+
const truncated = bytes.length < size;
|
|
42
|
+
const text = mode === "preview" && !rasterMime
|
|
43
|
+
? conversationTextPreview(name, bytes, truncated)
|
|
44
|
+
: undefined;
|
|
45
|
+
const kind = previewKind(rasterMime, size, text);
|
|
46
|
+
if (mode === "image" && kind !== "image")
|
|
47
|
+
throw new ConversationFileError("conversation_file_preview_unsupported", 415, "This file type cannot be displayed as an image.");
|
|
48
|
+
const mimeType = rasterMime ??
|
|
49
|
+
(text !== undefined ? "text/plain" : conversationFileMimeType(name));
|
|
50
|
+
return {
|
|
51
|
+
file: {
|
|
52
|
+
name,
|
|
53
|
+
mimeType,
|
|
54
|
+
size,
|
|
55
|
+
kind,
|
|
56
|
+
operation: receipt.operation,
|
|
57
|
+
...(mode === "preview" && text !== undefined ? { content: text } : {}),
|
|
58
|
+
truncated: kind === "text" && truncated,
|
|
59
|
+
location: receipt.logicalPath,
|
|
60
|
+
downloadAvailable: size <= MAX_CONVERSATION_DOWNLOAD_BYTES,
|
|
61
|
+
nativeOpenAvailable,
|
|
62
|
+
},
|
|
63
|
+
...(mode === "preview" ? {} : { bytes }),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Reads current contents from the tool-owned root without following a replaced leaf. */
|
|
67
|
+
export async function readConversationFile(receipt, paths, mode, canOpenNative = () => false) {
|
|
68
|
+
return withConversationFileTarget(receipt, paths, async (file) => {
|
|
69
|
+
const size = Number(file.stats.size);
|
|
70
|
+
assertBoundedContent(mode, size);
|
|
71
|
+
const bytes = await readFilePrefix(file.handle, Math.min(size, requestedReadLimit(mode)));
|
|
72
|
+
await file.assertCurrent();
|
|
73
|
+
return projectFileContent(receipt, size, bytes, mode, canOpenNative(file));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MAX_CONVERSATION_TEXT_BYTES: number;
|
|
2
|
+
export declare const MAX_CONVERSATION_IMAGE_BYTES: number;
|
|
3
|
+
export declare const MAX_CONVERSATION_DOWNLOAD_BYTES: number;
|
|
4
|
+
export declare class ConversationFileError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly statusCode: number;
|
|
7
|
+
constructor(code: string, statusCode: number, message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare function rasterImageMimeType(bytes: Buffer): string | undefined;
|
|
10
|
+
export declare function conversationTextPreview(name: string, bytes: Buffer, truncated: boolean): string | undefined;
|
|
11
|
+
export declare function conversationFileMimeType(name: string): string;
|
|
12
|
+
export declare function conversationDownloadDisposition(name: string): string;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
export const MAX_CONVERSATION_TEXT_BYTES = 256 * 1024;
|
|
3
|
+
export const MAX_CONVERSATION_IMAGE_BYTES = 10 * 1024 * 1024;
|
|
4
|
+
export const MAX_CONVERSATION_DOWNLOAD_BYTES = 64 * 1024 * 1024;
|
|
5
|
+
export class ConversationFileError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
statusCode;
|
|
8
|
+
constructor(code, statusCode, message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.statusCode = statusCode;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const BINARY_EXTENSIONS = new Set([
|
|
15
|
+
".pdf",
|
|
16
|
+
".doc",
|
|
17
|
+
".docx",
|
|
18
|
+
".xls",
|
|
19
|
+
".xlsx",
|
|
20
|
+
".ppt",
|
|
21
|
+
".pptx",
|
|
22
|
+
".zip",
|
|
23
|
+
".gz",
|
|
24
|
+
".tar",
|
|
25
|
+
".7z",
|
|
26
|
+
".mp3",
|
|
27
|
+
".mp4",
|
|
28
|
+
".wav",
|
|
29
|
+
".mov",
|
|
30
|
+
".exe",
|
|
31
|
+
".bin",
|
|
32
|
+
".gif",
|
|
33
|
+
".avif",
|
|
34
|
+
".heic",
|
|
35
|
+
".ico",
|
|
36
|
+
]);
|
|
37
|
+
export function rasterImageMimeType(bytes) {
|
|
38
|
+
if (bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])))
|
|
39
|
+
return "image/png";
|
|
40
|
+
if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff)
|
|
41
|
+
return "image/jpeg";
|
|
42
|
+
if (bytes.toString("ascii", 0, 4) !== "RIFF")
|
|
43
|
+
return undefined;
|
|
44
|
+
return bytes.toString("ascii", 8, 12) === "WEBP" ? "image/webp" : undefined;
|
|
45
|
+
}
|
|
46
|
+
function containsBinaryControls(bytes) {
|
|
47
|
+
return bytes.some((byte) => byte < 9 || (byte > 13 && byte < 32));
|
|
48
|
+
}
|
|
49
|
+
export function conversationTextPreview(name, bytes, truncated) {
|
|
50
|
+
if (BINARY_EXTENSIONS.has(extname(name).toLowerCase()))
|
|
51
|
+
return undefined;
|
|
52
|
+
if (containsBinaryControls(bytes))
|
|
53
|
+
return undefined;
|
|
54
|
+
try {
|
|
55
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes, {
|
|
56
|
+
stream: truncated,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function conversationFileMimeType(name) {
|
|
64
|
+
switch (extname(name).toLowerCase()) {
|
|
65
|
+
case ".md":
|
|
66
|
+
case ".markdown":
|
|
67
|
+
return "text/markdown";
|
|
68
|
+
case ".json":
|
|
69
|
+
return "application/json";
|
|
70
|
+
case ".pdf":
|
|
71
|
+
return "application/pdf";
|
|
72
|
+
case ".png":
|
|
73
|
+
return "image/png";
|
|
74
|
+
case ".jpg":
|
|
75
|
+
case ".jpeg":
|
|
76
|
+
return "image/jpeg";
|
|
77
|
+
case ".webp":
|
|
78
|
+
return "image/webp";
|
|
79
|
+
default:
|
|
80
|
+
return "application/octet-stream";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function conversationDownloadDisposition(name) {
|
|
84
|
+
const fallback = name.replace(/[^a-zA-Z0-9._-]/gu, "_").slice(0, 180) || "file";
|
|
85
|
+
const encoded = encodeURIComponent(name).replace(/['()*]/gu, (character) => "%" + character.charCodeAt(0).toString(16).toUpperCase());
|
|
86
|
+
return ('attachment; filename="' + fallback + "\"; filename*=UTF-8''" + encoded);
|
|
87
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import type { OpenedConversationFile } from "./conversation-file-target.js";
|
|
3
|
+
export type ConversationNativeOpenOptions = {
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
launch?: (absolutePath: string) => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
export declare function canOpenNativeConversationFile(request: IncomingMessage, file: OpenedConversationFile, platform?: NodeJS.Platform): boolean;
|
|
8
|
+
/** Absolute paths are one argv entry; no shell or caller-selected command is used. */
|
|
9
|
+
export declare function launchMacConversationFile(absolutePath: string): Promise<void>;
|
|
10
|
+
export declare function openNativeConversationFile(file: OpenedConversationFile, assertConversationCurrent: () => Promise<void>, launch?: (absolutePath: string) => Promise<void>): Promise<void>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { extname, isAbsolute } from "node:path";
|
|
3
|
+
import { ConversationFileError } from "./conversation-file-format.js";
|
|
4
|
+
import { isLocalNativeFileRequest } from "./conversation-file-native-request.js";
|
|
5
|
+
// A document action must never dispatch a script, application, or active web page.
|
|
6
|
+
const NATIVE_DOCUMENT_EXTENSIONS = new Set([
|
|
7
|
+
".txt",
|
|
8
|
+
".md",
|
|
9
|
+
".markdown",
|
|
10
|
+
".json",
|
|
11
|
+
".csv",
|
|
12
|
+
".tsv",
|
|
13
|
+
".log",
|
|
14
|
+
".yaml",
|
|
15
|
+
".yml",
|
|
16
|
+
".pdf",
|
|
17
|
+
".rtf",
|
|
18
|
+
".docx",
|
|
19
|
+
".xlsx",
|
|
20
|
+
".pptx",
|
|
21
|
+
".odt",
|
|
22
|
+
".ods",
|
|
23
|
+
".odp",
|
|
24
|
+
".png",
|
|
25
|
+
".jpg",
|
|
26
|
+
".jpeg",
|
|
27
|
+
".webp",
|
|
28
|
+
".gif",
|
|
29
|
+
".tif",
|
|
30
|
+
".tiff",
|
|
31
|
+
".heic",
|
|
32
|
+
".avif",
|
|
33
|
+
]);
|
|
34
|
+
function isNativeDocument(file) {
|
|
35
|
+
if (!file.stats.isFile())
|
|
36
|
+
return false;
|
|
37
|
+
if ((file.stats.mode & 73n) !== 0n)
|
|
38
|
+
return false;
|
|
39
|
+
return NATIVE_DOCUMENT_EXTENSIONS.has(extname(file.target.absolutePath).toLowerCase());
|
|
40
|
+
}
|
|
41
|
+
export function canOpenNativeConversationFile(request, file, platform = process.platform) {
|
|
42
|
+
if (platform !== "darwin")
|
|
43
|
+
return false;
|
|
44
|
+
if (!isLocalNativeFileRequest(request))
|
|
45
|
+
return false;
|
|
46
|
+
return isNativeDocument(file);
|
|
47
|
+
}
|
|
48
|
+
function nativeOpenFailed() {
|
|
49
|
+
return new ConversationFileError("native_open_failed", 502, "The file could not be opened in its app. Try again from the preview.");
|
|
50
|
+
}
|
|
51
|
+
/** Absolute paths are one argv entry; no shell or caller-selected command is used. */
|
|
52
|
+
export function launchMacConversationFile(absolutePath) {
|
|
53
|
+
if (!isAbsolute(absolutePath))
|
|
54
|
+
return Promise.reject(nativeOpenFailed());
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
let settled = false;
|
|
57
|
+
const child = spawn("/usr/bin/open", [absolutePath], {
|
|
58
|
+
shell: false,
|
|
59
|
+
stdio: "ignore",
|
|
60
|
+
windowsHide: true,
|
|
61
|
+
});
|
|
62
|
+
const finish = (failure) => {
|
|
63
|
+
if (settled)
|
|
64
|
+
return;
|
|
65
|
+
settled = true;
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
if (failure) {
|
|
68
|
+
reject(failure);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
resolve();
|
|
72
|
+
};
|
|
73
|
+
const timeout = setTimeout(() => {
|
|
74
|
+
child.kill("SIGKILL");
|
|
75
|
+
finish(nativeOpenFailed());
|
|
76
|
+
}, 5000);
|
|
77
|
+
child.once("error", () => finish(nativeOpenFailed()));
|
|
78
|
+
child.once("exit", (code) => finish(code === 0 ? undefined : nativeOpenFailed()));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export async function openNativeConversationFile(file, assertConversationCurrent, launch = launchMacConversationFile) {
|
|
82
|
+
if (!isNativeDocument(file))
|
|
83
|
+
throw new ConversationFileError("native_open_type_unsupported", 415, "This file type can be viewed here but cannot be opened in an app from the conversation.");
|
|
84
|
+
await assertConversationCurrent();
|
|
85
|
+
file.assertCurrentForNativeOpen();
|
|
86
|
+
// The file descriptor remains held through dispatch. After dispatch, the Mac
|
|
87
|
+
// app resolves the pathname asynchronously, like a user opening it in Finder.
|
|
88
|
+
try {
|
|
89
|
+
await launch(file.target.absolutePath);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw nativeOpenFailed();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
/** Only a browser connected directly to this computer may offer native opening. */
|
|
3
|
+
export declare function isLocalNativeFileRequest(request: IncomingMessage): boolean;
|
|
4
|
+
export declare function assertNativeFileOpenRequest(request: IncomingMessage, platform: NodeJS.Platform): void;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { isIP } from "node:net";
|
|
2
|
+
import { ConversationFileError } from "./conversation-file-format.js";
|
|
3
|
+
function isLoopbackIp(value) {
|
|
4
|
+
if (!value)
|
|
5
|
+
return false;
|
|
6
|
+
const address = value.replace(/^\[|\]$/g, "");
|
|
7
|
+
const family = isIP(address);
|
|
8
|
+
if (family === 4)
|
|
9
|
+
return address.startsWith("127.");
|
|
10
|
+
if (family !== 6)
|
|
11
|
+
return false;
|
|
12
|
+
try {
|
|
13
|
+
const normalized = new URL("http://[" + address + "]").hostname;
|
|
14
|
+
if (normalized === "[::1]")
|
|
15
|
+
return true;
|
|
16
|
+
return /^\[::ffff:7f[0-9a-f]{2}:/.test(normalized);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Scoped IPv6 addresses may pass isIP but are not URL hostnames.
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function readLocalAuthority(request) {
|
|
24
|
+
if (!isLoopbackIp(request.socket.remoteAddress))
|
|
25
|
+
return undefined;
|
|
26
|
+
if (!isLoopbackIp(request.socket.localAddress))
|
|
27
|
+
return undefined;
|
|
28
|
+
const host = request.headers.host;
|
|
29
|
+
if (!host || /[\s,/\\?#@]/u.test(host))
|
|
30
|
+
return undefined;
|
|
31
|
+
const secure = "encrypted" in request.socket && request.socket.encrypted;
|
|
32
|
+
try {
|
|
33
|
+
const authority = new URL((secure ? "https://" : "http://") + host);
|
|
34
|
+
const hostname = authority.hostname.toLowerCase().replace(/\.$/, "");
|
|
35
|
+
if (hostname !== "localhost" && !isLoopbackIp(hostname))
|
|
36
|
+
return undefined;
|
|
37
|
+
const defaultPort = secure ? 443 : 80;
|
|
38
|
+
const port = authority.port ? Number(authority.port) : defaultPort;
|
|
39
|
+
if (port !== request.socket.localPort)
|
|
40
|
+
return undefined;
|
|
41
|
+
return authority;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Only a browser connected directly to this computer may offer native opening. */
|
|
48
|
+
export function isLocalNativeFileRequest(request) {
|
|
49
|
+
if (request.headers["sec-fetch-site"] === "cross-site")
|
|
50
|
+
return false;
|
|
51
|
+
const authority = readLocalAuthority(request);
|
|
52
|
+
if (!authority)
|
|
53
|
+
return false;
|
|
54
|
+
const origin = request.headers.origin;
|
|
55
|
+
if (origin === undefined)
|
|
56
|
+
return true;
|
|
57
|
+
return origin === authority.origin;
|
|
58
|
+
}
|
|
59
|
+
function hasNativeOpenOrigin(request) {
|
|
60
|
+
if (!request.headers.origin)
|
|
61
|
+
return false;
|
|
62
|
+
return isLocalNativeFileRequest(request);
|
|
63
|
+
}
|
|
64
|
+
export function assertNativeFileOpenRequest(request, platform) {
|
|
65
|
+
if (platform !== "darwin")
|
|
66
|
+
throw new ConversationFileError("native_open_unavailable", 415, "Opening in an app is available on this Mac only.");
|
|
67
|
+
if (!hasNativeOpenOrigin(request))
|
|
68
|
+
throw new ConversationFileError("native_open_request_rejected", 403, "Open files from the Web UI on this computer.");
|
|
69
|
+
const contentType = request.headers["content-type"] ?? "";
|
|
70
|
+
if (contentType.split(";", 1)[0].trim().toLowerCase() !== "application/json")
|
|
71
|
+
throw new ConversationFileError("native_open_request_rejected", 415, "Opening a file requires a JSON request.");
|
|
72
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { RuntimeEnvironmentRegistry } from "./environment-registry.js";
|
|
3
|
+
import type { LocalRequestExecution } from "./request-execution.js";
|
|
4
|
+
import { type ConversationNativeOpenOptions } from "./conversation-file-native-open.js";
|
|
5
|
+
/** A recorded tool completion is the only authority; no browser path is accepted. */
|
|
6
|
+
export declare class ConversationFileRoutes {
|
|
7
|
+
private readonly nativeOpen;
|
|
8
|
+
private readonly access;
|
|
9
|
+
constructor(environments: Pick<RuntimeEnvironmentRegistry, "environmentConfig" | "setupRequirement" | "get">, requests: LocalRequestExecution, defaultEnvironmentId: () => string, nativeOpen?: ConversationNativeOpenOptions);
|
|
10
|
+
handle(route: string, request: IncomingMessage, response: ServerResponse): Promise<boolean>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ConversationFileAccess, readConversationFileReference, } from "./conversation-file-access.js";
|
|
2
|
+
import { readConversationFile, } from "./conversation-file-content.js";
|
|
3
|
+
import { ConversationFileError, conversationDownloadDisposition, } from "./conversation-file-format.js";
|
|
4
|
+
import { assertNativeFileOpenRequest } from "./conversation-file-native-request.js";
|
|
5
|
+
import { canOpenNativeConversationFile, openNativeConversationFile, } from "./conversation-file-native-open.js";
|
|
6
|
+
import { withConversationFileTarget } from "./conversation-file-target.js";
|
|
7
|
+
import { readBody, readJsonBody, sendJson } from "./http.js";
|
|
8
|
+
function hasSameOrigin(request) {
|
|
9
|
+
if (request.headers["sec-fetch-site"] === "cross-site")
|
|
10
|
+
return false;
|
|
11
|
+
const origin = request.headers.origin;
|
|
12
|
+
if (!origin)
|
|
13
|
+
return true;
|
|
14
|
+
try {
|
|
15
|
+
const secure = "encrypted" in request.socket && request.socket.encrypted;
|
|
16
|
+
const expected = (secure ? "https://" : "http://") + request.headers.host;
|
|
17
|
+
return new URL(origin).origin === expected;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function assertFileRequestOrigin(request) {
|
|
24
|
+
if (hasSameOrigin(request))
|
|
25
|
+
return;
|
|
26
|
+
throw new ConversationFileError("file_request_rejected", 403, "Files can only be opened from this Web UI.");
|
|
27
|
+
}
|
|
28
|
+
function contentMode(url) {
|
|
29
|
+
if (url.searchParams.get("download") === "1")
|
|
30
|
+
return "download";
|
|
31
|
+
if (url.searchParams.get("content") === "1")
|
|
32
|
+
return "image";
|
|
33
|
+
return "preview";
|
|
34
|
+
}
|
|
35
|
+
async function assertEmptyNativeOpenBody(request) {
|
|
36
|
+
try {
|
|
37
|
+
const body = readJsonBody(await readBody(request, { maxBytes: 1024 }));
|
|
38
|
+
if (Object.keys(body).length === 0)
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// The only file authority is the conversation reference in the URL.
|
|
43
|
+
}
|
|
44
|
+
throw new ConversationFileError("file_reference_invalid", 400, "Open this file from the conversation preview.");
|
|
45
|
+
}
|
|
46
|
+
/** A recorded tool completion is the only authority; no browser path is accepted. */
|
|
47
|
+
export class ConversationFileRoutes {
|
|
48
|
+
nativeOpen;
|
|
49
|
+
access;
|
|
50
|
+
constructor(environments, requests, defaultEnvironmentId, nativeOpen = {}) {
|
|
51
|
+
this.nativeOpen = nativeOpen;
|
|
52
|
+
this.access = new ConversationFileAccess(environments, requests, defaultEnvironmentId);
|
|
53
|
+
}
|
|
54
|
+
async handle(route, request, response) {
|
|
55
|
+
const isPreviewRead = route === "chat/files" && request.method === "GET";
|
|
56
|
+
const isNativeOpen = route === "chat/files/open" && request.method === "POST";
|
|
57
|
+
if (!isPreviewRead && !isNativeOpen)
|
|
58
|
+
return false;
|
|
59
|
+
response.setHeader("cache-control", "private, no-store");
|
|
60
|
+
response.setHeader("x-content-type-options", "nosniff");
|
|
61
|
+
response.setHeader("cross-origin-resource-policy", "same-origin");
|
|
62
|
+
response.setHeader("content-security-policy", "default-src 'none'; sandbox");
|
|
63
|
+
try {
|
|
64
|
+
assertFileRequestOrigin(request);
|
|
65
|
+
const platform = this.nativeOpen.platform ?? process.platform;
|
|
66
|
+
if (isNativeOpen) {
|
|
67
|
+
assertNativeFileOpenRequest(request, platform);
|
|
68
|
+
await assertEmptyNativeOpenBody(request);
|
|
69
|
+
}
|
|
70
|
+
const url = new URL(request.url || "/", "http://localhost");
|
|
71
|
+
const reference = readConversationFileReference(url);
|
|
72
|
+
const authority = await this.access.authorize(reference);
|
|
73
|
+
if (isNativeOpen) {
|
|
74
|
+
await withConversationFileTarget(authority.receipt, authority.paths, (file) => openNativeConversationFile(file, authority.assertCurrent, this.nativeOpen.launch));
|
|
75
|
+
sendJson(response, 200, { ok: true });
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const mode = contentMode(url);
|
|
79
|
+
const result = await readConversationFile(authority.receipt, authority.paths, mode, (file) => canOpenNativeConversationFile(request, file, platform));
|
|
80
|
+
await authority.assertCurrent();
|
|
81
|
+
if (mode === "preview") {
|
|
82
|
+
sendJson(response, 200, { ok: true, file: result.file });
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
const bytes = result.bytes;
|
|
86
|
+
response.setHeader("content-length", String(bytes.byteLength));
|
|
87
|
+
response.setHeader("content-type", mode === "image" ? result.file.mimeType : "application/octet-stream");
|
|
88
|
+
if (mode === "download")
|
|
89
|
+
response.setHeader("content-disposition", conversationDownloadDisposition(result.file.name));
|
|
90
|
+
response.writeHead(200);
|
|
91
|
+
response.end(bytes);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
const failure = error instanceof ConversationFileError
|
|
95
|
+
? error
|
|
96
|
+
: new ConversationFileError("conversation_file_unavailable", 404, "This file is no longer available in this conversation.");
|
|
97
|
+
sendJson(response, failure.statusCode, {
|
|
98
|
+
ok: false,
|
|
99
|
+
error: failure.code,
|
|
100
|
+
message: failure.message,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type BigIntStats } from "node:fs";
|
|
2
|
+
import { type FileHandle } from "node:fs/promises";
|
|
3
|
+
import type { ToolFileOutputReceipt } from "../../capabilities/file-output-presentation.js";
|
|
4
|
+
import type { ResolvedRuntimeToolPath } from "../../capabilities/tool-types.js";
|
|
5
|
+
import type { RuntimePaths } from "../../runtime/ports.js";
|
|
6
|
+
export type OpenedConversationFile = {
|
|
7
|
+
target: ResolvedRuntimeToolPath;
|
|
8
|
+
handle: FileHandle;
|
|
9
|
+
stats: BigIntStats;
|
|
10
|
+
assertCurrent: () => Promise<void>;
|
|
11
|
+
assertCurrentForNativeOpen: () => void;
|
|
12
|
+
};
|
|
13
|
+
/** Keeps the recorded file descriptor alive for the complete caller operation. */
|
|
14
|
+
export declare function withConversationFileTarget<T>(receipt: ToolFileOutputReceipt, paths: RuntimePaths, action: (file: OpenedConversationFile) => Promise<T>): Promise<T>;
|