@happyvertical/smrt-svelte 0.53.1 → 0.53.3
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/package.json +15 -15
- package/dist/__tests__/app-state.test.js +0 -156
- package/dist/__tests__/data-surface-bridge.test.js +0 -351
- package/dist/__tests__/provider-mode-harness.svelte +0 -14
- package/dist/__tests__/provider-mode-harness.svelte.d.ts +0 -11
- package/dist/__tests__/provider-mode-harness.svelte.d.ts.map +0 -1
- package/dist/__tests__/provider-mode-probe.svelte +0 -13
- package/dist/__tests__/provider-mode-probe.svelte.d.ts +0 -8
- package/dist/__tests__/provider-mode-probe.svelte.d.ts.map +0 -1
- package/dist/__tests__/provider-webmcp-harness.svelte +0 -14
- package/dist/__tests__/provider-webmcp-harness.svelte.d.ts +0 -8
- package/dist/__tests__/provider-webmcp-harness.svelte.d.ts.map +0 -1
- package/dist/__tests__/success-never-text.test.js +0 -100
- package/dist/__tests__/warm-clients.test.js +0 -186
- package/dist/browser-ai/adapters/llm/bitgpu-inference-backend.test.js +0 -464
- package/dist/browser-ai/adapters/llm/webllm-inference-backend.test.js +0 -646
- package/dist/browser-ai/adapters/stt/browser-speech.test.js +0 -113
- package/dist/browser-ai/adapters/stt/dictation-source.test.js +0 -52
- package/dist/browser-ai/svelte/components/__tests__/ModelStatusControl.test.js +0 -172
- package/dist/components/board/__tests__/Board.test.js +0 -498
- package/dist/components/board/__tests__/BoardSsrHarness.svelte +0 -30
- package/dist/components/board/__tests__/BoardSsrHarness.svelte.d.ts +0 -19
- package/dist/components/board/__tests__/BoardSsrHarness.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/AddressInput.behavior.test.js +0 -216
- package/dist/components/forms/__tests__/CheckboxInput.test.js +0 -92
- package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +0 -135
- package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +0 -113
- package/dist/components/forms/__tests__/FileUpload.error-alert.test.js +0 -37
- package/dist/components/forms/__tests__/FileUpload.native-form.test.js +0 -249
- package/dist/components/forms/__tests__/FileUpload.test.js +0 -90
- package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte +0 -24
- package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte.d.ts +0 -10
- package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/Form.behavior.test.js +0 -137
- package/dist/components/forms/__tests__/Form.extraction.test.js +0 -68
- package/dist/components/forms/__tests__/Form.stt-error.test.js +0 -57
- package/dist/components/forms/__tests__/Form.test.js +0 -86
- package/dist/components/forms/__tests__/Form.ui-controls.test.js +0 -119
- package/dist/components/forms/__tests__/Form.webmcp.test.js +0 -2336
- package/dist/components/forms/__tests__/FormMicButton.test.js +0 -92
- package/dist/components/forms/__tests__/FormScope.test.js +0 -39
- package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +0 -129
- package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +0 -124
- package/dist/components/forms/__tests__/NumberInput.behavior.test.js +0 -151
- package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +0 -96
- package/dist/components/forms/__tests__/SearchInput.test.js +0 -79
- package/dist/components/forms/__tests__/SelectInput.behavior.test.js +0 -132
- package/dist/components/forms/__tests__/TextInput.behavior.test.js +0 -131
- package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +0 -96
- package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte +0 -30
- package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte.d.ts +0 -7
- package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/async-validation-form.fixture.svelte +0 -19
- package/dist/components/forms/__tests__/async-validation-form.fixture.svelte.d.ts +0 -9
- package/dist/components/forms/__tests__/async-validation-form.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte +0 -21
- package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte.d.ts +0 -8
- package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +0 -69
- package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte +0 -27
- package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte.d.ts +0 -9
- package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte +0 -48
- package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte.d.ts +0 -10
- package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte +0 -26
- package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte.d.ts +0 -13
- package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte +0 -52
- package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte.d.ts +0 -16
- package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-scope.fixture.svelte +0 -30
- package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts +0 -10
- package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +0 -158
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +0 -51
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte +0 -24
- package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte.d.ts +0 -11
- package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte +0 -105
- package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte.d.ts +0 -42
- package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte +0 -84
- package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts +0 -14
- package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte +0 -44
- package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte.d.ts +0 -9
- package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/mic-keyboard-a11y.test.js +0 -74
- package/dist/components/forms/__tests__/policy-field.fixture.svelte +0 -35
- package/dist/components/forms/__tests__/policy-field.fixture.svelte.d.ts +0 -8
- package/dist/components/forms/__tests__/policy-field.fixture.svelte.d.ts.map +0 -1
- package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +0 -87
- package/dist/components/settings/__tests__/SettingsCatalog.test.js +0 -69
- package/dist/components/settings/__tests__/catalog.test.js +0 -46
- package/dist/components/workspace/__tests__/AdminShell.responsive.test.js +0 -597
- package/dist/components/workspace/__tests__/AdminShell.test.js +0 -572
- package/dist/components/workspace/__tests__/RoleShell.test.js +0 -772
- package/dist/components/workspace/__tests__/TenantNav.test.js +0 -208
- package/dist/components/workspace/__tests__/WorkspaceAccountMenu.test.js +0 -79
- package/dist/components/workspace/__tests__/WorkspaceShell.test.js +0 -630
- package/dist/components/workspace/__tests__/admin-shell-header-overflow.test.js +0 -25
- package/dist/components/workspace/__tests__/admin-shell-hotkeys.test.js +0 -34
- package/dist/components/workspace/__tests__/admin-shell-mobile.test.js +0 -217
- package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte +0 -52
- package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte.d.ts +0 -23
- package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/admin-shell-page-contracts.test.js +0 -30
- package/dist/components/workspace/__tests__/admin-shell-responsive-state.test.js +0 -184
- package/dist/components/workspace/__tests__/admin-shell-settings.test.js +0 -25
- package/dist/components/workspace/__tests__/admin-shell-state.test.js +0 -286
- package/dist/components/workspace/__tests__/admin-shell-theme-hooks.test.js +0 -36
- package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +0 -141
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +0 -45
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +0 -21
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/define-tools-dock.test.js +0 -1188
- package/dist/components/workspace/__tests__/harness.svelte +0 -25
- package/dist/components/workspace/__tests__/harness.svelte.d.ts +0 -14
- package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/index.test.js +0 -28
- package/dist/components/workspace/__tests__/legacy-index.test.js +0 -9
- package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +0 -24
- package/dist/components/workspace/__tests__/manifest-nav.test.js +0 -599
- package/dist/components/workspace/__tests__/nav-helpers.test.js +0 -95
- package/dist/components/workspace/__tests__/render-harness.svelte +0 -66
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +0 -32
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/render-tools-dock.test.js +0 -260
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +0 -58
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +0 -16
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +0 -41
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +0 -13
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/shell-chrome-components.test.js +0 -108
- package/dist/components/workspace/__tests__/system-feed.test.js +0 -327
- package/dist/components/workspace/__tests__/test-icon.svelte +0 -17
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +0 -19
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +0 -38
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +0 -22
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +0 -66
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +0 -115
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +0 -15
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +0 -7
- package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +0 -115
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte +0 -9
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +0 -19
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/use-harness.svelte +0 -23
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +0 -8
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/__tests__/use-tools-dock.test.js +0 -33
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +0 -43
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +0 -11
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +0 -1
- package/dist/components/workspace/server/__tests__/compose-availability.test.js +0 -383
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +0 -78
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +0 -1
- package/dist/components/workspace/server/__tests__/typed-context-fixture.js +0 -104
- package/dist/hooks/__tests__/stt-consumer.fixture.svelte +0 -25
- package/dist/hooks/__tests__/stt-consumer.fixture.svelte.d.ts +0 -15
- package/dist/hooks/__tests__/stt-consumer.fixture.svelte.d.ts.map +0 -1
- package/dist/hooks/__tests__/stt-ownership-harness.svelte +0 -42
- package/dist/hooks/__tests__/stt-ownership-harness.svelte.d.ts +0 -20
- package/dist/hooks/__tests__/stt-ownership-harness.svelte.d.ts.map +0 -1
- package/dist/hooks/__tests__/useSTT-ownership.test.js +0 -102
- package/dist/i18n/__tests__/server.spec.js +0 -57
- package/dist/internal/logger.test.js +0 -54
- package/dist/provider-mode.test.js +0 -86
- package/dist/provider-webmcp.test.js +0 -244
- package/dist/state/__tests__/app-state-ai-lifecycle.test.js +0 -240
- package/dist/state/__tests__/warm-clients.test.js +0 -40
- package/dist/web/__tests__/activity-feed-harness.svelte +0 -32
- package/dist/web/__tests__/activity-feed-harness.svelte.d.ts +0 -18
- package/dist/web/__tests__/activity-feed-harness.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/activity-feed.integration.svelte.test.js +0 -190
- package/dist/web/__tests__/activity-feed.svelte.test.js +0 -235
- package/dist/web/__tests__/assistant-dock.integration.svelte.test.js +0 -204
- package/dist/web/__tests__/data-surface-conformance.integration.svelte.test.js +0 -1392
- package/dist/web/__tests__/harness.svelte +0 -25
- package/dist/web/__tests__/harness.svelte.d.ts +0 -15
- package/dist/web/__tests__/harness.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/list-data-surface.fixture.svelte +0 -59
- package/dist/web/__tests__/list-data-surface.fixture.svelte.d.ts +0 -14
- package/dist/web/__tests__/list-data-surface.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/list-data-surface.svelte.test.js +0 -106
- package/dist/web/__tests__/list-data-surface.test.js +0 -651
- package/dist/web/__tests__/list-sort-surface.fixture.svelte +0 -41
- package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts +0 -15
- package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/list-sort-surface.svelte.test.js +0 -59
- package/dist/web/__tests__/live-collection.svelte.test.js +0 -185
- package/dist/web/__tests__/provider-ui-registry.fixture.svelte +0 -43
- package/dist/web/__tests__/provider-ui-registry.fixture.svelte.d.ts +0 -13
- package/dist/web/__tests__/provider-ui-registry.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/provider-ui-registry.test.js +0 -235
- package/dist/web/__tests__/remote-query-harness.svelte +0 -27
- package/dist/web/__tests__/remote-query-harness.svelte.d.ts +0 -11
- package/dist/web/__tests__/remote-query-harness.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/remote-query.svelte.test.js +0 -101
- package/dist/web/__tests__/surfaces.child.fixture.svelte +0 -69
- package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts +0 -16
- package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/surfaces.fixture.svelte +0 -26
- package/dist/web/__tests__/surfaces.fixture.svelte.d.ts +0 -18
- package/dist/web/__tests__/surfaces.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/surfaces.svelte.test.js +0 -140
- package/dist/web/__tests__/update-available-harness.svelte +0 -46
- package/dist/web/__tests__/update-available-harness.svelte.d.ts +0 -22
- package/dist/web/__tests__/update-available-harness.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/update-available.svelte.test.js +0 -137
- package/dist/web/__tests__/view-intent-provider.fixture.svelte +0 -28
- package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts +0 -13
- package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/view-intent.fixture.svelte +0 -33
- package/dist/web/__tests__/view-intent.fixture.svelte.d.ts +0 -15
- package/dist/web/__tests__/view-intent.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/view-intent.intents.d.ts +0 -14
- package/dist/web/__tests__/view-intent.intents.d.ts.map +0 -1
- package/dist/web/__tests__/view-intent.intents.js +0 -38
- package/dist/web/__tests__/view-intent.svelte.test.js +0 -244
- package/dist/web/__tests__/webmcp-composed.child.fixture.svelte +0 -73
- package/dist/web/__tests__/webmcp-composed.child.fixture.svelte.d.ts +0 -8
- package/dist/web/__tests__/webmcp-composed.child.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-composed.fixture.svelte +0 -52
- package/dist/web/__tests__/webmcp-composed.fixture.svelte.d.ts +0 -12
- package/dist/web/__tests__/webmcp-composed.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-composed.integration.svelte.test.js +0 -251
- package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte +0 -16
- package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts +0 -19
- package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte +0 -11
- package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts +0 -8
- package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte +0 -20
- package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts +0 -7
- package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-harness-unannotated.svelte +0 -14
- package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts +0 -19
- package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-harness.svelte +0 -18
- package/dist/web/__tests__/webmcp-harness.svelte.d.ts +0 -7
- package/dist/web/__tests__/webmcp-harness.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-ssr.fixture.svelte +0 -13
- package/dist/web/__tests__/webmcp-ssr.fixture.svelte.d.ts +0 -19
- package/dist/web/__tests__/webmcp-ssr.fixture.svelte.d.ts.map +0 -1
- package/dist/web/__tests__/webmcp-ui.test.js +0 -723
- package/dist/web/__tests__/webmcp.test.js +0 -234
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stt-ownership-harness.svelte.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/stt-ownership-harness.svelte.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,UAAU,KAAK;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAiCD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* R4 regression (T2 #1403): useSTT()/useTTS() attach onDestroy to the
|
|
3
|
-
* Provider-level *singleton* manager. Before the fix, unmounting ANY hook
|
|
4
|
-
* consumer that found the manager listening would call stopListening() —
|
|
5
|
-
* aborting a recording another consumer had started. The fix tracks per-hook
|
|
6
|
-
* ownership: a consumer only stops the singleton if it started the session.
|
|
7
|
-
*/
|
|
8
|
-
import { render } from '@testing-library/svelte';
|
|
9
|
-
import { tick } from 'svelte';
|
|
10
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
11
|
-
import Harness from './stt-ownership-harness.svelte';
|
|
12
|
-
/**
|
|
13
|
-
* Minimal fake manager exposing only what useSTT touches. `isListening`
|
|
14
|
-
* flips true once any consumer calls startListening().
|
|
15
|
-
*/
|
|
16
|
-
function makeFakeManager() {
|
|
17
|
-
const listening = { value: false };
|
|
18
|
-
const startListening = vi.fn(async () => {
|
|
19
|
-
listening.value = true;
|
|
20
|
-
});
|
|
21
|
-
const stopListening = vi.fn(async () => {
|
|
22
|
-
listening.value = false;
|
|
23
|
-
});
|
|
24
|
-
const manager = {
|
|
25
|
-
startListening,
|
|
26
|
-
stopListening,
|
|
27
|
-
initializeSTT: vi.fn(async () => ({})),
|
|
28
|
-
get state() {
|
|
29
|
-
return {
|
|
30
|
-
ai: {
|
|
31
|
-
stt: {
|
|
32
|
-
get isListening() {
|
|
33
|
-
return listening.value;
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
return { manager, startListening, stopListening, listening };
|
|
41
|
-
}
|
|
42
|
-
describe('useSTT per-hook ownership (R4)', () => {
|
|
43
|
-
it("unmounting a non-owning consumer does not stop another consumer's recording", async () => {
|
|
44
|
-
const { manager, startListening, stopListening } = makeFakeManager();
|
|
45
|
-
let sttA;
|
|
46
|
-
const { rerender, unmount } = render(Harness, {
|
|
47
|
-
props: {
|
|
48
|
-
manager,
|
|
49
|
-
showA: true,
|
|
50
|
-
showB: true,
|
|
51
|
-
onReadyA: (s) => {
|
|
52
|
-
sttA = s;
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
// Consumer A starts the shared listening session.
|
|
57
|
-
await sttA?.start();
|
|
58
|
-
await tick();
|
|
59
|
-
expect(startListening).toHaveBeenCalledTimes(1);
|
|
60
|
-
// Unmount consumer B (which never started). It must NOT stop A's session.
|
|
61
|
-
await rerender({ manager, showA: true, showB: false });
|
|
62
|
-
await tick();
|
|
63
|
-
expect(stopListening).not.toHaveBeenCalled();
|
|
64
|
-
// Now unmount everything: the owning consumer A stops its own session.
|
|
65
|
-
unmount();
|
|
66
|
-
await tick();
|
|
67
|
-
expect(stopListening).toHaveBeenCalledTimes(1);
|
|
68
|
-
});
|
|
69
|
-
it('an owning consumer stops the session it started on unmount', async () => {
|
|
70
|
-
const { manager, startListening, stopListening } = makeFakeManager();
|
|
71
|
-
let sttA;
|
|
72
|
-
const { unmount } = render(Harness, {
|
|
73
|
-
props: {
|
|
74
|
-
manager,
|
|
75
|
-
showA: true,
|
|
76
|
-
showB: false,
|
|
77
|
-
onReadyA: (s) => {
|
|
78
|
-
sttA = s;
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
await sttA?.start();
|
|
83
|
-
await tick();
|
|
84
|
-
expect(startListening).toHaveBeenCalledTimes(1);
|
|
85
|
-
unmount();
|
|
86
|
-
await tick();
|
|
87
|
-
expect(stopListening).toHaveBeenCalledTimes(1);
|
|
88
|
-
});
|
|
89
|
-
it('a consumer that never started does not stop a session on unmount', async () => {
|
|
90
|
-
const { manager, stopListening, listening } = makeFakeManager();
|
|
91
|
-
// Simulate the singleton already listening (started elsewhere).
|
|
92
|
-
listening.value = true;
|
|
93
|
-
const { unmount } = render(Harness, {
|
|
94
|
-
props: { manager, showA: true, showB: false },
|
|
95
|
-
});
|
|
96
|
-
await tick();
|
|
97
|
-
// Consumer A never called start(); unmounting must leave the session alone.
|
|
98
|
-
unmount();
|
|
99
|
-
await tick();
|
|
100
|
-
expect(stopListening).not.toHaveBeenCalled();
|
|
101
|
-
});
|
|
102
|
-
});
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration coverage for the server snapshot builder (S13 #1418): it seeds the
|
|
3
|
-
* languages registry from smrt-svelte's English defaults and resolves them into
|
|
4
|
-
* a template dictionary the client renders synchronously. Exercises the real
|
|
5
|
-
* `@happyvertical/smrt-languages` resolver (no DB → code-default layer only).
|
|
6
|
-
*
|
|
7
|
-
* `server.ts` imports the languages package root, whose `__smrt-register__`
|
|
8
|
-
* manifest side-effect throws under vitest's source-alias (it resolves
|
|
9
|
-
* `manifest.json` via the dev-server URL, not a file). That manifest is the
|
|
10
|
-
* ObjectRegistry's, unrelated to string resolution (which uses the separate
|
|
11
|
-
* LanguageRegistry), so we record-not-throw via SMRT_STRICT_REGISTRY=false set
|
|
12
|
-
* before a dynamic import of the module under test.
|
|
13
|
-
*/
|
|
14
|
-
import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest';
|
|
15
|
-
let buildI18nSnapshot;
|
|
16
|
-
let defineMessages;
|
|
17
|
-
let clearRegisteredMessages;
|
|
18
|
-
beforeAll(async () => {
|
|
19
|
-
vi.stubEnv('SMRT_STRICT_REGISTRY', 'false');
|
|
20
|
-
({ buildI18nSnapshot } = await import('../server.js'));
|
|
21
|
-
({ defineMessages, clearRegisteredMessages } = await import('@happyvertical/smrt-ui/i18n'));
|
|
22
|
-
});
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
clearRegisteredMessages();
|
|
25
|
-
});
|
|
26
|
-
describe('buildI18nSnapshot', () => {
|
|
27
|
-
it('resolves registered English defaults into a template dictionary', async () => {
|
|
28
|
-
defineMessages({
|
|
29
|
-
'ui.snapshot_test.empty': 'No data available',
|
|
30
|
-
'ui.snapshot_test.range': 'Showing {count} of {total}',
|
|
31
|
-
});
|
|
32
|
-
const snapshot = await buildI18nSnapshot({ locale: 'en' });
|
|
33
|
-
expect(snapshot.locale).toBe('en');
|
|
34
|
-
expect(snapshot.messages['ui.snapshot_test.empty']).toBe('No data available');
|
|
35
|
-
// Templates are shipped un-rendered; the client interpolates at call time.
|
|
36
|
-
expect(snapshot.messages['ui.snapshot_test.range']).toBe('Showing {count} of {total}');
|
|
37
|
-
});
|
|
38
|
-
it('honors an explicit key subset', async () => {
|
|
39
|
-
defineMessages({
|
|
40
|
-
'ui.snapshot_test.a': 'Alpha',
|
|
41
|
-
'ui.snapshot_test.b': 'Beta',
|
|
42
|
-
});
|
|
43
|
-
const snapshot = await buildI18nSnapshot({
|
|
44
|
-
locale: 'en',
|
|
45
|
-
keys: ['ui.snapshot_test.a'],
|
|
46
|
-
});
|
|
47
|
-
expect(snapshot.messages['ui.snapshot_test.a']).toBe('Alpha');
|
|
48
|
-
expect(snapshot.messages['ui.snapshot_test.b']).toBeUndefined();
|
|
49
|
-
});
|
|
50
|
-
it('includes Board defaults when only the server snapshot entrypoint is imported', async () => {
|
|
51
|
-
const snapshot = await buildI18nSnapshot({
|
|
52
|
-
locale: 'en',
|
|
53
|
-
keys: ['ui.board.move_failed'],
|
|
54
|
-
});
|
|
55
|
-
expect(snapshot.messages['ui.board.move_failed']).toBe('Could not move {card}. The board was restored.');
|
|
56
|
-
});
|
|
57
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression coverage for the "process is not defined" hydration killer.
|
|
3
|
-
*
|
|
4
|
-
* `internal/logger` is browser-reachable through Provider and the form
|
|
5
|
-
* components, and `@happyvertical/logger`'s `createLogger()` eagerly reads
|
|
6
|
-
* `process.env` (HAVE_LOGGER_LEVEL). Constructing the logger at module scope
|
|
7
|
-
* therefore threw during Vite dev pre-bundle evaluation in browsers and killed
|
|
8
|
-
* client-side hydration for every consuming app.
|
|
9
|
-
*
|
|
10
|
-
* vite-node's module runner itself needs `process.platform` to load inline
|
|
11
|
-
* modules, so the test cannot delete `process` outright the way a real browser
|
|
12
|
-
* lacks it. Stubbing it to an object without a usable `env` reproduces the
|
|
13
|
-
* same failure mode: the pre-fix module init still blows up at import time
|
|
14
|
-
* (`Object.keys(process.env)`), and the fixed guard must route to the plain
|
|
15
|
-
* console logger.
|
|
16
|
-
*/
|
|
17
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
18
|
-
describe('internal/logger', () => {
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
vi.resetModules();
|
|
21
|
-
});
|
|
22
|
-
afterEach(() => {
|
|
23
|
-
vi.unstubAllGlobals();
|
|
24
|
-
vi.restoreAllMocks();
|
|
25
|
-
});
|
|
26
|
-
it('imports and logs without a usable process.env (browser)', async () => {
|
|
27
|
-
vi.stubGlobal('process', {});
|
|
28
|
-
const { logger } = await import('./logger.js');
|
|
29
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
30
|
-
logger.warn('mic permission denied');
|
|
31
|
-
expect(warn).toHaveBeenCalledTimes(1);
|
|
32
|
-
expect(warn.mock.calls[0][0]).toContain('mic permission denied');
|
|
33
|
-
});
|
|
34
|
-
it('filters below the warn level in the browser fallback', async () => {
|
|
35
|
-
vi.stubGlobal('process', {});
|
|
36
|
-
const { logger } = await import('./logger.js');
|
|
37
|
-
const debug = vi.spyOn(console, 'debug').mockImplementation(() => { });
|
|
38
|
-
const info = vi.spyOn(console, 'info').mockImplementation(() => { });
|
|
39
|
-
const error = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
40
|
-
logger.debug('below threshold');
|
|
41
|
-
logger.info('below threshold');
|
|
42
|
-
logger.error('stt init failed');
|
|
43
|
-
expect(debug).not.toHaveBeenCalled();
|
|
44
|
-
expect(info).not.toHaveBeenCalled();
|
|
45
|
-
expect(error).toHaveBeenCalledTimes(1);
|
|
46
|
-
});
|
|
47
|
-
it('logs through the env-aware logger when process exists (node/SSR)', async () => {
|
|
48
|
-
const { logger } = await import('./logger.js');
|
|
49
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
50
|
-
logger.warn('stt init failed', { adapter: 'whisper-cpp' });
|
|
51
|
-
expect(warn).toHaveBeenCalledTimes(1);
|
|
52
|
-
expect(warn.mock.calls[0][0]).toContain('stt init failed');
|
|
53
|
-
});
|
|
54
|
-
});
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { render, screen, waitFor } from '@testing-library/svelte';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import Harness from './__tests__/provider-mode-harness.svelte';
|
|
4
|
-
import { createAppState, SmrtAppStateManager, } from './state/app-state.svelte.js';
|
|
5
|
-
let initializationModes;
|
|
6
|
-
let manager;
|
|
7
|
-
const capture = (state) => {
|
|
8
|
-
manager = state;
|
|
9
|
-
};
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
initializationModes = [];
|
|
12
|
-
vi.stubGlobal('SpeechRecognition', class {
|
|
13
|
-
});
|
|
14
|
-
const initialize = SmrtAppStateManager.prototype.initialize;
|
|
15
|
-
vi.spyOn(SmrtAppStateManager.prototype, 'initialize').mockImplementation(function () {
|
|
16
|
-
const result = initialize.call(this);
|
|
17
|
-
// Inspect the real initialization boundary before a later reactive effect
|
|
18
|
-
// can hide a transient auto-enabled mode.
|
|
19
|
-
initializationModes.push(this.state.mode);
|
|
20
|
-
return result;
|
|
21
|
-
});
|
|
22
|
-
vi.spyOn(SmrtAppStateManager.prototype, 'initializeSTT').mockResolvedValue({});
|
|
23
|
-
});
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
vi.restoreAllMocks();
|
|
26
|
-
vi.unstubAllGlobals();
|
|
27
|
-
});
|
|
28
|
-
describe('Provider voice opt-in', () => {
|
|
29
|
-
it('keeps defaults in standard mode even with speech capabilities', async () => {
|
|
30
|
-
render(Harness, { props: { capture } });
|
|
31
|
-
await waitFor(() => expect(manager.state.initialized).toBe(true));
|
|
32
|
-
expect(manager.state.capabilities?.stt.browserSpeechAPI).toBe(true);
|
|
33
|
-
expect(manager.state.mode).toBe('default');
|
|
34
|
-
expect(initializationModes).toEqual(['default']);
|
|
35
|
-
expect(manager.initializeSTT).not.toHaveBeenCalled();
|
|
36
|
-
});
|
|
37
|
-
it('honors explicit default before initialization despite auto-detection opt-in', async () => {
|
|
38
|
-
render(Harness, {
|
|
39
|
-
props: { capture, mode: 'default', autoEnableSmrt: true },
|
|
40
|
-
});
|
|
41
|
-
await waitFor(() => expect(manager.state.initialized).toBe(true));
|
|
42
|
-
expect(initializationModes).toEqual(['default']);
|
|
43
|
-
expect(manager.state.modeSource).toBe('explicit');
|
|
44
|
-
expect(manager.initializeSTT).not.toHaveBeenCalled();
|
|
45
|
-
});
|
|
46
|
-
it('preserves explicit smrt mode and reactive mode updates', async () => {
|
|
47
|
-
const view = render(Harness, { props: { capture, mode: 'smrt' } });
|
|
48
|
-
await waitFor(() => expect(manager.state.initialized).toBe(true));
|
|
49
|
-
expect(initializationModes).toEqual(['smrt']);
|
|
50
|
-
expect(manager.state.modeSource).toBe('explicit');
|
|
51
|
-
await view.rerender({ capture, mode: 'default' });
|
|
52
|
-
expect(screen.getByRole('status', { name: 'App mode' })).toHaveTextContent('default');
|
|
53
|
-
});
|
|
54
|
-
it('retains auto-detection behind the explicit flag', async () => {
|
|
55
|
-
render(Harness, { props: { capture, autoEnableSmrt: true } });
|
|
56
|
-
await waitFor(() => expect(manager.state.initialized).toBe(true));
|
|
57
|
-
expect(manager.state.mode).toBe('smrt');
|
|
58
|
-
expect(manager.state.modeSource).toBe('auto');
|
|
59
|
-
});
|
|
60
|
-
it('does not auto-enable when capabilities are unavailable', async () => {
|
|
61
|
-
vi.stubGlobal('SpeechRecognition', undefined);
|
|
62
|
-
const capability = await import('./browser-ai/capabilities/detector.js');
|
|
63
|
-
vi.spyOn(capability, 'canEnableSmrtMode').mockReturnValue(false);
|
|
64
|
-
render(Harness, { props: { capture, autoEnableSmrt: true } });
|
|
65
|
-
await waitFor(() => expect(manager.state.initialized).toBe(true));
|
|
66
|
-
expect(manager.state.mode).toBe('default');
|
|
67
|
-
});
|
|
68
|
-
it('standalone state also requires explicit opt-in and respects initial session preferences', async () => {
|
|
69
|
-
const standard = createAppState();
|
|
70
|
-
await standard.initialize();
|
|
71
|
-
expect(standard.state.mode).toBe('default');
|
|
72
|
-
const auto = createAppState({
|
|
73
|
-
session: { preferences: { autoEnableSmrt: true } },
|
|
74
|
-
});
|
|
75
|
-
await auto.initialize();
|
|
76
|
-
expect(auto.state.mode).toBe('smrt');
|
|
77
|
-
const explicit = createAppState({
|
|
78
|
-
initialMode: 'default',
|
|
79
|
-
session: { preferences: { autoEnableSmrt: true } },
|
|
80
|
-
});
|
|
81
|
-
await explicit.initialize();
|
|
82
|
-
expect(explicit.state.mode).toBe('default');
|
|
83
|
-
expect(explicit.state.modeSource).toBe('explicit');
|
|
84
|
-
await Promise.all([standard.dispose(), auto.dispose(), explicit.dispose()]);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { render, waitFor } from '@testing-library/svelte';
|
|
2
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { logger } from './internal/logger.js';
|
|
4
|
-
const { registerWebMcpTools } = vi.hoisted(() => ({
|
|
5
|
-
registerWebMcpTools: vi.fn(),
|
|
6
|
-
}));
|
|
7
|
-
vi.mock('@happyvertical/smrt-web', async (importOriginal) => {
|
|
8
|
-
const actual = await importOriginal();
|
|
9
|
-
return {
|
|
10
|
-
...actual,
|
|
11
|
-
registerWebMcpTools: (...args) => {
|
|
12
|
-
registerWebMcpTools(...args);
|
|
13
|
-
return actual.registerWebMcpTools(...args);
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
});
|
|
17
|
-
import Harness from './__tests__/provider-webmcp-harness.svelte';
|
|
18
|
-
describe('Provider WebMCP policy', () => {
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
registerWebMcpTools.mockClear();
|
|
21
|
-
document.modelContext = undefined;
|
|
22
|
-
});
|
|
23
|
-
it('passes the same exposure policy to the framework-agnostic registrar', async () => {
|
|
24
|
-
const filter = vi.fn(() => true);
|
|
25
|
-
const filterTool = vi.fn(() => true);
|
|
26
|
-
const resolveFetchers = vi.fn();
|
|
27
|
-
const resolveToolFetchers = vi.fn();
|
|
28
|
-
const definitions = [];
|
|
29
|
-
render(Harness, {
|
|
30
|
-
props: {
|
|
31
|
-
webmcp: {
|
|
32
|
-
definitions,
|
|
33
|
-
effects: ['read', 'write'],
|
|
34
|
-
namespace: 'workspace',
|
|
35
|
-
maxTools: 12,
|
|
36
|
-
basePath: '/api/v2',
|
|
37
|
-
scope: 'tenant-a',
|
|
38
|
-
filter,
|
|
39
|
-
filterTool,
|
|
40
|
-
resolveFetchers,
|
|
41
|
-
resolveToolFetchers,
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
await waitFor(() => expect(registerWebMcpTools).toHaveBeenCalledOnce());
|
|
46
|
-
expect(registerWebMcpTools).toHaveBeenCalledWith(definitions, {
|
|
47
|
-
client: undefined,
|
|
48
|
-
basePath: '/api/v2',
|
|
49
|
-
fetchFn: undefined,
|
|
50
|
-
scope: 'tenant-a',
|
|
51
|
-
filter,
|
|
52
|
-
filterTool,
|
|
53
|
-
resolveFetchers,
|
|
54
|
-
resolveToolFetchers,
|
|
55
|
-
effects: ['read', 'write'],
|
|
56
|
-
namespace: 'workspace',
|
|
57
|
-
maxTools: 12,
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
it('registers the same real tool set as direct registration', async () => {
|
|
61
|
-
const definitions = [
|
|
62
|
-
{
|
|
63
|
-
name: 'reports',
|
|
64
|
-
objectRef: '@test/smrt-svelte:Report',
|
|
65
|
-
className: 'Report',
|
|
66
|
-
endpoint: '/reports',
|
|
67
|
-
idField: 'id',
|
|
68
|
-
actions: ['list', 'create'],
|
|
69
|
-
fields: {},
|
|
70
|
-
toolDescriptors: [
|
|
71
|
-
{
|
|
72
|
-
action: 'list',
|
|
73
|
-
name: 'report_list',
|
|
74
|
-
description: 'List reports',
|
|
75
|
-
inputSchema: { type: 'object' },
|
|
76
|
-
readOnly: true,
|
|
77
|
-
effect: 'read',
|
|
78
|
-
idempotent: true,
|
|
79
|
-
openWorld: false,
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
action: 'create',
|
|
83
|
-
name: 'report_create',
|
|
84
|
-
description: 'Create a report',
|
|
85
|
-
inputSchema: { type: 'object' },
|
|
86
|
-
readOnly: false,
|
|
87
|
-
effect: 'write',
|
|
88
|
-
idempotent: false,
|
|
89
|
-
openWorld: false,
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
collection: 'audits',
|
|
95
|
-
objectRef: '@test/smrt-svelte:Audit',
|
|
96
|
-
className: 'Audit',
|
|
97
|
-
endpoint: '/audits',
|
|
98
|
-
idField: 'id',
|
|
99
|
-
idType: 'uuid',
|
|
100
|
-
relationships: [],
|
|
101
|
-
action: 'get',
|
|
102
|
-
name: 'audit_get',
|
|
103
|
-
description: 'Get an audit record',
|
|
104
|
-
inputSchema: { type: 'object' },
|
|
105
|
-
readOnly: true,
|
|
106
|
-
effect: 'read',
|
|
107
|
-
idempotent: true,
|
|
108
|
-
openWorld: false,
|
|
109
|
-
route: { method: 'GET', scope: 'item', path: [] },
|
|
110
|
-
},
|
|
111
|
-
];
|
|
112
|
-
const resolveFetchers = (definition) => {
|
|
113
|
-
definition.actions.length = 0;
|
|
114
|
-
return {
|
|
115
|
-
list: async () => [],
|
|
116
|
-
create: async (data) => data,
|
|
117
|
-
};
|
|
118
|
-
};
|
|
119
|
-
const resolveToolFetchers = (definition) => {
|
|
120
|
-
definition.action = 'delete';
|
|
121
|
-
return { get: async () => ({ id: 'a1' }) };
|
|
122
|
-
};
|
|
123
|
-
const policy = {
|
|
124
|
-
definitions,
|
|
125
|
-
effects: ['read', 'write'],
|
|
126
|
-
namespace: 'workspace',
|
|
127
|
-
maxTools: 4,
|
|
128
|
-
filter: () => true,
|
|
129
|
-
filterTool: (tool) => tool.collection === 'audits',
|
|
130
|
-
resolveFetchers: vi.fn(resolveFetchers),
|
|
131
|
-
resolveToolFetchers: vi.fn(resolveToolFetchers),
|
|
132
|
-
};
|
|
133
|
-
const captured = [];
|
|
134
|
-
const installRegistry = () => {
|
|
135
|
-
captured.length = 0;
|
|
136
|
-
document.modelContext = {
|
|
137
|
-
async registerTool(tool) {
|
|
138
|
-
captured.push({ name: tool.name, annotations: tool.annotations });
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
};
|
|
142
|
-
installRegistry();
|
|
143
|
-
const { registerWebMcpTools: directRegister } = await vi.importActual('@happyvertical/smrt-web');
|
|
144
|
-
directRegister(definitions, policy);
|
|
145
|
-
const direct = structuredClone(captured);
|
|
146
|
-
installRegistry();
|
|
147
|
-
render(Harness, { props: { webmcp: policy } });
|
|
148
|
-
await waitFor(() => expect(registerWebMcpTools).toHaveBeenCalledOnce());
|
|
149
|
-
expect(captured).toEqual(direct);
|
|
150
|
-
expect(captured.map((tool) => tool.name)).toEqual([
|
|
151
|
-
'workspace_report_list',
|
|
152
|
-
'workspace_report_create',
|
|
153
|
-
'workspace_audit_get',
|
|
154
|
-
]);
|
|
155
|
-
expect(policy.resolveFetchers).toHaveBeenCalledTimes(2);
|
|
156
|
-
expect(policy.resolveToolFetchers).toHaveBeenCalledTimes(2);
|
|
157
|
-
});
|
|
158
|
-
it('defaults generated data tools to read-only exposure', async () => {
|
|
159
|
-
const captured = [];
|
|
160
|
-
document.modelContext = {
|
|
161
|
-
async registerTool(tool) {
|
|
162
|
-
captured.push(tool.name);
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
const definitions = [
|
|
166
|
-
{
|
|
167
|
-
name: 'reports',
|
|
168
|
-
objectRef: '@test/smrt-svelte:Report',
|
|
169
|
-
className: 'Report',
|
|
170
|
-
endpoint: '/reports',
|
|
171
|
-
idField: 'id',
|
|
172
|
-
actions: ['list', 'create'],
|
|
173
|
-
fields: {},
|
|
174
|
-
toolDescriptors: [
|
|
175
|
-
{
|
|
176
|
-
action: 'list',
|
|
177
|
-
name: 'report_list',
|
|
178
|
-
description: 'List reports',
|
|
179
|
-
inputSchema: { type: 'object' },
|
|
180
|
-
readOnly: true,
|
|
181
|
-
effect: 'read',
|
|
182
|
-
idempotent: true,
|
|
183
|
-
openWorld: false,
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
action: 'create',
|
|
187
|
-
name: 'report_create',
|
|
188
|
-
description: 'Create a report',
|
|
189
|
-
inputSchema: { type: 'object' },
|
|
190
|
-
readOnly: false,
|
|
191
|
-
effect: 'write',
|
|
192
|
-
idempotent: false,
|
|
193
|
-
openWorld: false,
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
},
|
|
197
|
-
];
|
|
198
|
-
render(Harness, { props: { webmcp: { definitions } } });
|
|
199
|
-
await waitFor(() => expect(registerWebMcpTools).toHaveBeenCalledOnce());
|
|
200
|
-
expect(captured).toEqual(['report_list']);
|
|
201
|
-
});
|
|
202
|
-
it('reports rejected generated data-tool policies without an unhandled rejection', async () => {
|
|
203
|
-
const warn = vi.spyOn(logger, 'warn').mockImplementation(() => { });
|
|
204
|
-
document.modelContext = { registerTool: vi.fn() };
|
|
205
|
-
render(Harness, {
|
|
206
|
-
props: { webmcp: { definitions: [], maxTools: -1 } },
|
|
207
|
-
});
|
|
208
|
-
await waitFor(() => expect(warn).toHaveBeenCalledWith('Provider: WebMCP data tool registration rejected', {
|
|
209
|
-
error: expect.objectContaining({
|
|
210
|
-
message: 'WebMCP maxTools must be a non-negative safe integer',
|
|
211
|
-
}),
|
|
212
|
-
}));
|
|
213
|
-
});
|
|
214
|
-
it('reports asynchronous browser registration rejection', async () => {
|
|
215
|
-
const warn = vi.spyOn(logger, 'warn').mockImplementation(() => { });
|
|
216
|
-
document.modelContext = {
|
|
217
|
-
registerTool: () => Promise.reject(new Error('browser rejected tool')),
|
|
218
|
-
};
|
|
219
|
-
const definitions = [
|
|
220
|
-
{
|
|
221
|
-
collection: 'audits',
|
|
222
|
-
objectRef: '@test/smrt-svelte:Audit',
|
|
223
|
-
className: 'Audit',
|
|
224
|
-
endpoint: '/audits',
|
|
225
|
-
idField: 'id',
|
|
226
|
-
idType: 'uuid',
|
|
227
|
-
relationships: [],
|
|
228
|
-
action: 'get',
|
|
229
|
-
name: 'audit_get',
|
|
230
|
-
description: 'Get an audit record',
|
|
231
|
-
inputSchema: { type: 'object' },
|
|
232
|
-
readOnly: true,
|
|
233
|
-
effect: 'read',
|
|
234
|
-
idempotent: true,
|
|
235
|
-
openWorld: false,
|
|
236
|
-
route: { method: 'GET', scope: 'item', path: [] },
|
|
237
|
-
},
|
|
238
|
-
];
|
|
239
|
-
render(Harness, { props: { webmcp: { definitions } } });
|
|
240
|
-
await waitFor(() => expect(warn).toHaveBeenCalledWith('Provider: WebMCP data tool registration rejected', {
|
|
241
|
-
error: expect.objectContaining({ message: 'browser rejected tool' }),
|
|
242
|
-
}));
|
|
243
|
-
});
|
|
244
|
-
});
|