@bradygaster/squad-sdk 0.6.2 → 0.8.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/README.md +296 -296
- package/dist/adapter/client.d.ts +225 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +397 -0
- package/dist/adapter/client.js.map +1 -0
- package/dist/adapter/errors.d.ts +260 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +362 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/types.d.ts +779 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +11 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/agents/charter-compiler.d.ts +102 -0
- package/dist/agents/charter-compiler.d.ts.map +1 -0
- package/dist/agents/charter-compiler.js +157 -0
- package/dist/agents/charter-compiler.js.map +1 -0
- package/dist/agents/history-shadow.d.ts +80 -0
- package/dist/agents/history-shadow.d.ts.map +1 -0
- package/dist/agents/history-shadow.js +239 -0
- package/dist/agents/history-shadow.js.map +1 -0
- package/dist/agents/index.d.ts +68 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +74 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/lifecycle.d.ts +138 -0
- package/dist/agents/lifecycle.d.ts.map +1 -0
- package/dist/agents/lifecycle.js +258 -0
- package/dist/agents/lifecycle.js.map +1 -0
- package/dist/agents/model-selector.d.ts +80 -0
- package/dist/agents/model-selector.d.ts.map +1 -0
- package/dist/agents/model-selector.js +198 -0
- package/dist/agents/model-selector.js.map +1 -0
- package/dist/agents/onboarding.d.ts +65 -0
- package/dist/agents/onboarding.d.ts.map +1 -0
- package/dist/agents/onboarding.js +373 -0
- package/dist/agents/onboarding.js.map +1 -0
- package/dist/build/bundle.d.ts +32 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +97 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/ci-pipeline.d.ts +51 -0
- package/dist/build/ci-pipeline.d.ts.map +1 -0
- package/dist/build/ci-pipeline.js +180 -0
- package/dist/build/ci-pipeline.js.map +1 -0
- package/dist/build/github-dist.d.ts +37 -0
- package/dist/build/github-dist.d.ts.map +1 -0
- package/dist/build/github-dist.js +117 -0
- package/dist/build/github-dist.js.map +1 -0
- package/dist/build/index.d.ts +11 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +11 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/install-migration.d.ts +28 -0
- package/dist/build/install-migration.d.ts.map +1 -0
- package/dist/build/install-migration.js +103 -0
- package/dist/build/install-migration.js.map +1 -0
- package/dist/build/npm-package.d.ts +54 -0
- package/dist/build/npm-package.d.ts.map +1 -0
- package/dist/build/npm-package.js +128 -0
- package/dist/build/npm-package.js.map +1 -0
- package/dist/build/release.d.ts +108 -0
- package/dist/build/release.d.ts.map +1 -0
- package/dist/build/release.js +295 -0
- package/dist/build/release.js.map +1 -0
- package/dist/build/versioning.d.ts +38 -0
- package/dist/build/versioning.d.ts.map +1 -0
- package/dist/build/versioning.js +113 -0
- package/dist/build/versioning.js.map +1 -0
- package/dist/casting/casting-engine.d.ts +60 -0
- package/dist/casting/casting-engine.d.ts.map +1 -0
- package/dist/casting/casting-engine.js +223 -0
- package/dist/casting/casting-engine.js.map +1 -0
- package/dist/casting/casting-history.d.ts +54 -0
- package/dist/casting/casting-history.d.ts.map +1 -0
- package/dist/casting/casting-history.js +63 -0
- package/dist/casting/casting-history.js.map +1 -0
- package/dist/casting/index.d.ts +46 -0
- package/dist/casting/index.d.ts.map +1 -0
- package/dist/casting/index.js +37 -0
- package/dist/casting/index.js.map +1 -0
- package/dist/client/event-bus.d.ts +29 -0
- package/dist/client/event-bus.d.ts.map +1 -0
- package/dist/client/event-bus.js +53 -0
- package/dist/client/event-bus.js.map +1 -0
- package/dist/client/index.d.ts +100 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +170 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/session-pool.d.ts +66 -0
- package/dist/client/session-pool.d.ts.map +1 -0
- package/dist/client/session-pool.js +145 -0
- package/dist/client/session-pool.js.map +1 -0
- package/dist/config/agent-doc.d.ts +43 -0
- package/dist/config/agent-doc.d.ts.map +1 -0
- package/dist/config/agent-doc.js +158 -0
- package/dist/config/agent-doc.js.map +1 -0
- package/dist/config/agent-source.d.ts +95 -0
- package/dist/config/agent-source.d.ts.map +1 -0
- package/dist/config/agent-source.js +274 -0
- package/dist/config/agent-source.js.map +1 -0
- package/dist/config/doc-sync.d.ts +66 -0
- package/dist/config/doc-sync.d.ts.map +1 -0
- package/dist/config/doc-sync.js +270 -0
- package/dist/config/doc-sync.js.map +1 -0
- package/dist/config/feature-audit.d.ts +49 -0
- package/dist/config/feature-audit.d.ts.map +1 -0
- package/dist/config/feature-audit.js +148 -0
- package/dist/config/feature-audit.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +15 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/init.d.ts +61 -0
- package/dist/config/init.d.ts.map +1 -0
- package/dist/config/init.js +369 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/legacy-fallback.d.ts +83 -0
- package/dist/config/legacy-fallback.d.ts.map +1 -0
- package/dist/config/legacy-fallback.js +212 -0
- package/dist/config/legacy-fallback.js.map +1 -0
- package/dist/config/markdown-migration.d.ts +157 -0
- package/dist/config/markdown-migration.d.ts.map +1 -0
- package/dist/config/markdown-migration.js +434 -0
- package/dist/config/markdown-migration.js.map +1 -0
- package/dist/config/migration.d.ts +123 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +273 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migrations/index.d.ts +36 -0
- package/dist/config/migrations/index.d.ts.map +1 -0
- package/dist/config/migrations/index.js +216 -0
- package/dist/config/migrations/index.js.map +1 -0
- package/dist/config/models.d.ts +134 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +354 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/routing.d.ts +118 -0
- package/dist/config/routing.d.ts.map +1 -0
- package/dist/config/routing.js +247 -0
- package/dist/config/routing.js.map +1 -0
- package/dist/config/schema.d.ts +72 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +63 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +82 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +174 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/direct-response.d.ts +83 -0
- package/dist/coordinator/direct-response.d.ts.map +1 -0
- package/dist/coordinator/direct-response.js +187 -0
- package/dist/coordinator/direct-response.js.map +1 -0
- package/dist/coordinator/fan-out.d.ts +83 -0
- package/dist/coordinator/fan-out.d.ts.map +1 -0
- package/dist/coordinator/fan-out.js +161 -0
- package/dist/coordinator/fan-out.js.map +1 -0
- package/dist/coordinator/index.d.ts +47 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +54 -0
- package/dist/coordinator/index.js.map +1 -0
- package/dist/coordinator/response-tiers.d.ts +49 -0
- package/dist/coordinator/response-tiers.d.ts.map +1 -0
- package/dist/coordinator/response-tiers.js +149 -0
- package/dist/coordinator/response-tiers.js.map +1 -0
- package/dist/hooks/index.d.ts +103 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +279 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +24 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/marketplace/backend.d.ts +35 -0
- package/dist/marketplace/backend.d.ts.map +1 -0
- package/dist/marketplace/backend.js +99 -0
- package/dist/marketplace/backend.js.map +1 -0
- package/dist/marketplace/browser.d.ts +33 -0
- package/dist/marketplace/browser.d.ts.map +1 -0
- package/dist/marketplace/browser.js +97 -0
- package/dist/marketplace/browser.js.map +1 -0
- package/dist/marketplace/extension-adapter.d.ts +51 -0
- package/dist/marketplace/extension-adapter.d.ts.map +1 -0
- package/dist/marketplace/extension-adapter.js +81 -0
- package/dist/marketplace/extension-adapter.js.map +1 -0
- package/dist/marketplace/index.d.ts +51 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +108 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/packaging.d.ts +25 -0
- package/dist/marketplace/packaging.d.ts.map +1 -0
- package/dist/marketplace/packaging.js +117 -0
- package/dist/marketplace/packaging.js.map +1 -0
- package/dist/marketplace/schema.d.ts +50 -0
- package/dist/marketplace/schema.d.ts.map +1 -0
- package/dist/marketplace/schema.js +120 -0
- package/dist/marketplace/schema.js.map +1 -0
- package/dist/marketplace/security.d.ts +26 -0
- package/dist/marketplace/security.d.ts.map +1 -0
- package/dist/marketplace/security.js +199 -0
- package/dist/marketplace/security.js.map +1 -0
- package/dist/parsers.d.ts +15 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +15 -0
- package/dist/parsers.js.map +1 -0
- package/dist/ralph/index.d.ts +56 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +61 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/resolution.d.ts +47 -0
- package/dist/resolution.d.ts.map +1 -0
- package/dist/resolution.js +106 -0
- package/dist/resolution.js.map +1 -0
- package/dist/runtime/benchmarks.d.ts +121 -0
- package/dist/runtime/benchmarks.d.ts.map +1 -0
- package/dist/runtime/benchmarks.js +251 -0
- package/dist/runtime/benchmarks.js.map +1 -0
- package/dist/runtime/config.d.ts +313 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +466 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/cost-tracker.d.ts +73 -0
- package/dist/runtime/cost-tracker.d.ts.map +1 -0
- package/dist/runtime/cost-tracker.js +157 -0
- package/dist/runtime/cost-tracker.js.map +1 -0
- package/dist/runtime/event-bus.d.ts +190 -0
- package/dist/runtime/event-bus.d.ts.map +1 -0
- package/dist/runtime/event-bus.js +218 -0
- package/dist/runtime/event-bus.js.map +1 -0
- package/dist/runtime/health.d.ts +66 -0
- package/dist/runtime/health.d.ts.map +1 -0
- package/dist/runtime/health.js +111 -0
- package/dist/runtime/health.js.map +1 -0
- package/dist/runtime/i18n.d.ts +54 -0
- package/dist/runtime/i18n.d.ts.map +1 -0
- package/dist/runtime/i18n.js +126 -0
- package/dist/runtime/i18n.js.map +1 -0
- package/dist/runtime/offline.d.ts +64 -0
- package/dist/runtime/offline.d.ts.map +1 -0
- package/dist/runtime/offline.js +108 -0
- package/dist/runtime/offline.js.map +1 -0
- package/dist/runtime/streaming.d.ts +97 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +156 -0
- package/dist/runtime/streaming.js.map +1 -0
- package/dist/runtime/telemetry.d.ts +82 -0
- package/dist/runtime/telemetry.d.ts.map +1 -0
- package/dist/runtime/telemetry.js +120 -0
- package/dist/runtime/telemetry.js.map +1 -0
- package/dist/sharing/agent-repo.d.ts +33 -0
- package/dist/sharing/agent-repo.d.ts.map +1 -0
- package/dist/sharing/agent-repo.js +79 -0
- package/dist/sharing/agent-repo.js.map +1 -0
- package/dist/sharing/cache.d.ts +36 -0
- package/dist/sharing/cache.d.ts.map +1 -0
- package/dist/sharing/cache.js +85 -0
- package/dist/sharing/cache.js.map +1 -0
- package/dist/sharing/conflicts.d.ts +32 -0
- package/dist/sharing/conflicts.d.ts.map +1 -0
- package/dist/sharing/conflicts.js +121 -0
- package/dist/sharing/conflicts.js.map +1 -0
- package/dist/sharing/export.d.ts +50 -0
- package/dist/sharing/export.d.ts.map +1 -0
- package/dist/sharing/export.js +156 -0
- package/dist/sharing/export.js.map +1 -0
- package/dist/sharing/history-split.d.ts +34 -0
- package/dist/sharing/history-split.d.ts.map +1 -0
- package/dist/sharing/history-split.js +101 -0
- package/dist/sharing/history-split.js.map +1 -0
- package/dist/sharing/import.d.ts +37 -0
- package/dist/sharing/import.d.ts.map +1 -0
- package/dist/sharing/import.js +138 -0
- package/dist/sharing/import.js.map +1 -0
- package/dist/sharing/index.d.ts +11 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/index.js +11 -0
- package/dist/sharing/index.js.map +1 -0
- package/dist/sharing/versioning.d.ts +32 -0
- package/dist/sharing/versioning.d.ts.map +1 -0
- package/dist/sharing/versioning.js +64 -0
- package/dist/sharing/versioning.js.map +1 -0
- package/dist/skills/index.d.ts +49 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +85 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +56 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +106 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-source.d.ts +63 -0
- package/dist/skills/skill-source.d.ts.map +1 -0
- package/dist/skills/skill-source.js +199 -0
- package/dist/skills/skill-source.js.map +1 -0
- package/dist/tools/index.d.ts +87 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +419 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/normalize-eol.d.ts +6 -0
- package/dist/utils/normalize-eol.d.ts.map +1 -0
- package/dist/utils/normalize-eol.js +8 -0
- package/dist/utils/normalize-eol.js.map +1 -0
- package/package.json +115 -39
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct Response Handler (M3-6, Issue #147)
|
|
3
|
+
*
|
|
4
|
+
* Handles simple queries that don't require agent spawning.
|
|
5
|
+
* Acts as a first-pass check in the coordinator pipeline —
|
|
6
|
+
* status queries, help requests, config questions, and team roster
|
|
7
|
+
* queries are answered directly without consuming agent sessions.
|
|
8
|
+
*/
|
|
9
|
+
import type { SquadConfig } from '../runtime/config.js';
|
|
10
|
+
import type { EventBus } from '../runtime/event-bus.js';
|
|
11
|
+
/**
|
|
12
|
+
* Context for coordinator message handling.
|
|
13
|
+
*/
|
|
14
|
+
export interface CoordinatorContext {
|
|
15
|
+
/** Current session ID (coordinator session) */
|
|
16
|
+
sessionId: string;
|
|
17
|
+
/** Squad configuration */
|
|
18
|
+
config: SquadConfig;
|
|
19
|
+
/** Event bus for observability */
|
|
20
|
+
eventBus?: EventBus;
|
|
21
|
+
/** Team roster content (team.md) */
|
|
22
|
+
teamRoster?: string;
|
|
23
|
+
/** Active agent names */
|
|
24
|
+
activeAgents?: string[];
|
|
25
|
+
/** User-provided metadata */
|
|
26
|
+
metadata?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Result of a direct response.
|
|
30
|
+
*/
|
|
31
|
+
export interface DirectResponseResult {
|
|
32
|
+
/** The response text to return to the user */
|
|
33
|
+
response: string;
|
|
34
|
+
/** Category of the matched pattern */
|
|
35
|
+
category: DirectResponseCategory;
|
|
36
|
+
/** Confidence in the match */
|
|
37
|
+
confidence: 'high' | 'medium';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Categories of messages handled directly.
|
|
41
|
+
*/
|
|
42
|
+
export type DirectResponseCategory = 'status' | 'help' | 'config' | 'roster' | 'greeting';
|
|
43
|
+
/**
|
|
44
|
+
* A configurable pattern for direct response matching.
|
|
45
|
+
*/
|
|
46
|
+
export interface DirectResponsePattern {
|
|
47
|
+
/** Category this pattern belongs to */
|
|
48
|
+
category: DirectResponseCategory;
|
|
49
|
+
/** Regex patterns that trigger this category */
|
|
50
|
+
patterns: RegExp[];
|
|
51
|
+
/** Handler that produces the response */
|
|
52
|
+
handler: (message: string, context: CoordinatorContext) => string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Handles simple queries without spawning agents.
|
|
56
|
+
*
|
|
57
|
+
* The handler checks incoming messages against a set of configurable
|
|
58
|
+
* patterns. If a match is found, it produces a direct response without
|
|
59
|
+
* going through the routing → charter → spawn pipeline.
|
|
60
|
+
*/
|
|
61
|
+
export declare class DirectResponseHandler {
|
|
62
|
+
private patterns;
|
|
63
|
+
constructor(customPatterns?: DirectResponsePattern[]);
|
|
64
|
+
/**
|
|
65
|
+
* Check whether a message should be handled directly (no agent spawn).
|
|
66
|
+
*/
|
|
67
|
+
shouldHandleDirectly(message: string, config?: SquadConfig): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Handle a message directly and return a response.
|
|
70
|
+
* Should only be called after shouldHandleDirectly() returns true.
|
|
71
|
+
*/
|
|
72
|
+
handleDirect(message: string, context: CoordinatorContext): DirectResponseResult;
|
|
73
|
+
/**
|
|
74
|
+
* Add a custom pattern at runtime.
|
|
75
|
+
*/
|
|
76
|
+
addPattern(pattern: DirectResponsePattern): void;
|
|
77
|
+
/**
|
|
78
|
+
* Get all registered patterns.
|
|
79
|
+
*/
|
|
80
|
+
getPatterns(): ReadonlyArray<DirectResponsePattern>;
|
|
81
|
+
private matchPattern;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=direct-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-response.d.ts","sourceRoot":"","sources":["../../src/coordinator/direct-response.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,yBAAyB,CAAC;AAIpE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,MAAM,CAAC;CACnE;AA8FD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,cAAc,CAAC,EAAE,qBAAqB,EAAE;IAIpD;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO;IAkBpE;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,oBAAoB;IAmChF;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAIhD;;OAEG;IACH,WAAW,IAAI,aAAa,CAAC,qBAAqB,CAAC;IAMnD,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct Response Handler (M3-6, Issue #147)
|
|
3
|
+
*
|
|
4
|
+
* Handles simple queries that don't require agent spawning.
|
|
5
|
+
* Acts as a first-pass check in the coordinator pipeline —
|
|
6
|
+
* status queries, help requests, config questions, and team roster
|
|
7
|
+
* queries are answered directly without consuming agent sessions.
|
|
8
|
+
*/
|
|
9
|
+
// --- Default Patterns ---
|
|
10
|
+
const DEFAULT_PATTERNS = [
|
|
11
|
+
{
|
|
12
|
+
category: 'status',
|
|
13
|
+
patterns: [
|
|
14
|
+
/^(?:what(?:'s| is) the )?status\b/i,
|
|
15
|
+
/^(?:show|list|get)\s+(?:active\s+)?(?:agents?|sessions?|status)\b/i,
|
|
16
|
+
/^who(?:'s| is) (?:active|running|working)\b/i,
|
|
17
|
+
/^squad\s+status\b/i,
|
|
18
|
+
],
|
|
19
|
+
handler: (_message, context) => {
|
|
20
|
+
const agents = context.activeAgents ?? [];
|
|
21
|
+
if (agents.length === 0) {
|
|
22
|
+
return 'No agents are currently active. Use a task request to spawn agents.';
|
|
23
|
+
}
|
|
24
|
+
return `Active agents (${agents.length}): ${agents.join(', ')}`;
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
category: 'help',
|
|
29
|
+
patterns: [
|
|
30
|
+
/^(?:help|how do I|what can you do|what commands|usage)\b/i,
|
|
31
|
+
/^(?:show|list)\s+(?:help|commands|capabilities)\b/i,
|
|
32
|
+
/^\?$/,
|
|
33
|
+
],
|
|
34
|
+
handler: () => {
|
|
35
|
+
return [
|
|
36
|
+
'**Squad Coordinator** — I route work to specialist agents.',
|
|
37
|
+
'',
|
|
38
|
+
'You can ask me to:',
|
|
39
|
+
'- Route tasks to specific agents (e.g., "ask Fenster to fix the build")',
|
|
40
|
+
'- Check team status (e.g., "status" or "who is active?")',
|
|
41
|
+
'- View the team roster (e.g., "show team" or "who is on the team?")',
|
|
42
|
+
'- View configuration (e.g., "show config" or "what model am I using?")',
|
|
43
|
+
'',
|
|
44
|
+
'Or just describe what you need and I\'ll route it to the right agent.',
|
|
45
|
+
].join('\n');
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
category: 'config',
|
|
50
|
+
patterns: [
|
|
51
|
+
/^(?:show|get|what(?:'s| is))\s+(?:the\s+)?(?:config|configuration|settings|model)\b/i,
|
|
52
|
+
/^(?:which|what)\s+model\b/i,
|
|
53
|
+
/^config\b/i,
|
|
54
|
+
],
|
|
55
|
+
handler: (_message, context) => {
|
|
56
|
+
const cfg = context.config;
|
|
57
|
+
const model = cfg.models?.defaultModel ?? 'unknown';
|
|
58
|
+
const tier = cfg.models?.defaultTier ?? 'unknown';
|
|
59
|
+
const ruleCount = cfg.routing?.rules?.length ?? 0;
|
|
60
|
+
return [
|
|
61
|
+
`**Configuration** (v${cfg.version})`,
|
|
62
|
+
`- Default model: ${model} (${tier} tier)`,
|
|
63
|
+
`- Routing rules: ${ruleCount}`,
|
|
64
|
+
`- Tier ceiling respected: ${cfg.models?.respectTierCeiling ?? true}`,
|
|
65
|
+
].join('\n');
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
category: 'roster',
|
|
70
|
+
patterns: [
|
|
71
|
+
/^(?:show|list|get|who(?:'s| is)(?: on)?)\s+(?:the\s+)?(?:team|roster|agents?|members?)\b/i,
|
|
72
|
+
/^team\b/i,
|
|
73
|
+
/^roster\b/i,
|
|
74
|
+
],
|
|
75
|
+
handler: (_message, context) => {
|
|
76
|
+
if (context.teamRoster) {
|
|
77
|
+
return context.teamRoster;
|
|
78
|
+
}
|
|
79
|
+
const agents = context.activeAgents ?? [];
|
|
80
|
+
if (agents.length === 0) {
|
|
81
|
+
return 'No team roster available. Configure agents in your squad.config.ts.';
|
|
82
|
+
}
|
|
83
|
+
return `**Team Roster:** ${agents.join(', ')}`;
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
category: 'greeting',
|
|
88
|
+
patterns: [
|
|
89
|
+
/^(?:hi|hello|hey|good (?:morning|afternoon|evening)|yo|sup)\b/i,
|
|
90
|
+
/^(?:hi|hello|hey)!?$/i,
|
|
91
|
+
],
|
|
92
|
+
handler: () => {
|
|
93
|
+
return 'Hello! I\'m the Squad coordinator. Describe what you need and I\'ll route it to the right agent, or type "help" for options.';
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
// --- Direct Response Handler ---
|
|
98
|
+
/**
|
|
99
|
+
* Handles simple queries without spawning agents.
|
|
100
|
+
*
|
|
101
|
+
* The handler checks incoming messages against a set of configurable
|
|
102
|
+
* patterns. If a match is found, it produces a direct response without
|
|
103
|
+
* going through the routing → charter → spawn pipeline.
|
|
104
|
+
*/
|
|
105
|
+
export class DirectResponseHandler {
|
|
106
|
+
patterns;
|
|
107
|
+
constructor(customPatterns) {
|
|
108
|
+
this.patterns = customPatterns ?? DEFAULT_PATTERNS;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check whether a message should be handled directly (no agent spawn).
|
|
112
|
+
*/
|
|
113
|
+
shouldHandleDirectly(message, config) {
|
|
114
|
+
const trimmed = message.trim();
|
|
115
|
+
if (trimmed.length === 0)
|
|
116
|
+
return false;
|
|
117
|
+
// Check configurable patterns from squad config
|
|
118
|
+
if (config?.routing?.rules) {
|
|
119
|
+
for (const rule of config.routing.rules) {
|
|
120
|
+
if (rule.workType === 'direct' || rule.tier === 'direct') {
|
|
121
|
+
// Rules explicitly marked as 'direct' tier mean
|
|
122
|
+
// the coordinator should handle them, but we still
|
|
123
|
+
// fall through to pattern matching below.
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return this.matchPattern(trimmed) !== undefined;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Handle a message directly and return a response.
|
|
131
|
+
* Should only be called after shouldHandleDirectly() returns true.
|
|
132
|
+
*/
|
|
133
|
+
handleDirect(message, context) {
|
|
134
|
+
const trimmed = message.trim();
|
|
135
|
+
const match = this.matchPattern(trimmed);
|
|
136
|
+
if (!match) {
|
|
137
|
+
return {
|
|
138
|
+
response: 'I\'m not sure how to handle that directly. Let me route it to an agent.',
|
|
139
|
+
category: 'help',
|
|
140
|
+
confidence: 'medium',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const response = match.handler(trimmed, context);
|
|
144
|
+
// Emit event for observability
|
|
145
|
+
if (context.eventBus) {
|
|
146
|
+
context.eventBus.emit({
|
|
147
|
+
type: 'coordinator:routing',
|
|
148
|
+
sessionId: context.sessionId,
|
|
149
|
+
payload: {
|
|
150
|
+
decision: 'direct',
|
|
151
|
+
category: match.category,
|
|
152
|
+
messageLength: trimmed.length,
|
|
153
|
+
},
|
|
154
|
+
timestamp: new Date(),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
response,
|
|
159
|
+
category: match.category,
|
|
160
|
+
confidence: 'high',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Add a custom pattern at runtime.
|
|
165
|
+
*/
|
|
166
|
+
addPattern(pattern) {
|
|
167
|
+
this.patterns.push(pattern);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get all registered patterns.
|
|
171
|
+
*/
|
|
172
|
+
getPatterns() {
|
|
173
|
+
return this.patterns;
|
|
174
|
+
}
|
|
175
|
+
// --- Private ---
|
|
176
|
+
matchPattern(message) {
|
|
177
|
+
for (const pattern of this.patterns) {
|
|
178
|
+
for (const regex of pattern.patterns) {
|
|
179
|
+
if (regex.test(message)) {
|
|
180
|
+
return pattern;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=direct-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-response.js","sourceRoot":"","sources":["../../src/coordinator/direct-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Fan-Out Session Spawning (M1-10, Issue #130)
|
|
3
|
+
*
|
|
4
|
+
* Spawns multiple agent sessions concurrently using Promise.allSettled
|
|
5
|
+
* for maximum throughput. Each spawn compiles charter → resolves model
|
|
6
|
+
* → creates session → sends initial message. Event aggregation collects
|
|
7
|
+
* all session events into coordinator's event bus. Error isolation ensures
|
|
8
|
+
* one session failure doesn't affect others.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentCharter } from '../agents/index.js';
|
|
11
|
+
import type { EventBus } from '../client/event-bus.js';
|
|
12
|
+
import type { SessionPool } from '../client/session-pool.js';
|
|
13
|
+
export interface AgentSpawnConfig {
|
|
14
|
+
/** Agent name to spawn */
|
|
15
|
+
agentName: string;
|
|
16
|
+
/** Task description for the agent */
|
|
17
|
+
task: string;
|
|
18
|
+
/** Priority level */
|
|
19
|
+
priority?: 'low' | 'normal' | 'high' | 'critical';
|
|
20
|
+
/** Additional context to pass */
|
|
21
|
+
context?: string;
|
|
22
|
+
/** Model override (skips resolution) */
|
|
23
|
+
modelOverride?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface SpawnResult {
|
|
26
|
+
/** Agent name that was spawned */
|
|
27
|
+
agentName: string;
|
|
28
|
+
/** Session ID if spawn succeeded */
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
/** Spawn outcome */
|
|
31
|
+
status: 'success' | 'failed';
|
|
32
|
+
/** Error message if failed */
|
|
33
|
+
error?: string;
|
|
34
|
+
/** Start time */
|
|
35
|
+
startTime: Date;
|
|
36
|
+
/** End time */
|
|
37
|
+
endTime: Date;
|
|
38
|
+
}
|
|
39
|
+
export interface FanOutDependencies {
|
|
40
|
+
/** Charter compilation function */
|
|
41
|
+
compileCharter: (agentName: string) => Promise<AgentCharter>;
|
|
42
|
+
/** Model resolution function */
|
|
43
|
+
resolveModel: (charter: AgentCharter, override?: string) => Promise<string>;
|
|
44
|
+
/** Session creation function */
|
|
45
|
+
createSession: (config: any) => Promise<{
|
|
46
|
+
sessionId: string;
|
|
47
|
+
sendMessage: (opts: any) => Promise<void>;
|
|
48
|
+
}>;
|
|
49
|
+
/** Session pool for tracking */
|
|
50
|
+
sessionPool: SessionPool;
|
|
51
|
+
/** Event bus for aggregation */
|
|
52
|
+
eventBus: EventBus;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Spawn multiple agents in parallel using Promise.allSettled.
|
|
56
|
+
*
|
|
57
|
+
* Each spawn:
|
|
58
|
+
* 1. Compile charter.md → AgentCharter
|
|
59
|
+
* 2. Resolve model (override or charter or auto-select)
|
|
60
|
+
* 3. Create session via SquadClient
|
|
61
|
+
* 4. Send initial message with task and context
|
|
62
|
+
* 5. Aggregate events to coordinator's event bus
|
|
63
|
+
*
|
|
64
|
+
* Error isolation: one failure doesn't block others.
|
|
65
|
+
* Returns SpawnResult[] with outcomes for each agent.
|
|
66
|
+
*
|
|
67
|
+
* @param configs - Array of agent spawn configurations
|
|
68
|
+
* @param deps - Injected dependencies (charter compiler, model resolver, client)
|
|
69
|
+
* @returns Promise resolving to array of spawn results
|
|
70
|
+
*/
|
|
71
|
+
export declare function spawnParallel(configs: AgentSpawnConfig[], deps: FanOutDependencies): Promise<SpawnResult[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Subscribe to all events from a spawned session and forward them
|
|
74
|
+
* to the coordinator's event bus with agent context.
|
|
75
|
+
*
|
|
76
|
+
* @param sessionId - Session ID to subscribe to
|
|
77
|
+
* @param agentName - Agent name for context
|
|
78
|
+
* @param sessionEventEmitter - Session's event emitter (if available)
|
|
79
|
+
* @param coordinatorEventBus - Coordinator's event bus
|
|
80
|
+
*/
|
|
81
|
+
export declare function aggregateSessionEvents(sessionId: string, agentName: string, sessionEventEmitter: any, // SquadSession
|
|
82
|
+
coordinatorEventBus: EventBus): void;
|
|
83
|
+
//# sourceMappingURL=fan-out.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out.d.ts","sourceRoot":"","sources":["../../src/coordinator/fan-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,IAAI,CAAC;CACf;AAID,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7D,gCAAgC;IAChC,YAAY,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,gCAAgC;IAChC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IAC1G,gCAAgC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,gCAAgC;IAChC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB;AAoGD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,GAAG,EAAE,eAAe;AACzC,mBAAmB,EAAE,QAAQ,GAC5B,IAAI,CAuBN"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Fan-Out Session Spawning (M1-10, Issue #130)
|
|
3
|
+
*
|
|
4
|
+
* Spawns multiple agent sessions concurrently using Promise.allSettled
|
|
5
|
+
* for maximum throughput. Each spawn compiles charter → resolves model
|
|
6
|
+
* → creates session → sends initial message. Event aggregation collects
|
|
7
|
+
* all session events into coordinator's event bus. Error isolation ensures
|
|
8
|
+
* one session failure doesn't affect others.
|
|
9
|
+
*/
|
|
10
|
+
// --- Fan-Out Orchestrator ---
|
|
11
|
+
/**
|
|
12
|
+
* Spawn multiple agents in parallel using Promise.allSettled.
|
|
13
|
+
*
|
|
14
|
+
* Each spawn:
|
|
15
|
+
* 1. Compile charter.md → AgentCharter
|
|
16
|
+
* 2. Resolve model (override or charter or auto-select)
|
|
17
|
+
* 3. Create session via SquadClient
|
|
18
|
+
* 4. Send initial message with task and context
|
|
19
|
+
* 5. Aggregate events to coordinator's event bus
|
|
20
|
+
*
|
|
21
|
+
* Error isolation: one failure doesn't block others.
|
|
22
|
+
* Returns SpawnResult[] with outcomes for each agent.
|
|
23
|
+
*
|
|
24
|
+
* @param configs - Array of agent spawn configurations
|
|
25
|
+
* @param deps - Injected dependencies (charter compiler, model resolver, client)
|
|
26
|
+
* @returns Promise resolving to array of spawn results
|
|
27
|
+
*/
|
|
28
|
+
export async function spawnParallel(configs, deps) {
|
|
29
|
+
const spawnPromises = configs.map(config => spawnSingle(config, deps));
|
|
30
|
+
const settledResults = await Promise.allSettled(spawnPromises);
|
|
31
|
+
return settledResults.map((result, index) => {
|
|
32
|
+
if (result.status === 'fulfilled') {
|
|
33
|
+
return result.value;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Rejection from spawnSingle shouldn't happen (it catches internally),
|
|
37
|
+
// but handle defensively
|
|
38
|
+
return {
|
|
39
|
+
agentName: configs[index].agentName,
|
|
40
|
+
status: 'failed',
|
|
41
|
+
error: result.reason?.message || String(result.reason),
|
|
42
|
+
startTime: new Date(),
|
|
43
|
+
endTime: new Date(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Spawn a single agent session.
|
|
50
|
+
* Catches all errors and returns a SpawnResult (never rejects).
|
|
51
|
+
*/
|
|
52
|
+
async function spawnSingle(config, deps) {
|
|
53
|
+
const startTime = new Date();
|
|
54
|
+
try {
|
|
55
|
+
// Step 1: Compile charter
|
|
56
|
+
const charter = await deps.compileCharter(config.agentName);
|
|
57
|
+
// Step 2: Resolve model
|
|
58
|
+
const model = config.modelOverride
|
|
59
|
+
? config.modelOverride
|
|
60
|
+
: await deps.resolveModel(charter, config.modelOverride);
|
|
61
|
+
// Step 3: Create session
|
|
62
|
+
const session = await deps.createSession({
|
|
63
|
+
model,
|
|
64
|
+
clientName: `squad-agent-${config.agentName}`,
|
|
65
|
+
});
|
|
66
|
+
// Step 4: Register in session pool
|
|
67
|
+
deps.sessionPool.add({
|
|
68
|
+
id: session.sessionId,
|
|
69
|
+
agentName: config.agentName,
|
|
70
|
+
status: 'active',
|
|
71
|
+
createdAt: startTime,
|
|
72
|
+
});
|
|
73
|
+
// Step 5: Send initial task message
|
|
74
|
+
const initialPrompt = buildInitialPrompt(config);
|
|
75
|
+
await session.sendMessage({
|
|
76
|
+
prompt: initialPrompt,
|
|
77
|
+
mode: 'immediate',
|
|
78
|
+
});
|
|
79
|
+
// Step 6: Emit spawn success event
|
|
80
|
+
await deps.eventBus.emit({
|
|
81
|
+
type: 'session.created',
|
|
82
|
+
sessionId: session.sessionId,
|
|
83
|
+
payload: { agentName: config.agentName, priority: config.priority || 'normal' },
|
|
84
|
+
timestamp: new Date(),
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
agentName: config.agentName,
|
|
88
|
+
sessionId: session.sessionId,
|
|
89
|
+
status: 'success',
|
|
90
|
+
startTime,
|
|
91
|
+
endTime: new Date(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// Error isolation: one spawn failure doesn't affect others
|
|
96
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
97
|
+
await deps.eventBus.emit({
|
|
98
|
+
type: 'session.error',
|
|
99
|
+
sessionId: undefined,
|
|
100
|
+
payload: { agentName: config.agentName, error: errorMessage },
|
|
101
|
+
timestamp: new Date(),
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
agentName: config.agentName,
|
|
105
|
+
status: 'failed',
|
|
106
|
+
error: errorMessage,
|
|
107
|
+
startTime,
|
|
108
|
+
endTime: new Date(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Build the initial prompt message for a spawned agent.
|
|
114
|
+
* Includes task, priority, and optional context.
|
|
115
|
+
*/
|
|
116
|
+
function buildInitialPrompt(config) {
|
|
117
|
+
const parts = [];
|
|
118
|
+
if (config.priority && config.priority !== 'normal') {
|
|
119
|
+
parts.push(`**Priority:** ${config.priority.toUpperCase()}`);
|
|
120
|
+
}
|
|
121
|
+
parts.push('', `**Task:**`, config.task);
|
|
122
|
+
if (config.context) {
|
|
123
|
+
parts.push('', `**Context:**`, config.context);
|
|
124
|
+
}
|
|
125
|
+
return parts.join('\n');
|
|
126
|
+
}
|
|
127
|
+
// --- Event Aggregation Helper ---
|
|
128
|
+
/**
|
|
129
|
+
* Subscribe to all events from a spawned session and forward them
|
|
130
|
+
* to the coordinator's event bus with agent context.
|
|
131
|
+
*
|
|
132
|
+
* @param sessionId - Session ID to subscribe to
|
|
133
|
+
* @param agentName - Agent name for context
|
|
134
|
+
* @param sessionEventEmitter - Session's event emitter (if available)
|
|
135
|
+
* @param coordinatorEventBus - Coordinator's event bus
|
|
136
|
+
*/
|
|
137
|
+
export function aggregateSessionEvents(sessionId, agentName, sessionEventEmitter, // SquadSession
|
|
138
|
+
coordinatorEventBus) {
|
|
139
|
+
// Forward all session events to coordinator's event bus
|
|
140
|
+
const eventTypes = [
|
|
141
|
+
'message.delta',
|
|
142
|
+
'message.complete',
|
|
143
|
+
'tool.start',
|
|
144
|
+
'tool.complete',
|
|
145
|
+
'session.error',
|
|
146
|
+
'session.complete',
|
|
147
|
+
];
|
|
148
|
+
for (const eventType of eventTypes) {
|
|
149
|
+
if (sessionEventEmitter.on) {
|
|
150
|
+
sessionEventEmitter.on(eventType, (event) => {
|
|
151
|
+
coordinatorEventBus.emit({
|
|
152
|
+
type: eventType,
|
|
153
|
+
sessionId,
|
|
154
|
+
payload: { agentName, ...event },
|
|
155
|
+
timestamp: new Date(),
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=fan-out.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out.js","sourceRoot":"","sources":["../../src/coordinator/fan-out.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinator Orchestrator (PRD 5)
|
|
3
|
+
*
|
|
4
|
+
* The central orchestration engine. Replaces the 32KB squad.agent.md
|
|
5
|
+
* prompt-based coordinator with a TypeScript program that manages
|
|
6
|
+
* agent sessions, routes work, and observes progress via SDK events.
|
|
7
|
+
*/
|
|
8
|
+
export { SquadCoordinator, type SquadCoordinatorOptions, type CoordinatorResult, type SpawnStrategy, type CoordinatorContext, } from './coordinator.js';
|
|
9
|
+
export { DirectResponseHandler, type DirectResponseResult, type DirectResponseCategory, type DirectResponsePattern, } from './direct-response.js';
|
|
10
|
+
export { spawnParallel, aggregateSessionEvents, type AgentSpawnConfig, type SpawnResult, type FanOutDependencies, } from './fan-out.js';
|
|
11
|
+
export type ResponseTier = 'direct' | 'lightweight' | 'standard' | 'full';
|
|
12
|
+
export interface RoutingDecision {
|
|
13
|
+
/** Tier of response based on complexity */
|
|
14
|
+
tier: ResponseTier;
|
|
15
|
+
/** Target agent(s) for this request */
|
|
16
|
+
agents: string[];
|
|
17
|
+
/** Whether agents should run in parallel */
|
|
18
|
+
parallel: boolean;
|
|
19
|
+
/** Routing rationale (for observability) */
|
|
20
|
+
rationale: string;
|
|
21
|
+
}
|
|
22
|
+
export interface CoordinatorConfig {
|
|
23
|
+
/** Path to the team root (.squad/ directory) */
|
|
24
|
+
teamRoot: string;
|
|
25
|
+
/** Default model for routing decisions */
|
|
26
|
+
model?: string;
|
|
27
|
+
/** Enable parallel fan-out for multi-agent tasks */
|
|
28
|
+
enableParallel?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class Coordinator {
|
|
31
|
+
private client;
|
|
32
|
+
private eventBus;
|
|
33
|
+
private agentManager;
|
|
34
|
+
private hookPipeline;
|
|
35
|
+
private toolRegistry;
|
|
36
|
+
private config;
|
|
37
|
+
constructor(config: CoordinatorConfig);
|
|
38
|
+
/** Initialize the coordinator: connect client, load team, register hooks */
|
|
39
|
+
initialize(): Promise<void>;
|
|
40
|
+
/** Route an incoming user message to the appropriate agent(s) */
|
|
41
|
+
route(message: string): Promise<RoutingDecision>;
|
|
42
|
+
/** Execute a routing decision: spawn/resume agents and deliver work */
|
|
43
|
+
execute(decision: RoutingDecision, message: string): Promise<void>;
|
|
44
|
+
/** Graceful shutdown */
|
|
45
|
+
shutdown(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAYtB,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,YAAY,CAAC;IACnB,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAKrC,4EAA4E;IACtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,iEAAiE;IAC3D,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOtD,uEAAuE;IACjE,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE,wBAAwB;IAClB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinator Orchestrator (PRD 5)
|
|
3
|
+
*
|
|
4
|
+
* The central orchestration engine. Replaces the 32KB squad.agent.md
|
|
5
|
+
* prompt-based coordinator with a TypeScript program that manages
|
|
6
|
+
* agent sessions, routes work, and observes progress via SDK events.
|
|
7
|
+
*/
|
|
8
|
+
// --- M3-1 Coordinator ---
|
|
9
|
+
export { SquadCoordinator, } from './coordinator.js';
|
|
10
|
+
// --- M3-6 Direct Response ---
|
|
11
|
+
export { DirectResponseHandler, } from './direct-response.js';
|
|
12
|
+
// --- M1-10 Fan-Out ---
|
|
13
|
+
export { spawnParallel, aggregateSessionEvents, } from './fan-out.js';
|
|
14
|
+
// --- Coordinator ---
|
|
15
|
+
export class Coordinator {
|
|
16
|
+
client = null;
|
|
17
|
+
eventBus = null;
|
|
18
|
+
agentManager = null;
|
|
19
|
+
hookPipeline = null;
|
|
20
|
+
toolRegistry = null;
|
|
21
|
+
config;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
// TODO: PRD 5 — Accept injected dependencies (client, eventBus, agentManager, hooks, tools)
|
|
25
|
+
}
|
|
26
|
+
/** Initialize the coordinator: connect client, load team, register hooks */
|
|
27
|
+
async initialize() {
|
|
28
|
+
// TODO: PRD 5 — Initialize SquadClient and connect
|
|
29
|
+
// TODO: PRD 5 — Load all agent charters via CharterCompiler
|
|
30
|
+
// TODO: PRD 5 — Register custom tools via ToolRegistry
|
|
31
|
+
// TODO: PRD 5 — Set up hook pipeline
|
|
32
|
+
// TODO: PRD 5 — Subscribe to EventBus for agent lifecycle events
|
|
33
|
+
// TODO: PRD 5 — Create coordinator's own session for routing logic
|
|
34
|
+
}
|
|
35
|
+
/** Route an incoming user message to the appropriate agent(s) */
|
|
36
|
+
async route(message) {
|
|
37
|
+
// TODO: PRD 5 — Determine response tier (direct/lightweight/standard/full)
|
|
38
|
+
// TODO: PRD 5 — Select target agent(s) based on message content and team roster
|
|
39
|
+
// TODO: PRD 5 — Handle parallel fan-out for multi-agent tasks
|
|
40
|
+
throw new Error('Not implemented');
|
|
41
|
+
}
|
|
42
|
+
/** Execute a routing decision: spawn/resume agents and deliver work */
|
|
43
|
+
async execute(decision, message) {
|
|
44
|
+
// TODO: PRD 5 — Spawn or resume agent sessions per decision
|
|
45
|
+
// TODO: PRD 5 — Deliver message via sendAndWait()
|
|
46
|
+
// TODO: PRD 5 — Monitor progress via event subscriptions
|
|
47
|
+
}
|
|
48
|
+
/** Graceful shutdown */
|
|
49
|
+
async shutdown() {
|
|
50
|
+
// TODO: PRD 5 — Destroy all agent sessions
|
|
51
|
+
// TODO: PRD 5 — Disconnect client
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2BAA2B;AAC3B,OAAO,EACL,gBAAgB,GAKjB,MAAM,kBAAkB,CAAC;AAE1B,+BAA+B;AAC/B,OAAO,EACL,qBAAqB,GAItB,MAAM,sBAAsB,CAAC;AAE9B,wBAAwB;AACxB,OAAO,EACL,aAAa,EACb,sBAAsB,GAIvB,MAAM,cAAc,CAAC;AAkCtB,sBAAsB;AAEtB,MAAM,OAAO,WAAW;IACd,MAAM,GAAuB,IAAI,CAAC;IAClC,QAAQ,GAAoB,IAAI,CAAC;IACjC,YAAY,GAA+B,IAAI,CAAC;IAChD,YAAY,GAAwB,IAAI,CAAC;IACzC,YAAY,GAAwB,IAAI,CAAC;IACzC,MAAM,CAAoB;IAElC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,4FAA4F;IAC9F,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,UAAU;QACd,mDAAmD;QACnD,4DAA4D;QAC5D,uDAAuD;QACvD,qCAAqC;QACrC,iEAAiE;QACjE,mEAAmE;IACrE,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,2EAA2E;QAC3E,gFAAgF;QAChF,8DAA8D;QAC9D,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,OAAO,CAAC,QAAyB,EAAE,OAAe;QACtD,4DAA4D;QAC5D,kDAAkD;QAClD,yDAAyD;IAC3D,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,QAAQ;QACZ,2CAA2C;QAC3C,kCAAkC;IACpC,CAAC;CACF"}
|