@generacy-ai/orchestrator 0.0.0-preview-20260304013206
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/dist/auth/api-key.d.ts +63 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +102 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/github-oauth.d.ts +29 -0
- package/dist/auth/github-oauth.d.ts.map +1 -0
- package/dist/auth/github-oauth.js +136 -0
- package/dist/auth/github-oauth.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +34 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +74 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +43 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +101 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +295 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +733 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +174 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +30 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +173 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +32 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +92 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +31 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +89 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/routes/agents.d.ts +7 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +78 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/dispatch.d.ts +8 -0
- package/dist/routes/dispatch.d.ts.map +1 -0
- package/dist/routes/dispatch.js +46 -0
- package/dist/routes/dispatch.js.map +1 -0
- package/dist/routes/events.d.ts +14 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +240 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/health.d.ts +14 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +132 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +36 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +34 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/integrations.d.ts +34 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +81 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/metrics.d.ts +31 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +157 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/pr-webhooks.d.ts +15 -0
- package/dist/routes/pr-webhooks.d.ts.map +1 -0
- package/dist/routes/pr-webhooks.js +114 -0
- package/dist/routes/pr-webhooks.js.map +1 -0
- package/dist/routes/queue.d.ts +7 -0
- package/dist/routes/queue.d.ts.map +1 -0
- package/dist/routes/queue.js +94 -0
- package/dist/routes/queue.js.map +1 -0
- package/dist/routes/webhooks.d.ts +15 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +117 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/routes/workflows.d.ts +7 -0
- package/dist/routes/workflows.d.ts.map +1 -0
- package/dist/routes/workflows.js +138 -0
- package/dist/routes/workflows.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +264 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent-registry.d.ts +89 -0
- package/dist/services/agent-registry.d.ts.map +1 -0
- package/dist/services/agent-registry.js +173 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/epic-completion-monitor-service.d.ts +69 -0
- package/dist/services/epic-completion-monitor-service.d.ts.map +1 -0
- package/dist/services/epic-completion-monitor-service.js +200 -0
- package/dist/services/epic-completion-monitor-service.js.map +1 -0
- package/dist/services/identity.d.ts +41 -0
- package/dist/services/identity.d.ts.map +1 -0
- package/dist/services/identity.js +91 -0
- package/dist/services/identity.js.map +1 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +13 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/label-monitor-service.d.ts +95 -0
- package/dist/services/label-monitor-service.d.ts.map +1 -0
- package/dist/services/label-monitor-service.js +414 -0
- package/dist/services/label-monitor-service.js.map +1 -0
- package/dist/services/label-sync-service.d.ts +76 -0
- package/dist/services/label-sync-service.d.ts.map +1 -0
- package/dist/services/label-sync-service.js +108 -0
- package/dist/services/label-sync-service.js.map +1 -0
- package/dist/services/phase-tracker-service.d.ts +32 -0
- package/dist/services/phase-tracker-service.d.ts.map +1 -0
- package/dist/services/phase-tracker-service.js +82 -0
- package/dist/services/phase-tracker-service.js.map +1 -0
- package/dist/services/pr-feedback-monitor-service.d.ts +86 -0
- package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -0
- package/dist/services/pr-feedback-monitor-service.js +423 -0
- package/dist/services/pr-feedback-monitor-service.js.map +1 -0
- package/dist/services/queue-service.d.ts +62 -0
- package/dist/services/queue-service.d.ts.map +1 -0
- package/dist/services/queue-service.js +147 -0
- package/dist/services/queue-service.js.map +1 -0
- package/dist/services/redis-queue-adapter.d.ts +35 -0
- package/dist/services/redis-queue-adapter.d.ts.map +1 -0
- package/dist/services/redis-queue-adapter.js +218 -0
- package/dist/services/redis-queue-adapter.js.map +1 -0
- package/dist/services/smee-receiver.d.ts +87 -0
- package/dist/services/smee-receiver.d.ts.map +1 -0
- package/dist/services/smee-receiver.js +225 -0
- package/dist/services/smee-receiver.js.map +1 -0
- package/dist/services/webhook-setup-service.d.ts +253 -0
- package/dist/services/webhook-setup-service.d.ts.map +1 -0
- package/dist/services/webhook-setup-service.js +369 -0
- package/dist/services/webhook-setup-service.js.map +1 -0
- package/dist/services/worker-dispatcher.d.ts +57 -0
- package/dist/services/worker-dispatcher.d.ts.map +1 -0
- package/dist/services/worker-dispatcher.js +211 -0
- package/dist/services/worker-dispatcher.js.map +1 -0
- package/dist/services/workflow-service.d.ts +65 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +164 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/sse/events.d.ts +50 -0
- package/dist/sse/events.d.ts.map +1 -0
- package/dist/sse/events.js +152 -0
- package/dist/sse/events.js.map +1 -0
- package/dist/sse/index.d.ts +4 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +7 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/stream.d.ts +109 -0
- package/dist/sse/stream.d.ts.map +1 -0
- package/dist/sse/stream.js +239 -0
- package/dist/sse/stream.js.map +1 -0
- package/dist/sse/subscriptions.d.ts +91 -0
- package/dist/sse/subscriptions.d.ts.map +1 -0
- package/dist/sse/subscriptions.js +299 -0
- package/dist/sse/subscriptions.js.map +1 -0
- package/dist/types/api.d.ts +651 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +169 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/monitor.d.ts +243 -0
- package/dist/types/monitor.d.ts.map +1 -0
- package/dist/types/monitor.js +2 -0
- package/dist/types/monitor.js.map +1 -0
- package/dist/types/problem-details.d.ts +63 -0
- package/dist/types/problem-details.d.ts.map +1 -0
- package/dist/types/problem-details.js +37 -0
- package/dist/types/problem-details.js.map +1 -0
- package/dist/types/sse.d.ts +224 -0
- package/dist/types/sse.d.ts.map +1 -0
- package/dist/types/sse.js +103 -0
- package/dist/types/sse.js.map +1 -0
- package/dist/types/webhook.d.ts +59 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +2 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/utils/correlation.d.ts +30 -0
- package/dist/utils/correlation.d.ts.map +1 -0
- package/dist/utils/correlation.js +34 -0
- package/dist/utils/correlation.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/shutdown.d.ts +28 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +86 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/dist/worker/claude-cli-worker.d.ts +61 -0
- package/dist/worker/claude-cli-worker.d.ts.map +1 -0
- package/dist/worker/claude-cli-worker.js +330 -0
- package/dist/worker/claude-cli-worker.js.map +1 -0
- package/dist/worker/cli-spawner.d.ts +42 -0
- package/dist/worker/cli-spawner.d.ts.map +1 -0
- package/dist/worker/cli-spawner.js +183 -0
- package/dist/worker/cli-spawner.js.map +1 -0
- package/dist/worker/config.d.ts +76 -0
- package/dist/worker/config.d.ts.map +1 -0
- package/dist/worker/config.js +39 -0
- package/dist/worker/config.js.map +1 -0
- package/dist/worker/epic-post-tasks.d.ts +73 -0
- package/dist/worker/epic-post-tasks.d.ts.map +1 -0
- package/dist/worker/epic-post-tasks.js +266 -0
- package/dist/worker/epic-post-tasks.js.map +1 -0
- package/dist/worker/gate-checker.d.ts +22 -0
- package/dist/worker/gate-checker.d.ts.map +1 -0
- package/dist/worker/gate-checker.js +41 -0
- package/dist/worker/gate-checker.js.map +1 -0
- package/dist/worker/index.d.ts +13 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +19 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/label-manager.d.ts +89 -0
- package/dist/worker/label-manager.d.ts.map +1 -0
- package/dist/worker/label-manager.js +200 -0
- package/dist/worker/label-manager.js.map +1 -0
- package/dist/worker/output-capture.d.ts +58 -0
- package/dist/worker/output-capture.d.ts.map +1 -0
- package/dist/worker/output-capture.js +153 -0
- package/dist/worker/output-capture.js.map +1 -0
- package/dist/worker/phase-loop.d.ts +64 -0
- package/dist/worker/phase-loop.d.ts.map +1 -0
- package/dist/worker/phase-loop.js +185 -0
- package/dist/worker/phase-loop.js.map +1 -0
- package/dist/worker/phase-resolver.d.ts +62 -0
- package/dist/worker/phase-resolver.d.ts.map +1 -0
- package/dist/worker/phase-resolver.js +144 -0
- package/dist/worker/phase-resolver.js.map +1 -0
- package/dist/worker/pr-feedback-handler.d.ts +105 -0
- package/dist/worker/pr-feedback-handler.d.ts.map +1 -0
- package/dist/worker/pr-feedback-handler.js +391 -0
- package/dist/worker/pr-feedback-handler.js.map +1 -0
- package/dist/worker/pr-linker.d.ts +69 -0
- package/dist/worker/pr-linker.d.ts.map +1 -0
- package/dist/worker/pr-linker.js +108 -0
- package/dist/worker/pr-linker.js.map +1 -0
- package/dist/worker/pr-manager.d.ts +61 -0
- package/dist/worker/pr-manager.d.ts.map +1 -0
- package/dist/worker/pr-manager.js +140 -0
- package/dist/worker/pr-manager.js.map +1 -0
- package/dist/worker/repo-checkout.d.ts +63 -0
- package/dist/worker/repo-checkout.d.ts.map +1 -0
- package/dist/worker/repo-checkout.js +160 -0
- package/dist/worker/repo-checkout.js.map +1 -0
- package/dist/worker/stage-comment-manager.d.ts +34 -0
- package/dist/worker/stage-comment-manager.d.ts.map +1 -0
- package/dist/worker/stage-comment-manager.js +114 -0
- package/dist/worker/stage-comment-manager.js.map +1 -0
- package/dist/worker/types.d.ts +192 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +53 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CreateWorkflowRequest, WorkflowResponse, WorkflowListResponse, ListWorkflowsQuery } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Workflow engine interface (facade over internal workflow engine)
|
|
4
|
+
* This will be implemented by the actual WorkflowEngine from #3
|
|
5
|
+
*/
|
|
6
|
+
export interface WorkflowEngine {
|
|
7
|
+
create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
|
|
8
|
+
get(id: string): Promise<WorkflowResponse | null>;
|
|
9
|
+
list(query: ListWorkflowsQuery): Promise<WorkflowListResponse>;
|
|
10
|
+
pause(id: string): Promise<WorkflowResponse>;
|
|
11
|
+
resume(id: string): Promise<WorkflowResponse>;
|
|
12
|
+
cancel(id: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* In-memory workflow store for development/testing
|
|
16
|
+
*/
|
|
17
|
+
export declare class InMemoryWorkflowStore implements WorkflowEngine {
|
|
18
|
+
private workflows;
|
|
19
|
+
create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
|
|
20
|
+
get(id: string): Promise<WorkflowResponse | null>;
|
|
21
|
+
list(query: ListWorkflowsQuery): Promise<WorkflowListResponse>;
|
|
22
|
+
pause(id: string): Promise<WorkflowResponse>;
|
|
23
|
+
resume(id: string): Promise<WorkflowResponse>;
|
|
24
|
+
cancel(id: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Clear all workflows (for testing)
|
|
27
|
+
*/
|
|
28
|
+
clear(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get workflow count (for testing)
|
|
31
|
+
*/
|
|
32
|
+
count(): number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Workflow service - facade over workflow engine
|
|
36
|
+
*/
|
|
37
|
+
export declare class WorkflowService {
|
|
38
|
+
private engine;
|
|
39
|
+
constructor(engine: WorkflowEngine);
|
|
40
|
+
/**
|
|
41
|
+
* Create and start a new workflow
|
|
42
|
+
*/
|
|
43
|
+
create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
|
|
44
|
+
/**
|
|
45
|
+
* Get workflow by ID
|
|
46
|
+
*/
|
|
47
|
+
get(id: string): Promise<WorkflowResponse>;
|
|
48
|
+
/**
|
|
49
|
+
* List workflows with optional filters
|
|
50
|
+
*/
|
|
51
|
+
list(query?: Partial<ListWorkflowsQuery>): Promise<WorkflowListResponse>;
|
|
52
|
+
/**
|
|
53
|
+
* Pause a running workflow
|
|
54
|
+
*/
|
|
55
|
+
pause(id: string): Promise<WorkflowResponse>;
|
|
56
|
+
/**
|
|
57
|
+
* Resume a paused workflow
|
|
58
|
+
*/
|
|
59
|
+
resume(id: string): Promise<WorkflowResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* Cancel a workflow
|
|
62
|
+
*/
|
|
63
|
+
cancel(id: string): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=workflow-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,SAAS,CAA4C;IAEvD,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgCjE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAIjD,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgC9D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,MAAM;CAGhB;AAED;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQhD;;OAEG;IACG,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQ9E;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIlD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAInD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Errors } from '../middleware/error-handler.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory workflow store for development/testing
|
|
4
|
+
*/
|
|
5
|
+
export class InMemoryWorkflowStore {
|
|
6
|
+
workflows = new Map();
|
|
7
|
+
async create(request) {
|
|
8
|
+
const id = crypto.randomUUID();
|
|
9
|
+
const now = new Date().toISOString();
|
|
10
|
+
const workflow = {
|
|
11
|
+
id,
|
|
12
|
+
status: 'created',
|
|
13
|
+
currentStep: null,
|
|
14
|
+
context: request.context,
|
|
15
|
+
metadata: {
|
|
16
|
+
name: request.metadata?.name,
|
|
17
|
+
tags: request.metadata?.tags ?? [],
|
|
18
|
+
},
|
|
19
|
+
createdAt: now,
|
|
20
|
+
updatedAt: now,
|
|
21
|
+
};
|
|
22
|
+
this.workflows.set(id, workflow);
|
|
23
|
+
// Simulate starting the workflow
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
const w = this.workflows.get(id);
|
|
26
|
+
if (w && w.status === 'created') {
|
|
27
|
+
w.status = 'running';
|
|
28
|
+
w.currentStep = 'initial';
|
|
29
|
+
w.updatedAt = new Date().toISOString();
|
|
30
|
+
}
|
|
31
|
+
}, 100);
|
|
32
|
+
return workflow;
|
|
33
|
+
}
|
|
34
|
+
async get(id) {
|
|
35
|
+
return this.workflows.get(id) ?? null;
|
|
36
|
+
}
|
|
37
|
+
async list(query) {
|
|
38
|
+
let workflows = Array.from(this.workflows.values());
|
|
39
|
+
// Filter by status
|
|
40
|
+
if (query.status) {
|
|
41
|
+
workflows = workflows.filter((w) => w.status === query.status);
|
|
42
|
+
}
|
|
43
|
+
// Sort by creation date (newest first)
|
|
44
|
+
workflows.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
45
|
+
// Pagination
|
|
46
|
+
const total = workflows.length;
|
|
47
|
+
const page = query.page ?? 1;
|
|
48
|
+
const pageSize = query.pageSize ?? 20;
|
|
49
|
+
const start = (page - 1) * pageSize;
|
|
50
|
+
const end = start + pageSize;
|
|
51
|
+
const paginatedWorkflows = workflows.slice(start, end);
|
|
52
|
+
return {
|
|
53
|
+
workflows: paginatedWorkflows,
|
|
54
|
+
pagination: {
|
|
55
|
+
page,
|
|
56
|
+
pageSize,
|
|
57
|
+
total,
|
|
58
|
+
hasMore: end < total,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async pause(id) {
|
|
63
|
+
const workflow = this.workflows.get(id);
|
|
64
|
+
if (!workflow) {
|
|
65
|
+
throw Errors.notFound(`Workflow ${id} not found`);
|
|
66
|
+
}
|
|
67
|
+
if (workflow.status !== 'running') {
|
|
68
|
+
throw Errors.conflict(`Workflow ${id} is not running (current status: ${workflow.status})`);
|
|
69
|
+
}
|
|
70
|
+
workflow.status = 'paused';
|
|
71
|
+
workflow.updatedAt = new Date().toISOString();
|
|
72
|
+
return workflow;
|
|
73
|
+
}
|
|
74
|
+
async resume(id) {
|
|
75
|
+
const workflow = this.workflows.get(id);
|
|
76
|
+
if (!workflow) {
|
|
77
|
+
throw Errors.notFound(`Workflow ${id} not found`);
|
|
78
|
+
}
|
|
79
|
+
if (workflow.status !== 'paused') {
|
|
80
|
+
throw Errors.conflict(`Workflow ${id} is not paused (current status: ${workflow.status})`);
|
|
81
|
+
}
|
|
82
|
+
workflow.status = 'running';
|
|
83
|
+
workflow.updatedAt = new Date().toISOString();
|
|
84
|
+
return workflow;
|
|
85
|
+
}
|
|
86
|
+
async cancel(id) {
|
|
87
|
+
const workflow = this.workflows.get(id);
|
|
88
|
+
if (!workflow) {
|
|
89
|
+
throw Errors.notFound(`Workflow ${id} not found`);
|
|
90
|
+
}
|
|
91
|
+
if (workflow.status === 'completed' || workflow.status === 'cancelled') {
|
|
92
|
+
throw Errors.conflict(`Workflow ${id} cannot be cancelled (current status: ${workflow.status})`);
|
|
93
|
+
}
|
|
94
|
+
workflow.status = 'cancelled';
|
|
95
|
+
workflow.updatedAt = new Date().toISOString();
|
|
96
|
+
workflow.completedAt = new Date().toISOString();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Clear all workflows (for testing)
|
|
100
|
+
*/
|
|
101
|
+
clear() {
|
|
102
|
+
this.workflows.clear();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get workflow count (for testing)
|
|
106
|
+
*/
|
|
107
|
+
count() {
|
|
108
|
+
return this.workflows.size;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Workflow service - facade over workflow engine
|
|
113
|
+
*/
|
|
114
|
+
export class WorkflowService {
|
|
115
|
+
engine;
|
|
116
|
+
constructor(engine) {
|
|
117
|
+
this.engine = engine;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create and start a new workflow
|
|
121
|
+
*/
|
|
122
|
+
async create(request) {
|
|
123
|
+
return this.engine.create(request);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get workflow by ID
|
|
127
|
+
*/
|
|
128
|
+
async get(id) {
|
|
129
|
+
const workflow = await this.engine.get(id);
|
|
130
|
+
if (!workflow) {
|
|
131
|
+
throw Errors.notFound(`Workflow ${id} not found`);
|
|
132
|
+
}
|
|
133
|
+
return workflow;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* List workflows with optional filters
|
|
137
|
+
*/
|
|
138
|
+
async list(query) {
|
|
139
|
+
return this.engine.list({
|
|
140
|
+
page: query?.page ?? 1,
|
|
141
|
+
pageSize: query?.pageSize ?? 20,
|
|
142
|
+
status: query?.status,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Pause a running workflow
|
|
147
|
+
*/
|
|
148
|
+
async pause(id) {
|
|
149
|
+
return this.engine.pause(id);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Resume a paused workflow
|
|
153
|
+
*/
|
|
154
|
+
async resume(id) {
|
|
155
|
+
return this.engine.resume(id);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Cancel a workflow
|
|
159
|
+
*/
|
|
160
|
+
async cancel(id) {
|
|
161
|
+
return this.engine.cancel(id);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=workflow-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-service.js","sourceRoot":"","sources":["../../src/services/workflow-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { SSEEvent, SSEEventType, WorkflowEventType, WorkflowEventData, SSEChannel, WorkflowSSEEvent, QueueSSEEvent, AgentSSEEvent, ErrorSSEEvent, ConnectedSSEEvent } from '../types/sse.js';
|
|
2
|
+
import type { DecisionQueueItem, DecisionResponse, ConnectedAgent } from '../types/api.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a unique event ID
|
|
5
|
+
* Format: {timestamp}_{connectionId}_{sequence}
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateEventId(connectionId: string, sequence: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Create an event ID generator for a connection
|
|
10
|
+
*/
|
|
11
|
+
export declare function createEventIdGenerator(connectionId: string): () => string;
|
|
12
|
+
/**
|
|
13
|
+
* Format SSE event for transmission
|
|
14
|
+
* Produces the SSE text format:
|
|
15
|
+
* event: <type>
|
|
16
|
+
* id: <id>
|
|
17
|
+
* data: <json>
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatSSEEvent<T>(event: SSEEvent<T>): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format heartbeat comment
|
|
23
|
+
* SSE comments start with ':' and are used for keep-alive
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatHeartbeat(): string;
|
|
26
|
+
/**
|
|
27
|
+
* Create a workflow event
|
|
28
|
+
*/
|
|
29
|
+
export declare function createWorkflowEvent(eventType: WorkflowEventType, data: WorkflowEventData, connectionId: string, sequence: number): WorkflowSSEEvent;
|
|
30
|
+
/**
|
|
31
|
+
* Create a queue update event
|
|
32
|
+
*/
|
|
33
|
+
export declare function createQueueEvent(action: 'added' | 'removed' | 'updated', items: DecisionQueueItem[], queueSize: number, connectionId: string, sequence: number, response?: DecisionResponse): QueueSSEEvent;
|
|
34
|
+
/**
|
|
35
|
+
* Create an agent status event
|
|
36
|
+
*/
|
|
37
|
+
export declare function createAgentEvent(status: 'connected' | 'disconnected' | 'busy' | 'idle', agent: ConnectedAgent, connectionId: string, sequence: number): AgentSSEEvent;
|
|
38
|
+
/**
|
|
39
|
+
* Create an error event
|
|
40
|
+
*/
|
|
41
|
+
export declare function createErrorEvent(title: string, detail: string, status: number, connectionId: string, sequence: number, traceId?: string): ErrorSSEEvent;
|
|
42
|
+
/**
|
|
43
|
+
* Create a connected confirmation event
|
|
44
|
+
*/
|
|
45
|
+
export declare function createConnectedEvent(connectionId: string, channels: SSEChannel[], sequence: number): ConnectedSSEEvent;
|
|
46
|
+
/**
|
|
47
|
+
* Create a generic SSE event
|
|
48
|
+
*/
|
|
49
|
+
export declare function createSSEEvent<T>(eventType: SSEEventType, data: T, connectionId: string, sequence: number): SSEEvent<T>;
|
|
50
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sse/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3F;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,MAAM,CAGzE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAqB5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iBAAiB,EAC5B,IAAI,EAAE,iBAAiB,EACvB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAOlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,EACvC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,aAAa,CAoBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,EACtD,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,aAAa,CAmBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAsBf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAWnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,CAAC,EACP,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,QAAQ,CAAC,CAAC,CAAC,CAOb"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { ErrorTypes } from '../types/problem-details.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a unique event ID
|
|
4
|
+
* Format: {timestamp}_{connectionId}_{sequence}
|
|
5
|
+
*/
|
|
6
|
+
export function generateEventId(connectionId, sequence) {
|
|
7
|
+
return `${Date.now()}_${connectionId}_${sequence}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create an event ID generator for a connection
|
|
11
|
+
*/
|
|
12
|
+
export function createEventIdGenerator(connectionId) {
|
|
13
|
+
let sequence = 0;
|
|
14
|
+
return () => generateEventId(connectionId, ++sequence);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format SSE event for transmission
|
|
18
|
+
* Produces the SSE text format:
|
|
19
|
+
* event: <type>
|
|
20
|
+
* id: <id>
|
|
21
|
+
* data: <json>
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
export function formatSSEEvent(event) {
|
|
25
|
+
const lines = [];
|
|
26
|
+
// Event type
|
|
27
|
+
lines.push(`event: ${event.event}`);
|
|
28
|
+
// Event ID
|
|
29
|
+
lines.push(`id: ${event.id}`);
|
|
30
|
+
// Data - handle multi-line JSON by splitting and prefixing each line
|
|
31
|
+
const jsonData = JSON.stringify(event.data);
|
|
32
|
+
const dataLines = jsonData.split('\n');
|
|
33
|
+
for (const line of dataLines) {
|
|
34
|
+
lines.push(`data: ${line}`);
|
|
35
|
+
}
|
|
36
|
+
// SSE requires double newline to end event
|
|
37
|
+
lines.push('');
|
|
38
|
+
lines.push('');
|
|
39
|
+
return lines.join('\n');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Format heartbeat comment
|
|
43
|
+
* SSE comments start with ':' and are used for keep-alive
|
|
44
|
+
*/
|
|
45
|
+
export function formatHeartbeat() {
|
|
46
|
+
return `: heartbeat ${new Date().toISOString()}\n\n`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a workflow event
|
|
50
|
+
*/
|
|
51
|
+
export function createWorkflowEvent(eventType, data, connectionId, sequence) {
|
|
52
|
+
return {
|
|
53
|
+
event: eventType,
|
|
54
|
+
id: generateEventId(connectionId, sequence),
|
|
55
|
+
data,
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a queue update event
|
|
61
|
+
*/
|
|
62
|
+
export function createQueueEvent(action, items, queueSize, connectionId, sequence, response) {
|
|
63
|
+
const event = action === 'added'
|
|
64
|
+
? 'queue:item:added'
|
|
65
|
+
: action === 'removed'
|
|
66
|
+
? 'queue:item:removed'
|
|
67
|
+
: 'queue:updated';
|
|
68
|
+
return {
|
|
69
|
+
event,
|
|
70
|
+
id: generateEventId(connectionId, sequence),
|
|
71
|
+
data: {
|
|
72
|
+
action,
|
|
73
|
+
items,
|
|
74
|
+
item: items[0],
|
|
75
|
+
queueSize,
|
|
76
|
+
...(response && { response }),
|
|
77
|
+
},
|
|
78
|
+
timestamp: new Date().toISOString(),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create an agent status event
|
|
83
|
+
*/
|
|
84
|
+
export function createAgentEvent(status, agent, connectionId, sequence) {
|
|
85
|
+
const event = status === 'connected'
|
|
86
|
+
? 'agent:connected'
|
|
87
|
+
: status === 'disconnected'
|
|
88
|
+
? 'agent:disconnected'
|
|
89
|
+
: 'agent:status';
|
|
90
|
+
return {
|
|
91
|
+
event,
|
|
92
|
+
id: generateEventId(connectionId, sequence),
|
|
93
|
+
data: {
|
|
94
|
+
agentId: agent.id,
|
|
95
|
+
status,
|
|
96
|
+
capabilities: agent.capabilities,
|
|
97
|
+
agent,
|
|
98
|
+
},
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create an error event
|
|
104
|
+
*/
|
|
105
|
+
export function createErrorEvent(title, detail, status, connectionId, sequence, traceId) {
|
|
106
|
+
const errorType = status === 401
|
|
107
|
+
? ErrorTypes.UNAUTHORIZED
|
|
108
|
+
: status === 403
|
|
109
|
+
? ErrorTypes.FORBIDDEN
|
|
110
|
+
: status === 404
|
|
111
|
+
? ErrorTypes.NOT_FOUND
|
|
112
|
+
: ErrorTypes.INTERNAL;
|
|
113
|
+
return {
|
|
114
|
+
event: 'error',
|
|
115
|
+
id: generateEventId(connectionId, sequence),
|
|
116
|
+
data: {
|
|
117
|
+
type: errorType,
|
|
118
|
+
title,
|
|
119
|
+
status,
|
|
120
|
+
detail,
|
|
121
|
+
traceId,
|
|
122
|
+
},
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a connected confirmation event
|
|
128
|
+
*/
|
|
129
|
+
export function createConnectedEvent(connectionId, channels, sequence) {
|
|
130
|
+
return {
|
|
131
|
+
event: 'connected',
|
|
132
|
+
id: generateEventId(connectionId, sequence),
|
|
133
|
+
data: {
|
|
134
|
+
connectionId,
|
|
135
|
+
channels,
|
|
136
|
+
timestamp: new Date().toISOString(),
|
|
137
|
+
},
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create a generic SSE event
|
|
143
|
+
*/
|
|
144
|
+
export function createSSEEvent(eventType, data, connectionId, sequence) {
|
|
145
|
+
return {
|
|
146
|
+
event: eventType,
|
|
147
|
+
id: generateEventId(connectionId, sequence),
|
|
148
|
+
data,
|
|
149
|
+
timestamp: new Date().toISOString(),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sse/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SSEStream, createSSEStream, parseLastEventId } from './stream.js';
|
|
2
|
+
export { generateEventId, createEventIdGenerator, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, createSSEEvent, } from './events.js';
|
|
3
|
+
export { SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './subscriptions.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// SSE Stream Management
|
|
2
|
+
export { SSEStream, createSSEStream, parseLastEventId } from './stream.js';
|
|
3
|
+
// SSE Events
|
|
4
|
+
export { generateEventId, createEventIdGenerator, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, createSSEEvent, } from './events.js';
|
|
5
|
+
// SSE Subscriptions
|
|
6
|
+
export { SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './subscriptions.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3E,aAAa;AACb,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from 'fastify';
|
|
2
|
+
import type { ServerResponse } from 'http';
|
|
3
|
+
import type { SSEConnectionOptions, SSEStreamConfig, SSEChannel, SSEFilters, SSEEvent } from '../types/sse.js';
|
|
4
|
+
/**
|
|
5
|
+
* SSE Stream Manager
|
|
6
|
+
* Manages individual SSE connections with heartbeat and event delivery
|
|
7
|
+
*/
|
|
8
|
+
export declare class SSEStream {
|
|
9
|
+
private connection;
|
|
10
|
+
private config;
|
|
11
|
+
private closed;
|
|
12
|
+
constructor(response: ServerResponse, request: FastifyRequest, userId: string, options?: SSEConnectionOptions, config?: Partial<SSEStreamConfig>);
|
|
13
|
+
/**
|
|
14
|
+
* Get connection ID
|
|
15
|
+
*/
|
|
16
|
+
get id(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get user ID
|
|
19
|
+
*/
|
|
20
|
+
get userId(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get subscribed channels
|
|
23
|
+
*/
|
|
24
|
+
get channels(): SSEChannel[];
|
|
25
|
+
/**
|
|
26
|
+
* Get subscription filters
|
|
27
|
+
*/
|
|
28
|
+
get filters(): SSEFilters;
|
|
29
|
+
/**
|
|
30
|
+
* Check if connection is closed
|
|
31
|
+
*/
|
|
32
|
+
get isClosed(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Get last event ID
|
|
35
|
+
*/
|
|
36
|
+
get lastEventId(): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get next sequence number
|
|
39
|
+
*/
|
|
40
|
+
private nextSequence;
|
|
41
|
+
/**
|
|
42
|
+
* Start the SSE stream
|
|
43
|
+
* Sets up headers, sends initial connected event, and starts heartbeat
|
|
44
|
+
*/
|
|
45
|
+
start(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Send an SSE event
|
|
48
|
+
*/
|
|
49
|
+
send<T>(event: SSEEvent<T>): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Send raw SSE data
|
|
52
|
+
*/
|
|
53
|
+
private sendRaw;
|
|
54
|
+
/**
|
|
55
|
+
* Send heartbeat
|
|
56
|
+
*/
|
|
57
|
+
sendHeartbeat(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Start heartbeat timer
|
|
60
|
+
*/
|
|
61
|
+
private startHeartbeat;
|
|
62
|
+
/**
|
|
63
|
+
* Stop heartbeat timer
|
|
64
|
+
*/
|
|
65
|
+
private stopHeartbeat;
|
|
66
|
+
/**
|
|
67
|
+
* Check if connection is subscribed to a channel
|
|
68
|
+
*/
|
|
69
|
+
isSubscribedTo(channel: SSEChannel): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Check if event matches subscription filters
|
|
72
|
+
*/
|
|
73
|
+
matchesFilters(workflowId?: string, tags?: string[]): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Update subscription channels
|
|
76
|
+
*/
|
|
77
|
+
updateChannels(channels: SSEChannel[]): void;
|
|
78
|
+
/**
|
|
79
|
+
* Update subscription filters
|
|
80
|
+
*/
|
|
81
|
+
updateFilters(filters: SSEFilters): void;
|
|
82
|
+
/**
|
|
83
|
+
* Close the connection
|
|
84
|
+
*/
|
|
85
|
+
close(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Get connection info for logging
|
|
88
|
+
*/
|
|
89
|
+
getInfo(): {
|
|
90
|
+
id: string;
|
|
91
|
+
userId: string;
|
|
92
|
+
channels: SSEChannel[];
|
|
93
|
+
connectedAt: Date;
|
|
94
|
+
filters: SSEFilters;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create SSE response and return stream manager
|
|
99
|
+
*/
|
|
100
|
+
export declare function createSSEStream(reply: FastifyReply, request: FastifyRequest, userId: string, options?: SSEConnectionOptions, config?: Partial<SSEStreamConfig>): SSEStream;
|
|
101
|
+
/**
|
|
102
|
+
* Parse Last-Event-ID header for reconnection support
|
|
103
|
+
*/
|
|
104
|
+
export declare function parseLastEventId(request: FastifyRequest): {
|
|
105
|
+
timestamp: number;
|
|
106
|
+
connectionId: string;
|
|
107
|
+
sequence: number;
|
|
108
|
+
} | null;
|
|
109
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/sse/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,KAAK,EAEV,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,UAAU,EACV,QAAQ,EACT,MAAM,iBAAiB,CAAC;AAIzB;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;gBAG9B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,EAClC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAsBvC;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAEf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,UAAU,EAAE,CAE3B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,UAAU,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,KAAK,IAAI,IAAI;IA0Bb;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO;IAKpC;;OAEG;IACH,OAAO,CAAC,OAAO;IAiBf;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAI5C;;OAEG;IACH,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO;IAwB7D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAI5C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,OAAO,IAAI;QACT,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,WAAW,EAAE,IAAI,CAAC;QAClB,OAAO,EAAE,UAAU,CAAC;KACrB;CASF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,EAClC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,SAAS,CAQX;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,GACtB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOtE"}
|