@junghanacs/entwurf 0.20.1 → 0.22.0
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/AGENTS.md +85 -190
- package/BASELINE.md +6 -3
- package/CHANGELOG.md +473 -14
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +332 -60
- package/README.md +100 -22
- package/VERIFY.md +93 -7
- package/docs/acp-backend-rail.md +0 -1
- package/docs/external-mcp-host.md +64 -33
- package/docs/setup-clean-host.md +151 -17
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +130 -114
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-caller-seat.js +174 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-fresh-preflight.js +519 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-fact-provider.js +22 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-peers-render.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +6 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-native-push.js +30 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-production.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-runner.js +3 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-send.js +8 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-mailbox-body.js +20 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +227 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +189 -19
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/adapter.js +10 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/codex-ws-client.js +403 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/register.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook-codex.js +325 -0
- package/mcp/entwurf-bridge/dist/scripts/codex-socket-path.js +30 -0
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +6 -1
- package/mcp/entwurf-bridge/src/index.ts +154 -116
- package/mcp/entwurf-bridge/tsconfig.build.json +10 -0
- package/package.json +13 -4
- package/pi-extensions/entwurf-control.ts +71 -19
- package/pi-extensions/lib/codex-caller-seat.ts +204 -0
- package/pi-extensions/lib/codex-fresh-preflight.ts +580 -0
- package/pi-extensions/lib/compaction-send-guard.ts +80 -0
- package/pi-extensions/lib/entwurf-fact-provider.ts +29 -3
- package/pi-extensions/lib/entwurf-peers-render.ts +4 -1
- package/pi-extensions/lib/entwurf-v2-contract.ts +6 -7
- package/pi-extensions/lib/entwurf-v2-native-push.ts +35 -18
- package/pi-extensions/lib/entwurf-v2-production.ts +10 -3
- package/pi-extensions/lib/entwurf-v2-runner.ts +3 -2
- package/pi-extensions/lib/entwurf-v2-send.ts +16 -11
- package/pi-extensions/lib/entwurf-v2-surface.ts +7 -4
- package/pi-extensions/lib/meta-mailbox-body.ts +22 -13
- package/pi-extensions/lib/meta-sender-identity.ts +305 -0
- package/pi-extensions/lib/mux-fresh-call.ts +233 -29
- package/pi-extensions/lib/native-push/adapter.ts +21 -24
- package/pi-extensions/lib/native-push/codex-ws-client.ts +506 -0
- package/pi-extensions/lib/native-push/register.ts +7 -9
- package/pi-extensions/meta-bridge-hook-codex.ts +371 -0
- package/run.sh +342 -28
- package/scripts/check-agy-sender-identity.ts +1 -1
- package/scripts/check-codex-app-server-launch.ts +445 -0
- package/scripts/check-codex-birth-hook.ts +264 -0
- package/scripts/check-codex-bridge-identity.ts +179 -0
- package/scripts/check-codex-native-push.ts +386 -0
- package/scripts/check-codex-sender-identity.ts +495 -0
- package/scripts/check-compaction-send-guard.ts +130 -0
- package/scripts/check-copilot-receive-arm.ts +4 -1
- package/scripts/check-entwurf-fact-provider.ts +38 -0
- package/scripts/check-entwurf-peers-surface.ts +13 -1
- package/scripts/check-entwurf-self-address.ts +15 -16
- package/scripts/check-entwurf-v2-contract.ts +4 -3
- package/scripts/check-entwurf-v2-decider.ts +7 -5
- package/scripts/check-entwurf-v2-native-push.ts +35 -7
- package/scripts/check-entwurf-v2-production.ts +245 -12
- package/scripts/check-entwurf-v2-runner.ts +1 -1
- package/scripts/check-entwurf-v2-send.ts +26 -7
- package/scripts/check-entwurf-v2-surface.ts +1 -1
- package/scripts/check-gate-qualification.ts +8 -3
- package/scripts/check-harness-admission-parity.ts +0 -1
- package/scripts/check-mux-launch-tmux.ts +345 -4
- package/scripts/check-native-push-adapter.ts +20 -16
- package/scripts/check-native-push-register.ts +5 -1
- package/scripts/check-release-gate-outcomes.ts +47 -1
- package/scripts/check-setup-qualification.sh +3 -1
- package/scripts/codex-app-server-launch.sh +275 -0
- package/scripts/codex-birth-doctor.sh +276 -0
- package/scripts/codex-birth-install.sh +414 -0
- package/scripts/codex-birth-uninstall.sh +170 -0
- package/scripts/codex-mcp-config.py +435 -0
- package/scripts/codex-socket-path.ts +33 -0
- package/scripts/codex-statusline-config.py +434 -0
- package/scripts/codex-terminal-title-config.py +500 -0
- package/scripts/codex_toml_io.py +653 -0
- package/scripts/lib/codex-fresh-live-protocol.ts +121 -0
- package/scripts/lib/codex-fresh-source-receipts.ts +426 -0
- package/scripts/lib/launch-receipt-windows.ts +46 -0
- package/scripts/lib/tmux-coordinate-row.ts +58 -0
- package/scripts/meta-bridge-fresh-cut.ts +6 -1
- package/scripts/mutants/codex-app-server-launch.json +157 -0
- package/scripts/mutants/codex-caller-seat.json +336 -0
- package/scripts/mutants/codex-native.json +838 -0
- package/scripts/mutants/compaction-send-guard.json +103 -0
- package/scripts/mutants/entwurf-peers.json +19 -0
- package/scripts/mutants/mux-fresh-call.json +93 -10
- package/scripts/mutants/omp-fresh.json +6 -4
- package/scripts/mutants/release-gate.json +13 -0
- package/scripts/mutants/v2-surface.json +75 -1
- package/scripts/raw-async-delivery/README.md +2 -1
- package/scripts/raw-codex-measure/README.md +114 -46
- package/scripts/smoke-agy-native-push-live.ts +3 -1
- package/scripts/smoke-codex-birth.sh +347 -0
- package/scripts/smoke-codex-config-state.sh +700 -0
- package/scripts/smoke-codex-fresh-live.ts +1426 -0
- package/scripts/smoke-codex-native-push-live.ts +75 -0
- package/scripts/smoke-entwurf-chain-live.ts +50 -0
- package/scripts/smoke-setup-verdict.sh +125 -10
- package/scripts/tsconfig.json +1 -0
|
@@ -65,11 +65,11 @@ import * as process from "node:process";
|
|
|
65
65
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
66
66
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
67
67
|
import { z } from "zod";
|
|
68
|
-
|
|
68
|
+
import { codexCallerFreshPreflight, codexFreshPreflight } from "../../../pi-extensions/lib/codex-fresh-preflight.ts";
|
|
69
69
|
import { controlSocketPathIn, defaultControlSocketDir } from "../../../pi-extensions/lib/control-socket-path.js";
|
|
70
70
|
import { resolveMailboxReceiverFacts } from "../../../pi-extensions/lib/entwurf-deliverability.ts";
|
|
71
71
|
import { listEntwurfFacts } from "../../../pi-extensions/lib/entwurf-fact-provider.ts";
|
|
72
|
-
import { renderEntwurfPeers } from "../../../pi-extensions/lib/entwurf-peers-render.ts";
|
|
72
|
+
import { ENTWURF_PEERS_RENDER_LIMIT, renderEntwurfPeers } from "../../../pi-extensions/lib/entwurf-peers-render.ts";
|
|
73
73
|
import { computeSelfAddressability, type MetaDeliveryDomain } from "../../../pi-extensions/lib/entwurf-self-address.ts";
|
|
74
74
|
import { nativePushSupported } from "../../../pi-extensions/lib/entwurf-v2-contract.ts";
|
|
75
75
|
import { resolveMailboxWakeModeCapability } from "../../../pi-extensions/lib/entwurf-v2-decider.ts";
|
|
@@ -81,8 +81,12 @@ import {
|
|
|
81
81
|
visibleResume,
|
|
82
82
|
} from "../../../pi-extensions/lib/entwurf-v2-visible-resume.ts";
|
|
83
83
|
import {
|
|
84
|
+
type CodexRequestSender,
|
|
84
85
|
probeNativeSenderAlive,
|
|
86
|
+
reconcileSenderIdentityClaims,
|
|
87
|
+
resolveCodexRequestSenderIdentity,
|
|
85
88
|
resolveTrustedMetaSenderIdentity,
|
|
89
|
+
type TrustedMetaSender,
|
|
86
90
|
} from "../../../pi-extensions/lib/meta-sender-identity.ts";
|
|
87
91
|
import {
|
|
88
92
|
applyOmpBridgeChildRootPolicy,
|
|
@@ -157,11 +161,11 @@ const server = new McpServer({ name: "entwurf-bridge", version: "0.1.0" });
|
|
|
157
161
|
|
|
158
162
|
// Transparency envelope.
|
|
159
163
|
//
|
|
160
|
-
// Record-backed pi and
|
|
161
|
-
// so the receiver renders WHO (agentId, sessionId), FROM WHERE (cwd), and
|
|
162
|
-
// (timestamp UTC, displayed in KST). `entwurf_self` is identity-required: pi's env
|
|
163
|
-
//
|
|
164
|
-
//
|
|
164
|
+
// Record-backed pi, pid-marker native senders, and request-scoped Codex senders carry a
|
|
165
|
+
// structured envelope so the receiver renders WHO (agentId, sessionId), FROM WHERE (cwd), and
|
|
166
|
+
// WHEN (timestamp UTC, displayed in KST). `entwurf_self` is identity-required: pi's env is a
|
|
167
|
+
// child carrier for the garden id established by record birth; a native sender marker or Codex
|
|
168
|
+
// request selector is accepted only through its backing record. Plain anonymous external hosts
|
|
165
169
|
// fail. #50 C4: v2 delivery is identity-REQUIRED by default — "if we don't know
|
|
166
170
|
// who sent it, we don't send it" holds on every install surface, not only where
|
|
167
171
|
// an installer remembered to set a flag. The ONE documented escape hatch is
|
|
@@ -174,11 +178,11 @@ class EntwurfEnvelopeWiringError extends Error {
|
|
|
174
178
|
constructor(missing: string[]) {
|
|
175
179
|
super(
|
|
176
180
|
`entwurf sender envelope wiring incomplete — missing env: ${missing.join(", ")}, ` +
|
|
177
|
-
"and no
|
|
178
|
-
"PI_SESSION_ID + PI_AGENT_ID
|
|
179
|
-
"
|
|
180
|
-
"
|
|
181
|
-
"
|
|
181
|
+
"and no record-backed native sender claim was found. This MCP child should inherit " +
|
|
182
|
+
"PI_SESSION_ID + PI_AGENT_ID from an entwurf-control pi session, carry a live sender marker " +
|
|
183
|
+
"written by its native hook, or be the managed Codex MCP child whose current tool request " +
|
|
184
|
+
"names a thread backed by a Codex citizen record. entwurf_self is callable only while one of " +
|
|
185
|
+
"those authoritative identity paths is present.",
|
|
182
186
|
);
|
|
183
187
|
}
|
|
184
188
|
}
|
|
@@ -192,21 +196,19 @@ interface SenderEnvelope {
|
|
|
192
196
|
replyable?: boolean;
|
|
193
197
|
}
|
|
194
198
|
|
|
195
|
-
// #50 C4: anonymous sends are refused BY DEFAULT — a send with no pi-session
|
|
196
|
-
//
|
|
197
|
-
//
|
|
199
|
+
// #50 C4: anonymous sends are refused BY DEFAULT — a send with no pi-session identity,
|
|
200
|
+
// trusted pid marker, or request-scoped Codex record does not go out as anonymous external-mcp
|
|
201
|
+
// unless the operator explicitly wired the escape hatch.
|
|
198
202
|
// "If we don't know who sent it, we don't send it."
|
|
199
203
|
class EntwurfSenderIdentityError extends Error {
|
|
200
204
|
constructor() {
|
|
201
205
|
super(
|
|
202
206
|
"entwurf-bridge refused: no authoritative sender identity. Anonymous external sends are " +
|
|
203
|
-
"refused by default, and no pi-session env
|
|
204
|
-
"marker
|
|
205
|
-
"
|
|
206
|
-
"
|
|
207
|
-
"
|
|
208
|
-
"ENTWURF_BRIDGE_ALLOW_ANONYMOUS_SENDER=1 (explicit operator wiring; the send is then marked " +
|
|
209
|
-
"external/non-replyable).",
|
|
207
|
+
"refused by default, and this request has no complete pi-session env, live record-backed " +
|
|
208
|
+
"sender marker, or managed Codex thread selector backed by a Codex citizen record. Open the " +
|
|
209
|
+
"session through its installed birth/MCP integration, then retry. A deliberately-anonymous " +
|
|
210
|
+
"external MCP host may set ENTWURF_BRIDGE_ALLOW_ANONYMOUS_SENDER=1 (explicit operator wiring; " +
|
|
211
|
+
"the send is then marked external/non-replyable).",
|
|
210
212
|
);
|
|
211
213
|
}
|
|
212
214
|
}
|
|
@@ -252,43 +254,26 @@ interface AuthoritativeSelf {
|
|
|
252
254
|
envelope: SenderEnvelope;
|
|
253
255
|
/** meta-session only: WHICH rail carries a reply back. Never inferred from `origin`. */
|
|
254
256
|
metaDeliveryDomain?: MetaDeliveryDomain;
|
|
257
|
+
/**
|
|
258
|
+
* meta-session/codex ONLY: the `_meta.threadId` that named this caller on THIS request, and
|
|
259
|
+
* which the reconciliation above already proved equal to the selected citizen's
|
|
260
|
+
* `nativeSessionId`. It rides here for exactly one consumer — the fresh-call PLACEMENT,
|
|
261
|
+
* which turns it into the caller's own tmux pane through its title (#95 lane B). It is not
|
|
262
|
+
* an address, not a reply rail, and not part of the sender envelope: `sessionId` is the only
|
|
263
|
+
* thing anyone may send to.
|
|
264
|
+
*/
|
|
265
|
+
codexThreadId?: string;
|
|
255
266
|
}
|
|
256
267
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
if (!trusted) return null;
|
|
267
|
-
const { marker, identity } = trusted;
|
|
268
|
-
|
|
269
|
-
// Identity is trusted — but `replyable` is a SEPARATE fact, and WHICH fact depends on the
|
|
270
|
-
// rail a reply would ride (보정①). THREE values, not a native-push-or-self-fetch binary:
|
|
271
|
-
// native-push ← nativePushSupported(backend). NOT wakeMode: `direct-inject` also covers
|
|
272
|
-
// codex/pi, which have no native-push adapter.
|
|
273
|
-
// self-fetch ← resolveMailboxWakeModeCapability (the decider's mailbox seam — one owner
|
|
274
|
-
// with dispatch). A new hardcoded backend list would drift the moment the registry
|
|
275
|
-
// admits another self-fetch citizen.
|
|
276
|
-
// none ← neither. omp today: no mailbox drain, no native-push adapter. Rendering
|
|
277
|
-
// this as self-fetch printed a mailboxPath nothing drains.
|
|
278
|
-
// self-fetch (claude-code/copilot): can this citizen's own inbox wake? → the SHARED
|
|
279
|
-
// receiver composition `resolveMailboxReceiverFacts`, the same one the v2 dispatch seam
|
|
280
|
-
// uses, so a citizen's self-reported replyability can never disagree with what dispatch
|
|
281
|
-
// decides about it. It reads the presence marker (a dead/reused owner already folds to
|
|
282
|
-
// null) AND, where the watch owner is the sender-marker process, the #101 join that says
|
|
283
|
-
// the owner is still serving THIS garden rather than one it switched away from.
|
|
284
|
-
// native-push (antigravity): there is no inbox and no watch. A reply is injected into a
|
|
285
|
-
// live app-server conversation, so only an adapter probe can answer. Composing the
|
|
286
|
-
// receiver atom here would demand `watchArmed` from a backend that never arms one, and
|
|
287
|
-
// every agy citizen would report replyable:false forever.
|
|
288
|
-
// Either way an inactive/unreachable citizen STILL returns its identity (who-sent must
|
|
289
|
-
// survive; degrading to null would erase the sender) — only with replyable:false.
|
|
290
|
-
// The rail, named ONCE and reused for both the predicate and the caller's rendering —
|
|
291
|
-
// so entwurf_self can never re-derive it differently from what decided `replyable`.
|
|
268
|
+
interface SenderRequestContext {
|
|
269
|
+
requestMeta?: unknown;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
async function buildMetaSenderEnvelope(
|
|
273
|
+
identity: TrustedMetaSender["identity"],
|
|
274
|
+
cwd: string,
|
|
275
|
+
trustedMarker?: TrustedMetaSender,
|
|
276
|
+
): Promise<AuthoritativeSelf> {
|
|
292
277
|
const metaDeliveryDomain: MetaDeliveryDomain = nativePushSupported(identity.backend)
|
|
293
278
|
? "native-push"
|
|
294
279
|
: resolveMailboxWakeModeCapability(identity)
|
|
@@ -304,6 +289,11 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
304
289
|
}
|
|
305
290
|
: metaDeliveryDomain === "self-fetch"
|
|
306
291
|
? (() => {
|
|
292
|
+
if (!trustedMarker) {
|
|
293
|
+
throw new Error(
|
|
294
|
+
`entwurf-bridge: ${identity.backend} resolved as self-fetch without the sender marker its receiver join requires`,
|
|
295
|
+
);
|
|
296
|
+
}
|
|
307
297
|
const receiver = resolveMailboxReceiverFacts(identity, {
|
|
308
298
|
readReceiverMarker: (gardenId: string) => readMetaReceiverMarker({ gardenId }),
|
|
309
299
|
readSenderMarker: (backend: string, ownerPid: number) =>
|
|
@@ -323,12 +313,11 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
323
313
|
recordBacked: true,
|
|
324
314
|
};
|
|
325
315
|
const self = computeSelfAddressability(facts);
|
|
326
|
-
|
|
327
316
|
return {
|
|
328
317
|
envelope: {
|
|
329
318
|
sessionId: identity.gardenId,
|
|
330
319
|
agentId: `meta-session/${identity.backend}`,
|
|
331
|
-
cwd
|
|
320
|
+
cwd,
|
|
332
321
|
timestamp: new Date().toISOString(),
|
|
333
322
|
origin: "meta-session",
|
|
334
323
|
replyable: self.replyable,
|
|
@@ -337,17 +326,44 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
337
326
|
};
|
|
338
327
|
}
|
|
339
328
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
329
|
+
async function resolveAuthoritativeSender(
|
|
330
|
+
context: SenderRequestContext,
|
|
331
|
+
cwd: string = process.cwd(),
|
|
332
|
+
): Promise<AuthoritativeSelf | null> {
|
|
343
333
|
const sessionId = process.env.PI_SESSION_ID?.trim();
|
|
344
334
|
const agentId = process.env.PI_AGENT_ID?.trim();
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
335
|
+
const pi = sessionId && agentId && cwd ? buildStrictPiSenderEnvelope() : null;
|
|
336
|
+
const marker = resolveTrustedMetaSenderIdentity({
|
|
337
|
+
markerPath: process.env.ENTWURF_META_SENDER_MARKER?.trim() || undefined,
|
|
338
|
+
});
|
|
339
|
+
const codex: CodexRequestSender | null = resolveCodexRequestSenderIdentity({
|
|
340
|
+
provenance: process.env.ENTWURF_BRIDGE_NATIVE_HOST,
|
|
341
|
+
clientInfo: server.server.getClientVersion(),
|
|
342
|
+
requestMeta: context.requestMeta,
|
|
343
|
+
});
|
|
344
|
+
const selected = reconcileSenderIdentityClaims([
|
|
345
|
+
...(pi ? [{ rail: "pi-session" as const, id: pi.sessionId }] : []),
|
|
346
|
+
...(marker ? [{ rail: "meta-sender-marker" as const, id: marker.identity.gardenId }] : []),
|
|
347
|
+
...(codex ? [{ rail: "codex-request" as const, id: codex.identity.gardenId }] : []),
|
|
348
|
+
]);
|
|
349
|
+
if (!selected) return null;
|
|
350
|
+
if (codex && codex.identity.gardenId === selected.id) {
|
|
351
|
+
return { ...(await buildMetaSenderEnvelope(codex.identity, codex.identity.cwd)), codexThreadId: codex.threadId };
|
|
352
|
+
}
|
|
353
|
+
if (marker && marker.identity.gardenId === selected.id) {
|
|
354
|
+
return buildMetaSenderEnvelope(marker.identity, marker.marker.cwd || cwd, marker);
|
|
355
|
+
}
|
|
356
|
+
if (pi && pi.sessionId === selected.id) return { envelope: pi };
|
|
357
|
+
throw new Error(`entwurf-bridge: reconciled sender ${selected.id} has no matching identity source`);
|
|
358
|
+
}
|
|
350
359
|
|
|
360
|
+
// Async only when the selected sender rides native-push: replyability is the adapter's live fact.
|
|
361
|
+
async function buildAuthoritativeSelfEnvelope(context: SenderRequestContext = {}): Promise<AuthoritativeSelf> {
|
|
362
|
+
const resolved = await resolveAuthoritativeSender(context);
|
|
363
|
+
if (resolved) return resolved;
|
|
364
|
+
const sessionId = process.env.PI_SESSION_ID?.trim();
|
|
365
|
+
const agentId = process.env.PI_AGENT_ID?.trim();
|
|
366
|
+
const cwd = process.cwd();
|
|
351
367
|
const missing: string[] = [];
|
|
352
368
|
if (!sessionId) missing.push("PI_SESSION_ID");
|
|
353
369
|
if (!agentId) missing.push("PI_AGENT_ID");
|
|
@@ -355,18 +371,10 @@ async function buildAuthoritativeSelfEnvelope(): Promise<AuthoritativeSelf> {
|
|
|
355
371
|
throw new EntwurfEnvelopeWiringError(missing);
|
|
356
372
|
}
|
|
357
373
|
|
|
358
|
-
async function buildSendSenderEnvelope(): Promise<SenderEnvelope> {
|
|
359
|
-
const
|
|
360
|
-
|
|
374
|
+
async function buildSendSenderEnvelope(context: SenderRequestContext = {}): Promise<SenderEnvelope> {
|
|
375
|
+
const resolved = await resolveAuthoritativeSender(context);
|
|
376
|
+
if (resolved) return resolved.envelope;
|
|
361
377
|
const cwd = process.cwd();
|
|
362
|
-
if (sessionId && agentId && cwd) return buildStrictPiSenderEnvelope();
|
|
363
|
-
|
|
364
|
-
const meta = await buildTrustedMetaSenderEnvelope(cwd);
|
|
365
|
-
// Delivery takes the WIRE envelope only — the rail axis is rendering-local.
|
|
366
|
-
if (meta) return meta.envelope;
|
|
367
|
-
|
|
368
|
-
// No marker. #50 C4: anonymous external is refused UNLESS the operator wired the
|
|
369
|
-
// explicit escape hatch — identity-required is the default, not an install flag.
|
|
370
378
|
if (process.env.ENTWURF_BRIDGE_ALLOW_ANONYMOUS_SENDER !== "1") {
|
|
371
379
|
throw new EntwurfSenderIdentityError();
|
|
372
380
|
}
|
|
@@ -421,12 +429,11 @@ server.tool(
|
|
|
421
429
|
"outcome (delivered / rejected / delivered-but-lock-dirty). EXISTING targets only; discover with " +
|
|
422
430
|
"entwurf_peers. A peer entwurf_peers shows as liveness=alive → fire-and-forget. A " +
|
|
423
431
|
"citizen with NO socket liveness (liveness=unsupported) is ALSO fire-and-forget — unsupported means only " +
|
|
424
|
-
'"no control-socket probe"
|
|
425
|
-
"
|
|
426
|
-
"
|
|
427
|
-
"
|
|
428
|
-
"
|
|
429
|
-
"native-push-target-dead; indeterminate → native-push-probe-indeterminate (unestablished ≠ gone). " +
|
|
432
|
+
'"no control-socket probe." The decider resolves the actual rail at dispatch time: a self-fetch ' +
|
|
433
|
+
"mailbox only while deliverable, native-push direct injection only while its adapter probe is alive, " +
|
|
434
|
+
"or a THIRD RESULT: rejection when neither holds. An inactive self-fetch citizen is mailbox-undeliverable; " +
|
|
435
|
+
"native-push has NO mailbox: dead → native-push-target-dead; indeterminate → " +
|
|
436
|
+
"native-push-probe-indeterminate. " +
|
|
430
437
|
"DORMANT IS UNREACHABLE: a socket-domain citizen that is not running gets dormant-fire-forget-unsupported " +
|
|
431
438
|
"— same receiver rule as the mailbox, no active drainer means no delivery. " +
|
|
432
439
|
"The intent that used to answer there, owned-outcome, resumed it by launching a hidden background child " +
|
|
@@ -466,11 +473,11 @@ server.tool(
|
|
|
466
473
|
),
|
|
467
474
|
wants_reply: z.boolean().optional().describe("Human-conversation reply hint (default false)"),
|
|
468
475
|
},
|
|
469
|
-
async ({ target, intent, message, mode, wants_reply }) => {
|
|
476
|
+
async ({ target, intent, message, mode, wants_reply }, extra) => {
|
|
470
477
|
try {
|
|
471
478
|
// Resolved ONCE so the dispatch-moment timestamp is fixed and the control RPC sender
|
|
472
479
|
// + the mailbox body sender share one envelope. No replyability gate (see above).
|
|
473
|
-
const sender = await buildSendSenderEnvelope();
|
|
480
|
+
const sender = await buildSendSenderEnvelope({ requestMeta: extra._meta });
|
|
474
481
|
const rendered = await runAndRenderEntwurfV2FromSurface(
|
|
475
482
|
{ target, intent, message, mode, wants_reply },
|
|
476
483
|
// No trust-preflight inputs are passed, and none exist to pass: the preflight on this
|
|
@@ -493,17 +500,16 @@ server.tool(
|
|
|
493
500
|
"degrading it to nothing would erase who-sent. Use to confirm WHO you " +
|
|
494
501
|
"are (agentId, sessionId), FROM WHERE (cwd), and WHEN this snapshot was taken. " +
|
|
495
502
|
"Works for pi sessions (PI_SESSION_ID / PI_AGENT_ID) and for garden-native meta-sessions, whose " +
|
|
496
|
-
"garden id comes from
|
|
497
|
-
"
|
|
498
|
-
"
|
|
499
|
-
"
|
|
500
|
-
"
|
|
501
|
-
"
|
|
502
|
-
"authoritative reply address.",
|
|
503
|
+
"garden id comes from the matching record plus either a trusted native process marker or Codex's " +
|
|
504
|
+
"request-scoped thread selector. For a meta-session it also reports WHICH rail a reply rides, " +
|
|
505
|
+
"because that differs by backend: a self-fetch citizen has a drainable mailbox, while a " +
|
|
506
|
+
"native-push citizen has NO mailbox at all — a reply is injected straight into its live native " +
|
|
507
|
+
"conversation/thread. Do not expect a mailbox just because origin is meta-session. Throws for " +
|
|
508
|
+
"plain anonymous external MCP hosts because they have no authoritative reply address.",
|
|
503
509
|
{},
|
|
504
|
-
async () => {
|
|
510
|
+
async (_args, request) => {
|
|
505
511
|
try {
|
|
506
|
-
const self = await buildAuthoritativeSelfEnvelope();
|
|
512
|
+
const self = await buildAuthoritativeSelfEnvelope({ requestMeta: request._meta });
|
|
507
513
|
const sender = self.envelope;
|
|
508
514
|
const kst = formatKstTimestamp(sender.timestamp);
|
|
509
515
|
const extra: Record<string, string> = {};
|
|
@@ -598,6 +604,9 @@ server.tool(
|
|
|
598
604
|
readRecord: makeStoreRecordReader(sessionsDir),
|
|
599
605
|
// Socket axis: the same dir dispatch uses (grammar SSOT), scan-internal only.
|
|
600
606
|
socket: { dir: ENTWURF_DIR },
|
|
607
|
+
// #112: observe only rows this human surface can render. Full store facts,
|
|
608
|
+
// diagnostics, liveness, and machine payload remain intact.
|
|
609
|
+
observationLimit: ENTWURF_PEERS_RENDER_LIMIT,
|
|
601
610
|
});
|
|
602
611
|
const { text } = renderEntwurfPeers(result);
|
|
603
612
|
return textOk(text);
|
|
@@ -707,30 +716,30 @@ server.tool(
|
|
|
707
716
|
// against that answer would call home to a garden id nobody holds.
|
|
708
717
|
server.tool(
|
|
709
718
|
"entwurf_fresh_call",
|
|
710
|
-
"Open ONE fresh visible sibling in the operator's tmux and hand it a first task.
|
|
711
|
-
"backends only: pi, claude-code, copilot, omp. The sibling's FIRST action is a callback to you carrying a nonce, and the " +
|
|
719
|
+
"Open ONE fresh visible sibling in the operator's tmux and hand it a first task. Five fixed " +
|
|
720
|
+
"backends only: pi, claude-code, copilot, omp, codex. The sibling's FIRST action is a callback to you carrying a nonce, and the " +
|
|
712
721
|
"sender envelope of that callback is its garden id — that is how you learn the address of something that " +
|
|
713
722
|
"did not exist a moment ago. This returns a LAUNCH receipt (tmux window/pane plus that nonce) and nothing " +
|
|
714
723
|
"else: it does NOT mean the runtime started, the first turn ran, or the task was delivered. Nothing polls " +
|
|
715
|
-
"for the callback; if it never arrives the window is visible
|
|
724
|
+
"for the callback; if it never arrives the window is visible. For EXISTING " +
|
|
716
725
|
"citizens use entwurf_v2 — this tool only creates, and entwurf_peers only reports. Model is REQUIRED and " +
|
|
717
726
|
"is passed to the chosen runtime CLI (`provider/model` for pi; model id/alias for Claude Code; a model name " +
|
|
718
|
-
"or `auto` for copilot; a fuzzy model pattern for omp).
|
|
719
|
-
"
|
|
720
|
-
"
|
|
721
|
-
"visible-status units, or if omp's tools.xdev is not false (the vendor default hides MCP tool schemas from the " +
|
|
722
|
-
"prompt, so the sibling could not call you back at all). An optional " +
|
|
727
|
+
"or `auto` for copilot; a fuzzy model pattern for omp or codex). Copilot, omp, and codex are refused BEFORE " +
|
|
728
|
+
"any window opens when their required birth, MCP, receive/delivery, or visible-identity units are absent; " +
|
|
729
|
+
"Codex also requires the operator-owned default app-server socket, which entwurf never starts. An optional " +
|
|
723
730
|
"cwd starts the sibling in ONE literal absolute existing directory (cross-repo fresh) — never pick resume " +
|
|
724
|
-
"for a dormant record's cwd
|
|
725
|
-
"An optional placement.tmuxSession
|
|
726
|
-
"
|
|
731
|
+
"for a dormant record's cwd. Omitted/empty cwd means the caller's own directory. " +
|
|
732
|
+
"An optional placement.tmuxSession is an expert override naming ONE EXISTING session on this agent's own " +
|
|
733
|
+
"tmux server, and it ALWAYS wins. Omitted, the seat follows the CALLER: a CODEX CALLER opens beside its own " +
|
|
734
|
+
"TUI pane (matched by thread-id in that pane's title; 0 or 2+ matches REFUSE, never fall back), and every " +
|
|
735
|
+
"other caller opens in its own session. " +
|
|
736
|
+
"A missing named session is tmux-session-missing and NOTHING is created. " +
|
|
727
737
|
"There are no arbitrary command/env knobs. Do not put secrets in the task — model and task argv are visible to " +
|
|
728
|
-
"same-user processes on this host. Requires that this agent itself runs "
|
|
729
|
-
"inside tmux: without a pane anchor there is no session to open a sibling beside.",
|
|
738
|
+
"same-user processes on this host. Requires that this agent itself runs inside tmux.",
|
|
730
739
|
{
|
|
731
740
|
backend: z
|
|
732
|
-
.enum(["pi", "claude-code", "copilot", "omp"])
|
|
733
|
-
.describe("Which fixed runtime to open. Only these
|
|
741
|
+
.enum(["pi", "claude-code", "copilot", "omp", "codex"])
|
|
742
|
+
.describe("Which fixed runtime to open. Only these five; there is no arbitrary command."),
|
|
734
743
|
model: z
|
|
735
744
|
.string()
|
|
736
745
|
.min(1)
|
|
@@ -745,7 +754,7 @@ server.tool(
|
|
|
745
754
|
// biome-ignore lint/complexity/noUselessEscapeInRegex: emitted to a Rust regex validator, see above
|
|
746
755
|
.regex(/^[A-Za-z0-9][A-Za-z0-9._/:\[\]-]*$/)
|
|
747
756
|
.describe(
|
|
748
|
-
"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot model name
|
|
757
|
+
"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot/OMP/Codex model name.",
|
|
749
758
|
),
|
|
750
759
|
task: z
|
|
751
760
|
.string()
|
|
@@ -758,7 +767,7 @@ server.tool(
|
|
|
758
767
|
.string()
|
|
759
768
|
.optional()
|
|
760
769
|
.describe(
|
|
761
|
-
"Optional literal ABSOLUTE path of an existing directory to start the sibling in (cross-repo fresh).
|
|
770
|
+
"Optional literal ABSOLUTE path of an existing directory to start the sibling in (cross-repo fresh). Taken exactly as given — no trim, no realpath, no project-name resolution; '#' is refused (tmux format expansion). Omit or pass \"\" to start where the CALLER is: its own directory, or for a Codex caller its own record directory, because this bridge is the app-server's child and that process's directory is not the caller's. The receipt echoes the directory that was REQUESTED or the caller record it came from, never an observation of where the pane landed.",
|
|
762
771
|
),
|
|
763
772
|
placement: z
|
|
764
773
|
.object({
|
|
@@ -770,14 +779,28 @@ server.tool(
|
|
|
770
779
|
})
|
|
771
780
|
.optional()
|
|
772
781
|
.describe(
|
|
773
|
-
"Optional
|
|
782
|
+
"Optional expert seat override: open the sibling in ONE EXISTING tmux session of this agent's own server, and it always wins. When omitted the seat follows the CALLER, never the backend being opened: a Codex CALLER opens beside its own TUI pane, matched by thread-id in that pane's terminal title (0 or 2+ matching panes refuse, never fall back); every other caller opens in its own session. A pane title is a placement input only — never an address, liveness or delivery fact. Nothing is ever created. Independent of cwd; neither is inferred from the other. The receipt reports the selected name (absent for the caller-pane rule, which observed a session rather than requesting a name), its source, and resolved target session id.",
|
|
774
783
|
),
|
|
775
784
|
},
|
|
776
|
-
async ({ backend, model, task, cwd, placement }) => {
|
|
785
|
+
async ({ backend, model, task, cwd, placement }, extra) => {
|
|
777
786
|
let callerGardenId: string | null = null;
|
|
787
|
+
// Present exactly when the reconciled caller is a record-backed codex citizen. Its ONLY
|
|
788
|
+
// consumer is the placement below: a Codex caller with no explicit seat opens its sibling
|
|
789
|
+
// beside its own TUI pane, found by that thread's terminal title (#95 lane B).
|
|
790
|
+
let callerNativeSessionId: string | undefined;
|
|
791
|
+
// The SAME citizen's record cwd, set under the SAME condition and carrying no further
|
|
792
|
+
// authority: `envelope.cwd` is only the record's directory when the selected sender is
|
|
793
|
+
// that codex citizen, so the two are derived from one fact rather than read separately.
|
|
794
|
+
// It exists because `process.cwd()` here is the operator-owned APP-SERVER's directory —
|
|
795
|
+
// this bridge is its MCP child — so a codex caller that names no cwd would otherwise open
|
|
796
|
+
// every sibling in the app-server's repo (#95 lane C §1). The composition consults it only
|
|
797
|
+
// when the tool call requested no cwd of its own.
|
|
798
|
+
let callerCwd: string | undefined;
|
|
778
799
|
try {
|
|
779
|
-
const self = await buildAuthoritativeSelfEnvelope();
|
|
800
|
+
const self = await buildAuthoritativeSelfEnvelope({ requestMeta: extra._meta });
|
|
780
801
|
callerGardenId = self.envelope.sessionId;
|
|
802
|
+
callerNativeSessionId = self.codexThreadId;
|
|
803
|
+
callerCwd = self.codexThreadId === undefined ? undefined : self.envelope.cwd;
|
|
781
804
|
} catch (err) {
|
|
782
805
|
// ONE error is a legitimate answer here: this host has no authoritative identity at all
|
|
783
806
|
// (no pi carrier inherited, no trusted marker written), so the sibling would have nowhere
|
|
@@ -790,7 +813,22 @@ server.tool(
|
|
|
790
813
|
callerGardenId = null;
|
|
791
814
|
}
|
|
792
815
|
try {
|
|
793
|
-
|
|
816
|
+
// TWO capability axes, in this order, both pre-mutation and neither standing in for
|
|
817
|
+
// the other. The TARGET axis first — "entwurf cannot open a Codex sibling here at
|
|
818
|
+
// all" is the more fundamental answer than "and it would not know where to put it".
|
|
819
|
+
// The CALLER axis second, and only when the seat anchor will actually be consulted:
|
|
820
|
+
// a codex caller that named an explicit placement never reads a pane title, so
|
|
821
|
+
// refusing it for a missing `thread-id` would refuse an unused capability.
|
|
822
|
+
const targetMissing = backend === "codex" ? await codexFreshPreflight(process.env) : null;
|
|
823
|
+
const callerMissing =
|
|
824
|
+
targetMissing === null && callerNativeSessionId !== undefined && placement === undefined
|
|
825
|
+
? codexCallerFreshPreflight(process.env)
|
|
826
|
+
: null;
|
|
827
|
+
const missing = targetMissing ?? callerMissing;
|
|
828
|
+
const result = missing
|
|
829
|
+
? ({ ok: false, reason: missing } as const)
|
|
830
|
+
: freshCall({ backend, model, task, cwd, placement, callerGardenId, callerNativeSessionId, callerCwd });
|
|
831
|
+
const rendered = renderFreshCall(result);
|
|
794
832
|
return rendered.isError ? textErr(rendered.text) : textOk(rendered.text);
|
|
795
833
|
} catch (err) {
|
|
796
834
|
return textErr(`entwurf_fresh_call error: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -114,6 +114,14 @@
|
|
|
114
114
|
// the marker-less native-push quiesce row) are lib leaves the bridge graph already
|
|
115
115
|
// tolerates — the adapter is a 봉인-3 leaf (node builtins + type-only contract), and
|
|
116
116
|
// register_native already pulls both into this emit.
|
|
117
|
+
// WHY codex-socket-path rides THIS build (#95): `entwurf codex-app-server` is a bash
|
|
118
|
+
// launcher that cannot import the socket resolver, and its first version re-derived the
|
|
119
|
+
// address instead — measurably diverging from `resolveCodexDefaultSocketPath` on a BOM-only
|
|
120
|
+
// CODEX_HOME and on path normalization. The launcher now ASKS this leaf through run_ts, so on
|
|
121
|
+
// an installed host it resolves under node_modules where strip-types is refused and a missing
|
|
122
|
+
// twin would make the one-command launch die before its first line. Its only repo import is
|
|
123
|
+
// native-push/codex-ws-client.ts, ALREADY emitted for meta-bridge-hook-codex, so this adds ONE
|
|
124
|
+
// leaf JS and ZERO new deps.
|
|
117
125
|
// WHY meta-bridge-omp rides THIS build (#87): `install-omp-bridge` explicitly SELECTS
|
|
118
126
|
// `dist/pi-extensions/meta-bridge-omp.js` when REPO_DIR is under node_modules — the same
|
|
119
127
|
// strip-types fence the Claude and Copilot birth entries cross — and
|
|
@@ -135,8 +143,10 @@
|
|
|
135
143
|
"../../scripts/meta-bridge-fresh-cut.ts",
|
|
136
144
|
"../../scripts/meta-facts.ts",
|
|
137
145
|
"../../scripts/omp-receive-facts.ts",
|
|
146
|
+
"../../scripts/codex-socket-path.ts",
|
|
138
147
|
"../../pi-extensions/meta-bridge-hook.ts",
|
|
139
148
|
"../../pi-extensions/meta-bridge-hook-copilot.ts",
|
|
149
|
+
"../../pi-extensions/meta-bridge-hook-codex.ts",
|
|
140
150
|
"../../pi-extensions/meta-bridge-omp.ts",
|
|
141
151
|
"../../pi-extensions/meta-bridge-receive-omp.ts"
|
|
142
152
|
]
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@junghanacs/entwurf",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Garden-citizen dispatch substrate and meta-bridge for pi, Claude Code, Copilot CLI, OMP, and
|
|
3
|
+
"version": "0.22.0",
|
|
4
|
+
"description": "Garden-citizen dispatch substrate and meta-bridge for pi, Claude Code, Copilot CLI, OMP, Antigravity, and Codex CLI; Claude and Snowflake Cortex Code ACP backends.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Junghan Kim",
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"@agentclientprotocol/sdk": "1.4.0",
|
|
87
87
|
"@anthropic-ai/sdk": "0.100.1",
|
|
88
88
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
89
|
+
"smol-toml": "^1.8.0",
|
|
89
90
|
"zod": "^3.25.0 || ^4.0.0"
|
|
90
91
|
},
|
|
91
92
|
"peerDependencies": {
|
|
@@ -142,6 +143,14 @@
|
|
|
142
143
|
"smoke-omp-fresh-live": "./run.sh smoke-omp-fresh-live",
|
|
143
144
|
"check-omp-receive-arm": "./run.sh check-omp-receive-arm",
|
|
144
145
|
"check-omp-fresh-preflight": "./run.sh check-omp-fresh-preflight",
|
|
146
|
+
"check-codex-sender-identity": "./run.sh check-codex-sender-identity",
|
|
147
|
+
"check-codex-native-push": "./run.sh check-codex-native-push",
|
|
148
|
+
"check-codex-bridge-identity": "./run.sh check-codex-bridge-identity",
|
|
149
|
+
"check-codex-birth-hook": "./run.sh check-codex-birth-hook",
|
|
150
|
+
"check-codex-fresh-preflight": "./run.sh check-codex-fresh-preflight",
|
|
151
|
+
"smoke-codex-birth": "./run.sh smoke-codex-birth",
|
|
152
|
+
"smoke-codex-config-state": "./run.sh smoke-codex-config-state",
|
|
153
|
+
"smoke-codex-fresh-live": "./run.sh smoke-codex-fresh-live",
|
|
145
154
|
"check-hook-launch-topology": "./run.sh check-hook-launch-topology",
|
|
146
155
|
"check-meta-hook-session-switch": "./run.sh check-meta-hook-session-switch",
|
|
147
156
|
"check-acp-carrier-augment": "./run.sh check-acp-carrier-augment",
|
|
@@ -165,8 +174,8 @@
|
|
|
165
174
|
"check:core": "pnpm run check:toolchain && pnpm run check:vitest && pnpm run check:contracts",
|
|
166
175
|
"check:toolchain": "pnpm lint && pnpm typecheck",
|
|
167
176
|
"check:vitest": "./run.sh check-mux-fresh-call && ./run.sh check-acp-sdk-surface",
|
|
168
|
-
"check:contracts": "./run.sh check-shell-quote && ./run.sh check-entwurf-session-identity && ./run.sh check-meta-session && ./run.sh check-meta-v3-record && ./run.sh check-mailbox-receipt-state && ./run.sh check-entwurf-capabilities && ./run.sh check-harness-admission-parity && ./run.sh check-capability-bundle-reach && ./run.sh check-meta-mailbox-state-write && ./run.sh check-meta-receiver-marker && ./run.sh check-meta-capability-source && ./run.sh check-model-lock && ./run.sh check-dep-versions && ./run.sh check-node-floor-coherence && ./run.sh check-claude-floor-coherence && ./run.sh check-copilot-statusline && ./run.sh check-pi-import-surface && ./run.sh check-env-namespace && ./run.sh check-pi-runtime-version && ./run.sh check-pi-preflight && ./run.sh check-project-trust-handler && ./run.sh check-entwurf-v2-contract && ./run.sh check-entwurf-v2-lock && ./run.sh check-entwurf-v2-decider && ./run.sh check-entwurf-v2-matrix && ./run.sh check-entwurf-v2-release && ./run.sh check-entwurf-v2-send && ./run.sh check-entwurf-v2-send-fallback && ./run.sh check-entwurf-v2-mailbox && ./run.sh check-entwurf-v2-native-push && ./run.sh check-entwurf-v2-runner && ./run.sh check-entwurf-v2-production && ./run.sh check-entwurf-v2-surface && ./run.sh check-entwurf-bridge-pi-free && ./run.sh check-entwurf-resume-args && ./run.sh check-resume-launch-identity && ./run.sh check-mux-placement && ./run.sh check-mux-launch && ./run.sh check-mux-resume-call && ./run.sh check-mux-parent-artifact && ./run.sh check-mux-launcher-fence && ./run.sh check-entwurf-v2-visible-resume && ./run.sh check-entwurf-facts && ./run.sh check-control-socket-path && ./run.sh check-socket-discovery && ./run.sh check-meta-listing && ./run.sh check-entwurf-fact-provider && ./run.sh check-entwurf-peers-surface && ./run.sh check-entwurf-self-address && ./run.sh check-entwurf-deliverability && ./run.sh check-native-push-adapter && ./run.sh check-native-push-register && ./run.sh check-auth-boundary && ./run.sh check-acp-overlay && ./run.sh check-acp-tool-surface && ./run.sh check-acp-event-mapper && ./run.sh check-acp-prompt-builder && ./run.sh check-acp-config && ./run.sh check-acp-session-store && ./run.sh check-acp-carrier-augment",
|
|
169
|
-
"check:hermetic": "./run.sh check-bridge-delivery && ./run.sh smoke-pi-attach && ./run.sh check-fresh-cut-gate && ./run.sh check-hook-launch-topology && ./run.sh check-meta-hook-session-switch && ./run.sh check-copilot-birth-hook && ./run.sh check-copilot-receive-arm && ./run.sh check-copilot-launch && ./run.sh check-meta-identity-consumers && ./run.sh check-socket-probe && ./run.sh smoke-meta-honesty && ./run.sh check-meta-doctor-oracle && ./run.sh check-agy-permission-matrix && ./run.sh smoke-agy-statusline-state && ./run.sh smoke-copilot-statusline-state && ./run.sh smoke-copilot-mcp-state && ./run.sh smoke-omp-bridge-state && ./run.sh smoke-omp-mcp-state && ./run.sh smoke-omp-receive-state && ./run.sh check-omp-birth-hook && ./run.sh check-omp-receive-arm && ./run.sh check-omp-fresh-preflight && ./run.sh smoke-agy-hooks-state && ./run.sh smoke-pi-provider-state && ./run.sh smoke-user-scope-citizen && ./run.sh smoke-meta-prune && ./run.sh smoke-meta-keyset-guard && ./run.sh check-meta-manifest-schema && ./run.sh check-entwurf-control-rpc && ./run.sh check-entwurf-bridge-boot && ./run.sh check-probe-bridge-command && ./run.sh check-meta-facts && ./run.sh check-agy-sender-identity && ./run.sh check-acp-provider-surface && ./run.sh check-acp-stop-reason && ./run.sh check-acp-prompt-lifecycle && ./run.sh check-acp-usage-accounting && ./run.sh check-acp-launch-namespace && ./run.sh check-acp-stream-hooks && ./run.sh check-acp-backend-preflight && ./run.sh check-acp-session-reuse && ./run.sh check-gate-manifests && ./run.sh check-release-gate-outcomes && ./run.sh check-probe-ordering && ./run.sh check-probe-cli-shim && ./run.sh check-acp-cortex",
|
|
177
|
+
"check:contracts": "./run.sh check-shell-quote && ./run.sh check-entwurf-session-identity && ./run.sh check-meta-session && ./run.sh check-meta-v3-record && ./run.sh check-mailbox-receipt-state && ./run.sh check-entwurf-capabilities && ./run.sh check-harness-admission-parity && ./run.sh check-capability-bundle-reach && ./run.sh check-meta-mailbox-state-write && ./run.sh check-meta-receiver-marker && ./run.sh check-meta-capability-source && ./run.sh check-model-lock && ./run.sh check-dep-versions && ./run.sh check-node-floor-coherence && ./run.sh check-claude-floor-coherence && ./run.sh check-copilot-statusline && ./run.sh check-pi-import-surface && ./run.sh check-env-namespace && ./run.sh check-pi-runtime-version && ./run.sh check-pi-preflight && ./run.sh check-project-trust-handler && ./run.sh check-entwurf-v2-contract && ./run.sh check-entwurf-v2-lock && ./run.sh check-entwurf-v2-decider && ./run.sh check-entwurf-v2-matrix && ./run.sh check-entwurf-v2-release && ./run.sh check-entwurf-v2-send && ./run.sh check-compaction-send-guard && ./run.sh check-entwurf-v2-send-fallback && ./run.sh check-entwurf-v2-mailbox && ./run.sh check-entwurf-v2-native-push && ./run.sh check-entwurf-v2-runner && ./run.sh check-entwurf-v2-production && ./run.sh check-entwurf-v2-surface && ./run.sh check-entwurf-bridge-pi-free && ./run.sh check-entwurf-resume-args && ./run.sh check-resume-launch-identity && ./run.sh check-mux-placement && ./run.sh check-mux-launch && ./run.sh check-mux-resume-call && ./run.sh check-mux-parent-artifact && ./run.sh check-mux-launcher-fence && ./run.sh check-entwurf-v2-visible-resume && ./run.sh check-entwurf-facts && ./run.sh check-control-socket-path && ./run.sh check-socket-discovery && ./run.sh check-meta-listing && ./run.sh check-entwurf-fact-provider && ./run.sh check-entwurf-peers-surface && ./run.sh check-entwurf-self-address && ./run.sh check-entwurf-deliverability && ./run.sh check-native-push-adapter && ./run.sh check-native-push-register && ./run.sh check-auth-boundary && ./run.sh check-acp-overlay && ./run.sh check-acp-tool-surface && ./run.sh check-acp-event-mapper && ./run.sh check-acp-prompt-builder && ./run.sh check-acp-config && ./run.sh check-acp-session-store && ./run.sh check-acp-carrier-augment && ./run.sh check-codex-sender-identity && ./run.sh check-codex-native-push",
|
|
178
|
+
"check:hermetic": "./run.sh check-bridge-delivery && ./run.sh smoke-pi-attach && ./run.sh check-fresh-cut-gate && ./run.sh check-hook-launch-topology && ./run.sh check-meta-hook-session-switch && ./run.sh check-copilot-birth-hook && ./run.sh check-copilot-receive-arm && ./run.sh check-copilot-launch && ./run.sh check-codex-app-server-launch && ./run.sh check-meta-identity-consumers && ./run.sh check-socket-probe && ./run.sh smoke-meta-honesty && ./run.sh check-meta-doctor-oracle && ./run.sh check-agy-permission-matrix && ./run.sh smoke-agy-statusline-state && ./run.sh smoke-copilot-statusline-state && ./run.sh smoke-copilot-mcp-state && ./run.sh smoke-omp-bridge-state && ./run.sh smoke-omp-mcp-state && ./run.sh smoke-omp-receive-state && ./run.sh check-omp-birth-hook && ./run.sh check-omp-receive-arm && ./run.sh check-omp-fresh-preflight && ./run.sh smoke-agy-hooks-state && ./run.sh smoke-pi-provider-state && ./run.sh smoke-user-scope-citizen && ./run.sh smoke-meta-prune && ./run.sh smoke-meta-keyset-guard && ./run.sh check-meta-manifest-schema && ./run.sh check-entwurf-control-rpc && ./run.sh check-entwurf-bridge-boot && ./run.sh check-probe-bridge-command && ./run.sh check-meta-facts && ./run.sh check-agy-sender-identity && ./run.sh check-acp-provider-surface && ./run.sh check-acp-stop-reason && ./run.sh check-acp-prompt-lifecycle && ./run.sh check-acp-usage-accounting && ./run.sh check-acp-launch-namespace && ./run.sh check-acp-stream-hooks && ./run.sh check-acp-backend-preflight && ./run.sh check-acp-session-reuse && ./run.sh check-gate-manifests && ./run.sh check-release-gate-outcomes && ./run.sh check-probe-ordering && ./run.sh check-probe-cli-shim && ./run.sh check-acp-cortex && ./run.sh check-codex-bridge-identity && ./run.sh check-codex-birth-hook && ./run.sh smoke-codex-config-state && ./run.sh smoke-codex-birth",
|
|
170
179
|
"check:package": "./run.sh check-install-surface && ./run.sh smoke-meta-install-state && ./run.sh smoke-agy-install-state && ./run.sh smoke-setup-verdict && ./run.sh check-pack-pin-matcher && ./run.sh check-package-source-routing && ./run.sh check-install-preflight && ./run.sh check-pack"
|
|
171
180
|
},
|
|
172
181
|
"pi": {
|