instar 1.3.340 → 1.3.342
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +57 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PendingInjectStore.d.ts +54 -0
- package/dist/core/PendingInjectStore.d.ts.map +1 -0
- package/dist/core/PendingInjectStore.js +152 -0
- package/dist/core/PendingInjectStore.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +22 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SessionManager.d.ts +17 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +70 -1
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StateManager.d.ts +4 -0
- package/dist/core/StateManager.d.ts.map +1 -1
- package/dist/core/StateManager.js +6 -0
- package/dist/core/StateManager.js.map +1 -1
- package/dist/monitoring/GuardPostureTripwire.d.ts +90 -0
- package/dist/monitoring/GuardPostureTripwire.d.ts.map +1 -0
- package/dist/monitoring/GuardPostureTripwire.js +182 -0
- package/dist/monitoring/GuardPostureTripwire.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +20 -20
- package/upgrades/1.3.342.md +85 -0
- package/upgrades/guard-posture-tripwire.eli16.md +48 -0
- package/upgrades/side-effects/guard-posture-tripwire.md +76 -0
- package/upgrades/side-effects/pending-inject-durability.md +58 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface PendingInjectRecord {
|
|
2
|
+
/** tmux session name the inject targets (also the record's key). */
|
|
3
|
+
tmuxSession: string;
|
|
4
|
+
/** The message queued for injection (may be a bootstrap-file pointer). */
|
|
5
|
+
initialMessage: string;
|
|
6
|
+
/** Telegram topic the message belongs to, when known. */
|
|
7
|
+
telegramTopicId?: number;
|
|
8
|
+
/** ISO timestamp the record was written (spawn time). */
|
|
9
|
+
createdAt: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class PendingInjectStore {
|
|
12
|
+
private dir;
|
|
13
|
+
constructor(stateDir: string);
|
|
14
|
+
/** Key → filename. tmux session names are already shell-safe, but clamp anyway. */
|
|
15
|
+
private fileFor;
|
|
16
|
+
/** Write (or overwrite) the pending record for a session. Never throws —
|
|
17
|
+
* a failed durability write must not block the spawn itself. */
|
|
18
|
+
record(entry: Omit<PendingInjectRecord, 'createdAt'> & {
|
|
19
|
+
createdAt?: string;
|
|
20
|
+
}): void;
|
|
21
|
+
/** Remove the record after a verified inject. Never throws. */
|
|
22
|
+
clear(tmuxSession: string): void;
|
|
23
|
+
/** All surviving records (corrupt files are skipped, reported via return). */
|
|
24
|
+
list(): {
|
|
25
|
+
records: PendingInjectRecord[];
|
|
26
|
+
corrupt: string[];
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface PendingInjectSweepDeps {
|
|
30
|
+
sessionAlive(tmuxSession: string): boolean;
|
|
31
|
+
/** Re-deliver through the normal readiness path; resolves once injected (or throws). */
|
|
32
|
+
redeliver(record: PendingInjectRecord): Promise<void>;
|
|
33
|
+
/** Loud reporting for the cases recovery cannot fix on its own. */
|
|
34
|
+
reportLoss(record: PendingInjectRecord, reason: string): void;
|
|
35
|
+
now?: () => number;
|
|
36
|
+
/** Records older than this are expired (reported, not re-injected). Default 6h. */
|
|
37
|
+
maxAgeMs?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface PendingInjectSweepResult {
|
|
40
|
+
redelivered: string[];
|
|
41
|
+
expired: string[];
|
|
42
|
+
deadSession: string[];
|
|
43
|
+
failed: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Boot-time recovery over surviving records. Decision per record:
|
|
47
|
+
* - older than maxAge → expire + reportLoss (stale enough that re-injecting
|
|
48
|
+
* mid-conversation would confuse more than help)
|
|
49
|
+
* - tmux session still alive → redeliver via the readiness path, clear on success
|
|
50
|
+
* - tmux session gone → reportLoss + clear (the bridge respawns on the
|
|
51
|
+
* user's next message; the loss is now VISIBLE)
|
|
52
|
+
*/
|
|
53
|
+
export declare function sweepPendingInjects(store: PendingInjectStore, deps: PendingInjectSweepDeps): Promise<PendingInjectSweepResult>;
|
|
54
|
+
//# sourceMappingURL=PendingInjectStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingInjectStore.d.ts","sourceRoot":"","sources":["../../src/core/PendingInjectStore.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAAS;gBAER,QAAQ,EAAE,MAAM;IAI5B,mFAAmF;IACnF,OAAO,CAAC,OAAO;IAKf;qEACiE;IACjE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkBpF,+DAA+D;IAC/D,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAehC,8EAA8E;IAC9E,IAAI,IAAI;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;CA8B9D;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,wFAAwF;IACxF,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,mEAAmE;IACnE,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,wBAAwB,CAAC,CAkCnC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PendingInjectStore — durable record of in-flight initial-message injects.
|
|
3
|
+
*
|
|
4
|
+
* THE GAP THIS CLOSES (finding 8d300555, 2026-06-06): when a session is
|
|
5
|
+
* spawned with an initial message, the inject happens AFTER an async
|
|
6
|
+
* readiness wait (codex can take tens of seconds to boot). That pending
|
|
7
|
+
* inject was process-local state — a server restart in the window between
|
|
8
|
+
* spawn and inject silently dropped the user's message. The live incident:
|
|
9
|
+
* the auto-updater's scheduled restart (60s delay) killed the server while
|
|
10
|
+
* the fresh-spawned codex session was still booting; tmux survived showing
|
|
11
|
+
* an idle prompt, the bootstrap file sat unconsumed on disk, the operator
|
|
12
|
+
* waited 50+ minutes, and nothing anywhere knew a message had been lost.
|
|
13
|
+
*
|
|
14
|
+
* The store is one JSON file per pending inject, keyed by tmux session name,
|
|
15
|
+
* under `<stateDir>/pending-injects/`. Records are written at spawn time and
|
|
16
|
+
* cleared ONLY after the inject actually runs. Boot-time recovery
|
|
17
|
+
* (SessionManager.recoverPendingInjects) sweeps survivors: a still-alive
|
|
18
|
+
* session gets the message re-delivered through the normal readiness path; a
|
|
19
|
+
* dead session is reported loudly (DegradationReporter) and expired — never
|
|
20
|
+
* silently dropped.
|
|
21
|
+
*
|
|
22
|
+
* Delivery semantics are deliberately AT-LEAST-ONCE: if the server dies
|
|
23
|
+
* after the inject but before the clear, the next boot re-injects a
|
|
24
|
+
* duplicate. A duplicated message to an agent session is recoverable noise;
|
|
25
|
+
* a silently dropped user message is not.
|
|
26
|
+
*/
|
|
27
|
+
import fs from 'node:fs';
|
|
28
|
+
import path from 'node:path';
|
|
29
|
+
import { SafeFsExecutor } from './SafeFsExecutor.js';
|
|
30
|
+
export class PendingInjectStore {
|
|
31
|
+
dir;
|
|
32
|
+
constructor(stateDir) {
|
|
33
|
+
this.dir = path.join(stateDir, 'pending-injects');
|
|
34
|
+
}
|
|
35
|
+
/** Key → filename. tmux session names are already shell-safe, but clamp anyway. */
|
|
36
|
+
fileFor(tmuxSession) {
|
|
37
|
+
const safe = tmuxSession.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 200);
|
|
38
|
+
return path.join(this.dir, `${safe}.json`);
|
|
39
|
+
}
|
|
40
|
+
/** Write (or overwrite) the pending record for a session. Never throws —
|
|
41
|
+
* a failed durability write must not block the spawn itself. */
|
|
42
|
+
record(entry) {
|
|
43
|
+
try {
|
|
44
|
+
fs.mkdirSync(this.dir, { recursive: true });
|
|
45
|
+
const full = {
|
|
46
|
+
tmuxSession: entry.tmuxSession,
|
|
47
|
+
initialMessage: entry.initialMessage,
|
|
48
|
+
...(entry.telegramTopicId !== undefined ? { telegramTopicId: entry.telegramTopicId } : {}),
|
|
49
|
+
createdAt: entry.createdAt ?? new Date().toISOString(),
|
|
50
|
+
};
|
|
51
|
+
fs.writeFileSync(this.fileFor(entry.tmuxSession), JSON.stringify(full, null, 2));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
// @silent-fallback-ok a durable-ledger write must NEVER break the spawn it
|
|
55
|
+
// is protecting — warn with context and continue; a missed record only
|
|
56
|
+
// means this one inject isn't restart-recoverable (the pre-fix behavior).
|
|
57
|
+
console.warn(`[PendingInjectStore] record failed for "${entry.tmuxSession}" (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Remove the record after a verified inject. Never throws. */
|
|
61
|
+
clear(tmuxSession) {
|
|
62
|
+
try {
|
|
63
|
+
SafeFsExecutor.safeUnlinkSync(this.fileFor(tmuxSession), {
|
|
64
|
+
operation: 'PendingInjectStore.clear',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err?.code !== 'ENOENT') {
|
|
69
|
+
// Already-cleared (ENOENT) is the expected no-op; anything else is
|
|
70
|
+
// non-fatal — a stale record is re-examined (and expired) by the next
|
|
71
|
+
// boot sweep, so we report rather than throw into the inject path.
|
|
72
|
+
console.warn(`[PendingInjectStore] clear failed for "${tmuxSession}" (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** All surviving records (corrupt files are skipped, reported via return). */
|
|
77
|
+
list() {
|
|
78
|
+
const records = [];
|
|
79
|
+
const corrupt = [];
|
|
80
|
+
let files = [];
|
|
81
|
+
try {
|
|
82
|
+
files = fs.readdirSync(this.dir).filter((f) => f.endsWith('.json'));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// @silent-fallback-ok no pending-injects dir yet (fresh install / nothing
|
|
86
|
+
// ever queued) is the normal empty case, not a degradation — return empty.
|
|
87
|
+
return { records, corrupt };
|
|
88
|
+
}
|
|
89
|
+
for (const f of files) {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(fs.readFileSync(path.join(this.dir, f), 'utf8'));
|
|
92
|
+
if (parsed && typeof parsed === 'object' &&
|
|
93
|
+
typeof parsed.tmuxSession === 'string' &&
|
|
94
|
+
typeof parsed.initialMessage === 'string' &&
|
|
95
|
+
typeof parsed.createdAt === 'string') {
|
|
96
|
+
records.push(parsed);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
corrupt.push(f);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
corrupt.push(f);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { records, corrupt };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Boot-time recovery over surviving records. Decision per record:
|
|
111
|
+
* - older than maxAge → expire + reportLoss (stale enough that re-injecting
|
|
112
|
+
* mid-conversation would confuse more than help)
|
|
113
|
+
* - tmux session still alive → redeliver via the readiness path, clear on success
|
|
114
|
+
* - tmux session gone → reportLoss + clear (the bridge respawns on the
|
|
115
|
+
* user's next message; the loss is now VISIBLE)
|
|
116
|
+
*/
|
|
117
|
+
export async function sweepPendingInjects(store, deps) {
|
|
118
|
+
const result = { redelivered: [], expired: [], deadSession: [], failed: [] };
|
|
119
|
+
const now = deps.now ?? (() => Date.now());
|
|
120
|
+
const maxAgeMs = deps.maxAgeMs ?? 6 * 60 * 60 * 1000;
|
|
121
|
+
const { records, corrupt } = store.list();
|
|
122
|
+
for (const f of corrupt) {
|
|
123
|
+
console.warn(`[PendingInjectStore] corrupt pending-inject file skipped: ${f}`);
|
|
124
|
+
}
|
|
125
|
+
for (const record of records) {
|
|
126
|
+
const age = now() - Date.parse(record.createdAt);
|
|
127
|
+
if (!Number.isFinite(age) || age > maxAgeMs) {
|
|
128
|
+
deps.reportLoss(record, `record expired (age ${Math.round(age / 60000)}m > ${Math.round(maxAgeMs / 60000)}m)`);
|
|
129
|
+
store.clear(record.tmuxSession);
|
|
130
|
+
result.expired.push(record.tmuxSession);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!deps.sessionAlive(record.tmuxSession)) {
|
|
134
|
+
deps.reportLoss(record, 'target tmux session no longer exists');
|
|
135
|
+
store.clear(record.tmuxSession);
|
|
136
|
+
result.deadSession.push(record.tmuxSession);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
await deps.redeliver(record);
|
|
141
|
+
store.clear(record.tmuxSession);
|
|
142
|
+
result.redelivered.push(record.tmuxSession);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
// Keep the record — the NEXT boot retries. Failing loudly beats dropping.
|
|
146
|
+
deps.reportLoss(record, `redeliver failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
147
|
+
result.failed.push(record.tmuxSession);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=PendingInjectStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingInjectStore.js","sourceRoot":"","sources":["../../src/core/PendingInjectStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -3311,6 +3311,28 @@ Every session shutoff — and every REFUSED shutoff (protected, not-lease-holder
|
|
|
3311
3311
|
else {
|
|
3312
3312
|
result.skipped.push('CLAUDE.md: Reap-Log section already present');
|
|
3313
3313
|
}
|
|
3314
|
+
// GuardPostureTripwire — a disabled guard is itself an incident. Tells the
|
|
3315
|
+
// agent the "did a monitor get switched off?" surface exists. Without it,
|
|
3316
|
+
// an agent asked "why didn't the watchdog catch this?" can't ground the
|
|
3317
|
+
// answer in the posture history (the 2026-06-05 batch-flip went invisible
|
|
3318
|
+
// for exactly this reason). Idempotent via content-sniffing on the
|
|
3319
|
+
// breadcrumb path.
|
|
3320
|
+
if (!content.includes('guard-posture.jsonl')) {
|
|
3321
|
+
const section = `
|
|
3322
|
+
## Guard-Posture Tripwire (a disabled guard is itself an incident)
|
|
3323
|
+
|
|
3324
|
+
At every server boot the guard posture (every \`monitoring.*\` enabled flag + \`scheduler.enabled\`) is compared against the previous boot's posture. Any guard that went enabled→disabled triggers: a loud boot log line, one row in \`logs/guard-posture.jsonl\`, and ONE aggregated HIGH Attention item listing every newly-disabled guard. Re-enables get the breadcrumb only. Signal-only — nothing is ever auto-re-enabled; a deliberate disable just needs its Attention item acknowledged. (Born from the 2026-06-05 meltdown load-shed: five guards batch-flipped off by an emergency config edit, only one noticed.)
|
|
3325
|
+
|
|
3326
|
+
- If a user asks "why didn't the watchdog/sentinel/scheduler catch X?" — FIRST check \`logs/guard-posture.jsonl\` (and the current config) to see whether the guard was even running. A silently-disabled guard explains more incidents than a broken one.
|
|
3327
|
+
- If you ever disable a guard yourself as emergency load-shedding: say so to the user at the time, and expect the tripwire to raise the Attention item at the next boot — that item is the loop-closer that gets the guard turned back on.
|
|
3328
|
+
`;
|
|
3329
|
+
content += '\n' + section;
|
|
3330
|
+
patched = true;
|
|
3331
|
+
result.upgraded.push('CLAUDE.md: added Guard-Posture Tripwire section');
|
|
3332
|
+
}
|
|
3333
|
+
else {
|
|
3334
|
+
result.skipped.push('CLAUDE.md: Guard-Posture Tripwire section already present');
|
|
3335
|
+
}
|
|
3314
3336
|
// AgentWorktreeReaper report (RESPONSIBLE-RESOURCE-USAGE — OS resource hygiene).
|
|
3315
3337
|
// Tells the agent the "which stale worktrees can be reclaimed?" read-surface
|
|
3316
3338
|
// exists. Without it, an agent asked about worktree disk/sprawl has no grounded
|