@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
|
@@ -0,0 +1,706 @@
|
|
|
1
|
+
import { isEventBlock, StopReason } from "@agentick/shared";
|
|
2
|
+
import { Logger } from "@agentick/kernel";
|
|
3
|
+
const log = Logger.for("language-model");
|
|
4
|
+
function deriveStopReason(output) {
|
|
5
|
+
if (!output.stopReason) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
reason: output.stopReason,
|
|
10
|
+
description: `Stopped due to ${output.stopReason}`,
|
|
11
|
+
recoverable: false,
|
|
12
|
+
metadata: {
|
|
13
|
+
usage: output.usage,
|
|
14
|
+
model: output.model,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function isTerminalStopReason(reason) {
|
|
19
|
+
const terminalReasons = [
|
|
20
|
+
StopReason.STOP,
|
|
21
|
+
StopReason.EXPLICIT_COMPLETION,
|
|
22
|
+
StopReason.NATURAL_COMPLETION,
|
|
23
|
+
StopReason.MAX_TOKENS,
|
|
24
|
+
StopReason.CONTENT_FILTER,
|
|
25
|
+
];
|
|
26
|
+
return terminalReasons.includes(reason);
|
|
27
|
+
}
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Transformer Functions
|
|
30
|
+
// ============================================================================
|
|
31
|
+
/** Default message transformation config */
|
|
32
|
+
const DEFAULT_TRANSFORMATION_CONFIG = {
|
|
33
|
+
preferredRenderer: "markdown",
|
|
34
|
+
roleMapping: {
|
|
35
|
+
event: "user",
|
|
36
|
+
ephemeral: "user",
|
|
37
|
+
},
|
|
38
|
+
delimiters: {
|
|
39
|
+
event: "[Event]",
|
|
40
|
+
ephemeral: "[Context]",
|
|
41
|
+
useDelimiters: true,
|
|
42
|
+
},
|
|
43
|
+
ephemeralPosition: "flow",
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Resolve message transformation config from model capabilities and options.
|
|
47
|
+
* Handles function-based configs that need model ID/provider to resolve.
|
|
48
|
+
*/
|
|
49
|
+
function resolveTransformationConfig(modelId, provider, modelCapabilities, modelOptions, inputModelOptions) {
|
|
50
|
+
// 1. Get base config from model capabilities (resolve function if needed)
|
|
51
|
+
let baseConfig;
|
|
52
|
+
if (modelCapabilities?.messageTransformation) {
|
|
53
|
+
const cap = modelCapabilities.messageTransformation;
|
|
54
|
+
baseConfig = typeof cap === "function" ? cap(modelId, provider) : cap;
|
|
55
|
+
}
|
|
56
|
+
// 2. Merge with modelOptions.messageTransformation
|
|
57
|
+
// 3. Merge with inputModelOptions.messageTransformation
|
|
58
|
+
// 4. Apply defaults
|
|
59
|
+
return {
|
|
60
|
+
...DEFAULT_TRANSFORMATION_CONFIG,
|
|
61
|
+
...baseConfig,
|
|
62
|
+
...modelOptions?.messageTransformation,
|
|
63
|
+
...inputModelOptions?.messageTransformation,
|
|
64
|
+
roleMapping: {
|
|
65
|
+
...DEFAULT_TRANSFORMATION_CONFIG.roleMapping,
|
|
66
|
+
...baseConfig?.roleMapping,
|
|
67
|
+
...modelOptions?.messageTransformation?.roleMapping,
|
|
68
|
+
...inputModelOptions?.messageTransformation?.roleMapping,
|
|
69
|
+
},
|
|
70
|
+
delimiters: {
|
|
71
|
+
...DEFAULT_TRANSFORMATION_CONFIG.delimiters,
|
|
72
|
+
...baseConfig?.delimiters,
|
|
73
|
+
...modelOptions?.messageTransformation?.delimiters,
|
|
74
|
+
...inputModelOptions?.messageTransformation?.delimiters,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Helper to check if delimiter config is per-block-type
|
|
80
|
+
*/
|
|
81
|
+
function isBlockDelimiters(delimiter) {
|
|
82
|
+
if (!delimiter || typeof delimiter === "string")
|
|
83
|
+
return false;
|
|
84
|
+
// Check if it has any of the block-type keys
|
|
85
|
+
return ("user_action" in delimiter ||
|
|
86
|
+
"system_event" in delimiter ||
|
|
87
|
+
"state_change" in delimiter ||
|
|
88
|
+
"default" in delimiter);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get delimiter for a specific block type
|
|
92
|
+
*/
|
|
93
|
+
function getDelimiterForBlock(blockType, delimiters) {
|
|
94
|
+
switch (blockType) {
|
|
95
|
+
case "user_action":
|
|
96
|
+
return delimiters.user_action ?? delimiters.default;
|
|
97
|
+
case "system_event":
|
|
98
|
+
return delimiters.system_event ?? delimiters.default;
|
|
99
|
+
case "state_change":
|
|
100
|
+
return delimiters.state_change ?? delimiters.default;
|
|
101
|
+
default:
|
|
102
|
+
return delimiters.default;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Wrap text with delimiter
|
|
107
|
+
*/
|
|
108
|
+
function wrapTextWithDelimiter(text, delimiter) {
|
|
109
|
+
if (!delimiter) {
|
|
110
|
+
return [{ type: "text", text }];
|
|
111
|
+
}
|
|
112
|
+
const result = [];
|
|
113
|
+
const startDelim = typeof delimiter === "string" ? delimiter : delimiter.start;
|
|
114
|
+
const endDelim = typeof delimiter === "string" ? "" : delimiter.end;
|
|
115
|
+
if (startDelim) {
|
|
116
|
+
result.push({
|
|
117
|
+
type: "text",
|
|
118
|
+
text: `${startDelim} ${text}${endDelim ? ` ${endDelim}` : ""}`,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
result.push({ type: "text", text });
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convert unsupported content blocks to text blocks for ModelInput.
|
|
128
|
+
*
|
|
129
|
+
* Models only support a subset of ContentBlock types natively:
|
|
130
|
+
* - text, image, document, audio, video, tool_use, tool_result, reasoning
|
|
131
|
+
*
|
|
132
|
+
* Unsupported types must be converted to text:
|
|
133
|
+
* - code → markdown code fences
|
|
134
|
+
* - json → markdown JSON code fences
|
|
135
|
+
* - Other convertible types → text representation
|
|
136
|
+
*
|
|
137
|
+
* This ensures ModelInput only contains ModelInputContentBlock types.
|
|
138
|
+
*
|
|
139
|
+
* @param blocks - Content blocks from COMInput (may include unsupported types)
|
|
140
|
+
* @returns Content blocks suitable for ModelInput (only supported types)
|
|
141
|
+
*/
|
|
142
|
+
function convertUnsupportedBlocksToText(blocks) {
|
|
143
|
+
return blocks.flatMap((block) => {
|
|
144
|
+
// Code blocks → markdown code fences
|
|
145
|
+
if (block.type === "code") {
|
|
146
|
+
const codeBlock = block;
|
|
147
|
+
const language = codeBlock.language || "";
|
|
148
|
+
return [
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: `\`\`\`${language}\n${codeBlock.text}\n\`\`\``,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
// JSON blocks → markdown JSON code fences
|
|
156
|
+
if (block.type === "json") {
|
|
157
|
+
const jsonBlock = block;
|
|
158
|
+
const jsonText = jsonBlock.text || JSON.stringify(jsonBlock.data || {}, null, 2);
|
|
159
|
+
return [
|
|
160
|
+
{
|
|
161
|
+
type: "text",
|
|
162
|
+
text: `\`\`\`json\n${jsonText}\n\`\`\``,
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
// Event blocks are handled separately by transformEventContent
|
|
167
|
+
// Other unsupported types → convert to text representation
|
|
168
|
+
// (xml, csv, html, generated_image, etc.)
|
|
169
|
+
const unsupportedTypes = [
|
|
170
|
+
"xml",
|
|
171
|
+
"csv",
|
|
172
|
+
"html",
|
|
173
|
+
"generated_image",
|
|
174
|
+
"generated_file",
|
|
175
|
+
"executable_code",
|
|
176
|
+
"code_execution_result",
|
|
177
|
+
];
|
|
178
|
+
if (unsupportedTypes.includes(block.type)) {
|
|
179
|
+
// Convert to text representation
|
|
180
|
+
const text = block.text || JSON.stringify(block, null, 2);
|
|
181
|
+
return [
|
|
182
|
+
{
|
|
183
|
+
type: "text",
|
|
184
|
+
text,
|
|
185
|
+
},
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
// Pass through supported block types unchanged
|
|
189
|
+
// (text, image, document, audio, video, tool_use, tool_result, reasoning)
|
|
190
|
+
return [block];
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Extract text representation from an event block.
|
|
195
|
+
* Uses the block's `text` field if available, otherwise generates from semantic fields.
|
|
196
|
+
*/
|
|
197
|
+
function getEventBlockText(block) {
|
|
198
|
+
// Text blocks use their text directly
|
|
199
|
+
if (block.type === "text") {
|
|
200
|
+
return block.text;
|
|
201
|
+
}
|
|
202
|
+
// Event blocks: use text field if available, else serialize semantic data
|
|
203
|
+
const eventBlock = block;
|
|
204
|
+
if ("text" in eventBlock && eventBlock.text) {
|
|
205
|
+
return eventBlock.text;
|
|
206
|
+
}
|
|
207
|
+
// Fallback: generate text from semantic fields
|
|
208
|
+
switch (block.type) {
|
|
209
|
+
case "user_action": {
|
|
210
|
+
const ua = block;
|
|
211
|
+
const parts = [ua.actor || "User", ua.action];
|
|
212
|
+
if (ua.target)
|
|
213
|
+
parts.push(`on ${ua.target}`);
|
|
214
|
+
return parts.join(" ");
|
|
215
|
+
}
|
|
216
|
+
case "system_event": {
|
|
217
|
+
const se = block;
|
|
218
|
+
const parts = [se.event];
|
|
219
|
+
if (se.source)
|
|
220
|
+
parts.push(`(${se.source})`);
|
|
221
|
+
return parts.join(" ");
|
|
222
|
+
}
|
|
223
|
+
case "state_change": {
|
|
224
|
+
const sc = block;
|
|
225
|
+
return `${sc.entity}${sc.field ? `.${sc.field}` : ""}: ${JSON.stringify(sc.from)} → ${JSON.stringify(sc.to)}`;
|
|
226
|
+
}
|
|
227
|
+
default:
|
|
228
|
+
return JSON.stringify(block);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Transform event message content based on unified config.
|
|
233
|
+
*
|
|
234
|
+
* Supports:
|
|
235
|
+
* - Custom formatBlock function (full control)
|
|
236
|
+
* - Per-block-type delimiters (uses block.text if available)
|
|
237
|
+
* - Simple delimiter (wraps all content)
|
|
238
|
+
*
|
|
239
|
+
* Event blocks with `text` field use that for content; otherwise
|
|
240
|
+
* a default representation is generated from semantic fields.
|
|
241
|
+
*
|
|
242
|
+
* Note: This is called AFTER StructureRenderer formats event blocks to text.
|
|
243
|
+
* If content is already text blocks (formatted by renderer), delimiters are
|
|
244
|
+
* only applied if useDelimiters is true. If content is still event blocks,
|
|
245
|
+
* they are converted to text first, then delimiters are applied.
|
|
246
|
+
*/
|
|
247
|
+
function transformEventContent(content, config) {
|
|
248
|
+
// If custom formatter provided, use it for each block
|
|
249
|
+
if (config.formatBlock) {
|
|
250
|
+
return content.flatMap((block) => {
|
|
251
|
+
if (isEventBlock(block) || block.type === "text") {
|
|
252
|
+
return config.formatBlock(block);
|
|
253
|
+
}
|
|
254
|
+
// Non-event blocks pass through
|
|
255
|
+
return [block];
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// Check if delimiters should be used
|
|
259
|
+
if (!config.delimiters?.useDelimiters) {
|
|
260
|
+
return content;
|
|
261
|
+
}
|
|
262
|
+
const delimiter = config.delimiters.event;
|
|
263
|
+
if (!delimiter) {
|
|
264
|
+
return content;
|
|
265
|
+
}
|
|
266
|
+
// Check if content is already formatted text blocks (from renderer)
|
|
267
|
+
// If so, we need to extract the text and wrap it with delimiters
|
|
268
|
+
const _isAlreadyFormatted = content.every((block) => block.type === "text");
|
|
269
|
+
// Per-block-type delimiters - extract text and wrap each block
|
|
270
|
+
if (isBlockDelimiters(delimiter)) {
|
|
271
|
+
const wrapped = content.flatMap((block) => {
|
|
272
|
+
const blockText = getEventBlockText(block);
|
|
273
|
+
// Skip empty text blocks
|
|
274
|
+
if (!blockText || blockText.trim() === "") {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
const blockDelim = getDelimiterForBlock(block.type, delimiter);
|
|
278
|
+
return wrapTextWithDelimiter(blockText, blockDelim);
|
|
279
|
+
});
|
|
280
|
+
// If all blocks were empty, return original content (don't add delimiters to empty content)
|
|
281
|
+
return wrapped.length > 0 ? wrapped : content;
|
|
282
|
+
}
|
|
283
|
+
// Simple delimiter - combine all block texts and wrap
|
|
284
|
+
const allText = content
|
|
285
|
+
.map(getEventBlockText)
|
|
286
|
+
.filter((text) => text && text.trim() !== "")
|
|
287
|
+
.join("\n");
|
|
288
|
+
if (!allText || allText.trim() === "") {
|
|
289
|
+
// If no text content, return original content (don't add delimiters to empty content)
|
|
290
|
+
return content;
|
|
291
|
+
}
|
|
292
|
+
return wrapTextWithDelimiter(allText, delimiter);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Convert an EphemeralEntry to a Message with the configured role and formatting.
|
|
296
|
+
*
|
|
297
|
+
* Content is already consolidated by StructureRenderer - this just applies
|
|
298
|
+
* delimiters and role mapping.
|
|
299
|
+
*
|
|
300
|
+
* @param entry - Ephemeral entry to convert
|
|
301
|
+
* @param config - Unified transformation configuration
|
|
302
|
+
*/
|
|
303
|
+
function ephemeralEntryToMessage(entry, config) {
|
|
304
|
+
// Build content with delimiters
|
|
305
|
+
let content = [...entry.content];
|
|
306
|
+
// Apply delimiters if enabled
|
|
307
|
+
if (config.delimiters?.useDelimiters && config.delimiters.ephemeral) {
|
|
308
|
+
const delimiter = config.delimiters.ephemeral;
|
|
309
|
+
const startDelim = typeof delimiter === "string" ? delimiter : delimiter.start;
|
|
310
|
+
const endDelim = typeof delimiter === "string" ? "" : delimiter.end;
|
|
311
|
+
// Prepend delimiter to first text block if possible, otherwise add as new block
|
|
312
|
+
if (startDelim) {
|
|
313
|
+
if (content.length > 0 && content[0].type === "text") {
|
|
314
|
+
content[0] = {
|
|
315
|
+
type: "text",
|
|
316
|
+
text: `${startDelim}\n${content[0].text}`,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
content.unshift({ type: "text", text: startDelim });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Append delimiter to last text block if possible, otherwise add as new block
|
|
324
|
+
if (endDelim) {
|
|
325
|
+
const lastIdx = content.length - 1;
|
|
326
|
+
if (lastIdx >= 0 && content[lastIdx].type === "text") {
|
|
327
|
+
content[lastIdx] = {
|
|
328
|
+
type: "text",
|
|
329
|
+
text: `${content[lastIdx].text}\n${endDelim}`,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
content.push({ type: "text", text: endDelim });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Convert unsupported blocks to text (models don't support code/json blocks natively)
|
|
338
|
+
content = convertUnsupportedBlocksToText(content);
|
|
339
|
+
const role = config.roleMapping?.ephemeral || "user";
|
|
340
|
+
// Map 'developer' to 'user' for Message type (adapter will convert to 'developer' if supported)
|
|
341
|
+
const messageRole = role === "developer" ? "user" : role;
|
|
342
|
+
return {
|
|
343
|
+
role: messageRole,
|
|
344
|
+
content,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Interleave ephemeral entries into the message array based on their position.
|
|
349
|
+
*
|
|
350
|
+
* Ephemeral entries are NOT Messages - they are transient content that gets
|
|
351
|
+
* converted to Messages and inserted at the appropriate positions.
|
|
352
|
+
*
|
|
353
|
+
* Position semantics:
|
|
354
|
+
* - 'flow': In declaration order (converted and appended to messages)
|
|
355
|
+
* - 'after-system': Immediately after the last system message
|
|
356
|
+
* - 'start': After system + after-system, before conversation
|
|
357
|
+
* - 'before-user': Just before the last user message
|
|
358
|
+
* - 'end': At the very end
|
|
359
|
+
*
|
|
360
|
+
* Entries with the same position are ordered by their `order` property (lower = earlier).
|
|
361
|
+
*
|
|
362
|
+
* @param messages - Timeline messages (persisted)
|
|
363
|
+
* @param ephemeral - Ephemeral entries (transient)
|
|
364
|
+
* @param config - Role and formatting configuration for conversion
|
|
365
|
+
*/
|
|
366
|
+
function interleaveEphemeral(messages, ephemeral, config) {
|
|
367
|
+
if (ephemeral.length === 0) {
|
|
368
|
+
return messages;
|
|
369
|
+
}
|
|
370
|
+
// Group ephemeral entries by position
|
|
371
|
+
const defaultPosition = config.ephemeralPosition || "flow";
|
|
372
|
+
const positionBuckets = {
|
|
373
|
+
flow: [],
|
|
374
|
+
"after-system": [],
|
|
375
|
+
start: [],
|
|
376
|
+
"before-user": [],
|
|
377
|
+
end: [],
|
|
378
|
+
};
|
|
379
|
+
for (const entry of ephemeral) {
|
|
380
|
+
const entryPosition = entry.position || defaultPosition;
|
|
381
|
+
const bucket = positionBuckets[entryPosition] || positionBuckets["end"];
|
|
382
|
+
bucket.push(entry);
|
|
383
|
+
}
|
|
384
|
+
// Sort each bucket by order (lower = earlier)
|
|
385
|
+
const sortByOrder = (a, b) => {
|
|
386
|
+
return (a.order ?? 0) - (b.order ?? 0);
|
|
387
|
+
};
|
|
388
|
+
for (const bucket of Object.values(positionBuckets)) {
|
|
389
|
+
bucket.sort(sortByOrder);
|
|
390
|
+
}
|
|
391
|
+
// Convert buckets to messages
|
|
392
|
+
const toMessages = (entries) => entries.map((e) => ephemeralEntryToMessage(e, config));
|
|
393
|
+
// If only flow entries, append them as messages
|
|
394
|
+
const hasPositionedEntries = positionBuckets["after-system"].length > 0 ||
|
|
395
|
+
positionBuckets["start"].length > 0 ||
|
|
396
|
+
positionBuckets["before-user"].length > 0 ||
|
|
397
|
+
positionBuckets["end"].length > 0;
|
|
398
|
+
if (!hasPositionedEntries) {
|
|
399
|
+
// Flow entries get appended at the end (they represent current state)
|
|
400
|
+
return [...messages, ...toMessages(positionBuckets["flow"])];
|
|
401
|
+
}
|
|
402
|
+
// Find key positions in messages
|
|
403
|
+
let lastSystemIdx = -1;
|
|
404
|
+
let lastUserIdx = -1;
|
|
405
|
+
for (let i = 0; i < messages.length; i++) {
|
|
406
|
+
if (messages[i].role === "system") {
|
|
407
|
+
lastSystemIdx = i;
|
|
408
|
+
}
|
|
409
|
+
if (messages[i].role === "user") {
|
|
410
|
+
lastUserIdx = i;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Build result with ephemeral messages inserted at the right points
|
|
414
|
+
const result = [];
|
|
415
|
+
let insertedAfterSystem = false;
|
|
416
|
+
let insertedStart = false;
|
|
417
|
+
let insertedBeforeUser = false;
|
|
418
|
+
for (let i = 0; i < messages.length; i++) {
|
|
419
|
+
const msg = messages[i];
|
|
420
|
+
// Insert after-system after the last system message
|
|
421
|
+
if (!insertedAfterSystem && lastSystemIdx >= 0 && i === lastSystemIdx) {
|
|
422
|
+
result.push(msg);
|
|
423
|
+
result.push(...toMessages(positionBuckets["after-system"]));
|
|
424
|
+
insertedAfterSystem = true;
|
|
425
|
+
// Also insert 'start' after system
|
|
426
|
+
result.push(...toMessages(positionBuckets["start"]));
|
|
427
|
+
insertedStart = true;
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
// Insert start at beginning if no system messages
|
|
431
|
+
if (!insertedStart && lastSystemIdx === -1 && i === 0) {
|
|
432
|
+
result.push(...toMessages(positionBuckets["after-system"]));
|
|
433
|
+
result.push(...toMessages(positionBuckets["start"]));
|
|
434
|
+
insertedStart = true;
|
|
435
|
+
}
|
|
436
|
+
// Insert before-user before the last user message
|
|
437
|
+
if (!insertedBeforeUser && lastUserIdx >= 0 && i === lastUserIdx) {
|
|
438
|
+
result.push(...toMessages(positionBuckets["before-user"]));
|
|
439
|
+
insertedBeforeUser = true;
|
|
440
|
+
}
|
|
441
|
+
result.push(msg);
|
|
442
|
+
}
|
|
443
|
+
// Handle edge cases - insert any positioned messages that weren't inserted
|
|
444
|
+
if (!insertedAfterSystem) {
|
|
445
|
+
result.unshift(...toMessages(positionBuckets["after-system"]));
|
|
446
|
+
}
|
|
447
|
+
if (!insertedStart) {
|
|
448
|
+
const afterSystemCount = positionBuckets["after-system"].length;
|
|
449
|
+
result.splice(afterSystemCount, 0, ...toMessages(positionBuckets["start"]));
|
|
450
|
+
}
|
|
451
|
+
if (!insertedBeforeUser && positionBuckets["before-user"].length > 0) {
|
|
452
|
+
result.push(...toMessages(positionBuckets["before-user"]));
|
|
453
|
+
}
|
|
454
|
+
// Flow entries go before positioned 'end' entries
|
|
455
|
+
result.push(...toMessages(positionBuckets["flow"]));
|
|
456
|
+
// End always goes at the very end
|
|
457
|
+
result.push(...toMessages(positionBuckets["end"]));
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Convert COMInput to ModelInput
|
|
462
|
+
*
|
|
463
|
+
* @param input - COMInput from engine state
|
|
464
|
+
* @param modelOptions - Optional model options to merge into ModelInput (can also be provided via input.modelOptions)
|
|
465
|
+
* @param model - Optional model instance to get transformation config from capabilities
|
|
466
|
+
* @returns ModelInput with modelOptions merged in
|
|
467
|
+
*/
|
|
468
|
+
export async function fromEngineState(input, modelOptions, model) {
|
|
469
|
+
// Resolve transformation config from model capabilities and options
|
|
470
|
+
const modelId = model?.metadata.id || model?.metadata.model || "";
|
|
471
|
+
const provider = model?.metadata.provider;
|
|
472
|
+
const transformationConfig = resolveTransformationConfig(modelId, provider, model?.metadata.capabilities, modelOptions, input.modelOptions);
|
|
473
|
+
// Extract conversation messages from timeline (excludes system - those are in input.system)
|
|
474
|
+
log.debug({ timelineCount: input.timeline.length }, "fromEngineState processing timeline");
|
|
475
|
+
input.timeline.forEach((entry, i) => {
|
|
476
|
+
log.debug({ index: i, kind: entry.kind, role: entry.message?.role }, "fromEngineState timeline entry");
|
|
477
|
+
});
|
|
478
|
+
const timelineMessages = input.timeline
|
|
479
|
+
.filter((entry) => entry.kind === "message")
|
|
480
|
+
.map((entry) => entry.message);
|
|
481
|
+
log.debug({ timelineMessagesCount: timelineMessages.length }, "fromEngineState extracted timeline messages");
|
|
482
|
+
// Transform event messages (models don't understand 'event' role)
|
|
483
|
+
// Also convert code/json blocks to markdown text (models don't support code blocks natively)
|
|
484
|
+
const conversationMessages = timelineMessages.map((msg) => {
|
|
485
|
+
let content = msg.content;
|
|
486
|
+
// Transform event messages
|
|
487
|
+
if (msg.role === "event") {
|
|
488
|
+
content = transformEventContent(content, transformationConfig);
|
|
489
|
+
const eventRole = transformationConfig.roleMapping?.event || "user";
|
|
490
|
+
// Map 'developer' to 'user' for Message type (adapter will convert to 'developer' if supported)
|
|
491
|
+
const messageRole = eventRole === "developer"
|
|
492
|
+
? "user"
|
|
493
|
+
: eventRole === "event"
|
|
494
|
+
? "user"
|
|
495
|
+
: eventRole;
|
|
496
|
+
return {
|
|
497
|
+
...msg,
|
|
498
|
+
role: messageRole,
|
|
499
|
+
content: convertUnsupportedBlocksToText(content),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
// Convert unsupported blocks to text for all messages (code/json blocks → markdown)
|
|
503
|
+
return {
|
|
504
|
+
...msg,
|
|
505
|
+
content: convertUnsupportedBlocksToText(content),
|
|
506
|
+
};
|
|
507
|
+
});
|
|
508
|
+
// Build base message array: system messages FIRST, then conversation
|
|
509
|
+
const baseMessages = [];
|
|
510
|
+
// System messages come from input.system (rebuilt fresh each tick by StructureRenderer)
|
|
511
|
+
// Unwrap from COMTimelineEntry envelope and convert unsupported blocks to text
|
|
512
|
+
if (input.system && input.system.length > 0) {
|
|
513
|
+
const systemMessages = input.system
|
|
514
|
+
.filter((entry) => entry.kind === "message")
|
|
515
|
+
.map((entry) => ({
|
|
516
|
+
...entry.message,
|
|
517
|
+
content: convertUnsupportedBlocksToText(entry.message.content),
|
|
518
|
+
}));
|
|
519
|
+
baseMessages.push(...systemMessages);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
// No system message exists - create one from sections (fallback for direct model calls)
|
|
523
|
+
const systemSections = Object.values(input.sections)
|
|
524
|
+
.filter((s) => s.audience === "model")
|
|
525
|
+
.map((s) => {
|
|
526
|
+
// Use formattedContent if available (already processed ContentBlocks)
|
|
527
|
+
const contentToUse = s.formattedContent ?? s.content;
|
|
528
|
+
if (typeof contentToUse === "string") {
|
|
529
|
+
return s.title ? `${s.title}: ${contentToUse}` : contentToUse;
|
|
530
|
+
}
|
|
531
|
+
// If it's an array of content blocks, extract text
|
|
532
|
+
if (Array.isArray(contentToUse)) {
|
|
533
|
+
const text = contentToUse
|
|
534
|
+
.map((block) => {
|
|
535
|
+
if (typeof block === "string")
|
|
536
|
+
return block;
|
|
537
|
+
if (block && typeof block === "object" && "text" in block) {
|
|
538
|
+
return block.text;
|
|
539
|
+
}
|
|
540
|
+
return "";
|
|
541
|
+
})
|
|
542
|
+
.filter(Boolean)
|
|
543
|
+
.join("\n");
|
|
544
|
+
return s.title ? `${s.title}: ${text}` : text;
|
|
545
|
+
}
|
|
546
|
+
// Fallback for other types
|
|
547
|
+
return s.title ? `${s.title}: ${String(contentToUse)}` : String(contentToUse);
|
|
548
|
+
});
|
|
549
|
+
if (systemSections.length > 0) {
|
|
550
|
+
baseMessages.push({
|
|
551
|
+
role: "system",
|
|
552
|
+
content: [{ type: "text", text: systemSections.join("\n\n") }],
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
// Add conversation messages after system
|
|
557
|
+
baseMessages.push(...conversationMessages);
|
|
558
|
+
// NOW interleave ephemeral entries into the correctly-ordered message array
|
|
559
|
+
// This happens AFTER system consolidation so positions are respected
|
|
560
|
+
const messages = interleaveEphemeral(baseMessages, input.ephemeral || [], transformationConfig);
|
|
561
|
+
// Convert tools to ModelInput format
|
|
562
|
+
const tools = input.tools || [];
|
|
563
|
+
// Build base ModelInput
|
|
564
|
+
const baseModelInput = {
|
|
565
|
+
messages,
|
|
566
|
+
tools: tools.length > 0 ? tools : [],
|
|
567
|
+
};
|
|
568
|
+
// Merge modelOptions from input.modelOptions or passed parameter
|
|
569
|
+
const optionsToMerge = modelOptions || input.modelOptions;
|
|
570
|
+
if (optionsToMerge) {
|
|
571
|
+
// Merge modelOptions into ModelInput
|
|
572
|
+
// Only include defined values
|
|
573
|
+
if (optionsToMerge.model !== undefined) {
|
|
574
|
+
baseModelInput.model = optionsToMerge.model;
|
|
575
|
+
}
|
|
576
|
+
if (optionsToMerge.temperature !== undefined) {
|
|
577
|
+
baseModelInput.temperature = optionsToMerge.temperature;
|
|
578
|
+
}
|
|
579
|
+
if (optionsToMerge.maxTokens !== undefined) {
|
|
580
|
+
baseModelInput.maxTokens = optionsToMerge.maxTokens;
|
|
581
|
+
}
|
|
582
|
+
if (optionsToMerge.topP !== undefined) {
|
|
583
|
+
baseModelInput.topP = optionsToMerge.topP;
|
|
584
|
+
}
|
|
585
|
+
if (optionsToMerge.frequencyPenalty !== undefined) {
|
|
586
|
+
baseModelInput.frequencyPenalty = optionsToMerge.frequencyPenalty;
|
|
587
|
+
}
|
|
588
|
+
if (optionsToMerge.presencePenalty !== undefined) {
|
|
589
|
+
baseModelInput.presencePenalty = optionsToMerge.presencePenalty;
|
|
590
|
+
}
|
|
591
|
+
if (optionsToMerge.stop !== undefined) {
|
|
592
|
+
baseModelInput.stop = optionsToMerge.stop;
|
|
593
|
+
}
|
|
594
|
+
if (optionsToMerge.providerOptions !== undefined) {
|
|
595
|
+
baseModelInput.providerOptions = optionsToMerge.providerOptions;
|
|
596
|
+
}
|
|
597
|
+
if (optionsToMerge.responseFormat !== undefined) {
|
|
598
|
+
baseModelInput.responseFormat = optionsToMerge.responseFormat;
|
|
599
|
+
}
|
|
600
|
+
// Note: tools from modelOptions are not merged - we use tools from COMInput.tools
|
|
601
|
+
}
|
|
602
|
+
return baseModelInput;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Extract tool calls and results from messages, separating pending from executed.
|
|
606
|
+
*
|
|
607
|
+
* Provider/adapter-executed tools will have both tool_use and tool_result messages.
|
|
608
|
+
* Pending tools will only have tool_use without corresponding tool_result.
|
|
609
|
+
*/
|
|
610
|
+
function extractToolCallsAndResults(messages) {
|
|
611
|
+
// First pass: collect all toolUseIds that have tool_result messages
|
|
612
|
+
const executedToolIds = new Set();
|
|
613
|
+
const executedResults = [];
|
|
614
|
+
for (const msg of messages) {
|
|
615
|
+
if (msg.role === "tool") {
|
|
616
|
+
for (const block of msg.content) {
|
|
617
|
+
if (block.type === "tool_result") {
|
|
618
|
+
const toolResultBlock = block;
|
|
619
|
+
executedToolIds.add(toolResultBlock.toolUseId);
|
|
620
|
+
executedResults.push({
|
|
621
|
+
id: toolResultBlock.id,
|
|
622
|
+
toolUseId: toolResultBlock.toolUseId,
|
|
623
|
+
name: toolResultBlock.name || "unknown",
|
|
624
|
+
content: toolResultBlock.content || [],
|
|
625
|
+
success: !toolResultBlock.isError,
|
|
626
|
+
executedBy: "adapter", // or 'provider' - could be refined based on metadata
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
// Second pass: collect tool_use blocks that weren't executed
|
|
633
|
+
const pendingToolCalls = [];
|
|
634
|
+
for (const msg of messages) {
|
|
635
|
+
if (msg.role === "assistant") {
|
|
636
|
+
for (const block of msg.content) {
|
|
637
|
+
if (block.type === "tool_use") {
|
|
638
|
+
const toolUseBlock = block;
|
|
639
|
+
// Support both `toolUseId` (standard) and `id` (some providers)
|
|
640
|
+
const toolId = toolUseBlock.toolUseId || toolUseBlock.id || "";
|
|
641
|
+
// Only include if not already executed
|
|
642
|
+
if (!executedToolIds.has(toolId)) {
|
|
643
|
+
pendingToolCalls.push({
|
|
644
|
+
id: toolId,
|
|
645
|
+
name: toolUseBlock.name,
|
|
646
|
+
input: toolUseBlock.input || {},
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
return { pendingToolCalls, executedToolResults: executedResults };
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Convert ModelOutput to EngineResponse
|
|
657
|
+
*/
|
|
658
|
+
export async function toEngineState(output) {
|
|
659
|
+
// Derive structured stop reason information
|
|
660
|
+
const stopReasonInfo = deriveStopReason(output);
|
|
661
|
+
// Use messages array if available, fall back to single message
|
|
662
|
+
const messages = output.messages?.length
|
|
663
|
+
? output.messages
|
|
664
|
+
: output.message
|
|
665
|
+
? [output.message]
|
|
666
|
+
: [];
|
|
667
|
+
// Extract tool calls and results, separating pending from executed
|
|
668
|
+
const { pendingToolCalls, executedToolResults } = extractToolCallsAndResults(messages);
|
|
669
|
+
// Also check output.toolCalls for backward compatibility
|
|
670
|
+
// These would be from adapters that don't use messages array
|
|
671
|
+
const legacyToolCalls = output.toolCalls?.map((tc) => ({
|
|
672
|
+
id: tc.id,
|
|
673
|
+
name: tc.name,
|
|
674
|
+
input: tc.input,
|
|
675
|
+
})) || [];
|
|
676
|
+
// Merge: pendingToolCalls from messages + legacy toolCalls (dedupe by id)
|
|
677
|
+
const seenIds = new Set(pendingToolCalls.map((tc) => tc.id));
|
|
678
|
+
const allPendingToolCalls = [
|
|
679
|
+
...pendingToolCalls,
|
|
680
|
+
...legacyToolCalls.filter((tc) => !seenIds.has(tc.id)),
|
|
681
|
+
];
|
|
682
|
+
// Determine if we should stop:
|
|
683
|
+
// 1. No tool calls AND terminal stop reason, OR
|
|
684
|
+
// 2. No tool calls AND empty content (model has nothing to say)
|
|
685
|
+
const hasToolCalls = allPendingToolCalls.length > 0;
|
|
686
|
+
const hasContent = messages.some((msg) => msg.role !== "tool" && msg.content && Array.isArray(msg.content) && msg.content.length > 0);
|
|
687
|
+
const isTerminal = stopReasonInfo ? isTerminalStopReason(stopReasonInfo.reason) : false;
|
|
688
|
+
// Stop if: no tool calls AND (terminal stop reason OR empty response)
|
|
689
|
+
// This prevents infinite loops when model returns empty content with UNSPECIFIED stop reason
|
|
690
|
+
const shouldStop = !hasToolCalls && (isTerminal || !hasContent);
|
|
691
|
+
return {
|
|
692
|
+
newTimelineEntries: messages
|
|
693
|
+
.filter((msg) => msg.role !== "tool") // Tool messages handled separately
|
|
694
|
+
.map((msg) => ({
|
|
695
|
+
kind: "message",
|
|
696
|
+
message: msg,
|
|
697
|
+
tags: ["model_output"],
|
|
698
|
+
})),
|
|
699
|
+
toolCalls: allPendingToolCalls.length > 0 ? allPendingToolCalls : undefined,
|
|
700
|
+
executedToolResults: executedToolResults.length > 0 ? executedToolResults : undefined,
|
|
701
|
+
usage: output.usage,
|
|
702
|
+
shouldStop,
|
|
703
|
+
stopReason: stopReasonInfo,
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
//# sourceMappingURL=language-model.js.map
|