agentic-qe 3.3.4 → 3.4.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/.claude/agents/v3/qe-queen-coordinator.md +332 -166
- package/.claude/helpers/statusline-v3.cjs +85 -42
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +7 -4
- package/README.md +71 -2
- package/package.json +1 -1
- package/scripts/cloud-db-config.json +10 -5
- package/scripts/merge-v3-to-root.sql +48 -0
- package/v3/CHANGELOG.md +156 -0
- package/v3/README.md +118 -1
- package/v3/assets/agents/v3/qe-queen-coordinator.md +332 -166
- package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +7 -4
- package/v3/dist/adapters/a2a/agent-cards/generator.d.ts +153 -0
- package/v3/dist/adapters/a2a/agent-cards/generator.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/agent-cards/generator.js +478 -0
- package/v3/dist/adapters/a2a/agent-cards/generator.js.map +1 -0
- package/v3/dist/adapters/a2a/agent-cards/schema.d.ts +274 -0
- package/v3/dist/adapters/a2a/agent-cards/schema.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/agent-cards/schema.js +135 -0
- package/v3/dist/adapters/a2a/agent-cards/schema.js.map +1 -0
- package/v3/dist/adapters/a2a/agent-cards/validator.d.ts +514 -0
- package/v3/dist/adapters/a2a/agent-cards/validator.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/agent-cards/validator.js +555 -0
- package/v3/dist/adapters/a2a/agent-cards/validator.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/index.d.ts +23 -0
- package/v3/dist/adapters/a2a/auth/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/index.js +85 -0
- package/v3/dist/adapters/a2a/auth/index.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/jwt-utils.d.ts +215 -0
- package/v3/dist/adapters/a2a/auth/jwt-utils.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/jwt-utils.js +314 -0
- package/v3/dist/adapters/a2a/auth/jwt-utils.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/middleware.d.ts +173 -0
- package/v3/dist/adapters/a2a/auth/middleware.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/middleware.js +300 -0
- package/v3/dist/adapters/a2a/auth/middleware.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.d.ts +308 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.js +573 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/routes.d.ts +244 -0
- package/v3/dist/adapters/a2a/auth/routes.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/routes.js +496 -0
- package/v3/dist/adapters/a2a/auth/routes.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/scopes.d.ts +219 -0
- package/v3/dist/adapters/a2a/auth/scopes.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/scopes.js +292 -0
- package/v3/dist/adapters/a2a/auth/scopes.js.map +1 -0
- package/v3/dist/adapters/a2a/auth/token-store.d.ts +278 -0
- package/v3/dist/adapters/a2a/auth/token-store.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/auth/token-store.js +453 -0
- package/v3/dist/adapters/a2a/auth/token-store.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/agent-health.d.ts +226 -0
- package/v3/dist/adapters/a2a/discovery/agent-health.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/agent-health.js +426 -0
- package/v3/dist/adapters/a2a/discovery/agent-health.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/discovery-service.d.ts +296 -0
- package/v3/dist/adapters/a2a/discovery/discovery-service.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/discovery-service.js +520 -0
- package/v3/dist/adapters/a2a/discovery/discovery-service.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/file-watcher.d.ts +166 -0
- package/v3/dist/adapters/a2a/discovery/file-watcher.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/file-watcher.js +385 -0
- package/v3/dist/adapters/a2a/discovery/file-watcher.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/hot-reload-service.d.ts +226 -0
- package/v3/dist/adapters/a2a/discovery/hot-reload-service.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/hot-reload-service.js +433 -0
- package/v3/dist/adapters/a2a/discovery/hot-reload-service.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/index.d.ts +18 -0
- package/v3/dist/adapters/a2a/discovery/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/index.js +54 -0
- package/v3/dist/adapters/a2a/discovery/index.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/metrics.d.ts +200 -0
- package/v3/dist/adapters/a2a/discovery/metrics.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/metrics.js +371 -0
- package/v3/dist/adapters/a2a/discovery/metrics.js.map +1 -0
- package/v3/dist/adapters/a2a/discovery/routes.d.ts +184 -0
- package/v3/dist/adapters/a2a/discovery/routes.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/discovery/routes.js +453 -0
- package/v3/dist/adapters/a2a/discovery/routes.js.map +1 -0
- package/v3/dist/adapters/a2a/index.d.ts +18 -0
- package/v3/dist/adapters/a2a/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/index.js +139 -0
- package/v3/dist/adapters/a2a/index.js.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/envelope.d.ts +312 -0
- package/v3/dist/adapters/a2a/jsonrpc/envelope.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/envelope.js +554 -0
- package/v3/dist/adapters/a2a/jsonrpc/envelope.js.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/errors.d.ts +244 -0
- package/v3/dist/adapters/a2a/jsonrpc/errors.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/errors.js +365 -0
- package/v3/dist/adapters/a2a/jsonrpc/errors.js.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/index.d.ts +14 -0
- package/v3/dist/adapters/a2a/jsonrpc/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/index.js +59 -0
- package/v3/dist/adapters/a2a/jsonrpc/index.js.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/methods.d.ts +400 -0
- package/v3/dist/adapters/a2a/jsonrpc/methods.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/jsonrpc/methods.js +249 -0
- package/v3/dist/adapters/a2a/jsonrpc/methods.js.map +1 -0
- package/v3/dist/adapters/a2a/notifications/index.d.ts +60 -0
- package/v3/dist/adapters/a2a/notifications/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/notifications/index.js +99 -0
- package/v3/dist/adapters/a2a/notifications/index.js.map +1 -0
- package/v3/dist/adapters/a2a/notifications/retry-queue.d.ts +225 -0
- package/v3/dist/adapters/a2a/notifications/retry-queue.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/notifications/retry-queue.js +449 -0
- package/v3/dist/adapters/a2a/notifications/retry-queue.js.map +1 -0
- package/v3/dist/adapters/a2a/notifications/signature.d.ts +133 -0
- package/v3/dist/adapters/a2a/notifications/signature.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/notifications/signature.js +244 -0
- package/v3/dist/adapters/a2a/notifications/signature.js.map +1 -0
- package/v3/dist/adapters/a2a/notifications/subscription-store.d.ts +243 -0
- package/v3/dist/adapters/a2a/notifications/subscription-store.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/notifications/subscription-store.js +486 -0
- package/v3/dist/adapters/a2a/notifications/subscription-store.js.map +1 -0
- package/v3/dist/adapters/a2a/notifications/webhook-service.d.ts +257 -0
- package/v3/dist/adapters/a2a/notifications/webhook-service.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/notifications/webhook-service.js +542 -0
- package/v3/dist/adapters/a2a/notifications/webhook-service.js.map +1 -0
- package/v3/dist/adapters/a2a/tasks/index.d.ts +16 -0
- package/v3/dist/adapters/a2a/tasks/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/tasks/index.js +33 -0
- package/v3/dist/adapters/a2a/tasks/index.js.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-manager.d.ts +306 -0
- package/v3/dist/adapters/a2a/tasks/task-manager.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-manager.js +562 -0
- package/v3/dist/adapters/a2a/tasks/task-manager.js.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-router.d.ts +270 -0
- package/v3/dist/adapters/a2a/tasks/task-router.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-router.js +574 -0
- package/v3/dist/adapters/a2a/tasks/task-router.js.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-store.d.ts +251 -0
- package/v3/dist/adapters/a2a/tasks/task-store.d.ts.map +1 -0
- package/v3/dist/adapters/a2a/tasks/task-store.js +468 -0
- package/v3/dist/adapters/a2a/tasks/task-store.js.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/aria-attributes.d.ts +294 -0
- package/v3/dist/adapters/a2ui/accessibility/aria-attributes.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/aria-attributes.js +447 -0
- package/v3/dist/adapters/a2ui/accessibility/aria-attributes.js.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/index.d.ts +83 -0
- package/v3/dist/adapters/a2ui/accessibility/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/index.js +155 -0
- package/v3/dist/adapters/a2ui/accessibility/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/keyboard-nav.d.ts +177 -0
- package/v3/dist/adapters/a2ui/accessibility/keyboard-nav.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/keyboard-nav.js +638 -0
- package/v3/dist/adapters/a2ui/accessibility/keyboard-nav.js.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/wcag-validator.d.ts +186 -0
- package/v3/dist/adapters/a2ui/accessibility/wcag-validator.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/accessibility/wcag-validator.js +816 -0
- package/v3/dist/adapters/a2ui/accessibility/wcag-validator.js.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/component-schemas.d.ts +227 -0
- package/v3/dist/adapters/a2ui/catalog/component-schemas.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/component-schemas.js +1090 -0
- package/v3/dist/adapters/a2ui/catalog/component-schemas.js.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/index.d.ts +55 -0
- package/v3/dist/adapters/a2ui/catalog/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/index.js +100 -0
- package/v3/dist/adapters/a2ui/catalog/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/qe-catalog.d.ts +456 -0
- package/v3/dist/adapters/a2ui/catalog/qe-catalog.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/qe-catalog.js +413 -0
- package/v3/dist/adapters/a2ui/catalog/qe-catalog.js.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/standard-catalog.d.ts +581 -0
- package/v3/dist/adapters/a2ui/catalog/standard-catalog.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/catalog/standard-catalog.js +409 -0
- package/v3/dist/adapters/a2ui/catalog/standard-catalog.js.map +1 -0
- package/v3/dist/adapters/a2ui/data/bound-value.d.ts +252 -0
- package/v3/dist/adapters/a2ui/data/bound-value.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/data/bound-value.js +403 -0
- package/v3/dist/adapters/a2ui/data/bound-value.js.map +1 -0
- package/v3/dist/adapters/a2ui/data/index.d.ts +14 -0
- package/v3/dist/adapters/a2ui/data/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/data/index.js +41 -0
- package/v3/dist/adapters/a2ui/data/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/data/json-pointer-resolver.d.ts +187 -0
- package/v3/dist/adapters/a2ui/data/json-pointer-resolver.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/data/json-pointer-resolver.js +425 -0
- package/v3/dist/adapters/a2ui/data/json-pointer-resolver.js.map +1 -0
- package/v3/dist/adapters/a2ui/data/reactive-store.d.ts +241 -0
- package/v3/dist/adapters/a2ui/data/reactive-store.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/data/reactive-store.js +461 -0
- package/v3/dist/adapters/a2ui/data/reactive-store.js.map +1 -0
- package/v3/dist/adapters/a2ui/index.d.ts +17 -0
- package/v3/dist/adapters/a2ui/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/index.js +119 -0
- package/v3/dist/adapters/a2ui/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/integration/agui-sync.d.ts +259 -0
- package/v3/dist/adapters/a2ui/integration/agui-sync.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/integration/agui-sync.js +559 -0
- package/v3/dist/adapters/a2ui/integration/agui-sync.js.map +1 -0
- package/v3/dist/adapters/a2ui/integration/index.d.ts +11 -0
- package/v3/dist/adapters/a2ui/integration/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/integration/index.js +23 -0
- package/v3/dist/adapters/a2ui/integration/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/integration/surface-state-bridge.d.ts +209 -0
- package/v3/dist/adapters/a2ui/integration/surface-state-bridge.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/integration/surface-state-bridge.js +545 -0
- package/v3/dist/adapters/a2ui/integration/surface-state-bridge.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/component-builder.d.ts +227 -0
- package/v3/dist/adapters/a2ui/renderer/component-builder.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/component-builder.js +488 -0
- package/v3/dist/adapters/a2ui/renderer/component-builder.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/index.d.ts +16 -0
- package/v3/dist/adapters/a2ui/renderer/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/index.js +50 -0
- package/v3/dist/adapters/a2ui/renderer/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/message-types.d.ts +299 -0
- package/v3/dist/adapters/a2ui/renderer/message-types.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/message-types.js +187 -0
- package/v3/dist/adapters/a2ui/renderer/message-types.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/surface-generator.d.ts +210 -0
- package/v3/dist/adapters/a2ui/renderer/surface-generator.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/surface-generator.js +586 -0
- package/v3/dist/adapters/a2ui/renderer/surface-generator.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/accessibility-surface.d.ts +149 -0
- package/v3/dist/adapters/a2ui/renderer/templates/accessibility-surface.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/accessibility-surface.js +414 -0
- package/v3/dist/adapters/a2ui/renderer/templates/accessibility-surface.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/coverage-surface.d.ts +95 -0
- package/v3/dist/adapters/a2ui/renderer/templates/coverage-surface.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/coverage-surface.js +231 -0
- package/v3/dist/adapters/a2ui/renderer/templates/coverage-surface.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/index.d.ts +12 -0
- package/v3/dist/adapters/a2ui/renderer/templates/index.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/index.js +16 -0
- package/v3/dist/adapters/a2ui/renderer/templates/index.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/security-surface.d.ts +121 -0
- package/v3/dist/adapters/a2ui/renderer/templates/security-surface.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/security-surface.js +367 -0
- package/v3/dist/adapters/a2ui/renderer/templates/security-surface.js.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/test-results-surface.d.ts +104 -0
- package/v3/dist/adapters/a2ui/renderer/templates/test-results-surface.d.ts.map +1 -0
- package/v3/dist/adapters/a2ui/renderer/templates/test-results-surface.js +294 -0
- package/v3/dist/adapters/a2ui/renderer/templates/test-results-surface.js.map +1 -0
- package/v3/dist/adapters/ag-ui/backpressure-handler.d.ts +201 -0
- package/v3/dist/adapters/ag-ui/backpressure-handler.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/backpressure-handler.js +399 -0
- package/v3/dist/adapters/ag-ui/backpressure-handler.js.map +1 -0
- package/v3/dist/adapters/ag-ui/event-adapter.d.ts +360 -0
- package/v3/dist/adapters/ag-ui/event-adapter.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/event-adapter.js +1083 -0
- package/v3/dist/adapters/ag-ui/event-adapter.js.map +1 -0
- package/v3/dist/adapters/ag-ui/event-batcher.d.ts +242 -0
- package/v3/dist/adapters/ag-ui/event-batcher.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/event-batcher.js +444 -0
- package/v3/dist/adapters/ag-ui/event-batcher.js.map +1 -0
- package/v3/dist/adapters/ag-ui/event-types.d.ts +450 -0
- package/v3/dist/adapters/ag-ui/event-types.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/event-types.js +173 -0
- package/v3/dist/adapters/ag-ui/event-types.js.map +1 -0
- package/v3/dist/adapters/ag-ui/index.d.ts +17 -0
- package/v3/dist/adapters/ag-ui/index.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/index.js +47 -0
- package/v3/dist/adapters/ag-ui/index.js.map +1 -0
- package/v3/dist/adapters/ag-ui/json-patch-utils.d.ts +136 -0
- package/v3/dist/adapters/ag-ui/json-patch-utils.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/json-patch-utils.js +574 -0
- package/v3/dist/adapters/ag-ui/json-patch-utils.js.map +1 -0
- package/v3/dist/adapters/ag-ui/json-patch.d.ts +241 -0
- package/v3/dist/adapters/ag-ui/json-patch.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/json-patch.js +726 -0
- package/v3/dist/adapters/ag-ui/json-patch.js.map +1 -0
- package/v3/dist/adapters/ag-ui/state-delta-cache.d.ts +218 -0
- package/v3/dist/adapters/ag-ui/state-delta-cache.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/state-delta-cache.js +422 -0
- package/v3/dist/adapters/ag-ui/state-delta-cache.js.map +1 -0
- package/v3/dist/adapters/ag-ui/state-manager.d.ts +249 -0
- package/v3/dist/adapters/ag-ui/state-manager.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/state-manager.js +511 -0
- package/v3/dist/adapters/ag-ui/state-manager.js.map +1 -0
- package/v3/dist/adapters/ag-ui/stream-controller.d.ts +195 -0
- package/v3/dist/adapters/ag-ui/stream-controller.d.ts.map +1 -0
- package/v3/dist/adapters/ag-ui/stream-controller.js +481 -0
- package/v3/dist/adapters/ag-ui/stream-controller.js.map +1 -0
- package/v3/dist/adapters/index.d.ts +4 -0
- package/v3/dist/adapters/index.d.ts.map +1 -1
- package/v3/dist/adapters/index.js +89 -0
- package/v3/dist/adapters/index.js.map +1 -1
- package/v3/dist/cli/bundle.js +1507 -425
- package/v3/dist/coordination/consensus/providers/claude-provider.js +1 -1
- package/v3/dist/coordination/consensus/providers/gemini-provider.js +1 -1
- package/v3/dist/coordination/consensus/providers/openai-provider.js +1 -1
- package/v3/dist/init/init-wizard.d.ts.map +1 -1
- package/v3/dist/init/init-wizard.js +19 -4
- package/v3/dist/init/init-wizard.js.map +1 -1
- package/v3/dist/init/migration/config-migrator.d.ts.map +1 -1
- package/v3/dist/init/migration/config-migrator.js +15 -1
- package/v3/dist/init/migration/config-migrator.js.map +1 -1
- package/v3/dist/init/phases/05-learning.js +1 -1
- package/v3/dist/init/phases/05-learning.js.map +1 -1
- package/v3/dist/init/self-configurator.d.ts +7 -0
- package/v3/dist/init/self-configurator.d.ts.map +1 -1
- package/v3/dist/init/self-configurator.js +23 -27
- package/v3/dist/init/self-configurator.js.map +1 -1
- package/v3/dist/integrations/ruvector/interfaces.js +1 -1
- package/v3/dist/integrations/ruvector/interfaces.js.map +1 -1
- package/v3/dist/kernel/index.d.ts +1 -1
- package/v3/dist/kernel/index.d.ts.map +1 -1
- package/v3/dist/kernel/index.js +3 -1
- package/v3/dist/kernel/index.js.map +1 -1
- package/v3/dist/kernel/plugin-loader.d.ts.map +1 -1
- package/v3/dist/kernel/plugin-loader.js +6 -1
- package/v3/dist/kernel/plugin-loader.js.map +1 -1
- package/v3/dist/kernel/unified-memory.d.ts +123 -0
- package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory.js +258 -2
- package/v3/dist/kernel/unified-memory.js.map +1 -1
- package/v3/dist/learning/qe-unified-memory.js +1 -1
- package/v3/dist/learning/qe-unified-memory.js.map +1 -1
- package/v3/dist/learning/real-qe-reasoning-bank.js +2 -2
- package/v3/dist/learning/real-qe-reasoning-bank.js.map +1 -1
- package/v3/dist/learning/sqlite-persistence.d.ts +1 -1
- package/v3/dist/learning/sqlite-persistence.js +1 -1
- package/v3/dist/learning/sqlite-persistence.js.map +1 -1
- package/v3/dist/learning/v2-to-v3-migration.d.ts +2 -2
- package/v3/dist/learning/v2-to-v3-migration.d.ts.map +1 -1
- package/v3/dist/learning/v2-to-v3-migration.js +2 -2
- package/v3/dist/learning/v2-to-v3-migration.js.map +1 -1
- package/v3/dist/mcp/bundle.js +63075 -53304
- package/v3/dist/mcp/entry.d.ts +5 -0
- package/v3/dist/mcp/entry.d.ts.map +1 -1
- package/v3/dist/mcp/entry.js +36 -0
- package/v3/dist/mcp/entry.js.map +1 -1
- package/v3/dist/mcp/http-server.d.ts +95 -0
- package/v3/dist/mcp/http-server.d.ts.map +1 -0
- package/v3/dist/mcp/http-server.js +833 -0
- package/v3/dist/mcp/http-server.js.map +1 -0
- package/v3/dist/mcp/protocol-server.d.ts +6 -0
- package/v3/dist/mcp/protocol-server.d.ts.map +1 -1
- package/v3/dist/mcp/protocol-server.js +40 -0
- package/v3/dist/mcp/protocol-server.js.map +1 -1
- package/v3/dist/mcp/transport/index.d.ts +25 -3
- package/v3/dist/mcp/transport/index.d.ts.map +1 -1
- package/v3/dist/mcp/transport/index.js +22 -4
- package/v3/dist/mcp/transport/index.js.map +1 -1
- package/v3/dist/mcp/transport/sse/connection-manager.d.ts +84 -0
- package/v3/dist/mcp/transport/sse/connection-manager.d.ts.map +1 -0
- package/v3/dist/mcp/transport/sse/connection-manager.js +271 -0
- package/v3/dist/mcp/transport/sse/connection-manager.js.map +1 -0
- package/v3/dist/mcp/transport/sse/index.d.ts +10 -0
- package/v3/dist/mcp/transport/sse/index.d.ts.map +1 -0
- package/v3/dist/mcp/transport/sse/index.js +15 -0
- package/v3/dist/mcp/transport/sse/index.js.map +1 -0
- package/v3/dist/mcp/transport/sse/sse-transport.d.ts +56 -0
- package/v3/dist/mcp/transport/sse/sse-transport.d.ts.map +1 -0
- package/v3/dist/mcp/transport/sse/sse-transport.js +381 -0
- package/v3/dist/mcp/transport/sse/sse-transport.js.map +1 -0
- package/v3/dist/mcp/transport/sse/types.d.ts +237 -0
- package/v3/dist/mcp/transport/sse/types.d.ts.map +1 -0
- package/v3/dist/mcp/transport/sse/types.js +37 -0
- package/v3/dist/mcp/transport/sse/types.js.map +1 -0
- package/v3/dist/mcp/transport/websocket/connection-manager.d.ts +143 -0
- package/v3/dist/mcp/transport/websocket/connection-manager.d.ts.map +1 -0
- package/v3/dist/mcp/transport/websocket/connection-manager.js +522 -0
- package/v3/dist/mcp/transport/websocket/connection-manager.js.map +1 -0
- package/v3/dist/mcp/transport/websocket/index.d.ts +10 -0
- package/v3/dist/mcp/transport/websocket/index.d.ts.map +1 -0
- package/v3/dist/mcp/transport/websocket/index.js +19 -0
- package/v3/dist/mcp/transport/websocket/index.js.map +1 -0
- package/v3/dist/mcp/transport/websocket/types.d.ts +354 -0
- package/v3/dist/mcp/transport/websocket/types.d.ts.map +1 -0
- package/v3/dist/mcp/transport/websocket/types.js +49 -0
- package/v3/dist/mcp/transport/websocket/types.js.map +1 -0
- package/v3/dist/mcp/transport/websocket/websocket-transport.d.ts +77 -0
- package/v3/dist/mcp/transport/websocket/websocket-transport.d.ts.map +1 -0
- package/v3/dist/mcp/transport/websocket/websocket-transport.js +622 -0
- package/v3/dist/mcp/transport/websocket/websocket-transport.js.map +1 -0
- package/v3/dist/memory/crdt/convergence-tracker.d.ts +59 -0
- package/v3/dist/memory/crdt/convergence-tracker.d.ts.map +1 -0
- package/v3/dist/memory/crdt/convergence-tracker.js +325 -0
- package/v3/dist/memory/crdt/convergence-tracker.js.map +1 -0
- package/v3/dist/memory/crdt/crdt-store.d.ts +55 -0
- package/v3/dist/memory/crdt/crdt-store.d.ts.map +1 -0
- package/v3/dist/memory/crdt/crdt-store.js +582 -0
- package/v3/dist/memory/crdt/crdt-store.js.map +1 -0
- package/v3/dist/memory/crdt/g-counter.d.ts +47 -0
- package/v3/dist/memory/crdt/g-counter.d.ts.map +1 -0
- package/v3/dist/memory/crdt/g-counter.js +134 -0
- package/v3/dist/memory/crdt/g-counter.js.map +1 -0
- package/v3/dist/memory/crdt/index.d.ts +52 -0
- package/v3/dist/memory/crdt/index.d.ts.map +1 -0
- package/v3/dist/memory/crdt/index.js +66 -0
- package/v3/dist/memory/crdt/index.js.map +1 -0
- package/v3/dist/memory/crdt/lww-register.d.ts +40 -0
- package/v3/dist/memory/crdt/lww-register.d.ts.map +1 -0
- package/v3/dist/memory/crdt/lww-register.js +133 -0
- package/v3/dist/memory/crdt/lww-register.js.map +1 -0
- package/v3/dist/memory/crdt/or-set.d.ts +62 -0
- package/v3/dist/memory/crdt/or-set.d.ts.map +1 -0
- package/v3/dist/memory/crdt/or-set.js +336 -0
- package/v3/dist/memory/crdt/or-set.js.map +1 -0
- package/v3/dist/memory/crdt/pn-counter.d.ts +53 -0
- package/v3/dist/memory/crdt/pn-counter.d.ts.map +1 -0
- package/v3/dist/memory/crdt/pn-counter.js +147 -0
- package/v3/dist/memory/crdt/pn-counter.js.map +1 -0
- package/v3/dist/memory/crdt/types.d.ts +397 -0
- package/v3/dist/memory/crdt/types.d.ts.map +1 -0
- package/v3/dist/memory/crdt/types.js +12 -0
- package/v3/dist/memory/crdt/types.js.map +1 -0
- package/v3/dist/memory/index.d.ts +5 -2
- package/v3/dist/memory/index.d.ts.map +1 -1
- package/v3/dist/memory/index.js +5 -2
- package/v3/dist/memory/index.js.map +1 -1
- package/v3/dist/performance/benchmarks.d.ts +215 -0
- package/v3/dist/performance/benchmarks.d.ts.map +1 -0
- package/v3/dist/performance/benchmarks.js +516 -0
- package/v3/dist/performance/benchmarks.js.map +1 -0
- package/v3/dist/performance/ci-gates.d.ts +149 -0
- package/v3/dist/performance/ci-gates.d.ts.map +1 -0
- package/v3/dist/performance/ci-gates.js +425 -0
- package/v3/dist/performance/ci-gates.js.map +1 -0
- package/v3/dist/performance/index.d.ts +18 -0
- package/v3/dist/performance/index.d.ts.map +1 -0
- package/v3/dist/performance/index.js +26 -0
- package/v3/dist/performance/index.js.map +1 -0
- package/v3/dist/performance/optimizer.d.ts +323 -0
- package/v3/dist/performance/optimizer.d.ts.map +1 -0
- package/v3/dist/performance/optimizer.js +592 -0
- package/v3/dist/performance/optimizer.js.map +1 -0
- package/v3/dist/performance/profiler.d.ts +195 -0
- package/v3/dist/performance/profiler.d.ts.map +1 -0
- package/v3/dist/performance/profiler.js +369 -0
- package/v3/dist/performance/profiler.js.map +1 -0
- package/v3/dist/performance/run-gates.d.ts +23 -0
- package/v3/dist/performance/run-gates.d.ts.map +1 -0
- package/v3/dist/performance/run-gates.js +122 -0
- package/v3/dist/performance/run-gates.js.map +1 -0
- package/v3/dist/sync/claude-flow-bridge.d.ts +1 -1
- package/v3/dist/sync/claude-flow-bridge.js +1 -1
- package/v3/dist/sync/interfaces.d.ts +6 -0
- package/v3/dist/sync/interfaces.d.ts.map +1 -1
- package/v3/dist/sync/interfaces.js +34 -47
- package/v3/dist/sync/interfaces.js.map +1 -1
- package/v3/dist/sync/readers/sqlite-reader.d.ts +1 -1
- package/v3/dist/sync/readers/sqlite-reader.js +1 -1
- package/v3/dist/testing/index.d.ts +6 -0
- package/v3/dist/testing/index.d.ts.map +1 -0
- package/v3/dist/testing/index.js +7 -0
- package/v3/dist/testing/index.js.map +1 -0
- package/v3/dist/testing/load/agent-load-tester.d.ts +221 -0
- package/v3/dist/testing/load/agent-load-tester.d.ts.map +1 -0
- package/v3/dist/testing/load/agent-load-tester.js +566 -0
- package/v3/dist/testing/load/agent-load-tester.js.map +1 -0
- package/v3/dist/testing/load/bottleneck-analyzer.d.ts +150 -0
- package/v3/dist/testing/load/bottleneck-analyzer.d.ts.map +1 -0
- package/v3/dist/testing/load/bottleneck-analyzer.js +442 -0
- package/v3/dist/testing/load/bottleneck-analyzer.js.map +1 -0
- package/v3/dist/testing/load/index.d.ts +17 -0
- package/v3/dist/testing/load/index.d.ts.map +1 -0
- package/v3/dist/testing/load/index.js +23 -0
- package/v3/dist/testing/load/index.js.map +1 -0
- package/v3/dist/testing/load/metrics-collector.d.ts +275 -0
- package/v3/dist/testing/load/metrics-collector.d.ts.map +1 -0
- package/v3/dist/testing/load/metrics-collector.js +475 -0
- package/v3/dist/testing/load/metrics-collector.js.map +1 -0
- package/v3/package.json +5 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AG-UI Stream Controller
|
|
3
|
+
*
|
|
4
|
+
* Provides flow control and cancellation handling for AG-UI event streaming.
|
|
5
|
+
* Wraps EventAdapter with AbortSignal support, token buffering, and graceful shutdown.
|
|
6
|
+
*
|
|
7
|
+
* @module adapters/ag-ui/stream-controller
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'events';
|
|
10
|
+
import type { AGUIEvent } from './event-types.js';
|
|
11
|
+
import type { EventAdapter } from './event-adapter.js';
|
|
12
|
+
import type { BackpressureHandler } from './backpressure-handler.js';
|
|
13
|
+
/**
|
|
14
|
+
* Stream controller configuration
|
|
15
|
+
*/
|
|
16
|
+
export interface StreamControllerConfig {
|
|
17
|
+
/** EventAdapter instance to wrap */
|
|
18
|
+
adapter: EventAdapter;
|
|
19
|
+
/** AbortSignal for cancellation */
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
/** Callback invoked when stream is cancelled */
|
|
22
|
+
onCancel?: () => Promise<void> | void;
|
|
23
|
+
/** Callback invoked when stream ends */
|
|
24
|
+
onEnd?: (reason: 'success' | 'cancelled' | 'error') => Promise<void> | void;
|
|
25
|
+
/** Callback invoked on stream error */
|
|
26
|
+
onError?: (error: Error) => Promise<void> | void;
|
|
27
|
+
/** Token buffering interval in milliseconds (default: 50ms for 20fps) */
|
|
28
|
+
bufferInterval?: number;
|
|
29
|
+
/** Maximum buffer size before flushing (default: 10) */
|
|
30
|
+
maxBufferSize?: number;
|
|
31
|
+
/** Optional backpressure handler */
|
|
32
|
+
backpressureHandler?: BackpressureHandler;
|
|
33
|
+
/** Whether to automatically emit RUN_FINISHED on cancel */
|
|
34
|
+
emitFinishOnCancel?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Stream state
|
|
38
|
+
*/
|
|
39
|
+
export type StreamState = 'idle' | 'streaming' | 'paused' | 'cancelled' | 'ended' | 'error';
|
|
40
|
+
/**
|
|
41
|
+
* Stream metrics
|
|
42
|
+
*/
|
|
43
|
+
export interface StreamMetrics {
|
|
44
|
+
/** Total events processed */
|
|
45
|
+
totalEvents: number;
|
|
46
|
+
/** Events buffered and flushed */
|
|
47
|
+
bufferedEvents: number;
|
|
48
|
+
/** Events dropped (if backpressure applied) */
|
|
49
|
+
droppedEvents: number;
|
|
50
|
+
/** Average latency in milliseconds */
|
|
51
|
+
averageLatencyMs: number;
|
|
52
|
+
/** Peak latency in milliseconds */
|
|
53
|
+
peakLatencyMs: number;
|
|
54
|
+
/** Stream start time */
|
|
55
|
+
startTime: number;
|
|
56
|
+
/** Stream duration in milliseconds */
|
|
57
|
+
durationMs: number;
|
|
58
|
+
/** Buffer flush count */
|
|
59
|
+
flushCount: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* AG-UI Stream Controller
|
|
63
|
+
*
|
|
64
|
+
* Wraps an EventAdapter to provide:
|
|
65
|
+
* - AbortController/AbortSignal based cancellation
|
|
66
|
+
* - Token buffering at configurable intervals
|
|
67
|
+
* - Graceful shutdown on client disconnect
|
|
68
|
+
* - Integration with backpressure handling
|
|
69
|
+
*/
|
|
70
|
+
export declare class StreamController extends EventEmitter {
|
|
71
|
+
private readonly adapter;
|
|
72
|
+
private readonly signal?;
|
|
73
|
+
private readonly onCancelCallback?;
|
|
74
|
+
private readonly onEndCallback?;
|
|
75
|
+
private readonly onErrorCallback?;
|
|
76
|
+
private readonly bufferInterval;
|
|
77
|
+
private readonly maxBufferSize;
|
|
78
|
+
private readonly backpressureHandler?;
|
|
79
|
+
private readonly emitFinishOnCancel;
|
|
80
|
+
private state;
|
|
81
|
+
private buffer;
|
|
82
|
+
private flushTimer;
|
|
83
|
+
private abortHandler;
|
|
84
|
+
private metrics;
|
|
85
|
+
constructor(config: StreamControllerConfig);
|
|
86
|
+
/**
|
|
87
|
+
* Start the stream
|
|
88
|
+
*/
|
|
89
|
+
start(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Pause the stream (buffers events but doesn't emit)
|
|
92
|
+
*/
|
|
93
|
+
pause(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Resume the stream
|
|
96
|
+
*/
|
|
97
|
+
resume(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Cancel the stream
|
|
100
|
+
*/
|
|
101
|
+
cancel(): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* End the stream gracefully
|
|
104
|
+
*/
|
|
105
|
+
end(reason?: 'success' | 'error'): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Handle error in stream
|
|
108
|
+
*/
|
|
109
|
+
handleError(error: Error): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Push an event to the stream
|
|
112
|
+
* Returns false if backpressure is applied and event should not be produced
|
|
113
|
+
*/
|
|
114
|
+
push(event: AGUIEvent): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Flush the event buffer
|
|
117
|
+
*/
|
|
118
|
+
flush(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Get current stream state
|
|
121
|
+
*/
|
|
122
|
+
getState(): StreamState;
|
|
123
|
+
/**
|
|
124
|
+
* Check if stream is active
|
|
125
|
+
*/
|
|
126
|
+
isActive(): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Check if stream is cancelled
|
|
129
|
+
*/
|
|
130
|
+
isCancelled(): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Get stream metrics
|
|
133
|
+
*/
|
|
134
|
+
getMetrics(): Readonly<StreamMetrics>;
|
|
135
|
+
/**
|
|
136
|
+
* Get buffer size
|
|
137
|
+
*/
|
|
138
|
+
getBufferSize(): number;
|
|
139
|
+
/**
|
|
140
|
+
* Get the wrapped adapter
|
|
141
|
+
*/
|
|
142
|
+
getAdapter(): EventAdapter;
|
|
143
|
+
/**
|
|
144
|
+
* Dispose of the stream controller
|
|
145
|
+
*/
|
|
146
|
+
dispose(): void;
|
|
147
|
+
private setupSignalHandler;
|
|
148
|
+
private removeAbortHandler;
|
|
149
|
+
private setupAdapterListeners;
|
|
150
|
+
private scheduleFlush;
|
|
151
|
+
private clearFlushTimer;
|
|
152
|
+
private initializeMetrics;
|
|
153
|
+
private updateLatencyMetrics;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create a new StreamController instance
|
|
157
|
+
*
|
|
158
|
+
* @param config - Stream controller configuration
|
|
159
|
+
* @returns StreamController instance
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* const controller = new AbortController();
|
|
164
|
+
* const stream = createStreamController({
|
|
165
|
+
* adapter: eventAdapter,
|
|
166
|
+
* signal: controller.signal,
|
|
167
|
+
* onCancel: async () => {
|
|
168
|
+
* await agent.abort();
|
|
169
|
+
* }
|
|
170
|
+
* });
|
|
171
|
+
*
|
|
172
|
+
* stream.start();
|
|
173
|
+
*
|
|
174
|
+
* // Later, to cancel:
|
|
175
|
+
* controller.abort();
|
|
176
|
+
* // -> onCancel called
|
|
177
|
+
* // -> RUN_FINISHED emitted with reason: 'cancelled'
|
|
178
|
+
* // -> Stream closed gracefully
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export declare function createStreamController(config: StreamControllerConfig): StreamController;
|
|
182
|
+
/**
|
|
183
|
+
* Create an async iterator from a stream controller
|
|
184
|
+
* Allows using for-await-of syntax to consume events
|
|
185
|
+
*/
|
|
186
|
+
export declare function streamEvents(controller: StreamController): AsyncGenerator<AGUIEvent, void, unknown>;
|
|
187
|
+
/**
|
|
188
|
+
* Create a transform stream from a stream controller
|
|
189
|
+
* For integration with Node.js streams API
|
|
190
|
+
*/
|
|
191
|
+
export declare function createEventTransform(controller: StreamController): {
|
|
192
|
+
readable: ReadableStream<AGUIEvent>;
|
|
193
|
+
writable: WritableStream<AGUIEvent>;
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=stream-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-controller.d.ts","sourceRoot":"","sources":["../../../src/adapters/ag-ui/stream-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AG-UI Stream Controller
|
|
3
|
+
*
|
|
4
|
+
* Provides flow control and cancellation handling for AG-UI event streaming.
|
|
5
|
+
* Wraps EventAdapter with AbortSignal support, token buffering, and graceful shutdown.
|
|
6
|
+
*
|
|
7
|
+
* @module adapters/ag-ui/stream-controller
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'events';
|
|
10
|
+
/**
|
|
11
|
+
* Default configuration values
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
bufferInterval: 50, // 50ms = 20fps
|
|
15
|
+
maxBufferSize: 10,
|
|
16
|
+
emitFinishOnCancel: true,
|
|
17
|
+
};
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Stream Controller Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* AG-UI Stream Controller
|
|
23
|
+
*
|
|
24
|
+
* Wraps an EventAdapter to provide:
|
|
25
|
+
* - AbortController/AbortSignal based cancellation
|
|
26
|
+
* - Token buffering at configurable intervals
|
|
27
|
+
* - Graceful shutdown on client disconnect
|
|
28
|
+
* - Integration with backpressure handling
|
|
29
|
+
*/
|
|
30
|
+
export class StreamController extends EventEmitter {
|
|
31
|
+
adapter;
|
|
32
|
+
signal;
|
|
33
|
+
onCancelCallback;
|
|
34
|
+
onEndCallback;
|
|
35
|
+
onErrorCallback;
|
|
36
|
+
bufferInterval;
|
|
37
|
+
maxBufferSize;
|
|
38
|
+
backpressureHandler;
|
|
39
|
+
emitFinishOnCancel;
|
|
40
|
+
state = 'idle';
|
|
41
|
+
buffer = [];
|
|
42
|
+
flushTimer = null;
|
|
43
|
+
abortHandler = null;
|
|
44
|
+
metrics;
|
|
45
|
+
constructor(config) {
|
|
46
|
+
super();
|
|
47
|
+
this.adapter = config.adapter;
|
|
48
|
+
this.signal = config.signal;
|
|
49
|
+
this.onCancelCallback = config.onCancel;
|
|
50
|
+
this.onEndCallback = config.onEnd;
|
|
51
|
+
this.onErrorCallback = config.onError;
|
|
52
|
+
this.bufferInterval = config.bufferInterval ?? DEFAULT_CONFIG.bufferInterval;
|
|
53
|
+
this.maxBufferSize = config.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize;
|
|
54
|
+
this.backpressureHandler = config.backpressureHandler;
|
|
55
|
+
this.emitFinishOnCancel = config.emitFinishOnCancel ?? DEFAULT_CONFIG.emitFinishOnCancel;
|
|
56
|
+
this.metrics = this.initializeMetrics();
|
|
57
|
+
this.setupSignalHandler();
|
|
58
|
+
this.setupAdapterListeners();
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Lifecycle Methods
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Start the stream
|
|
65
|
+
*/
|
|
66
|
+
start() {
|
|
67
|
+
if (this.state !== 'idle') {
|
|
68
|
+
throw new Error(`Cannot start stream in state: ${this.state}`);
|
|
69
|
+
}
|
|
70
|
+
this.state = 'streaming';
|
|
71
|
+
this.metrics.startTime = Date.now();
|
|
72
|
+
this.emit('start');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Pause the stream (buffers events but doesn't emit)
|
|
76
|
+
*/
|
|
77
|
+
pause() {
|
|
78
|
+
if (this.state !== 'streaming') {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.state = 'paused';
|
|
82
|
+
this.emit('pause');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resume the stream
|
|
86
|
+
*/
|
|
87
|
+
resume() {
|
|
88
|
+
if (this.state !== 'paused') {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.state = 'streaming';
|
|
92
|
+
this.emit('resume');
|
|
93
|
+
// Flush any buffered events
|
|
94
|
+
this.flush();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Cancel the stream
|
|
98
|
+
*/
|
|
99
|
+
async cancel() {
|
|
100
|
+
if (this.state === 'cancelled' || this.state === 'ended' || this.state === 'error') {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.state = 'cancelled';
|
|
104
|
+
this.clearFlushTimer();
|
|
105
|
+
// Call cancel callback
|
|
106
|
+
if (this.onCancelCallback) {
|
|
107
|
+
try {
|
|
108
|
+
await this.onCancelCallback();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.emit('error', error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Emit RUN_FINISHED with cancelled outcome
|
|
115
|
+
if (this.emitFinishOnCancel) {
|
|
116
|
+
const runId = this.adapter.getCurrentRunId();
|
|
117
|
+
if (runId) {
|
|
118
|
+
const finishEvent = this.adapter.emitRunFinished(runId, 'cancelled');
|
|
119
|
+
this.emit('event', finishEvent);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Flush remaining buffer
|
|
123
|
+
this.flush();
|
|
124
|
+
this.emit('cancel');
|
|
125
|
+
// Call end callback
|
|
126
|
+
if (this.onEndCallback) {
|
|
127
|
+
try {
|
|
128
|
+
await this.onEndCallback('cancelled');
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.emit('error', error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* End the stream gracefully
|
|
137
|
+
*/
|
|
138
|
+
async end(reason = 'success') {
|
|
139
|
+
if (this.state === 'cancelled' || this.state === 'ended' || this.state === 'error') {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
this.state = reason === 'error' ? 'error' : 'ended';
|
|
143
|
+
this.clearFlushTimer();
|
|
144
|
+
// Flush remaining buffer
|
|
145
|
+
this.flush();
|
|
146
|
+
this.metrics.durationMs = Date.now() - this.metrics.startTime;
|
|
147
|
+
this.emit('end', reason);
|
|
148
|
+
// Call end callback
|
|
149
|
+
if (this.onEndCallback) {
|
|
150
|
+
try {
|
|
151
|
+
await this.onEndCallback(reason);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
this.emit('error', error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Handle error in stream
|
|
160
|
+
*/
|
|
161
|
+
async handleError(error) {
|
|
162
|
+
if (this.state === 'cancelled' || this.state === 'ended' || this.state === 'error') {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
this.state = 'error';
|
|
166
|
+
this.clearFlushTimer();
|
|
167
|
+
// Call error callback
|
|
168
|
+
if (this.onErrorCallback) {
|
|
169
|
+
try {
|
|
170
|
+
await this.onErrorCallback(error);
|
|
171
|
+
}
|
|
172
|
+
catch (callbackError) {
|
|
173
|
+
// Emit original error, not callback error
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
this.emit('error', error);
|
|
177
|
+
await this.end('error');
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Event Handling
|
|
181
|
+
// ============================================================================
|
|
182
|
+
/**
|
|
183
|
+
* Push an event to the stream
|
|
184
|
+
* Returns false if backpressure is applied and event should not be produced
|
|
185
|
+
*/
|
|
186
|
+
push(event) {
|
|
187
|
+
if (this.state !== 'streaming' && this.state !== 'paused') {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
// Check backpressure
|
|
191
|
+
if (this.backpressureHandler) {
|
|
192
|
+
const accepted = this.backpressureHandler.push(event);
|
|
193
|
+
if (!accepted) {
|
|
194
|
+
this.metrics.droppedEvents++;
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const bufferedEvent = {
|
|
199
|
+
event,
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
};
|
|
202
|
+
this.buffer.push(bufferedEvent);
|
|
203
|
+
this.metrics.bufferedEvents++;
|
|
204
|
+
this.metrics.totalEvents++;
|
|
205
|
+
// Schedule flush if not already scheduled
|
|
206
|
+
if (!this.flushTimer && this.state === 'streaming') {
|
|
207
|
+
this.scheduleFlush();
|
|
208
|
+
}
|
|
209
|
+
// Force flush if buffer exceeds max size
|
|
210
|
+
if (this.buffer.length >= this.maxBufferSize) {
|
|
211
|
+
this.flush();
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Flush the event buffer
|
|
217
|
+
*/
|
|
218
|
+
flush() {
|
|
219
|
+
this.clearFlushTimer();
|
|
220
|
+
if (this.buffer.length === 0) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
const eventsToFlush = [...this.buffer];
|
|
225
|
+
this.buffer = [];
|
|
226
|
+
this.metrics.flushCount++;
|
|
227
|
+
// Calculate latency metrics
|
|
228
|
+
for (const { event, timestamp } of eventsToFlush) {
|
|
229
|
+
const latency = now - timestamp;
|
|
230
|
+
this.updateLatencyMetrics(latency);
|
|
231
|
+
// Emit event
|
|
232
|
+
if (this.state === 'streaming' || this.state === 'cancelled' || this.state === 'ended') {
|
|
233
|
+
this.emit('event', event);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
this.emit('flush', eventsToFlush.length);
|
|
237
|
+
}
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// State and Metrics
|
|
240
|
+
// ============================================================================
|
|
241
|
+
/**
|
|
242
|
+
* Get current stream state
|
|
243
|
+
*/
|
|
244
|
+
getState() {
|
|
245
|
+
return this.state;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Check if stream is active
|
|
249
|
+
*/
|
|
250
|
+
isActive() {
|
|
251
|
+
return this.state === 'streaming' || this.state === 'paused';
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Check if stream is cancelled
|
|
255
|
+
*/
|
|
256
|
+
isCancelled() {
|
|
257
|
+
return this.state === 'cancelled';
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get stream metrics
|
|
261
|
+
*/
|
|
262
|
+
getMetrics() {
|
|
263
|
+
return {
|
|
264
|
+
...this.metrics,
|
|
265
|
+
durationMs: this.state === 'streaming' || this.state === 'paused'
|
|
266
|
+
? Date.now() - this.metrics.startTime
|
|
267
|
+
: this.metrics.durationMs,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get buffer size
|
|
272
|
+
*/
|
|
273
|
+
getBufferSize() {
|
|
274
|
+
return this.buffer.length;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get the wrapped adapter
|
|
278
|
+
*/
|
|
279
|
+
getAdapter() {
|
|
280
|
+
return this.adapter;
|
|
281
|
+
}
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// Cleanup
|
|
284
|
+
// ============================================================================
|
|
285
|
+
/**
|
|
286
|
+
* Dispose of the stream controller
|
|
287
|
+
*/
|
|
288
|
+
dispose() {
|
|
289
|
+
this.clearFlushTimer();
|
|
290
|
+
this.removeAbortHandler();
|
|
291
|
+
this.removeAllListeners();
|
|
292
|
+
this.buffer = [];
|
|
293
|
+
}
|
|
294
|
+
// ============================================================================
|
|
295
|
+
// Private Methods
|
|
296
|
+
// ============================================================================
|
|
297
|
+
setupSignalHandler() {
|
|
298
|
+
if (!this.signal) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
// Check if already aborted
|
|
302
|
+
if (this.signal.aborted) {
|
|
303
|
+
// Use setImmediate to allow constructor to complete
|
|
304
|
+
setImmediate(() => this.cancel());
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Setup abort handler
|
|
308
|
+
this.abortHandler = () => {
|
|
309
|
+
this.cancel();
|
|
310
|
+
};
|
|
311
|
+
this.signal.addEventListener('abort', this.abortHandler);
|
|
312
|
+
}
|
|
313
|
+
removeAbortHandler() {
|
|
314
|
+
if (this.signal && this.abortHandler) {
|
|
315
|
+
this.signal.removeEventListener('abort', this.abortHandler);
|
|
316
|
+
this.abortHandler = null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
setupAdapterListeners() {
|
|
320
|
+
// Forward events from adapter to stream
|
|
321
|
+
this.adapter.on('event', (event) => {
|
|
322
|
+
this.push(event);
|
|
323
|
+
});
|
|
324
|
+
// Forward errors
|
|
325
|
+
this.adapter.on('error', (error) => {
|
|
326
|
+
this.handleError(error);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
scheduleFlush() {
|
|
330
|
+
if (this.flushTimer) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
this.flushTimer = setTimeout(() => {
|
|
334
|
+
this.flushTimer = null;
|
|
335
|
+
if (this.state === 'streaming') {
|
|
336
|
+
this.flush();
|
|
337
|
+
}
|
|
338
|
+
}, this.bufferInterval);
|
|
339
|
+
}
|
|
340
|
+
clearFlushTimer() {
|
|
341
|
+
if (this.flushTimer) {
|
|
342
|
+
clearTimeout(this.flushTimer);
|
|
343
|
+
this.flushTimer = null;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
initializeMetrics() {
|
|
347
|
+
return {
|
|
348
|
+
totalEvents: 0,
|
|
349
|
+
bufferedEvents: 0,
|
|
350
|
+
droppedEvents: 0,
|
|
351
|
+
averageLatencyMs: 0,
|
|
352
|
+
peakLatencyMs: 0,
|
|
353
|
+
startTime: 0,
|
|
354
|
+
durationMs: 0,
|
|
355
|
+
flushCount: 0,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
updateLatencyMetrics(latency) {
|
|
359
|
+
// Update peak
|
|
360
|
+
if (latency > this.metrics.peakLatencyMs) {
|
|
361
|
+
this.metrics.peakLatencyMs = latency;
|
|
362
|
+
}
|
|
363
|
+
// Update rolling average
|
|
364
|
+
const totalSamples = this.metrics.flushCount || 1;
|
|
365
|
+
this.metrics.averageLatencyMs =
|
|
366
|
+
(this.metrics.averageLatencyMs * (totalSamples - 1) + latency) / totalSamples;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// ============================================================================
|
|
370
|
+
// Factory Function
|
|
371
|
+
// ============================================================================
|
|
372
|
+
/**
|
|
373
|
+
* Create a new StreamController instance
|
|
374
|
+
*
|
|
375
|
+
* @param config - Stream controller configuration
|
|
376
|
+
* @returns StreamController instance
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* ```typescript
|
|
380
|
+
* const controller = new AbortController();
|
|
381
|
+
* const stream = createStreamController({
|
|
382
|
+
* adapter: eventAdapter,
|
|
383
|
+
* signal: controller.signal,
|
|
384
|
+
* onCancel: async () => {
|
|
385
|
+
* await agent.abort();
|
|
386
|
+
* }
|
|
387
|
+
* });
|
|
388
|
+
*
|
|
389
|
+
* stream.start();
|
|
390
|
+
*
|
|
391
|
+
* // Later, to cancel:
|
|
392
|
+
* controller.abort();
|
|
393
|
+
* // -> onCancel called
|
|
394
|
+
* // -> RUN_FINISHED emitted with reason: 'cancelled'
|
|
395
|
+
* // -> Stream closed gracefully
|
|
396
|
+
* ```
|
|
397
|
+
*/
|
|
398
|
+
export function createStreamController(config) {
|
|
399
|
+
return new StreamController(config);
|
|
400
|
+
}
|
|
401
|
+
// ============================================================================
|
|
402
|
+
// Utility Functions
|
|
403
|
+
// ============================================================================
|
|
404
|
+
/**
|
|
405
|
+
* Create an async iterator from a stream controller
|
|
406
|
+
* Allows using for-await-of syntax to consume events
|
|
407
|
+
*/
|
|
408
|
+
export async function* streamEvents(controller) {
|
|
409
|
+
const events = [];
|
|
410
|
+
let resolveNext = null;
|
|
411
|
+
let done = false;
|
|
412
|
+
const eventHandler = (event) => {
|
|
413
|
+
events.push(event);
|
|
414
|
+
if (resolveNext) {
|
|
415
|
+
resolveNext();
|
|
416
|
+
resolveNext = null;
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
const endHandler = () => {
|
|
420
|
+
done = true;
|
|
421
|
+
if (resolveNext) {
|
|
422
|
+
resolveNext();
|
|
423
|
+
resolveNext = null;
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
controller.on('event', eventHandler);
|
|
427
|
+
controller.on('end', endHandler);
|
|
428
|
+
controller.on('cancel', endHandler);
|
|
429
|
+
try {
|
|
430
|
+
while (!done || events.length > 0) {
|
|
431
|
+
if (events.length > 0) {
|
|
432
|
+
yield events.shift();
|
|
433
|
+
}
|
|
434
|
+
else if (!done) {
|
|
435
|
+
await new Promise((resolve) => {
|
|
436
|
+
resolveNext = resolve;
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
finally {
|
|
442
|
+
controller.off('event', eventHandler);
|
|
443
|
+
controller.off('end', endHandler);
|
|
444
|
+
controller.off('cancel', endHandler);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Create a transform stream from a stream controller
|
|
449
|
+
* For integration with Node.js streams API
|
|
450
|
+
*/
|
|
451
|
+
export function createEventTransform(controller) {
|
|
452
|
+
const readable = new ReadableStream({
|
|
453
|
+
start(streamController) {
|
|
454
|
+
controller.on('event', (event) => {
|
|
455
|
+
streamController.enqueue(event);
|
|
456
|
+
});
|
|
457
|
+
controller.on('end', () => {
|
|
458
|
+
streamController.close();
|
|
459
|
+
});
|
|
460
|
+
controller.on('cancel', () => {
|
|
461
|
+
streamController.close();
|
|
462
|
+
});
|
|
463
|
+
controller.on('error', (error) => {
|
|
464
|
+
streamController.error(error);
|
|
465
|
+
});
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
const writable = new WritableStream({
|
|
469
|
+
write(event) {
|
|
470
|
+
controller.push(event);
|
|
471
|
+
},
|
|
472
|
+
close() {
|
|
473
|
+
controller.end();
|
|
474
|
+
},
|
|
475
|
+
abort(reason) {
|
|
476
|
+
controller.cancel();
|
|
477
|
+
},
|
|
478
|
+
});
|
|
479
|
+
return { readable, writable };
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=stream-controller.js.map
|