@pelotto-tech/bellwether 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +228 -1
- package/dist/agents/claude.d.ts +8 -0
- package/dist/agents/claude.js +63 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/copilot.d.ts +7 -0
- package/dist/agents/copilot.js +39 -0
- package/dist/agents/copilot.js.map +1 -0
- package/dist/agents/index.d.ts +5 -0
- package/dist/agents/index.js +8 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/paths.d.ts +2 -0
- package/dist/agents/paths.js +5 -0
- package/dist/agents/paths.js.map +1 -0
- package/dist/agents/types.d.ts +29 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +38 -0
- package/dist/install.js +104 -0
- package/dist/install.js.map +1 -0
- package/dist/json-file.d.ts +12 -0
- package/dist/json-file.js +33 -0
- package/dist/json-file.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +75 -0
- package/dist/main.js.map +1 -0
- package/dist/roles.d.ts +3 -0
- package/dist/roles.js +13 -0
- package/dist/roles.js.map +1 -0
- package/dist/run.d.ts +9 -0
- package/dist/run.js +41 -0
- package/dist/run.js.map +1 -0
- package/dist/skill.d.ts +9 -0
- package/dist/skill.js +65 -0
- package/dist/skill.js.map +1 -0
- package/package.json +53 -6
- package/runtime/adapter/dist/actions.d.ts +15 -0
- package/runtime/adapter/dist/actions.js +7 -0
- package/runtime/adapter/dist/actions.js.map +1 -0
- package/runtime/adapter/dist/bin.d.ts +2 -0
- package/runtime/adapter/dist/bin.js +121 -0
- package/runtime/adapter/dist/bin.js.map +1 -0
- package/runtime/adapter/dist/config.d.ts +41 -0
- package/runtime/adapter/dist/config.js +71 -0
- package/runtime/adapter/dist/config.js.map +1 -0
- package/runtime/adapter/dist/core.d.ts +8 -0
- package/runtime/adapter/dist/core.js +10 -0
- package/runtime/adapter/dist/core.js.map +1 -0
- package/runtime/adapter/dist/herdr/connection.d.ts +34 -0
- package/runtime/adapter/dist/herdr/connection.js +137 -0
- package/runtime/adapter/dist/herdr/connection.js.map +1 -0
- package/runtime/adapter/dist/herdr/index.d.ts +5 -0
- package/runtime/adapter/dist/herdr/index.js +5 -0
- package/runtime/adapter/dist/herdr/index.js.map +1 -0
- package/runtime/adapter/dist/herdr/mapper.d.ts +27 -0
- package/runtime/adapter/dist/herdr/mapper.js +141 -0
- package/runtime/adapter/dist/herdr/mapper.js.map +1 -0
- package/runtime/adapter/dist/herdr/paths.d.ts +29 -0
- package/runtime/adapter/dist/herdr/paths.js +89 -0
- package/runtime/adapter/dist/herdr/paths.js.map +1 -0
- package/runtime/adapter/dist/herdr/protocol.d.ts +102 -0
- package/runtime/adapter/dist/herdr/protocol.js +19 -0
- package/runtime/adapter/dist/herdr/protocol.js.map +1 -0
- package/runtime/adapter/dist/herdr/source.d.ts +99 -0
- package/runtime/adapter/dist/herdr/source.js +316 -0
- package/runtime/adapter/dist/herdr/source.js.map +1 -0
- package/runtime/adapter/dist/index.d.ts +6 -0
- package/runtime/adapter/dist/index.js +7 -0
- package/runtime/adapter/dist/index.js.map +1 -0
- package/runtime/adapter/dist/mock.d.ts +33 -0
- package/runtime/adapter/dist/mock.js +130 -0
- package/runtime/adapter/dist/mock.js.map +1 -0
- package/runtime/adapter/dist/random.d.ts +3 -0
- package/runtime/adapter/dist/random.js +18 -0
- package/runtime/adapter/dist/random.js.map +1 -0
- package/runtime/adapter/dist/recording.d.ts +22 -0
- package/runtime/adapter/dist/recording.js +52 -0
- package/runtime/adapter/dist/recording.js.map +1 -0
- package/runtime/adapter/dist/roles.d.ts +16 -0
- package/runtime/adapter/dist/roles.js +21 -0
- package/runtime/adapter/dist/roles.js.map +1 -0
- package/runtime/adapter/dist/rollup.d.ts +5 -0
- package/runtime/adapter/dist/rollup.js +18 -0
- package/runtime/adapter/dist/rollup.js.map +1 -0
- package/runtime/adapter/dist/scrub.d.ts +9 -0
- package/runtime/adapter/dist/scrub.js +56 -0
- package/runtime/adapter/dist/scrub.js.map +1 -0
- package/runtime/adapter/dist/server.d.ts +47 -0
- package/runtime/adapter/dist/server.js +119 -0
- package/runtime/adapter/dist/server.js.map +1 -0
- package/runtime/adapter/dist/source.d.ts +20 -0
- package/runtime/adapter/dist/source.js +14 -0
- package/runtime/adapter/dist/source.js.map +1 -0
- package/runtime/adapter/dist/types.d.ts +66 -0
- package/runtime/adapter/dist/types.js +23 -0
- package/runtime/adapter/dist/types.js.map +1 -0
- package/runtime/adapter/dist/world.d.ts +9 -0
- package/runtime/adapter/dist/world.js +64 -0
- package/runtime/adapter/dist/world.js.map +1 -0
- package/runtime/adapter/package.json +37 -0
- package/runtime/renderer/dist/assets/BitmapFont-CrMu5gVf.js +6 -0
- package/runtime/renderer/dist/assets/CanvasRenderer-BJUwGe2K.js +1 -0
- package/runtime/renderer/dist/assets/Filter-CYMWP98C.js +1 -0
- package/runtime/renderer/dist/assets/RenderTargetSystem-CUv6yCH8.js +184 -0
- package/runtime/renderer/dist/assets/WebGLRenderer-DT-aSeEc.js +156 -0
- package/runtime/renderer/dist/assets/WebGPURenderer-CV0poHB6.js +75 -0
- package/runtime/renderer/dist/assets/browserAll-BpE2Jy31.js +14 -0
- package/runtime/renderer/dist/assets/getTexelRangeRects-BCdgu8cV.js +195 -0
- package/runtime/renderer/dist/assets/index-BgIYSiaY.js +296 -0
- package/runtime/renderer/dist/assets/webworkerAll-DEtPMT-J.js +83 -0
- package/runtime/renderer/dist/index.html +36 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { HerdrConnection, HerdrError } from './connection.js';
|
|
4
|
+
import { applyStatusChange, diffParties, paneIds, partiesFromSnapshot } from './mapper.js';
|
|
5
|
+
import { discoverSessions, resolveTarget } from './paths.js';
|
|
6
|
+
import { AGENT_STATUS_CHANGED, LIFECYCLE_SUBSCRIPTIONS, } from './protocol.js';
|
|
7
|
+
/**
|
|
8
|
+
* Live source for one Herdr session.
|
|
9
|
+
*
|
|
10
|
+
* Follows the recovery rules in docs/research/socket-api.mdx: subscribe first,
|
|
11
|
+
* then read `session.snapshot` on another connection; lifecycle events only
|
|
12
|
+
* invalidate and trigger a serialized re-read; `events_lost` or a dropped
|
|
13
|
+
* connection means reconnect, resubscribe and re-read. Agent status changes
|
|
14
|
+
* arrive on a second, per-pane subscription that is reopened whenever the pane
|
|
15
|
+
* set changes.
|
|
16
|
+
*/
|
|
17
|
+
export class HerdrSessionSource extends EventEmitter {
|
|
18
|
+
opts;
|
|
19
|
+
session;
|
|
20
|
+
parties = {};
|
|
21
|
+
branches = new Map();
|
|
22
|
+
lifecycle;
|
|
23
|
+
status;
|
|
24
|
+
rpc;
|
|
25
|
+
statusPanes = '';
|
|
26
|
+
running = false;
|
|
27
|
+
hasSnapshot = false;
|
|
28
|
+
refreshing = false;
|
|
29
|
+
dirty = false;
|
|
30
|
+
refreshTimer;
|
|
31
|
+
reconnectTimer;
|
|
32
|
+
backoff;
|
|
33
|
+
now;
|
|
34
|
+
log;
|
|
35
|
+
ctx;
|
|
36
|
+
constructor(opts) {
|
|
37
|
+
super();
|
|
38
|
+
this.opts = opts;
|
|
39
|
+
this.session = opts.target.session;
|
|
40
|
+
this.now = opts.now ?? Date.now;
|
|
41
|
+
this.log = opts.log ?? (() => { });
|
|
42
|
+
this.backoff = opts.minBackoffMs ?? 500;
|
|
43
|
+
this.ctx = { session: this.session, branches: this.branches };
|
|
44
|
+
}
|
|
45
|
+
/** Current parties for this session (read-only view). */
|
|
46
|
+
get current() {
|
|
47
|
+
return this.parties;
|
|
48
|
+
}
|
|
49
|
+
async start() {
|
|
50
|
+
if (this.running)
|
|
51
|
+
return;
|
|
52
|
+
this.running = true;
|
|
53
|
+
try {
|
|
54
|
+
await this.connect();
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
this.log(`[${this.session}] connect failed: ${err.message}`);
|
|
58
|
+
this.scheduleReconnect();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async stop() {
|
|
62
|
+
this.running = false;
|
|
63
|
+
clearTimeout(this.refreshTimer);
|
|
64
|
+
clearTimeout(this.reconnectTimer);
|
|
65
|
+
for (const c of [this.lifecycle, this.status, this.rpc])
|
|
66
|
+
c?.close();
|
|
67
|
+
this.lifecycle = this.status = this.rpc = undefined;
|
|
68
|
+
this.statusPanes = '';
|
|
69
|
+
}
|
|
70
|
+
emitDelta(d) {
|
|
71
|
+
this.emit('delta', d);
|
|
72
|
+
}
|
|
73
|
+
async connect() {
|
|
74
|
+
const { connectPath } = this.opts.target;
|
|
75
|
+
const lc = await HerdrConnection.open(connectPath, this.opts.connector);
|
|
76
|
+
this.lifecycle = lc;
|
|
77
|
+
lc.on('event', (e) => this.onLifecycle(e));
|
|
78
|
+
lc.on('error', (err) => this.onStreamError('lifecycle', err));
|
|
79
|
+
lc.on('close', () => this.onStreamClosed(lc));
|
|
80
|
+
await lc.subscribe(LIFECYCLE_SUBSCRIPTIONS.map((type) => ({ type })));
|
|
81
|
+
this.backoff = this.opts.minBackoffMs ?? 500;
|
|
82
|
+
this.log(`[${this.session}] subscribed at ${connectPath}`);
|
|
83
|
+
await this.refresh();
|
|
84
|
+
}
|
|
85
|
+
onStreamError(which, err) {
|
|
86
|
+
const code = err instanceof HerdrError ? err.code : 'error';
|
|
87
|
+
this.log(`[${this.session}] ${which} stream: ${err.message}`);
|
|
88
|
+
if (code === 'events_lost') {
|
|
89
|
+
// Herdr closes the connection after this; onStreamClosed handles recovery.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
onStreamClosed(conn) {
|
|
93
|
+
if (!this.running)
|
|
94
|
+
return;
|
|
95
|
+
if (conn === this.lifecycle) {
|
|
96
|
+
this.lifecycle = undefined;
|
|
97
|
+
this.status?.close();
|
|
98
|
+
this.rpc?.close();
|
|
99
|
+
this.scheduleReconnect();
|
|
100
|
+
}
|
|
101
|
+
else if (conn === this.status) {
|
|
102
|
+
// Status stream lost (events_lost, or a pane vanished before subscribe): re-read and resubscribe.
|
|
103
|
+
this.status = undefined;
|
|
104
|
+
this.statusPanes = '';
|
|
105
|
+
this.scheduleRefresh();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
scheduleReconnect() {
|
|
109
|
+
if (!this.running)
|
|
110
|
+
return;
|
|
111
|
+
clearTimeout(this.reconnectTimer);
|
|
112
|
+
const delay = this.backoff;
|
|
113
|
+
this.backoff = Math.min(this.backoff * 2, this.opts.maxBackoffMs ?? 15_000);
|
|
114
|
+
this.reconnectTimer = setTimeout(() => {
|
|
115
|
+
this.connect().catch((err) => {
|
|
116
|
+
this.log(`[${this.session}] reconnect failed: ${err.message}`);
|
|
117
|
+
this.scheduleReconnect();
|
|
118
|
+
});
|
|
119
|
+
}, delay);
|
|
120
|
+
}
|
|
121
|
+
onLifecycle(e) {
|
|
122
|
+
const type = e.data.type ?? e.event;
|
|
123
|
+
if (type === 'worktree_created' || type === 'worktree_opened') {
|
|
124
|
+
const wt = e.data.worktree;
|
|
125
|
+
const ws = e.data.workspace;
|
|
126
|
+
if (wt?.branch && ws?.workspace_id)
|
|
127
|
+
this.branches.set(ws.workspace_id, wt.branch);
|
|
128
|
+
}
|
|
129
|
+
this.scheduleRefresh();
|
|
130
|
+
}
|
|
131
|
+
onStatus(e) {
|
|
132
|
+
if (e.event !== AGENT_STATUS_CHANGED)
|
|
133
|
+
return;
|
|
134
|
+
const ev = e.data;
|
|
135
|
+
const res = applyStatusChange(this.parties, ev, this.ctx);
|
|
136
|
+
if (!res) {
|
|
137
|
+
// A pane we don't model as a member yet (agent just appeared): re-read.
|
|
138
|
+
this.scheduleRefresh();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.parties = { ...this.parties, [res.party.id]: res.party };
|
|
142
|
+
const t = this.now();
|
|
143
|
+
this.emitDelta({ t, kind: 'member', partyId: res.party.id, member: res.member });
|
|
144
|
+
if (res.rollupChanged)
|
|
145
|
+
this.emitDelta({ t, kind: 'party', party: res.party });
|
|
146
|
+
}
|
|
147
|
+
scheduleRefresh() {
|
|
148
|
+
if (!this.running)
|
|
149
|
+
return;
|
|
150
|
+
clearTimeout(this.refreshTimer);
|
|
151
|
+
this.refreshTimer = setTimeout(() => void this.refresh(), this.opts.refreshDebounceMs ?? 50);
|
|
152
|
+
}
|
|
153
|
+
/** Serialized authoritative re-read. Events that land mid-read trigger one more read. */
|
|
154
|
+
async refresh() {
|
|
155
|
+
if (!this.running)
|
|
156
|
+
return;
|
|
157
|
+
if (this.refreshing) {
|
|
158
|
+
this.dirty = true;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.refreshing = true;
|
|
162
|
+
try {
|
|
163
|
+
do {
|
|
164
|
+
this.dirty = false;
|
|
165
|
+
const snap = await this.snapshot();
|
|
166
|
+
this.applySnapshot(snap);
|
|
167
|
+
await this.syncStatusSubscription(snap);
|
|
168
|
+
} while (this.dirty && this.running);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
this.log(`[${this.session}] refresh failed: ${err.message}`);
|
|
172
|
+
if (this.running && this.lifecycle)
|
|
173
|
+
this.scheduleRefresh();
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
this.refreshing = false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async rpcConn() {
|
|
180
|
+
if (!this.rpc || this.rpc.isClosed) {
|
|
181
|
+
this.rpc = await HerdrConnection.open(this.opts.target.connectPath, this.opts.connector);
|
|
182
|
+
this.rpc.on('error', () => { });
|
|
183
|
+
}
|
|
184
|
+
return this.rpc;
|
|
185
|
+
}
|
|
186
|
+
/** Actions for this session, mapped to Herdr's request/response API. */
|
|
187
|
+
actions = {
|
|
188
|
+
focus: async (paneId) => void (await (await this.rpcConn()).request('pane.focus', { pane_id: paneId })),
|
|
189
|
+
prompt: async (paneId, text) => void (await (await this.rpcConn()).request('agent.prompt', { target: paneId, text })),
|
|
190
|
+
sendKeys: async (paneId, keys) => void (await (await this.rpcConn()).request('agent.send_keys', { target: paneId, keys })),
|
|
191
|
+
};
|
|
192
|
+
/** Whether this session currently has a member in `paneId`. */
|
|
193
|
+
hasPane(paneId) {
|
|
194
|
+
return Object.values(this.parties).some((p) => paneId in p.members);
|
|
195
|
+
}
|
|
196
|
+
async snapshot() {
|
|
197
|
+
const rpc = await this.rpcConn();
|
|
198
|
+
const res = await rpc.request('session.snapshot');
|
|
199
|
+
if (res.type !== 'session_snapshot')
|
|
200
|
+
throw new HerdrError('unexpected', `snapshot answered ${res.type}`);
|
|
201
|
+
return res.snapshot;
|
|
202
|
+
}
|
|
203
|
+
applySnapshot(snap) {
|
|
204
|
+
const next = partiesFromSnapshot(snap, this.ctx);
|
|
205
|
+
const t = this.now();
|
|
206
|
+
if (!this.hasSnapshot) {
|
|
207
|
+
this.hasSnapshot = true;
|
|
208
|
+
this.parties = next;
|
|
209
|
+
this.emitDelta({ t, kind: 'snapshot', world: { machine: 'local', parties: next } });
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const deltas = diffParties(this.parties, next, t);
|
|
213
|
+
this.parties = next;
|
|
214
|
+
for (const d of deltas)
|
|
215
|
+
this.emitDelta(d);
|
|
216
|
+
}
|
|
217
|
+
async syncStatusSubscription(snap) {
|
|
218
|
+
const panes = paneIds(snap);
|
|
219
|
+
const key = panes.join(',');
|
|
220
|
+
if (key === this.statusPanes && this.status && !this.status.isClosed)
|
|
221
|
+
return;
|
|
222
|
+
const old = this.status;
|
|
223
|
+
this.status = undefined;
|
|
224
|
+
this.statusPanes = '';
|
|
225
|
+
old?.close();
|
|
226
|
+
if (!panes.length) {
|
|
227
|
+
this.statusPanes = key;
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const conn = await HerdrConnection.open(this.opts.target.connectPath, this.opts.connector);
|
|
231
|
+
conn.on('event', (e) => this.onStatus(e));
|
|
232
|
+
conn.on('error', (err) => this.onStreamError('status', err));
|
|
233
|
+
conn.on('close', () => this.onStreamClosed(conn));
|
|
234
|
+
this.status = conn;
|
|
235
|
+
try {
|
|
236
|
+
await conn.subscribe(panes.map((pane_id) => ({ type: AGENT_STATUS_CHANGED, pane_id })));
|
|
237
|
+
this.statusPanes = key;
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
// Herdr rejects the whole request if any pane vanished; close fires and we re-read.
|
|
241
|
+
conn.close();
|
|
242
|
+
throw err;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** Live Herdr source across one or more sessions, merged into one world. */
|
|
247
|
+
export class HerdrSource extends EventEmitter {
|
|
248
|
+
opts;
|
|
249
|
+
children = [];
|
|
250
|
+
machine;
|
|
251
|
+
constructor(opts = {}) {
|
|
252
|
+
super();
|
|
253
|
+
this.opts = opts;
|
|
254
|
+
this.machine = opts.machine ?? os.hostname() ?? 'local';
|
|
255
|
+
}
|
|
256
|
+
async targets() {
|
|
257
|
+
const { sessions, socket } = this.opts;
|
|
258
|
+
if (socket)
|
|
259
|
+
return [resolveTarget({ socket, session: Array.isArray(sessions) ? sessions[0] : undefined })];
|
|
260
|
+
if (sessions === 'all')
|
|
261
|
+
return discoverSessions();
|
|
262
|
+
if (Array.isArray(sessions) && sessions.length)
|
|
263
|
+
return sessions.map((session) => resolveTarget({ session }));
|
|
264
|
+
return [resolveTarget({})];
|
|
265
|
+
}
|
|
266
|
+
async start() {
|
|
267
|
+
const targets = await this.targets();
|
|
268
|
+
if (!targets.length)
|
|
269
|
+
this.opts.log?.('no running Herdr sessions found');
|
|
270
|
+
this.children = targets.map((target) => new HerdrSessionSource({
|
|
271
|
+
target,
|
|
272
|
+
connector: this.opts.connector,
|
|
273
|
+
now: this.opts.now,
|
|
274
|
+
refreshDebounceMs: this.opts.refreshDebounceMs,
|
|
275
|
+
minBackoffMs: this.opts.minBackoffMs,
|
|
276
|
+
maxBackoffMs: this.opts.maxBackoffMs,
|
|
277
|
+
log: this.opts.log,
|
|
278
|
+
}));
|
|
279
|
+
for (const c of this.children) {
|
|
280
|
+
c.on('delta', (d) => {
|
|
281
|
+
// A session's snapshot replaces only its parties; send the merged world.
|
|
282
|
+
if (d.kind === 'snapshot')
|
|
283
|
+
this.emit('delta', { ...d, world: this.world() });
|
|
284
|
+
else
|
|
285
|
+
this.emit('delta', d);
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
await Promise.all(this.children.map((c) => c.start()));
|
|
289
|
+
}
|
|
290
|
+
async stop() {
|
|
291
|
+
await Promise.all(this.children.map((c) => c.stop()));
|
|
292
|
+
this.children = [];
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Routes to the session that owns the pane. Pane ids are session-local, so with
|
|
296
|
+
* several sessions the first one holding the id wins.
|
|
297
|
+
*/
|
|
298
|
+
actions = {
|
|
299
|
+
focus: async (paneId) => this.route(paneId).focus(paneId),
|
|
300
|
+
prompt: async (paneId, text) => this.route(paneId).prompt(paneId, text),
|
|
301
|
+
sendKeys: async (paneId, keys) => this.route(paneId).sendKeys(paneId, keys),
|
|
302
|
+
};
|
|
303
|
+
route(paneId) {
|
|
304
|
+
const child = this.children.find((c) => c.hasPane(paneId));
|
|
305
|
+
if (!child)
|
|
306
|
+
throw new Error(`no pane ${paneId} in any session`);
|
|
307
|
+
return child.actions;
|
|
308
|
+
}
|
|
309
|
+
world() {
|
|
310
|
+
const parties = {};
|
|
311
|
+
for (const c of this.children)
|
|
312
|
+
Object.assign(parties, c.current);
|
|
313
|
+
return { machine: this.machine, parties };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/herdr/source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseSource } from './source.js';
|
|
2
|
+
import type { Delta, World } from './types.js';
|
|
3
|
+
export interface MockOptions {
|
|
4
|
+
seed?: number;
|
|
5
|
+
machine?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic world generator. `initial()` builds a starting World and
|
|
9
|
+
* `step()` returns the next Delta. No timers, so tests can drive it directly.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MockGenerator {
|
|
12
|
+
private rng;
|
|
13
|
+
private world;
|
|
14
|
+
private seq;
|
|
15
|
+
constructor(opts?: MockOptions);
|
|
16
|
+
initial(t?: number): Delta;
|
|
17
|
+
/** Current world after every delta handed out so far. */
|
|
18
|
+
get current(): World;
|
|
19
|
+
step(t?: number): Delta;
|
|
20
|
+
}
|
|
21
|
+
export interface MockSourceOptions extends MockOptions {
|
|
22
|
+
/** Milliseconds between deltas. */
|
|
23
|
+
intervalMs?: number;
|
|
24
|
+
}
|
|
25
|
+
/** Timer-driven WorldSource over MockGenerator. Safe to use in the browser. */
|
|
26
|
+
export declare class MockSource extends BaseSource {
|
|
27
|
+
private gen;
|
|
28
|
+
private timer;
|
|
29
|
+
private intervalMs;
|
|
30
|
+
constructor(opts?: MockSourceOptions);
|
|
31
|
+
start(): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createRng, pick } from './random.js';
|
|
2
|
+
import { BaseSource } from './source.js';
|
|
3
|
+
import { applyDelta, emptyWorld } from './world.js';
|
|
4
|
+
const PARTIES = [
|
|
5
|
+
{ label: 'auth-refresh', repo: 'api', branch: 'feat/auth-refresh', roles: ['coordinator', 'architect', 'implementer', 'reviewer'] },
|
|
6
|
+
{ label: 'docs-site', repo: 'docs', branch: 'docs/getting-started', roles: ['coordinator', 'writer', 'researcher'] },
|
|
7
|
+
{ label: 'deploy-pipeline', repo: 'infra', roles: ['architect', 'ops', 'implementer'] },
|
|
8
|
+
{ label: 'orchestrator', repo: 'home', roles: ['orchestrator'] },
|
|
9
|
+
];
|
|
10
|
+
const AGENTS = ['claude', 'claude', 'copilot', 'codex'];
|
|
11
|
+
const LINES = {
|
|
12
|
+
coordinator: ['Handing off the next task', 'Two branches left to merge', 'Checking in on the team'],
|
|
13
|
+
architect: ['Sketching the module split', 'This needs an interface', 'Reading the schema'],
|
|
14
|
+
implementer: ['Tests are green', 'Fixing a flaky test', 'Wiring up the handler'],
|
|
15
|
+
reviewer: ['Left three comments', 'Looks good to me', 'Can we name this better?'],
|
|
16
|
+
researcher: ['Found the upstream issue', 'Comparing two libraries'],
|
|
17
|
+
writer: ['Drafting the README', 'Tightening the intro'],
|
|
18
|
+
ops: ['Pipeline is running', 'Bumping the runner image'],
|
|
19
|
+
orchestrator: ['Starting a new worktree', 'Reviewing the plan'],
|
|
20
|
+
};
|
|
21
|
+
/** Weighted next-status table: mostly working/idle, sometimes done, rarely blocked. */
|
|
22
|
+
const NEXT = {
|
|
23
|
+
working: [['working', 3], ['done', 2], ['idle', 1], ['blocked', 1]],
|
|
24
|
+
done: [['idle', 3], ['working', 2]],
|
|
25
|
+
blocked: [['working', 3], ['blocked', 1]],
|
|
26
|
+
idle: [['working', 4], ['idle', 2]],
|
|
27
|
+
unknown: [['idle', 1], ['working', 1]],
|
|
28
|
+
};
|
|
29
|
+
function weighted(rng, table) {
|
|
30
|
+
const total = table.reduce((n, [, w]) => n + w, 0);
|
|
31
|
+
let roll = rng() * total;
|
|
32
|
+
for (const [status, w] of table) {
|
|
33
|
+
roll -= w;
|
|
34
|
+
if (roll < 0)
|
|
35
|
+
return status;
|
|
36
|
+
}
|
|
37
|
+
return table[table.length - 1][0];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Deterministic world generator. `initial()` builds a starting World and
|
|
41
|
+
* `step()` returns the next Delta. No timers, so tests can drive it directly.
|
|
42
|
+
*/
|
|
43
|
+
export class MockGenerator {
|
|
44
|
+
rng;
|
|
45
|
+
world;
|
|
46
|
+
seq = 0;
|
|
47
|
+
constructor(opts = {}) {
|
|
48
|
+
this.rng = createRng(opts.seed ?? 1);
|
|
49
|
+
this.world = emptyWorld(opts.machine ?? 'local');
|
|
50
|
+
}
|
|
51
|
+
initial(t = 0) {
|
|
52
|
+
const parties = {};
|
|
53
|
+
PARTIES.forEach((seed, i) => {
|
|
54
|
+
const id = `w${i + 1}`;
|
|
55
|
+
const members = {};
|
|
56
|
+
seed.roles.forEach((role, j) => {
|
|
57
|
+
const paneId = `${id}:p${j + 1}`;
|
|
58
|
+
members[paneId] = {
|
|
59
|
+
paneId,
|
|
60
|
+
agent: pick(this.rng, AGENTS),
|
|
61
|
+
role,
|
|
62
|
+
status: pick(this.rng, ['working', 'working', 'idle', 'done']),
|
|
63
|
+
title: role,
|
|
64
|
+
lastChange: this.seq++,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
parties[id] = {
|
|
68
|
+
id,
|
|
69
|
+
label: seed.label,
|
|
70
|
+
session: 'default',
|
|
71
|
+
repo: seed.repo,
|
|
72
|
+
branch: seed.branch,
|
|
73
|
+
isWorktree: seed.branch !== undefined,
|
|
74
|
+
status: 'unknown',
|
|
75
|
+
members,
|
|
76
|
+
tokens: {},
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
const delta = { t, kind: 'snapshot', world: { machine: this.world.machine, parties } };
|
|
80
|
+
this.world = applyDelta(this.world, delta);
|
|
81
|
+
return delta;
|
|
82
|
+
}
|
|
83
|
+
/** Current world after every delta handed out so far. */
|
|
84
|
+
get current() {
|
|
85
|
+
return this.world;
|
|
86
|
+
}
|
|
87
|
+
step(t = 0) {
|
|
88
|
+
const parties = Object.values(this.world.parties);
|
|
89
|
+
const party = pick(this.rng, parties);
|
|
90
|
+
const member = pick(this.rng, Object.values(party.members));
|
|
91
|
+
const roll = this.rng();
|
|
92
|
+
let delta;
|
|
93
|
+
if (roll < 0.25 && member.status === 'working') {
|
|
94
|
+
const lines = LINES[member.role] ?? ['Working on it'];
|
|
95
|
+
delta = { t, kind: 'say', partyId: party.id, paneId: member.paneId, text: pick(this.rng, lines) };
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const status = weighted(this.rng, NEXT[member.status]);
|
|
99
|
+
delta = {
|
|
100
|
+
t,
|
|
101
|
+
kind: 'member',
|
|
102
|
+
partyId: party.id,
|
|
103
|
+
member: { ...member, status, say: undefined, lastChange: this.seq++ },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
this.world = applyDelta(this.world, delta);
|
|
107
|
+
return delta;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Timer-driven WorldSource over MockGenerator. Safe to use in the browser. */
|
|
111
|
+
export class MockSource extends BaseSource {
|
|
112
|
+
gen;
|
|
113
|
+
timer;
|
|
114
|
+
intervalMs;
|
|
115
|
+
constructor(opts = {}) {
|
|
116
|
+
super();
|
|
117
|
+
this.gen = new MockGenerator(opts);
|
|
118
|
+
this.intervalMs = opts.intervalMs ?? 1500;
|
|
119
|
+
}
|
|
120
|
+
async start() {
|
|
121
|
+
this.emit(this.gen.initial(Date.now()));
|
|
122
|
+
this.timer = setInterval(() => this.emit(this.gen.step(Date.now())), this.intervalMs);
|
|
123
|
+
}
|
|
124
|
+
async stop() {
|
|
125
|
+
if (this.timer)
|
|
126
|
+
clearInterval(this.timer);
|
|
127
|
+
this.timer = undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** mulberry32: tiny seeded PRNG so mock runs and tests are reproducible. */
|
|
2
|
+
export function createRng(seed) {
|
|
3
|
+
let a = seed >>> 0;
|
|
4
|
+
return () => {
|
|
5
|
+
a = (a + 0x6d2b79f5) >>> 0;
|
|
6
|
+
let t = a;
|
|
7
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
8
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
9
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function pick(rng, items) {
|
|
13
|
+
const item = items[Math.floor(rng() * items.length)];
|
|
14
|
+
if (item === undefined)
|
|
15
|
+
throw new Error('pick() from an empty list');
|
|
16
|
+
return item;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,GAAiB,EAAE,KAAmB;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseSource } from './source.js';
|
|
2
|
+
import type { Delta } from './types.js';
|
|
3
|
+
/** Appends each delta as one JSON line. Recordings are local and gitignored. */
|
|
4
|
+
export declare function recordTo(path: string): (delta: Delta) => void;
|
|
5
|
+
export declare function parseRecording(text: string): Delta[];
|
|
6
|
+
export interface ReplayOptions {
|
|
7
|
+
/** Playback speed multiplier. */
|
|
8
|
+
speed?: number;
|
|
9
|
+
loop?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Replays a recorded delta stream with its original timing, scaled by `speed`. */
|
|
12
|
+
export declare class ReplaySource extends BaseSource {
|
|
13
|
+
private deltas;
|
|
14
|
+
private opts;
|
|
15
|
+
private timer;
|
|
16
|
+
private stopped;
|
|
17
|
+
constructor(deltas: Delta[], opts?: ReplayOptions);
|
|
18
|
+
static fromFile(path: string, opts?: ReplayOptions): ReplaySource;
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
private play;
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { appendFileSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { BaseSource } from './source.js';
|
|
3
|
+
/** Appends each delta as one JSON line. Recordings are local and gitignored. */
|
|
4
|
+
export function recordTo(path) {
|
|
5
|
+
return (delta) => appendFileSync(path, JSON.stringify(delta) + '\n');
|
|
6
|
+
}
|
|
7
|
+
export function parseRecording(text) {
|
|
8
|
+
return text
|
|
9
|
+
.split('\n')
|
|
10
|
+
.map((l) => l.trim())
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.map((l) => JSON.parse(l));
|
|
13
|
+
}
|
|
14
|
+
/** Replays a recorded delta stream with its original timing, scaled by `speed`. */
|
|
15
|
+
export class ReplaySource extends BaseSource {
|
|
16
|
+
deltas;
|
|
17
|
+
opts;
|
|
18
|
+
timer;
|
|
19
|
+
stopped = false;
|
|
20
|
+
constructor(deltas, opts = {}) {
|
|
21
|
+
super();
|
|
22
|
+
this.deltas = deltas;
|
|
23
|
+
this.opts = opts;
|
|
24
|
+
}
|
|
25
|
+
static fromFile(path, opts) {
|
|
26
|
+
return new ReplaySource(parseRecording(readFileSync(path, 'utf8')), opts);
|
|
27
|
+
}
|
|
28
|
+
async start() {
|
|
29
|
+
this.stopped = false;
|
|
30
|
+
this.play(0);
|
|
31
|
+
}
|
|
32
|
+
play(i) {
|
|
33
|
+
if (this.stopped)
|
|
34
|
+
return;
|
|
35
|
+
const delta = this.deltas[i];
|
|
36
|
+
if (!delta) {
|
|
37
|
+
if (this.opts.loop && this.deltas.length > 0)
|
|
38
|
+
this.play(0);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.emit(delta);
|
|
42
|
+
const next = this.deltas[i + 1];
|
|
43
|
+
const gap = next ? Math.max(0, next.t - delta.t) / (this.opts.speed ?? 1) : 1000;
|
|
44
|
+
this.timer = setTimeout(() => this.play(i + 1), gap);
|
|
45
|
+
}
|
|
46
|
+
async stop() {
|
|
47
|
+
this.stopped = true;
|
|
48
|
+
if (this.timer)
|
|
49
|
+
clearTimeout(this.timer);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=recording.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAU,CAAC,CAAC;AACxC,CAAC;AAQD,mFAAmF;AACnF,MAAM,OAAO,YAAa,SAAQ,UAAU;IAKhC;IACA;IALF,KAAK,CAA4C;IACjD,OAAO,GAAG,KAAK,CAAC;IAExB,YACU,MAAe,EACf,OAAsB,EAAE;QAEhC,KAAK,EAAE,CAAC;QAHA,WAAM,GAAN,MAAM,CAAS;QACf,SAAI,GAAJ,IAAI,CAAoB;IAGlC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAoB;QAChD,OAAO,IAAI,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAEO,IAAI,CAAC,CAAS;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Role } from './types.js';
|
|
2
|
+
export interface RoleHints {
|
|
3
|
+
/** Pane tokens; `role` is set by the installed skill pack or SessionStart hook. */
|
|
4
|
+
tokens?: Record<string, string>;
|
|
5
|
+
/** Name from `herdr agent rename`. */
|
|
6
|
+
agentName?: string | null;
|
|
7
|
+
/** Pane title. */
|
|
8
|
+
title?: string | null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Role fallback chain from docs/PLAN.md §1b: `role` token (written by the skill
|
|
12
|
+
* pack or the HERDR_ROLE hook), then agent rename name, then pane title, then
|
|
13
|
+
* `generic`. Names and titles match when they contain a role as a whole word,
|
|
14
|
+
* so `reviewer-2` and `Lead architect` both resolve.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveRole(hints: RoleHints): Role;
|