@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.
- package/LICENSE +21 -0
- package/README.md +875 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo.build +1 -0
- package/dist/agent.d.ts +32 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +26 -0
- package/dist/agent.js.map +1 -0
- package/dist/agentick-instance.d.ts +285 -0
- package/dist/agentick-instance.d.ts.map +1 -0
- package/dist/agentick-instance.js +700 -0
- package/dist/agentick-instance.js.map +1 -0
- package/dist/aidk-instance.d.ts +294 -0
- package/dist/aidk-instance.d.ts.map +1 -0
- package/dist/aidk-instance.js +340 -0
- package/dist/aidk-instance.js.map +1 -0
- package/dist/app/session-store.d.ts +57 -0
- package/dist/app/session-store.d.ts.map +1 -0
- package/dist/app/session-store.js +87 -0
- package/dist/app/session-store.js.map +1 -0
- package/dist/app/session.d.ts +209 -0
- package/dist/app/session.d.ts.map +1 -0
- package/dist/app/session.js +2131 -0
- package/dist/app/session.js.map +1 -0
- package/dist/app/sqlite-session-store.d.ts +60 -0
- package/dist/app/sqlite-session-store.d.ts.map +1 -0
- package/dist/app/sqlite-session-store.js +234 -0
- package/dist/app/sqlite-session-store.js.map +1 -0
- package/dist/app/types.d.ts +1461 -0
- package/dist/app/types.d.ts.map +1 -0
- package/dist/app/types.js +14 -0
- package/dist/app/types.js.map +1 -0
- package/dist/app.d.ts +79 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +83 -0
- package/dist/app.js.map +1 -0
- package/dist/channels/adapters/index.d.ts +2 -0
- package/dist/channels/adapters/index.d.ts.map +1 -0
- package/dist/channels/adapters/index.js +2 -0
- package/dist/channels/adapters/index.js.map +1 -0
- package/dist/channels/adapters/redis.d.ts +77 -0
- package/dist/channels/adapters/redis.d.ts.map +1 -0
- package/dist/channels/adapters/redis.js +259 -0
- package/dist/channels/adapters/redis.js.map +1 -0
- package/dist/channels/index.d.ts +38 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +38 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/service.d.ts +684 -0
- package/dist/channels/service.d.ts.map +1 -0
- package/dist/channels/service.js +870 -0
- package/dist/channels/service.js.map +1 -0
- package/dist/channels/transports/index.d.ts +4 -0
- package/dist/channels/transports/index.d.ts.map +1 -0
- package/dist/channels/transports/index.js +4 -0
- package/dist/channels/transports/index.js.map +1 -0
- package/dist/channels/transports/socketio.d.ts +98 -0
- package/dist/channels/transports/socketio.d.ts.map +1 -0
- package/dist/channels/transports/socketio.js +246 -0
- package/dist/channels/transports/socketio.js.map +1 -0
- package/dist/channels/transports/streamable-http.d.ts +107 -0
- package/dist/channels/transports/streamable-http.d.ts.map +1 -0
- package/dist/channels/transports/streamable-http.js +353 -0
- package/dist/channels/transports/streamable-http.js.map +1 -0
- package/dist/channels/transports/websocket.d.ts +117 -0
- package/dist/channels/transports/websocket.d.ts.map +1 -0
- package/dist/channels/transports/websocket.js +416 -0
- package/dist/channels/transports/websocket.js.map +1 -0
- package/dist/com/index.d.ts +29 -0
- package/dist/com/index.d.ts.map +1 -0
- package/dist/com/index.js +29 -0
- package/dist/com/index.js.map +1 -0
- package/dist/com/object-model.d.ts +634 -0
- package/dist/com/object-model.d.ts.map +1 -0
- package/dist/com/object-model.js +963 -0
- package/dist/com/object-model.js.map +1 -0
- package/dist/com/types.d.ts +192 -0
- package/dist/com/types.d.ts.map +1 -0
- package/dist/com/types.js +1 -0
- package/dist/com/types.js.map +1 -0
- package/dist/compiler/collector.d.ts +16 -0
- package/dist/compiler/collector.d.ts.map +1 -0
- package/dist/compiler/collector.js +388 -0
- package/dist/compiler/collector.js.map +1 -0
- package/dist/compiler/content-block-registry.d.ts +11 -0
- package/dist/compiler/content-block-registry.d.ts.map +1 -0
- package/dist/compiler/content-block-registry.js +312 -0
- package/dist/compiler/content-block-registry.js.map +1 -0
- package/dist/compiler/extractors.d.ts +68 -0
- package/dist/compiler/extractors.d.ts.map +1 -0
- package/dist/compiler/extractors.js +547 -0
- package/dist/compiler/extractors.js.map +1 -0
- package/dist/compiler/fiber-compiler.d.ts +203 -0
- package/dist/compiler/fiber-compiler.d.ts.map +1 -0
- package/dist/compiler/fiber-compiler.js +498 -0
- package/dist/compiler/fiber-compiler.js.map +1 -0
- package/dist/compiler/fiber.d.ts +61 -0
- package/dist/compiler/fiber.d.ts.map +1 -0
- package/dist/compiler/fiber.js +244 -0
- package/dist/compiler/fiber.js.map +1 -0
- package/dist/compiler/index.d.ts +18 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +38 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/scheduler.d.ts +95 -0
- package/dist/compiler/scheduler.d.ts.map +1 -0
- package/dist/compiler/scheduler.js +138 -0
- package/dist/compiler/scheduler.js.map +1 -0
- package/dist/compiler/structure-renderer.d.ts +42 -0
- package/dist/compiler/structure-renderer.d.ts.map +1 -0
- package/dist/compiler/structure-renderer.js +189 -0
- package/dist/compiler/structure-renderer.js.map +1 -0
- package/dist/compiler/types.d.ts +96 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +19 -0
- package/dist/compiler/types.js.map +1 -0
- package/dist/component/component-hooks.d.ts +68 -0
- package/dist/component/component-hooks.d.ts.map +1 -0
- package/dist/component/component-hooks.js +112 -0
- package/dist/component/component-hooks.js.map +1 -0
- package/dist/component/component.d.ts +314 -0
- package/dist/component/component.d.ts.map +1 -0
- package/dist/component/component.js +64 -0
- package/dist/component/component.js.map +1 -0
- package/dist/component/index.d.ts +47 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +47 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/tentickle-component.d.ts +185 -0
- package/dist/component/tentickle-component.d.ts.map +1 -0
- package/dist/component/tentickle-component.js +182 -0
- package/dist/component/tentickle-component.js.map +1 -0
- package/dist/content/index.d.ts +12 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +17 -0
- package/dist/content/index.js.map +1 -0
- package/dist/context/index.d.ts +51 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +69 -0
- package/dist/context/index.js.map +1 -0
- package/dist/core/channel-helpers.d.ts +31 -0
- package/dist/core/channel-helpers.d.ts.map +1 -0
- package/dist/core/channel-helpers.js +62 -0
- package/dist/core/channel-helpers.js.map +1 -0
- package/dist/core/channel.d.ts +164 -0
- package/dist/core/channel.d.ts.map +1 -0
- package/dist/core/channel.js +199 -0
- package/dist/core/channel.js.map +1 -0
- package/dist/core/context.d.ts +412 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +290 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-buffer.d.ts +212 -0
- package/dist/core/event-buffer.d.ts.map +1 -0
- package/dist/core/event-buffer.js +346 -0
- package/dist/core/event-buffer.js.map +1 -0
- package/dist/core/execution-helpers.d.ts +179 -0
- package/dist/core/execution-helpers.d.ts.map +1 -0
- package/dist/core/execution-helpers.js +212 -0
- package/dist/core/execution-helpers.js.map +1 -0
- package/dist/core/execution-tracker.d.ts +53 -0
- package/dist/core/execution-tracker.d.ts.map +1 -0
- package/dist/core/execution-tracker.js +309 -0
- package/dist/core/execution-tracker.js.map +1 -0
- package/dist/core/index.d.ts +58 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +58 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +341 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +346 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/metrics-helpers.d.ts +40 -0
- package/dist/core/metrics-helpers.d.ts.map +1 -0
- package/dist/core/metrics-helpers.js +72 -0
- package/dist/core/metrics-helpers.js.map +1 -0
- package/dist/core/otel-provider.d.ts +54 -0
- package/dist/core/otel-provider.d.ts.map +1 -0
- package/dist/core/otel-provider.js +107 -0
- package/dist/core/otel-provider.js.map +1 -0
- package/dist/core/procedure-graph.d.ts +136 -0
- package/dist/core/procedure-graph.d.ts.map +1 -0
- package/dist/core/procedure-graph.js +272 -0
- package/dist/core/procedure-graph.js.map +1 -0
- package/dist/core/procedure.d.ts +755 -0
- package/dist/core/procedure.d.ts.map +1 -0
- package/dist/core/procedure.js +899 -0
- package/dist/core/procedure.js.map +1 -0
- package/dist/core/stream.d.ts +106 -0
- package/dist/core/stream.d.ts.map +1 -0
- package/dist/core/stream.js +186 -0
- package/dist/core/stream.js.map +1 -0
- package/dist/core/telemetry.d.ts +182 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +124 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/engine/client-tool-coordinator.d.ts +50 -0
- package/dist/engine/client-tool-coordinator.d.ts.map +1 -0
- package/dist/engine/client-tool-coordinator.js +121 -0
- package/dist/engine/client-tool-coordinator.js.map +1 -0
- package/dist/engine/engine-events.d.ts +117 -0
- package/dist/engine/engine-events.d.ts.map +1 -0
- package/dist/engine/engine-events.js +178 -0
- package/dist/engine/engine-events.js.map +1 -0
- package/dist/engine/engine-response.d.ts +48 -0
- package/dist/engine/engine-response.d.ts.map +1 -0
- package/dist/engine/engine-response.js +2 -0
- package/dist/engine/engine-response.js.map +1 -0
- package/dist/engine/execution-graph.d.ts +104 -0
- package/dist/engine/execution-graph.d.ts.map +1 -0
- package/dist/engine/execution-graph.js +257 -0
- package/dist/engine/execution-graph.js.map +1 -0
- package/dist/engine/execution-handle.d.ts +212 -0
- package/dist/engine/execution-handle.d.ts.map +1 -0
- package/dist/engine/execution-handle.js +602 -0
- package/dist/engine/execution-handle.js.map +1 -0
- package/dist/engine/execution-types.d.ts +248 -0
- package/dist/engine/execution-types.d.ts.map +1 -0
- package/dist/engine/execution-types.js +23 -0
- package/dist/engine/execution-types.js.map +1 -0
- package/dist/engine/index.d.ts +21 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +23 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/tool-confirmation-coordinator.d.ts +74 -0
- package/dist/engine/tool-confirmation-coordinator.d.ts.map +1 -0
- package/dist/engine/tool-confirmation-coordinator.js +137 -0
- package/dist/engine/tool-confirmation-coordinator.js.map +1 -0
- package/dist/engine/tool-executor.d.ts +127 -0
- package/dist/engine/tool-executor.d.ts.map +1 -0
- package/dist/engine/tool-executor.js +363 -0
- package/dist/engine/tool-executor.js.map +1 -0
- package/dist/hibernation/index.d.ts +126 -0
- package/dist/hibernation/index.d.ts.map +1 -0
- package/dist/hibernation/index.js +127 -0
- package/dist/hibernation/index.js.map +1 -0
- package/dist/hooks/base-hook-registry.d.ts +41 -0
- package/dist/hooks/base-hook-registry.d.ts.map +1 -0
- package/dist/hooks/base-hook-registry.js +76 -0
- package/dist/hooks/base-hook-registry.js.map +1 -0
- package/dist/hooks/com-state.d.ts +40 -0
- package/dist/hooks/com-state.d.ts.map +1 -0
- package/dist/hooks/com-state.js +90 -0
- package/dist/hooks/com-state.js.map +1 -0
- package/dist/hooks/context-info.d.ts +139 -0
- package/dist/hooks/context-info.d.ts.map +1 -0
- package/dist/hooks/context-info.js +115 -0
- package/dist/hooks/context-info.js.map +1 -0
- package/dist/hooks/context-internal.d.ts +21 -0
- package/dist/hooks/context-internal.d.ts.map +1 -0
- package/dist/hooks/context-internal.js +20 -0
- package/dist/hooks/context-internal.js.map +1 -0
- package/dist/hooks/context.d.ts +64 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +83 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/data.d.ts +33 -0
- package/dist/hooks/data.d.ts.map +1 -0
- package/dist/hooks/data.js +84 -0
- package/dist/hooks/data.js.map +1 -0
- package/dist/hooks/formatter-context.d.ts +34 -0
- package/dist/hooks/formatter-context.d.ts.map +1 -0
- package/dist/hooks/formatter-context.js +34 -0
- package/dist/hooks/formatter-context.js.map +1 -0
- package/dist/hooks/hook-registry.d.ts +45 -0
- package/dist/hooks/hook-registry.d.ts.map +1 -0
- package/dist/hooks/hook-registry.js +109 -0
- package/dist/hooks/hook-registry.js.map +1 -0
- package/dist/hooks/index.d.ts +20 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +47 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/knob.d.ts +87 -0
- package/dist/hooks/knob.d.ts.map +1 -0
- package/dist/hooks/knob.js +129 -0
- package/dist/hooks/knob.js.map +1 -0
- package/dist/hooks/knobs-component.d.ts +70 -0
- package/dist/hooks/knobs-component.d.ts.map +1 -0
- package/dist/hooks/knobs-component.js +300 -0
- package/dist/hooks/knobs-component.js.map +1 -0
- package/dist/hooks/lifecycle.d.ts +158 -0
- package/dist/hooks/lifecycle.d.ts.map +1 -0
- package/dist/hooks/lifecycle.js +217 -0
- package/dist/hooks/lifecycle.js.map +1 -0
- package/dist/hooks/message-context.d.ts +101 -0
- package/dist/hooks/message-context.d.ts.map +1 -0
- package/dist/hooks/message-context.js +145 -0
- package/dist/hooks/message-context.js.map +1 -0
- package/dist/hooks/policy-context.d.ts.map +1 -0
- package/dist/hooks/runtime-context.d.ts +122 -0
- package/dist/hooks/runtime-context.d.ts.map +1 -0
- package/dist/hooks/runtime-context.js +149 -0
- package/dist/hooks/runtime-context.js.map +1 -0
- package/dist/hooks/signal.d.ts +267 -0
- package/dist/hooks/signal.d.ts.map +1 -0
- package/dist/hooks/signal.js +825 -0
- package/dist/hooks/signal.js.map +1 -0
- package/dist/hooks/types.d.ts +179 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +5 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx/components/agent.d.ts +64 -0
- package/dist/jsx/components/agent.d.ts.map +1 -0
- package/dist/jsx/components/agent.js +80 -0
- package/dist/jsx/components/agent.js.map +1 -0
- package/dist/jsx/components/complete.d.ts +65 -0
- package/dist/jsx/components/complete.d.ts.map +1 -0
- package/dist/jsx/components/complete.js +64 -0
- package/dist/jsx/components/complete.js.map +1 -0
- package/dist/jsx/components/content.d.ts +98 -0
- package/dist/jsx/components/content.d.ts.map +1 -0
- package/dist/jsx/components/content.js +51 -0
- package/dist/jsx/components/content.js.map +1 -0
- package/dist/jsx/components/harness.d.ts +118 -0
- package/dist/jsx/components/harness.d.ts.map +1 -0
- package/dist/jsx/components/harness.js +117 -0
- package/dist/jsx/components/harness.js.map +1 -0
- package/dist/jsx/components/index.d.ts +11 -0
- package/dist/jsx/components/index.d.ts.map +1 -0
- package/dist/jsx/components/index.js +11 -0
- package/dist/jsx/components/index.js.map +1 -0
- package/dist/jsx/components/markdown.d.ts +31 -0
- package/dist/jsx/components/markdown.d.ts.map +1 -0
- package/dist/jsx/components/markdown.js +17 -0
- package/dist/jsx/components/markdown.js.map +1 -0
- package/dist/jsx/components/messages.d.ts +283 -0
- package/dist/jsx/components/messages.d.ts.map +1 -0
- package/dist/jsx/components/messages.js +257 -0
- package/dist/jsx/components/messages.js.map +1 -0
- package/dist/jsx/components/model.d.ts +94 -0
- package/dist/jsx/components/model.d.ts.map +1 -0
- package/dist/jsx/components/model.js +96 -0
- package/dist/jsx/components/model.js.map +1 -0
- package/dist/jsx/components/primitives.d.ts +117 -0
- package/dist/jsx/components/primitives.d.ts.map +1 -0
- package/dist/jsx/components/primitives.js +83 -0
- package/dist/jsx/components/primitives.js.map +1 -0
- package/dist/jsx/components/renderer.d.ts +24 -0
- package/dist/jsx/components/renderer.d.ts.map +1 -0
- package/dist/jsx/components/renderer.js +11 -0
- package/dist/jsx/components/renderer.js.map +1 -0
- package/dist/jsx/components/semantic.d.ts +155 -0
- package/dist/jsx/components/semantic.d.ts.map +1 -0
- package/dist/jsx/components/semantic.js +39 -0
- package/dist/jsx/components/semantic.js.map +1 -0
- package/dist/jsx/components/timeline.d.ts +157 -0
- package/dist/jsx/components/timeline.d.ts.map +1 -0
- package/dist/jsx/components/timeline.js +357 -0
- package/dist/jsx/components/timeline.js.map +1 -0
- package/dist/jsx/components/token-budget.d.ts +70 -0
- package/dist/jsx/components/token-budget.d.ts.map +1 -0
- package/dist/jsx/components/token-budget.js +135 -0
- package/dist/jsx/components/token-budget.js.map +1 -0
- package/dist/jsx/components/xml.d.ts +27 -0
- package/dist/jsx/components/xml.d.ts.map +1 -0
- package/dist/jsx/components/xml.js +17 -0
- package/dist/jsx/components/xml.js.map +1 -0
- package/dist/jsx/index.d.ts +58 -0
- package/dist/jsx/index.d.ts.map +1 -0
- package/dist/jsx/index.js +59 -0
- package/dist/jsx/index.js.map +1 -0
- package/dist/jsx/jsx-runtime.d.ts +370 -0
- package/dist/jsx/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx/jsx-runtime.js +79 -0
- package/dist/jsx/jsx-runtime.js.map +1 -0
- package/dist/jsx/jsx-types.d.ts +23 -0
- package/dist/jsx/jsx-types.d.ts.map +1 -0
- package/dist/jsx/jsx-types.js +1 -0
- package/dist/jsx/jsx-types.js.map +1 -0
- package/dist/mcp/client.d.ts +46 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +138 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/component.d.ts +95 -0
- package/dist/mcp/component.d.ts.map +1 -0
- package/dist/mcp/component.js +185 -0
- package/dist/mcp/component.js.map +1 -0
- package/dist/mcp/create-mcp-tool.d.ts +191 -0
- package/dist/mcp/create-mcp-tool.d.ts.map +1 -0
- package/dist/mcp/create-mcp-tool.js +228 -0
- package/dist/mcp/create-mcp-tool.js.map +1 -0
- package/dist/mcp/index.d.ts +49 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +48 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/service.d.ts +39 -0
- package/dist/mcp/service.d.ts.map +1 -0
- package/dist/mcp/service.js +77 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp/tool.d.ts +55 -0
- package/dist/mcp/tool.d.ts.map +1 -0
- package/dist/mcp/tool.js +119 -0
- package/dist/mcp/tool.js.map +1 -0
- package/dist/mcp/types.d.ts +72 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +6 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/middleware/defaults.d.ts +9 -0
- package/dist/middleware/defaults.d.ts.map +1 -0
- package/dist/middleware/defaults.js +47 -0
- package/dist/middleware/defaults.js.map +1 -0
- package/dist/model/adapter-helpers.d.ts +161 -0
- package/dist/model/adapter-helpers.d.ts.map +1 -0
- package/dist/model/adapter-helpers.js +351 -0
- package/dist/model/adapter-helpers.js.map +1 -0
- package/dist/model/adapter.d.ts +399 -0
- package/dist/model/adapter.d.ts.map +1 -0
- package/dist/model/adapter.js +497 -0
- package/dist/model/adapter.js.map +1 -0
- package/dist/model/index.d.ts +54 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +55 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/model-hooks.d.ts +45 -0
- package/dist/model/model-hooks.d.ts.map +1 -0
- package/dist/model/model-hooks.js +24 -0
- package/dist/model/model-hooks.js.map +1 -0
- package/dist/model/model.d.ts +302 -0
- package/dist/model/model.d.ts.map +1 -0
- package/dist/model/model.js +20 -0
- package/dist/model/model.js.map +1 -0
- package/dist/model/simple-adapter.d.ts +176 -0
- package/dist/model/simple-adapter.d.ts.map +1 -0
- package/dist/model/simple-adapter.js +264 -0
- package/dist/model/simple-adapter.js.map +1 -0
- package/dist/model/stream-accumulator.d.ts +284 -0
- package/dist/model/stream-accumulator.d.ts.map +1 -0
- package/dist/model/stream-accumulator.js +532 -0
- package/dist/model/stream-accumulator.js.map +1 -0
- package/dist/model/utils/index.d.ts +2 -0
- package/dist/model/utils/index.d.ts.map +1 -0
- package/dist/model/utils/index.js +2 -0
- package/dist/model/utils/index.js.map +1 -0
- package/dist/model/utils/language-model.d.ts +26 -0
- package/dist/model/utils/language-model.d.ts.map +1 -0
- package/dist/model/utils/language-model.js +706 -0
- package/dist/model/utils/language-model.js.map +1 -0
- package/dist/procedure/index.d.ts +20 -0
- package/dist/procedure/index.d.ts.map +1 -0
- package/dist/procedure/index.js +19 -0
- package/dist/procedure/index.js.map +1 -0
- package/dist/reconciler/devtools-bridge.d.ts +40 -0
- package/dist/reconciler/devtools-bridge.d.ts.map +1 -0
- package/dist/reconciler/devtools-bridge.js +79 -0
- package/dist/reconciler/devtools-bridge.js.map +1 -0
- package/dist/reconciler/host-config.d.ts +39 -0
- package/dist/reconciler/host-config.d.ts.map +1 -0
- package/dist/reconciler/host-config.js +195 -0
- package/dist/reconciler/host-config.js.map +1 -0
- package/dist/reconciler/index.d.ts +7 -0
- package/dist/reconciler/index.d.ts.map +1 -0
- package/dist/reconciler/index.js +7 -0
- package/dist/reconciler/index.js.map +1 -0
- package/dist/reconciler/reconciler.d.ts +47 -0
- package/dist/reconciler/reconciler.d.ts.map +1 -0
- package/dist/reconciler/reconciler.js +89 -0
- package/dist/reconciler/reconciler.js.map +1 -0
- package/dist/reconciler/types.d.ts +86 -0
- package/dist/reconciler/types.d.ts.map +1 -0
- package/dist/reconciler/types.js +37 -0
- package/dist/reconciler/types.js.map +1 -0
- package/dist/renderers/base.d.ts +98 -0
- package/dist/renderers/base.d.ts.map +1 -0
- package/dist/renderers/base.js +82 -0
- package/dist/renderers/base.js.map +1 -0
- package/dist/renderers/index.d.ts +31 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +31 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/markdown.d.ts +48 -0
- package/dist/renderers/markdown.d.ts.map +1 -0
- package/dist/renderers/markdown.js +432 -0
- package/dist/renderers/markdown.js.map +1 -0
- package/dist/renderers/types.d.ts +7 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +7 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/renderers/xml.d.ts +49 -0
- package/dist/renderers/xml.d.ts.map +1 -0
- package/dist/renderers/xml.js +444 -0
- package/dist/renderers/xml.js.map +1 -0
- package/dist/state/boundary.d.ts +347 -0
- package/dist/state/boundary.d.ts.map +1 -0
- package/dist/state/boundary.js +341 -0
- package/dist/state/boundary.js.map +1 -0
- package/dist/state/context.d.ts +138 -0
- package/dist/state/context.d.ts.map +1 -0
- package/dist/state/context.js +139 -0
- package/dist/state/context.js.map +1 -0
- package/dist/state/hooks.d.ts +798 -0
- package/dist/state/hooks.d.ts.map +1 -0
- package/dist/state/hooks.js +1437 -0
- package/dist/state/hooks.js.map +1 -0
- package/dist/state/index.d.ts +72 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +73 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/signal.d.ts +223 -0
- package/dist/state/signal.d.ts.map +1 -0
- package/dist/state/signal.js +699 -0
- package/dist/state/signal.js.map +1 -0
- package/dist/state/use-state.d.ts +210 -0
- package/dist/state/use-state.d.ts.map +1 -0
- package/dist/state/use-state.js +327 -0
- package/dist/state/use-state.js.map +1 -0
- package/dist/tentickle-instance.d.ts +285 -0
- package/dist/tentickle-instance.d.ts.map +1 -0
- package/dist/tentickle-instance.js +700 -0
- package/dist/tentickle-instance.js.map +1 -0
- package/dist/testing/act.d.ts +59 -0
- package/dist/testing/act.d.ts.map +1 -0
- package/dist/testing/act.js +92 -0
- package/dist/testing/act.js.map +1 -0
- package/dist/testing/async-helpers.d.ts +99 -0
- package/dist/testing/async-helpers.d.ts.map +1 -0
- package/dist/testing/async-helpers.js +193 -0
- package/dist/testing/async-helpers.js.map +1 -0
- package/dist/testing/compile-agent.d.ts +101 -0
- package/dist/testing/compile-agent.d.ts.map +1 -0
- package/dist/testing/compile-agent.js +136 -0
- package/dist/testing/compile-agent.js.map +1 -0
- package/dist/testing/index.d.ts +57 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +59 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-app.d.ts +163 -0
- package/dist/testing/mock-app.d.ts.map +1 -0
- package/dist/testing/mock-app.js +393 -0
- package/dist/testing/mock-app.js.map +1 -0
- package/dist/testing/mocks.d.ts +142 -0
- package/dist/testing/mocks.d.ts.map +1 -0
- package/dist/testing/mocks.js +191 -0
- package/dist/testing/mocks.js.map +1 -0
- package/dist/testing/render-agent.d.ts +146 -0
- package/dist/testing/render-agent.d.ts.map +1 -0
- package/dist/testing/render-agent.js +200 -0
- package/dist/testing/render-agent.js.map +1 -0
- package/dist/testing/test-adapter.d.ts +157 -0
- package/dist/testing/test-adapter.d.ts.map +1 -0
- package/dist/testing/test-adapter.js +297 -0
- package/dist/testing/test-adapter.js.map +1 -0
- package/dist/testing/test-model.d.ts +132 -0
- package/dist/testing/test-model.d.ts.map +1 -0
- package/dist/testing/test-model.js +260 -0
- package/dist/testing/test-model.js.map +1 -0
- package/dist/tool/index.d.ts +61 -0
- package/dist/tool/index.d.ts.map +1 -0
- package/dist/tool/index.js +63 -0
- package/dist/tool/index.js.map +1 -0
- package/dist/tool/tool-hooks.d.ts +45 -0
- package/dist/tool/tool-hooks.d.ts.map +1 -0
- package/dist/tool/tool-hooks.js +35 -0
- package/dist/tool/tool-hooks.js.map +1 -0
- package/dist/tool/tool.d.ts +403 -0
- package/dist/tool/tool.d.ts.map +1 -0
- package/dist/tool/tool.js +176 -0
- package/dist/tool/tool.js.map +1 -0
- package/dist/types.d.ts +442 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +97 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/abort-utils.d.ts +5 -0
- package/dist/utils/abort-utils.d.ts.map +1 -0
- package/dist/utils/abort-utils.js +50 -0
- package/dist/utils/abort-utils.js.map +1 -0
- package/dist/utils/classify-error.d.ts +19 -0
- package/dist/utils/classify-error.d.ts.map +1 -0
- package/dist/utils/classify-error.js +77 -0
- package/dist/utils/classify-error.js.map +1 -0
- package/dist/utils/index.d.ts +21 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/normalization.d.ts +6 -0
- package/dist/utils/normalization.d.ts.map +1 -0
- package/dist/utils/normalization.js +103 -0
- package/dist/utils/normalization.js.map +1 -0
- package/dist/utils/registry.d.ts +15 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +28 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/schema.d.ts +7 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +13 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/token-estimate.d.ts +87 -0
- package/dist/utils/token-estimate.d.ts.map +1 -0
- package/dist/utils/token-estimate.js +199 -0
- package/dist/utils/token-estimate.js.map +1 -0
- package/dist/v2/reconciler/host-config.d.ts +31 -0
- package/dist/v2/reconciler/host-config.d.ts.map +1 -0
- package/dist/v2/reconciler/host-config.js +197 -0
- package/dist/v2/reconciler/host-config.js.map +1 -0
- package/dist/v2/reconciler/index.d.ts +7 -0
- package/dist/v2/reconciler/index.d.ts.map +1 -0
- package/dist/v2/reconciler/index.js +7 -0
- package/dist/v2/reconciler/index.js.map +1 -0
- package/dist/v2/reconciler/reconciler.d.ts +39 -0
- package/dist/v2/reconciler/reconciler.d.ts.map +1 -0
- package/dist/v2/reconciler/reconciler.js +54 -0
- package/dist/v2/reconciler/reconciler.js.map +1 -0
- package/dist/v2/reconciler/types.d.ts +64 -0
- package/dist/v2/reconciler/types.d.ts.map +1 -0
- package/dist/v2/reconciler/types.js +20 -0
- package/dist/v2/reconciler/types.js.map +1 -0
- package/dist/v2/renderers/index.d.ts +7 -0
- package/dist/v2/renderers/index.d.ts.map +1 -0
- package/dist/v2/renderers/index.js +7 -0
- package/dist/v2/renderers/index.js.map +1 -0
- package/dist/v2/renderers/markdown.d.ts +16 -0
- package/dist/v2/renderers/markdown.d.ts.map +1 -0
- package/dist/v2/renderers/markdown.js +65 -0
- package/dist/v2/renderers/markdown.js.map +1 -0
- package/dist/v2/renderers/types.d.ts +26 -0
- package/dist/v2/renderers/types.d.ts.map +1 -0
- package/dist/v2/renderers/types.js +6 -0
- package/dist/v2/renderers/types.js.map +1 -0
- package/dist/v2/renderers/xml.d.ts +17 -0
- package/dist/v2/renderers/xml.d.ts.map +1 -0
- package/dist/v2/renderers/xml.js +73 -0
- package/dist/v2/renderers/xml.js.map +1 -0
- 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
|