@abot-ai/runtime 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/cli/abot.js +2 -0
- package/dist/src/cli/host-companion-bundle.mjs +751 -333
- package/dist/src/computer-access/collection-consent.d.ts +9 -0
- package/dist/src/computer-access/collection-consent.js +47 -0
- package/dist/src/computer-access/command-output-capture.d.ts +17 -6
- package/dist/src/computer-access/command-output-capture.js +134 -68
- package/dist/src/computer-access/command-output-protection.d.ts +17 -0
- package/dist/src/computer-access/command-output-protection.js +59 -0
- package/dist/src/computer-access/companion/command-output.d.ts +1 -0
- package/dist/src/computer-access/companion/command-output.js +23 -6
- package/dist/src/computer-access/companion/install-link-macos.js +2 -1
- package/dist/src/computer-access/companion/native-notifications.js +3 -2
- package/dist/src/computer-access/companion/native-session.js +6 -2
- package/dist/src/computer-access/companion/observation-filter.js +2 -26
- package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
- package/dist/src/computer-access/companion/observation-process.js +51 -25
- package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
- package/dist/src/computer-access/companion/observation-redaction.js +2 -111
- package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
- package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
- package/dist/src/computer-access/computer/companion-sessions.js +7 -6
- package/dist/src/computer-access/computer/unix-native-process.js +23 -11
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +79 -11
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
- package/dist/src/computer-access/native-observation-connection.js +78 -0
- package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
- package/dist/src/computer-access/native-observation-ownership.js +55 -0
- package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
- package/dist/src/computer-access/native-observation-shutdown.js +58 -0
- package/dist/src/computer-access/observation-source.d.ts +6 -0
- package/dist/src/computer-access/observation-source.js +10 -0
- package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
- package/dist/src/computer-access/security/desktop-result.js +146 -0
- package/dist/src/computer-access/security/observed-error.d.ts +2 -0
- package/dist/src/computer-access/security/observed-error.js +10 -0
- package/dist/src/computer-access/security/secret-text.d.ts +7 -0
- package/dist/src/computer-access/security/secret-text.js +111 -0
- package/dist/src/computer-access/security/system-results.d.ts +2 -0
- package/dist/src/computer-access/security/system-results.js +53 -0
- package/dist/src/computer-access/system-result-protection.d.ts +11 -0
- package/dist/src/computer-access/system-result-protection.js +1 -0
- package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
- package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
- package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
- package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
- package/dist/src/model-gateway/observability/provider-trace.js +30 -8
- package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
- package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
- package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
- package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
- package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
- package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
- package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
- package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
- package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
- package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
- package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
- package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
- package/dist/src/model-gateway/providers/openai/payload.js +6 -23
- package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
- package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
- package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
- package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
- package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
- package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
- package/dist/src/model-gateway/providers/openai/stream.js +13 -41
- package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
- package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
- package/dist/src/model-gateway/server.js +5 -1
- package/dist/src/plugin-contract/index.d.ts +1 -0
- package/dist/src/plugin-contract/index.js +1 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -0
- package/dist/src/plugin-contract/manifest.js +1 -0
- package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
- package/dist/src/plugin-contract/platform-compatibility.js +3 -0
- package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
- package/dist/src/plugin-sdk/computer-access.js +1 -0
- package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
- package/dist/src/plugin-sdk/files-windows/process.js +93 -0
- package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
- package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
- package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
- package/dist/src/plugin-sdk/files-windows/read.js +56 -0
- package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
- package/dist/src/plugin-sdk/files-windows/result.js +67 -0
- package/dist/src/plugin-sdk/files.js +4 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
- package/dist/src/plugin-sdk/mutation-result.js +11 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
- package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
- package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
- package/dist/src/runtime/passive-learning/collection-source.js +7 -0
- package/dist/src/runtime/passive-learning/service.js +2 -3
- package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
- package/dist/src/runtime/passive-learning/status-projection.js +9 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
- package/dist/src/runtime/plugins/installation/package.js +2 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
- package/dist/src/runtime/plugins/loader.js +24 -14
- package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
- package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
- package/dist/src/runtime/plugins/manifest-validator.js +9 -1
- package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
- package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
- package/dist/src/runtime/steps/execution-agent/format.js +2 -3
- package/dist/src/runtime/steps/execution-agent/input.js +1 -1
- package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
- package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
- package/dist/src/sessions/durable-session-commit.js +3 -3
- package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
- package/dist/src/sessions/prepared-session-replacement.js +46 -0
- package/dist/src/sessions/session-store.js +3 -3
- package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
- package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
- package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/authority-script.js +94 -0
- package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
- package/dist/src/shared/windows-file-io/native-script.js +120 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
- package/dist/src/shared/windows-job-object.d.ts +2 -0
- package/dist/src/shared/windows-job-object.js +66 -0
- package/dist/src/web-ui/app/app-bootstrap.js +14 -1
- package/dist/src/web-ui/app/app-state.js +0 -7
- package/dist/src/web-ui/app/app.js +53 -156
- package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
- package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
- package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
- package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
- package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
- package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
- package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
- package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
- package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
- package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
- package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
- package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
- package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
- package/dist/src/web-ui/app/components/schedules/form.js +10 -8
- package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
- package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
- package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
- package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +9 -1
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
- package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
- package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
- package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
- package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
- package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
- package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
- package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
- package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
- package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
- package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
- package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
- package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
- package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
- package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
- package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
- package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
- package/dist/src/web-ui/app/dashboard-feature.js +3 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
- package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
- package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
- package/dist/src/web-ui/app/schedules-feature.js +5 -3
- package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
- package/dist/src/web-ui/app/services/client-preferences.js +25 -16
- package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
- package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
- package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
- package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
- package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
- package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
- package/dist/src/web-ui/app/services/workspace-state.js +27 -0
- package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
- package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
- package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
- package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
- package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
- package/dist/src/web-ui/app/styles.css +2 -0
- package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
- package/dist/src/web-ui/client-state/contracts.js +13 -0
- package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
- package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
- package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
- package/dist/src/web-ui/client-state/preferences.js +84 -0
- package/dist/src/web-ui/client-state/queue.d.ts +3 -0
- package/dist/src/web-ui/client-state/queue.js +43 -0
- package/dist/src/web-ui/client-state/routes.d.ts +7 -0
- package/dist/src/web-ui/client-state/routes.js +58 -0
- package/dist/src/web-ui/client-state/store.d.ts +14 -0
- package/dist/src/web-ui/client-state/store.js +88 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
- package/dist/src/web-ui/local-runtime/http.js +11 -2
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
- package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
- package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +14 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +3 -1
- package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
- package/dist/src/web-ui/server-readiness.d.ts +3 -0
- package/dist/src/web-ui/server-readiness.js +36 -0
- package/dist/src/web-ui/server.d.ts +2 -0
- package/dist/src/web-ui/server.js +23 -1
- package/dist/src/web-ui/system-host-service.js +13 -2
- package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
- package/docs/installation.md +44 -5
- package/docs/plugins.md +145 -4
- package/docs/tool-execution-result-evidence-contract.md +57 -0
- package/docs/windows-companion-store.md +5 -0
- package/package.json +4 -2
- package/plugins/capability-brief/plugin.json +4 -0
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +1 -0
- package/plugins/code-outline/source/index.ts +16 -20
- package/plugins/code-outline/source/read-failure.ts +40 -0
- package/plugins/code-outline/src/index.cjs +614 -29
- package/plugins/document-reader/README.md +33 -0
- package/plugins/document-reader/plugin.json +1 -0
- package/plugins/document-reader/source/pdf-contract.ts +57 -0
- package/plugins/document-reader/source/pdf-parser.ts +139 -0
- package/plugins/document-reader/source/pdf-process-main.ts +56 -0
- package/plugins/document-reader/source/pdf-process.ts +207 -0
- package/plugins/document-reader/source/pdf-result.ts +79 -0
- package/plugins/document-reader/source/pdf-worker.ts +39 -303
- package/plugins/document-reader/source/pdf.ts +4 -1
- package/plugins/document-reader/source/read-failure.ts +37 -0
- package/plugins/document-reader/source/reader.ts +3 -19
- package/plugins/document-reader/src/index.cjs +995 -211
- package/plugins/exec/README.md +19 -0
- package/plugins/exec/plugin.json +4 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
- package/plugins/exec/source/filesystem-file-observer.ts +98 -0
- package/plugins/exec/source/filesystem-observer.ts +8 -79
- package/plugins/exec/source/output-files.ts +12 -6
- package/plugins/exec/source/paths.ts +3 -1
- package/plugins/exec/source/process-manager.ts +8 -24
- package/plugins/exec/source/shell-platform.ts +19 -3
- package/plugins/exec/source/shell-process.ts +55 -0
- package/plugins/exec/source/windows-job-source.ts +1 -0
- package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
- package/plugins/exec/src/index.cjs +252 -96
- package/plugins/filesystem/README.md +65 -0
- package/plugins/filesystem/plugin.json +6 -2
- package/plugins/filesystem/source/atomic-write.ts +2 -0
- package/plugins/filesystem/source/bounded-io.ts +80 -306
- package/plugins/filesystem/source/directory-sample.ts +2 -0
- package/plugins/filesystem/source/errors.ts +14 -0
- package/plugins/filesystem/source/file-observation.ts +151 -0
- package/plugins/filesystem/source/file-version.ts +41 -0
- package/plugins/filesystem/source/index.ts +6 -0
- package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
- package/plugins/filesystem/source/windows/authority-script.ts +1 -0
- package/plugins/filesystem/source/windows/native-script.ts +1 -0
- package/plugins/filesystem/source/windows/operations.ts +197 -0
- package/plugins/filesystem/source/windows/process.ts +214 -0
- package/plugins/filesystem/source/windows/publication-script.ts +29 -0
- package/plugins/filesystem/source/windows/read-script.ts +63 -0
- package/plugins/filesystem/source/windows/request-availability.ts +67 -0
- package/plugins/filesystem/source/windows/source.ts +42 -0
- package/plugins/filesystem/source/windows/storage-script.ts +11 -0
- package/plugins/filesystem/source/windows/streams-script.ts +24 -0
- package/plugins/filesystem/source/windows/write-script.ts +86 -0
- package/plugins/filesystem/src/index.cjs +1208 -322
- package/plugins/json-inspector/README.md +18 -0
- package/plugins/json-inspector/plugin.json +1 -0
- package/plugins/json-inspector/source/index.ts +16 -19
- package/plugins/json-inspector/source/read-failure.ts +42 -0
- package/plugins/json-inspector/src/index.cjs +612 -27
- package/plugins/local-search/README.md +29 -0
- package/plugins/local-search/plugin.json +1 -0
- package/plugins/local-search/source/errors.ts +2 -0
- package/plugins/local-search/source/paths.ts +3 -0
- package/plugins/local-search/source/ripgrep-process.ts +31 -5
- package/plugins/local-search/source/ripgrep.ts +3 -3
- package/plugins/local-search/source/windows-authority.ts +99 -0
- package/plugins/local-search/source/windows-search-lease.ts +49 -0
- package/plugins/local-search/source/windows-search-process.ts +91 -0
- package/plugins/local-search/source/windows-search-script.ts +52 -0
- package/plugins/local-search/src/index.cjs +595 -26
- package/plugins/memory/plugin.json +4 -0
- package/plugins/memory/source/lock-directory-claim.ts +56 -0
- package/plugins/memory/source/lock-owner-file.ts +71 -0
- package/plugins/memory/source/lock-path-observation.ts +26 -0
- package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
- package/plugins/memory/source/store-lock.ts +12 -7
- package/plugins/memory/source/store.ts +3 -2
- package/plugins/memory/src/index.cjs +174 -25
- package/plugins/project-orientation/README.md +23 -0
- package/plugins/project-orientation/plugin.json +1 -0
- package/plugins/project-orientation/source/index.ts +12 -9
- package/plugins/project-orientation/source/inspection-failure.ts +70 -0
- package/plugins/project-orientation/source/manifest-summary.ts +9 -2
- package/plugins/project-orientation/source/tree.ts +6 -0
- package/plugins/project-orientation/src/index.cjs +647 -31
- package/plugins/system/README.md +51 -15
- package/plugins/system/plugin.json +5 -1
- package/plugins/system/skills/system_actions/SKILL.md +1 -1
- package/plugins/system/source/command-working-directory.ts +47 -0
- package/plugins/system/source/computer/handlers.ts +13 -9
- package/plugins/system/source/computer/observation-result.ts +10 -5
- package/plugins/system/source/computer/request-computers.ts +10 -3
- package/plugins/system/source/computer/request-modules.ts +3 -6
- package/plugins/system/source/computer/runtime-platform.ts +18 -0
- package/plugins/system/source/host-dispatch.ts +18 -2
- package/plugins/system/source/index.ts +5 -3
- package/plugins/system/source/local-command-output-retention.ts +16 -0
- package/plugins/system/source/local-command-output.ts +16 -8
- package/plugins/system/source/request-system-modules.ts +12 -2
- package/plugins/system/source/request-target-snapshot.ts +2 -1
- package/plugins/system/source/security/desktop-result.ts +177 -0
- package/plugins/system/source/security/observed-error.ts +10 -0
- package/plugins/system/source/security/secret-text.ts +118 -0
- package/plugins/system/source/security/system-results.ts +62 -0
- package/plugins/system/source/security/windows-output-directory.ts +82 -0
- package/plugins/system/src/index.cjs +837 -151
- package/plugins/system-probe/plugin.json +8 -2
- package/plugins/system-probe/source/disk-path.ts +8 -0
- package/plugins/system-probe/source/index.ts +10 -5
- package/plugins/system-probe/source/machine-load.ts +33 -0
- package/plugins/system-probe/source/metrics.ts +6 -8
- package/plugins/system-probe/src/index.cjs +49 -16
- package/plugins/web/plugin.json +4 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Persisted ownership has no expiry: uncertain sends require a manual handoff. */
|
|
2
|
+
export function hasValidQueueOwnership(queue) {
|
|
3
|
+
const owner = queue.blockedReleaseOwner;
|
|
4
|
+
if (owner === undefined || owner === null) return true;
|
|
5
|
+
if (queue.blockedByReleaseToken === null) return false;
|
|
6
|
+
if (!owner || typeof owner !== "object" || Array.isArray(owner)) return false;
|
|
7
|
+
if (typeof owner.id !== "string" || !owner.id || owner.id.length > 128) return false;
|
|
8
|
+
return ["editing", "sending", "uncertain"].includes(owner.state);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function canEditBlockedRelease(queue, ownerId) {
|
|
12
|
+
if (!queue.blockedReleaseOwner) return true;
|
|
13
|
+
if (queue.blockedReleaseOwner.id !== ownerId) return false;
|
|
14
|
+
return queue.blockedReleaseOwner.state === "editing";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function canUpdateBlockedRelease(queue, ownerId) {
|
|
18
|
+
return canEditBlockedRelease(queue, ownerId);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function canBindBlockedRelease(queue, ownerId) {
|
|
22
|
+
if (!queue.blockedReleaseOwner) return true;
|
|
23
|
+
if (queue.blockedReleaseOwner.id !== ownerId) return false;
|
|
24
|
+
return ["sending", "uncertain"].includes(queue.blockedReleaseOwner.state);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createQueueOwnership({ ownerId, readStore, writeStore, getQueue, createToken, projectRelease }) {
|
|
28
|
+
function claimBlockedRelease(scope, releaseToken, { takeover = false } = {}) {
|
|
29
|
+
if (!ownerId) return projectRelease(getQueue(readStore(), scope));
|
|
30
|
+
const store = readStore();
|
|
31
|
+
const queue = getQueue(store, scope);
|
|
32
|
+
if (!queue?.blockedReleaseItem || queue.blockedByReleaseToken !== releaseToken) return null;
|
|
33
|
+
const owner = queue.blockedReleaseOwner;
|
|
34
|
+
if (!takeover && owner && !canEditBlockedRelease(queue, ownerId)) return null;
|
|
35
|
+
if (takeover || !owner) queue.blockedByReleaseToken = createToken();
|
|
36
|
+
queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
|
|
37
|
+
writeStore(store);
|
|
38
|
+
return projectRelease(queue);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function changeOwnedPhase(scope, releaseToken, from, to) {
|
|
42
|
+
if (!ownerId) return true;
|
|
43
|
+
const store = readStore();
|
|
44
|
+
const queue = getQueue(store, scope);
|
|
45
|
+
if (queue?.blockedByReleaseToken !== releaseToken) return false;
|
|
46
|
+
if (queue.blockedReleaseOwner?.id !== ownerId) return false;
|
|
47
|
+
if (queue.blockedReleaseOwner.state !== from) return false;
|
|
48
|
+
queue.blockedReleaseOwner.state = to;
|
|
49
|
+
writeStore(store);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
claimBlockedRelease,
|
|
55
|
+
beginBlockedSend: (scope, token) => changeOwnedPhase(scope, token, "editing", "sending"),
|
|
56
|
+
markBlockedUncertain: (scope, token) => changeOwnedPhase(scope, token, "sending", "uncertain"),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -32,9 +32,14 @@ export interface SessionComposerQueueStorage {
|
|
|
32
32
|
export interface ReleasedSessionComposerQueueItem {
|
|
33
33
|
item: SessionComposerQueueItem;
|
|
34
34
|
releaseToken: string;
|
|
35
|
+
owner?: { id: string; state: "editing" | "sending" | "uncertain" };
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
export interface SessionComposerQueue {
|
|
39
|
+
refresh?(): Promise<void>;
|
|
40
|
+
claimBlockedRelease(scope: SessionComposerQueueScope, releaseToken: string, options?: { takeover?: boolean }): ReleasedSessionComposerQueueItem | null;
|
|
41
|
+
beginBlockedSend(scope: SessionComposerQueueScope, releaseToken: string): boolean;
|
|
42
|
+
markBlockedUncertain(scope: SessionComposerQueueScope, releaseToken: string): boolean;
|
|
38
43
|
enqueue(
|
|
39
44
|
scope: SessionComposerQueueScope,
|
|
40
45
|
item: SessionComposerQueueItemInput,
|
|
@@ -64,12 +69,19 @@ export interface SessionComposerQueue {
|
|
|
64
69
|
): boolean;
|
|
65
70
|
}
|
|
66
71
|
|
|
72
|
+
type QueueMutation = "claimBlockedRelease" | "beginBlockedSend" | "markBlockedUncertain" | "enqueue" | "updateBlockedRelease" | "releaseForTerminal" | "bindReleasedSuccess" | "rebindBlocked";
|
|
73
|
+
export type RemoteSessionComposerQueue = Omit<SessionComposerQueue, QueueMutation> & {
|
|
74
|
+
[K in QueueMutation]: (...args: Parameters<SessionComposerQueue[K]>) => Promise<ReturnType<SessionComposerQueue[K]>>;
|
|
75
|
+
};
|
|
76
|
+
|
|
67
77
|
export interface CreateSessionComposerQueueOptions {
|
|
78
|
+
ownerId?: string | null;
|
|
68
79
|
storage?: SessionComposerQueueStorage;
|
|
69
80
|
storageKey?: string;
|
|
70
81
|
}
|
|
71
82
|
|
|
72
83
|
export declare const SESSION_COMPOSER_QUEUE_STORAGE_KEY: string;
|
|
84
|
+
export declare function isPersistedStore(value: unknown): boolean;
|
|
73
85
|
|
|
74
86
|
export declare function createSessionComposerQueue(
|
|
75
87
|
options?: CreateSessionComposerQueueOptions,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { hasValidQueueOwnership, canUpdateBlockedRelease, canBindBlockedRelease, createQueueOwnership } from "./session-composer-queue-ownership.js";
|
|
2
|
+
|
|
1
3
|
export const SESSION_COMPOSER_QUEUE_STORAGE_KEY =
|
|
2
4
|
"abot-web.sessionComposerQueue.v1";
|
|
3
5
|
|
|
@@ -60,6 +62,7 @@ function isQueueRecord(value) {
|
|
|
60
62
|
const blockedReleaseItem = value?.blockedReleaseItem ?? null;
|
|
61
63
|
return Boolean(
|
|
62
64
|
isRecord(value) &&
|
|
65
|
+
hasValidQueueOwnership(value) &&
|
|
63
66
|
isNonEmptyString(value.environmentId) &&
|
|
64
67
|
isNonEmptyString(value.sessionId) &&
|
|
65
68
|
(value.blockedByReleaseToken === null ||
|
|
@@ -72,7 +75,7 @@ function isQueueRecord(value) {
|
|
|
72
75
|
);
|
|
73
76
|
}
|
|
74
77
|
|
|
75
|
-
function isPersistedStore(value) {
|
|
78
|
+
export function isPersistedStore(value) {
|
|
76
79
|
if (
|
|
77
80
|
!isRecord(value) ||
|
|
78
81
|
value.version !== STORAGE_VERSION ||
|
|
@@ -149,7 +152,8 @@ function createReleaseToken() {
|
|
|
149
152
|
}
|
|
150
153
|
|
|
151
154
|
export function createSessionComposerQueue({
|
|
152
|
-
storage
|
|
155
|
+
storage,
|
|
156
|
+
ownerId = null,
|
|
153
157
|
storageKey = SESSION_COMPOSER_QUEUE_STORAGE_KEY,
|
|
154
158
|
} = {}) {
|
|
155
159
|
if (
|
|
@@ -210,9 +214,7 @@ export function createSessionComposerQueue({
|
|
|
210
214
|
return list(scopeInput)[0] ?? null;
|
|
211
215
|
}
|
|
212
216
|
|
|
213
|
-
function
|
|
214
|
-
const scope = validateScope(scopeInput);
|
|
215
|
-
const queue = findQueue(readStore(), scope);
|
|
217
|
+
function projectRelease(queue) {
|
|
216
218
|
if (
|
|
217
219
|
!queue ||
|
|
218
220
|
queue.blockedByReleaseToken === null ||
|
|
@@ -223,9 +225,14 @@ export function createSessionComposerQueue({
|
|
|
223
225
|
return {
|
|
224
226
|
releaseToken: queue.blockedByReleaseToken,
|
|
225
227
|
item: cloneJson(queue.blockedReleaseItem),
|
|
228
|
+
...(queue.blockedReleaseOwner ? { owner: { ...queue.blockedReleaseOwner } } : {}),
|
|
226
229
|
};
|
|
227
230
|
}
|
|
228
231
|
|
|
232
|
+
function getBlockedRelease(scopeInput) {
|
|
233
|
+
return projectRelease(findQueue(readStore(), validateScope(scopeInput)));
|
|
234
|
+
}
|
|
235
|
+
|
|
229
236
|
function updateBlockedRelease(scopeInput, releaseToken, itemInput) {
|
|
230
237
|
const scope = validateScope(scopeInput);
|
|
231
238
|
if (!isNonEmptyString(releaseToken)) return false;
|
|
@@ -239,6 +246,7 @@ export function createSessionComposerQueue({
|
|
|
239
246
|
) {
|
|
240
247
|
return false;
|
|
241
248
|
}
|
|
249
|
+
if (!canUpdateBlockedRelease(queue, ownerId)) return false;
|
|
242
250
|
queue.blockedReleaseItem = item;
|
|
243
251
|
writeStore(store);
|
|
244
252
|
return true;
|
|
@@ -261,8 +269,9 @@ export function createSessionComposerQueue({
|
|
|
261
269
|
const releaseToken = createReleaseToken();
|
|
262
270
|
queue.blockedByReleaseToken = releaseToken;
|
|
263
271
|
queue.blockedReleaseItem = item;
|
|
272
|
+
if (ownerId) queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
|
|
264
273
|
writeStore(store);
|
|
265
|
-
return
|
|
274
|
+
return projectRelease(queue);
|
|
266
275
|
}
|
|
267
276
|
|
|
268
277
|
function bindReleasedSuccess(scopeInput, releaseToken, newRequestId) {
|
|
@@ -273,12 +282,14 @@ export function createSessionComposerQueue({
|
|
|
273
282
|
const store = readStore();
|
|
274
283
|
const queue = findQueue(store, scope);
|
|
275
284
|
if (!queue || queue.blockedByReleaseToken !== releaseToken) return false;
|
|
285
|
+
if (!canBindBlockedRelease(queue, ownerId)) return false;
|
|
276
286
|
|
|
277
287
|
if (queue.items[0]) {
|
|
278
288
|
queue.items[0].waitForRequestId = newRequestId;
|
|
279
289
|
}
|
|
280
290
|
queue.blockedByReleaseToken = null;
|
|
281
291
|
queue.blockedReleaseItem = null;
|
|
292
|
+
delete queue.blockedReleaseOwner;
|
|
282
293
|
if (queue.items.length === 0) {
|
|
283
294
|
store.queues = store.queues.filter((candidate) => candidate !== queue);
|
|
284
295
|
}
|
|
@@ -292,12 +303,16 @@ export function createSessionComposerQueue({
|
|
|
292
303
|
const store = readStore();
|
|
293
304
|
const queue = findQueue(store, scope);
|
|
294
305
|
if (!queue || queue.blockedByReleaseToken === null) return false;
|
|
306
|
+
// A request found in a snapshot is not proof that it belongs to this release.
|
|
307
|
+
if (queue.blockedReleaseOwner) return false;
|
|
308
|
+
if (queue.blockedReleaseItem?.waitForRequestId === newRequestId) return false;
|
|
295
309
|
|
|
296
310
|
if (queue.items[0]) {
|
|
297
311
|
queue.items[0].waitForRequestId = newRequestId;
|
|
298
312
|
}
|
|
299
313
|
queue.blockedByReleaseToken = null;
|
|
300
314
|
queue.blockedReleaseItem = null;
|
|
315
|
+
delete queue.blockedReleaseOwner;
|
|
301
316
|
if (queue.items.length === 0) {
|
|
302
317
|
store.queues = store.queues.filter((candidate) => candidate !== queue);
|
|
303
318
|
}
|
|
@@ -306,6 +321,10 @@ export function createSessionComposerQueue({
|
|
|
306
321
|
}
|
|
307
322
|
|
|
308
323
|
return {
|
|
324
|
+
...createQueueOwnership({
|
|
325
|
+
ownerId, readStore, writeStore, createToken: createReleaseToken, projectRelease,
|
|
326
|
+
getQueue: (store, scope) => findQueue(store, validateScope(scope)),
|
|
327
|
+
}),
|
|
309
328
|
enqueue,
|
|
310
329
|
list,
|
|
311
330
|
peek,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createMacCollectionConsent } from "./components/passive-learning/macos-collection-consent.js";
|
|
2
|
+
import { createCollectionConsentGate } from "./components/passive-learning/collection-consent-gate.js";
|
|
2
3
|
import { createPassiveLearningController } from "./controllers/passive-learning-controller.js";
|
|
3
4
|
import { createPassiveLearningHome } from "./components/passive-learning/home.js";
|
|
4
5
|
import { createPassiveLearningMemory } from "./components/passive-learning/memory.js";
|
|
@@ -17,8 +18,10 @@ export function createPassiveLearningFeature({
|
|
|
17
18
|
let home;
|
|
18
19
|
let memory;
|
|
19
20
|
let collectionConsent;
|
|
21
|
+
let macConsent;
|
|
20
22
|
function renderViews(snapshot) {
|
|
21
23
|
collectionConsent?.update(snapshot);
|
|
24
|
+
macConsent?.update(snapshot);
|
|
22
25
|
home?.render(snapshot);
|
|
23
26
|
memory?.render(snapshot);
|
|
24
27
|
}
|
|
@@ -31,11 +34,16 @@ export function createPassiveLearningFeature({
|
|
|
31
34
|
onChange();
|
|
32
35
|
},
|
|
33
36
|
});
|
|
34
|
-
|
|
37
|
+
macConsent = createMacCollectionConsent({
|
|
35
38
|
actions: controller,
|
|
36
39
|
container: learningRoot,
|
|
37
40
|
});
|
|
38
|
-
|
|
41
|
+
collectionConsent = createCollectionConsentGate({
|
|
42
|
+
actions: { ...controller, configure: macConsent.configure },
|
|
43
|
+
container: learningRoot, openComputerAccess,
|
|
44
|
+
});
|
|
45
|
+
const actions = { ...controller, configure: collectionConsent.configure,
|
|
46
|
+
restartCollection: collectionConsent.restartCollection };
|
|
39
47
|
home = createPassiveLearningHome({
|
|
40
48
|
actions,
|
|
41
49
|
openLearning,
|
|
@@ -54,14 +62,19 @@ export function createPassiveLearningFeature({
|
|
|
54
62
|
...actions,
|
|
55
63
|
setWorkspace(workspace) {
|
|
56
64
|
collectionConsent.cancel();
|
|
65
|
+
macConsent.cancel();
|
|
57
66
|
controller.setWorkspace(workspace);
|
|
58
67
|
},
|
|
59
68
|
handleRealtime(message) {
|
|
60
|
-
if (message?.type === "system-host.changed")
|
|
69
|
+
if (message?.type === "system-host.changed") {
|
|
70
|
+
collectionConsent.cancel();
|
|
71
|
+
macConsent.cancel();
|
|
72
|
+
}
|
|
61
73
|
controller.handleRealtime(message);
|
|
62
74
|
},
|
|
63
75
|
environmentChanged() {
|
|
64
76
|
collectionConsent.cancel();
|
|
77
|
+
macConsent.cancel();
|
|
65
78
|
controller.environmentChanged();
|
|
66
79
|
},
|
|
67
80
|
mountHome: (root) => {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { createWorkspaceConversationOpener } from "./controllers/workspace-conversation-opener.js";
|
|
1
2
|
import { createSchedulesController } from "./controllers/schedules-controller.js";
|
|
2
3
|
import { createSchedulesWorkspace } from "./components/schedules/workspace.js";
|
|
3
4
|
|
|
4
5
|
export function createSchedulesFeature({
|
|
5
6
|
dom,
|
|
7
|
+
state = {},
|
|
6
8
|
client,
|
|
7
9
|
shell,
|
|
8
10
|
selectedEnvironmentId,
|
|
@@ -13,6 +15,7 @@ export function createSchedulesFeature({
|
|
|
13
15
|
documentRoot = globalThis.document,
|
|
14
16
|
isRuntimeReady = () => true,
|
|
15
17
|
}) {
|
|
18
|
+
const openConversation = createWorkspaceConversationOpener({ state, shell, openSession });
|
|
16
19
|
let view;
|
|
17
20
|
let active = false;
|
|
18
21
|
let navigationRevision = 0;
|
|
@@ -29,10 +32,8 @@ export function createSchedulesFeature({
|
|
|
29
32
|
onNavigationChange();
|
|
30
33
|
},
|
|
31
34
|
openConversation: async (sessionId, requestId) => {
|
|
32
|
-
if (!shell.activateWorkspace("chat")) return;
|
|
33
|
-
if (!sessionId) return;
|
|
34
35
|
try {
|
|
35
|
-
await
|
|
36
|
+
if (!await openConversation(sessionId, { page: { targetRequestId: requestId } })) return;
|
|
36
37
|
if (!requestId) return;
|
|
37
38
|
requestAnimationFrame(() => {
|
|
38
39
|
const messages = [
|
|
@@ -78,6 +79,7 @@ export function createSchedulesFeature({
|
|
|
78
79
|
return client.supportsSchedules();
|
|
79
80
|
},
|
|
80
81
|
prepareLeave: view.prepareLeave,
|
|
82
|
+
prepareEnvironmentChange: view.prepareEnvironmentChange,
|
|
81
83
|
navigationRevision: () => navigationRevision,
|
|
82
84
|
selectedJobId: () => controller.snapshot().selectedId,
|
|
83
85
|
setActive(value) {
|
|
@@ -6,25 +6,33 @@ type SessionSidebarPreferences = {
|
|
|
6
6
|
archivedSessionIds: string[];
|
|
7
7
|
orderedSessionIds: string[];
|
|
8
8
|
};
|
|
9
|
+
type PreferenceStorage = {
|
|
10
|
+
getItem(key: string): string | null;
|
|
11
|
+
setItem(key: string, value: string): void | Promise<unknown>;
|
|
12
|
+
removeItem(key: string): void | Promise<unknown>;
|
|
13
|
+
subscribe?(listener: () => void): () => void;
|
|
14
|
+
flush?(): Promise<void>;
|
|
15
|
+
snapshot?(): { preferences: Record<string, string> } | null;
|
|
16
|
+
};
|
|
9
17
|
|
|
10
|
-
export declare function createClientPreferences(storage:
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
export declare function createClientPreferences(storage: PreferenceStorage): {
|
|
19
|
+
subscribe(listener: () => void): (() => void) | undefined;
|
|
20
|
+
flush(): Promise<void> | undefined;
|
|
13
21
|
loadSessionSidebar(environmentId: string): SessionSidebarPreferences;
|
|
14
|
-
saveSessionSidebar(environmentId: string, value: SessionSidebarPreferences): void
|
|
22
|
+
saveSessionSidebar(environmentId: string, value: SessionSidebarPreferences): void | Promise<unknown>;
|
|
15
23
|
loadPinnedSessions(): string[];
|
|
16
|
-
savePinnedSessions(sessionIds: readonly string[]): void
|
|
24
|
+
savePinnedSessions(sessionIds: readonly string[]): void | Promise<unknown>;
|
|
17
25
|
loadSessionModes(normalize: (value: unknown) => ToolPermissionMode): SessionModeMap;
|
|
18
|
-
saveSessionModes(modes: SessionModeMap): void
|
|
26
|
+
saveSessionModes(modes: SessionModeMap): void | Promise<unknown>;
|
|
19
27
|
loadLastToolPermissionMode(normalize: (value: unknown) => ToolPermissionMode): ToolPermissionMode;
|
|
20
|
-
saveLastToolPermissionMode(mode: ToolPermissionMode): void
|
|
28
|
+
saveLastToolPermissionMode(mode: ToolPermissionMode): void | Promise<unknown>;
|
|
21
29
|
loadModelPreferences(): {
|
|
22
30
|
sessionModels: PreferenceMap;
|
|
23
31
|
lastModelByEnvironment: PreferenceMap;
|
|
24
32
|
};
|
|
25
|
-
saveModelPreferences(sessionModels: PreferenceMap, lastModelByEnvironment: PreferenceMap):
|
|
33
|
+
saveModelPreferences(sessionModels: PreferenceMap, lastModelByEnvironment: PreferenceMap): Promise<unknown[]>;
|
|
26
34
|
environmentId(): string;
|
|
27
|
-
saveEnvironmentId(environmentId: string): void
|
|
35
|
+
saveEnvironmentId(environmentId: string): void | Promise<unknown>;
|
|
28
36
|
sessionIdForEnvironment(environmentId: string): string;
|
|
29
|
-
saveSessionIdForEnvironment(environmentId: string, sessionId: string): void
|
|
37
|
+
saveSessionIdForEnvironment(environmentId: string, sessionId: string): void | Promise<unknown>;
|
|
30
38
|
};
|
|
@@ -15,10 +15,10 @@ function parseObject(storage, key) {
|
|
|
15
15
|
const raw = storage.getItem(key);
|
|
16
16
|
const value = raw ? JSON.parse(raw) : {};
|
|
17
17
|
return value && typeof value === "object" && !Array.isArray(value)
|
|
18
|
-
? value
|
|
19
|
-
:
|
|
18
|
+
? Object.assign(Object.create(null), value)
|
|
19
|
+
: Object.create(null);
|
|
20
20
|
} catch {
|
|
21
|
-
return
|
|
21
|
+
return Object.create(null);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -36,10 +36,15 @@ function restoreSessionMode(value, normalizeToolPermissionMode) {
|
|
|
36
36
|
|
|
37
37
|
export function createClientPreferences(storage) {
|
|
38
38
|
return {
|
|
39
|
+
subscribe: (listener) => storage.subscribe?.(listener),
|
|
40
|
+
flush: () => storage.flush?.(),
|
|
39
41
|
...createSessionSidebarPreferences(storage),
|
|
40
42
|
loadPinnedSessions() {
|
|
41
43
|
try {
|
|
42
|
-
const
|
|
44
|
+
const acknowledged = storage.snapshot?.();
|
|
45
|
+
const raw = acknowledged
|
|
46
|
+
? acknowledged.preferences[storageKeys.pinnedSessions]
|
|
47
|
+
: storage.getItem(storageKeys.pinnedSessions);
|
|
43
48
|
const value = raw ? JSON.parse(raw) : [];
|
|
44
49
|
return Array.isArray(value)
|
|
45
50
|
? value.map((id) => String(id || "")).filter(Boolean)
|
|
@@ -50,7 +55,7 @@ export function createClientPreferences(storage) {
|
|
|
50
55
|
},
|
|
51
56
|
|
|
52
57
|
savePinnedSessions(sessionIds) {
|
|
53
|
-
storage.setItem(storageKeys.pinnedSessions, JSON.stringify(sessionIds));
|
|
58
|
+
return storage.setItem(storageKeys.pinnedSessions, JSON.stringify(sessionIds));
|
|
54
59
|
},
|
|
55
60
|
|
|
56
61
|
loadSessionModes(normalizeToolPermissionMode) {
|
|
@@ -61,24 +66,25 @@ export function createClientPreferences(storage) {
|
|
|
61
66
|
return restored ? [[sessionId, restored]] : [];
|
|
62
67
|
},
|
|
63
68
|
));
|
|
64
|
-
|
|
65
|
-
return modes;
|
|
69
|
+
return Object.assign(Object.create(null), modes);
|
|
66
70
|
},
|
|
67
71
|
|
|
68
72
|
saveSessionModes(modes) {
|
|
69
|
-
storage.setItem(storageKeys.sessionModes, JSON.stringify(modes));
|
|
73
|
+
return storage.setItem(storageKeys.sessionModes, JSON.stringify(modes));
|
|
70
74
|
},
|
|
71
75
|
|
|
72
76
|
loadLastToolPermissionMode(normalizeToolPermissionMode) {
|
|
73
77
|
try {
|
|
74
|
-
|
|
78
|
+
const mode = storage.getItem(storageKeys.lastToolPermissionMode);
|
|
79
|
+
if (!["ask", "full_access", "full_plus"].includes(mode)) return "ask";
|
|
80
|
+
return normalizeToolPermissionMode(mode);
|
|
75
81
|
} catch {
|
|
76
|
-
return "
|
|
82
|
+
return "ask";
|
|
77
83
|
}
|
|
78
84
|
},
|
|
79
85
|
|
|
80
86
|
saveLastToolPermissionMode(mode) {
|
|
81
|
-
storage.setItem(storageKeys.lastToolPermissionMode, mode);
|
|
87
|
+
return storage.setItem(storageKeys.lastToolPermissionMode, mode);
|
|
82
88
|
},
|
|
83
89
|
|
|
84
90
|
loadModelPreferences() {
|
|
@@ -92,11 +98,14 @@ export function createClientPreferences(storage) {
|
|
|
92
98
|
},
|
|
93
99
|
|
|
94
100
|
saveModelPreferences(sessionModels, lastModelByEnvironment) {
|
|
95
|
-
storage.setItem(storageKeys.sessionModels, JSON.stringify(sessionModels));
|
|
96
|
-
storage.setItem(
|
|
101
|
+
const sessions = storage.setItem(storageKeys.sessionModels, JSON.stringify(sessionModels));
|
|
102
|
+
const environments = storage.setItem(
|
|
97
103
|
storageKeys.lastModelByEnvironment,
|
|
98
104
|
JSON.stringify(lastModelByEnvironment),
|
|
99
105
|
);
|
|
106
|
+
const saved = Promise.all([sessions, environments]);
|
|
107
|
+
void saved.catch(() => {});
|
|
108
|
+
return saved;
|
|
100
109
|
},
|
|
101
110
|
|
|
102
111
|
environmentId() {
|
|
@@ -105,8 +114,8 @@ export function createClientPreferences(storage) {
|
|
|
105
114
|
|
|
106
115
|
saveEnvironmentId(environmentId) {
|
|
107
116
|
if (environmentId)
|
|
108
|
-
storage.setItem(storageKeys.environmentId, environmentId);
|
|
109
|
-
|
|
117
|
+
return storage.setItem(storageKeys.environmentId, environmentId);
|
|
118
|
+
return storage.removeItem(storageKeys.environmentId);
|
|
110
119
|
},
|
|
111
120
|
|
|
112
121
|
sessionIdForEnvironment(environmentId) {
|
|
@@ -124,7 +133,7 @@ export function createClientPreferences(storage) {
|
|
|
124
133
|
);
|
|
125
134
|
if (sessionId) sessions[environmentId] = sessionId;
|
|
126
135
|
else delete sessions[environmentId];
|
|
127
|
-
storage.setItem(
|
|
136
|
+
return storage.setItem(
|
|
128
137
|
storageKeys.currentSessionByEnvironment,
|
|
129
138
|
JSON.stringify(sessions),
|
|
130
139
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Bounded review receipts only. Memory content is owned by the memory service. */
|
|
2
2
|
export function createHomeGuidancePreferences(storage) {
|
|
3
3
|
const key = (environment) => `abot-web.homeGuidance.${encodeURIComponent(environment)}`;
|
|
4
4
|
const volatile = new Map();
|
|
@@ -9,35 +9,35 @@ export function createHomeGuidancePreferences(storage) {
|
|
|
9
9
|
if (value && typeof value === "object" && !Array.isArray(value)) return {
|
|
10
10
|
offeredOn: typeof value.offeredOn === "string" ? value.offeredOn : "",
|
|
11
11
|
dismissed: Array.isArray(value.dismissed) ? value.dismissed.filter((id) => typeof id === "string").slice(-8) : [],
|
|
12
|
-
reviewed: Array.isArray(value.reviewed) ? value.reviewed.filter((
|
|
12
|
+
reviewed: Array.isArray(value.reviewed) ? value.reviewed.filter((item) => typeof item?.id === "string" && typeof item.updatedAt === "string").slice(-200) : [],
|
|
13
13
|
};
|
|
14
|
-
} catch { /*
|
|
14
|
+
} catch { /* A malformed projection does not count as a review receipt. */ }
|
|
15
15
|
return volatile.get(environment) || {};
|
|
16
16
|
}
|
|
17
17
|
function save(environment, patch) {
|
|
18
18
|
const value = { ...read(environment), ...patch };
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
storage.setItem(key(environment), JSON.stringify(value));
|
|
22
|
-
volatile.delete(environment);
|
|
23
|
-
} catch { volatile.set(environment, value); }
|
|
19
|
+
if (!storage) { volatile.set(environment, value); return; }
|
|
20
|
+
return storage.setItem(key(environment), JSON.stringify(value));
|
|
24
21
|
}
|
|
25
22
|
return {
|
|
26
23
|
dismissed: (environment) => read(environment).dismissed || [],
|
|
27
24
|
dismiss(environment, id) {
|
|
28
25
|
const dismissed = new Set(read(environment).dismissed || []);
|
|
29
26
|
dismissed.add(id);
|
|
30
|
-
save(environment, { dismissed: [...dismissed].slice(-8) });
|
|
27
|
+
return save(environment, { dismissed: [...dismissed].slice(-8) });
|
|
31
28
|
},
|
|
32
29
|
wasOffered: (environment, day) => read(environment).offeredOn === day,
|
|
33
30
|
markOffered: (environment, day) => save(environment, { offeredOn: day }),
|
|
34
31
|
hasReviewed(environment, record) {
|
|
35
|
-
return (read(environment).reviewed || []).
|
|
32
|
+
return (read(environment).reviewed || []).some((item) => item.id === record.id && item.updatedAt === record.updatedAt);
|
|
36
33
|
},
|
|
37
34
|
markReviewed(environment, record) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
const reviewed = (read(environment).reviewed || []).filter((item) => item.id !== record.id);
|
|
36
|
+
return save(environment, { reviewed: [...reviewed, { id: record.id, updatedAt: record.updatedAt }].slice(-200) });
|
|
37
|
+
},
|
|
38
|
+
forgetReviewed(environment, id) {
|
|
39
|
+
const reviewed = (read(environment).reviewed || []).filter((item) => item.id !== id);
|
|
40
|
+
return save(environment, { reviewed });
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Save only the selected profile flag through the revision-checked config service. */
|
|
2
|
+
export async function enableModelReasoning(client, profileId, environmentId) {
|
|
3
|
+
const payload = await client.loadConfigDashboard(environmentId, { settled: true });
|
|
4
|
+
const file = payload?.dashboard?.files?.models?.find((item) => item.id === profileId && item.registered === true);
|
|
5
|
+
if (!file || file.invalidJson || !file.revision)
|
|
6
|
+
throw new Error("This model cannot be updated here. Open Models to review its configuration.");
|
|
7
|
+
if (file.config?.supportsThinking === true) return;
|
|
8
|
+
await client.saveConfigFile({
|
|
9
|
+
environmentId, kind: "model", id: profileId,
|
|
10
|
+
config: { ...file.config, supportsThinking: true }, expectedRevision: file.revision,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -47,8 +47,16 @@ export function createAutomationRequests({ requestApi, getEnvironmentId, getConf
|
|
|
47
47
|
requestAutomation(path(`/${encodeURIComponent(automationId)}/permission`, environmentId), {
|
|
48
48
|
method: "PUT", body: JSON.stringify(permission),
|
|
49
49
|
}),
|
|
50
|
-
getAutomationCatalog
|
|
51
|
-
|
|
50
|
+
async getAutomationCatalog(automationId, environmentId = getEnvironmentId()) {
|
|
51
|
+
const [catalog, modelCatalog] = await Promise.all([
|
|
52
|
+
requestAutomation(`${path("/catalog", environmentId)}&automation=${encodeURIComponent(automationId)}`),
|
|
53
|
+
requestAutomation(`/chat/models?environment=${encodeURIComponent(environmentId)}`),
|
|
54
|
+
]);
|
|
55
|
+
return { ...catalog, models: (catalog.models || []).map((model) => ({
|
|
56
|
+
...model,
|
|
57
|
+
supportsThinking: modelCatalog.profiles?.find((profile) => profile.id === model.id)?.supportsThinking === true,
|
|
58
|
+
})) };
|
|
59
|
+
},
|
|
52
60
|
startAutomationRun: (automationId, idempotencyKey, environmentId) =>
|
|
53
61
|
post(path(`/${encodeURIComponent(automationId)}/run`, environmentId), { idempotencyKey }),
|
|
54
62
|
listAutomationRuns: (automationId, environmentId) =>
|
|
@@ -2,6 +2,7 @@ export function createLongTermMemoryRequests({
|
|
|
2
2
|
requestApi,
|
|
3
3
|
getEnvironmentId,
|
|
4
4
|
environmentQuery,
|
|
5
|
+
onMemoryDeleted = async () => {},
|
|
5
6
|
}) {
|
|
6
7
|
return Object.freeze({
|
|
7
8
|
loadLongTermMemoryStatus(environmentId = getEnvironmentId()) {
|
|
@@ -102,13 +103,17 @@ export function createLongTermMemoryRequests({
|
|
|
102
103
|
});
|
|
103
104
|
},
|
|
104
105
|
|
|
105
|
-
deleteLongTermMemory({ environmentId = getEnvironmentId(), id }) {
|
|
106
|
-
|
|
106
|
+
async deleteLongTermMemory({ environmentId = getEnvironmentId(), id }) {
|
|
107
|
+
const result = await requestApi(
|
|
107
108
|
`/runtime/memory/records/${encodeURIComponent(
|
|
108
109
|
id,
|
|
109
110
|
)}?environment=${environmentQuery(environmentId)}`,
|
|
110
111
|
{ method: "DELETE" },
|
|
111
112
|
);
|
|
113
|
+
if (result?.deleted !== true) return result;
|
|
114
|
+
try { await onMemoryDeleted(environmentId, id); }
|
|
115
|
+
catch { /* Receipt storage reports its failure separately; DELETE already succeeded. */ }
|
|
116
|
+
return result;
|
|
112
117
|
},
|
|
113
118
|
});
|
|
114
119
|
}
|
|
@@ -14,6 +14,8 @@ export function createSystemHostRequests({ requestApi, getConfig, getEnvironment
|
|
|
14
14
|
return {
|
|
15
15
|
supportsSystemHostConnection,
|
|
16
16
|
getSystemHostConnection: () => requestSystemHost(`?environment=${encodeURIComponent(getEnvironmentId())}`),
|
|
17
|
+
acceptSystemHostCollectionConsent: () =>
|
|
18
|
+
requestSystemHost("/collection-consent", { method: "POST", body: JSON.stringify({ acknowledged: true }) }),
|
|
17
19
|
requestSystemHostPermissions: (input) =>
|
|
18
20
|
requestSystemHost("/permissions", { method: "POST", body: JSON.stringify(input) }),
|
|
19
21
|
connectLocalSystemHost: () =>
|
|
@@ -84,6 +84,7 @@ export declare function createRuntimeWebClient(options: {
|
|
|
84
84
|
getEnvironmentId: () => string;
|
|
85
85
|
fetchImpl?: typeof fetch;
|
|
86
86
|
origin?: string;
|
|
87
|
+
onMemoryDeleted?: (environmentId: string, id: string) => Promise<unknown> | void;
|
|
87
88
|
}): {
|
|
88
89
|
supportsSparkChat: SparkChatRequests["supportsSparkChat"];
|
|
89
90
|
loadSparkChat: SparkChatRequests["loadSparkChat"];
|
|
@@ -99,6 +100,7 @@ export declare function createRuntimeWebClient(options: {
|
|
|
99
100
|
decideToolApproval: ToolApprovalRequests["decideToolApproval"];
|
|
100
101
|
supportsSystemHostConnection(): boolean;
|
|
101
102
|
getSystemHostConnection(): Promise<Record<string, unknown>>;
|
|
103
|
+
acceptSystemHostCollectionConsent(): Promise<Record<string, unknown>>;
|
|
102
104
|
requestSystemHostPermissions(input: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
103
105
|
connectLocalSystemHost(): Promise<Record<string, unknown>>;
|
|
104
106
|
requestSystemHostStoreConnection(): Promise<Record<string, unknown>>;
|
|
@@ -36,6 +36,7 @@ export function createRuntimeWebClient({
|
|
|
36
36
|
getEnvironmentId,
|
|
37
37
|
fetchImpl = fetch,
|
|
38
38
|
origin = window.location.origin,
|
|
39
|
+
onMemoryDeleted,
|
|
39
40
|
}) {
|
|
40
41
|
const environmentQuery = (environmentId = getEnvironmentId()) =>
|
|
41
42
|
encodeURIComponent(environmentId);
|
|
@@ -98,6 +99,7 @@ export function createRuntimeWebClient({
|
|
|
98
99
|
requestApi,
|
|
99
100
|
getEnvironmentId,
|
|
100
101
|
environmentQuery,
|
|
102
|
+
onMemoryDeleted,
|
|
101
103
|
});
|
|
102
104
|
|
|
103
105
|
return {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createSessionComposerQueue } from "../lib/session-composer-queue.js";
|
|
2
|
+
|
|
3
|
+
/** Reads use the latest server projection. Mutations are serialized by the server. */
|
|
4
|
+
export function createServerComposerQueue(storage) {
|
|
5
|
+
const ownerId = createWindowIdentity();
|
|
6
|
+
const view = () => createSessionComposerQueue({ storage: {
|
|
7
|
+
getItem: () => storage.snapshot()?.queue || null,
|
|
8
|
+
setItem() { throw new Error("Queue writes require server acknowledgement."); },
|
|
9
|
+
} });
|
|
10
|
+
const change = (scope, action, input = {}) =>
|
|
11
|
+
storage.execute({ kind: "queue", scope, action, ownerId, ...input });
|
|
12
|
+
return {
|
|
13
|
+
list: (scope) => view().list(scope),
|
|
14
|
+
peek: (scope) => view().peek(scope),
|
|
15
|
+
getBlockedRelease: (scope) => view().getBlockedRelease(scope),
|
|
16
|
+
claimBlockedRelease: (scope, releaseToken, options = {}) => change(scope, "claim", { releaseToken, takeover: options.takeover === true }),
|
|
17
|
+
beginBlockedSend: (scope, releaseToken) => change(scope, "begin", { releaseToken }),
|
|
18
|
+
markBlockedUncertain: (scope, releaseToken) => change(scope, "uncertain", { releaseToken }),
|
|
19
|
+
enqueue: (scope, item) => change(scope, "enqueue", { item }),
|
|
20
|
+
releaseForTerminal: (scope, requestId) => change(scope, "release", { requestId }),
|
|
21
|
+
bindReleasedSuccess: (scope, releaseToken, requestId) => change(scope, "bind", { releaseToken, requestId }),
|
|
22
|
+
rebindBlocked: (scope, requestId) => change(scope, "rebind", { requestId }),
|
|
23
|
+
updateBlockedRelease: (scope, releaseToken, item) => change(scope, "update", { releaseToken, item }),
|
|
24
|
+
refresh: () => storage.refresh(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function createWindowIdentity() {
|
|
29
|
+
if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();
|
|
30
|
+
// getRandomValues is also available on HTTP LAN origins, unlike randomUUID.
|
|
31
|
+
return [...globalThis.crypto.getRandomValues(new Uint32Array(4))].join("-");
|
|
32
|
+
}
|