@happyvertical/smrt-svelte 0.43.9 → 0.44.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.
Files changed (90) hide show
  1. package/AGENTS.md +38 -2
  2. package/dist/Provider.svelte +11 -0
  3. package/dist/Provider.svelte.d.ts.map +1 -1
  4. package/dist/components/forms/Form.svelte +29 -13
  5. package/dist/components/forms/Form.svelte.d.ts +5 -0
  6. package/dist/components/forms/Form.svelte.d.ts.map +1 -1
  7. package/dist/components/forms/__tests__/Form.webmcp.test.js +115 -6
  8. package/dist/components/settings/SettingsCatalog.svelte +9 -0
  9. package/dist/components/settings/SettingsCatalog.svelte.d.ts +9 -0
  10. package/dist/components/settings/SettingsCatalog.svelte.d.ts.map +1 -1
  11. package/dist/components/workspace/admin-shell/ActivityBadge.svelte +2 -0
  12. package/dist/components/workspace/admin-shell/ActivityBadge.svelte.d.ts +2 -0
  13. package/dist/components/workspace/admin-shell/ActivityBadge.svelte.d.ts.map +1 -1
  14. package/dist/components/workspace/admin-shell/ActivityItem.svelte +1 -0
  15. package/dist/components/workspace/admin-shell/ActivityItem.svelte.d.ts +1 -0
  16. package/dist/components/workspace/admin-shell/ActivityItem.svelte.d.ts.map +1 -1
  17. package/dist/components/workspace/admin-shell/ActivityList.svelte +3 -0
  18. package/dist/components/workspace/admin-shell/ActivityList.svelte.d.ts +3 -0
  19. package/dist/components/workspace/admin-shell/ActivityList.svelte.d.ts.map +1 -1
  20. package/dist/components/workspace/admin-shell/ActivityToasts.svelte +1 -0
  21. package/dist/components/workspace/admin-shell/ActivityToasts.svelte.d.ts +1 -0
  22. package/dist/components/workspace/admin-shell/ActivityToasts.svelte.d.ts.map +1 -1
  23. package/dist/components/workspace/admin-shell/AdminShell.svelte +15 -0
  24. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +15 -0
  25. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  26. package/dist/components/workspace/admin-shell/AppScopePanel.svelte +7 -0
  27. package/dist/components/workspace/admin-shell/AppScopePanel.svelte.d.ts +7 -0
  28. package/dist/components/workspace/admin-shell/AppScopePanel.svelte.d.ts.map +1 -1
  29. package/dist/components/workspace/admin-shell/HotkeyInput.svelte +4 -0
  30. package/dist/components/workspace/admin-shell/HotkeyInput.svelte.d.ts +4 -0
  31. package/dist/components/workspace/admin-shell/HotkeyInput.svelte.d.ts.map +1 -1
  32. package/dist/components/workspace/admin-shell/ShellCorner.svelte +1 -0
  33. package/dist/components/workspace/admin-shell/ShellCorner.svelte.d.ts +1 -0
  34. package/dist/components/workspace/admin-shell/ShellCorner.svelte.d.ts.map +1 -1
  35. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte +1 -0
  36. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte.d.ts +1 -0
  37. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte.d.ts.map +1 -1
  38. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte +2 -0
  39. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte.d.ts +2 -0
  40. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte.d.ts.map +1 -1
  41. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte +1 -0
  42. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte.d.ts +1 -0
  43. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte.d.ts.map +1 -1
  44. package/dist/components/workspace/admin-shell/TenantNav.svelte +5 -0
  45. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +5 -0
  46. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  47. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte +11 -0
  48. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts +11 -0
  49. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +3 -0
  53. package/dist/web/__tests__/view-intent-provider.fixture.svelte +28 -0
  54. package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts +13 -0
  55. package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts.map +1 -0
  56. package/dist/web/__tests__/view-intent.fixture.svelte +33 -0
  57. package/dist/web/__tests__/view-intent.fixture.svelte.d.ts +15 -0
  58. package/dist/web/__tests__/view-intent.fixture.svelte.d.ts.map +1 -0
  59. package/dist/web/__tests__/view-intent.intents.d.ts +14 -0
  60. package/dist/web/__tests__/view-intent.intents.d.ts.map +1 -0
  61. package/dist/web/__tests__/view-intent.intents.js +38 -0
  62. package/dist/web/__tests__/view-intent.svelte.test.js +201 -0
  63. package/dist/web/__tests__/webmcp-composed.child.fixture.svelte +11 -0
  64. package/dist/web/__tests__/webmcp-composed.child.fixture.svelte.d.ts.map +1 -1
  65. package/dist/web/__tests__/webmcp-composed.integration.svelte.test.js +4 -0
  66. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte +16 -0
  67. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts +19 -0
  68. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts.map +1 -0
  69. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte +11 -0
  70. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts +8 -0
  71. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts.map +1 -0
  72. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte +20 -0
  73. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts +7 -0
  74. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts.map +1 -0
  75. package/dist/web/__tests__/webmcp-harness-unannotated.svelte +14 -0
  76. package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts +19 -0
  77. package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts.map +1 -0
  78. package/dist/web/__tests__/webmcp-harness.svelte +4 -0
  79. package/dist/web/__tests__/webmcp-harness.svelte.d.ts.map +1 -1
  80. package/dist/web/__tests__/webmcp.test.js +136 -9
  81. package/dist/web/view-intent.svelte.d.ts +64 -0
  82. package/dist/web/view-intent.svelte.d.ts.map +1 -0
  83. package/dist/web/view-intent.svelte.js +83 -0
  84. package/dist/web/webmcp-bespoke-context.d.ts +14 -0
  85. package/dist/web/webmcp-bespoke-context.d.ts.map +1 -0
  86. package/dist/web/webmcp-bespoke-context.js +8 -0
  87. package/dist/web/webmcp.svelte.d.ts +29 -13
  88. package/dist/web/webmcp.svelte.d.ts.map +1 -1
  89. package/dist/web/webmcp.svelte.js +92 -12
  90. package/package.json +8 -7
@@ -59,8 +59,10 @@ describe('Form WebMCP staged-edit intent', () => {
59
59
  render(AsyncValidationForm, {
60
60
  props: { onsubmit, validate, webmcp: true },
61
61
  });
62
+ const _regLenBefore = registered.length;
62
63
  await tick();
63
64
  await tick();
65
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
64
66
  expect(registered).toHaveLength(1);
65
67
  await userEvent.click(screen.getByRole('button', { name: 'Submit' }));
66
68
  await waitFor(() => expect(validate).toHaveBeenCalledTimes(1));
@@ -155,8 +157,10 @@ describe('Form WebMCP staged-edit intent', () => {
155
157
  };
156
158
  const onsubmit = vi.fn();
157
159
  render(FormWithFields, { props: { webmcp: true, onsubmit } });
160
+ const _regLenBefore = registered.length;
158
161
  await tick();
159
162
  await tick();
163
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
160
164
  expect(registered).toHaveLength(1);
161
165
  expect(registered[0].inputSchema).toMatchObject({
162
166
  type: 'object',
@@ -195,8 +199,10 @@ describe('Form WebMCP staged-edit intent', () => {
195
199
  onselectchange: selectChanged,
196
200
  },
197
201
  });
202
+ const _regLenBefore = registered.length;
198
203
  await tick();
199
204
  await tick();
205
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
200
206
  const tool = registered.at(-1);
201
207
  if (!tool)
202
208
  throw new Error('WebMCP tool was not registered');
@@ -237,8 +243,10 @@ describe('Form WebMCP staged-edit intent', () => {
237
243
  interactionRegistry: registry,
238
244
  },
239
245
  });
246
+ const _regLenBefore = registered.length;
240
247
  await tick();
241
248
  await tick();
249
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
242
250
  expect(await registered.at(-1)?.execute({ age: '' })).toBe('Staged 1 change for review');
243
251
  const age = registry
244
252
  .list()
@@ -261,8 +269,10 @@ describe('Form WebMCP staged-edit intent', () => {
261
269
  render(FormWithFields, {
262
270
  props: { webmcp: true, showAge: false, interactionRegistry },
263
271
  });
272
+ const _regLenBefore = registered.length;
264
273
  await tick();
265
274
  await tick();
275
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
266
276
  await registered.at(-1)?.execute({ fullname: 'Ada Lovelace' });
267
277
  await userEvent.click(await screen.findByRole('button', { name: 'Apply valid changes' }));
268
278
  await waitFor(() => expect(screen.getByRole('textbox', { name: 'Full name' })).toHaveFocus());
@@ -370,8 +380,10 @@ describe('Form WebMCP staged-edit intent', () => {
370
380
  const view = render(FormWithFields, {
371
381
  props: { webmcp: true, interactionRegistry: registry },
372
382
  });
383
+ const _regLenBefore = registered.length;
373
384
  await tick();
374
385
  await tick();
386
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
375
387
  expect(await registered.at(-1)?.execute({ fullname: 'Ada' })).toBe('Staged 1 change for review');
376
388
  await view.rerender({
377
389
  webmcp: true,
@@ -583,8 +595,10 @@ describe('Form WebMCP staged-edit intent', () => {
583
595
  interactionRegistry: registry,
584
596
  },
585
597
  });
598
+ const _regLenBefore = registered.length;
586
599
  await tick();
587
600
  await tick();
601
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
588
602
  expect(await registered.at(-1)?.execute({
589
603
  appointment: '2026-02-30',
590
604
  phone: '21234567890',
@@ -623,8 +637,10 @@ describe('Form WebMCP staged-edit intent', () => {
623
637
  interactionRegistry: registry,
624
638
  },
625
639
  });
640
+ const _regLenBefore = registered.length;
626
641
  await tick();
627
642
  await tick();
643
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
628
644
  expect(await registered.at(-1)?.execute({ notes: 'Proposed' })).toBe('Staged 1 change for review');
629
645
  const notes = registry
630
646
  .list()
@@ -655,8 +671,10 @@ describe('Form WebMCP staged-edit intent', () => {
655
671
  interactionRegistry: registry,
656
672
  },
657
673
  });
674
+ const _regLenBefore = registered.length;
658
675
  await tick();
659
676
  await tick();
677
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
660
678
  expect(await registered.at(-1)?.execute({ notes: 'Proposed' })).toBe('Staged 1 change for review');
661
679
  const notes = registry
662
680
  .list()
@@ -692,8 +710,10 @@ describe('Form WebMCP staged-edit intent', () => {
692
710
  onmeasurementchange: measurementChanged,
693
711
  },
694
712
  });
713
+ const _regLenBefore = registered.length;
695
714
  await tick();
696
715
  await tick();
716
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
697
717
  expect(await registered.at(-1)?.execute({
698
718
  measurement: { unit: 'ft', value: 12 },
699
719
  })).toBe('Staged 1 change for review');
@@ -730,8 +750,10 @@ describe('Form WebMCP staged-edit intent', () => {
730
750
  interactionRegistry: registry,
731
751
  },
732
752
  });
753
+ const _regLenBefore = registered.length;
733
754
  await tick();
734
755
  await tick();
756
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
735
757
  expect(await registered.at(-1)?.execute({
736
758
  phone: 'five five five one two three four five six seven',
737
759
  })).toBe('Staged 1 change for review');
@@ -787,8 +809,10 @@ describe('Form WebMCP staged-edit intent', () => {
787
809
  interactionRegistry: registry,
788
810
  },
789
811
  });
812
+ const _regLenBefore = registered.length;
790
813
  await tick();
791
814
  await tick();
815
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
792
816
  const staging = registered.at(-1)?.execute({ notes: 'Proposed' });
793
817
  await policyStartedPromise;
794
818
  await userEvent.type(screen.getByRole('textbox', { name: 'Notes' }), ' human');
@@ -845,8 +869,10 @@ describe('Form WebMCP staged-edit intent', () => {
845
869
  interactionRegistry: registry,
846
870
  },
847
871
  });
872
+ const _regLenBefore = registered.length;
848
873
  await tick();
849
874
  await tick();
875
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
850
876
  const staging = registered.at(-1)?.execute({
851
877
  address: { street: '123 Main Street' },
852
878
  });
@@ -1070,8 +1096,10 @@ describe('Form WebMCP staged-edit intent', () => {
1070
1096
  onsubmit,
1071
1097
  },
1072
1098
  });
1099
+ const _regLenBefore = registered.length;
1073
1100
  await tick();
1074
1101
  await tick();
1102
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1075
1103
  expect(registered).toHaveLength(1);
1076
1104
  const schema = registered[0].inputSchema;
1077
1105
  expect(schema.required).toEqual(['fullname', 'age']);
@@ -1095,8 +1123,10 @@ describe('Form WebMCP staged-edit intent', () => {
1095
1123
  const view = render(FormWithFields, {
1096
1124
  props: { webmcp: true, textDisabled: false, showAge: false },
1097
1125
  });
1126
+ let _regLenBefore = registered.length;
1098
1127
  await tick();
1099
1128
  await tick();
1129
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1100
1130
  expect(registered.at(-1)?.inputSchema).toMatchObject({
1101
1131
  properties: { fullname: { type: 'string' } },
1102
1132
  });
@@ -1105,8 +1135,10 @@ describe('Form WebMCP staged-edit intent', () => {
1105
1135
  textDisabled: true,
1106
1136
  showAge: false,
1107
1137
  });
1138
+ _regLenBefore = registered.length;
1108
1139
  await tick();
1109
1140
  await tick();
1141
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1110
1142
  const tool = registered.at(-1);
1111
1143
  expect(tool?.inputSchema).toMatchObject({ properties: {} });
1112
1144
  expect(await tool?.execute({ fullname: 'Ada Lovelace' })).toBe('No reviewable changes provided');
@@ -1122,8 +1154,10 @@ describe('Form WebMCP staged-edit intent', () => {
1122
1154
  render(FormWithFields, {
1123
1155
  props: { webmcp: true, showAge: false },
1124
1156
  });
1157
+ const _regLenBefore = registered.length;
1125
1158
  await tick();
1126
1159
  await tick();
1160
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1127
1161
  const input = screen.getByRole('textbox', { name: 'Full name' });
1128
1162
  expect(registered.at(-1)?.inputSchema).toMatchObject({
1129
1163
  properties: { fullname: expect.any(Object) },
@@ -1157,8 +1191,10 @@ describe('Form WebMCP staged-edit intent', () => {
1157
1191
  showAge: false,
1158
1192
  },
1159
1193
  });
1194
+ const _regLenBefore = registered.length;
1160
1195
  await tick();
1161
1196
  await tick();
1197
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1162
1198
  const tool = registered.at(-1);
1163
1199
  expect(tool?.inputSchema).toMatchObject({ properties: {} });
1164
1200
  expect(await tool?.execute({ fullname: 'Ada Lovelace' })).toBe('No reviewable changes provided');
@@ -1207,8 +1243,10 @@ describe('Form WebMCP staged-edit intent', () => {
1207
1243
  formSubject: { type: 'person', id: 'person-1' },
1208
1244
  },
1209
1245
  });
1246
+ let _regLenBefore = registered.length;
1210
1247
  await tick();
1211
1248
  await tick();
1249
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1212
1250
  expect(await registered.at(-1)?.execute({ fullname: 'Ada' })).toBe('Staged 1 change for review');
1213
1251
  const fullname = screen.getByRole('textbox', { name: 'Full name' });
1214
1252
  expect(fullname).toHaveAttribute('data-smrt-subject-type', 'person');
@@ -1219,8 +1257,10 @@ describe('Form WebMCP staged-edit intent', () => {
1219
1257
  showAge: false,
1220
1258
  formSubject: { type: 'person', id: 'person-2' },
1221
1259
  });
1260
+ _regLenBefore = registered.length;
1222
1261
  await tick();
1223
1262
  await tick();
1263
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1224
1264
  expect(await registered.at(-1)?.execute({ fullname: 'Grace' })).toBe('Staged 1 change for review');
1225
1265
  expect(fullname).toHaveAttribute('data-smrt-subject-id', 'person-2');
1226
1266
  expect(await screen.findByText(/person:person-2/)).toBeInTheDocument();
@@ -1250,8 +1290,10 @@ describe('Form WebMCP staged-edit intent', () => {
1250
1290
  interactionRegistry: registry,
1251
1291
  },
1252
1292
  });
1293
+ const _regLenBefore = registered.length;
1253
1294
  await tick();
1254
1295
  await tick();
1296
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1255
1297
  expect(registered.at(-1)?.inputSchema).toMatchObject({
1256
1298
  properties: {
1257
1299
  budget: {
@@ -1299,8 +1341,10 @@ describe('Form WebMCP staged-edit intent', () => {
1299
1341
  };
1300
1342
  const onsubmit = vi.fn();
1301
1343
  render(FormWithStructuredFields, { props: { webmcp: true, onsubmit } });
1344
+ const _regLenBefore = registered.length;
1302
1345
  await tick();
1303
1346
  await tick();
1347
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1304
1348
  expect(registered).toHaveLength(1);
1305
1349
  const schema = registered[0].inputSchema;
1306
1350
  expect(schema.required).toEqual(['measurement', 'dates', 'address']);
@@ -1370,19 +1414,43 @@ describe('Form WebMCP staged-edit intent', () => {
1370
1414
  onaddresschange: addressChanged,
1371
1415
  },
1372
1416
  });
1417
+ const _regLenBefore = registered.length;
1373
1418
  await tick();
1374
1419
  await tick();
1420
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1375
1421
  const addressProperties = () => {
1376
1422
  const tool = registered.at(-1);
1377
1423
  if (!tool)
1378
1424
  throw new Error('WebMCP tool was not registered');
1379
1425
  return tool.inputSchema.properties.address.properties;
1380
1426
  };
1427
+ // `registered.at(-1)` is a snapshot: a registry-driven side effect from
1428
+ // an earlier step in this test (e.g. an "apply" attempt) can retrigger
1429
+ // the reactive tool spec and replace that snapshot before `.execute()`
1430
+ // runs against it. Retry against whatever is current rather than
1431
+ // asserting the specific instance stays live for the whole test.
1432
+ const executeLive = async (args) => {
1433
+ for (let attempt = 0;; attempt += 1) {
1434
+ const tool = registered.at(-1);
1435
+ if (!tool)
1436
+ throw new Error('WebMCP tool was not registered');
1437
+ try {
1438
+ return await tool.execute(args);
1439
+ }
1440
+ catch (error) {
1441
+ const stale = error instanceof Error &&
1442
+ error.message.includes('is no longer registered');
1443
+ if (!stale || attempt >= 9)
1444
+ throw error;
1445
+ await tick();
1446
+ }
1447
+ }
1448
+ };
1381
1449
  expect(addressProperties()).toEqual({
1382
1450
  province: { type: 'string', enum: ['', 'AB'] },
1383
1451
  country: { type: 'string', enum: ['CA'] },
1384
1452
  });
1385
- await registered.at(-1)?.execute({
1453
+ await executeLive({
1386
1454
  address: { province: 'AB', country: 'CA' },
1387
1455
  });
1388
1456
  const identity = { formId: 'structured-fields', controlId: 'address' };
@@ -1398,9 +1466,16 @@ describe('Form WebMCP staged-edit intent', () => {
1398
1466
  });
1399
1467
  await tick();
1400
1468
  await tick();
1401
- expect(addressProperties()).toEqual({
1402
- province: { type: 'string', enum: ['', 'IDF'] },
1403
- country: { type: 'string', enum: ['FR'] },
1469
+ // A prop change here can drive the reactive tool spec through more than
1470
+ // one intermediate registration before it settles (address option
1471
+ // registries can update in a separate tick from the rerender itself), so
1472
+ // waiting only for `registered.length` to grow can observe a
1473
+ // soon-to-be-superseded entry. Poll the actual settled schema instead.
1474
+ await vi.waitFor(() => {
1475
+ expect(addressProperties()).toEqual({
1476
+ province: { type: 'string', enum: ['', 'IDF'] },
1477
+ country: { type: 'string', enum: ['FR'] },
1478
+ });
1404
1479
  });
1405
1480
  expect(await dispatchLocalGesture((event) => executeLocalControlCommand(registry, {
1406
1481
  action: 'apply',
@@ -1408,7 +1483,7 @@ describe('Form WebMCP staged-edit intent', () => {
1408
1483
  revision: registry.get(identity)?.state.staged?.revision,
1409
1484
  }, event))).toMatchObject({ ok: false });
1410
1485
  expect(addressChanged).not.toHaveBeenCalled();
1411
- await registered.at(-1)?.execute({
1486
+ await executeLive({
1412
1487
  address: { province: 'IDF', country: 'FR' },
1413
1488
  });
1414
1489
  expect(registry.get(identity)?.state.staged).toMatchObject({ valid: true });
@@ -1421,7 +1496,7 @@ describe('Form WebMCP staged-edit intent', () => {
1421
1496
  province: 'IDF',
1422
1497
  country: 'FR',
1423
1498
  });
1424
- await registered.at(-1)?.execute({
1499
+ await executeLive({
1425
1500
  address: { province: 'XX', country: 'FR' },
1426
1501
  });
1427
1502
  expect(registry.get(identity)?.state.staged).toMatchObject({
@@ -1445,8 +1520,10 @@ describe('Form WebMCP staged-edit intent', () => {
1445
1520
  interactionRegistry: registry,
1446
1521
  },
1447
1522
  });
1523
+ let _regLenBefore = registered.length;
1448
1524
  await tick();
1449
1525
  await tick();
1526
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1450
1527
  const valueSchema = () => {
1451
1528
  const tool = registered.at(-1);
1452
1529
  if (!tool)
@@ -1477,8 +1554,10 @@ describe('Form WebMCP staged-edit intent', () => {
1477
1554
  measurementStep: 2,
1478
1555
  interactionRegistry: registry,
1479
1556
  });
1557
+ _regLenBefore = registered.length;
1480
1558
  await tick();
1481
1559
  await tick();
1560
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1482
1561
  expect(valueSchema()).toMatchObject({
1483
1562
  type: 'number',
1484
1563
  minimum: 2,
@@ -1503,8 +1582,10 @@ describe('Form WebMCP staged-edit intent', () => {
1503
1582
  interactionRegistry: legacyRegistry,
1504
1583
  },
1505
1584
  });
1585
+ const _regLenBefore = registered.length;
1506
1586
  await tick();
1507
1587
  await tick();
1588
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1508
1589
  expect(await registered.at(-1)?.execute({ fullname: 'Ada' })).toBe('Staged 1 change for review');
1509
1590
  expect(legacyRegistry.list()[0]?.state.staged?.value).toBe('Ada');
1510
1591
  await userEvent.click(screen.getByRole('button', { name: 'Apply Full name' }));
@@ -1528,8 +1609,10 @@ describe('Form WebMCP staged-edit intent', () => {
1528
1609
  interactionRegistry: registry,
1529
1610
  },
1530
1611
  });
1612
+ const _regLenBefore = registered.length;
1531
1613
  await tick();
1532
1614
  await tick();
1615
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1533
1616
  expect(registered).toHaveLength(1);
1534
1617
  const schema = registered[0].inputSchema;
1535
1618
  expect(schema.properties.address).toMatchObject({
@@ -1573,8 +1656,10 @@ describe('Form WebMCP staged-edit intent', () => {
1573
1656
  interactionRegistry: registry,
1574
1657
  },
1575
1658
  });
1659
+ let _regLenBefore = registered.length;
1576
1660
  await tick();
1577
1661
  await tick();
1662
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1578
1663
  await view.rerender({
1579
1664
  webmcp: true,
1580
1665
  addressFields: ['country'],
@@ -1584,8 +1669,10 @@ describe('Form WebMCP staged-edit intent', () => {
1584
1669
  measurementMax: 200,
1585
1670
  interactionRegistry: registry,
1586
1671
  });
1672
+ _regLenBefore = registered.length;
1587
1673
  await tick();
1588
1674
  await tick();
1675
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1589
1676
  const schema = registered.at(-1)?.inputSchema;
1590
1677
  expect(schema.properties.address.properties).toEqual({
1591
1678
  country: { type: 'string', enum: ['CA', 'US'] },
@@ -1622,16 +1709,20 @@ describe('Form WebMCP staged-edit intent', () => {
1622
1709
  textRequired: false,
1623
1710
  },
1624
1711
  });
1712
+ let _regLenBefore = registered.length;
1625
1713
  await tick();
1626
1714
  await tick();
1715
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1627
1716
  await view.rerender({
1628
1717
  webmcp: true,
1629
1718
  ageLabel: 'Maximum age',
1630
1719
  ageMax: 100,
1631
1720
  textRequired: true,
1632
1721
  });
1722
+ _regLenBefore = registered.length;
1633
1723
  await tick();
1634
1724
  await tick();
1725
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1635
1726
  const schema = registered.at(-1)?.inputSchema;
1636
1727
  expect(schema.required).toContain('fullname');
1637
1728
  expect(schema.properties.age).toMatchObject({
@@ -1653,8 +1744,10 @@ describe('Form WebMCP staged-edit intent', () => {
1653
1744
  const view = render(FormWithPolicyField, {
1654
1745
  props: { webmcp: true, interactionRegistry: registry },
1655
1746
  });
1747
+ let _regLenBefore = registered.length;
1656
1748
  await tick();
1657
1749
  await tick();
1750
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1658
1751
  expect(await registered.at(-1)?.execute({ policy: 'Grace' })).toBe('Staged 1 change for review');
1659
1752
  const revision = registry.get({
1660
1753
  formId: 'policy-form',
@@ -1667,8 +1760,10 @@ describe('Form WebMCP staged-edit intent', () => {
1667
1760
  sensitivity: 'secret',
1668
1761
  writable: false,
1669
1762
  });
1763
+ _regLenBefore = registered.length;
1670
1764
  await tick();
1671
1765
  await tick();
1766
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1672
1767
  expect(registered.at(-1)?.inputSchema).toMatchObject({ properties: {} });
1673
1768
  const snapshot = registry.get({
1674
1769
  formId: 'policy-form',
@@ -1696,8 +1791,10 @@ describe('Form WebMCP staged-edit intent', () => {
1696
1791
  sensitivity: 'public',
1697
1792
  writable: true,
1698
1793
  });
1794
+ _regLenBefore = registered.length;
1699
1795
  await tick();
1700
1796
  await tick();
1797
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1701
1798
  expect(registry.get({ formId: 'policy-form', controlId: 'policy' })?.state).not.toHaveProperty('staged');
1702
1799
  });
1703
1800
  it('allows partial payloads for optional structured fields', async () => {
@@ -1719,8 +1816,10 @@ describe('Form WebMCP staged-edit intent', () => {
1719
1816
  interactionRegistry: registry,
1720
1817
  },
1721
1818
  });
1819
+ const _regLenBefore = registered.length;
1722
1820
  await tick();
1723
1821
  await tick();
1822
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1724
1823
  expect(registered).toHaveLength(1);
1725
1824
  const schema = registered[0].inputSchema;
1726
1825
  expect(schema.properties.measurement).not.toHaveProperty('required');
@@ -1775,8 +1874,10 @@ describe('Form WebMCP staged-edit intent', () => {
1775
1874
  render(FormWithStructuredFields, {
1776
1875
  props: { webmcp: true, fieldsetDisabled: true },
1777
1876
  });
1877
+ const _regLenBefore = registered.length;
1778
1878
  await tick();
1779
1879
  await tick();
1880
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1780
1881
  const tool = registered.at(-1);
1781
1882
  expect(tool?.inputSchema).toMatchObject({ properties: {} });
1782
1883
  expect(await tool?.execute({ address: { city: 'Edmonton' } })).toBe('No reviewable changes provided');
@@ -1824,8 +1925,10 @@ describe('Form WebMCP staged-edit intent', () => {
1824
1925
  showCollidingSibling: true,
1825
1926
  },
1826
1927
  });
1928
+ const _regLenBefore = registered.length;
1827
1929
  await tick();
1828
1930
  await tick();
1931
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1829
1932
  expect(registered.at(-1)?.inputSchema).toMatchObject({ properties: {} });
1830
1933
  expect(await registered.at(-1)?.execute({ user: { value: 2, unit: 'm' } })).toBe('No reviewable changes provided');
1831
1934
  });
@@ -1847,8 +1950,10 @@ describe('Form WebMCP staged-edit intent', () => {
1847
1950
  interactionRegistry: registry,
1848
1951
  },
1849
1952
  });
1953
+ const _regLenBefore = registered.length;
1850
1954
  await tick();
1851
1955
  await tick();
1956
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
1852
1957
  const tool = registered.at(-1);
1853
1958
  if (!tool)
1854
1959
  throw new Error('WebMCP tool was not registered');
@@ -2209,14 +2314,18 @@ describe('Form WebMCP staged-edit intent', () => {
2209
2314
  const view = render(FormWithStructuredFields, {
2210
2315
  props: { webmcp: true },
2211
2316
  });
2317
+ let _regLenBefore = registered.length;
2212
2318
  await tick();
2213
2319
  await tick();
2320
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
2214
2321
  expect(registered.at(-1)?.inputSchema).toMatchObject({
2215
2322
  properties: { dates: expect.any(Object) },
2216
2323
  });
2217
2324
  await view.rerender({ webmcp: true, fieldsetDisabled: true });
2325
+ _regLenBefore = registered.length;
2218
2326
  await tick();
2219
2327
  await tick();
2328
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(_regLenBefore));
2220
2329
  expect(registered.at(-1)?.inputSchema).toMatchObject({ properties: {} });
2221
2330
  expect(await registered.at(-1)?.execute({
2222
2331
  dates: { startDate: '2026-08-26', endDate: '2026-08-27' },
@@ -7,14 +7,23 @@ import { M } from '../../i18n/strings.settings.js';
7
7
  import type { SettingsCatalogItem, SettingsCatalogPage } from './types.js';
8
8
 
9
9
  interface Props<T extends SettingsCatalogItem, D extends { id: string }> {
10
+ /** Paginated catalog data with items, current page, and totals. */
10
11
  page: SettingsCatalogPage<T, D>;
12
+ /** Base URL for navigation and search links. */
11
13
  baseUrl: string;
14
+ /** Render snippet for the detail pane, receives the selected item. */
12
15
  detail: Snippet<[{ item: D }]>;
16
+ /** Placeholder text for the search input field. */
13
17
  searchPlaceholder?: string;
18
+ /** Label for the search input field. */
14
19
  searchLabel?: string;
20
+ /** Label for the results list navigation. */
15
21
  resultsLabel?: string;
22
+ /** Text shown when there are no search results. */
16
23
  emptyLabel?: string;
24
+ /** Text shown when no item is selected. */
17
25
  selectionLabel?: string;
26
+ /** URL search parameters to preserve across pagination. */
18
27
  preservedParams?: Record<string, string>;
19
28
  }
20
29
 
@@ -3,16 +3,25 @@ import type { SettingsCatalogItem, SettingsCatalogPage } from './types.js';
3
3
  interface Props<T extends SettingsCatalogItem, D extends {
4
4
  id: string;
5
5
  }> {
6
+ /** Paginated catalog data with items, current page, and totals. */
6
7
  page: SettingsCatalogPage<T, D>;
8
+ /** Base URL for navigation and search links. */
7
9
  baseUrl: string;
10
+ /** Render snippet for the detail pane, receives the selected item. */
8
11
  detail: Snippet<[{
9
12
  item: D;
10
13
  }]>;
14
+ /** Placeholder text for the search input field. */
11
15
  searchPlaceholder?: string;
16
+ /** Label for the search input field. */
12
17
  searchLabel?: string;
18
+ /** Label for the results list navigation. */
13
19
  resultsLabel?: string;
20
+ /** Text shown when there are no search results. */
14
21
  emptyLabel?: string;
22
+ /** Text shown when no item is selected. */
15
23
  selectionLabel?: string;
24
+ /** URL search parameters to preserve across pagination. */
16
25
  preservedParams?: Record<string, string>;
17
26
  }
18
27
  declare function $$render<T extends SettingsCatalogItem, D extends {
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsCatalog.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/settings/SettingsCatalog.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsCatalog.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/settings/SettingsCatalog.svelte.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ import { useAdminShell } from './context.js';
4
4
  import type { PanelEdge } from './types.js';
5
5
 
6
6
  interface Props {
7
+ /** Which panel edge to fetch activity status from. */
7
8
  edge: PanelEdge;
9
+ /** Accessibility label for the activity badge. */
8
10
  label?: string;
9
11
  }
10
12
 
@@ -1,6 +1,8 @@
1
1
  import type { PanelEdge } from './types.js';
2
2
  interface Props {
3
+ /** Which panel edge to fetch activity status from. */
3
4
  edge: PanelEdge;
5
+ /** Accessibility label for the activity badge. */
4
6
  label?: string;
5
7
  }
6
8
  declare const ActivityBadge: import("svelte").Component<Props, {}, "">;
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityBadge.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityBadge.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ActivityBadge.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityBadge.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,UAAU,KAAK;IACb,sDAAsD;IACtD,IAAI,EAAE,SAAS,CAAC;IAChB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -5,6 +5,7 @@ import { M } from '../../../i18n/strings.workspace.js';
5
5
  import type { ShellActivity } from './types.js';
6
6
 
7
7
  interface Props {
8
+ /** Activity object with status, label, message, progress, and cancel handler. */
8
9
  activity: ShellActivity;
9
10
  }
10
11
 
@@ -1,5 +1,6 @@
1
1
  import type { ShellActivity } from './types.js';
2
2
  interface Props {
3
+ /** Activity object with status, label, message, progress, and cancel handler. */
3
4
  activity: ShellActivity;
4
5
  }
5
6
  declare const ActivityItem: import("svelte").Component<Props, {}, "">;
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityItem.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityItem.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,UAAU,KAAK;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AA2CD,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ActivityItem.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityItem.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,UAAU,KAAK;IACb,iFAAiF;IACjF,QAAQ,EAAE,aAAa,CAAC;CACzB;AA2CD,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -6,8 +6,11 @@ import { useAdminShell } from './context.js';
6
6
  import type { ShellActivityFilter } from './types.js';
7
7
 
8
8
  interface Props {
9
+ /** Criteria to filter activities. */
9
10
  filter?: ShellActivityFilter;
11
+ /** Hide the list entirely when no activities match the filter. */
10
12
  hideWhenEmpty?: boolean;
13
+ /** Text shown when no activities are available. */
11
14
  emptyLabel?: string;
12
15
  }
13
16
 
@@ -1,7 +1,10 @@
1
1
  import type { ShellActivityFilter } from './types.js';
2
2
  interface Props {
3
+ /** Criteria to filter activities. */
3
4
  filter?: ShellActivityFilter;
5
+ /** Hide the list entirely when no activities match the filter. */
4
6
  hideWhenEmpty?: boolean;
7
+ /** Text shown when no activities are available. */
5
8
  emptyLabel?: string;
6
9
  }
7
10
  declare const ActivityList: import("svelte").Component<Props, {}, "">;
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityList.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+BD,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ActivityList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ActivityList.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,UAAU,KAAK;IACb,qCAAqC;IACrC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+BD,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -13,6 +13,7 @@ interface Toast {
13
13
  }
14
14
 
15
15
  interface Props {
16
+ /** Maximum number of simultaneous activity toasts to display. */
16
17
  max?: number;
17
18
  /**
18
19
  * Which lifecycle events raise a toast. Defaults to lifecycle-only:
@@ -1,5 +1,6 @@
1
1
  import type { ShellActivityEvent } from './types.js';
2
2
  interface Props {
3
+ /** Maximum number of simultaneous activity toasts to display. */
3
4
  max?: number;
4
5
  /**
5
6
  * Which lifecycle events raise a toast. Defaults to lifecycle-only: