agent-coord-mcp 0.26.16 → 0.26.18
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/hooks/replay.mjs +107 -0
- package/hooks/tier.mjs +11 -0
- package/hooks/tmux-pusher.mjs +27 -0
- package/package.json +1 -1
- package/scripts/coord-pusher.mjs +16 -32
- package/src/server.ts +40 -20
- package/src/tools/admin.ts +8 -1
- package/src/tools/away.ts +48 -4
- package/src/tools/board-ref.ts +47 -2
- package/src/tools/messaging.ts +43 -2
- package/src/tools/records.ts +381 -25
- package/src/tools/registry.ts +5 -2
- package/src/tools/rooms.ts +2 -1
- package/src/tools/shared.ts +28 -0
- package/src/tools/stall.ts +29 -1
- package/src/tools/transport.ts +79 -10
- package/src/tools/work.ts +70 -4
- package/src/tools/worktrees.ts +64 -2
- package/src/work.ts +4 -0
- package/dist/build.js +0 -113
- package/dist/build.js.map +0 -1
- package/dist/capabilities.js +0 -158
- package/dist/capabilities.js.map +0 -1
- package/dist/prefix.js +0 -64
- package/dist/prefix.js.map +0 -1
- package/dist/roles.js +0 -132
- package/dist/roles.js.map +0 -1
- package/dist/server-identity.js +0 -82
- package/dist/server-identity.js.map +0 -1
- package/dist/server.js +0 -625
- package/dist/server.js.map +0 -1
- package/dist/store.js +0 -553
- package/dist/store.js.map +0 -1
- package/dist/tools/admin.js +0 -317
- package/dist/tools/admin.js.map +0 -1
- package/dist/tools/attention.js +0 -73
- package/dist/tools/attention.js.map +0 -1
- package/dist/tools/away.js +0 -243
- package/dist/tools/away.js.map +0 -1
- package/dist/tools/board-ref.js +0 -164
- package/dist/tools/board-ref.js.map +0 -1
- package/dist/tools/event-kinds.js +0 -39
- package/dist/tools/event-kinds.js.map +0 -1
- package/dist/tools/events.js +0 -234
- package/dist/tools/events.js.map +0 -1
- package/dist/tools/index.js +0 -14
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/logwatch.js +0 -85
- package/dist/tools/logwatch.js.map +0 -1
- package/dist/tools/messaging.js +0 -667
- package/dist/tools/messaging.js.map +0 -1
- package/dist/tools/record-events.js +0 -380
- package/dist/tools/record-events.js.map +0 -1
- package/dist/tools/records.js +0 -686
- package/dist/tools/records.js.map +0 -1
- package/dist/tools/registry.js +0 -497
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/render.js +0 -2
- package/dist/tools/render.js.map +0 -1
- package/dist/tools/rooms.js +0 -210
- package/dist/tools/rooms.js.map +0 -1
- package/dist/tools/rotate.js +0 -143
- package/dist/tools/rotate.js.map +0 -1
- package/dist/tools/scopes.js +0 -126
- package/dist/tools/scopes.js.map +0 -1
- package/dist/tools/shared.js +0 -86
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/stall.js +0 -387
- package/dist/tools/stall.js.map +0 -1
- package/dist/tools/transport.js +0 -1810
- package/dist/tools/transport.js.map +0 -1
- package/dist/tools/work.js +0 -319
- package/dist/tools/work.js.map +0 -1
- package/dist/tools/worktrees.js +0 -339
- package/dist/tools/worktrees.js.map +0 -1
- package/dist/typed-records.js +0 -174
- package/dist/typed-records.js.map +0 -1
- package/dist/work.js +0 -2
- package/dist/work.js.map +0 -1
package/dist/tools/worktrees.js
DELETED
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* `ensure_worktree` — the worktree invariant as a verb.
|
|
3
|
-
*
|
|
4
|
-
* `git worktree add` lives on five cards as a RECIPE, which means it is followed
|
|
5
|
-
* from memory and skipped under pressure. The failure it prevents is not
|
|
6
|
-
* theoretical: a shared checkout is how two agents' edits land in one tree, and
|
|
7
|
-
* the primary checkout is the one everybody reaches for because it is the path
|
|
8
|
-
* they already have.
|
|
9
|
-
*
|
|
10
|
-
* CUT FROM `origin/<base>`, NEVER A LOCAL BRANCH. A local `main` is whatever the
|
|
11
|
-
* last person left there; `origin/<base>` is what everyone else will merge into.
|
|
12
|
-
* This is the same rule as `land`'s target-tip check, one step earlier: the
|
|
13
|
-
* question is always "what does the thing I am merging into have?".
|
|
14
|
-
*/
|
|
15
|
-
import { execFileSync } from "node:child_process";
|
|
16
|
-
import { existsSync, realpathSync } from "node:fs";
|
|
17
|
-
import path from "node:path";
|
|
18
|
-
import { z } from "zod";
|
|
19
|
-
/**
|
|
20
|
-
* Compare paths by their REAL path, never by string.
|
|
21
|
-
*
|
|
22
|
-
* git reports `/private/var/...` where a caller passes `/var/...` — macOS's
|
|
23
|
-
* symlink — so `path.resolve` comparison silently MISSES the primary and the
|
|
24
|
-
* guard that refuses it never fires. The same symlink cost a carrier check its
|
|
25
|
-
* main-module guard earlier today: it exited 0 having done nothing.
|
|
26
|
-
*/
|
|
27
|
-
const samePath = (a, b) => {
|
|
28
|
-
const real = (x) => {
|
|
29
|
-
try {
|
|
30
|
-
return realpathSync(x);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return path.resolve(x);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
return real(a) === real(b);
|
|
37
|
-
};
|
|
38
|
-
const git = (repo, args) => execFileSync("git", args, { cwd: repo, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
39
|
-
/** Every worktree git knows about: `{path, branch, bare}` in list order. The
|
|
40
|
-
* FIRST entry is the primary checkout — that is what `--porcelain` guarantees. */
|
|
41
|
-
export function listWorktrees(repo) {
|
|
42
|
-
const out = [];
|
|
43
|
-
let cur = null;
|
|
44
|
-
for (const line of git(repo, ["worktree", "list", "--porcelain"]).split("\n")) {
|
|
45
|
-
if (line.startsWith("worktree ")) {
|
|
46
|
-
if (cur)
|
|
47
|
-
out.push(cur);
|
|
48
|
-
cur = { path: line.slice(9), branch: null };
|
|
49
|
-
}
|
|
50
|
-
else if (line.startsWith("branch ") && cur) {
|
|
51
|
-
cur.branch = line.slice(7).replace(/^refs\/heads\//, "");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (cur)
|
|
55
|
-
out.push(cur);
|
|
56
|
-
return out;
|
|
57
|
-
}
|
|
58
|
-
/** The primary checkout — the tree nobody may be given for a slice. */
|
|
59
|
-
export function primaryOf(repo) {
|
|
60
|
-
const all = listWorktrees(repo);
|
|
61
|
-
return all.length ? all[0].path : null;
|
|
62
|
-
}
|
|
63
|
-
const isDirty = (repo) => {
|
|
64
|
-
try {
|
|
65
|
-
return git(repo, ["status", "--porcelain"]).length > 0;
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return true; // unreadable is not clean
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
export const ensureWorktreeSchema = {
|
|
72
|
-
agentId: z.string().min(1),
|
|
73
|
-
repo: z.string().min(1),
|
|
74
|
-
base: z.string().min(1),
|
|
75
|
-
task: z.string().optional(),
|
|
76
|
-
ephemeral: z.boolean().optional(),
|
|
77
|
-
parent: z.string().optional(),
|
|
78
|
-
};
|
|
79
|
-
export async function ensureWorktreeTool(args) {
|
|
80
|
-
const { agentId, repo, base } = args;
|
|
81
|
-
if (!path.isAbsolute(repo))
|
|
82
|
-
return { ok: false, error: `repo must be an absolute path, got '${repo}'` };
|
|
83
|
-
if (!existsSync(repo))
|
|
84
|
-
return { ok: false, error: `no such repo: ${repo}` };
|
|
85
|
-
let primary;
|
|
86
|
-
try {
|
|
87
|
-
primary = primaryOf(repo);
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
return { ok: false, error: `not a git repository (${String(e.message).split("\n")[0]})` };
|
|
91
|
-
}
|
|
92
|
-
// `repo` IS the primary checkout in normal use — that is how you address the
|
|
93
|
-
// repository. What must never happen is HANDING AN AGENT THE PRIMARY as its
|
|
94
|
-
// slice tree, so the refusal is on the computed TARGET, not on the input.
|
|
95
|
-
//
|
|
96
|
-
// Reading spec 1.4 literally ("calling with the primary path exits non-zero")
|
|
97
|
-
// would refuse every call and make the verb unusable, since `repo` is always
|
|
98
|
-
// the primary. The invariant it protects is the one implemented here: two
|
|
99
|
-
// agents editing one tree. Flagged in the PR rather than silently chosen.
|
|
100
|
-
return await create({ ...args, primary: primary ?? repo });
|
|
101
|
-
}
|
|
102
|
-
async function create(a) {
|
|
103
|
-
const { repo, base, agentId, primary } = a;
|
|
104
|
-
// The BASE must exist as a REMOTE ref. A missing `origin/<base>` is refused
|
|
105
|
-
// rather than silently falling back to a local branch of the same name — the
|
|
106
|
-
// local one is whatever the last person left there.
|
|
107
|
-
const ref = `origin/${base}`;
|
|
108
|
-
let sha;
|
|
109
|
-
try {
|
|
110
|
-
git(repo, ["fetch", "--quiet", "origin", base]);
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
/* offline or no remote: fall through to the rev-parse, which is the real test */
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
sha = git(repo, ["rev-parse", "--verify", `${ref}^{commit}`]);
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
return {
|
|
120
|
-
ok: false,
|
|
121
|
-
error: `${ref} does not resolve — refusing to cut a tree from a local '${base}', which is whatever the last person left there. Fetch the remote, or name a base that exists on origin.`,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// ONE PROJECT PARENT: trees live beside the primary, named for the agent, so a
|
|
125
|
-
// stray tree is identifiable without opening it.
|
|
126
|
-
const parent = a.parent ?? path.dirname(primary);
|
|
127
|
-
const leaf = `${path.basename(primary)}-${agentId}${a.ephemeral ? "-ephemeral" : ""}`;
|
|
128
|
-
const target = path.join(parent, leaf);
|
|
129
|
-
const branch = a.task ? `${agentId}/${a.task}` : `${agentId}/work`;
|
|
130
|
-
// DEFENCE IN DEPTH, AND IT IS CURRENTLY UNREACHABLE — stated because a guard
|
|
131
|
-
// that cannot fire is worth nothing until someone knows it cannot.
|
|
132
|
-
//
|
|
133
|
-
// The leaf is always `<primary-basename>-<agentId>`, so the target can never
|
|
134
|
-
// equal the primary while that naming holds. I tried to write a test that
|
|
135
|
-
// reaches this branch and could not without symlink contrivance; the honest
|
|
136
|
-
// conclusion is that the NAMING is the real invariant and this is a backstop
|
|
137
|
-
// for the day someone changes it. It is kept rather than deleted for exactly
|
|
138
|
-
// that day, and labelled rather than left looking load-bearing.
|
|
139
|
-
//
|
|
140
|
-
// What actually protects the invariant is tested instead: the target always
|
|
141
|
-
// differs from the primary, for any agent id.
|
|
142
|
-
if (samePath(target, primary)) {
|
|
143
|
-
return {
|
|
144
|
-
ok: false,
|
|
145
|
-
error: `refusing to hand back the PRIMARY checkout (${primary}) as a slice tree — that is the path everyone already has, ` +
|
|
146
|
-
`so it is the one two agents end up editing at once. Pass a different parent or agentId.`,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
const existing = listWorktrees(repo).find((w) => samePath(w.path, target));
|
|
150
|
-
if (existing) {
|
|
151
|
-
// IDEMPOTENT, and it reports what it FOUND rather than what it would have
|
|
152
|
-
// made: a verb that silently returns a tree on a different branch than asked
|
|
153
|
-
// for is the adjacent-answer shape.
|
|
154
|
-
const head = git(existing.path, ["rev-parse", "HEAD"]);
|
|
155
|
-
// IS THE REUSED TREE ACTUALLY AT THE BASE IT CLAIMS?
|
|
156
|
-
//
|
|
157
|
-
// The verb warned when an existing tree was on a different BRANCH and said
|
|
158
|
-
// nothing about it being behind the BASE — so a tree left on last week's
|
|
159
|
-
// main was handed back as ready. Starting a new task there produces the
|
|
160
|
-
// "stale main -> confidently-wrong inventories" failure the worker card
|
|
161
|
-
// already warns about, and nothing about the result looks stale.
|
|
162
|
-
//
|
|
163
|
-
// Reported here, not refused: an existing tree legitimately holds
|
|
164
|
-
// in-progress work mid-slice (1.3). The refusal belongs to `claim`, which
|
|
165
|
-
// is the verb that means "start something new".
|
|
166
|
-
let atBase = false;
|
|
167
|
-
let behindBy = null;
|
|
168
|
-
try {
|
|
169
|
-
const baseSha = git(repo, ["rev-parse", "--verify", `${ref}^{commit}`]);
|
|
170
|
-
atBase = head === baseSha;
|
|
171
|
-
if (!atBase)
|
|
172
|
-
behindBy = Number(git(existing.path, ["rev-list", "--count", `HEAD..${ref}`])) || 0;
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
// NOT MEASURED IS NOT AT-BASE. Leaving `atBase` false is the safe
|
|
176
|
-
// direction: it makes `claim` ask rather than assume.
|
|
177
|
-
atBase = false;
|
|
178
|
-
}
|
|
179
|
-
return {
|
|
180
|
-
ok: true,
|
|
181
|
-
path: existing.path,
|
|
182
|
-
sha: head,
|
|
183
|
-
branch: existing.branch,
|
|
184
|
-
created: false,
|
|
185
|
-
base: ref,
|
|
186
|
-
atBase,
|
|
187
|
-
behindBy: behindBy ?? 0,
|
|
188
|
-
...(existing.branch !== branch
|
|
189
|
-
? { warning: `existing tree is on '${existing.branch}', not the '${branch}' this call would have created — reusing it, NOT re-pointing it` }
|
|
190
|
-
: {}),
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
try {
|
|
194
|
-
git(repo, ["worktree", "add", "-q", "-b", branch, target, sha]);
|
|
195
|
-
}
|
|
196
|
-
catch (e) {
|
|
197
|
-
return { ok: false, error: `git worktree add failed: ${String(e.message).split("\n")[0]}` };
|
|
198
|
-
}
|
|
199
|
-
return {
|
|
200
|
-
ok: true,
|
|
201
|
-
path: target,
|
|
202
|
-
sha,
|
|
203
|
-
branch,
|
|
204
|
-
created: true,
|
|
205
|
-
base: ref,
|
|
206
|
-
// Cut from `sha`, which IS origin/<base> — true by construction here, and
|
|
207
|
-
// stated so callers need not special-case "created" to know it.
|
|
208
|
-
atBase: true,
|
|
209
|
-
behindBy: 0,
|
|
210
|
-
...(a.ephemeral
|
|
211
|
-
? { ephemeral: true, removeWith: `git -C ${repo} worktree remove --force ${target} && git -C ${repo} branch -D ${branch}` }
|
|
212
|
-
: {}),
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
// ---------- 1.2 / 1.3: refresh idle trees, never mid-slice ----------
|
|
216
|
-
export const refreshWorktreesSchema = {
|
|
217
|
-
repo: z.string().min(1),
|
|
218
|
-
base: z.string().min(1),
|
|
219
|
-
apply: z.boolean().optional(),
|
|
220
|
-
};
|
|
221
|
-
/**
|
|
222
|
-
* Fast-forward IDLE trees onto `origin/<base>`. Never `--force`, never a
|
|
223
|
-
* mid-slice tree.
|
|
224
|
-
*
|
|
225
|
-
* A tree is MID-SLICE when it is dirty or holds commits the base does not.
|
|
226
|
-
* Pulling under someone's feet is worse than staleness: staleness is visible in
|
|
227
|
-
* a diff, a clobbered work-in-progress is not. So dirty or diverged is REFUSED
|
|
228
|
-
* per tree and named, and the run continues for the others.
|
|
229
|
-
*/
|
|
230
|
-
export async function refreshWorktreesTool(args) {
|
|
231
|
-
const { repo, base } = args;
|
|
232
|
-
const ref = `origin/${base}`;
|
|
233
|
-
try {
|
|
234
|
-
git(repo, ["fetch", "--quiet", "origin", base]);
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
/* reported per tree below */
|
|
238
|
-
}
|
|
239
|
-
let tip;
|
|
240
|
-
try {
|
|
241
|
-
tip = git(repo, ["rev-parse", "--verify", `${ref}^{commit}`]);
|
|
242
|
-
}
|
|
243
|
-
catch {
|
|
244
|
-
return { ok: false, error: `${ref} does not resolve — nothing to fast-forward onto` };
|
|
245
|
-
}
|
|
246
|
-
const results = [];
|
|
247
|
-
for (const w of listWorktrees(repo)) {
|
|
248
|
-
const at = w.path;
|
|
249
|
-
if (samePath(at, primaryOf(repo) ?? "")) {
|
|
250
|
-
// THE PRIMARY CHECKOUT IS REPORTED, ALWAYS — it used to be skipped with
|
|
251
|
-
// "not a slice tree", which is true and useless. It is the tree David
|
|
252
|
-
// reads, the one every hand-run measurement runs in, and a silent skip
|
|
253
|
-
// let it sit arbitrarily far behind while this verb reported a clean
|
|
254
|
-
// sweep. "Not ours to fast-forward" and "nothing to say about it" are
|
|
255
|
-
// different claims and only the first one was intended.
|
|
256
|
-
let behind = "unknown";
|
|
257
|
-
let ahead = "unknown";
|
|
258
|
-
try {
|
|
259
|
-
behind = git(at, ["rev-list", "--count", `HEAD..${tip}`]);
|
|
260
|
-
ahead = git(at, ["rev-list", "--count", `${tip}..HEAD`]);
|
|
261
|
-
}
|
|
262
|
-
catch {
|
|
263
|
-
/* left as unknown — an unreadable count must not read as zero */
|
|
264
|
-
}
|
|
265
|
-
const dirty = isDirty(at);
|
|
266
|
-
// FAST-FORWARD ONLY, AND ONLY WHEN CLEAN. A ff-only merge cannot rewrite
|
|
267
|
-
// history or resolve a conflict, so the worst case is a refusal. Dirty is
|
|
268
|
-
// refused for the same reason a slice tree is: uncommitted work is what a
|
|
269
|
-
// diff cannot show and git cannot give back.
|
|
270
|
-
const canFf = !dirty && ahead === "0" && behind !== "0" && behind !== "unknown";
|
|
271
|
-
if (args.apply && canFf) {
|
|
272
|
-
try {
|
|
273
|
-
git(at, ["merge", "--ff-only", ref]);
|
|
274
|
-
results.push({ path: w.path, action: "fast-forwarded", why: `primary checkout advanced ${behind} commit(s) to ${ref}` });
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
catch (e) {
|
|
278
|
-
results.push({ path: w.path, action: "refused", why: `primary checkout: ff-only merge failed — ${e.message}` });
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
results.push({
|
|
283
|
-
path: w.path,
|
|
284
|
-
action: behind === "0" ? "current" : "stale",
|
|
285
|
-
why: behind === "0"
|
|
286
|
-
? `primary checkout is at ${ref}`
|
|
287
|
-
: `primary checkout is ${behind} commit(s) behind ${ref}` +
|
|
288
|
-
(dirty
|
|
289
|
-
? " and DIRTY — not fast-forwarded; uncommitted work is what a diff cannot show"
|
|
290
|
-
: ahead !== "0"
|
|
291
|
-
? ` and ${ahead} ahead — not fast-forwarded; it has commits ${ref} does not`
|
|
292
|
-
: args.apply
|
|
293
|
-
? ""
|
|
294
|
-
: " — pass apply:true to fast-forward it"),
|
|
295
|
-
});
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
if (isDirty(at)) {
|
|
299
|
-
results.push({ path: w.path, action: "refused", why: "MID-SLICE: uncommitted changes. Pulling here would clobber work a diff cannot show." });
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
let head;
|
|
303
|
-
try {
|
|
304
|
-
head = git(at, ["rev-parse", "HEAD"]);
|
|
305
|
-
}
|
|
306
|
-
catch {
|
|
307
|
-
results.push({ path: w.path, action: "refused", why: "unreadable HEAD" });
|
|
308
|
-
continue;
|
|
309
|
-
}
|
|
310
|
-
if (head === tip) {
|
|
311
|
-
results.push({ path: w.path, action: "current", why: `already at ${ref}` });
|
|
312
|
-
continue;
|
|
313
|
-
}
|
|
314
|
-
let ahead = "0";
|
|
315
|
-
try {
|
|
316
|
-
ahead = git(at, ["rev-list", "--count", `${tip}..HEAD`]);
|
|
317
|
-
}
|
|
318
|
-
catch {
|
|
319
|
-
/* treated as diverged below */
|
|
320
|
-
}
|
|
321
|
-
if (ahead !== "0") {
|
|
322
|
-
results.push({ path: w.path, action: "refused", why: `MID-SLICE: ${ahead} commit(s) not on ${ref}. Refusing rather than --force.` });
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
325
|
-
if (!args.apply) {
|
|
326
|
-
results.push({ path: w.path, action: "would-fast-forward", why: `behind ${ref}` });
|
|
327
|
-
continue;
|
|
328
|
-
}
|
|
329
|
-
try {
|
|
330
|
-
git(at, ["merge", "--ff-only", tip]);
|
|
331
|
-
results.push({ path: w.path, action: "fast-forwarded", why: `to ${tip.slice(0, 8)}` });
|
|
332
|
-
}
|
|
333
|
-
catch (e) {
|
|
334
|
-
results.push({ path: w.path, action: "refused", why: `ff-only failed: ${String(e.message).split("\n")[0]}` });
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return { ok: true, base: ref, tip: tip.slice(0, 8), applied: args.apply === true, trees: results };
|
|
338
|
-
}
|
|
339
|
-
//# sourceMappingURL=worktrees.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../src/tools/worktrees.ts"],"names":[],"mappings":"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"}
|
package/dist/typed-records.js
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
// Typed records become obligatory on agent→agent traffic (Phase 5.1 Task 12).
|
|
2
|
-
//
|
|
3
|
-
// THE MECHANISM ALREADY SHIPPED AND ADOPTION WAS THE WHOLE GAP.
|
|
4
|
-
// `hooks/tier.mjs:injectLine` slims a multi-line message to *first line +
|
|
5
|
-
// `[+N lines · record:<type> · retrieve_message id=<uuid>]`* — but ONLY when
|
|
6
|
-
// `record.type` is a string. Measured on the groundwork room 2026-08-30: 206
|
|
7
|
-
// messages, 175 multi-line, 33 typed, 33 slimmed; the coordinator had sent 101
|
|
8
|
-
// and typed 0. The renderer was never the problem.
|
|
9
|
-
//
|
|
10
|
-
// SO THE RULE IS ENFORCED AT THE SEND, NOT THE RENDER. An untyped agent→agent
|
|
11
|
-
// message must not be able to EXIST, or the next reader re-derives the type
|
|
12
|
-
// from prose and we are back to parsing English. Prose is a second source of
|
|
13
|
-
// truth about what a message meant.
|
|
14
|
-
//
|
|
15
|
-
// Three things this module is careful about, each one a stated acceptance
|
|
16
|
-
// property rather than an implementation taste:
|
|
17
|
-
//
|
|
18
|
-
// 1. STAGED, WITH A NAMED DATE. Five fleets share this bus and 7 of 13 server
|
|
19
|
-
// processes predate 0.26.7. A refusal shipped before a verified restart
|
|
20
|
-
// rejects messages from agents that CANNOT comply — the sender gets an
|
|
21
|
-
// error it has no code path to satisfy. So: WARN until the cutover, REFUSE
|
|
22
|
-
// after it, and the warning names the date in every single message so the
|
|
23
|
-
// deadline arrives having been announced ~every send rather than once.
|
|
24
|
-
//
|
|
25
|
-
// 2. THE REFUSAL NAMES A TYPE THE SENDER MAY ACTUALLY USE. `go` and `scope`
|
|
26
|
-
// are coordinator-restricted and `verdict` is gate-runner-restricted
|
|
27
|
-
// (RECORD_AUTHORITY): the aide hit exactly this, being told to use `scope`
|
|
28
|
-
// by one check and refused it by another. Naming a forbidden type is
|
|
29
|
-
// unusable guidance, so every suggestion is filtered through what this
|
|
30
|
-
// sender's role may emit before it is offered.
|
|
31
|
-
//
|
|
32
|
-
// 3. `fyi` IS AN HONEST CATCH-ALL. If the nine types do not cover a legitimate
|
|
33
|
-
// send, agents mistype into whatever passes and the type becomes noise —
|
|
34
|
-
// which costs more than the untyped message did. Anything unrecognised
|
|
35
|
-
// suggests `fyi` and says so plainly, never a forced `decision`/`risk`.
|
|
36
|
-
// The named cutover. Until this instant an untyped agent→agent send WARNS and
|
|
37
|
-
// is stored; from it, the same send is refused.
|
|
38
|
-
//
|
|
39
|
-
// A DATE, NOT A VERSION, because the constraint being waited on is a fleet-wide
|
|
40
|
-
// RESTART, and no version string on the wire can answer "has every server
|
|
41
|
-
// restarted" — 0.26.7 is published while servers predating it still run. Time
|
|
42
|
-
// is the only clock every one of those processes shares.
|
|
43
|
-
export const TYPED_RECORD_CUTOVER_ISO = "2026-09-15T00:00:00.000Z";
|
|
44
|
-
export const TYPED_RECORD_CUTOVER_MS = Date.parse(TYPED_RECORD_CUTOVER_ISO);
|
|
45
|
-
// `AGENT_COORD_TYPED_RECORDS=warn|refuse` overrides the date. It exists for two
|
|
46
|
-
// callers and no others: tests (which must exercise both sides of a date that
|
|
47
|
-
// has not arrived) and an operator who needs to pull the refusal back for a
|
|
48
|
-
// fleet mid-incident. It is NOT the exemption — an exemption is per-agent and
|
|
49
|
-
// visible (see `proseOnly`); this switch is fleet-wide and invisible, which is
|
|
50
|
-
// exactly why it is not how a less capable model gets on the bus.
|
|
51
|
-
export function typedRecordMode(now = Date.now()) {
|
|
52
|
-
const env = process.env.AGENT_COORD_TYPED_RECORDS;
|
|
53
|
-
if (env === "warn" || env === "refuse")
|
|
54
|
-
return env;
|
|
55
|
-
return now >= TYPED_RECORD_CUTOVER_MS ? "refuse" : "warn";
|
|
56
|
-
}
|
|
57
|
-
// ---------- suggesting the type the sender should have used ----------
|
|
58
|
-
// A rejection that says only "record required" costs a round trip; one that
|
|
59
|
-
// says "looks like a `done` — it cites a PR" costs none. A FAILURE PATH MUST BE
|
|
60
|
-
// MORE INFORMATIVE THAN THE SUCCESS PATH HERE, because it fires during a
|
|
61
|
-
// migration, at agents that are mid-slice and did nothing wrong yesterday.
|
|
62
|
-
//
|
|
63
|
-
// Read from the text the fleet already writes: the six canonical prefixes are
|
|
64
|
-
// in every card and on ~every message, so the type is usually already declared
|
|
65
|
-
// in English one token in.
|
|
66
|
-
const PREFIX_TYPES = [
|
|
67
|
-
[/^\s*DONE\b/i, "done", "the message opens with the DONE: prefix"],
|
|
68
|
-
[/^\s*BLOCKER\b/i, "blocker", "the message opens with the BLOCKER: prefix"],
|
|
69
|
-
[/^\s*RISK\b/i, "risk", "the message opens with the RISK: prefix"],
|
|
70
|
-
[/^\s*FYI\b/i, "fyi", "the message opens with the FYI: prefix"],
|
|
71
|
-
[/^\s*AGENT_ACTION\b/i, "action", "the message opens with the AGENT_ACTION: prefix"],
|
|
72
|
-
[/^\s*DAVID_DECISION\b/i, "decision", "the message opens with the DAVID_DECISION: prefix"],
|
|
73
|
-
[/^\s*GO\b/i, "go", "the message opens with the GO: prefix"],
|
|
74
|
-
[/^\s*SCOPE(?:\s+CHANGE)?\b/i, "scope", "the message opens with the SCOPE: prefix"],
|
|
75
|
-
];
|
|
76
|
-
// Weaker than a prefix and only consulted when there is no prefix at all.
|
|
77
|
-
const SHAPE_TYPES = [
|
|
78
|
-
[/\b(PASS|FAIL)\b.*\b[0-9a-f]{7,40}\b/, "verdict", "it reads as a gate verdict over a commit sha"],
|
|
79
|
-
[/^\s*(PASS|FAIL)\b/, "verdict", "it opens with a PASS/FAIL gate result"],
|
|
80
|
-
[/(^|\s)(#\d+|[\w.-]+\/[\w.-]+#\d+|https:\/\/github\.com\/\S+\/pull\/\d+)/, "done", "it cites a PR"],
|
|
81
|
-
];
|
|
82
|
-
/**
|
|
83
|
-
* The record type this message most likely should have carried, CONSTRAINED to
|
|
84
|
-
* what this sender is allowed to emit.
|
|
85
|
-
*
|
|
86
|
-
* `mayNotEmit` is the restricted set this role is refused (recordAuthorityFor).
|
|
87
|
-
* A suggestion landing in it is downgraded to `fyi` and the downgrade is
|
|
88
|
-
* reported rather than hidden — being quietly steered off `go` reads as the
|
|
89
|
-
* heuristic being bad, when in fact the role simply does not own that type.
|
|
90
|
-
*/
|
|
91
|
-
export function suggestRecordType(text, mayNotEmit = []) {
|
|
92
|
-
const forbidden = new Set(mayNotEmit);
|
|
93
|
-
const firstLine = (text ?? "").split("\n", 1)[0] ?? "";
|
|
94
|
-
const hit = PREFIX_TYPES.find(([re]) => re.test(firstLine)) ??
|
|
95
|
-
SHAPE_TYPES.find(([re]) => re.test(firstLine) || re.test(text ?? ""));
|
|
96
|
-
if (!hit) {
|
|
97
|
-
return {
|
|
98
|
-
type: "fyi",
|
|
99
|
-
why: "nothing in the text names a kind — 'fyi' is the honest catch-all and is never wrong on purpose",
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
const [, type, why] = hit;
|
|
103
|
-
if (forbidden.has(type)) {
|
|
104
|
-
return {
|
|
105
|
-
type: "fyi",
|
|
106
|
-
downgradedFrom: type,
|
|
107
|
-
why: `${why}, but '${type}' is restricted to roles this sender does not hold — 'fyi' carries the same slimming`,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return { type, why };
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* The one line of guidance appended to both the warning and the refusal. Same
|
|
114
|
-
* words either side of the cutover ON PURPOSE: an agent that reads it during
|
|
115
|
-
* the warn window has already been told the exact call that will keep working.
|
|
116
|
-
*/
|
|
117
|
-
export function typedRecordGuidance(s) {
|
|
118
|
-
const cite = s.type === "done"
|
|
119
|
-
? `, cites: [{kind:'pr', ref:'<owner/repo#N>'}]` // a `done` is refused without one anyway
|
|
120
|
-
: "";
|
|
121
|
-
return (`looks like a '${s.type}' — ${s.why}. ` +
|
|
122
|
-
`Add record: {type:'${s.type}', payload:{summary:'<one line>'}${cite}} to this same call; ` +
|
|
123
|
-
`'text' is untouched by the record and your wording always wins.`);
|
|
124
|
-
}
|
|
125
|
-
// ---------- measuring adoption, and the inverse failure ----------
|
|
126
|
-
// SUCCESS IS THE TRAFFIC TABLE RE-MEASURED, NOT THIS TASK MERGED. The baseline
|
|
127
|
-
// captured the day the rule was made: 212 room messages, 37 typed (17%),
|
|
128
|
-
// 425,903 bytes sitting below line 1 — bytes every reader pays for and no
|
|
129
|
-
// reader asked for.
|
|
130
|
-
//
|
|
131
|
-
// AND THE INVERSE FAILURE LOOKS EXACTLY LIKE SUCCESS ON A COVERAGE NUMBER. If
|
|
132
|
-
// `fyi` becomes nearly everything, coverage reads ~100% while agents are
|
|
133
|
-
// mistyping to get past the gate and the type has stopped carrying
|
|
134
|
-
// information — that is the catch-all rule (12.5) failing, not holding. So the
|
|
135
|
-
// distribution is reported alongside the percentage and is what the verdict
|
|
136
|
-
// keys on. A coverage-only check would certify the failure it exists to catch.
|
|
137
|
-
//
|
|
138
|
-
// The threshold is deliberately generous: `fyi` IS the honest answer for a
|
|
139
|
-
// large share of real traffic, so this fires on domination, not on presence.
|
|
140
|
-
export const FYI_DOMINANCE_THRESHOLD = 0.75;
|
|
141
|
-
/** `messages` is any array of stored messages ({text, record?}). */
|
|
142
|
-
export function typedRecordStats(messages) {
|
|
143
|
-
const distribution = {};
|
|
144
|
-
let typed = 0;
|
|
145
|
-
let unslimmedBytes = 0;
|
|
146
|
-
for (const m of messages) {
|
|
147
|
-
const type = typeof m.record?.type === "string" ? m.record.type : undefined;
|
|
148
|
-
distribution[type ?? "untyped"] = (distribution[type ?? "untyped"] ?? 0) + 1;
|
|
149
|
-
if (type) {
|
|
150
|
-
typed++;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
const text = m.text ?? "";
|
|
154
|
-
const nl = text.indexOf("\n");
|
|
155
|
-
if (nl !== -1)
|
|
156
|
-
unslimmedBytes += Buffer.byteLength(text.slice(nl + 1), "utf8");
|
|
157
|
-
}
|
|
158
|
-
const total = messages.length;
|
|
159
|
-
const coverage = total ? typed / total : 0;
|
|
160
|
-
const fyiShareOfTyped = typed ? (distribution.fyi ?? 0) / typed : 0;
|
|
161
|
-
// Order matters: degeneracy is checked BEFORE coverage, or a room that is
|
|
162
|
-
// 100% `fyi` reports "healthy" — the exact misreading this guards.
|
|
163
|
-
const degenerate = typed >= 10 && fyiShareOfTyped > FYI_DOMINANCE_THRESHOLD;
|
|
164
|
-
const verdict = degenerate ? "degenerate" : coverage >= 0.95 ? "healthy" : "adopting";
|
|
165
|
-
const note = degenerate
|
|
166
|
-
? `'fyi' is ${(fyiShareOfTyped * 100).toFixed(0)}% of typed messages — coverage looks solved while the type has ` +
|
|
167
|
-
`stopped carrying information. Agents are typing to pass the gate, which is 12.5 FAILING, not holding.`
|
|
168
|
-
: verdict === "healthy"
|
|
169
|
-
? `${(coverage * 100).toFixed(0)}% typed with a spread distribution — the reader-side cost is paid down and the type still discriminates.`
|
|
170
|
-
: `${(coverage * 100).toFixed(0)}% typed; ${unslimmedBytes.toLocaleString("en-US")} bytes still sit below line 1 in untyped messages, ` +
|
|
171
|
-
`carried by every reader.`;
|
|
172
|
-
return { total, typed, coverage: Number(coverage.toFixed(3)), unslimmedBytes, distribution, fyiShareOfTyped: Number(fyiShareOfTyped.toFixed(3)), verdict, note };
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=typed-records.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typed-records.js","sourceRoot":"","sources":["../src/typed-records.ts"],"names":[],"mappings":"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"}
|
package/dist/work.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { BOARD_ARITY, isMalformedRow, EM_DASH_SEP, MIDDOT_SEP, parseQueueLine, parseDoneLine, renderQueueLine, renderDoneLine, renderBoardRow, parseWorkDoc, renderWorkDoc, queueItemsOf, doneEntriesOf, boardRowsOf, workstreamsV1RowsOf, listWorkBoardOf, projectV1ToLanes, workDocIssues, workDocLegacyWriteIssues, LANES_V0_WRITE_ISSUE, } from "@davidbalzan/groundwork-seam/docs";
|
|
2
|
-
//# sourceMappingURL=work.js.map
|
package/dist/work.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"work.js","sourceRoot":"","sources":["../src/work.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,EAEX,cAAc,EAGd,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,GAGrB,MAAM,mCAAmC,CAAC"}
|