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.
- package/dist/commands/machine.d.ts +20 -0
- package/dist/commands/machine.d.ts.map +1 -1
- package/dist/commands/machine.js +135 -21
- package/dist/commands/machine.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +86 -5
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +8 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +6 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/Config.d.ts +12 -0
- package/dist/core/Config.d.ts.map +1 -1
- package/dist/core/Config.js +38 -1
- package/dist/core/Config.js.map +1 -1
- package/dist/core/JevReviewFlagShadow.d.ts +161 -0
- package/dist/core/JevReviewFlagShadow.d.ts.map +1 -0
- package/dist/core/JevReviewFlagShadow.js +456 -0
- package/dist/core/JevReviewFlagShadow.js.map +1 -0
- package/dist/core/MachineIdentity.d.ts +10 -0
- package/dist/core/MachineIdentity.d.ts.map +1 -1
- package/dist/core/MachineIdentity.js +15 -4
- package/dist/core/MachineIdentity.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +8 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +138 -3
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SubscriptionPool.d.ts +30 -0
- package/dist/core/SubscriptionPool.d.ts.map +1 -1
- package/dist/core/SubscriptionPool.js +52 -1
- package/dist/core/SubscriptionPool.js.map +1 -1
- package/dist/core/SubscriptionPoolAuthority.d.ts +33 -0
- package/dist/core/SubscriptionPoolAuthority.d.ts.map +1 -1
- package/dist/core/SubscriptionPoolAuthority.js +150 -0
- package/dist/core/SubscriptionPoolAuthority.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +6 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/shutdownDeadline.d.ts +26 -0
- package/dist/core/shutdownDeadline.d.ts.map +1 -0
- package/dist/core/shutdownDeadline.js +25 -0
- package/dist/core/shutdownDeadline.js.map +1 -0
- package/dist/core/types.d.ts +18 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +12 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/monitoring/CodexRolloutScan.worker.d.ts +16 -0
- package/dist/monitoring/CodexRolloutScan.worker.d.ts.map +1 -0
- package/dist/monitoring/CodexRolloutScan.worker.js +49 -0
- package/dist/monitoring/CodexRolloutScan.worker.js.map +1 -0
- package/dist/monitoring/QuotaCollector.d.ts +8 -0
- package/dist/monitoring/QuotaCollector.d.ts.map +1 -1
- package/dist/monitoring/QuotaCollector.js +73 -32
- package/dist/monitoring/QuotaCollector.js.map +1 -1
- package/dist/monitoring/TokenLedger.d.ts +11 -1
- package/dist/monitoring/TokenLedger.d.ts.map +1 -1
- package/dist/monitoring/TokenLedger.js +79 -37
- package/dist/monitoring/TokenLedger.js.map +1 -1
- package/dist/scaffold/templates.d.ts +4 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +17 -4
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/machineRoutes.d.ts.map +1 -1
- package/dist/server/machineRoutes.js +16 -0
- package/dist/server/machineRoutes.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +16 -3
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.d.ts +9 -0
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +5 -1
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/client/ThreadlineClient.d.ts +14 -0
- package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
- package/dist/threadline/client/ThreadlineClient.js +18 -0
- package/dist/threadline/client/ThreadlineClient.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/scaffold/templates.ts +18 -4
- package/upgrades/1.3.1320.md +47 -0
- package/upgrades/1.3.1321.md +153 -0
- package/upgrades/luna-stack-ci-ratchets.eli16.md +9 -0
- package/upgrades/side-effects/agent-health-reopen-duplicate.md +58 -0
- package/upgrades/side-effects/auth-read-after-secret-migration.md +56 -0
- package/upgrades/side-effects/codex-rollout-scan-yield.md +58 -0
- package/upgrades/side-effects/jev-review-flag-shadow.md +175 -0
- package/upgrades/side-effects/join-autostart-lifeline.md +59 -0
- package/upgrades/side-effects/join-refuses-copied-identity.md +62 -0
- package/upgrades/side-effects/luna-stack-ci-ratchets.md +24 -0
- package/upgrades/side-effects/quota-jsonl-off-event-loop.md +54 -0
- package/upgrades/side-effects/second-machine-copied-config.md +62 -0
- package/upgrades/side-effects/shutdown-hard-deadline.md +62 -0
- package/upgrades/side-effects/subscription-pool-legacy-migrate.md +68 -0
- package/upgrades/side-effects/threadline-relay-standby.md +54 -0
- package/upgrades/side-effects/threadline-wire-thread-id.md +60 -0
- 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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
/**
|