@junghanacs/entwurf 0.15.1 → 0.16.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/CHANGELOG.md +229 -0
- package/DELIVERY.md +3 -2
- package/README.md +70 -87
- package/VERIFY.md +4 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/external-mcp-host.md +147 -9
- package/docs/setup-clean-host.md +105 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +65 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/entwurf-capabilities.json +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +17 -6
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +172 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +152 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/omp-fresh-preflight.js +271 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js +988 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-receive-omp.js +574 -0
- package/mcp/entwurf-bridge/dist/scripts/omp-receive-facts.js +84 -0
- package/mcp/entwurf-bridge/src/index.ts +65 -19
- package/mcp/entwurf-bridge/tsconfig.build.json +19 -3
- package/mcp/tsconfig.json +10 -0
- package/package.json +13 -3
- package/pi/entwurf-capabilities.json +1 -0
- package/pi/meta-bridge-omp/entwurf-meta-omp/package.json +7 -0
- package/pi/omp-receive/entwurf-receive-omp/package.json +7 -0
- package/pi-extensions/entwurf-control.ts +12 -9
- package/pi-extensions/lib/entwurf-self-address.ts +18 -7
- package/pi-extensions/lib/meta-sender-identity.ts +1 -1
- package/pi-extensions/lib/meta-session.ts +219 -5
- package/pi-extensions/lib/mux-fresh-call.ts +171 -17
- package/pi-extensions/lib/omp-fresh-preflight.ts +275 -0
- package/pi-extensions/meta-bridge-omp.ts +1244 -0
- package/pi-extensions/meta-bridge-receive-omp.ts +666 -0
- package/run.sh +296 -4
- package/scripts/check-entwurf-self-address.ts +31 -0
- package/scripts/check-gate-qualification.ts +4 -1
- package/scripts/check-harness-admission-parity.ts +143 -0
- package/scripts/check-meta-doctor-oracle.sh +20 -0
- package/scripts/check-omp-birth-hook.ts +1049 -0
- package/scripts/check-omp-fresh-preflight.ts +181 -0
- package/scripts/check-omp-receive-arm.ts +516 -0
- package/scripts/inventory-verification-surface.ts +1 -1
- package/scripts/meta-bridge-hook-log.sh +9 -1
- package/scripts/mutants/copilot-birth.json +7 -5
- package/scripts/mutants/mux-fresh-call.json +22 -22
- package/scripts/mutants/omp-birth.json +173 -0
- package/scripts/mutants/omp-fresh.json +300 -0
- package/scripts/mutants/omp-receive.json +135 -0
- package/scripts/mutants/self-address.json +34 -0
- package/scripts/omp-bridge-doctor.sh +315 -0
- package/scripts/omp-bridge-install.sh +221 -0
- package/scripts/omp-bridge-oracle.sh +154 -0
- package/scripts/omp-bridge-uninstall.sh +57 -0
- package/scripts/omp-mcp-bridge.sh +320 -0
- package/scripts/omp-mcp-config.py +392 -0
- package/scripts/omp-receive-doctor.sh +246 -0
- package/scripts/omp-receive-facts.ts +106 -0
- package/scripts/omp-receive-install.sh +228 -0
- package/scripts/omp-receive-uninstall.sh +60 -0
- package/scripts/omp-tool-surface.py +349 -0
- package/scripts/raw-omp-measure/README.md +420 -0
- package/scripts/raw-omp-measure/probe-extension.ts +76 -0
- package/scripts/raw-omp-measure/probe-receive-surface.ts +250 -0
- package/scripts/raw-omp-measure/source-audit.md +414 -0
- package/scripts/smoke-omp-bridge-state.sh +221 -0
- package/scripts/smoke-omp-fresh-live.ts +497 -0
- package/scripts/smoke-omp-mcp-state.sh +327 -0
- package/scripts/smoke-omp-receive-live.ts +340 -0
- package/scripts/smoke-omp-receive-state.sh +196 -0
- package/scripts/tsconfig.json +2 -0
|
@@ -71,6 +71,7 @@ import { listEntwurfFacts } from "../../../pi-extensions/lib/entwurf-fact-provid
|
|
|
71
71
|
import { renderEntwurfPeers } from "../../../pi-extensions/lib/entwurf-peers-render.ts";
|
|
72
72
|
import { computeSelfAddressability, type MetaDeliveryDomain } from "../../../pi-extensions/lib/entwurf-self-address.ts";
|
|
73
73
|
import { nativePushSupported } from "../../../pi-extensions/lib/entwurf-v2-contract.ts";
|
|
74
|
+
import { resolveMailboxWakeModeCapability } from "../../../pi-extensions/lib/entwurf-v2-decider.ts";
|
|
74
75
|
import { runAndRenderEntwurfV2FromSurface } from "../../../pi-extensions/lib/entwurf-v2-surface.ts";
|
|
75
76
|
import {
|
|
76
77
|
makeVisibleResumeDeps,
|
|
@@ -83,6 +84,7 @@ import {
|
|
|
83
84
|
resolveTrustedMetaSenderIdentity,
|
|
84
85
|
} from "../../../pi-extensions/lib/meta-sender-identity.ts";
|
|
85
86
|
import {
|
|
87
|
+
applyOmpBridgeChildRootPolicy,
|
|
86
88
|
defaultMetaMailboxDir,
|
|
87
89
|
defaultMetaSessionsDir,
|
|
88
90
|
makeStoreRecordReader,
|
|
@@ -95,6 +97,29 @@ import { RESUME_CALL_REJECT_HINT, resumeCall } from "../../../pi-extensions/lib/
|
|
|
95
97
|
import { registerNativeConversation } from "../../../pi-extensions/lib/native-push/register.ts";
|
|
96
98
|
|
|
97
99
|
const HOME = os.homedir();
|
|
100
|
+
|
|
101
|
+
// ============================================================================
|
|
102
|
+
// OMP root policy — FIRST, before any lazy default-root consumer (#87 B1).
|
|
103
|
+
//
|
|
104
|
+
// This runs at module load for one reason: every meta-root consumer below resolves its
|
|
105
|
+
// directory lazily inside a tool handler, and the whole point of the policy is that none
|
|
106
|
+
// of them may ever see the foreign value. It is a no-op for every other child — it fires
|
|
107
|
+
// only when this process carries the exact `external-mcp/omp` provenance label its managed
|
|
108
|
+
// entry writes, and then it removes `PI_CODING_AGENT_DIR` from THIS process alone (the omp
|
|
109
|
+
// HOST keeps it: there the variable is the vendor's own agent dir) and pins the four
|
|
110
|
+
// entwurf-owned meta roots to the shared leaf's answer. See `applyOmpBridgeChildRootPolicy`.
|
|
111
|
+
// ============================================================================
|
|
112
|
+
try {
|
|
113
|
+
applyOmpBridgeChildRootPolicy(process.env, HOME);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
// FAIL CLOSED, LOUDLY. The policy refuses an ambiguous garden root (a relative
|
|
116
|
+
// `ENTWURF_META_*` override, #87 A2), and a bridge child that cannot say which store it
|
|
117
|
+
// is addressing must not boot with a guess — the extension half received the identical
|
|
118
|
+
// refusal, so proceeding here is exactly the split the policy exists to prevent.
|
|
119
|
+
console.error(`[entwurf-bridge] fatal: ${err instanceof Error ? err.message : String(err)}`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
98
123
|
// Directory SOURCE is this adapter's own policy — the bridge honours an explicit
|
|
99
124
|
// ENTWURF_DIR override the pi side does not. The path GRAMMAR is the shared leaf.
|
|
100
125
|
const ENTWURF_DIR = process.env.ENTWURF_DIR ?? defaultControlSocketDir(HOME);
|
|
@@ -239,11 +264,17 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
239
264
|
const { marker, identity } = trusted;
|
|
240
265
|
|
|
241
266
|
// Identity is trusted — but `replyable` is a SEPARATE fact, and WHICH fact depends on the
|
|
242
|
-
// rail a reply would ride (보정①).
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
//
|
|
267
|
+
// rail a reply would ride (보정①). THREE values, not a native-push-or-self-fetch binary:
|
|
268
|
+
// native-push ← nativePushSupported(backend). NOT wakeMode: `direct-inject` also covers
|
|
269
|
+
// codex/pi, which have no native-push adapter.
|
|
270
|
+
// self-fetch ← resolveMailboxWakeModeCapability (the decider's mailbox seam — one owner
|
|
271
|
+
// with dispatch). A new hardcoded backend list would drift the moment the registry
|
|
272
|
+
// admits another self-fetch citizen.
|
|
273
|
+
// none ← neither. omp today: no mailbox drain, no native-push adapter. Rendering
|
|
274
|
+
// this as self-fetch printed a mailboxPath nothing drains.
|
|
275
|
+
// self-fetch (claude-code/copilot): can this citizen's own inbox wake? → the receiver
|
|
276
|
+
// presence marker (readMetaReceiverMarker folds a dead/reused owner to null, so a match
|
|
277
|
+
// means a live, ARMED receiver — the sender marker proves identity, never an armed watch).
|
|
247
278
|
// native-push (antigravity): there is no inbox and no watch. A reply is injected into a
|
|
248
279
|
// live app-server conversation, so only an adapter probe can answer. Composing the
|
|
249
280
|
// receiver atom here would demand `watchArmed` from a backend that never arms one, and
|
|
@@ -252,7 +283,11 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
252
283
|
// survive; degrading to null would erase the sender) — only with replyable:false.
|
|
253
284
|
// The rail, named ONCE and reused for both the predicate and the caller's rendering —
|
|
254
285
|
// so entwurf_self can never re-derive it differently from what decided `replyable`.
|
|
255
|
-
const metaDeliveryDomain: MetaDeliveryDomain = nativePushSupported(identity.backend)
|
|
286
|
+
const metaDeliveryDomain: MetaDeliveryDomain = nativePushSupported(identity.backend)
|
|
287
|
+
? "native-push"
|
|
288
|
+
: resolveMailboxWakeModeCapability(identity)
|
|
289
|
+
? "self-fetch"
|
|
290
|
+
: "none";
|
|
256
291
|
const facts =
|
|
257
292
|
metaDeliveryDomain === "native-push"
|
|
258
293
|
? {
|
|
@@ -261,17 +296,23 @@ async function buildTrustedMetaSenderEnvelope(cwd: string = process.cwd()): Prom
|
|
|
261
296
|
recordBacked: true,
|
|
262
297
|
probeAlive: await probeNativeSenderAlive(identity),
|
|
263
298
|
}
|
|
264
|
-
:
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
299
|
+
: metaDeliveryDomain === "self-fetch"
|
|
300
|
+
? (() => {
|
|
301
|
+
const receiver = readMetaReceiverMarker({ gardenId: identity.gardenId });
|
|
302
|
+
const active = receiverMarkerMatchesIdentity(receiver, identity);
|
|
303
|
+
return {
|
|
304
|
+
origin: "meta-session" as const,
|
|
305
|
+
metaDeliveryDomain,
|
|
306
|
+
recordBacked: true,
|
|
307
|
+
ownerAlive: active,
|
|
308
|
+
watchArmed: active,
|
|
309
|
+
};
|
|
310
|
+
})()
|
|
311
|
+
: {
|
|
268
312
|
origin: "meta-session" as const,
|
|
269
313
|
metaDeliveryDomain,
|
|
270
314
|
recordBacked: true,
|
|
271
|
-
ownerAlive: active,
|
|
272
|
-
watchArmed: active,
|
|
273
315
|
};
|
|
274
|
-
})();
|
|
275
316
|
const self = computeSelfAddressability(facts);
|
|
276
317
|
|
|
277
318
|
return {
|
|
@@ -495,6 +536,8 @@ server.tool(
|
|
|
495
536
|
lines.push(
|
|
496
537
|
"mailbox: none — native-push has no inbox; a reply direct-injects only while the adapter probe is alive",
|
|
497
538
|
);
|
|
539
|
+
} else if (rail === "none") {
|
|
540
|
+
lines.push("mailbox: none — no inbound rail (no mailbox, no native-push adapter)");
|
|
498
541
|
} else {
|
|
499
542
|
// Fail-closed, matching computeSelfAddressability's own unsupplied-domain row:
|
|
500
543
|
// with no rail we cannot say how a reply would travel, so we claim no transport.
|
|
@@ -655,16 +698,19 @@ server.tool(
|
|
|
655
698
|
// against that answer would call home to a garden id nobody holds.
|
|
656
699
|
server.tool(
|
|
657
700
|
"entwurf_fresh_call",
|
|
658
|
-
"Open ONE fresh visible sibling in the operator's own tmux session and hand it a first task.
|
|
659
|
-
"backends only: pi, claude-code, copilot. The sibling's FIRST action is a callback to you carrying a nonce, and the " +
|
|
701
|
+
"Open ONE fresh visible sibling in the operator's own tmux session and hand it a first task. Four fixed " +
|
|
702
|
+
"backends only: pi, claude-code, copilot, omp. The sibling's FIRST action is a callback to you carrying a nonce, and the " +
|
|
660
703
|
"sender envelope of that callback is its garden id — that is how you learn the address of something that " +
|
|
661
704
|
"did not exist a moment ago. This returns a LAUNCH receipt (tmux window/pane plus that nonce) and nothing " +
|
|
662
705
|
"else: it does NOT mean the runtime started, the first turn ran, or the task was delivered. Nothing polls " +
|
|
663
706
|
"for the callback; if it never arrives the window is visible and can be read directly. For EXISTING " +
|
|
664
707
|
"citizens use entwurf_v2 — this tool only creates, and entwurf_peers only reports. Model is REQUIRED and " +
|
|
665
708
|
"is passed to the chosen runtime CLI (`provider/model` for pi; model id/alias for Claude Code; a model name " +
|
|
666
|
-
"or `auto` for copilot). A copilot launch goes through entwurf's own managed
|
|
667
|
-
"BEFORE any window opens if this host lacks the Copilot birth, MCP, receiver or
|
|
709
|
+
"or `auto` for copilot; a fuzzy model pattern for omp). A copilot launch goes through entwurf's own managed " +
|
|
710
|
+
"invocation and is refused BEFORE any window opens if this host lacks the Copilot birth, MCP, receiver or " +
|
|
711
|
+
"visible-footer units; an omp launch is refused the same way if this host lacks the OMP birth, MCP, receiver or " +
|
|
712
|
+
"visible-status units, or if omp's tools.xdev is not false (the vendor default hides MCP tool schemas from the " +
|
|
713
|
+
"prompt, so the sibling could not call you back at all). An optional " +
|
|
668
714
|
"cwd starts the sibling in ONE literal absolute existing directory (cross-repo fresh) — never pick resume " +
|
|
669
715
|
"for a dormant record's cwd; resume is continuity-only. Omitted/empty cwd means the caller's own directory. " +
|
|
670
716
|
"There are no arbitrary command/env knobs. Do not put secrets in the task — model and task argv are visible to " +
|
|
@@ -672,8 +718,8 @@ server.tool(
|
|
|
672
718
|
"inside tmux: without a pane anchor there is no session to open a sibling beside.",
|
|
673
719
|
{
|
|
674
720
|
backend: z
|
|
675
|
-
.enum(["pi", "claude-code", "copilot"])
|
|
676
|
-
.describe("Which fixed runtime to open. Only these
|
|
721
|
+
.enum(["pi", "claude-code", "copilot", "omp"])
|
|
722
|
+
.describe("Which fixed runtime to open. Only these four; there is no arbitrary command."),
|
|
677
723
|
model: z
|
|
678
724
|
.string()
|
|
679
725
|
.min(1)
|
|
@@ -20,8 +20,12 @@
|
|
|
20
20
|
// that lazy edge — the owned-outcome resume verdict — was withdrawn, so nothing
|
|
21
21
|
// on the dispatch path loads the pi-backed preflight today; the dynamic form is
|
|
22
22
|
// kept because the eager-closure guarantee must not depend on that. This is an EMIT pass, not a
|
|
23
|
-
// typecheck pass — the noEmit
|
|
24
|
-
//
|
|
23
|
+
// typecheck pass — the noEmit fence that covers this graph is mcp/tsconfig.json
|
|
24
|
+
// (scripts/tsconfig.json fences the verification scripts), and it is untouched
|
|
25
|
+
// here, so every `.ts` is still typechecked by a `tsc --noEmit` pass. That was
|
|
26
|
+
// NOT true when this note was written: mcp/tsconfig.json inherited the root
|
|
27
|
+
// `exclude` and dropped src/index.ts from every noEmit program, leaving this
|
|
28
|
+
// emit pass as the only thing typechecking the boot entry (issue #85).
|
|
25
29
|
"extends": "../../tsconfig.json",
|
|
26
30
|
"compilerOptions": {
|
|
27
31
|
"allowImportingTsExtensions": true,
|
|
@@ -110,6 +114,15 @@
|
|
|
110
114
|
// the marker-less native-push quiesce row) are lib leaves the bridge graph already
|
|
111
115
|
// tolerates — the adapter is a 봉인-3 leaf (node builtins + type-only contract), and
|
|
112
116
|
// register_native already pulls both into this emit.
|
|
117
|
+
// WHY meta-bridge-omp rides THIS build (#87): `install-omp-bridge` explicitly SELECTS
|
|
118
|
+
// `dist/pi-extensions/meta-bridge-omp.js` when REPO_DIR is under node_modules — the same
|
|
119
|
+
// strip-types fence the Claude and Copilot birth entries cross — and
|
|
120
|
+
// `docs/setup-clean-host.md` tells operators to run that installer. Without the twin the
|
|
121
|
+
// installed installer dies at its own artifact check before assembling anything, so the
|
|
122
|
+
// advertised installed consumer surface never reaches compiled JS (Hard Rule 11). Its
|
|
123
|
+
// only repo import is meta-session.ts, ALREADY emitted for the store-doctor, so this adds
|
|
124
|
+
// ONE leaf JS and ZERO new deps. It is an omp-loaded extension module, never in
|
|
125
|
+
// index.ts's boot closure, so check-entwurf-bridge-pi-free is unaffected.
|
|
113
126
|
"include": [
|
|
114
127
|
"./src/index.ts",
|
|
115
128
|
"../../protocol.js",
|
|
@@ -121,7 +134,10 @@
|
|
|
121
134
|
"../../scripts/meta-bridge-prune.ts",
|
|
122
135
|
"../../scripts/meta-bridge-fresh-cut.ts",
|
|
123
136
|
"../../scripts/meta-facts.ts",
|
|
137
|
+
"../../scripts/omp-receive-facts.ts",
|
|
124
138
|
"../../pi-extensions/meta-bridge-hook.ts",
|
|
125
|
-
"../../pi-extensions/meta-bridge-hook-copilot.ts"
|
|
139
|
+
"../../pi-extensions/meta-bridge-hook-copilot.ts",
|
|
140
|
+
"../../pi-extensions/meta-bridge-omp.ts",
|
|
141
|
+
"../../pi-extensions/meta-bridge-receive-omp.ts"
|
|
126
142
|
]
|
|
127
143
|
}
|
package/mcp/tsconfig.json
CHANGED
|
@@ -25,5 +25,15 @@
|
|
|
25
25
|
"noEmit": true,
|
|
26
26
|
"rootDir": ".."
|
|
27
27
|
},
|
|
28
|
+
// Override the root `exclude` (which lists "mcp"): without this, the
|
|
29
|
+
// inherited exclusion resolves to <repo>/mcp and filters out everything
|
|
30
|
+
// `include` adds under mcp/, so entwurf-bridge/src/index.ts — the bridge
|
|
31
|
+
// boot entry, and the only tracked .ts in no `tsc --noEmit` program — was
|
|
32
|
+
// silently NOT typechecked (issue #85; the same gap scripts/tsconfig.json
|
|
33
|
+
// already had to close in Phase 3b). The 26 pi-extensions/lib files this
|
|
34
|
+
// program did see arrived through the import graph, which `exclude` does
|
|
35
|
+
// not filter; nothing imports the entry, so nothing rescued it.
|
|
36
|
+
// Re-list the root's other exclusions, minus "mcp".
|
|
37
|
+
"exclude": ["../node_modules", "../scripts", "../plugins"],
|
|
28
38
|
"include": ["./entwurf-bridge/src/**/*.ts", "../pi-extensions/lib/**/*.ts"]
|
|
29
39
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@junghanacs/entwurf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Garden-citizen dispatch substrate and meta-bridge for Claude Code, Codex, Antigravity, and pi harnesses.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"mcp",
|
|
28
28
|
"claude-code",
|
|
29
29
|
"codex",
|
|
30
|
+
"copilot",
|
|
30
31
|
"antigravity",
|
|
31
32
|
"pi-coding-agent",
|
|
32
33
|
"pi-extension"
|
|
@@ -61,6 +62,8 @@
|
|
|
61
62
|
"pi/meta-bridge-copilot/entwurf-meta-receive-copilot/hooks/hooks.json",
|
|
62
63
|
"pi/meta-bridge-copilot/entwurf-meta-receive-copilot/scripts/copilot-hook-launch.sh",
|
|
63
64
|
"pi/copilot-receive/entwurf-receive/extension.mjs",
|
|
65
|
+
"pi/meta-bridge-omp/entwurf-meta-omp/package.json",
|
|
66
|
+
"pi/omp-receive/entwurf-receive-omp/package.json",
|
|
64
67
|
"pi/skill-plugin-example/",
|
|
65
68
|
"run.sh",
|
|
66
69
|
"AGENTS.md",
|
|
@@ -116,6 +119,7 @@
|
|
|
116
119
|
"check-meta-v3-record": "./run.sh check-meta-v3-record",
|
|
117
120
|
"check-mailbox-receipt-state": "./run.sh check-mailbox-receipt-state",
|
|
118
121
|
"check-entwurf-capabilities": "./run.sh check-entwurf-capabilities",
|
|
122
|
+
"check-harness-admission-parity": "./run.sh check-harness-admission-parity",
|
|
119
123
|
"check-fresh-cut-gate": "./run.sh check-fresh-cut-gate",
|
|
120
124
|
"check-meta-mailbox-state-write": "./run.sh check-meta-mailbox-state-write",
|
|
121
125
|
"check-meta-identity-consumers": "./run.sh check-meta-identity-consumers",
|
|
@@ -132,6 +136,12 @@
|
|
|
132
136
|
"check-copilot-launch": "./run.sh check-copilot-launch",
|
|
133
137
|
"smoke-copilot-statusline-state": "./run.sh smoke-copilot-statusline-state",
|
|
134
138
|
"smoke-copilot-mcp-state": "./run.sh smoke-copilot-mcp-state",
|
|
139
|
+
"smoke-omp-bridge-state": "./run.sh smoke-omp-bridge-state",
|
|
140
|
+
"smoke-omp-mcp-state": "./run.sh smoke-omp-mcp-state",
|
|
141
|
+
"smoke-omp-receive-state": "./run.sh smoke-omp-receive-state",
|
|
142
|
+
"smoke-omp-fresh-live": "./run.sh smoke-omp-fresh-live",
|
|
143
|
+
"check-omp-receive-arm": "./run.sh check-omp-receive-arm",
|
|
144
|
+
"check-omp-fresh-preflight": "./run.sh check-omp-fresh-preflight",
|
|
135
145
|
"check-hook-launch-topology": "./run.sh check-hook-launch-topology",
|
|
136
146
|
"check-acp-carrier-augment": "./run.sh check-acp-carrier-augment",
|
|
137
147
|
"check-agy-permission-matrix": "./run.sh check-agy-permission-matrix",
|
|
@@ -154,8 +164,8 @@
|
|
|
154
164
|
"check:core": "pnpm run check:toolchain && pnpm run check:vitest && pnpm run check:contracts",
|
|
155
165
|
"check:toolchain": "pnpm lint && pnpm typecheck",
|
|
156
166
|
"check:vitest": "./run.sh check-mux-fresh-call && ./run.sh check-acp-sdk-surface",
|
|
157
|
-
"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-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",
|
|
158
|
-
"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-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-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-stream-hooks && ./run.sh check-acp-backend-preflight && ./run.sh check-acp-session-reuse && ./run.sh check-release-gate-outcomes && ./run.sh check-probe-ordering && ./run.sh check-probe-cli-shim && ./run.sh check-acp-cortex",
|
|
167
|
+
"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",
|
|
168
|
+
"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-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-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-stream-hooks && ./run.sh check-acp-backend-preflight && ./run.sh check-acp-session-reuse && ./run.sh check-release-gate-outcomes && ./run.sh check-probe-ordering && ./run.sh check-probe-cli-shim && ./run.sh check-acp-cortex",
|
|
159
169
|
"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"
|
|
160
170
|
},
|
|
161
171
|
"pi": {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"antigravity": { "wakeMode": "direct-inject", "deliveryLevel": "D6", "nativeIdLabel": "conversationId" },
|
|
6
6
|
"codex": { "wakeMode": "direct-inject", "deliveryLevel": "D6", "nativeIdLabel": "threadId" },
|
|
7
7
|
"copilot": { "wakeMode": "self-fetch", "deliveryLevel": "D6", "nativeIdLabel": "sessionId" },
|
|
8
|
+
"omp": { "wakeMode": "self-fetch", "deliveryLevel": "D6", "nativeIdLabel": "sessionId" },
|
|
8
9
|
"pi": { "wakeMode": "direct-inject", "deliveryLevel": "D6", "nativeIdLabel": "sessionId" }
|
|
9
10
|
}
|
|
10
11
|
}
|
|
@@ -1490,7 +1490,7 @@ const MUX_FRESH_CALL_MODULE = "./lib/mux-fresh-call.ts";
|
|
|
1490
1490
|
interface MuxFreshCallModule {
|
|
1491
1491
|
freshCall(
|
|
1492
1492
|
params: {
|
|
1493
|
-
backend: "pi" | "claude-code" | "copilot";
|
|
1493
|
+
backend: "pi" | "claude-code" | "copilot" | "omp";
|
|
1494
1494
|
model: string;
|
|
1495
1495
|
task: string;
|
|
1496
1496
|
cwd?: string;
|
|
@@ -1519,23 +1519,26 @@ function registerFreshCallTool(pi: ExtensionAPI): void {
|
|
|
1519
1519
|
registerTool({
|
|
1520
1520
|
name: "entwurf_fresh_call",
|
|
1521
1521
|
label: "Open Fresh Sibling",
|
|
1522
|
-
description: `Open ONE fresh visible sibling in the operator's own tmux session and hand it a first task.
|
|
1523
|
-
backends only: pi, claude-code, copilot. The sibling's FIRST action is a callback to you carrying a nonce, and the
|
|
1522
|
+
description: `Open ONE fresh visible sibling in the operator's own tmux session and hand it a first task. Four fixed
|
|
1523
|
+
backends only: pi, claude-code, copilot, omp. The sibling's FIRST action is a callback to you carrying a nonce, and the
|
|
1524
1524
|
sender envelope of that callback is its garden id — that is how you learn the address of something that did
|
|
1525
1525
|
not exist a moment ago. This returns a LAUNCH receipt (tmux window/pane plus that nonce) and nothing else:
|
|
1526
1526
|
it does NOT mean the runtime started, the first turn ran, or the task was delivered. Nothing polls for the
|
|
1527
1527
|
callback; if it never arrives the window is visible and can be read directly. For EXISTING citizens use
|
|
1528
1528
|
entwurf_v2 — this tool only creates, and entwurf_peers only reports. Model is REQUIRED and passed to the
|
|
1529
|
-
chosen runtime CLI (provider/model for pi; model id/alias for Claude Code; a Copilot model name or auto
|
|
1530
|
-
A copilot launch goes through entwurf's own managed invocation and is refused
|
|
1531
|
-
this host lacks the Copilot birth, MCP, receiver or visible-footer units
|
|
1529
|
+
chosen runtime CLI (provider/model for pi; model id/alias for Claude Code; a Copilot model name or auto; a
|
|
1530
|
+
fuzzy model pattern for omp). A copilot launch goes through entwurf's own managed invocation and is refused
|
|
1531
|
+
BEFORE any window opens if this host lacks the Copilot birth, MCP, receiver or visible-footer units; an omp
|
|
1532
|
+
launch is refused the same way if this host lacks the OMP birth, MCP, receiver or visible-status units, or if
|
|
1533
|
+
omp's tools.xdev is not false (the vendor default hides MCP tool schemas from the prompt, so the sibling
|
|
1534
|
+
could not call you back at all). An optional cwd starts the
|
|
1532
1535
|
sibling in ONE literal absolute existing directory (cross-repo fresh) — never pick resume for a dormant
|
|
1533
1536
|
record's cwd; resume is continuity-only. Omitted/empty cwd means the caller's own directory. There are no
|
|
1534
1537
|
arbitrary command/env knobs. Do not put secrets in the task — model and task argv are visible to same-user
|
|
1535
1538
|
processes on this host.`,
|
|
1536
1539
|
parameters: Type.Object({
|
|
1537
|
-
backend: StringEnum(["pi", "claude-code", "copilot"], {
|
|
1538
|
-
description: "Which fixed runtime to open. Only these
|
|
1540
|
+
backend: StringEnum(["pi", "claude-code", "copilot", "omp"], {
|
|
1541
|
+
description: "Which fixed runtime to open. Only these four; there is no arbitrary command.",
|
|
1539
1542
|
}),
|
|
1540
1543
|
model: Type.String({
|
|
1541
1544
|
minLength: 1,
|
|
@@ -1559,7 +1562,7 @@ processes on this host.`,
|
|
|
1559
1562
|
}),
|
|
1560
1563
|
async execute(
|
|
1561
1564
|
_toolCallId: string,
|
|
1562
|
-
params: { backend: "pi" | "claude-code" | "copilot"; model: string; task: string; cwd?: string },
|
|
1565
|
+
params: { backend: "pi" | "claude-code" | "copilot" | "omp"; model: string; task: string; cwd?: string },
|
|
1563
1566
|
_signal: AbortSignal | undefined,
|
|
1564
1567
|
_onUpdate: unknown,
|
|
1565
1568
|
_ctx: ExtensionContext,
|
|
@@ -33,10 +33,13 @@
|
|
|
33
33
|
* - external-mcp: never replyable — no authoritative reply address.
|
|
34
34
|
*
|
|
35
35
|
* `origin` stays sender-carrier PROVENANCE, never the citizen identity authority and never a rail.
|
|
36
|
-
* Which rail a meta citizen's reply rides is a SECOND axis — `metaDeliveryDomain
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
36
|
+
* Which rail a meta citizen's reply rides is a SECOND axis — `metaDeliveryDomain`.
|
|
37
|
+
* The caller derives it as three values, never as a native-push-or-self-fetch binary:
|
|
38
|
+
* native-push ← `nativePushSupported(backend)` (the adapter list; NOT wakeMode —
|
|
39
|
+
* `direct-inject` also covers codex/pi, which have no native-push adapter)
|
|
40
|
+
* self-fetch ← `resolveMailboxWakeModeCapability` (the decider's own mailbox seam)
|
|
41
|
+
* none ← neither (omp today: no mailbox drain, no native-push adapter)
|
|
42
|
+
* Fail-closed: an unsupplied domain is not replyable.
|
|
40
43
|
*/
|
|
41
44
|
|
|
42
45
|
import { computeMetaReceiverActive, nativePushDeliverable } from "./entwurf-deliverability.ts";
|
|
@@ -44,7 +47,7 @@ import { computeMetaReceiverActive, nativePushDeliverable } from "./entwurf-deli
|
|
|
44
47
|
export type SelfOrigin = "pi-session" | "meta-session" | "external-mcp";
|
|
45
48
|
|
|
46
49
|
/** Which delivery rail carries a reply back to a meta citizen (the second axis, never `origin`). */
|
|
47
|
-
export type MetaDeliveryDomain = "self-fetch" | "native-push";
|
|
50
|
+
export type MetaDeliveryDomain = "self-fetch" | "native-push" | "none";
|
|
48
51
|
|
|
49
52
|
/**
|
|
50
53
|
* pi control-socket reachability for a reply addressed back to this session.
|
|
@@ -108,9 +111,11 @@ export function computeSelfAddressability(facts: SelfAddressabilityFacts): SelfA
|
|
|
108
111
|
};
|
|
109
112
|
}
|
|
110
113
|
case "meta-session": {
|
|
111
|
-
//
|
|
114
|
+
// THREE rails, pinned apart (보정①). Each branch composes the predicate that OWNS its
|
|
112
115
|
// axis — the mailbox receiver atom and the native-push predicate share nothing, so a
|
|
113
|
-
// mailbox liveness fact can never leak into a backend that has no mailbox.
|
|
116
|
+
// mailbox liveness fact can never leak into a backend that has no mailbox. `none` is
|
|
117
|
+
// the remainder: no inbound rail at all (not an unsupplied domain — that stays the
|
|
118
|
+
// default fail-closed row).
|
|
114
119
|
switch (facts.metaDeliveryDomain) {
|
|
115
120
|
case "native-push": {
|
|
116
121
|
const push = nativePushDeliverable({ recordBacked: facts.recordBacked, probeAlive: facts.probeAlive });
|
|
@@ -136,6 +141,12 @@ export function computeSelfAddressability(facts: SelfAddressabilityFacts): SelfA
|
|
|
136
141
|
reason: recv.active ? `meta receiver active (${recv.reason})` : `meta receiver inactive — ${recv.reason}`,
|
|
137
142
|
};
|
|
138
143
|
}
|
|
144
|
+
case "none":
|
|
145
|
+
return {
|
|
146
|
+
replyable: false,
|
|
147
|
+
socketState: "none",
|
|
148
|
+
reason: "no inbound rail — this backend has no mailbox and no native-push adapter",
|
|
149
|
+
};
|
|
139
150
|
default:
|
|
140
151
|
return {
|
|
141
152
|
replyable: false,
|
|
@@ -57,7 +57,7 @@ import { type NativePushAdapter, resolveNativePushAdapter } from "./native-push/
|
|
|
57
57
|
* exactly the #46 defect on agy, and copilot joined the list only once its own hook wrote one
|
|
58
58
|
* (#82 RAIL 5b). Membership says a marker may EXIST, never that a reply can land: the reply
|
|
59
59
|
* rail is chosen from `nativePushSupported` at the bridge, not from this list. */
|
|
60
|
-
export const META_SENDER_BACKENDS: readonly MetaBackend[] = ["claude-code", "antigravity", "copilot"];
|
|
60
|
+
export const META_SENDER_BACKENDS: readonly MetaBackend[] = ["claude-code", "antigravity", "copilot", "omp"];
|
|
61
61
|
|
|
62
62
|
/** A marker that passed BOTH guards, together with the record that vouches for it. */
|
|
63
63
|
export interface TrustedMetaSender {
|