macro-agent 0.1.10 → 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/CLAUDE.md +97 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +42 -6
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/adapters/tasks-adapter.d.ts.map +1 -1
- package/dist/adapters/tasks-adapter.js +3 -0
- package/dist/adapters/tasks-adapter.js.map +1 -1
- package/dist/adapters/types.d.ts +1 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/agent/agent-manager-v2.d.ts.map +1 -1
- package/dist/agent/agent-manager-v2.js +74 -11
- package/dist/agent/agent-manager-v2.js.map +1 -1
- package/dist/agent/agent-store.d.ts +10 -0
- package/dist/agent/agent-store.d.ts.map +1 -1
- package/dist/agent/agent-store.js +22 -0
- package/dist/agent/agent-store.js.map +1 -1
- package/dist/boot-v2.d.ts +88 -1
- package/dist/boot-v2.d.ts.map +1 -1
- package/dist/boot-v2.js +343 -7
- package/dist/boot-v2.js.map +1 -1
- package/dist/cli/acp.js +4 -0
- package/dist/cli/acp.js.map +1 -1
- package/dist/lifecycle/cascade.d.ts +25 -2
- package/dist/lifecycle/cascade.d.ts.map +1 -1
- package/dist/lifecycle/cascade.js +70 -2
- package/dist/lifecycle/cascade.js.map +1 -1
- package/dist/map/cascade-action-handler.d.ts +24 -0
- package/dist/map/cascade-action-handler.d.ts.map +1 -0
- package/dist/map/cascade-action-handler.js +170 -0
- package/dist/map/cascade-action-handler.js.map +1 -0
- package/dist/map/cascade-bridge.d.ts.map +1 -1
- package/dist/map/cascade-bridge.js +42 -5
- package/dist/map/cascade-bridge.js.map +1 -1
- package/dist/map/coordination-handler.d.ts.map +1 -1
- package/dist/map/coordination-handler.js +12 -1
- package/dist/map/coordination-handler.js.map +1 -1
- package/dist/map/server.d.ts.map +1 -1
- package/dist/map/server.js +172 -1
- package/dist/map/server.js.map +1 -1
- package/dist/map/sidecar.d.ts.map +1 -1
- package/dist/map/sidecar.js +18 -2
- package/dist/map/sidecar.js.map +1 -1
- package/dist/map/types.d.ts +2 -0
- package/dist/map/types.d.ts.map +1 -1
- 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/git-cascade-adapter.d.ts +1 -1
- package/dist/workspace/git-cascade-adapter.d.ts.map +1 -1
- package/dist/workspace/git-cascade-adapter.js +26 -0
- package/dist/workspace/git-cascade-adapter.js.map +1 -1
- package/dist/workspace/landing/merge-to-parent.d.ts.map +1 -1
- package/dist/workspace/landing/merge-to-parent.js +1 -0
- package/dist/workspace/landing/merge-to-parent.js.map +1 -1
- package/dist/workspace/recovery/spawn-resolver.d.ts.map +1 -1
- package/dist/workspace/recovery/spawn-resolver.js +8 -1
- package/dist/workspace/recovery/spawn-resolver.js.map +1 -1
- package/dist/workspace/types-v3.d.ts +7 -0
- package/dist/workspace/types-v3.d.ts.map +1 -1
- package/dist/workspace/types-v3.js.map +1 -1
- package/dist/workspace/types.d.ts +17 -0
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +9 -0
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.js +45 -2
- package/dist/workspace/workspace-manager.js.map +1 -1
- package/docs/design/task-dispatcher.md +880 -0
- package/package.json +3 -3
- package/src/__tests__/boot-v2.test.ts +435 -0
- package/src/__tests__/e2e/acp-over-map.e2e.test.ts +92 -0
- package/src/__tests__/e2e/bootstrap.e2e.test.ts +319 -0
- package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +495 -0
- package/src/__tests__/e2e/dispatch-live.e2e.test.ts +564 -0
- package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +496 -0
- package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +456 -0
- package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +386 -0
- package/src/__tests__/e2e/dispatch.e2e.test.ts +376 -0
- package/src/acp/macro-agent.ts +41 -6
- package/src/adapters/__tests__/tasks-adapter.test.ts +1 -0
- package/src/adapters/tasks-adapter.ts +3 -0
- package/src/adapters/types.ts +1 -0
- package/src/agent/__tests__/agent-store.test.ts +52 -0
- package/src/agent/agent-manager-v2.ts +79 -11
- package/src/agent/agent-store.ts +24 -0
- package/src/boot-v2.ts +522 -35
- package/src/cli/acp.ts +4 -0
- package/src/lifecycle/__tests__/cascade-consolidation.test.ts +240 -0
- package/src/lifecycle/cascade.ts +77 -2
- package/src/map/__tests__/emit-event.test.ts +71 -0
- package/src/map/cascade-action-handler.ts +205 -0
- package/src/map/cascade-bridge.ts +43 -5
- package/src/map/coordination-handler.ts +13 -1
- package/src/map/server.ts +178 -1
- package/src/map/sidecar.ts +19 -2
- package/src/map/types.ts +3 -0
- package/src/teams/seed-defaults.ts +6 -2
- package/src/teams/team-loader.ts +18 -1
- package/src/workspace/__tests__/land-dispatch.test.ts +214 -0
- package/src/workspace/__tests__/self-driving-yaml.test.ts +10 -2
- package/src/workspace/git-cascade-adapter.ts +30 -3
- package/src/workspace/landing/__tests__/strategies.test.ts +42 -0
- package/src/workspace/landing/merge-to-parent.ts +1 -0
- package/src/workspace/recovery/spawn-resolver.ts +8 -1
- package/src/workspace/types-v3.ts +7 -0
- package/src/workspace/types.ts +20 -0
- package/src/workspace/workspace-manager.ts +61 -2
- package/templates/teams/self-driving/team.yaml +142 -0
- package/tsconfig.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../../src/lifecycle/cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA0B1E,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgB,EAChB,YAAiC,EACjC,UAA0B,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAEtD,MAAM,aAAa,GAAc,EAAE,CAAC;IACpC,MAAM,MAAM,GAA+C,EAAE,CAAC;IAE9D,sBAAsB;IACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEnD,iCAAiC;IACjC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,8BAA8B;QAC9B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,YAAY,GAAG,MAAM,wBAAwB,CACjD,KAAK,CAAC,EAAE,EACR,YAAY,EACZ,OAAO,CACR,CAAC;YAEF,wCAAwC;YACxC,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YAED,2BAA2B;YAC3B,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACvD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,aAAa,CAAC,MAAM;QACxC,aAAa;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC/C,CAAC;AACJ,CAAC;AAeD
|
|
1
|
+
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../../src/lifecycle/cascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade Action Handler — receives hub→runtime commands.
|
|
3
|
+
*
|
|
4
|
+
* Listens for `x-cascade/request.*` notifications from the OpenHive hub
|
|
5
|
+
* and dispatches to the GitCascadeAdapter. This is the inbound counterpart
|
|
6
|
+
* to the CascadeBridge (which handles outbound events).
|
|
7
|
+
*
|
|
8
|
+
* Actions are fire-and-forget from the hub's perspective: the hub sends
|
|
9
|
+
* the notification and the UI updates reactively when the resulting
|
|
10
|
+
* `x-cascade/stream.*` event flows back through the bridge.
|
|
11
|
+
*
|
|
12
|
+
* @module map/cascade-action-handler
|
|
13
|
+
*/
|
|
14
|
+
import type { GitCascadeAdapter } from '../workspace/git-cascade-adapter.js';
|
|
15
|
+
export interface CascadeActionConnection {
|
|
16
|
+
onNotification(method: string, handler: (params: unknown) => void | Promise<void>): void;
|
|
17
|
+
offNotification(method: string, handler: (params: unknown) => void | Promise<void>): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register cascade action handlers on the MAP connection.
|
|
21
|
+
* Returns a cleanup function that removes all handlers.
|
|
22
|
+
*/
|
|
23
|
+
export declare function setupCascadeActionHandlers(connection: CascadeActionConnection, adapter: GitCascadeAdapter): () => void;
|
|
24
|
+
//# sourceMappingURL=cascade-action-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade-action-handler.d.ts","sourceRoot":"","sources":["../../src/map/cascade-action-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACtC,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;IACR,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;CACT;AAYD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,iBAAiB,GACzB,MAAM,IAAI,CAgKZ"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade Action Handler — receives hub→runtime commands.
|
|
3
|
+
*
|
|
4
|
+
* Listens for `x-cascade/request.*` notifications from the OpenHive hub
|
|
5
|
+
* and dispatches to the GitCascadeAdapter. This is the inbound counterpart
|
|
6
|
+
* to the CascadeBridge (which handles outbound events).
|
|
7
|
+
*
|
|
8
|
+
* Actions are fire-and-forget from the hub's perspective: the hub sends
|
|
9
|
+
* the notification and the UI updates reactively when the resulting
|
|
10
|
+
* `x-cascade/stream.*` event flows back through the bridge.
|
|
11
|
+
*
|
|
12
|
+
* @module map/cascade-action-handler
|
|
13
|
+
*/
|
|
14
|
+
const REQUEST_METHODS = {
|
|
15
|
+
MERGE: 'x-cascade/request.merge',
|
|
16
|
+
ABANDON: 'x-cascade/request.abandon',
|
|
17
|
+
PAUSE: 'x-cascade/request.pause',
|
|
18
|
+
RESUME: 'x-cascade/request.resume',
|
|
19
|
+
RESOLVE: 'x-cascade/request.resolve',
|
|
20
|
+
PUSH: 'x-cascade/request.push',
|
|
21
|
+
COMMIT: 'x-cascade/request.commit',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Register cascade action handlers on the MAP connection.
|
|
25
|
+
* Returns a cleanup function that removes all handlers.
|
|
26
|
+
*/
|
|
27
|
+
export function setupCascadeActionHandlers(connection, adapter) {
|
|
28
|
+
const handlers = [];
|
|
29
|
+
const register = (method, handler) => {
|
|
30
|
+
connection.onNotification(method, handler);
|
|
31
|
+
handlers.push({ method, handler });
|
|
32
|
+
};
|
|
33
|
+
/** Find the first worktree checked out on a given stream. */
|
|
34
|
+
function findWorktreeForStream(streamId) {
|
|
35
|
+
const wts = adapter.listWorktrees();
|
|
36
|
+
const match = wts.find((wt) => wt.currentStream === streamId);
|
|
37
|
+
return match?.path ?? null;
|
|
38
|
+
}
|
|
39
|
+
// ── Merge ─────────────────────────────────────────────────────────
|
|
40
|
+
register(REQUEST_METHODS.MERGE, (params) => {
|
|
41
|
+
const p = params;
|
|
42
|
+
if (!p?.stream_id)
|
|
43
|
+
return;
|
|
44
|
+
const stream = adapter.getStream(p.stream_id);
|
|
45
|
+
const targetStreamId = p.target_stream_id ?? stream?.parentStream;
|
|
46
|
+
if (!targetStreamId)
|
|
47
|
+
return;
|
|
48
|
+
const worktreePath = findWorktreeForStream(p.stream_id);
|
|
49
|
+
if (!worktreePath)
|
|
50
|
+
return;
|
|
51
|
+
try {
|
|
52
|
+
adapter.mergeStream({
|
|
53
|
+
sourceStream: p.stream_id,
|
|
54
|
+
targetStream: targetStreamId,
|
|
55
|
+
agentId: 'hub-request',
|
|
56
|
+
worktree: worktreePath,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Non-fatal — the resulting event (or conflict) will surface via the bridge
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// ── Abandon ───────────────────────────────────────────────────────
|
|
64
|
+
register(REQUEST_METHODS.ABANDON, (params) => {
|
|
65
|
+
const p = params;
|
|
66
|
+
if (!p?.stream_id)
|
|
67
|
+
return;
|
|
68
|
+
try {
|
|
69
|
+
adapter.abandonStream(p.stream_id, { reason: p.reason ?? 'hub-request' });
|
|
70
|
+
}
|
|
71
|
+
catch { /* non-fatal */ }
|
|
72
|
+
});
|
|
73
|
+
// ── Pause ─────────────────────────────────────────────────────────
|
|
74
|
+
register(REQUEST_METHODS.PAUSE, (params) => {
|
|
75
|
+
const p = params;
|
|
76
|
+
if (!p?.stream_id)
|
|
77
|
+
return;
|
|
78
|
+
try {
|
|
79
|
+
adapter.pauseStream(p.stream_id, p.reason);
|
|
80
|
+
}
|
|
81
|
+
catch { /* non-fatal */ }
|
|
82
|
+
});
|
|
83
|
+
// ── Resume ────────────────────────────────────────────────────────
|
|
84
|
+
register(REQUEST_METHODS.RESUME, (params) => {
|
|
85
|
+
const p = params;
|
|
86
|
+
if (!p?.stream_id)
|
|
87
|
+
return;
|
|
88
|
+
try {
|
|
89
|
+
adapter.resumeStream(p.stream_id);
|
|
90
|
+
}
|
|
91
|
+
catch { /* non-fatal */ }
|
|
92
|
+
});
|
|
93
|
+
// ── Resolve conflict ──────────────────────────────────────────────
|
|
94
|
+
register(REQUEST_METHODS.RESOLVE, (params) => {
|
|
95
|
+
const p = params;
|
|
96
|
+
if (!p?.stream_id || !p?.conflict_id)
|
|
97
|
+
return;
|
|
98
|
+
try {
|
|
99
|
+
adapter.resolveConflict({
|
|
100
|
+
conflictId: p.conflict_id,
|
|
101
|
+
resolution: {
|
|
102
|
+
method: p.strategy ?? 'ours',
|
|
103
|
+
resolvedBy: 'hub-request',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch { /* non-fatal */ }
|
|
108
|
+
});
|
|
109
|
+
// ── Push ───────────────────────────────────────────────────────────
|
|
110
|
+
register(REQUEST_METHODS.PUSH, (params) => {
|
|
111
|
+
const p = params;
|
|
112
|
+
if (!p?.stream_id)
|
|
113
|
+
return;
|
|
114
|
+
const worktreePath = findWorktreeForStream(p.stream_id);
|
|
115
|
+
if (!worktreePath)
|
|
116
|
+
return;
|
|
117
|
+
const remote = p.remote ?? 'origin';
|
|
118
|
+
const streamBranch = `stream/${p.stream_id}`;
|
|
119
|
+
const targetRef = p.target_ref ?? streamBranch;
|
|
120
|
+
try {
|
|
121
|
+
const { execSync } = require('child_process');
|
|
122
|
+
execSync(`git push ${remote} ${streamBranch}:refs/heads/${targetRef}`, {
|
|
123
|
+
cwd: worktreePath,
|
|
124
|
+
stdio: 'pipe',
|
|
125
|
+
encoding: 'utf-8',
|
|
126
|
+
});
|
|
127
|
+
// Emit pushed event so the hub records it
|
|
128
|
+
adapter.notifyStreamPushed?.({
|
|
129
|
+
streamId: p.stream_id,
|
|
130
|
+
agentId: 'hub-request',
|
|
131
|
+
pushedCommit: execSync('git rev-parse HEAD', {
|
|
132
|
+
cwd: worktreePath,
|
|
133
|
+
encoding: 'utf-8',
|
|
134
|
+
}).trim(),
|
|
135
|
+
remote,
|
|
136
|
+
remoteRef: targetRef,
|
|
137
|
+
strategy: 'hub-push',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch { /* non-fatal — push failure is reported via absence of pushed event */ }
|
|
141
|
+
});
|
|
142
|
+
// ── Commit ────────────────────────────────────────────────────────
|
|
143
|
+
register(REQUEST_METHODS.COMMIT, (params) => {
|
|
144
|
+
const p = params;
|
|
145
|
+
if (!p?.stream_id)
|
|
146
|
+
return;
|
|
147
|
+
const worktreePath = findWorktreeForStream(p.stream_id);
|
|
148
|
+
if (!worktreePath)
|
|
149
|
+
return;
|
|
150
|
+
const message = p.message ?? 'checkpoint (hub-requested)';
|
|
151
|
+
try {
|
|
152
|
+
adapter.commitChanges({
|
|
153
|
+
streamId: p.stream_id,
|
|
154
|
+
agentId: 'hub-request',
|
|
155
|
+
worktree: worktreePath,
|
|
156
|
+
message,
|
|
157
|
+
metadata: p.metadata,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch { /* non-fatal — nothing to commit, or stream conflicted */ }
|
|
161
|
+
});
|
|
162
|
+
// ── Cleanup ───────────────────────────────────────────────────────
|
|
163
|
+
return () => {
|
|
164
|
+
for (const { method, handler } of handlers) {
|
|
165
|
+
connection.offNotification(method, handler);
|
|
166
|
+
}
|
|
167
|
+
handlers.length = 0;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=cascade-action-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade-action-handler.js","sourceRoot":"","sources":["../../src/map/cascade-action-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,yBAAyB;IAChC,OAAO,EAAE,2BAA2B;IACpC,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,0BAA0B;IAClC,OAAO,EAAE,2BAA2B;IACpC,IAAI,EAAE,wBAAwB;IAC9B,MAAM,EAAE,0BAA0B;CAC1B,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAmC,EACnC,OAA0B;IAE1B,MAAM,QAAQ,GAGT,EAAE,CAAC;IAER,MAAM,QAAQ,GAAG,CACf,MAAc,EACd,OAAkD,EAC5C,EAAE;QACR,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,6DAA6D;IAC7D,SAAS,qBAAqB,CAAC,QAAgB;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;QAC9D,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,MAAe,EAAE,EAAE;QAClD,MAAM,CAAC,GAAG,MAA2D,CAAC;QACtE,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,CAAC,CAAC,gBAAgB,IAAI,MAAM,EAAE,YAAY,CAAC;QAClE,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,YAAY,EAAE,CAAC,CAAC,SAAS;gBACzB,YAAY,EAAE,cAAc;gBAC5B,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,YAAY;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,4EAA4E;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,MAAe,EAAE,EAAE;QACpD,MAAM,CAAC,GAAG,MAAiD,CAAC;QAC5D,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,MAAe,EAAE,EAAE;QAClD,MAAM,CAAC,GAAG,MAAiD,CAAC;QAC5D,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,MAAe,EAAE,EAAE;QACnD,MAAM,CAAC,GAAG,MAAgC,CAAC;QAC3C,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,MAAe,EAAE,EAAE;QACpD,MAAM,CAAC,GAAG,MAIT,CAAC;QACF,IAAI,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,WAAW;YAAE,OAAO;QAC7C,IAAI,CAAC;YACH,OAAO,CAAC,eAAe,CAAC;gBACtB,UAAU,EAAE,CAAC,CAAC,WAAW;gBACzB,UAAU,EAAE;oBACV,MAAM,EAAG,CAAC,CAAC,QAA8B,IAAI,MAAM;oBACnD,UAAU,EAAE,aAAa;iBAC1B;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAe,EAAE,EAAE;QACjD,MAAM,CAAC,GAAG,MAIT,CAAC;QACF,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC;QACpC,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,IAAI,YAAY,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9C,QAAQ,CAAC,YAAY,MAAM,IAAI,YAAY,eAAe,SAAS,EAAE,EAAE;gBACrE,GAAG,EAAE,YAAY;gBACjB,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,0CAA0C;YAC1C,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,QAAQ,CAAC,oBAAoB,EAAE;oBAC3C,GAAG,EAAE,YAAY;oBACjB,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC,IAAI,EAAE;gBACT,MAAM;gBACN,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,sEAAsE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,MAAe,EAAE,EAAE;QACnD,MAAM,CAAC,GAAG,MAIT,CAAC;QACF,IAAI,CAAC,CAAC,EAAE,SAAS;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,4BAA4B,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,CAAC,aAAa,CAAC;gBACpB,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,YAAY;gBACtB,OAAO;gBACP,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,yDAAyD,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3C,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-bridge.d.ts","sourceRoot":"","sources":["../../src/map/cascade-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"cascade-bridge.d.ts","sourceRoot":"","sources":["../../src/map/cascade-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,qCAAqC,CAAC;AAE7C,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,yBAAyB,EACrC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CA2BzB"}
|
|
@@ -20,6 +20,13 @@
|
|
|
20
20
|
* @module map/cascade-bridge
|
|
21
21
|
*/
|
|
22
22
|
import { CASCADE_METHODS } from 'git-cascade/events';
|
|
23
|
+
// Fallback method names for events not yet present in the installed
|
|
24
|
+
// git-cascade version (`STREAM_PAUSED`, `STREAM_RESUMED`,
|
|
25
|
+
// `STREAM_ROLLED_BACK` were added after 0.0.7). When the dep is upgraded,
|
|
26
|
+
// collapse these back into `CASCADE_METHODS.*` for a single source of truth.
|
|
27
|
+
const X_CASCADE_STREAM_PAUSED = 'x-cascade/stream.paused';
|
|
28
|
+
const X_CASCADE_STREAM_RESUMED = 'x-cascade/stream.resumed';
|
|
29
|
+
const X_CASCADE_STREAM_ROLLED_BACK = 'x-cascade/stream.rolled_back';
|
|
23
30
|
/**
|
|
24
31
|
* Create a cascade bridge.
|
|
25
32
|
*
|
|
@@ -245,11 +252,41 @@ function translate(event) {
|
|
|
245
252
|
outcome: d.outcome,
|
|
246
253
|
},
|
|
247
254
|
};
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
255
|
+
case 'stream:paused':
|
|
256
|
+
if (!d.streamId)
|
|
257
|
+
return null;
|
|
258
|
+
return {
|
|
259
|
+
method: X_CASCADE_STREAM_PAUSED,
|
|
260
|
+
params: {
|
|
261
|
+
stream_id: d.streamId,
|
|
262
|
+
reason: d.reason,
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
case 'stream:resumed':
|
|
266
|
+
if (!d.streamId)
|
|
267
|
+
return null;
|
|
268
|
+
return {
|
|
269
|
+
method: X_CASCADE_STREAM_RESUMED,
|
|
270
|
+
params: {
|
|
271
|
+
stream_id: d.streamId,
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
case 'stream:rolled_back':
|
|
275
|
+
if (!d.streamId)
|
|
276
|
+
return null;
|
|
277
|
+
return {
|
|
278
|
+
method: X_CASCADE_STREAM_ROLLED_BACK,
|
|
279
|
+
params: {
|
|
280
|
+
stream_id: d.streamId,
|
|
281
|
+
strategy: d.strategy,
|
|
282
|
+
target: d.target,
|
|
283
|
+
new_head: d.newHead,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
// Local-only events with no MAP counterpart.
|
|
287
|
+
// 'stream:updated', 'stream:forked', 'worktree:*', 'task:*',
|
|
288
|
+
// 'change:*', 'conflict:*' (legacy local-only variant — cascade-bridge
|
|
289
|
+
// handles the cascade-driven 'conflict:resolved' separately above)
|
|
253
290
|
default:
|
|
254
291
|
return null;
|
|
255
292
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-bridge.js","sourceRoot":"","sources":["../../src/map/cascade-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cascade-bridge.js","sourceRoot":"","sources":["../../src/map/cascade-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,oEAAoE;AACpE,0DAA0D;AAC1D,0EAA0E;AAC1E,6EAA6E;AAC7E,MAAM,uBAAuB,GAAG,yBAAkC,CAAC;AACnE,MAAM,wBAAwB,GAAG,0BAAmC,CAAC;AACrE,MAAM,4BAA4B,GAAG,8BAAuC,CAAC;AAiB7E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAqC,EACrC,OAA0B,EAC1B,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,KAAsB,EAAE,EAAE;QAC7D,IAAI,CAAC,UAAU,CAAC,WAAW;YAAE,OAAO;QAEpC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,sEAAsE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,yCAAyC;QACzC,KAAK,UAAU;aACZ,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;aAC3C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CACV,sCAAsC,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,GAAG,EACvE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,SAAS,SAAS,CAAC,KAAsB;IACvC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IAErB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,gBAAgB;YACnB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,aAAa;gBACrC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,gBAAgB;gBACxC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,WAAW,EAAE,CAAC,CAAC,MAAM;oBACrB,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,eAAe,EAAE,CAAC,CAAC,cAAc;oBACjC,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,eAAe;YAClB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,aAAa;gBACrC,MAAM,EAAE;oBACN,gBAAgB,EAAE,CAAC,CAAC,cAAc;oBAClC,gBAAgB,EAAE,CAAC,CAAC,cAAc;oBAClC,YAAY,EAAE,CAAC,CAAC,WAAW;oBAC3B,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,iBAAiB;gBACzC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,gBAAgB,EAAE,CAAC,CAAC,eAAe;oBACnC,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,kBAAkB,EAAE,CAAC,CAAC,iBAAiB;oBACvC,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,mBAAmB;YACtB,qEAAqE;YACrE,uEAAuE;YACvE,uEAAuE;YACvE,qEAAqE;YACrE,gDAAgD;YAChD,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,wBAAwB;gBAChD,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,iBAAiB,EACd,CAAC,CAAC,gBAAuC;wBAC1C,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACrC,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,kBAAkB,EAAE,CAAC,CAAC,iBAAiB;oBACvC,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,gBAAgB;gBACxC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,eAAe;YAClB,oEAAoE;YACpE,+DAA+D;YAC/D,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAChE,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,aAAa;gBACrC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ;oBAC5B,UAAU,EAAE,CAAC,CAAC,SAAS;oBACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,eAAe;gBACvC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,sBAAsB,EAAE,CAAC,CAAC,mBAAmB;oBAC7C,qBAAqB,EAAE,CAAC,CAAC,kBAAkB;oBAC3C,eAAe,EAAE,CAAC,CAAC,aAAa;oBAChC,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,WAAW,EAAE,CAAC,CAAC,UAAU;oBACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,iBAAiB;gBACzC,MAAM,EAAE;oBACN,cAAc,EAAE,CAAC,CAAC,YAAY;oBAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,eAAe,EAAE,CAAC,CAAC,cAAc;oBACjC,cAAc,EAAE,CAAC,CAAC,aAAa;oBAC/B,eAAe,EAAE,CAAC,CAAC,cAAc;oBACjC,gBAAgB,EAAE,CAAC,CAAC,eAAe;oBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,kBAAkB;YACrB,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,WAAW;gBACnC,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,aAAa,EAAG,CAAC,CAAC,YAAmC,IAAI,MAAM;oBAC/D,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB;aACF,CAAC;QAEJ,KAAK,kBAAkB;YACrB,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,WAAW;gBACnC,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,aAAa,EAAG,CAAC,CAAC,YAAmC,IAAI,MAAM;iBAChE;aACF,CAAC;QAEJ,KAAK,sBAAsB;YACzB,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,eAAe;gBACvC,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,aAAa,EAAG,CAAC,CAAC,YAAmC,IAAI,MAAM;oBAC/D,MAAM,EAAE,CAAC,CAAC,MAAM;iBACjB;aACF,CAAC;QAEJ,KAAK,oBAAoB;YACvB,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,aAAa;gBACrC,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,aAAa,EAAG,CAAC,CAAC,YAAmC,IAAI,MAAM;oBAC/D,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB;aACF,CAAC;QAEJ,KAAK,eAAe;YAClB,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,uBAAuB;gBAC/B,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,MAAM,EAAE,CAAC,CAAC,MAAM;iBACjB;aACF,CAAC;QAEJ,KAAK,gBAAgB;YACnB,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;iBACtB;aACF,CAAC;QAEJ,KAAK,oBAAoB;YACvB,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,4BAA4B;gBACpC,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,OAAO;iBACpB;aACF,CAAC;QAEJ,6CAA6C;QAC7C,6DAA6D;QAC7D,uEAAuE;QACvE,mEAAmE;QACnE;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordination-handler.d.ts","sourceRoot":"","sources":["../../src/map/coordination-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAKV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;IACR,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;IACR,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE;QACjB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,yBAAyB,CAAC,GAAG,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC;KAC9D,CAAC;CACH;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,GACrB,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"coordination-handler.d.ts","sourceRoot":"","sources":["../../src/map/coordination-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAKV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;IACR,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACjD,IAAI,CAAC;IACR,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE;QACjB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,yBAAyB,CAAC,GAAG,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC;KAC9D,CAAC;CACH;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,GACrB,MAAM,IAAI,CA4KZ"}
|
|
@@ -31,12 +31,23 @@ export function setupCoordinationHandlers(deps) {
|
|
|
31
31
|
if (!p?.title)
|
|
32
32
|
return;
|
|
33
33
|
try {
|
|
34
|
-
//
|
|
34
|
+
// Extract tags and metadata from OpenHive context
|
|
35
|
+
const context = p.context ?? {};
|
|
36
|
+
const tags = Array.isArray(context.tags) ? context.tags : undefined;
|
|
37
|
+
const metadata = {
|
|
38
|
+
...context,
|
|
39
|
+
...(p.assigned_by ? { assigned_by: p.assigned_by } : {}),
|
|
40
|
+
...(p.deadline ? { deadline: p.deadline } : {}),
|
|
41
|
+
};
|
|
42
|
+
// Remove tags from metadata (already a top-level field)
|
|
43
|
+
delete metadata.tags;
|
|
35
44
|
const taskId = await tasksAdapter.createTask({
|
|
36
45
|
title: p.title,
|
|
37
46
|
content: p.description,
|
|
38
47
|
assignee: p.assigned_to,
|
|
48
|
+
tags,
|
|
39
49
|
priority: p.priority === "critical" ? 1 : p.priority === "high" ? 2 : p.priority === "low" ? 4 : 3,
|
|
50
|
+
metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
|
|
40
51
|
});
|
|
41
52
|
// Optionally spawn an agent to work on the task
|
|
42
53
|
if (p.assigned_to) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordination-handler.js","sourceRoot":"","sources":["../../src/map/coordination-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqCH,oCAAoC;AACpC,MAAM,OAAO,GAAG;IACd,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE,wBAAwB;IACrC,aAAa,EAAE,0BAA0B;IACzC,YAAY,EAAE,yBAAyB;IACvC,iBAAiB,EAAE,uCAAuC;CAClD,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAsB;IAEtB,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACtE,MAAM,QAAQ,GAAkF,EAAE,CAAC;IAEnG,MAAM,QAAQ,GAAG,CACf,MAAc,EACd,OAAkD,EAC5C,EAAE;QACR,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,MAAe,EAAE,EAAE;QACtD,MAAM,CAAC,GAAG,MAAgC,CAAC;QAC3C,IAAI,CAAC,CAAC,EAAE,KAAK;YAAE,OAAO;QAEtB,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"coordination-handler.js","sourceRoot":"","sources":["../../src/map/coordination-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/map/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/map/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAMD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,eAAoB,GAC3B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/map/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAMD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,eAAoB,GAC3B,iBAAiB,CA+rBnB"}
|
package/dist/map/server.js
CHANGED
|
@@ -46,6 +46,14 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
46
46
|
const clientWebSockets = new Map(); // participant/agent ID → WebSocket
|
|
47
47
|
// Track subscription IDs by client agent ID for ACP response delivery
|
|
48
48
|
const clientSubscriptions = new Map(); // agent ID → subscription IDs
|
|
49
|
+
/**
|
|
50
|
+
* Per-subscription monotonic event counter. The MAP SDK's Subscription
|
|
51
|
+
* checks `sequenceNumber !== lastSequenceNumber + 1` and warns on gaps —
|
|
52
|
+
* using `Date.now()` (millisecond timestamp) breaks that assumption since
|
|
53
|
+
* each event becomes a "gap". Track a per-subscription counter starting
|
|
54
|
+
* at 1 and increment per event.
|
|
55
|
+
*/
|
|
56
|
+
const subscriptionSequence = new Map(); // subscription ID → next sequence number
|
|
49
57
|
// Track original ws.send for each WebSocket (before interception)
|
|
50
58
|
const originalSends = new Map();
|
|
51
59
|
/**
|
|
@@ -57,11 +65,21 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
57
65
|
const handlers = {};
|
|
58
66
|
// ── Agent extensions ──────────────────────────────────────────
|
|
59
67
|
handlers["_macro/spawnAgent"] = async (params, ctx) => {
|
|
68
|
+
// Forward the full SpawnAgentOptions surface so callers can set
|
|
69
|
+
// permission mode, agent type, custom prompt, model config, etc.
|
|
70
|
+
// Previously this handler dropped everything except role/cwd/task,
|
|
71
|
+
// making _macro/spawnAgent useless for any non-default agent.
|
|
60
72
|
const spawned = await agentManager.spawn({
|
|
61
73
|
task: params.task ?? "Spawned via MAP",
|
|
62
74
|
parent: params.parent ?? null,
|
|
63
75
|
cwd: params.cwd,
|
|
64
76
|
role: params.role ?? "worker",
|
|
77
|
+
permissionMode: params.permissionMode,
|
|
78
|
+
agentType: params.agentType,
|
|
79
|
+
customPrompt: params.customPrompt,
|
|
80
|
+
topics: params.topics,
|
|
81
|
+
config: params.config,
|
|
82
|
+
taskRef: params.taskRef,
|
|
65
83
|
});
|
|
66
84
|
// Ensure agent is registered in MAPServer's registry.
|
|
67
85
|
// The lifecycle bridge may have already done this, but we also
|
|
@@ -104,6 +122,121 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
104
122
|
const spawned = await agentManager.resume(params.agentId);
|
|
105
123
|
return { agent: { id: spawned.id } };
|
|
106
124
|
};
|
|
125
|
+
/**
|
|
126
|
+
* Resume an agent session with full routing + session info returned.
|
|
127
|
+
*
|
|
128
|
+
* Session-first resolution: given a Claude Code `providerSessionId` (the
|
|
129
|
+
* session UUID persisted on the session record), reverse-look-up the
|
|
130
|
+
* owning agent. Falls back to `agentId` (either the MAP ULID or the
|
|
131
|
+
* local store id) when no providerSessionId is given or the reverse
|
|
132
|
+
* lookup misses.
|
|
133
|
+
*
|
|
134
|
+
* Behavior:
|
|
135
|
+
* 1. Resolve the local agent id.
|
|
136
|
+
* 2. Call `agentManager.resume(localId)` — idempotent; the manager
|
|
137
|
+
* re-spawns the coordinator/head-manager if its process isn't live,
|
|
138
|
+
* otherwise returns the existing handle.
|
|
139
|
+
* 3. Ensure the agent is registered in the MAPServer's registry so
|
|
140
|
+
* ACP streams can target it via the returned peerMapId.
|
|
141
|
+
* 4. Return `{ agent: { id: peerMapId, localId, name }, acpSessionId,
|
|
142
|
+
* providerSessionId }` — the caller needs peerMapId to open the
|
|
143
|
+
* ACP stream and providerSessionId to pass into `session/load` so
|
|
144
|
+
* Claude Code replays its on-disk transcript.
|
|
145
|
+
*
|
|
146
|
+
* Used by OpenHive's POST /sessions/:id/resume to revive a session whose
|
|
147
|
+
* swarm has been offline for longer than the hub's stale-grace window.
|
|
148
|
+
*/
|
|
149
|
+
handlers["_macro/resumeAgent"] = async (params, ctx) => {
|
|
150
|
+
const providerSessionIdParam = params.providerSessionId;
|
|
151
|
+
const agentIdParam = params.agentId;
|
|
152
|
+
let localId;
|
|
153
|
+
let providerSessionId;
|
|
154
|
+
if (providerSessionIdParam) {
|
|
155
|
+
const session = agentStore.findSessionByProviderSessionId(providerSessionIdParam);
|
|
156
|
+
if (session) {
|
|
157
|
+
localId = session.agent_id;
|
|
158
|
+
providerSessionId = session.provider_session_id;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!localId && agentIdParam) {
|
|
162
|
+
localId = mapIdToLocalId.get(agentIdParam) ?? agentIdParam;
|
|
163
|
+
const session = agentStore.getSession(localId);
|
|
164
|
+
providerSessionId = session?.provider_session_id;
|
|
165
|
+
}
|
|
166
|
+
if (!localId) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: "providerSessionId or agentId required",
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const agentRec = agentStore.getAgent(localId);
|
|
173
|
+
if (!agentRec) {
|
|
174
|
+
return { success: false, error: `Agent not found: ${localId}` };
|
|
175
|
+
}
|
|
176
|
+
// Already-running case: skip resume() (which rejects with ALREADY_RUNNING)
|
|
177
|
+
// and return the live agent's session info straight from the store.
|
|
178
|
+
// This makes the call idempotent — callers don't need to pre-check.
|
|
179
|
+
let resumedId;
|
|
180
|
+
let resumedSessionId;
|
|
181
|
+
let resumedName;
|
|
182
|
+
if (agentManager.hasActiveSession(localId)) {
|
|
183
|
+
resumedId = localId;
|
|
184
|
+
resumedName = agentRec.name;
|
|
185
|
+
const liveSession = agentStore.getSession(localId);
|
|
186
|
+
if (!liveSession) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
error: `Agent ${localId} is active but has no session record`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
resumedSessionId = liveSession.session_id;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
try {
|
|
196
|
+
const resumed = await agentManager.resume(localId);
|
|
197
|
+
resumedId = resumed.id;
|
|
198
|
+
resumedSessionId = resumed.session_id;
|
|
199
|
+
resumedName = resumed.name;
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return { success: false, error: err.message };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Ensure agent is registered in MAPServer's registry. resume() fires
|
|
206
|
+
// the spawned lifecycle event, which the lifecycle bridge handles —
|
|
207
|
+
// but we also register here for subscription routing context on the
|
|
208
|
+
// current MAP session (mirrors _macro/spawnAgent).
|
|
209
|
+
if (mapServer && !localIdToMapId.has(resumedId)) {
|
|
210
|
+
try {
|
|
211
|
+
const registered = mapServer.agents.register({
|
|
212
|
+
name: resumedName ?? resumedId,
|
|
213
|
+
role: agentRec.role,
|
|
214
|
+
state: "idle",
|
|
215
|
+
sessionId: ctx?.session?.id,
|
|
216
|
+
metadata: { peerAgentId: resumedId },
|
|
217
|
+
});
|
|
218
|
+
if (registered?.id) {
|
|
219
|
+
mapIdToLocalId.set(registered.id, resumedId);
|
|
220
|
+
localIdToMapId.set(resumedId, registered.id);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Best effort; lifecycle bridge will register on spawned event
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const peerMapId = localIdToMapId.get(resumedId) ?? resumedId;
|
|
228
|
+
return {
|
|
229
|
+
success: true,
|
|
230
|
+
agent: {
|
|
231
|
+
id: peerMapId,
|
|
232
|
+
localId: resumedId,
|
|
233
|
+
name: resumedName,
|
|
234
|
+
role: agentRec.role,
|
|
235
|
+
},
|
|
236
|
+
acpSessionId: resumedSessionId,
|
|
237
|
+
providerSessionId,
|
|
238
|
+
};
|
|
239
|
+
};
|
|
107
240
|
/**
|
|
108
241
|
* Terminate a running agent. Accepts either the agent's local ID or the
|
|
109
242
|
* MAP-assigned ULID (we resolve back to local via mapIdToLocalId).
|
|
@@ -236,15 +369,21 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
236
369
|
const subIds = clientSubscriptions.get(clientId) ?? [];
|
|
237
370
|
// Send as subscription event notification (what ACPStreamConnection expects).
|
|
238
371
|
// The _pushEvent method expects: { subscriptionId, sequenceNumber, eventId, timestamp, event }
|
|
372
|
+
//
|
|
373
|
+
// sequenceNumber must be a per-subscription monotonic counter that
|
|
374
|
+
// increments by exactly 1 — the SDK warns on any gap. Don't use
|
|
375
|
+
// Date.now() here (breaks the contract on every event).
|
|
239
376
|
for (const subId of subIds) {
|
|
240
377
|
const event = rawEvent.params?.event ?? rawEvent;
|
|
241
378
|
const eventId = event.id ?? `acp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
379
|
+
const nextSeq = (subscriptionSequence.get(subId) ?? 0) + 1;
|
|
380
|
+
subscriptionSequence.set(subId, nextSeq);
|
|
242
381
|
const notification = JSON.stringify({
|
|
243
382
|
jsonrpc: "2.0",
|
|
244
383
|
method: "map/event",
|
|
245
384
|
params: {
|
|
246
385
|
subscriptionId: subId,
|
|
247
|
-
sequenceNumber:
|
|
386
|
+
sequenceNumber: nextSeq,
|
|
248
387
|
eventId,
|
|
249
388
|
timestamp: Date.now(),
|
|
250
389
|
event,
|
|
@@ -351,6 +490,33 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
351
490
|
}
|
|
352
491
|
return originalSend(data, ...args);
|
|
353
492
|
};
|
|
493
|
+
// Observe incoming messages so we drop subscription IDs from our
|
|
494
|
+
// routing array when the client unsubscribes. Without this, closed
|
|
495
|
+
// ACP streams keep receiving events ("MAP: Event for unknown
|
|
496
|
+
// subscription" warnings on the client). We don't intercept the
|
|
497
|
+
// SDK's processing — this listener runs alongside it.
|
|
498
|
+
ws.on("message", (data) => {
|
|
499
|
+
try {
|
|
500
|
+
const text = typeof data === "string"
|
|
501
|
+
? data
|
|
502
|
+
: Buffer.isBuffer(data)
|
|
503
|
+
? data.toString("utf-8")
|
|
504
|
+
: String(data);
|
|
505
|
+
const msg = JSON.parse(text);
|
|
506
|
+
if (msg?.method === "map/unsubscribe") {
|
|
507
|
+
const subId = msg?.params?.subscriptionId;
|
|
508
|
+
if (typeof subId === "string") {
|
|
509
|
+
const idx = subscriptionIds.indexOf(subId);
|
|
510
|
+
if (idx >= 0)
|
|
511
|
+
subscriptionIds.splice(idx, 1);
|
|
512
|
+
subscriptionSequence.delete(subId);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
catch {
|
|
517
|
+
// Non-JSON or parse failure — ignore
|
|
518
|
+
}
|
|
519
|
+
});
|
|
354
520
|
const stream = websocketStream(ws);
|
|
355
521
|
const router = mapServer.accept(stream, {
|
|
356
522
|
role: "client",
|
|
@@ -359,6 +525,11 @@ export function createMAPServerInstance(deps, config = {}) {
|
|
|
359
525
|
router.start();
|
|
360
526
|
ws.on("close", () => {
|
|
361
527
|
connectionCount--;
|
|
528
|
+
// Clear sequence counters for any subscriptions belonging to this
|
|
529
|
+
// connection. Use a copy of subscriptionIds since we don't mutate it.
|
|
530
|
+
for (const subId of subscriptionIds) {
|
|
531
|
+
subscriptionSequence.delete(subId);
|
|
532
|
+
}
|
|
362
533
|
if (clientAgentId) {
|
|
363
534
|
clientWebSockets.delete(clientAgentId);
|
|
364
535
|
clientSubscriptions.delete(clientAgentId);
|