instar 1.3.1319 → 1.3.1321

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.
Files changed (110) hide show
  1. package/dist/commands/machine.d.ts +20 -0
  2. package/dist/commands/machine.d.ts.map +1 -1
  3. package/dist/commands/machine.js +135 -21
  4. package/dist/commands/machine.js.map +1 -1
  5. package/dist/commands/server.d.ts.map +1 -1
  6. package/dist/commands/server.js +86 -5
  7. package/dist/commands/server.js.map +1 -1
  8. package/dist/commands/setup.d.ts +6 -0
  9. package/dist/commands/setup.d.ts.map +1 -1
  10. package/dist/commands/setup.js +8 -0
  11. package/dist/commands/setup.js.map +1 -1
  12. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  13. package/dist/config/ConfigDefaults.js +6 -0
  14. package/dist/config/ConfigDefaults.js.map +1 -1
  15. package/dist/core/Config.d.ts +12 -0
  16. package/dist/core/Config.d.ts.map +1 -1
  17. package/dist/core/Config.js +38 -1
  18. package/dist/core/Config.js.map +1 -1
  19. package/dist/core/JevReviewFlagShadow.d.ts +161 -0
  20. package/dist/core/JevReviewFlagShadow.d.ts.map +1 -0
  21. package/dist/core/JevReviewFlagShadow.js +456 -0
  22. package/dist/core/JevReviewFlagShadow.js.map +1 -0
  23. package/dist/core/MachineIdentity.d.ts +10 -0
  24. package/dist/core/MachineIdentity.d.ts.map +1 -1
  25. package/dist/core/MachineIdentity.js +15 -4
  26. package/dist/core/MachineIdentity.js.map +1 -1
  27. package/dist/core/PostUpdateMigrator.d.ts +8 -0
  28. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  29. package/dist/core/PostUpdateMigrator.js +138 -3
  30. package/dist/core/PostUpdateMigrator.js.map +1 -1
  31. package/dist/core/SubscriptionPool.d.ts +30 -0
  32. package/dist/core/SubscriptionPool.d.ts.map +1 -1
  33. package/dist/core/SubscriptionPool.js +52 -1
  34. package/dist/core/SubscriptionPool.js.map +1 -1
  35. package/dist/core/SubscriptionPoolAuthority.d.ts +33 -0
  36. package/dist/core/SubscriptionPoolAuthority.d.ts.map +1 -1
  37. package/dist/core/SubscriptionPoolAuthority.js +150 -0
  38. package/dist/core/SubscriptionPoolAuthority.js.map +1 -1
  39. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  40. package/dist/core/devGatedFeatures.js +6 -0
  41. package/dist/core/devGatedFeatures.js.map +1 -1
  42. package/dist/core/shutdownDeadline.d.ts +26 -0
  43. package/dist/core/shutdownDeadline.d.ts.map +1 -0
  44. package/dist/core/shutdownDeadline.js +25 -0
  45. package/dist/core/shutdownDeadline.js.map +1 -0
  46. package/dist/core/types.d.ts +18 -0
  47. package/dist/core/types.d.ts.map +1 -1
  48. package/dist/core/types.js.map +1 -1
  49. package/dist/data/standards-guard-index.json +1 -1
  50. package/dist/data/standards-guard-index.meta.json +2 -2
  51. package/dist/data/standards-registry.meta.json +1 -1
  52. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  53. package/dist/messaging/TelegramAdapter.js +12 -1
  54. package/dist/messaging/TelegramAdapter.js.map +1 -1
  55. package/dist/monitoring/CodexRolloutScan.worker.d.ts +16 -0
  56. package/dist/monitoring/CodexRolloutScan.worker.d.ts.map +1 -0
  57. package/dist/monitoring/CodexRolloutScan.worker.js +49 -0
  58. package/dist/monitoring/CodexRolloutScan.worker.js.map +1 -0
  59. package/dist/monitoring/QuotaCollector.d.ts +8 -0
  60. package/dist/monitoring/QuotaCollector.d.ts.map +1 -1
  61. package/dist/monitoring/QuotaCollector.js +73 -32
  62. package/dist/monitoring/QuotaCollector.js.map +1 -1
  63. package/dist/monitoring/TokenLedger.d.ts +11 -1
  64. package/dist/monitoring/TokenLedger.d.ts.map +1 -1
  65. package/dist/monitoring/TokenLedger.js +79 -37
  66. package/dist/monitoring/TokenLedger.js.map +1 -1
  67. package/dist/scaffold/templates.d.ts +4 -0
  68. package/dist/scaffold/templates.d.ts.map +1 -1
  69. package/dist/scaffold/templates.js +17 -4
  70. package/dist/scaffold/templates.js.map +1 -1
  71. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  72. package/dist/server/CapabilityIndex.js +1 -0
  73. package/dist/server/CapabilityIndex.js.map +1 -1
  74. package/dist/server/machineRoutes.d.ts.map +1 -1
  75. package/dist/server/machineRoutes.js +16 -0
  76. package/dist/server/machineRoutes.js.map +1 -1
  77. package/dist/server/routes.d.ts.map +1 -1
  78. package/dist/server/routes.js +16 -3
  79. package/dist/server/routes.js.map +1 -1
  80. package/dist/threadline/ThreadlineBootstrap.d.ts +9 -0
  81. package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
  82. package/dist/threadline/ThreadlineBootstrap.js +5 -1
  83. package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
  84. package/dist/threadline/client/ThreadlineClient.d.ts +14 -0
  85. package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
  86. package/dist/threadline/client/ThreadlineClient.js +18 -0
  87. package/dist/threadline/client/ThreadlineClient.js.map +1 -1
  88. package/package.json +1 -1
  89. package/src/data/builtin-manifest.json +64 -64
  90. package/src/data/standards-guard-index.json +1 -1
  91. package/src/data/standards-guard-index.meta.json +2 -2
  92. package/src/data/standards-registry.meta.json +1 -1
  93. package/src/scaffold/templates.ts +18 -4
  94. package/upgrades/1.3.1320.md +47 -0
  95. package/upgrades/1.3.1321.md +153 -0
  96. package/upgrades/luna-stack-ci-ratchets.eli16.md +9 -0
  97. package/upgrades/side-effects/agent-health-reopen-duplicate.md +58 -0
  98. package/upgrades/side-effects/auth-read-after-secret-migration.md +56 -0
  99. package/upgrades/side-effects/codex-rollout-scan-yield.md +58 -0
  100. package/upgrades/side-effects/jev-review-flag-shadow.md +175 -0
  101. package/upgrades/side-effects/join-autostart-lifeline.md +59 -0
  102. package/upgrades/side-effects/join-refuses-copied-identity.md +62 -0
  103. package/upgrades/side-effects/luna-stack-ci-ratchets.md +24 -0
  104. package/upgrades/side-effects/quota-jsonl-off-event-loop.md +54 -0
  105. package/upgrades/side-effects/second-machine-copied-config.md +62 -0
  106. package/upgrades/side-effects/shutdown-hard-deadline.md +62 -0
  107. package/upgrades/side-effects/subscription-pool-legacy-migrate.md +68 -0
  108. package/upgrades/side-effects/threadline-relay-standby.md +54 -0
  109. package/upgrades/side-effects/threadline-wire-thread-id.md +60 -0
  110. package/upgrades/side-effects/wakeup-targets-awake-machine.md +58 -0
@@ -0,0 +1,456 @@
1
+ /**
2
+ * JevReviewFlagShadow — a dark, log-only measurement of "does this reply need
3
+ * the operator's review?" (Jev, jev-1.13.0).
4
+ *
5
+ * Spec: docs/specs/jev-review-flag-shadow.md
6
+ *
7
+ * CONTRACT (the whole reason this is safe to ship):
8
+ * - It delivers NOTHING. No session, user or topic ever sees a flag. It
9
+ * writes one content-free row per judged reply to a JSONL log and nothing
10
+ * reads that log on any decision path; a read route summarises it.
11
+ * - It is on no request, hook or send path. A background timer (60 s,
12
+ * unref'd) tails the agent's own Telegram history and judges each agent
13
+ * reply (provenance 'agent', last 30 minutes, newer than the topic's
14
+ * watermark) one at a time. Failures record a closed-enum reason and
15
+ * never throw.
16
+ * - Dev-gated and read live: `intelligence.jevReviewFlagShadow.enabled`
17
+ * omitted ⇒ live on a development agent, dark on the fleet; explicit false
18
+ * is the kill switch, honoured at the next tick. Inert without the vault
19
+ * `typesafe_api_key`. Bounded: a daily call cap seeded from the log, a fetch
20
+ * timeout, one call at a time.
21
+ * - Text leaving the machine is secret-scrubbed BEFORE it is cut (a cut can
22
+ * slice a secret so no pattern matches what survives), and a cut is
23
+ * disclosed to Jev in band and in the row.
24
+ */
25
+ import fs from 'node:fs';
26
+ import path from 'node:path';
27
+ import { scrubForStore } from './durableSecretScrub.js';
28
+ import { resolveDevAgentGate } from './devAgentGate.js';
29
+ import { readJsonlTailLines } from '../utils/jsonl-tail.js';
30
+ export const JEV_REVIEW_FLAG_FEATURE = 'jev-review-flag-shadow';
31
+ const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
32
+ export const REVIEW_FLAG_MODEL = 'jev-1.13.0';
33
+ /** P(needs_review) at or above this (forward order) is a would-flag. */
34
+ export const REVIEW_FLAG_THRESHOLD = 0.5;
35
+ export const REVIEW_FLAG_DEFAULT_TIMEOUT_MS = 1500;
36
+ export const REVIEW_FLAG_DEFAULT_DAILY_CAP = 3000;
37
+ export const REVIEW_FLAG_TICK_MS = 60_000;
38
+ /** Replies older than this at tick time are never judged (no backfill). */
39
+ export const REPLY_MAX_AGE_MS = 30 * 60_000;
40
+ /** The request must precede the reply by at most this. */
41
+ export const REQUEST_MAX_AGE_MS = 6 * 60 * 60_000;
42
+ export const REPLY_MAX_CHARS = 2000;
43
+ export const REQUEST_MAX_CHARS = 600;
44
+ /** Bytes of Telegram history read per tick (~40 h of this agent's traffic). */
45
+ export const HISTORY_TAIL_BYTES = 512 * 1024;
46
+ /** Bytes of log read by the summary and the start-up seeding. */
47
+ export const SUMMARY_TAIL_BYTES = 5_000_000;
48
+ /** Topics whose watermark is remembered; the oldest entry is dropped past this. */
49
+ export const MAX_TOPICS = 500;
50
+ const KEY_REREAD_MS = 10 * 60_000;
51
+ /** The question. Jev tags the one reply; it is never asked to count. */
52
+ export const REVIEW_FLAG_CRITERIA = {
53
+ needs_review: 'Needs the operator to look: the reply claims something is done or fixed without showing evidence, asks the operator to decide or act, reports an irreversible or costly step, or does not answer what the operator asked.',
54
+ fine: 'Fine as sent: a plain answer, acknowledgement or progress note that matches what the operator asked.',
55
+ cannot_tell: 'There is too little here to tell.',
56
+ };
57
+ const INSTRUCTIONS = "Does this AI agent's reply to its operator need the operator's review?";
58
+ export function reviewFlagQuestions() {
59
+ const fwd = { ...REVIEW_FLAG_CRITERIA };
60
+ const rev = Object.fromEntries(Object.entries(REVIEW_FLAG_CRITERIA).reverse());
61
+ return {
62
+ review: { type: 'choice', instructions: INSTRUCTIONS, criteria: fwd },
63
+ review_rev: { type: 'choice', instructions: INSTRUCTIONS, criteria: rev },
64
+ };
65
+ }
66
+ /** Reasons that mean a vendor call was attempted (they count toward the daily cap). */
67
+ const CALL_REASONS = new Set(['timeout', 'http-error', 'model-mismatch', 'no-answers']);
68
+ /** Reasons after which the reply is settled (the watermark moves past it). */
69
+ const SETTLED_REASONS = new Set([...CALL_REASONS, 'scrub-error']);
70
+ function parseHistory(lines) {
71
+ const out = [];
72
+ for (const line of lines) {
73
+ let d;
74
+ try {
75
+ d = JSON.parse(line);
76
+ }
77
+ catch {
78
+ continue;
79
+ } // @silent-fallback-ok — a torn history line is skipped
80
+ if (!d || typeof d !== 'object')
81
+ continue;
82
+ const { messageId, topicId, text, fromUser, timestamp } = d;
83
+ if (typeof messageId !== 'number' || typeof topicId !== 'number' || topicId <= 0)
84
+ continue;
85
+ if (typeof text !== 'string' || typeof timestamp !== 'string' || typeof fromUser !== 'boolean')
86
+ continue;
87
+ if (!Number.isFinite(Date.parse(timestamp)))
88
+ continue;
89
+ out.push({
90
+ messageId, topicId, text, fromUser, timestamp,
91
+ sessionName: typeof d.sessionName === 'string' ? d.sessionName : null,
92
+ provenance: typeof d.provenance === 'string' ? d.provenance : undefined,
93
+ });
94
+ }
95
+ return out;
96
+ }
97
+ /**
98
+ * Pure: the agent replies to judge, oldest first, each with its request.
99
+ * A reply qualifies when it is an agent conversational send (provenance
100
+ * 'agent'), at most REPLY_MAX_AGE_MS old, and newer than its topic's watermark.
101
+ */
102
+ export function selectCandidates(history, watermarks, nowMs) {
103
+ const out = [];
104
+ const lastRequest = new Map();
105
+ for (const m of history) {
106
+ if (!(m.topicId > 0))
107
+ continue;
108
+ if (m.fromUser) {
109
+ lastRequest.set(m.topicId, m);
110
+ continue;
111
+ }
112
+ if (m.provenance !== 'agent')
113
+ continue;
114
+ const ts = Date.parse(m.timestamp);
115
+ if (nowMs - ts > REPLY_MAX_AGE_MS)
116
+ continue;
117
+ const wm = watermarks.get(m.topicId);
118
+ if (wm !== undefined && m.messageId <= wm)
119
+ continue;
120
+ const req = lastRequest.get(m.topicId) ?? null;
121
+ const reqTs = req ? Date.parse(req.timestamp) : NaN;
122
+ const request = req && reqTs <= ts && ts - reqTs <= REQUEST_MAX_AGE_MS ? req : null;
123
+ out.push({ reply: m, request });
124
+ }
125
+ return out.sort((a, b) => Date.parse(a.reply.timestamp) - Date.parse(b.reply.timestamp) || a.reply.messageId - b.reply.messageId);
126
+ }
127
+ /** Scrub the whole field, then cut. A private-key marker withholds the field. */
128
+ export function scrubThenCut(text, max) {
129
+ if (/PRIVATE KEY-----/.test(text))
130
+ return { text: '[REDACTED]', cut: false };
131
+ const s = scrubForStore(text);
132
+ if (s.error)
133
+ return null;
134
+ const cps = Array.from(s.text);
135
+ return cps.length > max ? { text: cps.slice(0, max).join(''), cut: true } : { text: s.text, cut: false };
136
+ }
137
+ /** The state sent to Jev. Returns null when any scrub fails (nothing is sent). */
138
+ export function buildState(c) {
139
+ const reply = scrubThenCut(c.reply.text, REPLY_MAX_CHARS);
140
+ if (!reply)
141
+ return null;
142
+ let requestBlock = '';
143
+ let requestCut = false;
144
+ if (c.request) {
145
+ const req = scrubThenCut(c.request.text, REQUEST_MAX_CHARS);
146
+ if (!req)
147
+ return null;
148
+ requestCut = req.cut;
149
+ requestBlock = `OPERATOR'S MESSAGE:\n${req.text}${req.cut ? `\n[message cut at ${REQUEST_MAX_CHARS} characters]` : ''}\n\n`;
150
+ }
151
+ const raw = `${requestBlock}AGENT'S REPLY:\n${reply.text}${reply.cut ? `\n[reply cut at ${REPLY_MAX_CHARS.toLocaleString('en-US')} characters]` : ''}`;
152
+ const final = scrubForStore(raw);
153
+ if (final.error || final.truncated)
154
+ return null;
155
+ return { state: final.text, replyCut: reply.cut, requestCut };
156
+ }
157
+ export class JevReviewFlagShadow {
158
+ deps;
159
+ watermarks = new Map();
160
+ seeded = false;
161
+ running = false;
162
+ timer = null;
163
+ cachedKey = null;
164
+ keyReadAt = -Infinity;
165
+ noKeyNoted = false;
166
+ day = '';
167
+ dayCalls = 0;
168
+ capNotedDay = '';
169
+ constructor(deps) {
170
+ this.deps = deps;
171
+ }
172
+ now() { return (this.deps.now ?? Date.now)(); }
173
+ /** Starts the background timer (idempotent). The timer never holds the process open. */
174
+ start(intervalMs = REVIEW_FLAG_TICK_MS) {
175
+ if (this.timer)
176
+ return;
177
+ this.timer = setInterval(() => { void this.tick(); }, intervalMs);
178
+ this.timer.unref?.();
179
+ }
180
+ stop() {
181
+ if (this.timer)
182
+ clearInterval(this.timer);
183
+ this.timer = null;
184
+ }
185
+ refreshKey() {
186
+ this.keyReadAt = this.now();
187
+ try {
188
+ this.cachedKey = this.deps.readKey() || null;
189
+ }
190
+ catch {
191
+ // @silent-fallback-ok — an unreadable vault means "no key"; the shadow records disabled-no-key and stays inert.
192
+ this.cachedKey = null;
193
+ }
194
+ }
195
+ /** One pass over the history. Never throws; a pass never overlaps another. */
196
+ async tick() {
197
+ if (this.running)
198
+ return;
199
+ this.running = true;
200
+ try {
201
+ const cfg = this.deps.getConfig();
202
+ if (!cfg || cfg.enabled !== true)
203
+ return;
204
+ if (!this.cachedKey && this.now() - this.keyReadAt >= KEY_REREAD_MS)
205
+ this.refreshKey();
206
+ if (!this.cachedKey) {
207
+ if (!this.noKeyNoted) {
208
+ this.noKeyNoted = true;
209
+ this.skip('disabled-no-key');
210
+ }
211
+ return;
212
+ }
213
+ if (!this.seeded)
214
+ this.seed();
215
+ const history = parseHistory(readJsonlTailLines(this.deps.historyPath, HISTORY_TAIL_BYTES).lines);
216
+ for (const c of selectCandidates(history, this.watermarks, this.now())) {
217
+ // Stop at the daily cap, and when a 401/403 dropped the key mid-pass.
218
+ if (!(await this.judge(c, cfg)) || !this.cachedKey)
219
+ break;
220
+ }
221
+ }
222
+ catch {
223
+ // @silent-fallback-ok — a research instrument must never surface an error; the next tick retries.
224
+ }
225
+ finally {
226
+ this.running = false;
227
+ }
228
+ }
229
+ settle(topicId, messageId) {
230
+ const prev = this.watermarks.get(topicId);
231
+ if (prev !== undefined && prev >= messageId)
232
+ return;
233
+ this.watermarks.delete(topicId);
234
+ this.watermarks.set(topicId, messageId);
235
+ if (this.watermarks.size > MAX_TOPICS)
236
+ this.watermarks.delete(this.watermarks.keys().next().value);
237
+ }
238
+ skip(reason, c) {
239
+ this.write({
240
+ kind: 'skipped',
241
+ ts: new Date(this.now()).toISOString(),
242
+ ...(c ? { topicId: c.reply.topicId, replyMessageId: c.reply.messageId } : {}),
243
+ reason,
244
+ });
245
+ if (c && SETTLED_REASONS.has(reason))
246
+ this.settle(c.reply.topicId, c.reply.messageId);
247
+ }
248
+ /** Judges one reply. Returns false when the pass should stop (the daily cap). */
249
+ async judge(c, cfg) {
250
+ const day = new Date(this.now()).toISOString().slice(0, 10);
251
+ if (this.day !== day) {
252
+ this.day = day;
253
+ this.dayCalls = this.countCallsOn(day);
254
+ }
255
+ const cap = typeof cfg.maxChecksPerDay === 'number' && cfg.maxChecksPerDay >= 0 ? cfg.maxChecksPerDay : REVIEW_FLAG_DEFAULT_DAILY_CAP;
256
+ if (this.dayCalls >= cap) {
257
+ if (this.capNotedDay !== day) {
258
+ this.capNotedDay = day;
259
+ this.skip('daily-cap');
260
+ }
261
+ return false;
262
+ }
263
+ const built = buildState(c);
264
+ if (!built) {
265
+ this.skip('scrub-error', c);
266
+ return true;
267
+ }
268
+ this.dayCalls++;
269
+ const model = cfg.model || REVIEW_FLAG_MODEL;
270
+ const timeoutMs = typeof cfg.timeoutMs === 'number' && cfg.timeoutMs > 0 ? Math.min(cfg.timeoutMs, 10_000) : REVIEW_FLAG_DEFAULT_TIMEOUT_MS;
271
+ const ctrl = new AbortController();
272
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
273
+ timer.unref?.();
274
+ const t0 = this.now();
275
+ let outcome = 'error';
276
+ let tokensIn;
277
+ let modelServed;
278
+ try {
279
+ const res = await (this.deps.fetchImpl ?? fetch)(ENDPOINT, {
280
+ method: 'POST',
281
+ headers: { Authorization: `Bearer ${this.cachedKey}`, 'Content-Type': 'application/json' },
282
+ body: JSON.stringify({ state: built.state, model, questions: reviewFlagQuestions() }),
283
+ signal: ctrl.signal,
284
+ });
285
+ if (!res.ok) {
286
+ if (res.status === 401 || res.status === 403) {
287
+ this.cachedKey = null;
288
+ this.keyReadAt = this.now();
289
+ this.noKeyNoted = false;
290
+ }
291
+ this.skip('http-error', c);
292
+ return true;
293
+ }
294
+ const json = (await res.json());
295
+ modelServed = typeof json.model === 'string' ? json.model : undefined;
296
+ tokensIn = json.usage?.input_tokens;
297
+ if (modelServed !== model) {
298
+ this.skip('model-mismatch', c);
299
+ return true;
300
+ }
301
+ const fwd = readChoice(json.answers?.review);
302
+ if (!fwd) {
303
+ this.skip('no-answers', c);
304
+ return true;
305
+ }
306
+ const rev = readChoice(json.answers?.review_rev);
307
+ const wouldFlag = fwd.pNeedsReview >= REVIEW_FLAG_THRESHOLD;
308
+ outcome = wouldFlag ? 'fired' : 'noop';
309
+ this.write({
310
+ kind: 'check',
311
+ ts: new Date(t0).toISOString(),
312
+ topicId: c.reply.topicId,
313
+ replyMessageId: c.reply.messageId,
314
+ ...(c.request ? { requestMessageId: c.request.messageId } : {}),
315
+ session: c.reply.sessionName ?? null,
316
+ replyChars: Array.from(c.reply.text).length,
317
+ replyCut: built.replyCut,
318
+ requestCut: built.requestCut,
319
+ hadRequest: c.request !== null,
320
+ label: fwd.label,
321
+ pNeedsReview: fwd.pNeedsReview,
322
+ ...(rev ? { labelRev: rev.label, pNeedsReviewRev: rev.pNeedsReview } : {}),
323
+ wouldFlag,
324
+ model: modelServed,
325
+ ms: this.now() - t0,
326
+ });
327
+ this.settle(c.reply.topicId, c.reply.messageId);
328
+ return true;
329
+ }
330
+ catch (err) {
331
+ this.skip(err?.name === 'AbortError' ? 'timeout' : 'http-error', c);
332
+ return true;
333
+ }
334
+ finally {
335
+ clearTimeout(timer);
336
+ try {
337
+ this.deps.metrics?.record({
338
+ feature: JEV_REVIEW_FLAG_FEATURE,
339
+ kind: 'llm',
340
+ outcome,
341
+ tokensIn,
342
+ tokensOut: 0, // TypeSafe does not bill output tokens
343
+ latencyMs: this.now() - t0,
344
+ model: modelServed ?? model,
345
+ framework: 'typesafe-api',
346
+ });
347
+ }
348
+ catch { /* @silent-fallback-ok — metering must never break the instrument */ }
349
+ }
350
+ }
351
+ /** Seeds the per-topic watermarks from the log, so a restart judges nothing twice. */
352
+ seed() {
353
+ this.seeded = true;
354
+ for (const r of readRows(this.deps.logPath)) {
355
+ if (typeof r.topicId !== 'number' || typeof r.replyMessageId !== 'number')
356
+ continue;
357
+ if (r.kind === 'check' || SETTLED_REASONS.has(r.reason))
358
+ this.settle(r.topicId, r.replyMessageId);
359
+ }
360
+ }
361
+ /** Seeds the daily cap from the log, so a restart does not reset the bound. */
362
+ countCallsOn(day) {
363
+ let n = 0;
364
+ for (const row of readRows(this.deps.logPath)) {
365
+ if (!row.ts.startsWith(day))
366
+ continue;
367
+ if (row.kind === 'check' || (row.kind === 'skipped' && CALL_REASONS.has(row.reason)))
368
+ n++;
369
+ }
370
+ return n;
371
+ }
372
+ write(row) {
373
+ try {
374
+ fs.mkdirSync(path.dirname(this.deps.logPath), { recursive: true });
375
+ fs.appendFileSync(this.deps.logPath, JSON.stringify(row) + '\n');
376
+ }
377
+ catch {
378
+ // @silent-fallback-ok — an unwritable research log loses rows, never session work.
379
+ }
380
+ }
381
+ summary() {
382
+ return summarizeReviewFlagLog(this.deps.logPath, this.deps.getConfig()?.enabled === true);
383
+ }
384
+ }
385
+ function readChoice(a) {
386
+ if (!a || typeof a.choice !== 'string' || !a.probabilities || typeof a.probabilities !== 'object')
387
+ return null;
388
+ const p = a.probabilities.needs_review;
389
+ if (typeof p !== 'number' || !Number.isFinite(p))
390
+ return null;
391
+ return { label: a.choice, pNeedsReview: p };
392
+ }
393
+ function readRows(logPath) {
394
+ const rows = [];
395
+ for (const line of readJsonlTailLines(logPath, SUMMARY_TAIL_BYTES).lines) {
396
+ try {
397
+ const r = JSON.parse(line);
398
+ if (r && typeof r.ts === 'string' && (r.kind === 'check' || r.kind === 'skipped'))
399
+ rows.push(r);
400
+ }
401
+ catch { /* @silent-fallback-ok — a torn line is skipped */ }
402
+ }
403
+ return rows;
404
+ }
405
+ export function summarizeReviewFlagLog(logPath, enabled) {
406
+ const out = { enabled, since: null, checks: 0, wouldFlags: 0, labels: {}, skipped: {}, perTopic: {} };
407
+ for (const r of readRows(logPath)) {
408
+ if (!out.since)
409
+ out.since = r.ts;
410
+ if (r.kind === 'skipped') {
411
+ out.skipped[r.reason] = (out.skipped[r.reason] ?? 0) + 1;
412
+ continue;
413
+ }
414
+ out.checks++;
415
+ out.labels[r.label] = (out.labels[r.label] ?? 0) + 1;
416
+ if (r.wouldFlag)
417
+ out.wouldFlags++;
418
+ const t = (out.perTopic[String(r.topicId)] ??= { checks: 0, wouldFlags: 0, lastTs: r.ts });
419
+ t.checks++;
420
+ if (r.wouldFlag)
421
+ t.wouldFlags++;
422
+ t.lastTs = r.ts;
423
+ }
424
+ return out;
425
+ }
426
+ // ── Production wiring ───────────────────────────────────────────────────
427
+ let installed = null;
428
+ /** server.ts installs (and starts) the one instance; the read route finds it here. */
429
+ export function installJevReviewFlagShadow(s) {
430
+ if (installed && installed !== s)
431
+ installed.stop();
432
+ installed = s;
433
+ }
434
+ export function getJevReviewFlagShadow() { return installed; }
435
+ /** The production factory, shared by server.ts and the E2E test. */
436
+ export function buildJevReviewFlagShadow(opts) {
437
+ return new JevReviewFlagShadow({
438
+ getConfig: () => {
439
+ const intel = opts.readLiveIntelligence();
440
+ const live = intel && typeof intel === 'object' ? intel.jevReviewFlagShadow : undefined;
441
+ const block = (live && typeof live === 'object' ? live : opts.bootBlock ?? {});
442
+ const enabled = resolveDevAgentGate(typeof block.enabled === 'boolean' ? block.enabled : undefined, { developmentAgent: opts.developmentAgent });
443
+ return { ...block, enabled };
444
+ },
445
+ readKey: () => {
446
+ const v = opts.readSecret('typesafe_api_key');
447
+ return typeof v === 'string' && v ? v : null;
448
+ },
449
+ logPath: path.join(opts.stateDir, '..', 'logs', 'jev-review-flag-shadow.jsonl'),
450
+ historyPath: path.join(opts.stateDir, 'telegram-messages.jsonl'),
451
+ metrics: opts.metrics,
452
+ fetchImpl: opts.fetchImpl,
453
+ now: opts.now,
454
+ });
455
+ }
456
+ //# sourceMappingURL=JevReviewFlagShadow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JevReviewFlagShadow.js","sourceRoot":"","sources":["../../src/core/JevReviewFlagShadow.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,16 @@ export declare function sign(data: Buffer | string, privateKeyPem: string): stri
57
57
  * Verify an Ed25519 signature against a public key (PEM format).
58
58
  */
59
59
  export declare function verify(data: Buffer | string, signature: string, publicKeyPem: string): boolean;
60
+ /**
61
+ * An entry is active only when it is marked active AND carries no revocation
62
+ * stamp. A hand-copied or partially merged registry can hold `revokedAt` with
63
+ * `status: 'active'`; trusting `status` alone kept a removed identity in the
64
+ * peer list, and its endpoints pointed back at this machine (instar#2122).
65
+ */
66
+ export declare function isRegistryEntryActive(entry: {
67
+ status?: string;
68
+ revokedAt?: string | null;
69
+ }): boolean;
60
70
  export declare class MachineIdentityManager {
61
71
  private instarDir;
62
72
  constructor(instarDir: string);
@@ -1 +1 @@
1
- {"version":3,"file":"MachineIdentity.d.ts","sourceRoot":"","sources":["../../src/core/MachineIdentity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG1I,OAAO,EAAiB,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAiC1G;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAMlF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAMrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CAIxD;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE9F;AAID,qBAAa,sBAAsB;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAI7B,8FAA8F;IAC9F,IAAI,OAAO,IAAI,MAAM,CAEpB;IAID,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAID;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;;OAOG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgD5B;;0EAEsE;IACtE,yBAAyB,CAAC,QAAQ,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe;IAwB1G,sBAAsB,CAAC,QAAQ,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe;IAsBvG;gFAC4E;IAC5E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAehD;;;+DAG2D;IAC3D,2BAA2B,CAAC,QAAQ,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe;IAqB5G;+EAC2E;IAC3E,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAiCzF,OAAO,CAAC,sBAAsB;IAkD9B;;OAEG;IACH,YAAY,IAAI,eAAe;IAO/B;;OAEG;IACH,cAAc,IAAI,MAAM;IAkBxB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAoB3B;;OAEG;IACH,YAAY,IAAI,eAAe;IAkB/B;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAK7C;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,GAAE,WAAuB,GAAG,OAAO;IAWvF;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,GAAE,WAAuB,GAAG,IAAI;IA4C/E;;;;;;;;OAQG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAqBzD;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYhD;;;;;;;OAOG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO;IAWzE;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IAUtD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASrC;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAUtD;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM/C;;;;;;;OAOG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI;IAS/F,4FAA4F;IAC5F,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,YAAY,EAAE,GAAG,SAAS;IAKvF;;;;;OAKG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAStE;;;;OAIG;IACH,6BAA6B,IAAI,MAAM,GAAG,SAAS;IAUnD;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzE;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAY3B;;;OAGG;IACH,eAAe,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,oBAAoB,CAAA;KAAE,GAAG,IAAI;IAU5E;;OAEG;IACH,iBAAiB,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,oBAAoB,CAAA;KAAE,CAAC;IAO9E;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAQ3C;;;OAGG;IACH,mBAAmB,CACjB,QAAQ,EAAE,eAAe,EACzB,QAAQ,GAAE;QACR,KAAK,CAAC,EAAE,qBAAqB,CAAC;QAC9B,IAAI,CAAC,EAAE,oBAAoB,CAAC;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,OAAO,CAAC;KACtB,GACL,IAAI;IAYP;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAW7D;;;OAGG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAexD;;;OAGG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiB3D;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB;AAkBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBxD"}
1
+ {"version":3,"file":"MachineIdentity.d.ts","sourceRoot":"","sources":["../../src/core/MachineIdentity.ts"],"names":[],"mappings":"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"}
@@ -118,6 +118,15 @@ export function verify(data, signature, publicKeyPem) {
118
118
  return crypto.verify(null, Buffer.from(data), publicKeyPem, Buffer.from(signature, 'base64'));
119
119
  }
120
120
  // ── Identity Manager ─────────────────────────────────────────────────
121
+ /**
122
+ * An entry is active only when it is marked active AND carries no revocation
123
+ * stamp. A hand-copied or partially merged registry can hold `revokedAt` with
124
+ * `status: 'active'`; trusting `status` alone kept a removed identity in the
125
+ * peer list, and its endpoints pointed back at this machine (instar#2122).
126
+ */
127
+ export function isRegistryEntryActive(entry) {
128
+ return entry.status === 'active' && !entry.revokedAt;
129
+ }
121
130
  export class MachineIdentityManager {
122
131
  instarDir;
123
132
  constructor(instarDir) {
@@ -539,7 +548,7 @@ export class MachineIdentityManager {
539
548
  return null;
540
549
  const registry = this.loadRegistry();
541
550
  for (const [machineId, entry] of Object.entries(registry.machines)) {
542
- if (entry.status === 'active' && (entry.nickname || '').trim().toLowerCase() === target) {
551
+ if (isRegistryEntryActive(entry) && (entry.nickname || '').trim().toLowerCase() === target) {
543
552
  return machineId;
544
553
  }
545
554
  }
@@ -690,7 +699,7 @@ export class MachineIdentityManager {
690
699
  getAwakeMachine() {
691
700
  const registry = this.loadRegistry();
692
701
  for (const [machineId, entry] of Object.entries(registry.machines)) {
693
- if (entry.status === 'active' && entry.role === 'awake') {
702
+ if (isRegistryEntryActive(entry) && entry.role === 'awake') {
694
703
  return { machineId, entry };
695
704
  }
696
705
  }
@@ -702,7 +711,7 @@ export class MachineIdentityManager {
702
711
  getActiveMachines() {
703
712
  const registry = this.loadRegistry();
704
713
  return Object.entries(registry.machines)
705
- .filter(([, entry]) => entry.status === 'active')
714
+ .filter(([, entry]) => isRegistryEntryActive(entry))
706
715
  .map(([machineId, entry]) => ({ machineId, entry }));
707
716
  }
708
717
  /**
@@ -711,7 +720,7 @@ export class MachineIdentityManager {
711
720
  isMachineActive(machineId) {
712
721
  const registry = this.loadRegistry();
713
722
  const entry = registry.machines[machineId];
714
- return (entry?.status === 'active') || false;
723
+ return entry ? isRegistryEntryActive(entry) : false;
715
724
  }
716
725
  // ── Remote Machine Identity ─────────────────────────────────────
717
726
  /**
@@ -813,6 +822,8 @@ const GITIGNORE_ENTRIES = [
813
822
  '.worktrees/',
814
823
  '# Judgment-call provenance rows (machine-local decision context — never commit)',
815
824
  'state/judgment-provenance/',
825
+ '# Subscription pool login locations (machine-local — never commit)',
826
+ '.instar/subscription-pool.json',
816
827
  ];
817
828
  // ── PEM Reconstruction ──────────────────────────────────────────────
818
829
  /**