@bradygaster/squad-sdk 0.7.0 → 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 -63
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
// Re-export core types and classes from adapter layer
|
|
12
|
+
export { SquadClient, } from '../adapter/client.js';
|
|
13
|
+
// Re-export pool and event bus
|
|
14
|
+
export { SessionPool, DEFAULT_POOL_CONFIG } from './session-pool.js';
|
|
15
|
+
export { EventBus } from './event-bus.js';
|
|
16
|
+
// --- High-Level Client with Pool Management ---
|
|
17
|
+
import { SquadClient as BaseSquadClient } from '../adapter/client.js';
|
|
18
|
+
import { SessionPool } from './session-pool.js';
|
|
19
|
+
import { EventBus } from './event-bus.js';
|
|
20
|
+
/**
|
|
21
|
+
* Squad Client with integrated session pool management.
|
|
22
|
+
*
|
|
23
|
+
* This is the recommended client for applications that need to manage
|
|
24
|
+
* multiple concurrent agent sessions. It provides:
|
|
25
|
+
* - Connection lifecycle management (from SquadClient)
|
|
26
|
+
* - Session pool with capacity limits and health checks
|
|
27
|
+
* - Event bus for cross-session event handling
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const client = new SquadClientWithPool({
|
|
32
|
+
* pool: { maxConcurrent: 5 }
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* await client.connect();
|
|
36
|
+
*
|
|
37
|
+
* const session1 = await client.createSession({ model: 'claude-sonnet-4.5' });
|
|
38
|
+
* const session2 = await client.createSession({ model: 'claude-haiku-4.5' });
|
|
39
|
+
*
|
|
40
|
+
* client.eventBus.on('session.created', (event) => {
|
|
41
|
+
* console.log('New session:', event.sessionId);
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* await client.shutdown();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class SquadClientWithPool {
|
|
48
|
+
baseClient;
|
|
49
|
+
pool;
|
|
50
|
+
eventBus;
|
|
51
|
+
constructor(config = {}) {
|
|
52
|
+
this.baseClient = new BaseSquadClient(config);
|
|
53
|
+
this.pool = new SessionPool(config.pool);
|
|
54
|
+
this.eventBus = new EventBus();
|
|
55
|
+
// Wire pool events to event bus
|
|
56
|
+
this.pool.on((event) => {
|
|
57
|
+
this.eventBus.emit({
|
|
58
|
+
type: event.type,
|
|
59
|
+
sessionId: event.sessionId,
|
|
60
|
+
payload: event,
|
|
61
|
+
timestamp: event.timestamp,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Connect to the Copilot CLI server */
|
|
66
|
+
async connect() {
|
|
67
|
+
return this.baseClient.connect();
|
|
68
|
+
}
|
|
69
|
+
/** Disconnect from the Copilot CLI server */
|
|
70
|
+
async disconnect() {
|
|
71
|
+
await this.pool.shutdown();
|
|
72
|
+
return this.baseClient.disconnect();
|
|
73
|
+
}
|
|
74
|
+
/** Force disconnect without graceful cleanup */
|
|
75
|
+
async forceDisconnect() {
|
|
76
|
+
await this.pool.shutdown();
|
|
77
|
+
return this.baseClient.forceDisconnect();
|
|
78
|
+
}
|
|
79
|
+
/** Get current connection state */
|
|
80
|
+
getState() {
|
|
81
|
+
return this.baseClient.getState();
|
|
82
|
+
}
|
|
83
|
+
/** Check if connected */
|
|
84
|
+
isConnected() {
|
|
85
|
+
return this.baseClient.isConnected();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create a new session and add it to the pool.
|
|
89
|
+
* Throws if the pool is at capacity.
|
|
90
|
+
*/
|
|
91
|
+
async createSession(config = {}) {
|
|
92
|
+
const session = await this.baseClient.createSession(config);
|
|
93
|
+
// Convert to pool-compatible session format
|
|
94
|
+
const poolSession = {
|
|
95
|
+
id: session.sessionId,
|
|
96
|
+
agentName: config.model ?? 'default',
|
|
97
|
+
status: 'active',
|
|
98
|
+
createdAt: new Date(),
|
|
99
|
+
};
|
|
100
|
+
this.pool.add(poolSession);
|
|
101
|
+
await this.eventBus.emit({
|
|
102
|
+
type: 'session.created',
|
|
103
|
+
sessionId: session.sessionId,
|
|
104
|
+
payload: { session },
|
|
105
|
+
timestamp: new Date(),
|
|
106
|
+
});
|
|
107
|
+
return session;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Resume an existing session and add it to the pool if not present.
|
|
111
|
+
*/
|
|
112
|
+
async resumeSession(sessionId, config = {}) {
|
|
113
|
+
const session = await this.baseClient.resumeSession(sessionId, config);
|
|
114
|
+
if (!this.pool.get(sessionId)) {
|
|
115
|
+
const poolSession = {
|
|
116
|
+
id: session.sessionId,
|
|
117
|
+
agentName: config.model ?? 'resumed',
|
|
118
|
+
status: 'active',
|
|
119
|
+
createdAt: new Date(),
|
|
120
|
+
};
|
|
121
|
+
this.pool.add(poolSession);
|
|
122
|
+
}
|
|
123
|
+
return session;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Delete a session and remove it from the pool.
|
|
127
|
+
*/
|
|
128
|
+
async deleteSession(sessionId) {
|
|
129
|
+
await this.baseClient.deleteSession(sessionId);
|
|
130
|
+
this.pool.remove(sessionId);
|
|
131
|
+
await this.eventBus.emit({
|
|
132
|
+
type: 'session.destroyed',
|
|
133
|
+
sessionId,
|
|
134
|
+
payload: null,
|
|
135
|
+
timestamp: new Date(),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/** List all sessions from the base client */
|
|
139
|
+
async listSessions() {
|
|
140
|
+
return this.baseClient.listSessions();
|
|
141
|
+
}
|
|
142
|
+
/** Send a ping to verify connectivity */
|
|
143
|
+
async ping(message) {
|
|
144
|
+
return this.baseClient.ping(message);
|
|
145
|
+
}
|
|
146
|
+
/** Get CLI status information */
|
|
147
|
+
async getStatus() {
|
|
148
|
+
return this.baseClient.getStatus();
|
|
149
|
+
}
|
|
150
|
+
/** Get authentication status */
|
|
151
|
+
async getAuthStatus() {
|
|
152
|
+
return this.baseClient.getAuthStatus();
|
|
153
|
+
}
|
|
154
|
+
/** List available models */
|
|
155
|
+
async listModels() {
|
|
156
|
+
return this.baseClient.listModels();
|
|
157
|
+
}
|
|
158
|
+
/** Subscribe to session lifecycle events */
|
|
159
|
+
on(eventType, handler) {
|
|
160
|
+
return this.baseClient.on(eventType, handler);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Graceful shutdown — destroy all sessions and disconnect.
|
|
164
|
+
*/
|
|
165
|
+
async shutdown() {
|
|
166
|
+
await this.pool.shutdown();
|
|
167
|
+
await this.baseClient.disconnect();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Pool Manager (PRD 1)
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of multiple concurrent agent sessions.
|
|
5
|
+
* Tracks session state, enforces concurrency limits, and handles
|
|
6
|
+
* cleanup of idle/errored sessions.
|
|
7
|
+
*/
|
|
8
|
+
export type SessionStatus = 'creating' | 'active' | 'idle' | 'error' | 'destroyed';
|
|
9
|
+
export interface SquadSession {
|
|
10
|
+
id: string;
|
|
11
|
+
agentName: string;
|
|
12
|
+
status: SessionStatus;
|
|
13
|
+
createdAt: Date;
|
|
14
|
+
}
|
|
15
|
+
export interface SessionPoolConfig {
|
|
16
|
+
/** Maximum concurrent sessions */
|
|
17
|
+
maxConcurrent: number;
|
|
18
|
+
/** Idle timeout before auto-cleanup (ms) */
|
|
19
|
+
idleTimeout: number;
|
|
20
|
+
/** Health check interval (ms) */
|
|
21
|
+
healthCheckInterval: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const DEFAULT_POOL_CONFIG: SessionPoolConfig;
|
|
24
|
+
export type PoolEventType = 'session.added' | 'session.removed' | 'session.status_changed' | 'pool.at_capacity' | 'pool.health_check';
|
|
25
|
+
export interface PoolEvent {
|
|
26
|
+
type: PoolEventType;
|
|
27
|
+
sessionId?: string;
|
|
28
|
+
oldStatus?: SessionStatus;
|
|
29
|
+
newStatus?: SessionStatus;
|
|
30
|
+
timestamp: Date;
|
|
31
|
+
}
|
|
32
|
+
export declare class SessionPool {
|
|
33
|
+
private config;
|
|
34
|
+
private sessions;
|
|
35
|
+
private healthCheckTimer;
|
|
36
|
+
private cleanupTimer;
|
|
37
|
+
private listeners;
|
|
38
|
+
constructor(config?: Partial<SessionPoolConfig>);
|
|
39
|
+
/** Add a session to the pool */
|
|
40
|
+
add(session: SquadSession): void;
|
|
41
|
+
/** Remove a session from the pool */
|
|
42
|
+
remove(sessionId: string): boolean;
|
|
43
|
+
/** Get a session by ID */
|
|
44
|
+
get(sessionId: string): SquadSession | undefined;
|
|
45
|
+
/** Find a session by agent name */
|
|
46
|
+
findByAgent(agentName: string): SquadSession | undefined;
|
|
47
|
+
/** Get all active sessions */
|
|
48
|
+
active(): SquadSession[];
|
|
49
|
+
/** Update session status and emit event */
|
|
50
|
+
updateStatus(sessionId: string, newStatus: SessionStatus): void;
|
|
51
|
+
/** Current pool size */
|
|
52
|
+
get size(): number;
|
|
53
|
+
/** Whether the pool is at capacity */
|
|
54
|
+
get atCapacity(): boolean;
|
|
55
|
+
/** Destroy all sessions and stop timers */
|
|
56
|
+
shutdown(): Promise<void>;
|
|
57
|
+
/** Subscribe to pool events */
|
|
58
|
+
on(handler: (event: PoolEvent) => void): () => void;
|
|
59
|
+
/** Emit a pool event to all listeners */
|
|
60
|
+
private emitEvent;
|
|
61
|
+
/** Start the health check timer */
|
|
62
|
+
private startHealthCheckTimer;
|
|
63
|
+
/** Start the idle session cleanup timer */
|
|
64
|
+
private startCleanupTimer;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=session-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pool.d.ts","sourceRoot":"","sources":["../../src/client/session-pool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAEnF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAID,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,iBAIjC,CAAC;AAIF,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,iBAAiB,GACjB,wBAAwB,GACxB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;CACjB;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,SAAS,CAAyC;gBAE9C,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAMnD,gCAAgC;IAChC,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAgBhC,qCAAqC;IACrC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAYlC,0BAA0B;IAC1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,mCAAmC;IACnC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAOxD,8BAA8B;IAC9B,MAAM,IAAI,YAAY,EAAE;IAIxB,2CAA2C;IAC3C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;IAiB/D,wBAAwB;IACxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sCAAsC;IACtC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,2CAA2C;IACrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,+BAA+B;IAC/B,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAQnD,yCAAyC;IACzC,OAAO,CAAC,SAAS;IAMjB,mCAAmC;IACnC,OAAO,CAAC,qBAAqB;IAS7B,2CAA2C;IAC3C,OAAO,CAAC,iBAAiB;CAa1B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Pool Manager (PRD 1)
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of multiple concurrent agent sessions.
|
|
5
|
+
* Tracks session state, enforces concurrency limits, and handles
|
|
6
|
+
* cleanup of idle/errored sessions.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_POOL_CONFIG = {
|
|
9
|
+
maxConcurrent: 10,
|
|
10
|
+
idleTimeout: 300_000, // 5 minutes
|
|
11
|
+
healthCheckInterval: 30_000, // 30 seconds
|
|
12
|
+
};
|
|
13
|
+
// --- Session Pool ---
|
|
14
|
+
export class SessionPool {
|
|
15
|
+
config;
|
|
16
|
+
sessions = new Map();
|
|
17
|
+
healthCheckTimer = null;
|
|
18
|
+
cleanupTimer = null;
|
|
19
|
+
listeners = [];
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
22
|
+
this.startHealthCheckTimer();
|
|
23
|
+
this.startCleanupTimer();
|
|
24
|
+
}
|
|
25
|
+
/** Add a session to the pool */
|
|
26
|
+
add(session) {
|
|
27
|
+
if (this.atCapacity) {
|
|
28
|
+
this.emitEvent({
|
|
29
|
+
type: 'pool.at_capacity',
|
|
30
|
+
timestamp: new Date(),
|
|
31
|
+
});
|
|
32
|
+
throw new Error(`SessionPool at capacity (${this.config.maxConcurrent})`);
|
|
33
|
+
}
|
|
34
|
+
this.sessions.set(session.id, session);
|
|
35
|
+
this.emitEvent({
|
|
36
|
+
type: 'session.added',
|
|
37
|
+
sessionId: session.id,
|
|
38
|
+
timestamp: new Date(),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Remove a session from the pool */
|
|
42
|
+
remove(sessionId) {
|
|
43
|
+
const existed = this.sessions.delete(sessionId);
|
|
44
|
+
if (existed) {
|
|
45
|
+
this.emitEvent({
|
|
46
|
+
type: 'session.removed',
|
|
47
|
+
sessionId,
|
|
48
|
+
timestamp: new Date(),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return existed;
|
|
52
|
+
}
|
|
53
|
+
/** Get a session by ID */
|
|
54
|
+
get(sessionId) {
|
|
55
|
+
return this.sessions.get(sessionId);
|
|
56
|
+
}
|
|
57
|
+
/** Find a session by agent name */
|
|
58
|
+
findByAgent(agentName) {
|
|
59
|
+
for (const session of this.sessions.values()) {
|
|
60
|
+
if (session.agentName === agentName)
|
|
61
|
+
return session;
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
/** Get all active sessions */
|
|
66
|
+
active() {
|
|
67
|
+
return Array.from(this.sessions.values()).filter(s => s.status === 'active');
|
|
68
|
+
}
|
|
69
|
+
/** Update session status and emit event */
|
|
70
|
+
updateStatus(sessionId, newStatus) {
|
|
71
|
+
const session = this.sessions.get(sessionId);
|
|
72
|
+
if (!session)
|
|
73
|
+
return;
|
|
74
|
+
const oldStatus = session.status;
|
|
75
|
+
if (oldStatus !== newStatus) {
|
|
76
|
+
session.status = newStatus;
|
|
77
|
+
this.emitEvent({
|
|
78
|
+
type: 'session.status_changed',
|
|
79
|
+
sessionId,
|
|
80
|
+
oldStatus,
|
|
81
|
+
newStatus,
|
|
82
|
+
timestamp: new Date(),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Current pool size */
|
|
87
|
+
get size() {
|
|
88
|
+
return this.sessions.size;
|
|
89
|
+
}
|
|
90
|
+
/** Whether the pool is at capacity */
|
|
91
|
+
get atCapacity() {
|
|
92
|
+
return this.sessions.size >= this.config.maxConcurrent;
|
|
93
|
+
}
|
|
94
|
+
/** Destroy all sessions and stop timers */
|
|
95
|
+
async shutdown() {
|
|
96
|
+
if (this.healthCheckTimer) {
|
|
97
|
+
clearInterval(this.healthCheckTimer);
|
|
98
|
+
this.healthCheckTimer = null;
|
|
99
|
+
}
|
|
100
|
+
if (this.cleanupTimer) {
|
|
101
|
+
clearInterval(this.cleanupTimer);
|
|
102
|
+
this.cleanupTimer = null;
|
|
103
|
+
}
|
|
104
|
+
this.sessions.clear();
|
|
105
|
+
}
|
|
106
|
+
/** Subscribe to pool events */
|
|
107
|
+
on(handler) {
|
|
108
|
+
this.listeners.push(handler);
|
|
109
|
+
return () => {
|
|
110
|
+
const index = this.listeners.indexOf(handler);
|
|
111
|
+
if (index !== -1)
|
|
112
|
+
this.listeners.splice(index, 1);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Emit a pool event to all listeners */
|
|
116
|
+
emitEvent(event) {
|
|
117
|
+
for (const listener of this.listeners) {
|
|
118
|
+
listener(event);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Start the health check timer */
|
|
122
|
+
startHealthCheckTimer() {
|
|
123
|
+
this.healthCheckTimer = setInterval(() => {
|
|
124
|
+
this.emitEvent({
|
|
125
|
+
type: 'pool.health_check',
|
|
126
|
+
timestamp: new Date(),
|
|
127
|
+
});
|
|
128
|
+
}, this.config.healthCheckInterval);
|
|
129
|
+
}
|
|
130
|
+
/** Start the idle session cleanup timer */
|
|
131
|
+
startCleanupTimer() {
|
|
132
|
+
this.cleanupTimer = setInterval(() => {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
for (const session of this.sessions.values()) {
|
|
135
|
+
if (session.status === 'idle') {
|
|
136
|
+
const idleTime = now - session.createdAt.getTime();
|
|
137
|
+
if (idleTime > this.config.idleTimeout) {
|
|
138
|
+
this.remove(session.id);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}, this.config.idleTimeout);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=session-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pool.js","sourceRoot":"","sources":["../../src/client/session-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Documentation Parser (M2-12)
|
|
3
|
+
*
|
|
4
|
+
* Extracts structured metadata from .agent.md files so the markdown
|
|
5
|
+
* becomes a reference document while typed config remains the runtime
|
|
6
|
+
* source of truth.
|
|
7
|
+
*
|
|
8
|
+
* @module config/agent-doc
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Structured metadata extracted from an agent .md file.
|
|
12
|
+
*/
|
|
13
|
+
export interface AgentDocMetadata {
|
|
14
|
+
/** Agent name from the IDENTITY section or top-level heading */
|
|
15
|
+
name?: string;
|
|
16
|
+
/** One-line description / role */
|
|
17
|
+
description?: string;
|
|
18
|
+
/** Capability strings listed under CAPABILITIES */
|
|
19
|
+
capabilities: string[];
|
|
20
|
+
/** Routing hints (work-type patterns this agent handles) */
|
|
21
|
+
routingHints: string[];
|
|
22
|
+
/** Model preferences (e.g. "claude-sonnet-4.5") */
|
|
23
|
+
modelPreferences: string[];
|
|
24
|
+
/** Constraints / boundaries the agent must follow */
|
|
25
|
+
constraints: string[];
|
|
26
|
+
/** Tool names the agent is allowed to use */
|
|
27
|
+
tools: string[];
|
|
28
|
+
/** Extra sections not in the standard set, keyed by heading */
|
|
29
|
+
extraSections: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse an agent .agent.md file into structured metadata.
|
|
33
|
+
*
|
|
34
|
+
* Recognised top-level (##) sections:
|
|
35
|
+
* IDENTITY, CAPABILITIES, ROUTING, CONSTRAINTS, TOOLS
|
|
36
|
+
*
|
|
37
|
+
* Any other ## sections are captured in `extraSections`.
|
|
38
|
+
*
|
|
39
|
+
* @param markdown - Raw markdown content of the agent doc
|
|
40
|
+
* @returns Parsed metadata
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseAgentDoc(markdown: string): AgentDocMetadata;
|
|
43
|
+
//# sourceMappingURL=agent-doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-doc.d.ts","sourceRoot":"","sources":["../../src/config/agent-doc.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAmDhE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Documentation Parser (M2-12)
|
|
3
|
+
*
|
|
4
|
+
* Extracts structured metadata from .agent.md files so the markdown
|
|
5
|
+
* becomes a reference document while typed config remains the runtime
|
|
6
|
+
* source of truth.
|
|
7
|
+
*
|
|
8
|
+
* @module config/agent-doc
|
|
9
|
+
*/
|
|
10
|
+
import { normalizeEol } from '../utils/normalize-eol.js';
|
|
11
|
+
/** Standard section names we recognise (case-insensitive). */
|
|
12
|
+
const STANDARD_SECTIONS = new Set([
|
|
13
|
+
'identity',
|
|
14
|
+
'capabilities',
|
|
15
|
+
'routing',
|
|
16
|
+
'constraints',
|
|
17
|
+
'tools',
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Parse an agent .agent.md file into structured metadata.
|
|
21
|
+
*
|
|
22
|
+
* Recognised top-level (##) sections:
|
|
23
|
+
* IDENTITY, CAPABILITIES, ROUTING, CONSTRAINTS, TOOLS
|
|
24
|
+
*
|
|
25
|
+
* Any other ## sections are captured in `extraSections`.
|
|
26
|
+
*
|
|
27
|
+
* @param markdown - Raw markdown content of the agent doc
|
|
28
|
+
* @returns Parsed metadata
|
|
29
|
+
*/
|
|
30
|
+
export function parseAgentDoc(markdown) {
|
|
31
|
+
markdown = normalizeEol(markdown);
|
|
32
|
+
const result = {
|
|
33
|
+
capabilities: [],
|
|
34
|
+
routingHints: [],
|
|
35
|
+
modelPreferences: [],
|
|
36
|
+
constraints: [],
|
|
37
|
+
tools: [],
|
|
38
|
+
extraSections: {},
|
|
39
|
+
};
|
|
40
|
+
if (!markdown || markdown.trim().length === 0) {
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
// Try to extract the agent name from the first H1 heading
|
|
44
|
+
const h1Match = markdown.match(/^#\s+(.+)/m);
|
|
45
|
+
if (h1Match) {
|
|
46
|
+
result.name = h1Match[1].trim();
|
|
47
|
+
}
|
|
48
|
+
// Split into sections by ## headings
|
|
49
|
+
const sections = splitSections(markdown);
|
|
50
|
+
for (const [heading, body] of sections) {
|
|
51
|
+
const key = heading.toLowerCase().trim();
|
|
52
|
+
if (key === 'identity') {
|
|
53
|
+
parseIdentitySection(body, result);
|
|
54
|
+
}
|
|
55
|
+
else if (key === 'capabilities') {
|
|
56
|
+
result.capabilities = parseBulletList(body);
|
|
57
|
+
}
|
|
58
|
+
else if (key === 'routing') {
|
|
59
|
+
result.routingHints = parseBulletList(body);
|
|
60
|
+
// Also check for model preferences inside routing
|
|
61
|
+
parseModelHints(body, result);
|
|
62
|
+
}
|
|
63
|
+
else if (key === 'constraints') {
|
|
64
|
+
result.constraints = parseBulletList(body);
|
|
65
|
+
}
|
|
66
|
+
else if (key === 'tools') {
|
|
67
|
+
result.tools = parseBulletList(body);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Non-standard section – capture verbatim
|
|
71
|
+
result.extraSections[heading.trim()] = body.trim();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Also scan the full document for model preferences if none found yet
|
|
75
|
+
if (result.modelPreferences.length === 0) {
|
|
76
|
+
parseModelHints(markdown, result);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Internal helpers
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Splits markdown into (heading, body) pairs for each ## section.
|
|
85
|
+
*/
|
|
86
|
+
function splitSections(markdown) {
|
|
87
|
+
const results = [];
|
|
88
|
+
const regex = /^##\s+(.+)$/gm;
|
|
89
|
+
let match;
|
|
90
|
+
const indices = [];
|
|
91
|
+
while ((match = regex.exec(markdown)) !== null) {
|
|
92
|
+
indices.push({
|
|
93
|
+
heading: match[1],
|
|
94
|
+
start: match.index + match[0].length,
|
|
95
|
+
end: markdown.length, // will be narrowed below
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
for (let i = 0; i < indices.length; i++) {
|
|
99
|
+
if (i + 1 < indices.length) {
|
|
100
|
+
// Body runs until the next ## heading line starts
|
|
101
|
+
const nextHeadingPos = markdown.lastIndexOf('\n', markdown.indexOf(`## ${indices[i + 1].heading}`, indices[i].start));
|
|
102
|
+
indices[i].end = nextHeadingPos >= 0 ? nextHeadingPos : indices[i + 1].start;
|
|
103
|
+
}
|
|
104
|
+
results.push([indices[i].heading, markdown.slice(indices[i].start, indices[i].end)]);
|
|
105
|
+
}
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extracts bullet-list items (lines starting with - or *) from a block.
|
|
110
|
+
*/
|
|
111
|
+
function parseBulletList(text) {
|
|
112
|
+
const items = [];
|
|
113
|
+
for (const line of text.split('\n')) {
|
|
114
|
+
const m = line.match(/^\s*[-*]\s+(.+)/);
|
|
115
|
+
if (m) {
|
|
116
|
+
items.push(m[1].trim());
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return items;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Parses the IDENTITY section for name, description, and model prefs.
|
|
123
|
+
*/
|
|
124
|
+
function parseIdentitySection(body, result) {
|
|
125
|
+
// **Name:** value or Name: value
|
|
126
|
+
// Identity Name always takes precedence over H1 heading
|
|
127
|
+
const nameMatch = body.match(/\*?\*?Name:?\*?\*?\s*(.+)/i);
|
|
128
|
+
if (nameMatch) {
|
|
129
|
+
result.name = nameMatch[1].trim();
|
|
130
|
+
}
|
|
131
|
+
// **Description:** or **Role:**
|
|
132
|
+
const descMatch = body.match(/\*?\*?Description:?\*?\*?\s*(.+)/i) ??
|
|
133
|
+
body.match(/\*?\*?Role:?\*?\*?\s*(.+)/i);
|
|
134
|
+
if (descMatch) {
|
|
135
|
+
result.description = descMatch[1].trim();
|
|
136
|
+
}
|
|
137
|
+
// Model preference inside identity
|
|
138
|
+
parseModelHints(body, result);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Scans text for model-preference patterns and appends unique values.
|
|
142
|
+
*/
|
|
143
|
+
function parseModelHints(text, result) {
|
|
144
|
+
// Explicit **Model:** or **Preferred Model:** lines
|
|
145
|
+
const modelLine = text.match(/\*?\*?(?:Preferred\s+)?Model:?\*?\*?\s*(.+)/i);
|
|
146
|
+
if (modelLine) {
|
|
147
|
+
const models = modelLine[1]
|
|
148
|
+
.split(/[,;]/)
|
|
149
|
+
.map((m) => m.trim())
|
|
150
|
+
.filter((m) => m.length > 0);
|
|
151
|
+
for (const m of models) {
|
|
152
|
+
if (!result.modelPreferences.includes(m)) {
|
|
153
|
+
result.modelPreferences.push(m);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=agent-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-doc.js","sourceRoot":"","sources":["../../src/config/agent-doc.ts"],"names":[],"mappings":"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"}
|