@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,899 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* New Procedure Implementation - Variable Arity, Decorators, Pipelines
|
|
3
|
+
*
|
|
4
|
+
* Design Principles:
|
|
5
|
+
* - Everything is a Procedure
|
|
6
|
+
* - Variable arity support (0, 1, N args)
|
|
7
|
+
* - Decorator = Function (same type)
|
|
8
|
+
* - Hooks are Procedures (@hook decorator)
|
|
9
|
+
* - Pipelines for middleware bundles
|
|
10
|
+
* - Direct calls (no registration)
|
|
11
|
+
* - Automatic tracking (execution graph, telemetry)
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { EventEmitter } from "node:events";
|
|
15
|
+
import { Context, isKernelContext } from "./context";
|
|
16
|
+
import { ExecutionTracker } from "./execution-tracker";
|
|
17
|
+
import { randomUUID } from "node:crypto";
|
|
18
|
+
import { ProcedureNode } from "./procedure-graph";
|
|
19
|
+
import { AbortError, ValidationError } from "@tentickle/shared";
|
|
20
|
+
import { EventBuffer } from "./event-buffer";
|
|
21
|
+
/**
|
|
22
|
+
* Create a ProcedurePromise from a regular Promise.
|
|
23
|
+
*
|
|
24
|
+
* Adds a `.result` property that chains through to the inner handle's result.
|
|
25
|
+
* If the resolved value has a `.result` property, `.result` resolves to that.
|
|
26
|
+
* Otherwise, `.result` resolves to the value itself.
|
|
27
|
+
*
|
|
28
|
+
* @param promise - The base promise to enhance
|
|
29
|
+
* @returns Enhanced ProcedurePromise with .result chaining
|
|
30
|
+
*/
|
|
31
|
+
export function createProcedurePromise(promise) {
|
|
32
|
+
const enhanced = promise;
|
|
33
|
+
Object.defineProperty(enhanced, "result", {
|
|
34
|
+
get() {
|
|
35
|
+
return promise.then((value) => {
|
|
36
|
+
// If the resolved value has a .result property, chain to it
|
|
37
|
+
if (value && typeof value === "object" && "result" in value) {
|
|
38
|
+
return value.result;
|
|
39
|
+
}
|
|
40
|
+
// Otherwise, return the value itself
|
|
41
|
+
return value;
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: false,
|
|
46
|
+
});
|
|
47
|
+
return enhanced;
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Symbol Branding
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Symbol used to brand Procedure objects for deterministic type checking.
|
|
54
|
+
* Using Symbol.for() ensures the same symbol across module instances.
|
|
55
|
+
*/
|
|
56
|
+
export const PROCEDURE_SYMBOL = Symbol.for("@tentickle/kernel.procedure");
|
|
57
|
+
/**
|
|
58
|
+
* Check if a value is a Procedure using Symbol branding.
|
|
59
|
+
*
|
|
60
|
+
* This is more reliable than duck typing because it uses a unique Symbol
|
|
61
|
+
* that can only be present on objects created by the procedure system.
|
|
62
|
+
*
|
|
63
|
+
* @param value - The value to check
|
|
64
|
+
* @returns True if the value is a branded Procedure
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const proc = createProcedure(async (x: number) => x * 2);
|
|
69
|
+
* isProcedure(proc); // true
|
|
70
|
+
* isProcedure(() => {}); // false
|
|
71
|
+
* isProcedure({ use: () => {} }); // false (duck typing would say true)
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export function isProcedure(value) {
|
|
75
|
+
return value != null && typeof value === "function" && PROCEDURE_SYMBOL in value;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Default implementation of ExecutionHandle.
|
|
79
|
+
*
|
|
80
|
+
* Creates a handle that wraps a result promise and event stream.
|
|
81
|
+
* Uses EventBuffer for dual consumption - multiple iterators can independently
|
|
82
|
+
* consume all events, and late subscribers receive replayed events.
|
|
83
|
+
*
|
|
84
|
+
* @typeParam TResult - The return type of the procedure
|
|
85
|
+
* @typeParam TEvent - The event type for streaming
|
|
86
|
+
*/
|
|
87
|
+
export class ExecutionHandleImpl {
|
|
88
|
+
result;
|
|
89
|
+
traceId;
|
|
90
|
+
_status = "running";
|
|
91
|
+
_abortController;
|
|
92
|
+
events;
|
|
93
|
+
constructor(result, events, traceId, abortController) {
|
|
94
|
+
this.result = result;
|
|
95
|
+
this.traceId = traceId;
|
|
96
|
+
this._abortController = abortController ?? new AbortController();
|
|
97
|
+
this.events = events;
|
|
98
|
+
// Update status when result settles
|
|
99
|
+
result.then(() => {
|
|
100
|
+
if (this._status === "running") {
|
|
101
|
+
this._status = "completed";
|
|
102
|
+
this.events.close();
|
|
103
|
+
}
|
|
104
|
+
}, (err) => {
|
|
105
|
+
if (this._status === "running") {
|
|
106
|
+
this._status = "error";
|
|
107
|
+
this.events.error(err instanceof Error ? err : new Error(String(err)));
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* @deprecated Use `events` instead. This getter exists for backwards compatibility.
|
|
113
|
+
*/
|
|
114
|
+
get eventBuffer() {
|
|
115
|
+
return this.events;
|
|
116
|
+
}
|
|
117
|
+
get status() {
|
|
118
|
+
return this._status;
|
|
119
|
+
}
|
|
120
|
+
abort(reason) {
|
|
121
|
+
if (this._status === "running") {
|
|
122
|
+
this._status = "aborted";
|
|
123
|
+
this._abortController.abort(reason);
|
|
124
|
+
this.events.close();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Push an event to the buffer.
|
|
129
|
+
* This is the primary way to emit events from procedure handlers.
|
|
130
|
+
*/
|
|
131
|
+
pushEvent(event) {
|
|
132
|
+
this.events.push(event);
|
|
133
|
+
}
|
|
134
|
+
// AsyncIterable implementation - delegates to EventBuffer for dual consumption
|
|
135
|
+
[Symbol.asyncIterator]() {
|
|
136
|
+
return this.events[Symbol.asyncIterator]();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a reusable middleware pipeline.
|
|
141
|
+
*
|
|
142
|
+
* Pipelines bundle multiple middleware together for reuse across procedures.
|
|
143
|
+
* They can be passed to `procedure.use()` just like individual middleware.
|
|
144
|
+
*
|
|
145
|
+
* @param middleware - Initial middleware to include in the pipeline
|
|
146
|
+
* @returns A new MiddlewarePipeline
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* // Create a pipeline with initial middleware
|
|
151
|
+
* const authPipeline = createPipeline([authMiddleware, rateLimitMiddleware]);
|
|
152
|
+
*
|
|
153
|
+
* // Or build it up with .use()
|
|
154
|
+
* const logPipeline = createPipeline()
|
|
155
|
+
* .use(requestLogging)
|
|
156
|
+
* .use(responseLogging);
|
|
157
|
+
*
|
|
158
|
+
* // Apply to procedures
|
|
159
|
+
* const proc = createProcedure(handler)
|
|
160
|
+
* .use(authPipeline)
|
|
161
|
+
* .use(logPipeline);
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @see {@link MiddlewarePipeline} - The pipeline interface
|
|
165
|
+
*/
|
|
166
|
+
export function createPipeline(middleware = []) {
|
|
167
|
+
const middlewares = [...middleware];
|
|
168
|
+
return {
|
|
169
|
+
use(...mw) {
|
|
170
|
+
middlewares.push(...mw);
|
|
171
|
+
return this;
|
|
172
|
+
},
|
|
173
|
+
getMiddleware() {
|
|
174
|
+
return middlewares;
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// Helper Functions
|
|
180
|
+
// ============================================================================
|
|
181
|
+
export function isAsyncIterable(obj) {
|
|
182
|
+
return obj && typeof obj[Symbol.asyncIterator] === "function";
|
|
183
|
+
}
|
|
184
|
+
function flattenMiddleware(middleware) {
|
|
185
|
+
const flattened = [];
|
|
186
|
+
for (const mw of middleware) {
|
|
187
|
+
if ("getMiddleware" in mw && typeof mw.getMiddleware === "function") {
|
|
188
|
+
flattened.push(...mw.getMiddleware());
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
flattened.push(mw);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return flattened;
|
|
195
|
+
}
|
|
196
|
+
class ProcedureImpl {
|
|
197
|
+
internalMiddlewares = [];
|
|
198
|
+
middlewares = [];
|
|
199
|
+
schema;
|
|
200
|
+
procedureName;
|
|
201
|
+
sourceType = "procedure";
|
|
202
|
+
sourceId;
|
|
203
|
+
handleFactory;
|
|
204
|
+
metadata; // For telemetry span attributes
|
|
205
|
+
handler;
|
|
206
|
+
timeout; // Timeout in milliseconds
|
|
207
|
+
skipTracking; // Skip ExecutionTracker for transparent wrappers
|
|
208
|
+
executionBoundary; // Execution boundary config (Phase 3)
|
|
209
|
+
executionType; // Explicit execution type (Phase 3)
|
|
210
|
+
constructor(options = {}, handler) {
|
|
211
|
+
this.procedureName = options.name;
|
|
212
|
+
this.schema = options.schema;
|
|
213
|
+
this.sourceType = options.sourceType || "procedure";
|
|
214
|
+
this.sourceId = options.sourceId;
|
|
215
|
+
this.handleFactory = options.handleFactory;
|
|
216
|
+
this.metadata = options.metadata; // Store metadata for telemetry
|
|
217
|
+
this.timeout = options.timeout; // Store timeout
|
|
218
|
+
this.skipTracking = options.skipTracking; // Store skipTracking flag
|
|
219
|
+
this.executionBoundary = options.executionBoundary; // Execution boundary config (Phase 3)
|
|
220
|
+
this.executionType = options.executionType; // Explicit execution type (Phase 3)
|
|
221
|
+
if (options.middleware) {
|
|
222
|
+
this.middlewares = flattenMiddleware(options.middleware);
|
|
223
|
+
}
|
|
224
|
+
// Adapt Procedure middleware to internal middleware format
|
|
225
|
+
for (const mw of this.middlewares) {
|
|
226
|
+
const adaptedMw = async (args, ctx, nextFn) => {
|
|
227
|
+
const envelope = {
|
|
228
|
+
sourceType: this.sourceType,
|
|
229
|
+
sourceId: this.sourceId,
|
|
230
|
+
operationName: this.procedureName || "anonymous",
|
|
231
|
+
args,
|
|
232
|
+
context: ctx,
|
|
233
|
+
};
|
|
234
|
+
return mw(args, envelope, async (transformedArgs) => {
|
|
235
|
+
return nextFn(transformedArgs);
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
this.internalMiddlewares.push(adaptedMw);
|
|
239
|
+
}
|
|
240
|
+
// Set handler if provided
|
|
241
|
+
if (handler) {
|
|
242
|
+
this.handler = handler;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Set the handler function. Returns a new Procedure with the handler set.
|
|
247
|
+
*/
|
|
248
|
+
setHandler(fn) {
|
|
249
|
+
return createProcedureFromImpl({
|
|
250
|
+
name: this.procedureName,
|
|
251
|
+
schema: this.schema,
|
|
252
|
+
middleware: this.middlewares,
|
|
253
|
+
handleFactory: this.handleFactory,
|
|
254
|
+
sourceType: this.sourceType,
|
|
255
|
+
sourceId: this.sourceId,
|
|
256
|
+
metadata: this.metadata, // Preserve metadata when setting new handler
|
|
257
|
+
// Preserve execution tracking options (Phase 3)
|
|
258
|
+
executionBoundary: this.executionBoundary,
|
|
259
|
+
executionType: this.executionType,
|
|
260
|
+
skipTracking: this.skipTracking,
|
|
261
|
+
timeout: this.timeout,
|
|
262
|
+
}, fn);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Internal execution method - runs middleware pipeline and handler.
|
|
266
|
+
*/
|
|
267
|
+
async runMiddlewarePipeline(args, context) {
|
|
268
|
+
if (!this.handler) {
|
|
269
|
+
throw new Error("Procedure handler not set. Call constructor with handler or use .setHandler() method.");
|
|
270
|
+
}
|
|
271
|
+
// Get context middleware at execution time (from Tentickle instance)
|
|
272
|
+
// This enables runtime middleware configuration that can differ per-app or per-request
|
|
273
|
+
const procedureName = this.procedureName || "anonymous";
|
|
274
|
+
const contextMiddleware = [];
|
|
275
|
+
if (context.middleware?.getMiddlewareFor) {
|
|
276
|
+
const externalMiddleware = context.middleware.getMiddlewareFor(procedureName);
|
|
277
|
+
for (const mw of externalMiddleware) {
|
|
278
|
+
// Adapt external middleware to internal format
|
|
279
|
+
const adaptedMw = async (mwArgs, ctx, nextFn) => {
|
|
280
|
+
const envelope = {
|
|
281
|
+
sourceType: this.sourceType,
|
|
282
|
+
sourceId: this.sourceId,
|
|
283
|
+
operationName: procedureName,
|
|
284
|
+
args: mwArgs,
|
|
285
|
+
context: ctx,
|
|
286
|
+
};
|
|
287
|
+
// Cast envelope to any[] version since external middleware uses Middleware<any[]>
|
|
288
|
+
return mw(mwArgs, envelope, async (transformedArgs) => {
|
|
289
|
+
return nextFn(transformedArgs);
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
contextMiddleware.push(adaptedMw);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Combine: context middleware runs first, then instance middleware
|
|
296
|
+
const allMiddleware = [...contextMiddleware, ...this.internalMiddlewares];
|
|
297
|
+
// Helper function to run the middleware pipeline
|
|
298
|
+
const executeMiddlewarePipeline = async () => {
|
|
299
|
+
// Check Abort Signal before starting
|
|
300
|
+
if (context?.signal?.aborted) {
|
|
301
|
+
throw new AbortError();
|
|
302
|
+
}
|
|
303
|
+
// Run Middleware Pipeline
|
|
304
|
+
let index = 0;
|
|
305
|
+
let currentInput = args;
|
|
306
|
+
const runMiddleware = async (transformedInput) => {
|
|
307
|
+
// Check Abort Signal before each middleware/handler
|
|
308
|
+
if (context?.signal?.aborted) {
|
|
309
|
+
throw new AbortError();
|
|
310
|
+
}
|
|
311
|
+
// Update current input if middleware provided transformed input
|
|
312
|
+
if (transformedInput !== undefined) {
|
|
313
|
+
currentInput = transformedInput;
|
|
314
|
+
}
|
|
315
|
+
if (index < allMiddleware.length) {
|
|
316
|
+
const middleware = allMiddleware[index++];
|
|
317
|
+
const result = await middleware(currentInput, context, runMiddleware);
|
|
318
|
+
// Check Abort Signal after middleware execution (middleware might have aborted)
|
|
319
|
+
if (context?.signal?.aborted) {
|
|
320
|
+
throw new AbortError();
|
|
321
|
+
}
|
|
322
|
+
return result;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// Check Abort Signal before handler
|
|
326
|
+
if (context?.signal?.aborted) {
|
|
327
|
+
throw new AbortError();
|
|
328
|
+
}
|
|
329
|
+
// Call handler with current input (which may have been transformed)
|
|
330
|
+
const result = this.handler(...currentInput);
|
|
331
|
+
// Handler can return anything - Promise.resolve handles Promise, value, or AsyncIterable
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
return runMiddleware();
|
|
336
|
+
};
|
|
337
|
+
// Skip ExecutionTracker for transparent wrappers (e.g., withContext)
|
|
338
|
+
// This prevents duplicate procedure tracking when a wrapper delegates to another procedure
|
|
339
|
+
if (this.skipTracking) {
|
|
340
|
+
return executeMiddlewarePipeline();
|
|
341
|
+
}
|
|
342
|
+
// Wrap execution with ExecutionTracker
|
|
343
|
+
return ExecutionTracker.track(context, {
|
|
344
|
+
name: this.procedureName || `procedure:${this.handler.name || "anonymous"}`,
|
|
345
|
+
parentPid: context.procedurePid,
|
|
346
|
+
metadata: this.metadata, // Pass metadata to ExecutionTracker for span attributes
|
|
347
|
+
// Execution boundary configuration (Phase 3)
|
|
348
|
+
executionBoundary: this.executionBoundary,
|
|
349
|
+
executionType: this.executionType,
|
|
350
|
+
}, async (_node) => {
|
|
351
|
+
return executeMiddlewarePipeline();
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Internal execution method.
|
|
356
|
+
*/
|
|
357
|
+
async execute(args, options, opEvents) {
|
|
358
|
+
if (!this.handler) {
|
|
359
|
+
throw ValidationError.required("handler", "Procedure handler not set. Call constructor with handler or use .setHandler() method.");
|
|
360
|
+
}
|
|
361
|
+
// Validate input if schema provided
|
|
362
|
+
let validatedArgs = args;
|
|
363
|
+
if (this.schema && args.length > 0) {
|
|
364
|
+
const validated = await this.schema.parseAsync(args[0]);
|
|
365
|
+
validatedArgs = [validated, ...args.slice(1)];
|
|
366
|
+
}
|
|
367
|
+
// Resolve context: either create new root or derive child from current
|
|
368
|
+
let context;
|
|
369
|
+
const currentContext = Context.tryGet();
|
|
370
|
+
// Detect if we have "real" context overrides (not just signal/traceId from createHandle)
|
|
371
|
+
const hasRealOverrides = options &&
|
|
372
|
+
Object.keys(options).some((k) => k !== "signal" && k !== "traceId" && k !== "events");
|
|
373
|
+
if (!currentContext) {
|
|
374
|
+
// No existing context - create a new root context
|
|
375
|
+
context = Context.create(options);
|
|
376
|
+
// If opEvents was provided, use it instead of the auto-created events emitter
|
|
377
|
+
// (Context.create always creates a new EventEmitter, we need to override it)
|
|
378
|
+
if (opEvents) {
|
|
379
|
+
context.events = opEvents;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
else if (hasRealOverrides) {
|
|
383
|
+
// Existing context with meaningful overrides - create a child context
|
|
384
|
+
// This ensures we don't mutate the parent's context object
|
|
385
|
+
context = Context.child({
|
|
386
|
+
...options,
|
|
387
|
+
events: opEvents ?? options?.events ?? currentContext.events,
|
|
388
|
+
channels: options?.channels ?? currentContext.channels,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
// Existing context, no meaningful overrides - reuse as-is
|
|
393
|
+
// This preserves procedureGraph sharing with parent context
|
|
394
|
+
context = currentContext;
|
|
395
|
+
}
|
|
396
|
+
// Create handle if handleFactory is provided and handle doesn't exist
|
|
397
|
+
if (this.handleFactory && !context.executionHandle) {
|
|
398
|
+
const events = new EventBuffer();
|
|
399
|
+
const traceId = context.traceId || randomUUID();
|
|
400
|
+
const resultPromise = Promise.resolve();
|
|
401
|
+
// Only call handleFactory if it's a function, otherwise use default implementation
|
|
402
|
+
const handle = typeof this.handleFactory === "function"
|
|
403
|
+
? this.handleFactory(events, traceId, resultPromise, context)
|
|
404
|
+
: new ExecutionHandleImpl(resultPromise, events, traceId);
|
|
405
|
+
context.executionHandle = handle;
|
|
406
|
+
}
|
|
407
|
+
const currentStore = Context.tryGet();
|
|
408
|
+
const isRoot = context !== currentStore;
|
|
409
|
+
const executeInternal = async () => {
|
|
410
|
+
let result;
|
|
411
|
+
if (isRoot) {
|
|
412
|
+
result = await Context.run(context, async () => this.runMiddlewarePipeline(validatedArgs, context));
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
result = await this.runMiddlewarePipeline(validatedArgs, context);
|
|
416
|
+
}
|
|
417
|
+
// AsyncIterables are now fully handled by ExecutionTracker (context, procedure:end/error)
|
|
418
|
+
// No additional wrapping needed here - just return the result
|
|
419
|
+
// ExecutionTracker wraps AsyncIterables to:
|
|
420
|
+
// 1. Maintain the forked context with procedurePid during iteration
|
|
421
|
+
// 2. Emit procedure:end when iteration completes
|
|
422
|
+
// 3. Emit procedure:error on errors
|
|
423
|
+
return result;
|
|
424
|
+
};
|
|
425
|
+
// Apply timeout if configured
|
|
426
|
+
if (this.timeout && this.timeout > 0) {
|
|
427
|
+
return this.withTimeoutRace(executeInternal(), this.timeout);
|
|
428
|
+
}
|
|
429
|
+
return executeInternal();
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Race execution against a timeout.
|
|
433
|
+
*/
|
|
434
|
+
async withTimeoutRace(promise, timeoutMs) {
|
|
435
|
+
let timeoutId;
|
|
436
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
437
|
+
timeoutId = setTimeout(() => {
|
|
438
|
+
reject(AbortError.timeout(timeoutMs));
|
|
439
|
+
}, timeoutMs);
|
|
440
|
+
});
|
|
441
|
+
try {
|
|
442
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
clearTimeout(timeoutId);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Execute the procedure and return a ProcedurePromise.
|
|
450
|
+
*
|
|
451
|
+
* All procedures return ProcedurePromise<T> consistently:
|
|
452
|
+
* - `await proc()` → T (the value or handle)
|
|
453
|
+
* - `await proc().result` → final result (chains to T.result if exists)
|
|
454
|
+
*
|
|
455
|
+
* By default, procedures are PASS-THROUGH:
|
|
456
|
+
* - T is whatever the handler returns
|
|
457
|
+
* - If handler returns something with .result, proc().result chains to it
|
|
458
|
+
*
|
|
459
|
+
* To wrap in ExecutionHandle, provide a handleFactory:
|
|
460
|
+
* - T is ExecutionHandle<HandlerReturn>
|
|
461
|
+
* - handle.result is the handler's return value
|
|
462
|
+
*/
|
|
463
|
+
exec(...args) {
|
|
464
|
+
// If handleFactory is a function or true, use handle wrapping
|
|
465
|
+
if (typeof this.handleFactory === "function" || this.handleFactory === true) {
|
|
466
|
+
return this.executeWithHandle(args);
|
|
467
|
+
}
|
|
468
|
+
// Default: pass-through mode (handleFactory: false or undefined)
|
|
469
|
+
return this.executePassThrough(args);
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Execute in pass-through mode - returns ProcedurePromise<T>.
|
|
473
|
+
* Used when handleFactory: false.
|
|
474
|
+
*
|
|
475
|
+
* Always returns ProcedurePromise for consistency, even when there's no middleware.
|
|
476
|
+
* This ensures `await proc()` and `await proc().result` always work predictably.
|
|
477
|
+
*/
|
|
478
|
+
executePassThrough(args) {
|
|
479
|
+
const promise = (async () => {
|
|
480
|
+
// Validate if schema provided
|
|
481
|
+
let validatedArgs = args;
|
|
482
|
+
if (this.schema && args.length > 0) {
|
|
483
|
+
const validated = await this.schema.parseAsync(args[0]);
|
|
484
|
+
validatedArgs = [validated, ...args.slice(1)];
|
|
485
|
+
}
|
|
486
|
+
// If no middleware and no timeout, call handler directly
|
|
487
|
+
// But still check abort signal first
|
|
488
|
+
if (this.middlewares.length === 0 && !this.timeout) {
|
|
489
|
+
const ctx = Context.tryGet();
|
|
490
|
+
if (ctx?.signal?.aborted) {
|
|
491
|
+
throw new AbortError();
|
|
492
|
+
}
|
|
493
|
+
return this.handler(...validatedArgs);
|
|
494
|
+
}
|
|
495
|
+
// Otherwise go through the middleware chain
|
|
496
|
+
return this.execute(validatedArgs);
|
|
497
|
+
})();
|
|
498
|
+
return createProcedurePromise(promise);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Execute with handle wrapping - returns ProcedurePromise<ExecutionHandle<T>>.
|
|
502
|
+
* Used when handleFactory is provided (not false).
|
|
503
|
+
*/
|
|
504
|
+
executeWithHandle(args) {
|
|
505
|
+
const handle = this.createHandle(args);
|
|
506
|
+
// Wrap the synchronously-created handle in a ProcedurePromise
|
|
507
|
+
return createProcedurePromise(Promise.resolve(handle));
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Create an ExecutionHandle for the given args.
|
|
511
|
+
* This is the core method that creates the handle and starts execution.
|
|
512
|
+
*/
|
|
513
|
+
createHandle(args) {
|
|
514
|
+
const events = new EventBuffer();
|
|
515
|
+
const traceId = Context.tryGet()?.traceId || randomUUID();
|
|
516
|
+
const abortController = new AbortController();
|
|
517
|
+
// Create the result promise that will resolve when execution completes
|
|
518
|
+
const resultPromise = (async () => {
|
|
519
|
+
// Validate input if schema provided
|
|
520
|
+
let validatedArgs = args;
|
|
521
|
+
if (this.schema && args.length > 0) {
|
|
522
|
+
const validated = await this.schema.parseAsync(args[0]);
|
|
523
|
+
validatedArgs = [validated, ...args.slice(1)];
|
|
524
|
+
}
|
|
525
|
+
// Execute with the events buffer - it has EventEmitter-compatible API
|
|
526
|
+
return this.execute(validatedArgs, { signal: abortController.signal, traceId }, events);
|
|
527
|
+
})();
|
|
528
|
+
// Create handle using factory or default implementation
|
|
529
|
+
if (this.handleFactory && typeof this.handleFactory === "function") {
|
|
530
|
+
const context = Context.tryGet() || Context.create({ traceId });
|
|
531
|
+
return this.handleFactory(events, traceId, resultPromise, context, abortController);
|
|
532
|
+
}
|
|
533
|
+
return new ExecutionHandleImpl(resultPromise, events, traceId, abortController);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Add middleware to the procedure. Returns a new Procedure.
|
|
537
|
+
*/
|
|
538
|
+
use(...middleware) {
|
|
539
|
+
const flattened = flattenMiddleware(middleware);
|
|
540
|
+
return createProcedureFromImpl({
|
|
541
|
+
name: this.procedureName,
|
|
542
|
+
schema: this.schema,
|
|
543
|
+
middleware: [...this.middlewares, ...flattened],
|
|
544
|
+
handleFactory: this.handleFactory,
|
|
545
|
+
sourceType: this.sourceType,
|
|
546
|
+
sourceId: this.sourceId,
|
|
547
|
+
metadata: this.metadata, // Preserve metadata when adding middleware
|
|
548
|
+
// Preserve execution tracking options (Phase 3)
|
|
549
|
+
executionBoundary: this.executionBoundary,
|
|
550
|
+
executionType: this.executionType,
|
|
551
|
+
skipTracking: this.skipTracking,
|
|
552
|
+
timeout: this.timeout,
|
|
553
|
+
}, this.handler);
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Create a procedure variant with merged context. Returns a new Procedure.
|
|
557
|
+
*
|
|
558
|
+
* IMPORTANT: This does NOT copy middleware to the new procedure. The middleware
|
|
559
|
+
* runs when proc.execute() is called in the wrapped handler. Copying middleware
|
|
560
|
+
* would cause double execution since execute() runs its own middleware chain.
|
|
561
|
+
*/
|
|
562
|
+
withContext(ctx) {
|
|
563
|
+
const proc = this;
|
|
564
|
+
// Create a wrapper that merges context BEFORE execution
|
|
565
|
+
const wrappedHandler = (async (...args) => {
|
|
566
|
+
// Get current context and merge
|
|
567
|
+
// Note: Signal should come from ExecutionHandle, not Context inheritance
|
|
568
|
+
// Context signal is only for external aborts (e.g., user-provided), not execution lifecycle
|
|
569
|
+
const currentCtx = Context.tryGet() || Context.create();
|
|
570
|
+
const mergedCtx = { ...currentCtx, ...ctx };
|
|
571
|
+
// Run with merged context - this ensures middleware sees the merged context
|
|
572
|
+
return Context.run(mergedCtx, async () => {
|
|
573
|
+
// Call the original procedure's execute method with merged context as options
|
|
574
|
+
// This ensures the merged context is used throughout execution
|
|
575
|
+
return proc.execute(args, ctx);
|
|
576
|
+
});
|
|
577
|
+
});
|
|
578
|
+
// Don't copy middleware here! The original proc.execute() will run its middleware.
|
|
579
|
+
// Copying middleware would cause double execution.
|
|
580
|
+
// Skip tracking for this wrapper - the inner proc.execute() will handle tracking.
|
|
581
|
+
return createProcedureFromImpl({
|
|
582
|
+
name: this.procedureName,
|
|
583
|
+
schema: this.schema,
|
|
584
|
+
middleware: [], // Empty - middleware runs in proc.execute()
|
|
585
|
+
handleFactory: this.handleFactory,
|
|
586
|
+
sourceType: this.sourceType,
|
|
587
|
+
sourceId: this.sourceId,
|
|
588
|
+
metadata: this.metadata, // Preserve metadata for telemetry
|
|
589
|
+
skipTracking: true, // Wrapper delegates to original - don't double-track
|
|
590
|
+
}, wrappedHandler);
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Add a single middleware. Returns a new Procedure.
|
|
594
|
+
*/
|
|
595
|
+
withMiddleware(mw) {
|
|
596
|
+
return this.use(mw);
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Create a procedure variant with a timeout. Returns a new Procedure.
|
|
600
|
+
* Throws AbortError.timeout() if the timeout is exceeded.
|
|
601
|
+
*
|
|
602
|
+
* @param ms - Timeout in milliseconds
|
|
603
|
+
*/
|
|
604
|
+
withTimeout(ms) {
|
|
605
|
+
return createProcedureFromImpl({
|
|
606
|
+
name: this.procedureName,
|
|
607
|
+
schema: this.schema,
|
|
608
|
+
middleware: this.middlewares,
|
|
609
|
+
handleFactory: this.handleFactory,
|
|
610
|
+
sourceType: this.sourceType,
|
|
611
|
+
sourceId: this.sourceId,
|
|
612
|
+
metadata: this.metadata,
|
|
613
|
+
timeout: ms,
|
|
614
|
+
// Preserve execution tracking options (Phase 3)
|
|
615
|
+
executionBoundary: this.executionBoundary,
|
|
616
|
+
executionType: this.executionType,
|
|
617
|
+
skipTracking: this.skipTracking,
|
|
618
|
+
}, this.handler);
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Create a procedure variant with merged metadata. Returns a new Procedure.
|
|
622
|
+
* Metadata flows to ExecutionTracker and is included in procedure events and telemetry spans.
|
|
623
|
+
*
|
|
624
|
+
* @param metadata - Metadata to merge with existing procedure metadata
|
|
625
|
+
*/
|
|
626
|
+
withMetadata(metadata) {
|
|
627
|
+
return createProcedureFromImpl({
|
|
628
|
+
name: this.procedureName,
|
|
629
|
+
schema: this.schema,
|
|
630
|
+
middleware: this.middlewares,
|
|
631
|
+
handleFactory: this.handleFactory,
|
|
632
|
+
sourceType: this.sourceType,
|
|
633
|
+
sourceId: this.sourceId,
|
|
634
|
+
// Merge metadata - new values override existing
|
|
635
|
+
metadata: { ...this.metadata, ...metadata },
|
|
636
|
+
timeout: this.timeout,
|
|
637
|
+
// Preserve execution tracking options (Phase 3)
|
|
638
|
+
executionBoundary: this.executionBoundary,
|
|
639
|
+
executionType: this.executionType,
|
|
640
|
+
skipTracking: this.skipTracking,
|
|
641
|
+
}, this.handler);
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Pipe the output of this procedure to another procedure.
|
|
645
|
+
* Creates a new procedure that runs this procedure, then passes its result to the next.
|
|
646
|
+
*/
|
|
647
|
+
pipe(next) {
|
|
648
|
+
const self = this;
|
|
649
|
+
const pipedHandler = async (...args) => {
|
|
650
|
+
const firstResult = await self.execute(args);
|
|
651
|
+
const secondResult = await next(firstResult);
|
|
652
|
+
return secondResult;
|
|
653
|
+
};
|
|
654
|
+
return createProcedureFromImpl({
|
|
655
|
+
name: this.procedureName ? `${this.procedureName}.pipe` : "piped-procedure",
|
|
656
|
+
sourceType: this.sourceType,
|
|
657
|
+
sourceId: this.sourceId,
|
|
658
|
+
metadata: this.metadata,
|
|
659
|
+
timeout: this.timeout,
|
|
660
|
+
}, pipedHandler);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
function createProcedureFromImpl(options, handler) {
|
|
664
|
+
const impl = new ProcedureImpl(options, handler);
|
|
665
|
+
// Create a callable function
|
|
666
|
+
const proc = (...args) => {
|
|
667
|
+
// Support context as last arg (backward compat)
|
|
668
|
+
let actualArgs;
|
|
669
|
+
if (args.length > 0) {
|
|
670
|
+
const lastArg = args[args.length - 1];
|
|
671
|
+
// Check if last arg is a KernelContext
|
|
672
|
+
if (isKernelContext(lastArg)) {
|
|
673
|
+
actualArgs = args.slice(0, -1);
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
actualArgs = args;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
actualArgs = args;
|
|
681
|
+
}
|
|
682
|
+
// Return result directly (pass-through) or ExecutionHandle
|
|
683
|
+
return impl.exec(...actualArgs);
|
|
684
|
+
};
|
|
685
|
+
// Attach methods - same for both Procedure with handle return and Pass-through return Procedure
|
|
686
|
+
proc.use = impl.use.bind(impl);
|
|
687
|
+
proc.withContext = impl.withContext.bind(impl);
|
|
688
|
+
proc.withMiddleware = impl.withMiddleware.bind(impl);
|
|
689
|
+
proc.withTimeout = impl.withTimeout.bind(impl);
|
|
690
|
+
proc.withMetadata = impl.withMetadata.bind(impl);
|
|
691
|
+
proc.exec = impl.exec.bind(impl);
|
|
692
|
+
proc.pipe = impl.pipe.bind(impl);
|
|
693
|
+
// Brand with symbol for deterministic type checking
|
|
694
|
+
proc[PROCEDURE_SYMBOL] = true;
|
|
695
|
+
return proc;
|
|
696
|
+
}
|
|
697
|
+
export function generatorProcedure(optionsOrFn, fn) {
|
|
698
|
+
if (typeof optionsOrFn === "function") {
|
|
699
|
+
fn = optionsOrFn;
|
|
700
|
+
}
|
|
701
|
+
return createProcedure(function (...args) {
|
|
702
|
+
if (!fn) {
|
|
703
|
+
throw ValidationError.required("handler", "Handler function required when options are provided");
|
|
704
|
+
}
|
|
705
|
+
return fn.apply(this, args);
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
// Implementation
|
|
709
|
+
export function createProcedure(optionsOrFn, fn) {
|
|
710
|
+
let options = {};
|
|
711
|
+
let handler;
|
|
712
|
+
if (typeof optionsOrFn === "function") {
|
|
713
|
+
handler = optionsOrFn;
|
|
714
|
+
options = { sourceType: "procedure" };
|
|
715
|
+
}
|
|
716
|
+
else if (optionsOrFn) {
|
|
717
|
+
options = { ...optionsOrFn, sourceType: "procedure" };
|
|
718
|
+
if (!fn) {
|
|
719
|
+
throw ValidationError.required("handler", "Handler function required when options are provided");
|
|
720
|
+
}
|
|
721
|
+
handler = fn;
|
|
722
|
+
}
|
|
723
|
+
else if (fn) {
|
|
724
|
+
handler = fn;
|
|
725
|
+
options = { sourceType: "procedure" };
|
|
726
|
+
}
|
|
727
|
+
if (!handler) {
|
|
728
|
+
throw ValidationError.required("handler");
|
|
729
|
+
}
|
|
730
|
+
return createProcedureFromImpl(options, handler);
|
|
731
|
+
}
|
|
732
|
+
export function pipe(...procedures) {
|
|
733
|
+
if (procedures.length === 0) {
|
|
734
|
+
throw new ValidationError("pipe requires at least one procedure", "procedures");
|
|
735
|
+
}
|
|
736
|
+
if (procedures.length === 1) {
|
|
737
|
+
return procedures[0];
|
|
738
|
+
}
|
|
739
|
+
// Chain all procedures together using the instance pipe method
|
|
740
|
+
let result = procedures[0];
|
|
741
|
+
for (let i = 1; i < procedures.length; i++) {
|
|
742
|
+
result = result.pipe(procedures[i]);
|
|
743
|
+
}
|
|
744
|
+
return result;
|
|
745
|
+
}
|
|
746
|
+
export function compose(...procedures) {
|
|
747
|
+
if (procedures.length === 0) {
|
|
748
|
+
throw new ValidationError("compose requires at least one procedure", "procedures");
|
|
749
|
+
}
|
|
750
|
+
if (procedures.length === 1) {
|
|
751
|
+
return procedures[0];
|
|
752
|
+
}
|
|
753
|
+
// Chain in reverse order: compose(a, b, c) = a(b(c(x)))
|
|
754
|
+
// Start from the end and work backwards
|
|
755
|
+
let result = procedures[procedures.length - 1];
|
|
756
|
+
for (let i = procedures.length - 2; i >= 0; i--) {
|
|
757
|
+
result = result.pipe(procedures[i]);
|
|
758
|
+
}
|
|
759
|
+
return result;
|
|
760
|
+
}
|
|
761
|
+
export function createHook(optionsOrFn, fn) {
|
|
762
|
+
let options = {};
|
|
763
|
+
let handler;
|
|
764
|
+
if (typeof optionsOrFn === "function") {
|
|
765
|
+
handler = optionsOrFn;
|
|
766
|
+
options = { sourceType: "hook" };
|
|
767
|
+
}
|
|
768
|
+
else if (optionsOrFn) {
|
|
769
|
+
options = { ...optionsOrFn, sourceType: "hook" };
|
|
770
|
+
if (!fn) {
|
|
771
|
+
throw ValidationError.required("handler", "Handler function required when options are provided");
|
|
772
|
+
}
|
|
773
|
+
handler = fn;
|
|
774
|
+
}
|
|
775
|
+
else if (fn) {
|
|
776
|
+
handler = fn;
|
|
777
|
+
options = { sourceType: "hook" };
|
|
778
|
+
}
|
|
779
|
+
if (!handler) {
|
|
780
|
+
throw ValidationError.required("handler");
|
|
781
|
+
}
|
|
782
|
+
return createProcedure(options, handler);
|
|
783
|
+
}
|
|
784
|
+
// ============================================================================
|
|
785
|
+
// ProcedureBase - Base class for auto-wrapping methods as Procedures
|
|
786
|
+
// ============================================================================
|
|
787
|
+
// ============================================================================
|
|
788
|
+
// Helper Functions
|
|
789
|
+
// ============================================================================
|
|
790
|
+
/**
|
|
791
|
+
* Type-safe helper to apply middleware to a Procedure while preserving types.
|
|
792
|
+
*
|
|
793
|
+
* This helper ensures that middleware types are correctly matched to the Procedure's
|
|
794
|
+
* argument types, avoiding the need for type assertions.
|
|
795
|
+
*
|
|
796
|
+
* @example
|
|
797
|
+
* ```typescript
|
|
798
|
+
* const proc = createProcedure({ name: 'test' }, async (input: string) => input);
|
|
799
|
+
* const middleware: Middleware<[string]>[] = [...];
|
|
800
|
+
* const procWithMw = applyMiddleware(proc, middleware);
|
|
801
|
+
* // procWithMw is still Procedure<[string], string> - types preserved!
|
|
802
|
+
* ```
|
|
803
|
+
*/
|
|
804
|
+
export function applyMiddleware(procedure, ...middleware) {
|
|
805
|
+
return procedure.use(...middleware);
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Type-safe helper to apply middleware from a registry/hook system.
|
|
809
|
+
*
|
|
810
|
+
* This is useful when middleware comes from hook registries where types might
|
|
811
|
+
* be unions or `Middleware<any[]>`. The helper ensures type safety by requiring
|
|
812
|
+
* the middleware to match the Procedure's argument types.
|
|
813
|
+
*
|
|
814
|
+
* @example
|
|
815
|
+
* ```typescript
|
|
816
|
+
* const proc = createProcedure({ name: 'test' }, async (input: string) => input);
|
|
817
|
+
* const registryMiddleware = registry.getMiddleware('test'); // Middleware<any[]>[]
|
|
818
|
+
* const procWithMw = applyRegistryMiddleware(proc, registryMiddleware);
|
|
819
|
+
* // Types are preserved and validated
|
|
820
|
+
* ```
|
|
821
|
+
*/
|
|
822
|
+
export function applyRegistryMiddleware(procedure, ...middleware) {
|
|
823
|
+
// Type assertion is safe here because we're applying middleware that should
|
|
824
|
+
// be compatible with the Procedure's args. The runtime will validate.
|
|
825
|
+
// We accept Procedure<any, any> to handle cases where createEngineProcedure
|
|
826
|
+
// returns a generic Procedure type that needs to be narrowed.
|
|
827
|
+
return procedure.use(...middleware);
|
|
828
|
+
}
|
|
829
|
+
export function wrapProcedure(middleware) {
|
|
830
|
+
function wrapProcedureImpl(optionsOrFn, fn) {
|
|
831
|
+
let config;
|
|
832
|
+
let handler;
|
|
833
|
+
if (typeof optionsOrFn === "function") {
|
|
834
|
+
// Handler-only overload: createEngineProcedure(handler)
|
|
835
|
+
handler = optionsOrFn;
|
|
836
|
+
config = {
|
|
837
|
+
name: handler.name || "anonymous",
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
else if (optionsOrFn) {
|
|
841
|
+
// Config + handler overload: createEngineProcedure(config, handler)
|
|
842
|
+
config = { ...optionsOrFn };
|
|
843
|
+
if (!fn) {
|
|
844
|
+
throw ValidationError.required("handler", "Handler function required when options are provided");
|
|
845
|
+
}
|
|
846
|
+
handler = fn;
|
|
847
|
+
}
|
|
848
|
+
else if (fn) {
|
|
849
|
+
// Edge case: just handler as second param
|
|
850
|
+
handler = fn;
|
|
851
|
+
config = {
|
|
852
|
+
name: handler.name || "anonymous",
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
throw ValidationError.required("handler");
|
|
857
|
+
}
|
|
858
|
+
// Merge middleware: engine defaults + global + config middleware
|
|
859
|
+
config.middleware = [...middleware, ...(config.middleware || [])];
|
|
860
|
+
return createProcedure(config, handler);
|
|
861
|
+
}
|
|
862
|
+
return wrapProcedureImpl;
|
|
863
|
+
}
|
|
864
|
+
export function wrapHook(middleware) {
|
|
865
|
+
function wrapHookImpl(optionsOrFn, fn) {
|
|
866
|
+
let config;
|
|
867
|
+
let handler;
|
|
868
|
+
if (typeof optionsOrFn === "function") {
|
|
869
|
+
// Handler-only overload: createEngineHook(handler)
|
|
870
|
+
handler = optionsOrFn;
|
|
871
|
+
config = {
|
|
872
|
+
name: handler.name || "anonymous",
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
else if (optionsOrFn) {
|
|
876
|
+
// Config + handler overload: createEngineHook(config, handler)
|
|
877
|
+
config = { ...optionsOrFn };
|
|
878
|
+
if (!fn) {
|
|
879
|
+
throw ValidationError.required("handler", "Handler function required when options are provided");
|
|
880
|
+
}
|
|
881
|
+
handler = fn;
|
|
882
|
+
}
|
|
883
|
+
else if (fn) {
|
|
884
|
+
// Edge case: just handler as second param
|
|
885
|
+
handler = fn;
|
|
886
|
+
config = {
|
|
887
|
+
name: handler.name || "anonymous",
|
|
888
|
+
};
|
|
889
|
+
}
|
|
890
|
+
else {
|
|
891
|
+
throw ValidationError.required("handler");
|
|
892
|
+
}
|
|
893
|
+
// Merge middleware: engine defaults + global + config middleware
|
|
894
|
+
config.middleware = [...middleware, ...(config.middleware || [])];
|
|
895
|
+
return createHook(config, handler);
|
|
896
|
+
}
|
|
897
|
+
return wrapHookImpl;
|
|
898
|
+
}
|
|
899
|
+
//# sourceMappingURL=procedure.js.map
|