@bradygaster/squad-sdk 0.9.0 → 0.9.2-insider.1
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 +44 -0
- package/dist/agents/history-shadow.d.ts +7 -5
- package/dist/agents/history-shadow.d.ts.map +1 -1
- package/dist/agents/history-shadow.js +39 -48
- package/dist/agents/history-shadow.js.map +1 -1
- package/dist/agents/index.d.ts +12 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +62 -9
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/lifecycle.d.ts +4 -0
- package/dist/agents/lifecycle.d.ts.map +1 -1
- package/dist/agents/lifecycle.js +6 -7
- package/dist/agents/lifecycle.js.map +1 -1
- package/dist/agents/onboarding.d.ts +4 -2
- package/dist/agents/onboarding.d.ts.map +1 -1
- package/dist/agents/onboarding.js +26 -16
- package/dist/agents/onboarding.js.map +1 -1
- package/dist/agents/personal.d.ts +2 -1
- package/dist/agents/personal.d.ts.map +1 -1
- package/dist/agents/personal.js +11 -12
- package/dist/agents/personal.js.map +1 -1
- package/dist/build/bundle.d.ts.map +1 -1
- package/dist/build/bundle.js +6 -6
- package/dist/build/bundle.js.map +1 -1
- package/dist/build/release.d.ts.map +1 -1
- package/dist/build/release.js +7 -5
- package/dist/build/release.js.map +1 -1
- package/dist/casting/index.d.ts.map +1 -1
- package/dist/casting/index.js +4 -3
- package/dist/casting/index.js.map +1 -1
- package/dist/config/agent-source.d.ts +5 -1
- package/dist/config/agent-source.d.ts.map +1 -1
- package/dist/config/agent-source.js +85 -41
- package/dist/config/agent-source.js.map +1 -1
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.d.ts.map +1 -1
- package/dist/config/init.js +84 -63
- package/dist/config/init.js.map +1 -1
- package/dist/config/legacy-fallback.d.ts +3 -2
- package/dist/config/legacy-fallback.d.ts.map +1 -1
- package/dist/config/legacy-fallback.js +16 -14
- package/dist/config/legacy-fallback.js.map +1 -1
- package/dist/config/models.d.ts +9 -6
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +35 -25
- package/dist/config/models.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/marketplace/packaging.d.ts.map +1 -1
- package/dist/marketplace/packaging.js +18 -16
- package/dist/marketplace/packaging.js.map +1 -1
- package/dist/multi-squad.d.ts.map +1 -1
- package/dist/multi-squad.js +10 -9
- package/dist/multi-squad.js.map +1 -1
- package/dist/platform/comms-file-log.d.ts.map +1 -1
- package/dist/platform/comms-file-log.js +7 -6
- package/dist/platform/comms-file-log.js.map +1 -1
- package/dist/platform/comms.d.ts.map +1 -1
- package/dist/platform/comms.js +6 -5
- package/dist/platform/comms.js.map +1 -1
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +4 -3
- package/dist/platform/index.js.map +1 -1
- package/dist/ralph/capabilities.d.ts +30 -1
- package/dist/ralph/capabilities.d.ts.map +1 -1
- package/dist/ralph/capabilities.js +51 -6
- package/dist/ralph/capabilities.js.map +1 -1
- package/dist/ralph/index.d.ts +1 -1
- package/dist/ralph/index.d.ts.map +1 -1
- package/dist/ralph/index.js +4 -3
- package/dist/ralph/index.js.map +1 -1
- package/dist/ralph/rate-limiting.d.ts.map +1 -1
- package/dist/ralph/rate-limiting.js +4 -4
- package/dist/ralph/rate-limiting.js.map +1 -1
- package/dist/remote/bridge.d.ts.map +1 -1
- package/dist/remote/bridge.js +2 -2
- package/dist/remote/bridge.js.map +1 -1
- package/dist/resolution.d.ts +9 -0
- package/dist/resolution.d.ts.map +1 -1
- package/dist/resolution.js +39 -16
- package/dist/resolution.js.map +1 -1
- package/dist/roles/catalog.d.ts +1 -1
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +8 -7
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/cross-squad.d.ts.map +1 -1
- package/dist/runtime/cross-squad.js +8 -7
- package/dist/runtime/cross-squad.js.map +1 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +8 -8
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/squad-observer.d.ts.map +1 -1
- package/dist/runtime/squad-observer.js +7 -4
- package/dist/runtime/squad-observer.js.map +1 -1
- package/dist/sharing/consult.d.ts +1 -1
- package/dist/sharing/consult.d.ts.map +1 -1
- package/dist/sharing/consult.js +66 -64
- package/dist/sharing/consult.js.map +1 -1
- package/dist/sharing/export.d.ts.map +1 -1
- package/dist/sharing/export.js +16 -16
- package/dist/sharing/export.js.map +1 -1
- package/dist/sharing/import.d.ts.map +1 -1
- package/dist/sharing/import.js +13 -12
- package/dist/sharing/import.js.map +1 -1
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +10 -9
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/skill-script-loader.d.ts.map +1 -1
- package/dist/skills/skill-script-loader.js +6 -4
- package/dist/skills/skill-script-loader.js.map +1 -1
- package/dist/skills/skill-source.d.ts +3 -1
- package/dist/skills/skill-source.d.ts.map +1 -1
- package/dist/skills/skill-source.js +18 -16
- package/dist/skills/skill-source.js.map +1 -1
- package/dist/state/collection-map.d.ts +43 -0
- package/dist/state/collection-map.d.ts.map +1 -0
- package/dist/state/collection-map.js +9 -0
- package/dist/state/collection-map.js.map +1 -0
- package/dist/state/collections.d.ts +102 -0
- package/dist/state/collections.d.ts.map +1 -0
- package/dist/state/collections.js +317 -0
- package/dist/state/collections.js.map +1 -0
- package/dist/state/domain-types.d.ts +122 -0
- package/dist/state/domain-types.d.ts.map +1 -0
- package/dist/state/domain-types.js +54 -0
- package/dist/state/domain-types.js.map +1 -0
- package/dist/state/handles.d.ts +16 -0
- package/dist/state/handles.d.ts.map +1 -0
- package/dist/state/handles.js +161 -0
- package/dist/state/handles.js.map +1 -0
- package/dist/state/index.d.ts +17 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +15 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/io/charter-io.d.ts +28 -0
- package/dist/state/io/charter-io.d.ts.map +1 -0
- package/dist/state/io/charter-io.js +94 -0
- package/dist/state/io/charter-io.js.map +1 -0
- package/dist/state/io/decisions-io.d.ts +42 -0
- package/dist/state/io/decisions-io.d.ts.map +1 -0
- package/dist/state/io/decisions-io.js +66 -0
- package/dist/state/io/decisions-io.js.map +1 -0
- package/dist/state/io/history-io.d.ts +37 -0
- package/dist/state/io/history-io.d.ts.map +1 -0
- package/dist/state/io/history-io.js +102 -0
- package/dist/state/io/history-io.js.map +1 -0
- package/dist/state/io/index.d.ts +19 -0
- package/dist/state/io/index.d.ts.map +1 -0
- package/dist/state/io/index.js +19 -0
- package/dist/state/io/index.js.map +1 -0
- package/dist/state/io/routing-io.d.ts +37 -0
- package/dist/state/io/routing-io.d.ts.map +1 -0
- package/dist/state/io/routing-io.js +99 -0
- package/dist/state/io/routing-io.js.map +1 -0
- package/dist/state/io/team-io.d.ts +46 -0
- package/dist/state/io/team-io.d.ts.map +1 -0
- package/dist/state/io/team-io.js +82 -0
- package/dist/state/io/team-io.js.map +1 -0
- package/dist/state/schema.d.ts +24 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +41 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/squad-state.d.ts +42 -0
- package/dist/state/squad-state.d.ts.map +1 -0
- package/dist/state/squad-state.js +68 -0
- package/dist/state/squad-state.js.map +1 -0
- package/dist/storage/fs-storage-provider.d.ts +60 -0
- package/dist/storage/fs-storage-provider.d.ts.map +1 -0
- package/dist/storage/fs-storage-provider.js +377 -0
- package/dist/storage/fs-storage-provider.js.map +1 -0
- package/dist/storage/in-memory-storage-provider.d.ts +46 -0
- package/dist/storage/in-memory-storage-provider.d.ts.map +1 -0
- package/dist/storage/in-memory-storage-provider.js +264 -0
- package/dist/storage/in-memory-storage-provider.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite-storage-provider.d.ts +95 -0
- package/dist/storage/sqlite-storage-provider.d.ts.map +1 -0
- package/dist/storage/sqlite-storage-provider.js +383 -0
- package/dist/storage/sqlite-storage-provider.js.map +1 -0
- package/dist/storage/storage-error.d.ts +28 -0
- package/dist/storage/storage-error.d.ts.map +1 -0
- package/dist/storage/storage-error.js +35 -0
- package/dist/storage/storage-error.js.map +1 -0
- package/dist/storage/storage-provider.d.ts +161 -0
- package/dist/storage/storage-provider.d.ts.map +1 -0
- package/dist/storage/storage-provider.js +18 -0
- package/dist/storage/storage-provider.js.map +1 -0
- package/dist/streams/resolver.d.ts.map +1 -1
- package/dist/streams/resolver.js +6 -5
- package/dist/streams/resolver.js.map +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +54 -15
- package/dist/tools/index.js.map +1 -1
- package/dist/upstream/resolver.d.ts +3 -2
- package/dist/upstream/resolver.d.ts.map +1 -1
- package/dist/upstream/resolver.js +33 -32
- package/dist/upstream/resolver.js.map +1 -1
- package/package.json +33 -1
- package/templates/scribe-charter.md +4 -0
- package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
- package/templates/skills/error-recovery/SKILL.md +99 -0
- package/templates/skills/iterative-retrieval/SKILL.md +165 -0
- package/templates/skills/notification-routing/SKILL.md +105 -0
- package/templates/skills/pr-screenshots/SKILL.md +149 -0
- package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
- package/templates/skills/reflect/SKILL.md +229 -0
- package/templates/skills/release-process/SKILL.md +84 -376
- package/templates/skills/retro-enforcement/SKILL.md +148 -0
- package/templates/skills/tiered-memory/SKILL.md +234 -0
- package/templates/skills/windows-compatibility/SKILL.md +24 -0
- package/templates/{squad.agent.md → squad.agent.md.template} +57 -28
- package/templates/workflows/squad-ci.yml +1 -1
- package/templates/workflows/squad-heartbeat.yml +0 -4
- package/templates/workflows/squad-insider-release.yml +1 -1
- package/templates/workflows/squad-preview.yml +1 -1
- package/templates/workflows/squad-release.yml +1 -1
package/README.md
CHANGED
|
@@ -207,6 +207,50 @@ const resumed = await client.resumeSession(
|
|
|
207
207
|
|
|
208
208
|
---
|
|
209
209
|
|
|
210
|
+
## Storage Abstraction
|
|
211
|
+
|
|
212
|
+
Squad separates I/O from business logic. All persistent storage — sessions, state, decisions, histories — flows through a pluggable `StorageProvider` interface. Swap the backend (filesystem, database, cloud) without touching orchestration code.
|
|
213
|
+
|
|
214
|
+
### Built-in Providers
|
|
215
|
+
|
|
216
|
+
| Provider | Use When |
|
|
217
|
+
|----------|----------|
|
|
218
|
+
| `FSStorageProvider` | Running on Node.js. Stores everything on disk. |
|
|
219
|
+
| `InMemoryStorageProvider` | Writing unit tests or running ephemeral sessions. |
|
|
220
|
+
| `SQLiteStorageProvider` | Need a single portable database file. Works on all platforms (runs on WASM). |
|
|
221
|
+
|
|
222
|
+
### Build Your Own
|
|
223
|
+
|
|
224
|
+
Implement the `StorageProvider` interface:
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import type { StorageProvider } from '@bradygaster/squad-sdk';
|
|
228
|
+
|
|
229
|
+
export class MyCloudStorageProvider implements StorageProvider {
|
|
230
|
+
async read(filePath: string): Promise<string | undefined> {
|
|
231
|
+
// Fetch from Azure Blob, S3, or your service
|
|
232
|
+
try {
|
|
233
|
+
return await this.client.getBlob(filePath);
|
|
234
|
+
} catch (e) {
|
|
235
|
+
if (e.code === 'NotFound') return undefined;
|
|
236
|
+
throw e;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async write(filePath: string, data: string): Promise<void> {
|
|
241
|
+
// Store to cloud
|
|
242
|
+
await this.client.putBlob(filePath, data);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Implement remaining methods: append, exists, list, delete, deleteDir, isDirectory, mkdir, rename, copy, stat
|
|
246
|
+
// + sync variants (deprecated in Wave 2)
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
See `storage-provider-azure` and `storage-provider-sqlite` samples for complete implementations.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
210
254
|
## The Casting Engine
|
|
211
255
|
|
|
212
256
|
Agents aren't `role-1`, `role-2`. They have names, personalities, and persistent identities across sessions. The casting engine assigns them automatically from a thematic universe.
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Shadows live at: .squad/agents/{name}/history.md
|
|
8
8
|
*/
|
|
9
|
+
import type { StorageProvider } from '../storage/storage-provider.js';
|
|
10
|
+
import type { SquadState } from '../state/squad-state.js';
|
|
9
11
|
/**
|
|
10
12
|
* Standard history sections that agents maintain.
|
|
11
13
|
*/
|
|
@@ -41,7 +43,7 @@ export interface ParsedHistory {
|
|
|
41
43
|
* @param initialContext - Initial context to seed the history
|
|
42
44
|
* @returns Path to created history shadow
|
|
43
45
|
*/
|
|
44
|
-
export declare function createHistoryShadow(teamRoot: string, agentName: string, initialContext?: string): Promise<string>;
|
|
46
|
+
export declare function createHistoryShadow(teamRoot: string, agentName: string, initialContext?: string, storage?: StorageProvider): Promise<string>;
|
|
45
47
|
/**
|
|
46
48
|
* Append content to a specific section of an agent's history shadow.
|
|
47
49
|
*
|
|
@@ -53,7 +55,7 @@ export declare function createHistoryShadow(teamRoot: string, agentName: string,
|
|
|
53
55
|
* @param section - Section to append to
|
|
54
56
|
* @param content - Content to append
|
|
55
57
|
*/
|
|
56
|
-
export declare function appendToHistory(teamRoot: string, agentName: string, section: HistorySection, content: string): Promise<void>;
|
|
58
|
+
export declare function appendToHistory(teamRoot: string, agentName: string, section: HistorySection, content: string, storage?: StorageProvider): Promise<void>;
|
|
57
59
|
/**
|
|
58
60
|
* Read and parse an agent's history shadow.
|
|
59
61
|
*
|
|
@@ -61,7 +63,7 @@ export declare function appendToHistory(teamRoot: string, agentName: string, sec
|
|
|
61
63
|
* @param agentName - Name of the agent
|
|
62
64
|
* @returns Parsed history with sections
|
|
63
65
|
*/
|
|
64
|
-
export declare function readHistory(teamRoot: string, agentName: string): Promise<ParsedHistory>;
|
|
66
|
+
export declare function readHistory(teamRoot: string, agentName: string, storage?: StorageProvider, state?: SquadState): Promise<ParsedHistory>;
|
|
65
67
|
/**
|
|
66
68
|
* Check if a history shadow exists for an agent.
|
|
67
69
|
*
|
|
@@ -69,12 +71,12 @@ export declare function readHistory(teamRoot: string, agentName: string): Promis
|
|
|
69
71
|
* @param agentName - Name of the agent
|
|
70
72
|
* @returns True if shadow exists
|
|
71
73
|
*/
|
|
72
|
-
export declare function shadowExists(teamRoot: string, agentName: string): Promise<boolean>;
|
|
74
|
+
export declare function shadowExists(teamRoot: string, agentName: string, storage?: StorageProvider): Promise<boolean>;
|
|
73
75
|
/**
|
|
74
76
|
* Delete a history shadow for an agent.
|
|
75
77
|
*
|
|
76
78
|
* @param teamRoot - Path to team root directory
|
|
77
79
|
* @param agentName - Name of the agent
|
|
78
80
|
*/
|
|
79
|
-
export declare function deleteHistoryShadow(teamRoot: string, agentName: string): Promise<void>;
|
|
81
|
+
export declare function deleteHistoryShadow(teamRoot: string, agentName: string, storage?: StorageProvider): Promise<void>;
|
|
80
82
|
//# sourceMappingURL=history-shadow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-shadow.d.ts","sourceRoot":"","sources":["../../src/agents/history-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"history-shadow.d.ts","sourceRoot":"","sources":["../../src/agents/history-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAyE1D;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,WAAW,GACX,WAAW,GACX,UAAU,GACV,QAAQ,GACR,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,MAAM,CAAC,CA8DjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAyC,EAClD,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,aAAa,CAAC,CAgExB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Shadows live at: .squad/agents/{name}/history.md
|
|
8
8
|
*/
|
|
9
|
-
import
|
|
9
|
+
import { FSStorageProvider } from '../storage/fs-storage-provider.js';
|
|
10
10
|
import * as path from 'path';
|
|
11
11
|
import { ConfigurationError } from '../adapter/errors.js';
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -15,7 +15,7 @@ import { ConfigurationError } from '../adapter/errors.js';
|
|
|
15
15
|
//
|
|
16
16
|
// Two layers of protection:
|
|
17
17
|
// 1. In-process async mutex (handles concurrent agents in one Node.js process)
|
|
18
|
-
// 2.
|
|
18
|
+
// 2. Write via StorageProvider (implementation determines durability guarantees)
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
/**
|
|
21
21
|
* Per-file async mutex. Keyed by resolved file path so concurrent calls
|
|
@@ -56,21 +56,13 @@ async function withFileLock(filePath, fn) {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
|
-
* Write
|
|
60
|
-
*
|
|
59
|
+
* Write file content via the StorageProvider abstraction.
|
|
60
|
+
* Previously used temp-file + rename for atomicity; now delegates to
|
|
61
|
+
* StorageProvider.write(). Race condition tracked in #479.
|
|
61
62
|
* @private
|
|
62
63
|
*/
|
|
63
|
-
async function atomicWriteFile(filePath, content) {
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
await fs.writeFile(tmpPath, content, 'utf-8');
|
|
67
|
-
await fs.rename(tmpPath, filePath);
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
// Clean up temp file on failure
|
|
71
|
-
await fs.unlink(tmpPath).catch(() => { });
|
|
72
|
-
throw err;
|
|
73
|
-
}
|
|
64
|
+
async function atomicWriteFile(storage, filePath, content) {
|
|
65
|
+
await storage.write(filePath, content);
|
|
74
66
|
}
|
|
75
67
|
/**
|
|
76
68
|
* Create a history shadow for an agent.
|
|
@@ -84,21 +76,16 @@ async function atomicWriteFile(filePath, content) {
|
|
|
84
76
|
* @param initialContext - Initial context to seed the history
|
|
85
77
|
* @returns Path to created history shadow
|
|
86
78
|
*/
|
|
87
|
-
export async function createHistoryShadow(teamRoot, agentName, initialContext) {
|
|
79
|
+
export async function createHistoryShadow(teamRoot, agentName, initialContext, storage = new FSStorageProvider()) {
|
|
88
80
|
try {
|
|
89
81
|
const shadowDir = path.join(teamRoot, '.squad', 'agents', agentName);
|
|
90
82
|
const shadowPath = path.join(shadowDir, 'history.md');
|
|
91
|
-
// Ensure directory exists
|
|
92
|
-
await fs.mkdir(shadowDir, { recursive: true });
|
|
93
83
|
// Check if shadow already exists
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
// StorageProvider.write() creates parent dirs, so no explicit mkdir needed
|
|
85
|
+
if (await storage.exists(shadowPath)) {
|
|
96
86
|
// Shadow exists, return path without overwriting
|
|
97
87
|
return shadowPath;
|
|
98
88
|
}
|
|
99
|
-
catch {
|
|
100
|
-
// Shadow doesn't exist, create it
|
|
101
|
-
}
|
|
102
89
|
// Create initial shadow content
|
|
103
90
|
const timestamp = new Date().toISOString();
|
|
104
91
|
const initialContent = `# ${capitalize(agentName)} — Session History
|
|
@@ -132,7 +119,7 @@ ${initialContext || 'No initial context provided.'}
|
|
|
132
119
|
|
|
133
120
|
<!-- Important files, documentation, or external resources -->
|
|
134
121
|
`;
|
|
135
|
-
await
|
|
122
|
+
await storage.write(shadowPath, initialContent);
|
|
136
123
|
return shadowPath;
|
|
137
124
|
}
|
|
138
125
|
catch (error) {
|
|
@@ -155,23 +142,20 @@ ${initialContext || 'No initial context provided.'}
|
|
|
155
142
|
* @param section - Section to append to
|
|
156
143
|
* @param content - Content to append
|
|
157
144
|
*/
|
|
158
|
-
export async function appendToHistory(teamRoot, agentName, section, content) {
|
|
145
|
+
export async function appendToHistory(teamRoot, agentName, section, content, storage = new FSStorageProvider()) {
|
|
159
146
|
try {
|
|
160
147
|
const shadowPath = path.join(teamRoot, '.squad', 'agents', agentName, 'history.md');
|
|
161
148
|
// Acquire file lock before the read-modify-write cycle (#479)
|
|
162
149
|
await withFileLock(shadowPath, async () => {
|
|
163
150
|
// Read existing history (inside lock to prevent races)
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
historyContent = await fs.readFile(shadowPath, 'utf-8');
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
151
|
+
const historyContent = await storage.read(shadowPath);
|
|
152
|
+
if (historyContent === undefined) {
|
|
169
153
|
throw new ConfigurationError(`History shadow not found for agent '${agentName}'. Create it first with createHistoryShadow().`, {
|
|
170
154
|
agentName,
|
|
171
155
|
operation: 'appendToHistory',
|
|
172
156
|
timestamp: new Date(),
|
|
173
157
|
metadata: { shadowPath },
|
|
174
|
-
}
|
|
158
|
+
});
|
|
175
159
|
}
|
|
176
160
|
// Find section or create it
|
|
177
161
|
const sectionHeader = `## ${section}`;
|
|
@@ -191,8 +175,8 @@ export async function appendToHistory(teamRoot, agentName, section, content) {
|
|
|
191
175
|
// Section doesn't exist, create it at the end
|
|
192
176
|
updatedContent = historyContent.trimEnd() + `\n\n${sectionHeader}${entry}`;
|
|
193
177
|
}
|
|
194
|
-
//
|
|
195
|
-
await atomicWriteFile(shadowPath, updatedContent);
|
|
178
|
+
// Write via StorageProvider (serialized by in-process file lock)
|
|
179
|
+
await atomicWriteFile(storage, shadowPath, updatedContent);
|
|
196
180
|
});
|
|
197
181
|
}
|
|
198
182
|
catch (error) {
|
|
@@ -214,14 +198,27 @@ export async function appendToHistory(teamRoot, agentName, section, content) {
|
|
|
214
198
|
* @param agentName - Name of the agent
|
|
215
199
|
* @returns Parsed history with sections
|
|
216
200
|
*/
|
|
217
|
-
export async function readHistory(teamRoot, agentName) {
|
|
201
|
+
export async function readHistory(teamRoot, agentName, storage = new FSStorageProvider(), state) {
|
|
218
202
|
try {
|
|
219
203
|
const shadowPath = path.join(teamRoot, '.squad', 'agents', agentName, 'history.md');
|
|
204
|
+
// Use SquadState agents collection when available
|
|
220
205
|
let historyContent;
|
|
221
|
-
|
|
222
|
-
|
|
206
|
+
if (state) {
|
|
207
|
+
try {
|
|
208
|
+
const entries = await state.agents.get(agentName).history();
|
|
209
|
+
// If entries were returned, the file exists; read raw content via SP
|
|
210
|
+
// (ParsedHistory needs the full content, not just entries)
|
|
211
|
+
historyContent = await storage.read(shadowPath);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Agent not found via state — fall through to raw SP
|
|
215
|
+
historyContent = await storage.read(shadowPath);
|
|
216
|
+
}
|
|
223
217
|
}
|
|
224
|
-
|
|
218
|
+
else {
|
|
219
|
+
historyContent = await storage.read(shadowPath);
|
|
220
|
+
}
|
|
221
|
+
if (historyContent === undefined) {
|
|
225
222
|
// Shadow doesn't exist yet, return empty
|
|
226
223
|
return {
|
|
227
224
|
fullContent: '',
|
|
@@ -264,15 +261,9 @@ export async function readHistory(teamRoot, agentName) {
|
|
|
264
261
|
* @param agentName - Name of the agent
|
|
265
262
|
* @returns True if shadow exists
|
|
266
263
|
*/
|
|
267
|
-
export async function shadowExists(teamRoot, agentName) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
await fs.access(shadowPath);
|
|
271
|
-
return true;
|
|
272
|
-
}
|
|
273
|
-
catch {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
264
|
+
export async function shadowExists(teamRoot, agentName, storage = new FSStorageProvider()) {
|
|
265
|
+
const shadowPath = path.join(teamRoot, '.squad', 'agents', agentName, 'history.md');
|
|
266
|
+
return storage.exists(shadowPath);
|
|
276
267
|
}
|
|
277
268
|
/**
|
|
278
269
|
* Delete a history shadow for an agent.
|
|
@@ -280,10 +271,10 @@ export async function shadowExists(teamRoot, agentName) {
|
|
|
280
271
|
* @param teamRoot - Path to team root directory
|
|
281
272
|
* @param agentName - Name of the agent
|
|
282
273
|
*/
|
|
283
|
-
export async function deleteHistoryShadow(teamRoot, agentName) {
|
|
274
|
+
export async function deleteHistoryShadow(teamRoot, agentName, storage = new FSStorageProvider()) {
|
|
284
275
|
try {
|
|
285
276
|
const shadowPath = path.join(teamRoot, '.squad', 'agents', agentName, 'history.md');
|
|
286
|
-
await
|
|
277
|
+
await storage.delete(shadowPath);
|
|
287
278
|
}
|
|
288
279
|
catch (error) {
|
|
289
280
|
throw new ConfigurationError(`Failed to delete history shadow for agent '${agentName}': ${error instanceof Error ? error.message : String(error)}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-shadow.js","sourceRoot":"","sources":["../../src/agents/history-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"history-shadow.js","sourceRoot":"","sources":["../../src/agents/history-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,8EAA8E;AAC9E,sEAAsE;AACtE,qDAAqD;AACrD,EAAE;AACF,4BAA4B;AAC5B,iFAAiF;AACjF,mFAAmF;AACnF,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEnD;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY,CACzB,QAAgB,EAChB,EAAoB;IAEpB,iEAAiE;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,mDAAmD;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAErD,IAAI,WAAwB,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QACvC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEzB,0CAA0C;IAC1C,MAAM,IAAI,CAAC;IAEX,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,WAAW,EAAE,CAAC;QACd,2CAA2C;QAC3C,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAChC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAC5B,OAAwB,EACxB,QAAgB,EAChB,OAAe;IAEf,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAiCD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,SAAiB,EACjB,cAAuB,EACvB,UAA2B,IAAI,iBAAiB,EAAE;IAElD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEtD,iCAAiC;QACjC,2EAA2E;QAC3E,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,iDAAiD;YACjD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,KAAK,UAAU,CAAC,SAAS,CAAC;;uDAEE,SAAS;;;eAGjD,SAAS;;;;EAItB,cAAc,IAAI,8BAA8B;;;;;;;;;;;;;;;;;;;;;CAqBjD,CAAC;QAEE,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAEhD,OAAO,UAAU,CAAC;IAEpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,8CAA8C,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrH;YACE,SAAS;YACT,SAAS,EAAE,qBAAqB;YAChC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,EAAE,QAAQ,EAAE;SACvB,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,SAAiB,EACjB,OAAuB,EACvB,OAAe,EACf,UAA2B,IAAI,iBAAiB,EAAE;IAElD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEpF,8DAA8D;QAC9D,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACxC,uDAAuD;YACvD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,kBAAkB,CAC1B,uCAAuC,SAAS,gDAAgD,EAChG;oBACE,SAAS;oBACT,SAAS,EAAE,iBAAiB;oBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,QAAQ,EAAE,EAAE,UAAU,EAAE;iBACzB,CACF,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,MAAM,aAAa,GAAG,MAAM,OAAO,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,iCAAiC,EAAE,GAAG,CAAC,CAAC;YACzF,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAEjD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YACvE,MAAM,KAAK,GAAG,SAAS,SAAS,OAAO,OAAO,IAAI,CAAC;YAEnD,IAAI,cAAsB,CAAC;YAE3B,IAAI,KAAK,EAAE,CAAC;gBACV,+BAA+B;gBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,cAAc,GAAG,GAAG,aAAa,KAAK,cAAe,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;gBAChF,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,cAAc,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,OAAO,aAAa,GAAG,KAAK,EAAE,CAAC;YAC7E,CAAC;YAED,iEAAiE;YACjE,MAAM,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,0CAA0C,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACjH;YACE,SAAS;YACT,SAAS,EAAE,iBAAiB;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAChC,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,SAAiB,EACjB,UAA2B,IAAI,iBAAiB,EAAE,EAClD,KAAkB;IAElB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEpF,kDAAkD;QAClD,IAAI,cAAkC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5D,qEAAqE;gBACrE,2DAA2D;gBAC3D,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,qDAAqD;gBACrD,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,yCAAyC;YACzC,OAAO;gBACL,WAAW,EAAE,EAAE;aAChB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAkB;YAC5B,WAAW,EAAE,cAAc;SAC5B,CAAC;QAEF,mBAAmB;QACnB,MAAM,QAAQ,GAAwC;YACpD,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,YAAY;SAC3B,CAAC;QAEF,KAAK,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,UAAU,WAAW,iCAAiC,EAAE,GAAG,CAAC,CAAC;YAC7F,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAEjD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,qCAAqC,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC5G;YACE,SAAS;YACT,SAAS,EAAE,aAAa;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,EAAE,QAAQ,EAAE;SACvB,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,SAAiB,EACjB,UAA2B,IAAI,iBAAiB,EAAE;IAElD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACpF,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,SAAiB,EACjB,UAA2B,IAAI,iBAAiB,EAAE;IAElD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACpF,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,8CAA8C,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrH;YACE,SAAS;YACT,SAAS,EAAE,qBAAqB;YAChC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,EAAE,QAAQ,EAAE;SACvB,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
package/dist/agents/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* Compiles charter.md files into SDK CustomAgentConfig objects.
|
|
6
6
|
* Injects dynamic context via session hooks instead of string templates.
|
|
7
7
|
*/
|
|
8
|
+
import type { StorageProvider } from '../storage/storage-provider.js';
|
|
9
|
+
import type { SquadState } from '../state/squad-state.js';
|
|
8
10
|
import { EventBus } from '../client/event-bus.js';
|
|
9
11
|
export { compileCharter, compileCharterFull, parseCharterMarkdown, type CharterCompileOptions, type CharterConfigOverrides, type ParsedCharter, type CompiledCharter, } from './charter-compiler.js';
|
|
10
12
|
export { resolveModel, inferTierFromModel, isTierFallbackAllowed, ModelFallbackExecutor, type ModelResolutionOptions, type ResolvedModel, type TaskType, type ModelTier, type ModelResolutionSource, type FallbackExecutorConfig, type FallbackAttempt, type FallbackResult, } from './model-selector.js';
|
|
@@ -43,14 +45,23 @@ export interface AgentSessionInfo {
|
|
|
43
45
|
responseMode: 'lightweight' | 'standard' | 'full';
|
|
44
46
|
}
|
|
45
47
|
export declare class CharterCompiler {
|
|
48
|
+
private storage;
|
|
49
|
+
private state?;
|
|
50
|
+
constructor(storage?: StorageProvider, state?: SquadState);
|
|
46
51
|
/**
|
|
47
52
|
* Load and compile a charter.md file into an AgentCharter.
|
|
48
53
|
* Parses identity/model sections from markdown.
|
|
49
54
|
*/
|
|
50
55
|
compile(charterPath: string): Promise<AgentCharter>;
|
|
56
|
+
/**
|
|
57
|
+
* Compile a charter from an agent name using SquadState.
|
|
58
|
+
* Reads the charter via the typed agents collection.
|
|
59
|
+
*/
|
|
60
|
+
compileByName(agentName: string): Promise<AgentCharter>;
|
|
51
61
|
/**
|
|
52
62
|
* Load all charters from the team directory.
|
|
53
|
-
*
|
|
63
|
+
* When SquadState is available, uses the typed agents collection.
|
|
64
|
+
* Otherwise scans .squad/agents/{name}/charter.md, skipping scribe and _alumni.
|
|
54
65
|
*/
|
|
55
66
|
compileAll(teamRoot: string): Promise<AgentCharter[]>;
|
|
56
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/index.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Compiles charter.md files into SDK CustomAgentConfig objects.
|
|
6
6
|
* Injects dynamic context via session hooks instead of string templates.
|
|
7
7
|
*/
|
|
8
|
-
import { readFile, readdir } from 'node:fs/promises';
|
|
9
8
|
import { join, dirname, basename } from 'node:path';
|
|
9
|
+
import { FSStorageProvider } from '../storage/fs-storage-provider.js';
|
|
10
10
|
import { randomUUID } from 'node:crypto';
|
|
11
11
|
import { parseCharterMarkdown } from './charter-compiler.js';
|
|
12
12
|
import { trace, SpanStatusCode } from '../runtime/otel-api.js';
|
|
@@ -26,12 +26,21 @@ export { onboardAgent, addAgentToConfig, } from './onboarding.js';
|
|
|
26
26
|
export { resolvePersonalAgents, mergeSessionCast, } from './personal.js';
|
|
27
27
|
// --- Charter Compiler ---
|
|
28
28
|
export class CharterCompiler {
|
|
29
|
+
storage;
|
|
30
|
+
state;
|
|
31
|
+
constructor(storage = new FSStorageProvider(), state) {
|
|
32
|
+
this.storage = storage;
|
|
33
|
+
this.state = state;
|
|
34
|
+
}
|
|
29
35
|
/**
|
|
30
36
|
* Load and compile a charter.md file into an AgentCharter.
|
|
31
37
|
* Parses identity/model sections from markdown.
|
|
32
38
|
*/
|
|
33
39
|
async compile(charterPath) {
|
|
34
|
-
const content = await
|
|
40
|
+
const content = await this.storage.read(charterPath);
|
|
41
|
+
if (content === undefined) {
|
|
42
|
+
throw new Error(`Charter file not found: ${charterPath}`);
|
|
43
|
+
}
|
|
35
44
|
const parsed = parseCharterMarkdown(content);
|
|
36
45
|
const name = parsed.identity.name ?? basename(dirname(charterPath));
|
|
37
46
|
const role = parsed.identity.role ?? '';
|
|
@@ -48,20 +57,64 @@ export class CharterCompiler {
|
|
|
48
57
|
modelPreference: parsed.modelPreference,
|
|
49
58
|
};
|
|
50
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Compile a charter from an agent name using SquadState.
|
|
62
|
+
* Reads the charter via the typed agents collection.
|
|
63
|
+
*/
|
|
64
|
+
async compileByName(agentName) {
|
|
65
|
+
if (!this.state) {
|
|
66
|
+
throw new Error('compileByName requires SquadState — pass state to CharterCompiler constructor');
|
|
67
|
+
}
|
|
68
|
+
const content = await this.state.agents.get(agentName).charter();
|
|
69
|
+
const parsed = parseCharterMarkdown(content);
|
|
70
|
+
const name = parsed.identity.name ?? agentName;
|
|
71
|
+
const role = parsed.identity.role ?? '';
|
|
72
|
+
const expertise = parsed.identity.expertise ?? [];
|
|
73
|
+
const style = parsed.identity.style ?? '';
|
|
74
|
+
const displayName = `${name} — ${role}`;
|
|
75
|
+
return {
|
|
76
|
+
name: name.toLowerCase(),
|
|
77
|
+
displayName,
|
|
78
|
+
role,
|
|
79
|
+
expertise,
|
|
80
|
+
style,
|
|
81
|
+
prompt: content,
|
|
82
|
+
modelPreference: parsed.modelPreference,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
51
85
|
/**
|
|
52
86
|
* Load all charters from the team directory.
|
|
53
|
-
*
|
|
87
|
+
* When SquadState is available, uses the typed agents collection.
|
|
88
|
+
* Otherwise scans .squad/agents/{name}/charter.md, skipping scribe and _alumni.
|
|
54
89
|
*/
|
|
55
90
|
async compileAll(teamRoot) {
|
|
91
|
+
// Use SquadState agents collection when available
|
|
92
|
+
if (this.state) {
|
|
93
|
+
const names = await this.state.agents.list();
|
|
94
|
+
const charters = [];
|
|
95
|
+
for (const name of names) {
|
|
96
|
+
if (name === 'scribe' || name.startsWith('_'))
|
|
97
|
+
continue;
|
|
98
|
+
try {
|
|
99
|
+
charters.push(await this.compileByName(name));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Skip agents without a valid charter.md
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return charters;
|
|
106
|
+
}
|
|
107
|
+
// Fallback: raw StorageProvider scan
|
|
56
108
|
const agentsDir = join(teamRoot, '.squad', 'agents');
|
|
57
|
-
|
|
109
|
+
if (!await this.storage.exists(agentsDir)) {
|
|
110
|
+
throw new Error(`Agents directory not found: ${agentsDir}`);
|
|
111
|
+
}
|
|
112
|
+
const entries = await this.storage.list(agentsDir);
|
|
58
113
|
const charters = [];
|
|
59
|
-
for (const
|
|
60
|
-
if (
|
|
61
|
-
continue;
|
|
62
|
-
if (entry.name === 'scribe' || entry.name.startsWith('_'))
|
|
114
|
+
for (const name of entries) {
|
|
115
|
+
if (name === 'scribe' || name.startsWith('_'))
|
|
63
116
|
continue;
|
|
64
|
-
const charterPath = join(agentsDir,
|
|
117
|
+
const charterPath = join(agentsDir, name, 'charter.md');
|
|
65
118
|
try {
|
|
66
119
|
charters.push(await this.compile(charterPath));
|
|
67
120
|
}
|
package/dist/agents/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { SquadClientWithPool } from '../client/index.js';
|
|
10
10
|
import { type TaskType } from './model-selector.js';
|
|
11
|
+
import type { StorageProvider } from '../storage/storage-provider.js';
|
|
11
12
|
/**
|
|
12
13
|
* Agent handle status.
|
|
13
14
|
*/
|
|
@@ -69,6 +70,8 @@ export interface LifecycleManagerConfig {
|
|
|
69
70
|
client: SquadClientWithPool;
|
|
70
71
|
/** Path to team root directory */
|
|
71
72
|
teamRoot: string;
|
|
73
|
+
/** Storage provider for file I/O (default: FSStorageProvider) */
|
|
74
|
+
storage?: StorageProvider;
|
|
72
75
|
/** Default idle timeout (default: 5 minutes) */
|
|
73
76
|
defaultIdleTimeout?: number;
|
|
74
77
|
}
|
|
@@ -81,6 +84,7 @@ export interface LifecycleManagerConfig {
|
|
|
81
84
|
export declare class AgentLifecycleManager {
|
|
82
85
|
private client;
|
|
83
86
|
private teamRoot;
|
|
87
|
+
private storage;
|
|
84
88
|
private defaultIdleTimeout;
|
|
85
89
|
private agents;
|
|
86
90
|
private idleCheckTimer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/agents/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAA6C,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/agents/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAA6C,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMtE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAEjF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,uCAAuC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,iDAAiD;IACjD,cAAc,EAAE,IAAI,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAElB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IAEb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAE5B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IAEjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,sBAAsB;IAU1C;;;;;;;;;;;;;OAaG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAsGlE;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtD;;;;OAIG;IACH,UAAU,IAAI,WAAW,EAAE;IAM3B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIpD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB/B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAI/B"}
|
package/dist/agents/lifecycle.js
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
import { compileCharter } from './charter-compiler.js';
|
|
10
10
|
import { resolveModel } from './model-selector.js';
|
|
11
11
|
import { ConfigurationError, SessionLifecycleError } from '../adapter/errors.js';
|
|
12
|
-
import * as fs from 'fs/promises';
|
|
13
12
|
import * as path from 'path';
|
|
13
|
+
import { FSStorageProvider } from '../storage/fs-storage-provider.js';
|
|
14
14
|
import { trace, SpanStatusCode } from '../runtime/otel-api.js';
|
|
15
15
|
import { recordAgentSpawn, recordAgentDestroy, recordAgentError } from '../runtime/otel-metrics.js';
|
|
16
16
|
const tracer = trace.getTracer('squad-sdk');
|
|
@@ -23,12 +23,14 @@ const tracer = trace.getTracer('squad-sdk');
|
|
|
23
23
|
export class AgentLifecycleManager {
|
|
24
24
|
client;
|
|
25
25
|
teamRoot;
|
|
26
|
+
storage;
|
|
26
27
|
defaultIdleTimeout;
|
|
27
28
|
agents = new Map();
|
|
28
29
|
idleCheckTimer = null;
|
|
29
30
|
constructor(config) {
|
|
30
31
|
this.client = config.client;
|
|
31
32
|
this.teamRoot = config.teamRoot;
|
|
33
|
+
this.storage = config.storage ?? new FSStorageProvider();
|
|
32
34
|
this.defaultIdleTimeout = config.defaultIdleTimeout ?? 300_000; // 5 minutes
|
|
33
35
|
// Start idle timeout checker
|
|
34
36
|
this.startIdleChecker();
|
|
@@ -55,17 +57,14 @@ export class AgentLifecycleManager {
|
|
|
55
57
|
try {
|
|
56
58
|
// Step 1: Read charter.md
|
|
57
59
|
const charterPath = path.join(this.teamRoot, '.ai-team', 'agents', agentName, 'charter.md');
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
charterContent = await fs.readFile(charterPath, 'utf-8');
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
60
|
+
const charterContent = await this.storage.read(charterPath);
|
|
61
|
+
if (charterContent === undefined) {
|
|
63
62
|
throw new ConfigurationError(`Charter not found for agent '${agentName}' at ${charterPath}`, {
|
|
64
63
|
agentName,
|
|
65
64
|
operation: 'spawnAgent',
|
|
66
65
|
timestamp: new Date(),
|
|
67
66
|
metadata: { charterPath },
|
|
68
|
-
}
|
|
67
|
+
});
|
|
69
68
|
}
|
|
70
69
|
// Step 2: Compile charter
|
|
71
70
|
const compileOptions = {
|