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

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 +4 -4
  2. package/dist/cli/serve.js.map +1 -1
  3. package/dist/serve/bundler.d.ts +13 -8
  4. package/dist/serve/bundler.d.ts.map +1 -1
  5. package/dist/serve/bundler.js +31 -36
  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 +14 -0
  140. package/dist/serve/runtime/worker-generation.d.ts.map +1 -0
  141. package/dist/serve/runtime/worker-generation.js +56 -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 +25 -0
  156. package/dist/serve/vite-ai-config.d.ts.map +1 -0
  157. package/dist/serve/vite-ai-config.js +45 -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 +25 -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 +4 -4
  204. package/src/serve/bundler.ts +41 -15
  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 +75 -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 +77 -0
  218. package/src/serve/vite-plugin.ts +60 -87
  219. package/src/serve/vite-rules-source.ts +28 -0
  220. package/src/serve/vite-worker-runtime.ts +51 -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
@@ -0,0 +1,257 @@
1
+ const styles = `
2
+ :host {
3
+ --pyric-bg: #1e1e24;
4
+ --pyric-content: #16161a;
5
+ --pyric-border: #33333f;
6
+ --pyric-border-soft: #2a2a35;
7
+ --pyric-text: #fbfbfe;
8
+ --pyric-muted: #89899f;
9
+ --pyric-accent: #19cc61;
10
+ --pyric-warning: #e6c79c;
11
+ --pyric-error: #f0a0a0;
12
+ all: initial;
13
+ position: fixed;
14
+ right: max(20px, env(safe-area-inset-right));
15
+ bottom: max(20px, env(safe-area-inset-bottom));
16
+ z-index: 2147483000;
17
+ color: var(--pyric-text);
18
+ font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
19
+ font-synthesis: none;
20
+ }
21
+ *, *::before, *::after { box-sizing: border-box; }
22
+ .announcer { height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; clip: rect(0 0 0 0); white-space: nowrap; }
23
+ button, a { font: inherit; }
24
+ button { margin: 0; }
25
+ .chip {
26
+ align-items: center;
27
+ background: var(--pyric-bg);
28
+ border: 1px solid var(--pyric-border);
29
+ border-radius: 999px;
30
+ box-shadow: 0 12px 34px rgba(0, 0, 0, .38);
31
+ color: var(--pyric-text);
32
+ cursor: pointer;
33
+ display: flex;
34
+ gap: 10px;
35
+ height: 36px;
36
+ padding: 0 12px;
37
+ }
38
+ .chip:hover { border-color: #4a4a58; }
39
+ .brand, .signals, .signal, .panel-title, .worker-state { align-items: center; display: flex; }
40
+ .brand { gap: 8px; }
41
+ .brand-mark { color: rgba(251, 251, 254, .78); font: 600 11px/1 ui-monospace, monospace; }
42
+ .brand-label, .signals, .worker-state, code, .button { font-family: "JetBrains Mono", ui-monospace, monospace; }
43
+ .brand-label { font-size: 11px; }
44
+ .signals { color: var(--pyric-muted); font-size: 10px; gap: 8px; }
45
+ .signal { gap: 4px; white-space: nowrap; }
46
+ .dot { background: var(--pyric-accent); border-radius: 50%; height: 8px; width: 8px; }
47
+ .dot.error { background: var(--pyric-error); box-shadow: 0 0 0 3px rgba(240,160,160,.12); }
48
+ .signal.update { color: var(--pyric-warning); }
49
+ .chevron { color: var(--pyric-muted); height: 14px; width: 14px; }
50
+ .panel {
51
+ background: var(--pyric-bg);
52
+ border: 1px solid var(--pyric-border);
53
+ border-radius: 8px;
54
+ box-shadow: 0 18px 60px rgba(0, 0, 0, .48);
55
+ max-width: calc(100vw - 40px);
56
+ overflow: hidden;
57
+ width: 380px;
58
+ }
59
+ .panel-header { align-items: center; display: flex; height: 44px; justify-content: space-between; padding: 0 12px; }
60
+ .panel-title { gap: 8px; min-width: 0; }
61
+ .panel-title strong { font: 500 12px/1 ui-monospace, monospace; }
62
+ .count { background: rgba(58,42,42,.3); border: 1px solid #3a2a2a; border-radius: 999px; color: var(--pyric-error); font: 9px/1 ui-monospace, monospace; padding: 4px 6px; }
63
+ .icon-button { align-items: center; background: transparent; border: 0; border-radius: 4px; color: var(--pyric-muted); cursor: pointer; display: inline-flex; height: 28px; justify-content: center; padding: 0; width: 28px; }
64
+ .icon-button:hover { background: rgba(255,255,255,.05); color: var(--pyric-text); }
65
+ .icon-button:disabled { cursor: not-allowed; opacity: .42; }
66
+ .icon-button[data-copy-failed] { color: var(--pyric-error); }
67
+ .icon { height: 15px; width: 15px; }
68
+ .worker-state { border-top: 1px solid var(--pyric-border-soft); color: var(--pyric-muted); font-size: 10px; justify-content: space-between; min-height: 34px; padding: 7px 12px; }
69
+ .worker-state .available { color: var(--pyric-warning); }
70
+ .worker-state .state-label { align-items: center; display: flex; gap: 7px; }
71
+ .mini-dot { background: var(--pyric-accent); border-radius: 50%; height: 6px; width: 6px; }
72
+ .available .mini-dot { background: var(--pyric-warning); }
73
+ .epochs { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
74
+ .errors { background: var(--pyric-content); border-bottom: 1px solid var(--pyric-border-soft); border-top: 1px solid var(--pyric-border-soft); max-height: 184px; min-height: 58px; overflow-y: auto; }
75
+ .errors::-webkit-scrollbar { width: 8px; }
76
+ .errors::-webkit-scrollbar-thumb { background: #33333f; border-radius: 4px; }
77
+ .error-row { align-items: flex-start; border-bottom: 1px solid rgba(42,42,53,.7); display: grid; gap: 8px; grid-template-columns: 18px minmax(0,1fr) 28px; padding: 10px 8px 10px 12px; }
78
+ .error-row:last-child { border-bottom: 0; }
79
+ .error-number { color: var(--pyric-error); font: 10px/20px ui-monospace, monospace; }
80
+ .error-body { min-width: 0; }
81
+ .error-body code { color: #d7d7df; display: block; font-size: 11px; line-height: 1.55; overflow-wrap: anywhere; white-space: pre-wrap; }
82
+ .error-meta { color: var(--pyric-muted); font: 9px/1.4 ui-monospace, monospace; margin-top: 4px; overflow-wrap: anywhere; }
83
+ .empty { align-items: center; color: var(--pyric-muted); display: flex; font: 11px/1.5 ui-monospace, monospace; min-height: 57px; padding: 12px; }
84
+ .actions { display: grid; gap: 8px; grid-template-columns: 1fr 1fr; min-height: 56px; padding: 10px 12px; }
85
+ .button { align-items: center; background: transparent; border: 1px solid var(--pyric-border-soft); border-radius: 4px; color: var(--pyric-muted); display: inline-flex; font-size: 10px; justify-content: center; letter-spacing: .06em; min-height: 34px; padding: 6px 8px; text-decoration: none; text-transform: uppercase; }
86
+ button.button { cursor: pointer; }
87
+ .button:hover:not(:disabled):not([aria-disabled="true"]), a.button:hover { border-color: #3a3a48; color: var(--pyric-text); }
88
+ .button.update:not(:disabled):not([aria-disabled="true"]) { background: rgba(230,199,156,.1); border-color: rgba(230,199,156,.4); color: var(--pyric-warning); }
89
+ .button.update:not(:disabled):not([aria-disabled="true"]):hover { background: rgba(230,199,156,.15); }
90
+ .button:disabled, .button[aria-disabled="true"] { cursor: not-allowed; opacity: .42; }
91
+ .button svg { height: 14px; margin-left: 6px; width: 14px; }
92
+ @media (max-width: 460px) {
93
+ :host { bottom: max(12px, env(safe-area-inset-bottom)); right: 12px; }
94
+ .panel { max-width: calc(100vw - 24px); }
95
+ .worker-state { align-items: flex-start; flex-direction: column; gap: 4px; }
96
+ }
97
+ @media (prefers-reduced-motion: no-preference) {
98
+ .chip, .panel { animation: pyric-enter 120ms ease-out; transform-origin: bottom right; }
99
+ @keyframes pyric-enter { from { opacity: 0; transform: translateY(4px) scale(.98); } }
100
+ }
101
+ `;
102
+ const icons = {
103
+ close: '<svg class="icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="m6 6 12 12M18 6 6 18"/></svg>',
104
+ copy: '<svg class="icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><rect x="8" y="8" width="11" height="11" rx="1"/><path d="M16 8V5H5v11h3"/></svg>',
105
+ chevron: '<svg class="chevron" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="m6 15 6-6 6 6"/></svg>',
106
+ external: '<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M14 5h5v5M19 5l-8 8"/><path d="M19 13v6H5V5h6"/></svg>',
107
+ };
108
+ function escapeAttribute(value) {
109
+ return value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;');
110
+ }
111
+ export function formatPyricRuntimeError(error) {
112
+ const context = [
113
+ error.source,
114
+ error.service && error.method ? `${error.service}.${error.method}` : error.service ?? error.method,
115
+ error.path,
116
+ error.code,
117
+ ].filter(Boolean).join(' · ');
118
+ return `${error.message}${context ? `\n${context}` : ''}${error.stack ? `\n${error.stack}` : ''}`;
119
+ }
120
+ function renderErrors(snapshot, canCopy) {
121
+ if (snapshot.errors.length === 0)
122
+ return '<div class="empty">No sandbox errors.</div>';
123
+ return snapshot.errors.map((error, index) => `
124
+ <div class="error-row" data-error-id="${escapeAttribute(error.id)}">
125
+ <span class="error-number">${String(index + 1).padStart(2, '0')}</span>
126
+ <div class="error-body"><code></code><div class="error-meta"></div></div>
127
+ <button class="icon-button" type="button" data-copy-error="${escapeAttribute(error.id)}" aria-label="${canCopy ? `Copy error ${index + 1}` : 'Copy unavailable'}" title="${canCopy ? 'Copy error' : 'Clipboard unavailable'}" ${canCopy ? '' : 'disabled'}>${icons.copy}</button>
128
+ </div>
129
+ `).join('');
130
+ }
131
+ /** Mount the framework-independent runtime chip in an isolated shadow root. */
132
+ export function mountPyricRuntimeChip(options) {
133
+ const documentLike = options.document ?? document;
134
+ const host = documentLike.createElement('div');
135
+ host.setAttribute('data-pyric-runtime-chip-host', '');
136
+ const root = host.attachShadow({ mode: 'open' });
137
+ root.innerHTML = `<style>${styles}</style><div class="announcer" role="status" aria-live="polite" aria-atomic="true"></div><div data-view></div>`;
138
+ const view = root.querySelector('[data-view]');
139
+ const announcer = root.querySelector('.announcer');
140
+ const clipboard = options.clipboard
141
+ ?? documentLike.defaultView?.navigator.clipboard;
142
+ const studioUrl = 'studioUrl' in options
143
+ ? options.studioUrl
144
+ : options.runtime.getSnapshot().manifest.studioUrl;
145
+ let open = options.initiallyOpen ?? false;
146
+ let snapshot = options.runtime.getSnapshot();
147
+ const render = (next = snapshot) => {
148
+ const active = root.activeElement;
149
+ const oldViewport = view.querySelector('[data-error-viewport]');
150
+ const oldScroll = oldViewport
151
+ ? {
152
+ top: oldViewport.scrollTop,
153
+ atBottom: oldViewport.scrollHeight - oldViewport.scrollTop - oldViewport.clientHeight <= 8,
154
+ }
155
+ : null;
156
+ const activeCopyId = active?.getAttribute('data-copy-error');
157
+ const activeControl = ['data-expand', 'data-collapse', 'data-update-worker', 'data-open-studio']
158
+ .find((attribute) => active?.hasAttribute(attribute));
159
+ const focusToken = activeCopyId !== null && activeCopyId !== undefined
160
+ ? { attribute: 'data-copy-error', value: activeCopyId }
161
+ : activeControl
162
+ ? { attribute: activeControl, value: null }
163
+ : null;
164
+ snapshot = next;
165
+ const errorCount = snapshot.errors.length;
166
+ const workerLabel = snapshot.updateAvailable
167
+ ? 'New worker available'
168
+ : snapshot.mode === 'starting'
169
+ ? 'Sandbox starting'
170
+ : snapshot.mode === 'in-page'
171
+ ? 'In-page sandbox'
172
+ : 'Worker current';
173
+ const epochs = snapshot.updateAvailable
174
+ ? `${snapshot.runningEpoch?.slice(0, 8) ?? 'unknown'} → ${snapshot.servedEpoch?.slice(0, 8) ?? 'unknown'}`
175
+ : snapshot.runningEpoch?.slice(0, 8) ?? '';
176
+ view.innerHTML = `${open ? `
177
+ <section class="panel" role="dialog" aria-label="Pyric runtime">
178
+ <header class="panel-header">
179
+ <div class="panel-title"><span class="brand-mark">&gt;_</span><strong>Pyric runtime</strong>${errorCount > 0 ? `<span class="count">${errorCount} ${errorCount === 1 ? 'error' : 'errors'}</span>` : ''}</div>
180
+ <button class="icon-button" type="button" data-collapse aria-label="Collapse Pyric runtime">${icons.close}</button>
181
+ </header>
182
+ <div class="worker-state"><span class="state-label${snapshot.updateAvailable ? ' available' : ''}"><span class="mini-dot"></span>${workerLabel}</span><span class="epochs">${epochs}</span></div>
183
+ <div class="errors" data-error-viewport>${renderErrors(snapshot, Boolean(clipboard))}</div>
184
+ <div class="actions">
185
+ <button class="button update" type="button" data-update-worker ${snapshot.updateAvailable ? '' : 'disabled'} aria-disabled="${snapshot.updateAvailable && !snapshot.updatingWorker ? 'false' : 'true'}">${snapshot.updatingWorker ? 'Updating…' : 'Update worker'}</button>
186
+ ${studioUrl
187
+ ? `<a class="button" data-open-studio href="${escapeAttribute(studioUrl)}" target="_blank" rel="noopener noreferrer">Studio${icons.external}</a>`
188
+ : `<span class="button" data-open-studio aria-disabled="true" title="Pyric Studio is disabled">Studio${icons.external}</span>`}
189
+ </div>
190
+ </section>
191
+ ` : `
192
+ <button class="chip" type="button" data-expand aria-label="Open Pyric runtime" aria-expanded="false">
193
+ <span class="brand"><span class="dot${errorCount > 0 ? ' error' : ''}"></span><span class="brand-label">Pyric</span></span>
194
+ <span class="signals">${snapshot.updateAvailable ? '<span class="signal update">update</span>' : ''}${errorCount > 0 ? `<span class="signal">${errorCount} ${errorCount === 1 ? 'error' : 'errors'}</span>` : '<span class="signal">ready</span>'}${icons.chevron}</span>
195
+ </button>
196
+ `}`;
197
+ const announcement = `${workerLabel}. ${errorCount === 0 ? 'No runtime errors' : `${errorCount} runtime ${errorCount === 1 ? 'error' : 'errors'}`}.`;
198
+ if (announcer.textContent !== announcement)
199
+ announcer.textContent = announcement;
200
+ const newViewport = view.querySelector('[data-error-viewport]');
201
+ if (oldScroll && newViewport) {
202
+ newViewport.scrollTop = oldScroll.atBottom ? newViewport.scrollHeight : oldScroll.top;
203
+ }
204
+ for (const error of snapshot.errors) {
205
+ const row = [...root.querySelectorAll('[data-error-id]')]
206
+ .find((candidate) => candidate.getAttribute('data-error-id') === error.id);
207
+ const code = row?.querySelector('code');
208
+ const meta = row?.querySelector('.error-meta');
209
+ if (code)
210
+ code.textContent = error.message;
211
+ if (meta)
212
+ meta.textContent = [error.source, error.service && error.method ? `${error.service}.${error.method}` : error.service ?? error.method, error.path, error.code].filter(Boolean).join(' · ');
213
+ }
214
+ root.querySelector('[data-expand]')?.addEventListener('click', () => {
215
+ open = true;
216
+ render();
217
+ root.querySelector('[data-collapse]')?.focus();
218
+ });
219
+ root.querySelector('[data-collapse]')?.addEventListener('click', () => {
220
+ open = false;
221
+ render();
222
+ root.querySelector('[data-expand]')?.focus();
223
+ });
224
+ root.querySelector('[data-update-worker]')?.addEventListener('click', () => {
225
+ if (!snapshot.updateAvailable || snapshot.updatingWorker)
226
+ return;
227
+ void options.runtime.updateWorker().catch(() => { });
228
+ });
229
+ for (const button of root.querySelectorAll('[data-copy-error]')) {
230
+ button.addEventListener('click', () => {
231
+ const error = snapshot.errors.find((item) => item.id === button.dataset.copyError);
232
+ if (!error || !clipboard)
233
+ return;
234
+ void clipboard.writeText(formatPyricRuntimeError(error)).catch(() => {
235
+ button.setAttribute('data-copy-failed', '');
236
+ button.setAttribute('aria-label', 'Copy failed');
237
+ button.title = 'Copy failed';
238
+ });
239
+ });
240
+ }
241
+ if (focusToken) {
242
+ const candidates = root.querySelectorAll(`[${focusToken.attribute}]`);
243
+ const replacement = [...candidates].find((candidate) => focusToken.value === null || candidate.getAttribute(focusToken.attribute) === focusToken.value);
244
+ replacement?.focus();
245
+ }
246
+ };
247
+ documentLike.body.append(host);
248
+ const unsubscribe = options.runtime.subscribe(render);
249
+ return {
250
+ element: host,
251
+ dispose() {
252
+ unsubscribe();
253
+ host.remove();
254
+ },
255
+ };
256
+ }
257
+ //# sourceMappingURL=chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chip.js","sourceRoot":"","sources":["../../../src/serve/runtime/chip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Stable routes and identity used by the served runtime and its UI. */
2
+ export declare const PYRIC_WORKER_URL = "/__pyric/sdk/worker.js";
3
+ export declare const PYRIC_WORKER_NAME = "pyric-shared-worker";
4
+ export declare const PYRIC_STUDIO_URL = "/__pyric/ui/";
5
+ export interface PyricRuntimeManifest {
6
+ studioUrl: string;
7
+ worker: {
8
+ url: string;
9
+ name: string;
10
+ /** Content epoch served by the current dev server; null in in-page mode. */
11
+ servedEpoch: string | null;
12
+ };
13
+ }
14
+ interface RuntimeDocument {
15
+ querySelector(selector: string): {
16
+ getAttribute(name: string): string | null;
17
+ } | null;
18
+ }
19
+ /** Read the server-stamped worker epoch before application code starts. */
20
+ export declare function readPyricRuntimeManifest(documentLike?: RuntimeDocument | undefined): PyricRuntimeManifest;
21
+ export {};
22
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/serve/runtime/manifest.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AACzD,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,4EAA4E;QAC5E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH;AAED,UAAU,eAAe;IACvB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACvF;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,eAAe,GAAG,SAAkE,GACjG,oBAAoB,CActB"}
@@ -0,0 +1,20 @@
1
+ /** Stable routes and identity used by the served runtime and its UI. */
2
+ export const PYRIC_WORKER_URL = '/__pyric/sdk/worker.js';
3
+ export const PYRIC_WORKER_NAME = 'pyric-shared-worker';
4
+ export const PYRIC_STUDIO_URL = '/__pyric/ui/';
5
+ /** Read the server-stamped worker epoch before application code starts. */
6
+ export function readPyricRuntimeManifest(documentLike = typeof document === 'undefined' ? undefined : document) {
7
+ const servedEpoch = documentLike
8
+ ?.querySelector('meta[name="pyric-worker-v"]')
9
+ ?.getAttribute('content')
10
+ ?.trim() || null;
11
+ return {
12
+ studioUrl: PYRIC_STUDIO_URL,
13
+ worker: {
14
+ url: PYRIC_WORKER_URL,
15
+ name: PYRIC_WORKER_NAME,
16
+ servedEpoch,
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/serve/runtime/manifest.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAgB/C,2EAA2E;AAC3E,MAAM,UAAU,wBAAwB,CACtC,eAA4C,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;IAElG,MAAM,WAAW,GAAG,YAAY;QAC9B,EAAE,aAAa,CAAC,6BAA6B,CAAC;QAC9C,EAAE,YAAY,CAAC,SAAS,CAAC;QACzB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAEnB,OAAO;QACL,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE;YACN,GAAG,EAAE,gBAAgB;YACrB,IAAI,EAAE,iBAAiB;YACvB,WAAW;SACZ;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { SandboxEvent } from 'pyric/sandbox';
2
+ import type { PyricRuntimeManifest } from './manifest.js';
3
+ export type PyricRuntimeMode = 'starting' | 'shared-worker' | 'in-page';
4
+ export type PyricRuntimeErrorSource = 'sandbox' | 'worker' | 'runtime';
5
+ export interface PyricRuntimeError {
6
+ id: string;
7
+ source: PyricRuntimeErrorSource;
8
+ at: number;
9
+ message: string;
10
+ code?: string;
11
+ stack?: string;
12
+ service?: string;
13
+ method?: string;
14
+ path?: string;
15
+ }
16
+ export interface PyricRuntimeSnapshot {
17
+ manifest: PyricRuntimeManifest;
18
+ mode: PyricRuntimeMode;
19
+ servedEpoch: string | null;
20
+ runningEpoch: string | null;
21
+ updateAvailable: boolean;
22
+ updatingWorker: boolean;
23
+ errors: readonly PyricRuntimeError[];
24
+ }
25
+ export interface PyricRuntimeStatus {
26
+ getSnapshot(): PyricRuntimeSnapshot;
27
+ subscribe(listener: (snapshot: PyricRuntimeSnapshot) => void): () => void;
28
+ setWorker(input: {
29
+ mode: Exclude<PyricRuntimeMode, 'starting'>;
30
+ runningEpoch?: string | null;
31
+ }): void;
32
+ setWorkerUpdater(update: (() => Promise<void>) | null): void;
33
+ updateWorker(): Promise<void>;
34
+ reportError(error: unknown, source: PyricRuntimeErrorSource): void;
35
+ recordSandboxEvents(events: readonly SandboxEvent[]): void;
36
+ clearErrors(): void;
37
+ }
38
+ /** Convert thrown values into a serializable, copyable runtime error. */
39
+ export declare function normalizePyricRuntimeError(value: unknown, source: PyricRuntimeErrorSource, at?: number, id?: string): PyricRuntimeError;
40
+ /** Observable, bounded status model shared by the runtime and injected UI. */
41
+ export declare function createPyricRuntimeStatus(manifest: PyricRuntimeManifest, options?: {
42
+ maxErrors?: number;
43
+ }): PyricRuntimeStatus;
44
+ declare global {
45
+ var __pyricRuntime: PyricRuntimeStatus | undefined;
46
+ }
47
+ /** One global status source even when the runtime and UI are separate bundles. */
48
+ export declare function getPyricRuntimeStatus(): PyricRuntimeStatus;
49
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/serve/runtime/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,eAAe,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,uBAAuB,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,IAAI,oBAAoB,CAAC;IACpC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1E,SAAS,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACtG,gBAAgB,CAAC,MAAM,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACnE,mBAAmB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;IAC3D,WAAW,IAAI,IAAI,CAAC;CACrB;AAUD,yEAAyE;AACzE,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,uBAAuB,EAC/B,EAAE,SAAa,EACf,EAAE,SAAmC,GACpC,iBAAiB,CAuBnB;AA0CD,8EAA8E;AAC9E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,kBAAkB,CAiFpB;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,cAAc,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACpD;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,IAAI,kBAAkB,CAG1D"}
@@ -0,0 +1,164 @@
1
+ import { readPyricRuntimeManifest } from './manifest.js';
2
+ let nextErrorId = 0;
3
+ function errorCode(value) {
4
+ if (!value || typeof value !== 'object')
5
+ return undefined;
6
+ const code = value.code;
7
+ return typeof code === 'string' ? code : undefined;
8
+ }
9
+ /** Convert thrown values into a serializable, copyable runtime error. */
10
+ export function normalizePyricRuntimeError(value, source, at = Date.now(), id = `runtime-error-${++nextErrorId}`) {
11
+ if (value instanceof Error) {
12
+ return {
13
+ id,
14
+ source,
15
+ at,
16
+ message: value.message,
17
+ ...(errorCode(value) ? { code: errorCode(value) } : {}),
18
+ ...(value.stack ? { stack: value.stack } : {}),
19
+ };
20
+ }
21
+ if (typeof value === 'string')
22
+ return { id, source, at, message: value };
23
+ if (value && typeof value === 'object') {
24
+ const message = value.message;
25
+ return {
26
+ id,
27
+ source,
28
+ at,
29
+ message: typeof message === 'string' ? message : String(value),
30
+ ...(errorCode(value) ? { code: errorCode(value) } : {}),
31
+ };
32
+ }
33
+ return { id, source, at, message: String(value) };
34
+ }
35
+ function sandboxError(event) {
36
+ if (event.kind === 'runtime_error') {
37
+ return {
38
+ id: event.id,
39
+ source: 'sandbox',
40
+ at: event.at,
41
+ service: event.service,
42
+ method: event.method,
43
+ ...(event.path ? { path: event.path } : {}),
44
+ ...(event.error.code ? { code: event.error.code } : {}),
45
+ message: event.error.message,
46
+ };
47
+ }
48
+ if (event.kind === 'listener_errored' && event.error) {
49
+ return {
50
+ id: event.id,
51
+ source: 'sandbox',
52
+ at: event.at,
53
+ service: 'firestore',
54
+ method: 'listener',
55
+ ...('path' in event.target ? { path: event.target.path } : {}),
56
+ code: event.error.code,
57
+ message: event.error.message,
58
+ };
59
+ }
60
+ if (event.kind === 'listener' && event.phase === 'errored' && event.error) {
61
+ return {
62
+ id: event.id,
63
+ source: 'sandbox',
64
+ at: event.at,
65
+ service: event.service,
66
+ method: 'listener',
67
+ ...(event.target.path ? { path: event.target.path } : {}),
68
+ ...(event.error.code ? { code: event.error.code } : {}),
69
+ message: event.error.message,
70
+ };
71
+ }
72
+ return null;
73
+ }
74
+ /** Observable, bounded status model shared by the runtime and injected UI. */
75
+ export function createPyricRuntimeStatus(manifest, options = {}) {
76
+ const maxErrors = Math.max(1, options.maxErrors ?? 50);
77
+ const listeners = new Set();
78
+ const errorIds = new Set();
79
+ let snapshot = {
80
+ manifest,
81
+ mode: 'starting',
82
+ servedEpoch: manifest.worker.servedEpoch,
83
+ runningEpoch: null,
84
+ updateAvailable: false,
85
+ updatingWorker: false,
86
+ errors: [],
87
+ };
88
+ let workerUpdater = null;
89
+ const publish = (next) => {
90
+ snapshot = next;
91
+ for (const listener of listeners)
92
+ listener(snapshot);
93
+ };
94
+ const appendError = (error) => {
95
+ if (errorIds.has(error.id))
96
+ return;
97
+ errorIds.add(error.id);
98
+ const errors = [...snapshot.errors, error].slice(-maxErrors);
99
+ const retained = new Set(errors.map((item) => item.id));
100
+ for (const id of errorIds)
101
+ if (!retained.has(id))
102
+ errorIds.delete(id);
103
+ publish({ ...snapshot, errors });
104
+ };
105
+ return {
106
+ getSnapshot: () => snapshot,
107
+ subscribe(listener) {
108
+ listeners.add(listener);
109
+ listener(snapshot);
110
+ return () => listeners.delete(listener);
111
+ },
112
+ setWorker({ mode, runningEpoch = null }) {
113
+ const servedEpoch = manifest.worker.servedEpoch;
114
+ publish({
115
+ ...snapshot,
116
+ mode,
117
+ runningEpoch,
118
+ updateAvailable: Boolean(mode === 'shared-worker'
119
+ && servedEpoch
120
+ && runningEpoch
121
+ && runningEpoch !== 'dev'
122
+ && servedEpoch !== runningEpoch),
123
+ updatingWorker: false,
124
+ });
125
+ },
126
+ setWorkerUpdater(update) {
127
+ workerUpdater = update;
128
+ },
129
+ async updateWorker() {
130
+ if (!snapshot.updateAvailable || snapshot.updatingWorker || !workerUpdater) {
131
+ throw new Error('No Pyric worker update is available.');
132
+ }
133
+ publish({ ...snapshot, updatingWorker: true });
134
+ try {
135
+ await workerUpdater();
136
+ }
137
+ catch (error) {
138
+ publish({ ...snapshot, updatingWorker: false });
139
+ appendError(normalizePyricRuntimeError(error, 'worker'));
140
+ throw error;
141
+ }
142
+ },
143
+ reportError(error, source) {
144
+ appendError(normalizePyricRuntimeError(error, source));
145
+ },
146
+ recordSandboxEvents(events) {
147
+ for (const event of events) {
148
+ const normalized = sandboxError(event);
149
+ if (normalized)
150
+ appendError(normalized);
151
+ }
152
+ },
153
+ clearErrors() {
154
+ errorIds.clear();
155
+ publish({ ...snapshot, errors: [] });
156
+ },
157
+ };
158
+ }
159
+ /** One global status source even when the runtime and UI are separate bundles. */
160
+ export function getPyricRuntimeStatus() {
161
+ return globalThis.__pyricRuntime
162
+ ??= createPyricRuntimeStatus(readPyricRuntimeManifest());
163
+ }
164
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/serve/runtime/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ClientDb } from '../worker/client/handles.js';
2
+ /** Construct the control connection without letting a browser policy failure abort runtime boot. */
3
+ export declare function connectRuntimeWorker(connect: () => ClientDb, reportError: (error: unknown) => void): ClientDb | null;
4
+ //# sourceMappingURL=worker-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-connection.d.ts","sourceRoot":"","sources":["../../../src/serve/runtime/worker-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,oGAAoG;AACpG,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,QAAQ,EACvB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GACpC,QAAQ,GAAG,IAAI,CAOjB"}
@@ -0,0 +1,11 @@
1
+ /** Construct the control connection without letting a browser policy failure abort runtime boot. */
2
+ export function connectRuntimeWorker(connect, reportError) {
3
+ try {
4
+ return connect();
5
+ }
6
+ catch (error) {
7
+ reportError(error);
8
+ return null;
9
+ }
10
+ }
11
+ //# sourceMappingURL=worker-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-connection.js","sourceRoot":"","sources":["../../../src/serve/runtime/worker-connection.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAClC,OAAuB,EACvB,WAAqC;IAErC,IAAI,CAAC;QACH,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const PYRIC_WORKER_GENERATION_KEY = "pyric:worker-generation";
2
+ interface EpochStorage {
3
+ getItem(key: string): string | null;
4
+ setItem(key: string, value: string): void;
5
+ removeItem?(key: string): void;
6
+ }
7
+ /** Select the replacement generation only after this page was told to move. */
8
+ export declare function workerNameForEpoch(_servedEpoch: string | null, storage: EpochStorage | undefined): string;
9
+ /** Persist the generation boundary before a page reloads. */
10
+ export declare function rememberWorkerEpoch(epoch: string, storage: EpochStorage | undefined): void;
11
+ /** Prove origin storage works without publishing a successor generation. */
12
+ export declare function preflightWorkerEpochStorage(storage: EpochStorage | undefined): void;
13
+ export {};
14
+ //# sourceMappingURL=worker-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-generation.d.ts","sourceRoot":"","sources":["../../../src/serve/runtime/worker-generation.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAGrE,UAAU,YAAY;IACpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,EAAE,YAAY,GAAG,SAAS,GAChC,MAAM,CAUR;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GAAG,SAAS,GAChC,IAAI,CAoBN;AAED,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAoBnF"}