instar 1.3.499 → 1.3.501
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 +407 -6
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +10 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +69 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/ReapGuard.d.ts +24 -0
- package/dist/core/ReapGuard.d.ts.map +1 -1
- package/dist/core/ReapGuard.js +62 -0
- package/dist/core/ReapGuard.js.map +1 -1
- package/dist/core/SessionManager.d.ts +32 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +74 -2
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/WorkEvidence.d.ts +45 -0
- package/dist/core/WorkEvidence.d.ts.map +1 -0
- package/dist/core/WorkEvidence.js +88 -0
- package/dist/core/WorkEvidence.js.map +1 -0
- package/dist/core/componentCategories.d.ts.map +1 -1
- package/dist/core/componentCategories.js +3 -0
- package/dist/core/componentCategories.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +5 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/NotificationBatcher.d.ts +12 -0
- package/dist/messaging/NotificationBatcher.d.ts.map +1 -1
- package/dist/messaging/NotificationBatcher.js +36 -0
- package/dist/messaging/NotificationBatcher.js.map +1 -1
- package/dist/messaging/pending-relay-store.d.ts +67 -8
- package/dist/messaging/pending-relay-store.d.ts.map +1 -1
- package/dist/messaging/pending-relay-store.js +151 -14
- package/dist/messaging/pending-relay-store.js.map +1 -1
- package/dist/messaging/reap-notice-delivery-id.d.ts +37 -0
- package/dist/messaging/reap-notice-delivery-id.d.ts.map +1 -0
- package/dist/messaging/reap-notice-delivery-id.js +52 -0
- package/dist/messaging/reap-notice-delivery-id.js.map +1 -0
- package/dist/monitoring/QuotaManager.d.ts +6 -0
- package/dist/monitoring/QuotaManager.d.ts.map +1 -1
- package/dist/monitoring/QuotaManager.js +11 -0
- package/dist/monitoring/QuotaManager.js.map +1 -1
- package/dist/monitoring/ReapLog.d.ts +39 -4
- package/dist/monitoring/ReapLog.d.ts.map +1 -1
- package/dist/monitoring/ReapLog.js +54 -4
- package/dist/monitoring/ReapLog.js.map +1 -1
- package/dist/monitoring/ReapNoticeDrain.d.ts +113 -0
- package/dist/monitoring/ReapNoticeDrain.d.ts.map +1 -0
- package/dist/monitoring/ReapNoticeDrain.js +231 -0
- package/dist/monitoring/ReapNoticeDrain.js.map +1 -0
- package/dist/monitoring/ReapNotifier.d.ts +89 -18
- package/dist/monitoring/ReapNotifier.d.ts.map +1 -1
- package/dist/monitoring/ReapNotifier.js +329 -22
- package/dist/monitoring/ReapNotifier.js.map +1 -1
- package/dist/monitoring/ResumeQueue.d.ts +223 -0
- package/dist/monitoring/ResumeQueue.d.ts.map +1 -0
- package/dist/monitoring/ResumeQueue.js +600 -0
- package/dist/monitoring/ResumeQueue.js.map +1 -0
- package/dist/monitoring/ResumeQueueDrainer.d.ts +151 -0
- package/dist/monitoring/ResumeQueueDrainer.d.ts.map +1 -0
- package/dist/monitoring/ResumeQueueDrainer.js +420 -0
- package/dist/monitoring/ResumeQueueDrainer.js.map +1 -0
- package/dist/monitoring/SessionMigrator.d.ts +10 -0
- package/dist/monitoring/SessionMigrator.d.ts.map +1 -1
- package/dist/monitoring/SessionMigrator.js +43 -1
- package/dist/monitoring/SessionMigrator.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts +1 -0
- package/dist/monitoring/SessionReaper.d.ts.map +1 -1
- package/dist/monitoring/SessionReaper.js +5 -0
- package/dist/monitoring/SessionReaper.js.map +1 -1
- package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -1
- package/dist/monitoring/delivery-failure-sentinel.js +7 -3
- package/dist/monitoring/delivery-failure-sentinel.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +4 -3
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +5 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +3 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +8 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +94 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/skills/spec-converge/SKILL.md +23 -0
- package/src/data/builtin-manifest.json +65 -65
- package/src/data/state-coherence-registry.json +14 -1
- package/src/scaffold/templates.ts +4 -3
- package/upgrades/1.3.500.md +43 -0
- package/upgrades/1.3.501.md +51 -0
- package/upgrades/side-effects/conformance-gate-autoinvoke.md +58 -0
- package/upgrades/side-effects/reap-notify-resume-queue.md +89 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResumeQueue — the durable, ordered queue of mid-work reaped sessions
|
|
3
|
+
* awaiting revival (reap-notify spec R2.2/R2.3, parts of R2.9/R2.10).
|
|
4
|
+
*
|
|
5
|
+
* One queue per machine, JSON-file backed (`state/resume-queue.json`),
|
|
6
|
+
* in-memory authoritative with SYNCHRONOUS persist on every mutation using
|
|
7
|
+
* the crash-durable discipline: write temp → fsync temp → rename → fsync
|
|
8
|
+
* parent dir. A crash loses at most the latest mutation, which boot
|
|
9
|
+
* reconciliation absorbs (a lost enqueue is re-created from the reap-log; a
|
|
10
|
+
* lost transition replays as a failed attempt).
|
|
11
|
+
*
|
|
12
|
+
* Single-writer is ENFORCED, not assumed: a lockfile
|
|
13
|
+
* (`state/resume-queue.lock`, pid + hostname + heartbeat mtime) is taken at
|
|
14
|
+
* start. Stale-lock recovery is automatic on the SAME host (dead pid or old
|
|
15
|
+
* heartbeat ⇒ reclaim + log); a LIVE other process disables the queue loudly.
|
|
16
|
+
* HARD INVARIANT: a lock whose hostname differs from this host is NEVER
|
|
17
|
+
* liveness-probed or reclaimed — pid checks are meaningless cross-host — it
|
|
18
|
+
* disables the queue loudly instead, and the disable message documents the
|
|
19
|
+
* operational recovery (verify nothing else uses the state dir, delete the
|
|
20
|
+
* lock, restart).
|
|
21
|
+
*
|
|
22
|
+
* Eligibility (R2.2) is stricter than midWork: terminal + autonomous +
|
|
23
|
+
* (≥1 strong signal, OR topic-bound with ≥2 distinct weak signals); jobs
|
|
24
|
+
* must opt in (`resumeOnReap:true`, default false); sessions with neither a
|
|
25
|
+
* topic binding nor a jobSlug are excluded at enqueue; operator kills
|
|
26
|
+
* excluded by default; watchdog stuck-kills and topic-moved closeouts never
|
|
27
|
+
* queue. The resurrection LEDGER (keyed on stable identity
|
|
28
|
+
* `topicId ?? jobSlug ?? tmuxSession`, tombstones surviving dequeue, 24h
|
|
29
|
+
* reset window) caps kill-resume-kill loops at `maxResurrections`.
|
|
30
|
+
*
|
|
31
|
+
* Dry-run posture (the fleet's shipped default): entries ARE durably
|
|
32
|
+
* enqueued (observable in `GET /sessions/resume-queue` — the soak needs real
|
|
33
|
+
* midWork entries), but the drainer never spawns (it audits `would-resume`)
|
|
34
|
+
* and nothing user-facing claims a queued resume. Deliberate interpretation
|
|
35
|
+
* of "observe-only", recorded in the side-effects review.
|
|
36
|
+
*/
|
|
37
|
+
export type ResumePriorityClass = 'interactive' | 'job' | 'other';
|
|
38
|
+
export type ResumeEntryStatus = 'queued' | 'starting' | 'respawned' | 'failed' | 'cancelled' | `invalidated:${string}` | `gave-up:${string}`;
|
|
39
|
+
export interface ResumeQueueEntry {
|
|
40
|
+
id: string;
|
|
41
|
+
queuedAt: string;
|
|
42
|
+
/** TTL re-anchor on an operator requeue (R2.10); TTL keys on max(queuedAt, requeuedAt). */
|
|
43
|
+
requeuedAt?: string;
|
|
44
|
+
/** Stable identity: topicId ?? jobSlug ?? tmuxSession (R2.3). */
|
|
45
|
+
stableKey: string;
|
|
46
|
+
sessionName: string;
|
|
47
|
+
tmuxSession: string;
|
|
48
|
+
topicId?: number;
|
|
49
|
+
/** Conversation-resume UUID snapshot at enqueue time (R2.6 revalidates). */
|
|
50
|
+
resumeUuid?: string;
|
|
51
|
+
jobSlug?: string;
|
|
52
|
+
cwd: string;
|
|
53
|
+
worktreePath?: string;
|
|
54
|
+
priorityClass: ResumePriorityClass;
|
|
55
|
+
reason: string;
|
|
56
|
+
workEvidence: string[];
|
|
57
|
+
attempts: number;
|
|
58
|
+
status: ResumeEntryStatus;
|
|
59
|
+
lastAttemptAt?: string;
|
|
60
|
+
/** Backoff hold between attempts (R2.9). */
|
|
61
|
+
nextAttemptAt?: string;
|
|
62
|
+
/** Milliseconds of operator-pause time excluded from this entry's TTL clock. */
|
|
63
|
+
frozenMs?: number;
|
|
64
|
+
/** TTL expiry under sustained pressure carries this marker (R2.9). */
|
|
65
|
+
pressureStarved?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/** Tombstone ledger row — survives dequeue (R2.9 resurrection cap). */
|
|
68
|
+
export interface ResurrectionTombstone {
|
|
69
|
+
stableKey: string;
|
|
70
|
+
resurrections: number;
|
|
71
|
+
windowStartAt: string;
|
|
72
|
+
lastResumeAt?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface ResumeQueueConfig {
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
dryRun: boolean;
|
|
77
|
+
maxAttempts: number;
|
|
78
|
+
maxResurrections: number;
|
|
79
|
+
entryTtlHours: number;
|
|
80
|
+
maxQueueSize: number;
|
|
81
|
+
includeOperatorKills: boolean;
|
|
82
|
+
}
|
|
83
|
+
export declare const DEFAULT_RESUME_QUEUE_CONFIG: ResumeQueueConfig;
|
|
84
|
+
export interface EnqueueDecision {
|
|
85
|
+
enqueued: boolean;
|
|
86
|
+
/** Why not (audit vocabulary). */
|
|
87
|
+
why?: string;
|
|
88
|
+
entry?: ResumeQueueEntry;
|
|
89
|
+
}
|
|
90
|
+
export interface ResumeCandidateInput {
|
|
91
|
+
sessionName: string;
|
|
92
|
+
tmuxSession: string;
|
|
93
|
+
topicId?: number | null;
|
|
94
|
+
jobSlug?: string;
|
|
95
|
+
jobResumeOptIn?: boolean;
|
|
96
|
+
resumeUuid?: string | null;
|
|
97
|
+
cwd: string;
|
|
98
|
+
worktreePath?: string;
|
|
99
|
+
reason: string;
|
|
100
|
+
disposition: 'terminal' | 'recovery-bounce';
|
|
101
|
+
origin: 'operator' | 'autonomous';
|
|
102
|
+
workEvidence: string[];
|
|
103
|
+
}
|
|
104
|
+
export interface ResumeQueueDeps {
|
|
105
|
+
/** `.instar` state dir — files live under `<stateDir>/state/`. */
|
|
106
|
+
stateDir: string;
|
|
107
|
+
/** Decision-transition audit sink (logs/resume-queue.jsonl). */
|
|
108
|
+
audit?: (event: Record<string, unknown>) => void;
|
|
109
|
+
/** Aggregated attention surface (ONE rolling item — the caller dedupes). */
|
|
110
|
+
raiseAggregated?: (kind: string, detail: string) => void;
|
|
111
|
+
now?: () => number;
|
|
112
|
+
hostname?: () => string;
|
|
113
|
+
/** pid liveness probe (tests override). */
|
|
114
|
+
pidAlive?: (pid: number) => boolean;
|
|
115
|
+
}
|
|
116
|
+
/** Pure eligibility classifier (R2.2) — exported for tests. */
|
|
117
|
+
export declare function classifyEligibility(input: ResumeCandidateInput, cfg: Pick<ResumeQueueConfig, 'includeOperatorKills'>): {
|
|
118
|
+
eligible: boolean;
|
|
119
|
+
why?: string;
|
|
120
|
+
};
|
|
121
|
+
export declare class ResumeQueue {
|
|
122
|
+
private readonly deps;
|
|
123
|
+
private readonly cfg;
|
|
124
|
+
private readonly now;
|
|
125
|
+
private readonly statePath;
|
|
126
|
+
private readonly lockPath;
|
|
127
|
+
private state;
|
|
128
|
+
private seq;
|
|
129
|
+
/** Non-null ⇒ the queue is disabled (lock conflict / foreign lock). */
|
|
130
|
+
private disabledReason;
|
|
131
|
+
private lockHeld;
|
|
132
|
+
constructor(deps: ResumeQueueDeps, cfg?: Partial<ResumeQueueConfig>);
|
|
133
|
+
config(): ResumeQueueConfig;
|
|
134
|
+
isDisabled(): string | null;
|
|
135
|
+
isPaused(): boolean;
|
|
136
|
+
isDryRun(): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Acquire the single-writer lock + load the durable state. Returns false
|
|
139
|
+
* (queue disabled, reason in `isDisabled()`) on a live-other-process or
|
|
140
|
+
* foreign-host lock — never throws for those.
|
|
141
|
+
*/
|
|
142
|
+
start(): boolean;
|
|
143
|
+
stop(): void;
|
|
144
|
+
/** Refresh the lock heartbeat (drainer calls this every tick). */
|
|
145
|
+
heartbeat(): void;
|
|
146
|
+
private acquireLock;
|
|
147
|
+
private load;
|
|
148
|
+
/** Crash-durable persist: temp → fsync temp → rename → fsync parent dir. */
|
|
149
|
+
private persist;
|
|
150
|
+
private audit;
|
|
151
|
+
/** Boot reconciliation half 1 (R2.4): `starting` found at load = failed attempt. */
|
|
152
|
+
private reconcileStartingEntries;
|
|
153
|
+
/**
|
|
154
|
+
* Boot reconciliation half 2 (R2.4): recent reap-log midWork terminal
|
|
155
|
+
* autonomous entries with no queue entry AND no tombstone are re-enqueued —
|
|
156
|
+
* closing the crash window where an enqueue's persist was lost. The caller
|
|
157
|
+
* supplies reconstruction (session records, resume map) — a candidate that
|
|
158
|
+
* cannot be reconstructed is skipped (the next re-reap recreates it).
|
|
159
|
+
*/
|
|
160
|
+
reconcileFromReapLog(candidates: ResumeCandidateInput[]): number;
|
|
161
|
+
private stableKeyFor;
|
|
162
|
+
/**
|
|
163
|
+
* The enqueue decision (R2.2 + R2.3 + R2.9 resurrection cap). Audited on
|
|
164
|
+
* every outcome. In dry-run the entry is still durably enqueued (the soak's
|
|
165
|
+
* observable), but nothing downstream spawns or claims a resume.
|
|
166
|
+
*/
|
|
167
|
+
considerEnqueue(input: ResumeCandidateInput, opts?: {
|
|
168
|
+
source?: string;
|
|
169
|
+
}): EnqueueDecision;
|
|
170
|
+
private tombstoneFor;
|
|
171
|
+
/** Record a successful resume (drainer, after spawn verification). */
|
|
172
|
+
recordResumeSuccess(stableKey: string): void;
|
|
173
|
+
/** Ordered open entries: interactive → job → other, FIFO inside each (R2.5). */
|
|
174
|
+
nextCandidates(): ResumeQueueEntry[];
|
|
175
|
+
list(): ResumeQueueEntry[];
|
|
176
|
+
get(id: string): ResumeQueueEntry | undefined;
|
|
177
|
+
/** State-transition helpers (each persists + audits the TRANSITION). */
|
|
178
|
+
transition(id: string, status: ResumeEntryStatus, extra?: Partial<ResumeQueueEntry>): boolean;
|
|
179
|
+
/** Operator/API cancel (an explicit per-topic stop cancels that topic's entries — R2.7). */
|
|
180
|
+
cancel(id: string): boolean;
|
|
181
|
+
cancelByTopic(topicId: number): number;
|
|
182
|
+
/**
|
|
183
|
+
* Requeue clamps (R2.10): eligible from gave-up:* ONLY — never `cancelled`
|
|
184
|
+
* (an operator stop) and refused while paused (callers enforce the 409).
|
|
185
|
+
* Resets attempts and RE-ANCHORS the TTL clock while preserving the original
|
|
186
|
+
* queuedAt for the R2.6 operator-stop / job-ran-since checks. Requeueing a
|
|
187
|
+
* gave-up:resurrection-cap entry grants exactly ONE audited override.
|
|
188
|
+
*/
|
|
189
|
+
requeue(id: string): {
|
|
190
|
+
ok: boolean;
|
|
191
|
+
why?: string;
|
|
192
|
+
};
|
|
193
|
+
/** Queue-global pause (R2.7): entries keep their states; TTLs freeze. */
|
|
194
|
+
pause(reason: string): void;
|
|
195
|
+
/** Explicit unpause lever (R2.7) — accumulates the pause into frozenMs. */
|
|
196
|
+
unpause(): void;
|
|
197
|
+
pauseInfo(): {
|
|
198
|
+
paused: boolean;
|
|
199
|
+
pausedAt?: string;
|
|
200
|
+
reason?: string;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* TTL sweep (R2.9): INCIDENT-AGE semantics — wall clock since
|
|
204
|
+
* max(queuedAt, requeuedAt), minus operator-pause freeze, NOT frozen by
|
|
205
|
+
* pressure. Expiries under sustained pressure carry the pressure-starved
|
|
206
|
+
* marker so a day-long overload reads differently from ordinary staleness.
|
|
207
|
+
* No sweep while paused (an operator pause must not silently expire the queue).
|
|
208
|
+
*/
|
|
209
|
+
expireTtl(pressureCalm: boolean): ResumeQueueEntry[];
|
|
210
|
+
/** Snapshot for the API surface (R2.10). */
|
|
211
|
+
snapshot(): {
|
|
212
|
+
paused: boolean;
|
|
213
|
+
pauseReason?: string;
|
|
214
|
+
disabled: string | null;
|
|
215
|
+
dryRun: boolean;
|
|
216
|
+
entries: ResumeQueueEntry[];
|
|
217
|
+
tombstones: ResurrectionTombstone[];
|
|
218
|
+
};
|
|
219
|
+
/** True when a LIVE (non-dry-run) queued entry exists for this tmux session
|
|
220
|
+
* — feeds the notifier's "restart is queued" line (R1.2). */
|
|
221
|
+
hasLiveQueuedEntryFor(tmuxSession: string): boolean;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=ResumeQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResumeQueue.d.ts","sourceRoot":"","sources":["../../src/monitoring/ResumeQueue.ts"],"names":[],"mappings":"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"}
|