create-spatius-app 0.1.2 → 0.1.3-beta.1

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 (52) hide show
  1. package/README.md +17 -6
  2. package/dist/cli.js +721 -143
  3. package/dist/templates.js +612 -66
  4. package/package.json +4 -4
  5. package/schemas/result-v3.schema.json +6 -2
  6. package/schemas/result-v4.schema.json +170 -0
  7. package/templates/cloudflare-livekit/agent/env.example +3 -0
  8. package/templates/cloudflare-livekit/agent/src/agent.py +5 -3
  9. package/templates/cloudflare-livekit/package-lock.json +70 -142
  10. package/templates/cloudflare-livekit/package.json +1 -1
  11. package/templates/cloudflare-livekit/pnpm-lock.yaml +96 -153
  12. package/templates/cloudflare-livekit/tests/dev-events.test.mjs +23 -0
  13. package/templates/cloudflare-livekit/tests/dev-fixtures.mjs +7 -3
  14. package/templates/cloudflare-livekit/tsconfig.web.json +1 -0
  15. package/templates/cloudflare-livekit/tsconfig.worker.json +1 -0
  16. package/templates/cloudflare-livekit/web/api.ts +12 -0
  17. package/templates/cloudflare-livekit/web/components/agents-ui/agent-chat-transcript.tsx +6 -90
  18. package/templates/cloudflare-livekit/web/components/transcript-view.tsx +90 -0
  19. package/templates/cloudflare-livekit/web/session-attempt.ts +23 -2
  20. package/templates/cloudflare-livekit/worker/capability.test.ts +31 -0
  21. package/templates/cloudflare-livekit/worker/capability.ts +72 -0
  22. package/templates/cloudflare-livekit/worker/index.test.ts +2 -2
  23. package/templates/cloudflare-livekit/worker/index.ts +15 -3
  24. package/templates/cloudflare-livekit/worker/session.ts +34 -0
  25. package/templates/layers/agora/AGENTS.md +8 -0
  26. package/templates/layers/agora/README.md +19 -0
  27. package/templates/layers/agora/env.example +9 -0
  28. package/templates/layers/agora/package-lock.json +6068 -0
  29. package/templates/layers/agora/package.json +54 -0
  30. package/templates/layers/agora/pnpm-lock.yaml +3816 -0
  31. package/templates/layers/agora/tsconfig.json +16 -0
  32. package/templates/layers/agora/vitest.config.ts +4 -0
  33. package/templates/layers/agora/web/App.tsx +174 -0
  34. package/templates/layers/agora/web/agora-session.test.ts +70 -0
  35. package/templates/layers/agora/web/agora-session.ts +267 -0
  36. package/templates/layers/agora/worker/agora.test.ts +60 -0
  37. package/templates/layers/agora/worker/agora.ts +165 -0
  38. package/templates/layers/agora/worker/index.ts +50 -0
  39. package/templates/layers/catalog/DEPLOYMENT.md +3 -0
  40. package/templates/layers/catalog/spatius.config.json +1 -0
  41. package/templates/layers/node/Dockerfile +12 -0
  42. package/templates/layers/node/dockerignore +10 -0
  43. package/templates/layers/node/package-lock.json +5569 -0
  44. package/templates/layers/node/pnpm-lock.yaml +3470 -0
  45. package/templates/layers/node/railway.json +8 -0
  46. package/templates/layers/node/scripts/dev-service.mjs +14 -0
  47. package/templates/layers/node/scripts/dev-web.mjs +22 -0
  48. package/templates/layers/node/server/index.ts +92 -0
  49. package/templates/layers/node/vite.config.ts +17 -0
  50. package/templates/layers/railway-agent/agent/railway.json +5 -0
  51. package/dist/cli.js.map +0 -1
  52. package/dist/templates.js.map +0 -1
@@ -139,7 +139,7 @@ importers:
139
139
  version: 1.54.4(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))(wrangler@4.129.0)
140
140
  '@eslint/js':
141
141
  specifier: 10.0.1
142
- version: 10.0.1(eslint@10.10.0(jiti@2.7.0))
142
+ version: 10.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))
143
143
  '@playwright/test':
144
144
  specifier: 1.63.0
145
145
  version: 1.63.0
@@ -178,16 +178,16 @@ importers:
178
178
  version: 10.0.5
179
179
  eslint:
180
180
  specifier: 10.10.0
181
- version: 10.10.0(jiti@2.7.0)
181
+ version: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
182
182
  eslint-config-prettier:
183
183
  specifier: 10.1.8
184
- version: 10.1.8(eslint@10.10.0(jiti@2.7.0))
184
+ version: 10.1.8(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))
185
185
  globals:
186
186
  specifier: 17.12.0
187
187
  version: 17.12.0
188
188
  jsdom:
189
189
  specifier: 26.1.0
190
- version: 26.1.0
190
+ version: 26.1.0(supports-color@10.2.2)
191
191
  prettier:
192
192
  specifier: 3.9.6
193
193
  version: 3.9.6
@@ -199,13 +199,13 @@ importers:
199
199
  version: 6.0.3
200
200
  typescript-eslint:
201
201
  specifier: 8.69.0
202
- version: 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
202
+ version: 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
203
203
  vite:
204
204
  specifier: 8.2.2
205
205
  version: 8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)
206
206
  vitest:
207
- specifier: 4.1.11
208
- version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@26.1.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))
207
+ specifier: 5.0.0
208
+ version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@26.1.0(supports-color@10.2.2))(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))
209
209
  wrangler:
210
210
  specifier: 4.129.0
211
211
  version: 4.129.0
@@ -1016,9 +1016,6 @@ packages:
1016
1016
  '@speed-highlight/core@1.2.24':
1017
1017
  resolution: {integrity: sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==}
1018
1018
 
1019
- '@standard-schema/spec@1.1.0':
1020
- resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
1021
-
1022
1019
  '@tailwindcss/node@4.3.3':
1023
1020
  resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
1024
1021
 
@@ -1248,11 +1245,8 @@ packages:
1248
1245
  oxc-transform-react:
1249
1246
  optional: true
1250
1247
 
1251
- '@vitest/expect@4.1.11':
1252
- resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==}
1253
-
1254
- '@vitest/mocker@4.1.11':
1255
- resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==}
1248
+ '@vitest/mocker@5.0.0':
1249
+ resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==}
1256
1250
  peerDependencies:
1257
1251
  msw: ^2.4.9
1258
1252
  vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -1262,20 +1256,8 @@ packages:
1262
1256
  vite:
1263
1257
  optional: true
1264
1258
 
1265
- '@vitest/pretty-format@4.1.11':
1266
- resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==}
1267
-
1268
- '@vitest/runner@4.1.11':
1269
- resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==}
1270
-
1271
- '@vitest/snapshot@4.1.11':
1272
- resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==}
1273
-
1274
- '@vitest/spy@4.1.11':
1275
- resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==}
1276
-
1277
- '@vitest/utils@4.1.11':
1278
- resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==}
1259
+ '@vitest/spy@5.0.0':
1260
+ resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==}
1279
1261
 
1280
1262
  '@webgpu/types@0.1.72':
1281
1263
  resolution: {integrity: sha512-0cF7RFM2edNoiIS1ODJp0/Gzv4/xSXhwoR0YCza+OWpJWtn4wmo9DvK91aLlH9+uUnwIriP7ZiC3WitmyhuzBw==}
@@ -1355,9 +1337,6 @@ packages:
1355
1337
  engines: {node: '>=22'}
1356
1338
  hasBin: true
1357
1339
 
1358
- convert-source-map@2.0.0:
1359
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
1360
-
1361
1340
  cookie@1.1.1:
1362
1341
  resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
1363
1342
  engines: {node: '>=18'}
@@ -1836,6 +1815,9 @@ packages:
1836
1815
  magic-string@0.30.21:
1837
1816
  resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
1838
1817
 
1818
+ magic-string@1.2.3:
1819
+ resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==}
1820
+
1839
1821
  miniflare@5.20260903.0-alpha:
1840
1822
  resolution: {integrity: sha512-VCZIFxOqFXeibRBJWwTlppqbv2lkeO10IX3QBRGK9j1QiMAfH/OSsCvbjp1MslBMhVZmy2VTRlVaVnsKnbDp6A==}
1841
1823
  engines: {node: '>=22.0.0'}
@@ -2062,8 +2044,9 @@ packages:
2062
2044
  resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
2063
2045
  engines: {node: '>=6'}
2064
2046
 
2065
- tinybench@2.9.0:
2066
- resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
2047
+ tinybench@6.1.4:
2048
+ resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==}
2049
+ engines: {node: '>=20.0.0'}
2067
2050
 
2068
2051
  tinyexec@1.3.0:
2069
2052
  resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
@@ -2073,10 +2056,6 @@ packages:
2073
2056
  resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
2074
2057
  engines: {node: '>=12.0.0'}
2075
2058
 
2076
- tinyrainbow@3.1.1:
2077
- resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==}
2078
- engines: {node: '>=14.0.0'}
2079
-
2080
2059
  tldts-core@6.1.86:
2081
2060
  resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
2082
2061
 
@@ -2186,23 +2165,23 @@ packages:
2186
2165
  yaml:
2187
2166
  optional: true
2188
2167
 
2189
- vitest@4.1.11:
2190
- resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==}
2191
- engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
2168
+ vitest@5.0.0:
2169
+ resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==}
2170
+ engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0}
2192
2171
  hasBin: true
2193
2172
  peerDependencies:
2194
2173
  '@edge-runtime/vm': '*'
2195
2174
  '@opentelemetry/api': ^1.9.0
2196
- '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
2197
- '@vitest/browser-playwright': 4.1.11
2198
- '@vitest/browser-preview': 4.1.11
2199
- '@vitest/browser-webdriverio': 4.1.11
2200
- '@vitest/coverage-istanbul': 4.1.11
2201
- '@vitest/coverage-v8': 4.1.11
2202
- '@vitest/ui': 4.1.11
2175
+ '@types/node': ^22.0.0 || >=24.0.0
2176
+ '@vitest/browser-playwright': 5.0.0
2177
+ '@vitest/browser-preview': 5.0.0
2178
+ '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0
2179
+ '@vitest/coverage-istanbul': 5.0.0
2180
+ '@vitest/coverage-v8': 5.0.0
2181
+ '@vitest/ui': 5.0.0
2203
2182
  happy-dom: '*'
2204
2183
  jsdom: '*'
2205
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
2184
+ vite: ^6.4.0 || ^7.0.0 || ^8.0.0
2206
2185
  peerDependenciesMeta:
2207
2186
  '@edge-runtime/vm':
2208
2187
  optional: true
@@ -2508,17 +2487,17 @@ snapshots:
2508
2487
  '@esbuild/win32-x64@0.28.1':
2509
2488
  optional: true
2510
2489
 
2511
- '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0))':
2490
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))':
2512
2491
  dependencies:
2513
- eslint: 10.10.0(jiti@2.7.0)
2492
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
2514
2493
  eslint-visitor-keys: 3.4.3
2515
2494
 
2516
2495
  '@eslint-community/regexpp@4.12.2': {}
2517
2496
 
2518
- '@eslint/config-array@0.23.5':
2497
+ '@eslint/config-array@0.23.5(supports-color@10.2.2)':
2519
2498
  dependencies:
2520
2499
  '@eslint/object-schema': 3.0.5
2521
- debug: 4.4.3
2500
+ debug: 4.4.3(supports-color@10.2.2)
2522
2501
  minimatch: 10.2.6
2523
2502
  transitivePeerDependencies:
2524
2503
  - supports-color
@@ -2531,9 +2510,9 @@ snapshots:
2531
2510
  dependencies:
2532
2511
  '@types/json-schema': 7.0.15
2533
2512
 
2534
- '@eslint/js@10.0.1(eslint@10.10.0(jiti@2.7.0))':
2513
+ '@eslint/js@10.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))':
2535
2514
  optionalDependencies:
2536
- eslint: 10.10.0(jiti@2.7.0)
2515
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
2537
2516
 
2538
2517
  '@eslint/object-schema@3.0.5': {}
2539
2518
 
@@ -2956,8 +2935,6 @@ snapshots:
2956
2935
 
2957
2936
  '@speed-highlight/core@1.2.24': {}
2958
2937
 
2959
- '@standard-schema/spec@1.1.0': {}
2960
-
2961
2938
  '@tailwindcss/node@4.3.3':
2962
2939
  dependencies:
2963
2940
  '@jridgewell/remapping': 2.3.5
@@ -3083,15 +3060,15 @@ snapshots:
3083
3060
  '@types/trusted-types@2.0.7':
3084
3061
  optional: true
3085
3062
 
3086
- '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)':
3063
+ '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
3087
3064
  dependencies:
3088
3065
  '@eslint-community/regexpp': 4.12.2
3089
- '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
3066
+ '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3090
3067
  '@typescript-eslint/scope-manager': 8.69.0
3091
- '@typescript-eslint/type-utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
3092
- '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
3068
+ '@typescript-eslint/type-utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3069
+ '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3093
3070
  '@typescript-eslint/visitor-keys': 8.69.0
3094
- eslint: 10.10.0(jiti@2.7.0)
3071
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
3095
3072
  ignore: 7.0.8
3096
3073
  natural-compare: 1.4.0
3097
3074
  ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -3099,23 +3076,23 @@ snapshots:
3099
3076
  transitivePeerDependencies:
3100
3077
  - supports-color
3101
3078
 
3102
- '@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)':
3079
+ '@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
3103
3080
  dependencies:
3104
3081
  '@typescript-eslint/scope-manager': 8.69.0
3105
3082
  '@typescript-eslint/types': 8.69.0
3106
- '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3)
3083
+ '@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
3107
3084
  '@typescript-eslint/visitor-keys': 8.69.0
3108
- debug: 4.4.3
3109
- eslint: 10.10.0(jiti@2.7.0)
3085
+ debug: 4.4.3(supports-color@10.2.2)
3086
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
3110
3087
  typescript: 6.0.3
3111
3088
  transitivePeerDependencies:
3112
3089
  - supports-color
3113
3090
 
3114
- '@typescript-eslint/project-service@8.69.0(typescript@6.0.3)':
3091
+ '@typescript-eslint/project-service@8.69.0(supports-color@10.2.2)(typescript@6.0.3)':
3115
3092
  dependencies:
3116
3093
  '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3)
3117
3094
  '@typescript-eslint/types': 8.69.0
3118
- debug: 4.4.3
3095
+ debug: 4.4.3(supports-color@10.2.2)
3119
3096
  typescript: 6.0.3
3120
3097
  transitivePeerDependencies:
3121
3098
  - supports-color
@@ -3129,13 +3106,13 @@ snapshots:
3129
3106
  dependencies:
3130
3107
  typescript: 6.0.3
3131
3108
 
3132
- '@typescript-eslint/type-utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)':
3109
+ '@typescript-eslint/type-utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
3133
3110
  dependencies:
3134
3111
  '@typescript-eslint/types': 8.69.0
3135
- '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3)
3136
- '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
3137
- debug: 4.4.3
3138
- eslint: 10.10.0(jiti@2.7.0)
3112
+ '@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
3113
+ '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3114
+ debug: 4.4.3(supports-color@10.2.2)
3115
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
3139
3116
  ts-api-utils: 2.5.0(typescript@6.0.3)
3140
3117
  typescript: 6.0.3
3141
3118
  transitivePeerDependencies:
@@ -3143,13 +3120,13 @@ snapshots:
3143
3120
 
3144
3121
  '@typescript-eslint/types@8.69.0': {}
3145
3122
 
3146
- '@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3)':
3123
+ '@typescript-eslint/typescript-estree@8.69.0(supports-color@10.2.2)(typescript@6.0.3)':
3147
3124
  dependencies:
3148
- '@typescript-eslint/project-service': 8.69.0(typescript@6.0.3)
3125
+ '@typescript-eslint/project-service': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
3149
3126
  '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3)
3150
3127
  '@typescript-eslint/types': 8.69.0
3151
3128
  '@typescript-eslint/visitor-keys': 8.69.0
3152
- debug: 4.4.3
3129
+ debug: 4.4.3(supports-color@10.2.2)
3153
3130
  minimatch: 10.2.6
3154
3131
  semver: 7.8.5
3155
3132
  tinyglobby: 0.2.17
@@ -3158,13 +3135,13 @@ snapshots:
3158
3135
  transitivePeerDependencies:
3159
3136
  - supports-color
3160
3137
 
3161
- '@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)':
3138
+ '@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
3162
3139
  dependencies:
3163
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0))
3140
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))
3164
3141
  '@typescript-eslint/scope-manager': 8.69.0
3165
3142
  '@typescript-eslint/types': 8.69.0
3166
- '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3)
3167
- eslint: 10.10.0(jiti@2.7.0)
3143
+ '@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
3144
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
3168
3145
  typescript: 6.0.3
3169
3146
  transitivePeerDependencies:
3170
3147
  - supports-color
@@ -3179,46 +3156,16 @@ snapshots:
3179
3156
  '@rolldown/pluginutils': 1.0.1
3180
3157
  vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)
3181
3158
 
3182
- '@vitest/expect@4.1.11':
3183
- dependencies:
3184
- '@standard-schema/spec': 1.1.0
3185
- '@types/chai': 5.2.3
3186
- '@vitest/spy': 4.1.11
3187
- '@vitest/utils': 4.1.11
3188
- chai: 6.2.2
3189
- tinyrainbow: 3.1.1
3190
-
3191
- '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))':
3159
+ '@vitest/mocker@5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))':
3192
3160
  dependencies:
3193
- '@vitest/spy': 4.1.11
3161
+ '@jridgewell/trace-mapping': 0.3.31
3162
+ '@vitest/spy': 5.0.0
3194
3163
  estree-walker: 3.0.3
3195
- magic-string: 0.30.21
3164
+ magic-string: 1.2.3
3196
3165
  optionalDependencies:
3197
3166
  vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)
3198
3167
 
3199
- '@vitest/pretty-format@4.1.11':
3200
- dependencies:
3201
- tinyrainbow: 3.1.1
3202
-
3203
- '@vitest/runner@4.1.11':
3204
- dependencies:
3205
- '@vitest/utils': 4.1.11
3206
- pathe: 2.0.3
3207
-
3208
- '@vitest/snapshot@4.1.11':
3209
- dependencies:
3210
- '@vitest/pretty-format': 4.1.11
3211
- '@vitest/utils': 4.1.11
3212
- magic-string: 0.30.21
3213
- pathe: 2.0.3
3214
-
3215
- '@vitest/spy@4.1.11': {}
3216
-
3217
- '@vitest/utils@4.1.11':
3218
- dependencies:
3219
- '@vitest/pretty-format': 4.1.11
3220
- convert-source-map: 2.0.0
3221
- tinyrainbow: 3.1.1
3168
+ '@vitest/spy@5.0.0': {}
3222
3169
 
3223
3170
  '@webgpu/types@0.1.72': {}
3224
3171
 
@@ -3288,8 +3235,6 @@ snapshots:
3288
3235
  tree-kill: 1.2.2
3289
3236
  yargs: 18.0.0
3290
3237
 
3291
- convert-source-map@2.0.0: {}
3292
-
3293
3238
  cookie@1.1.1: {}
3294
3239
 
3295
3240
  core-js@3.50.0: {}
@@ -3312,9 +3257,11 @@ snapshots:
3312
3257
  whatwg-mimetype: 4.0.0
3313
3258
  whatwg-url: 14.2.0
3314
3259
 
3315
- debug@4.4.3:
3260
+ debug@4.4.3(supports-color@10.2.2):
3316
3261
  dependencies:
3317
3262
  ms: 2.1.3
3263
+ optionalDependencies:
3264
+ supports-color: 10.2.2
3318
3265
 
3319
3266
  decimal.js@10.6.0: {}
3320
3267
 
@@ -3380,9 +3327,9 @@ snapshots:
3380
3327
 
3381
3328
  escape-string-regexp@4.0.0: {}
3382
3329
 
3383
- eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)):
3330
+ eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2)):
3384
3331
  dependencies:
3385
- eslint: 10.10.0(jiti@2.7.0)
3332
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
3386
3333
 
3387
3334
  eslint-scope@9.1.2:
3388
3335
  dependencies:
@@ -3395,11 +3342,11 @@ snapshots:
3395
3342
 
3396
3343
  eslint-visitor-keys@5.0.1: {}
3397
3344
 
3398
- eslint@10.10.0(jiti@2.7.0):
3345
+ eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2):
3399
3346
  dependencies:
3400
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0))
3347
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))
3401
3348
  '@eslint-community/regexpp': 4.12.2
3402
- '@eslint/config-array': 0.23.5
3349
+ '@eslint/config-array': 0.23.5(supports-color@10.2.2)
3403
3350
  '@eslint/config-helpers': 0.7.0
3404
3351
  '@eslint/core': 1.2.1
3405
3352
  '@eslint/plugin-kit': 0.7.3
@@ -3409,7 +3356,7 @@ snapshots:
3409
3356
  '@types/estree': 1.0.9
3410
3357
  ajv: 6.15.0
3411
3358
  cross-spawn: 7.0.6
3412
- debug: 4.4.3
3359
+ debug: 4.4.3(supports-color@10.2.2)
3413
3360
  escape-string-regexp: 4.0.0
3414
3361
  eslint-scope: 9.1.2
3415
3362
  eslint-visitor-keys: 5.0.1
@@ -3514,17 +3461,17 @@ snapshots:
3514
3461
  dependencies:
3515
3462
  whatwg-encoding: 3.1.1
3516
3463
 
3517
- http-proxy-agent@7.0.2:
3464
+ http-proxy-agent@7.0.2(supports-color@10.2.2):
3518
3465
  dependencies:
3519
3466
  agent-base: 7.1.4
3520
- debug: 4.4.3
3467
+ debug: 4.4.3(supports-color@10.2.2)
3521
3468
  transitivePeerDependencies:
3522
3469
  - supports-color
3523
3470
 
3524
- https-proxy-agent@7.0.6:
3471
+ https-proxy-agent@7.0.6(supports-color@10.2.2):
3525
3472
  dependencies:
3526
3473
  agent-base: 7.1.4
3527
- debug: 4.4.3
3474
+ debug: 4.4.3(supports-color@10.2.2)
3528
3475
  transitivePeerDependencies:
3529
3476
  - supports-color
3530
3477
 
@@ -3556,14 +3503,14 @@ snapshots:
3556
3503
 
3557
3504
  js-tokens@4.0.0: {}
3558
3505
 
3559
- jsdom@26.1.0:
3506
+ jsdom@26.1.0(supports-color@10.2.2):
3560
3507
  dependencies:
3561
3508
  cssstyle: 4.6.0
3562
3509
  data-urls: 5.0.0
3563
3510
  decimal.js: 10.6.0
3564
3511
  html-encoding-sniffer: 4.0.0
3565
- http-proxy-agent: 7.0.2
3566
- https-proxy-agent: 7.0.6
3512
+ http-proxy-agent: 7.0.2(supports-color@10.2.2)
3513
+ https-proxy-agent: 7.0.6(supports-color@10.2.2)
3567
3514
  is-potential-custom-element-name: 1.0.1
3568
3515
  nwsapi: 2.2.27
3569
3516
  parse5: 7.3.0
@@ -3736,6 +3683,10 @@ snapshots:
3736
3683
  dependencies:
3737
3684
  '@jridgewell/sourcemap-codec': 1.6.0
3738
3685
 
3686
+ magic-string@1.2.3:
3687
+ dependencies:
3688
+ '@jridgewell/sourcemap-codec': 1.6.0
3689
+
3739
3690
  miniflare@5.20260903.0-alpha:
3740
3691
  dependencies:
3741
3692
  '@cspotcode/source-map-support': 0.8.1
@@ -3967,7 +3918,7 @@ snapshots:
3967
3918
 
3968
3919
  tapable@2.3.3: {}
3969
3920
 
3970
- tinybench@2.9.0: {}
3921
+ tinybench@6.1.4: {}
3971
3922
 
3972
3923
  tinyexec@1.3.0: {}
3973
3924
 
@@ -3976,8 +3927,6 @@ snapshots:
3976
3927
  fdir: 6.5.0(picomatch@4.0.7)
3977
3928
  picomatch: 4.0.7
3978
3929
 
3979
- tinyrainbow@3.1.1: {}
3980
-
3981
3930
  tldts-core@6.1.86: {}
3982
3931
 
3983
3932
  tldts@6.1.86:
@@ -4008,13 +3957,13 @@ snapshots:
4008
3957
  optionalDependencies:
4009
3958
  rxjs: 7.8.2
4010
3959
 
4011
- typescript-eslint@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3):
3960
+ typescript-eslint@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3):
4012
3961
  dependencies:
4013
- '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
4014
- '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
4015
- '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3)
4016
- '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)
4017
- eslint: 10.10.0(jiti@2.7.0)
3962
+ '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3963
+ '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3964
+ '@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
3965
+ '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
3966
+ eslint: 10.10.0(jiti@2.7.0)(supports-color@10.2.2)
4018
3967
  typescript: 6.0.3
4019
3968
  transitivePeerDependencies:
4020
3969
  - supports-color
@@ -4051,32 +4000,26 @@ snapshots:
4051
4000
  fsevents: 2.3.3
4052
4001
  jiti: 2.7.0
4053
4002
 
4054
- vitest@4.1.11(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@26.1.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)):
4003
+ vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@26.1.0(supports-color@10.2.2))(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)):
4055
4004
  dependencies:
4056
- '@vitest/expect': 4.1.11
4057
- '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))
4058
- '@vitest/pretty-format': 4.1.11
4059
- '@vitest/runner': 4.1.11
4060
- '@vitest/snapshot': 4.1.11
4061
- '@vitest/spy': 4.1.11
4062
- '@vitest/utils': 4.1.11
4005
+ '@types/chai': 5.2.3
4006
+ '@vitest/mocker': 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0))
4007
+ chai: 6.2.2
4063
4008
  es-module-lexer: 2.3.2
4064
4009
  expect-type: 1.4.0
4065
- magic-string: 0.30.21
4010
+ magic-string: 1.2.3
4066
4011
  obug: 2.1.4
4067
- pathe: 2.0.3
4068
4012
  picomatch: 4.0.7
4069
4013
  std-env: 4.2.0
4070
- tinybench: 2.9.0
4014
+ tinybench: 6.1.4
4071
4015
  tinyexec: 1.3.0
4072
4016
  tinyglobby: 0.2.17
4073
- tinyrainbow: 3.1.1
4074
4017
  vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.1)(jiti@2.7.0)
4075
4018
  why-is-node-running: 2.3.0
4076
4019
  optionalDependencies:
4077
4020
  '@opentelemetry/api': 1.9.1
4078
4021
  '@types/node': 26.4.1
4079
- jsdom: 26.1.0
4022
+ jsdom: 26.1.0(supports-color@10.2.2)
4080
4023
  transitivePeerDependencies:
4081
4024
  - msw
4082
4025
 
@@ -0,0 +1,23 @@
1
+ import assert from 'node:assert/strict';
2
+ import { appendFile, mkdtemp, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test from 'node:test';
6
+ import { readEvents } from './dev-fixtures.mjs';
7
+
8
+ test('event polling waits for a complete trailing record', async (t) => {
9
+ const directory = await mkdtemp(join(tmpdir(), 'spatius-events-'));
10
+ t.after(() => rm(directory, { recursive: true, force: true }));
11
+ const path = join(directory, 'events.jsonl');
12
+ await writeFile(path, '{"type":"ready"}\n{"type":"reg');
13
+ assert.deepEqual(await readEvents(path), [{ type: 'ready' }]);
14
+ await appendFile(path, 'istered"}\n');
15
+ assert.deepEqual(await readEvents(path), [
16
+ { type: 'ready' },
17
+ { type: 'registered' },
18
+ ]);
19
+ await writeFile(path, '{"type":');
20
+ assert.deepEqual(await readEvents(path), []);
21
+ await appendFile(path, 'broken}\n');
22
+ await assert.rejects(readEvents(path), SyntaxError);
23
+ });
@@ -54,7 +54,7 @@ if (role === 'lk' && args[0] === '--version') {
54
54
  } else if (role === 'lk' && args.includes('--help')) {
55
55
  if (process.env.DEV_TEST_PROBE === 'help-hang') { hold(); ready(); }
56
56
  else { console.log(process.env.DEV_TEST_HELP ?? 'NAME: lk agent dev\\nUSAGE: lk agent dev [entrypoint]'); process.exit(Number(process.env.DEV_TEST_HELP_EXIT ?? 0)); }
57
- } else if (role === 'grandchild') {
57
+ } else if (role === 'grandchild' || role === 'api') {
58
58
  hold(); ready();
59
59
  } else {
60
60
  if (role !== 'web' && process.env.SPATIUS_DEV_READY_FILE && process.env.DEV_TEST_RUNTIME_HOLD === '1') {
@@ -129,6 +129,7 @@ export async function fixture(
129
129
  await writeFile(path, body, { mode: 0o755 });
130
130
  return path;
131
131
  };
132
+ await executable('tsx', bin, 'api');
132
133
  if (lk) await executable('lk');
133
134
  if (uv) await executable('uv');
134
135
  if (python) {
@@ -206,8 +207,11 @@ export async function fixture(
206
207
  }
207
208
 
208
209
  export async function readEvents(path) {
209
- return (await readFile(path, 'utf8'))
210
- .trim()
210
+ // A concurrent append can be visible before its terminating newline.
211
+ // Parse only complete records; the next poll will read the finished tail.
212
+ const contents = await readFile(path, 'utf8');
213
+ return contents
214
+ .slice(0, contents.lastIndexOf('\n') + 1)
211
215
  .split('\n')
212
216
  .filter(Boolean)
213
217
  .map((line) => JSON.parse(line));
@@ -2,6 +2,7 @@
2
2
  "compilerOptions": {
3
3
  "paths": { "@/*": ["./web/*"] },
4
4
  "composite": true,
5
+ "resolveJsonModule": true,
5
6
  "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.web.tsbuildinfo",
6
7
  "target": "ES2023",
7
8
  "useDefineForClassFields": true,
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "composite": true,
4
+ "resolveJsonModule": true,
4
5
  "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.worker.tsbuildinfo",
5
6
  "target": "ES2023",
6
7
  "lib": ["ES2023", "WebWorker"],
@@ -1,4 +1,5 @@
1
1
  export interface VoiceSession {
2
+ session_capability?: string;
2
3
  participant_token: string;
3
4
  room_name: string;
4
5
  server_url: string;
@@ -67,3 +68,14 @@ export async function requestVoiceSession(
67
68
  }
68
69
  return payload;
69
70
  }
71
+
72
+ export async function stopVoiceSession(capability?: string): Promise<void> {
73
+ if (!capability) return;
74
+ const response = await fetch('/api/session/stop', {
75
+ method: 'POST',
76
+ headers: { 'content-type': 'application/json' },
77
+ body: JSON.stringify({ capability }),
78
+ keepalive: true,
79
+ });
80
+ if (!response.ok) throw new Error('Session cleanup failed');
81
+ }