macro-agent 0.1.11 → 0.1.12
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/dist/teams/seed-defaults.d.ts.map +1 -1
- package/dist/teams/seed-defaults.js +6 -2
- package/dist/teams/seed-defaults.js.map +1 -1
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +17 -1
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/workspace/dataplane-adapter.d.ts +260 -0
- package/dist/workspace/dataplane-adapter.d.ts.map +1 -0
- package/dist/workspace/dataplane-adapter.js +416 -0
- package/dist/workspace/dataplane-adapter.js.map +1 -0
- package/package.json +1 -2
- package/src/teams/seed-defaults.ts +6 -2
- package/src/teams/team-loader.ts +18 -1
- package/src/workspace/__tests__/self-driving-yaml.test.ts +10 -2
- package/templates/teams/self-driving/team.yaml +142 -0
- package/tsconfig.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-defaults.d.ts","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"seed-defaults.d.ts","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiC9E"}
|
|
@@ -11,9 +11,13 @@ import * as fs from "fs";
|
|
|
11
11
|
import * as path from "path";
|
|
12
12
|
import { fileURLToPath } from "url";
|
|
13
13
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
-
// Package root: up from src/teams/ → src/ → package root
|
|
14
|
+
// Package root: up from src/teams/ → src/ → package root.
|
|
15
|
+
// Bundled templates live under `templates/teams/` so they're clearly shipped
|
|
16
|
+
// assets (not confused with user runtime config, which lives at
|
|
17
|
+
// `<project>/.multiagent/teams/` — a gitignored directory that this module
|
|
18
|
+
// seeds INTO on first use).
|
|
15
19
|
const PACKAGE_ROOT = path.resolve(__dirname, "..", "..");
|
|
16
|
-
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "
|
|
20
|
+
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "templates", "teams");
|
|
17
21
|
const TEAMS_DIR = ".multiagent/teams";
|
|
18
22
|
/**
|
|
19
23
|
* Copy bundled default team templates to the project's .multiagent/teams/ directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-defaults.js","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,
|
|
1
|
+
{"version":3,"file":"seed-defaults.js","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,0DAA0D;AAC1D,6EAA6E;AAC7E,gEAAgE;AAChE,2EAA2E;AAC3E,4BAA4B;AAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AACxE,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,kDAAkD;IAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,MAAM,CAAC;IAErD,IAAI,gBAA6B,CAAC;IAClC,IAAI,CAAC;QACH,gBAAgB,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC1E,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEjD,iCAAiC;IACjC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;QAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAAE,SAAS,CAAC,kBAAkB;QAEnE,kDAAkD;QAClD,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,IAAI,CAAC,EAC9C,kBAAkB,CACnB,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACjD,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-loader.d.ts","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"team-loader.d.ts","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAC;AAqBpB;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAqFvB"}
|
|
@@ -6,13 +6,23 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module teams/team-loader
|
|
8
8
|
*/
|
|
9
|
+
import * as fs from "fs";
|
|
9
10
|
import * as path from "path";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
10
12
|
import { TemplateLoader } from "openteams";
|
|
11
13
|
import { TeamLoadError, } from "./types.js";
|
|
12
14
|
// =============================================================================
|
|
13
15
|
// Constants
|
|
14
16
|
// =============================================================================
|
|
15
17
|
const TEAMS_DIR = ".multiagent/teams";
|
|
18
|
+
// Bundled team templates shipped with the macro-agent package. Used as a
|
|
19
|
+
// fallback when a team name isn't present in the user's `.multiagent/teams/`
|
|
20
|
+
// — so a fresh project can `startTeam('self-driving', cwd)` without first
|
|
21
|
+
// running the seed step. User-local copies always win when present.
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = path.dirname(__filename);
|
|
24
|
+
const PACKAGE_ROOT = path.resolve(__dirname, "..", "..");
|
|
25
|
+
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "templates", "teams");
|
|
16
26
|
// =============================================================================
|
|
17
27
|
// TeamLoader
|
|
18
28
|
// =============================================================================
|
|
@@ -30,7 +40,13 @@ const TEAMS_DIR = ".multiagent/teams";
|
|
|
30
40
|
*/
|
|
31
41
|
export async function loadTeam(teamName, roleRegistry, basePath) {
|
|
32
42
|
const root = basePath ?? process.cwd();
|
|
33
|
-
const
|
|
43
|
+
const userTeamDir = path.join(root, TEAMS_DIR, teamName);
|
|
44
|
+
// Prefer a user-customised template; fall back to the bundled default
|
|
45
|
+
// shipped under `<package>/templates/teams/<name>/`. This lets fresh
|
|
46
|
+
// projects use built-in teams without an explicit seed step, while
|
|
47
|
+
// still honouring per-project overrides.
|
|
48
|
+
const bundledTeamDir = path.join(BUNDLED_TEAMS_DIR, teamName);
|
|
49
|
+
const teamDir = fs.existsSync(userTeamDir) ? userTeamDir : bundledTeamDir;
|
|
34
50
|
// 1. Load via openteams TemplateLoader with hooks
|
|
35
51
|
let template;
|
|
36
52
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-loader.js","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAM3C,OAAO,EACL,aAAa,GAMd,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,YAA0B,EAC1B,QAAiB;IAEjB,MAAM,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,
|
|
1
|
+
{"version":3,"file":"team-loader.js","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataplane Adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps MultiAgentRepoTracker to integrate with macro-agent's event system
|
|
5
|
+
* and provide a simplified interface for workspace management.
|
|
6
|
+
*
|
|
7
|
+
* @module workspace/dataplane-adapter
|
|
8
|
+
* @implements [[s-7ktd]] Dataplane Integration section
|
|
9
|
+
*/
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
import { MultiAgentRepoTracker, type Stream, type StreamStatus, type CreateStreamOptions, type AgentWorktree, type CreateWorktreeOptions, type WorkerTask, type CreateTaskOptions, type StartTaskOptions, type CompleteTaskOptions, type StartTaskResult, type CompleteTaskResult, type ListTasksOptions, type CleanupWorkerBranchesOptions, type CleanupResult, type Checkpoint } from 'git-cascade';
|
|
12
|
+
import type { DataplaneConfig } from './config.js';
|
|
13
|
+
/**
|
|
14
|
+
* Event types emitted by DataplaneAdapter
|
|
15
|
+
*/
|
|
16
|
+
export type DataplaneEventType = 'stream:created' | 'stream:updated' | 'stream:abandoned' | 'worktree:created' | 'worktree:deallocated' | 'task:created' | 'task:started' | 'task:completed' | 'task:abandoned';
|
|
17
|
+
/**
|
|
18
|
+
* Event payload for dataplane events
|
|
19
|
+
*/
|
|
20
|
+
export interface DataplaneEvent {
|
|
21
|
+
type: DataplaneEventType;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Callback for dataplane events
|
|
27
|
+
*/
|
|
28
|
+
export type DataplaneEventCallback = (event: DataplaneEvent) => void;
|
|
29
|
+
/**
|
|
30
|
+
* DataplaneAdapter wraps MultiAgentRepoTracker for macro-agent integration.
|
|
31
|
+
*
|
|
32
|
+
* Key responsibilities:
|
|
33
|
+
* - Initialize dataplane with shared or dedicated database
|
|
34
|
+
* - Emit events on dataplane operations
|
|
35
|
+
* - Provide simplified API for workspace management
|
|
36
|
+
*/
|
|
37
|
+
export declare class DataplaneAdapter {
|
|
38
|
+
private readonly tracker;
|
|
39
|
+
private readonly config;
|
|
40
|
+
private readonly eventListeners;
|
|
41
|
+
private readonly ownsDb;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new DataplaneAdapter.
|
|
44
|
+
*
|
|
45
|
+
* @param config - Dataplane configuration
|
|
46
|
+
*/
|
|
47
|
+
constructor(config: DataplaneConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Get whether dataplane is enabled.
|
|
50
|
+
*/
|
|
51
|
+
get enabled(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get the repository path.
|
|
54
|
+
*/
|
|
55
|
+
get repoPath(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Get the underlying database connection.
|
|
58
|
+
* Use with caution - prefer adapter methods for operations.
|
|
59
|
+
*/
|
|
60
|
+
get db(): Database.Database;
|
|
61
|
+
/**
|
|
62
|
+
* Get the underlying tracker.
|
|
63
|
+
* Use with caution - prefer adapter methods for operations.
|
|
64
|
+
*/
|
|
65
|
+
get rawTracker(): MultiAgentRepoTracker;
|
|
66
|
+
/**
|
|
67
|
+
* Subscribe to dataplane events.
|
|
68
|
+
*
|
|
69
|
+
* @param callback - Function called when events occur
|
|
70
|
+
* @returns Unsubscribe function
|
|
71
|
+
*/
|
|
72
|
+
onEvent(callback: DataplaneEventCallback): () => void;
|
|
73
|
+
/**
|
|
74
|
+
* Emit an event to all listeners.
|
|
75
|
+
*/
|
|
76
|
+
private emit;
|
|
77
|
+
/**
|
|
78
|
+
* Create a new stream (integration branch).
|
|
79
|
+
*
|
|
80
|
+
* @param options - Stream creation options
|
|
81
|
+
* @returns Stream ID
|
|
82
|
+
*/
|
|
83
|
+
createStream(options: CreateStreamOptions): string;
|
|
84
|
+
/**
|
|
85
|
+
* Get a stream by ID.
|
|
86
|
+
*/
|
|
87
|
+
getStream(streamId: string): Stream | null;
|
|
88
|
+
/**
|
|
89
|
+
* List streams with optional filters.
|
|
90
|
+
*/
|
|
91
|
+
listStreams(options?: {
|
|
92
|
+
agentId?: string;
|
|
93
|
+
status?: StreamStatus;
|
|
94
|
+
}): Stream[];
|
|
95
|
+
/**
|
|
96
|
+
* Update a stream.
|
|
97
|
+
*/
|
|
98
|
+
updateStream(streamId: string, updates: Partial<Pick<Stream, 'name' | 'status' | 'metadata'>>): void;
|
|
99
|
+
/**
|
|
100
|
+
* Abandon a stream.
|
|
101
|
+
*/
|
|
102
|
+
abandonStream(streamId: string, options?: {
|
|
103
|
+
reason?: string;
|
|
104
|
+
cascade?: boolean;
|
|
105
|
+
}): void;
|
|
106
|
+
/**
|
|
107
|
+
* Get the git branch name for a stream.
|
|
108
|
+
*/
|
|
109
|
+
getStreamBranchName(streamId: string): string;
|
|
110
|
+
/**
|
|
111
|
+
* Get the HEAD commit of a stream.
|
|
112
|
+
*/
|
|
113
|
+
getStreamHead(streamId: string): string;
|
|
114
|
+
/**
|
|
115
|
+
* Create a worktree for an agent.
|
|
116
|
+
*
|
|
117
|
+
* @param options - Worktree creation options
|
|
118
|
+
* @returns Created worktree info
|
|
119
|
+
*/
|
|
120
|
+
createWorktree(options: CreateWorktreeOptions): AgentWorktree;
|
|
121
|
+
/**
|
|
122
|
+
* Get a worktree by agent ID.
|
|
123
|
+
*/
|
|
124
|
+
getWorktree(agentId: string): AgentWorktree | null;
|
|
125
|
+
/**
|
|
126
|
+
* List all worktrees.
|
|
127
|
+
*/
|
|
128
|
+
listWorktrees(): AgentWorktree[];
|
|
129
|
+
/**
|
|
130
|
+
* Update the stream associated with a worktree.
|
|
131
|
+
*/
|
|
132
|
+
updateWorktreeStream(agentId: string, streamId: string | null): void;
|
|
133
|
+
/**
|
|
134
|
+
* Deallocate a worktree.
|
|
135
|
+
*/
|
|
136
|
+
deallocateWorktree(agentId: string): void;
|
|
137
|
+
/**
|
|
138
|
+
* Create a worker task under a stream.
|
|
139
|
+
*
|
|
140
|
+
* @param options - Task creation options
|
|
141
|
+
* @returns Task ID
|
|
142
|
+
*/
|
|
143
|
+
createTask(options: CreateTaskOptions): string;
|
|
144
|
+
/**
|
|
145
|
+
* Get a task by ID.
|
|
146
|
+
*/
|
|
147
|
+
getTask(taskId: string): WorkerTask | null;
|
|
148
|
+
/**
|
|
149
|
+
* List tasks for a stream.
|
|
150
|
+
*/
|
|
151
|
+
listTasks(streamId: string, options?: ListTasksOptions): WorkerTask[];
|
|
152
|
+
/**
|
|
153
|
+
* Start a task - assigns agent and creates worker branch.
|
|
154
|
+
*
|
|
155
|
+
* @param options - Start task options
|
|
156
|
+
* @returns Branch name and start commit
|
|
157
|
+
*/
|
|
158
|
+
startTask(options: StartTaskOptions): StartTaskResult;
|
|
159
|
+
/**
|
|
160
|
+
* Complete a task - merges worker branch to stream.
|
|
161
|
+
*
|
|
162
|
+
* @param options - Complete task options
|
|
163
|
+
* @returns Merge result
|
|
164
|
+
*/
|
|
165
|
+
completeTask(options: CompleteTaskOptions): CompleteTaskResult;
|
|
166
|
+
/**
|
|
167
|
+
* Abandon a task.
|
|
168
|
+
*
|
|
169
|
+
* @param taskId - Task ID
|
|
170
|
+
* @param options - Options
|
|
171
|
+
*/
|
|
172
|
+
abandonTask(taskId: string, options?: {
|
|
173
|
+
deleteBranch?: boolean;
|
|
174
|
+
}): void;
|
|
175
|
+
/**
|
|
176
|
+
* Release a task back to 'open' status.
|
|
177
|
+
*/
|
|
178
|
+
releaseTask(taskId: string): void;
|
|
179
|
+
/**
|
|
180
|
+
* Detect conflicts for a task before completing.
|
|
181
|
+
*
|
|
182
|
+
* @param taskId - Task ID
|
|
183
|
+
* @param worktree - Worktree path
|
|
184
|
+
* @returns Array of conflicting file paths, empty if no conflicts
|
|
185
|
+
*/
|
|
186
|
+
detectTaskConflicts(taskId: string, worktree: string): string[];
|
|
187
|
+
/**
|
|
188
|
+
* Recover stale tasks that have been in_progress too long.
|
|
189
|
+
*
|
|
190
|
+
* @param thresholdMs - Tasks older than this are considered stale
|
|
191
|
+
* @returns Result with released task IDs
|
|
192
|
+
*/
|
|
193
|
+
recoverStaleTasks(thresholdMs?: number): {
|
|
194
|
+
released: string[];
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Create checkpoints for commits made during a task.
|
|
198
|
+
*
|
|
199
|
+
* Creates a checkpoint for each commit between the task's startCommit and
|
|
200
|
+
* the current HEAD of the task's stream. This captures the work done during
|
|
201
|
+
* the task for future review and merge workflows.
|
|
202
|
+
*
|
|
203
|
+
* @param taskId - Task ID to create checkpoints for
|
|
204
|
+
* @param agentId - Agent ID (used as createdBy)
|
|
205
|
+
* @returns Array of created checkpoints
|
|
206
|
+
*/
|
|
207
|
+
createCheckpointsForTask(taskId: string, agentId: string): Checkpoint[];
|
|
208
|
+
/**
|
|
209
|
+
* Commit changes in a worktree with Change tracking.
|
|
210
|
+
*
|
|
211
|
+
* @param options - Commit options
|
|
212
|
+
* @returns Commit hash and change ID
|
|
213
|
+
*/
|
|
214
|
+
commitChanges(options: {
|
|
215
|
+
streamId: string;
|
|
216
|
+
agentId: string;
|
|
217
|
+
worktree: string;
|
|
218
|
+
message: string;
|
|
219
|
+
}): {
|
|
220
|
+
commit: string;
|
|
221
|
+
changeId: string;
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Clean up old worker branches.
|
|
225
|
+
*
|
|
226
|
+
* Deletes branches for:
|
|
227
|
+
* - Completed tasks older than threshold (default 24h)
|
|
228
|
+
* - Abandoned tasks
|
|
229
|
+
* - Orphaned branches (no task record)
|
|
230
|
+
*
|
|
231
|
+
* @param options - Cleanup options
|
|
232
|
+
* @returns Deleted branches and any errors
|
|
233
|
+
*/
|
|
234
|
+
cleanupWorkerBranches(options?: CleanupWorkerBranchesOptions): CleanupResult;
|
|
235
|
+
/**
|
|
236
|
+
* Delete a specific worker branch.
|
|
237
|
+
*
|
|
238
|
+
* @param branchName - Branch name to delete
|
|
239
|
+
* @returns true if deleted, false if branch didn't exist
|
|
240
|
+
*/
|
|
241
|
+
deleteWorkerBranch(branchName: string): boolean;
|
|
242
|
+
/**
|
|
243
|
+
* Check system health.
|
|
244
|
+
*/
|
|
245
|
+
healthCheck(): ReturnType<MultiAgentRepoTracker['healthCheck']>;
|
|
246
|
+
/**
|
|
247
|
+
* Close the adapter and release resources.
|
|
248
|
+
*
|
|
249
|
+
* Only closes the database if we created it (not if using shared DB).
|
|
250
|
+
*/
|
|
251
|
+
close(): void;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Create a DataplaneAdapter instance.
|
|
255
|
+
*
|
|
256
|
+
* @param config - Configuration options
|
|
257
|
+
* @returns DataplaneAdapter instance
|
|
258
|
+
*/
|
|
259
|
+
export declare function createDataplaneAdapter(config: DataplaneConfig): DataplaneAdapter;
|
|
260
|
+
//# sourceMappingURL=dataplane-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataplane-adapter.d.ts","sourceRoot":"","sources":["../../src/workspace/dataplane-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataplane Adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps MultiAgentRepoTracker to integrate with macro-agent's event system
|
|
5
|
+
* and provide a simplified interface for workspace management.
|
|
6
|
+
*
|
|
7
|
+
* @module workspace/dataplane-adapter
|
|
8
|
+
* @implements [[s-7ktd]] Dataplane Integration section
|
|
9
|
+
*/
|
|
10
|
+
import { MultiAgentRepoTracker, workerTasks, diffStacks, } from 'git-cascade';
|
|
11
|
+
import { DEFAULT_DATAPLANE_CONFIG } from './config.js';
|
|
12
|
+
/**
|
|
13
|
+
* DataplaneAdapter wraps MultiAgentRepoTracker for macro-agent integration.
|
|
14
|
+
*
|
|
15
|
+
* Key responsibilities:
|
|
16
|
+
* - Initialize dataplane with shared or dedicated database
|
|
17
|
+
* - Emit events on dataplane operations
|
|
18
|
+
* - Provide simplified API for workspace management
|
|
19
|
+
*/
|
|
20
|
+
export class DataplaneAdapter {
|
|
21
|
+
tracker;
|
|
22
|
+
config;
|
|
23
|
+
eventListeners = new Set();
|
|
24
|
+
ownsDb;
|
|
25
|
+
/**
|
|
26
|
+
* Create a new DataplaneAdapter.
|
|
27
|
+
*
|
|
28
|
+
* @param config - Dataplane configuration
|
|
29
|
+
*/
|
|
30
|
+
constructor(config) {
|
|
31
|
+
const mergedConfig = {
|
|
32
|
+
...DEFAULT_DATAPLANE_CONFIG,
|
|
33
|
+
...config,
|
|
34
|
+
repoPath: config.repoPath ?? process.cwd(),
|
|
35
|
+
};
|
|
36
|
+
this.config = {
|
|
37
|
+
enabled: mergedConfig.enabled ?? true,
|
|
38
|
+
repoPath: mergedConfig.repoPath,
|
|
39
|
+
tablePrefix: mergedConfig.tablePrefix ?? 'dataplane_',
|
|
40
|
+
verbose: mergedConfig.verbose ?? false,
|
|
41
|
+
skipRecovery: mergedConfig.skipRecovery ?? false,
|
|
42
|
+
};
|
|
43
|
+
// Determine if we own the database connection
|
|
44
|
+
this.ownsDb = !config.db;
|
|
45
|
+
const trackerOptions = {
|
|
46
|
+
repoPath: this.config.repoPath,
|
|
47
|
+
tablePrefix: this.config.tablePrefix,
|
|
48
|
+
verbose: this.config.verbose,
|
|
49
|
+
skipRecovery: this.config.skipRecovery,
|
|
50
|
+
};
|
|
51
|
+
if (config.db) {
|
|
52
|
+
trackerOptions.db = config.db;
|
|
53
|
+
}
|
|
54
|
+
else if (config.dbPath) {
|
|
55
|
+
trackerOptions.dbPath = config.dbPath;
|
|
56
|
+
}
|
|
57
|
+
// If neither db nor dbPath provided, tracker uses default path
|
|
58
|
+
this.tracker = new MultiAgentRepoTracker(trackerOptions);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get whether dataplane is enabled.
|
|
62
|
+
*/
|
|
63
|
+
get enabled() {
|
|
64
|
+
return this.config.enabled;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the repository path.
|
|
68
|
+
*/
|
|
69
|
+
get repoPath() {
|
|
70
|
+
return this.config.repoPath;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the underlying database connection.
|
|
74
|
+
* Use with caution - prefer adapter methods for operations.
|
|
75
|
+
*/
|
|
76
|
+
get db() {
|
|
77
|
+
return this.tracker.db;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the underlying tracker.
|
|
81
|
+
* Use with caution - prefer adapter methods for operations.
|
|
82
|
+
*/
|
|
83
|
+
get rawTracker() {
|
|
84
|
+
return this.tracker;
|
|
85
|
+
}
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
// Event System
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Subscribe to dataplane events.
|
|
91
|
+
*
|
|
92
|
+
* @param callback - Function called when events occur
|
|
93
|
+
* @returns Unsubscribe function
|
|
94
|
+
*/
|
|
95
|
+
onEvent(callback) {
|
|
96
|
+
this.eventListeners.add(callback);
|
|
97
|
+
return () => this.eventListeners.delete(callback);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Emit an event to all listeners.
|
|
101
|
+
*/
|
|
102
|
+
emit(type, data) {
|
|
103
|
+
const event = {
|
|
104
|
+
type,
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
data,
|
|
107
|
+
};
|
|
108
|
+
for (const listener of this.eventListeners) {
|
|
109
|
+
try {
|
|
110
|
+
listener(event);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error('[DataplaneAdapter] Event listener error:', error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
118
|
+
// Stream Operations
|
|
119
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Create a new stream (integration branch).
|
|
122
|
+
*
|
|
123
|
+
* @param options - Stream creation options
|
|
124
|
+
* @returns Stream ID
|
|
125
|
+
*/
|
|
126
|
+
createStream(options) {
|
|
127
|
+
const streamId = this.tracker.createStream(options);
|
|
128
|
+
this.emit('stream:created', { streamId, ...options });
|
|
129
|
+
return streamId;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get a stream by ID.
|
|
133
|
+
*/
|
|
134
|
+
getStream(streamId) {
|
|
135
|
+
return this.tracker.getStream(streamId);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* List streams with optional filters.
|
|
139
|
+
*/
|
|
140
|
+
listStreams(options) {
|
|
141
|
+
return this.tracker.listStreams(options);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Update a stream.
|
|
145
|
+
*/
|
|
146
|
+
updateStream(streamId, updates) {
|
|
147
|
+
this.tracker.updateStream(streamId, updates);
|
|
148
|
+
this.emit('stream:updated', { streamId, updates });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Abandon a stream.
|
|
152
|
+
*/
|
|
153
|
+
abandonStream(streamId, options) {
|
|
154
|
+
this.tracker.abandonStream(streamId, options);
|
|
155
|
+
this.emit('stream:abandoned', { streamId, ...options });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get the git branch name for a stream.
|
|
159
|
+
*/
|
|
160
|
+
getStreamBranchName(streamId) {
|
|
161
|
+
return this.tracker.getStreamBranchName(streamId);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get the HEAD commit of a stream.
|
|
165
|
+
*/
|
|
166
|
+
getStreamHead(streamId) {
|
|
167
|
+
return this.tracker.getStreamHead(streamId);
|
|
168
|
+
}
|
|
169
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
170
|
+
// Worktree Operations
|
|
171
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* Create a worktree for an agent.
|
|
174
|
+
*
|
|
175
|
+
* @param options - Worktree creation options
|
|
176
|
+
* @returns Created worktree info
|
|
177
|
+
*/
|
|
178
|
+
createWorktree(options) {
|
|
179
|
+
const worktree = this.tracker.createWorktree(options);
|
|
180
|
+
this.emit('worktree:created', { ...worktree });
|
|
181
|
+
return worktree;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get a worktree by agent ID.
|
|
185
|
+
*/
|
|
186
|
+
getWorktree(agentId) {
|
|
187
|
+
return this.tracker.getWorktree(agentId);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* List all worktrees.
|
|
191
|
+
*/
|
|
192
|
+
listWorktrees() {
|
|
193
|
+
return this.tracker.listWorktrees();
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Update the stream associated with a worktree.
|
|
197
|
+
*/
|
|
198
|
+
updateWorktreeStream(agentId, streamId) {
|
|
199
|
+
this.tracker.updateWorktreeStream(agentId, streamId);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Deallocate a worktree.
|
|
203
|
+
*/
|
|
204
|
+
deallocateWorktree(agentId) {
|
|
205
|
+
this.tracker.deallocateWorktree(agentId);
|
|
206
|
+
this.emit('worktree:deallocated', { agentId });
|
|
207
|
+
}
|
|
208
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
209
|
+
// Worker Task Operations
|
|
210
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
+
/**
|
|
212
|
+
* Create a worker task under a stream.
|
|
213
|
+
*
|
|
214
|
+
* @param options - Task creation options
|
|
215
|
+
* @returns Task ID
|
|
216
|
+
*/
|
|
217
|
+
createTask(options) {
|
|
218
|
+
const taskId = this.tracker.createTask(options);
|
|
219
|
+
this.emit('task:created', { taskId, ...options });
|
|
220
|
+
return taskId;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get a task by ID.
|
|
224
|
+
*/
|
|
225
|
+
getTask(taskId) {
|
|
226
|
+
return this.tracker.getTask(taskId);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* List tasks for a stream.
|
|
230
|
+
*/
|
|
231
|
+
listTasks(streamId, options) {
|
|
232
|
+
return this.tracker.listTasks(streamId, options);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Start a task - assigns agent and creates worker branch.
|
|
236
|
+
*
|
|
237
|
+
* @param options - Start task options
|
|
238
|
+
* @returns Branch name and start commit
|
|
239
|
+
*/
|
|
240
|
+
startTask(options) {
|
|
241
|
+
const result = this.tracker.startTask(options);
|
|
242
|
+
this.emit('task:started', {
|
|
243
|
+
taskId: options.taskId,
|
|
244
|
+
agentId: options.agentId,
|
|
245
|
+
branchName: result.branchName,
|
|
246
|
+
startCommit: result.startCommit,
|
|
247
|
+
});
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Complete a task - merges worker branch to stream.
|
|
252
|
+
*
|
|
253
|
+
* @param options - Complete task options
|
|
254
|
+
* @returns Merge result
|
|
255
|
+
*/
|
|
256
|
+
completeTask(options) {
|
|
257
|
+
const result = this.tracker.completeTask(options);
|
|
258
|
+
this.emit('task:completed', { taskId: options.taskId, ...result });
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Abandon a task.
|
|
263
|
+
*
|
|
264
|
+
* @param taskId - Task ID
|
|
265
|
+
* @param options - Options
|
|
266
|
+
*/
|
|
267
|
+
abandonTask(taskId, options) {
|
|
268
|
+
this.tracker.abandonTask(taskId, options);
|
|
269
|
+
this.emit('task:abandoned', { taskId, ...options });
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Release a task back to 'open' status.
|
|
273
|
+
*/
|
|
274
|
+
releaseTask(taskId) {
|
|
275
|
+
this.tracker.releaseTask(taskId);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Detect conflicts for a task before completing.
|
|
279
|
+
*
|
|
280
|
+
* @param taskId - Task ID
|
|
281
|
+
* @param worktree - Worktree path
|
|
282
|
+
* @returns Array of conflicting file paths, empty if no conflicts
|
|
283
|
+
*/
|
|
284
|
+
detectTaskConflicts(taskId, worktree) {
|
|
285
|
+
return workerTasks.detectTaskConflicts(this.tracker.db, this.config.repoPath, taskId, worktree);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Recover stale tasks that have been in_progress too long.
|
|
289
|
+
*
|
|
290
|
+
* @param thresholdMs - Tasks older than this are considered stale
|
|
291
|
+
* @returns Result with released task IDs
|
|
292
|
+
*/
|
|
293
|
+
recoverStaleTasks(thresholdMs = 60 * 60 * 1000) {
|
|
294
|
+
return workerTasks.recoverStaleTasks(this.tracker.db, thresholdMs);
|
|
295
|
+
}
|
|
296
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
297
|
+
// Checkpoint Operations
|
|
298
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
299
|
+
/**
|
|
300
|
+
* Create checkpoints for commits made during a task.
|
|
301
|
+
*
|
|
302
|
+
* Creates a checkpoint for each commit between the task's startCommit and
|
|
303
|
+
* the current HEAD of the task's stream. This captures the work done during
|
|
304
|
+
* the task for future review and merge workflows.
|
|
305
|
+
*
|
|
306
|
+
* @param taskId - Task ID to create checkpoints for
|
|
307
|
+
* @param agentId - Agent ID (used as createdBy)
|
|
308
|
+
* @returns Array of created checkpoints
|
|
309
|
+
*/
|
|
310
|
+
createCheckpointsForTask(taskId, agentId) {
|
|
311
|
+
const task = this.getTask(taskId);
|
|
312
|
+
if (!task) {
|
|
313
|
+
console.warn(`[DataplaneAdapter] Task not found: ${taskId}`);
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
if (!task.streamId) {
|
|
317
|
+
console.warn(`[DataplaneAdapter] Task ${taskId} has no streamId`);
|
|
318
|
+
return [];
|
|
319
|
+
}
|
|
320
|
+
if (!task.startCommit) {
|
|
321
|
+
console.warn(`[DataplaneAdapter] Task ${taskId} has no startCommit`);
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
// Create checkpoints from task's startCommit to stream's current HEAD
|
|
326
|
+
const checkpoints = diffStacks.createCheckpointsFromStream(this.tracker.db, this.config.repoPath, task.streamId, {
|
|
327
|
+
from: task.startCommit,
|
|
328
|
+
createdBy: agentId,
|
|
329
|
+
});
|
|
330
|
+
return checkpoints;
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
console.error(`[DataplaneAdapter] Failed to create checkpoints for task ${taskId}:`, error);
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
338
|
+
// Commit Operations
|
|
339
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
340
|
+
/**
|
|
341
|
+
* Commit changes in a worktree with Change tracking.
|
|
342
|
+
*
|
|
343
|
+
* @param options - Commit options
|
|
344
|
+
* @returns Commit hash and change ID
|
|
345
|
+
*/
|
|
346
|
+
commitChanges(options) {
|
|
347
|
+
return this.tracker.commitChanges(options);
|
|
348
|
+
}
|
|
349
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
350
|
+
// Maintenance Operations
|
|
351
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
352
|
+
/**
|
|
353
|
+
* Clean up old worker branches.
|
|
354
|
+
*
|
|
355
|
+
* Deletes branches for:
|
|
356
|
+
* - Completed tasks older than threshold (default 24h)
|
|
357
|
+
* - Abandoned tasks
|
|
358
|
+
* - Orphaned branches (no task record)
|
|
359
|
+
*
|
|
360
|
+
* @param options - Cleanup options
|
|
361
|
+
* @returns Deleted branches and any errors
|
|
362
|
+
*/
|
|
363
|
+
cleanupWorkerBranches(options) {
|
|
364
|
+
return workerTasks.cleanupWorkerBranches(this.tracker.db, this.config.repoPath, options);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Delete a specific worker branch.
|
|
368
|
+
*
|
|
369
|
+
* @param branchName - Branch name to delete
|
|
370
|
+
* @returns true if deleted, false if branch didn't exist
|
|
371
|
+
*/
|
|
372
|
+
deleteWorkerBranch(branchName) {
|
|
373
|
+
try {
|
|
374
|
+
const { execSync } = require('child_process');
|
|
375
|
+
execSync(`git branch -D "${branchName}"`, {
|
|
376
|
+
cwd: this.config.repoPath,
|
|
377
|
+
stdio: 'pipe',
|
|
378
|
+
});
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
386
|
+
// Health & Recovery
|
|
387
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
388
|
+
/**
|
|
389
|
+
* Check system health.
|
|
390
|
+
*/
|
|
391
|
+
healthCheck() {
|
|
392
|
+
return this.tracker.healthCheck();
|
|
393
|
+
}
|
|
394
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
395
|
+
// Lifecycle
|
|
396
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
397
|
+
/**
|
|
398
|
+
* Close the adapter and release resources.
|
|
399
|
+
*
|
|
400
|
+
* Only closes the database if we created it (not if using shared DB).
|
|
401
|
+
*/
|
|
402
|
+
close() {
|
|
403
|
+
this.eventListeners.clear();
|
|
404
|
+
this.tracker.close();
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Create a DataplaneAdapter instance.
|
|
409
|
+
*
|
|
410
|
+
* @param config - Configuration options
|
|
411
|
+
* @returns DataplaneAdapter instance
|
|
412
|
+
*/
|
|
413
|
+
export function createDataplaneAdapter(config) {
|
|
414
|
+
return new DataplaneAdapter(config);
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=dataplane-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataplane-adapter.js","sourceRoot":"","sources":["../../src/workspace/dataplane-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "macro-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "Interact with multiple agents as if they were a single agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -50,7 +50,6 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
52
52
|
"@multi-agent-protocol/sdk": "^0.1.12",
|
|
53
|
-
"@sudocode-ai/claude-code-acp": "^0.13.9",
|
|
54
53
|
"acp-factory": "^0.1.12",
|
|
55
54
|
"agent-inbox": "^0.1.8",
|
|
56
55
|
"better-sqlite3": "^12.5.0",
|
|
@@ -13,9 +13,13 @@ import * as path from "path";
|
|
|
13
13
|
import { fileURLToPath } from "url";
|
|
14
14
|
|
|
15
15
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
// Package root: up from src/teams/ → src/ → package root
|
|
16
|
+
// Package root: up from src/teams/ → src/ → package root.
|
|
17
|
+
// Bundled templates live under `templates/teams/` so they're clearly shipped
|
|
18
|
+
// assets (not confused with user runtime config, which lives at
|
|
19
|
+
// `<project>/.multiagent/teams/` — a gitignored directory that this module
|
|
20
|
+
// seeds INTO on first use).
|
|
17
21
|
const PACKAGE_ROOT = path.resolve(__dirname, "..", "..");
|
|
18
|
-
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "
|
|
22
|
+
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "templates", "teams");
|
|
19
23
|
const TEAMS_DIR = ".multiagent/teams";
|
|
20
24
|
|
|
21
25
|
/**
|
package/src/teams/team-loader.ts
CHANGED
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* @module teams/team-loader
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import * as fs from "fs";
|
|
10
11
|
import * as path from "path";
|
|
12
|
+
import { fileURLToPath } from "url";
|
|
11
13
|
import { TemplateLoader } from "openteams";
|
|
12
14
|
import type {
|
|
13
15
|
ResolvedRole,
|
|
@@ -29,6 +31,15 @@ import {
|
|
|
29
31
|
|
|
30
32
|
const TEAMS_DIR = ".multiagent/teams";
|
|
31
33
|
|
|
34
|
+
// Bundled team templates shipped with the macro-agent package. Used as a
|
|
35
|
+
// fallback when a team name isn't present in the user's `.multiagent/teams/`
|
|
36
|
+
// — so a fresh project can `startTeam('self-driving', cwd)` without first
|
|
37
|
+
// running the seed step. User-local copies always win when present.
|
|
38
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
39
|
+
const __dirname = path.dirname(__filename);
|
|
40
|
+
const PACKAGE_ROOT = path.resolve(__dirname, "..", "..");
|
|
41
|
+
const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, "templates", "teams");
|
|
42
|
+
|
|
32
43
|
// =============================================================================
|
|
33
44
|
// TeamLoader
|
|
34
45
|
// =============================================================================
|
|
@@ -51,7 +62,13 @@ export async function loadTeam(
|
|
|
51
62
|
basePath?: string
|
|
52
63
|
): Promise<TeamManifest> {
|
|
53
64
|
const root = basePath ?? process.cwd();
|
|
54
|
-
const
|
|
65
|
+
const userTeamDir = path.join(root, TEAMS_DIR, teamName);
|
|
66
|
+
// Prefer a user-customised template; fall back to the bundled default
|
|
67
|
+
// shipped under `<package>/templates/teams/<name>/`. This lets fresh
|
|
68
|
+
// projects use built-in teams without an explicit seed step, while
|
|
69
|
+
// still honouring per-project overrides.
|
|
70
|
+
const bundledTeamDir = path.join(BUNDLED_TEAMS_DIR, teamName);
|
|
71
|
+
const teamDir = fs.existsSync(userTeamDir) ? userTeamDir : bundledTeamDir;
|
|
55
72
|
|
|
56
73
|
// 1. Load via openteams TemplateLoader with hooks
|
|
57
74
|
let template;
|
|
@@ -19,9 +19,17 @@ import type { WorkspaceManager } from '../types.js';
|
|
|
19
19
|
import { vi } from 'vitest';
|
|
20
20
|
|
|
21
21
|
describe('self-driving team YAML (V3 migration)', () => {
|
|
22
|
+
// Resolve relative to this test file so the path is cwd-independent and
|
|
23
|
+
// points at the shipped package asset (not a user-runtime copy under
|
|
24
|
+
// <project>/.multiagent/ — that only exists after `seed-defaults` runs).
|
|
25
|
+
// `src/workspace/__tests__/` → `../../../` → package root.
|
|
26
|
+
const PACKAGE_ROOT = path.resolve(
|
|
27
|
+
path.dirname(new URL(import.meta.url).pathname),
|
|
28
|
+
'..', '..', '..'
|
|
29
|
+
);
|
|
22
30
|
const yamlPath = path.join(
|
|
23
|
-
|
|
24
|
-
'
|
|
31
|
+
PACKAGE_ROOT,
|
|
32
|
+
'templates/teams/self-driving/team.yaml'
|
|
25
33
|
);
|
|
26
34
|
|
|
27
35
|
it('exists on disk', () => {
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
name: self-driving
|
|
2
|
+
description: "Cursor-style autonomous codebase development: planners explore and create tasks, grinders claim and execute in their own streams, judges evaluate quality."
|
|
3
|
+
version: 1
|
|
4
|
+
|
|
5
|
+
# ─────────────────────────────────────────────────────────────
|
|
6
|
+
# Roles
|
|
7
|
+
# ─────────────────────────────────────────────────────────────
|
|
8
|
+
roles:
|
|
9
|
+
- planner
|
|
10
|
+
- grinder
|
|
11
|
+
- judge
|
|
12
|
+
|
|
13
|
+
# ─────────────────────────────────────────────────────────────
|
|
14
|
+
# Topology
|
|
15
|
+
# ─────────────────────────────────────────────────────────────
|
|
16
|
+
topology:
|
|
17
|
+
root:
|
|
18
|
+
role: planner
|
|
19
|
+
prompt: prompts/planner.md
|
|
20
|
+
config:
|
|
21
|
+
model: sonnet
|
|
22
|
+
companions:
|
|
23
|
+
- role: judge
|
|
24
|
+
prompt: prompts/judge.md
|
|
25
|
+
config:
|
|
26
|
+
model: haiku
|
|
27
|
+
spawn_rules:
|
|
28
|
+
planner: [grinder, planner]
|
|
29
|
+
judge: []
|
|
30
|
+
grinder: []
|
|
31
|
+
|
|
32
|
+
# ─────────────────────────────────────────────────────────────
|
|
33
|
+
# Communication
|
|
34
|
+
# ─────────────────────────────────────────────────────────────
|
|
35
|
+
communication:
|
|
36
|
+
enforcement: permissive
|
|
37
|
+
|
|
38
|
+
channels:
|
|
39
|
+
task_updates:
|
|
40
|
+
description: "Task lifecycle events"
|
|
41
|
+
signals: [TASK_CREATED, TASK_COMPLETED, TASK_FAILED]
|
|
42
|
+
work_coordination:
|
|
43
|
+
description: "Work assignment and completion"
|
|
44
|
+
signals: [WORK_ASSIGNED, WORKER_DONE, MERGE_REQUEST]
|
|
45
|
+
health:
|
|
46
|
+
description: "System health monitoring"
|
|
47
|
+
signals: [HEALTH_CHECK, METRIC_SNAPSHOT, GREEN_SNAPSHOT, FIXUP_CREATED]
|
|
48
|
+
|
|
49
|
+
subscriptions:
|
|
50
|
+
planner:
|
|
51
|
+
- channel: task_updates
|
|
52
|
+
- channel: work_coordination
|
|
53
|
+
signals: [WORKER_DONE]
|
|
54
|
+
- channel: health
|
|
55
|
+
signals: [METRIC_SNAPSHOT, GREEN_SNAPSHOT, FIXUP_CREATED]
|
|
56
|
+
judge:
|
|
57
|
+
- channel: task_updates
|
|
58
|
+
signals: [TASK_FAILED]
|
|
59
|
+
- channel: work_coordination
|
|
60
|
+
signals: [WORKER_DONE]
|
|
61
|
+
- channel: health
|
|
62
|
+
grinder:
|
|
63
|
+
- channel: work_coordination
|
|
64
|
+
signals: [WORK_ASSIGNED]
|
|
65
|
+
|
|
66
|
+
emissions:
|
|
67
|
+
planner: [TASK_CREATED, WORK_ASSIGNED, PLANNING_COMPLETE]
|
|
68
|
+
judge: [HEALTH_CHECK, GREEN_SNAPSHOT, FIXUP_CREATED]
|
|
69
|
+
grinder: [WORKER_DONE]
|
|
70
|
+
|
|
71
|
+
routing:
|
|
72
|
+
peers:
|
|
73
|
+
- from: judge
|
|
74
|
+
to: planner
|
|
75
|
+
via: direct
|
|
76
|
+
signals: [FIXUP_CREATED, GREEN_SNAPSHOT]
|
|
77
|
+
- from: planner
|
|
78
|
+
to: judge
|
|
79
|
+
via: direct
|
|
80
|
+
signals: [CONVERGENCE_CHECK]
|
|
81
|
+
|
|
82
|
+
# ─────────────────────────────────────────────────────────────
|
|
83
|
+
# macro-agent specific extensions
|
|
84
|
+
# ─────────────────────────────────────────────────────────────
|
|
85
|
+
macro_agent:
|
|
86
|
+
# V3 stream-first workspace topology.
|
|
87
|
+
# Compiled by YamlDrivenTopology into per-spawn WorkspaceDecision values.
|
|
88
|
+
workspace:
|
|
89
|
+
default_stream:
|
|
90
|
+
fork_from: main
|
|
91
|
+
name_template: "{team}"
|
|
92
|
+
change_id_tracking: true
|
|
93
|
+
|
|
94
|
+
on_team_complete: keep
|
|
95
|
+
|
|
96
|
+
roles:
|
|
97
|
+
# Planner shares the team root stream — continuous exploration lives on the
|
|
98
|
+
# same branch as the team's accumulated work; no per-planner fork.
|
|
99
|
+
planner:
|
|
100
|
+
workspace: attach_to_team_root
|
|
101
|
+
capabilities:
|
|
102
|
+
- workspace.read
|
|
103
|
+
- agent.spawn
|
|
104
|
+
|
|
105
|
+
# Grinders fork their own stream off the team root, land via direct-push
|
|
106
|
+
# (trunk integration). A conflict during landing aborts and leaves the
|
|
107
|
+
# stream for human / judge review.
|
|
108
|
+
grinder:
|
|
109
|
+
workspace: new_stream
|
|
110
|
+
stream_lineage: fork_from_team_root
|
|
111
|
+
landing: direct_push
|
|
112
|
+
on_conflict: defer
|
|
113
|
+
capabilities:
|
|
114
|
+
- workspace.commit
|
|
115
|
+
- workspace.land
|
|
116
|
+
|
|
117
|
+
# Judge is read-only — it observes repo state but doesn't need a
|
|
118
|
+
# workspace of its own.
|
|
119
|
+
judge:
|
|
120
|
+
workspace: none
|
|
121
|
+
capabilities:
|
|
122
|
+
- workspace.read
|
|
123
|
+
|
|
124
|
+
# Declarative shorthand read by TeamRuntimeV2.getStrategyName(). `trunk`
|
|
125
|
+
# pairs with the grinder's direct_push landing above: every task lands
|
|
126
|
+
# straight onto the team-root stream rather than going through a merge
|
|
127
|
+
# queue. Kept here as a top-level scalar so runtimes that don't parse the
|
|
128
|
+
# full V3 workspace block (env-var consumers, logs, metrics labels) still
|
|
129
|
+
# see the integration strategy.
|
|
130
|
+
integration:
|
|
131
|
+
strategy: trunk
|
|
132
|
+
|
|
133
|
+
task_assignment:
|
|
134
|
+
mode: pull
|
|
135
|
+
pull:
|
|
136
|
+
idle_timeout_s: 300
|
|
137
|
+
claim_retry_delay_ms: 2000
|
|
138
|
+
max_concurrent_per_agent: 1
|
|
139
|
+
|
|
140
|
+
observability:
|
|
141
|
+
metrics_window_s: 3600
|
|
142
|
+
snapshot_interval_s: 300
|
package/tsconfig.json
CHANGED
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"declaration": true,
|
|
14
14
|
"declarationMap": true,
|
|
15
15
|
"sourceMap": true,
|
|
16
|
-
"resolveJsonModule": true
|
|
16
|
+
"resolveJsonModule": true,
|
|
17
|
+
"types": ["node", "better-sqlite3", "express", "js-yaml", "supertest", "ws"]
|
|
17
18
|
},
|
|
18
19
|
"include": ["src/**/*"],
|
|
19
20
|
"exclude": ["node_modules", "dist", "**/*.test.ts"]
|