@integrity-labs/agt-cli 0.28.847 → 0.28.849

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 (24) hide show
  1. package/dist/bin/agt.js +5 -5
  2. package/dist/{chunk-3THOQFC6.js → chunk-JFCISESR.js} +4 -4
  3. package/dist/{chunk-MFU2FD4N.js → chunk-WUXQVP7A.js} +17 -5
  4. package/dist/{chunk-MFU2FD4N.js.map → chunk-WUXQVP7A.js.map} +1 -1
  5. package/dist/{chunk-PMQNTU7W.js → chunk-XCAI3GSF.js} +2 -2
  6. package/dist/{claude-pair-runtime-BQ5JUW5F.js → claude-pair-runtime-CJXQTVSC.js} +2 -2
  7. package/dist/lib/manager-worker.js +197 -232
  8. package/dist/lib/manager-worker.js.map +1 -1
  9. package/dist/mcp/computer-use-proxy.js +317 -4
  10. package/dist/mcp/direct-chat-channel.js +16 -4
  11. package/dist/mcp/index.js +16 -4
  12. package/dist/mcp/origami.js +16 -4
  13. package/dist/mcp/slack-channel.js +16 -4
  14. package/dist/mcp/telegram-channel.js +16 -4
  15. package/dist/{persistent-session-JKES3FMW.js → persistent-session-YGK7YHPR.js} +3 -3
  16. package/dist/{responsiveness-probe-P7EAWN6J.js → responsiveness-probe-NGWO3JK3.js} +3 -3
  17. package/dist/{session-auth-dead-IFU2XLHO.js → session-auth-dead-4UZR5655.js} +2 -2
  18. package/package.json +1 -1
  19. /package/dist/{chunk-3THOQFC6.js.map → chunk-JFCISESR.js.map} +0 -0
  20. /package/dist/{chunk-PMQNTU7W.js.map → chunk-XCAI3GSF.js.map} +0 -0
  21. /package/dist/{claude-pair-runtime-BQ5JUW5F.js.map → claude-pair-runtime-CJXQTVSC.js.map} +0 -0
  22. /package/dist/{persistent-session-JKES3FMW.js.map → persistent-session-YGK7YHPR.js.map} +0 -0
  23. /package/dist/{responsiveness-probe-P7EAWN6J.js.map → responsiveness-probe-NGWO3JK3.js.map} +0 -0
  24. /package/dist/{session-auth-dead-IFU2XLHO.js.map → session-auth-dead-4UZR5655.js.map} +0 -0
@@ -7,6 +7,303 @@ import { createInterface } from "readline";
7
7
  import { spawn } from "child_process";
8
8
  import { fileURLToPath } from "url";
9
9
  import { resolve as resolvePath } from "path";
10
+
11
+ // src/computer-use-gate.ts
12
+ import { createHash } from "crypto";
13
+ var MINIMUM_TOOL_FLOOR = "write_high_risk";
14
+ var TOOL_FLOORS = Object.freeze({
15
+ // Reads - of the operator's screen and window state.
16
+ get_app_state: "write_high_risk",
17
+ // State-changing: focus, input, navigation.
18
+ open_app: "write_high_risk",
19
+ scroll: "write_high_risk",
20
+ click: "write_destructive",
21
+ type_text: "write_destructive",
22
+ press_key: "write_destructive",
23
+ set_value: "write_destructive",
24
+ perform_secondary_action: "write_destructive"
25
+ });
26
+ var UNGATED_TOOLS = Object.freeze(["list_apps"]);
27
+ var APP_ARG_KEYS = ["app_name", "app", "application", "bundle_id"];
28
+ var TEXT_PREVIEW_LIMIT = 200;
29
+ var SESSION_PATH = "/host/computer-use/session";
30
+ var ACTION_PATH = "/host/computer-use/action";
31
+ function refuse(text) {
32
+ return { content: [{ type: "text", text }], isError: true };
33
+ }
34
+ function previewText(value, limit = TEXT_PREVIEW_LIMIT) {
35
+ if (typeof value !== "string" || value.length === 0) return void 0;
36
+ if (value.length <= limit) return value;
37
+ return `${value.slice(0, limit)}... (${value.length - limit} more characters)`;
38
+ }
39
+ function extractAppIdentifiers(args) {
40
+ if (typeof args !== "object" || args === null) return [];
41
+ const rec = args;
42
+ const found = [];
43
+ for (const key of APP_ARG_KEYS) {
44
+ const v = rec[key];
45
+ if (typeof v !== "string" || !v.trim()) continue;
46
+ const named = v.trim();
47
+ if (!found.some((f) => sameApp(f, named))) found.push(named);
48
+ }
49
+ return found;
50
+ }
51
+ function sameApp(a, b) {
52
+ if (!a || !b) return false;
53
+ return a.trim().toLowerCase() === b.trim().toLowerCase();
54
+ }
55
+ function actionIdempotencyKey(sessionRequestId, tool, args) {
56
+ const canonical = `${sessionRequestId} ${tool} ${stableStringify(args)}`;
57
+ const digest = createHash("sha256").update(canonical).digest("hex").slice(0, 32);
58
+ return `cu-${sessionRequestId}-${tool}-${digest}`;
59
+ }
60
+ function stableStringify(value) {
61
+ if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
62
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
63
+ const rec = value;
64
+ const keys = Object.keys(rec).sort();
65
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(rec[k])}`).join(",")}}`;
66
+ }
67
+ function createApprovalGate(deps) {
68
+ const logErr2 = deps.logErr ?? ((msg) => process.stderr.write(`[computer-use-gate] ${msg}
69
+ `));
70
+ return async (toolName, args, ctx) => {
71
+ if (UNGATED_TOOLS.includes(toolName)) return null;
72
+ const floor = TOOL_FLOORS[toolName];
73
+ if (!floor) {
74
+ return refuse(
75
+ `computer-use: '${toolName || "(unnamed)"}' has no declared approval floor, so it is refused. Every tool this proxy forwards must be classified at '${MINIMUM_TOOL_FLOOR}' or above (packages/mcp/src/computer-use-gate.ts TOOL_FLOORS). Tell your operator which tool you needed.`
76
+ );
77
+ }
78
+ const appIds = extractAppIdentifiers(args);
79
+ if (appIds.length > 1) {
80
+ return refuse(
81
+ `computer-use: this call names more than one application (${appIds.map((a) => `'${a}'`).join(", ")}), so it was NOT sent to the Mac. A grant covers ONE application, and when the arguments disagree this proxy cannot tell which one the Mac would actually act on - so it refuses rather than guessing. Re-send the call naming the target exactly once.`
82
+ );
83
+ }
84
+ const requestedApp = appIds.length === 1 ? appIds[0] : void 0;
85
+ let grant;
86
+ try {
87
+ grant = await deps.apiGet(
88
+ `${SESSION_PATH}?agent_id=${encodeURIComponent(deps.agentId)}`
89
+ );
90
+ } catch (err) {
91
+ logErr2(`session lookup failed: ${err.message}`);
92
+ return refuse(
93
+ `computer-use: cannot reach the control plane to check your session, so this call was NOT sent to the Mac. This is not a denial and not a Mac problem - approval could not be checked, so nothing ran. Retry shortly.`
94
+ );
95
+ }
96
+ async function requestSession(lead) {
97
+ if (!requestedApp) {
98
+ return refuse(
99
+ `${lead} This call also does not name an application, so a session cannot be requested for it. Call list_apps first, then retry naming the app.`
100
+ );
101
+ }
102
+ try {
103
+ const filed = await deps.apiPost(SESSION_PATH, {
104
+ agent_id: deps.agentId,
105
+ target_app: requestedApp,
106
+ summary: `Drive ${requestedApp} on the operator's Mac (first call: ${toolName})`,
107
+ idempotency_key: `cu-session-${deps.agentId}-${requestedApp.toLowerCase()}`
108
+ });
109
+ return refuse(
110
+ `${lead} A session request for '${requestedApp}' has been filed` + (filed?.request_id ? ` (request ${filed.request_id})` : "") + `. A human will approve or deny it and choose whether you are prompted for each action. Poll with check_approval; once it is active, re-issue this call.`
111
+ );
112
+ } catch (err) {
113
+ logErr2(`session request failed: ${err.message}`);
114
+ return refuse(
115
+ `${lead} The request for a session could not be filed (${err.message}), so nothing is pending either. Tell your operator.`
116
+ );
117
+ }
118
+ }
119
+ switch (grant.state) {
120
+ case "active":
121
+ break;
122
+ case "pending":
123
+ return refuse(
124
+ `computer-use: your session request is still awaiting a human decision` + (grant.request_id ? ` (request ${grant.request_id})` : "") + `. Nothing has been sent to the Mac. Do not re-request - poll with check_approval, or do something else and come back.`
125
+ );
126
+ case "revoked":
127
+ return refuse(
128
+ `computer-use: your session was REVOKED by a human before it expired. Do not request another for the same task without asking them first - a revocation mid-session usually means they wanted you to stop, not to retry.`
129
+ );
130
+ case "denied":
131
+ return refuse(
132
+ `computer-use: a human DENIED your session request` + (grant.denial_reason ? `: ${grant.denial_reason}` : ".") + ` Do not retry the same request. Ask them what they would approve instead.`
133
+ );
134
+ case "expired":
135
+ return requestSession(
136
+ `computer-use: your session has EXPIRED - a human did grant it, and the window simply ran out. Nothing was sent to the Mac.`
137
+ );
138
+ case "none":
139
+ default:
140
+ return requestSession(
141
+ `computer-use: you have no active session, so nothing was sent to the Mac.`
142
+ );
143
+ }
144
+ if (requestedApp !== void 0 && !sameApp(grant.target_app, requestedApp)) {
145
+ return refuse(
146
+ `computer-use: your session is bound to '${grant.target_app ?? "(unknown)"}' and this call targets '${requestedApp ?? "(no app named)"}'. Nothing was sent to the Mac. A grant covers ONE application - if you genuinely need the other one, request a separate session for it and say why.`
147
+ );
148
+ }
149
+ const sessionRequestId = grant.request_id ?? "";
150
+ try {
151
+ const filed = await deps.apiPost(ACTION_PATH, {
152
+ agent_id: deps.agentId,
153
+ session_request_id: sessionRequestId,
154
+ tool: toolName,
155
+ target_app: grant.target_app,
156
+ target_element: previewText(readElement(args), 80),
157
+ text_preview: previewText(readTypedText(args)),
158
+ returns_screenshot: ctx?.includeScreenshot === true,
159
+ floor,
160
+ idempotency_key: actionIdempotencyKey(sessionRequestId, toolName, args),
161
+ summary: describeAction(toolName, grant.target_app, args)
162
+ });
163
+ switch (filed.status) {
164
+ case "auto_approve":
165
+ case "active":
166
+ return null;
167
+ // forward to the Mac
168
+ case "pending":
169
+ return refuse(
170
+ `computer-use: this action needs a human tap first (request ${filed.request_id}). Nothing was sent to the Mac. Poll with check_approval and re-issue this EXACT call once it is approved - re-issuing it re-attaches to the same request rather than filing another.`
171
+ );
172
+ case "denied":
173
+ case "hard_deny":
174
+ return refuse(
175
+ `computer-use: a human DENIED this action` + (filed.denial_reason ? `: ${filed.denial_reason}` : ".") + ` Nothing was sent to the Mac. Do not retry it - pick a different approach or ask them what to do.`
176
+ );
177
+ case "expired":
178
+ return refuse(
179
+ `computer-use: the approval for this action expired before anyone answered (request ${filed.request_id}). Nothing was sent to the Mac. This is not a refusal - re-issue the call to ask again.`
180
+ );
181
+ case "revoked":
182
+ return refuse(
183
+ `computer-use: your session was revoked while this action was awaiting approval. Nothing was sent to the Mac.`
184
+ );
185
+ case "consumed":
186
+ return refuse(
187
+ `computer-use: this exact action was already approved and already performed once, so it was NOT sent again. An approval covers ONE execution - if you genuinely need to repeat it, that is a new request. (If you are retrying because you could not tell whether the first one landed: read the accessibility tree, isError:false is not evidence either way.)`
188
+ );
189
+ default:
190
+ return refuse(
191
+ `computer-use: the control plane returned an approval status this proxy does not recognise ('${String(filed.status)}'), so the call was NOT sent to the Mac. Tell your operator.`
192
+ );
193
+ }
194
+ } catch (err) {
195
+ logErr2(`action filing failed: ${err.message}`);
196
+ return refuse(
197
+ `computer-use: the approval for this action could not be filed (${err.message}), so it was NOT sent to the Mac. This is not a denial. Retry shortly; if it persists, tell your operator.`
198
+ );
199
+ }
200
+ };
201
+ }
202
+ function readElement(args) {
203
+ if (typeof args !== "object" || args === null) return void 0;
204
+ const rec = args;
205
+ for (const key of ["element_index", "element", "role", "title"]) {
206
+ const v = rec[key];
207
+ if (typeof v === "string" && v.trim()) return v;
208
+ if (typeof v === "number") return String(v);
209
+ }
210
+ return void 0;
211
+ }
212
+ function readTypedText(args) {
213
+ if (typeof args !== "object" || args === null) return void 0;
214
+ const rec = args;
215
+ for (const key of ["text", "value", "keys", "key"]) {
216
+ const v = rec[key];
217
+ if (typeof v === "string" && v.length > 0) return v;
218
+ }
219
+ return void 0;
220
+ }
221
+ function describeAction(tool, app, args) {
222
+ const where = app ? ` in ${app}` : "";
223
+ const el = readElement(args);
224
+ const elPart = el !== void 0 ? ` on element ${String(el)}` : "";
225
+ const text = previewText(readTypedText(args), 80);
226
+ const textPart = text ? ` with "${text}"` : "";
227
+ return `${tool}${elPart}${textPart}${where}`;
228
+ }
229
+ function createUnconfiguredGate(missing) {
230
+ return async () => refuse(
231
+ `computer-use: this proxy is not configured to check approvals (missing ${missing.join(", ")}), so it refuses every call rather than forwarding un-approved ones to the Mac. Nothing has been sent. Ask your operator to re-provision this agent.`
232
+ );
233
+ }
234
+ function resolveGate(env, makeClient) {
235
+ const agtHost = env.AGT_HOST?.trim();
236
+ const agtApiKey = env.AGT_API_KEY?.trim();
237
+ const agentId = env.AGT_AGENT_ID?.trim();
238
+ const missing = [];
239
+ if (!agtHost) missing.push("AGT_HOST");
240
+ if (!agtApiKey) missing.push("AGT_API_KEY");
241
+ if (!agentId) missing.push("AGT_AGENT_ID");
242
+ if (missing.length > 0) return { gate: createUnconfiguredGate(missing), missing };
243
+ const client = makeClient({ agtHost, agtApiKey, agentId });
244
+ return {
245
+ gate: createApprovalGate({ agentId, apiGet: client.apiGet, apiPost: client.apiPost }),
246
+ missing: []
247
+ };
248
+ }
249
+
250
+ // src/computer-use-api-client.ts
251
+ var REQUEST_TIMEOUT_MS = 1e4;
252
+ var TOKEN_SKEW_MS = 6e4;
253
+ function createHostApiClient(config) {
254
+ const fetchImpl = config.fetchImpl ?? fetch;
255
+ const now = config.now ?? Date.now;
256
+ const base = config.agtHost.replace(/\/+$/, "");
257
+ let cachedToken = null;
258
+ let cachedTokenExpiresAt = 0;
259
+ async function getToken() {
260
+ if (cachedToken && now() < cachedTokenExpiresAt) return cachedToken;
261
+ const res = await fetchImpl(`${base}/host/exchange`, {
262
+ method: "POST",
263
+ headers: { "Content-Type": "application/json" },
264
+ body: JSON.stringify({ host_key: config.agtApiKey, agent_id: config.agentId }),
265
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
266
+ });
267
+ if (!res.ok) {
268
+ const text = await res.text().catch(() => res.statusText);
269
+ throw new Error(`host key exchange returned ${res.status}: ${text}`);
270
+ }
271
+ const body = await res.json();
272
+ if (!body.token) throw new Error("host key exchange returned no token");
273
+ cachedToken = body.token;
274
+ const lifetimeMs = (body.expires_in ?? 3600) * 1e3;
275
+ cachedTokenExpiresAt = now() + Math.max(0, lifetimeMs - TOKEN_SKEW_MS);
276
+ return cachedToken;
277
+ }
278
+ async function request(path, init, retried = false) {
279
+ const token = await getToken();
280
+ const res = await fetchImpl(`${base}${path}`, {
281
+ ...init,
282
+ headers: { ...init.headers ?? {}, Authorization: `Bearer ${token}` },
283
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
284
+ });
285
+ if (res.status === 401 && !retried) {
286
+ cachedToken = null;
287
+ cachedTokenExpiresAt = 0;
288
+ return request(path, init, true);
289
+ }
290
+ if (!res.ok) {
291
+ const text = await res.text().catch(() => res.statusText);
292
+ throw new Error(`API ${path} returned ${res.status}: ${text}`);
293
+ }
294
+ return await res.json();
295
+ }
296
+ return {
297
+ apiGet: (path) => request(path, { method: "GET" }),
298
+ apiPost: (path, body) => request(path, {
299
+ method: "POST",
300
+ headers: { "Content-Type": "application/json" },
301
+ body: JSON.stringify(body)
302
+ })
303
+ };
304
+ }
305
+
306
+ // src/computer-use-proxy.ts
10
307
  var INCLUDE_SCREENSHOT_PARAM = "include_screenshot";
11
308
  var STRIPPED_IMAGE_STUB = `[screenshot omitted to save tokens \u2014 pass ${INCLUDE_SCREENSHOT_PARAM}: true to receive it. Element indices in the accessibility tree above are usually enough to act.]`;
12
309
  var RELIABILITY_NOTE = `
@@ -108,6 +405,7 @@ function logErr(msg) {
108
405
  var allowAll = async () => null;
109
406
  function createProxy(deps) {
110
407
  const beforeForward = deps.beforeForward ?? allowAll;
408
+ const allowUnrequestedScreenshot = deps.allowUnrequestedScreenshot !== false;
111
409
  const pending = /* @__PURE__ */ new Map();
112
410
  async function handleDownstream(line) {
113
411
  const text = line.trim();
@@ -126,7 +424,7 @@ function createProxy(deps) {
126
424
  const { include, params } = takeIncludeScreenshot(frame.params);
127
425
  const toolName = typeof params?.name === "string" ? params.name : "";
128
426
  const args = params?.arguments;
129
- const short = await beforeForward(toolName, args);
427
+ const short = await beforeForward(toolName, args, { includeScreenshot: include });
130
428
  if (short) {
131
429
  if (!isRequest) {
132
430
  logErr(`short-circuited notification tools/call ${toolName} (no reply sent)`);
@@ -171,8 +469,11 @@ function createProxy(deps) {
171
469
  (b) => typeof b === "object" && b !== null && b.type === "text"
172
470
  );
173
471
  if (treeBlock && !treeHasActionableContent(treeBlock.text)) {
174
- logErr("tree carries no actionable content; keeping screenshot");
175
- return [text];
472
+ if (allowUnrequestedScreenshot) {
473
+ logErr("tree carries no actionable content; keeping screenshot");
474
+ return [text];
475
+ }
476
+ logErr("tree carries no actionable content, but screenshots are gated; stripping");
176
477
  }
177
478
  }
178
479
  const { result, stripped } = stripImages(frame.result);
@@ -249,11 +550,23 @@ async function main(argv = process.argv) {
249
550
  logErr(`failed to spawn upstream: ${err.message}`);
250
551
  process.exit(1);
251
552
  }
553
+ const { gate, missing } = resolveGate(process.env, (c) => createHostApiClient(c));
554
+ if (missing.length > 0) {
555
+ logErr(
556
+ `NOT CONFIGURED for approval checks (missing ${missing.join(", ")}); refusing every call. No computer-use tool will reach the Mac until this agent is re-provisioned.`
557
+ );
558
+ }
252
559
  await wirePump({
253
560
  child,
254
561
  clientIn: process.stdin,
255
562
  clientOut: process.stdout,
256
- proxy: createProxy({ upstream })
563
+ proxy: createProxy({
564
+ upstream,
565
+ beforeForward: gate,
566
+ // With a gate in place an image must never arrive unrequested - see the
567
+ // field's own note on why the accessibility-blind hatch closes here.
568
+ allowUnrequestedScreenshot: false
569
+ })
257
570
  });
258
571
  }
259
572
  var invokedDirectly = (() => {
@@ -37310,10 +37310,22 @@ var FLAG_REGISTRY = [
37310
37310
  // See the description: `shadow` is what prod compiles today, so it is the
37311
37311
  // only default that ships this flag as a no-op.
37312
37312
  defaultValue: "shadow",
37313
- // enforce changes the admission rule on the platform's front door, and the
37314
- // families it starts refusing include mcp-proxy one of the fleet's
37315
- // dominant callers. This is precisely the deliberate, audited flip ADR-0022
37316
- // §4 reserves confirmation for.
37313
+ // enforce changes the admission rule on the platform's front door. This is
37314
+ // precisely the deliberate, audited flip ADR-0022 §4 reserves confirmation
37315
+ // for, and it stays `sensitive` — but NOT for the reason first written here.
37316
+ // That read "the families it starts refusing include mcp-proxy, one of the
37317
+ // fleet's dominant callers", and ENG-9895 measured otherwise: mcp-proxy
37318
+ // verifies its own token on a route carrying no `authMiddleware`, so it is a
37319
+ // dominant caller of a different door and cannot be in the refused set. The
37320
+ // measured population at that door is ZERO over 298,839,353 prod log records
37321
+ // / 14 days, and the impersonation families are absent too — one
37322
+ // structurally (`X-Agent-Impersonation` header, own verifier), one by
37323
+ // measurement (307 requests through that door, zero lines). What keeps this
37324
+ // `sensitive` is therefore NOT an unresolved residue: it is that `enforce`
37325
+ // changes an admission rule on the front door, and that the predicate is
37326
+ // structural, so a FUTURE family 13 is born refusable without an edit here.
37327
+ // That is exactly the deliberate, audited flip ADR-0022 §4 reserves
37328
+ // confirmation for. docs/research/eng-9895-prod-shadow-measurement.md
37317
37329
  sensitive: true
37318
37330
  },
37319
37331
  {
package/dist/mcp/index.js CHANGED
@@ -29580,10 +29580,22 @@ var FLAG_REGISTRY = [
29580
29580
  // See the description: `shadow` is what prod compiles today, so it is the
29581
29581
  // only default that ships this flag as a no-op.
29582
29582
  defaultValue: "shadow",
29583
- // enforce changes the admission rule on the platform's front door, and the
29584
- // families it starts refusing include mcp-proxy one of the fleet's
29585
- // dominant callers. This is precisely the deliberate, audited flip ADR-0022
29586
- // §4 reserves confirmation for.
29583
+ // enforce changes the admission rule on the platform's front door. This is
29584
+ // precisely the deliberate, audited flip ADR-0022 §4 reserves confirmation
29585
+ // for, and it stays `sensitive` — but NOT for the reason first written here.
29586
+ // That read "the families it starts refusing include mcp-proxy, one of the
29587
+ // fleet's dominant callers", and ENG-9895 measured otherwise: mcp-proxy
29588
+ // verifies its own token on a route carrying no `authMiddleware`, so it is a
29589
+ // dominant caller of a different door and cannot be in the refused set. The
29590
+ // measured population at that door is ZERO over 298,839,353 prod log records
29591
+ // / 14 days, and the impersonation families are absent too — one
29592
+ // structurally (`X-Agent-Impersonation` header, own verifier), one by
29593
+ // measurement (307 requests through that door, zero lines). What keeps this
29594
+ // `sensitive` is therefore NOT an unresolved residue: it is that `enforce`
29595
+ // changes an admission rule on the front door, and that the predicate is
29596
+ // structural, so a FUTURE family 13 is born refusable without an edit here.
29597
+ // That is exactly the deliberate, audited flip ADR-0022 §4 reserves
29598
+ // confirmation for. docs/research/eng-9895-prod-shadow-measurement.md
29587
29599
  sensitive: true
29588
29600
  },
29589
29601
  {
@@ -43533,10 +43533,22 @@ var FLAG_REGISTRY = [
43533
43533
  // See the description: `shadow` is what prod compiles today, so it is the
43534
43534
  // only default that ships this flag as a no-op.
43535
43535
  defaultValue: "shadow",
43536
- // enforce changes the admission rule on the platform's front door, and the
43537
- // families it starts refusing include mcp-proxy one of the fleet's
43538
- // dominant callers. This is precisely the deliberate, audited flip ADR-0022
43539
- // §4 reserves confirmation for.
43536
+ // enforce changes the admission rule on the platform's front door. This is
43537
+ // precisely the deliberate, audited flip ADR-0022 §4 reserves confirmation
43538
+ // for, and it stays `sensitive` — but NOT for the reason first written here.
43539
+ // That read "the families it starts refusing include mcp-proxy, one of the
43540
+ // fleet's dominant callers", and ENG-9895 measured otherwise: mcp-proxy
43541
+ // verifies its own token on a route carrying no `authMiddleware`, so it is a
43542
+ // dominant caller of a different door and cannot be in the refused set. The
43543
+ // measured population at that door is ZERO over 298,839,353 prod log records
43544
+ // / 14 days, and the impersonation families are absent too — one
43545
+ // structurally (`X-Agent-Impersonation` header, own verifier), one by
43546
+ // measurement (307 requests through that door, zero lines). What keeps this
43547
+ // `sensitive` is therefore NOT an unresolved residue: it is that `enforce`
43548
+ // changes an admission rule on the front door, and that the predicate is
43549
+ // structural, so a FUTURE family 13 is born refusable without an edit here.
43550
+ // That is exactly the deliberate, audited flip ADR-0022 §4 reserves
43551
+ // confirmation for. docs/research/eng-9895-prod-shadow-measurement.md
43540
43552
  sensitive: true
43541
43553
  },
43542
43554
  {
@@ -38088,10 +38088,22 @@ var FLAG_REGISTRY = [
38088
38088
  // See the description: `shadow` is what prod compiles today, so it is the
38089
38089
  // only default that ships this flag as a no-op.
38090
38090
  defaultValue: "shadow",
38091
- // enforce changes the admission rule on the platform's front door, and the
38092
- // families it starts refusing include mcp-proxy one of the fleet's
38093
- // dominant callers. This is precisely the deliberate, audited flip ADR-0022
38094
- // §4 reserves confirmation for.
38091
+ // enforce changes the admission rule on the platform's front door. This is
38092
+ // precisely the deliberate, audited flip ADR-0022 §4 reserves confirmation
38093
+ // for, and it stays `sensitive` — but NOT for the reason first written here.
38094
+ // That read "the families it starts refusing include mcp-proxy, one of the
38095
+ // fleet's dominant callers", and ENG-9895 measured otherwise: mcp-proxy
38096
+ // verifies its own token on a route carrying no `authMiddleware`, so it is a
38097
+ // dominant caller of a different door and cannot be in the refused set. The
38098
+ // measured population at that door is ZERO over 298,839,353 prod log records
38099
+ // / 14 days, and the impersonation families are absent too — one
38100
+ // structurally (`X-Agent-Impersonation` header, own verifier), one by
38101
+ // measurement (307 requests through that door, zero lines). What keeps this
38102
+ // `sensitive` is therefore NOT an unresolved residue: it is that `enforce`
38103
+ // changes an admission rule on the front door, and that the predicate is
38104
+ // structural, so a FUTURE family 13 is born refusable without an edit here.
38105
+ // That is exactly the deliberate, audited flip ADR-0022 §4 reserves
38106
+ // confirmation for. docs/research/eng-9895-prod-shadow-measurement.md
38095
38107
  sensitive: true
38096
38108
  },
38097
38109
  {
@@ -38220,10 +38220,22 @@ var FLAG_REGISTRY = [
38220
38220
  // See the description: `shadow` is what prod compiles today, so it is the
38221
38221
  // only default that ships this flag as a no-op.
38222
38222
  defaultValue: "shadow",
38223
- // enforce changes the admission rule on the platform's front door, and the
38224
- // families it starts refusing include mcp-proxy one of the fleet's
38225
- // dominant callers. This is precisely the deliberate, audited flip ADR-0022
38226
- // §4 reserves confirmation for.
38223
+ // enforce changes the admission rule on the platform's front door. This is
38224
+ // precisely the deliberate, audited flip ADR-0022 §4 reserves confirmation
38225
+ // for, and it stays `sensitive` — but NOT for the reason first written here.
38226
+ // That read "the families it starts refusing include mcp-proxy, one of the
38227
+ // fleet's dominant callers", and ENG-9895 measured otherwise: mcp-proxy
38228
+ // verifies its own token on a route carrying no `authMiddleware`, so it is a
38229
+ // dominant caller of a different door and cannot be in the refused set. The
38230
+ // measured population at that door is ZERO over 298,839,353 prod log records
38231
+ // / 14 days, and the impersonation families are absent too — one
38232
+ // structurally (`X-Agent-Impersonation` header, own verifier), one by
38233
+ // measurement (307 requests through that door, zero lines). What keeps this
38234
+ // `sensitive` is therefore NOT an unresolved residue: it is that `enforce`
38235
+ // changes an admission rule on the front door, and that the predicate is
38236
+ // structural, so a FUTURE family 13 is born refusable without an edit here.
38237
+ // That is exactly the deliberate, audited flip ADR-0022 §4 reserves
38238
+ // confirmation for. docs/research/eng-9895-prod-shadow-measurement.md
38227
38239
  sensitive: true
38228
38240
  },
38229
38241
  {
@@ -54,8 +54,8 @@ import {
54
54
  writeDirectChatSessionState,
55
55
  writeEgressAllowlist,
56
56
  writePersistentClaudeWrapper
57
- } from "./chunk-PMQNTU7W.js";
58
- import "./chunk-MFU2FD4N.js";
57
+ } from "./chunk-XCAI3GSF.js";
58
+ import "./chunk-WUXQVP7A.js";
59
59
  import "./chunk-XWVM4KPK.js";
60
60
  export {
61
61
  EGRESS_BASELINE_DOMAINS,
@@ -114,4 +114,4 @@ export {
114
114
  writeEgressAllowlist,
115
115
  writePersistentClaudeWrapper
116
116
  };
117
- //# sourceMappingURL=persistent-session-JKES3FMW.js.map
117
+ //# sourceMappingURL=persistent-session-YGK7YHPR.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-PMQNTU7W.js";
4
- import "./chunk-MFU2FD4N.js";
3
+ } from "./chunk-XCAI3GSF.js";
4
+ import "./chunk-WUXQVP7A.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -764,4 +764,4 @@ export {
764
764
  readAndResetSlackReplyBindingClassifications,
765
765
  readAndResetSlackReplyTargetClassifications
766
766
  };
767
- //# sourceMappingURL=responsiveness-probe-P7EAWN6J.js.map
767
+ //# sourceMappingURL=responsiveness-probe-NGWO3JK3.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-MFU2FD4N.js";
3
+ } from "./chunk-WUXQVP7A.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-IFU2XLHO.js.map
206
+ //# sourceMappingURL=session-auth-dead-4UZR5655.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.847",
3
+ "version": "0.28.849",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {