@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
package/README.md ADDED
@@ -0,0 +1,875 @@
1
+ # @agentick/core
2
+
3
+ Core engine for Agentick. Provides the React-like reconciler, JSX components, and hooks for building LLM applications.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @agentick/core
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```tsx
14
+ import { createApp, System, Timeline, Message, createTool } from "@agentick/core";
15
+ import { createOpenAIModel } from "@agentick/openai";
16
+ import { z } from "zod";
17
+
18
+ // Create a tool
19
+ const Calculator = createTool({
20
+ name: "calculator",
21
+ description: "Performs math calculations",
22
+ input: z.object({ expression: z.string() }),
23
+ handler: async ({ expression }) => {
24
+ const result = eval(expression);
25
+ return [{ type: "text", text: String(result) }];
26
+ },
27
+ });
28
+
29
+ // Define your app
30
+ function MyApp() {
31
+ return (
32
+ <>
33
+ <System>You are a helpful assistant with access to a calculator.</System>
34
+ <Timeline />
35
+ <Calculator />
36
+ </>
37
+ );
38
+ }
39
+
40
+ // Create and run
41
+ const app = createApp(MyApp, { model: createOpenAIModel() });
42
+ const session = await app.session();
43
+ await session.send({ messages: [{ role: "user", content: [{ type: "text", text: "What is 2 + 2?" }] }] }).result;
44
+ ```
45
+
46
+ ## Level 0: `createAgent` (No JSX Required)
47
+
48
+ For simple agents that don't need custom rendering or hooks:
49
+
50
+ ```tsx
51
+ import { createAgent, knob } from "@agentick/core";
52
+ import { createOpenAIModel } from "@agentick/openai";
53
+
54
+ const agent = createAgent({
55
+ system: "You are a helpful researcher.",
56
+ model: createOpenAIModel(),
57
+ tools: [SearchTool, Calculator],
58
+ knobs: {
59
+ mode: knob("broad", { description: "Search mode", options: ["broad", "deep"] }),
60
+ },
61
+ });
62
+
63
+ const handle = await agent.run({
64
+ messages: [{ role: "user", content: [{ type: "text", text: "Research quantum computing" }] }],
65
+ });
66
+ for await (const chunk of handle) {
67
+ console.log(chunk);
68
+ }
69
+ const result = await handle.result;
70
+
71
+ // or create an agent session
72
+
73
+ const session = await agent.session();
74
+ await session.send({
75
+ messages: [{ role: "user", content: [{ type: "text", text: "Research quantum computing" }] }],
76
+ }).result;
77
+ ```
78
+
79
+ `createAgent` wraps the `<Agent>` component and `createApp` — same capabilities, no JSX. For conditional tools, custom hooks, or composition, use `<Agent>` directly (Level 1+):
80
+
81
+ ```tsx
82
+ import { Agent, createApp } from "@agentick/core";
83
+
84
+ function MyAgent() {
85
+ const [verbose] = useKnob("verbose", false, { description: "Verbose mode" });
86
+ return <Agent system="You are helpful." tools={[SearchTool]} />;
87
+ }
88
+
89
+ const app = createApp(MyAgent);
90
+ ```
91
+
92
+ ## JSX Components
93
+
94
+ ### `<System>`
95
+
96
+ Define system instructions:
97
+
98
+ ```tsx
99
+ <System>You are a helpful assistant.</System>
100
+ ```
101
+
102
+ ### `<Timeline>`
103
+
104
+ Render conversation history. This is the core component that represents the conversation:
105
+
106
+ ```tsx
107
+ // Basic — renders all history + pending messages
108
+ <Timeline />
109
+
110
+ // With filtering
111
+ <Timeline roles={['user', 'assistant']} limit={10} />
112
+
113
+ // With token budget compaction
114
+ <Timeline maxTokens={4000} strategy="sliding-window" headroom={500} />
115
+
116
+ // With render prop (receives history, pending, budget info)
117
+ <Timeline maxTokens={8000}>
118
+ {(entries, pending, budget) => {
119
+ if (budget?.isCompacted) console.log(`Evicted ${budget.evictedCount} entries`);
120
+ return entries.map(entry => <Message key={entry.id} entry={entry} />);
121
+ }}
122
+ </Timeline>
123
+
124
+ // With custom rendering via Provider
125
+ <Timeline.Provider>
126
+ <Timeline.Messages renderEntry={(entry) => <CustomMessage entry={entry} />} />
127
+ </Timeline.Provider>
128
+ ```
129
+
130
+ #### Token Budget Compaction
131
+
132
+ When `maxTokens` is set, Timeline automatically compacts entries that exceed the token budget. Entries carry token estimates from the compiler's annotation pass (or fall back to a char/4 heuristic).
133
+
134
+ | Prop | Type | Default | Description |
135
+ | --------------- | -------------------- | ------------------ | ------------------------------------------ |
136
+ | `maxTokens` | `number` | — | Token budget. Enables compaction when set. |
137
+ | `strategy` | `CompactionStrategy` | `"sliding-window"` | Compaction strategy |
138
+ | `headroom` | `number` | `0` | Reserve tokens for safety margin |
139
+ | `preserveRoles` | `string[]` | `["system"]` | Roles that are never evicted |
140
+ | `onEvict` | `(entries) => void` | — | Callback when entries are evicted |
141
+ | `guidance` | `string` | — | Passed to custom strategy functions |
142
+
143
+ **Built-in strategies:**
144
+
145
+ - **`"sliding-window"`** (default): Preserves entries with protected roles, then fills remaining budget with newest entries. Maintains original entry order.
146
+ - **`"truncate"`**: Keeps newest entries that fit. Simple FIFO eviction.
147
+ - **`"none"`**: No compaction. Entries pass through unchanged.
148
+ - **Custom function**: `(entries, budget, guidance?) => { kept, evicted }`
149
+
150
+ **Budget info** is available via render prop (3rd argument) or `useTimelineContext().budget`:
151
+
152
+ ```typescript
153
+ interface TokenBudgetInfo {
154
+ maxTokens: number; // configured budget
155
+ effectiveBudget: number; // maxTokens - headroom
156
+ currentTokens: number; // tokens in kept entries
157
+ evictedCount: number; // entries dropped
158
+ isCompacted: boolean; // whether compaction fired
159
+ }
160
+ ```
161
+
162
+ ### `<Message>`
163
+
164
+ Add messages to the conversation:
165
+
166
+ ```tsx
167
+ <Message role="user">Hello!</Message>
168
+ <Message role="assistant">Hi there!</Message>
169
+
170
+ // With content blocks
171
+ <Message role="user">
172
+ <Text>Check this image:</Text>
173
+ <Image source={{ type: "url", url: "https://..." }} />
174
+ </Message>
175
+ ```
176
+
177
+ ### `<Section>`
178
+
179
+ Group content with semantic meaning:
180
+
181
+ ```tsx
182
+ <Section id="context" title="Current Context">
183
+ Today is {new Date().toDateString()}.
184
+ User is logged in as {user.name}.
185
+ </Section>
186
+ ```
187
+
188
+ ### `<Model>`
189
+
190
+ Override the model for a subtree. Also accepts generation parameters and response format:
191
+
192
+ ```tsx
193
+ <Model model={gpt4oMini}>
194
+ {/* Children use gpt-4o-mini */}
195
+ </Model>
196
+
197
+ // With response format (structured output)
198
+ <Model model={gpt4o} responseFormat={{ type: "json" }} />
199
+
200
+ <Model
201
+ model={gpt4o}
202
+ responseFormat={{
203
+ type: "json_schema",
204
+ schema: { type: "object", properties: { name: { type: "string" } } },
205
+ name: "person",
206
+ }}
207
+ temperature={0.2}
208
+ />
209
+ ```
210
+
211
+ #### ResponseFormat
212
+
213
+ Normalized across providers. Three modes:
214
+
215
+ | Type | Description |
216
+ | ---------------------------------------- | -------------------------------- |
217
+ | `{ type: "text" }` | Free-form text (default) |
218
+ | `{ type: "json" }` | Valid JSON output |
219
+ | `{ type: "json_schema", schema, name? }` | JSON conforming to a JSON Schema |
220
+
221
+ For Zod schemas, call `zodToJsonSchema()` yourself — Agentick doesn't bundle Zod.
222
+
223
+ ### `<Markdown>` / `<XML>`
224
+
225
+ Control output formatting:
226
+
227
+ ```tsx
228
+ <Markdown>
229
+ <Section id="rules">
230
+ - Rule 1
231
+ - Rule 2
232
+ </Section>
233
+ </Markdown>
234
+
235
+ <XML>
236
+ <Section id="data" title="User Data">
237
+ {JSON.stringify(userData)}
238
+ </Section>
239
+ </XML>
240
+ ```
241
+
242
+ ## Hooks
243
+
244
+ ### State Hooks
245
+
246
+ ```tsx
247
+ import { useState, useSignal, useComputed, useComState } from "@agentick/core";
248
+
249
+ function MyComponent() {
250
+ // React-style state
251
+ const [count, setCount] = useState(0);
252
+
253
+ // Signal-based reactive state — Signal<T> is a callable + .set() + .value
254
+ const counter = useSignal(0);
255
+ const doubled = useComputed(() => counter() * 2, [counter]);
256
+
257
+ counter(); // read: 0
258
+ counter.set(5); // write
259
+ counter.update(v => v + 1); // update with function
260
+ doubled(); // read: 12
261
+
262
+ // COM state (persisted across ticks, shared between components)
263
+ // Returns Signal<T>, NOT a tuple
264
+ const notes = useComState<string[]>("notes", []);
265
+ notes(); // read current value
266
+ notes.set(["a", "b"]); // write new value
267
+ }
268
+ ```
269
+
270
+ ### Lifecycle Hooks
271
+
272
+ All lifecycle hooks follow the pattern: data first, COM (context) last.
273
+
274
+ ```tsx
275
+ import { useOnMount, useOnUnmount, useOnTickStart, useOnTickEnd, useAfterCompile, useContinuation } from "@agentick/core";
276
+
277
+ function MyComponent() {
278
+ // Called when component mounts
279
+ useOnMount((ctx) => {
280
+ console.log("Component mounted");
281
+ });
282
+
283
+ // Called when component unmounts
284
+ useOnUnmount((ctx) => {
285
+ console.log("Component unmounting");
286
+ });
287
+
288
+ // Called at the start of each tick (tick 2+ — see useOnMount for first tick)
289
+ useOnTickStart((tickState) => {
290
+ console.log(`Tick ${tickState.tick} starting...`);
291
+ });
292
+
293
+ // Called at the end of each tick (after model response)
294
+ useOnTickEnd((result) => {
295
+ console.log(`Tick ${result.tick} complete, tokens: ${result.usage?.totalTokens}`);
296
+ });
297
+
298
+ // Called after JSX compiles but before model call
299
+ useAfterCompile((compiled) => {
300
+ console.log(`Compiled ${compiled.tools.length} tools`);
301
+ });
302
+
303
+ // Control agent loop continuation (primary hook for agent behavior)
304
+ useContinuation((result) => {
305
+ // Return true to continue, false to stop
306
+ if (result.text?.includes("<DONE>")) return false;
307
+ if (result.tick >= 10) return false; // Safety limit
308
+ return true;
309
+ });
310
+
311
+ // Access COM when needed (always the last parameter)
312
+ useContinuation((result, ctx) => {
313
+ ctx.setState("lastTick", result.tick);
314
+ return !result.text?.includes("<DONE>");
315
+ });
316
+ }
317
+ ```
318
+
319
+ ### Message Hooks
320
+
321
+ ```tsx
322
+ import { useQueuedMessages, useOnMessage } from "@agentick/core";
323
+
324
+ function MyComponent() {
325
+ // Access messages queued for this tick
326
+ const queuedMessages = useQueuedMessages();
327
+
328
+ // React to incoming messages
329
+ useOnMessage((message, ctx, state) => {
330
+ console.log("Received:", message);
331
+ });
332
+ }
333
+ ```
334
+
335
+ ### Context Hooks
336
+
337
+ ```tsx
338
+ import { useCom, useTickState, useContextInfo } from "@agentick/core";
339
+
340
+ function MyComponent() {
341
+ // Access the Context Object Model
342
+ const ctx = useCom();
343
+ const history = ctx.timeline;
344
+
345
+ // Access current tick state
346
+ const tickState = useTickState();
347
+ console.log(`Tick ${tickState.tick}`);
348
+
349
+ // Access context utilization info (updated after each tick)
350
+ const contextInfo = useContextInfo();
351
+ if (contextInfo) {
352
+ console.log(`Model: ${contextInfo.modelId}`);
353
+ console.log(`Tokens: ${contextInfo.inputTokens} in / ${contextInfo.outputTokens} out`);
354
+ console.log(`Utilization: ${contextInfo.utilization?.toFixed(1)}%`);
355
+ }
356
+ }
357
+ ```
358
+
359
+ ### Knobs
360
+
361
+ Knobs are **form controls for models**. The same way HTML inputs bridge humans to application state, knobs bridge models to application state. The model sees primitive values (string, number, boolean), can change them via a `set_knob` tool, and the change takes effect on the next recompile.
362
+
363
+ `useKnob()` creates reactive state + renders it to model context + registers a tool — all in one line.
364
+
365
+ ```tsx
366
+ import { useKnob, Knobs } from "@agentick/core";
367
+
368
+ function Agent() {
369
+ // String with options → model sees [select] type
370
+ const [mode] = useKnob("mode", "broad", {
371
+ description: "Operating mode",
372
+ options: ["broad", "deep"],
373
+ });
374
+
375
+ // Number with constraints → model sees [range] type
376
+ const [temp] = useKnob("temp", 0.7, {
377
+ description: "Temperature",
378
+ group: "Model",
379
+ min: 0, max: 2, step: 0.1,
380
+ });
381
+
382
+ // Boolean → model sees [toggle] type
383
+ const [verbose] = useKnob("verbose", false, { description: "Verbose output" });
384
+
385
+ // With resolver — model sets a primitive, you get a rich value
386
+ const [model] = useKnob("model", "gpt-4", { description: "Model" }, (v) => openai(v));
387
+
388
+ return (
389
+ <>
390
+ <Knobs />
391
+ <Timeline />
392
+ </>
393
+ );
394
+ }
395
+ ```
396
+
397
+ #### `<Knobs />` — Three Rendering Modes
398
+
399
+ The `set_knob` tool is always registered automatically. You control how knobs are rendered to the model's context:
400
+
401
+ ```tsx
402
+ // 1. Default — renders a grouped knob section automatically
403
+ <Knobs />
404
+
405
+ // 2. Render prop — custom section formatting, receives KnobGroup[]
406
+ <Knobs>
407
+ {(groups) => (
408
+ <Section id="my-knobs" audience="model">
409
+ {groups.flatMap(g => g.knobs).map(k => `${k.name}=${k.value}`).join("\n")}
410
+ </Section>
411
+ )}
412
+ </Knobs>
413
+
414
+ // 3. Provider — full custom rendering with React context
415
+ <Knobs.Provider>
416
+ <Knobs.Controls /> {/* Default section */}
417
+ <Knobs.Controls renderKnob={(k) => ...} /> {/* Custom per-knob */}
418
+ <Knobs.Controls renderGroup={(g) => ...} /> {/* Custom per-group */}
419
+ </Knobs.Provider>
420
+ ```
421
+
422
+ The provider pattern also exposes `useKnobsContext()` for fully custom rendering:
423
+
424
+ ```tsx
425
+ import { useKnobsContext } from "@agentick/core";
426
+
427
+ function MyKnobUI() {
428
+ const { knobs, groups, get } = useKnobsContext();
429
+ const temp = get("temp");
430
+ return (
431
+ <Section id="knobs" audience="model">
432
+ Temperature is {temp?.value}. There are {knobs.length} knobs.
433
+ </Section>
434
+ );
435
+ }
436
+ ```
437
+
438
+ #### Config-level Knobs
439
+
440
+ For `createAgent` / `<Agent>`, declare knobs as descriptors with `knob()`:
441
+
442
+ ```tsx
443
+ import { knob, createAgent } from "@agentick/core";
444
+
445
+ const agent = createAgent({
446
+ system: "You are a researcher.",
447
+ knobs: {
448
+ mode: knob("broad", { description: "Operating mode", options: ["broad", "deep"] }),
449
+ temperature: knob(0.7, { description: "Temperature", min: 0, max: 2, step: 0.1 }),
450
+ },
451
+ });
452
+ ```
453
+
454
+ See `packages/core/src/hooks/README.md` for complete API reference including `KnobInfo`, `KnobGroup`, constraints, and validation.
455
+
456
+ ## Context Utilization
457
+
458
+ The `useContextInfo` hook provides real-time information about model context usage:
459
+
460
+ ```tsx
461
+ import { useContextInfo, type ContextInfo } from "@agentick/core";
462
+
463
+ function ContextAwareComponent() {
464
+ const contextInfo = useContextInfo();
465
+
466
+ if (!contextInfo) {
467
+ return <Section id="status">Waiting for first response...</Section>;
468
+ }
469
+
470
+ // Access model info
471
+ const { modelId, modelName, provider } = contextInfo;
472
+
473
+ // Access token usage
474
+ const { inputTokens, outputTokens, totalTokens } = contextInfo;
475
+
476
+ // Access utilization percentage
477
+ const { utilization, contextWindow } = contextInfo;
478
+
479
+ // Access capabilities
480
+ const { supportsVision, supportsToolUse, isReasoningModel } = contextInfo;
481
+
482
+ // Access cumulative usage across ticks
483
+ const { cumulativeUsage } = contextInfo;
484
+
485
+ // Make decisions based on context usage
486
+ if (utilization && utilization > 80) {
487
+ return <System>Be concise - context is running low.</System>;
488
+ }
489
+
490
+ return null;
491
+ }
492
+ ```
493
+
494
+ ### ContextInfo Interface
495
+
496
+ ```typescript
497
+ interface ContextInfo {
498
+ // Model identification
499
+ modelId: string; // "gpt-4o", "claude-3-5-sonnet", etc.
500
+ modelName?: string; // Human-readable name
501
+ provider?: string; // "openai", "anthropic", etc.
502
+
503
+ // Context limits
504
+ contextWindow?: number; // Total context window size
505
+ maxOutputTokens?: number; // Max output tokens for model
506
+
507
+ // Token usage (current tick)
508
+ inputTokens: number;
509
+ outputTokens: number;
510
+ totalTokens: number;
511
+
512
+ // Utilization
513
+ utilization?: number; // Percentage (0-100)
514
+
515
+ // Model capabilities
516
+ supportsVision?: boolean;
517
+ supportsToolUse?: boolean;
518
+ isReasoningModel?: boolean;
519
+
520
+ // Execution info
521
+ tick: number; // Current tick number
522
+
523
+ // Cumulative usage across all ticks
524
+ cumulativeUsage?: {
525
+ inputTokens: number;
526
+ outputTokens: number;
527
+ totalTokens: number;
528
+ ticks: number;
529
+ };
530
+ }
531
+ ```
532
+
533
+ ### Using ContextInfoProvider (Advanced)
534
+
535
+ For custom setups, you can create and provide your own context info store:
536
+
537
+ ```tsx
538
+ import { createContextInfoStore, ContextInfoProvider } from "@agentick/core";
539
+
540
+ // Create a store
541
+ const contextInfoStore = createContextInfoStore();
542
+
543
+ // Provide to components
544
+ <ContextInfoProvider store={contextInfoStore}>
545
+ <MyApp />
546
+ </ContextInfoProvider>
547
+
548
+ // Update the store
549
+ contextInfoStore.update({
550
+ modelId: "gpt-4o",
551
+ inputTokens: 1500,
552
+ outputTokens: 500,
553
+ totalTokens: 2000,
554
+ tick: 1,
555
+ });
556
+
557
+ // Read current value
558
+ const current = contextInfoStore.current;
559
+ ```
560
+
561
+ ## Tools
562
+
563
+ Create tools the model can call:
564
+
565
+ ```tsx
566
+ import { createTool } from "@agentick/core";
567
+ import { z } from "zod";
568
+
569
+ const WeatherTool = createTool({
570
+ name: "get_weather",
571
+ description: "Get current weather for a location",
572
+ input: z.object({
573
+ location: z.string().describe("City name"),
574
+ units: z.enum(["celsius", "fahrenheit"]).optional(),
575
+ }),
576
+ handler: async ({ location, units }, ctx) => {
577
+ const weather = await fetchWeather(location, units);
578
+ ctx?.setState("lastLocation", location);
579
+ return [{ type: "text", text: JSON.stringify(weather) }];
580
+ },
581
+ // Optional: render state to model context (receives tickState, ctx)
582
+ render: (tickState, ctx) => (
583
+ <Section id="weather-info">
584
+ Last checked: {lastChecked}
585
+ </Section>
586
+ ),
587
+ });
588
+
589
+ // Use in your app
590
+ function App() {
591
+ return (
592
+ <>
593
+ <System>You can check the weather.</System>
594
+ <Timeline />
595
+ <WeatherTool />
596
+ </>
597
+ );
598
+ }
599
+ ```
600
+
601
+ ## App & Session
602
+
603
+ ### Creating an App
604
+
605
+ ```tsx
606
+ import { createApp } from "@agentick/core";
607
+
608
+ const app = createApp(MyApp, {
609
+ model: myModel,
610
+ devTools: true, // Enable DevTools
611
+ });
612
+ ```
613
+
614
+ ### Basic Options
615
+
616
+ ```typescript
617
+ const app = createApp(MyApp, {
618
+ model: createOpenAIModel(), // Override model (optional if <Model> in JSX)
619
+ maxTicks: 10, // Max model calls per execution (default: 10)
620
+ devTools: true, // Enable DevTools emission
621
+ tools: [ExternalTool], // Additional tools (merged with JSX <Tool>s)
622
+ mcpServers: { ... }, // MCP server configs
623
+ });
624
+ ```
625
+
626
+ ### Lifecycle Callbacks
627
+
628
+ Callbacks provide a cleaner alternative to event listeners:
629
+
630
+ ```typescript
631
+ const app = createApp(MyApp, {
632
+ model,
633
+
634
+ // Execution lifecycle
635
+ onTickStart: (tick, executionId) => console.log(`Tick ${tick}`),
636
+ onTickEnd: (tick, usage) => console.log(`Used ${usage?.totalTokens} tokens`),
637
+ onComplete: (result) => console.log(`Done: ${result.response}`),
638
+ onError: (error) => console.error(error),
639
+
640
+ // All events (fine-grained)
641
+ onEvent: (event) => { /* handle any stream event */ },
642
+
643
+ // Send lifecycle
644
+ onBeforeSend: (session, input) => { /* modify input */ },
645
+ onAfterSend: (session, result) => { /* post-processing */ },
646
+
647
+ // Tool confirmation
648
+ onToolConfirmation: async (call, message) => {
649
+ return await askUser(`Allow ${call.name}?`);
650
+ },
651
+ });
652
+ ```
653
+
654
+ ### Session Management
655
+
656
+ ```tsx
657
+ // Create a new session
658
+ const session = await app.session();
659
+
660
+ // Or get/create a specific session by ID
661
+ const session = await app.session("user-123");
662
+
663
+ // Send a message
664
+ const result = await session.send({
665
+ messages: [{ role: "user", content: [{ type: "text", text: "Hello!" }] }],
666
+ }).result;
667
+
668
+ // Check session state
669
+ const snapshot = session.snapshot();
670
+ console.log(snapshot.timeline);
671
+ console.log(snapshot.usage);
672
+ ```
673
+
674
+ ### Spawning Child Sessions
675
+
676
+ `session.spawn()` creates an ephemeral child session with a different agent/component. The child runs to completion and returns a `SessionExecutionHandle` — the same type as `session.send()`. This is the recursive primitive for multi-agent systems.
677
+
678
+ ```tsx
679
+ // Spawn with a component function
680
+ const handle = await session.spawn(ChildAgent, {
681
+ messages: [{ role: "user", content: [{ type: "text", text: "Analyze this data" }] }],
682
+ });
683
+ const result = await handle.result;
684
+
685
+ // Spawn with an AgentConfig (Level 0)
686
+ const handle = await session.spawn(
687
+ { system: "You are a summarizer.", model: summaryModel },
688
+ { messages: [{ role: "user", content: [{ type: "text", text: doc }] }] },
689
+ );
690
+
691
+ // Spawn with a JSX element (props from element + input.props are merged)
692
+ const handle = await session.spawn(
693
+ <Researcher query="quantum computing" />,
694
+ { messages: [{ role: "user", content: [{ type: "text", text: "Go" }] }] },
695
+ );
696
+ ```
697
+
698
+ **Parallel spawns** work with `Promise.all`:
699
+
700
+ ```tsx
701
+ const [researchResult, factCheckResult] = await Promise.all([
702
+ session.spawn(Researcher, { messages }).then(h => h.result),
703
+ session.spawn(FactChecker, { messages }).then(h => h.result),
704
+ ]);
705
+ ```
706
+
707
+ **From tool handlers** via `ctx.spawn()`:
708
+
709
+ ```tsx
710
+ const DelegateTool = createTool({
711
+ name: "delegate",
712
+ description: "Delegate to a specialist",
713
+ input: z.object({ task: z.string() }),
714
+ handler: async (input, ctx) => {
715
+ const handle = await ctx!.spawn(Specialist, {
716
+ messages: [{ role: "user", content: [{ type: "text", text: input.task }] }],
717
+ });
718
+ const result = await handle.result;
719
+ return [{ type: "text", text: result.response }];
720
+ },
721
+ });
722
+ ```
723
+
724
+ **Key behaviors:**
725
+
726
+ - **Isolation**: Child gets a fresh COM — no parent state leaks.
727
+ - **Lifecycle isolation**: Parent's lifecycle callbacks (onComplete, onTickStart, etc.) do NOT fire for child executions.
728
+ - **Abort propagation**: Aborting the parent execution aborts all children.
729
+ - **Close propagation**: Closing the parent session closes all children.
730
+ - **Depth limit**: Maximum 10 levels of nesting (throws if exceeded).
731
+ - **Cleanup**: Children are removed from `session.children` when they complete.
732
+
733
+ ### Session Persistence & Hibernation
734
+
735
+ Control hibernation, limits, and auto-cleanup:
736
+
737
+ ```typescript
738
+ const app = createApp(MyApp, {
739
+ model,
740
+ sessions: {
741
+ store: new RedisSessionStore(redis), // Or ":memory:" for SQLite
742
+ maxActive: 100, // Max concurrent sessions
743
+ idleTimeout: 5 * 60 * 1000, // Hibernate after 5 min idle
744
+ autoHibernate: true, // Auto-hibernate on idle
745
+ },
746
+
747
+ // Session lifecycle hooks
748
+ onSessionCreate: (session) => { /* ... */ },
749
+ onSessionClose: (sessionId) => { /* ... */ },
750
+
751
+ // Hibernation hooks
752
+ onBeforeHibernate: (session, snapshot) => {
753
+ // Return false to cancel, modified snapshot, or void
754
+ if (session.inspect().lastToolCalls.length > 0) return false;
755
+ },
756
+ onAfterHibernate: (sessionId, snapshot) => { /* ... */ },
757
+ onBeforeHydrate: (sessionId, snapshot) => {
758
+ // Migrate old formats, validate, etc.
759
+ },
760
+ onAfterHydrate: (session, snapshot) => { /* ... */ },
761
+ });
762
+ ```
763
+
764
+ ### Procedures & Middleware
765
+
766
+ Session methods `send`, `render`, `queue`, and `spawn` are all Procedures. This means they support middleware, context injection, and the chainable API:
767
+
768
+ ```typescript
769
+ const session = await app.session();
770
+
771
+ // Direct call (await unwraps to SessionExecutionHandle)
772
+ const handle = await session.send({ messages: [...] });
773
+ const result = await session.send({ messages: [...] }).result; // SendResult
774
+
775
+ // Add middleware to a single call
776
+ const handle = await session.render.use(async (args, envelope, next) => {
777
+ console.log("before render");
778
+ const result = await next();
779
+ console.log("after render");
780
+ return result;
781
+ })({ query: "Hello" });
782
+
783
+ // .use() returns a new Procedure (immutable — original is unchanged)
784
+ const loggedRender = session.render.use(loggingMiddleware);
785
+ await loggedRender({ query: "test" }).result;
786
+ ```
787
+
788
+ `ProcedurePromise` supports `.result` chaining — `await proc().result` resolves to the final `SendResult` regardless of whether the procedure is passthrough or handle-wrapped.
789
+
790
+ `app.run` is also a Procedure:
791
+
792
+ ```typescript
793
+ const handle = await app.run({ messages: [...], props: { query: "Hello" } });
794
+ await handle.result;
795
+ ```
796
+
797
+ ### Middleware Inheritance
798
+
799
+ Apps inherit from the global `Agentick` instance by default:
800
+
801
+ ```typescript
802
+ import { Agentick, createApp } from "@agentick/core";
803
+
804
+ // Register global middleware
805
+ Agentick.use('*', loggingMiddleware);
806
+ Agentick.use('tool:*', authMiddleware);
807
+
808
+ // App inherits global middleware (default)
809
+ const app = createApp(MyApp, { model });
810
+
811
+ // Isolated app (for testing)
812
+ const testApp = createApp(TestApp, {
813
+ model,
814
+ inheritDefaults: false
815
+ });
816
+ ```
817
+
818
+ ### Standalone Run
819
+
820
+ For one-off executions without session management:
821
+
822
+ ```tsx
823
+ import { run } from "@agentick/core";
824
+
825
+ const result = await run(
826
+ <MyApp />,
827
+ { messages: [{ role: "user", content: [{ type: "text", text: "Hello!" }] }], model: myModel }
828
+ );
829
+ ```
830
+
831
+ ### Choosing `run()` vs `createApp`
832
+
833
+ | Use case | API |
834
+ | --------------------------------- | -------------------------------------------------------------- |
835
+ | One-shot, quick prototype | `run(<Agent />, { model, messages })` |
836
+ | Reusable app, persistent sessions | `createApp(Agent, { model })` + `app.run()` / `session.send()` |
837
+ | Middleware, lifecycle hooks | `createApp` (supports `app.run.use(mw)`) |
838
+
839
+ `run()` accepts a JSX element (not a bare component function). Element props are defaults — `input.props` overrides them:
840
+
841
+ ```tsx
842
+ // Element prop "query" is "default", but input.props overrides it to "override"
843
+ await run(<Agent query="default" />, { props: { query: "override" }, model, messages });
844
+ ```
845
+
846
+ `createApp` takes a component function and returns a reusable app with session management, hibernation, and middleware support.
847
+
848
+ ## DevTools Integration
849
+
850
+ Enable DevTools for debugging:
851
+
852
+ ```tsx
853
+ const app = createApp(MyApp, {
854
+ devTools: true,
855
+ // or with remote DevTools
856
+ devTools: {
857
+ enabled: true,
858
+ remote: true,
859
+ remoteUrl: "http://localhost:3001/api/devtools",
860
+ },
861
+ });
862
+ ```
863
+
864
+ For debugging the reconciler itself with React DevTools:
865
+
866
+ ```tsx
867
+ import { enableReactDevTools } from "@agentick/core";
868
+
869
+ // Before creating sessions
870
+ enableReactDevTools(); // Connects to npx react-devtools on port 8097
871
+ ```
872
+
873
+ ## License
874
+
875
+ MIT