@alloy-js/core 0.23.0-dev.1 → 0.23.0-dev.11

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 (337) hide show
  1. package/CHANGELOG.md +0 -22
  2. package/dist/devtools/index.html +80 -0
  3. package/dist/src/binder.d.ts +2 -0
  4. package/dist/src/binder.d.ts.map +1 -1
  5. package/dist/src/binder.js +60 -12
  6. package/dist/src/binder.js.map +1 -1
  7. package/dist/src/components/AccessExpression.d.ts +78 -0
  8. package/dist/src/components/AccessExpression.d.ts.map +1 -0
  9. package/dist/src/components/AccessExpression.js +218 -0
  10. package/dist/src/components/AccessExpression.js.map +1 -0
  11. package/dist/src/components/AccessExpression.test.d.ts +2 -0
  12. package/dist/src/components/AccessExpression.test.d.ts.map +1 -0
  13. package/dist/src/components/AccessExpression.test.js +137 -0
  14. package/dist/src/components/AccessExpression.test.js.map +1 -0
  15. package/dist/src/components/AppendFile.d.ts.map +1 -1
  16. package/dist/src/components/AppendFile.js +14 -3
  17. package/dist/src/components/AppendFile.js.map +1 -1
  18. package/dist/src/components/Block.js +1 -1
  19. package/dist/src/components/Block.js.map +1 -1
  20. package/dist/src/components/Declaration.d.ts.map +1 -1
  21. package/dist/src/components/Declaration.js +2 -1
  22. package/dist/src/components/Declaration.js.map +1 -1
  23. package/dist/src/components/For.d.ts.map +1 -1
  24. package/dist/src/components/For.js +1 -1
  25. package/dist/src/components/For.js.map +1 -1
  26. package/dist/src/components/List.d.ts.map +1 -1
  27. package/dist/src/components/List.js +1 -1
  28. package/dist/src/components/List.js.map +1 -1
  29. package/dist/src/components/Prose.js +2 -2
  30. package/dist/src/components/Prose.js.map +1 -1
  31. package/dist/src/components/Scope.d.ts.map +1 -1
  32. package/dist/src/components/Scope.js +6 -1
  33. package/dist/src/components/Scope.js.map +1 -1
  34. package/dist/src/components/SourceDirectory.d.ts.map +1 -1
  35. package/dist/src/components/SourceDirectory.js +1 -2
  36. package/dist/src/components/SourceDirectory.js.map +1 -1
  37. package/dist/src/components/Switch.d.ts.map +1 -1
  38. package/dist/src/components/Switch.js +1 -1
  39. package/dist/src/components/Switch.js.map +1 -1
  40. package/dist/src/components/TemplateFile.d.ts.map +1 -1
  41. package/dist/src/components/TemplateFile.js +18 -3
  42. package/dist/src/components/TemplateFile.js.map +1 -1
  43. package/dist/src/components/index.d.ts +1 -0
  44. package/dist/src/components/index.d.ts.map +1 -1
  45. package/dist/src/components/index.js +1 -0
  46. package/dist/src/components/index.js.map +1 -1
  47. package/dist/src/content-slot.d.ts.map +1 -1
  48. package/dist/src/content-slot.js +7 -6
  49. package/dist/src/content-slot.js.map +1 -1
  50. package/dist/src/context.d.ts.map +1 -1
  51. package/dist/src/context.js +10 -3
  52. package/dist/src/context.js.map +1 -1
  53. package/dist/src/debug/cli.d.ts +6 -0
  54. package/dist/src/debug/cli.d.ts.map +1 -0
  55. package/dist/src/{debug.js → debug/cli.js} +79 -82
  56. package/dist/src/debug/cli.js.map +1 -0
  57. package/dist/src/debug/diagnostics.test.d.ts +2 -0
  58. package/dist/src/debug/diagnostics.test.d.ts.map +1 -0
  59. package/dist/src/debug/diagnostics.test.js +46 -0
  60. package/dist/src/debug/diagnostics.test.js.map +1 -0
  61. package/dist/src/debug/effects.d.ts +81 -0
  62. package/dist/src/debug/effects.d.ts.map +1 -0
  63. package/dist/src/debug/effects.js +358 -0
  64. package/dist/src/debug/effects.js.map +1 -0
  65. package/dist/src/debug/effects.test.d.ts +2 -0
  66. package/dist/src/debug/effects.test.d.ts.map +1 -0
  67. package/dist/src/debug/effects.test.js +256 -0
  68. package/dist/src/debug/effects.test.js.map +1 -0
  69. package/dist/src/debug/files.d.ts +14 -0
  70. package/dist/src/debug/files.d.ts.map +1 -0
  71. package/dist/src/debug/files.js +29 -0
  72. package/dist/src/debug/files.js.map +1 -0
  73. package/dist/src/debug/files.test.d.ts +2 -0
  74. package/dist/src/debug/files.test.d.ts.map +1 -0
  75. package/dist/src/debug/files.test.js +66 -0
  76. package/dist/src/debug/files.test.js.map +1 -0
  77. package/dist/src/debug/index.d.ts +63 -0
  78. package/dist/src/debug/index.d.ts.map +1 -0
  79. package/dist/src/debug/index.js +71 -0
  80. package/dist/src/debug/index.js.map +1 -0
  81. package/dist/src/debug/message-format.test.d.ts +2 -0
  82. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  83. package/dist/src/debug/message-format.test.js +700 -0
  84. package/dist/src/debug/message-format.test.js.map +1 -0
  85. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  86. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  87. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  88. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  89. package/dist/src/debug/render.d.ts +57 -0
  90. package/dist/src/debug/render.d.ts.map +1 -0
  91. package/dist/src/debug/render.js +472 -0
  92. package/dist/src/debug/render.js.map +1 -0
  93. package/dist/src/debug/render.test.d.ts +2 -0
  94. package/dist/src/debug/render.test.d.ts.map +1 -0
  95. package/dist/src/debug/render.test.js +291 -0
  96. package/dist/src/debug/render.test.js.map +1 -0
  97. package/dist/src/debug/serialize.d.ts +9 -0
  98. package/dist/src/debug/serialize.d.ts.map +1 -0
  99. package/dist/src/debug/serialize.js +70 -0
  100. package/dist/src/debug/serialize.js.map +1 -0
  101. package/dist/src/debug/symbols.d.ts +16 -0
  102. package/dist/src/debug/symbols.d.ts.map +1 -0
  103. package/dist/src/debug/symbols.js +196 -0
  104. package/dist/src/debug/symbols.js.map +1 -0
  105. package/dist/src/debug/symbols.test.d.ts +2 -0
  106. package/dist/src/debug/symbols.test.d.ts.map +1 -0
  107. package/dist/src/debug/symbols.test.js +93 -0
  108. package/dist/src/debug/symbols.test.js.map +1 -0
  109. package/dist/src/debug/trace-writer.d.ts +55 -0
  110. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  111. package/dist/src/debug/trace-writer.js +658 -0
  112. package/dist/src/debug/trace-writer.js.map +1 -0
  113. package/dist/src/debug/trace.d.ts +342 -0
  114. package/dist/src/debug/trace.d.ts.map +1 -0
  115. package/dist/src/debug/trace.js +446 -0
  116. package/dist/src/debug/trace.js.map +1 -0
  117. package/dist/src/devtools/devtools-protocol.d.ts +389 -0
  118. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -0
  119. package/dist/src/devtools/devtools-protocol.js +2 -0
  120. package/dist/src/devtools/devtools-protocol.js.map +1 -0
  121. package/dist/src/devtools/devtools-server.browser.d.ts +23 -0
  122. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -0
  123. package/dist/src/devtools/devtools-server.browser.js +33 -0
  124. package/dist/src/devtools/devtools-server.browser.js.map +1 -0
  125. package/dist/src/devtools/devtools-server.d.ts +66 -0
  126. package/dist/src/devtools/devtools-server.d.ts.map +1 -0
  127. package/dist/src/devtools/devtools-server.js +444 -0
  128. package/dist/src/devtools/devtools-server.js.map +1 -0
  129. package/dist/src/devtools/devtools-transport.d.ts +23 -0
  130. package/dist/src/devtools/devtools-transport.d.ts.map +1 -0
  131. package/dist/src/devtools/devtools-transport.js +114 -0
  132. package/dist/src/devtools/devtools-transport.js.map +1 -0
  133. package/dist/src/devtools-entry.browser.d.ts +4 -0
  134. package/dist/src/devtools-entry.browser.d.ts.map +1 -0
  135. package/dist/src/devtools-entry.browser.js +2 -0
  136. package/dist/src/devtools-entry.browser.js.map +1 -0
  137. package/dist/src/devtools-entry.d.ts +4 -0
  138. package/dist/src/devtools-entry.d.ts.map +1 -0
  139. package/dist/src/devtools-entry.js +2 -0
  140. package/dist/src/devtools-entry.js.map +1 -0
  141. package/dist/src/diagnostics.d.ts +34 -0
  142. package/dist/src/diagnostics.d.ts.map +1 -0
  143. package/dist/src/diagnostics.js +89 -0
  144. package/dist/src/diagnostics.js.map +1 -0
  145. package/dist/src/index.d.ts +3 -2
  146. package/dist/src/index.d.ts.map +1 -1
  147. package/dist/src/index.js +3 -2
  148. package/dist/src/index.js.map +1 -1
  149. package/dist/src/print-hook.d.ts +14 -0
  150. package/dist/src/print-hook.d.ts.map +1 -0
  151. package/dist/src/print-hook.js +10 -0
  152. package/dist/src/print-hook.js.map +1 -0
  153. package/dist/src/reactive-union-set.d.ts.map +1 -1
  154. package/dist/src/reactive-union-set.js +28 -3
  155. package/dist/src/reactive-union-set.js.map +1 -1
  156. package/dist/src/reactivity.d.ts +60 -7
  157. package/dist/src/reactivity.d.ts.map +1 -1
  158. package/dist/src/reactivity.js +308 -39
  159. package/dist/src/reactivity.js.map +1 -1
  160. package/dist/src/render-stack.d.ts +18 -1
  161. package/dist/src/render-stack.d.ts.map +1 -1
  162. package/dist/src/render-stack.js +61 -1
  163. package/dist/src/render-stack.js.map +1 -1
  164. package/dist/src/render.d.ts +8 -15
  165. package/dist/src/render.d.ts.map +1 -1
  166. package/dist/src/render.js +424 -109
  167. package/dist/src/render.js.map +1 -1
  168. package/dist/src/resource.d.ts.map +1 -1
  169. package/dist/src/resource.js +5 -0
  170. package/dist/src/resource.js.map +1 -1
  171. package/dist/src/scheduler.d.ts +13 -0
  172. package/dist/src/scheduler.d.ts.map +1 -1
  173. package/dist/src/scheduler.js +150 -13
  174. package/dist/src/scheduler.js.map +1 -1
  175. package/dist/src/symbols/basic-symbol.d.ts.map +1 -1
  176. package/dist/src/symbols/basic-symbol.js +6 -1
  177. package/dist/src/symbols/basic-symbol.js.map +1 -1
  178. package/dist/src/symbols/decl.d.ts.map +1 -1
  179. package/dist/src/symbols/decl.js +5 -1
  180. package/dist/src/symbols/decl.js.map +1 -1
  181. package/dist/src/symbols/output-scope.d.ts +2 -1
  182. package/dist/src/symbols/output-scope.d.ts.map +1 -1
  183. package/dist/src/symbols/output-scope.js +13 -8
  184. package/dist/src/symbols/output-scope.js.map +1 -1
  185. package/dist/src/symbols/output-symbol.d.ts +1 -0
  186. package/dist/src/symbols/output-symbol.d.ts.map +1 -1
  187. package/dist/src/symbols/output-symbol.js +25 -8
  188. package/dist/src/symbols/output-symbol.js.map +1 -1
  189. package/dist/src/symbols/symbol-flow.d.ts.map +1 -1
  190. package/dist/src/symbols/symbol-flow.js +24 -8
  191. package/dist/src/symbols/symbol-flow.js.map +1 -1
  192. package/dist/src/symbols/symbol-slot.d.ts.map +1 -1
  193. package/dist/src/symbols/symbol-slot.js +15 -0
  194. package/dist/src/symbols/symbol-slot.js.map +1 -1
  195. package/dist/src/symbols/symbol-slot.test.d.ts +2 -0
  196. package/dist/src/symbols/symbol-slot.test.d.ts.map +1 -0
  197. package/dist/src/symbols/symbol-slot.test.js +35 -0
  198. package/dist/src/symbols/symbol-slot.test.js.map +1 -0
  199. package/dist/src/symbols/symbol-table.d.ts.map +1 -1
  200. package/dist/src/symbols/symbol-table.js +6 -5
  201. package/dist/src/symbols/symbol-table.js.map +1 -1
  202. package/dist/src/trace.d.ts +2 -0
  203. package/dist/src/trace.d.ts.map +1 -0
  204. package/dist/src/trace.js +2 -0
  205. package/dist/src/trace.js.map +1 -0
  206. package/dist/src/tracer.d.ts +2 -228
  207. package/dist/src/tracer.d.ts.map +1 -1
  208. package/dist/src/tracer.js +5 -298
  209. package/dist/src/tracer.js.map +1 -1
  210. package/dist/src/utils.d.ts.map +1 -1
  211. package/dist/src/utils.js +17 -9
  212. package/dist/src/utils.js.map +1 -1
  213. package/dist/test/components/append-file.test.d.ts.map +1 -1
  214. package/dist/test/components/append-file.test.js +18 -10
  215. package/dist/test/components/append-file.test.js.map +1 -1
  216. package/dist/test/components/template-file.test.d.ts.map +1 -1
  217. package/dist/test/components/template-file.test.js +6 -4
  218. package/dist/test/components/template-file.test.js.map +1 -1
  219. package/dist/test/lazy-isempty.test.d.ts +2 -0
  220. package/dist/test/lazy-isempty.test.d.ts.map +1 -0
  221. package/dist/test/lazy-isempty.test.js +89 -0
  222. package/dist/test/lazy-isempty.test.js.map +1 -0
  223. package/dist/test/reactive-union-set-disposers.test.d.ts +2 -0
  224. package/dist/test/reactive-union-set-disposers.test.d.ts.map +1 -0
  225. package/dist/test/reactive-union-set-disposers.test.js +98 -0
  226. package/dist/test/reactive-union-set-disposers.test.js.map +1 -0
  227. package/dist/test/reactivity/shallow-reactive.test.d.ts +2 -0
  228. package/dist/test/reactivity/shallow-reactive.test.d.ts.map +1 -0
  229. package/dist/test/reactivity/shallow-reactive.test.js +52 -0
  230. package/dist/test/reactivity/shallow-reactive.test.js.map +1 -0
  231. package/dist/test/rendering/basic.test.js +3 -0
  232. package/dist/test/rendering/basic.test.js.map +1 -1
  233. package/dist/test/rendering/print-render-stack.test.d.ts.map +1 -1
  234. package/dist/test/rendering/print-render-stack.test.js +91 -98
  235. package/dist/test/rendering/print-render-stack.test.js.map +1 -1
  236. package/dist/test/scheduler-extended.test.d.ts +2 -0
  237. package/dist/test/scheduler-extended.test.d.ts.map +1 -0
  238. package/dist/test/scheduler-extended.test.js +96 -0
  239. package/dist/test/scheduler-extended.test.js.map +1 -0
  240. package/dist/test/scheduler.test.d.ts +2 -0
  241. package/dist/test/scheduler.test.d.ts.map +1 -0
  242. package/dist/test/scheduler.test.js +46 -0
  243. package/dist/test/scheduler.test.js.map +1 -0
  244. package/dist/testing/create-test-wrapper.d.ts +1 -1
  245. package/dist/testing/create-test-wrapper.d.ts.map +1 -1
  246. package/dist/testing/create-test-wrapper.js +1 -1
  247. package/dist/testing/create-test-wrapper.js.map +1 -1
  248. package/dist/testing/devtools-utils.d.ts +35 -0
  249. package/dist/testing/devtools-utils.d.ts.map +1 -0
  250. package/dist/testing/devtools-utils.js +162 -0
  251. package/dist/testing/devtools-utils.js.map +1 -0
  252. package/dist/testing/extend-expect.d.ts.map +1 -1
  253. package/dist/testing/extend-expect.js +63 -1
  254. package/dist/testing/extend-expect.js.map +1 -1
  255. package/dist/testing/render.d.ts +2 -2
  256. package/dist/testing/render.d.ts.map +1 -1
  257. package/dist/testing/render.js +2 -2
  258. package/dist/testing/render.js.map +1 -1
  259. package/dist/tsconfig.tsbuildinfo +1 -1
  260. package/package.json +21 -7
  261. package/scripts/copy-devtools-ui.mjs +26 -0
  262. package/src/binder.ts +117 -53
  263. package/src/components/AccessExpression.test.tsx +132 -0
  264. package/src/components/AccessExpression.tsx +344 -0
  265. package/src/components/AppendFile.tsx +14 -9
  266. package/src/components/Block.tsx +1 -1
  267. package/src/components/Declaration.tsx +2 -1
  268. package/src/components/For.tsx +14 -10
  269. package/src/components/List.tsx +7 -4
  270. package/src/components/Prose.tsx +1 -1
  271. package/src/components/Scope.tsx +6 -1
  272. package/src/components/SourceDirectory.tsx +1 -2
  273. package/src/components/Switch.tsx +11 -7
  274. package/src/components/TemplateFile.tsx +18 -9
  275. package/src/components/index.tsx +1 -0
  276. package/src/content-slot.tsx +7 -7
  277. package/src/context.ts +17 -6
  278. package/src/{debug.ts → debug/cli.ts} +114 -125
  279. package/src/debug/diagnostics.test.tsx +56 -0
  280. package/src/debug/effects.test.tsx +301 -0
  281. package/src/debug/effects.ts +531 -0
  282. package/src/debug/files.test.tsx +76 -0
  283. package/src/debug/files.ts +40 -0
  284. package/src/debug/index.ts +132 -0
  285. package/src/debug/message-format.test.tsx +759 -0
  286. package/src/debug/render-tree-orphans.test.tsx +344 -0
  287. package/src/debug/render.test.tsx +357 -0
  288. package/src/debug/render.ts +698 -0
  289. package/src/debug/serialize.ts +85 -0
  290. package/src/debug/symbols.test.tsx +105 -0
  291. package/src/debug/symbols.ts +322 -0
  292. package/src/debug/trace-writer.ts +969 -0
  293. package/src/debug/trace.ts +309 -0
  294. package/src/devtools/devtools-protocol.ts +497 -0
  295. package/src/devtools/devtools-server.browser.ts +62 -0
  296. package/src/devtools/devtools-server.ts +468 -0
  297. package/src/devtools/devtools-transport.ts +154 -0
  298. package/src/devtools-entry.browser.ts +48 -0
  299. package/src/devtools-entry.ts +48 -0
  300. package/src/diagnostics.ts +150 -0
  301. package/src/index.ts +2 -7
  302. package/src/print-hook.ts +22 -0
  303. package/src/reactive-union-set.ts +85 -44
  304. package/src/reactivity.ts +396 -58
  305. package/src/render-stack.ts +73 -1
  306. package/src/render.ts +544 -161
  307. package/src/resource.ts +28 -19
  308. package/src/scheduler.ts +209 -14
  309. package/src/symbols/basic-symbol.ts +6 -1
  310. package/src/symbols/decl.ts +5 -1
  311. package/src/symbols/output-scope.ts +21 -13
  312. package/src/symbols/output-symbol.ts +34 -14
  313. package/src/symbols/symbol-flow.ts +76 -39
  314. package/src/symbols/symbol-slot.test.tsx +41 -0
  315. package/src/symbols/symbol-slot.tsx +47 -20
  316. package/src/symbols/symbol-table.ts +6 -10
  317. package/src/trace.ts +1 -0
  318. package/src/tracer.ts +13 -242
  319. package/src/utils.tsx +31 -21
  320. package/temp/api.json +5700 -3015
  321. package/test/components/append-file.test.tsx +36 -29
  322. package/test/components/template-file.test.tsx +11 -11
  323. package/test/lazy-isempty.test.tsx +106 -0
  324. package/test/reactive-union-set-disposers.test.tsx +112 -0
  325. package/test/reactivity/shallow-reactive.test.tsx +56 -0
  326. package/test/rendering/basic.test.tsx +4 -0
  327. package/test/rendering/print-render-stack.test.tsx +52 -43
  328. package/test/scheduler-extended.test.tsx +122 -0
  329. package/test/scheduler.test.tsx +50 -0
  330. package/testing/create-test-wrapper.tsx +1 -1
  331. package/testing/devtools-utils.ts +245 -0
  332. package/testing/extend-expect.ts +89 -0
  333. package/testing/render.ts +2 -2
  334. package/testing/vitest.d.ts +9 -0
  335. package/dist/src/debug.d.ts +0 -14
  336. package/dist/src/debug.d.ts.map +0 -1
  337. package/dist/src/debug.js.map +0 -1
@@ -0,0 +1,497 @@
1
+ /**
2
+ * Alloy Devtools Protocol
3
+ * =======================
4
+ *
5
+ * Communication protocol between the Alloy debug runtime (core) and the
6
+ * devtools UI client, transported over WebSocket.
7
+ *
8
+ * Message shapes are flat snake_case objects that mirror the SQLite trace-writer
9
+ * row shapes so no format translation is needed on the wire.
10
+ *
11
+ * ─── IDs ─────────────────────────────────────────────────────────────────────
12
+ *
13
+ * All entity IDs (effects, refs, reactive-property refs, non-ref targets)
14
+ * are positive monotonically increasing integers drawn from their respective
15
+ * counters. Ref IDs and reactive-property IDs share a single counter so
16
+ * they never collide. There are no negative or sentinel IDs.
17
+ *
18
+ * ─── Effects ─────────────────────────────────────────────────────────────────
19
+ *
20
+ * An effect is any reactive computation tracked by Alloy's reactivity system.
21
+ *
22
+ * name Human-readable label. Format varies:
23
+ * "render:ComponentName" — render effect for a component
24
+ * "memo:For" — memo inside a For component
25
+ * "memo:props.children" — memo from JSX expression
26
+ * "binder:notifySymbolCreated" — binder infrastructure
27
+ * "myCallback" — user effect from fn.name
28
+ * For memos created by JSX expression tracking, the babel plugin
29
+ * generates a description of the expression (e.g. "props.foo").
30
+ *
31
+ * effect_type Optional effect category string. Set by framework code via
32
+ * the debug options on effect(). Values include "render",
33
+ * "content", "context", "resource", "binder", "list", "symbol",
34
+ * "collection", etc. null when no category was assigned (common
35
+ * for memos and user-created effects). Useful for display and
36
+ * grouping but NOT used for user-vs-external filtering.
37
+ *
38
+ * source_file / source_line / source_col
39
+ * Where the effect was created. Captured via V8 CallSite API
40
+ * with source map resolution (when --enable-source-maps is
41
+ * active). Points at the component or user code that called
42
+ * effect()/memo(), not the reactivity internals. May be null
43
+ * if the entire call stack is framework-internal.
44
+ *
45
+ * "User only" filtering:
46
+ * Based purely on source_file. An effect is "user code" when its
47
+ * source_file resolves to a path OUTSIDE node_modules (i.e. inside the
48
+ * user's project). Effects whose source_file is inside node_modules
49
+ * (including @alloy-js/* and any third-party library packages) or is
50
+ * null are "external" effects. The effect type and name are never used
51
+ * for this classification.
52
+ *
53
+ * ─── Refs ────────────────────────────────────────────────────────────────────
54
+ *
55
+ * A ref is any individually tracked reactive value. There are several kinds:
56
+ *
57
+ * kind="ref" Created by alloy's ref() wrapper.
58
+ * kind="shallowRef" Created by alloy's shallowRef() wrapper.
59
+ * kind="computed" Created by alloy's computed() wrapper.
60
+ * kind="reactive-property" A property of a reactive object, lazily
61
+ * registered on first track/trigger. Each
62
+ * (target, key) pair gets its own ref entry.
63
+ *
64
+ * Alloy wraps shallowReactive() to capture creation locations. Objects
65
+ * created via alloy's shallowReactive() wrapper have their creation site
66
+ * stored in a WeakMap. When a reactive-property ref is registered for such
67
+ * an object, the property ref inherits the shallowReactive() creation
68
+ * location. For objects using manual reactivity (e.g. OutputSymbol, which
69
+ * calls Vue's track()/trigger() directly on `this` rather than going through
70
+ * alloy's shallowReactive wrapper), the creation site is unknown and the
71
+ * first track/trigger site is used instead (flagged with is_approx_location).
72
+ *
73
+ * label Optional human-readable name. Takes priority over kind for
74
+ * display. Examples:
75
+ * "memo:For" — memo's internal ref
76
+ * "TSOutputSymbol \"Foo\".name" — reactive property
77
+ * When displaying, prefer: label ?? kind. The numeric ID is
78
+ * always shown separately as a dimmed suffix, never as part
79
+ * of the label text.
80
+ *
81
+ * is_infrastructure
82
+ * Boolean. True for refs created by framework internals that
83
+ * are implementation details (context.isEmpty, mapJoin index/
84
+ * joiner counters, devtools rerender tokens). These are not
85
+ * meaningful to end users and are always excluded in
86
+ * "user only" mode.
87
+ *
88
+ * is_approx_location
89
+ * Boolean. True when the source location was inferred from
90
+ * first usage rather than the actual creation site. Applies
91
+ * to reactive-property refs whose parent object was not
92
+ * created via alloy's shallowReactive() wrapper (e.g.
93
+ * OutputSymbol class instances with manual track/trigger).
94
+ * The UI should show a subtle indicator (e.g. a small muted
95
+ * icon with a tooltip), not a prominent warning.
96
+ *
97
+ * source_file / source_line / source_col
98
+ * Where the ref was created. For reactive-property refs from
99
+ * shallowReactive() objects, this is the shallowReactive()
100
+ * call site. For reactive-property refs from manual-reactivity
101
+ * objects, this is the first track site (is_approx_location=1).
102
+ * For regular refs/shallowRefs/computed, this is the call site
103
+ * with framework-internal stack frames skipped.
104
+ *
105
+ * "User only" filtering:
106
+ * A ref is "user code" when is_infrastructure is false AND source_file
107
+ * resolves to a path outside node_modules. Infrastructure refs are
108
+ * always excluded in user-only mode regardless of source location.
109
+ *
110
+ * ─── Edges ───────────────────────────────────────────────────────────────────
111
+ *
112
+ * Edges connect effects to refs via track/trigger relationships.
113
+ * ref_id points to a registered ref. target_id/target_key provide the
114
+ * raw reactive target info. For ref-backed edges, ref_id == target_id.
115
+ *
116
+ * ─── Source Location Resolution ──────────────────────────────────────────────
117
+ *
118
+ * Captured at entity creation time via V8's structured CallSite API.
119
+ * Framework-internal frames (reactivity engine, renderer, scheduler, debug
120
+ * infra) are skipped so the location points at the component or user code.
121
+ *
122
+ * When --enable-source-maps is active, paths and line numbers are resolved
123
+ * through source maps (.js → .ts). The server reports sourceMapEnabled in
124
+ * its handshake. Note: pnpm symlinks require realpathSync before
125
+ * findSourceMap lookup (Node's cache is keyed by real paths).
126
+ */
127
+
128
+ import type { SourceLocation } from "../debug/effects.js";
129
+
130
+ export type { SourceLocation };
131
+
132
+ // ─────────────────────────────────────────────────────────────────────────────
133
+ // Shared flat row types
134
+ // ─────────────────────────────────────────────────────────────────────────────
135
+
136
+ export interface DiagnosticRow {
137
+ message: string;
138
+ severity?: string;
139
+ source_file?: string;
140
+ source_line?: number;
141
+ source_col?: number;
142
+ component_stack?: string;
143
+ }
144
+
145
+ // ─────────────────────────────────────────────────────────────────────────────
146
+ // Legacy shared types (used by server code during migration)
147
+ // ─────────────────────────────────────────────────────────────────────────────
148
+
149
+ /** @deprecated Use flat fields on RenderNodeAddedMessage instead. */
150
+ export interface RenderTreeNode {
151
+ id: number;
152
+ kind: string;
153
+ name?: string;
154
+ propsSerialized?: string;
155
+ value?: string;
156
+ source?: SourceLocation;
157
+ }
158
+
159
+ /** @deprecated Use flat fields on RenderErrorMessage instead. */
160
+ export interface RenderErrorStackEntry {
161
+ name: string;
162
+ propsSerialized?: string;
163
+ renderNodeId?: number;
164
+ source?: SourceLocation;
165
+ }
166
+
167
+ // ─────────────────────────────────────────────────────────────────────────────
168
+ // Server → Client messages
169
+ // ─────────────────────────────────────────────────────────────────────────────
170
+
171
+ // -- debugger --
172
+
173
+ export interface DebuggerInfoMessage {
174
+ type: "debugger:info";
175
+ version: string;
176
+ cwd?: string;
177
+ sourceMapEnabled: boolean;
178
+ }
179
+
180
+ // -- render --
181
+
182
+ export interface RenderResetMessage {
183
+ type: "render:reset";
184
+ }
185
+
186
+ export interface RenderNodeAddedMessage {
187
+ type: "render:node_added";
188
+ id: number;
189
+ parent_id: number | null;
190
+ kind: string;
191
+ name?: string;
192
+ props?: string;
193
+ value?: string;
194
+ source_file?: string;
195
+ source_line?: number;
196
+ source_col?: number;
197
+ context_id?: number | null;
198
+ seq: number;
199
+ }
200
+
201
+ export interface RenderNodeUpdatedMessage {
202
+ type: "render:node_updated";
203
+ id: number;
204
+ props?: string;
205
+ }
206
+
207
+ export interface RenderNodeRemovedMessage {
208
+ type: "render:node_removed";
209
+ id: number;
210
+ }
211
+
212
+ export interface RenderErrorMessage {
213
+ type: "render:error";
214
+ name?: string;
215
+ message?: string;
216
+ stack?: string;
217
+ component_stack?: string;
218
+ seq: number;
219
+ }
220
+
221
+ export interface RenderCompleteMessage {
222
+ type: "render:complete";
223
+ }
224
+
225
+ // -- flush --
226
+
227
+ export interface FlushJobsCompleteMessage {
228
+ type: "flush:complete";
229
+ }
230
+
231
+ // -- effects --
232
+
233
+ export interface EffectAddedMessage {
234
+ type: "effect:added";
235
+ id: number;
236
+ name?: string;
237
+ effect_type?: string;
238
+ context_id?: number | null;
239
+ owner_context_id?: number | null;
240
+ component?: string;
241
+ source_file?: string;
242
+ source_line?: number;
243
+ source_col?: number;
244
+ source_package?: string;
245
+ is_infrastructure?: number;
246
+ seq: number;
247
+ }
248
+
249
+ export interface EffectUpdatedMessage {
250
+ type: "effect:updated";
251
+ id: number;
252
+ name?: string;
253
+ effect_type?: string;
254
+ context_id?: number | null;
255
+ owner_context_id?: number | null;
256
+ component?: string;
257
+ source_file?: string;
258
+ source_line?: number;
259
+ source_col?: number;
260
+ source_package?: string;
261
+ is_infrastructure?: number;
262
+ seq: number;
263
+ }
264
+
265
+ // -- refs --
266
+
267
+ export interface RefAddedMessage {
268
+ type: "ref:added";
269
+ id: number;
270
+ kind?: string;
271
+ label?: string;
272
+ created_by_effect_id?: number;
273
+ source_file?: string;
274
+ source_line?: number;
275
+ source_col?: number;
276
+ source_package?: string;
277
+ is_approx_location?: number;
278
+ seq: number;
279
+ }
280
+
281
+ // -- edges --
282
+
283
+ export interface EffectTrackMessage {
284
+ type: "edge:track";
285
+ seq: number;
286
+ effect_id: number;
287
+ ref_id?: number;
288
+ target_id?: number;
289
+ target_kind?: string;
290
+ target_label?: string;
291
+ target_key?: string;
292
+ }
293
+
294
+ export interface EffectTriggerMessage {
295
+ type: "edge:trigger";
296
+ seq: number;
297
+ effect_id: number;
298
+ caused_by?: number;
299
+ ref_id?: number;
300
+ target_id?: number;
301
+ target_kind?: string;
302
+ target_label?: string;
303
+ target_key?: string;
304
+ }
305
+
306
+ export interface EffectEdgeUpdatedMessage {
307
+ type: "edge:updated";
308
+ seq: number;
309
+ effect_id: number;
310
+ caused_by?: number;
311
+ ref_id?: number;
312
+ target_id?: number;
313
+ target_kind?: string;
314
+ target_label?: string;
315
+ target_key?: string;
316
+ }
317
+
318
+ // -- effect lifecycle --
319
+
320
+ export interface EffectLifecycleMessage {
321
+ type: "effect:lifecycle";
322
+ seq: number;
323
+ effect_id: number;
324
+ event: string;
325
+ trigger_ref_id?: number;
326
+ }
327
+
328
+ // -- scopes --
329
+
330
+ export interface ScopeAddedMessage {
331
+ type: "scope:added";
332
+ id: number;
333
+ name: string;
334
+ parent_id?: number | null;
335
+ owner_symbol_id?: number | null;
336
+ render_node_id?: number | null;
337
+ is_member_scope?: number;
338
+ is_transient?: number;
339
+ metadata?: string;
340
+ seq: number;
341
+ }
342
+
343
+ export interface ScopeUpdatedMessage {
344
+ type: "scope:updated";
345
+ id: number;
346
+ name: string;
347
+ parent_id?: number | null;
348
+ owner_symbol_id?: number | null;
349
+ render_node_id?: number | null;
350
+ is_member_scope?: number;
351
+ is_transient?: number;
352
+ metadata?: string;
353
+ seq: number;
354
+ }
355
+
356
+ export interface ScopeRemovedMessage {
357
+ type: "scope:removed";
358
+ id: number;
359
+ }
360
+
361
+ // -- symbols --
362
+
363
+ export interface SymbolAddedMessage {
364
+ type: "symbol:added";
365
+ id: number;
366
+ name: string;
367
+ original_name?: string;
368
+ scope_id?: number | null;
369
+ owner_symbol_id?: number | null;
370
+ render_node_id?: number | null;
371
+ is_member?: number;
372
+ is_transient?: number;
373
+ is_alias?: number;
374
+ moved_to_id?: number | null;
375
+ metadata?: string;
376
+ seq: number;
377
+ }
378
+
379
+ export interface SymbolUpdatedMessage {
380
+ type: "symbol:updated";
381
+ id: number;
382
+ name: string;
383
+ original_name?: string;
384
+ scope_id?: number | null;
385
+ owner_symbol_id?: number | null;
386
+ render_node_id?: number | null;
387
+ is_member?: number;
388
+ is_transient?: number;
389
+ is_alias?: number;
390
+ moved_to_id?: number | null;
391
+ metadata?: string;
392
+ seq: number;
393
+ }
394
+
395
+ export interface SymbolRemovedMessage {
396
+ type: "symbol:removed";
397
+ id: number;
398
+ }
399
+
400
+ // -- files --
401
+
402
+ export interface FileAddedMessage {
403
+ type: "file:added";
404
+ path: string;
405
+ filetype?: string;
406
+ render_node_id?: number;
407
+ seq: number;
408
+ }
409
+
410
+ export interface FileUpdatedMessage {
411
+ type: "file:updated";
412
+ path: string;
413
+ content?: string;
414
+ }
415
+
416
+ export interface FileRemovedMessage {
417
+ type: "file:removed";
418
+ path: string;
419
+ }
420
+
421
+ // -- directories --
422
+
423
+ export interface DirectoryAddedMessage {
424
+ type: "directory:added";
425
+ path: string;
426
+ }
427
+
428
+ export interface DirectoryRemovedMessage {
429
+ type: "directory:removed";
430
+ path: string;
431
+ }
432
+
433
+ // -- diagnostics --
434
+
435
+ export interface DiagnosticsReportMessage {
436
+ type: "diagnostics:report";
437
+ diagnostics: DiagnosticRow[];
438
+ }
439
+
440
+ export type ServerToClientMessage =
441
+ | DebuggerInfoMessage
442
+ | RenderResetMessage
443
+ | RenderNodeAddedMessage
444
+ | RenderNodeUpdatedMessage
445
+ | RenderNodeRemovedMessage
446
+ | RenderErrorMessage
447
+ | RenderCompleteMessage
448
+ | FlushJobsCompleteMessage
449
+ | EffectAddedMessage
450
+ | EffectUpdatedMessage
451
+ | RefAddedMessage
452
+ | EffectTrackMessage
453
+ | EffectTriggerMessage
454
+ | EffectEdgeUpdatedMessage
455
+ | EffectLifecycleMessage
456
+ | ScopeAddedMessage
457
+ | ScopeUpdatedMessage
458
+ | ScopeRemovedMessage
459
+ | SymbolAddedMessage
460
+ | SymbolUpdatedMessage
461
+ | SymbolRemovedMessage
462
+ | FileAddedMessage
463
+ | FileUpdatedMessage
464
+ | FileRemovedMessage
465
+ | DirectoryAddedMessage
466
+ | DirectoryRemovedMessage
467
+ | DiagnosticsReportMessage;
468
+
469
+ // ─────────────────────────────────────────────────────────────────────────────
470
+ // Client → Server messages
471
+ // ─────────────────────────────────────────────────────────────────────────────
472
+
473
+ export interface SubscribeMessage {
474
+ type: "subscribe";
475
+ channels: string[];
476
+ }
477
+
478
+ export interface UnsubscribeMessage {
479
+ type: "unsubscribe";
480
+ channels: string[];
481
+ }
482
+
483
+ export interface RerenderRequestMessage {
484
+ type: "render:rerender";
485
+ id: number;
486
+ }
487
+
488
+ export interface RerenderBreakRequestMessage {
489
+ type: "render:rerenderAndBreak";
490
+ id: number;
491
+ }
492
+
493
+ export type ClientToServerMessage =
494
+ | SubscribeMessage
495
+ | UnsubscribeMessage
496
+ | RerenderRequestMessage
497
+ | RerenderBreakRequestMessage;
@@ -0,0 +1,62 @@
1
+ // Browser stub for devtools-server - devtools are not supported in browsers
2
+
3
+ export interface DevtoolsIncomingMessage {
4
+ type: string;
5
+ [key: string]: unknown;
6
+ }
7
+
8
+ export interface DevtoolsServerInfo {
9
+ port: number;
10
+ connected: boolean;
11
+ }
12
+
13
+ export function isDevtoolsEnabled(): boolean {
14
+ return false;
15
+ }
16
+
17
+ export async function waitForDevtoolsConnection(): Promise<void> {
18
+ // No-op in browser
19
+ }
20
+
21
+ export interface EnableDevtoolsOptions {
22
+ port?: number;
23
+ waitForConnection?: boolean;
24
+ }
25
+
26
+ export async function enableDevtools(
27
+ _options?: EnableDevtoolsOptions,
28
+ ): Promise<void> {
29
+ // No-op in browser
30
+ }
31
+
32
+ export async function initDevtoolsIfEnabled(): Promise<void> {
33
+ // No-op in browser
34
+ }
35
+
36
+ export function registerDevtoolsMessageHandler(
37
+ _handler: (message: DevtoolsIncomingMessage) => void,
38
+ ): () => void {
39
+ return () => {};
40
+ }
41
+
42
+ export function assertDevtoolsConnectedForSyncRender(): void {
43
+ // No-op in browser
44
+ }
45
+
46
+ export function isDevtoolsConnected(): boolean {
47
+ return false;
48
+ }
49
+
50
+ export function getDevtoolsServerInfo(): DevtoolsServerInfo | null {
51
+ return null;
52
+ }
53
+
54
+ export async function enableDevtoolsAndConnect(
55
+ _options?: EnableDevtoolsOptions,
56
+ ): Promise<DevtoolsServerInfo | null> {
57
+ return null;
58
+ }
59
+
60
+ export async function resetDevtoolsServerForTests(): Promise<void> {
61
+ // No-op in browser
62
+ }