instar 0.28.92 → 0.28.94
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 +9 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/DriftSpendLedger.d.ts +112 -0
- package/dist/core/DriftSpendLedger.d.ts.map +1 -0
- package/dist/core/DriftSpendLedger.js +285 -0
- package/dist/core/DriftSpendLedger.js.map +1 -0
- package/dist/core/InitiativeTracker.d.ts +7 -2
- package/dist/core/InitiativeTracker.d.ts.map +1 -1
- package/dist/core/InitiativeTracker.js.map +1 -1
- package/dist/core/ProjectDriftChecker.d.ts +215 -0
- package/dist/core/ProjectDriftChecker.d.ts.map +1 -0
- package/dist/core/ProjectDriftChecker.js +572 -0
- package/dist/core/ProjectDriftChecker.js.map +1 -0
- package/dist/core/ProjectDriftCheckerCache.d.ts +118 -0
- package/dist/core/ProjectDriftCheckerCache.d.ts.map +1 -0
- package/dist/core/ProjectDriftCheckerCache.js +221 -0
- package/dist/core/ProjectDriftCheckerCache.js.map +1 -0
- package/dist/core/SessionManager.d.ts +5 -4
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +3 -2
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StuckInputSentinel.d.ts +160 -0
- package/dist/core/StuckInputSentinel.d.ts.map +1 -0
- package/dist/core/StuckInputSentinel.js +315 -0
- package/dist/core/StuckInputSentinel.js.map +1 -0
- package/dist/core/types.d.ts +40 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
- package/dist/lifeline/ServerSupervisor.js +8 -0
- package/dist/lifeline/ServerSupervisor.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +3 -3
- package/upgrades/0.28.93.md +126 -0
- package/upgrades/0.28.94.md +60 -0
- package/upgrades/side-effects/project-scope-phase1b-pr1.md +252 -0
- package/upgrades/side-effects/project-scope-phase1b-pr2.md +198 -0
- package/upgrades/side-effects/stuck-input-sentinel.md +137 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectDriftCheckerCache — verdict cache with mtime fast-path.
|
|
3
|
+
*
|
|
4
|
+
* Spec: docs/specs/PROJECT-SCOPE-SPEC.md § Phase 1.4 ("Cache key" + mtime
|
|
5
|
+
* fast-path).
|
|
6
|
+
*
|
|
7
|
+
* Cache key: sha256(promptTemplateVersion + modelId + specBodySha + sortedFileHashes)
|
|
8
|
+
* TTL: 24h (cache entries older than this are treated as misses)
|
|
9
|
+
*
|
|
10
|
+
* Mtime fast-path:
|
|
11
|
+
* Before computing the cache key, the cache compares (specPath mtime,
|
|
12
|
+
* referencedFile mtimes) to the values it last saw associated with the
|
|
13
|
+
* stored entry. If every mtime matches, the cache key is REUSED without
|
|
14
|
+
* re-hashing — file contents haven't changed. If any mtime moved, full
|
|
15
|
+
* hashing falls back. This is the spec's stated optimization: hashing
|
|
16
|
+
* only happens when an mtime moved.
|
|
17
|
+
*
|
|
18
|
+
* Storage:
|
|
19
|
+
* In-memory Map keyed by `${projectId}:${roundIndex}` (the natural id
|
|
20
|
+
* for a drift check). Disk-backed snapshot at
|
|
21
|
+
* `.instar/drift-verdict-cache.json` so the cache survives restarts
|
|
22
|
+
* without a cold first-call penalty after a sleep/wake.
|
|
23
|
+
*
|
|
24
|
+
* Concurrency:
|
|
25
|
+
* This cache is consulted INSIDE the per-project mutex held by
|
|
26
|
+
* `POST /projects/:id/drift-check` (Phase 1.5 round runner has its own
|
|
27
|
+
* round-runner lock). Within a single process there's no race; across
|
|
28
|
+
* processes the JSON snapshot is read on construction and written on
|
|
29
|
+
* every put, atomically (tmp + rename).
|
|
30
|
+
*/
|
|
31
|
+
import type { DriftVerdict } from './types.js';
|
|
32
|
+
export declare const DEFAULT_TTL_MS: number;
|
|
33
|
+
export declare const SNAPSHOT_FILENAME = "drift-verdict-cache.json";
|
|
34
|
+
export interface ProjectDriftCheckerCacheConfig {
|
|
35
|
+
/** Absolute path to the agent's `.instar/` directory. */
|
|
36
|
+
stateDir: string;
|
|
37
|
+
/** Override the 24h TTL (tests dial this down). */
|
|
38
|
+
ttlMs?: number;
|
|
39
|
+
/** When false, the cache does not read/write disk (in-memory only). */
|
|
40
|
+
persist?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface CacheLookupInput {
|
|
43
|
+
projectId: string;
|
|
44
|
+
roundIndex: number;
|
|
45
|
+
/** Bumped on every prompt-template edit; part of the cache key. */
|
|
46
|
+
promptTemplateVersion: number;
|
|
47
|
+
/** Resolved model id from the provider; part of the cache key. */
|
|
48
|
+
modelId: string;
|
|
49
|
+
/** Absolute path to the spec file (used for mtime fast-path). */
|
|
50
|
+
specPath: string;
|
|
51
|
+
/** Absolute paths to referenced files. Order matters for fast-path but
|
|
52
|
+
* not for the cache key (sortedFileHashes is order-stable). */
|
|
53
|
+
referencedFilePaths: string[];
|
|
54
|
+
/** Buffers, in the same order as `referencedFilePaths`. Used to compute
|
|
55
|
+
* sha256 inputs when mtime fast-path misses. */
|
|
56
|
+
referencedFileBytes: Buffer[];
|
|
57
|
+
/** Spec body bytes — sha256 input. */
|
|
58
|
+
specBytes: Buffer;
|
|
59
|
+
}
|
|
60
|
+
export interface CacheHit {
|
|
61
|
+
hit: true;
|
|
62
|
+
verdict: DriftVerdict;
|
|
63
|
+
computedAt: string;
|
|
64
|
+
/** Cache key that matched. */
|
|
65
|
+
key: string;
|
|
66
|
+
/** True if served by the mtime fast-path (no re-hash performed). */
|
|
67
|
+
mtimeFastPath: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface CacheMiss {
|
|
70
|
+
hit: false;
|
|
71
|
+
/** Cache key the caller should associate with the verdict on put(). */
|
|
72
|
+
key: string;
|
|
73
|
+
}
|
|
74
|
+
export type CacheLookupResult = CacheHit | CacheMiss;
|
|
75
|
+
export declare class ProjectDriftCheckerCache {
|
|
76
|
+
private stateDir;
|
|
77
|
+
private ttlMs;
|
|
78
|
+
private persist;
|
|
79
|
+
private entries;
|
|
80
|
+
constructor(config: ProjectDriftCheckerCacheConfig);
|
|
81
|
+
/**
|
|
82
|
+
* Look up an entry for `(projectId, roundIndex)`. Returns a hit ONLY if:
|
|
83
|
+
* (a) an entry exists, AND
|
|
84
|
+
* (b) the entry is within the TTL, AND
|
|
85
|
+
* (c) either the mtime fast-path matches (no re-hash needed) OR the
|
|
86
|
+
* full sha256 cache key matches.
|
|
87
|
+
*
|
|
88
|
+
* On miss, the returned `key` is the freshly-computed sha256, which the
|
|
89
|
+
* caller should pass back to `put()` after running drift.
|
|
90
|
+
*/
|
|
91
|
+
lookup(input: CacheLookupInput): CacheLookupResult;
|
|
92
|
+
/**
|
|
93
|
+
* Store `verdict` under `(projectId, roundIndex)` keyed by `key`. Captures
|
|
94
|
+
* file mtimes for the next mtime fast-path lookup.
|
|
95
|
+
*
|
|
96
|
+
* `manual-review-required` verdicts ARE cached too — re-running drift
|
|
97
|
+
* immediately won't change a deterministic over-budget or
|
|
98
|
+
* empty-spec answer. The TTL still expires them after 24h.
|
|
99
|
+
*/
|
|
100
|
+
put(input: CacheLookupInput, key: string, verdict: DriftVerdict): void;
|
|
101
|
+
/** Remove an entry for `(projectId, roundIndex)`. */
|
|
102
|
+
invalidate(projectId: string, roundIndex: number): void;
|
|
103
|
+
/** For tests / digest. */
|
|
104
|
+
size(): number;
|
|
105
|
+
private snapshotPath;
|
|
106
|
+
private loadSnapshot;
|
|
107
|
+
private saveSnapshot;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Compute the deterministic cache key. Exported for tests and for the
|
|
111
|
+
* `cacheKeyInputs` helper in ProjectDriftChecker.ts (which produces the
|
|
112
|
+
* same inputs — this function hashes them into a stable string).
|
|
113
|
+
*/
|
|
114
|
+
export declare function computeCacheKey(promptTemplateVersion: number, modelId: string, specBytes: Buffer, referencedFileBytes: Array<{
|
|
115
|
+
relPath: string;
|
|
116
|
+
bytes: Buffer;
|
|
117
|
+
}>): string;
|
|
118
|
+
//# sourceMappingURL=ProjectDriftCheckerCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDriftCheckerCache.d.ts","sourceRoot":"","sources":["../../src/core/ProjectDriftCheckerCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,cAAc,QAAsB,CAAC;AAClD,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D,MAAM,WAAW,8BAA8B;IAC7C,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB;oEACgE;IAChE,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B;qDACiD;IACjD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,KAAK,CAAC;IACX,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAerD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,MAAM,EAAE,8BAA8B;IAOlD;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB;IAqElD;;;;;;;OAOG;IACH,GAAG,CACD,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,GACpB,IAAI;IA6BP,qDAAqD;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAKvD,0BAA0B;IAC1B,IAAI,IAAI,MAAM;IAMd,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,YAAY;CAOrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7D,MAAM,CAUR"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectDriftCheckerCache — verdict cache with mtime fast-path.
|
|
3
|
+
*
|
|
4
|
+
* Spec: docs/specs/PROJECT-SCOPE-SPEC.md § Phase 1.4 ("Cache key" + mtime
|
|
5
|
+
* fast-path).
|
|
6
|
+
*
|
|
7
|
+
* Cache key: sha256(promptTemplateVersion + modelId + specBodySha + sortedFileHashes)
|
|
8
|
+
* TTL: 24h (cache entries older than this are treated as misses)
|
|
9
|
+
*
|
|
10
|
+
* Mtime fast-path:
|
|
11
|
+
* Before computing the cache key, the cache compares (specPath mtime,
|
|
12
|
+
* referencedFile mtimes) to the values it last saw associated with the
|
|
13
|
+
* stored entry. If every mtime matches, the cache key is REUSED without
|
|
14
|
+
* re-hashing — file contents haven't changed. If any mtime moved, full
|
|
15
|
+
* hashing falls back. This is the spec's stated optimization: hashing
|
|
16
|
+
* only happens when an mtime moved.
|
|
17
|
+
*
|
|
18
|
+
* Storage:
|
|
19
|
+
* In-memory Map keyed by `${projectId}:${roundIndex}` (the natural id
|
|
20
|
+
* for a drift check). Disk-backed snapshot at
|
|
21
|
+
* `.instar/drift-verdict-cache.json` so the cache survives restarts
|
|
22
|
+
* without a cold first-call penalty after a sleep/wake.
|
|
23
|
+
*
|
|
24
|
+
* Concurrency:
|
|
25
|
+
* This cache is consulted INSIDE the per-project mutex held by
|
|
26
|
+
* `POST /projects/:id/drift-check` (Phase 1.5 round runner has its own
|
|
27
|
+
* round-runner lock). Within a single process there's no race; across
|
|
28
|
+
* processes the JSON snapshot is read on construction and written on
|
|
29
|
+
* every put, atomically (tmp + rename).
|
|
30
|
+
*/
|
|
31
|
+
import fs from 'node:fs';
|
|
32
|
+
import path from 'node:path';
|
|
33
|
+
import crypto from 'node:crypto';
|
|
34
|
+
export const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
35
|
+
export const SNAPSHOT_FILENAME = 'drift-verdict-cache.json';
|
|
36
|
+
export class ProjectDriftCheckerCache {
|
|
37
|
+
stateDir;
|
|
38
|
+
ttlMs;
|
|
39
|
+
persist;
|
|
40
|
+
entries = new Map();
|
|
41
|
+
constructor(config) {
|
|
42
|
+
this.stateDir = config.stateDir;
|
|
43
|
+
this.ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;
|
|
44
|
+
this.persist = config.persist ?? true;
|
|
45
|
+
if (this.persist)
|
|
46
|
+
this.loadSnapshot();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Look up an entry for `(projectId, roundIndex)`. Returns a hit ONLY if:
|
|
50
|
+
* (a) an entry exists, AND
|
|
51
|
+
* (b) the entry is within the TTL, AND
|
|
52
|
+
* (c) either the mtime fast-path matches (no re-hash needed) OR the
|
|
53
|
+
* full sha256 cache key matches.
|
|
54
|
+
*
|
|
55
|
+
* On miss, the returned `key` is the freshly-computed sha256, which the
|
|
56
|
+
* caller should pass back to `put()` after running drift.
|
|
57
|
+
*/
|
|
58
|
+
lookup(input) {
|
|
59
|
+
const entryId = `${input.projectId}:${input.roundIndex}`;
|
|
60
|
+
const existing = this.entries.get(entryId);
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
// ── Mtime fast-path ──────────────────────────────────────────
|
|
63
|
+
// Cheap: verify the non-content cache-key inputs (templateVersion,
|
|
64
|
+
// modelId) match, then stat() each file and compare mtimes to the
|
|
65
|
+
// recorded mtimes. If everything matches, the cached entry is still
|
|
66
|
+
// valid and the cache key the entry holds is the one that matches
|
|
67
|
+
// the current bytes — we don't need to re-hash.
|
|
68
|
+
if (existing &&
|
|
69
|
+
now - Date.parse(existing.computedAt) < this.ttlMs &&
|
|
70
|
+
existing.promptTemplateVersion === input.promptTemplateVersion &&
|
|
71
|
+
existing.modelId === input.modelId) {
|
|
72
|
+
try {
|
|
73
|
+
const specMtime = fs.statSync(input.specPath).mtimeMs;
|
|
74
|
+
if (specMtime === existing.specMtimeMs) {
|
|
75
|
+
const allMatch = input.referencedFilePaths.every((p) => {
|
|
76
|
+
const recorded = existing.referencedFileMtimesMs[p];
|
|
77
|
+
if (recorded === undefined)
|
|
78
|
+
return false;
|
|
79
|
+
try {
|
|
80
|
+
return fs.statSync(p).mtimeMs === recorded;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Also require referenced set hasn't shrunk OR grown
|
|
87
|
+
const sameSet = Object.keys(existing.referencedFileMtimesMs).length === input.referencedFilePaths.length;
|
|
88
|
+
if (allMatch && sameSet) {
|
|
89
|
+
return {
|
|
90
|
+
hit: true,
|
|
91
|
+
verdict: existing.verdict,
|
|
92
|
+
computedAt: existing.computedAt,
|
|
93
|
+
key: existing.key,
|
|
94
|
+
mtimeFastPath: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// statSync failure on the spec or a referenced file = treat as miss.
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── Full hash path ───────────────────────────────────────────
|
|
104
|
+
const key = computeCacheKey(input.promptTemplateVersion, input.modelId, input.specBytes, input.referencedFilePaths.map((p, i) => ({
|
|
105
|
+
relPath: p,
|
|
106
|
+
bytes: input.referencedFileBytes[i] ?? Buffer.alloc(0),
|
|
107
|
+
})));
|
|
108
|
+
if (existing && existing.key === key && now - Date.parse(existing.computedAt) < this.ttlMs) {
|
|
109
|
+
return {
|
|
110
|
+
hit: true,
|
|
111
|
+
verdict: existing.verdict,
|
|
112
|
+
computedAt: existing.computedAt,
|
|
113
|
+
key,
|
|
114
|
+
mtimeFastPath: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return { hit: false, key };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Store `verdict` under `(projectId, roundIndex)` keyed by `key`. Captures
|
|
121
|
+
* file mtimes for the next mtime fast-path lookup.
|
|
122
|
+
*
|
|
123
|
+
* `manual-review-required` verdicts ARE cached too — re-running drift
|
|
124
|
+
* immediately won't change a deterministic over-budget or
|
|
125
|
+
* empty-spec answer. The TTL still expires them after 24h.
|
|
126
|
+
*/
|
|
127
|
+
put(input, key, verdict) {
|
|
128
|
+
const entryId = `${input.projectId}:${input.roundIndex}`;
|
|
129
|
+
const referencedFileMtimesMs = {};
|
|
130
|
+
let specMtimeMs = 0;
|
|
131
|
+
try {
|
|
132
|
+
specMtimeMs = fs.statSync(input.specPath).mtimeMs;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Spec gone — caller will probably get an `empty-spec` verdict
|
|
136
|
+
// anyway; record a zero so the next fast-path correctly invalidates.
|
|
137
|
+
}
|
|
138
|
+
for (const p of input.referencedFilePaths) {
|
|
139
|
+
try {
|
|
140
|
+
referencedFileMtimesMs[p] = fs.statSync(p).mtimeMs;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
referencedFileMtimesMs[p] = -1; // Forces a future miss.
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
this.entries.set(entryId, {
|
|
147
|
+
key,
|
|
148
|
+
verdict,
|
|
149
|
+
computedAt: new Date().toISOString(),
|
|
150
|
+
promptTemplateVersion: input.promptTemplateVersion,
|
|
151
|
+
modelId: input.modelId,
|
|
152
|
+
specMtimeMs,
|
|
153
|
+
referencedFileMtimesMs,
|
|
154
|
+
});
|
|
155
|
+
if (this.persist)
|
|
156
|
+
this.saveSnapshot();
|
|
157
|
+
}
|
|
158
|
+
/** Remove an entry for `(projectId, roundIndex)`. */
|
|
159
|
+
invalidate(projectId, roundIndex) {
|
|
160
|
+
this.entries.delete(`${projectId}:${roundIndex}`);
|
|
161
|
+
if (this.persist)
|
|
162
|
+
this.saveSnapshot();
|
|
163
|
+
}
|
|
164
|
+
/** For tests / digest. */
|
|
165
|
+
size() {
|
|
166
|
+
return this.entries.size;
|
|
167
|
+
}
|
|
168
|
+
// ── Snapshot persistence (atomic write) ───────────────────────────
|
|
169
|
+
snapshotPath() {
|
|
170
|
+
return path.join(this.stateDir, SNAPSHOT_FILENAME);
|
|
171
|
+
}
|
|
172
|
+
loadSnapshot() {
|
|
173
|
+
const p = this.snapshotPath();
|
|
174
|
+
if (!fs.existsSync(p))
|
|
175
|
+
return;
|
|
176
|
+
try {
|
|
177
|
+
const raw = fs.readFileSync(p, 'utf-8');
|
|
178
|
+
const obj = JSON.parse(raw);
|
|
179
|
+
if (!obj || !Array.isArray(obj.entries))
|
|
180
|
+
return;
|
|
181
|
+
for (const [id, entry] of obj.entries) {
|
|
182
|
+
if (typeof id !== 'string')
|
|
183
|
+
continue;
|
|
184
|
+
if (!entry || typeof entry !== 'object')
|
|
185
|
+
continue;
|
|
186
|
+
if (typeof entry.key !== 'string')
|
|
187
|
+
continue;
|
|
188
|
+
this.entries.set(id, entry);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Corrupt snapshot → start fresh, will be overwritten on next put.
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
saveSnapshot() {
|
|
196
|
+
if (!fs.existsSync(this.stateDir))
|
|
197
|
+
fs.mkdirSync(this.stateDir, { recursive: true });
|
|
198
|
+
const tmp = this.snapshotPath() + '.tmp';
|
|
199
|
+
const body = JSON.stringify({ entries: Array.from(this.entries.entries()) });
|
|
200
|
+
fs.writeFileSync(tmp, body, { mode: 0o600 });
|
|
201
|
+
fs.renameSync(tmp, this.snapshotPath());
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Compute the deterministic cache key. Exported for tests and for the
|
|
206
|
+
* `cacheKeyInputs` helper in ProjectDriftChecker.ts (which produces the
|
|
207
|
+
* same inputs — this function hashes them into a stable string).
|
|
208
|
+
*/
|
|
209
|
+
export function computeCacheKey(promptTemplateVersion, modelId, specBytes, referencedFileBytes) {
|
|
210
|
+
const sortedFileEntries = referencedFileBytes
|
|
211
|
+
.map((f) => `${f.relPath}:${crypto.createHash('sha256').update(f.bytes).digest('hex')}`)
|
|
212
|
+
.sort();
|
|
213
|
+
const h = crypto.createHash('sha256');
|
|
214
|
+
h.update(`v=${promptTemplateVersion}\n`);
|
|
215
|
+
h.update(`m=${modelId}\n`);
|
|
216
|
+
h.update(`s=${crypto.createHash('sha256').update(specBytes).digest('hex')}\n`);
|
|
217
|
+
for (const entry of sortedFileEntries)
|
|
218
|
+
h.update(`f=${entry}\n`);
|
|
219
|
+
return h.digest('hex');
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=ProjectDriftCheckerCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDriftCheckerCache.js","sourceRoot":"","sources":["../../src/core/ProjectDriftCheckerCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -408,16 +408,17 @@ export declare class SessionManager extends EventEmitter {
|
|
|
408
408
|
* line as `❯` or on the immediately-following line (Claude Code wraps
|
|
409
409
|
* long input across two visible rows).
|
|
410
410
|
*
|
|
411
|
-
* Exposed as a method so
|
|
411
|
+
* Exposed as a method so StuckInputSentinel and tests can reuse it.
|
|
412
412
|
*/
|
|
413
|
-
|
|
413
|
+
isMarkerStuckAtPrompt(pane: string, marker: string): boolean;
|
|
414
414
|
/**
|
|
415
415
|
* Fire one recovery action for a stuck input. Escalates the action by
|
|
416
416
|
* attempt index — early attempts use plain Enter, later attempts use
|
|
417
417
|
* C-m (literal carriage return) or Enter+sleep+Enter to defeat tighter
|
|
418
|
-
* race windows. Bounded; called from verifyInjection's polling loop
|
|
418
|
+
* race windows. Bounded; called from verifyInjection's polling loop and
|
|
419
|
+
* from the persistent StuckInputSentinel after a server restart.
|
|
419
420
|
*/
|
|
420
|
-
|
|
421
|
+
fireStuckInputRecovery(tmuxSession: string, attempt: number): void;
|
|
421
422
|
/**
|
|
422
423
|
* Wait for Claude to be ready in a tmux session by polling output.
|
|
423
424
|
* Looks for Claude Code's prompt character (❯) which appears when ready for input.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1817,7 +1817,7 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
1817
1817
|
* line as `❯` or on the immediately-following line (Claude Code wraps
|
|
1818
1818
|
* long input across two visible rows).
|
|
1819
1819
|
*
|
|
1820
|
-
* Exposed as a method so
|
|
1820
|
+
* Exposed as a method so StuckInputSentinel and tests can reuse it.
|
|
1821
1821
|
*/
|
|
1822
1822
|
isMarkerStuckAtPrompt(pane, marker) {
|
|
1823
1823
|
if (!marker || marker.length < 8)
|
|
@@ -1836,7 +1836,8 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
1836
1836
|
* Fire one recovery action for a stuck input. Escalates the action by
|
|
1837
1837
|
* attempt index — early attempts use plain Enter, later attempts use
|
|
1838
1838
|
* C-m (literal carriage return) or Enter+sleep+Enter to defeat tighter
|
|
1839
|
-
* race windows. Bounded; called from verifyInjection's polling loop
|
|
1839
|
+
* race windows. Bounded; called from verifyInjection's polling loop and
|
|
1840
|
+
* from the persistent StuckInputSentinel after a server restart.
|
|
1840
1841
|
*/
|
|
1841
1842
|
fireStuckInputRecovery(tmuxSession, attempt) {
|
|
1842
1843
|
const target = `=${tmuxSession}:`;
|