@abot-ai/runtime 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/cli/abot.js +2 -0
- package/dist/src/cli/host-companion-bundle.mjs +751 -333
- package/dist/src/computer-access/collection-consent.d.ts +9 -0
- package/dist/src/computer-access/collection-consent.js +47 -0
- package/dist/src/computer-access/command-output-capture.d.ts +17 -6
- package/dist/src/computer-access/command-output-capture.js +134 -68
- package/dist/src/computer-access/command-output-protection.d.ts +17 -0
- package/dist/src/computer-access/command-output-protection.js +59 -0
- package/dist/src/computer-access/companion/command-output.d.ts +1 -0
- package/dist/src/computer-access/companion/command-output.js +23 -6
- package/dist/src/computer-access/companion/install-link-macos.js +2 -1
- package/dist/src/computer-access/companion/native-notifications.js +3 -2
- package/dist/src/computer-access/companion/native-session.js +6 -2
- package/dist/src/computer-access/companion/observation-filter.js +2 -26
- package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
- package/dist/src/computer-access/companion/observation-process.js +51 -25
- package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
- package/dist/src/computer-access/companion/observation-redaction.js +2 -111
- package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
- package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
- package/dist/src/computer-access/computer/companion-sessions.js +7 -6
- package/dist/src/computer-access/computer/unix-native-process.js +23 -11
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +79 -11
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
- package/dist/src/computer-access/native-observation-connection.js +78 -0
- package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
- package/dist/src/computer-access/native-observation-ownership.js +55 -0
- package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
- package/dist/src/computer-access/native-observation-shutdown.js +58 -0
- package/dist/src/computer-access/observation-source.d.ts +6 -0
- package/dist/src/computer-access/observation-source.js +10 -0
- package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
- package/dist/src/computer-access/security/desktop-result.js +146 -0
- package/dist/src/computer-access/security/observed-error.d.ts +2 -0
- package/dist/src/computer-access/security/observed-error.js +10 -0
- package/dist/src/computer-access/security/secret-text.d.ts +7 -0
- package/dist/src/computer-access/security/secret-text.js +111 -0
- package/dist/src/computer-access/security/system-results.d.ts +2 -0
- package/dist/src/computer-access/security/system-results.js +53 -0
- package/dist/src/computer-access/system-result-protection.d.ts +11 -0
- package/dist/src/computer-access/system-result-protection.js +1 -0
- package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
- package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
- package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
- package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
- package/dist/src/model-gateway/observability/provider-trace.js +30 -8
- package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
- package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
- package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
- package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
- package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
- package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
- package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
- package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
- package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
- package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
- package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
- package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
- package/dist/src/model-gateway/providers/openai/payload.js +6 -23
- package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
- package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
- package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
- package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
- package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
- package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
- package/dist/src/model-gateway/providers/openai/stream.js +13 -41
- package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
- package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
- package/dist/src/model-gateway/server.js +5 -1
- package/dist/src/plugin-contract/index.d.ts +1 -0
- package/dist/src/plugin-contract/index.js +1 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -0
- package/dist/src/plugin-contract/manifest.js +1 -0
- package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
- package/dist/src/plugin-contract/platform-compatibility.js +3 -0
- package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
- package/dist/src/plugin-sdk/computer-access.js +1 -0
- package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
- package/dist/src/plugin-sdk/files-windows/process.js +93 -0
- package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
- package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
- package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
- package/dist/src/plugin-sdk/files-windows/read.js +56 -0
- package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
- package/dist/src/plugin-sdk/files-windows/result.js +67 -0
- package/dist/src/plugin-sdk/files.js +4 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
- package/dist/src/plugin-sdk/mutation-result.js +11 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
- package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
- package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
- package/dist/src/runtime/passive-learning/collection-source.js +7 -0
- package/dist/src/runtime/passive-learning/service.js +2 -3
- package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
- package/dist/src/runtime/passive-learning/status-projection.js +9 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
- package/dist/src/runtime/plugins/installation/package.js +2 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
- package/dist/src/runtime/plugins/loader.js +24 -14
- package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
- package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
- package/dist/src/runtime/plugins/manifest-validator.js +9 -1
- package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
- package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
- package/dist/src/runtime/steps/execution-agent/format.js +2 -3
- package/dist/src/runtime/steps/execution-agent/input.js +1 -1
- package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
- package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
- package/dist/src/sessions/durable-session-commit.js +3 -3
- package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
- package/dist/src/sessions/prepared-session-replacement.js +46 -0
- package/dist/src/sessions/session-store.js +3 -3
- package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
- package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
- package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/authority-script.js +94 -0
- package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
- package/dist/src/shared/windows-file-io/native-script.js +120 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
- package/dist/src/shared/windows-job-object.d.ts +2 -0
- package/dist/src/shared/windows-job-object.js +66 -0
- package/dist/src/web-ui/app/app-bootstrap.js +14 -1
- package/dist/src/web-ui/app/app-state.js +0 -7
- package/dist/src/web-ui/app/app.js +53 -156
- package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
- package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
- package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
- package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
- package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
- package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
- package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
- package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
- package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
- package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
- package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
- package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
- package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
- package/dist/src/web-ui/app/components/schedules/form.js +10 -8
- package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
- package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
- package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
- package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +9 -1
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
- package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
- package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
- package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
- package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
- package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
- package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
- package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
- package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
- package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
- package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
- package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
- package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
- package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
- package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
- package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
- package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
- package/dist/src/web-ui/app/dashboard-feature.js +3 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
- package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
- package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
- package/dist/src/web-ui/app/schedules-feature.js +5 -3
- package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
- package/dist/src/web-ui/app/services/client-preferences.js +25 -16
- package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
- package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
- package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
- package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
- package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
- package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
- package/dist/src/web-ui/app/services/workspace-state.js +27 -0
- package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
- package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
- package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
- package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
- package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
- package/dist/src/web-ui/app/styles.css +2 -0
- package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
- package/dist/src/web-ui/client-state/contracts.js +13 -0
- package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
- package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
- package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
- package/dist/src/web-ui/client-state/preferences.js +84 -0
- package/dist/src/web-ui/client-state/queue.d.ts +3 -0
- package/dist/src/web-ui/client-state/queue.js +43 -0
- package/dist/src/web-ui/client-state/routes.d.ts +7 -0
- package/dist/src/web-ui/client-state/routes.js +58 -0
- package/dist/src/web-ui/client-state/store.d.ts +14 -0
- package/dist/src/web-ui/client-state/store.js +88 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
- package/dist/src/web-ui/local-runtime/http.js +11 -2
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
- package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
- package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +14 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +3 -1
- package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
- package/dist/src/web-ui/server-readiness.d.ts +3 -0
- package/dist/src/web-ui/server-readiness.js +36 -0
- package/dist/src/web-ui/server.d.ts +2 -0
- package/dist/src/web-ui/server.js +23 -1
- package/dist/src/web-ui/system-host-service.js +13 -2
- package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
- package/docs/installation.md +44 -5
- package/docs/plugins.md +145 -4
- package/docs/tool-execution-result-evidence-contract.md +57 -0
- package/docs/windows-companion-store.md +5 -0
- package/package.json +4 -2
- package/plugins/capability-brief/plugin.json +4 -0
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +1 -0
- package/plugins/code-outline/source/index.ts +16 -20
- package/plugins/code-outline/source/read-failure.ts +40 -0
- package/plugins/code-outline/src/index.cjs +614 -29
- package/plugins/document-reader/README.md +33 -0
- package/plugins/document-reader/plugin.json +1 -0
- package/plugins/document-reader/source/pdf-contract.ts +57 -0
- package/plugins/document-reader/source/pdf-parser.ts +139 -0
- package/plugins/document-reader/source/pdf-process-main.ts +56 -0
- package/plugins/document-reader/source/pdf-process.ts +207 -0
- package/plugins/document-reader/source/pdf-result.ts +79 -0
- package/plugins/document-reader/source/pdf-worker.ts +39 -303
- package/plugins/document-reader/source/pdf.ts +4 -1
- package/plugins/document-reader/source/read-failure.ts +37 -0
- package/plugins/document-reader/source/reader.ts +3 -19
- package/plugins/document-reader/src/index.cjs +995 -211
- package/plugins/exec/README.md +19 -0
- package/plugins/exec/plugin.json +4 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
- package/plugins/exec/source/filesystem-file-observer.ts +98 -0
- package/plugins/exec/source/filesystem-observer.ts +8 -79
- package/plugins/exec/source/output-files.ts +12 -6
- package/plugins/exec/source/paths.ts +3 -1
- package/plugins/exec/source/process-manager.ts +8 -24
- package/plugins/exec/source/shell-platform.ts +19 -3
- package/plugins/exec/source/shell-process.ts +55 -0
- package/plugins/exec/source/windows-job-source.ts +1 -0
- package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
- package/plugins/exec/src/index.cjs +252 -96
- package/plugins/filesystem/README.md +65 -0
- package/plugins/filesystem/plugin.json +6 -2
- package/plugins/filesystem/source/atomic-write.ts +2 -0
- package/plugins/filesystem/source/bounded-io.ts +80 -306
- package/plugins/filesystem/source/directory-sample.ts +2 -0
- package/plugins/filesystem/source/errors.ts +14 -0
- package/plugins/filesystem/source/file-observation.ts +151 -0
- package/plugins/filesystem/source/file-version.ts +41 -0
- package/plugins/filesystem/source/index.ts +6 -0
- package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
- package/plugins/filesystem/source/windows/authority-script.ts +1 -0
- package/plugins/filesystem/source/windows/native-script.ts +1 -0
- package/plugins/filesystem/source/windows/operations.ts +197 -0
- package/plugins/filesystem/source/windows/process.ts +214 -0
- package/plugins/filesystem/source/windows/publication-script.ts +29 -0
- package/plugins/filesystem/source/windows/read-script.ts +63 -0
- package/plugins/filesystem/source/windows/request-availability.ts +67 -0
- package/plugins/filesystem/source/windows/source.ts +42 -0
- package/plugins/filesystem/source/windows/storage-script.ts +11 -0
- package/plugins/filesystem/source/windows/streams-script.ts +24 -0
- package/plugins/filesystem/source/windows/write-script.ts +86 -0
- package/plugins/filesystem/src/index.cjs +1208 -322
- package/plugins/json-inspector/README.md +18 -0
- package/plugins/json-inspector/plugin.json +1 -0
- package/plugins/json-inspector/source/index.ts +16 -19
- package/plugins/json-inspector/source/read-failure.ts +42 -0
- package/plugins/json-inspector/src/index.cjs +612 -27
- package/plugins/local-search/README.md +29 -0
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/local-search/source/errors.ts +2 -0
- package/plugins/local-search/source/paths.ts +3 -0
- package/plugins/local-search/source/ripgrep-process.ts +31 -5
- package/plugins/local-search/source/ripgrep.ts +3 -3
- package/plugins/local-search/source/windows-authority.ts +99 -0
- package/plugins/local-search/source/windows-search-lease.ts +49 -0
- package/plugins/local-search/source/windows-search-process.ts +91 -0
- package/plugins/local-search/source/windows-search-script.ts +52 -0
- package/plugins/local-search/src/index.cjs +595 -26
- package/plugins/memory/plugin.json +4 -0
- package/plugins/memory/source/lock-directory-claim.ts +56 -0
- package/plugins/memory/source/lock-owner-file.ts +71 -0
- package/plugins/memory/source/lock-path-observation.ts +26 -0
- package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
- package/plugins/memory/source/store-lock.ts +12 -7
- package/plugins/memory/source/store.ts +3 -2
- package/plugins/memory/src/index.cjs +174 -25
- package/plugins/project-orientation/README.md +23 -0
- package/plugins/project-orientation/plugin.json +1 -0
- package/plugins/project-orientation/source/index.ts +12 -9
- package/plugins/project-orientation/source/inspection-failure.ts +70 -0
- package/plugins/project-orientation/source/manifest-summary.ts +9 -2
- package/plugins/project-orientation/source/tree.ts +6 -0
- package/plugins/project-orientation/src/index.cjs +647 -31
- package/plugins/system/README.md +51 -15
- package/plugins/system/plugin.json +5 -1
- package/plugins/system/skills/system_actions/SKILL.md +1 -1
- package/plugins/system/source/command-working-directory.ts +47 -0
- package/plugins/system/source/computer/handlers.ts +13 -9
- package/plugins/system/source/computer/observation-result.ts +10 -5
- package/plugins/system/source/computer/request-computers.ts +10 -3
- package/plugins/system/source/computer/request-modules.ts +3 -6
- package/plugins/system/source/computer/runtime-platform.ts +18 -0
- package/plugins/system/source/host-dispatch.ts +18 -2
- package/plugins/system/source/index.ts +5 -3
- package/plugins/system/source/local-command-output-retention.ts +16 -0
- package/plugins/system/source/local-command-output.ts +16 -8
- package/plugins/system/source/request-system-modules.ts +12 -2
- package/plugins/system/source/request-target-snapshot.ts +2 -1
- package/plugins/system/source/security/desktop-result.ts +177 -0
- package/plugins/system/source/security/observed-error.ts +10 -0
- package/plugins/system/source/security/secret-text.ts +118 -0
- package/plugins/system/source/security/system-results.ts +62 -0
- package/plugins/system/source/security/windows-output-directory.ts +82 -0
- package/plugins/system/src/index.cjs +837 -151
- package/plugins/system-probe/plugin.json +8 -2
- package/plugins/system-probe/source/disk-path.ts +8 -0
- package/plugins/system-probe/source/index.ts +10 -5
- package/plugins/system-probe/source/machine-load.ts +33 -0
- package/plugins/system-probe/source/metrics.ts +6 -8
- package/plugins/system-probe/src/index.cjs +49 -16
- package/plugins/web/plugin.json +4 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { receiveModelContextWindowFeedback } from "./context-window-feedback.js";
|
|
1
2
|
import { selectedModelProvider } from "./validation.js";
|
|
2
3
|
import {
|
|
3
4
|
isDefinitiveModelSaveRejection,
|
|
@@ -97,7 +98,8 @@ export function createModelSaveFlow({
|
|
|
97
98
|
if (credentialSaved)
|
|
98
99
|
state.credentialSavedFor =
|
|
99
100
|
selectedModelProvider(state)?.id || state.newProviderId;
|
|
100
|
-
|
|
101
|
+
if (!receiveModelContextWindowFeedback(state, error))
|
|
102
|
+
state.error = modelSaveErrorMessage(state, error);
|
|
101
103
|
if (credentialSaved)
|
|
102
104
|
state.error +=
|
|
103
105
|
" Your API key was saved privately and will be reused on retry.";
|
|
@@ -19,6 +19,7 @@ export function modelSaveFailureMessage(state) {
|
|
|
19
19
|
|
|
20
20
|
export function modelSaveErrorMessage(state, error) {
|
|
21
21
|
const fallback = modelSaveFailureMessage(state);
|
|
22
|
+
if (error?.payload?.error === "context_window_too_small") return fallback;
|
|
22
23
|
const detail = error?.payload?.message;
|
|
23
24
|
if (!detail) return fallback;
|
|
24
25
|
if (state.saved) return `${fallback} ${detail}`;
|
|
@@ -7,6 +7,10 @@ import {
|
|
|
7
7
|
import { renderWizardProgress } from "../runtime-setup/wizard-shell.js";
|
|
8
8
|
import { DEFAULT_OLLAMA_BASE_URL } from "../runtime-setup/validation.js";
|
|
9
9
|
import { createSetupViewState } from "../runtime-setup/view-state.js";
|
|
10
|
+
import {
|
|
11
|
+
clearModelContextWindowFeedback,
|
|
12
|
+
renderModelContextWindowFeedback,
|
|
13
|
+
} from "./context-window-feedback.js";
|
|
10
14
|
import { createModelSaveFlow } from "./save-flow.js";
|
|
11
15
|
import {
|
|
12
16
|
MODEL_SETUP_ID,
|
|
@@ -70,6 +74,7 @@ export function createModelSetupWizard({
|
|
|
70
74
|
choice: "",
|
|
71
75
|
model: "",
|
|
72
76
|
contextWindowTokens: "",
|
|
77
|
+
contextWindowFeedback: null,
|
|
73
78
|
profileId: "",
|
|
74
79
|
profileEdited: false,
|
|
75
80
|
newProviderId: "",
|
|
@@ -201,6 +206,11 @@ export function createModelSetupWizard({
|
|
|
201
206
|
.querySelector(".runtime-setup-panel")
|
|
202
207
|
.setAttribute("aria-busy", Boolean(state.busy).toString());
|
|
203
208
|
viewState.restore({ focus, busy: Boolean(state.busy) });
|
|
209
|
+
renderModelContextWindowFeedback(
|
|
210
|
+
state,
|
|
211
|
+
modelForm,
|
|
212
|
+
viewState.canRestoreFocus(),
|
|
213
|
+
);
|
|
204
214
|
}
|
|
205
215
|
|
|
206
216
|
async function load() {
|
|
@@ -280,6 +290,7 @@ export function createModelSetupWizard({
|
|
|
280
290
|
event.target.removeAttribute("aria-invalid");
|
|
281
291
|
return;
|
|
282
292
|
}
|
|
293
|
+
clearModelContextWindowFeedback(state, modelForm);
|
|
283
294
|
state.saveOutcomeUncertain = false;
|
|
284
295
|
const value = textOf(event.target.value);
|
|
285
296
|
if (field === "model-id") {
|
|
@@ -315,6 +326,7 @@ export function createModelSetupWizard({
|
|
|
315
326
|
)
|
|
316
327
|
return;
|
|
317
328
|
clearSecret();
|
|
329
|
+
clearModelContextWindowFeedback(state, modelForm);
|
|
318
330
|
state.saveOutcomeUncertain = false;
|
|
319
331
|
const providerChanged = state.choice !== event.target.value;
|
|
320
332
|
if (providerChanged) state.model = "";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { needsCollectionConsentReview } from "./collection-access.js";
|
|
2
|
+
|
|
1
3
|
const activities = Object.freeze({
|
|
2
4
|
collection: { label: "collection", permissionField: "collectionEnabled", selector: "[data-learning-toggle]" },
|
|
3
5
|
learning: { label: "learning", permissionField: "processingEnabled", selector: "[data-learning-processing-toggle]" },
|
|
@@ -42,6 +44,8 @@ export function activityStatePatch(activity, preferences, running) {
|
|
|
42
44
|
export function activityControl(activity, snapshot) {
|
|
43
45
|
const definition = activities[activity];
|
|
44
46
|
const preferences = snapshot.status?.preferences || {};
|
|
47
|
+
if (activity === "collection" && needsCollectionConsentReview(snapshot.status))
|
|
48
|
+
return { action: "start", label: "Review collection access", tone: "setup" };
|
|
45
49
|
if (isActivityRunning(activity, preferences))
|
|
46
50
|
return { action: "stop", label: `Stop ${definition.label}`, tone: "danger" };
|
|
47
51
|
if (!hasActivityModel(activity, preferences, snapshot.models))
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { hostSetupIsReady } from "../system-host/rendering.js";
|
|
2
|
+
import { isNativeWindowsLocalAccess } from "../system-host/native-windows-access.js";
|
|
3
|
+
|
|
4
|
+
export function hasCollectionAccess(hostConnection) {
|
|
5
|
+
if (isNativeWindowsLocalAccess(hostConnection)) return true;
|
|
6
|
+
return hostSetupIsReady(hostConnection);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function needsCollectionConsentReview(status) {
|
|
10
|
+
if (status?.preferences?.enabled !== true) return false;
|
|
11
|
+
const reason = status.collectionReason || status.reason;
|
|
12
|
+
return reason === "collection_consent_required";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function collectionCompanionVersion(host) {
|
|
16
|
+
if (isNativeWindowsLocalAccess(host)) return "";
|
|
17
|
+
const companion = host?.companion;
|
|
18
|
+
if (!companion) return "Connect your computer to check its companion version.";
|
|
19
|
+
return `Installed version: ${companion.installedVersion ?? "unversioned"} · Available: ${companion.availableVersion}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Display the actual collection source without treating Companion identity as Runtime identity. */
|
|
23
|
+
export function renderCollectionAccess(root, snapshot) {
|
|
24
|
+
const native = isNativeWindowsLocalAccess(snapshot.hostConnection);
|
|
25
|
+
const version = root.querySelector("[data-learning-companion-version]");
|
|
26
|
+
version.hidden = native;
|
|
27
|
+
version.textContent = collectionCompanionVersion(snapshot.hostConnection);
|
|
28
|
+
root.querySelector("[data-learning-computer-access]").hidden = native;
|
|
29
|
+
root.querySelector("[data-learning-connection-title]").textContent = native ? "Local collection" : "Computer connection";
|
|
30
|
+
root.querySelector("[data-learning-connection-description]").textContent = native
|
|
31
|
+
? "Spark collects activity directly on this Windows computer after your consent. Collection and learning have separate permission and Start controls."
|
|
32
|
+
: "Collection uses the shared Computer access connection. Computer tools have their own controls.";
|
|
33
|
+
root.querySelector("[data-learning-device]").textContent = native
|
|
34
|
+
? "This Windows computer" : snapshot.status?.deviceId || "Not connected now";
|
|
35
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** One explicit, initially unchecked acknowledgment before saving installation consent. */
|
|
2
|
+
export function createCollectionConsentDialog({ container }) {
|
|
3
|
+
const documentRoot = container.ownerDocument;
|
|
4
|
+
const dialog = documentRoot.createElement("dialog");
|
|
5
|
+
dialog.className = "mac-permission-dialog collection-consent-dialog";
|
|
6
|
+
dialog.setAttribute("aria-labelledby", "collectionConsentTitle");
|
|
7
|
+
dialog.setAttribute("aria-describedby", "collectionConsentDescription");
|
|
8
|
+
dialog.innerHTML = `<div class="mac-permission-content">
|
|
9
|
+
<div class="mac-permission-top"><span class="mac-permission-eyebrow">ABot Spark · Activity collection</span>
|
|
10
|
+
<button type="button" class="mac-permission-close" data-collection-consent-cancel aria-label="Cancel and close">×</button></div>
|
|
11
|
+
<h2 id="collectionConsentTitle" tabindex="-1">Before allowing activity collection</h2>
|
|
12
|
+
<p id="collectionConsentDescription" class="mac-permission-description">Spark can read accessible text and activity from your applications, including window titles and URLs. This may include personal or sensitive information.</p>
|
|
13
|
+
<p class="mac-permission-usage">When learning is enabled, collected content is sent to your selected learning model. A remote model provider receives that content outside this computer.</p>
|
|
14
|
+
<p class="mac-permission-usage">Collection and learning have separate controls. You can stop collection, exclude applications, or delete pending activity in Spark. Stopping collection does not recall content already sent to model providers. Saving this acknowledgment alone does not start collection.</p>
|
|
15
|
+
<p class="mac-permission-path-note">This acknowledgment is saved for this ABot installation and kept across updates.</p>
|
|
16
|
+
<label class="collection-consent-acknowledgment"><input type="checkbox" data-collection-consent-acknowledged />
|
|
17
|
+
<span>I understand and agree to the <a href="https://abot-ai.com/terms/#software" target="_blank" rel="noopener noreferrer">Software Terms</a> and <a href="https://abot-ai.com/privacy/#software" target="_blank" rel="noopener noreferrer">Software Privacy Policy</a>.</span></label>
|
|
18
|
+
</div><div class="mac-permission-footer"><span>Collection starts only through Spark controls.</span>
|
|
19
|
+
<div><button type="button" data-collection-consent-cancel>Cancel</button>
|
|
20
|
+
<button type="button" class="mac-permission-continue" data-collection-consent-continue disabled>Continue</button></div>
|
|
21
|
+
</div>`;
|
|
22
|
+
(documentRoot.body ?? container).append(dialog);
|
|
23
|
+
const checkbox = dialog.querySelector("[data-collection-consent-acknowledged]");
|
|
24
|
+
const proceed = dialog.querySelector("[data-collection-consent-continue]");
|
|
25
|
+
let pending;
|
|
26
|
+
let returnFocus;
|
|
27
|
+
|
|
28
|
+
function finish(approved) {
|
|
29
|
+
if (!pending) return;
|
|
30
|
+
const resolve = pending;
|
|
31
|
+
pending = undefined;
|
|
32
|
+
dialog.close();
|
|
33
|
+
if (returnFocus?.isConnected && !returnFocus.closest("[hidden]")) returnFocus.focus();
|
|
34
|
+
resolve(approved);
|
|
35
|
+
}
|
|
36
|
+
checkbox.addEventListener("change", () => { proceed.disabled = !checkbox.checked; });
|
|
37
|
+
proceed.addEventListener("click", () => {
|
|
38
|
+
if (!checkbox.checked || proceed.disabled) return;
|
|
39
|
+
finish(true);
|
|
40
|
+
});
|
|
41
|
+
for (const button of dialog.querySelectorAll("[data-collection-consent-cancel]"))
|
|
42
|
+
button.addEventListener("click", () => finish(false));
|
|
43
|
+
dialog.addEventListener("cancel", (event) => { event.preventDefault(); finish(false); });
|
|
44
|
+
dialog.addEventListener("close", () => finish(false));
|
|
45
|
+
return {
|
|
46
|
+
confirm() {
|
|
47
|
+
if (pending) return Promise.resolve(false);
|
|
48
|
+
checkbox.checked = false;
|
|
49
|
+
proceed.disabled = true;
|
|
50
|
+
returnFocus = documentRoot.activeElement;
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
pending = resolve;
|
|
53
|
+
dialog.showModal();
|
|
54
|
+
dialog.querySelector("h2").focus();
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
cancel() { finish(false); },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createCollectionConsentDialog } from "./collection-consent-dialog.js";
|
|
2
|
+
import { hasCollectionAccess, needsCollectionConsentReview } from "./collection-access.js";
|
|
3
|
+
import { readActivityPermissions } from "./activity-controls.js";
|
|
4
|
+
|
|
5
|
+
function requestsCollectionAccess(preferences, snapshot) {
|
|
6
|
+
if (preferences.enabled === false || preferences.activityPermissions?.collection === false) return false;
|
|
7
|
+
if (preferences.enabled === true) return true;
|
|
8
|
+
if (preferences.activityPermissions?.collection !== true) return false;
|
|
9
|
+
return !readActivityPermissions(snapshot.status?.preferences).collection;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function collectionRequestContext(snapshot) {
|
|
13
|
+
const host = snapshot.hostConnection;
|
|
14
|
+
return JSON.stringify([
|
|
15
|
+
snapshot.environmentId, host?.collectionSource, host?.hostId,
|
|
16
|
+
host?.connected, host?.connectionId, snapshot.status?.preferences?.modelProfileId,
|
|
17
|
+
snapshot.status?.preferences?.enabled,
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Installation consent precedes platform permission preparation and explicit activation. */
|
|
22
|
+
export function createCollectionConsentGate({
|
|
23
|
+
actions, container, openComputerAccess = () => {}, createDialog = createCollectionConsentDialog,
|
|
24
|
+
}) {
|
|
25
|
+
let dialog;
|
|
26
|
+
let pending;
|
|
27
|
+
let revision = 0;
|
|
28
|
+
function cancel() {
|
|
29
|
+
revision += 1;
|
|
30
|
+
pending = undefined;
|
|
31
|
+
dialog?.cancel();
|
|
32
|
+
}
|
|
33
|
+
function requestIsCurrent(request) {
|
|
34
|
+
if (pending !== request) return false;
|
|
35
|
+
return collectionRequestContext(actions.snapshot()) === request.context;
|
|
36
|
+
}
|
|
37
|
+
async function continueRequest(preferences, request) {
|
|
38
|
+
try {
|
|
39
|
+
if (actions.snapshot().hostConnection?.collectionConsent?.accepted !== true) {
|
|
40
|
+
const freshHost = await actions.refreshCollectionAccess();
|
|
41
|
+
if (!freshHost || !requestIsCurrent(request)) return;
|
|
42
|
+
}
|
|
43
|
+
if (actions.snapshot().hostConnection?.collectionConsent?.accepted !== true) {
|
|
44
|
+
dialog ??= createDialog({ container });
|
|
45
|
+
const approved = await dialog.confirm();
|
|
46
|
+
if (!approved || !requestIsCurrent(request)) return;
|
|
47
|
+
request.acknowledging = true;
|
|
48
|
+
const host = await actions.acceptCollectionConsent();
|
|
49
|
+
request.acknowledging = false;
|
|
50
|
+
if (!requestIsCurrent(request)) return;
|
|
51
|
+
if (host?.collectionConsent?.accepted !== true) return;
|
|
52
|
+
}
|
|
53
|
+
if (!requestIsCurrent(request)) return;
|
|
54
|
+
const snapshot = actions.snapshot();
|
|
55
|
+
if (preferences.enabled === true && !hasCollectionAccess(snapshot.hostConnection)) {
|
|
56
|
+
pending = undefined;
|
|
57
|
+
openComputerAccess();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
pending = undefined;
|
|
61
|
+
if (request.restart) return actions.restartCollection();
|
|
62
|
+
const restartAfterConsent = preferences.enabled === true && needsCollectionConsentReview(snapshot.status);
|
|
63
|
+
const status = await actions.configure(preferences);
|
|
64
|
+
if (!restartAfterConsent || !status?.preferences?.enabled) return status;
|
|
65
|
+
if (request.revision !== revision) return status;
|
|
66
|
+
if (collectionRequestContext(actions.snapshot()) !== request.context) return status;
|
|
67
|
+
return actions.restartCollection();
|
|
68
|
+
} finally {
|
|
69
|
+
if (pending === request) pending = undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function configure(preferences, restart = false) {
|
|
73
|
+
const snapshot = actions.snapshot();
|
|
74
|
+
if (!requestsCollectionAccess(preferences, snapshot)) {
|
|
75
|
+
cancel();
|
|
76
|
+
return actions.configure(preferences);
|
|
77
|
+
}
|
|
78
|
+
if (pending) return;
|
|
79
|
+
if (snapshot.saving || snapshot.loadingStatus || !snapshot.status) return;
|
|
80
|
+
const request = { context: collectionRequestContext(snapshot), acknowledging: false, restart, revision };
|
|
81
|
+
pending = request;
|
|
82
|
+
return continueRequest(preferences, request);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
configure,
|
|
86
|
+
restartCollection: () => configure({ enabled: true }, true),
|
|
87
|
+
update(snapshot) {
|
|
88
|
+
if (!pending) return;
|
|
89
|
+
if (collectionRequestContext(snapshot) !== pending.context) return cancel();
|
|
90
|
+
if (snapshot.saving && !pending.acknowledging) cancel();
|
|
91
|
+
},
|
|
92
|
+
cancel,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isNativeWindowsLocalAccess } from "../system-host/native-windows-access.js";
|
|
2
|
+
|
|
1
3
|
export function computerUpdateNoticeMarkup() {
|
|
2
4
|
return `<div class="co-worker-computer-update" data-learning-update hidden role="status">
|
|
3
5
|
<span class="co-worker-computer-update-icon" aria-hidden="true">↑</span>
|
|
@@ -8,6 +10,10 @@ export function computerUpdateNoticeMarkup() {
|
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
export function renderComputerUpdateNotice(root, snapshot) {
|
|
13
|
+
if (isNativeWindowsLocalAccess(snapshot.hostConnection)) {
|
|
14
|
+
root.querySelector("[data-learning-update]").hidden = true;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
11
17
|
root.querySelector("[data-learning-update]").hidden =
|
|
12
18
|
!snapshot.hostConnection?.companion?.updateAvailable;
|
|
13
19
|
}
|
|
@@ -2,6 +2,7 @@ const genericMessage = "ABot Spark could not complete this review. No specific c
|
|
|
2
2
|
|
|
3
3
|
// Exact content-free codes only. Never turn an arbitrary provider error into UI copy.
|
|
4
4
|
const groups = [
|
|
5
|
+
["Review and acknowledge Spark activity collection before starting it. No activity is collected until you continue.", ["collection_consent_required"]],
|
|
5
6
|
["macOS Accessibility permission is required. Open Computer access for the exact companion executable to approve. Spark waits up to two minutes for your consent.", ["macos_accessibility_permission_required"]],
|
|
6
7
|
["macOS Accessibility permission was removed. Re-enable access for the companion in Computer access, then stop and start collection.", ["macos_accessibility_permission_revoked"]],
|
|
7
8
|
["macOS Accessibility permission was not granted within two minutes. Complete permission setup in Computer access, then stop and start collection to check again.", ["macos_accessibility_permission_timeout"]],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { hasCollectionAccess, needsCollectionConsentReview } from "./collection-access.js";
|
|
2
2
|
import { agentMarkup, renderAgent } from "./agent-view.js";
|
|
3
3
|
import { createAgentMotion } from "./agent-motion.js";
|
|
4
4
|
import { learningFailurePresentation } from "./presentation.js";
|
|
@@ -10,11 +10,12 @@ function canStartHomeLearning(snapshot) {
|
|
|
10
10
|
if (snapshot.statusError || learningFailurePresentation(snapshot.status))
|
|
11
11
|
return false;
|
|
12
12
|
if (readActivityPermissions(snapshot.status.preferences).collection)
|
|
13
|
-
return
|
|
13
|
+
return hasCollectionAccess(snapshot.hostConnection);
|
|
14
14
|
return true;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
function homeLearningActionLabel(snapshot) {
|
|
18
|
+
if (needsCollectionConsentReview(snapshot.status)) return "Review collection access";
|
|
18
19
|
if (hasIndependentHomeActivity(snapshot.status)) return "Open ABot Spark";
|
|
19
20
|
return canStartHomeLearning(snapshot)
|
|
20
21
|
? "Start ABot Spark"
|
|
@@ -59,6 +60,10 @@ export function createPassiveLearningHome({
|
|
|
59
60
|
if (!button || !root.contains(button) || button.disabled) return;
|
|
60
61
|
const snapshot = actions?.snapshot?.() ?? renderedSnapshot;
|
|
61
62
|
if (snapshot.saving || snapshot.loadingStatus) return;
|
|
63
|
+
if (needsCollectionConsentReview(snapshot.status)) {
|
|
64
|
+
void actions.configure({ enabled: true });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
62
67
|
if (hasIndependentHomeActivity(snapshot.status)) {
|
|
63
68
|
openLearning();
|
|
64
69
|
return;
|
|
@@ -5,6 +5,7 @@ const permissionReasons = new Set([
|
|
|
5
5
|
]);
|
|
6
6
|
|
|
7
7
|
function hasEnabledMacCollection(snapshot) {
|
|
8
|
+
if (snapshot.hostConnection?.collectionSource?.mode === "native") return false;
|
|
8
9
|
if (snapshot.hostConnection?.identity?.os !== "macos") return false;
|
|
9
10
|
return snapshot.status?.preferences?.enabled === true;
|
|
10
11
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderCollectionAccess } from "./collection-access.js";
|
|
1
2
|
import { renderAgent } from "./agent-view.js";
|
|
2
3
|
import { renderComputerUpdateNotice } from "./computer-update-notice.js";
|
|
3
4
|
import { renderMacCollectionRestartNotice, handleMacCollectionRestartClick } from "./macos-collection-restart-notice.js";
|
|
@@ -133,11 +134,9 @@ export function createPassiveLearningMemory({
|
|
|
133
134
|
|
|
134
135
|
function renderStatus(snapshot) {
|
|
135
136
|
const status = snapshot.status;
|
|
136
|
-
|
|
137
|
+
renderCollectionAccess(root, snapshot);
|
|
137
138
|
renderComputerUpdateNotice(root, snapshot);
|
|
138
139
|
renderMacCollectionRestartNotice(root, snapshot);
|
|
139
|
-
root.querySelector("[data-learning-companion-version]").textContent = companion
|
|
140
|
-
? `Installed version: ${companion.installedVersion ?? "unversioned"} · Available: ${companion.availableVersion}` : "Connect your computer to check its companion version.";
|
|
141
140
|
const attention = learningFailurePresentation(status);
|
|
142
141
|
const coverage = learningCoveragePresentation(status);
|
|
143
142
|
root.querySelector("[data-learning-attention]").hidden = !attention;
|
|
@@ -150,7 +149,6 @@ export function createPassiveLearningMemory({
|
|
|
150
149
|
root.querySelector("[data-learning-schedule-summary]").textContent = modelId
|
|
151
150
|
? `${model?.label || modelId} · ${learningCadenceLabel(status.preferences)}`
|
|
152
151
|
: "Choose a model in Settings to get started.";
|
|
153
|
-
root.querySelector("[data-learning-device]").textContent = status?.deviceId || "Not connected now";
|
|
154
152
|
root.querySelector("[data-learning-coverage]").textContent = coverage.label;
|
|
155
153
|
root.querySelector("[data-learning-coverage-detail]").textContent = coverage.detail;
|
|
156
154
|
const reasons = [status?.collectionReason, status?.processingReason, status?.reason, status?.proactive?.reason, status?.reassessment?.reason, status?.maintenanceReason].filter(Boolean);
|
|
@@ -36,9 +36,9 @@ export function learningWorkspaceMarkup(timeZone) {
|
|
|
36
36
|
<section class="passive-learning-panel" id="learning-chat-panel" role="tabpanel" tabindex="0" aria-labelledby="learning-chat-tab" data-learning-panel="chat" hidden></section>
|
|
37
37
|
<section class="passive-learning-panel" id="learning-settings-panel" role="tabpanel" tabindex="0" aria-labelledby="learning-settings-tab" data-learning-panel="settings" hidden>
|
|
38
38
|
${learningSettingsMarkup(timeZone)}
|
|
39
|
-
<details class="passive-learning-setup" data-learning-setup><summary>Computer connection</summary>
|
|
39
|
+
<details class="passive-learning-setup" data-learning-setup><summary data-learning-connection-title>Computer connection</summary>
|
|
40
40
|
<dl class="passive-learning-facts co-worker-connection-facts"><div><dt>Computer</dt><dd data-learning-device>—</dd></div><div><dt>Collection access</dt><dd><span data-learning-coverage>—</span><small data-learning-coverage-detail></small></dd></div></dl>
|
|
41
|
-
<p data-learning-companion-version></p><p
|
|
41
|
+
<p data-learning-companion-version></p><p data-learning-connection-description></p><button type="button" data-learning-computer-access>Manage Computer access</button></details>
|
|
42
42
|
</section>
|
|
43
43
|
<section class="passive-learning-panel" id="learning-usage-panel" role="tabpanel" tabindex="0" aria-labelledby="learning-usage-tab" data-learning-panel="usage" hidden>${learningUsageMarkup()}</section>
|
|
44
44
|
</section>`;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
|
|
2
|
+
|
|
3
|
+
export function isPluginPlatformUnavailable(compatibility) {
|
|
4
|
+
return compatibility?.supported === false;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function renderPluginPlatformNotice(compatibility) {
|
|
8
|
+
if (!isPluginPlatformUnavailable(compatibility)) return "";
|
|
9
|
+
const platform = compatibility.runtimePlatform || "this host";
|
|
10
|
+
const reason =
|
|
11
|
+
compatibility.reason || "This plugin cannot load on this host.";
|
|
12
|
+
return `<p class="plugin-capability-policy plugin-platform-notice" data-plugin-platform="${escapeAttribute(platform)}"><strong>Unavailable on this host.</strong> ${escapeHtml(reason)}</p>`;
|
|
13
|
+
}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isPluginPlatformUnavailable,
|
|
3
|
+
renderPluginPlatformNotice,
|
|
4
|
+
} from "./compatibility.js";
|
|
1
5
|
import { renderPluginConfigurationFields } from "./configuration-fields.js";
|
|
2
6
|
import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
|
|
3
7
|
|
|
4
8
|
function renderPluginReview(review, busy) {
|
|
5
9
|
if (!review) return "";
|
|
6
|
-
const
|
|
10
|
+
const installLabel = isPluginPlatformUnavailable(review.compatibility)
|
|
11
|
+
? "Install"
|
|
12
|
+
: "Install and enable";
|
|
13
|
+
const installButton = `<button type="button" class="primary-button" data-plugin-install-confirm ${busy ? "disabled" : ""}>${busy ? "Installing…" : installLabel}</button>`;
|
|
7
14
|
return `<section class="plugin-install-review" aria-label="Plugin installation review">
|
|
8
15
|
<header class="plugin-install-heading"><div><h3>${escapeHtml(review.id)} ${review.version ? `<small>v${escapeHtml(review.version)}</small>` : ""}</h3><p>Not installed yet.</p></div>${installButton}</header>
|
|
9
16
|
<p>${escapeHtml(review.description)}</p>
|
|
17
|
+
${renderPluginPlatformNotice(review.compatibility)}
|
|
10
18
|
<dl><dt>Source</dt><dd>${escapeHtml(review.source.repository)}</dd><dt>Commit</dt><dd><code>${escapeHtml(review.source.ref)}</code></dd></dl>
|
|
11
19
|
<ul class="plugin-install-capabilities">${review.capabilities.map((capability) => `<li><strong>${escapeHtml(capability.id)}</strong><p>${escapeHtml(capability.description)}</p><span>${capability.operations.map((operation) => escapeHtml(`${operation.name} · ${operation.effect}`)).join(" / ")}</span></li>`).join("")}</ul>
|
|
12
20
|
${renderPluginConfigurationFields(review.configuration, busy)}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { isPluginPlatformUnavailable } from "./compatibility.js";
|
|
2
|
+
|
|
3
|
+
export function pluginInstallationMessage(review) {
|
|
4
|
+
if (isPluginPlatformUnavailable(review.compatibility))
|
|
5
|
+
return `${review.id} installed. It will not load on this Runtime: ${review.compatibility.reason}`;
|
|
6
|
+
return `${review.id} installed. Apply changes to make it available.`;
|
|
7
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pluginInstallationMessage } from "./installation-compatibility.js";
|
|
1
2
|
import { createPluginConfigurationDraft } from "./configuration-draft.js";
|
|
2
3
|
import {
|
|
3
4
|
bindPluginConfigurationFields,
|
|
@@ -125,7 +126,7 @@ export function createPluginInstallation({
|
|
|
125
126
|
state.dirty = false;
|
|
126
127
|
state.review = null;
|
|
127
128
|
state.installedPluginId = review.id;
|
|
128
|
-
state.message =
|
|
129
|
+
state.message = pluginInstallationMessage(review);
|
|
129
130
|
onInstalled(result);
|
|
130
131
|
onConfigurationSaved();
|
|
131
132
|
const refreshed = await refreshRuntimeConfig(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderPluginPlatformNotice } from "./compatibility.js";
|
|
1
2
|
import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
|
|
2
3
|
|
|
3
4
|
function pluginMasterIsEnabled(plugin) {
|
|
@@ -50,6 +51,7 @@ function renderCapabilities(plugin, busy, open) {
|
|
|
50
51
|
<button type="button" data-plugin-tools-back="${escapeAttribute(plugin.id)}" aria-label="${escapeAttribute(`Back to ${plugin.id}`)}">Back</button>
|
|
51
52
|
<div><h4 title="${escapeAttribute(plugin.id)}">${escapeHtml(plugin.id)}</h4><span>Tools (${capabilities.length})</span></div>
|
|
52
53
|
</header>
|
|
54
|
+
${renderPluginPlatformNotice(plugin.compatibility)}
|
|
53
55
|
<ul class="plugin-capability-list" data-plugin-tools-scroll="${escapeAttribute(plugin.id)}">
|
|
54
56
|
${capabilities.length ? capabilities.map((capability) => renderCapabilityRow(plugin, capability, busy)).join("") : '<li class="plugin-capability-empty">This plugin does not expose any tools.</li>'}
|
|
55
57
|
</ul>
|
|
@@ -78,6 +80,7 @@ function renderPluginCard(
|
|
|
78
80
|
<span class="plugin-selection-state" data-plugin-state="${escapeAttribute(plugin.state)}">${configuredPluginLabel(plugin)}</span>
|
|
79
81
|
</div>
|
|
80
82
|
<p class="plugin-description" title="${escapeAttribute(plugin.description || "Installed Runtime plugin.")}">${escapeHtml(plugin.description || "Installed Runtime plugin.")}</p>
|
|
83
|
+
${renderPluginPlatformNotice(plugin.compatibility)}
|
|
81
84
|
<div class="plugin-card-footer">
|
|
82
85
|
<span>${plugin.selectedCapabilityCount} of ${plugin.capabilityCount} capabilities selected</span>
|
|
83
86
|
<div class="plugin-card-actions">
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { escapeHtml } from "../lib/text-format.js";
|
|
2
|
+
import { enableModelReasoning } from "../services/reasoning-override.js";
|
|
3
|
+
|
|
4
|
+
/** A non-modal prompt anchored in the existing composer mode menu. */
|
|
5
|
+
export function createReasoningOverridePrompt({ root, client, getEnvironmentId, getProfile, refreshModels, render }) {
|
|
6
|
+
let context = "";
|
|
7
|
+
let revision = 0;
|
|
8
|
+
let busy = false;
|
|
9
|
+
let saved = false;
|
|
10
|
+
let message = "";
|
|
11
|
+
let failed = false;
|
|
12
|
+
let wasOpen = false;
|
|
13
|
+
const currentContext = () => JSON.stringify([getEnvironmentId(), getProfile()?.id]);
|
|
14
|
+
const ownsReasoningPrompt = (captured) => revision === captured.revision && context === captured.key && currentContext() === captured.key;
|
|
15
|
+
|
|
16
|
+
function reset() {
|
|
17
|
+
revision += 1;
|
|
18
|
+
context = ""; busy = false; saved = false; message = ""; failed = false; wasOpen = false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function enable(applyNow) {
|
|
22
|
+
if (busy || !getProfile()) return;
|
|
23
|
+
const captured = { key: currentContext(), revision };
|
|
24
|
+
const environmentId = getEnvironmentId();
|
|
25
|
+
const profileId = getProfile().id;
|
|
26
|
+
busy = true; failed = false; message = "Saving…"; render();
|
|
27
|
+
try {
|
|
28
|
+
await enableModelReasoning(client, profileId, environmentId);
|
|
29
|
+
if (!ownsReasoningPrompt(captured)) return;
|
|
30
|
+
saved = true;
|
|
31
|
+
message = "Saved. Reasoning controls will be available after Runtime restarts.";
|
|
32
|
+
if (!applyNow) return;
|
|
33
|
+
message = "Applying saved configuration…"; render();
|
|
34
|
+
const result = await client.applyRuntimeConfiguration(environmentId);
|
|
35
|
+
if (!ownsReasoningPrompt(captured)) return;
|
|
36
|
+
if (result?.activation?.status !== "ready") {
|
|
37
|
+
message = result?.activation?.message || "Saved. Apply again when Runtime is idle, or restart it later.";
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const refreshed = await refreshModels();
|
|
41
|
+
if (!ownsReasoningPrompt(captured)) return;
|
|
42
|
+
if (!refreshed) throw new Error("Configuration applied. Reload to refresh the model's reasoning controls.");
|
|
43
|
+
message = "Configuration applied. Reload if this model still uses provider defaults.";
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (!ownsReasoningPrompt(captured)) return;
|
|
46
|
+
failed = true;
|
|
47
|
+
message = `${saved ? "Saved; not confirmed active. " : ""}${error.message || String(error)}`;
|
|
48
|
+
} finally {
|
|
49
|
+
if (ownsReasoningPrompt(captured)) { busy = false; render(); }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function renderPrompt(open) {
|
|
54
|
+
const next = currentContext();
|
|
55
|
+
if (context !== next) { reset(); context = next; }
|
|
56
|
+
const restoreFocus = Boolean(root.contains?.(root.ownerDocument?.activeElement));
|
|
57
|
+
const focusOnOpen = open && !wasOpen;
|
|
58
|
+
wasOpen = open;
|
|
59
|
+
if (!open) { root.innerHTML = ""; return; }
|
|
60
|
+
const profile = getProfile();
|
|
61
|
+
const canSave = Boolean(profile) && typeof client.loadConfigDashboard === "function" && typeof client.saveConfigFile === "function";
|
|
62
|
+
root.innerHTML = `<section class="reasoning-override-prompt">
|
|
63
|
+
<strong>Enable reasoning controls?</strong>
|
|
64
|
+
<p><span>${escapeHtml(profile?.label || profile?.id || "This model")}</span> currently uses the provider’s default. Enable this only if the model supports reasoning controls.</p>
|
|
65
|
+
<div class="reasoning-override-actions">
|
|
66
|
+
<button type="button" data-reasoning-enable="now"${busy || !canSave || typeof client.applyRuntimeConfiguration !== "function" ? " disabled" : ""}>${saved ? "Apply now" : "Enable and apply now"}</button>
|
|
67
|
+
<button type="button" data-reasoning-enable="later"${busy || saved || !canSave ? " disabled" : ""}>Enable on next start</button>
|
|
68
|
+
</div>
|
|
69
|
+
<small>Apply now restarts idle Runtime environments with all saved settings. Active work will not be interrupted.</small>
|
|
70
|
+
<p class="reasoning-override-status${failed ? " error-text" : ""}" role="status" aria-live="polite"${message ? "" : " hidden"}>${escapeHtml(message)}</p>
|
|
71
|
+
</section>`;
|
|
72
|
+
for (const button of root.querySelectorAll("[data-reasoning-enable]")) {
|
|
73
|
+
button.addEventListener("click", () => void enable(button.dataset.reasoningEnable === "now"));
|
|
74
|
+
}
|
|
75
|
+
if (focusOnOpen || restoreFocus) {
|
|
76
|
+
const target = root.querySelector?.("button:not(:disabled)");
|
|
77
|
+
root.tabIndex = -1;
|
|
78
|
+
(target || root).focus();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { render: renderPrompt, reset };
|
|
82
|
+
}
|
|
@@ -33,10 +33,30 @@ export function createRuntimeConfigActivation({
|
|
|
33
33
|
const workspace = getWorkspace();
|
|
34
34
|
if (!workspace?.beginExternalRuntimeMutation("saved configuration")) return;
|
|
35
35
|
const environment = getEnvironmentId();
|
|
36
|
-
let activated = false;
|
|
37
36
|
busy = true;
|
|
38
37
|
button.disabled = true;
|
|
39
38
|
status.textContent = "Restarting with saved settings…";
|
|
39
|
+
try {
|
|
40
|
+
const activated = await restartSavedConfiguration(workspace, environment);
|
|
41
|
+
if (!activated) return;
|
|
42
|
+
if (environment !== getEnvironmentId()) return;
|
|
43
|
+
const settled = await onAppliedSettled();
|
|
44
|
+
if (settled !== false) return;
|
|
45
|
+
if (environment !== getEnvironmentId()) return;
|
|
46
|
+
status.textContent =
|
|
47
|
+
"Runtime restarted. Finish your current edits, then refresh configuration to update environments.";
|
|
48
|
+
} catch {
|
|
49
|
+
if (environment !== getEnvironmentId()) return;
|
|
50
|
+
status.textContent =
|
|
51
|
+
"Runtime restarted. Refresh configuration to update this view.";
|
|
52
|
+
} finally {
|
|
53
|
+
busy = false;
|
|
54
|
+
button.disabled = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function restartSavedConfiguration(workspace, environment) {
|
|
59
|
+
let activated = false;
|
|
40
60
|
try {
|
|
41
61
|
const result = await apply();
|
|
42
62
|
if (environment !== getEnvironmentId()) return;
|
|
@@ -65,8 +85,6 @@ export function createRuntimeConfigActivation({
|
|
|
65
85
|
: "The runtime could not restart. Try again.";
|
|
66
86
|
}
|
|
67
87
|
} finally {
|
|
68
|
-
busy = false;
|
|
69
|
-
button.disabled = false;
|
|
70
88
|
if (activated) button.textContent = "Restart runtime";
|
|
71
89
|
workspace.endExternalRuntimeMutation();
|
|
72
90
|
if (environment !== getEnvironmentId()) {
|
|
@@ -75,11 +93,7 @@ export function createRuntimeConfigActivation({
|
|
|
75
93
|
button.textContent = "Restart runtime";
|
|
76
94
|
}
|
|
77
95
|
}
|
|
78
|
-
|
|
79
|
-
if (environment !== getEnvironmentId()) return;
|
|
80
|
-
if (onAppliedSettled() === false)
|
|
81
|
-
status.textContent =
|
|
82
|
-
"Runtime restarted. Finish your current edits, then refresh configuration to update environments.";
|
|
96
|
+
return activated;
|
|
83
97
|
}
|
|
84
98
|
|
|
85
99
|
button.addEventListener("click", applySavedConfiguration);
|