@agentick/core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +875 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/.tsbuildinfo.build +1 -0
  5. package/dist/agent.d.ts +32 -0
  6. package/dist/agent.d.ts.map +1 -0
  7. package/dist/agent.js +26 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/agentick-instance.d.ts +285 -0
  10. package/dist/agentick-instance.d.ts.map +1 -0
  11. package/dist/agentick-instance.js +700 -0
  12. package/dist/agentick-instance.js.map +1 -0
  13. package/dist/aidk-instance.d.ts +294 -0
  14. package/dist/aidk-instance.d.ts.map +1 -0
  15. package/dist/aidk-instance.js +340 -0
  16. package/dist/aidk-instance.js.map +1 -0
  17. package/dist/app/session-store.d.ts +57 -0
  18. package/dist/app/session-store.d.ts.map +1 -0
  19. package/dist/app/session-store.js +87 -0
  20. package/dist/app/session-store.js.map +1 -0
  21. package/dist/app/session.d.ts +209 -0
  22. package/dist/app/session.d.ts.map +1 -0
  23. package/dist/app/session.js +2131 -0
  24. package/dist/app/session.js.map +1 -0
  25. package/dist/app/sqlite-session-store.d.ts +60 -0
  26. package/dist/app/sqlite-session-store.d.ts.map +1 -0
  27. package/dist/app/sqlite-session-store.js +234 -0
  28. package/dist/app/sqlite-session-store.js.map +1 -0
  29. package/dist/app/types.d.ts +1461 -0
  30. package/dist/app/types.d.ts.map +1 -0
  31. package/dist/app/types.js +14 -0
  32. package/dist/app/types.js.map +1 -0
  33. package/dist/app.d.ts +79 -0
  34. package/dist/app.d.ts.map +1 -0
  35. package/dist/app.js +83 -0
  36. package/dist/app.js.map +1 -0
  37. package/dist/channels/adapters/index.d.ts +2 -0
  38. package/dist/channels/adapters/index.d.ts.map +1 -0
  39. package/dist/channels/adapters/index.js +2 -0
  40. package/dist/channels/adapters/index.js.map +1 -0
  41. package/dist/channels/adapters/redis.d.ts +77 -0
  42. package/dist/channels/adapters/redis.d.ts.map +1 -0
  43. package/dist/channels/adapters/redis.js +259 -0
  44. package/dist/channels/adapters/redis.js.map +1 -0
  45. package/dist/channels/index.d.ts +38 -0
  46. package/dist/channels/index.d.ts.map +1 -0
  47. package/dist/channels/index.js +38 -0
  48. package/dist/channels/index.js.map +1 -0
  49. package/dist/channels/service.d.ts +684 -0
  50. package/dist/channels/service.d.ts.map +1 -0
  51. package/dist/channels/service.js +870 -0
  52. package/dist/channels/service.js.map +1 -0
  53. package/dist/channels/transports/index.d.ts +4 -0
  54. package/dist/channels/transports/index.d.ts.map +1 -0
  55. package/dist/channels/transports/index.js +4 -0
  56. package/dist/channels/transports/index.js.map +1 -0
  57. package/dist/channels/transports/socketio.d.ts +98 -0
  58. package/dist/channels/transports/socketio.d.ts.map +1 -0
  59. package/dist/channels/transports/socketio.js +246 -0
  60. package/dist/channels/transports/socketio.js.map +1 -0
  61. package/dist/channels/transports/streamable-http.d.ts +107 -0
  62. package/dist/channels/transports/streamable-http.d.ts.map +1 -0
  63. package/dist/channels/transports/streamable-http.js +353 -0
  64. package/dist/channels/transports/streamable-http.js.map +1 -0
  65. package/dist/channels/transports/websocket.d.ts +117 -0
  66. package/dist/channels/transports/websocket.d.ts.map +1 -0
  67. package/dist/channels/transports/websocket.js +416 -0
  68. package/dist/channels/transports/websocket.js.map +1 -0
  69. package/dist/com/index.d.ts +29 -0
  70. package/dist/com/index.d.ts.map +1 -0
  71. package/dist/com/index.js +29 -0
  72. package/dist/com/index.js.map +1 -0
  73. package/dist/com/object-model.d.ts +634 -0
  74. package/dist/com/object-model.d.ts.map +1 -0
  75. package/dist/com/object-model.js +963 -0
  76. package/dist/com/object-model.js.map +1 -0
  77. package/dist/com/types.d.ts +192 -0
  78. package/dist/com/types.d.ts.map +1 -0
  79. package/dist/com/types.js +1 -0
  80. package/dist/com/types.js.map +1 -0
  81. package/dist/compiler/collector.d.ts +16 -0
  82. package/dist/compiler/collector.d.ts.map +1 -0
  83. package/dist/compiler/collector.js +388 -0
  84. package/dist/compiler/collector.js.map +1 -0
  85. package/dist/compiler/content-block-registry.d.ts +11 -0
  86. package/dist/compiler/content-block-registry.d.ts.map +1 -0
  87. package/dist/compiler/content-block-registry.js +312 -0
  88. package/dist/compiler/content-block-registry.js.map +1 -0
  89. package/dist/compiler/extractors.d.ts +68 -0
  90. package/dist/compiler/extractors.d.ts.map +1 -0
  91. package/dist/compiler/extractors.js +547 -0
  92. package/dist/compiler/extractors.js.map +1 -0
  93. package/dist/compiler/fiber-compiler.d.ts +203 -0
  94. package/dist/compiler/fiber-compiler.d.ts.map +1 -0
  95. package/dist/compiler/fiber-compiler.js +498 -0
  96. package/dist/compiler/fiber-compiler.js.map +1 -0
  97. package/dist/compiler/fiber.d.ts +61 -0
  98. package/dist/compiler/fiber.d.ts.map +1 -0
  99. package/dist/compiler/fiber.js +244 -0
  100. package/dist/compiler/fiber.js.map +1 -0
  101. package/dist/compiler/index.d.ts +18 -0
  102. package/dist/compiler/index.d.ts.map +1 -0
  103. package/dist/compiler/index.js +38 -0
  104. package/dist/compiler/index.js.map +1 -0
  105. package/dist/compiler/scheduler.d.ts +95 -0
  106. package/dist/compiler/scheduler.d.ts.map +1 -0
  107. package/dist/compiler/scheduler.js +138 -0
  108. package/dist/compiler/scheduler.js.map +1 -0
  109. package/dist/compiler/structure-renderer.d.ts +42 -0
  110. package/dist/compiler/structure-renderer.d.ts.map +1 -0
  111. package/dist/compiler/structure-renderer.js +189 -0
  112. package/dist/compiler/structure-renderer.js.map +1 -0
  113. package/dist/compiler/types.d.ts +96 -0
  114. package/dist/compiler/types.d.ts.map +1 -0
  115. package/dist/compiler/types.js +19 -0
  116. package/dist/compiler/types.js.map +1 -0
  117. package/dist/component/component-hooks.d.ts +68 -0
  118. package/dist/component/component-hooks.d.ts.map +1 -0
  119. package/dist/component/component-hooks.js +112 -0
  120. package/dist/component/component-hooks.js.map +1 -0
  121. package/dist/component/component.d.ts +314 -0
  122. package/dist/component/component.d.ts.map +1 -0
  123. package/dist/component/component.js +64 -0
  124. package/dist/component/component.js.map +1 -0
  125. package/dist/component/index.d.ts +47 -0
  126. package/dist/component/index.d.ts.map +1 -0
  127. package/dist/component/index.js +47 -0
  128. package/dist/component/index.js.map +1 -0
  129. package/dist/component/tentickle-component.d.ts +185 -0
  130. package/dist/component/tentickle-component.d.ts.map +1 -0
  131. package/dist/component/tentickle-component.js +182 -0
  132. package/dist/component/tentickle-component.js.map +1 -0
  133. package/dist/content/index.d.ts +12 -0
  134. package/dist/content/index.d.ts.map +1 -0
  135. package/dist/content/index.js +17 -0
  136. package/dist/content/index.js.map +1 -0
  137. package/dist/context/index.d.ts +51 -0
  138. package/dist/context/index.d.ts.map +1 -0
  139. package/dist/context/index.js +69 -0
  140. package/dist/context/index.js.map +1 -0
  141. package/dist/core/channel-helpers.d.ts +31 -0
  142. package/dist/core/channel-helpers.d.ts.map +1 -0
  143. package/dist/core/channel-helpers.js +62 -0
  144. package/dist/core/channel-helpers.js.map +1 -0
  145. package/dist/core/channel.d.ts +164 -0
  146. package/dist/core/channel.d.ts.map +1 -0
  147. package/dist/core/channel.js +199 -0
  148. package/dist/core/channel.js.map +1 -0
  149. package/dist/core/context.d.ts +412 -0
  150. package/dist/core/context.d.ts.map +1 -0
  151. package/dist/core/context.js +290 -0
  152. package/dist/core/context.js.map +1 -0
  153. package/dist/core/event-buffer.d.ts +212 -0
  154. package/dist/core/event-buffer.d.ts.map +1 -0
  155. package/dist/core/event-buffer.js +346 -0
  156. package/dist/core/event-buffer.js.map +1 -0
  157. package/dist/core/execution-helpers.d.ts +179 -0
  158. package/dist/core/execution-helpers.d.ts.map +1 -0
  159. package/dist/core/execution-helpers.js +212 -0
  160. package/dist/core/execution-helpers.js.map +1 -0
  161. package/dist/core/execution-tracker.d.ts +53 -0
  162. package/dist/core/execution-tracker.d.ts.map +1 -0
  163. package/dist/core/execution-tracker.js +309 -0
  164. package/dist/core/execution-tracker.js.map +1 -0
  165. package/dist/core/index.d.ts +58 -0
  166. package/dist/core/index.d.ts.map +1 -0
  167. package/dist/core/index.js +58 -0
  168. package/dist/core/index.js.map +1 -0
  169. package/dist/core/logger.d.ts +341 -0
  170. package/dist/core/logger.d.ts.map +1 -0
  171. package/dist/core/logger.js +346 -0
  172. package/dist/core/logger.js.map +1 -0
  173. package/dist/core/metrics-helpers.d.ts +40 -0
  174. package/dist/core/metrics-helpers.d.ts.map +1 -0
  175. package/dist/core/metrics-helpers.js +72 -0
  176. package/dist/core/metrics-helpers.js.map +1 -0
  177. package/dist/core/otel-provider.d.ts +54 -0
  178. package/dist/core/otel-provider.d.ts.map +1 -0
  179. package/dist/core/otel-provider.js +107 -0
  180. package/dist/core/otel-provider.js.map +1 -0
  181. package/dist/core/procedure-graph.d.ts +136 -0
  182. package/dist/core/procedure-graph.d.ts.map +1 -0
  183. package/dist/core/procedure-graph.js +272 -0
  184. package/dist/core/procedure-graph.js.map +1 -0
  185. package/dist/core/procedure.d.ts +755 -0
  186. package/dist/core/procedure.d.ts.map +1 -0
  187. package/dist/core/procedure.js +899 -0
  188. package/dist/core/procedure.js.map +1 -0
  189. package/dist/core/stream.d.ts +106 -0
  190. package/dist/core/stream.d.ts.map +1 -0
  191. package/dist/core/stream.js +186 -0
  192. package/dist/core/stream.js.map +1 -0
  193. package/dist/core/telemetry.d.ts +182 -0
  194. package/dist/core/telemetry.d.ts.map +1 -0
  195. package/dist/core/telemetry.js +124 -0
  196. package/dist/core/telemetry.js.map +1 -0
  197. package/dist/engine/client-tool-coordinator.d.ts +50 -0
  198. package/dist/engine/client-tool-coordinator.d.ts.map +1 -0
  199. package/dist/engine/client-tool-coordinator.js +121 -0
  200. package/dist/engine/client-tool-coordinator.js.map +1 -0
  201. package/dist/engine/engine-events.d.ts +117 -0
  202. package/dist/engine/engine-events.d.ts.map +1 -0
  203. package/dist/engine/engine-events.js +178 -0
  204. package/dist/engine/engine-events.js.map +1 -0
  205. package/dist/engine/engine-response.d.ts +48 -0
  206. package/dist/engine/engine-response.d.ts.map +1 -0
  207. package/dist/engine/engine-response.js +2 -0
  208. package/dist/engine/engine-response.js.map +1 -0
  209. package/dist/engine/execution-graph.d.ts +104 -0
  210. package/dist/engine/execution-graph.d.ts.map +1 -0
  211. package/dist/engine/execution-graph.js +257 -0
  212. package/dist/engine/execution-graph.js.map +1 -0
  213. package/dist/engine/execution-handle.d.ts +212 -0
  214. package/dist/engine/execution-handle.d.ts.map +1 -0
  215. package/dist/engine/execution-handle.js +602 -0
  216. package/dist/engine/execution-handle.js.map +1 -0
  217. package/dist/engine/execution-types.d.ts +248 -0
  218. package/dist/engine/execution-types.d.ts.map +1 -0
  219. package/dist/engine/execution-types.js +23 -0
  220. package/dist/engine/execution-types.js.map +1 -0
  221. package/dist/engine/index.d.ts +21 -0
  222. package/dist/engine/index.d.ts.map +1 -0
  223. package/dist/engine/index.js +23 -0
  224. package/dist/engine/index.js.map +1 -0
  225. package/dist/engine/tool-confirmation-coordinator.d.ts +74 -0
  226. package/dist/engine/tool-confirmation-coordinator.d.ts.map +1 -0
  227. package/dist/engine/tool-confirmation-coordinator.js +137 -0
  228. package/dist/engine/tool-confirmation-coordinator.js.map +1 -0
  229. package/dist/engine/tool-executor.d.ts +127 -0
  230. package/dist/engine/tool-executor.d.ts.map +1 -0
  231. package/dist/engine/tool-executor.js +363 -0
  232. package/dist/engine/tool-executor.js.map +1 -0
  233. package/dist/hibernation/index.d.ts +126 -0
  234. package/dist/hibernation/index.d.ts.map +1 -0
  235. package/dist/hibernation/index.js +127 -0
  236. package/dist/hibernation/index.js.map +1 -0
  237. package/dist/hooks/base-hook-registry.d.ts +41 -0
  238. package/dist/hooks/base-hook-registry.d.ts.map +1 -0
  239. package/dist/hooks/base-hook-registry.js +76 -0
  240. package/dist/hooks/base-hook-registry.js.map +1 -0
  241. package/dist/hooks/com-state.d.ts +40 -0
  242. package/dist/hooks/com-state.d.ts.map +1 -0
  243. package/dist/hooks/com-state.js +90 -0
  244. package/dist/hooks/com-state.js.map +1 -0
  245. package/dist/hooks/context-info.d.ts +139 -0
  246. package/dist/hooks/context-info.d.ts.map +1 -0
  247. package/dist/hooks/context-info.js +115 -0
  248. package/dist/hooks/context-info.js.map +1 -0
  249. package/dist/hooks/context-internal.d.ts +21 -0
  250. package/dist/hooks/context-internal.d.ts.map +1 -0
  251. package/dist/hooks/context-internal.js +20 -0
  252. package/dist/hooks/context-internal.js.map +1 -0
  253. package/dist/hooks/context.d.ts +64 -0
  254. package/dist/hooks/context.d.ts.map +1 -0
  255. package/dist/hooks/context.js +83 -0
  256. package/dist/hooks/context.js.map +1 -0
  257. package/dist/hooks/data.d.ts +33 -0
  258. package/dist/hooks/data.d.ts.map +1 -0
  259. package/dist/hooks/data.js +84 -0
  260. package/dist/hooks/data.js.map +1 -0
  261. package/dist/hooks/formatter-context.d.ts +34 -0
  262. package/dist/hooks/formatter-context.d.ts.map +1 -0
  263. package/dist/hooks/formatter-context.js +34 -0
  264. package/dist/hooks/formatter-context.js.map +1 -0
  265. package/dist/hooks/hook-registry.d.ts +45 -0
  266. package/dist/hooks/hook-registry.d.ts.map +1 -0
  267. package/dist/hooks/hook-registry.js +109 -0
  268. package/dist/hooks/hook-registry.js.map +1 -0
  269. package/dist/hooks/index.d.ts +20 -0
  270. package/dist/hooks/index.d.ts.map +1 -0
  271. package/dist/hooks/index.js +47 -0
  272. package/dist/hooks/index.js.map +1 -0
  273. package/dist/hooks/knob.d.ts +87 -0
  274. package/dist/hooks/knob.d.ts.map +1 -0
  275. package/dist/hooks/knob.js +129 -0
  276. package/dist/hooks/knob.js.map +1 -0
  277. package/dist/hooks/knobs-component.d.ts +70 -0
  278. package/dist/hooks/knobs-component.d.ts.map +1 -0
  279. package/dist/hooks/knobs-component.js +300 -0
  280. package/dist/hooks/knobs-component.js.map +1 -0
  281. package/dist/hooks/lifecycle.d.ts +158 -0
  282. package/dist/hooks/lifecycle.d.ts.map +1 -0
  283. package/dist/hooks/lifecycle.js +217 -0
  284. package/dist/hooks/lifecycle.js.map +1 -0
  285. package/dist/hooks/message-context.d.ts +101 -0
  286. package/dist/hooks/message-context.d.ts.map +1 -0
  287. package/dist/hooks/message-context.js +145 -0
  288. package/dist/hooks/message-context.js.map +1 -0
  289. package/dist/hooks/policy-context.d.ts.map +1 -0
  290. package/dist/hooks/runtime-context.d.ts +122 -0
  291. package/dist/hooks/runtime-context.d.ts.map +1 -0
  292. package/dist/hooks/runtime-context.js +149 -0
  293. package/dist/hooks/runtime-context.js.map +1 -0
  294. package/dist/hooks/signal.d.ts +267 -0
  295. package/dist/hooks/signal.d.ts.map +1 -0
  296. package/dist/hooks/signal.js +825 -0
  297. package/dist/hooks/signal.js.map +1 -0
  298. package/dist/hooks/types.d.ts +179 -0
  299. package/dist/hooks/types.d.ts.map +1 -0
  300. package/dist/hooks/types.js +5 -0
  301. package/dist/hooks/types.js.map +1 -0
  302. package/dist/index.d.ts +20 -0
  303. package/dist/index.d.ts.map +1 -0
  304. package/dist/index.js +50 -0
  305. package/dist/index.js.map +1 -0
  306. package/dist/jsx/components/agent.d.ts +64 -0
  307. package/dist/jsx/components/agent.d.ts.map +1 -0
  308. package/dist/jsx/components/agent.js +80 -0
  309. package/dist/jsx/components/agent.js.map +1 -0
  310. package/dist/jsx/components/complete.d.ts +65 -0
  311. package/dist/jsx/components/complete.d.ts.map +1 -0
  312. package/dist/jsx/components/complete.js +64 -0
  313. package/dist/jsx/components/complete.js.map +1 -0
  314. package/dist/jsx/components/content.d.ts +98 -0
  315. package/dist/jsx/components/content.d.ts.map +1 -0
  316. package/dist/jsx/components/content.js +51 -0
  317. package/dist/jsx/components/content.js.map +1 -0
  318. package/dist/jsx/components/harness.d.ts +118 -0
  319. package/dist/jsx/components/harness.d.ts.map +1 -0
  320. package/dist/jsx/components/harness.js +117 -0
  321. package/dist/jsx/components/harness.js.map +1 -0
  322. package/dist/jsx/components/index.d.ts +11 -0
  323. package/dist/jsx/components/index.d.ts.map +1 -0
  324. package/dist/jsx/components/index.js +11 -0
  325. package/dist/jsx/components/index.js.map +1 -0
  326. package/dist/jsx/components/markdown.d.ts +31 -0
  327. package/dist/jsx/components/markdown.d.ts.map +1 -0
  328. package/dist/jsx/components/markdown.js +17 -0
  329. package/dist/jsx/components/markdown.js.map +1 -0
  330. package/dist/jsx/components/messages.d.ts +283 -0
  331. package/dist/jsx/components/messages.d.ts.map +1 -0
  332. package/dist/jsx/components/messages.js +257 -0
  333. package/dist/jsx/components/messages.js.map +1 -0
  334. package/dist/jsx/components/model.d.ts +94 -0
  335. package/dist/jsx/components/model.d.ts.map +1 -0
  336. package/dist/jsx/components/model.js +96 -0
  337. package/dist/jsx/components/model.js.map +1 -0
  338. package/dist/jsx/components/primitives.d.ts +117 -0
  339. package/dist/jsx/components/primitives.d.ts.map +1 -0
  340. package/dist/jsx/components/primitives.js +83 -0
  341. package/dist/jsx/components/primitives.js.map +1 -0
  342. package/dist/jsx/components/renderer.d.ts +24 -0
  343. package/dist/jsx/components/renderer.d.ts.map +1 -0
  344. package/dist/jsx/components/renderer.js +11 -0
  345. package/dist/jsx/components/renderer.js.map +1 -0
  346. package/dist/jsx/components/semantic.d.ts +155 -0
  347. package/dist/jsx/components/semantic.d.ts.map +1 -0
  348. package/dist/jsx/components/semantic.js +39 -0
  349. package/dist/jsx/components/semantic.js.map +1 -0
  350. package/dist/jsx/components/timeline.d.ts +157 -0
  351. package/dist/jsx/components/timeline.d.ts.map +1 -0
  352. package/dist/jsx/components/timeline.js +357 -0
  353. package/dist/jsx/components/timeline.js.map +1 -0
  354. package/dist/jsx/components/token-budget.d.ts +70 -0
  355. package/dist/jsx/components/token-budget.d.ts.map +1 -0
  356. package/dist/jsx/components/token-budget.js +135 -0
  357. package/dist/jsx/components/token-budget.js.map +1 -0
  358. package/dist/jsx/components/xml.d.ts +27 -0
  359. package/dist/jsx/components/xml.d.ts.map +1 -0
  360. package/dist/jsx/components/xml.js +17 -0
  361. package/dist/jsx/components/xml.js.map +1 -0
  362. package/dist/jsx/index.d.ts +58 -0
  363. package/dist/jsx/index.d.ts.map +1 -0
  364. package/dist/jsx/index.js +59 -0
  365. package/dist/jsx/index.js.map +1 -0
  366. package/dist/jsx/jsx-runtime.d.ts +370 -0
  367. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  368. package/dist/jsx/jsx-runtime.js +79 -0
  369. package/dist/jsx/jsx-runtime.js.map +1 -0
  370. package/dist/jsx/jsx-types.d.ts +23 -0
  371. package/dist/jsx/jsx-types.d.ts.map +1 -0
  372. package/dist/jsx/jsx-types.js +1 -0
  373. package/dist/jsx/jsx-types.js.map +1 -0
  374. package/dist/mcp/client.d.ts +46 -0
  375. package/dist/mcp/client.d.ts.map +1 -0
  376. package/dist/mcp/client.js +138 -0
  377. package/dist/mcp/client.js.map +1 -0
  378. package/dist/mcp/component.d.ts +95 -0
  379. package/dist/mcp/component.d.ts.map +1 -0
  380. package/dist/mcp/component.js +185 -0
  381. package/dist/mcp/component.js.map +1 -0
  382. package/dist/mcp/create-mcp-tool.d.ts +191 -0
  383. package/dist/mcp/create-mcp-tool.d.ts.map +1 -0
  384. package/dist/mcp/create-mcp-tool.js +228 -0
  385. package/dist/mcp/create-mcp-tool.js.map +1 -0
  386. package/dist/mcp/index.d.ts +49 -0
  387. package/dist/mcp/index.d.ts.map +1 -0
  388. package/dist/mcp/index.js +48 -0
  389. package/dist/mcp/index.js.map +1 -0
  390. package/dist/mcp/service.d.ts +39 -0
  391. package/dist/mcp/service.d.ts.map +1 -0
  392. package/dist/mcp/service.js +77 -0
  393. package/dist/mcp/service.js.map +1 -0
  394. package/dist/mcp/tool.d.ts +55 -0
  395. package/dist/mcp/tool.d.ts.map +1 -0
  396. package/dist/mcp/tool.js +119 -0
  397. package/dist/mcp/tool.js.map +1 -0
  398. package/dist/mcp/types.d.ts +72 -0
  399. package/dist/mcp/types.d.ts.map +1 -0
  400. package/dist/mcp/types.js +6 -0
  401. package/dist/mcp/types.js.map +1 -0
  402. package/dist/middleware/defaults.d.ts +9 -0
  403. package/dist/middleware/defaults.d.ts.map +1 -0
  404. package/dist/middleware/defaults.js +47 -0
  405. package/dist/middleware/defaults.js.map +1 -0
  406. package/dist/model/adapter-helpers.d.ts +161 -0
  407. package/dist/model/adapter-helpers.d.ts.map +1 -0
  408. package/dist/model/adapter-helpers.js +351 -0
  409. package/dist/model/adapter-helpers.js.map +1 -0
  410. package/dist/model/adapter.d.ts +399 -0
  411. package/dist/model/adapter.d.ts.map +1 -0
  412. package/dist/model/adapter.js +497 -0
  413. package/dist/model/adapter.js.map +1 -0
  414. package/dist/model/index.d.ts +54 -0
  415. package/dist/model/index.d.ts.map +1 -0
  416. package/dist/model/index.js +55 -0
  417. package/dist/model/index.js.map +1 -0
  418. package/dist/model/model-hooks.d.ts +45 -0
  419. package/dist/model/model-hooks.d.ts.map +1 -0
  420. package/dist/model/model-hooks.js +24 -0
  421. package/dist/model/model-hooks.js.map +1 -0
  422. package/dist/model/model.d.ts +302 -0
  423. package/dist/model/model.d.ts.map +1 -0
  424. package/dist/model/model.js +20 -0
  425. package/dist/model/model.js.map +1 -0
  426. package/dist/model/simple-adapter.d.ts +176 -0
  427. package/dist/model/simple-adapter.d.ts.map +1 -0
  428. package/dist/model/simple-adapter.js +264 -0
  429. package/dist/model/simple-adapter.js.map +1 -0
  430. package/dist/model/stream-accumulator.d.ts +284 -0
  431. package/dist/model/stream-accumulator.d.ts.map +1 -0
  432. package/dist/model/stream-accumulator.js +532 -0
  433. package/dist/model/stream-accumulator.js.map +1 -0
  434. package/dist/model/utils/index.d.ts +2 -0
  435. package/dist/model/utils/index.d.ts.map +1 -0
  436. package/dist/model/utils/index.js +2 -0
  437. package/dist/model/utils/index.js.map +1 -0
  438. package/dist/model/utils/language-model.d.ts +26 -0
  439. package/dist/model/utils/language-model.d.ts.map +1 -0
  440. package/dist/model/utils/language-model.js +706 -0
  441. package/dist/model/utils/language-model.js.map +1 -0
  442. package/dist/procedure/index.d.ts +20 -0
  443. package/dist/procedure/index.d.ts.map +1 -0
  444. package/dist/procedure/index.js +19 -0
  445. package/dist/procedure/index.js.map +1 -0
  446. package/dist/reconciler/devtools-bridge.d.ts +40 -0
  447. package/dist/reconciler/devtools-bridge.d.ts.map +1 -0
  448. package/dist/reconciler/devtools-bridge.js +79 -0
  449. package/dist/reconciler/devtools-bridge.js.map +1 -0
  450. package/dist/reconciler/host-config.d.ts +39 -0
  451. package/dist/reconciler/host-config.d.ts.map +1 -0
  452. package/dist/reconciler/host-config.js +195 -0
  453. package/dist/reconciler/host-config.js.map +1 -0
  454. package/dist/reconciler/index.d.ts +7 -0
  455. package/dist/reconciler/index.d.ts.map +1 -0
  456. package/dist/reconciler/index.js +7 -0
  457. package/dist/reconciler/index.js.map +1 -0
  458. package/dist/reconciler/reconciler.d.ts +47 -0
  459. package/dist/reconciler/reconciler.d.ts.map +1 -0
  460. package/dist/reconciler/reconciler.js +89 -0
  461. package/dist/reconciler/reconciler.js.map +1 -0
  462. package/dist/reconciler/types.d.ts +86 -0
  463. package/dist/reconciler/types.d.ts.map +1 -0
  464. package/dist/reconciler/types.js +37 -0
  465. package/dist/reconciler/types.js.map +1 -0
  466. package/dist/renderers/base.d.ts +98 -0
  467. package/dist/renderers/base.d.ts.map +1 -0
  468. package/dist/renderers/base.js +82 -0
  469. package/dist/renderers/base.js.map +1 -0
  470. package/dist/renderers/index.d.ts +31 -0
  471. package/dist/renderers/index.d.ts.map +1 -0
  472. package/dist/renderers/index.js +31 -0
  473. package/dist/renderers/index.js.map +1 -0
  474. package/dist/renderers/markdown.d.ts +48 -0
  475. package/dist/renderers/markdown.d.ts.map +1 -0
  476. package/dist/renderers/markdown.js +432 -0
  477. package/dist/renderers/markdown.js.map +1 -0
  478. package/dist/renderers/types.d.ts +7 -0
  479. package/dist/renderers/types.d.ts.map +1 -0
  480. package/dist/renderers/types.js +7 -0
  481. package/dist/renderers/types.js.map +1 -0
  482. package/dist/renderers/xml.d.ts +49 -0
  483. package/dist/renderers/xml.d.ts.map +1 -0
  484. package/dist/renderers/xml.js +444 -0
  485. package/dist/renderers/xml.js.map +1 -0
  486. package/dist/state/boundary.d.ts +347 -0
  487. package/dist/state/boundary.d.ts.map +1 -0
  488. package/dist/state/boundary.js +341 -0
  489. package/dist/state/boundary.js.map +1 -0
  490. package/dist/state/context.d.ts +138 -0
  491. package/dist/state/context.d.ts.map +1 -0
  492. package/dist/state/context.js +139 -0
  493. package/dist/state/context.js.map +1 -0
  494. package/dist/state/hooks.d.ts +798 -0
  495. package/dist/state/hooks.d.ts.map +1 -0
  496. package/dist/state/hooks.js +1437 -0
  497. package/dist/state/hooks.js.map +1 -0
  498. package/dist/state/index.d.ts +72 -0
  499. package/dist/state/index.d.ts.map +1 -0
  500. package/dist/state/index.js +73 -0
  501. package/dist/state/index.js.map +1 -0
  502. package/dist/state/signal.d.ts +223 -0
  503. package/dist/state/signal.d.ts.map +1 -0
  504. package/dist/state/signal.js +699 -0
  505. package/dist/state/signal.js.map +1 -0
  506. package/dist/state/use-state.d.ts +210 -0
  507. package/dist/state/use-state.d.ts.map +1 -0
  508. package/dist/state/use-state.js +327 -0
  509. package/dist/state/use-state.js.map +1 -0
  510. package/dist/tentickle-instance.d.ts +285 -0
  511. package/dist/tentickle-instance.d.ts.map +1 -0
  512. package/dist/tentickle-instance.js +700 -0
  513. package/dist/tentickle-instance.js.map +1 -0
  514. package/dist/testing/act.d.ts +59 -0
  515. package/dist/testing/act.d.ts.map +1 -0
  516. package/dist/testing/act.js +92 -0
  517. package/dist/testing/act.js.map +1 -0
  518. package/dist/testing/async-helpers.d.ts +99 -0
  519. package/dist/testing/async-helpers.d.ts.map +1 -0
  520. package/dist/testing/async-helpers.js +193 -0
  521. package/dist/testing/async-helpers.js.map +1 -0
  522. package/dist/testing/compile-agent.d.ts +101 -0
  523. package/dist/testing/compile-agent.d.ts.map +1 -0
  524. package/dist/testing/compile-agent.js +136 -0
  525. package/dist/testing/compile-agent.js.map +1 -0
  526. package/dist/testing/index.d.ts +57 -0
  527. package/dist/testing/index.d.ts.map +1 -0
  528. package/dist/testing/index.js +59 -0
  529. package/dist/testing/index.js.map +1 -0
  530. package/dist/testing/mock-app.d.ts +163 -0
  531. package/dist/testing/mock-app.d.ts.map +1 -0
  532. package/dist/testing/mock-app.js +393 -0
  533. package/dist/testing/mock-app.js.map +1 -0
  534. package/dist/testing/mocks.d.ts +142 -0
  535. package/dist/testing/mocks.d.ts.map +1 -0
  536. package/dist/testing/mocks.js +191 -0
  537. package/dist/testing/mocks.js.map +1 -0
  538. package/dist/testing/render-agent.d.ts +146 -0
  539. package/dist/testing/render-agent.d.ts.map +1 -0
  540. package/dist/testing/render-agent.js +200 -0
  541. package/dist/testing/render-agent.js.map +1 -0
  542. package/dist/testing/test-adapter.d.ts +157 -0
  543. package/dist/testing/test-adapter.d.ts.map +1 -0
  544. package/dist/testing/test-adapter.js +297 -0
  545. package/dist/testing/test-adapter.js.map +1 -0
  546. package/dist/testing/test-model.d.ts +132 -0
  547. package/dist/testing/test-model.d.ts.map +1 -0
  548. package/dist/testing/test-model.js +260 -0
  549. package/dist/testing/test-model.js.map +1 -0
  550. package/dist/tool/index.d.ts +61 -0
  551. package/dist/tool/index.d.ts.map +1 -0
  552. package/dist/tool/index.js +63 -0
  553. package/dist/tool/index.js.map +1 -0
  554. package/dist/tool/tool-hooks.d.ts +45 -0
  555. package/dist/tool/tool-hooks.d.ts.map +1 -0
  556. package/dist/tool/tool-hooks.js +35 -0
  557. package/dist/tool/tool-hooks.js.map +1 -0
  558. package/dist/tool/tool.d.ts +403 -0
  559. package/dist/tool/tool.d.ts.map +1 -0
  560. package/dist/tool/tool.js +176 -0
  561. package/dist/tool/tool.js.map +1 -0
  562. package/dist/types.d.ts +442 -0
  563. package/dist/types.d.ts.map +1 -0
  564. package/dist/types.js +97 -0
  565. package/dist/types.js.map +1 -0
  566. package/dist/utils/abort-utils.d.ts +5 -0
  567. package/dist/utils/abort-utils.d.ts.map +1 -0
  568. package/dist/utils/abort-utils.js +50 -0
  569. package/dist/utils/abort-utils.js.map +1 -0
  570. package/dist/utils/classify-error.d.ts +19 -0
  571. package/dist/utils/classify-error.d.ts.map +1 -0
  572. package/dist/utils/classify-error.js +77 -0
  573. package/dist/utils/classify-error.js.map +1 -0
  574. package/dist/utils/index.d.ts +21 -0
  575. package/dist/utils/index.d.ts.map +1 -0
  576. package/dist/utils/index.js +21 -0
  577. package/dist/utils/index.js.map +1 -0
  578. package/dist/utils/normalization.d.ts +6 -0
  579. package/dist/utils/normalization.d.ts.map +1 -0
  580. package/dist/utils/normalization.js +103 -0
  581. package/dist/utils/normalization.js.map +1 -0
  582. package/dist/utils/registry.d.ts +15 -0
  583. package/dist/utils/registry.d.ts.map +1 -0
  584. package/dist/utils/registry.js +28 -0
  585. package/dist/utils/registry.js.map +1 -0
  586. package/dist/utils/schema.d.ts +7 -0
  587. package/dist/utils/schema.d.ts.map +1 -0
  588. package/dist/utils/schema.js +13 -0
  589. package/dist/utils/schema.js.map +1 -0
  590. package/dist/utils/token-estimate.d.ts +87 -0
  591. package/dist/utils/token-estimate.d.ts.map +1 -0
  592. package/dist/utils/token-estimate.js +199 -0
  593. package/dist/utils/token-estimate.js.map +1 -0
  594. package/dist/v2/reconciler/host-config.d.ts +31 -0
  595. package/dist/v2/reconciler/host-config.d.ts.map +1 -0
  596. package/dist/v2/reconciler/host-config.js +197 -0
  597. package/dist/v2/reconciler/host-config.js.map +1 -0
  598. package/dist/v2/reconciler/index.d.ts +7 -0
  599. package/dist/v2/reconciler/index.d.ts.map +1 -0
  600. package/dist/v2/reconciler/index.js +7 -0
  601. package/dist/v2/reconciler/index.js.map +1 -0
  602. package/dist/v2/reconciler/reconciler.d.ts +39 -0
  603. package/dist/v2/reconciler/reconciler.d.ts.map +1 -0
  604. package/dist/v2/reconciler/reconciler.js +54 -0
  605. package/dist/v2/reconciler/reconciler.js.map +1 -0
  606. package/dist/v2/reconciler/types.d.ts +64 -0
  607. package/dist/v2/reconciler/types.d.ts.map +1 -0
  608. package/dist/v2/reconciler/types.js +20 -0
  609. package/dist/v2/reconciler/types.js.map +1 -0
  610. package/dist/v2/renderers/index.d.ts +7 -0
  611. package/dist/v2/renderers/index.d.ts.map +1 -0
  612. package/dist/v2/renderers/index.js +7 -0
  613. package/dist/v2/renderers/index.js.map +1 -0
  614. package/dist/v2/renderers/markdown.d.ts +16 -0
  615. package/dist/v2/renderers/markdown.d.ts.map +1 -0
  616. package/dist/v2/renderers/markdown.js +65 -0
  617. package/dist/v2/renderers/markdown.js.map +1 -0
  618. package/dist/v2/renderers/types.d.ts +26 -0
  619. package/dist/v2/renderers/types.d.ts.map +1 -0
  620. package/dist/v2/renderers/types.js +6 -0
  621. package/dist/v2/renderers/types.js.map +1 -0
  622. package/dist/v2/renderers/xml.d.ts +17 -0
  623. package/dist/v2/renderers/xml.d.ts.map +1 -0
  624. package/dist/v2/renderers/xml.js +73 -0
  625. package/dist/v2/renderers/xml.js.map +1 -0
  626. package/package.json +49 -0
@@ -0,0 +1,699 @@
1
+ /**
2
+ * Signal implementation for reactive state management.
3
+ *
4
+ * Signals provide a lightweight, framework-agnostic way to manage reactive state.
5
+ * Similar to Angular/SolidJS signals.
6
+ *
7
+ * **Important:** Signals only work in class components (`EngineComponent`).
8
+ * They do NOT work in pure function components. See `use-state.ts` for details.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Create a signal
13
+ * const count = signal(0);
14
+ *
15
+ * // Read value
16
+ * console.log(count()); // 0
17
+ *
18
+ * // Update value
19
+ * count.set(10);
20
+ * console.log(count()); // 10
21
+ *
22
+ * // Update with function
23
+ * count.update(n => n + 1);
24
+ * console.log(count()); // 11
25
+ *
26
+ * // Computed signal (memoized, auto-updates)
27
+ * const doubled = computed(() => count() * 2);
28
+ * console.log(doubled()); // 22
29
+ *
30
+ * // Cleanup when done
31
+ * count.dispose();
32
+ * ```
33
+ *
34
+ * @see docs/state-management.md for full documentation
35
+ */
36
+ import { AsyncLocalStorage } from "node:async_hooks";
37
+ // Import for render phase detection
38
+ import { isCompilerRendering, shouldSkipRecompile, getActiveCompiler, } from "../compiler/fiber-compiler";
39
+ /**
40
+ * SignalContext holds per-execution state for signals.
41
+ *
42
+ * While batch() and computed() are synchronous operations that complete
43
+ * without yielding to the event loop, using AsyncLocalStorage provides:
44
+ *
45
+ * 1. **Defensive design** - If async code is ever introduced in batch/computed,
46
+ * it won't break.
47
+ * 2. **Explicit isolation** - Each Tentickle execution has its own context,
48
+ * making the concurrency model clear.
49
+ * 3. **Consistency** - Same pattern as RenderContext.scheduleWork.
50
+ *
51
+ * Note: In current usage, batch/tracking are synchronous, so the global
52
+ * fallback works identically to ALS for single-execution scenarios.
53
+ */
54
+ class SignalContext {
55
+ /** Stack of tracking contexts for computed/effect dependency tracking */
56
+ trackingStack = [];
57
+ /** Current batch nesting depth */
58
+ batchDepth = 0;
59
+ /** Effects waiting to be flushed after batch completes */
60
+ pendingEffects = new Set();
61
+ /** Whether a microtask flush is scheduled */
62
+ flushScheduled = false;
63
+ }
64
+ /**
65
+ * AsyncLocalStorage for signal execution context.
66
+ * Each Tentickle execution (app.run, session.tick) runs within its own context.
67
+ */
68
+ const signalContextStorage = new AsyncLocalStorage();
69
+ /**
70
+ * Global fallback context for signals used outside of Tentickle execution.
71
+ * This allows standalone signal usage (e.g., in tests, scripts) while
72
+ * maintaining full concurrency safety within Tentickle.
73
+ */
74
+ const globalSignalContext = new SignalContext();
75
+ /**
76
+ * Get the current signal context.
77
+ * Returns the ALS context if available, otherwise the global fallback.
78
+ */
79
+ function getSignalContext() {
80
+ return signalContextStorage.getStore() ?? globalSignalContext;
81
+ }
82
+ /**
83
+ * Run a function within a signal context.
84
+ * Used by FiberCompiler to establish per-execution context.
85
+ *
86
+ * @internal
87
+ */
88
+ export function runWithSignalContext(fn) {
89
+ return signalContextStorage.run(new SignalContext(), fn);
90
+ }
91
+ /**
92
+ * Run an async function within a signal context.
93
+ * Used by FiberCompiler to establish per-execution context.
94
+ *
95
+ * @internal
96
+ */
97
+ export async function runWithSignalContextAsync(fn) {
98
+ return signalContextStorage.run(new SignalContext(), fn);
99
+ }
100
+ // ============================================================================
101
+ // Types
102
+ // ============================================================================
103
+ export const SIGNAL_SYMBOL = Symbol.for("tentickle.signal");
104
+ export const COMPUTED_SYMBOL = Symbol.for("tentickle.computed");
105
+ export const EFFECT_SYMBOL = Symbol.for("tentickle.effect");
106
+ // ============================================================================
107
+ // Batching
108
+ // ============================================================================
109
+ /**
110
+ * Batch multiple signal updates together.
111
+ * Effects only run once after all updates complete.
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * batch(() => {
116
+ * count.set(1);
117
+ * name.set('Alice');
118
+ * // Effects run once here, not twice
119
+ * });
120
+ * ```
121
+ */
122
+ export function batch(fn) {
123
+ const ctx = getSignalContext();
124
+ ctx.batchDepth++;
125
+ try {
126
+ return fn();
127
+ }
128
+ finally {
129
+ ctx.batchDepth--;
130
+ if (ctx.batchDepth === 0) {
131
+ flushPendingEffects(ctx);
132
+ }
133
+ }
134
+ }
135
+ function scheduleEffect(effectFn) {
136
+ const ctx = getSignalContext();
137
+ if (ctx.batchDepth > 0) {
138
+ ctx.pendingEffects.add(effectFn);
139
+ return;
140
+ }
141
+ // Schedule microtask flush if not already scheduled
142
+ ctx.pendingEffects.add(effectFn);
143
+ if (!ctx.flushScheduled) {
144
+ ctx.flushScheduled = true;
145
+ // Capture context for the microtask
146
+ queueMicrotask(() => flushPendingEffects(ctx));
147
+ }
148
+ }
149
+ function flushPendingEffects(ctx) {
150
+ ctx.flushScheduled = false;
151
+ const effects = [...ctx.pendingEffects];
152
+ ctx.pendingEffects.clear();
153
+ for (const effectFn of effects) {
154
+ try {
155
+ effectFn();
156
+ }
157
+ catch (error) {
158
+ console.error("Error in signal effect:", error);
159
+ }
160
+ }
161
+ }
162
+ function getCurrentTrackingContext() {
163
+ const ctx = getSignalContext();
164
+ return ctx.trackingStack[ctx.trackingStack.length - 1];
165
+ }
166
+ function pushTrackingContext(trackingCtx) {
167
+ const ctx = getSignalContext();
168
+ ctx.trackingStack.push(trackingCtx);
169
+ }
170
+ function popTrackingContext() {
171
+ const ctx = getSignalContext();
172
+ ctx.trackingStack.pop();
173
+ }
174
+ // ============================================================================
175
+ // Signal
176
+ // ============================================================================
177
+ /**
178
+ * Creates a writable signal with an initial value.
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const count = signal(0);
183
+ * count(); // 0
184
+ * count.set(10); // set to 10
185
+ * count.update(n => n + 1); // increment
186
+ * count.dispose(); // cleanup
187
+ * ```
188
+ */
189
+ export function signal(initialValue, options) {
190
+ let value = initialValue;
191
+ let isDisposed = false;
192
+ const subscriptions = new Set();
193
+ const equal = options?.equal ?? Object.is;
194
+ const notify = () => {
195
+ for (const sub of subscriptions) {
196
+ scheduleEffect(sub.notify);
197
+ }
198
+ };
199
+ // Internal: subscribe to this signal
200
+ const _subscribe = (notifyFn) => {
201
+ const subscription = {
202
+ notify: notifyFn,
203
+ dispose: () => {
204
+ subscriptions.delete(subscription);
205
+ },
206
+ };
207
+ subscriptions.add(subscription);
208
+ return subscription;
209
+ };
210
+ const getter = () => {
211
+ if (isDisposed) {
212
+ return value;
213
+ }
214
+ // Track this signal as a dependency of current computed/effect
215
+ const context = getCurrentTrackingContext();
216
+ if (context) {
217
+ context.onDependency({ _subscribe });
218
+ }
219
+ return value;
220
+ };
221
+ const setter = (newValue) => {
222
+ if (isDisposed) {
223
+ console.warn("Attempted to set disposed signal");
224
+ return;
225
+ }
226
+ const nextValue = typeof newValue === "function" ? newValue(value) : newValue;
227
+ if (!equal(nextValue, value)) {
228
+ value = nextValue;
229
+ notify();
230
+ }
231
+ };
232
+ const updater = (updaterFn) => {
233
+ setter(updaterFn(value));
234
+ };
235
+ const dispose = () => {
236
+ isDisposed = true;
237
+ subscriptions.clear();
238
+ };
239
+ const signalFn = getter;
240
+ signalFn.set = setter;
241
+ signalFn.update = updater;
242
+ signalFn.dispose = dispose;
243
+ signalFn._subscribe = _subscribe;
244
+ signalFn[SIGNAL_SYMBOL] = true;
245
+ Object.defineProperty(signalFn, "value", {
246
+ get: getter,
247
+ enumerable: true,
248
+ configurable: true,
249
+ });
250
+ Object.defineProperty(signalFn, "disposed", {
251
+ get: () => isDisposed,
252
+ enumerable: true,
253
+ configurable: true,
254
+ });
255
+ return signalFn;
256
+ }
257
+ // ============================================================================
258
+ // Computed
259
+ // ============================================================================
260
+ /**
261
+ * Creates a computed signal that derives its value from other signals.
262
+ * Computed values are memoized and only recompute when dependencies change.
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * const count = signal(0);
267
+ * const doubled = computed(() => count() * 2);
268
+ *
269
+ * doubled(); // 0
270
+ * count.set(5);
271
+ * doubled(); // 10 (recomputed)
272
+ * doubled(); // 10 (cached, no recompute)
273
+ * ```
274
+ */
275
+ export function computed(computation, options) {
276
+ let cachedValue;
277
+ let isDirty = true;
278
+ let isDisposed = false;
279
+ let isComputing = false;
280
+ const _equal = options?.equal ?? Object.is;
281
+ // Subscriptions to our dependencies (signals we read)
282
+ const dependencySubscriptions = new Set();
283
+ // Subscriptions from our dependents (things that read us)
284
+ const dependentSubscriptions = new Set();
285
+ const markDirty = () => {
286
+ if (!isDirty && !isDisposed) {
287
+ isDirty = true;
288
+ // Notify our dependents that we might have changed
289
+ for (const sub of dependentSubscriptions) {
290
+ scheduleEffect(sub.notify);
291
+ }
292
+ }
293
+ };
294
+ // Internal: subscribe to this computed
295
+ const _subscribe = (notifyFn) => {
296
+ const subscription = {
297
+ notify: notifyFn,
298
+ dispose: () => {
299
+ dependentSubscriptions.delete(subscription);
300
+ },
301
+ };
302
+ dependentSubscriptions.add(subscription);
303
+ return subscription;
304
+ };
305
+ const clearDependencies = () => {
306
+ // Unsubscribe from all current dependencies
307
+ for (const sub of dependencySubscriptions) {
308
+ sub.dispose();
309
+ }
310
+ dependencySubscriptions.clear();
311
+ };
312
+ const recompute = () => {
313
+ if (isComputing) {
314
+ throw new Error("Circular dependency detected in computed signal");
315
+ }
316
+ isComputing = true;
317
+ // Clear old dependencies
318
+ clearDependencies();
319
+ // Set up tracking context to capture new dependencies
320
+ const trackingContext = {
321
+ onDependency: (source) => {
322
+ // Subscribe to this dependency
323
+ const subscription = source._subscribe(markDirty);
324
+ dependencySubscriptions.add(subscription);
325
+ },
326
+ };
327
+ pushTrackingContext(trackingContext);
328
+ try {
329
+ const newValue = computation();
330
+ cachedValue = newValue;
331
+ isDirty = false;
332
+ return cachedValue;
333
+ }
334
+ finally {
335
+ popTrackingContext();
336
+ isComputing = false;
337
+ }
338
+ };
339
+ const getter = () => {
340
+ if (isDisposed) {
341
+ return cachedValue;
342
+ }
343
+ // Track this computed as dependency of parent computed/effect
344
+ const context = getCurrentTrackingContext();
345
+ if (context) {
346
+ context.onDependency({ _subscribe });
347
+ }
348
+ // Recompute if dirty (lazy evaluation)
349
+ if (isDirty) {
350
+ recompute();
351
+ }
352
+ return cachedValue;
353
+ };
354
+ const dispose = () => {
355
+ if (isDisposed)
356
+ return;
357
+ isDisposed = true;
358
+ isDirty = false;
359
+ // Unsubscribe from all dependencies - THIS FIXES THE MEMORY LEAK
360
+ clearDependencies();
361
+ // Clear our dependents (they'll get undefined on next read)
362
+ dependentSubscriptions.clear();
363
+ };
364
+ const computedFn = getter;
365
+ computedFn.dispose = dispose;
366
+ computedFn._subscribe = _subscribe;
367
+ computedFn[COMPUTED_SYMBOL] = true;
368
+ Object.defineProperty(computedFn, "value", {
369
+ get: getter,
370
+ enumerable: true,
371
+ configurable: true,
372
+ });
373
+ Object.defineProperty(computedFn, "disposed", {
374
+ get: () => isDisposed,
375
+ enumerable: true,
376
+ configurable: true,
377
+ });
378
+ return computedFn;
379
+ }
380
+ // ============================================================================
381
+ // Effect
382
+ // ============================================================================
383
+ /**
384
+ * Runs an effect that automatically re-runs when dependencies change.
385
+ * Use sparingly - prefer computed() for derived values.
386
+ *
387
+ * Best for: syncing to external APIs (localStorage, canvas, DOM, etc.)
388
+ *
389
+ * @example
390
+ * ```typescript
391
+ * const count = signal(0);
392
+ *
393
+ * const ref = effect(() => {
394
+ * console.log('Count:', count());
395
+ * });
396
+ *
397
+ * count.set(5); // logs "Count: 5"
398
+ *
399
+ * ref.dispose(); // stop the effect
400
+ * ```
401
+ */
402
+ export function effect(fn) {
403
+ let isDisposed = false;
404
+ let cleanupFn;
405
+ const dependencySubscriptions = new Set();
406
+ const clearDependencies = () => {
407
+ for (const sub of dependencySubscriptions) {
408
+ sub.dispose();
409
+ }
410
+ dependencySubscriptions.clear();
411
+ };
412
+ const runEffect = () => {
413
+ if (isDisposed)
414
+ return;
415
+ // Run cleanup from previous execution
416
+ if (cleanupFn) {
417
+ try {
418
+ cleanupFn();
419
+ }
420
+ catch (error) {
421
+ console.error("Error in effect cleanup:", error);
422
+ }
423
+ cleanupFn = undefined;
424
+ }
425
+ // Clear old dependencies
426
+ clearDependencies();
427
+ // Set up tracking context
428
+ const trackingContext = {
429
+ onDependency: (source) => {
430
+ const subscription = source._subscribe(runEffect);
431
+ dependencySubscriptions.add(subscription);
432
+ },
433
+ };
434
+ pushTrackingContext(trackingContext);
435
+ try {
436
+ // Allow effect to register cleanup via callback or return value
437
+ const onCleanup = (cleanup) => {
438
+ cleanupFn = cleanup;
439
+ };
440
+ const result = fn(onCleanup);
441
+ // Also accept cleanup as return value (like React useEffect)
442
+ if (typeof result === "function") {
443
+ cleanupFn = result;
444
+ }
445
+ }
446
+ finally {
447
+ popTrackingContext();
448
+ }
449
+ };
450
+ const dispose = () => {
451
+ if (isDisposed)
452
+ return;
453
+ isDisposed = true;
454
+ // Unsubscribe from all dependencies
455
+ clearDependencies();
456
+ // Run final cleanup
457
+ if (cleanupFn) {
458
+ try {
459
+ cleanupFn();
460
+ }
461
+ catch (error) {
462
+ console.error("Error in effect cleanup:", error);
463
+ }
464
+ cleanupFn = undefined;
465
+ }
466
+ };
467
+ // Run immediately
468
+ runEffect();
469
+ const effectRef = {
470
+ dispose,
471
+ get disposed() {
472
+ return isDisposed;
473
+ },
474
+ };
475
+ // Mark as effect for cleanup detection
476
+ effectRef[EFFECT_SYMBOL] = true;
477
+ return effectRef;
478
+ }
479
+ // ============================================================================
480
+ // Utilities
481
+ // ============================================================================
482
+ /**
483
+ * Read a signal without tracking it as a dependency.
484
+ * Useful when you want to read a value in a computed/effect without
485
+ * triggering re-runs when that value changes.
486
+ *
487
+ * @example
488
+ * ```typescript
489
+ * effect(() => {
490
+ * const user = currentUser();
491
+ * const count = untracked(() => counter()); // won't trigger re-run
492
+ * console.log(`User ${user} has count ${count}`);
493
+ * });
494
+ * ```
495
+ */
496
+ export function untracked(fn) {
497
+ const ctx = getSignalContext();
498
+ // Temporarily remove tracking context
499
+ const savedStack = [...ctx.trackingStack];
500
+ ctx.trackingStack.length = 0;
501
+ try {
502
+ return fn();
503
+ }
504
+ finally {
505
+ ctx.trackingStack.push(...savedStack);
506
+ }
507
+ }
508
+ /**
509
+ * Check if a value is a signal.
510
+ */
511
+ export function isSignal(value) {
512
+ return typeof value === "function" && value[SIGNAL_SYMBOL] === true;
513
+ }
514
+ /**
515
+ * Check if a value is a computed signal.
516
+ */
517
+ export function isComputed(value) {
518
+ return typeof value === "function" && value[COMPUTED_SYMBOL] === true;
519
+ }
520
+ /**
521
+ * Check if a value is an effect ref.
522
+ */
523
+ export function isEffect(value) {
524
+ return value !== null && typeof value === "object" && value[EFFECT_SYMBOL] === true;
525
+ }
526
+ // ============================================================================
527
+ // COM State Signal
528
+ // ============================================================================
529
+ export const COM_SIGNAL_SYMBOL = Symbol.for("tentickle.comSignal");
530
+ /**
531
+ * Creates a signal bound to COM state.
532
+ * Changes sync bidirectionally between signal and COM.
533
+ *
534
+ * @internal Used by comState() after COM is available
535
+ */
536
+ export function createCOMStateSignal(com, key, initialValue) {
537
+ const sig = signal(com.getState(key) ?? initialValue);
538
+ // Flag to prevent circular updates
539
+ let isUpdatingFromCOM = false;
540
+ // Listen for COM state changes from other sources
541
+ const handler = (changedKey, value) => {
542
+ if (changedKey === key && !isUpdatingFromCOM) {
543
+ isUpdatingFromCOM = true;
544
+ try {
545
+ // Update signal without triggering our own setter logic
546
+ const internalSet = sig.set;
547
+ internalSet(value);
548
+ // AUTOMATIC RECOMPILATION: If COM state changes during render phase,
549
+ // request recompile to ensure consistency across sibling components
550
+ // BUT: Skip in phases where recompile is unnecessary
551
+ if (isCompilerRendering() && !shouldSkipRecompile()) {
552
+ const compiler = getActiveCompiler();
553
+ if (compiler) {
554
+ const comObj = com;
555
+ if (comObj.requestRecompile) {
556
+ comObj.requestRecompile(`comState '${key}' changed during render`);
557
+ }
558
+ }
559
+ }
560
+ }
561
+ finally {
562
+ isUpdatingFromCOM = false;
563
+ }
564
+ }
565
+ };
566
+ com.on("state:changed", handler);
567
+ // Override set to also update COM
568
+ const originalSet = sig.set;
569
+ sig.set = (value) => {
570
+ if (isUpdatingFromCOM) {
571
+ originalSet.call(sig, value);
572
+ return;
573
+ }
574
+ const currentValue = sig();
575
+ const nextValue = typeof value === "function"
576
+ ? value(currentValue)
577
+ : value;
578
+ // Bailout if value hasn't changed
579
+ if (Object.is(currentValue, nextValue)) {
580
+ return;
581
+ }
582
+ // DEV WARNING: Setting comState during render
583
+ if (process.env["NODE_ENV"] === "development" && isCompilerRendering()) {
584
+ console.warn(`[Tentickle] comState '${key}' is being set during render phase.\n` +
585
+ `This may cause sibling components to see stale data in the current iteration.\n` +
586
+ `Consider updating state in lifecycle methods (onTickStart, onMount) instead.\n` +
587
+ `An automatic recompile will be triggered to ensure consistency.`);
588
+ }
589
+ // Update COM first (will trigger handler, but flag prevents circular)
590
+ isUpdatingFromCOM = true;
591
+ try {
592
+ com.setState(key, nextValue);
593
+ }
594
+ finally {
595
+ isUpdatingFromCOM = false;
596
+ }
597
+ // Then update signal
598
+ originalSet.call(sig, nextValue);
599
+ // AUTOMATIC RECOMPILATION: Request recompile after state change
600
+ // This ensures useComState behaves like useState for triggering re-renders
601
+ // BUT: Skip recompile in certain phases where it's unnecessary:
602
+ // - tickStart: Render is about to happen anyway
603
+ // - tickEnd: Current tick is done, next tick will see the update
604
+ // - complete: Execution is complete, no more renders
605
+ // - unmount: Component is being removed
606
+ // - render (class onMount): Class component onMount runs during render, before render() is called
607
+ //
608
+ // ALLOW recompile in:
609
+ // - mount (useOnMount): Function component useOnMount runs after first render, can trigger recompile
610
+ if (!shouldSkipRecompile()) {
611
+ const comObj = com;
612
+ if (comObj.requestRecompile) {
613
+ comObj.requestRecompile(`comState '${key}' updated`);
614
+ }
615
+ }
616
+ };
617
+ // Override dispose to cleanup COM listener
618
+ const originalDispose = sig.dispose;
619
+ sig.dispose = () => {
620
+ if (com.off) {
621
+ com.off("state:changed", handler);
622
+ }
623
+ originalDispose.call(sig);
624
+ };
625
+ // Mark as COM signal
626
+ sig[COM_SIGNAL_SYMBOL] = key;
627
+ return sig;
628
+ }
629
+ export const WATCH_SIGNAL_SYMBOL = Symbol.for("tentickle.watchSignal");
630
+ export const PROPS_SIGNAL_SYMBOL = Symbol.for("tentickle.propsSignal");
631
+ export const REQUIRED_INPUT_SYMBOL = Symbol.for("tentickle.requiredInput");
632
+ /**
633
+ * Creates a read-only signal that watches COM state.
634
+ * The signal updates when COM state changes, but cannot modify it.
635
+ *
636
+ * @internal Used by watchComState() and watch()
637
+ */
638
+ export function createReadonlyCOMStateSignal(com, key, defaultValue) {
639
+ let value = com.getState(key) ?? defaultValue;
640
+ let isDisposed = false;
641
+ // Listen for COM state changes
642
+ const handler = (changedKey, newValue) => {
643
+ if (changedKey === key && !isDisposed) {
644
+ value = newValue;
645
+ // Notify any computed/effects that depend on this
646
+ scheduleEffect(() => { }); // Force reactivity check
647
+ // AUTOMATIC RECOMPILATION: If watched COM state changes during render,
648
+ // request recompile to ensure consistency across sibling components
649
+ // BUT: Skip in phases where recompile is unnecessary
650
+ if (isCompilerRendering() && !shouldSkipRecompile()) {
651
+ const compiler = getActiveCompiler();
652
+ if (compiler) {
653
+ const comObj = com;
654
+ if (comObj.requestRecompile) {
655
+ comObj.requestRecompile(`watched comState '${key}' changed during render`);
656
+ }
657
+ }
658
+ }
659
+ }
660
+ };
661
+ com.on("state:changed", handler);
662
+ const getter = () => {
663
+ if (isDisposed)
664
+ return value;
665
+ // Track as dependency if inside computed/effect
666
+ const context = getCurrentTrackingContext();
667
+ if (context) {
668
+ // Create a virtual subscription for tracking
669
+ context.onDependency({
670
+ _subscribe: (notify) => ({
671
+ notify,
672
+ dispose: () => { },
673
+ }),
674
+ });
675
+ }
676
+ return value;
677
+ };
678
+ const dispose = () => {
679
+ if (isDisposed)
680
+ return;
681
+ isDisposed = true;
682
+ if (com.off) {
683
+ com.off("state:changed", handler);
684
+ }
685
+ };
686
+ const readonlySignal = Object.assign(getter, {
687
+ dispose,
688
+ get value() {
689
+ return getter();
690
+ },
691
+ get disposed() {
692
+ return isDisposed;
693
+ },
694
+ });
695
+ // Mark for cleanup detection
696
+ readonlySignal[WATCH_SIGNAL_SYMBOL] = key;
697
+ return readonlySignal;
698
+ }
699
+ //# sourceMappingURL=signal.js.map