@groundnuty/macf-core 0.2.47 → 0.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/delivery/index.d.ts +3 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +2 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/store.d.ts +135 -0
- package/dist/delivery/store.d.ts.map +1 -0
- package/dist/delivery/store.js +81 -0
- package/dist/delivery/store.js.map +1 -0
- package/dist/discovery.d.ts +19 -8
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +42 -12
- package/dist/discovery.js.map +1 -1
- package/dist/fleet-driver.d.ts +141 -1
- package/dist/fleet-driver.d.ts.map +1 -1
- package/dist/fleet-driver.js.map +1 -1
- package/dist/fleet-upgrade.d.ts +287 -22
- package/dist/fleet-upgrade.d.ts.map +1 -1
- package/dist/fleet-upgrade.js +350 -31
- package/dist/fleet-upgrade.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/prompt-responses.d.ts +9 -0
- package/dist/prompt-responses.d.ts.map +1 -1
- package/dist/prompt-responses.js +10 -1
- package/dist/prompt-responses.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/fleet-upgrade.js
CHANGED
|
@@ -7,30 +7,191 @@
|
|
|
7
7
|
* logic lives in macf-core; the per-runtime driver bodies live in `packages/macf`
|
|
8
8
|
* or a future K8s package). It NEVER touches `/proc`, tmux, `capture-pane`, or
|
|
9
9
|
* kubectl — it drives entirely off the injected `FleetDriver` verbs
|
|
10
|
-
* (`probe`/`discoverWorkspaces`/`isBusy`/`upgrade`/`restart
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
10
|
+
* (`probe`/`discoverWorkspaces`/`isBusy`/`listDirtyConfig`/`upgrade`/`restart`/
|
|
11
|
+
* `listModifiedFiles`/`acquireLock`/`startHeartbeat`/`releaseLock`) plus an
|
|
12
|
+
* injected `verifyGreen` runner, so the SAME sequencer rolls a VM tmux fleet, a
|
|
13
|
+
* macOS host, and a far-future K8s deployment by swapping only the driver.
|
|
13
14
|
*
|
|
14
15
|
* The state machine (per fleet, one agent at a time):
|
|
15
16
|
*
|
|
16
17
|
* probe() + discoverWorkspaces()
|
|
17
18
|
* → for each member whose RUNNING version < target (compareSemver):
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
19
|
+
* PRE-FLIGHT gate (BEFORE any mutation — never touches the agent):
|
|
20
|
+
* config-dirty-gate (driver.listDirtyConfig → non-empty ⇒ OBJECT:
|
|
21
|
+
* SKIP+REPORT the list of uncommitted files + an agent-directed
|
|
22
|
+
* message to inspect-and-commit-or-delete-or-gitignore-then-retry,
|
|
23
|
+
* unless `--force`; macf#725 — TRANSACTIONAL revision of macf#722
|
|
24
|
+
* Fix B: rather than silently stashing operator dirt, the roll
|
|
25
|
+
* OBJECTS and does NOTHING until the agent resolves it)
|
|
26
|
+
* busy-gate (driver.isBusy → busy ⇒ SKIP+REPORT, or `--wait` for idle)
|
|
27
|
+
* → driver.acquireLock(agent, target) // DR-040 Decision 4 (macf#752):
|
|
28
|
+
* SET the maintenance lock BEFORE anything touches the agent, so a
|
|
29
|
+
* watchdog sweep racing the restart reads "planned maintenance,"
|
|
30
|
+
* never "unplanned outage." driver.startHeartbeat(agent) then
|
|
31
|
+
* keeps it fresh across the whole transaction below (background,
|
|
32
|
+
* decoupled from these awaits); its stop-handle fires exactly
|
|
33
|
+
* once, on whichever terminal branch is reached.
|
|
34
|
+
* → driver.upgrade(agent) // dirties the managed config surface —
|
|
35
|
+
* // this is EXPECTED, not a fault
|
|
36
|
+
* → driver.restart(agent, { leaveConfigUncommitted: true })
|
|
37
|
+
* // relaunches WITHOUT stashing macf update's own regeneration —
|
|
38
|
+
* // the pre-flight gate already proved the ONLY dirt is the
|
|
39
|
+
* // upgrade's, so leaving it uncommitted (visible via `git status`
|
|
40
|
+
* // in the relaunched agent) is safe + intended (macf#725)
|
|
41
|
+
* → verifyGreen({agent, target}) // re-resolves the fresh endpoint
|
|
42
|
+
* each poll, over a relaunch-aware grace budget (`--verify-timeout`)
|
|
43
|
+
* → green on TARGET ⇒ driver.listModifiedFiles(agent) → emit an
|
|
44
|
+
* agent-directed "review + commit what macf update regenerated"
|
|
45
|
+
* message + list; stopHeartbeat() + driver.releaseLock(agent)
|
|
46
|
+
* (DR-040 Decision 3 — release ONLY on confirmed clean success);
|
|
47
|
+
* THEN next agent (`upgraded`)
|
|
48
|
+
* → confirmed back on the OLD (pre-upgrade) version ⇒ stopHeartbeat()
|
|
49
|
+
* WITHOUT releasing the lock, then HALT the roll, reason
|
|
50
|
+
* `bad-release` (a crash-loop / stuck-old-process release stalls
|
|
51
|
+
* at agent 1 and CANNOT brick the fleet)
|
|
52
|
+
* → past-grace still NOT confirmed green (down / unreachable /
|
|
53
|
+
* some other unknown version) ⇒ stopHeartbeat() WITHOUT
|
|
54
|
+
* releasing the lock, then HALT the roll, reason
|
|
55
|
+
* `relaunch-unconfirmed` — this is NOT a continue: "not yet
|
|
56
|
+
* green" cannot distinguish a slow-but-fine relaunch from a
|
|
57
|
+
* release that crashes on startup (which never shows the old
|
|
58
|
+
* version either), so continuing past an unconfirmed agent
|
|
59
|
+
* would risk cascading a crash-on-start release across the
|
|
60
|
+
* fleet (macf#722 Fix A). Both HALT paths deliberately LEAVE the
|
|
61
|
+
* lock in place (DR-040 Decision 3) — it self-clears once its
|
|
62
|
+
* heartbeat goes stale (`MAINT_LOCK_TTL`), giving the operator a
|
|
63
|
+
* bounded grace window before the watchdog resumes automatic
|
|
64
|
+
* action on a possibly-broken, mid-transition agent.
|
|
25
65
|
*
|
|
26
66
|
* Multi-fleet (`--fleet a,b,c`) rolls fleet-by-fleet: each fleet's roll must
|
|
27
67
|
* finish without a HALT before the next fleet starts (a bad release in fleet-1
|
|
28
68
|
* stops fleet-2 from ever being touched).
|
|
29
69
|
*
|
|
30
70
|
* DRY-RUN is the default at the command boundary: `execute: false` computes +
|
|
31
|
-
* reports the PLAN (probe + classify) and performs NO driver mutations
|
|
71
|
+
* reports the PLAN (probe + classify) and performs NO driver mutations —
|
|
72
|
+
* `rollFleet` (and therefore the maintenance lock) is never even called on
|
|
73
|
+
* that path; `upgradeFleets` only invokes it when `execute: true`.
|
|
74
|
+
*
|
|
75
|
+
* **Reconcile is MANUAL this iteration (macf#725).** The config-dirty OBJECT
|
|
76
|
+
* path surfaces the dirt via `onEvent` + a non-mutating skip; it does NOT
|
|
77
|
+
* auto-resolve (no auto-stash, no auto-commit, no auto-delete). A clean
|
|
78
|
+
* re-run, after the agent (or operator) resolves the flagged files, completes
|
|
79
|
+
* the roll for that agent.
|
|
32
80
|
*/
|
|
33
81
|
import { compareSemver } from './semver.js';
|
|
82
|
+
/**
|
|
83
|
+
* The roll's MEANINGFUL config surface (macf#722 Fix B / macf#725 UNION,
|
|
84
|
+
* narrowed by DR-040 Decision 6 / macf#698). The path globs that BOTH
|
|
85
|
+
* consumers of this constant key on:
|
|
86
|
+
*
|
|
87
|
+
* 1. **The dirty-CHECK gate** — `rollFleet`'s pre-flight config-dirty
|
|
88
|
+
* gate (`isConfigDirty` / `listDirtyConfig` in `vm-driver.ts`) +
|
|
89
|
+
* `restart-self`'s standalone stash-refusal guard
|
|
90
|
+
* (`hasUncommittedConfigChanges`). `git status --porcelain -- <pattern>`
|
|
91
|
+
* → non-empty ⇒ OBJECT / refuse. Narrowing here narrows what OBJECTS.
|
|
92
|
+
* 2. **The `excludeConfigSurface` stash** — `restart-self`'s roll-path
|
|
93
|
+
* relaunch (`git stash push -- . ':!<pattern>'` per entry) stashes
|
|
94
|
+
* everything EXCEPT this pattern, so the roll's own `macf update`
|
|
95
|
+
* regeneration stays uncommitted for the relaunched agent to see. A
|
|
96
|
+
* path DROPPED from the pattern is therefore no longer excluded → it
|
|
97
|
+
* gets STASHED on relaunch. For a TRACKED operator-evolution file
|
|
98
|
+
* (`CLAUDE.md`), that means the agent comes back with it reverted to
|
|
99
|
+
* HEAD and the edits buried in a stash = silent pre-reconcile loss.
|
|
100
|
+
*
|
|
101
|
+
* Because of use #2, this is a **UNION, not the overwrite-set alone**
|
|
102
|
+
* (macf#725): (a) the files `macf update` OVERWRITES ∪ (b) the
|
|
103
|
+
* operator-evolution files that must NOT be silently stashed on relaunch.
|
|
104
|
+
* The `.claude/**` wildcard was the ONLY bug — it swept in runtime logs
|
|
105
|
+
* (`.claude/audit.log`) + agent scratch that `macf update` never writes,
|
|
106
|
+
* producing false CONFIG-DIRTY objections. This revision replaces ONLY that
|
|
107
|
+
* wildcard with the specific managed paths; the union's meaningful members
|
|
108
|
+
* are preserved.
|
|
109
|
+
*
|
|
110
|
+
* **(a) The exact set `macf update` OVERWRITES** — verified directly against
|
|
111
|
+
* the CLI source (`update.ts` + `env-files-update.ts` + `rules.ts` +
|
|
112
|
+
* `claude-sh.ts` + `host-prelude.ts` + `settings-writer.ts`):
|
|
113
|
+
*
|
|
114
|
+
* - `claude.sh` — `writeClaudeSh` (unconditional for a macf-managed workspace;
|
|
115
|
+
* preserved only when hand-authored/header-less, in which case it's never
|
|
116
|
+
* legitimately dirty from `macf update`'s perspective anyway — harmless to
|
|
117
|
+
* include unconditionally, same reasoning as the prior revision).
|
|
118
|
+
* - `.claude/rules/**` — `copyCanonicalRules` (universal `.claude/rules/*.md`)
|
|
119
|
+
* + `fetchProjectRules` (project-tier `.claude/rules/project/*.md`); both
|
|
120
|
+
* land under this one glob.
|
|
121
|
+
* - `.claude/scripts/**` — `copyCanonicalScripts`. Still the exact overwrite
|
|
122
|
+
* set as of DR-039 phase 2 (macf#749, hook SCRIPT FILES moved to
|
|
123
|
+
* `plugin/scripts/`): `macf update` still writes a `.claude/scripts/`
|
|
124
|
+
* compat copy for hand-wired substrate hooks + non-plugin-init'd
|
|
125
|
+
* workspaces (see `rules.ts` `copyCanonicalScripts` doc comment). Drop this
|
|
126
|
+
* entry once that compat copy is retired.
|
|
127
|
+
* - `.claude/settings.json` — `installGhTokenHook` / `installPluginSkillPermissions`
|
|
128
|
+
* / `installSandboxFdAllowRead` / `installSandboxExcludedCommands` (all
|
|
129
|
+
* merge-preserving writers targeting this one file). Deliberately EXCLUDES
|
|
130
|
+
* `.claude/settings.local.json` — `macf update` only ever READS it (for the
|
|
131
|
+
* getters' merged-view), never writes it (+ it's gitignored → never dirty
|
|
132
|
+
* in the first place → no stash risk).
|
|
133
|
+
* - `.claude/.macf/env._helpers` / `env.identity` / `env.github` / `env.certs`
|
|
134
|
+
* / `env.registry` — the 5 `MANAGED_ENV_FILES` (`env-files-update.ts`),
|
|
135
|
+
* regenerated unconditionally + warn-on-hand-edit. Deliberately EXCLUDES the
|
|
136
|
+
* 2 `OPERATOR_ENV_FILES` (`env.telemetry`, `env.tmux` — bootstrap-write-if-
|
|
137
|
+
* absent, else preserved unconditionally).
|
|
138
|
+
* - `.claude/.macf/host-prelude.sh` — `writeHostPrelude`, "macf-managed +
|
|
139
|
+
* RE-DETECTED (never preserve-existing)" per its own doc comment
|
|
140
|
+
* (`host-prelude.ts`). Genuinely overwritten every `macf update` run; ADDED
|
|
141
|
+
* here (the prior `.claude/**` wildcard caught it incidentally — narrowing
|
|
142
|
+
* the wildcard away would have silently dropped coverage for this file
|
|
143
|
+
* without this explicit addition).
|
|
144
|
+
*
|
|
145
|
+
* **(b) The operator-evolution surface that must NOT be silently stashed**
|
|
146
|
+
* (macf#725 union half — kept, NOT dropped, per the use-#2 reasoning above):
|
|
147
|
+
*
|
|
148
|
+
* - `CLAUDE.md` — TRACKED operator/workbench doc. `macf update` never writes
|
|
149
|
+
* it (no write path in any CLI command), so it's NOT an overwrite-set
|
|
150
|
+
* member — but it IS a meaningful operator-evolution file: a dirty
|
|
151
|
+
* `CLAUDE.md` legitimately warrants a gate objection (unlike `audit.log`,
|
|
152
|
+
* it's real work, not runtime noise), and it MUST stay in the pattern so
|
|
153
|
+
* `excludeConfigSurface` leaves it uncommitted rather than stashing the
|
|
154
|
+
* operator's edits away on relaunch (verified TRACKED → live stash-loss
|
|
155
|
+
* hazard if dropped).
|
|
156
|
+
* - `env.local.*` — the operator-custom env-extension slot (bare pathspec,
|
|
157
|
+
* preserved verbatim from the prior union). Untracked in practice (so no
|
|
158
|
+
* live stash risk today), but kept for union fidelity + zero-cost safety as
|
|
159
|
+
* a genuine operator-surface member.
|
|
160
|
+
*
|
|
161
|
+
* **Motivating incident** (devops review, PR #748 / macf#698): the prior
|
|
162
|
+
* `.claude/**` wildcard matched `.claude/audit.log` — a runtime log a custom
|
|
163
|
+
* `ConfigChange` hook appends to (hence perpetually git-dirty on that
|
|
164
|
+
* workspace) that `macf update` never writes — and **blocked devops's
|
|
165
|
+
* v0.2.48 fleet upgrade** with a false CONFIG-DIRTY objection on 2026-07-02.
|
|
166
|
+
* Untracking `audit.log` itself (the `.gitignore` force-include +
|
|
167
|
+
* `git rm --cached`) is a separate, devops-owned LOCAL workspace cleanup —
|
|
168
|
+
* out of scope here; this pattern-narrowing is the FRAMEWORK-side fix so no
|
|
169
|
+
* future non-canonical `.claude/` file (runtime logs, agent scratch, custom-
|
|
170
|
+
* hook output) can trip the gate at all, regardless of gitignore state on any
|
|
171
|
+
* given workspace.
|
|
172
|
+
*
|
|
173
|
+
* Both gate consumers already pathspec-filter their `git status --porcelain`
|
|
174
|
+
* calls by this exact array (as does the stash), so this revision narrows
|
|
175
|
+
* ALL consumers' behavior identically; no separate no-pathspec fix was needed
|
|
176
|
+
* at any call site.
|
|
177
|
+
*/
|
|
178
|
+
export const ROLL_TOUCHED_CONFIG_PATTERNS = [
|
|
179
|
+
// (a) the exact set `macf update` OVERWRITES:
|
|
180
|
+
'claude.sh',
|
|
181
|
+
'.claude/rules/**',
|
|
182
|
+
'.claude/scripts/**',
|
|
183
|
+
'.claude/settings.json',
|
|
184
|
+
'.claude/.macf/env._helpers',
|
|
185
|
+
'.claude/.macf/env.identity',
|
|
186
|
+
'.claude/.macf/env.github',
|
|
187
|
+
'.claude/.macf/env.certs',
|
|
188
|
+
'.claude/.macf/env.registry',
|
|
189
|
+
'.claude/.macf/host-prelude.sh',
|
|
190
|
+
// (b) operator-evolution files that must NOT be silently stashed on relaunch
|
|
191
|
+
// (macf#725 union half — `excludeConfigSurface` leaves these uncommitted):
|
|
192
|
+
'CLAUDE.md',
|
|
193
|
+
'env.local.*',
|
|
194
|
+
];
|
|
34
195
|
/**
|
|
35
196
|
* Classify each discovered fleet member against the target version. PURE — no
|
|
36
197
|
* driver, no clock, no network. The single source of the behind/at-target/offline
|
|
@@ -53,7 +214,7 @@ export function planFleetUpgrade(members, state, targetVersion) {
|
|
|
53
214
|
}
|
|
54
215
|
return {
|
|
55
216
|
agent: m.agent,
|
|
56
|
-
fleet: m.
|
|
217
|
+
fleet: m.project,
|
|
57
218
|
runningVersion,
|
|
58
219
|
pinnedVersion: m.versionPin,
|
|
59
220
|
disposition,
|
|
@@ -82,20 +243,132 @@ async function waitForIdle(agent, opts, deps) {
|
|
|
82
243
|
return false;
|
|
83
244
|
}
|
|
84
245
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
246
|
+
* Classify a failed verify-green against the agent's PRE-upgrade running
|
|
247
|
+
* version (macf#722 Fix A). `bad-release` requires POSITIVE confirmation that
|
|
248
|
+
* the agent came back reachable at the OLD pin — everything else (never
|
|
249
|
+
* reachable, or reachable at some other unrecognized version) is
|
|
250
|
+
* `relaunch-unconfirmed`. Never infer `bad-release` from absence of success;
|
|
251
|
+
* only from the last-seen version actually matching the old pin.
|
|
252
|
+
*/
|
|
253
|
+
function classifyHalt(green, oldVersion) {
|
|
254
|
+
if (green.reason === 'wrong-version' &&
|
|
255
|
+
green.lastVersion !== null &&
|
|
256
|
+
oldVersion !== null &&
|
|
257
|
+
compareSemver(green.lastVersion, oldVersion) === 0) {
|
|
258
|
+
return 'bad-release';
|
|
259
|
+
}
|
|
260
|
+
return 'relaunch-unconfirmed';
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Build the agent-directed OBJECT message for a config-dirty pre-flight skip
|
|
264
|
+
* (macf#725). Pure — exported for CLI-rendering reuse / tests.
|
|
265
|
+
*/
|
|
266
|
+
export function buildConfigDirtyMessage(agent, files) {
|
|
267
|
+
return (`Fleet upgrade skipped ${agent} — these files have uncommitted changes ` +
|
|
268
|
+
`\`macf update\` would overwrite: ${files.join(', ')}. Inspect each and ` +
|
|
269
|
+
`commit, delete, or .gitignore it, then re-run the upgrade.`);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Build the agent-directed post-upgrade modified-files message (macf#725).
|
|
273
|
+
* Pure — exported for CLI-rendering reuse / tests.
|
|
274
|
+
*
|
|
275
|
+
* The message names the intended STEADY-STATE explicitly: a clean roll LEAVES
|
|
276
|
+
* this regeneration uncommitted (so the agent can review it), which means the
|
|
277
|
+
* NEXT roll's pre-flight WILL re-flag these same files as uncommitted unless
|
|
278
|
+
* they're committed. That re-flag is intended hygiene ("commit last update's
|
|
279
|
+
* regen before upgrading again"), not a surprise — so the message tells the
|
|
280
|
+
* agent to commit them, not merely review them.
|
|
281
|
+
*/
|
|
282
|
+
export function buildModifiedFilesMessage(agent, files) {
|
|
283
|
+
return (`Fleet upgrade regenerated these files in ${agent}'s workspace: ` +
|
|
284
|
+
`${files.join(', ')}. Review with \`git diff\` and commit them (so the next ` +
|
|
285
|
+
`upgrade's pre-flight doesn't re-flag them as uncommitted) or act as needed.`);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Roll ONE fleet: for every `behind` plan (in order) run the PRE-FLIGHT gates
|
|
289
|
+
* (config-dirty tier-first, then busy) → upgrade → restart → verify-green
|
|
290
|
+
* cycle, HALTING the roll on the first agent whose post-restart state isn't
|
|
291
|
+
* confirmed-green. Non-`behind` plans are ignored (planned skips).
|
|
292
|
+
* Pre-flight-gated agents are skipped + reported and NEVER a halt (they were
|
|
293
|
+
* never mutated, so continuing is always safe) — config-dirty is checked
|
|
294
|
+
* first because a busy-but-clean agent may still become idle later
|
|
295
|
+
* (`--wait`), whereas a dirty (genuine-delta) agent is skip-only regardless.
|
|
296
|
+
* With `wait`, a busy agent is re-polled for idle first. The verb order +
|
|
297
|
+
* HALT semantics mirror `fleet/upgrade.sh`'s `roll_one`.
|
|
298
|
+
*
|
|
299
|
+
* **Transactional + OBJECT-with-message revision (macf#725).** The pre-flight
|
|
300
|
+
* config-dirty gate is the ONLY decision point that inspects PRE-upgrade
|
|
301
|
+
* state: clean (or explicitly `--force`-bypassed) ⇒ the roll enters the
|
|
302
|
+
* transaction and MUST complete it — `upgrade` → `restart(agent,
|
|
303
|
+
* { leaveConfigUncommitted: true })` always runs together, never mutating
|
|
304
|
+
* `upgrade` without following through to `restart`. Dirty (and not forced) ⇒
|
|
305
|
+
* the roll does NOTHING to this agent (no `upgrade`, no `restart`) and OBJECTS
|
|
306
|
+
* via `onEvent` with the exact file list + an agent-directed message —
|
|
307
|
+
* reconcile is MANUAL: the agent (or operator) resolves the flagged files and
|
|
308
|
+
* a clean re-run completes it. This replaces the earlier (macf#722 Fix B)
|
|
309
|
+
* silent-skip + separately-force-stashed-restart shape, which could dirty the
|
|
310
|
+
* workspace via `upgrade` and then have `restart-self`'s OWN guard refuse —
|
|
311
|
+
* aborting mid-transaction with the workspace already mutated.
|
|
312
|
+
*
|
|
313
|
+
* **Tier-first auto-resolve (DR-040 Decision 3 / macf#698 R1).** Before
|
|
314
|
+
* deciding OBJECT-or-proceed, `deps.driver.classifyDirtyConfig` splits the
|
|
315
|
+
* dirty set into `alreadyCanonical` (content already equals what `macf
|
|
316
|
+
* update` would write — the common case: a stale-branch workspace, both
|
|
317
|
+
* code-agent AND science hit ONLY this tier on the v0.2.48 roll) and
|
|
318
|
+
* `genuineDelta` (a real local difference). `alreadyCanonical` files are
|
|
319
|
+
* committed automatically via `autoResolveCanonical` — no agent/operator
|
|
320
|
+
* involvement, no OBJECT — clearing the false config-dirty signal. Only a
|
|
321
|
+
* non-empty `genuineDelta` still triggers the OBJECT-and-skip path, and its
|
|
322
|
+
* message + `onEvent` payload are scoped to the genuine-delta files ONLY
|
|
323
|
+
* (the auto-resolved noise is never re-surfaced as something to inspect).
|
|
324
|
+
* When `genuineDelta` is empty (either the whole dirty set was
|
|
325
|
+
* already-canonical, or there was nothing dirty at all), the roll falls
|
|
326
|
+
* through into the transaction exactly as the clean case always has.
|
|
90
327
|
*/
|
|
91
328
|
export async function rollFleet(plans, opts, deps) {
|
|
92
329
|
const results = [];
|
|
93
330
|
let upgraded = 0;
|
|
94
331
|
let busySkipped = 0;
|
|
332
|
+
let configDirtySkipped = 0;
|
|
333
|
+
let configAutoResolved = 0;
|
|
95
334
|
for (const plan of plans) {
|
|
96
335
|
if (plan.disposition !== 'behind')
|
|
97
336
|
continue;
|
|
98
337
|
const agent = plan.agent;
|
|
338
|
+
// PRE-FLIGHT config-dirty gate — tier-first (DR-040 Decision 3 /
|
|
339
|
+
// macf#698 R1). By-design inter-roll STEADY-STATE (macf#725): a clean
|
|
340
|
+
// roll LEAVES `macf update`'s regeneration uncommitted (so the relaunched
|
|
341
|
+
// agent reviews it — see `restart`'s `leaveConfigUncommitted` below +
|
|
342
|
+
// `buildModifiedFilesMessage`). Consequently, the NEXT roll's pre-flight
|
|
343
|
+
// will re-classify that still-uncommitted regen — almost always as
|
|
344
|
+
// ALREADY-CANONICAL (it IS what `macf update` just wrote) and therefore
|
|
345
|
+
// auto-resolved here rather than objected on. This is the steady-state
|
|
346
|
+
// this tier exists to smooth over.
|
|
347
|
+
let autoResolvedFiles;
|
|
348
|
+
if (!opts.force) {
|
|
349
|
+
const { alreadyCanonical, genuineDelta } = await deps.driver.classifyDirtyConfig(agent);
|
|
350
|
+
if (alreadyCanonical.length > 0) {
|
|
351
|
+
await deps.driver.autoResolveCanonical(agent, alreadyCanonical);
|
|
352
|
+
configAutoResolved += 1;
|
|
353
|
+
autoResolvedFiles = alreadyCanonical;
|
|
354
|
+
deps.onEvent?.({ kind: 'config-auto-resolved', agent, files: alreadyCanonical });
|
|
355
|
+
}
|
|
356
|
+
if (genuineDelta.length > 0) {
|
|
357
|
+
configDirtySkipped += 1;
|
|
358
|
+
const message = buildConfigDirtyMessage(agent, genuineDelta);
|
|
359
|
+
results.push({
|
|
360
|
+
agent,
|
|
361
|
+
outcome: 'config-dirty-skipped',
|
|
362
|
+
detail: message,
|
|
363
|
+
...(autoResolvedFiles ? { autoResolvedFiles } : {}),
|
|
364
|
+
});
|
|
365
|
+
deps.onEvent?.({ kind: 'config-dirty-skip', agent, files: genuineDelta, message });
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
// genuineDelta is empty (nothing dirty at all, or everything dirty WAS
|
|
369
|
+
// already-canonical and is now committed) — fall through into the
|
|
370
|
+
// transaction below exactly as the always-clean case does.
|
|
371
|
+
}
|
|
99
372
|
let busy = await deps.driver.isBusy(agent);
|
|
100
373
|
let waited = false;
|
|
101
374
|
if (busy && opts.wait) {
|
|
@@ -104,13 +377,34 @@ export async function rollFleet(plans, opts, deps) {
|
|
|
104
377
|
}
|
|
105
378
|
if (busy) {
|
|
106
379
|
busySkipped += 1;
|
|
107
|
-
results.push({
|
|
380
|
+
results.push({
|
|
381
|
+
agent,
|
|
382
|
+
outcome: 'busy-skipped',
|
|
383
|
+
detail: waited ? 'still busy after --wait' : 'busy',
|
|
384
|
+
...(autoResolvedFiles ? { autoResolvedFiles } : {}),
|
|
385
|
+
});
|
|
108
386
|
deps.onEvent?.({ kind: 'busy-skip', agent, waited });
|
|
109
387
|
continue;
|
|
110
388
|
}
|
|
389
|
+
// --- ENTERING THE TRANSACTION: upgrade + restart run together, always. ---
|
|
111
390
|
deps.onEvent?.({ kind: 'roll-start', agent, from: plan.runningVersion, to: opts.targetVersion });
|
|
391
|
+
// DR-040 Decision 4 (macf-devops-toolkit#158/#159, macf#752) — SET the
|
|
392
|
+
// maintenance lock BEFORE anything touches the agent's process, so a
|
|
393
|
+
// watchdog sweep racing the very first SIGTERM already reads "planned
|
|
394
|
+
// maintenance," never "unplanned outage." The background heartbeat keeps
|
|
395
|
+
// the lock fresh across the WHOLE transaction below (upgrade → restart →
|
|
396
|
+
// verify-green can each individually take a while); `stopHeartbeat` is
|
|
397
|
+
// invoked exactly once, on whichever terminal branch is reached.
|
|
398
|
+
await deps.driver.acquireLock(agent, opts.targetVersion);
|
|
399
|
+
const stopHeartbeat = deps.driver.startHeartbeat(agent);
|
|
112
400
|
await deps.driver.upgrade(agent);
|
|
113
|
-
|
|
401
|
+
// The pre-flight gate above (clean, or explicitly `--force`-bypassed) is
|
|
402
|
+
// the only thing that decided whether to enter this transaction. Once
|
|
403
|
+
// entered, `restart` must NOT stash or refuse on the config surface —
|
|
404
|
+
// `upgrade` (macf update) is EXPECTED to have just dirtied it, and that
|
|
405
|
+
// dirt (plus any pre-existing `--force`-bypassed dirt) is deliberately
|
|
406
|
+
// LEFT UNCOMMITTED for the relaunched agent to see via `git status`.
|
|
407
|
+
await deps.driver.restart(agent, { leaveConfigUncommitted: true });
|
|
114
408
|
const green = await deps.verifyGreen({
|
|
115
409
|
agent,
|
|
116
410
|
targetVersion: opts.targetVersion,
|
|
@@ -118,27 +412,52 @@ export async function rollFleet(plans, opts, deps) {
|
|
|
118
412
|
});
|
|
119
413
|
if (green.ok) {
|
|
120
414
|
upgraded += 1;
|
|
121
|
-
|
|
122
|
-
|
|
415
|
+
const modifiedFiles = await deps.driver.listModifiedFiles(agent);
|
|
416
|
+
const message = buildModifiedFilesMessage(agent, modifiedFiles);
|
|
417
|
+
results.push({
|
|
418
|
+
agent,
|
|
419
|
+
outcome: 'upgraded',
|
|
420
|
+
detail: message,
|
|
421
|
+
...(autoResolvedFiles ? { autoResolvedFiles } : {}),
|
|
422
|
+
});
|
|
423
|
+
deps.onEvent?.({ kind: 'upgraded', agent, version: green.version, modifiedFiles, message });
|
|
424
|
+
// Clean GREEN is the ONLY release path (DR-040 Decision 3) — hand the
|
|
425
|
+
// agent back to normal watchdog reconciliation immediately.
|
|
426
|
+
stopHeartbeat();
|
|
427
|
+
await deps.driver.releaseLock(agent);
|
|
123
428
|
continue;
|
|
124
429
|
}
|
|
125
|
-
const reason = green.
|
|
430
|
+
const reason = classifyHalt(green, plan.runningVersion);
|
|
126
431
|
results.push({
|
|
127
432
|
agent,
|
|
128
433
|
outcome: 'halted',
|
|
129
|
-
|
|
434
|
+
reason,
|
|
435
|
+
detail: `${reason}: verify-green ${green.reason} (last=${green.lastVersion ?? 'down'})`,
|
|
436
|
+
...(autoResolvedFiles ? { autoResolvedFiles } : {}),
|
|
130
437
|
});
|
|
131
438
|
deps.onEvent?.({ kind: 'halt', agent, reason, lastVersion: green.lastVersion });
|
|
132
|
-
|
|
439
|
+
// HALT deliberately LEAVES the lock in place (DR-040 Decision 3): a
|
|
440
|
+
// possibly-broken, mid-transition agent must NOT be handed straight back
|
|
441
|
+
// to the watchdog's Tier-1/2/3 healing ladder the instant the roll fails
|
|
442
|
+
// — that is exactly the uncoordinated, racing intervention the
|
|
443
|
+
// transactional halt exists to avoid. Only the background heartbeat is
|
|
444
|
+
// stopped here; the lock self-clears once its heartbeat goes stale
|
|
445
|
+
// (MAINT_LOCK_TTL), giving the operator a bounded grace window to
|
|
446
|
+
// inspect the halted roll before the watchdog resumes automatic action.
|
|
447
|
+
stopHeartbeat();
|
|
448
|
+
return { results, halted: true, upgraded, busySkipped, configDirtySkipped, configAutoResolved };
|
|
133
449
|
}
|
|
134
|
-
return { results, halted: false, upgraded, busySkipped };
|
|
450
|
+
return { results, halted: false, upgraded, busySkipped, configDirtySkipped, configAutoResolved };
|
|
135
451
|
}
|
|
136
452
|
/**
|
|
137
|
-
* Orchestrate a rolling upgrade across the ORDERED `fleets` (
|
|
138
|
-
* identifiers
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
453
|
+
* Orchestrate a rolling upgrade across the ORDERED `fleets` (PROJECT
|
|
454
|
+
* identifiers — macf#710: a "fleet" == a project, which owns its own CA +
|
|
455
|
+
* registry namespace + version cadence; a profile/org registry scope hosting N
|
|
456
|
+
* projects yields N fleets here, never one), fleet-by-fleet. Each fleet is
|
|
457
|
+
* probed + planned; in EXECUTE mode it is then rolled, and a HALT in one fleet
|
|
458
|
+
* STOPS the whole run — later fleets are never started (a bad release cannot
|
|
459
|
+
* cascade across fleets). An unresolvable fleet is skipped + reported and does
|
|
460
|
+
* NOT halt the run.
|
|
142
461
|
*/
|
|
143
462
|
export async function upgradeFleets(fleets, opts, deps) {
|
|
144
463
|
const reports = [];
|
|
@@ -150,7 +469,7 @@ export async function upgradeFleets(fleets, opts, deps) {
|
|
|
150
469
|
deps.onEvent?.({ kind: 'fleet-skipped', fleet, reason: 'driver-unresolved' });
|
|
151
470
|
continue;
|
|
152
471
|
}
|
|
153
|
-
const members = driver.discoverWorkspaces().filter((r) => r.
|
|
472
|
+
const members = driver.discoverWorkspaces().filter((r) => r.project === fleet);
|
|
154
473
|
const state = await driver.probe();
|
|
155
474
|
const plans = planFleetUpgrade(members, state, opts.targetVersion);
|
|
156
475
|
const behind = plans.filter((p) => p.disposition === 'behind').length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet-upgrade.js","sourceRoot":"","sources":["../src/fleet-upgrade.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fleet-upgrade.js","sourceRoot":"","sources":["../src/fleet-upgrade.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export * from './protected-invariant-norms.js';
|
|
|
31
31
|
export * from './mtls-health-ping.js';
|
|
32
32
|
export * from './certs/index.js';
|
|
33
33
|
export * from './registry/index.js';
|
|
34
|
+
export * from './delivery/index.js';
|
|
34
35
|
export { createChallengeStore, DEFAULT_CHALLENGE_TTL_MS } from './certs/challenge-store.js';
|
|
35
36
|
export type { ChallengeRecord, ChallengeStore, Clock } from './certs/challenge-store.js';
|
|
36
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AAIpC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAIpC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ export * from './protected-invariant-norms.js';
|
|
|
31
31
|
export * from './mtls-health-ping.js';
|
|
32
32
|
export * from './certs/index.js';
|
|
33
33
|
export * from './registry/index.js';
|
|
34
|
+
export * from './delivery/index.js';
|
|
34
35
|
// Subpath modules NOT re-exported from the subdir index.ts files;
|
|
35
36
|
// surface them here so consumers can use the flat barrel uniformly.
|
|
36
37
|
export { createChallengeStore, DEFAULT_CHALLENGE_TTL_MS } from './certs/challenge-store.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AAEpC,kEAAkE;AAClE,oEAAoE;AACpE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAEpC,kEAAkE;AAClE,oEAAoE;AACpE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -144,6 +144,15 @@ export declare function loadPromptResponses(raw: unknown): LoadedPromptResponses
|
|
|
144
144
|
* confirmation) is the dangerous case: an unknown prompt we must NOT answer.
|
|
145
145
|
* Broad on purpose — false-positive (alert on a non-prompt) is cheap; a
|
|
146
146
|
* false-negative (miss a real unknown prompt) is the hazard.
|
|
147
|
+
*
|
|
148
|
+
* `❯` is overloaded (groundnuty/macf#729): it is BOTH the menu-selection
|
|
149
|
+
* cursor on a real numbered ceremony prompt (`❯ 1. Yes`) AND the Claude Code
|
|
150
|
+
* free-form input-box cursor (`❯ <queued/typed text>`). A bare `frame.includes('❯')`
|
|
151
|
+
* misclassified a queued message in the input box as an unknown prompt,
|
|
152
|
+
* firing repeated ALERT spam. Match only when `❯` sits directly on a
|
|
153
|
+
* NUMBERED OPTION line — that excludes the free-form input box (whose text
|
|
154
|
+
* after `❯` is not `[0-9]+[.)]`) while still catching real numbered menus.
|
|
155
|
+
* Kept in lockstep with the watcher's bash `_looks_prompt_like`.
|
|
147
156
|
*/
|
|
148
157
|
export declare function looksPromptLike(frame: string): boolean;
|
|
149
158
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-responses.d.ts","sourceRoot":"","sources":["../src/prompt-responses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,EAAG,GAAY,CAAC;AAE5D;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,+DAAgE,CAAC;AAEtG;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,oDAAqD,CAAC;AAEzF,uEAAuE;AACvE,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;kBAS3B,CAAC;AACZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAGtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,mEAAmE;AACnE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;AAkBtD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAIlF;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAwBvE;AAED
|
|
1
|
+
{"version":3,"file":"prompt-responses.d.ts","sourceRoot":"","sources":["../src/prompt-responses.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt-responses.js
CHANGED
|
@@ -165,9 +165,18 @@ export function loadPromptResponses(raw) {
|
|
|
165
165
|
* confirmation) is the dangerous case: an unknown prompt we must NOT answer.
|
|
166
166
|
* Broad on purpose — false-positive (alert on a non-prompt) is cheap; a
|
|
167
167
|
* false-negative (miss a real unknown prompt) is the hazard.
|
|
168
|
+
*
|
|
169
|
+
* `❯` is overloaded (groundnuty/macf#729): it is BOTH the menu-selection
|
|
170
|
+
* cursor on a real numbered ceremony prompt (`❯ 1. Yes`) AND the Claude Code
|
|
171
|
+
* free-form input-box cursor (`❯ <queued/typed text>`). A bare `frame.includes('❯')`
|
|
172
|
+
* misclassified a queued message in the input box as an unknown prompt,
|
|
173
|
+
* firing repeated ALERT spam. Match only when `❯` sits directly on a
|
|
174
|
+
* NUMBERED OPTION line — that excludes the free-form input box (whose text
|
|
175
|
+
* after `❯` is not `[0-9]+[.)]`) while still catching real numbered menus.
|
|
176
|
+
* Kept in lockstep with the watcher's bash `_looks_prompt_like`.
|
|
168
177
|
*/
|
|
169
178
|
export function looksPromptLike(frame) {
|
|
170
|
-
if (
|
|
179
|
+
if (/❯[ \t]*[0-9]+[.)]/.test(frame))
|
|
171
180
|
return true;
|
|
172
181
|
return /\((?:y\/n|y\/N|Y\/n)\)|\[(?:y\/N|Y\/n|y\/n)\]/.test(frame);
|
|
173
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-responses.js","sourceRoot":"","sources":["../src/prompt-responses.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompt-responses.js","sourceRoot":"","sources":["../src/prompt-responses.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ export declare const NotifyPayloadSchema: z.ZodObject<{
|
|
|
47
47
|
"turn-complete": "turn-complete";
|
|
48
48
|
}>>;
|
|
49
49
|
github_anchor: z.ZodOptional<z.ZodString>;
|
|
50
|
+
message_id: z.ZodOptional<z.ZodString>;
|
|
50
51
|
review_state: z.ZodOptional<z.ZodEnum<{
|
|
51
52
|
approved: "approved";
|
|
52
53
|
changes_requested: "changes_requested";
|
|
@@ -109,6 +110,7 @@ export declare const PeerNotificationPayloadSchema: z.ZodObject<{
|
|
|
109
110
|
}>;
|
|
110
111
|
message: z.ZodOptional<z.ZodString>;
|
|
111
112
|
context: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
113
|
+
message_id: z.ZodOptional<z.ZodString>;
|
|
112
114
|
}, z.core.$strip>;
|
|
113
115
|
export type PeerNotificationPayload = z.infer<typeof PeerNotificationPayloadSchema>;
|
|
114
116
|
/**
|