@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Casting Engine v1 (M3-2, Issue #138)
|
|
3
|
+
*
|
|
4
|
+
* Generates themed agent personas from a universe template.
|
|
5
|
+
* Each CastMember maps to an agent role with name, personality, and backstory.
|
|
6
|
+
*/
|
|
7
|
+
const USUAL_SUSPECTS = {
|
|
8
|
+
id: 'usual-suspects',
|
|
9
|
+
label: 'The Usual Suspects',
|
|
10
|
+
characters: [
|
|
11
|
+
{
|
|
12
|
+
name: 'Keyser',
|
|
13
|
+
personality: 'Quietly commanding; sees the whole board before anyone else.',
|
|
14
|
+
backstory: 'A legendary figure who orchestrates from the shadows, ensuring every piece falls into place.',
|
|
15
|
+
preferredRoles: ['lead'],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'McManus',
|
|
19
|
+
personality: 'Bold and direct; ships fast, asks questions later.',
|
|
20
|
+
backstory: 'The hotshot operator who dives headfirst into the hardest problems.',
|
|
21
|
+
preferredRoles: ['developer'],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Fenster',
|
|
25
|
+
personality: 'Eccentric communicator; finds bugs nobody else can see.',
|
|
26
|
+
backstory: 'Speaks in riddles but has an uncanny knack for spotting what everyone else missed.',
|
|
27
|
+
preferredRoles: ['tester'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Verbal',
|
|
31
|
+
personality: 'Silver-tongued storyteller; turns complexity into clarity.',
|
|
32
|
+
backstory: 'The narrator who shapes every prompt and message into something an LLM can\'t misunderstand.',
|
|
33
|
+
preferredRoles: ['prompt-engineer', 'scribe'],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'Hockney',
|
|
37
|
+
personality: 'Street-smart and suspicious; trusts no input.',
|
|
38
|
+
backstory: 'A seasoned skeptic who probes every surface for weaknesses before anyone else can.',
|
|
39
|
+
preferredRoles: ['security', 'reviewer'],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Redfoot',
|
|
43
|
+
personality: 'Resourceful fixer; keeps the machinery running.',
|
|
44
|
+
backstory: 'The behind-the-scenes operator who makes sure builds ship and pipelines stay green.',
|
|
45
|
+
preferredRoles: ['devops'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'Edie',
|
|
49
|
+
personality: 'Methodical and detail-oriented; nothing escapes review.',
|
|
50
|
+
backstory: 'A meticulous analyst who ensures every deliverable meets the bar.',
|
|
51
|
+
preferredRoles: ['reviewer', 'tester'],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'Kobayashi',
|
|
55
|
+
personality: 'Precise and formal; an interface between worlds.',
|
|
56
|
+
backstory: 'The liaison who translates requirements into structured specifications.',
|
|
57
|
+
preferredRoles: ['designer', 'prompt-engineer'],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
const OCEANS_ELEVEN = {
|
|
62
|
+
id: 'oceans-eleven',
|
|
63
|
+
label: "Ocean's Eleven",
|
|
64
|
+
characters: [
|
|
65
|
+
{
|
|
66
|
+
name: 'Danny',
|
|
67
|
+
personality: 'Cool under pressure; the plan is always three steps ahead.',
|
|
68
|
+
backstory: 'The mastermind who assembles the crew and keeps the vision on track.',
|
|
69
|
+
preferredRoles: ['lead'],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'Rusty',
|
|
73
|
+
personality: 'Effortlessly sharp; reads people and code with equal ease.',
|
|
74
|
+
backstory: 'The right hand who can debug a conversation or a stack trace mid-bite.',
|
|
75
|
+
preferredRoles: ['developer', 'reviewer'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'Linus',
|
|
79
|
+
personality: 'Eager and adaptable; learns fast, ships faster.',
|
|
80
|
+
backstory: 'The up-and-comer who takes on any coding challenge to prove his worth.',
|
|
81
|
+
preferredRoles: ['developer'],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'Basher',
|
|
85
|
+
personality: 'Explosive creativity; demolishes blockers with flair.',
|
|
86
|
+
backstory: 'The demolitions expert who clears technical debt and obstacles in one blast.',
|
|
87
|
+
preferredRoles: ['devops', 'developer'],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'Livingston',
|
|
91
|
+
personality: 'Quiet tech wizard; the surveillance and tooling expert.',
|
|
92
|
+
backstory: 'The electronics specialist who wires up monitoring, logging, and automation.',
|
|
93
|
+
preferredRoles: ['devops', 'tester'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'Saul',
|
|
97
|
+
personality: 'Old-school wisdom; plays the long game with finesse.',
|
|
98
|
+
backstory: 'A veteran con artist who crafts the perfect prompt persona for any situation.',
|
|
99
|
+
preferredRoles: ['prompt-engineer', 'scribe'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'Yen',
|
|
103
|
+
personality: 'Acrobatic precision; navigates tight constraints with grace.',
|
|
104
|
+
backstory: 'The acrobat who fits into the tightest security gaps and edge cases.',
|
|
105
|
+
preferredRoles: ['security', 'tester'],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'Virgil',
|
|
109
|
+
personality: 'Steadfast and reliable; the backbone of every operation.',
|
|
110
|
+
backstory: 'Half of the dependable duo that handles the grunt work with quiet excellence.',
|
|
111
|
+
preferredRoles: ['developer', 'reviewer'],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'Turk',
|
|
115
|
+
personality: 'Competitive and driven; races to finish first.',
|
|
116
|
+
backstory: 'The other half of the duo, always trying to one-up his partner in velocity.',
|
|
117
|
+
preferredRoles: ['developer', 'designer'],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'Reuben',
|
|
121
|
+
personality: 'Strategic backer; knows what\'s worth investing in.',
|
|
122
|
+
backstory: 'The financier who scopes effort and ensures the plan is economically sound.',
|
|
123
|
+
preferredRoles: ['lead', 'reviewer'],
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
const UNIVERSES = new Map([
|
|
128
|
+
['usual-suspects', USUAL_SUSPECTS],
|
|
129
|
+
['oceans-eleven', OCEANS_ELEVEN],
|
|
130
|
+
]);
|
|
131
|
+
// --- Casting Engine ---
|
|
132
|
+
export class CastingEngine {
|
|
133
|
+
/** List available universe IDs. */
|
|
134
|
+
getUniverses() {
|
|
135
|
+
return Array.from(UNIVERSES.keys());
|
|
136
|
+
}
|
|
137
|
+
/** Get a universe template by ID. */
|
|
138
|
+
getUniverse(id) {
|
|
139
|
+
return UNIVERSES.get(id);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Cast a team of agents from a universe.
|
|
143
|
+
*
|
|
144
|
+
* Roles are filled by best-fit characters (preferredRoles match).
|
|
145
|
+
* Required roles are guaranteed to be present.
|
|
146
|
+
* Team size is clamped to available characters.
|
|
147
|
+
*/
|
|
148
|
+
castTeam(config) {
|
|
149
|
+
if (config.universe === 'custom') {
|
|
150
|
+
return this.castCustomTeam(config);
|
|
151
|
+
}
|
|
152
|
+
const template = UNIVERSES.get(config.universe);
|
|
153
|
+
if (!template) {
|
|
154
|
+
throw new Error(`Unknown universe: ${config.universe}`);
|
|
155
|
+
}
|
|
156
|
+
const requiredRoles = config.requiredRoles ?? ['lead', 'developer', 'tester'];
|
|
157
|
+
const teamSize = Math.max(requiredRoles.length, Math.min(config.teamSize ?? requiredRoles.length, template.characters.length));
|
|
158
|
+
const assigned = new Set();
|
|
159
|
+
const members = [];
|
|
160
|
+
// Phase 1: Fill required roles by best-fit
|
|
161
|
+
for (const role of requiredRoles) {
|
|
162
|
+
const best = this.findBestFit(template.characters, role, assigned);
|
|
163
|
+
if (!best) {
|
|
164
|
+
throw new Error(`Cannot fill required role "${role}" — not enough characters in universe "${config.universe}".`);
|
|
165
|
+
}
|
|
166
|
+
assigned.add(best.name);
|
|
167
|
+
members.push(this.toCastMember(best, role));
|
|
168
|
+
}
|
|
169
|
+
// Phase 2: Fill remaining slots with unassigned characters
|
|
170
|
+
if (members.length < teamSize) {
|
|
171
|
+
const remaining = template.characters.filter((c) => !assigned.has(c.name));
|
|
172
|
+
for (const char of remaining) {
|
|
173
|
+
if (members.length >= teamSize)
|
|
174
|
+
break;
|
|
175
|
+
const role = char.preferredRoles[0] ?? 'developer';
|
|
176
|
+
assigned.add(char.name);
|
|
177
|
+
members.push(this.toCastMember(char, role));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return members;
|
|
181
|
+
}
|
|
182
|
+
// --- Internals ---
|
|
183
|
+
castCustomTeam(config) {
|
|
184
|
+
if (!config.customNames || Object.keys(config.customNames).length === 0) {
|
|
185
|
+
throw new Error('customNames is required when universe is "custom".');
|
|
186
|
+
}
|
|
187
|
+
return Object.entries(config.customNames).map(([role, name]) => ({
|
|
188
|
+
name,
|
|
189
|
+
role,
|
|
190
|
+
personality: 'Custom team member.',
|
|
191
|
+
backstory: `${name} fills the ${role} role on this squad.`,
|
|
192
|
+
displayName: `${name} — ${formatRole(role)}`,
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
findBestFit(characters, role, assigned) {
|
|
196
|
+
// Prefer characters whose first preferred role matches
|
|
197
|
+
const primary = characters.find((c) => !assigned.has(c.name) && c.preferredRoles[0] === role);
|
|
198
|
+
if (primary)
|
|
199
|
+
return primary;
|
|
200
|
+
// Fall back to any character that lists this role
|
|
201
|
+
const secondary = characters.find((c) => !assigned.has(c.name) && c.preferredRoles.includes(role));
|
|
202
|
+
if (secondary)
|
|
203
|
+
return secondary;
|
|
204
|
+
// Last resort: any unassigned character
|
|
205
|
+
return characters.find((c) => !assigned.has(c.name));
|
|
206
|
+
}
|
|
207
|
+
toCastMember(char, role) {
|
|
208
|
+
return {
|
|
209
|
+
name: char.name,
|
|
210
|
+
role,
|
|
211
|
+
personality: char.personality,
|
|
212
|
+
backstory: char.backstory,
|
|
213
|
+
displayName: `${char.name} — ${formatRole(role)}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function formatRole(role) {
|
|
218
|
+
return role
|
|
219
|
+
.split('-')
|
|
220
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
221
|
+
.join(' ');
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=casting-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"casting-engine.js","sourceRoot":"","sources":["../../src/casting/casting-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Casting History (M3-10, Issue #151)
|
|
3
|
+
*
|
|
4
|
+
* Tracks casting decisions over time and makes them queryable.
|
|
5
|
+
* Each record captures who was cast, when, and from which config.
|
|
6
|
+
*/
|
|
7
|
+
import type { CastMember, CastingConfig, UniverseId, AgentRole } from './casting-engine.js';
|
|
8
|
+
export interface CastingRecordMember {
|
|
9
|
+
name: string;
|
|
10
|
+
role: AgentRole;
|
|
11
|
+
}
|
|
12
|
+
export interface CastingRecord {
|
|
13
|
+
/** When this cast was created */
|
|
14
|
+
timestamp: string;
|
|
15
|
+
/** Universe used for casting */
|
|
16
|
+
universe: UniverseId;
|
|
17
|
+
/** Number of agents cast */
|
|
18
|
+
teamSize: number;
|
|
19
|
+
/** Summary of each member */
|
|
20
|
+
members: CastingRecordMember[];
|
|
21
|
+
/** Snapshot of the config used */
|
|
22
|
+
configSnapshot: CastingConfig;
|
|
23
|
+
}
|
|
24
|
+
export interface SerializedCastingHistory {
|
|
25
|
+
version: 1;
|
|
26
|
+
records: CastingRecord[];
|
|
27
|
+
}
|
|
28
|
+
export declare class CastingHistory {
|
|
29
|
+
private records;
|
|
30
|
+
/**
|
|
31
|
+
* Record a casting decision.
|
|
32
|
+
*
|
|
33
|
+
* @param team - The cast team produced by CastingEngine
|
|
34
|
+
* @param config - The CastingConfig that produced this team
|
|
35
|
+
* @param timestamp - Optional override (defaults to now)
|
|
36
|
+
*/
|
|
37
|
+
recordCast(team: CastMember[], config: CastingConfig, timestamp?: Date): CastingRecord;
|
|
38
|
+
/** Return all casting records, oldest first. */
|
|
39
|
+
getCastHistory(): CastingRecord[];
|
|
40
|
+
/**
|
|
41
|
+
* Return casting records that include a specific agent name.
|
|
42
|
+
* Useful for answering "when was Verbal last cast?"
|
|
43
|
+
*/
|
|
44
|
+
getAgentHistory(agentName: string): CastingRecord[];
|
|
45
|
+
/** Number of recorded casts. */
|
|
46
|
+
get size(): number;
|
|
47
|
+
/** Clear all history. */
|
|
48
|
+
clear(): void;
|
|
49
|
+
/** Serialize history to a plain object suitable for JSON / config persistence. */
|
|
50
|
+
serializeHistory(): SerializedCastingHistory;
|
|
51
|
+
/** Restore history from a previously serialized object. Replaces current records. */
|
|
52
|
+
deserializeHistory(data: SerializedCastingHistory): void;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=casting-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"casting-history.d.ts","sourceRoot":"","sources":["../../src/casting/casting-history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAI5F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,kCAAkC;IAClC,cAAc,EAAE,aAAa,CAAC;CAC/B;AAID,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,aAAa;IAYtF,gDAAgD;IAChD,cAAc,IAAI,aAAa,EAAE;IAIjC;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAMnD,gCAAgC;IAChC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,yBAAyB;IACzB,KAAK,IAAI,IAAI;IAMb,kFAAkF;IAClF,gBAAgB,IAAI,wBAAwB;IAO5C,qFAAqF;IACrF,kBAAkB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI;CAMzD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Casting History (M3-10, Issue #151)
|
|
3
|
+
*
|
|
4
|
+
* Tracks casting decisions over time and makes them queryable.
|
|
5
|
+
* Each record captures who was cast, when, and from which config.
|
|
6
|
+
*/
|
|
7
|
+
// --- CastingHistory ---
|
|
8
|
+
export class CastingHistory {
|
|
9
|
+
records = [];
|
|
10
|
+
/**
|
|
11
|
+
* Record a casting decision.
|
|
12
|
+
*
|
|
13
|
+
* @param team - The cast team produced by CastingEngine
|
|
14
|
+
* @param config - The CastingConfig that produced this team
|
|
15
|
+
* @param timestamp - Optional override (defaults to now)
|
|
16
|
+
*/
|
|
17
|
+
recordCast(team, config, timestamp) {
|
|
18
|
+
const record = {
|
|
19
|
+
timestamp: (timestamp ?? new Date()).toISOString(),
|
|
20
|
+
universe: config.universe,
|
|
21
|
+
teamSize: team.length,
|
|
22
|
+
members: team.map((m) => ({ name: m.name, role: m.role })),
|
|
23
|
+
configSnapshot: { ...config },
|
|
24
|
+
};
|
|
25
|
+
this.records.push(record);
|
|
26
|
+
return record;
|
|
27
|
+
}
|
|
28
|
+
/** Return all casting records, oldest first. */
|
|
29
|
+
getCastHistory() {
|
|
30
|
+
return [...this.records];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Return casting records that include a specific agent name.
|
|
34
|
+
* Useful for answering "when was Verbal last cast?"
|
|
35
|
+
*/
|
|
36
|
+
getAgentHistory(agentName) {
|
|
37
|
+
return this.records.filter((r) => r.members.some((m) => m.name === agentName));
|
|
38
|
+
}
|
|
39
|
+
/** Number of recorded casts. */
|
|
40
|
+
get size() {
|
|
41
|
+
return this.records.length;
|
|
42
|
+
}
|
|
43
|
+
/** Clear all history. */
|
|
44
|
+
clear() {
|
|
45
|
+
this.records = [];
|
|
46
|
+
}
|
|
47
|
+
// --- Serialization for config round-trip ---
|
|
48
|
+
/** Serialize history to a plain object suitable for JSON / config persistence. */
|
|
49
|
+
serializeHistory() {
|
|
50
|
+
return {
|
|
51
|
+
version: 1,
|
|
52
|
+
records: this.records.map((r) => ({ ...r })),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Restore history from a previously serialized object. Replaces current records. */
|
|
56
|
+
deserializeHistory(data) {
|
|
57
|
+
if (!data || data.version !== 1 || !Array.isArray(data.records)) {
|
|
58
|
+
throw new Error('Invalid casting history data: expected version 1 with records array');
|
|
59
|
+
}
|
|
60
|
+
this.records = data.records.map((r) => ({ ...r }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=casting-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"casting-history.js","sourceRoot":"","sources":["../../src/casting/casting-history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,yBAAyB;AAEzB,MAAM,OAAO,cAAc;IACjB,OAAO,GAAoB,EAAE,CAAC;IAEtC;;;;;;OAMG;IACH,UAAU,CAAC,IAAkB,EAAE,MAAqB,EAAE,SAAgB;QACpE,MAAM,MAAM,GAAkB;YAC5B,SAAS,EAAE,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;YAClD,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE;SAC9B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gDAAgD;IAChD,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,SAAiB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAC5C,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,8CAA8C;IAE9C,kFAAkF;IAClF,gBAAgB;QACd,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,qFAAqF;IACrF,kBAAkB,CAAC,IAA8B;QAC/C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Casting System (PRD 11 + M3-2)
|
|
3
|
+
*
|
|
4
|
+
* Runtime casting engine that generates agent personas from universe themes.
|
|
5
|
+
* Typed config replaces static markdown definitions.
|
|
6
|
+
*
|
|
7
|
+
* v1 API (M3-2): CastingEngine.castTeam(config) → CastMember[]
|
|
8
|
+
* Legacy API: CastingRegistry (filesystem-backed, stub)
|
|
9
|
+
*/
|
|
10
|
+
export { CastingEngine, type CastMember, type CastingConfig, type AgentRole, type UniverseId, } from './casting-engine.js';
|
|
11
|
+
export { CastingHistory, type CastingRecord, type CastingRecordMember, type SerializedCastingHistory, } from './casting-history.js';
|
|
12
|
+
export interface CastingUniverse {
|
|
13
|
+
/** Universe name (e.g., 'The Wire', 'Seinfeld') */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Available character names */
|
|
16
|
+
characters: string[];
|
|
17
|
+
/** Universe-specific constraints */
|
|
18
|
+
constraints?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface CastingEntry {
|
|
21
|
+
/** Agent role name (e.g., 'core-dev', 'lead') */
|
|
22
|
+
role: string;
|
|
23
|
+
/** Cast character name */
|
|
24
|
+
characterName: string;
|
|
25
|
+
/** Universe the character is from */
|
|
26
|
+
universe: string;
|
|
27
|
+
/** Display name (e.g., 'Fenster — Core Dev') */
|
|
28
|
+
displayName: string;
|
|
29
|
+
}
|
|
30
|
+
export interface CastingRegistryConfig {
|
|
31
|
+
/** Path to .squad/casting/ directory */
|
|
32
|
+
castingDir: string;
|
|
33
|
+
/** Active universe name */
|
|
34
|
+
activeUniverse?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare class CastingRegistry {
|
|
37
|
+
private entries;
|
|
38
|
+
private config;
|
|
39
|
+
constructor(config: CastingRegistryConfig);
|
|
40
|
+
load(): Promise<void>;
|
|
41
|
+
getByRole(role: string): CastingEntry | undefined;
|
|
42
|
+
getAllEntries(): CastingEntry[];
|
|
43
|
+
cast(role: string, _universe?: string): Promise<CastingEntry>;
|
|
44
|
+
recast(_universe: string): Promise<CastingEntry[]>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/casting/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,aAAa,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAI9B,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD,aAAa,IAAI,YAAY,EAAE;IAIzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI7D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGzD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Casting System (PRD 11 + M3-2)
|
|
3
|
+
*
|
|
4
|
+
* Runtime casting engine that generates agent personas from universe themes.
|
|
5
|
+
* Typed config replaces static markdown definitions.
|
|
6
|
+
*
|
|
7
|
+
* v1 API (M3-2): CastingEngine.castTeam(config) → CastMember[]
|
|
8
|
+
* Legacy API: CastingRegistry (filesystem-backed, stub)
|
|
9
|
+
*/
|
|
10
|
+
// Re-export v1 casting engine (M3-2)
|
|
11
|
+
export { CastingEngine, } from './casting-engine.js';
|
|
12
|
+
// Re-export casting history (M3-10)
|
|
13
|
+
export { CastingHistory, } from './casting-history.js';
|
|
14
|
+
// --- Legacy Casting Registry ---
|
|
15
|
+
export class CastingRegistry {
|
|
16
|
+
entries = new Map();
|
|
17
|
+
config;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
}
|
|
21
|
+
async load() {
|
|
22
|
+
// TODO: PRD 11 — Parse registry.json into entries map
|
|
23
|
+
}
|
|
24
|
+
getByRole(role) {
|
|
25
|
+
return this.entries.get(role);
|
|
26
|
+
}
|
|
27
|
+
getAllEntries() {
|
|
28
|
+
return Array.from(this.entries.values());
|
|
29
|
+
}
|
|
30
|
+
async cast(role, _universe) {
|
|
31
|
+
throw new Error('Not implemented');
|
|
32
|
+
}
|
|
33
|
+
async recast(_universe) {
|
|
34
|
+
throw new Error('Not implemented');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/casting/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qCAAqC;AACrC,OAAO,EACL,aAAa,GAKd,MAAM,qBAAqB,CAAC;AAE7B,oCAAoC;AACpC,OAAO,EACL,cAAc,GAIf,MAAM,sBAAsB,CAAC;AA+B9B,kCAAkC;AAElC,MAAM,OAAO,eAAe;IAClB,OAAO,GAA8B,IAAI,GAAG,EAAE,CAAC;IAC/C,MAAM,CAAwB;IAEtC,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,sDAAsD;IACxD,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,SAAkB;QACzC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Session Event Bus (PRD 1)
|
|
3
|
+
*
|
|
4
|
+
* Pub/sub event bus for session lifecycle events. Enables the coordinator
|
|
5
|
+
* to observe all agent sessions from a single subscription point.
|
|
6
|
+
* Decouples event producers (sessions) from consumers (coordinator, Ralph, UI).
|
|
7
|
+
*/
|
|
8
|
+
export type SquadEventType = 'session.created' | 'session.destroyed' | 'session.status_changed' | 'session.message' | 'session.tool_call' | 'session.error' | 'agent.milestone' | 'coordinator.routing' | 'pool.health';
|
|
9
|
+
export interface SquadEvent {
|
|
10
|
+
type: SquadEventType;
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
agentName?: string;
|
|
13
|
+
payload: unknown;
|
|
14
|
+
timestamp: Date;
|
|
15
|
+
}
|
|
16
|
+
export type EventHandler = (event: SquadEvent) => void | Promise<void>;
|
|
17
|
+
export declare class EventBus {
|
|
18
|
+
private handlers;
|
|
19
|
+
private allHandlers;
|
|
20
|
+
/** Subscribe to a specific event type */
|
|
21
|
+
on(type: SquadEventType, handler: EventHandler): () => void;
|
|
22
|
+
/** Subscribe to all events */
|
|
23
|
+
onAny(handler: EventHandler): () => void;
|
|
24
|
+
/** Emit an event to all matching subscribers */
|
|
25
|
+
emit(event: SquadEvent): Promise<void>;
|
|
26
|
+
/** Remove all handlers */
|
|
27
|
+
clear(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/client/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,GACxB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,aAAa,CAAC;AAElB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAIvE,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,WAAW,CAAgC;IAEnD,yCAAyC;IACzC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAY3D,8BAA8B;IAC9B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAOxC,gDAAgD;IAC1C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5C,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Session Event Bus (PRD 1)
|
|
3
|
+
*
|
|
4
|
+
* Pub/sub event bus for session lifecycle events. Enables the coordinator
|
|
5
|
+
* to observe all agent sessions from a single subscription point.
|
|
6
|
+
* Decouples event producers (sessions) from consumers (coordinator, Ralph, UI).
|
|
7
|
+
*/
|
|
8
|
+
// --- Event Bus ---
|
|
9
|
+
export class EventBus {
|
|
10
|
+
handlers = new Map();
|
|
11
|
+
allHandlers = new Set();
|
|
12
|
+
/** Subscribe to a specific event type */
|
|
13
|
+
on(type, handler) {
|
|
14
|
+
if (!this.handlers.has(type)) {
|
|
15
|
+
this.handlers.set(type, new Set());
|
|
16
|
+
}
|
|
17
|
+
this.handlers.get(type).add(handler);
|
|
18
|
+
// Return unsubscribe function
|
|
19
|
+
return () => {
|
|
20
|
+
this.handlers.get(type)?.delete(handler);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Subscribe to all events */
|
|
24
|
+
onAny(handler) {
|
|
25
|
+
this.allHandlers.add(handler);
|
|
26
|
+
return () => {
|
|
27
|
+
this.allHandlers.delete(handler);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Emit an event to all matching subscribers */
|
|
31
|
+
async emit(event) {
|
|
32
|
+
const typeHandlers = this.handlers.get(event.type) ?? new Set();
|
|
33
|
+
const allPromises = [];
|
|
34
|
+
for (const handler of typeHandlers) {
|
|
35
|
+
const result = handler(event);
|
|
36
|
+
if (result instanceof Promise)
|
|
37
|
+
allPromises.push(result);
|
|
38
|
+
}
|
|
39
|
+
for (const handler of this.allHandlers) {
|
|
40
|
+
const result = handler(event);
|
|
41
|
+
if (result instanceof Promise)
|
|
42
|
+
allPromises.push(result);
|
|
43
|
+
}
|
|
44
|
+
// TODO: PRD 1 — Add error isolation (one handler failure shouldn't crash others)
|
|
45
|
+
await Promise.all(allPromises);
|
|
46
|
+
}
|
|
47
|
+
/** Remove all handlers */
|
|
48
|
+
clear() {
|
|
49
|
+
this.handlers.clear();
|
|
50
|
+
this.allHandlers.clear();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/client/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,oBAAoB;AAEpB,MAAM,OAAO,QAAQ;IACX,QAAQ,GAA2C,IAAI,GAAG,EAAE,CAAC;IAC7D,WAAW,GAAsB,IAAI,GAAG,EAAE,CAAC;IAEnD,yCAAyC;IACzC,EAAE,CAAC,IAAoB,EAAE,OAAqB;QAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEtC,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,OAAqB;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,IAAI,CAAC,KAAiB;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAChE,MAAM,WAAW,GAAoB,EAAE,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,YAAY,OAAO;gBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,YAAY,OAAO;gBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,iFAAiF;QACjF,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,0BAA0B;IAC1B,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad Client — High-Level API with Session Pool Management (PRD 1)
|
|
3
|
+
*
|
|
4
|
+
* This module provides the main Squad client API that combines:
|
|
5
|
+
* - SquadClient adapter (from adapter/client.ts) for connection management
|
|
6
|
+
* - SessionPool for multi-session lifecycle management
|
|
7
|
+
* - EventBus for cross-session event handling
|
|
8
|
+
*
|
|
9
|
+
* Applications should import from this module, not from adapter/ directly.
|
|
10
|
+
*/
|
|
11
|
+
export { SquadClient, type SquadClientOptions, type SquadConnectionState, } from '../adapter/client.js';
|
|
12
|
+
export type { SquadSession, SquadSessionConfig, SquadSessionMetadata, SquadGetStatusResponse, SquadGetAuthStatusResponse, SquadModelInfo, } from '../adapter/types.js';
|
|
13
|
+
export type SessionStatus = 'creating' | 'active' | 'idle' | 'error' | 'destroyed';
|
|
14
|
+
export { SessionPool, type SessionPoolConfig, type PoolEvent, DEFAULT_POOL_CONFIG } from './session-pool.js';
|
|
15
|
+
export { EventBus, type SquadEvent, type SquadEventType } from './event-bus.js';
|
|
16
|
+
import { type SquadClientOptions } from '../adapter/client.js';
|
|
17
|
+
import type { SquadSession, SquadSessionConfig } from '../adapter/types.js';
|
|
18
|
+
import { SessionPool, type SessionPoolConfig } from './session-pool.js';
|
|
19
|
+
import { EventBus } from './event-bus.js';
|
|
20
|
+
export interface SquadClientWithPoolConfig extends SquadClientOptions {
|
|
21
|
+
/** Session pool configuration */
|
|
22
|
+
pool?: Partial<SessionPoolConfig>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Squad Client with integrated session pool management.
|
|
26
|
+
*
|
|
27
|
+
* This is the recommended client for applications that need to manage
|
|
28
|
+
* multiple concurrent agent sessions. It provides:
|
|
29
|
+
* - Connection lifecycle management (from SquadClient)
|
|
30
|
+
* - Session pool with capacity limits and health checks
|
|
31
|
+
* - Event bus for cross-session event handling
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const client = new SquadClientWithPool({
|
|
36
|
+
* pool: { maxConcurrent: 5 }
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* await client.connect();
|
|
40
|
+
*
|
|
41
|
+
* const session1 = await client.createSession({ model: 'claude-sonnet-4.5' });
|
|
42
|
+
* const session2 = await client.createSession({ model: 'claude-haiku-4.5' });
|
|
43
|
+
*
|
|
44
|
+
* client.eventBus.on('session.created', (event) => {
|
|
45
|
+
* console.log('New session:', event.sessionId);
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* await client.shutdown();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class SquadClientWithPool {
|
|
52
|
+
private baseClient;
|
|
53
|
+
readonly pool: SessionPool;
|
|
54
|
+
readonly eventBus: EventBus;
|
|
55
|
+
constructor(config?: SquadClientWithPoolConfig);
|
|
56
|
+
/** Connect to the Copilot CLI server */
|
|
57
|
+
connect(): Promise<void>;
|
|
58
|
+
/** Disconnect from the Copilot CLI server */
|
|
59
|
+
disconnect(): Promise<Error[]>;
|
|
60
|
+
/** Force disconnect without graceful cleanup */
|
|
61
|
+
forceDisconnect(): Promise<void>;
|
|
62
|
+
/** Get current connection state */
|
|
63
|
+
getState(): import("../adapter/client.js").SquadConnectionState;
|
|
64
|
+
/** Check if connected */
|
|
65
|
+
isConnected(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Create a new session and add it to the pool.
|
|
68
|
+
* Throws if the pool is at capacity.
|
|
69
|
+
*/
|
|
70
|
+
createSession(config?: SquadSessionConfig): Promise<SquadSession>;
|
|
71
|
+
/**
|
|
72
|
+
* Resume an existing session and add it to the pool if not present.
|
|
73
|
+
*/
|
|
74
|
+
resumeSession(sessionId: string, config?: SquadSessionConfig): Promise<SquadSession>;
|
|
75
|
+
/**
|
|
76
|
+
* Delete a session and remove it from the pool.
|
|
77
|
+
*/
|
|
78
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
79
|
+
/** List all sessions from the base client */
|
|
80
|
+
listSessions(): Promise<import("../adapter/types.js").SquadSessionMetadata[]>;
|
|
81
|
+
/** Send a ping to verify connectivity */
|
|
82
|
+
ping(message?: string): Promise<{
|
|
83
|
+
message: string;
|
|
84
|
+
timestamp: number;
|
|
85
|
+
protocolVersion?: number;
|
|
86
|
+
}>;
|
|
87
|
+
/** Get CLI status information */
|
|
88
|
+
getStatus(): Promise<import("../adapter/types.js").SquadGetStatusResponse>;
|
|
89
|
+
/** Get authentication status */
|
|
90
|
+
getAuthStatus(): Promise<import("../adapter/types.js").SquadGetAuthStatusResponse>;
|
|
91
|
+
/** List available models */
|
|
92
|
+
listModels(): Promise<import("../adapter/types.js").SquadModelInfo[]>;
|
|
93
|
+
/** Subscribe to session lifecycle events */
|
|
94
|
+
on(eventType: any, handler: any): () => void;
|
|
95
|
+
/**
|
|
96
|
+
* Graceful shutdown — destroy all sessions and disconnect.
|
|
97
|
+
*/
|
|
98
|
+
shutdown(): Promise<void>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAGnF,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhF,OAAO,EAAkC,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAkB;IACpC,SAAgB,IAAI,EAAE,WAAW,CAAC;IAClC,SAAgB,QAAQ,EAAE,QAAQ,CAAC;gBAEvB,MAAM,GAAE,yBAA8B;IAgBlD,wCAAwC;IAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,6CAA6C;IACvC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKpC,gDAAgD;IAC1C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC,mCAAmC;IACnC,QAAQ;IAIR,yBAAyB;IACzB,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,aAAa,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB3E;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB9F;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD,6CAA6C;IACvC,YAAY;IAIlB,yCAAyC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM;;;;;IAI3B,iCAAiC;IAC3B,SAAS;IAIf,gCAAgC;IAC1B,aAAa;IAInB,4BAA4B;IACtB,UAAU;IAIhB,4CAA4C;IAC5C,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;IAI/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
|