@methodts/runtime 0.1.0
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/dist/__fixtures__/executor-fixtures.d.ts +10 -0
- package/dist/__fixtures__/executor-fixtures.d.ts.map +1 -0
- package/dist/__fixtures__/executor-fixtures.js +36 -0
- package/dist/__fixtures__/executor-fixtures.js.map +1 -0
- package/dist/architecture.test.d.ts +2 -0
- package/dist/architecture.test.d.ts.map +1 -0
- package/dist/architecture.test.js +143 -0
- package/dist/architecture.test.js.map +1 -0
- package/dist/config/cost-governor-config.d.ts +40 -0
- package/dist/config/cost-governor-config.d.ts.map +1 -0
- package/dist/config/cost-governor-config.js +48 -0
- package/dist/config/cost-governor-config.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/sessions-config.d.ts +29 -0
- package/dist/config/sessions-config.d.ts.map +1 -0
- package/dist/config/sessions-config.js +37 -0
- package/dist/config/sessions-config.js.map +1 -0
- package/dist/config/strategies-config.d.ts +38 -0
- package/dist/config/strategies-config.d.ts.map +1 -0
- package/dist/config/strategies-config.js +41 -0
- package/dist/config/strategies-config.js.map +1 -0
- package/dist/cost-governor/backpressure-queue.d.ts +20 -0
- package/dist/cost-governor/backpressure-queue.d.ts.map +1 -0
- package/dist/cost-governor/backpressure-queue.js +78 -0
- package/dist/cost-governor/backpressure-queue.js.map +1 -0
- package/dist/cost-governor/backpressure-queue.test.d.ts +2 -0
- package/dist/cost-governor/backpressure-queue.test.d.ts.map +1 -0
- package/dist/cost-governor/backpressure-queue.test.js +48 -0
- package/dist/cost-governor/backpressure-queue.test.js.map +1 -0
- package/dist/cost-governor/cost-events.d.ts +65 -0
- package/dist/cost-governor/cost-events.d.ts.map +1 -0
- package/dist/cost-governor/cost-events.js +48 -0
- package/dist/cost-governor/cost-events.js.map +1 -0
- package/dist/cost-governor/cost-governor-app-id.test.d.ts +19 -0
- package/dist/cost-governor/cost-governor-app-id.test.d.ts.map +1 -0
- package/dist/cost-governor/cost-governor-app-id.test.js +201 -0
- package/dist/cost-governor/cost-governor-app-id.test.js.map +1 -0
- package/dist/cost-governor/cost-oracle-impl.d.ts +19 -0
- package/dist/cost-governor/cost-oracle-impl.d.ts.map +1 -0
- package/dist/cost-governor/cost-oracle-impl.js +52 -0
- package/dist/cost-governor/cost-oracle-impl.js.map +1 -0
- package/dist/cost-governor/estimator.d.ts +22 -0
- package/dist/cost-governor/estimator.d.ts.map +1 -0
- package/dist/cost-governor/estimator.js +119 -0
- package/dist/cost-governor/estimator.js.map +1 -0
- package/dist/cost-governor/estimator.test.d.ts +2 -0
- package/dist/cost-governor/estimator.test.d.ts.map +1 -0
- package/dist/cost-governor/estimator.test.js +141 -0
- package/dist/cost-governor/estimator.test.js.map +1 -0
- package/dist/cost-governor/index.d.ts +75 -0
- package/dist/cost-governor/index.d.ts.map +1 -0
- package/dist/cost-governor/index.js +120 -0
- package/dist/cost-governor/index.js.map +1 -0
- package/dist/cost-governor/observations-store.d.ts +49 -0
- package/dist/cost-governor/observations-store.d.ts.map +1 -0
- package/dist/cost-governor/observations-store.js +179 -0
- package/dist/cost-governor/observations-store.js.map +1 -0
- package/dist/cost-governor/observations-store.test.d.ts +2 -0
- package/dist/cost-governor/observations-store.test.d.ts.map +1 -0
- package/dist/cost-governor/observations-store.test.js +191 -0
- package/dist/cost-governor/observations-store.test.js.map +1 -0
- package/dist/cost-governor/percentile.d.ts +17 -0
- package/dist/cost-governor/percentile.d.ts.map +1 -0
- package/dist/cost-governor/percentile.js +33 -0
- package/dist/cost-governor/percentile.js.map +1 -0
- package/dist/cost-governor/percentile.test.d.ts +2 -0
- package/dist/cost-governor/percentile.test.d.ts.map +1 -0
- package/dist/cost-governor/percentile.test.js +46 -0
- package/dist/cost-governor/percentile.test.js.map +1 -0
- package/dist/cost-governor/rate-governor-impl.d.ts +73 -0
- package/dist/cost-governor/rate-governor-impl.d.ts.map +1 -0
- package/dist/cost-governor/rate-governor-impl.js +148 -0
- package/dist/cost-governor/rate-governor-impl.js.map +1 -0
- package/dist/cost-governor/signature-builder.d.ts +22 -0
- package/dist/cost-governor/signature-builder.d.ts.map +1 -0
- package/dist/cost-governor/signature-builder.js +43 -0
- package/dist/cost-governor/signature-builder.js.map +1 -0
- package/dist/cost-governor/signature-builder.test.d.ts +2 -0
- package/dist/cost-governor/signature-builder.test.d.ts.map +1 -0
- package/dist/cost-governor/signature-builder.test.js +58 -0
- package/dist/cost-governor/signature-builder.test.js.map +1 -0
- package/dist/cost-governor/token-bucket.d.ts +57 -0
- package/dist/cost-governor/token-bucket.d.ts.map +1 -0
- package/dist/cost-governor/token-bucket.js +109 -0
- package/dist/cost-governor/token-bucket.js.map +1 -0
- package/dist/cost-governor/token-bucket.test.d.ts +2 -0
- package/dist/cost-governor/token-bucket.test.d.ts.map +1 -0
- package/dist/cost-governor/token-bucket.test.js +67 -0
- package/dist/cost-governor/token-bucket.test.js.map +1 -0
- package/dist/dlq/cortex-dlq-observer.d.ts +22 -0
- package/dist/dlq/cortex-dlq-observer.d.ts.map +1 -0
- package/dist/dlq/cortex-dlq-observer.js +29 -0
- package/dist/dlq/cortex-dlq-observer.js.map +1 -0
- package/dist/dlq/dlq-observer.test.d.ts +8 -0
- package/dist/dlq/dlq-observer.test.d.ts.map +1 -0
- package/dist/dlq/dlq-observer.test.js +103 -0
- package/dist/dlq/dlq-observer.test.js.map +1 -0
- package/dist/dlq/index.d.ts +6 -0
- package/dist/dlq/index.d.ts.map +1 -0
- package/dist/dlq/index.js +6 -0
- package/dist/dlq/index.js.map +1 -0
- package/dist/event-bus/adapters.d.ts +50 -0
- package/dist/event-bus/adapters.d.ts.map +1 -0
- package/dist/event-bus/adapters.js +51 -0
- package/dist/event-bus/adapters.js.map +1 -0
- package/dist/event-bus/adapters.test.d.ts +5 -0
- package/dist/event-bus/adapters.test.d.ts.map +1 -0
- package/dist/event-bus/adapters.test.js +73 -0
- package/dist/event-bus/adapters.test.js.map +1 -0
- package/dist/event-bus/agent-event-adapter.d.ts +22 -0
- package/dist/event-bus/agent-event-adapter.d.ts.map +1 -0
- package/dist/event-bus/agent-event-adapter.js +49 -0
- package/dist/event-bus/agent-event-adapter.js.map +1 -0
- package/dist/event-bus/agent-event-adapter.test.d.ts +5 -0
- package/dist/event-bus/agent-event-adapter.test.d.ts.map +1 -0
- package/dist/event-bus/agent-event-adapter.test.js +170 -0
- package/dist/event-bus/agent-event-adapter.test.js.map +1 -0
- package/dist/event-bus/channel-sink.d.ts +71 -0
- package/dist/event-bus/channel-sink.d.ts.map +1 -0
- package/dist/event-bus/channel-sink.js +159 -0
- package/dist/event-bus/channel-sink.js.map +1 -0
- package/dist/event-bus/channel-sink.test.d.ts +5 -0
- package/dist/event-bus/channel-sink.test.d.ts.map +1 -0
- package/dist/event-bus/channel-sink.test.js +234 -0
- package/dist/event-bus/channel-sink.test.js.map +1 -0
- package/dist/event-bus/event-types.snapshot.test.d.ts +27 -0
- package/dist/event-bus/event-types.snapshot.test.d.ts.map +1 -0
- package/dist/event-bus/event-types.snapshot.test.js +165 -0
- package/dist/event-bus/event-types.snapshot.test.js.map +1 -0
- package/dist/event-bus/genesis-sink.d.ts +55 -0
- package/dist/event-bus/genesis-sink.d.ts.map +1 -0
- package/dist/event-bus/genesis-sink.js +141 -0
- package/dist/event-bus/genesis-sink.js.map +1 -0
- package/dist/event-bus/genesis-sink.test.d.ts +5 -0
- package/dist/event-bus/genesis-sink.test.d.ts.map +1 -0
- package/dist/event-bus/genesis-sink.test.js +160 -0
- package/dist/event-bus/genesis-sink.test.js.map +1 -0
- package/dist/event-bus/in-memory-event-bus.d.ts +60 -0
- package/dist/event-bus/in-memory-event-bus.d.ts.map +1 -0
- package/dist/event-bus/in-memory-event-bus.js +274 -0
- package/dist/event-bus/in-memory-event-bus.js.map +1 -0
- package/dist/event-bus/in-memory-event-bus.test.d.ts +5 -0
- package/dist/event-bus/in-memory-event-bus.test.d.ts.map +1 -0
- package/dist/event-bus/in-memory-event-bus.test.js +457 -0
- package/dist/event-bus/in-memory-event-bus.test.js.map +1 -0
- package/dist/event-bus/index.d.ts +22 -0
- package/dist/event-bus/index.d.ts.map +1 -0
- package/dist/event-bus/index.js +17 -0
- package/dist/event-bus/index.js.map +1 -0
- package/dist/event-bus/persistence-sink.d.ts +74 -0
- package/dist/event-bus/persistence-sink.d.ts.map +1 -0
- package/dist/event-bus/persistence-sink.js +193 -0
- package/dist/event-bus/persistence-sink.js.map +1 -0
- package/dist/event-bus/persistence-sink.test.d.ts +6 -0
- package/dist/event-bus/persistence-sink.test.d.ts.map +1 -0
- package/dist/event-bus/persistence-sink.test.js +319 -0
- package/dist/event-bus/persistence-sink.test.js.map +1 -0
- package/dist/event-bus/session-checkpoint-sink.d.ts +91 -0
- package/dist/event-bus/session-checkpoint-sink.d.ts.map +1 -0
- package/dist/event-bus/session-checkpoint-sink.js +107 -0
- package/dist/event-bus/session-checkpoint-sink.js.map +1 -0
- package/dist/event-bus/session-checkpoint-sink.test.d.ts +5 -0
- package/dist/event-bus/session-checkpoint-sink.test.d.ts.map +1 -0
- package/dist/event-bus/session-checkpoint-sink.test.js +215 -0
- package/dist/event-bus/session-checkpoint-sink.test.js.map +1 -0
- package/dist/event-bus/webhook-connector.d.ts +59 -0
- package/dist/event-bus/webhook-connector.d.ts.map +1 -0
- package/dist/event-bus/webhook-connector.js +191 -0
- package/dist/event-bus/webhook-connector.js.map +1 -0
- package/dist/event-bus/webhook-connector.test.d.ts +5 -0
- package/dist/event-bus/webhook-connector.test.d.ts.map +1 -0
- package/dist/event-bus/webhook-connector.test.js +214 -0
- package/dist/event-bus/webhook-connector.test.js.map +1 -0
- package/dist/executors/cortex-job-backed-executor.d.ts +137 -0
- package/dist/executors/cortex-job-backed-executor.d.ts.map +1 -0
- package/dist/executors/cortex-job-backed-executor.js +441 -0
- package/dist/executors/cortex-job-backed-executor.js.map +1 -0
- package/dist/executors/cortex-job-backed-executor.test.d.ts +13 -0
- package/dist/executors/cortex-job-backed-executor.test.d.ts.map +1 -0
- package/dist/executors/cortex-job-backed-executor.test.js +303 -0
- package/dist/executors/cortex-job-backed-executor.test.js.map +1 -0
- package/dist/executors/index.d.ts +9 -0
- package/dist/executors/index.d.ts.map +1 -0
- package/dist/executors/index.js +9 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/checkpoint-sink.d.ts +69 -0
- package/dist/ports/checkpoint-sink.d.ts.map +1 -0
- package/dist/ports/checkpoint-sink.js +16 -0
- package/dist/ports/checkpoint-sink.js.map +1 -0
- package/dist/ports/checkpoint.d.ts +68 -0
- package/dist/ports/checkpoint.d.ts.map +1 -0
- package/dist/ports/checkpoint.js +14 -0
- package/dist/ports/checkpoint.js.map +1 -0
- package/dist/ports/continuation-envelope-cross-app.test.d.ts +10 -0
- package/dist/ports/continuation-envelope-cross-app.test.d.ts.map +1 -0
- package/dist/ports/continuation-envelope-cross-app.test.js +95 -0
- package/dist/ports/continuation-envelope-cross-app.test.js.map +1 -0
- package/dist/ports/continuation-envelope.d.ts +199 -0
- package/dist/ports/continuation-envelope.d.ts.map +1 -0
- package/dist/ports/continuation-envelope.js +69 -0
- package/dist/ports/continuation-envelope.js.map +1 -0
- package/dist/ports/conversation.d.ts +64 -0
- package/dist/ports/conversation.d.ts.map +1 -0
- package/dist/ports/conversation.js +19 -0
- package/dist/ports/conversation.js.map +1 -0
- package/dist/ports/cost-oracle.d.ts +26 -0
- package/dist/ports/cost-oracle.d.ts.map +1 -0
- package/dist/ports/cost-oracle.js +9 -0
- package/dist/ports/cost-oracle.js.map +1 -0
- package/dist/ports/cross-app-invoker.d.ts +198 -0
- package/dist/ports/cross-app-invoker.d.ts.map +1 -0
- package/dist/ports/cross-app-invoker.js +157 -0
- package/dist/ports/cross-app-invoker.js.map +1 -0
- package/dist/ports/dlq-observer.d.ts +40 -0
- package/dist/ports/dlq-observer.d.ts.map +1 -0
- package/dist/ports/dlq-observer.js +20 -0
- package/dist/ports/dlq-observer.js.map +1 -0
- package/dist/ports/event-bus.d.ts +169 -0
- package/dist/ports/event-bus.d.ts.map +1 -0
- package/dist/ports/event-bus.js +20 -0
- package/dist/ports/event-bus.js.map +1 -0
- package/dist/ports/event-reader.d.ts +21 -0
- package/dist/ports/event-reader.d.ts.map +1 -0
- package/dist/ports/event-reader.js +12 -0
- package/dist/ports/event-reader.js.map +1 -0
- package/dist/ports/event-rotator.d.ts +39 -0
- package/dist/ports/event-rotator.d.ts.map +1 -0
- package/dist/ports/event-rotator.js +15 -0
- package/dist/ports/event-rotator.js.map +1 -0
- package/dist/ports/file-system.d.ts +48 -0
- package/dist/ports/file-system.d.ts.map +1 -0
- package/dist/ports/file-system.js +10 -0
- package/dist/ports/file-system.js.map +1 -0
- package/dist/ports/historical-observations.d.ts +39 -0
- package/dist/ports/historical-observations.d.ts.map +1 -0
- package/dist/ports/historical-observations.js +12 -0
- package/dist/ports/historical-observations.js.map +1 -0
- package/dist/ports/in-memory-source.d.ts +46 -0
- package/dist/ports/in-memory-source.d.ts.map +1 -0
- package/dist/ports/in-memory-source.js +69 -0
- package/dist/ports/in-memory-source.js.map +1 -0
- package/dist/ports/index.d.ts +32 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +10 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/job-backed-executor.d.ts +139 -0
- package/dist/ports/job-backed-executor.d.ts.map +1 -0
- package/dist/ports/job-backed-executor.js +56 -0
- package/dist/ports/job-backed-executor.js.map +1 -0
- package/dist/ports/methodology-source.d.ts +95 -0
- package/dist/ports/methodology-source.d.ts.map +1 -0
- package/dist/ports/methodology-source.js +26 -0
- package/dist/ports/methodology-source.js.map +1 -0
- package/dist/ports/native-session-discovery.d.ts +20 -0
- package/dist/ports/native-session-discovery.d.ts.map +1 -0
- package/dist/ports/native-session-discovery.js +13 -0
- package/dist/ports/native-session-discovery.js.map +1 -0
- package/dist/ports/projection-store.d.ts +48 -0
- package/dist/ports/projection-store.d.ts.map +1 -0
- package/dist/ports/projection-store.js +17 -0
- package/dist/ports/projection-store.js.map +1 -0
- package/dist/ports/projection.d.ts +29 -0
- package/dist/ports/projection.d.ts.map +1 -0
- package/dist/ports/projection.js +13 -0
- package/dist/ports/projection.js.map +1 -0
- package/dist/ports/rate-governor.d.ts +17 -0
- package/dist/ports/rate-governor.d.ts.map +1 -0
- package/dist/ports/rate-governor.js +11 -0
- package/dist/ports/rate-governor.js.map +1 -0
- package/dist/ports/schedule-client.d.ts +29 -0
- package/dist/ports/schedule-client.d.ts.map +1 -0
- package/dist/ports/schedule-client.js +2 -0
- package/dist/ports/schedule-client.js.map +1 -0
- package/dist/ports/session-pool.d.ts +162 -0
- package/dist/ports/session-pool.d.ts.map +1 -0
- package/dist/ports/session-pool.js +21 -0
- package/dist/ports/session-pool.js.map +1 -0
- package/dist/ports/session-store-errors.d.ts +22 -0
- package/dist/ports/session-store-errors.d.ts.map +1 -0
- package/dist/ports/session-store-errors.js +29 -0
- package/dist/ports/session-store-errors.js.map +1 -0
- package/dist/ports/session-store-types.d.ts +132 -0
- package/dist/ports/session-store-types.d.ts.map +1 -0
- package/dist/ports/session-store-types.js +14 -0
- package/dist/ports/session-store-types.js.map +1 -0
- package/dist/ports/session-store.d.ts +69 -0
- package/dist/ports/session-store.d.ts.map +1 -0
- package/dist/ports/session-store.js +23 -0
- package/dist/ports/session-store.js.map +1 -0
- package/dist/ports/yaml-loader.d.ts +15 -0
- package/dist/ports/yaml-loader.d.ts.map +1 -0
- package/dist/ports/yaml-loader.js +13 -0
- package/dist/ports/yaml-loader.js.map +1 -0
- package/dist/scheduling/index.d.ts +6 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +6 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/scheduled-pact.d.ts +97 -0
- package/dist/scheduling/scheduled-pact.d.ts.map +1 -0
- package/dist/scheduling/scheduled-pact.js +89 -0
- package/dist/scheduling/scheduled-pact.js.map +1 -0
- package/dist/sessions/__tests__/cognitive-modules.test.d.ts +10 -0
- package/dist/sessions/__tests__/cognitive-modules.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/cognitive-modules.test.js +535 -0
- package/dist/sessions/__tests__/cognitive-modules.test.js.map +1 -0
- package/dist/sessions/__tests__/cognitive-provider.test.d.ts +13 -0
- package/dist/sessions/__tests__/cognitive-provider.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/cognitive-provider.test.js +331 -0
- package/dist/sessions/__tests__/cognitive-provider.test.js.map +1 -0
- package/dist/sessions/__tests__/cognitive-sink.test.d.ts +19 -0
- package/dist/sessions/__tests__/cognitive-sink.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/cognitive-sink.test.js +334 -0
- package/dist/sessions/__tests__/cognitive-sink.test.js.map +1 -0
- package/dist/sessions/__tests__/runtime-tools.test.d.ts +2 -0
- package/dist/sessions/__tests__/runtime-tools.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/runtime-tools.test.js +83 -0
- package/dist/sessions/__tests__/runtime-tools.test.js.map +1 -0
- package/dist/sessions/auto-retro.d.ts +29 -0
- package/dist/sessions/auto-retro.d.ts.map +1 -0
- package/dist/sessions/auto-retro.js +181 -0
- package/dist/sessions/auto-retro.js.map +1 -0
- package/dist/sessions/auto-retro.test.d.ts +2 -0
- package/dist/sessions/auto-retro.test.d.ts.map +1 -0
- package/dist/sessions/auto-retro.test.js +361 -0
- package/dist/sessions/auto-retro.test.js.map +1 -0
- package/dist/sessions/channels.d.ts +55 -0
- package/dist/sessions/channels.d.ts.map +1 -0
- package/dist/sessions/channels.js +118 -0
- package/dist/sessions/channels.js.map +1 -0
- package/dist/sessions/channels.test.d.ts +2 -0
- package/dist/sessions/channels.test.d.ts.map +1 -0
- package/dist/sessions/channels.test.js +285 -0
- package/dist/sessions/channels.test.js.map +1 -0
- package/dist/sessions/cognitive-modules.d.ts +100 -0
- package/dist/sessions/cognitive-modules.d.ts.map +1 -0
- package/dist/sessions/cognitive-modules.js +458 -0
- package/dist/sessions/cognitive-modules.js.map +1 -0
- package/dist/sessions/cognitive-provider.d.ts +42 -0
- package/dist/sessions/cognitive-provider.d.ts.map +1 -0
- package/dist/sessions/cognitive-provider.js +208 -0
- package/dist/sessions/cognitive-provider.js.map +1 -0
- package/dist/sessions/cognitive-sink.d.ts +73 -0
- package/dist/sessions/cognitive-sink.d.ts.map +1 -0
- package/dist/sessions/cognitive-sink.js +154 -0
- package/dist/sessions/cognitive-sink.js.map +1 -0
- package/dist/sessions/diagnostics.d.ts +70 -0
- package/dist/sessions/diagnostics.d.ts.map +1 -0
- package/dist/sessions/diagnostics.js +129 -0
- package/dist/sessions/diagnostics.js.map +1 -0
- package/dist/sessions/diagnostics.test.d.ts +2 -0
- package/dist/sessions/diagnostics.test.d.ts.map +1 -0
- package/dist/sessions/diagnostics.test.js +135 -0
- package/dist/sessions/diagnostics.test.js.map +1 -0
- package/dist/sessions/index.d.ts +32 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +33 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/pool.d.ts +218 -0
- package/dist/sessions/pool.d.ts.map +1 -0
- package/dist/sessions/pool.js +991 -0
- package/dist/sessions/pool.js.map +1 -0
- package/dist/sessions/pool.test.d.ts +2 -0
- package/dist/sessions/pool.test.d.ts.map +1 -0
- package/dist/sessions/pool.test.js +633 -0
- package/dist/sessions/pool.test.js.map +1 -0
- package/dist/sessions/print-session.d.ts +142 -0
- package/dist/sessions/print-session.d.ts.map +1 -0
- package/dist/sessions/print-session.js +325 -0
- package/dist/sessions/print-session.js.map +1 -0
- package/dist/sessions/print-session.test.d.ts +2 -0
- package/dist/sessions/print-session.test.d.ts.map +1 -0
- package/dist/sessions/print-session.test.js +418 -0
- package/dist/sessions/print-session.test.js.map +1 -0
- package/dist/sessions/runtime-tools.d.ts +22 -0
- package/dist/sessions/runtime-tools.d.ts.map +1 -0
- package/dist/sessions/runtime-tools.js +162 -0
- package/dist/sessions/runtime-tools.js.map +1 -0
- package/dist/sessions/scope-hook.d.ts +77 -0
- package/dist/sessions/scope-hook.d.ts.map +1 -0
- package/dist/sessions/scope-hook.js +323 -0
- package/dist/sessions/scope-hook.js.map +1 -0
- package/dist/sessions/scope-hook.test.d.ts +2 -0
- package/dist/sessions/scope-hook.test.d.ts.map +1 -0
- package/dist/sessions/scope-hook.test.js +249 -0
- package/dist/sessions/scope-hook.test.js.map +1 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.d.ts +16 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.d.ts.map +1 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.js +191 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.js.map +1 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts +5 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts.map +1 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.test.js +137 -0
- package/dist/sessions/session-store/checkpoint-sink-impl.test.js.map +1 -0
- package/dist/sessions/session-store/conformance.d.ts +59 -0
- package/dist/sessions/session-store/conformance.d.ts.map +1 -0
- package/dist/sessions/session-store/conformance.js +172 -0
- package/dist/sessions/session-store/conformance.js.map +1 -0
- package/dist/sessions/session-store/conformance.test.d.ts +7 -0
- package/dist/sessions/session-store/conformance.test.d.ts.map +1 -0
- package/dist/sessions/session-store/conformance.test.js +22 -0
- package/dist/sessions/session-store/conformance.test.js.map +1 -0
- package/dist/sessions/session-store/in-memory-session-store.d.ts +23 -0
- package/dist/sessions/session-store/in-memory-session-store.d.ts.map +1 -0
- package/dist/sessions/session-store/in-memory-session-store.js +197 -0
- package/dist/sessions/session-store/in-memory-session-store.js.map +1 -0
- package/dist/sessions/session-store/in-memory-session-store.test.d.ts +6 -0
- package/dist/sessions/session-store/in-memory-session-store.test.d.ts.map +1 -0
- package/dist/sessions/session-store/in-memory-session-store.test.js +183 -0
- package/dist/sessions/session-store/in-memory-session-store.test.js.map +1 -0
- package/dist/sessions/session-store/index.d.ts +20 -0
- package/dist/sessions/session-store/index.d.ts.map +1 -0
- package/dist/sessions/session-store/index.js +15 -0
- package/dist/sessions/session-store/index.js.map +1 -0
- package/dist/sessions/session-store/resume.d.ts +88 -0
- package/dist/sessions/session-store/resume.d.ts.map +1 -0
- package/dist/sessions/session-store/resume.js +96 -0
- package/dist/sessions/session-store/resume.js.map +1 -0
- package/dist/sessions/session-store/resume.test.d.ts +5 -0
- package/dist/sessions/session-store/resume.test.d.ts.map +1 -0
- package/dist/sessions/session-store/resume.test.js +119 -0
- package/dist/sessions/session-store/resume.test.js.map +1 -0
- package/dist/sessions/spawn-queue.d.ts +28 -0
- package/dist/sessions/spawn-queue.d.ts.map +1 -0
- package/dist/sessions/spawn-queue.js +63 -0
- package/dist/sessions/spawn-queue.js.map +1 -0
- package/dist/sessions/spawn-queue.test.d.ts +2 -0
- package/dist/sessions/spawn-queue.test.d.ts.map +1 -0
- package/dist/sessions/spawn-queue.test.js +65 -0
- package/dist/sessions/spawn-queue.test.js.map +1 -0
- package/dist/sessions/types.d.ts +16 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +11 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/sessions/worktree-stale.test.d.ts +2 -0
- package/dist/sessions/worktree-stale.test.d.ts.map +1 -0
- package/dist/sessions/worktree-stale.test.js +468 -0
- package/dist/sessions/worktree-stale.test.js.map +1 -0
- package/dist/strategy/artifact-store.d.ts +12 -0
- package/dist/strategy/artifact-store.d.ts.map +1 -0
- package/dist/strategy/artifact-store.js +12 -0
- package/dist/strategy/artifact-store.js.map +1 -0
- package/dist/strategy/artifact-store.test.d.ts +2 -0
- package/dist/strategy/artifact-store.test.d.ts.map +1 -0
- package/dist/strategy/artifact-store.test.js +170 -0
- package/dist/strategy/artifact-store.test.js.map +1 -0
- package/dist/strategy/context-load-executor.d.ts +23 -0
- package/dist/strategy/context-load-executor.d.ts.map +1 -0
- package/dist/strategy/context-load-executor.js +87 -0
- package/dist/strategy/context-load-executor.js.map +1 -0
- package/dist/strategy/context-load-executor.test.d.ts +16 -0
- package/dist/strategy/context-load-executor.test.d.ts.map +1 -0
- package/dist/strategy/context-load-executor.test.js +158 -0
- package/dist/strategy/context-load-executor.test.js.map +1 -0
- package/dist/strategy/cortex-cross-app-invoker.stub.d.ts +65 -0
- package/dist/strategy/cortex-cross-app-invoker.stub.d.ts.map +1 -0
- package/dist/strategy/cortex-cross-app-invoker.stub.js +68 -0
- package/dist/strategy/cortex-cross-app-invoker.stub.js.map +1 -0
- package/dist/strategy/cross-app-node-executor.d.ts +54 -0
- package/dist/strategy/cross-app-node-executor.d.ts.map +1 -0
- package/dist/strategy/cross-app-node-executor.js +98 -0
- package/dist/strategy/cross-app-node-executor.js.map +1 -0
- package/dist/strategy/cross-app-node-executor.test.d.ts +13 -0
- package/dist/strategy/cross-app-node-executor.test.d.ts.map +1 -0
- package/dist/strategy/cross-app-node-executor.test.js +160 -0
- package/dist/strategy/cross-app-node-executor.test.js.map +1 -0
- package/dist/strategy/gates.d.ts +13 -0
- package/dist/strategy/gates.d.ts.map +1 -0
- package/dist/strategy/gates.js +13 -0
- package/dist/strategy/gates.js.map +1 -0
- package/dist/strategy/gates.test.d.ts +2 -0
- package/dist/strategy/gates.test.d.ts.map +1 -0
- package/dist/strategy/gates.test.js +299 -0
- package/dist/strategy/gates.test.js.map +1 -0
- package/dist/strategy/human-approval-resolver.d.ts +23 -0
- package/dist/strategy/human-approval-resolver.d.ts.map +1 -0
- package/dist/strategy/human-approval-resolver.js +94 -0
- package/dist/strategy/human-approval-resolver.js.map +1 -0
- package/dist/strategy/human-approval-resolver.test.d.ts +16 -0
- package/dist/strategy/human-approval-resolver.test.d.ts.map +1 -0
- package/dist/strategy/human-approval-resolver.test.js +200 -0
- package/dist/strategy/human-approval-resolver.test.js.map +1 -0
- package/dist/strategy/in-process-cross-app-invoker.d.ts +105 -0
- package/dist/strategy/in-process-cross-app-invoker.d.ts.map +1 -0
- package/dist/strategy/in-process-cross-app-invoker.js +206 -0
- package/dist/strategy/in-process-cross-app-invoker.js.map +1 -0
- package/dist/strategy/in-process-cross-app-invoker.test.d.ts +15 -0
- package/dist/strategy/in-process-cross-app-invoker.test.d.ts.map +1 -0
- package/dist/strategy/in-process-cross-app-invoker.test.js +190 -0
- package/dist/strategy/in-process-cross-app-invoker.test.js.map +1 -0
- package/dist/strategy/index.d.ts +29 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +29 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/pacta-strategy.d.ts +97 -0
- package/dist/strategy/pacta-strategy.d.ts.map +1 -0
- package/dist/strategy/pacta-strategy.js +117 -0
- package/dist/strategy/pacta-strategy.js.map +1 -0
- package/dist/strategy/pacta-strategy.test.d.ts +2 -0
- package/dist/strategy/pacta-strategy.test.d.ts.map +1 -0
- package/dist/strategy/pacta-strategy.test.js +234 -0
- package/dist/strategy/pacta-strategy.test.js.map +1 -0
- package/dist/strategy/retro-generator.d.ts +18 -0
- package/dist/strategy/retro-generator.d.ts.map +1 -0
- package/dist/strategy/retro-generator.js +22 -0
- package/dist/strategy/retro-generator.js.map +1 -0
- package/dist/strategy/retro-writer.d.ts +25 -0
- package/dist/strategy/retro-writer.d.ts.map +1 -0
- package/dist/strategy/retro-writer.js +65 -0
- package/dist/strategy/retro-writer.js.map +1 -0
- package/dist/strategy/strategy-executor.d.ts +39 -0
- package/dist/strategy/strategy-executor.d.ts.map +1 -0
- package/dist/strategy/strategy-executor.js +253 -0
- package/dist/strategy/strategy-executor.js.map +1 -0
- package/dist/strategy/strategy-executor.test.d.ts +8 -0
- package/dist/strategy/strategy-executor.test.d.ts.map +1 -0
- package/dist/strategy/strategy-executor.test.js +1301 -0
- package/dist/strategy/strategy-executor.test.js.map +1 -0
- package/dist/strategy/strategy-parser.d.ts +30 -0
- package/dist/strategy/strategy-parser.d.ts.map +1 -0
- package/dist/strategy/strategy-parser.js +30 -0
- package/dist/strategy/strategy-parser.js.map +1 -0
- package/dist/strategy/sub-strategy-source.d.ts +27 -0
- package/dist/strategy/sub-strategy-source.d.ts.map +1 -0
- package/dist/strategy/sub-strategy-source.js +77 -0
- package/dist/strategy/sub-strategy-source.js.map +1 -0
- package/dist/strategy/types.d.ts +12 -0
- package/dist/strategy/types.d.ts.map +1 -0
- package/dist/strategy/types.js +9 -0
- package/dist/strategy/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { describe, it, beforeEach, mock } from 'node:test';
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
import { Readable } from 'node:stream';
|
|
6
|
+
// ── PrintSession Unit Tests (PRD 012 Phase 4 / PRD 028) ──────────
|
|
7
|
+
//
|
|
8
|
+
// Node 22 does not support mock.module() for ESM (it's experimental
|
|
9
|
+
// and undefined in this version). We cannot mock child_process.spawn
|
|
10
|
+
// that claudeCliProvider uses internally.
|
|
11
|
+
//
|
|
12
|
+
// Strategy:
|
|
13
|
+
// - Tests that exercise sendPrompt() use mock.module() if available,
|
|
14
|
+
// otherwise they are skipped with a descriptive message.
|
|
15
|
+
// - Tests for the synchronous public interface (status, kill, resize,
|
|
16
|
+
// adaptiveSettle, onOutput, onExit, printMetadata) run without mocking.
|
|
17
|
+
// ── Mock infrastructure ──────────────────────────────────────────
|
|
18
|
+
// Realistic JSON fixture matching Claude Code --output-format json
|
|
19
|
+
const MOCK_JSON_RESULT = {
|
|
20
|
+
type: 'result',
|
|
21
|
+
subtype: 'success',
|
|
22
|
+
is_error: false,
|
|
23
|
+
duration_ms: 5432,
|
|
24
|
+
duration_api_ms: 4200,
|
|
25
|
+
num_turns: 2,
|
|
26
|
+
result: 'I have completed the task successfully.',
|
|
27
|
+
stop_reason: 'end_turn',
|
|
28
|
+
session_id: 'test-session-id',
|
|
29
|
+
total_cost_usd: 0.035,
|
|
30
|
+
usage: {
|
|
31
|
+
input_tokens: 3000,
|
|
32
|
+
cache_creation_input_tokens: 1500,
|
|
33
|
+
cache_read_input_tokens: 10000,
|
|
34
|
+
output_tokens: 500,
|
|
35
|
+
},
|
|
36
|
+
model_usage: {
|
|
37
|
+
'claude-sonnet-4-6': {
|
|
38
|
+
inputTokens: 3000,
|
|
39
|
+
outputTokens: 500,
|
|
40
|
+
costUSD: 0.035,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
permission_denials: [],
|
|
44
|
+
};
|
|
45
|
+
function createMockProcess(jsonOutput, exitCode = 0) {
|
|
46
|
+
const stdout = new Readable({ read() { } });
|
|
47
|
+
const stderr = new Readable({ read() { } });
|
|
48
|
+
const proc = Object.assign(new EventEmitter(), {
|
|
49
|
+
stdout,
|
|
50
|
+
stderr,
|
|
51
|
+
stdin: { write() { }, end() { } },
|
|
52
|
+
pid: 12345,
|
|
53
|
+
kill: () => { },
|
|
54
|
+
});
|
|
55
|
+
// Schedule output and exit on next ticks
|
|
56
|
+
process.nextTick(() => {
|
|
57
|
+
stdout.push(JSON.stringify(jsonOutput) + '\n');
|
|
58
|
+
stdout.push(null);
|
|
59
|
+
});
|
|
60
|
+
process.nextTick(() => {
|
|
61
|
+
process.nextTick(() => {
|
|
62
|
+
proc.emit('close', exitCode);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
return proc;
|
|
66
|
+
}
|
|
67
|
+
// Attempt to set up mock.module — if unavailable, sendPrompt tests will be skipped.
|
|
68
|
+
const canMockModules = typeof mock.module === 'function';
|
|
69
|
+
let mockSpawn;
|
|
70
|
+
let createPrintSession;
|
|
71
|
+
if (canMockModules) {
|
|
72
|
+
mockSpawn = mock.fn(() => createMockProcess(MOCK_JSON_RESULT));
|
|
73
|
+
mock.module('node:child_process', {
|
|
74
|
+
namedExports: {
|
|
75
|
+
spawn: mockSpawn,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const mod = await import('./print-session.js');
|
|
79
|
+
createPrintSession = mod.createPrintSession;
|
|
80
|
+
}
|
|
81
|
+
// Separate import path for non-mocked tests (public interface only)
|
|
82
|
+
const realMod = canMockModules ? null : await import('./print-session.js');
|
|
83
|
+
const rawCreateSession = createPrintSession ?? realMod.createPrintSession;
|
|
84
|
+
/** Helper: create a session */
|
|
85
|
+
function createSession(opts) {
|
|
86
|
+
return rawCreateSession({ ...opts });
|
|
87
|
+
}
|
|
88
|
+
// ── Tests ────────────────────────────────────────────────────────
|
|
89
|
+
describe('PrintSession', () => {
|
|
90
|
+
beforeEach(() => {
|
|
91
|
+
if (mockSpawn) {
|
|
92
|
+
mockSpawn.mock.resetCalls();
|
|
93
|
+
mockSpawn.mock.mockImplementation(() => createMockProcess(MOCK_JSON_RESULT));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// ── Synchronous interface tests (no mocking needed) ──────────
|
|
97
|
+
describe('initial state', () => {
|
|
98
|
+
it('starts in ready status', () => {
|
|
99
|
+
const session = createSession({ id: 'ps-1', workdir: '/tmp/test' });
|
|
100
|
+
assert.equal(session.status, 'ready');
|
|
101
|
+
});
|
|
102
|
+
it('starts with promptCount 0', () => {
|
|
103
|
+
const session = createSession({ id: 'ps-2', workdir: '/tmp/test' });
|
|
104
|
+
assert.equal(session.promptCount, 0);
|
|
105
|
+
});
|
|
106
|
+
it('starts with empty transcript', () => {
|
|
107
|
+
const session = createSession({ id: 'ps-3', workdir: '/tmp/test' });
|
|
108
|
+
assert.equal(session.transcript, '');
|
|
109
|
+
});
|
|
110
|
+
it('starts with null printMetadata', () => {
|
|
111
|
+
const session = createSession({ id: 'ps-4', workdir: '/tmp/test' });
|
|
112
|
+
assert.equal(session.printMetadata, null);
|
|
113
|
+
});
|
|
114
|
+
it('adaptiveSettle is always null', () => {
|
|
115
|
+
const session = createSession({ id: 'ps-5', workdir: '/tmp/test' });
|
|
116
|
+
assert.equal(session.adaptiveSettle, null);
|
|
117
|
+
});
|
|
118
|
+
it('has the correct id', () => {
|
|
119
|
+
const session = createSession({ id: 'my-session-42', workdir: '/tmp/test' });
|
|
120
|
+
assert.equal(session.id, 'my-session-42');
|
|
121
|
+
});
|
|
122
|
+
it('has a lastActivityAt date', () => {
|
|
123
|
+
const before = new Date();
|
|
124
|
+
const session = createSession({ id: 'ps-6', workdir: '/tmp/test' });
|
|
125
|
+
const after = new Date();
|
|
126
|
+
assert.ok(session.lastActivityAt >= before);
|
|
127
|
+
assert.ok(session.lastActivityAt <= after);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('kill()', () => {
|
|
131
|
+
it('sets status to dead', () => {
|
|
132
|
+
const session = createSession({ id: 'ps-kill-1', workdir: '/tmp/test' });
|
|
133
|
+
session.kill();
|
|
134
|
+
assert.equal(session.status, 'dead');
|
|
135
|
+
});
|
|
136
|
+
it('fires exit callbacks with code 0', () => {
|
|
137
|
+
const session = createSession({ id: 'ps-kill-2', workdir: '/tmp/test' });
|
|
138
|
+
let exitCode = null;
|
|
139
|
+
session.onExit((code) => { exitCode = code; });
|
|
140
|
+
session.kill();
|
|
141
|
+
assert.equal(exitCode, 0);
|
|
142
|
+
});
|
|
143
|
+
it('fires multiple exit callbacks', () => {
|
|
144
|
+
const session = createSession({ id: 'ps-kill-3', workdir: '/tmp/test' });
|
|
145
|
+
const codes = [];
|
|
146
|
+
session.onExit((code) => codes.push(code));
|
|
147
|
+
session.onExit((code) => codes.push(code * 10));
|
|
148
|
+
session.kill();
|
|
149
|
+
assert.deepEqual(codes, [0, 0]);
|
|
150
|
+
});
|
|
151
|
+
it('does not throw if exit callback throws', () => {
|
|
152
|
+
const session = createSession({ id: 'ps-kill-4', workdir: '/tmp/test' });
|
|
153
|
+
session.onExit(() => { throw new Error('callback error'); });
|
|
154
|
+
// Should not throw
|
|
155
|
+
assert.doesNotThrow(() => session.kill());
|
|
156
|
+
assert.equal(session.status, 'dead');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('resize()', () => {
|
|
160
|
+
it('is a no-op — does not throw', () => {
|
|
161
|
+
const session = createSession({ id: 'ps-resize', workdir: '/tmp/test' });
|
|
162
|
+
assert.doesNotThrow(() => session.resize(120, 40));
|
|
163
|
+
});
|
|
164
|
+
it('does not change status', () => {
|
|
165
|
+
const session = createSession({ id: 'ps-resize-2', workdir: '/tmp/test' });
|
|
166
|
+
session.resize(80, 24);
|
|
167
|
+
assert.equal(session.status, 'ready');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('onOutput()', () => {
|
|
171
|
+
it('returns an unsubscribe function', () => {
|
|
172
|
+
const session = createSession({ id: 'ps-out-1', workdir: '/tmp/test' });
|
|
173
|
+
const unsub = session.onOutput(() => { });
|
|
174
|
+
assert.equal(typeof unsub, 'function');
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('sendPrompt() rejection when dead', () => {
|
|
178
|
+
it('rejects with /dead/ when session is already killed', async () => {
|
|
179
|
+
const session = createSession({ id: 'ps-dead-1', workdir: '/tmp/test' });
|
|
180
|
+
session.kill();
|
|
181
|
+
await assert.rejects(() => session.sendPrompt('test'), /dead/);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
// ── sendPrompt() tests (require mock.module) ──────────────────
|
|
185
|
+
// These tests exercise the full claudeCliProvider.invoke() path.
|
|
186
|
+
// They are conditionally run based on mock.module availability.
|
|
187
|
+
const describeSendPrompt = canMockModules ? describe : describe.skip;
|
|
188
|
+
describeSendPrompt('sendPrompt() (mocked child_process)', () => {
|
|
189
|
+
it('returns structured result from JSON output', async () => {
|
|
190
|
+
const session = createSession({ id: 'ps-sp-1', workdir: '/tmp/test' });
|
|
191
|
+
const result = await session.sendPrompt('Do something');
|
|
192
|
+
assert.equal(result.output, 'I have completed the task successfully.');
|
|
193
|
+
assert.equal(result.timedOut, false);
|
|
194
|
+
});
|
|
195
|
+
it('transitions through working → ready on successful prompt', async () => {
|
|
196
|
+
const session = createSession({ id: 'ps-sp-2', workdir: '/tmp/test' });
|
|
197
|
+
const statuses = [];
|
|
198
|
+
statuses.push(session.status); // ready
|
|
199
|
+
const promise = session.sendPrompt('test');
|
|
200
|
+
// Status transitions to working synchronously after queue picks up
|
|
201
|
+
await new Promise(r => setTimeout(r, 10));
|
|
202
|
+
statuses.push(session.status); // working
|
|
203
|
+
await promise;
|
|
204
|
+
statuses.push(session.status); // ready
|
|
205
|
+
assert.equal(statuses[0], 'ready');
|
|
206
|
+
assert.equal(statuses[2], 'ready');
|
|
207
|
+
});
|
|
208
|
+
it('increments promptCount on each sendPrompt', async () => {
|
|
209
|
+
const session = createSession({ id: 'ps-sp-3', workdir: '/tmp/test' });
|
|
210
|
+
assert.equal(session.promptCount, 0);
|
|
211
|
+
await session.sendPrompt('first');
|
|
212
|
+
assert.equal(session.promptCount, 1);
|
|
213
|
+
await session.sendPrompt('second');
|
|
214
|
+
assert.equal(session.promptCount, 2);
|
|
215
|
+
});
|
|
216
|
+
it('updates lastActivityAt after sendPrompt', async () => {
|
|
217
|
+
const session = createSession({ id: 'ps-sp-4', workdir: '/tmp/test' });
|
|
218
|
+
const before = session.lastActivityAt;
|
|
219
|
+
await new Promise(r => setTimeout(r, 10));
|
|
220
|
+
await session.sendPrompt('test');
|
|
221
|
+
assert.ok(session.lastActivityAt.getTime() >= before.getTime());
|
|
222
|
+
});
|
|
223
|
+
it('accumulates transcript across prompts', async () => {
|
|
224
|
+
const session = createSession({ id: 'ps-sp-5', workdir: '/tmp/test' });
|
|
225
|
+
await session.sendPrompt('first prompt');
|
|
226
|
+
await session.sendPrompt('second prompt');
|
|
227
|
+
assert.ok(session.transcript.includes('first prompt'));
|
|
228
|
+
assert.ok(session.transcript.includes('second prompt'));
|
|
229
|
+
assert.ok(session.transcript.includes('I have completed the task successfully.'));
|
|
230
|
+
});
|
|
231
|
+
it('notifies output subscribers', async () => {
|
|
232
|
+
const session = createSession({ id: 'ps-sp-6', workdir: '/tmp/test' });
|
|
233
|
+
const outputs = [];
|
|
234
|
+
session.onOutput((data) => outputs.push(data));
|
|
235
|
+
await session.sendPrompt('test');
|
|
236
|
+
// Should receive at least the result notification
|
|
237
|
+
assert.ok(outputs.length >= 1);
|
|
238
|
+
assert.ok(outputs.some(o => o.includes('I have completed the task successfully.')));
|
|
239
|
+
});
|
|
240
|
+
it('unsubscribe removes output subscriber', async () => {
|
|
241
|
+
const session = createSession({ id: 'ps-sp-7', workdir: '/tmp/test' });
|
|
242
|
+
const outputs = [];
|
|
243
|
+
const unsub = session.onOutput((data) => outputs.push(data));
|
|
244
|
+
unsub();
|
|
245
|
+
await session.sendPrompt('test');
|
|
246
|
+
assert.equal(outputs.length, 0);
|
|
247
|
+
});
|
|
248
|
+
it('populates printMetadata after sendPrompt', async () => {
|
|
249
|
+
const session = createSession({ id: 'ps-sp-8', workdir: '/tmp/test' });
|
|
250
|
+
await session.sendPrompt('test');
|
|
251
|
+
const meta = session.printMetadata;
|
|
252
|
+
assert.ok(meta);
|
|
253
|
+
assert.equal(meta.total_cost_usd, 0.035);
|
|
254
|
+
assert.equal(meta.num_turns, 2);
|
|
255
|
+
assert.equal(meta.duration_ms, 5432);
|
|
256
|
+
// duration_api_ms is approximated as duration_ms (AgentResult has no separate api duration)
|
|
257
|
+
assert.equal(meta.duration_api_ms, 5432);
|
|
258
|
+
assert.equal(meta.usage.input_tokens, 3000);
|
|
259
|
+
assert.equal(meta.usage.output_tokens, 500);
|
|
260
|
+
assert.equal(meta.usage.cache_creation_input_tokens, 1500);
|
|
261
|
+
assert.equal(meta.usage.cache_read_input_tokens, 10000);
|
|
262
|
+
assert.deepEqual(meta.permission_denials, []);
|
|
263
|
+
assert.equal(meta.stop_reason, 'end_turn');
|
|
264
|
+
assert.equal(meta.subtype, 'success');
|
|
265
|
+
assert.equal(meta.cumulative_cost_usd, 0.035);
|
|
266
|
+
});
|
|
267
|
+
it('accumulates cumulative cost across prompts', async () => {
|
|
268
|
+
const session = createSession({ id: 'ps-sp-9', workdir: '/tmp/test' });
|
|
269
|
+
await session.sendPrompt('first');
|
|
270
|
+
const meta1 = session.printMetadata;
|
|
271
|
+
assert.ok(meta1);
|
|
272
|
+
assert.equal(meta1.cumulative_cost_usd, 0.035);
|
|
273
|
+
await session.sendPrompt('second');
|
|
274
|
+
const meta2 = session.printMetadata;
|
|
275
|
+
assert.ok(meta2);
|
|
276
|
+
assert.ok(Math.abs(meta2.cumulative_cost_usd - 0.07) < 0.001);
|
|
277
|
+
});
|
|
278
|
+
it('handles error from claude process gracefully', async () => {
|
|
279
|
+
mockSpawn.mock.mockImplementation(() => {
|
|
280
|
+
const stdout = new Readable({ read() { } });
|
|
281
|
+
const stderr = new Readable({ read() { } });
|
|
282
|
+
const proc = Object.assign(new EventEmitter(), {
|
|
283
|
+
stdout,
|
|
284
|
+
stderr,
|
|
285
|
+
stdin: { write() { }, end() { } },
|
|
286
|
+
pid: 12345,
|
|
287
|
+
kill: () => { },
|
|
288
|
+
});
|
|
289
|
+
process.nextTick(() => {
|
|
290
|
+
stderr.push('Error: API key invalid\n');
|
|
291
|
+
stderr.push(null);
|
|
292
|
+
stdout.push(null);
|
|
293
|
+
});
|
|
294
|
+
process.nextTick(() => {
|
|
295
|
+
process.nextTick(() => {
|
|
296
|
+
proc.emit('close', 1);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
return proc;
|
|
300
|
+
});
|
|
301
|
+
const session = createSession({ id: 'ps-sp-10', workdir: '/tmp/test' });
|
|
302
|
+
const result = await session.sendPrompt('test');
|
|
303
|
+
// Error should be returned as output, not thrown
|
|
304
|
+
assert.ok(result.output.includes('Error'));
|
|
305
|
+
assert.equal(result.timedOut, false);
|
|
306
|
+
// Session should return to ready, not dead
|
|
307
|
+
assert.equal(session.status, 'ready');
|
|
308
|
+
});
|
|
309
|
+
it('first prompt uses --session-id, subsequent use --resume', async () => {
|
|
310
|
+
const session = createSession({ id: 'ps-sp-11', workdir: '/tmp/test' });
|
|
311
|
+
await session.sendPrompt('first');
|
|
312
|
+
const firstCall = mockSpawn.mock.calls[0];
|
|
313
|
+
const firstArgs = firstCall.arguments[1];
|
|
314
|
+
assert.ok(firstArgs.includes('--session-id'), 'first prompt should use --session-id');
|
|
315
|
+
assert.ok(!firstArgs.includes('--resume'), 'first prompt should not use --resume');
|
|
316
|
+
await session.sendPrompt('second');
|
|
317
|
+
// Find the second spawn call (first call is index 0, second is index 1)
|
|
318
|
+
const secondCall = mockSpawn.mock.calls[1];
|
|
319
|
+
const secondArgs = secondCall.arguments[1];
|
|
320
|
+
assert.ok(secondArgs.includes('--resume'), 'second prompt should use --resume');
|
|
321
|
+
assert.ok(!secondArgs.includes('--session-id'), 'second prompt should not use --session-id');
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
// ── PRD 029: Agent hoisting + budget tests (providerOverride) ──
|
|
325
|
+
describe('agent hoisting (PRD 029 BUG-1)', () => {
|
|
326
|
+
it('createAgent is called once across multiple sendPrompt calls', async () => {
|
|
327
|
+
let invokeCount = 0;
|
|
328
|
+
// A mock provider that counts invocations
|
|
329
|
+
const mockProvider = {
|
|
330
|
+
name: 'test-counter',
|
|
331
|
+
capabilities() {
|
|
332
|
+
return { modes: ['oneshot', 'resumable'], streaming: false, resumable: true, budgetEnforcement: 'client', outputValidation: 'none', toolModel: false };
|
|
333
|
+
},
|
|
334
|
+
async invoke(_pact, _request) {
|
|
335
|
+
invokeCount++;
|
|
336
|
+
return {
|
|
337
|
+
output: `Response #${invokeCount}`,
|
|
338
|
+
sessionId: 'test-session-id',
|
|
339
|
+
completed: true,
|
|
340
|
+
stopReason: 'complete',
|
|
341
|
+
turns: 1,
|
|
342
|
+
durationMs: 100,
|
|
343
|
+
cost: {
|
|
344
|
+
totalUsd: 0.01,
|
|
345
|
+
perModel: {
|
|
346
|
+
'test-model': {
|
|
347
|
+
costUsd: 0.01,
|
|
348
|
+
tokens: { inputTokens: 100, outputTokens: 50, cacheReadTokens: 0, cacheWriteTokens: 0 },
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
usage: { inputTokens: 100, outputTokens: 50, cacheReadTokens: 0, cacheWriteTokens: 0 },
|
|
353
|
+
};
|
|
354
|
+
},
|
|
355
|
+
};
|
|
356
|
+
const session = rawCreateSession({
|
|
357
|
+
id: 'ps-hoist-1',
|
|
358
|
+
workdir: '/tmp/test',
|
|
359
|
+
providerOverride: mockProvider,
|
|
360
|
+
});
|
|
361
|
+
await session.sendPrompt('first');
|
|
362
|
+
await session.sendPrompt('second');
|
|
363
|
+
await session.sendPrompt('third');
|
|
364
|
+
// The provider should be invoked 3 times (once per prompt),
|
|
365
|
+
// but createAgent should have been called only once (at session scope).
|
|
366
|
+
// We verify indirectly: if createAgent were called per-prompt, the
|
|
367
|
+
// accumulated state would reset each time.
|
|
368
|
+
assert.equal(invokeCount, 3, 'provider.invoke called 3 times');
|
|
369
|
+
assert.equal(session.promptCount, 3);
|
|
370
|
+
});
|
|
371
|
+
it('budget accumulation: cumulative_cost_usd accumulates across prompts via agent.state', async () => {
|
|
372
|
+
let callNum = 0;
|
|
373
|
+
const mockProvider = {
|
|
374
|
+
name: 'test-budget',
|
|
375
|
+
capabilities() {
|
|
376
|
+
return { modes: ['oneshot', 'resumable'], streaming: false, resumable: true, budgetEnforcement: 'client', outputValidation: 'none', toolModel: false };
|
|
377
|
+
},
|
|
378
|
+
async invoke(_pact, _request) {
|
|
379
|
+
callNum++;
|
|
380
|
+
return {
|
|
381
|
+
output: `Response #${callNum}`,
|
|
382
|
+
sessionId: 'test-session-id',
|
|
383
|
+
completed: true,
|
|
384
|
+
stopReason: 'complete',
|
|
385
|
+
turns: 1,
|
|
386
|
+
durationMs: 100,
|
|
387
|
+
cost: {
|
|
388
|
+
totalUsd: 0.025 * callNum, // increasing cost per prompt
|
|
389
|
+
perModel: {
|
|
390
|
+
'test-model': {
|
|
391
|
+
costUsd: 0.025 * callNum,
|
|
392
|
+
tokens: { inputTokens: 100, outputTokens: 50, cacheReadTokens: 0, cacheWriteTokens: 0 },
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
usage: { inputTokens: 100, outputTokens: 50, cacheReadTokens: 0, cacheWriteTokens: 0 },
|
|
397
|
+
};
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
const session = rawCreateSession({
|
|
401
|
+
id: 'ps-budget-1',
|
|
402
|
+
workdir: '/tmp/test',
|
|
403
|
+
providerOverride: mockProvider,
|
|
404
|
+
});
|
|
405
|
+
await session.sendPrompt('first');
|
|
406
|
+
const meta1 = session.printMetadata;
|
|
407
|
+
assert.ok(meta1, 'printMetadata should exist after first prompt');
|
|
408
|
+
// First prompt cost: 0.025 * 1 = 0.025. agent.state.totalUsd should be 0.025.
|
|
409
|
+
assert.ok(Math.abs(meta1.cumulative_cost_usd - 0.025) < 0.001, `cumulative should be ~0.025 but got ${meta1.cumulative_cost_usd}`);
|
|
410
|
+
await session.sendPrompt('second');
|
|
411
|
+
const meta2 = session.printMetadata;
|
|
412
|
+
assert.ok(meta2, 'printMetadata should exist after second prompt');
|
|
413
|
+
// Second prompt cost: 0.025 * 2 = 0.05. agent.state.totalUsd should be 0.025 + 0.05 = 0.075.
|
|
414
|
+
assert.ok(Math.abs(meta2.cumulative_cost_usd - 0.075) < 0.001, `cumulative should be ~0.075 but got ${meta2.cumulative_cost_usd}`);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
//# sourceMappingURL=print-session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-session.test.js","sourceRoot":"","sources":["../../src/sessions/print-session.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Tool Provider — real filesystem-backed tools for cognitive sessions.
|
|
3
|
+
*
|
|
4
|
+
* Provides Read, Write, Edit, Glob, Grep, and Bash tools scoped to a workdir.
|
|
5
|
+
* Used by cognitive-provider.ts to give the reasoner-actor real file access.
|
|
6
|
+
*
|
|
7
|
+
* PRD-057 / S2 §3.3 / C5: moved from `bridge/domains/sessions/bridge-tools.ts`
|
|
8
|
+
* to `runtime/sessions/runtime-tools.ts`. Legacy `createBridgeToolProvider`
|
|
9
|
+
* is retained as an alias export for existing callers; new callers should
|
|
10
|
+
* use `createRuntimeToolProvider`.
|
|
11
|
+
*/
|
|
12
|
+
import type { ToolProvider } from '@methodts/pacta';
|
|
13
|
+
/**
|
|
14
|
+
* Canonical name after C5 rename (PRD-057 / S2 §3.3). Use this for new code.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createRuntimeToolProvider(workdir: string): ToolProvider;
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated Use `createRuntimeToolProvider`. Legacy alias preserved for
|
|
19
|
+
* bridge-internal callers during the PRD-057 migration window; removed in C7.
|
|
20
|
+
*/
|
|
21
|
+
export declare const createBridgeToolProvider: typeof createRuntimeToolProvider;
|
|
22
|
+
//# sourceMappingURL=runtime-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-tools.d.ts","sourceRoot":"","sources":["../../src/sessions/runtime-tools.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,iBAAiB,CAAC;AAqChF;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAuGvE;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,kCAA4B,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Runtime Tool Provider — real filesystem-backed tools for cognitive sessions.
|
|
4
|
+
*
|
|
5
|
+
* Provides Read, Write, Edit, Glob, Grep, and Bash tools scoped to a workdir.
|
|
6
|
+
* Used by cognitive-provider.ts to give the reasoner-actor real file access.
|
|
7
|
+
*
|
|
8
|
+
* PRD-057 / S2 §3.3 / C5: moved from `bridge/domains/sessions/bridge-tools.ts`
|
|
9
|
+
* to `runtime/sessions/runtime-tools.ts`. Legacy `createBridgeToolProvider`
|
|
10
|
+
* is retained as an alias export for existing callers; new callers should
|
|
11
|
+
* use `createRuntimeToolProvider`.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
15
|
+
import { resolve, dirname, relative, isAbsolute } from 'node:path';
|
|
16
|
+
const TOOL_DEFS = [
|
|
17
|
+
{ name: 'Read', description: 'Read a file by path. Input: { path: string, offset?: number, limit?: number } — offset/limit are line numbers (1-based start, count of lines). Use these for large files that exceed the 8000-char output limit.' },
|
|
18
|
+
{ name: 'Write', description: 'Write content to a file. Input: { path: string, content: string }' },
|
|
19
|
+
{ name: 'Edit', description: 'Replace a specific string in a file. Input: { path: string, old_string: string, new_string: string }' },
|
|
20
|
+
{ name: 'Glob', description: 'Find files matching a glob pattern. Input: { pattern: string }' },
|
|
21
|
+
{ name: 'Grep', description: 'Search file contents with a regex. Input: { pattern: string, path?: string }' },
|
|
22
|
+
{ name: 'Bash', description: 'Execute a shell command. Input: { command: string }' },
|
|
23
|
+
];
|
|
24
|
+
const MAX_OUTPUT = 8000;
|
|
25
|
+
const ALLOWED_COMMANDS = new Set(['git', 'npm', 'node', 'npx', 'ls', 'cat', 'find', 'grep', 'head', 'tail', 'wc', 'echo', 'pwd', 'which', 'diff', 'sort', 'uniq', 'tsc', 'test']);
|
|
26
|
+
/** Shell metacharacters that enable command chaining/injection. */
|
|
27
|
+
const SHELL_META = /[;|&`$(){}!<>\\]/;
|
|
28
|
+
function truncate(s) {
|
|
29
|
+
return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + '\n... (truncated)' : s;
|
|
30
|
+
}
|
|
31
|
+
function checkPathTraversal(workdir, filePath, rawPath) {
|
|
32
|
+
const rel = relative(workdir, filePath);
|
|
33
|
+
if (rel.startsWith('..') || isAbsolute(rel)) {
|
|
34
|
+
return { output: `Path outside workdir not allowed: ${rawPath}`, isError: true };
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/** Validate that a path argument stays within workdir (for Grep/Glob path args). */
|
|
39
|
+
function checkPathArg(workdir, pathArg) {
|
|
40
|
+
if (!pathArg || pathArg === '.')
|
|
41
|
+
return null;
|
|
42
|
+
const resolved = resolve(workdir, pathArg);
|
|
43
|
+
return checkPathTraversal(workdir, resolved, pathArg);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Canonical name after C5 rename (PRD-057 / S2 §3.3). Use this for new code.
|
|
47
|
+
*/
|
|
48
|
+
export function createRuntimeToolProvider(workdir) {
|
|
49
|
+
return {
|
|
50
|
+
list: () => TOOL_DEFS,
|
|
51
|
+
async execute(name, input) {
|
|
52
|
+
const args = (input ?? {});
|
|
53
|
+
try {
|
|
54
|
+
switch (name) {
|
|
55
|
+
case 'Read': {
|
|
56
|
+
const filePath = resolve(workdir, args.path);
|
|
57
|
+
const traversalErr = checkPathTraversal(workdir, filePath, args.path);
|
|
58
|
+
if (traversalErr)
|
|
59
|
+
return traversalErr;
|
|
60
|
+
const rawContent = readFileSync(filePath, 'utf-8');
|
|
61
|
+
// Support optional offset (1-based line start) and limit (line count) for large files.
|
|
62
|
+
if (args.offset !== undefined || args.limit !== undefined) {
|
|
63
|
+
const lines = rawContent.split('\n');
|
|
64
|
+
const start = Math.max(0, (Number(args.offset) || 1) - 1); // convert 1-based to 0-based
|
|
65
|
+
const count = Number(args.limit) || (lines.length - start);
|
|
66
|
+
const slice = lines.slice(start, start + count).join('\n');
|
|
67
|
+
const totalLines = lines.length;
|
|
68
|
+
const header = `Lines ${start + 1}-${Math.min(start + count, totalLines)} of ${totalLines}:\n`;
|
|
69
|
+
return { output: truncate(header + slice) };
|
|
70
|
+
}
|
|
71
|
+
return { output: truncate(rawContent) };
|
|
72
|
+
}
|
|
73
|
+
case 'Write': {
|
|
74
|
+
const filePath = resolve(workdir, args.path);
|
|
75
|
+
const traversalErr = checkPathTraversal(workdir, filePath, args.path);
|
|
76
|
+
if (traversalErr)
|
|
77
|
+
return traversalErr;
|
|
78
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
79
|
+
writeFileSync(filePath, args.content, 'utf-8');
|
|
80
|
+
return { output: `Written to ${args.path}` };
|
|
81
|
+
}
|
|
82
|
+
case 'Edit': {
|
|
83
|
+
const filePath = resolve(workdir, args.path);
|
|
84
|
+
const traversalErr = checkPathTraversal(workdir, filePath, args.path);
|
|
85
|
+
if (traversalErr)
|
|
86
|
+
return traversalErr;
|
|
87
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
88
|
+
const occurrences = content.split(args.old_string).length - 1;
|
|
89
|
+
if (occurrences === 0) {
|
|
90
|
+
return { output: 'String not found in file', isError: true };
|
|
91
|
+
}
|
|
92
|
+
if (occurrences >= 2) {
|
|
93
|
+
return { output: `Ambiguous: string appears ${occurrences} times. Provide more context to make it unique.`, isError: true };
|
|
94
|
+
}
|
|
95
|
+
const updated = content.replace(args.old_string, args.new_string);
|
|
96
|
+
writeFileSync(filePath, updated, 'utf-8');
|
|
97
|
+
return { output: 'Edit applied successfully' };
|
|
98
|
+
}
|
|
99
|
+
case 'Glob': {
|
|
100
|
+
// Reject patterns that attempt directory traversal
|
|
101
|
+
if (args.pattern.includes('..')) {
|
|
102
|
+
return { output: 'Glob patterns with ".." not allowed', isError: true };
|
|
103
|
+
}
|
|
104
|
+
// Use git ls-files for tracked files, fall back to find
|
|
105
|
+
try {
|
|
106
|
+
const result = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard', args.pattern], {
|
|
107
|
+
cwd: workdir, encoding: 'utf-8', timeout: 10_000,
|
|
108
|
+
});
|
|
109
|
+
return { output: truncate(result) };
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
const result = execFileSync('find', ['.', '-name', args.pattern, '-type', 'f'], {
|
|
113
|
+
cwd: workdir, encoding: 'utf-8', timeout: 10_000,
|
|
114
|
+
});
|
|
115
|
+
// Limit output to ~50 lines like the old head -50
|
|
116
|
+
const lines = result.split('\n');
|
|
117
|
+
const limited = lines.length > 50 ? lines.slice(0, 50).join('\n') : result;
|
|
118
|
+
return { output: truncate(limited) };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
case 'Grep': {
|
|
122
|
+
const target = args.path || '.';
|
|
123
|
+
const pathErr = checkPathArg(workdir, target);
|
|
124
|
+
if (pathErr)
|
|
125
|
+
return pathErr;
|
|
126
|
+
const result = execFileSync('grep', ['-rn', '--include=*', '-m', '30', args.pattern, target], {
|
|
127
|
+
cwd: workdir, encoding: 'utf-8', timeout: 10_000,
|
|
128
|
+
});
|
|
129
|
+
return { output: truncate(result) };
|
|
130
|
+
}
|
|
131
|
+
case 'Bash': {
|
|
132
|
+
const cmd = args.command.trim();
|
|
133
|
+
const baseCommand = cmd.split(/\s+/)[0];
|
|
134
|
+
if (!ALLOWED_COMMANDS.has(baseCommand)) {
|
|
135
|
+
return { output: `Command not allowed: ${baseCommand}. Allowed: ${[...ALLOWED_COMMANDS].join(', ')}`, isError: true };
|
|
136
|
+
}
|
|
137
|
+
// Reject shell metacharacters that enable command chaining/injection
|
|
138
|
+
if (SHELL_META.test(cmd)) {
|
|
139
|
+
return { output: 'Shell metacharacters (;|&`$(){}!<>) not allowed in cognitive Bash tool', isError: true };
|
|
140
|
+
}
|
|
141
|
+
const result = execSync(cmd, {
|
|
142
|
+
cwd: workdir, encoding: 'utf-8', timeout: 30_000,
|
|
143
|
+
});
|
|
144
|
+
return { output: truncate(result) };
|
|
145
|
+
}
|
|
146
|
+
default:
|
|
147
|
+
return { output: `Unknown tool: ${name}`, isError: true };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
152
|
+
return { output: msg.slice(0, 2000), isError: true };
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* @deprecated Use `createRuntimeToolProvider`. Legacy alias preserved for
|
|
159
|
+
* bridge-internal callers during the PRD-057 migration window; removed in C7.
|
|
160
|
+
*/
|
|
161
|
+
export const createBridgeToolProvider = createRuntimeToolProvider;
|
|
162
|
+
//# sourceMappingURL=runtime-tools.js.map
|