macro-agent 0.1.7 → 0.1.10
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/CLAUDE.md +179 -38
- package/README.md +781 -131
- package/dist/acp/claude-code-replay.d.ts +11 -0
- package/dist/acp/claude-code-replay.d.ts.map +1 -0
- package/dist/acp/claude-code-replay.js +190 -0
- package/dist/acp/claude-code-replay.js.map +1 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +155 -6
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +9 -0
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager-v2.d.ts +21 -0
- package/dist/agent/agent-manager-v2.d.ts.map +1 -1
- package/dist/agent/agent-manager-v2.js +234 -71
- package/dist/agent/agent-manager-v2.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +12 -0
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +15 -2
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/boot-v2.d.ts +41 -0
- package/dist/boot-v2.d.ts.map +1 -1
- package/dist/boot-v2.js +34 -37
- package/dist/boot-v2.js.map +1 -1
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cognitive/macro-agent-backend.d.ts.map +1 -1
- package/dist/cognitive/macro-agent-backend.js +40 -22
- package/dist/cognitive/macro-agent-backend.js.map +1 -1
- package/dist/integrations/skilltree.d.ts.map +1 -1
- package/dist/integrations/skilltree.js +1 -0
- package/dist/integrations/skilltree.js.map +1 -1
- package/dist/lifecycle/cleanup.d.ts +33 -2
- package/dist/lifecycle/cleanup.d.ts.map +1 -1
- package/dist/lifecycle/cleanup.js +28 -6
- package/dist/lifecycle/cleanup.js.map +1 -1
- package/dist/lifecycle/handlers-v2.d.ts +7 -0
- package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
- package/dist/lifecycle/handlers-v2.js +28 -2
- package/dist/lifecycle/handlers-v2.js.map +1 -1
- package/dist/lifecycle/types.d.ts +11 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/acp-bridge.d.ts +9 -0
- package/dist/map/acp-bridge.d.ts.map +1 -1
- package/dist/map/acp-bridge.js +15 -2
- package/dist/map/acp-bridge.js.map +1 -1
- package/dist/map/cascade-bridge.d.ts +44 -0
- package/dist/map/cascade-bridge.d.ts.map +1 -0
- package/dist/map/cascade-bridge.js +257 -0
- package/dist/map/cascade-bridge.js.map +1 -0
- package/dist/map/lifecycle-bridge.d.ts +1 -8
- package/dist/map/lifecycle-bridge.d.ts.map +1 -1
- package/dist/map/lifecycle-bridge.js +76 -22
- package/dist/map/lifecycle-bridge.js.map +1 -1
- package/dist/map/server.d.ts.map +1 -1
- package/dist/map/server.js +47 -6
- package/dist/map/server.js.map +1 -1
- package/dist/map/sidecar.d.ts.map +1 -1
- package/dist/map/sidecar.js +33 -4
- package/dist/map/sidecar.js.map +1 -1
- package/dist/map/types.d.ts +20 -0
- package/dist/map/types.d.ts.map +1 -1
- package/dist/mcp/tools/done-v2.d.ts.map +1 -1
- package/dist/mcp/tools/done-v2.js +8 -0
- package/dist/mcp/tools/done-v2.js.map +1 -1
- package/dist/teams/team-manager-v2.d.ts.map +1 -1
- package/dist/teams/team-manager-v2.js +26 -0
- package/dist/teams/team-manager-v2.js.map +1 -1
- package/dist/teams/team-runtime-v2.d.ts.map +1 -1
- package/dist/teams/team-runtime-v2.js +16 -3
- package/dist/teams/team-runtime-v2.js.map +1 -1
- package/dist/workspace/config.d.ts +10 -10
- package/dist/workspace/config.d.ts.map +1 -1
- package/dist/workspace/config.js +4 -4
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/git-cascade-adapter.d.ts +510 -0
- package/dist/workspace/git-cascade-adapter.d.ts.map +1 -0
- package/dist/workspace/git-cascade-adapter.js +908 -0
- package/dist/workspace/git-cascade-adapter.js.map +1 -0
- package/dist/workspace/index.d.ts +3 -3
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +4 -4
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/landing/direct-push.d.ts +20 -0
- package/dist/workspace/landing/direct-push.d.ts.map +1 -0
- package/dist/workspace/landing/direct-push.js +74 -0
- package/dist/workspace/landing/direct-push.js.map +1 -0
- package/dist/workspace/landing/index.d.ts +29 -0
- package/dist/workspace/landing/index.d.ts.map +1 -0
- package/dist/workspace/landing/index.js +37 -0
- package/dist/workspace/landing/index.js.map +1 -0
- package/dist/workspace/landing/merge-to-parent.d.ts +41 -0
- package/dist/workspace/landing/merge-to-parent.d.ts.map +1 -0
- package/dist/workspace/landing/merge-to-parent.js +185 -0
- package/dist/workspace/landing/merge-to-parent.js.map +1 -0
- package/dist/workspace/landing/optimistic-push.d.ts +16 -0
- package/dist/workspace/landing/optimistic-push.d.ts.map +1 -0
- package/dist/workspace/landing/optimistic-push.js +27 -0
- package/dist/workspace/landing/optimistic-push.js.map +1 -0
- package/dist/workspace/landing/queue-to-branch.d.ts +24 -0
- package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -0
- package/dist/workspace/landing/queue-to-branch.js +79 -0
- package/dist/workspace/landing/queue-to-branch.js.map +1 -0
- package/dist/workspace/merge-queue/merge-queue.d.ts +10 -0
- package/dist/workspace/merge-queue/merge-queue.d.ts.map +1 -1
- package/dist/workspace/merge-queue/merge-queue.js +10 -0
- package/dist/workspace/merge-queue/merge-queue.js.map +1 -1
- package/dist/workspace/merge-queue/types.d.ts +16 -2
- package/dist/workspace/merge-queue/types.d.ts.map +1 -1
- package/dist/workspace/merge-queue/types.js +9 -0
- package/dist/workspace/merge-queue/types.js.map +1 -1
- package/dist/workspace/pool/types.d.ts +1 -0
- package/dist/workspace/pool/types.d.ts.map +1 -1
- package/dist/workspace/pool/worktree-pool.d.ts.map +1 -1
- package/dist/workspace/pool/worktree-pool.js +1 -0
- package/dist/workspace/pool/worktree-pool.js.map +1 -1
- package/dist/workspace/recovery/abandon.d.ts +15 -0
- package/dist/workspace/recovery/abandon.d.ts.map +1 -0
- package/dist/workspace/recovery/abandon.js +45 -0
- package/dist/workspace/recovery/abandon.js.map +1 -0
- package/dist/workspace/recovery/auto-resolve.d.ts +27 -0
- package/dist/workspace/recovery/auto-resolve.d.ts.map +1 -0
- package/dist/workspace/recovery/auto-resolve.js +99 -0
- package/dist/workspace/recovery/auto-resolve.js.map +1 -0
- package/dist/workspace/recovery/defer.d.ts +15 -0
- package/dist/workspace/recovery/defer.d.ts.map +1 -0
- package/dist/workspace/recovery/defer.js +16 -0
- package/dist/workspace/recovery/defer.js.map +1 -0
- package/dist/workspace/recovery/escalate.d.ts +16 -0
- package/dist/workspace/recovery/escalate.d.ts.map +1 -0
- package/dist/workspace/recovery/escalate.js +24 -0
- package/dist/workspace/recovery/escalate.js.map +1 -0
- package/dist/workspace/recovery/index.d.ts +32 -0
- package/dist/workspace/recovery/index.d.ts.map +1 -0
- package/dist/workspace/recovery/index.js +45 -0
- package/dist/workspace/recovery/index.js.map +1 -0
- package/dist/workspace/recovery/spawn-resolver.d.ts +45 -0
- package/dist/workspace/recovery/spawn-resolver.d.ts.map +1 -0
- package/dist/workspace/recovery/spawn-resolver.js +111 -0
- package/dist/workspace/recovery/spawn-resolver.js.map +1 -0
- package/dist/workspace/recovery/types.d.ts +63 -0
- package/dist/workspace/recovery/types.d.ts.map +1 -0
- package/dist/workspace/recovery/types.js +12 -0
- package/dist/workspace/recovery/types.js.map +1 -0
- package/dist/workspace/topology/index.d.ts +9 -0
- package/dist/workspace/topology/index.d.ts.map +1 -0
- package/dist/workspace/topology/index.js +8 -0
- package/dist/workspace/topology/index.js.map +1 -0
- package/dist/workspace/topology/no-workspace.d.ts +18 -0
- package/dist/workspace/topology/no-workspace.d.ts.map +1 -0
- package/dist/workspace/topology/no-workspace.js +25 -0
- package/dist/workspace/topology/no-workspace.js.map +1 -0
- package/dist/workspace/topology/types.d.ts +97 -0
- package/dist/workspace/topology/types.d.ts.map +1 -0
- package/dist/workspace/topology/types.js +20 -0
- package/dist/workspace/topology/types.js.map +1 -0
- package/dist/workspace/topology/yaml-driven.d.ts +69 -0
- package/dist/workspace/topology/yaml-driven.d.ts.map +1 -0
- package/dist/workspace/topology/yaml-driven.js +273 -0
- package/dist/workspace/topology/yaml-driven.js.map +1 -0
- package/dist/workspace/types-v3.d.ts +110 -0
- package/dist/workspace/types-v3.d.ts.map +1 -0
- package/dist/workspace/types-v3.js +20 -0
- package/dist/workspace/types-v3.js.map +1 -0
- package/dist/workspace/types.d.ts +145 -17
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +92 -13
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.js +373 -13
- package/dist/workspace/workspace-manager.js.map +1 -1
- package/dist/workspace/yaml-schema.d.ts +254 -0
- package/dist/workspace/yaml-schema.d.ts.map +1 -0
- package/dist/workspace/yaml-schema.js +170 -0
- package/dist/workspace/yaml-schema.js.map +1 -0
- package/docs/conflict-recovery.md +472 -0
- package/docs/git-cascade-integration-gaps.md +678 -0
- package/docs/workspace-interfaces.md +731 -0
- package/docs/workspace-redesign-plan.md +302 -0
- package/package.json +4 -4
- package/src/__tests__/e2e/auto-sync.e2e.test.ts +257 -0
- package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +254 -0
- package/src/__tests__/e2e/cli-run.e2e.test.ts +167 -0
- package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +197 -0
- package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +200 -0
- package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +30 -22
- package/src/__tests__/e2e/workspace-v3.e2e.test.ts +413 -0
- package/src/acp/__tests__/claude-code-replay.test.ts +225 -0
- package/src/acp/__tests__/macro-agent.test.ts +39 -1
- package/src/acp/claude-code-replay.ts +208 -0
- package/src/acp/macro-agent.ts +167 -9
- package/src/acp/types.ts +10 -0
- package/src/agent/__tests__/agent-manager-topology.test.ts +73 -0
- package/src/agent/__tests__/agent-manager-v2.test.ts +71 -11
- package/src/agent/__tests__/task-ref-resolution.test.ts +231 -0
- package/src/agent/agent-manager-v2.ts +293 -77
- package/src/agent/agent-manager.ts +14 -0
- package/src/agent/types.ts +16 -2
- package/src/boot-v2.ts +87 -36
- package/src/cli/index.ts +61 -0
- package/src/cognitive/__tests__/macro-agent-backend.test.ts +47 -5
- package/src/cognitive/macro-agent-backend.ts +45 -29
- package/src/integrations/skilltree.ts +1 -0
- package/src/lifecycle/cleanup.ts +52 -3
- package/src/lifecycle/handlers-v2.ts +40 -3
- package/src/lifecycle/types.ts +12 -0
- package/src/map/__tests__/cascade-bridge.test.ts +229 -0
- package/src/map/__tests__/lifecycle-bridge.test.ts +165 -22
- package/src/map/acp-bridge.ts +26 -3
- package/src/map/cascade-bridge.ts +301 -0
- package/src/map/lifecycle-bridge.ts +77 -27
- package/src/map/server.ts +47 -6
- package/src/map/sidecar.ts +31 -3
- package/src/map/types.ts +20 -0
- package/src/mcp/tools/done-v2.ts +9 -0
- package/src/teams/team-manager-v2.ts +37 -0
- package/src/teams/team-runtime-v2.ts +23 -3
- package/src/workspace/__tests__/{dataplane-adapter.test.ts → git-cascade-adapter.test.ts} +209 -14
- package/src/workspace/__tests__/self-driving-yaml.test.ts +114 -0
- package/src/workspace/__tests__/shared-worktree-refcount.test.ts +154 -0
- package/src/workspace/__tests__/standalone-mode.test.ts +118 -0
- package/src/workspace/__tests__/workspace-manager-v3.test.ts +245 -0
- package/src/workspace/__tests__/yaml-schema.test.ts +210 -0
- package/src/workspace/config.ts +11 -11
- package/src/workspace/git-cascade-adapter.ts +1186 -0
- package/src/workspace/index.ts +11 -11
- package/src/workspace/landing/__tests__/strategies.test.ts +142 -0
- package/src/workspace/landing/direct-push.ts +91 -0
- package/src/workspace/landing/index.ts +40 -0
- package/src/workspace/landing/merge-to-parent.ts +228 -0
- package/src/workspace/landing/optimistic-push.ts +36 -0
- package/src/workspace/landing/queue-to-branch.ts +108 -0
- package/src/workspace/merge-queue/merge-queue.ts +10 -0
- package/src/workspace/merge-queue/types.ts +16 -2
- package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +5 -5
- package/src/workspace/pool/types.ts +1 -0
- package/src/workspace/pool/worktree-pool.ts +1 -0
- package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +127 -0
- package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +139 -0
- package/src/workspace/recovery/__tests__/strategies.test.ts +145 -0
- package/src/workspace/recovery/abandon.ts +51 -0
- package/src/workspace/recovery/auto-resolve.ts +119 -0
- package/src/workspace/recovery/defer.ts +23 -0
- package/src/workspace/recovery/escalate.ts +30 -0
- package/src/workspace/recovery/index.ts +58 -0
- package/src/workspace/recovery/spawn-resolver.ts +145 -0
- package/src/workspace/recovery/types.ts +54 -0
- package/src/workspace/topology/__tests__/yaml-driven.test.ts +345 -0
- package/src/workspace/topology/index.ts +18 -0
- package/src/workspace/topology/no-workspace.ts +39 -0
- package/src/workspace/topology/types.ts +116 -0
- package/src/workspace/topology/yaml-driven.ts +316 -0
- package/src/workspace/types-v3.ts +155 -0
- package/src/workspace/types.ts +191 -20
- package/src/workspace/workspace-manager.ts +474 -19
- package/src/workspace/yaml-schema.ts +216 -0
- package/src/workspace/dataplane-adapter.ts +0 -546
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YamlDrivenTopology — primary TopologyPolicy implementation.
|
|
3
|
+
*
|
|
4
|
+
* Compiles `TeamWorkspaceConfig` into per-spawn workspace decisions. Covers
|
|
5
|
+
* all 6 workflows in `docs/git-cascade-integration-gaps.md` §5 through YAML
|
|
6
|
+
* alone.
|
|
7
|
+
*
|
|
8
|
+
* @module workspace/topology/yaml-driven
|
|
9
|
+
* @see docs/workspace-redesign-plan.md Phase 3
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentId, StreamId } from '../types-v3.js';
|
|
12
|
+
import type { TeamWorkspaceConfig, RoleWorkspaceConfig } from '../yaml-schema.js';
|
|
13
|
+
import type { TopologyPolicy, TeamStartContext, TeamStartPlan, SpawnContext, WorkspaceDecision, AgentCompleteContext, TeamStopContext } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Topology policy driven entirely by `macro_agent.workspace` YAML.
|
|
16
|
+
*/
|
|
17
|
+
export declare class YamlDrivenTopology implements TopologyPolicy {
|
|
18
|
+
private readonly config;
|
|
19
|
+
readonly name = "yaml-driven";
|
|
20
|
+
private teamStreamId?;
|
|
21
|
+
private readonly agentStreams;
|
|
22
|
+
/** Tracks which role each live agent is, so sync-with-parent can dispatch. */
|
|
23
|
+
private readonly agentRoles;
|
|
24
|
+
/** Unsubscribe from the workspace event stream; set on onTeamStart, cleared on onTeamStop. */
|
|
25
|
+
private eventUnsubscribe?;
|
|
26
|
+
/** Debounce map: stream id → last-sync timestamp (ms) for coalescing. */
|
|
27
|
+
private readonly lastSyncAt;
|
|
28
|
+
/** Minimum interval between auto-syncs per parent stream (ms). */
|
|
29
|
+
private static readonly SYNC_COALESCE_MS;
|
|
30
|
+
constructor(config: TeamWorkspaceConfig);
|
|
31
|
+
/**
|
|
32
|
+
* Look up per-role config. Returns null for roles not declared in YAML.
|
|
33
|
+
*/
|
|
34
|
+
getRoleConfig(role: string): RoleWorkspaceConfig | null;
|
|
35
|
+
onTeamStart(ctx: TeamStartContext): Promise<TeamStartPlan>;
|
|
36
|
+
onAgentSpawn(ctx: SpawnContext): Promise<WorkspaceDecision>;
|
|
37
|
+
onAgentComplete(ctx: AgentCompleteContext): Promise<void>;
|
|
38
|
+
onTeamStop(ctx: TeamStopContext): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Track agent→stream mapping after a successful spawn. Called externally
|
|
41
|
+
* after the WorkspaceDecision is executed; lets the policy record state.
|
|
42
|
+
*/
|
|
43
|
+
recordAgentStream(agentId: AgentId, streamId: StreamId, role?: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Get the stream attached to an agent (from our local tracking).
|
|
46
|
+
*/
|
|
47
|
+
getAgentStream(agentId: AgentId): StreamId | null;
|
|
48
|
+
/**
|
|
49
|
+
* A team needs a root stream if any role uses team-root-relative lineage or
|
|
50
|
+
* attaches to the team root.
|
|
51
|
+
*/
|
|
52
|
+
private teamNeedsRootStream;
|
|
53
|
+
private resolveParentStream;
|
|
54
|
+
private buildStreamName;
|
|
55
|
+
/**
|
|
56
|
+
* True if any role declared `on_parent_advanced: sync_with_parent`.
|
|
57
|
+
* Used to decide whether to subscribe to stream:committed events at all.
|
|
58
|
+
*/
|
|
59
|
+
private hasAutoSyncRoles;
|
|
60
|
+
/**
|
|
61
|
+
* Dispatch syncWithParent for live agents whose role has
|
|
62
|
+
* `on_parent_advanced: sync_with_parent` and whose active stream's parent
|
|
63
|
+
* is `parentStreamId`.
|
|
64
|
+
*
|
|
65
|
+
* Coalesces: skips if a sync fired for this parent within SYNC_COALESCE_MS.
|
|
66
|
+
*/
|
|
67
|
+
private dispatchSync;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=yaml-driven.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-driven.d.ts","sourceRoot":"","sources":["../../../src/workspace/topology/yaml-driven.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAa,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAc3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbnC,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,OAAO,CAAC,YAAY,CAAC,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAC9D,8FAA8F;IAC9F,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAEpB,MAAM,EAAE,mBAAmB;IAExD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIjD,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiC1D,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiE3D,eAAe,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrD;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5E;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI;IAMjD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,eAAe;IAKvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;;OAMG;YACW,YAAY;CA4C3B"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YamlDrivenTopology — primary TopologyPolicy implementation.
|
|
3
|
+
*
|
|
4
|
+
* Compiles `TeamWorkspaceConfig` into per-spawn workspace decisions. Covers
|
|
5
|
+
* all 6 workflows in `docs/git-cascade-integration-gaps.md` §5 through YAML
|
|
6
|
+
* alone.
|
|
7
|
+
*
|
|
8
|
+
* @module workspace/topology/yaml-driven
|
|
9
|
+
* @see docs/workspace-redesign-plan.md Phase 3
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Topology policy driven entirely by `macro_agent.workspace` YAML.
|
|
13
|
+
*/
|
|
14
|
+
export class YamlDrivenTopology {
|
|
15
|
+
config;
|
|
16
|
+
name = 'yaml-driven';
|
|
17
|
+
teamStreamId;
|
|
18
|
+
agentStreams = new Map();
|
|
19
|
+
/** Tracks which role each live agent is, so sync-with-parent can dispatch. */
|
|
20
|
+
agentRoles = new Map();
|
|
21
|
+
/** Unsubscribe from the workspace event stream; set on onTeamStart, cleared on onTeamStop. */
|
|
22
|
+
eventUnsubscribe;
|
|
23
|
+
/** Debounce map: stream id → last-sync timestamp (ms) for coalescing. */
|
|
24
|
+
lastSyncAt = new Map();
|
|
25
|
+
/** Minimum interval between auto-syncs per parent stream (ms). */
|
|
26
|
+
static SYNC_COALESCE_MS = 2_000;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Look up per-role config. Returns null for roles not declared in YAML.
|
|
32
|
+
*/
|
|
33
|
+
getRoleConfig(role) {
|
|
34
|
+
return this.config.roles[role] ?? null;
|
|
35
|
+
}
|
|
36
|
+
async onTeamStart(ctx) {
|
|
37
|
+
const needsTeamRoot = this.teamNeedsRootStream();
|
|
38
|
+
if (needsTeamRoot) {
|
|
39
|
+
const forkFrom = this.config.default_stream?.fork_from ?? 'main';
|
|
40
|
+
const nameTemplate = this.config.default_stream?.name_template ?? '{team}';
|
|
41
|
+
const streamName = nameTemplate.replace('{team}', ctx.teamName);
|
|
42
|
+
this.teamStreamId = ctx.workspaceManager.createStreamV3({
|
|
43
|
+
name: streamName,
|
|
44
|
+
ownerId: `team:${ctx.teamName}`,
|
|
45
|
+
forkFrom,
|
|
46
|
+
metadata: { kind: 'team_root', teamInstanceId: ctx.teamInstanceId },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// Wire auto-sync if any role declared on_parent_advanced: sync_with_parent.
|
|
50
|
+
if (this.hasAutoSyncRoles()) {
|
|
51
|
+
this.eventUnsubscribe = ctx.workspaceManager.onEvent((event) => {
|
|
52
|
+
if (event.type !== 'stream:committed')
|
|
53
|
+
return;
|
|
54
|
+
const streamId = event.data.streamId;
|
|
55
|
+
if (!streamId)
|
|
56
|
+
return;
|
|
57
|
+
// Fire-and-forget: schedule sync for affected agents on children of
|
|
58
|
+
// this stream, coalesced.
|
|
59
|
+
void this.dispatchSync(ctx, streamId);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return this.teamStreamId
|
|
63
|
+
? { teamStreamId: this.teamStreamId }
|
|
64
|
+
: {};
|
|
65
|
+
}
|
|
66
|
+
async onAgentSpawn(ctx) {
|
|
67
|
+
const roleConfig = this.getRoleConfig(ctx.role);
|
|
68
|
+
if (!roleConfig) {
|
|
69
|
+
// Role not declared in macro_agent.workspace → conservative default:
|
|
70
|
+
// inherit parent's cwd (no isolation, no stream).
|
|
71
|
+
return { kind: 'share-parent-cwd' };
|
|
72
|
+
}
|
|
73
|
+
switch (roleConfig.workspace) {
|
|
74
|
+
case 'none':
|
|
75
|
+
return { kind: 'none' };
|
|
76
|
+
case 'share_parent_cwd':
|
|
77
|
+
return { kind: 'share-parent-cwd' };
|
|
78
|
+
case 'share_with_agent': {
|
|
79
|
+
if (!roleConfig.share_with) {
|
|
80
|
+
// Schema guarantees this, but double-check
|
|
81
|
+
return { kind: 'share-parent-cwd' };
|
|
82
|
+
}
|
|
83
|
+
const partnerId = ctx.getAgentByRole?.(roleConfig.share_with);
|
|
84
|
+
if (!partnerId) {
|
|
85
|
+
// Partner role not yet spawned; fall back to share-parent-cwd.
|
|
86
|
+
return { kind: 'share-parent-cwd' };
|
|
87
|
+
}
|
|
88
|
+
return { kind: 'share-with-agent', agentId: partnerId };
|
|
89
|
+
}
|
|
90
|
+
case 'attach_to_team_root': {
|
|
91
|
+
if (!this.teamStreamId) {
|
|
92
|
+
// Should have been created in onTeamStart; defensive fallback
|
|
93
|
+
return { kind: 'share-parent-cwd' };
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
kind: 'attach-to-stream',
|
|
97
|
+
streamId: this.teamStreamId,
|
|
98
|
+
allocateWorktree: roleConfig.allocation !== 'inherit_parent_cwd',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
case 'new_stream': {
|
|
102
|
+
const parent = this.resolveParentStream(roleConfig, ctx);
|
|
103
|
+
const forkFrom = roleConfig.stream_lineage === 'independent'
|
|
104
|
+
? this.config.default_stream?.fork_from ?? 'main'
|
|
105
|
+
: undefined;
|
|
106
|
+
const streamName = this.buildStreamName(ctx.role, ctx.agentId);
|
|
107
|
+
const spec = {
|
|
108
|
+
name: streamName,
|
|
109
|
+
ownerId: ctx.agentId,
|
|
110
|
+
parent,
|
|
111
|
+
forkFrom,
|
|
112
|
+
metadata: { role: ctx.role },
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
kind: 'new-stream',
|
|
116
|
+
streamSpec: spec,
|
|
117
|
+
allocateWorktree: roleConfig.allocation !== 'inherit_parent_cwd',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async onAgentComplete(ctx) {
|
|
123
|
+
// Deallocate the agent's worktree (if any). Landing was already handled
|
|
124
|
+
// by the LandingStrategy invoked from done(); this is pure cleanup.
|
|
125
|
+
try {
|
|
126
|
+
ctx.workspaceManager.deallocateWorkspace(ctx.agentId);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Non-fatal — agent may not have had a worktree
|
|
130
|
+
}
|
|
131
|
+
this.agentStreams.delete(ctx.agentId);
|
|
132
|
+
this.agentRoles.delete(ctx.agentId);
|
|
133
|
+
}
|
|
134
|
+
async onTeamStop(ctx) {
|
|
135
|
+
// Stop auto-sync event subscription
|
|
136
|
+
if (this.eventUnsubscribe) {
|
|
137
|
+
this.eventUnsubscribe();
|
|
138
|
+
this.eventUnsubscribe = undefined;
|
|
139
|
+
}
|
|
140
|
+
if (!this.teamStreamId)
|
|
141
|
+
return;
|
|
142
|
+
const action = this.config.on_team_complete;
|
|
143
|
+
switch (action) {
|
|
144
|
+
case 'abandon':
|
|
145
|
+
ctx.workspaceManager.abandonStream(this.teamStreamId, {
|
|
146
|
+
cascade: true,
|
|
147
|
+
reason: 'team stopped',
|
|
148
|
+
});
|
|
149
|
+
break;
|
|
150
|
+
case 'merge_to_main':
|
|
151
|
+
// Requires a landing strategy configured for the team stream.
|
|
152
|
+
// Deferred to Phase 5 (LandingStrategy integration); log a warning.
|
|
153
|
+
// Leaving stream active for now.
|
|
154
|
+
break;
|
|
155
|
+
case 'keep':
|
|
156
|
+
default:
|
|
157
|
+
// Leave the stream active for human review / PR.
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Track agent→stream mapping after a successful spawn. Called externally
|
|
163
|
+
* after the WorkspaceDecision is executed; lets the policy record state.
|
|
164
|
+
*/
|
|
165
|
+
recordAgentStream(agentId, streamId, role) {
|
|
166
|
+
this.agentStreams.set(agentId, streamId);
|
|
167
|
+
if (role)
|
|
168
|
+
this.agentRoles.set(agentId, role);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the stream attached to an agent (from our local tracking).
|
|
172
|
+
*/
|
|
173
|
+
getAgentStream(agentId) {
|
|
174
|
+
return this.agentStreams.get(agentId) ?? null;
|
|
175
|
+
}
|
|
176
|
+
// ── Helpers ─────────────────────────────────────────────────────────────
|
|
177
|
+
/**
|
|
178
|
+
* A team needs a root stream if any role uses team-root-relative lineage or
|
|
179
|
+
* attaches to the team root.
|
|
180
|
+
*/
|
|
181
|
+
teamNeedsRootStream() {
|
|
182
|
+
for (const roleConfig of Object.values(this.config.roles)) {
|
|
183
|
+
if (roleConfig.workspace === 'attach_to_team_root')
|
|
184
|
+
return true;
|
|
185
|
+
if (roleConfig.workspace === 'new_stream' &&
|
|
186
|
+
(roleConfig.stream_lineage === 'from_team_root' ||
|
|
187
|
+
roleConfig.stream_lineage === 'fork_from_team_root')) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
resolveParentStream(roleConfig, ctx) {
|
|
194
|
+
const lineage = roleConfig.stream_lineage;
|
|
195
|
+
switch (lineage) {
|
|
196
|
+
case 'fork_from_team_root':
|
|
197
|
+
case 'from_team_root':
|
|
198
|
+
return this.teamStreamId;
|
|
199
|
+
case 'fork_from_parent':
|
|
200
|
+
return ctx.parentStreamId ?? this.teamStreamId;
|
|
201
|
+
case 'independent':
|
|
202
|
+
return undefined;
|
|
203
|
+
case 'track_existing_branch':
|
|
204
|
+
return undefined; // Caller uses track_branch directly
|
|
205
|
+
default:
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
buildStreamName(role, agentId) {
|
|
210
|
+
const shortId = agentId.slice(-8);
|
|
211
|
+
return `${role}-${shortId}`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* True if any role declared `on_parent_advanced: sync_with_parent`.
|
|
215
|
+
* Used to decide whether to subscribe to stream:committed events at all.
|
|
216
|
+
*/
|
|
217
|
+
hasAutoSyncRoles() {
|
|
218
|
+
for (const roleConfig of Object.values(this.config.roles)) {
|
|
219
|
+
if (roleConfig.on_parent_advanced === 'sync_with_parent')
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Dispatch syncWithParent for live agents whose role has
|
|
226
|
+
* `on_parent_advanced: sync_with_parent` and whose active stream's parent
|
|
227
|
+
* is `parentStreamId`.
|
|
228
|
+
*
|
|
229
|
+
* Coalesces: skips if a sync fired for this parent within SYNC_COALESCE_MS.
|
|
230
|
+
*/
|
|
231
|
+
async dispatchSync(ctx, parentStreamId) {
|
|
232
|
+
const now = Date.now();
|
|
233
|
+
const last = this.lastSyncAt.get(parentStreamId) ?? 0;
|
|
234
|
+
if (now - last < YamlDrivenTopology.SYNC_COALESCE_MS) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.lastSyncAt.set(parentStreamId, now);
|
|
238
|
+
// Find live agents whose stream's parent matches and whose role has
|
|
239
|
+
// on_parent_advanced: sync_with_parent.
|
|
240
|
+
for (const [agentId, streamId] of this.agentStreams) {
|
|
241
|
+
const role = this.agentRoles.get(agentId);
|
|
242
|
+
if (!role)
|
|
243
|
+
continue;
|
|
244
|
+
const roleConfig = this.getRoleConfig(role);
|
|
245
|
+
if (roleConfig?.on_parent_advanced !== 'sync_with_parent')
|
|
246
|
+
continue;
|
|
247
|
+
const stream = ctx.workspaceManager.getStream(streamId);
|
|
248
|
+
if (stream?.parentStream !== parentStreamId)
|
|
249
|
+
continue;
|
|
250
|
+
// Find agent's worktree
|
|
251
|
+
const worktree = ctx.workspaceManager.getWorktreeForAgent(agentId);
|
|
252
|
+
if (!worktree)
|
|
253
|
+
continue; // no worktree → can't sync; skip silently
|
|
254
|
+
// Map YAML's on_conflict → git-cascade ConflictStrategy. 'defer' has
|
|
255
|
+
// no git-native equivalent; we use 'manual' (git-cascade records the
|
|
256
|
+
// conflict and leaves the worktree in a conflict state).
|
|
257
|
+
const yamlStrategy = roleConfig.on_conflict ?? 'defer';
|
|
258
|
+
const onConflict = yamlStrategy === 'defer' ? 'manual' : yamlStrategy;
|
|
259
|
+
try {
|
|
260
|
+
ctx.workspaceManager.syncWithParent({
|
|
261
|
+
streamId,
|
|
262
|
+
agentId,
|
|
263
|
+
worktree: worktree.path,
|
|
264
|
+
onConflict,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Best-effort — don't throw out of an event handler
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=yaml-driven.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-driven.js","sourceRoot":"","sources":["../../../src/workspace/topology/yaml-driven.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace V3 Types — stream-first primitives.
|
|
3
|
+
*
|
|
4
|
+
* These types supplement the legacy role-shaped `types.ts` for the redesigned
|
|
5
|
+
* workspace layer (see `docs/workspace-interfaces.md`). Once the migration is
|
|
6
|
+
* complete (Phase 9), these merge back into `types.ts` and the V3 prefix is
|
|
7
|
+
* dropped.
|
|
8
|
+
*
|
|
9
|
+
* @module workspace/types-v3
|
|
10
|
+
*/
|
|
11
|
+
import type { Stream as GCStream, AgentWorktree, MergeResult as GCMergeResult, RebaseResult as GCRebaseResult, Change as GCChange, ChangeStatus, ConflictStrategy as GCConflictStrategy, ConflictRecord as GCConflictRecord } from 'git-cascade';
|
|
12
|
+
export type AgentId = string;
|
|
13
|
+
export type StreamId = string;
|
|
14
|
+
export type ChangeId = string;
|
|
15
|
+
export type QueueEntryId = string;
|
|
16
|
+
/**
|
|
17
|
+
* Pseudo-principals own resources that aren't bound to a live agent. Team-root
|
|
18
|
+
* streams use `team:<name>`; system-created streams use `system:<subsystem>`.
|
|
19
|
+
* Tagged via prefix; never terminates.
|
|
20
|
+
*/
|
|
21
|
+
export type PseudoAgentId = `team:${string}` | `system:${string}`;
|
|
22
|
+
export type Principal = AgentId | PseudoAgentId;
|
|
23
|
+
export declare const isPseudoAgentId: (p: Principal) => p is PseudoAgentId;
|
|
24
|
+
/**
|
|
25
|
+
* Specification for creating a new stream. If `parent` is set, the stream
|
|
26
|
+
* forks from that parent stream. Otherwise, `forkFrom` names the branch to
|
|
27
|
+
* fork from (defaults to 'main').
|
|
28
|
+
*/
|
|
29
|
+
export interface StreamSpec {
|
|
30
|
+
name: string;
|
|
31
|
+
ownerId: Principal;
|
|
32
|
+
parent?: StreamId;
|
|
33
|
+
forkFrom?: string;
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export type Stream = GCStream;
|
|
37
|
+
export type MergeResult = GCMergeResult;
|
|
38
|
+
export type RebaseResult = GCRebaseResult;
|
|
39
|
+
export type Change = GCChange;
|
|
40
|
+
export type ConflictStrategy = GCConflictStrategy;
|
|
41
|
+
export type ConflictRecord = GCConflictRecord;
|
|
42
|
+
export type { ChangeStatus };
|
|
43
|
+
export interface AllocateWorktreeOpts {
|
|
44
|
+
agentId: Principal;
|
|
45
|
+
streamId?: StreamId;
|
|
46
|
+
baseDir?: string;
|
|
47
|
+
pooled?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* If set, co-locate this agent on the referenced agent's worktree
|
|
50
|
+
* (ref-counted; last-out wins on deallocation).
|
|
51
|
+
*/
|
|
52
|
+
sharedWithAgent?: AgentId;
|
|
53
|
+
/** Optional branch override; defaults to the stream's branch. */
|
|
54
|
+
branch?: string;
|
|
55
|
+
}
|
|
56
|
+
export type Worktree = AgentWorktree;
|
|
57
|
+
export type CascadeStrategy = 'stop_on_conflict' | 'skip_conflicting' | 'defer_conflicts';
|
|
58
|
+
export interface CascadeResult {
|
|
59
|
+
rootStreamId: StreamId;
|
|
60
|
+
succeeded: StreamId[];
|
|
61
|
+
failed: Array<{
|
|
62
|
+
streamId: StreamId;
|
|
63
|
+
conflictId?: string;
|
|
64
|
+
error?: string;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Result of macro-agent's reconcile wrapper — handles both git-cascade's
|
|
69
|
+
* stream↔git sync and macro-level worktree/pool state.
|
|
70
|
+
*/
|
|
71
|
+
export interface MacroReconcileResult {
|
|
72
|
+
streamsChecked: number;
|
|
73
|
+
streamsFixed: number;
|
|
74
|
+
worktreesOrphaned: number;
|
|
75
|
+
worktreesCleaned: number;
|
|
76
|
+
poolEntriesPurged: number;
|
|
77
|
+
errors: Array<{
|
|
78
|
+
context: string;
|
|
79
|
+
message: string;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
export interface LandingContext {
|
|
83
|
+
agentId: AgentId;
|
|
84
|
+
streamId: StreamId;
|
|
85
|
+
sourceWorktree: string;
|
|
86
|
+
targetStreamId?: StreamId;
|
|
87
|
+
strategyConfig?: Record<string, unknown>;
|
|
88
|
+
/** Reference to the manager; strategies call back for merge/cascade. */
|
|
89
|
+
workspaceManager: unknown;
|
|
90
|
+
/**
|
|
91
|
+
* Optional task reference inherited from the spawning agent. Strategies
|
|
92
|
+
* that produce commits/merges should thread this into their adapter
|
|
93
|
+
* calls' metadata as `{ task_ref }` so the resulting cascade events carry
|
|
94
|
+
* the binding.
|
|
95
|
+
*/
|
|
96
|
+
taskRef?: import('git-cascade/events').TaskRef;
|
|
97
|
+
}
|
|
98
|
+
export interface LandingStrategy {
|
|
99
|
+
readonly name: string;
|
|
100
|
+
canLand?(ctx: LandingContext): boolean;
|
|
101
|
+
land(ctx: LandingContext): Promise<MergeResult>;
|
|
102
|
+
initialize?(): Promise<void>;
|
|
103
|
+
close?(): Promise<void>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Opaque branded marker — use for inferring that something is a v3 concept.
|
|
107
|
+
* Only used in documentation / type exports; no runtime effect.
|
|
108
|
+
*/
|
|
109
|
+
export declare const V3_MARKER: unique symbol;
|
|
110
|
+
//# sourceMappingURL=types-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-v3.d.ts","sourceRoot":"","sources":["../../src/workspace/types-v3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace V3 Types — stream-first primitives.
|
|
3
|
+
*
|
|
4
|
+
* These types supplement the legacy role-shaped `types.ts` for the redesigned
|
|
5
|
+
* workspace layer (see `docs/workspace-interfaces.md`). Once the migration is
|
|
6
|
+
* complete (Phase 9), these merge back into `types.ts` and the V3 prefix is
|
|
7
|
+
* dropped.
|
|
8
|
+
*
|
|
9
|
+
* @module workspace/types-v3
|
|
10
|
+
*/
|
|
11
|
+
export const isPseudoAgentId = (p) => p.startsWith('team:') || p.startsWith('system:');
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
// Helpers
|
|
14
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Opaque branded marker — use for inferring that something is a v3 concept.
|
|
17
|
+
* Only used in documentation / type exports; no runtime effect.
|
|
18
|
+
*/
|
|
19
|
+
export const V3_MARKER = Symbol('workspace.v3');
|
|
20
|
+
//# sourceMappingURL=types-v3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-v3.js","sourceRoot":"","sources":["../../src/workspace/types-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAY,EAAsB,EAAE,CAClE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAyGnD,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAkB,MAAM,CAAC,cAAc,CAAC,CAAC"}
|