@pyric/cli 0.1.0-alpha.12 → 0.1.0-alpha.14

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 (230) hide show
  1. package/dist/cli/serve.js +5 -5
  2. package/dist/cli/serve.js.map +1 -1
  3. package/dist/serve/bundler.d.ts +15 -8
  4. package/dist/serve/bundler.d.ts.map +1 -1
  5. package/dist/serve/bundler.js +38 -37
  6. package/dist/serve/bundler.js.map +1 -1
  7. package/dist/serve/docs-ui/docs/_rhythm/index.html +1 -1
  8. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +1 -1
  9. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +1 -1
  10. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +1 -1
  11. package/dist/serve/docs-ui/docs/ai-compat/index.html +1 -1
  12. package/dist/serve/docs-ui/docs/api-reference/index.html +1 -1
  13. package/dist/serve/docs-ui/docs/app-compat/index.html +1 -1
  14. package/dist/serve/docs-ui/docs/auth-compat/index.html +1 -1
  15. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +44 -22
  16. package/dist/serve/docs-ui/docs/build/ai-logic.md +69 -21
  17. package/dist/serve/docs-ui/docs/build/authentication/index.html +1 -1
  18. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +1 -1
  19. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +1 -1
  20. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +1 -1
  21. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +1 -1
  22. package/dist/serve/docs-ui/docs/conformance-scores/index.html +1 -1
  23. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +1 -1
  24. package/dist/serve/docs-ui/docs/database-compat/index.html +1 -1
  25. package/dist/serve/docs-ui/docs/firestore-compat/index.html +1 -1
  26. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +1 -1
  27. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +2 -1
  28. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works.md +2 -0
  29. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +3 -2
  30. package/dist/serve/docs-ui/docs/get-started/start-building.md +3 -1
  31. package/dist/serve/docs-ui/docs/index.json +149 -4
  32. package/dist/serve/docs-ui/docs/messaging-compat/index.html +1 -1
  33. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +28 -0
  34. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status.md +47 -0
  35. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +1 -1
  36. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +1 -1
  37. package/dist/serve/docs-ui/docs/overview/index.html +1 -1
  38. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  39. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  40. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  41. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  42. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  43. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  44. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +1 -1
  45. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  46. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +1 -1
  47. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +1 -1
  48. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  49. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  50. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  51. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  52. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  53. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  54. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  55. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  56. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  57. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  58. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  59. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +38 -11
  60. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +26 -8
  61. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  62. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +11 -8
  63. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +17 -4
  64. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1 -1
  65. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1 -1
  66. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  67. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  68. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +1 -1
  69. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
  70. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  71. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
  72. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +1 -1
  73. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  74. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  75. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  76. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  77. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  78. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  79. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  80. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  81. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  82. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  83. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  84. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  85. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
  86. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  87. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  88. package/dist/serve/docs-ui/docs/rules-compat/index.html +1 -1
  89. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +1 -1
  90. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  91. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +1 -1
  92. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  93. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +1 -1
  94. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  95. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +1 -1
  96. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  97. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +1 -1
  98. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +1 -1
  99. package/dist/serve/docs-ui/docs/storage-compat/index.html +1 -1
  100. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  101. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  102. package/dist/serve/docs-ui/docs/tutorial/index.html +429 -0
  103. package/dist/serve/docs-ui/docs/tutorial.md +701 -0
  104. package/dist/serve/docs-ui/llms.txt +2 -0
  105. package/dist/serve/entries/init.d.ts.map +1 -1
  106. package/dist/serve/entries/init.js +3 -0
  107. package/dist/serve/entries/init.js.map +1 -1
  108. package/dist/serve/entries/runtime.d.ts.map +1 -1
  109. package/dist/serve/entries/runtime.js +20 -5
  110. package/dist/serve/entries/runtime.js.map +1 -1
  111. package/dist/serve/entries/worker-runtime.d.ts +2 -2
  112. package/dist/serve/entries/worker-runtime.d.ts.map +1 -1
  113. package/dist/serve/entries/worker-runtime.js +45 -10
  114. package/dist/serve/entries/worker-runtime.js.map +1 -1
  115. package/dist/serve/runtime/chip-config.d.ts +19 -0
  116. package/dist/serve/runtime/chip-config.d.ts.map +1 -0
  117. package/dist/serve/runtime/chip-config.js +19 -0
  118. package/dist/serve/runtime/chip-config.js.map +1 -0
  119. package/dist/serve/runtime/chip-install.d.ts +10 -0
  120. package/dist/serve/runtime/chip-install.d.ts.map +1 -0
  121. package/dist/serve/runtime/chip-install.js +15 -0
  122. package/dist/serve/runtime/chip-install.js.map +1 -0
  123. package/dist/serve/runtime/chip.d.ts +17 -0
  124. package/dist/serve/runtime/chip.d.ts.map +1 -0
  125. package/dist/serve/runtime/chip.js +257 -0
  126. package/dist/serve/runtime/chip.js.map +1 -0
  127. package/dist/serve/runtime/manifest.d.ts +22 -0
  128. package/dist/serve/runtime/manifest.d.ts.map +1 -0
  129. package/dist/serve/runtime/manifest.js +20 -0
  130. package/dist/serve/runtime/manifest.js.map +1 -0
  131. package/dist/serve/runtime/status.d.ts +49 -0
  132. package/dist/serve/runtime/status.d.ts.map +1 -0
  133. package/dist/serve/runtime/status.js +164 -0
  134. package/dist/serve/runtime/status.js.map +1 -0
  135. package/dist/serve/runtime/worker-connection.d.ts +4 -0
  136. package/dist/serve/runtime/worker-connection.d.ts.map +1 -0
  137. package/dist/serve/runtime/worker-connection.js +11 -0
  138. package/dist/serve/runtime/worker-connection.js.map +1 -0
  139. package/dist/serve/runtime/worker-generation.d.ts +22 -0
  140. package/dist/serve/runtime/worker-generation.d.ts.map +1 -0
  141. package/dist/serve/runtime/worker-generation.js +77 -0
  142. package/dist/serve/runtime/worker-generation.js.map +1 -0
  143. package/dist/serve/runtime/worker-replacement.d.ts +18 -0
  144. package/dist/serve/runtime/worker-replacement.d.ts.map +1 -0
  145. package/dist/serve/runtime/worker-replacement.js +29 -0
  146. package/dist/serve/runtime/worker-replacement.js.map +1 -0
  147. package/dist/serve/standalone-assets.d.ts +2 -2
  148. package/dist/serve/standalone-assets.d.ts.map +1 -1
  149. package/dist/serve/standalone-assets.js +1 -1
  150. package/dist/serve/standalone-assets.js.map +1 -1
  151. package/dist/serve/studio-ui/assets/{RulesCodeEditor-CxVYcZXw.js → RulesCodeEditor-BDlH-5lp.js} +1 -1
  152. package/dist/serve/studio-ui/assets/{index-cpSfgQ7H.js → index-Bf9SSE8L.js} +5 -5
  153. package/dist/serve/studio-ui/assets/{seed-DeuFKi4J.js → seed-D_UjxfOU.js} +1 -1
  154. package/dist/serve/studio-ui/index.html +1 -1
  155. package/dist/serve/vite-ai-config.d.ts +27 -0
  156. package/dist/serve/vite-ai-config.d.ts.map +1 -0
  157. package/dist/serve/vite-ai-config.js +49 -0
  158. package/dist/serve/vite-ai-config.js.map +1 -0
  159. package/dist/serve/vite-plugin.d.ts +17 -36
  160. package/dist/serve/vite-plugin.d.ts.map +1 -1
  161. package/dist/serve/vite-plugin.js +38 -57
  162. package/dist/serve/vite-plugin.js.map +1 -1
  163. package/dist/serve/vite-rules-source.d.ts +8 -0
  164. package/dist/serve/vite-rules-source.d.ts.map +1 -0
  165. package/dist/serve/vite-rules-source.js +23 -0
  166. package/dist/serve/vite-rules-source.js.map +1 -0
  167. package/dist/serve/vite-worker-runtime.d.ts +20 -0
  168. package/dist/serve/vite-worker-runtime.d.ts.map +1 -0
  169. package/dist/serve/vite-worker-runtime.js +29 -0
  170. package/dist/serve/vite-worker-runtime.js.map +1 -0
  171. package/dist/serve/worker/client/connection.d.ts +7 -2
  172. package/dist/serve/worker/client/connection.d.ts.map +1 -1
  173. package/dist/serve/worker/client/connection.js +13 -16
  174. package/dist/serve/worker/client/connection.js.map +1 -1
  175. package/dist/serve/worker/client/core.d.ts +7 -0
  176. package/dist/serve/worker/client/core.d.ts.map +1 -1
  177. package/dist/serve/worker/client/core.js +28 -0
  178. package/dist/serve/worker/client/core.js.map +1 -1
  179. package/dist/serve/worker/client/runtime-control.d.ts +8 -0
  180. package/dist/serve/worker/client/runtime-control.d.ts.map +1 -0
  181. package/dist/serve/worker/client/runtime-control.js +11 -0
  182. package/dist/serve/worker/client/runtime-control.js.map +1 -0
  183. package/dist/serve/worker/entry.js +44 -2
  184. package/dist/serve/worker/entry.js.map +1 -1
  185. package/dist/serve/worker/host/studio.js +1 -1
  186. package/dist/serve/worker/host/studio.js.map +1 -1
  187. package/dist/serve/worker/host-context.d.ts +1 -1
  188. package/dist/serve/worker/host-context.d.ts.map +1 -1
  189. package/dist/serve/worker/protocol.d.ts +15 -1
  190. package/dist/serve/worker/protocol.d.ts.map +1 -1
  191. package/dist/serve/worker/protocol.js.map +1 -1
  192. package/dist/serve/worker/retirement.d.ts +21 -0
  193. package/dist/serve/worker/retirement.d.ts.map +1 -0
  194. package/dist/serve/worker/retirement.js +97 -0
  195. package/dist/serve/worker/retirement.js.map +1 -0
  196. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  197. package/dist/serve/worker/serve-init.js +5 -6
  198. package/dist/serve/worker/serve-init.js.map +1 -1
  199. package/dist/vite.d.ts +1 -0
  200. package/dist/vite.d.ts.map +1 -1
  201. package/dist/vite.js.map +1 -1
  202. package/package.json +5 -4
  203. package/src/cli/serve.ts +5 -5
  204. package/src/serve/bundler.ts +49 -16
  205. package/src/serve/entries/init.ts +3 -0
  206. package/src/serve/entries/runtime.ts +23 -7
  207. package/src/serve/entries/worker-runtime.ts +69 -9
  208. package/src/serve/runtime/chip-config.ts +30 -0
  209. package/src/serve/runtime/chip-install.ts +27 -0
  210. package/src/serve/runtime/chip.ts +282 -0
  211. package/src/serve/runtime/manifest.ts +37 -0
  212. package/src/serve/runtime/status.ts +216 -0
  213. package/src/serve/runtime/worker-connection.ts +14 -0
  214. package/src/serve/runtime/worker-generation.ts +97 -0
  215. package/src/serve/runtime/worker-replacement.ts +42 -0
  216. package/src/serve/standalone-assets.ts +2 -2
  217. package/src/serve/vite-ai-config.ts +85 -0
  218. package/src/serve/vite-plugin.ts +61 -87
  219. package/src/serve/vite-rules-source.ts +28 -0
  220. package/src/serve/vite-worker-runtime.ts +58 -0
  221. package/src/serve/worker/client/connection.ts +29 -4
  222. package/src/serve/worker/client/core.ts +34 -0
  223. package/src/serve/worker/client/runtime-control.ts +22 -0
  224. package/src/serve/worker/entry.ts +46 -2
  225. package/src/serve/worker/host/studio.ts +1 -1
  226. package/src/serve/worker/host-context.ts +1 -1
  227. package/src/serve/worker/protocol.ts +13 -1
  228. package/src/serve/worker/retirement.ts +125 -0
  229. package/src/serve/worker/serve-init.ts +5 -6
  230. package/src/vite.ts +1 -0
@@ -482,6 +482,8 @@ export type OpMessage = (
482
482
  | { t: 'op'; id: string; method: 'ai.countTokens'; model: string; request: Record<string, unknown>; engine?: AiEngineConfigWire }
483
483
  // Staleness guard: report the worker's baked build version so the page can
484
484
  // warn when a still-running OLD worker serves code older than what's served.
485
+ | { t: 'op'; id: string; method: 'getRuntimeEpoch' }
486
+ | { t: 'op'; id: string; method: 'retireRuntime'; targetEpoch: string }
485
487
  | { t: 'op'; id: string; method: 'getVersion' }
486
488
  // ── Phase 2 (transfer): export/import the FULL sandbox state as a bundle
487
489
  // string (the chunk format the persist layer uses). importState CLOBBERS. ──
@@ -914,7 +916,17 @@ export interface EventStreamMessage {
914
916
  events: readonly SandboxEvent[];
915
917
  }
916
918
 
917
- export type OutboundMessage = ResMessage | SnapMessage | EventStreamMessage;
919
+ /** The retiring worker tells every connected page to reload after it drains. */
920
+ export interface RuntimeReloadMessage {
921
+ t: 'runtime-reload';
922
+ epoch: string;
923
+ }
924
+
925
+ export type OutboundMessage =
926
+ | ResMessage
927
+ | SnapMessage
928
+ | EventStreamMessage
929
+ | RuntimeReloadMessage;
918
930
 
919
931
  // ─── Serialized document data ─────────────────────────────────────────────
920
932
 
@@ -0,0 +1,125 @@
1
+ interface RetirementPort {
2
+ postMessage(message: unknown): void;
3
+ }
4
+
5
+ interface WorkerRetirementOptions {
6
+ closeWorker(): void;
7
+ beforeAnnounce?(): Promise<void>;
8
+ drainTimeoutMs?: number;
9
+ schedule?: (run: () => void) => void;
10
+ }
11
+
12
+ export interface WorkerRetirement {
13
+ connect(port: RetirementPort): void;
14
+ disconnect(port: RetirementPort): void;
15
+ track(port: RetirementPort, work: Promise<void>): void;
16
+ trackDetached(work: Promise<void>): void;
17
+ accepting(): boolean;
18
+ retire(requester: RetirementPort, requestId: string, targetEpoch: string): Promise<void>;
19
+ }
20
+
21
+ /** Drain already-accepted port work before every page reloads onto a new worker. */
22
+ export function createWorkerRetirement(options: WorkerRetirementOptions): WorkerRetirement {
23
+ const ports = new Set<RetirementPort>();
24
+ const workByPort = new Map<RetirementPort, Promise<void>>();
25
+ const detachedWork = new Set<Promise<void>>();
26
+ const requests: Array<{ requester: RetirementPort; requestId: string }> = [];
27
+ const schedule = options.schedule ?? ((run) => { setTimeout(run, 50); });
28
+ const drainTimeoutMs = options.drainTimeoutMs ?? 10_000;
29
+ let retiring = false;
30
+ let announced = false;
31
+ let announcedEpoch: string | null = null;
32
+ let retirement: Promise<void> | null = null;
33
+
34
+ const timeout = (work: Promise<void>): Promise<void> => new Promise((resolve, reject) => {
35
+ const timer = setTimeout(
36
+ () => reject(new Error(`Worker retirement drain timed out after ${drainTimeoutMs}ms.`)),
37
+ drainTimeoutMs,
38
+ );
39
+ void work.then(
40
+ () => { clearTimeout(timer); resolve(); },
41
+ (error) => { clearTimeout(timer); reject(error); },
42
+ );
43
+ });
44
+
45
+ const failRequests = (error: Error): void => {
46
+ for (const request of requests.splice(0)) {
47
+ request.requester.postMessage({
48
+ t: 'res', id: request.requestId, ok: false,
49
+ error: { code: 'pyric/worker-retirement-timeout', message: error.message },
50
+ });
51
+ }
52
+ };
53
+
54
+ return {
55
+ connect(port) {
56
+ ports.add(port);
57
+ if (announcedEpoch) {
58
+ port.postMessage({ t: 'runtime-reload', epoch: announcedEpoch });
59
+ }
60
+ },
61
+ disconnect(port) {
62
+ ports.delete(port);
63
+ },
64
+ track(port, work) {
65
+ workByPort.set(port, work);
66
+ const settled = (): void => {
67
+ if (workByPort.get(port) === work) workByPort.delete(port);
68
+ };
69
+ void work.then(settled, settled);
70
+ },
71
+ trackDetached(work) {
72
+ detachedWork.add(work);
73
+ void work.then(
74
+ () => { detachedWork.delete(work); },
75
+ () => { detachedWork.delete(work); },
76
+ );
77
+ },
78
+ accepting: () => !retiring,
79
+ async retire(requester, requestId, targetEpoch) {
80
+ if (!/^[a-f0-9]{16}$/.test(targetEpoch)) {
81
+ requester.postMessage({
82
+ t: 'res', id: requestId, ok: false,
83
+ error: { code: 'pyric/invalid-worker-epoch', message: 'Invalid replacement worker epoch.' },
84
+ });
85
+ return;
86
+ }
87
+ if (announced) {
88
+ requester.postMessage({
89
+ t: 'res', id: requestId, ok: true, value: { retiring: true },
90
+ });
91
+ requester.postMessage({ t: 'runtime-reload', epoch: announcedEpoch! });
92
+ return;
93
+ }
94
+ requests.push({ requester, requestId });
95
+ if (!retirement) {
96
+ retiring = true;
97
+ const acceptedWork = [...workByPort.values(), ...detachedWork];
98
+ const attempt = { cancelled: false };
99
+ retirement = timeout((async () => {
100
+ await Promise.allSettled(acceptedWork);
101
+ if (attempt.cancelled) return;
102
+ await options.beforeAnnounce?.();
103
+ if (attempt.cancelled) return;
104
+ for (const request of requests.splice(0)) {
105
+ request.requester.postMessage({
106
+ t: 'res', id: request.requestId, ok: true, value: { retiring: true },
107
+ });
108
+ }
109
+ announced = true;
110
+ announcedEpoch = targetEpoch;
111
+ for (const port of ports) {
112
+ port.postMessage({ t: 'runtime-reload', epoch: targetEpoch });
113
+ }
114
+ schedule(options.closeWorker);
115
+ })()).catch((error: unknown) => {
116
+ attempt.cancelled = true;
117
+ retiring = false;
118
+ retirement = null;
119
+ failRequests(error instanceof Error ? error : new Error(String(error)));
120
+ });
121
+ }
122
+ await retirement;
123
+ },
124
+ };
125
+ }
@@ -263,7 +263,7 @@ export function applyServeInit(
263
263
  const debounceMs = payload.capture ? (env.captureDebounceMs ?? 400) : 0;
264
264
  let timer: ReturnType<typeof setTimeout> | null = null;
265
265
 
266
- const flush = (): void => {
266
+ const flush = async (): Promise<void> => {
267
267
  const rtdb = ctx.rtdb ??= getDatabase(ctx.sandbox);
268
268
  const rtdbState =
269
269
  payload.databaseRules || ctx.sandbox.history().some((event) => event.service === 'rtdb')
@@ -286,8 +286,7 @@ export function applyServeInit(
286
286
  }));
287
287
  // Relative URL resolves against the worker script's origin (same origin
288
288
  // as the page). Fire-and-forget — capture failures never break ops.
289
- env
290
- .fetch('/__pyric/capture', {
289
+ await env.fetch('/__pyric/capture', {
291
290
  method: 'POST',
292
291
  headers: { 'content-type': 'application/json' },
293
292
  body,
@@ -297,7 +296,7 @@ export function applyServeInit(
297
296
 
298
297
  const unsub = ctx.sandbox.onEvent(() => {
299
298
  if (timer) clearTimeout(timer);
300
- timer = setTimeout(flush, debounceMs);
299
+ timer = setTimeout(() => { void flush(); }, debounceMs);
301
300
  });
302
301
 
303
302
  result.captureEnabled = true;
@@ -308,12 +307,12 @@ export function applyServeInit(
308
307
  // the next boot's `hydrateEventHistory` would prime them straight back
309
308
  // into Traffic. Bypasses the debounce; cancels any pending flush (it
310
309
  // would only re-write the same post-reset history).
311
- ctx.captureFlush = (): void => {
310
+ ctx.captureFlush = async (): Promise<void> => {
312
311
  if (timer) {
313
312
  clearTimeout(timer);
314
313
  timer = null;
315
314
  }
316
- flush();
315
+ await flush();
317
316
  };
318
317
  result.dispose = (): void => {
319
318
  if (timer) clearTimeout(timer);
package/src/vite.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  */
9
9
  export { pyric } from './serve/vite-plugin.js';
10
10
  export type { PyricOptions } from './serve/vite-plugin.js';
11
+ export type { PyricRuntimeChipOption } from './serve/runtime/chip-config.js';
11
12
 
12
13
  // The benign node-builtin shims serve's bundler and this plugin apply when
13
14
  // bundling pyric's browser graph (`fs`/`path`/`url` reached via the rules