@bradygaster/squad-sdk 0.7.0 → 0.8.2
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 +243 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +567 -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 +71 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +183 -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 +284 -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 +171 -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 +45 -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 +52 -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 +376 -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 +192 -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 +62 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +171 -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 +33 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -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 +58 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +128 -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 +314 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +467 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/constants.d.ts +35 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/constants.js +58 -0
- package/dist/runtime/constants.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-otel-bridge.d.ts +19 -0
- package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-otel-bridge.js +61 -0
- package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.js +55 -0
- package/dist/runtime/event-bus-ws-bridge.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/event-payloads.d.ts +108 -0
- package/dist/runtime/event-payloads.d.ts.map +1 -0
- package/dist/runtime/event-payloads.js +28 -0
- package/dist/runtime/event-payloads.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 +112 -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/otel-bridge.d.ts +52 -0
- package/dist/runtime/otel-bridge.d.ts.map +1 -0
- package/dist/runtime/otel-bridge.js +132 -0
- package/dist/runtime/otel-bridge.js.map +1 -0
- package/dist/runtime/otel-init.d.ts +72 -0
- package/dist/runtime/otel-init.d.ts.map +1 -0
- package/dist/runtime/otel-init.js +68 -0
- package/dist/runtime/otel-init.js.map +1 -0
- package/dist/runtime/otel-metrics.d.ts +42 -0
- package/dist/runtime/otel-metrics.d.ts.map +1 -0
- package/dist/runtime/otel-metrics.js +196 -0
- package/dist/runtime/otel-metrics.js.map +1 -0
- package/dist/runtime/otel.d.ts +53 -0
- package/dist/runtime/otel.d.ts.map +1 -0
- package/dist/runtime/otel.js +127 -0
- package/dist/runtime/otel.js.map +1 -0
- package/dist/runtime/squad-observer.d.ts +75 -0
- package/dist/runtime/squad-observer.d.ts.map +1 -0
- package/dist/runtime/squad-observer.js +190 -0
- package/dist/runtime/squad-observer.js.map +1 -0
- package/dist/runtime/streaming.d.ts +106 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +192 -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 +95 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +475 -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/upstream/index.d.ts +8 -0
- package/dist/upstream/index.d.ts.map +1 -0
- package/dist/upstream/index.js +7 -0
- package/dist/upstream/index.js.map +1 -0
- package/dist/upstream/resolver.d.ts +37 -0
- package/dist/upstream/resolver.d.ts.map +1 -0
- package/dist/upstream/resolver.js +234 -0
- package/dist/upstream/resolver.js.map +1 -0
- package/dist/upstream/types.d.ts +55 -0
- package/dist/upstream/types.d.ts.map +1 -0
- package/dist/upstream/types.js +11 -0
- package/dist/upstream/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 +197 -63
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Session Lifecycle (M1-7)
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the complete lifecycle of agent sessions:
|
|
5
|
+
* - Spawning: charter compilation, model selection, session creation
|
|
6
|
+
* - Management: status tracking, message handling
|
|
7
|
+
* - Destruction: graceful shutdown and history saving
|
|
8
|
+
*/
|
|
9
|
+
import { compileCharter } from './charter-compiler.js';
|
|
10
|
+
import { resolveModel } from './model-selector.js';
|
|
11
|
+
import { ConfigurationError, SessionLifecycleError } from '../adapter/errors.js';
|
|
12
|
+
import * as fs from 'fs/promises';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import { trace, SpanStatusCode } from '@opentelemetry/api';
|
|
15
|
+
import { recordAgentSpawn, recordAgentDestroy, recordAgentError } from '../runtime/otel-metrics.js';
|
|
16
|
+
const tracer = trace.getTracer('squad-sdk');
|
|
17
|
+
/**
|
|
18
|
+
* Manages the full lifecycle of agent sessions.
|
|
19
|
+
*
|
|
20
|
+
* Coordinates charter compilation, model selection, session creation,
|
|
21
|
+
* and graceful shutdown with history persistence.
|
|
22
|
+
*/
|
|
23
|
+
export class AgentLifecycleManager {
|
|
24
|
+
client;
|
|
25
|
+
teamRoot;
|
|
26
|
+
defaultIdleTimeout;
|
|
27
|
+
agents = new Map();
|
|
28
|
+
idleCheckTimer = null;
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.client = config.client;
|
|
31
|
+
this.teamRoot = config.teamRoot;
|
|
32
|
+
this.defaultIdleTimeout = config.defaultIdleTimeout ?? 300_000; // 5 minutes
|
|
33
|
+
// Start idle timeout checker
|
|
34
|
+
this.startIdleChecker();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Spawn a new agent with full lifecycle setup.
|
|
38
|
+
*
|
|
39
|
+
* Pipeline:
|
|
40
|
+
* 1. Read charter.md from team root
|
|
41
|
+
* 2. Compile charter with team context
|
|
42
|
+
* 3. Resolve model using 4-layer priority
|
|
43
|
+
* 4. Create session via Squad Client
|
|
44
|
+
* 5. Set up event handlers
|
|
45
|
+
* 6. Return AgentHandle
|
|
46
|
+
*
|
|
47
|
+
* @param options - Spawn options
|
|
48
|
+
* @returns Agent handle for control and communication
|
|
49
|
+
*/
|
|
50
|
+
async spawnAgent(options) {
|
|
51
|
+
const span = tracer.startSpan('squad.lifecycle.spawnAgent');
|
|
52
|
+
span.setAttribute('agent.name', options.agentName);
|
|
53
|
+
span.setAttribute('task.type', options.taskType ?? 'code');
|
|
54
|
+
const { agentName, task, taskType = 'code', modelOverride, teamContext, routingRules, decisions, idleTimeout = this.defaultIdleTimeout, } = options;
|
|
55
|
+
try {
|
|
56
|
+
// Step 1: Read charter.md
|
|
57
|
+
const charterPath = path.join(this.teamRoot, '.ai-team', 'agents', agentName, 'charter.md');
|
|
58
|
+
let charterContent;
|
|
59
|
+
try {
|
|
60
|
+
charterContent = await fs.readFile(charterPath, 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new ConfigurationError(`Charter not found for agent '${agentName}' at ${charterPath}`, {
|
|
64
|
+
agentName,
|
|
65
|
+
operation: 'spawnAgent',
|
|
66
|
+
timestamp: new Date(),
|
|
67
|
+
metadata: { charterPath },
|
|
68
|
+
}, error instanceof Error ? error : undefined);
|
|
69
|
+
}
|
|
70
|
+
// Step 2: Compile charter
|
|
71
|
+
const compileOptions = {
|
|
72
|
+
agentName,
|
|
73
|
+
charterPath,
|
|
74
|
+
teamContext,
|
|
75
|
+
routingRules,
|
|
76
|
+
decisions,
|
|
77
|
+
};
|
|
78
|
+
const agentConfig = compileCharter(compileOptions);
|
|
79
|
+
// Step 3: Resolve model
|
|
80
|
+
const modelOptions = {
|
|
81
|
+
userOverride: modelOverride,
|
|
82
|
+
charterPreference: agentConfig.prompt.includes('## Model')
|
|
83
|
+
? this.extractModelPreference(charterContent)
|
|
84
|
+
: undefined,
|
|
85
|
+
taskType,
|
|
86
|
+
agentRole: agentName,
|
|
87
|
+
};
|
|
88
|
+
const resolvedModel = resolveModel(modelOptions);
|
|
89
|
+
// Step 4: Create session
|
|
90
|
+
const sessionConfig = {
|
|
91
|
+
model: resolvedModel.model,
|
|
92
|
+
systemMessage: {
|
|
93
|
+
content: agentConfig.prompt,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
const session = await this.client.createSession(sessionConfig);
|
|
97
|
+
// Step 5: Create handle with event handlers
|
|
98
|
+
const handle = new AgentHandleImpl({
|
|
99
|
+
agentName,
|
|
100
|
+
sessionId: session.sessionId,
|
|
101
|
+
model: resolvedModel.model,
|
|
102
|
+
session,
|
|
103
|
+
idleTimeout,
|
|
104
|
+
onDestroy: () => this.agents.delete(session.sessionId),
|
|
105
|
+
});
|
|
106
|
+
this.agents.set(session.sessionId, handle);
|
|
107
|
+
recordAgentSpawn(agentName, 'lifecycle');
|
|
108
|
+
// Step 6: Send initial task
|
|
109
|
+
await handle.sendMessage(task);
|
|
110
|
+
return handle;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
recordAgentError(agentName, error instanceof Error ? error.constructor.name : 'unknown');
|
|
114
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) });
|
|
115
|
+
span.recordException(error instanceof Error ? error : new Error(String(error)));
|
|
116
|
+
throw new SessionLifecycleError(`Failed to spawn agent '${agentName}': ${error instanceof Error ? error.message : String(error)}`, {
|
|
117
|
+
agentName,
|
|
118
|
+
operation: 'spawnAgent',
|
|
119
|
+
timestamp: new Date(),
|
|
120
|
+
}, false, error instanceof Error ? error : undefined);
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
span.end();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Destroy an agent gracefully.
|
|
128
|
+
* Saves history and cleans up session.
|
|
129
|
+
*
|
|
130
|
+
* @param handle - Agent handle to destroy
|
|
131
|
+
*/
|
|
132
|
+
async destroyAgent(handle) {
|
|
133
|
+
const span = tracer.startSpan('squad.lifecycle.destroyAgent');
|
|
134
|
+
span.setAttribute('agent.name', handle.agentName);
|
|
135
|
+
try {
|
|
136
|
+
await handle.destroy();
|
|
137
|
+
this.agents.delete(handle.sessionId);
|
|
138
|
+
recordAgentDestroy(handle.agentName);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: err instanceof Error ? err.message : String(err) });
|
|
142
|
+
span.recordException(err instanceof Error ? err : new Error(String(err)));
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
span.end();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* List all active agent sessions.
|
|
151
|
+
*
|
|
152
|
+
* @returns Array of active agent handles
|
|
153
|
+
*/
|
|
154
|
+
listActive() {
|
|
155
|
+
return Array.from(this.agents.values()).filter(agent => agent.status !== 'destroyed');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get agent handle by session ID.
|
|
159
|
+
*
|
|
160
|
+
* @param sessionId - Session ID to look up
|
|
161
|
+
* @returns Agent handle or undefined
|
|
162
|
+
*/
|
|
163
|
+
getAgent(sessionId) {
|
|
164
|
+
return this.agents.get(sessionId);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Shutdown all agents gracefully.
|
|
168
|
+
*/
|
|
169
|
+
async shutdown() {
|
|
170
|
+
if (this.idleCheckTimer) {
|
|
171
|
+
clearInterval(this.idleCheckTimer);
|
|
172
|
+
this.idleCheckTimer = null;
|
|
173
|
+
}
|
|
174
|
+
const destroyPromises = Array.from(this.agents.values()).map(agent => agent.destroy().catch(err => {
|
|
175
|
+
console.error(`Failed to destroy agent ${agent.agentName}:`, err);
|
|
176
|
+
}));
|
|
177
|
+
await Promise.all(destroyPromises);
|
|
178
|
+
this.agents.clear();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Start periodic idle timeout checker.
|
|
182
|
+
* @private
|
|
183
|
+
*/
|
|
184
|
+
startIdleChecker() {
|
|
185
|
+
this.idleCheckTimer = setInterval(() => {
|
|
186
|
+
const now = Date.now();
|
|
187
|
+
for (const agent of this.agents.values()) {
|
|
188
|
+
const idleTimeMs = now - agent.lastActivityAt.getTime();
|
|
189
|
+
if (idleTimeMs > this.defaultIdleTimeout && agent.status === 'active') {
|
|
190
|
+
agent.markIdle();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}, 30_000); // Check every 30 seconds
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Extract model preference from charter content.
|
|
197
|
+
* @private
|
|
198
|
+
*/
|
|
199
|
+
extractModelPreference(charterContent) {
|
|
200
|
+
const modelMatch = charterContent.match(/##\s+Model\s*\n[\s\S]*?\*\*Preferred:\*\*\s*(.+)/i);
|
|
201
|
+
return modelMatch ? modelMatch[1].trim() : undefined;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Internal implementation of AgentHandle.
|
|
206
|
+
* @private
|
|
207
|
+
*/
|
|
208
|
+
class AgentHandleImpl {
|
|
209
|
+
agentName;
|
|
210
|
+
sessionId;
|
|
211
|
+
model;
|
|
212
|
+
status;
|
|
213
|
+
createdAt;
|
|
214
|
+
lastActivityAt;
|
|
215
|
+
session;
|
|
216
|
+
idleTimeout;
|
|
217
|
+
onDestroy;
|
|
218
|
+
constructor(config) {
|
|
219
|
+
this.agentName = config.agentName;
|
|
220
|
+
this.sessionId = config.sessionId;
|
|
221
|
+
this.model = config.model;
|
|
222
|
+
this.session = config.session;
|
|
223
|
+
this.idleTimeout = config.idleTimeout;
|
|
224
|
+
this.onDestroy = config.onDestroy;
|
|
225
|
+
this.status = 'active';
|
|
226
|
+
this.createdAt = new Date();
|
|
227
|
+
this.lastActivityAt = new Date();
|
|
228
|
+
}
|
|
229
|
+
async sendMessage(prompt) {
|
|
230
|
+
if (this.status === 'destroyed') {
|
|
231
|
+
throw new SessionLifecycleError('Cannot send message to destroyed agent', {
|
|
232
|
+
agentName: this.agentName,
|
|
233
|
+
sessionId: this.sessionId,
|
|
234
|
+
operation: 'sendMessage',
|
|
235
|
+
timestamp: new Date(),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
this.status = 'active';
|
|
240
|
+
this.lastActivityAt = new Date();
|
|
241
|
+
// Send message via session
|
|
242
|
+
await this.session.sendMessage({ prompt });
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
this.status = 'error';
|
|
246
|
+
throw new SessionLifecycleError(`Failed to send message to agent '${this.agentName}': ${error instanceof Error ? error.message : String(error)}`, {
|
|
247
|
+
agentName: this.agentName,
|
|
248
|
+
sessionId: this.sessionId,
|
|
249
|
+
operation: 'sendMessage',
|
|
250
|
+
timestamp: new Date(),
|
|
251
|
+
}, false, error instanceof Error ? error : undefined);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async destroy() {
|
|
255
|
+
if (this.status === 'destroyed') {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
try {
|
|
259
|
+
this.status = 'destroyed';
|
|
260
|
+
// Clean up session
|
|
261
|
+
await this.session.close();
|
|
262
|
+
// Notify lifecycle manager
|
|
263
|
+
this.onDestroy();
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
throw new SessionLifecycleError(`Failed to destroy agent '${this.agentName}': ${error instanceof Error ? error.message : String(error)}`, {
|
|
267
|
+
agentName: this.agentName,
|
|
268
|
+
sessionId: this.sessionId,
|
|
269
|
+
operation: 'destroy',
|
|
270
|
+
timestamp: new Date(),
|
|
271
|
+
}, false, error instanceof Error ? error : undefined);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Mark agent as idle (called by lifecycle manager).
|
|
276
|
+
* @internal
|
|
277
|
+
*/
|
|
278
|
+
markIdle() {
|
|
279
|
+
if (this.status === 'active') {
|
|
280
|
+
this.status = 'idle';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/agents/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,cAAc,EAA8B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAA8C,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEpG,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAiF5C;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAsB;IAC5B,QAAQ,CAAS;IACjB,kBAAkB,CAAS;IAC3B,MAAM,GAAiC,IAAI,GAAG,EAAE,CAAC;IACjD,cAAc,GAA0B,IAAI,CAAC;IAErD,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC,CAAC,YAAY;QAE5E,6BAA6B;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;QAC3D,MAAM,EACJ,SAAS,EACT,IAAI,EACJ,QAAQ,GAAG,MAAM,EACjB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,GAAG,IAAI,CAAC,kBAAkB,GACtC,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAC5F,IAAI,cAAsB,CAAC;YAE3B,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CAC1B,gCAAgC,SAAS,QAAQ,WAAW,EAAE,EAC9D;oBACE,SAAS;oBACT,SAAS,EAAE,YAAY;oBACvB,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,QAAQ,EAAE,EAAE,WAAW,EAAE;iBAC1B,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;YACJ,CAAC;YAED,0BAA0B;YAC1B,MAAM,cAAc,GAA0B;gBAC5C,SAAS;gBACT,WAAW;gBACX,WAAW;gBACX,YAAY;gBACZ,SAAS;aACV,CAAC;YAEF,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;YAEnD,wBAAwB;YACxB,MAAM,YAAY,GAA2B;gBAC3C,YAAY,EAAE,aAAa;gBAC3B,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACxD,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;oBAC7C,CAAC,CAAC,SAAS;gBACb,QAAQ;gBACR,SAAS,EAAE,SAAS;aACrB,CAAC;YAEF,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YAEjD,yBAAyB;YACzB,MAAM,aAAa,GAAuB;gBACxC,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,aAAa,EAAE;oBACb,OAAO,EAAE,WAAW,CAAC,MAAM;iBAC5B;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAE/D,4CAA4C;YAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,SAAS;gBACT,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,OAAO;gBACP,WAAW;gBACX,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aACvD,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3C,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEzC,4BAA4B;YAC5B,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAE/B,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CAAC,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzF,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChH,IAAI,CAAC,eAAe,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,IAAI,qBAAqB,CAC7B,0BAA0B,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACjG;gBACE,SAAS;gBACT,SAAS,EAAE,YAAY;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EACD,KAAK,EACL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,MAAmB;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1G,IAAI,CAAC,eAAe,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC5C,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CACtC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAC1D,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACK,gBAAgB;QACtB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;gBAExD,IAAI,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtE,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAyB;IACvC,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,cAAsB;QACnD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC7F,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,eAAe;IACnB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,KAAK,CAAS;IACd,MAAM,CAAc;IACpB,SAAS,CAAO;IAChB,cAAc,CAAO;IAEb,OAAO,CAAe;IACtB,WAAW,CAAS;IACpB,SAAS,CAAa;IAE9B,YAAY,MAOX;QACC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAElC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,qBAAqB,CAC7B,wCAAwC,EACxC;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;YAEjC,2BAA2B;YAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,MAAM,IAAI,qBAAqB,CAC7B,oCAAoC,IAAI,CAAC,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAChH;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EACD,KAAK,EACL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAE1B,mBAAmB;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAE3B,2BAA2B;YAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QAEnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,qBAAqB,CAC7B,4BAA4B,IAAI,CAAC,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACxG;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,EACD,KAAK,EACL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-Agent Model Selection (M1-9) + Model Fallback (M3-5, Issue #145)
|
|
3
|
+
*/
|
|
4
|
+
import type { EventBus } from '../runtime/event-bus.js';
|
|
5
|
+
/**
|
|
6
|
+
* Task types that influence model selection.
|
|
7
|
+
*/
|
|
8
|
+
export type TaskType = 'code' | 'prompt' | 'docs' | 'visual' | 'planning' | 'mechanical';
|
|
9
|
+
/**
|
|
10
|
+
* Model tier classification.
|
|
11
|
+
*/
|
|
12
|
+
export type ModelTier = 'premium' | 'standard' | 'fast';
|
|
13
|
+
/**
|
|
14
|
+
* Source of the model resolution.
|
|
15
|
+
*/
|
|
16
|
+
export type ModelResolutionSource = 'user-override' | 'charter' | 'task-auto' | 'default';
|
|
17
|
+
/**
|
|
18
|
+
* Options for model resolution.
|
|
19
|
+
*/
|
|
20
|
+
export interface ModelResolutionOptions {
|
|
21
|
+
/** User-specified model override */
|
|
22
|
+
userOverride?: string;
|
|
23
|
+
/** Model preference from agent's charter (## Model section) */
|
|
24
|
+
charterPreference?: string;
|
|
25
|
+
/** Type of task being performed */
|
|
26
|
+
taskType: TaskType;
|
|
27
|
+
/** Agent role (for context) */
|
|
28
|
+
agentRole?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of model resolution.
|
|
32
|
+
*/
|
|
33
|
+
export interface ResolvedModel {
|
|
34
|
+
/** Selected model identifier */
|
|
35
|
+
model: string;
|
|
36
|
+
/** Model tier classification */
|
|
37
|
+
tier: ModelTier;
|
|
38
|
+
/** Source that determined the model */
|
|
39
|
+
source: ModelResolutionSource;
|
|
40
|
+
/** Fallback chain for this tier */
|
|
41
|
+
fallbackChain: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the appropriate model using the 4-layer priority system.
|
|
45
|
+
*
|
|
46
|
+
* @param options - Model resolution options
|
|
47
|
+
* @returns Resolved model with tier and fallback chain
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveModel(options: ModelResolutionOptions): ResolvedModel;
|
|
50
|
+
export declare function inferTierFromModel(model: string): ModelTier;
|
|
51
|
+
export declare function isTierFallbackAllowed(fromTier: ModelTier, toTier: ModelTier, allowCrossTier: boolean): boolean;
|
|
52
|
+
export interface FallbackAttempt {
|
|
53
|
+
model: string;
|
|
54
|
+
tier: ModelTier;
|
|
55
|
+
error: string;
|
|
56
|
+
timestamp: Date;
|
|
57
|
+
}
|
|
58
|
+
export interface FallbackResult<T> {
|
|
59
|
+
value: T;
|
|
60
|
+
model: string;
|
|
61
|
+
tier: ModelTier;
|
|
62
|
+
attempts: FallbackAttempt[];
|
|
63
|
+
didFallback: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface FallbackExecutorConfig {
|
|
66
|
+
allowCrossTier?: boolean;
|
|
67
|
+
eventBus?: EventBus;
|
|
68
|
+
}
|
|
69
|
+
export declare class ModelFallbackExecutor {
|
|
70
|
+
private allowCrossTier;
|
|
71
|
+
private eventBus?;
|
|
72
|
+
private history;
|
|
73
|
+
constructor(config?: FallbackExecutorConfig);
|
|
74
|
+
execute<T>(resolved: ResolvedModel, agentName: string, fn: (model: string) => Promise<T>): Promise<FallbackResult<T>>;
|
|
75
|
+
getHistory(agentName: string): FallbackAttempt[];
|
|
76
|
+
clearHistory(): void;
|
|
77
|
+
private buildCandidateList;
|
|
78
|
+
private emitEvent;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=model-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../src/agents/model-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,mCAAmC;IACnC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAsC3E;AAiDD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAa3D;AAQD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,OAAO,GACtB,OAAO,CAIT;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,OAAO,CAA6C;gBAEhD,MAAM,GAAE,sBAA2B;IAKzC,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA6B7B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE;IAIhD,YAAY,IAAI,IAAI;IAIpB,OAAO,CAAC,kBAAkB;YASZ,SAAS;CAIxB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-Agent Model Selection (M1-9) + Model Fallback (M3-5, Issue #145)
|
|
3
|
+
*/
|
|
4
|
+
import { MODELS } from '../runtime/constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the appropriate model using the 4-layer priority system.
|
|
7
|
+
*
|
|
8
|
+
* @param options - Model resolution options
|
|
9
|
+
* @returns Resolved model with tier and fallback chain
|
|
10
|
+
*/
|
|
11
|
+
export function resolveModel(options) {
|
|
12
|
+
const { userOverride, charterPreference, taskType } = options;
|
|
13
|
+
// Layer 1: User Override
|
|
14
|
+
if (userOverride && userOverride.trim().length > 0) {
|
|
15
|
+
const tier = inferTierFromModel(userOverride);
|
|
16
|
+
return {
|
|
17
|
+
model: userOverride,
|
|
18
|
+
tier,
|
|
19
|
+
source: 'user-override',
|
|
20
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS[tier]],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Layer 2: Charter Preference
|
|
24
|
+
if (charterPreference && charterPreference.trim().length > 0 && charterPreference !== 'auto') {
|
|
25
|
+
const tier = inferTierFromModel(charterPreference);
|
|
26
|
+
return {
|
|
27
|
+
model: charterPreference,
|
|
28
|
+
tier,
|
|
29
|
+
source: 'charter',
|
|
30
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS[tier]],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Layer 3: Task-Aware Auto-Selection
|
|
34
|
+
const autoSelected = selectModelForTask(taskType);
|
|
35
|
+
if (autoSelected) {
|
|
36
|
+
return autoSelected;
|
|
37
|
+
}
|
|
38
|
+
// Layer 4: Default
|
|
39
|
+
return {
|
|
40
|
+
model: MODELS.SELECTOR_DEFAULT,
|
|
41
|
+
tier: MODELS.SELECTOR_DEFAULT_TIER,
|
|
42
|
+
source: 'default',
|
|
43
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS[MODELS.SELECTOR_DEFAULT_TIER]],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Select model based on task type.
|
|
48
|
+
*
|
|
49
|
+
* @param taskType - Type of task being performed
|
|
50
|
+
* @returns Resolved model or undefined if no match
|
|
51
|
+
*/
|
|
52
|
+
function selectModelForTask(taskType) {
|
|
53
|
+
switch (taskType) {
|
|
54
|
+
case 'code':
|
|
55
|
+
return {
|
|
56
|
+
model: 'claude-sonnet-4.5',
|
|
57
|
+
tier: 'standard',
|
|
58
|
+
source: 'task-auto',
|
|
59
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS.standard],
|
|
60
|
+
};
|
|
61
|
+
case 'prompt':
|
|
62
|
+
return {
|
|
63
|
+
model: 'claude-sonnet-4.5',
|
|
64
|
+
tier: 'standard',
|
|
65
|
+
source: 'task-auto',
|
|
66
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS.standard],
|
|
67
|
+
};
|
|
68
|
+
case 'visual':
|
|
69
|
+
return {
|
|
70
|
+
model: 'claude-opus-4.5',
|
|
71
|
+
tier: 'premium',
|
|
72
|
+
source: 'task-auto',
|
|
73
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS.premium],
|
|
74
|
+
};
|
|
75
|
+
case 'docs':
|
|
76
|
+
case 'planning':
|
|
77
|
+
case 'mechanical':
|
|
78
|
+
return {
|
|
79
|
+
model: 'claude-haiku-4.5',
|
|
80
|
+
tier: 'fast',
|
|
81
|
+
source: 'task-auto',
|
|
82
|
+
fallbackChain: [...MODELS.FALLBACK_CHAINS.fast],
|
|
83
|
+
};
|
|
84
|
+
default:
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function inferTierFromModel(model) {
|
|
89
|
+
const lowerModel = model.toLowerCase();
|
|
90
|
+
if (lowerModel.includes('opus')) {
|
|
91
|
+
return 'premium';
|
|
92
|
+
}
|
|
93
|
+
if (lowerModel.includes('haiku') || lowerModel.includes('mini')) {
|
|
94
|
+
return 'fast';
|
|
95
|
+
}
|
|
96
|
+
// Default to standard for sonnet, gpt-5.x, etc.
|
|
97
|
+
return 'standard';
|
|
98
|
+
}
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Model Fallback Executor (M3-5, Issue #145)
|
|
101
|
+
// ============================================================================
|
|
102
|
+
const TIER_ORDER = { premium: 0, standard: 1, fast: 2 };
|
|
103
|
+
export function isTierFallbackAllowed(fromTier, toTier, allowCrossTier) {
|
|
104
|
+
if (allowCrossTier)
|
|
105
|
+
return true;
|
|
106
|
+
if (fromTier === toTier)
|
|
107
|
+
return true;
|
|
108
|
+
return TIER_ORDER[toTier] <= TIER_ORDER[fromTier];
|
|
109
|
+
}
|
|
110
|
+
export class ModelFallbackExecutor {
|
|
111
|
+
allowCrossTier;
|
|
112
|
+
eventBus;
|
|
113
|
+
history = new Map();
|
|
114
|
+
constructor(config = {}) {
|
|
115
|
+
this.allowCrossTier = config.allowCrossTier ?? false;
|
|
116
|
+
this.eventBus = config.eventBus;
|
|
117
|
+
}
|
|
118
|
+
async execute(resolved, agentName, fn) {
|
|
119
|
+
const attempts = [];
|
|
120
|
+
const originalTier = resolved.tier;
|
|
121
|
+
const candidates = this.buildCandidateList(resolved);
|
|
122
|
+
for (const candidate of candidates) {
|
|
123
|
+
const candidateTier = inferTierFromModel(candidate);
|
|
124
|
+
if (!isTierFallbackAllowed(originalTier, candidateTier, this.allowCrossTier)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const value = await fn(candidate);
|
|
129
|
+
if (!this.history.has(agentName))
|
|
130
|
+
this.history.set(agentName, []);
|
|
131
|
+
this.history.get(agentName).push(...attempts);
|
|
132
|
+
return { value, model: candidate, tier: candidateTier, attempts, didFallback: attempts.length > 0 };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
136
|
+
const attempt = { model: candidate, tier: candidateTier, error: errorMsg, timestamp: new Date() };
|
|
137
|
+
attempts.push(attempt);
|
|
138
|
+
await this.emitEvent('agent:milestone', { event: 'model.fallback', agentName, failedModel: candidate, failedTier: candidateTier, error: errorMsg, attemptNumber: attempts.length });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!this.history.has(agentName))
|
|
142
|
+
this.history.set(agentName, []);
|
|
143
|
+
this.history.get(agentName).push(...attempts);
|
|
144
|
+
await this.emitEvent('agent:milestone', { event: 'model.exhausted', agentName, originalModel: resolved.model, originalTier, totalAttempts: attempts.length });
|
|
145
|
+
throw new Error(`All models exhausted for agent '${agentName}'. Tried ${attempts.length} model(s): ${attempts.map(a => a.model).join(', ')}`);
|
|
146
|
+
}
|
|
147
|
+
getHistory(agentName) {
|
|
148
|
+
return this.history.get(agentName) ?? [];
|
|
149
|
+
}
|
|
150
|
+
clearHistory() {
|
|
151
|
+
this.history.clear();
|
|
152
|
+
}
|
|
153
|
+
buildCandidateList(resolved) {
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
const result = [];
|
|
156
|
+
const add = (m) => { if (!seen.has(m)) {
|
|
157
|
+
seen.add(m);
|
|
158
|
+
result.push(m);
|
|
159
|
+
} };
|
|
160
|
+
add(resolved.model);
|
|
161
|
+
for (const fb of resolved.fallbackChain)
|
|
162
|
+
add(fb);
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
async emitEvent(type, payload) {
|
|
166
|
+
if (!this.eventBus)
|
|
167
|
+
return;
|
|
168
|
+
await this.eventBus.emit({ type: type, payload, timestamp: new Date() });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=model-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../src/agents/model-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AA8CjD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAA+B;IAC1D,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE9D,yBAAyB;IACzB,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,IAAI;YACJ,MAAM,EAAE,eAAe;YACvB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,KAAK,MAAM,EAAE,CAAC;QAC7F,MAAM,IAAI,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACnD,OAAO;YACL,KAAK,EAAE,iBAAiB;YACxB,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,mBAAmB;IACnB,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,gBAAgB;QAC9B,IAAI,EAAE,MAAM,CAAC,qBAAqB;QAClC,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;KACzE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,QAAkB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;gBACnB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;aACpD,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;gBACnB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;aACpD,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO;gBACL,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,WAAW;gBACnB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC;aACnD,CAAC;QAEJ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,OAAO;gBACL,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,WAAW;gBACnB,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;aAChD,CAAC;QAEJ;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gDAAgD;IAChD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,MAAM,UAAU,GAA8B,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CACnC,QAAmB,EACnB,MAAiB,EACjB,cAAuB;IAEvB,IAAI,cAAc;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAsBD,MAAM,OAAO,qBAAqB;IACxB,cAAc,CAAU;IACxB,QAAQ,CAAY;IACpB,OAAO,GAAmC,IAAI,GAAG,EAAE,CAAC;IAE5D,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,QAAuB,EACvB,SAAiB,EACjB,EAAiC;QAEjC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAErD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7E,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,OAAO,GAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gBACnH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACtL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9J,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,YAAY,QAAQ,CAAC,MAAM,cAAc,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChJ,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,kBAAkB,CAAC,QAAuB;QAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC;QAClF,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,aAAa;YAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAgC;QACpE,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Onboarding Module (M2-10, PRD #111)
|
|
3
|
+
*
|
|
4
|
+
* Handles runtime agent onboarding with context-aware charter generation.
|
|
5
|
+
* Creates agent directory, charter, and history with project context.
|
|
6
|
+
*
|
|
7
|
+
* @module agents/onboarding
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Agent onboarding options.
|
|
11
|
+
*/
|
|
12
|
+
export interface OnboardOptions {
|
|
13
|
+
/** Root directory for Squad team files */
|
|
14
|
+
teamRoot: string;
|
|
15
|
+
/** Agent name (kebab-case) */
|
|
16
|
+
agentName: string;
|
|
17
|
+
/** Agent role identifier */
|
|
18
|
+
role: string;
|
|
19
|
+
/** Display name (optional, defaults to titlecased name) */
|
|
20
|
+
displayName?: string;
|
|
21
|
+
/** Project context for charter generation */
|
|
22
|
+
projectContext?: string;
|
|
23
|
+
/** User name for initial history entry */
|
|
24
|
+
userName?: string;
|
|
25
|
+
/** Custom charter template override */
|
|
26
|
+
charterTemplate?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Agent onboarding result.
|
|
30
|
+
*/
|
|
31
|
+
export interface OnboardResult {
|
|
32
|
+
/** Created file paths */
|
|
33
|
+
createdFiles: string[];
|
|
34
|
+
/** Agent directory path */
|
|
35
|
+
agentDir: string;
|
|
36
|
+
/** Charter file path */
|
|
37
|
+
charterPath: string;
|
|
38
|
+
/** History file path */
|
|
39
|
+
historyPath: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Onboard a new agent to the Squad.
|
|
43
|
+
*
|
|
44
|
+
* Creates:
|
|
45
|
+
* - Agent directory at .squad/agents/{name}/
|
|
46
|
+
* - charter.md from role template + project context
|
|
47
|
+
* - history.md with project description and tech stack
|
|
48
|
+
*
|
|
49
|
+
* @param options - Onboarding options
|
|
50
|
+
* @returns Result with created file paths
|
|
51
|
+
*/
|
|
52
|
+
export declare function onboardAgent(options: OnboardOptions): Promise<OnboardResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Update an agent's configuration to squad.config.ts (if it exists).
|
|
55
|
+
*
|
|
56
|
+
* This is a helper function to add agent routing after onboarding.
|
|
57
|
+
* Only works with TypeScript configs (JSON requires manual edit).
|
|
58
|
+
*
|
|
59
|
+
* @param teamRoot - Team root directory
|
|
60
|
+
* @param agentName - Agent name to add
|
|
61
|
+
* @param role - Agent role
|
|
62
|
+
* @returns True if config was updated, false if not found or JSON format
|
|
63
|
+
*/
|
|
64
|
+
export declare function addAgentToConfig(teamRoot: string, agentName: string, role: string): Promise<boolean>;
|
|
65
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/agents/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoQD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2ElF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAwDlB"}
|