@happyvertical/smrt-svelte 0.53.1 → 0.53.2
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-svelte",
|
|
3
|
-
"version": "0.53.
|
|
3
|
+
"version": "0.53.2",
|
|
4
4
|
"smrtJsdoc": "strict",
|
|
5
5
|
"description": "Svelte 5 components for SMRT user management - auth, users, tenants, roles, permissions, groups",
|
|
6
6
|
"type": "module",
|
|
@@ -127,11 +127,11 @@
|
|
|
127
127
|
},
|
|
128
128
|
"dependencies": {
|
|
129
129
|
"@happyvertical/logger": "^0.98.0",
|
|
130
|
-
"@happyvertical/smrt-languages": "0.53.
|
|
131
|
-
"@happyvertical/smrt-mcp-apps": "0.53.
|
|
132
|
-
"@happyvertical/smrt-types": "0.53.
|
|
133
|
-
"@happyvertical/smrt-ui": "0.53.
|
|
134
|
-
"@happyvertical/smrt-web": "0.53.
|
|
130
|
+
"@happyvertical/smrt-languages": "0.53.2",
|
|
131
|
+
"@happyvertical/smrt-mcp-apps": "0.53.2",
|
|
132
|
+
"@happyvertical/smrt-types": "0.53.2",
|
|
133
|
+
"@happyvertical/smrt-ui": "0.53.2",
|
|
134
|
+
"@happyvertical/smrt-web": "0.53.2",
|
|
135
135
|
"@tanstack/db": "^0.6.14",
|
|
136
136
|
"@tanstack/svelte-db": "^0.1.91",
|
|
137
137
|
"esm-env": "^1.2.2"
|
|
@@ -166,14 +166,14 @@
|
|
|
166
166
|
}
|
|
167
167
|
},
|
|
168
168
|
"devDependencies": {
|
|
169
|
-
"@happyvertical/smrt-agents": "0.53.
|
|
170
|
-
"@happyvertical/smrt-chat": "0.53.
|
|
171
|
-
"@happyvertical/smrt-content": "0.53.
|
|
172
|
-
"@happyvertical/smrt-core": "0.53.
|
|
173
|
-
"@happyvertical/smrt-reports": "0.53.
|
|
174
|
-
"@happyvertical/smrt-scanner": "0.53.
|
|
175
|
-
"@happyvertical/smrt-tenancy": "0.53.
|
|
176
|
-
"@happyvertical/smrt-users": "0.53.
|
|
169
|
+
"@happyvertical/smrt-agents": "0.53.2",
|
|
170
|
+
"@happyvertical/smrt-chat": "0.53.2",
|
|
171
|
+
"@happyvertical/smrt-content": "0.53.2",
|
|
172
|
+
"@happyvertical/smrt-core": "0.53.2",
|
|
173
|
+
"@happyvertical/smrt-reports": "0.53.2",
|
|
174
|
+
"@happyvertical/smrt-scanner": "0.53.2",
|
|
175
|
+
"@happyvertical/smrt-tenancy": "0.53.2",
|
|
176
|
+
"@happyvertical/smrt-users": "0.53.2",
|
|
177
177
|
"@sveltejs/package": "^2.5.8",
|
|
178
178
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
179
179
|
"@testing-library/jest-dom": "^7.0.1",
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
"vitest": "4.1.10"
|
|
189
189
|
},
|
|
190
190
|
"scripts": {
|
|
191
|
-
"build": "svelte-package -i src --tsconfig tsconfig.svelte.json",
|
|
191
|
+
"build": "svelte-package -i src --tsconfig tsconfig.svelte.json && node ../../scripts/prune-svelte-package-artifacts.js dist",
|
|
192
192
|
"dev": "svelte-package -i src --watch",
|
|
193
193
|
"check": "pnpm exec svelte-check --tsconfig ./tsconfig.svelte.json",
|
|
194
194
|
"test": "pnpm run test:unit && pnpm run test:conformance",
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for app state types and initial state
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import { createInitialState, } from '../state/app-state.js';
|
|
6
|
-
describe('createInitialState', () => {
|
|
7
|
-
it('creates initial state with correct defaults', () => {
|
|
8
|
-
const state = createInitialState();
|
|
9
|
-
expect(state.mode).toBe('default');
|
|
10
|
-
expect(state.modeSource).toBe('auto');
|
|
11
|
-
expect(state.initialized).toBe(false);
|
|
12
|
-
expect(state.error).toBeNull();
|
|
13
|
-
});
|
|
14
|
-
it('creates initial session with null user', () => {
|
|
15
|
-
const state = createInitialState();
|
|
16
|
-
expect(state.session.user).toBeNull();
|
|
17
|
-
expect(state.session.isAuthenticated).toBe(false);
|
|
18
|
-
expect(state.session.permissions).toEqual([]);
|
|
19
|
-
expect(state.session.preferences).toEqual({});
|
|
20
|
-
});
|
|
21
|
-
it('creates initial socket state as disconnected', () => {
|
|
22
|
-
const state = createInitialState();
|
|
23
|
-
expect(state.socket.status).toBe('disconnected');
|
|
24
|
-
expect(state.socket.reconnectAttempts).toBe(0);
|
|
25
|
-
expect(state.socket.lastError).toBeNull();
|
|
26
|
-
});
|
|
27
|
-
it('creates initial AI state as uninitialized', () => {
|
|
28
|
-
const state = createInitialState();
|
|
29
|
-
expect(state.ai.stt.initState).toBe('uninitialized');
|
|
30
|
-
expect(state.ai.tts.initState).toBe('uninitialized');
|
|
31
|
-
expect(state.ai.llm.initState).toBe('uninitialized');
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe('UserSession type', () => {
|
|
35
|
-
it('allows null user', () => {
|
|
36
|
-
const session = {
|
|
37
|
-
user: null,
|
|
38
|
-
isAuthenticated: false,
|
|
39
|
-
permissions: [],
|
|
40
|
-
preferences: {},
|
|
41
|
-
};
|
|
42
|
-
expect(session.user).toBeNull();
|
|
43
|
-
expect(session.isAuthenticated).toBe(false);
|
|
44
|
-
});
|
|
45
|
-
it('allows user with permissions', () => {
|
|
46
|
-
const session = {
|
|
47
|
-
user: {
|
|
48
|
-
id: 'user-123',
|
|
49
|
-
profileId: 'profile-456',
|
|
50
|
-
email: 'test@example.com',
|
|
51
|
-
status: 'active',
|
|
52
|
-
lastLoginAt: null,
|
|
53
|
-
},
|
|
54
|
-
isAuthenticated: true,
|
|
55
|
-
permissions: ['articles.create', 'articles.read'],
|
|
56
|
-
preferences: {
|
|
57
|
-
preferredSTT: 'whisper-cpp',
|
|
58
|
-
autoEnableSmrt: true,
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
expect(session.user?.email).toBe('test@example.com');
|
|
62
|
-
expect(session.isAuthenticated).toBe(true);
|
|
63
|
-
expect(session.permissions).toContain('articles.create');
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('SocketState type', () => {
|
|
67
|
-
it('allows all socket statuses', () => {
|
|
68
|
-
const statuses = [
|
|
69
|
-
'disconnected',
|
|
70
|
-
'connecting',
|
|
71
|
-
'connected',
|
|
72
|
-
'reconnecting',
|
|
73
|
-
];
|
|
74
|
-
statuses.forEach((status) => {
|
|
75
|
-
const state = {
|
|
76
|
-
status,
|
|
77
|
-
reconnectAttempts: 0,
|
|
78
|
-
lastError: null,
|
|
79
|
-
};
|
|
80
|
-
expect(state.status).toBe(status);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
describe('SocketConfig type', () => {
|
|
85
|
-
it('allows minimal config with just url', () => {
|
|
86
|
-
const config = {
|
|
87
|
-
url: 'wss://example.com/ws',
|
|
88
|
-
};
|
|
89
|
-
expect(config.url).toBe('wss://example.com/ws');
|
|
90
|
-
expect(config.reconnect).toBeUndefined();
|
|
91
|
-
expect(config.onMessage).toBeUndefined();
|
|
92
|
-
});
|
|
93
|
-
it('allows full config with all options', () => {
|
|
94
|
-
const config = {
|
|
95
|
-
url: 'wss://example.com/ws',
|
|
96
|
-
reconnect: {
|
|
97
|
-
enabled: true,
|
|
98
|
-
maxAttempts: 10,
|
|
99
|
-
baseDelay: 2000,
|
|
100
|
-
},
|
|
101
|
-
onOpen: () => { },
|
|
102
|
-
onMessage: (data) => console.log(data),
|
|
103
|
-
onClose: (event) => console.log(event),
|
|
104
|
-
onError: (event) => console.log(event),
|
|
105
|
-
};
|
|
106
|
-
expect(config.url).toBe('wss://example.com/ws');
|
|
107
|
-
expect(config.reconnect?.enabled).toBe(true);
|
|
108
|
-
expect(config.reconnect?.maxAttempts).toBe(10);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe('AIConfig type', () => {
|
|
112
|
-
it('creates initial AI loading state', () => {
|
|
113
|
-
const state = createInitialState();
|
|
114
|
-
expect(state.aiLoading.phase).toBe('idle');
|
|
115
|
-
expect(state.aiLoading.currentAdapter).toBeNull();
|
|
116
|
-
expect(state.aiLoading.overallProgress).toBe(0);
|
|
117
|
-
expect(state.aiLoading.message).toBe('');
|
|
118
|
-
expect(state.aiLoading.loaded).toEqual([]);
|
|
119
|
-
expect(state.aiLoading.failed).toEqual([]);
|
|
120
|
-
expect(state.aiLoading.error).toBeNull();
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe('AIConfig types', () => {
|
|
124
|
-
it('allows preload strategies', () => {
|
|
125
|
-
const strategies = ['none', 'eager', 'idle', 'on-visible'];
|
|
126
|
-
strategies.forEach((strategy) => {
|
|
127
|
-
expect(strategy).toBeDefined();
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
it('allows STT config', () => {
|
|
131
|
-
const sttConfig = {
|
|
132
|
-
type: 'whisper-cpp',
|
|
133
|
-
model: 'tiny.en',
|
|
134
|
-
enabled: true,
|
|
135
|
-
};
|
|
136
|
-
expect(sttConfig.type).toBe('whisper-cpp');
|
|
137
|
-
expect(sttConfig.model).toBe('tiny.en');
|
|
138
|
-
});
|
|
139
|
-
it('allows TTS config', () => {
|
|
140
|
-
const ttsConfig = {
|
|
141
|
-
type: 'browser-synthesis',
|
|
142
|
-
voice: 'Google UK English Female',
|
|
143
|
-
enabled: true,
|
|
144
|
-
};
|
|
145
|
-
expect(ttsConfig.type).toBe('browser-synthesis');
|
|
146
|
-
});
|
|
147
|
-
it('allows LLM config', () => {
|
|
148
|
-
const llmConfig = {
|
|
149
|
-
type: 'webllm',
|
|
150
|
-
model: 'Llama-3.1-8B-Instruct',
|
|
151
|
-
enabled: true,
|
|
152
|
-
};
|
|
153
|
-
expect(llmConfig.type).toBe('webllm');
|
|
154
|
-
expect(llmConfig.model).toBe('Llama-3.1-8B-Instruct');
|
|
155
|
-
});
|
|
156
|
-
});
|
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
import { createDataSurfaceRegistry, } from '@happyvertical/smrt-ui/data';
|
|
2
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { createDataSurfaceBrowserBridge, DATA_SURFACE_IDENTIFIER_MAX_LENGTH, } from '../data-surface.js';
|
|
4
|
-
const identity = { surfaceId: 'orders', kind: 'table' };
|
|
5
|
-
const descriptor = {
|
|
6
|
-
version: 1,
|
|
7
|
-
identity,
|
|
8
|
-
schemaVersion: 1,
|
|
9
|
-
label: 'Orders',
|
|
10
|
-
rowKey: 'id',
|
|
11
|
-
columns: [{ id: 'id', label: 'ID', capabilities: ['read'] }],
|
|
12
|
-
query: { modes: ['rows'], projectableColumnIds: ['id'] },
|
|
13
|
-
controls: [{ id: 'refresh', label: 'Refresh' }],
|
|
14
|
-
actions: [],
|
|
15
|
-
limits: { maxQueryRows: 10, maxQueryBytes: 1000, maxSelectionSize: 10 },
|
|
16
|
-
};
|
|
17
|
-
function request(overrides = {}) {
|
|
18
|
-
return {
|
|
19
|
-
type: 'data-surface.command',
|
|
20
|
-
version: 1,
|
|
21
|
-
commandId: 'command-1',
|
|
22
|
-
sessionId: 'session-1',
|
|
23
|
-
source: 'server-1',
|
|
24
|
-
expiresAt: 10_000,
|
|
25
|
-
identity,
|
|
26
|
-
expectedRevision: 1,
|
|
27
|
-
controlId: 'refresh',
|
|
28
|
-
...overrides,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function transport() {
|
|
32
|
-
const messages = [];
|
|
33
|
-
const listeners = new Set();
|
|
34
|
-
return {
|
|
35
|
-
messages,
|
|
36
|
-
send: vi.fn((message) => {
|
|
37
|
-
messages.push(message);
|
|
38
|
-
}),
|
|
39
|
-
subscribe(listener) {
|
|
40
|
-
listeners.add(listener);
|
|
41
|
-
return () => listeners.delete(listener);
|
|
42
|
-
},
|
|
43
|
-
receive(message, peer = {
|
|
44
|
-
sessionId: 'session-1',
|
|
45
|
-
source: 'server-1',
|
|
46
|
-
}) {
|
|
47
|
-
for (const listener of listeners)
|
|
48
|
-
listener(message, peer);
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function fixture() {
|
|
53
|
-
let revision = 1;
|
|
54
|
-
const execute = vi.fn(() => {
|
|
55
|
-
revision += 1;
|
|
56
|
-
});
|
|
57
|
-
const registry = createDataSurfaceRegistry();
|
|
58
|
-
registry.register({
|
|
59
|
-
descriptor,
|
|
60
|
-
getSnapshot: () => ({ revision, state: { refreshed: revision > 1 } }),
|
|
61
|
-
execute,
|
|
62
|
-
});
|
|
63
|
-
return { registry, execute };
|
|
64
|
-
}
|
|
65
|
-
const drain = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
66
|
-
describe('data-surface browser bridge', () => {
|
|
67
|
-
it('requires the bound session/source and acknowledges a successful command', async () => {
|
|
68
|
-
const { registry, execute } = fixture();
|
|
69
|
-
const link = transport();
|
|
70
|
-
createDataSurfaceBrowserBridge({
|
|
71
|
-
registry,
|
|
72
|
-
transport: link,
|
|
73
|
-
sessionId: 'session-1',
|
|
74
|
-
source: 'browser-1',
|
|
75
|
-
peerSource: 'server-1',
|
|
76
|
-
now: () => 1_000,
|
|
77
|
-
});
|
|
78
|
-
await link.receive(request({ expiresAt: 2_000 }));
|
|
79
|
-
await drain();
|
|
80
|
-
expect(execute).toHaveBeenCalledTimes(1);
|
|
81
|
-
expect(link.messages.at(-1)).toMatchObject({
|
|
82
|
-
type: 'data-surface.ack',
|
|
83
|
-
commandId: 'command-1',
|
|
84
|
-
sessionId: 'session-1',
|
|
85
|
-
source: 'browser-1',
|
|
86
|
-
ok: true,
|
|
87
|
-
});
|
|
88
|
-
await link.receive(request({ expiresAt: 5_000 }));
|
|
89
|
-
await drain();
|
|
90
|
-
expect(execute).toHaveBeenCalledTimes(1);
|
|
91
|
-
expect(link.messages.at(-1)).toMatchObject({ expiresAt: 5_000 });
|
|
92
|
-
});
|
|
93
|
-
it('does not execute stale, expired, or cross-session/source commands', async () => {
|
|
94
|
-
const { registry, execute } = fixture();
|
|
95
|
-
const link = transport();
|
|
96
|
-
createDataSurfaceBrowserBridge({
|
|
97
|
-
registry,
|
|
98
|
-
transport: link,
|
|
99
|
-
sessionId: 'session-1',
|
|
100
|
-
source: 'browser-1',
|
|
101
|
-
peerSource: 'server-1',
|
|
102
|
-
now: () => 1_000,
|
|
103
|
-
});
|
|
104
|
-
await link.receive(request({ commandId: 'stale', expectedRevision: 99 }));
|
|
105
|
-
await link.receive(request({ commandId: 'expired', expiresAt: 500 }));
|
|
106
|
-
await link.receive(request({ commandId: 'session', sessionId: 'other' }));
|
|
107
|
-
await link.receive(request({ commandId: 'source', source: 'other' }));
|
|
108
|
-
await drain();
|
|
109
|
-
expect(execute).not.toHaveBeenCalled();
|
|
110
|
-
expect(link.messages
|
|
111
|
-
.filter((message) => message.type === 'data-surface.ack')
|
|
112
|
-
.map((message) => message.reason)).toEqual(expect.arrayContaining([
|
|
113
|
-
'stale_revision',
|
|
114
|
-
'expired',
|
|
115
|
-
'session_mismatch',
|
|
116
|
-
'source_mismatch',
|
|
117
|
-
]));
|
|
118
|
-
});
|
|
119
|
-
it('rejects a command whose wire identity is accompanied by an unauthenticated peer', async () => {
|
|
120
|
-
const { registry, execute } = fixture();
|
|
121
|
-
const link = transport();
|
|
122
|
-
createDataSurfaceBrowserBridge({
|
|
123
|
-
registry,
|
|
124
|
-
transport: link,
|
|
125
|
-
sessionId: 'session-1',
|
|
126
|
-
source: 'browser-1',
|
|
127
|
-
peerSource: 'server-1',
|
|
128
|
-
now: () => 1_000,
|
|
129
|
-
});
|
|
130
|
-
await link.receive(request(), {
|
|
131
|
-
sessionId: 'session-1',
|
|
132
|
-
source: 'attacker',
|
|
133
|
-
});
|
|
134
|
-
await link.receive(request({ commandId: 'session-spoof' }), {
|
|
135
|
-
sessionId: 'attacker',
|
|
136
|
-
source: 'server-1',
|
|
137
|
-
});
|
|
138
|
-
expect(execute).not.toHaveBeenCalled();
|
|
139
|
-
expect(link.messages).toHaveLength(0);
|
|
140
|
-
});
|
|
141
|
-
it('rejects identifiers longer than the shared bridge contract', async () => {
|
|
142
|
-
const { registry, execute } = fixture();
|
|
143
|
-
const link = transport();
|
|
144
|
-
createDataSurfaceBrowserBridge({
|
|
145
|
-
registry,
|
|
146
|
-
transport: link,
|
|
147
|
-
sessionId: 'session-1',
|
|
148
|
-
source: 'browser-1',
|
|
149
|
-
peerSource: 'server-1',
|
|
150
|
-
now: () => 1_000,
|
|
151
|
-
});
|
|
152
|
-
const tooLong = 'x'.repeat(DATA_SURFACE_IDENTIFIER_MAX_LENGTH + 1);
|
|
153
|
-
await link.receive(request({ commandId: tooLong }));
|
|
154
|
-
await link.receive(request({ controlId: tooLong }));
|
|
155
|
-
await link.receive(request({ identity: { surfaceId: tooLong, kind: 'table' } }));
|
|
156
|
-
await link.receive(request({
|
|
157
|
-
identity: {
|
|
158
|
-
surfaceId: 'orders',
|
|
159
|
-
kind: 'table',
|
|
160
|
-
subject: { type: tooLong, id: 'docs' },
|
|
161
|
-
},
|
|
162
|
-
}));
|
|
163
|
-
await link.receive(request({
|
|
164
|
-
identity: {
|
|
165
|
-
surfaceId: 'orders',
|
|
166
|
-
kind: 'table',
|
|
167
|
-
subject: { type: 'site', id: tooLong },
|
|
168
|
-
},
|
|
169
|
-
}));
|
|
170
|
-
expect(execute).not.toHaveBeenCalled();
|
|
171
|
-
expect(link.messages).toHaveLength(0);
|
|
172
|
-
});
|
|
173
|
-
it('retains every unexpired replay outcome and refuses new commands at capacity', async () => {
|
|
174
|
-
const { registry, execute } = fixture();
|
|
175
|
-
const link = transport();
|
|
176
|
-
createDataSurfaceBrowserBridge({
|
|
177
|
-
registry,
|
|
178
|
-
transport: link,
|
|
179
|
-
sessionId: 'session-1',
|
|
180
|
-
source: 'browser-1',
|
|
181
|
-
peerSource: 'server-1',
|
|
182
|
-
now: () => 1_000,
|
|
183
|
-
maxReplayEntries: 2,
|
|
184
|
-
});
|
|
185
|
-
await link.receive(request({ commandId: 'one', expiresAt: 5_000 }));
|
|
186
|
-
await drain();
|
|
187
|
-
await link.receive(request({ commandId: 'two', expectedRevision: 2, expiresAt: 5_000 }));
|
|
188
|
-
await drain();
|
|
189
|
-
await link.receive(request({ commandId: 'three', expectedRevision: 3, expiresAt: 5_000 }));
|
|
190
|
-
await drain();
|
|
191
|
-
expect(execute).toHaveBeenCalledTimes(2);
|
|
192
|
-
expect(link.messages.at(-1)).toMatchObject({
|
|
193
|
-
commandId: 'three',
|
|
194
|
-
reason: 'replay_capacity_exceeded',
|
|
195
|
-
});
|
|
196
|
-
await link.receive(request({ commandId: 'one', expiresAt: 5_000 }));
|
|
197
|
-
await drain();
|
|
198
|
-
expect(execute).toHaveBeenCalledTimes(2);
|
|
199
|
-
});
|
|
200
|
-
it('atomically reserves replay capacity while concurrent executions are held', async () => {
|
|
201
|
-
const registry = createDataSurfaceRegistry();
|
|
202
|
-
const releases = [];
|
|
203
|
-
const execute = vi.fn(() => new Promise((resolve) => releases.push(resolve)));
|
|
204
|
-
registry.register({
|
|
205
|
-
descriptor,
|
|
206
|
-
getSnapshot: () => ({ revision: 1, state: {} }),
|
|
207
|
-
execute,
|
|
208
|
-
});
|
|
209
|
-
const link = transport();
|
|
210
|
-
createDataSurfaceBrowserBridge({
|
|
211
|
-
registry,
|
|
212
|
-
transport: link,
|
|
213
|
-
sessionId: 'session-1',
|
|
214
|
-
source: 'browser-1',
|
|
215
|
-
peerSource: 'server-1',
|
|
216
|
-
now: () => 1_000,
|
|
217
|
-
maxReplayEntries: 2,
|
|
218
|
-
});
|
|
219
|
-
void link.receive(request({ commandId: 'held-one', expiresAt: 5_000 }));
|
|
220
|
-
void link.receive(request({ commandId: 'held-two', expiresAt: 5_000 }));
|
|
221
|
-
void link.receive(request({ commandId: 'held-three', expiresAt: 5_000 }));
|
|
222
|
-
for (let attempt = 0; attempt < 5 && execute.mock.calls.length < 1; attempt++) {
|
|
223
|
-
await drain();
|
|
224
|
-
}
|
|
225
|
-
expect(execute).toHaveBeenCalledTimes(1);
|
|
226
|
-
expect(link.messages).toContainEqual(expect.objectContaining({
|
|
227
|
-
type: 'data-surface.ack',
|
|
228
|
-
commandId: 'held-three',
|
|
229
|
-
reason: 'replay_capacity_exceeded',
|
|
230
|
-
}));
|
|
231
|
-
releases[0]?.();
|
|
232
|
-
for (let attempt = 0; attempt < 5 && execute.mock.calls.length < 2; attempt++) {
|
|
233
|
-
await drain();
|
|
234
|
-
}
|
|
235
|
-
releases[1]?.();
|
|
236
|
-
await drain();
|
|
237
|
-
await drain();
|
|
238
|
-
expect(link.messages.filter((message) => message.type === 'data-surface.ack' && message.ok === true)).toHaveLength(2);
|
|
239
|
-
});
|
|
240
|
-
it('releases replay reservations when execution errors after expiry', async () => {
|
|
241
|
-
let current = 1_000;
|
|
242
|
-
const registry = createDataSurfaceRegistry();
|
|
243
|
-
const execute = vi
|
|
244
|
-
.fn()
|
|
245
|
-
.mockImplementationOnce(() => {
|
|
246
|
-
throw new Error('boom');
|
|
247
|
-
})
|
|
248
|
-
.mockImplementationOnce(() => undefined);
|
|
249
|
-
registry.register({
|
|
250
|
-
descriptor,
|
|
251
|
-
getSnapshot: () => ({ revision: 1, state: {} }),
|
|
252
|
-
execute,
|
|
253
|
-
});
|
|
254
|
-
const link = transport();
|
|
255
|
-
createDataSurfaceBrowserBridge({
|
|
256
|
-
registry,
|
|
257
|
-
transport: link,
|
|
258
|
-
sessionId: 'session-1',
|
|
259
|
-
source: 'browser-1',
|
|
260
|
-
peerSource: 'server-1',
|
|
261
|
-
now: () => current,
|
|
262
|
-
maxReplayEntries: 1,
|
|
263
|
-
});
|
|
264
|
-
await link.receive(request({ commandId: 'expired-error', expiresAt: 1_100 }));
|
|
265
|
-
await drain();
|
|
266
|
-
current = 1_200;
|
|
267
|
-
await link.receive(request({ commandId: 'after-error', expiresAt: 5_000 }));
|
|
268
|
-
await drain();
|
|
269
|
-
expect(execute).toHaveBeenCalledTimes(2);
|
|
270
|
-
expect(link.messages.at(-1)).toMatchObject({
|
|
271
|
-
commandId: 'after-error',
|
|
272
|
-
ok: true,
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
it('releases replay capacity when execution never settles before expiry', async () => {
|
|
276
|
-
vi.useFakeTimers();
|
|
277
|
-
try {
|
|
278
|
-
vi.setSystemTime(1_000);
|
|
279
|
-
const registry = createDataSurfaceRegistry();
|
|
280
|
-
let finishHung;
|
|
281
|
-
const execute = vi
|
|
282
|
-
.fn()
|
|
283
|
-
.mockImplementationOnce(() => new Promise((resolve) => {
|
|
284
|
-
finishHung = resolve;
|
|
285
|
-
}))
|
|
286
|
-
.mockImplementationOnce(() => undefined);
|
|
287
|
-
registry.register({
|
|
288
|
-
descriptor,
|
|
289
|
-
getSnapshot: () => ({ revision: 1, state: {} }),
|
|
290
|
-
execute,
|
|
291
|
-
});
|
|
292
|
-
registry.register({
|
|
293
|
-
descriptor: {
|
|
294
|
-
...descriptor,
|
|
295
|
-
identity: { surfaceId: 'invoices', kind: 'table' },
|
|
296
|
-
},
|
|
297
|
-
getSnapshot: () => ({ revision: 1, state: {} }),
|
|
298
|
-
execute,
|
|
299
|
-
});
|
|
300
|
-
const link = transport();
|
|
301
|
-
createDataSurfaceBrowserBridge({
|
|
302
|
-
registry,
|
|
303
|
-
transport: link,
|
|
304
|
-
sessionId: 'session-1',
|
|
305
|
-
source: 'browser-1',
|
|
306
|
-
peerSource: 'server-1',
|
|
307
|
-
maxReplayEntries: 1,
|
|
308
|
-
});
|
|
309
|
-
const first = link.receive(request({ commandId: 'hung', expiresAt: 1_100 }));
|
|
310
|
-
await vi.advanceTimersByTimeAsync(100);
|
|
311
|
-
await first;
|
|
312
|
-
expect(link.messages.at(-1)).toMatchObject({
|
|
313
|
-
commandId: 'hung',
|
|
314
|
-
reason: 'expired',
|
|
315
|
-
});
|
|
316
|
-
finishHung();
|
|
317
|
-
await vi.runOnlyPendingTimersAsync();
|
|
318
|
-
expect(link.messages.filter((message) => message.type === 'data-surface.ack' && message.commandId === 'hung')).toHaveLength(1);
|
|
319
|
-
await link.receive(request({
|
|
320
|
-
commandId: 'after-hung',
|
|
321
|
-
expiresAt: 5_000,
|
|
322
|
-
identity: { surfaceId: 'invoices', kind: 'table' },
|
|
323
|
-
}));
|
|
324
|
-
await vi.runOnlyPendingTimersAsync();
|
|
325
|
-
expect(execute).toHaveBeenCalledTimes(2);
|
|
326
|
-
expect(link.messages.at(-1)).toMatchObject({
|
|
327
|
-
commandId: 'after-hung',
|
|
328
|
-
ok: true,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
finally {
|
|
332
|
-
vi.useRealTimers();
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
it('forwards only monotonic registry events', async () => {
|
|
336
|
-
const { registry } = fixture();
|
|
337
|
-
const link = transport();
|
|
338
|
-
createDataSurfaceBrowserBridge({
|
|
339
|
-
registry,
|
|
340
|
-
transport: link,
|
|
341
|
-
sessionId: 'session-1',
|
|
342
|
-
source: 'browser-1',
|
|
343
|
-
peerSource: 'server-1',
|
|
344
|
-
});
|
|
345
|
-
await link.receive(request({ commandId: 'event-command', expiresAt: Date.now() + 1000 }));
|
|
346
|
-
await drain();
|
|
347
|
-
const events = link.messages.filter((message) => message.type === 'data-surface.event');
|
|
348
|
-
expect(events.length).toBeGreaterThan(0);
|
|
349
|
-
expect(events.map((event) => event.sequence)).toEqual([...events].map((event) => event.sequence).sort((a, b) => a - b));
|
|
350
|
-
});
|
|
351
|
-
});
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Provider from '../Provider.svelte';
|
|
3
|
-
import type { AppMode } from '../state/app-state.js';
|
|
4
|
-
import type { SmrtAppStateManager } from '../state/app-state.svelte.js';
|
|
5
|
-
import Probe from './provider-mode-probe.svelte';
|
|
6
|
-
|
|
7
|
-
interface Props {
|
|
8
|
-
mode?: AppMode;
|
|
9
|
-
autoEnableSmrt?: boolean;
|
|
10
|
-
capture: (state: SmrtAppStateManager) => void;
|
|
11
|
-
}
|
|
12
|
-
const { mode, autoEnableSmrt, capture }: Props = $props();
|
|
13
|
-
</script>
|
|
14
|
-
<Provider {mode} {autoEnableSmrt}><Probe {capture} /></Provider>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { AppMode } from '../state/app-state.js';
|
|
2
|
-
import type { SmrtAppStateManager } from '../state/app-state.svelte.js';
|
|
3
|
-
interface Props {
|
|
4
|
-
mode?: AppMode;
|
|
5
|
-
autoEnableSmrt?: boolean;
|
|
6
|
-
capture: (state: SmrtAppStateManager) => void;
|
|
7
|
-
}
|
|
8
|
-
declare const ProviderModeHarness: import("svelte").Component<Props, {}, "">;
|
|
9
|
-
type ProviderModeHarness = ReturnType<typeof ProviderModeHarness>;
|
|
10
|
-
export default ProviderModeHarness;
|
|
11
|
-
//# sourceMappingURL=provider-mode-harness.svelte.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-mode-harness.svelte.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-mode-harness.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAIxE,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC/C;AAaD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { untrack } from 'svelte';
|
|
3
|
-
import type { SmrtAppStateManager } from '../state/app-state.svelte.js';
|
|
4
|
-
import { getAppStateContext } from '../state/context.js';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
capture: (state: SmrtAppStateManager) => void;
|
|
8
|
-
}
|
|
9
|
-
const { capture }: Props = $props();
|
|
10
|
-
const appState = getAppStateContext();
|
|
11
|
-
untrack(() => capture(appState));
|
|
12
|
-
</script>
|
|
13
|
-
<output aria-label="App mode">{appState.state.mode}</output>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { SmrtAppStateManager } from '../state/app-state.svelte.js';
|
|
2
|
-
interface Props {
|
|
3
|
-
capture: (state: SmrtAppStateManager) => void;
|
|
4
|
-
}
|
|
5
|
-
declare const ProviderModeProbe: import("svelte").Component<Props, {}, "">;
|
|
6
|
-
type ProviderModeProbe = ReturnType<typeof ProviderModeProbe>;
|
|
7
|
-
export default ProviderModeProbe;
|
|
8
|
-
//# sourceMappingURL=provider-mode-probe.svelte.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-mode-probe.svelte.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-mode-probe.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAIxE,UAAU,KAAK;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC/C;AAcD,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Provider from '../Provider.svelte';
|
|
3
|
-
import type { WebMcpProviderConfig } from '../web/webmcp-provider.js';
|
|
4
|
-
|
|
5
|
-
interface Props {
|
|
6
|
-
webmcp: WebMcpProviderConfig;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const { webmcp }: Props = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<Provider {webmcp}>
|
|
13
|
-
<span></span>
|
|
14
|
-
</Provider>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { WebMcpProviderConfig } from '../web/webmcp-provider.js';
|
|
2
|
-
interface Props {
|
|
3
|
-
webmcp: WebMcpProviderConfig;
|
|
4
|
-
}
|
|
5
|
-
declare const ProviderWebmcpHarness: import("svelte").Component<Props, {}, "">;
|
|
6
|
-
type ProviderWebmcpHarness = ReturnType<typeof ProviderWebmcpHarness>;
|
|
7
|
-
export default ProviderWebmcpHarness;
|
|
8
|
-
//# sourceMappingURL=provider-webmcp-harness.svelte.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-webmcp-harness.svelte.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-webmcp-harness.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,UAAU,KAAK;IACb,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAeD,QAAA,MAAM,qBAAqB,2CAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
|