mutts 1.0.8 → 1.0.10

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 (195) hide show
  1. package/README.md +77 -35
  2. package/dist/browser.cjs +2144 -5355
  3. package/dist/browser.cjs.map +1 -1
  4. package/dist/browser.d.ts +2 -1655
  5. package/dist/browser.dev.cjs +110 -0
  6. package/dist/browser.dev.cjs.map +1 -0
  7. package/dist/browser.dev.d.ts +2 -0
  8. package/dist/browser.dev.esm.js +5 -0
  9. package/dist/browser.dev.esm.js.map +1 -0
  10. package/dist/browser.esm.js +20 -107
  11. package/dist/browser.esm.js.map +1 -1
  12. package/dist/chunks/{async-browser-CA0jPWIi.cjs → async-browser-BU_IfxYD.cjs} +19 -107
  13. package/dist/chunks/async-browser-BU_IfxYD.cjs.map +1 -0
  14. package/dist/chunks/{async-core-UqHzvJ-S.cjs → async-core-CRLKP3l-.cjs} +8 -4
  15. package/dist/chunks/async-core-CRLKP3l-.cjs.map +1 -0
  16. package/dist/chunks/{async-node-BYHuGTni.cjs → async-node-3PrbVAbB.cjs} +7 -12
  17. package/dist/chunks/async-node-3PrbVAbB.cjs.map +1 -0
  18. package/dist/chunks/index-CaaQQlPJ.esm.js +3174 -0
  19. package/dist/chunks/index-CaaQQlPJ.esm.js.map +1 -0
  20. package/dist/chunks/node-nKJBk8iJ.esm.js +96 -0
  21. package/dist/chunks/node-nKJBk8iJ.esm.js.map +1 -0
  22. package/dist/chunks/proxy-Dtg-bJ3T.cjs +3763 -0
  23. package/dist/chunks/proxy-Dtg-bJ3T.cjs.map +1 -0
  24. package/dist/chunks/proxy-r7lARftl.esm.js +3701 -0
  25. package/dist/chunks/proxy-r7lARftl.esm.js.map +1 -0
  26. package/dist/debug.cjs +980 -0
  27. package/dist/debug.cjs.map +1 -0
  28. package/dist/debug.d.ts +208 -0
  29. package/dist/debug.esm.js +950 -0
  30. package/dist/debug.esm.js.map +1 -0
  31. package/dist/devtools/manifest.json +1 -1
  32. package/dist/devtools/panel.html +1 -1
  33. package/dist/devtools/panel.js +107 -94
  34. package/dist/devtools/panel.js.map +1 -1
  35. package/dist/index.d.ts +1447 -13
  36. package/dist/mutts.umd.js +7167 -1
  37. package/dist/mutts.umd.js.map +1 -1
  38. package/dist/mutts.umd.min.js +1 -1
  39. package/dist/mutts.umd.min.js.map +1 -1
  40. package/dist/node.cjs +70 -66
  41. package/dist/node.cjs.map +1 -1
  42. package/dist/node.d.ts +2 -1
  43. package/dist/node.dev.cjs +110 -0
  44. package/dist/node.dev.cjs.map +1 -0
  45. package/dist/node.dev.d.ts +2 -0
  46. package/dist/node.dev.esm.js +6 -0
  47. package/dist/node.dev.esm.js.map +1 -0
  48. package/dist/node.esm.js +4 -103
  49. package/dist/node.esm.js.map +1 -1
  50. package/dist/{reactive/types.d.ts → types-W5vD6m2n.d.ts} +186 -93
  51. package/docs/ai/api-reference.md +12 -19
  52. package/docs/ai/manual.md +521 -17
  53. package/docs/events.md +57 -2
  54. package/docs/flavored.md +210 -0
  55. package/docs/reactive/advanced.md +314 -5
  56. package/docs/reactive/attend.md +142 -0
  57. package/docs/reactive/collections.md +76 -39
  58. package/docs/reactive/core.md +100 -14
  59. package/docs/reactive/debugging.md +123 -18
  60. package/docs/reactive/error-handling.md +121 -0
  61. package/docs/reactive/resource.md +125 -0
  62. package/docs/reactive/scan.md +247 -1
  63. package/docs/reactive.md +4 -1
  64. package/docs/std-decorators.md +102 -51
  65. package/docs/utils.md +70 -0
  66. package/docs/zone.md +3 -7
  67. package/package.json +64 -30
  68. package/dist/async/browser.d.ts +0 -2
  69. package/dist/async/browser.d.ts.map +0 -1
  70. package/dist/async/index.d.ts +0 -18
  71. package/dist/async/index.d.ts.map +0 -1
  72. package/dist/async/node.d.ts +0 -2
  73. package/dist/async/node.d.ts.map +0 -1
  74. package/dist/chunks/async-browser-CA0jPWIi.cjs.map +0 -1
  75. package/dist/chunks/async-core-UqHzvJ-S.cjs.map +0 -1
  76. package/dist/chunks/async-node-BYHuGTni.cjs.map +0 -1
  77. package/dist/chunks/index-DhaOVusv.esm.js +0 -6411
  78. package/dist/chunks/index-DhaOVusv.esm.js.map +0 -1
  79. package/dist/decorator.d.ts +0 -106
  80. package/dist/decorator.d.ts.map +0 -1
  81. package/dist/destroyable.d.ts +0 -87
  82. package/dist/destroyable.d.ts.map +0 -1
  83. package/dist/entry-browser.d.ts +0 -3
  84. package/dist/entry-browser.d.ts.map +0 -1
  85. package/dist/entry-node.d.ts +0 -3
  86. package/dist/entry-node.d.ts.map +0 -1
  87. package/dist/eventful.d.ts +0 -18
  88. package/dist/eventful.d.ts.map +0 -1
  89. package/dist/index.d.ts.map +0 -1
  90. package/dist/indexable.d.ts +0 -243
  91. package/dist/indexable.d.ts.map +0 -1
  92. package/dist/introspection.d.ts +0 -27
  93. package/dist/introspection.d.ts.map +0 -1
  94. package/dist/iterableWeak.d.ts +0 -53
  95. package/dist/iterableWeak.d.ts.map +0 -1
  96. package/dist/mixins.d.ts +0 -25
  97. package/dist/mixins.d.ts.map +0 -1
  98. package/dist/promiseChain.d.ts +0 -20
  99. package/dist/promiseChain.d.ts.map +0 -1
  100. package/dist/reactive/array.d.ts +0 -49
  101. package/dist/reactive/array.d.ts.map +0 -1
  102. package/dist/reactive/buffer.d.ts +0 -44
  103. package/dist/reactive/buffer.d.ts.map +0 -1
  104. package/dist/reactive/change.d.ts +0 -29
  105. package/dist/reactive/change.d.ts.map +0 -1
  106. package/dist/reactive/debug.d.ts +0 -111
  107. package/dist/reactive/debug.d.ts.map +0 -1
  108. package/dist/reactive/deep-touch.d.ts +0 -28
  109. package/dist/reactive/deep-touch.d.ts.map +0 -1
  110. package/dist/reactive/deep-watch-state.d.ts +0 -25
  111. package/dist/reactive/deep-watch-state.d.ts.map +0 -1
  112. package/dist/reactive/deep-watch.d.ts +0 -19
  113. package/dist/reactive/deep-watch.d.ts.map +0 -1
  114. package/dist/reactive/effect-context.d.ts +0 -7
  115. package/dist/reactive/effect-context.d.ts.map +0 -1
  116. package/dist/reactive/effects.d.ts +0 -151
  117. package/dist/reactive/effects.d.ts.map +0 -1
  118. package/dist/reactive/index.d.ts +0 -20
  119. package/dist/reactive/index.d.ts.map +0 -1
  120. package/dist/reactive/interface.d.ts +0 -64
  121. package/dist/reactive/interface.d.ts.map +0 -1
  122. package/dist/reactive/map.d.ts +0 -30
  123. package/dist/reactive/map.d.ts.map +0 -1
  124. package/dist/reactive/memoize.d.ts +0 -5
  125. package/dist/reactive/memoize.d.ts.map +0 -1
  126. package/dist/reactive/non-reactive-state.d.ts +0 -9
  127. package/dist/reactive/non-reactive-state.d.ts.map +0 -1
  128. package/dist/reactive/non-reactive.d.ts +0 -11
  129. package/dist/reactive/non-reactive.d.ts.map +0 -1
  130. package/dist/reactive/project.d.ts +0 -41
  131. package/dist/reactive/project.d.ts.map +0 -1
  132. package/dist/reactive/proxy-state.d.ts +0 -8
  133. package/dist/reactive/proxy-state.d.ts.map +0 -1
  134. package/dist/reactive/proxy.d.ts +0 -23
  135. package/dist/reactive/proxy.d.ts.map +0 -1
  136. package/dist/reactive/record.d.ts +0 -116
  137. package/dist/reactive/record.d.ts.map +0 -1
  138. package/dist/reactive/register.d.ts +0 -64
  139. package/dist/reactive/register.d.ts.map +0 -1
  140. package/dist/reactive/registry.d.ts +0 -20
  141. package/dist/reactive/registry.d.ts.map +0 -1
  142. package/dist/reactive/set.d.ts +0 -28
  143. package/dist/reactive/set.d.ts.map +0 -1
  144. package/dist/reactive/tracking.d.ts +0 -7
  145. package/dist/reactive/tracking.d.ts.map +0 -1
  146. package/dist/reactive/types.d.ts.map +0 -1
  147. package/dist/std-decorators.d.ts +0 -50
  148. package/dist/std-decorators.d.ts.map +0 -1
  149. package/dist/utils.d.ts +0 -49
  150. package/dist/utils.d.ts.map +0 -1
  151. package/dist/zone.d.ts +0 -40
  152. package/dist/zone.d.ts.map +0 -1
  153. package/docs/reactive/project.md +0 -93
  154. package/src/async/browser.ts +0 -319
  155. package/src/async/index.ts +0 -23
  156. package/src/async/node.ts +0 -104
  157. package/src/decorator.ts +0 -272
  158. package/src/destroyable.ts +0 -199
  159. package/src/entry-browser.ts +0 -5
  160. package/src/entry-node.ts +0 -5
  161. package/src/eventful.ts +0 -77
  162. package/src/index.d.ts +0 -12
  163. package/src/index.ts +0 -64
  164. package/src/indexable.ts +0 -526
  165. package/src/introspection.ts +0 -59
  166. package/src/iterableWeak.ts +0 -233
  167. package/src/mixins.ts +0 -123
  168. package/src/promiseChain.ts +0 -110
  169. package/src/reactive/array.ts +0 -507
  170. package/src/reactive/buffer.ts +0 -168
  171. package/src/reactive/change.ts +0 -138
  172. package/src/reactive/debug.ts +0 -517
  173. package/src/reactive/deep-touch.ts +0 -268
  174. package/src/reactive/deep-watch-state.ts +0 -82
  175. package/src/reactive/deep-watch.ts +0 -168
  176. package/src/reactive/effect-context.ts +0 -18
  177. package/src/reactive/effects.ts +0 -1382
  178. package/src/reactive/index.ts +0 -75
  179. package/src/reactive/interface.ts +0 -210
  180. package/src/reactive/map.ts +0 -158
  181. package/src/reactive/memoize.ts +0 -163
  182. package/src/reactive/non-reactive-state.ts +0 -49
  183. package/src/reactive/non-reactive.ts +0 -43
  184. package/src/reactive/project.ts +0 -453
  185. package/src/reactive/proxy-state.ts +0 -27
  186. package/src/reactive/proxy.ts +0 -264
  187. package/src/reactive/record.ts +0 -196
  188. package/src/reactive/register.ts +0 -419
  189. package/src/reactive/registry.ts +0 -59
  190. package/src/reactive/set.ts +0 -130
  191. package/src/reactive/tracking.ts +0 -44
  192. package/src/reactive/types.ts +0 -440
  193. package/src/std-decorators.ts +0 -217
  194. package/src/utils.ts +0 -301
  195. package/src/zone.ts +0 -138
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.esm.js","sources":["../debug/lineage.ts","../debug/lineage-panel.ts","../debug/debug.ts"],"sourcesContent":["import { getActiveEffect } from '../src/reactive/effect-context'\nimport { getEffectNode, getRoot } from '../src/reactive/registry'\nimport { type EffectTrigger, effectMarker } from '../src/reactive/types'\n\n/**\n * Structured stack frame\n */\nexport interface StackFrame {\n\tfunctionName: string\n\tfileName: string\n\tlineNumber: number\n\tcolumnNumber: number\n\traw: string\n}\n\n/**\n * Represents a segment in the effect lineage\n */\nexport interface LineageSegment {\n\teffect?: EffectTrigger\n\teffectName: string\n\tstack: StackFrame[]\n}\n\nconst lineageObjects = new WeakSet<any>()\n\n/**\n * Checks if an object is a lineage object\n */\nexport function isLineage(obj: any): obj is { segments: LineageSegment[] } {\n\treturn obj && typeof obj === 'object' && lineageObjects.has(obj)\n}\n\n\n/**\n * Parses a single stack line into a structured frame.\n * @param line - A line from Error.stack\n */\nexport function parseStackLine(line: string): StackFrame | null {\n\t// Node.js format: \" at functionName (file:line:column)\"\n\t// or \" at file:line:column\"\n\tconst nodeMatch = line.match(/^\\s*at\\s+(?:(.+?)\\s+\\()?(?:(.+?):(\\d+):(\\d+))\\)?$/)\n\t\n\t// Browser format (Firefox/Safari): \"functionName@file:line:column\" or \"file:line:column\"\n\t// Chrome/Edge use Node-like format but without \"at\" sometimes or with different prefixes\n\tconst browserMatch = line.match(/(?:(.+?)(?:\\@|\\(?))?(?:(.+?):(\\d+):(\\d+))(?:\\@|\\)?)$/)\n\n\tconst match = nodeMatch || browserMatch\n\tif (!match) return null\n\n\tconst [, functionName = 'anonymous', fileName, lineNumber, columnNumber] = match\n\n\treturn {\n\t\tfunctionName: functionName.trim(),\n\t\tfileName,\n\t\tlineNumber: parseInt(lineNumber, 10),\n\t\tcolumnNumber: parseInt(columnNumber, 10),\n\t\traw: line.trim(),\n\t}\n}\n\nlet internalFile: string | undefined\n\n/**\n * Gets the current call stack\n * @param skipFrames - Number of frames to skip\n * @param error - Optional error to use as source of stack\n */\nexport function getStackFrame(error = new Error()): StackFrame[] {\n\tif (!error.stack) return []\n\n\tconst lines = error.stack.split('\\n')\n\n\tconst lastLine = lines.findIndex((line) => line.includes(effectMarker.enter))\n\tif (lastLine !== -1) lines.splice(lastLine)\n\tconst firstLine = lines.findLastIndex((line) => line.includes(effectMarker.leave))\n\tif (firstLine !== -1) lines.splice(0, firstLine+1)\n\telse {\n\t\t// Dynamically identify the library's internal files if not already done\n\t\tif (!internalFile && lines[1]) {\n\t\t\tconst selfFrame = parseStackLine(lines[1])\n\t\t\tif (selfFrame) {\n\t\t\t\tinternalFile = selfFrame.fileName\n\t\t\t}\n\t\t}\n\n\t\t// Skip \"Error\" line and requested frames\n\t\tconst frames: StackFrame[] = []\n\n\t\t// Determine the \"base\" directory of the library to skip other internal files\n\t\t// We look for \"src\" or \"dist\" to be more specific than just the project root\n\t\tconst srcIndex = internalFile ? internalFile.lastIndexOf('/src/') : -1\n\t\tconst distIndex = internalFile ? internalFile.lastIndexOf('/dist/') : -1\n\t\tconst libraryBase = internalFile ? (\n\t\t\tsrcIndex !== -1 ? internalFile.substring(0, srcIndex + 5) : \n\t\t\t(distIndex !== -1 ? internalFile.substring(0, distIndex + 6) : \n\t\t\tinternalFile.substring(0, internalFile.lastIndexOf('/') + 1))\n\t\t) : undefined\n\t\tlet l\n\t\tfor (l = 1; l < lines.length; l++) {\n\t\t\tconst frame = parseStackLine(lines[l])\n\t\t\tif (!frame) continue\n\n\t\t\t// Robust skipping: if we are still in the internal area, skip it.\n\t\t\tconst isInternal = /Lineage$/.test(frame.functionName) ||\n\t\t\t\tframe.functionName === 'eval' ||\n\t\t\t\t[`getStackFrame`, `captureLineage`].includes(frame.functionName)\n\n\t\t\tif (!isInternal) break\n\t\t}\n\t\tlines.splice(0, l)\n\t}\n\n\treturn lines.map(parseStackLine).filter(Boolean)\n}\n\n\n/**\n * Traces the lineage of the current execution through nested effects\n * @param effect - Starting effect (defaults to active effect)\n */\nexport function getLineage(effect?: EffectTrigger): LineageSegment[] {\n\tconst currentEffect = effect ?? getActiveEffect()\n\tconst currentStack = getStackFrame() // Robustly skips internal mutts frames\n\tconst segments: LineageSegment[] = []\n\n\tif (!currentEffect) {\n\t\tsegments.push({\n\t\t\teffect: undefined,\n\t\t\teffectName: 'root',\n\t\t\tstack: filterNodeModules(currentStack),\n\t\t})\n\t\treturn segments\n\t}\n\n\tlet current: EffectTrigger | undefined = currentEffect\n\tlet lastStack = currentStack\n\n\twhile (current) {\n\t\tconst rootFn = getRoot(current)\n\t\t// Too aggressive for now\n\t\t//if(!rootFn.name) debugger\n\t\tconst filteredStack = filterNodeModules(lastStack)\n\t\tsegments.push({\n\t\t\teffect: rootFn,\n\t\t\teffectName: rootFn.name || 'anonymous',\n\t\t\tstack: filteredStack,\n\t\t})\n\n\t\t// Move to parent\n\t\tconst node = getEffectNode(current)\n\t\tconst parent = node.parent\n\t\tconst creationStack = node.creationStack as StackFrame[]\n\t\t\n\t\tif (parent) {\n\t\t\tcurrent = parent\n\t\t\tlastStack = creationStack ?? []\n\t\t} else if (creationStack) {\n\t\t\tsegments.push({\n\t\t\t\teffect: undefined,\n\t\t\t\teffectName: 'root',\n\t\t\t\tstack: filterNodeModules(creationStack),\n\t\t\t})\n\t\t\tbreak\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn segments\n}\n/**\n * Filters out node_modules frames and groups them\n * @param frames - Array of stack frames\n */\nfunction filterNodeModules(frames: StackFrame[]): StackFrame[] {\n\tconst result: StackFrame[] = []\n\tlet inNodeModules = false\n\t\n\tfor (const frame of frames) {\n\t\tconst isNodeModule = frame.fileName.includes('/node_modules/') //|| frame.fileName.includes('/dist/')\n\t\t\n\t\tif (isNodeModule && !inNodeModules) {\n\t\t\t// Start of node_modules block\n\t\t\tinNodeModules = true\n\t\t\tresult.push({\n\t\t\t\tfunctionName: '...node_modules...',\n\t\t\t\tfileName: '[filtered]',\n\t\t\t\tlineNumber: 0,\n\t\t\t\tcolumnNumber: 0,\n\t\t\t\traw: ' at ...node_modules...'\n\t\t\t})\n\t\t} else if (!isNodeModule && inNodeModules) {\n\t\t\t// End of node_modules block\n\t\t\tinNodeModules = false\n\t\t\tresult.push(frame)\n\t\t} else if (!isNodeModule) {\n\t\t\t// Regular frame\n\t\t\tresult.push(frame)\n\t\t}\n\t\t// Skip frames inside node_modules\n\t}\n\t\n\treturn result\n}\n\n/**\n * Formats lineage segments into a single stack-like string\n * @param segments - Lineage segments\n */\nexport function formatLineage(segments: LineageSegment[]): string {\n\tconst result: string[] = []\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i]\n\t\tif (i > 0) {\n\t\t\tconst triggerEffect = segments[i - 1].effect\n\t\t\tconst triggerName = triggerEffect ? (getRoot(triggerEffect).name || 'anonymous') : 'root'\n\t\t\tresult.push(` --- effect: ${triggerName} ---`)\n\t\t}\n\t\tfor (const frame of segment.stack) {\n\t\t\tresult.push(` ${frame.raw}`)\n\t\t}\n\t}\n\treturn result.join('\\n')\n}\n\n/**\n * Logs lineage segments to console with grouping\n * @param segments - Lineage segments\n */\nexport function logLineage(segments: LineageSegment[]): void {\n\tconsole.groupCollapsed(`🦴 Effect Lineage Trace (${segments.length} segment${segments.length === 1 ? '' : 's'})`)\n\t\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i]\n\t\t\n\t\t// Add segment header\n\t\tconst isLast = i === segments.length - 1\n\t\tconst prefix = i === 0 ? '📍' : isLast ? '└─' : '├─'\n\t\t\n\t\tconsole.groupCollapsed(`${prefix} Effect:`, segment.effect ? segment.effect.name || 'anonymous' : 'root')\n\t\t\n\t\t// Add stack frames\n\t\tfor (let j = 0; j < segment.stack.length; j++) {\n\t\t\tconst frame = segment.stack[j]\n\t\t\tconst isLastFrame = j === segment.stack.length - 1\n\t\t\tconst framePrefix = isLastFrame ? '└─' : '├─'\n\t\t\t\n\t\t\tif (frame.functionName === '...node_modules...') {\n\t\t\t\tconsole.log(`%c${framePrefix} ${frame.functionName}`, 'color: #888; font-style: italic;')\n\t\t\t} else {\n\t\t\t\tconst fnStyle = frame.functionName === 'anonymous' ? 'color: #888;' : 'color: #1a7f37; font-weight: bold;'\n\t\t\t\tconst fileStyle = 'color: #0550ae;'\n\t\t\t\t\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%c${framePrefix} %c${frame.functionName} %c(${frame.fileName}:${frame.lineNumber}:${frame.columnNumber})`,\n\t\t\t\t\t'color: #888;',\n\t\t\t\t\tfnStyle,\n\t\t\t\t\tfileStyle\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\t\n\t\tconsole.groupEnd()\n\t}\n\t\n\tconsole.groupEnd()\n}\n\n/**\n * Captures and logs lineage to console\n */\nexport function captureNodeLineage(): void {\n\tlogLineage(getLineage())\n}\n\n/**\n * Custom formatter for Chrome DevTools to render lineage data nicely.\n */\nexport const lineageFormatter = {\n\theader: (obj: any) => {\n\t\tif (isLineage(obj)) {\n\t\t\t// Try to detect DevTools theme - default to dark colors if uncertain\n\t\t\tconst isDark = typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\n\t\t\t\n\t\t\tconst headerColor = isDark ? '#cd9d5d' : '#704214'\n\t\t\t\n\t\t\treturn [\n\t\t\t\t'span',\n\t\t\t\t{ style: `color: ${headerColor}; font-weight: bold;` },\n\t\t\t\t`🦴 Effect Lineage (${obj.segments.length} segments)`,\n\t\t\t]\n\t\t}\n\t\treturn null\n\t},\n\thasBody: (obj: any) => isLineage(obj),\n\tbody: (obj: any) => {\n\t\tif (!isLineage(obj)) return null\n\t\tconst segments: LineageSegment[] = obj.segments\n\t\t\n\t\t// Try to detect DevTools theme\n\t\tconst isDark = typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\n\t\t\n\t\tconst colors = isDark ? {\n\t\t\tframeText: '#ccc',\n\t\t\tfunctionName: '#ffffff',\n\t\t\tfileLink: '#58a6ff',\n\t\t\tsegmentBg: '#2d2d2d',\n\t\t} : {\n\t\t\tframeText: '#555',\n\t\t\tfunctionName: '#222',\n\t\t\tfileLink: '#005cc5',\n\t\t\tsegmentBg: '#eee',\n\t\t}\n\t\t\n\t\tconst children = segments.map((segment, i) => {\n\t\t\tconst frames = segment.stack.map((frame) => [\n\t\t\t\t'div',\n\t\t\t\t{ style: `margin-left: 20px; color: ${colors.frameText}; font-family: monospace; font-size: 11px;` },\n\t\t\t\t['span', { style: `color: ${colors.functionName};` }, `at ${frame.functionName} `],\n\t\t\t\t['span', {}, `${frame.fileName}:${frame.lineNumber}:${frame.columnNumber}`],\n\t\t\t])\n\n\t\t\tconst effect = segment.effect\n\n\t\t\tconst segmentHeader = [\n\t\t\t\t'div',\n\t\t\t\t{ style: `margin-top: 5px; padding: 2px 5px; background: ${colors.segmentBg}; border-radius: 3px; font-weight: bold;` },\n\t\t\t\ti === 0 ? '📍 Current: ' : '↖ Effect: ',\n\t\t\t\tsegment.effect?.name || 'anonymous',\n\t\t\t\tsegment.effect ? ['object', { object: segment.effect }] : 'root',\n\t\t\t]\n\n\t\t\treturn ['div', {}, segmentHeader, ...frames]\n\t\t})\n\n\t\treturn ['div', { style: 'padding: 5px; line-height: 1.4;' }, ...children]\n\t},\n}\n\n/**\n * Wraps lineage data in a way that the Chrome Formatter can recognize.\n */\nexport function wrapLineageForDebug(segments?: LineageSegment[]) {\n\tconst lineage = {\n\t\tsegments,\n\t\ttoString: () => formatLineage(segments ?? getLineage()),\n\t}\n\tlineageObjects.add(lineage)\n\treturn lineage\n}\n","import { effect } from '../src/reactive/effects'\nimport { getRoot } from '../src/reactive/registry'\nimport type { LineageSegment } from './lineage'\nimport { reactive } from '../src/reactive/proxy'\n\n/**\n * Displays a floating reactive panel in the browser showing the lineage of triggered effects.\n */\nexport function showLineagePanel() {\n\tif (typeof document === 'undefined') return\n\n\t// Detect color scheme preference\n\tconst isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\n\t// Color schemes\n\tconst colors = isDarkMode ? {\n\t\tpanelBg: 'rgba(30, 30, 30, 0.95)',\n\t\tpanelBorder: '#444',\n\t\theaderBg: '#8B4513',\n\t\theaderText: '#ffffff',\n\t\tcloseBtn: '#ffffff',\n\t\tplaceholderText: '#999',\n\t\tsegmentBorder: '#8B4513',\n\t\ttitleText: '#ffffff',\n\t\tframeText: '#ccc',\n\t\tatText: '#888',\n\t\tlinkText: '#58a6ff',\n\t} : {\n\t\tpanelBg: 'rgba(255, 255, 255, 0.95)',\n\t\tpanelBorder: '#ddd',\n\t\theaderBg: '#704214',\n\t\theaderText: '#ffffff',\n\t\tcloseBtn: '#ffffff',\n\t\tplaceholderText: '#666',\n\t\tsegmentBorder: '#704214',\n\t\ttitleText: '#222',\n\t\tframeText: '#555',\n\t\tatText: '#999',\n\t\tlinkText: '#005cc5',\n\t}\n\n\tconst state = reactive({\n\t\tactiveLineage: [] as LineageSegment[],\n\t\tisVisible: true,\n\t})\n\n\t// onEffectTrigger tracks \"this effect\" (here nothing) — not useful for a global panel.\n\t// Would need zone-based events to track all triggers. Panel is cosmetic/experimental (260206).\n\n\t// UI Creation\n\tconst panel = document.createElement('div')\n\tpanel.id = 'mutts-lineage-panel'\n\tObject.assign(panel.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '20px',\n\t\tright: '20px',\n\t\twidth: '400px',\n\t\tmaxHeight: '80vh',\n\t\tbackgroundColor: colors.panelBg,\n\t\tbackdropFilter: 'blur(10px)',\n\t\tborder: `1px solid ${colors.panelBorder}`,\n\t\tborderRadius: '12px',\n\t\tboxShadow: '0 10px 25px rgba(0,0,0,0.15)',\n\t\tzIndex: '999999',\n\t\tfontFamily: 'Inter, system-ui, sans-serif',\n\t\tfontSize: '12px',\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t\toverflow: 'hidden',\n\t\ttransition: 'opacity 0.3s, transform 0.3s',\n\t})\n\n\tconst header = document.createElement('div')\n\tObject.assign(header.style, {\n\t\tpadding: '12px 16px',\n\t\tbackground: colors.headerBg,\n\t\tcolor: colors.headerText,\n\t\tfontWeight: '600',\n\t\tdisplay: 'flex',\n\t\tjustifyContent: 'space-between',\n\t\talignItems: 'center',\n\t\tcursor: 'grab',\n\t})\n\theader.innerHTML = '<span><span style=\"font-size: 14px; margin-right: 5px;\">🦴</span> Mutts Lineage</span>'\n\t\n\tconst closeBtn = document.createElement('button')\n\tcloseBtn.innerText = '×'\n\tObject.assign(closeBtn.style, {\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tcolor: colors.closeBtn,\n\t\tfontSize: '20px',\n\t\tcursor: 'pointer',\n\t\tpadding: '0 5px',\n\t})\n\tcloseBtn.onclick = () => {\n\t\tstate.isVisible = false\n\t}\n\theader.appendChild(closeBtn)\n\tpanel.appendChild(header)\n\n\tconst content = document.createElement('div')\n\tObject.assign(content.style, {\n\t\tpadding: '16px',\n\t\toverflowY: 'auto',\n\t\tflex: '1',\n\t})\n\tpanel.appendChild(content)\n\n\tdocument.body.appendChild(panel)\n\n\t// Reactivity: Update Visibility\n\teffect(() => {\n\t\tpanel.style.opacity = state.isVisible ? '1' : '0'\n\t\tpanel.style.pointerEvents = state.isVisible ? 'all' : 'none'\n\t\tpanel.style.transform = state.isVisible ? 'translateY(0)' : 'translateY(20px)'\n\t})\n\n\t// Reactivity: Update Content\n\teffect(() => {\n\t\tif (state.activeLineage.length === 0) {\n\t\t\tcontent.innerHTML = `<div style=\"color: ${colors.placeholderText}; font-style: italic; text-align: center; margin-top: 20px;\">No effect triggered yet...</div>`\n\t\t\treturn\n\t\t}\n\n\t\tcontent.innerHTML = ''\n\t\tstate.activeLineage.forEach((segment, i) => {\n\t\t\tconst segDiv = document.createElement('div')\n\t\t\tObject.assign(segDiv.style, {\n\t\t\t\tmarginBottom: '16px',\n\t\t\t\tborderLeft: `2px solid ${colors.segmentBorder}`,\n\t\t\t\tpaddingLeft: '12px',\n\t\t\t})\n\n\t\t\tconst title = document.createElement('div')\n\t\t\tObject.assign(title.style, {\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tmarginBottom: '6px',\n\t\t\t\tcolor: colors.titleText,\n\t\t\t})\n\t\t\tconst effectName = segment.effect ? (getRoot(segment.effect).name || 'anonymous') : 'root'\n\t\t\ttitle.innerText = i === 0 ? `📍 Current: ${effectName}` : `↖ Effect: ${effectName}`\n\t\t\tsegDiv.appendChild(title)\n\n\t\t\tsegment.stack.forEach(frame => {\n\t\t\t\tconst frameDiv = document.createElement('div')\n\t\t\t\tObject.assign(frameDiv.style, {\n\t\t\t\t\tcolor: colors.frameText,\n\t\t\t\t\tmarginBottom: '3px',\n\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t})\n\t\t\t\tframeDiv.title = frame.raw\n\t\t\t\tframeDiv.innerHTML = `<span style=\"color: ${colors.atText}\">at</span> ${frame.functionName} <span style=\"color: ${colors.linkText}; text-decoration: underline;\">(${frame.fileName.split('/').pop()}:${frame.lineNumber})</span>`\n\t\t\t\tsegDiv.appendChild(frameDiv)\n\t\t\t})\n\n\t\t\tcontent.appendChild(segDiv)\n\t\t})\n\t})\n}\n","/**\n * Debug utilities for the reactivity system\n * - Captures effect metadata (names, parent relationships)\n * - Records cause → consequence edges with object/prop labels\n * - Provides graph data for tooling (DevTools panel, etc.)\n */\n\nimport { effect } from '../src/reactive/effects'\nimport { effectToReactiveObjects, getEffectNode, getRoot, markWithRoot } from '../src/reactive/registry'\nimport { allProps, type EffectCleanup, type EffectTrigger, type Evolution, options } from '../src/reactive/types'\nimport { getStackFrame, getLineage, formatLineage, wrapLineageForDebug, lineageFormatter, logLineage, isLineage } from './lineage'\nimport { showLineagePanel } from './lineage-panel'\nimport { setDebugHooks } from '../src/reactive/debug-hooks'\n\n/**\n * Log an error with detailed context if error logging is enabled\n */\nexport function logError(error: Error, context: 'throw' | 'catch', effect?: any) {\n\tif (!options.introspection?.logErrors) return\n\t\n\tconst contextStr = context === 'throw' ? '🔴 Thrown' : '🟡 Caught'\n\t\n\tconsole.group(`${contextStr} Error: ${error.message}`)\n\tconsole.error('Error:', error)\n\t\n\t// Try to get effect name if available\n\tif (effect && typeof effect === 'object' && effect.name) {\n\t\tconsole.log('Effect:', effect.name)\n\t}\n\t\n\tconsole.groupEnd()\n}\n\n// Log initialization for debugging\n\nconst EXTERNAL_SOURCE = Symbol('external-source')\ntype SourceEffect = EffectTrigger | typeof EXTERNAL_SOURCE\n\nlet devtoolsEnabled = false\n\n// Registry for debugging (populated lazily when DevTools are enabled)\nconst debugEffectRegistry = new Set<EffectTrigger>()\nconst debugObjectRegistry = new Set<object>()\n\n// Human-friendly names\nconst effectNames = new WeakMap<EffectTrigger | EffectCleanup, string>()\nconst objectNames = new WeakMap<object, string>()\nlet effectCounter = 0\nlet objectCounter = 0\n\n// Cause/consequence edges aggregated by (source, target, descriptor)\ninterface TriggerRecord {\n\tlabel: string\n\tobject: object\n\tprop: any\n\tevolution: Evolution\n\tcount: number\n\tlastTriggered: number\n}\n\nconst triggerGraph = new Map<SourceEffect, Map<EffectTrigger, Map<string, TriggerRecord>>>()\n\nexport type NodeKind = 'effect' | 'external' | 'state'\nexport type EdgeKind = 'cause' | 'dependency' | 'trigger'\n\nexport interface EffectNode {\n\tid: string\n\tlabel: string\n\ttype: NodeKind\n\tdepth: number\n\tparentId?: string\n\tdebugName?: string\n}\n\nexport interface ObjectNode {\n\tid: string\n\tlabel: string\n\ttype: NodeKind\n\tdebugName?: string\n}\n\nexport interface GraphEdge {\n\tid: string\n\tsource: string\n\ttarget: string\n\ttype: EdgeKind\n\tlabel: string\n\tcount?: number\n}\n\nexport interface ReactivityGraph {\n\tnodes: Array<EffectNode | ObjectNode>\n\tedges: GraphEdge[]\n\tmeta: {\n\t\tgeneratedAt: number\n\t\tdevtoolsEnabled: boolean\n\t}\n}\n\nfunction ensureEffectName(effect: EffectTrigger | EffectCleanup): string {\n\tlet name = effectNames.get(effect)\n\tif (!name) {\n\t\tconst root = getRoot(effect)\n\t\tname = root?.name?.trim() || `effect_${++effectCounter}`\n\t}\n\teffectNames.set(effect, name)\n\treturn name\n}\n\nfunction ensureObjectName(obj: object): string {\n\tlet name = objectNames.get(obj)\n\tif (!name) {\n\t\t// Try Symbol.toStringTag first (standard way to customize object string representation)\n\t\tconst toStringTag = obj?.[Symbol.toStringTag]\n\t\tconst ctorName = obj?.constructor?.name\n\t\tconst base = toStringTag || (ctorName && ctorName !== 'Object' ? ctorName : 'object')\n\t\tname = `${base}_${++objectCounter}`\n\t\tobjectNames.set(obj, name)\n\t}\n\treturn name\n}\n\nfunction describeProp(obj: object, prop: any): string {\n\tconst objectName = ensureObjectName(obj)\n\tif (prop === allProps) return `${objectName}.*`\n\tif (typeof prop === 'symbol') return `${objectName}.${prop.description ?? prop.toString()}`\n\treturn `${objectName}.${String(prop)}`\n}\n\nfunction addEffectToRegistry(effect: EffectTrigger) {\n\tif (!effect || debugEffectRegistry.has(effect)) return\n\tdebugEffectRegistry.add(effect)\n\tconst deps = effectToReactiveObjects.get(effect)\n\tif (deps) {\n\t\tfor (const obj of deps) {\n\t\t\tdocumentObject(obj)\n\t\t}\n\t}\n}\n\nfunction documentObject(obj: object) {\n\tif (!debugObjectRegistry.has(obj)) {\n\t\tdbRegisterObject(obj)\n\t}\n}\n\nfunction dbRegisterObject(obj: object) {\n\tdebugObjectRegistry.add(obj)\n\tensureObjectName(obj)\n}\n\nfunction ensureParentChains(effects: Set<EffectTrigger>) {\n\tconst queue = Array.from(effects)\n\tfor (let i = 0; i < queue.length; i++) {\n\t\tconst effect = queue[i]\n\t\tconst parent = getEffectNode(effect).parent\n\t\tif (parent && !effects.has(parent)) {\n\t\t\teffects.add(parent)\n\t\t\tqueue.push(parent)\n\t\t}\n\t}\n}\n\nfunction ensureTriggerContainers(source: SourceEffect) {\n\tlet targetMap = triggerGraph.get(source)\n\tif (!targetMap) {\n\t\ttargetMap = new Map()\n\t\ttriggerGraph.set(source, targetMap)\n\t}\n\treturn targetMap\n}\n\nfunction ensureTriggerRecord(\n\tsource: SourceEffect,\n\ttarget: EffectTrigger,\n\tlabel: string,\n\tobj: object,\n\tprop: any,\n\tevolution: Evolution\n): TriggerRecord {\n\tconst targetMap = ensureTriggerContainers(source)\n\tlet labelMap = targetMap.get(target)\n\tif (!labelMap) {\n\t\tlabelMap = new Map()\n\t\ttargetMap.set(target, labelMap)\n\t}\n\tlet record = labelMap.get(label)\n\tif (!record) {\n\t\trecord = { label, object: obj, prop, evolution, count: 0, lastTriggered: Date.now() }\n\t\tlabelMap.set(label, record)\n\t}\n\treturn record\n}\n\n/**\n * Assign a debug-friendly name to an effect (shown in DevTools)\n */\nexport function setEffectName(effect: EffectTrigger | EffectCleanup, name: string) {\n\teffectNames.set(effect, name)\n}\n\n/**\n * Assign a debug-friendly name to a reactive object\n */\nexport function setObjectName(obj: object, name: string) {\n\tobjectNames.set(obj, name)\n\tdebugObjectRegistry.add(obj)\n}\n\n/**\n * Register an effect so it appears in the DevTools graph\n */\nexport function registerEffectForDebug(effect: EffectTrigger) {\n\tif (!effect || !devtoolsEnabled) return\n\taddEffectToRegistry(effect)\n}\n\n/**\n * Register a reactive object so it appears in the DevTools graph\n */\nexport function registerObjectForDebug(obj: object) {\n\tif (!devtoolsEnabled) return\n\tdocumentObject(obj)\n}\n\n/**\n * Records a cause → consequence relationship between effects.\n * @param source - The effect performing the write (undefined if external/user input)\n * @param target - The effect that re-ran because of the write\n * @param obj - The reactive object that changed\n * @param prop - The property that changed\n * @param evolution - The type of change (set/add/del/bunch)\n */\nexport function recordTriggerLink(\n\tsource: EffectTrigger | undefined,\n\ttarget: EffectTrigger,\n\tobj: object,\n\tprop: any,\n\tevolution: Evolution\n) {\n\tif (options.introspection?.enableHistory) {\n\t\taddToMutationHistory(source, target, obj, prop, evolution)\n\t}\n\tif (!devtoolsEnabled) return\n\taddEffectToRegistry(target)\n\tif (source) addEffectToRegistry(source)\n\tconst descriptor = describeProp(obj, prop)\n\tconst record = ensureTriggerRecord(\n\t\tsource ?? EXTERNAL_SOURCE,\n\t\ttarget,\n\t\tdescriptor,\n\t\tobj,\n\t\tprop,\n\t\tevolution\n\t)\n\trecord.count += 1\n\trecord.lastTriggered = Date.now()\n\tdocumentObject(obj)\n}\n\n/**\n * Traces back the chain of triggers that led to a specific effect\n * @param effect The effect to trace back\n * @param limit Max depth\n */\nexport function getTriggerChain(effect: EffectTrigger, limit = 5): string[] {\n\tconst chain: string[] = []\n\tlet current = effect\n\tfor (let i = 0; i < limit; i++) {\n\t\t// Find who triggered 'current'\n\t\t// We need to reverse search the triggerGraph (source -> target)\n\t\t// This is expensive O(Edges) but okay for error reporting\n\t\tlet foundSource: EffectTrigger | undefined\n\t\tlet foundReason = ''\n\n\t\tsearch: for (const [source, targetMap] of triggerGraph) {\n\t\t\tfor (const [target, labelMap] of targetMap) {\n\t\t\t\tif (target === current) {\n\t\t\t\t\t// Found a source! Use the most recent trigger record\n\t\t\t\t\tlet lastTime = 0\n\t\t\t\t\tfor (const record of labelMap.values()) {\n\t\t\t\t\t\tif (record.lastTriggered > lastTime) {\n\t\t\t\t\t\t\tlastTime = record.lastTriggered\n\t\t\t\t\t\t\tfoundReason = record.label\n\t\t\t\t\t\t\tfoundSource = source === EXTERNAL_SOURCE ? undefined : (source as EffectTrigger)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (foundSource || foundReason) break search\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foundSource) {\n\t\t\tchain.push(\n\t\t\t\t`${ensureEffectName(foundSource)} -> (${foundReason}) -> ${ensureEffectName(current)}`\n\t\t\t)\n\t\t\tcurrent = foundSource\n\t\t} else if (foundReason) {\n\t\t\tchain.push(`External -> (${foundReason}) -> ${ensureEffectName(current)}`)\n\t\t\tbreak\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn chain.reverse()\n}\n\nfunction buildEffectNodes(allEffects: Set<EffectTrigger>) {\n\tconst nodes: EffectNode[] = []\n\tconst nodeByEffect = new Map<EffectTrigger, EffectNode>()\n\n\tconst ordered = Array.from(allEffects)\n\tfor (const effect of ordered) {\n\t\tconst label = ensureEffectName(effect)\n\t\tconst node: EffectNode = {\n\t\t\tid: `effect_${nodes.length}`,\n\t\t\tlabel,\n\t\t\ttype: 'effect',\n\t\t\tdepth: 0,\n\t\t\tdebugName: label,\n\t\t}\n\t\tnodes.push(node)\n\t\tnodeByEffect.set(effect, node)\n\t}\n\n\tconst depthCache = new Map<EffectTrigger, number>()\n\tconst computeDepth = (effect: EffectTrigger | undefined): number => {\n\t\tif (!effect) return 0\n\t\tconst cached = depthCache.get(effect)\n\t\tif (cached !== undefined) return cached\n\t\tconst parent = getEffectNode(effect).parent\n\t\tconst depth = computeDepth(parent) + (parent ? 1 : 0)\n\t\tdepthCache.set(effect, depth)\n\t\treturn depth\n\t}\n\n\tfor (const [effect, node] of nodeByEffect) {\n\t\tnode.depth = computeDepth(effect)\n\t\tconst parent = getEffectNode(effect).parent\n\t\tif (parent) {\n\t\t\tconst parentNode = nodeByEffect.get(parent)\n\t\t\tif (parentNode) {\n\t\t\t\tnode.parentId = parentNode.id\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { nodes, nodeByEffect }\n}\n\n/**\n * Builds a graph representing current reactive state (effects, objects, and trigger edges)\n */\nexport function buildReactivityGraph(): ReactivityGraph {\n\tconst nodes: Array<EffectNode | ObjectNode> = []\n\tconst edges: GraphEdge[] = []\n\tconst nodeIds = new Map<EffectTrigger | EffectCleanup | object | SourceEffect, string>()\n\n\tconst allEffects = new Set<EffectTrigger>(debugEffectRegistry)\n\tensureParentChains(allEffects)\n\tconst { nodes: effectNodes, nodeByEffect } = buildEffectNodes(allEffects)\n\tfor (const node of effectNodes) nodes.push(node)\n\tfor (const [effect, node] of nodeByEffect) {\n\t\tnodeIds.set(effect, node.id)\n\t}\n\n\t// Object nodes (optional, used for dependency inspection)\n\tfor (const obj of debugObjectRegistry) {\n\t\tconst id = `object_${nodes.length}`\n\t\tnodes.push({ id, label: ensureObjectName(obj), type: 'state', debugName: objectNames.get(obj) })\n\t\tnodeIds.set(obj, id)\n\t}\n\n\t// External source node (user/system outside of effects)\n\tif (triggerGraph.has(EXTERNAL_SOURCE)) {\n\t\tconst externalId = `effect_external`\n\t\tnodes.push({ id: externalId, label: 'External', type: 'external', depth: 0 })\n\t\tnodeIds.set(EXTERNAL_SOURCE, externalId)\n\t}\n\n\t// Dependency edges (effect → object)\n\tfor (const effect of allEffects) {\n\t\tconst effectId = nodeIds.get(effect)\n\t\tif (!effectId) continue\n\t\tconst deps = effectToReactiveObjects.get(effect)\n\t\tif (!deps) continue\n\t\tfor (const obj of deps) {\n\t\t\tconst objId = nodeIds.get(obj)\n\t\t\tif (!objId) continue\n\t\t\tedges.push({\n\t\t\t\tid: `${effectId}->${objId}`,\n\t\t\t\tsource: effectId,\n\t\t\t\ttarget: objId,\n\t\t\t\ttype: 'dependency',\n\t\t\t\tlabel: 'depends',\n\t\t\t})\n\t\t}\n\t}\n\n\t// Cause edges (effect/object/prop → effect)\n\tfor (const [source, targetMap] of triggerGraph) {\n\t\tfor (const [targetEffect, labelMap] of targetMap) {\n\t\t\tconst targetId = nodeIds.get(targetEffect)\n\t\t\tif (!targetId) continue\n\t\t\tconst sourceId = nodeIds.get(source)\n\t\t\tif (!sourceId) continue\n\t\t\tfor (const record of labelMap.values()) {\n\t\t\t\tedges.push({\n\t\t\t\t\tid: `${sourceId}->${targetId}:${record.label}`,\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t\ttarget: targetId,\n\t\t\t\t\ttype: 'cause',\n\t\t\t\t\tlabel: record.count > 1 ? `${record.label} (${record.count})` : record.label,\n\t\t\t\t\tcount: record.count,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodes,\n\t\tedges,\n\t\tmeta: {\n\t\t\tgeneratedAt: Date.now(),\n\t\t\tdevtoolsEnabled,\n\t\t},\n\t}\n}\nexport const captureLineage = () => wrapLineageForDebug(getLineage())\n/**\n * Enables the DevTools bridge and exposes the debug API on window/global.\n * Call as early as possible in development builds.\n */\nexport function enableDevTools() {\n\tconst globalScope = (\n\t\ttypeof globalThis !== 'undefined'\n\t\t\t? globalThis\n\t\t\t: typeof window !== 'undefined'\n\t\t\t\t? window\n\t\t\t\t: typeof global !== 'undefined'\n\t\t\t\t\t? global\n\t\t\t\t\t: undefined\n\t) as any\n\tif (!globalScope) return\n\tif (devtoolsEnabled) return\n\tdevtoolsEnabled = true\n\tif (options.introspection) {\n\t\toptions.introspection.logErrors = true\n\t}\n\t\n\tglobalScope.__MUTTS_DEBUG__ = {\n\t\tgetGraph: buildReactivityGraph,\n\t\tlogLineage(tag?: string) {\n\t\t\tlogLineage(getLineage())\n\t\t\treturn '🦴 Effect Lineage Trace' + (tag ? ` (${tag})` : '')\n\t\t},\n\t\tget browserLineage() {\n\t\t\treturn captureLineage()\n\t\t},\n\t\tgetLineage,\n\t\tcaptureLineage: getStackFrame,\n\t\tformatLineage,\n\t\tshowLineagePanel,\n\t\tsetEffectName,\n\t\tsetObjectName,\n\t\tregisterEffect: registerEffectForDebug,\n\t\tregisterObject: registerObjectForDebug,\n\t}\n\n\t// @ts-ignore - devtoolsFormatters is a Chrome-specific array\n\tif (globalScope.devtoolsFormatters) {\n\t\tglobalScope.devtoolsFormatters.push(lineageFormatter)\n\t} else {\n\t\tglobalScope.devtoolsFormatters = [lineageFormatter]\n\t}\n\n\tsetDebugHooks({\n\t\tisDevtoolsEnabled: () => devtoolsEnabled,\n\t\tregisterEffect: registerEffectForDebug,\n\t\tgetTriggerChain: getTriggerChain,\n\t\tcaptureStack: getStackFrame,\n\t\tcaptureLineage,\n\t\tformatStack: (stack: any) => {\n\t\t\tif (typeof stack === 'string') {\n\t\t\t\treturn [\n\t\t\t\t\t`\\n ${stack\n\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t.map((l) => l.trim())\n\t\t\t\t\t\t.join('\\n ')}`,\n\t\t\t\t]\n\t\t\t}\n\t\t\tif (isLineage(stack)) {\n\t\t\t\treturn ['\\n', stack]\n\t\t\t}\n\t\t\treturn ['\\n', stack]\n\t\t},\n\t\trecordTriggerLink: recordTriggerLink,\n\t})\n}\n\nexport function forceEnableGraphTracking() {\n\tdevtoolsEnabled = true\n}\n\nexport function isDevtoolsEnabled() {\n\treturn devtoolsEnabled\n}\n\n/**\n * Returns the raw dependency graph data structure.\n * This is useful for programmatic analysis of the reactive system.\n */\nexport function getDependencyGraph() {\n\treturn {\n\t\tnodes: buildReactivityGraph().nodes,\n\t\tedges: buildReactivityGraph().edges,\n\t}\n}\n\n/**\n * Capture a complete snapshot of the current reactive state\n */\nexport function snapshot() {\n\treturn {\n\t\tgraph: getDependencyGraph(),\n\t\thistory: getMutationHistory(),\n\t\ttimestamp: Date.now(),\n\t}\n}\n\n/**\n * Returns a list of effects that depend on the given object.\n */\nexport function getDependents(obj: object): EffectTrigger[] {\n\tconst dependents: EffectTrigger[] = []\n\t// Scan the trigger graph for effects triggered by this object\n\t// This is O(E) where E is the number of edges, might need optimization for large graphs\n\t// but acceptable for introspection\n\tfor (const [_source, targetMap] of triggerGraph) {\n\t\tfor (const [targetEffect, labelMap] of targetMap) {\n\t\t\tfor (const record of labelMap.values()) {\n\t\t\t\tif (record.object === obj) {\n\t\t\t\t\tdependents.push(targetEffect)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Also check direct dependencies (dependency graph)\n\t// We don't have a direct obj -> effect map without walking all effects\n\t// unless we use `watchers` from tracking.ts but that's internal\n\treturn [...new Set(dependents)]\n}\n\n/**\n * Returns a list of objects that the given effect depends on.\n */\nexport function getDependencies(effect: EffectTrigger): object[] {\n\tconst deps = effectToReactiveObjects.get(effect)\n\treturn deps ? Array.from(deps) : []\n}\n\n// --- Mutation History ---\n\nexport interface MutationRecord {\n\tid: number\n\ttimestamp: number\n\tsource: string\n\ttarget: string\n\tobjectName: string\n\tprop: string\n\ttype: string\n}\n\nconst mutationHistory: MutationRecord[] = []\nlet mutationCounter = 0\n\nfunction addToMutationHistory(\n\tsource: EffectTrigger | undefined,\n\ttarget: EffectTrigger,\n\tobj: object,\n\tprop: any,\n\tevolution: Evolution\n) {\n\tconst record: MutationRecord = {\n\t\tid: ++mutationCounter,\n\t\ttimestamp: Date.now(),\n\t\tsource: source ? ensureEffectName(source) : 'External',\n\t\ttarget: ensureEffectName(target),\n\t\tobjectName: ensureObjectName(obj),\n\t\tprop: String(prop),\n\t\ttype: evolution.type,\n\t}\n\n\tmutationHistory.push(record)\n\tif (mutationHistory.length > (options.introspection?.historySize ?? 50)) {\n\t\tmutationHistory.shift()\n\t}\n}\n\n/**\n * Get the recent mutation history\n */\nexport function getMutationHistory(): MutationRecord[] {\n\treturn [...mutationHistory]\n}\n\n// --- Auto DevTools Initialization ---\n// Automatically enable devtools in development environments\n\n/**\n * Checks if we're in a development environment\n * Detection order:\n * 1. process.env.NODE_ENV (Node.js)\n * 2. import.meta.env.DEV (Vite)\n * 3. import.meta.env.PROD === false (Vite alternative)\n * 4. Assumes development if none of the above are set (safe default)\n */\nfunction isDevelopmentMode(): boolean {\n\t// Check for explicit production flag first\n\tif (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production') {\n\t\treturn false\n\t}\n\t\n\t// Check for Vite's DEV flag\n\tif (typeof import.meta !== 'undefined') {\n\t\tconst meta = import.meta as any\n\t\tif (meta.env?.PROD === true) {\n\t\t\treturn false\n\t\t}\n\t\tif (meta.env?.DEV === true) {\n\t\t\treturn true\n\t\t}\n\t}\n\t\n\t// Check for custom global override\n\tif (typeof globalThis !== 'undefined' && '__MUTTS_DEV_MODE__' in globalThis) {\n\t\treturn (globalThis as any).__MUTTS_DEV_MODE__ !== false\n\t}\n\t\n\t// Default to development (safer to enable in dev than disable in prod)\n\treturn true\n}\n\n// Auto-enable devtools when the module loads in development\nif (isDevelopmentMode() && !devtoolsEnabled) {\n\tenableDevTools()\n\t\n\t// Optional: Log that devtools were enabled (only in development)\n\tif (typeof console !== 'undefined' && console.info) {\n\t\t// Do not log these in when mode === 'test'\n\t\tconsole.info('🦴 Mutts DevTools enabled automatically in development mode')\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Mutts Reactivity DevTools",
4
- "description": "Quick demo panel that draws the Mutts reactivity graph with Cytoscape.",
4
+ "description": "DevTools panel that visualizes the Mutts reactivity graph with Vis Network.",
5
5
  "version": "0.1.0",
6
6
  "devtools_page": "devtools.html",
7
7
  "permissions": []
@@ -12,7 +12,7 @@
12
12
  Layout
13
13
  <select id="layout">
14
14
  <option value="hierarchical">Tree</option>
15
- <option value="physics">Force</option>
15
+ <option value="physics" selected>Force</option>
16
16
  </select>
17
17
  </label>
18
18
  <label>
@@ -12807,46 +12807,58 @@ function requireVisNetwork_min () {
12807
12807
  var visNetwork_minExports = requireVisNetwork_min();
12808
12808
 
12809
12809
  /// <reference path="./devtools.d.ts" />
12810
- // DevTools panel script (plain JS in a .ts file so Rollup can bundle it)
12811
12810
  const graphEl = document.getElementById('graph');
12812
12811
  const refreshBtn = document.getElementById('refresh');
12813
12812
  const layoutSelect = document.getElementById('layout');
12814
12813
  const hideIsolatedInput = document.getElementById('hideIsolated');
12815
12814
  const searchInput = document.getElementById('search');
12816
12815
  const statusEl = document.getElementById('status');
12817
- let network;
12816
+ let network = null;
12818
12817
  let lastRawGraph = null;
12819
12818
  let currentGraph = { nodes: []};
12819
+ const NODE_COLORS = {
12820
+ effect: { background: '#1f6feb', border: '#388bfd' },
12821
+ external: { background: '#8b5cf6', border: '#a78bfa' },
12822
+ state: { background: '#238636', border: '#2ea043' },
12823
+ };
12820
12824
  function setStatus(message, tone = 'info') {
12821
12825
  if (!statusEl)
12822
12826
  return;
12823
12827
  statusEl.textContent = message;
12824
- statusEl.dataset && (statusEl.dataset.tone = String(tone));
12828
+ if (statusEl.dataset)
12829
+ statusEl.dataset.tone = tone;
12825
12830
  }
12826
- function getOptions(mode) {
12831
+ function getOptions(mode, nodeCount) {
12832
+ // Fixed scale for consistent spacing
12833
+ const scale = 1.0;
12827
12834
  const base = {
12828
12835
  autoResize: false,
12829
12836
  width: '100%',
12830
12837
  height: '100%',
12831
- interaction: { hover: true },
12838
+ interaction: { hover: true, tooltipDelay: 150 },
12832
12839
  nodes: {
12833
12840
  shape: 'box',
12834
- margin: { top: 10, right: 10, bottom: 10, left: 10 },
12835
- font: { color: '#f4f4f4', face: 'system-ui', size: 13 },
12841
+ margin: { top: 8, right: 14, bottom: 8, left: 14 },
12842
+ font: { color: '#f4f4f4', face: 'system-ui', size: 14 },
12843
+ borderWidth: 2,
12836
12844
  },
12837
12845
  edges: {
12838
- arrows: 'to',
12839
- smooth: false,
12840
- font: { size: 11, strokeWidth: 0, color: '#c9d1d9' },
12846
+ arrows: { to: { enabled: true, scaleFactor: 0.7 } },
12847
+ smooth: { enabled: true, type: 'cubicBezier', roundness: 0.4 },
12848
+ font: { size: 11, strokeWidth: 2, strokeColor: '#0d1117', color: '#c9d1d9', align: 'top' },
12849
+ color: { color: '#484f58', highlight: '#ff7b72', hover: '#ff7b72' },
12841
12850
  },
12842
12851
  };
12843
12852
  if (mode === 'hierarchical') {
12853
+ const levelSep = Math.round(100 * scale);
12854
+ const nodeSep = Math.round(80 * scale);
12855
+ const treeSep = Math.round(120 * scale);
12844
12856
  base.layout = {
12845
12857
  hierarchical: {
12846
12858
  direction: 'UD',
12847
- levelSeparation: 300,
12848
- nodeSpacing: 150,
12849
- treeSpacing: 300,
12859
+ levelSeparation: levelSep,
12860
+ nodeSpacing: nodeSep,
12861
+ treeSpacing: treeSep,
12850
12862
  blockShifting: true,
12851
12863
  edgeMinimization: true,
12852
12864
  parentCentralization: true,
@@ -12854,41 +12866,32 @@ function getOptions(mode) {
12854
12866
  shakeTowards: 'leaves',
12855
12867
  },
12856
12868
  };
12857
- // Enable light physics to add vertical variation to nodes at same level
12858
12869
  base.physics = {
12859
12870
  enabled: true,
12860
12871
  solver: 'hierarchicalRepulsion',
12861
12872
  hierarchicalRepulsion: {
12862
- nodeDistance: 120,
12863
- centralGravity: 0.0,
12864
- springLength: 100,
12865
- springConstant: 0.01,
12873
+ nodeDistance: nodeSep,
12874
+ centralGravity: 0.2,
12875
+ springLength: levelSep * 0.8,
12876
+ springConstant: 0.02,
12866
12877
  damping: 0.09,
12867
12878
  },
12868
- stabilization: {
12869
- enabled: true,
12870
- iterations: 100,
12871
- fit: true,
12872
- },
12879
+ stabilization: { enabled: true, iterations: 150, fit: true },
12873
12880
  };
12874
12881
  }
12875
12882
  else {
12876
- // Force/physics layout
12883
+ base.layout = { hierarchical: false };
12877
12884
  base.physics = {
12878
12885
  enabled: true,
12879
12886
  solver: 'forceAtlas2Based',
12880
- stabilization: {
12881
- enabled: true,
12882
- iterations: 200,
12883
- fit: true,
12884
- },
12885
12887
  forceAtlas2Based: {
12886
- gravitationalConstant: -50,
12887
- centralGravity: 0.01,
12888
- springLength: 100,
12889
- springConstant: 0.08,
12888
+ gravitationalConstant: -800 * scale,
12889
+ centralGravity: 0.003,
12890
+ springLength: Math.round(400 * scale),
12891
+ springConstant: 0.03,
12890
12892
  damping: 0.4,
12891
12893
  },
12894
+ stabilization: { enabled: true, iterations: 300, fit: true },
12892
12895
  };
12893
12896
  }
12894
12897
  return base;
@@ -12899,13 +12902,14 @@ function ensureNetwork() {
12899
12902
  network = new visNetwork_minExports.Network(graphEl, { nodes: [], edges: [] }, getOptions('hierarchical'));
12900
12903
  }
12901
12904
  function toVisGraph(graph) {
12902
- const rawNodes = Array.isArray(graph && graph.nodes) ? graph.nodes : [];
12903
- const rawEdges = Array.isArray(graph && graph.edges) ? graph.edges : [];
12905
+ const rawNodes = Array.isArray(graph?.nodes) ? graph.nodes : [];
12906
+ const rawEdges = Array.isArray(graph?.edges) ? graph.edges : [];
12907
+ // Build set of node IDs that participate in any edge (for hide-isolated filter)
12904
12908
  let connectedIds = null;
12905
- if (hideIsolatedInput && hideIsolatedInput.checked) {
12909
+ if (hideIsolatedInput?.checked) {
12906
12910
  connectedIds = new Set();
12907
12911
  for (const edge of rawEdges) {
12908
- if (!edge || !['cause', 'effect'].includes(edge.type || ''))
12912
+ if (!edge)
12909
12913
  continue;
12910
12914
  if (edge.source)
12911
12915
  connectedIds.add(String(edge.source));
@@ -12913,44 +12917,35 @@ function toVisGraph(graph) {
12913
12917
  connectedIds.add(String(edge.target));
12914
12918
  }
12915
12919
  }
12920
+ // Include all node types (effect, external, state)
12921
+ const nodeIdSet = new Set();
12916
12922
  const nodes = rawNodes
12917
- .filter((n) => n && (n.type === 'effect' || n.type === 'external'))
12923
+ .filter((n) => !!n)
12918
12924
  .filter((n) => !connectedIds || connectedIds.has(String(n.id)))
12919
12925
  .map((n) => {
12920
- const depth = typeof n.depth === 'number' ? n.depth : 0;
12926
+ typeof n.depth === 'number' ? n.depth : 0;
12927
+ const colors = NODE_COLORS[n.type ?? 'effect'] ?? NODE_COLORS.effect;
12928
+ nodeIdSet.add(String(n.id));
12921
12929
  return {
12922
12930
  id: n.id,
12923
12931
  label: String(n.label || n.id),
12924
12932
  group: n.type,
12925
- level: depth,
12926
12933
  title: n.debugName || n.label,
12934
+ color: colors,
12927
12935
  };
12928
12936
  });
12929
- // Debug: log edge types to help diagnose issues
12930
- if (rawEdges.length > 0) {
12931
- const edgeTypes = new Set(rawEdges.map((e) => e?.type).filter(Boolean));
12932
- console.log('[DevTools] Edge types found:', Array.from(edgeTypes));
12933
- }
12937
+ // Only keep edges whose both endpoints exist in the filtered node set
12934
12938
  const edges = rawEdges
12935
- .filter((e) => e && ['cause', 'effect'].includes(e.type || ''))
12939
+ .filter((e) => !!e && !!e.source && !!e.target)
12940
+ .filter((e) => nodeIdSet.has(String(e.source)) && nodeIdSet.has(String(e.target)))
12936
12941
  .map((e) => ({
12937
- id: e.id || (e.source + '->' + e.target),
12942
+ id: e.id || `${e.source}->${e.target}`,
12938
12943
  from: e.source,
12939
12944
  to: e.target,
12940
12945
  label: String(e.label || ''),
12941
12946
  width: Math.min(6, 1 + Number(e.count || 0)),
12942
- color: '#ff7b72',
12947
+ dashes: e.type === 'dependency',
12943
12948
  }));
12944
- // Debug: log node and edge counts
12945
- console.log('[DevTools] Graph stats:', {
12946
- totalRawNodes: rawNodes.length,
12947
- filteredNodes: nodes.length,
12948
- totalRawEdges: rawEdges.length,
12949
- filteredEdges: edges.length,
12950
- nodeLevels: nodes.map((n) => ({ id: n.id, level: n.level, label: n.label })),
12951
- edgeCount: edges.length,
12952
- sampleEdges: edges.slice(0, 3).map((e) => ({ from: e.from, to: e.to, label: e.label })),
12953
- });
12954
12949
  return { nodes, edges };
12955
12950
  }
12956
12951
  function renderGraph(graph) {
@@ -12960,40 +12955,61 @@ function renderGraph(graph) {
12960
12955
  lastRawGraph = graph;
12961
12956
  const visGraph = toVisGraph(graph);
12962
12957
  currentGraph = visGraph;
12958
+ const mode = layoutSelect?.value === 'hierarchical' ? 'hierarchical' : 'physics';
12959
+ network.setOptions(getOptions(mode, visGraph.nodes.length));
12963
12960
  network.setData(visGraph);
12964
- const mode = layoutSelect && layoutSelect.value === 'physics' ? 'physics' : 'hierarchical';
12965
- network.setOptions(getOptions(mode));
12966
- network.fit({ animation: { duration: 200, easing: 'easeInOutCubic' } });
12961
+ network.once('stabilizationIterationsDone', () => {
12962
+ network.fit({ animation: { duration: 300, easingFunction: 'easeInOutCubic' } });
12963
+ });
12964
+ }
12965
+ function handleGraphResult(result) {
12966
+ if (!result || ('error' in result && result.error)) {
12967
+ if (result && 'error' in result)
12968
+ console.error('Graph error', result.error);
12969
+ setStatus('No graph exposed', 'warn');
12970
+ return;
12971
+ }
12972
+ const graph = result;
12973
+ renderGraph(graph);
12974
+ const countNodes = graph.nodes?.length ?? 0;
12975
+ const countEdges = graph.edges?.length ?? 0;
12976
+ setStatus(`Showing ${countNodes} nodes / ${countEdges} edges`, 'ok');
12977
+ }
12978
+ function fetchGraphFromPage() {
12979
+ const api = window.__MUTTS_DEBUG__ ?? window.__REACTIVITY_DEVTOOLS__;
12980
+ if (!api || typeof api.getGraph !== 'function')
12981
+ return false;
12982
+ try {
12983
+ handleGraphResult(api.getGraph());
12984
+ return true;
12985
+ }
12986
+ catch (e) {
12987
+ handleGraphResult({ error: String(e) });
12988
+ return true;
12989
+ }
12967
12990
  }
12968
12991
  function fetchGraph() {
12969
- setStatus('Fetching graph from inspected page…');
12970
- const expr = `(() => {
12971
- const api = (window.__MUTTS_DEVTOOLS__ || window.__REACTIVITY_DEVTOOLS__);
12972
- if (!api || typeof api.getGraph !== 'function') return null;
12973
- try { return api.getGraph(); } catch (e) { return { error: String(e) }; }
12974
- })()`;
12975
- // call into the inspected page via Chrome DevTools API
12976
- if (window.chrome && window.chrome.devtools && window.chrome.devtools.inspectedWindow) {
12992
+ setStatus('Fetching graph…');
12993
+ // Chrome DevTools extension context
12994
+ if (window.chrome?.devtools?.inspectedWindow) {
12995
+ const expr = `(() => {
12996
+ const api = (window.__MUTTS_DEBUG__ || window.__REACTIVITY_DEVTOOLS__);
12997
+ if (!api || typeof api.getGraph !== 'function') return null;
12998
+ try { return api.getGraph(); } catch (e) { return { error: String(e) }; }
12999
+ })()`;
12977
13000
  window.chrome.devtools.inspectedWindow.eval(expr, function (result, exceptionInfo) {
12978
- if (exceptionInfo && exceptionInfo.isException) {
13001
+ if (exceptionInfo?.isException) {
12979
13002
  console.error('Eval exception', exceptionInfo);
12980
13003
  setStatus('Eval failed – see panel console', 'error');
12981
13004
  return;
12982
13005
  }
12983
- if (!result || result.error) {
12984
- if (result && result.error)
12985
- console.error('Graph error', result.error);
12986
- setStatus('No graph exposed', 'warn');
12987
- return;
12988
- }
12989
- renderGraph(result);
12990
- const countNodes = Array.isArray(result.nodes) ? result.nodes.length : 0;
12991
- const countEdges = Array.isArray(result.edges) ? result.edges.length : 0;
12992
- setStatus('Showing ' + countNodes + ' nodes / ' + countEdges + ' edges', 'ok');
13006
+ handleGraphResult(result);
12993
13007
  });
13008
+ return;
12994
13009
  }
12995
- else {
12996
- setStatus('chrome.devtools API not available in this context', 'error');
13010
+ // Standalone fallback: same-page API (for testing without extension)
13011
+ if (!fetchGraphFromPage()) {
13012
+ setStatus('No devtools API found — click "Enable" on the test page first', 'warn');
12997
13013
  }
12998
13014
  }
12999
13015
  function init() {
@@ -13015,34 +13031,31 @@ function init() {
13015
13031
  });
13016
13032
  }
13017
13033
  if (searchInput) {
13018
- searchInput.addEventListener('input', function (event) {
13019
- if (!network || !currentGraph)
13034
+ searchInput.addEventListener('input', (event) => {
13035
+ if (!network)
13020
13036
  return;
13021
13037
  const target = event.target;
13022
- const value = target && target.value ? String(target.value) : '';
13023
- const query = value.toLowerCase();
13038
+ const query = (target?.value ?? '').toLowerCase();
13024
13039
  if (!query) {
13025
13040
  network.unselectAll();
13026
13041
  return;
13027
13042
  }
13028
13043
  const matches = currentGraph.nodes
13029
- .filter(function (n) {
13030
- return String((n && n.label) || '').toLowerCase().indexOf(query) !== -1;
13031
- })
13032
- .map(function (n) {
13033
- return n.id;
13034
- });
13044
+ .filter((n) => String(n.label ?? '').toLowerCase().includes(query))
13045
+ .map((n) => n.id);
13035
13046
  if (!matches.length) {
13036
- setStatus('No matching effects', 'warn');
13047
+ setStatus('No matching nodes', 'warn');
13037
13048
  network.unselectAll();
13038
13049
  return;
13039
13050
  }
13040
13051
  network.selectNodes(matches);
13041
- network.focus(matches[0], { animation: { duration: 300 }, scale: 1.1 });
13052
+ network.focus(matches[0], { animation: { duration: 300, easingFunction: 'easeInOutCubic' }, scale: 1.2 });
13042
13053
  });
13043
13054
  }
13044
13055
  }
13045
13056
  if (graphEl) {
13046
13057
  init();
13058
+ // Auto-fetch on load (works in both extension and standalone mode)
13059
+ fetchGraph();
13047
13060
  }
13048
13061
  //# sourceMappingURL=panel.js.map