@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,58 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import { buildSignature, inputSizeBucket, signatureKey } from './signature-builder.js';
|
|
5
|
+
describe('inputSizeBucket', () => {
|
|
6
|
+
it('xs for < 1000 chars', () => assert.equal(inputSizeBucket(500), 'xs'));
|
|
7
|
+
it('s for < 10000 chars', () => assert.equal(inputSizeBucket(5000), 's'));
|
|
8
|
+
it('m for < 100000 chars', () => assert.equal(inputSizeBucket(50000), 'm'));
|
|
9
|
+
it('l for < 1000000 chars', () => assert.equal(inputSizeBucket(500000), 'l'));
|
|
10
|
+
it('xl for >= 1000000 chars', () => assert.equal(inputSizeBucket(1500000), 'xl'));
|
|
11
|
+
it('boundary: exactly 1000 is s', () => assert.equal(inputSizeBucket(1000), 's'));
|
|
12
|
+
it('boundary: exactly 0 is xs', () => assert.equal(inputSizeBucket(0), 'xs'));
|
|
13
|
+
});
|
|
14
|
+
describe('buildSignature', () => {
|
|
15
|
+
it('produces deterministic output', () => {
|
|
16
|
+
const a = buildSignature({
|
|
17
|
+
methodologyId: 'P2-SD',
|
|
18
|
+
capabilities: ['write', 'read', 'analyze'],
|
|
19
|
+
model: 'claude-opus-4-6',
|
|
20
|
+
promptCharCount: 5000,
|
|
21
|
+
});
|
|
22
|
+
const b = buildSignature({
|
|
23
|
+
methodologyId: 'P2-SD',
|
|
24
|
+
capabilities: ['analyze', 'read', 'write'], // different order
|
|
25
|
+
model: 'claude-opus-4-6',
|
|
26
|
+
promptCharCount: 5000,
|
|
27
|
+
});
|
|
28
|
+
// Capabilities should be sorted
|
|
29
|
+
assert.deepEqual(a.capabilities, ['analyze', 'read', 'write']);
|
|
30
|
+
assert.deepEqual(a, b);
|
|
31
|
+
});
|
|
32
|
+
it('maps promptCharCount to correct bucket', () => {
|
|
33
|
+
const sig = buildSignature({
|
|
34
|
+
methodologyId: 'test',
|
|
35
|
+
capabilities: [],
|
|
36
|
+
model: 'test-model',
|
|
37
|
+
promptCharCount: 150_000,
|
|
38
|
+
});
|
|
39
|
+
assert.equal(sig.inputSizeBucket, 'l');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('signatureKey', () => {
|
|
43
|
+
it('produces stable key', () => {
|
|
44
|
+
const sig = buildSignature({
|
|
45
|
+
methodologyId: 'P2-SD',
|
|
46
|
+
capabilities: ['b', 'a'],
|
|
47
|
+
model: 'opus',
|
|
48
|
+
promptCharCount: 100,
|
|
49
|
+
});
|
|
50
|
+
assert.equal(signatureKey(sig), 'P2-SD|a,b|opus|xs');
|
|
51
|
+
});
|
|
52
|
+
it('different signatures produce different keys', () => {
|
|
53
|
+
const a = buildSignature({ methodologyId: 'A', capabilities: [], model: 'x', promptCharCount: 0 });
|
|
54
|
+
const b = buildSignature({ methodologyId: 'B', capabilities: [], model: 'x', promptCharCount: 0 });
|
|
55
|
+
assert.notEqual(signatureKey(a), signatureKey(b));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=signature-builder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-builder.test.js","sourceRoot":"","sources":["../../src/cost-governor/signature-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Bucket — monotonic-clock-based rate limiter.
|
|
3
|
+
*
|
|
4
|
+
* Supports a 5h burst window + weekly cap + concurrency cap.
|
|
5
|
+
* Uses process.hrtime.bigint() for elapsed-time math to avoid
|
|
6
|
+
* wall-clock drift from system sleep.
|
|
7
|
+
*/
|
|
8
|
+
export interface TokenBucketConfig {
|
|
9
|
+
/** Max messages in the burst window. */
|
|
10
|
+
burstCapacity: number;
|
|
11
|
+
/** Burst window duration in ms (default: 5h = 18_000_000). */
|
|
12
|
+
burstWindowMs?: number;
|
|
13
|
+
/** Max messages per week (0 = unlimited). */
|
|
14
|
+
weeklyCap?: number;
|
|
15
|
+
/** Max concurrent in-flight slots. */
|
|
16
|
+
concurrentCap: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class TokenBucket {
|
|
19
|
+
private burstConsumed;
|
|
20
|
+
private weeklyConsumed;
|
|
21
|
+
private inFlight;
|
|
22
|
+
private lastRefillNs;
|
|
23
|
+
private weekStartMs;
|
|
24
|
+
readonly burstCapacity: number;
|
|
25
|
+
readonly burstWindowMs: number;
|
|
26
|
+
readonly weeklyCap: number;
|
|
27
|
+
readonly concurrentCap: number;
|
|
28
|
+
/** Messages per nanosecond refill rate. */
|
|
29
|
+
private readonly refillRatePerNs;
|
|
30
|
+
constructor(config: TokenBucketConfig);
|
|
31
|
+
/** Refill burst tokens based on elapsed monotonic time. */
|
|
32
|
+
refill(): void;
|
|
33
|
+
/** Try to consume one slot. Returns true if allowed. */
|
|
34
|
+
tryConsume(): boolean;
|
|
35
|
+
/** Release one in-flight slot. */
|
|
36
|
+
release(): void;
|
|
37
|
+
/** Current available burst tokens (after refill). */
|
|
38
|
+
available(): number;
|
|
39
|
+
/** Snapshot for persistence / debugging. */
|
|
40
|
+
snapshot(): TokenBucketSnapshot;
|
|
41
|
+
/** Restore from a persisted snapshot, clamping by elapsed time. */
|
|
42
|
+
restore(snap: TokenBucketSnapshot): void;
|
|
43
|
+
/** Utilization percentages. */
|
|
44
|
+
utilization(): {
|
|
45
|
+
burstPct: number;
|
|
46
|
+
weeklyPct: number;
|
|
47
|
+
inFlight: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export interface TokenBucketSnapshot {
|
|
51
|
+
burstConsumed: number;
|
|
52
|
+
weeklyConsumed: number;
|
|
53
|
+
inFlight: number;
|
|
54
|
+
weekStartMs: number;
|
|
55
|
+
lastRefillEpochMs: number;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=token-bucket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-bucket.d.ts","sourceRoot":"","sources":["../../src/cost-governor/token-bucket.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAE5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,MAAM,EAAE,iBAAiB;IAYrC,2DAA2D;IAC3D,MAAM,IAAI,IAAI;IA4Bd,wDAAwD;IACxD,UAAU,IAAI,OAAO;IAarB,kCAAkC;IAClC,OAAO,IAAI,IAAI;IAIf,qDAAqD;IACrD,SAAS,IAAI,MAAM;IAKnB,4CAA4C;IAC5C,QAAQ,IAAI,mBAAmB;IAU/B,mEAAmE;IACnE,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAYxC,+BAA+B;IAC/B,WAAW,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAYzE;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Token Bucket — monotonic-clock-based rate limiter.
|
|
4
|
+
*
|
|
5
|
+
* Supports a 5h burst window + weekly cap + concurrency cap.
|
|
6
|
+
* Uses process.hrtime.bigint() for elapsed-time math to avoid
|
|
7
|
+
* wall-clock drift from system sleep.
|
|
8
|
+
*/
|
|
9
|
+
export class TokenBucket {
|
|
10
|
+
burstConsumed = 0;
|
|
11
|
+
weeklyConsumed = 0;
|
|
12
|
+
inFlight = 0;
|
|
13
|
+
lastRefillNs;
|
|
14
|
+
weekStartMs;
|
|
15
|
+
burstCapacity;
|
|
16
|
+
burstWindowMs;
|
|
17
|
+
weeklyCap;
|
|
18
|
+
concurrentCap;
|
|
19
|
+
/** Messages per nanosecond refill rate. */
|
|
20
|
+
refillRatePerNs;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.burstCapacity = config.burstCapacity;
|
|
23
|
+
this.burstWindowMs = config.burstWindowMs ?? 18_000_000; // 5h
|
|
24
|
+
this.weeklyCap = config.weeklyCap ?? 0;
|
|
25
|
+
this.concurrentCap = config.concurrentCap;
|
|
26
|
+
this.refillRatePerNs =
|
|
27
|
+
this.burstCapacity / (this.burstWindowMs * 1_000_000);
|
|
28
|
+
this.lastRefillNs = process.hrtime.bigint();
|
|
29
|
+
this.weekStartMs = Date.now();
|
|
30
|
+
}
|
|
31
|
+
/** Refill burst tokens based on elapsed monotonic time. */
|
|
32
|
+
refill() {
|
|
33
|
+
const now = process.hrtime.bigint();
|
|
34
|
+
const elapsedNs = now - this.lastRefillNs;
|
|
35
|
+
// Resume-from-sleep detection: elapsed > 5min → conservative 50% reset
|
|
36
|
+
const elapsedMs = Number(elapsedNs) / 1_000_000;
|
|
37
|
+
if (elapsedMs > 300_000) {
|
|
38
|
+
this.burstConsumed = Math.floor(this.burstCapacity * 0.5);
|
|
39
|
+
this.lastRefillNs = now;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const refilled = Math.min(Number(elapsedNs) * this.refillRatePerNs, this.burstConsumed);
|
|
43
|
+
this.burstConsumed = Math.max(0, this.burstConsumed - Math.floor(refilled));
|
|
44
|
+
this.lastRefillNs = now;
|
|
45
|
+
// Weekly reset check (wall clock — only for week boundary)
|
|
46
|
+
const weekElapsedMs = Date.now() - this.weekStartMs;
|
|
47
|
+
if (weekElapsedMs >= 7 * 24 * 60 * 60 * 1000) {
|
|
48
|
+
this.weeklyConsumed = 0;
|
|
49
|
+
this.weekStartMs = Date.now();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Try to consume one slot. Returns true if allowed. */
|
|
53
|
+
tryConsume() {
|
|
54
|
+
this.refill();
|
|
55
|
+
if (this.inFlight >= this.concurrentCap)
|
|
56
|
+
return false;
|
|
57
|
+
if (this.burstConsumed >= this.burstCapacity)
|
|
58
|
+
return false;
|
|
59
|
+
if (this.weeklyCap > 0 && this.weeklyConsumed >= this.weeklyCap)
|
|
60
|
+
return false;
|
|
61
|
+
this.burstConsumed++;
|
|
62
|
+
this.weeklyConsumed++;
|
|
63
|
+
this.inFlight++;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
/** Release one in-flight slot. */
|
|
67
|
+
release() {
|
|
68
|
+
this.inFlight = Math.max(0, this.inFlight - 1);
|
|
69
|
+
}
|
|
70
|
+
/** Current available burst tokens (after refill). */
|
|
71
|
+
available() {
|
|
72
|
+
this.refill();
|
|
73
|
+
return Math.max(0, this.burstCapacity - this.burstConsumed);
|
|
74
|
+
}
|
|
75
|
+
/** Snapshot for persistence / debugging. */
|
|
76
|
+
snapshot() {
|
|
77
|
+
return {
|
|
78
|
+
burstConsumed: this.burstConsumed,
|
|
79
|
+
weeklyConsumed: this.weeklyConsumed,
|
|
80
|
+
inFlight: this.inFlight,
|
|
81
|
+
weekStartMs: this.weekStartMs,
|
|
82
|
+
lastRefillEpochMs: Date.now(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Restore from a persisted snapshot, clamping by elapsed time. */
|
|
86
|
+
restore(snap) {
|
|
87
|
+
const elapsedMs = Date.now() - snap.lastRefillEpochMs;
|
|
88
|
+
const refilled = Math.floor((elapsedMs * 1_000_000) * this.refillRatePerNs);
|
|
89
|
+
this.burstConsumed = Math.max(0, snap.burstConsumed - refilled);
|
|
90
|
+
this.weeklyConsumed = snap.weeklyConsumed;
|
|
91
|
+
this.weekStartMs = snap.weekStartMs;
|
|
92
|
+
this.inFlight = 0; // In-flight slots lost on restart
|
|
93
|
+
this.lastRefillNs = process.hrtime.bigint();
|
|
94
|
+
}
|
|
95
|
+
/** Utilization percentages. */
|
|
96
|
+
utilization() {
|
|
97
|
+
this.refill();
|
|
98
|
+
return {
|
|
99
|
+
burstPct: this.burstCapacity > 0
|
|
100
|
+
? (this.burstConsumed / this.burstCapacity) * 100
|
|
101
|
+
: 0,
|
|
102
|
+
weeklyPct: this.weeklyCap > 0
|
|
103
|
+
? (this.weeklyConsumed / this.weeklyCap) * 100
|
|
104
|
+
: 0,
|
|
105
|
+
inFlight: this.inFlight,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=token-bucket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-bucket.js","sourceRoot":"","sources":["../../src/cost-governor/token-bucket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-bucket.test.d.ts","sourceRoot":"","sources":["../../src/cost-governor/token-bucket.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import { TokenBucket } from './token-bucket.js';
|
|
5
|
+
describe('TokenBucket', () => {
|
|
6
|
+
it('allows consumption up to burst capacity', () => {
|
|
7
|
+
const bucket = new TokenBucket({ burstCapacity: 3, concurrentCap: 10 });
|
|
8
|
+
assert.ok(bucket.tryConsume());
|
|
9
|
+
assert.ok(bucket.tryConsume());
|
|
10
|
+
assert.ok(bucket.tryConsume());
|
|
11
|
+
assert.ok(!bucket.tryConsume()); // exhausted
|
|
12
|
+
});
|
|
13
|
+
it('enforces concurrent cap', () => {
|
|
14
|
+
const bucket = new TokenBucket({ burstCapacity: 100, concurrentCap: 2 });
|
|
15
|
+
assert.ok(bucket.tryConsume());
|
|
16
|
+
assert.ok(bucket.tryConsume());
|
|
17
|
+
assert.ok(!bucket.tryConsume()); // concurrent cap hit
|
|
18
|
+
bucket.release();
|
|
19
|
+
assert.ok(bucket.tryConsume()); // now we have room
|
|
20
|
+
});
|
|
21
|
+
it('available never goes negative', () => {
|
|
22
|
+
const bucket = new TokenBucket({ burstCapacity: 2, concurrentCap: 10 });
|
|
23
|
+
bucket.tryConsume();
|
|
24
|
+
bucket.tryConsume();
|
|
25
|
+
bucket.tryConsume(); // fails but shouldn't break
|
|
26
|
+
assert.ok(bucket.available() >= 0);
|
|
27
|
+
});
|
|
28
|
+
it('release does not underflow inFlight', () => {
|
|
29
|
+
const bucket = new TokenBucket({ burstCapacity: 10, concurrentCap: 10 });
|
|
30
|
+
bucket.release(); // release without consume
|
|
31
|
+
bucket.release();
|
|
32
|
+
// Should not crash or go negative
|
|
33
|
+
const snap = bucket.snapshot();
|
|
34
|
+
assert.equal(snap.inFlight, 0);
|
|
35
|
+
});
|
|
36
|
+
it('snapshot and restore round-trip', () => {
|
|
37
|
+
const bucket = new TokenBucket({ burstCapacity: 100, concurrentCap: 10 });
|
|
38
|
+
bucket.tryConsume();
|
|
39
|
+
bucket.tryConsume();
|
|
40
|
+
const snap = bucket.snapshot();
|
|
41
|
+
const bucket2 = new TokenBucket({ burstCapacity: 100, concurrentCap: 10 });
|
|
42
|
+
bucket2.restore(snap);
|
|
43
|
+
// inFlight is always 0 after restore (in-flight lost on restart)
|
|
44
|
+
assert.equal(bucket2.snapshot().inFlight, 0);
|
|
45
|
+
// burstConsumed should be approximately restored (minus refill for elapsed)
|
|
46
|
+
assert.ok(bucket2.snapshot().burstConsumed <= 2);
|
|
47
|
+
});
|
|
48
|
+
it('utilization reports percentages', () => {
|
|
49
|
+
const bucket = new TokenBucket({ burstCapacity: 10, concurrentCap: 5, weeklyCap: 100 });
|
|
50
|
+
bucket.tryConsume();
|
|
51
|
+
const util = bucket.utilization();
|
|
52
|
+
assert.equal(util.burstPct, 10);
|
|
53
|
+
assert.equal(util.weeklyPct, 1);
|
|
54
|
+
assert.equal(util.inFlight, 1);
|
|
55
|
+
});
|
|
56
|
+
it('weekly cap enforcement', () => {
|
|
57
|
+
const bucket = new TokenBucket({ burstCapacity: 1000, concurrentCap: 1000, weeklyCap: 3 });
|
|
58
|
+
assert.ok(bucket.tryConsume());
|
|
59
|
+
bucket.release();
|
|
60
|
+
assert.ok(bucket.tryConsume());
|
|
61
|
+
bucket.release();
|
|
62
|
+
assert.ok(bucket.tryConsume());
|
|
63
|
+
bucket.release();
|
|
64
|
+
assert.ok(!bucket.tryConsume()); // weekly cap hit
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=token-bucket.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-bucket.test.js","sourceRoot":"","sources":["../../src/cost-governor/token-bucket.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CortexDlqObserver — external DLQ emission path for PactDeadLetterEvent.
|
|
3
|
+
*
|
|
4
|
+
* PRD-062 / S5 §2.4 + §7. Coordinates single-emit (gate G-DLQ-SINGLE-EMIT)
|
|
5
|
+
* with the `CortexJobBackedExecutor` so that each sessionId emits at most
|
|
6
|
+
* ONE `PactDeadLetterEvent` across the union of inline + external paths.
|
|
7
|
+
*/
|
|
8
|
+
import type { PactDeadLetterEvent } from '@methodts/pacta';
|
|
9
|
+
import type { ContinuationEnvelope } from '../ports/continuation-envelope.js';
|
|
10
|
+
import type { DlqObserver, DlqRecord } from '../ports/dlq-observer.js';
|
|
11
|
+
import type { CortexJobBackedExecutor } from '../executors/cortex-job-backed-executor.js';
|
|
12
|
+
export interface CortexDlqObserverOptions {
|
|
13
|
+
executor: CortexJobBackedExecutor;
|
|
14
|
+
emitAgentEvent?: (event: PactDeadLetterEvent) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare class CortexDlqObserver implements DlqObserver {
|
|
17
|
+
private readonly executor;
|
|
18
|
+
private readonly emit?;
|
|
19
|
+
constructor(options: CortexDlqObserverOptions);
|
|
20
|
+
onDeadLetter(envelope: ContinuationEnvelope, record: DlqRecord): Promise<PactDeadLetterEvent | null>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cortex-dlq-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cortex-dlq-observer.d.ts","sourceRoot":"","sources":["../../src/dlq/cortex-dlq-observer.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAE1F,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACvD;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAuC;gBAEjD,OAAO,EAAE,wBAAwB;IAKvC,YAAY,CAChB,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAevC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* CortexDlqObserver — external DLQ emission path for PactDeadLetterEvent.
|
|
4
|
+
*
|
|
5
|
+
* PRD-062 / S5 §2.4 + §7. Coordinates single-emit (gate G-DLQ-SINGLE-EMIT)
|
|
6
|
+
* with the `CortexJobBackedExecutor` so that each sessionId emits at most
|
|
7
|
+
* ONE `PactDeadLetterEvent` across the union of inline + external paths.
|
|
8
|
+
*/
|
|
9
|
+
export class CortexDlqObserver {
|
|
10
|
+
executor;
|
|
11
|
+
emit;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.executor = options.executor;
|
|
14
|
+
this.emit = options.emitAgentEvent;
|
|
15
|
+
}
|
|
16
|
+
async onDeadLetter(envelope, record) {
|
|
17
|
+
if (await this.executor.isDlqEmitted(envelope.sessionId)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
// Delegate to the executor so the emission + finalization path stays
|
|
21
|
+
// centralised. The executor persists the DLQ-emitted flag, so
|
|
22
|
+
// subsequent calls for the same sessionId return null.
|
|
23
|
+
const event = await this.executor.emitInlineDeadLetter(envelope, record.lastError, record.attempts);
|
|
24
|
+
if (event && this.emit)
|
|
25
|
+
this.emit(event);
|
|
26
|
+
return event;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=cortex-dlq-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cortex-dlq-observer.js","sourceRoot":"","sources":["../../src/dlq/cortex-dlq-observer.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC;;;;;;GAMG;AAeH,MAAM,OAAO,iBAAiB;IACX,QAAQ,CAA0B;IAClC,IAAI,CAAwC;IAE7D,YAAY,OAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,QAA8B,EAC9B,MAAiB;QAEjB,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,qEAAqE;QACrE,8DAA8D;QAC9D,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CACpD,QAAQ,EACR,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,CAChB,CAAC;QACF,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dlq-observer.test.d.ts","sourceRoot":"","sources":["../../src/dlq/dlq-observer.test.ts"],"names":[],"mappings":"AACA;;;;;GAKG"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* G-DLQ-SINGLE-EMIT — PRD-062 / S5 §7.
|
|
4
|
+
*
|
|
5
|
+
* Both inline (from the handler) and external (from CortexDlqObserver)
|
|
6
|
+
* DLQ paths must produce at most ONE `PactDeadLetterEvent` per sessionId.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
9
|
+
import assert from 'node:assert/strict';
|
|
10
|
+
import { CortexJobBackedExecutor } from '../executors/cortex-job-backed-executor.js';
|
|
11
|
+
import { CortexDlqObserver } from './cortex-dlq-observer.js';
|
|
12
|
+
import { makeInMemorySessionStore, sampleEnvelope } from '../__fixtures__/executor-fixtures.js';
|
|
13
|
+
describe('G-DLQ-SINGLE-EMIT — only one PactDeadLetterEvent per sessionId', () => {
|
|
14
|
+
let events;
|
|
15
|
+
let executor;
|
|
16
|
+
let observer;
|
|
17
|
+
let envelope;
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
events = [];
|
|
20
|
+
const store = makeInMemorySessionStore();
|
|
21
|
+
envelope = sampleEnvelope();
|
|
22
|
+
await store.create({
|
|
23
|
+
schemaVersion: 1,
|
|
24
|
+
sessionId: envelope.sessionId,
|
|
25
|
+
scopeId: 'scope',
|
|
26
|
+
pactRef: { id: envelope.pactKey, version: '1', fingerprint: envelope.pactKey },
|
|
27
|
+
status: 'running',
|
|
28
|
+
createdAt: new Date().toISOString(),
|
|
29
|
+
updatedAt: new Date().toISOString(),
|
|
30
|
+
latestCheckpointSequence: null,
|
|
31
|
+
depth: 0,
|
|
32
|
+
metadata: { '__method.lastAckedTurn': -1 },
|
|
33
|
+
});
|
|
34
|
+
executor = new CortexJobBackedExecutor({
|
|
35
|
+
sessionStore: store,
|
|
36
|
+
workerId: 'test-worker',
|
|
37
|
+
emitAgentEvent: (e) => events.push(e),
|
|
38
|
+
});
|
|
39
|
+
observer = new CortexDlqObserver({
|
|
40
|
+
executor,
|
|
41
|
+
emitAgentEvent: (_e) => {
|
|
42
|
+
/* counted already by executor.emitAgentEvent */
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('inline path emits one event on first fire', async () => {
|
|
47
|
+
const event = await executor.emitInlineDeadLetter(envelope, 'boom', 1);
|
|
48
|
+
assert.ok(event);
|
|
49
|
+
assert.equal(events.length, 1);
|
|
50
|
+
assert.equal(events[0].type, 'pact.dead_letter');
|
|
51
|
+
assert.equal(events[0].sessionId, envelope.sessionId);
|
|
52
|
+
assert.equal(events[0].lastError, 'boom');
|
|
53
|
+
assert.equal(events[0].attempts, 1);
|
|
54
|
+
});
|
|
55
|
+
it('inline path is idempotent — second fire returns null', async () => {
|
|
56
|
+
await executor.emitInlineDeadLetter(envelope, 'boom', 1);
|
|
57
|
+
const second = await executor.emitInlineDeadLetter(envelope, 'boom again', 2);
|
|
58
|
+
assert.equal(second, null);
|
|
59
|
+
assert.equal(events.length, 1);
|
|
60
|
+
});
|
|
61
|
+
it('external DLQ path suppresses when inline already fired', async () => {
|
|
62
|
+
await executor.emitInlineDeadLetter(envelope, 'inline-boom', 1);
|
|
63
|
+
const external = await observer.onDeadLetter(envelope, {
|
|
64
|
+
jobId: 'job-123',
|
|
65
|
+
attempts: 4,
|
|
66
|
+
lastError: 'exhausted',
|
|
67
|
+
deadLetteredAt: Date.now(),
|
|
68
|
+
});
|
|
69
|
+
assert.equal(external, null);
|
|
70
|
+
assert.equal(events.length, 1);
|
|
71
|
+
});
|
|
72
|
+
it('external path fires once if inline never did', async () => {
|
|
73
|
+
const event = await observer.onDeadLetter(envelope, {
|
|
74
|
+
jobId: 'job-123',
|
|
75
|
+
attempts: 4,
|
|
76
|
+
lastError: 'exhausted',
|
|
77
|
+
deadLetteredAt: Date.now(),
|
|
78
|
+
});
|
|
79
|
+
assert.ok(event);
|
|
80
|
+
assert.equal(events.length, 1);
|
|
81
|
+
assert.equal(events[0].attempts, 4);
|
|
82
|
+
});
|
|
83
|
+
it('both paths firing sequentially for the same sessionId emit exactly one event', async () => {
|
|
84
|
+
await executor.emitInlineDeadLetter(envelope, 'inline', 1);
|
|
85
|
+
await observer.onDeadLetter(envelope, {
|
|
86
|
+
jobId: 'job-123',
|
|
87
|
+
attempts: 4,
|
|
88
|
+
lastError: 'external',
|
|
89
|
+
deadLetteredAt: Date.now(),
|
|
90
|
+
});
|
|
91
|
+
assert.equal(events.length, 1, 'exactly one PactDeadLetterEvent per sessionId');
|
|
92
|
+
// Repeated calls remain idempotent.
|
|
93
|
+
await executor.emitInlineDeadLetter(envelope, 'again', 5);
|
|
94
|
+
await observer.onDeadLetter(envelope, {
|
|
95
|
+
jobId: 'j2',
|
|
96
|
+
attempts: 4,
|
|
97
|
+
lastError: 'again',
|
|
98
|
+
deadLetteredAt: Date.now(),
|
|
99
|
+
});
|
|
100
|
+
assert.equal(events.length, 1);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=dlq-observer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dlq-observer.test.js","sourceRoot":"","sources":["../../src/dlq/dlq-observer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dlq/index.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EACL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,wBAAwB,GACzB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dlq/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC;;GAEG;AAEH,OAAO,EACL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD 026 Phase 2: MCP Adapter Layer
|
|
3
|
+
*
|
|
4
|
+
* Translates RuntimeEvent → legacy channel/event shapes so that
|
|
5
|
+
* bridge_read_events and bridge_all_events MCP tools return
|
|
6
|
+
* backward-compatible JSON. Used during the transition from channels
|
|
7
|
+
* to bus-native reads (Phase 3).
|
|
8
|
+
*/
|
|
9
|
+
import type { RuntimeEvent } from '../ports/event-bus.js';
|
|
10
|
+
/**
|
|
11
|
+
* Convert a RuntimeEvent to the legacy ChannelMessage shape used by
|
|
12
|
+
* `bridge_read_events` (session-scoped channel reads).
|
|
13
|
+
*
|
|
14
|
+
* Legacy shape:
|
|
15
|
+
* ```json
|
|
16
|
+
* { "sequence": N, "timestamp": "...", "sender": "...", "type": "...", "content": {...} }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function toChannelMessage(event: RuntimeEvent): {
|
|
20
|
+
sequence: number;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
sender: string;
|
|
23
|
+
type: string;
|
|
24
|
+
content: Record<string, unknown>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Convert an array of RuntimeEvents to the legacy all-events wrapper shape
|
|
28
|
+
* used by `bridge_all_events` (cross-session event polling).
|
|
29
|
+
*
|
|
30
|
+
* Legacy shape:
|
|
31
|
+
* ```json
|
|
32
|
+
* {
|
|
33
|
+
* "messages": [...],
|
|
34
|
+
* "last_sequence": N,
|
|
35
|
+
* "has_more": false
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function toAllEventsWrapper(events: RuntimeEvent[], hasMore?: boolean): {
|
|
40
|
+
messages: Array<{
|
|
41
|
+
sequence: number;
|
|
42
|
+
timestamp: string;
|
|
43
|
+
sender: string;
|
|
44
|
+
type: string;
|
|
45
|
+
content: Record<string, unknown>;
|
|
46
|
+
}>;
|
|
47
|
+
last_sequence: number;
|
|
48
|
+
has_more: boolean;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/event-bus/adapters.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAQA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,UAAQ,GACd;IACD,QAAQ,EAAE,KAAK,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CASA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* PRD 026 Phase 2: MCP Adapter Layer
|
|
4
|
+
*
|
|
5
|
+
* Translates RuntimeEvent → legacy channel/event shapes so that
|
|
6
|
+
* bridge_read_events and bridge_all_events MCP tools return
|
|
7
|
+
* backward-compatible JSON. Used during the transition from channels
|
|
8
|
+
* to bus-native reads (Phase 3).
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Convert a RuntimeEvent to the legacy ChannelMessage shape used by
|
|
12
|
+
* `bridge_read_events` (session-scoped channel reads).
|
|
13
|
+
*
|
|
14
|
+
* Legacy shape:
|
|
15
|
+
* ```json
|
|
16
|
+
* { "sequence": N, "timestamp": "...", "sender": "...", "type": "...", "content": {...} }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function toChannelMessage(event) {
|
|
20
|
+
return {
|
|
21
|
+
sequence: event.sequence,
|
|
22
|
+
timestamp: event.timestamp,
|
|
23
|
+
sender: event.source,
|
|
24
|
+
type: event.type,
|
|
25
|
+
content: event.payload,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Convert an array of RuntimeEvents to the legacy all-events wrapper shape
|
|
30
|
+
* used by `bridge_all_events` (cross-session event polling).
|
|
31
|
+
*
|
|
32
|
+
* Legacy shape:
|
|
33
|
+
* ```json
|
|
34
|
+
* {
|
|
35
|
+
* "messages": [...],
|
|
36
|
+
* "last_sequence": N,
|
|
37
|
+
* "has_more": false
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function toAllEventsWrapper(events, hasMore = false) {
|
|
42
|
+
const messages = events.map(toChannelMessage);
|
|
43
|
+
return {
|
|
44
|
+
messages,
|
|
45
|
+
last_sequence: messages.length > 0
|
|
46
|
+
? messages[messages.length - 1].sequence
|
|
47
|
+
: 0,
|
|
48
|
+
has_more: hasMore,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=adapters.js.map
|