@junghanacs/entwurf 0.45.0 → 0.51.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.
Files changed (116) hide show
  1. package/AGENTS.md +5 -3
  2. package/BASELINE.md +110 -1
  3. package/CHANGELOG.md +249 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/ENTWURF-CLI.json +1229 -0
  6. package/ENTWURF.json +63 -15
  7. package/FAQ.md +4 -4
  8. package/README.md +132 -188
  9. package/VERIFY.md +18 -11
  10. package/demo/README.md +1 -1
  11. package/docs/acp-backend-rail.md +1 -1
  12. package/docs/external-mcp-host.md +4 -4
  13. package/docs/setup-clean-host.md +94 -22
  14. package/mcp/entwurf-bridge/dist/ENTWURF.json +63 -15
  15. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +19 -8
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +4 -4
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +483 -18
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +50 -5
  23. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
  24. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
  25. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
  26. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
  27. package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
  28. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +30 -15
  29. package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
  30. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
  31. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
  32. package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
  33. package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
  34. package/mcp/entwurf-bridge/src/index.ts +28 -8
  35. package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
  36. package/native/win32-x64/manifest.json +1 -1
  37. package/package.json +16 -20
  38. package/pi/pi-durable/bootstrap.mjs +179 -6
  39. package/pi/pi-durable/carrier/runtime.js +327 -57
  40. package/pi/pi-durable/carrier/session-name.js +11 -0
  41. package/pi/pi-durable/carrier/sessions.js +96 -20
  42. package/pi/pi-durable/carrier/subagent.js +5 -2
  43. package/pi/pi-durable/carrier/tui.js +60 -22
  44. package/pi/pi-durable/overlay/upstream-pin.json +26 -19
  45. package/pi-extensions/lib/entwurf-v2-contract-schema.ts +73 -69
  46. package/pi-extensions/lib/entwurf-v2-contract.ts +4 -4
  47. package/pi-extensions/lib/entwurf-v2-visible-resume.ts +710 -38
  48. package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
  49. package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
  50. package/pi-extensions/lib/herdr-resume-call.ts +810 -0
  51. package/pi-extensions/lib/meta-session.ts +13 -8
  52. package/pi-extensions/lib/mux-resume-call.ts +77 -4
  53. package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
  54. package/pi-extensions/lib/pi-durable-location.ts +446 -0
  55. package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
  56. package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
  57. package/pi-extensions/lib/resume-launch-identity.ts +31 -12
  58. package/pi-extensions/meta-bridge-pi-durable.ts +30 -16
  59. package/run.sh +552 -699
  60. package/scripts/check-claude-launch.ts +341 -0
  61. package/scripts/check-entwurf-v2-contract.ts +4 -4
  62. package/scripts/check-entwurf-v2-surface.ts +2 -2
  63. package/scripts/check-fresh-call-dispatch.ts +70 -9
  64. package/scripts/check-fresh-cut-gate.sh +23 -9
  65. package/scripts/check-gate-qualification.ts +19 -14
  66. package/scripts/check-herdr-activation.ts +301 -23
  67. package/scripts/check-herdr-fresh-call.ts +161 -25
  68. package/scripts/check-herdr-plugin-build.ts +173 -1
  69. package/scripts/check-herdr-plugin.ts +28 -2
  70. package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
  71. package/scripts/check-install-surface.ts +1236 -6
  72. package/scripts/check-meta-doctor-oracle.sh +1 -1
  73. package/scripts/check-meta-facts.ts +20 -1
  74. package/scripts/check-mux-resume-call.ts +28 -0
  75. package/scripts/check-peer-facts.ts +39 -2
  76. package/scripts/cli-help.mjs +222 -0
  77. package/scripts/dev-bin.sh +39 -2
  78. package/scripts/herdr-activation.mjs +28 -6
  79. package/scripts/herdr-operator-link.mjs +389 -0
  80. package/scripts/herdr-plugin-activate.mjs +5 -0
  81. package/scripts/herdr-plugin-deactivate.mjs +18 -5
  82. package/scripts/herdr-rails.mjs +43 -7
  83. package/scripts/herdr-runtime.mjs +27 -0
  84. package/scripts/meta-bridge-fresh-cut.ts +1 -27
  85. package/scripts/meta-bridge-prune.ts +1 -1
  86. package/scripts/meta-facts.ts +1 -1
  87. package/scripts/mutants/agent-guidance.json +4 -4
  88. package/scripts/mutants/claude-launch.json +142 -0
  89. package/scripts/mutants/cli-help-source.json +420 -0
  90. package/scripts/mutants/control-send-receipt.json +1 -1
  91. package/scripts/mutants/dev-gate-dispatch.json +109 -0
  92. package/scripts/mutants/fresh-call-dispatch.json +38 -2
  93. package/scripts/mutants/fresh-cut.json +15 -0
  94. package/scripts/mutants/herdr-activation.json +128 -0
  95. package/scripts/mutants/herdr-fresh-call.json +278 -5
  96. package/scripts/mutants/herdr-operator-link.json +318 -0
  97. package/scripts/mutants/herdr-plugin-build.json +55 -0
  98. package/scripts/mutants/herdr-plugin.json +17 -0
  99. package/scripts/mutants/herdr-resume-call.json +288 -0
  100. package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
  101. package/scripts/mutants/meta-facts.json +15 -0
  102. package/scripts/mutants/mux-resume-call.json +63 -2
  103. package/scripts/mutants/pack-install.json +4 -4
  104. package/scripts/mutants/peer-facts.json +15 -0
  105. package/scripts/mutants/pi-durable.json +1167 -3
  106. package/scripts/mutants/pi-floor.json +22 -5
  107. package/scripts/mutants/source-install.json +35 -0
  108. package/scripts/mutants/v2-surface.json +2 -2
  109. package/scripts/mutants/v2-visible-resume.json +255 -6
  110. package/scripts/peer-facts.ts +1 -1
  111. package/scripts/smoke-agy-install-state.sh +66 -0
  112. package/scripts/smoke-meta-prune.sh +23 -0
  113. package/scripts/smoke-omp-fresh-live.ts +12 -3
  114. package/scripts/smoke-omp-receive-live.ts +7 -1
  115. package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
  116. package/team.json.example +39 -0
@@ -47,6 +47,7 @@ export function piDurableLayoutAt(root) {
47
47
  adapter: path.join(dist, "pi-extensions", "meta-bridge-pi-durable.js"),
48
48
  bridgeEntry: path.join(dist, "mcp", "entwurf-bridge", "src", "index.js"),
49
49
  deliverability: path.join(dist, "pi-extensions", "lib", "entwurf-deliverability.js"),
50
+ ownerFence: path.join(dist, "pi-extensions", "lib", "pi-durable-owner-fence.js"),
50
51
  };
51
52
  }
52
53
  /**
@@ -10,13 +10,15 @@
10
10
  * must equal `record.nativeSessionId`, an addressable read (#52) rather than a plain targeted one,
11
11
  * a recorded ACP provider must resolve its bridge.
12
12
  *
13
- * The domain is pi and claude-code (#147 L2). Both own their transcript and re-attach to the same
14
- * record when their native session reopens; this leaf only names that session. For pi it reads
15
- * the transcript header (the launch needs its provider/model/cwd). For claude-code it reads no
16
- * transcript at all — the vendor owns it, and `claude --resume <id>` needs nothing from it — and
17
- * checks only that the recorded path is an absolute file that still exists. Every other backend
18
- * is a named refusal: native-push citizens have no resume authority (AGENTS Hard Rule 10), and a
19
- * durable host is not reopened through Entwurf.
13
+ * The domain is pi and claude-code (#147 L2), and pi-durable (#157 B3). Each owns its transcript
14
+ * and re-attaches to the same record when its native session reopens; this leaf only names that
15
+ * session. For pi it reads the transcript header (the launch needs its provider/model/cwd). For
16
+ * claude-code it reads no transcript at all — the vendor owns it, and `claude --resume <id>` needs
17
+ * nothing from it — and checks only that the recorded path is an absolute file that still exists.
18
+ * For pi-durable it reads nothing beyond the record: the parent's reservation re-reads the record
19
+ * and its location inside its own holds, and the launched child selects its session from the record
20
+ * itself, so this leaf only says WHICH backend the address names. Every other backend is a named
21
+ * refusal: native-push citizens have no resume authority (AGENTS Hard Rule 10).
20
22
  *
21
23
  * It takes a bare garden id, not a plan: the plan type it used to destructure belonged to
22
24
  * the removed transport, and the identity question never needed the rest of it.
@@ -27,7 +29,7 @@ import { AcpModelNotCuratedError, isCuratedAcpModelId, PROVIDER_ID } from "./acp
27
29
  import { getEntwurfExplicitExtensions, readSessionIdentity } from "./entwurf-core.js";
28
30
  import { readAddressableMetaIdentity } from "./meta-session.js";
29
31
  /** The backends with a visible same-id resume. A closed set: nothing outside it is reopened. */
30
- export const RESUME_BACKENDS = ["pi", "claude-code"];
32
+ export const RESUME_BACKENDS = ["pi", "claude-code", "pi-durable"];
31
33
  /**
32
34
  * One of the TWO expected refusals on this leaf: the target is a citizen of a backend that has no
33
35
  * same-id resume at all. The other is `AcpModelNotCuratedError` (#128, `acp/model-ids.js`).
@@ -38,8 +40,7 @@ export const RESUME_BACKENDS = ["pi", "claude-code"];
38
40
  * except by looking. A Claude Code or agy garden id is different in kind: nothing is broken,
39
41
  * the operator simply asked a capability boundary to do something it does not cover, and the
40
42
  * honest answer is a named refusal rather than an error report about a store that is fine. Since
41
- * #147 L2 the boundary is `RESUME_BACKENDS`; a Codex, agy, Copilot, OMP or pi-durable garden id is
42
- * this refusal.
43
+ * #147 L2 the boundary is `RESUME_BACKENDS`; a Codex, agy, Copilot or OMP garden id is this refusal.
43
44
  *
44
45
  * It carries a `reason` so the caller matches on a FIELD. Parsing the message string would make
45
46
  * the wording load-bearing, and re-reading the record to ask "was it pi?" would read an address
@@ -50,7 +51,7 @@ export class ResumeBackendUnsupportedError extends Error {
50
51
  backend;
51
52
  constructor(gardenId, backend) {
52
53
  super(`resume-launch-identity: ${gardenId} is a ${backend} citizen — same-id resume is a host-adapter relaunch ` +
53
- `capability, and its domain is ${RESUME_BACKENDS.join(" and ")}. ` +
54
+ `capability, and its domain is ${RESUME_BACKENDS.join(", ")}. ` +
54
55
  `This is a capability boundary, not citizen rank.`);
55
56
  this.name = "ResumeBackendUnsupportedError";
56
57
  this.backend = backend;
@@ -128,6 +129,12 @@ export function resolveResumeLaunchIdentity(gardenId) {
128
129
  const record = readAddressableMetaIdentity(gardenId);
129
130
  if (record.backend === "claude-code")
130
131
  return resolveClaudeCodeLaunchIdentity(gardenId, record);
132
+ if (record.backend === "pi-durable") {
133
+ if (!path.isAbsolute(record.cwd)) {
134
+ throw new Error(`resume-launch-identity: ${gardenId} records a relative cwd ${JSON.stringify(record.cwd)}.`);
135
+ }
136
+ return { backend: "pi-durable", nativeSessionId: record.nativeSessionId, cwd: record.cwd };
137
+ }
131
138
  if (record.backend !== "pi") {
132
139
  throw new ResumeBackendUnsupportedError(gardenId, record.backend);
133
140
  }
@@ -10,7 +10,8 @@
10
10
  * createPiDurableContact({ bridgeEntry })
11
11
  * .extension tools-only durable Extension, handed to the overlay's
12
12
  * `openDurable({ extensions })` BEFORE the Harness opens
13
- * .attach(session) once `openDurable` returns: upsert the record, name this process as
13
+ * .attach(session) once `openDurable` returns: commit the record's binding and its
14
+ * location evidence (`lib/pi-durable-location.ts`), name this process as
14
15
  * sender, spawn the compiled entwurf-bridge as a DIRECT child, then
15
16
  * release the tools
16
17
  *
@@ -93,17 +94,21 @@
93
94
  * refusal.
94
95
  *
95
96
  * CALLER FRESH (the sixth tool). `entwurf_fresh_call` lets this durable citizen open a sibling, under the
96
- * bridge's own schema (pinned below, including the `pi-durable` backend itself). The bridge places it
97
- * beside the tmux pane this host was launched in, which a fresh-opened durable host inherits; an
98
- * operator host started outside tmux gets the bridge's named `no-tmux-context` refusal. Exposing the
99
- * tool is not a caller LIVE proof.
97
+ * bridge's own schema (pinned below, including the `pi-durable` backend itself). Outside herdr, the bridge
98
+ * places it beside the tmux pane this host was launched in, which a fresh-opened durable host inherits,
99
+ * and an operator host started outside tmux gets the bridge's named `no-tmux-context` refusal. Inside
100
+ * herdr (`HERDR_ENV=1`, which the bridge child inherits from this host) it requests a new herdr tab
101
+ * instead, for pi, claude-code or pi-durable only; the other backends are refused by name, and nothing
102
+ * falls back to tmux. Exposing the tool is not a caller LIVE proof.
100
103
  *
101
104
  * CALLER RESUME (the seventh tool, #147 L1). `entwurf_resume_call` lets this durable citizen reopen a
102
- * DORMANT pi or Claude Code citizen under its own garden id (#147 L2), under the bridge's own
103
- * single-`target` schema (pinned below). The bridge decides everything else from the target's record,
104
- * exactly as for any other caller: other backends have no same-id resume, a live target is refused,
105
- * and the window opens in the tmux session this host was launched in. Exposing the tool names no new authority and is not a caller LIVE
106
- * proof; it never resumes this durable host itself.
105
+ * DORMANT pi, pi-durable or Claude Code citizen under its own garden id (#147 L2; pi-durable since
106
+ * #157 B3), under the bridge's own single-`target` schema (pinned below). The bridge decides everything
107
+ * else from the target's record, exactly as for any other caller: other backends have no same-id
108
+ * resume, a session a live process holds is refused, and outside herdr the window opens in the tmux
109
+ * session this host was launched in. Inside herdr a pi, pi-durable or Claude Code target reopens, in a
110
+ * new herdr tab (Claude Code since #157 stage 4). Exposing the tool names no new authority and is not a caller LIVE proof; it never resumes
111
+ * this durable host itself.
107
112
  *
108
113
  * NOT HERE: crash-safe receive. `entwurf_inbox_read` archives a body before the durable tool
109
114
  * result commits, so a crash between the two loses that body to the model; recovery settles the
@@ -115,7 +120,8 @@ import * as path from "node:path";
115
120
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
116
121
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
117
122
  import { ENTWURF_TOOL_GUIDANCE } from "./lib/agent-guidance.js";
118
- import { defaultMetaMailboxDir, defaultMetaReceiversDir, defaultMetaSendersDir, defaultMetaSessionsDir, listAllMetaIdentitiesDir, readAddressableMetaIdentity, readMetaReceiverMarker, readMetaSenderMarker, requireGardenId, upsertMetaSession, writeMetaReceiverMarker, writeMetaSenderMarker, } from "./lib/meta-session.js";
123
+ import { defaultMetaMailboxDir, defaultMetaReceiversDir, defaultMetaSendersDir, defaultMetaSessionsDir, listAllMetaIdentitiesDir, readAddressableMetaIdentity, readMetaReceiverMarker, readMetaSenderMarker, requireGardenId, writeMetaReceiverMarker, writeMetaSenderMarker, } from "./lib/meta-session.js";
124
+ import { commitPiDurableBirth } from "./lib/pi-durable-location.js";
119
125
  /** The backend id this contact mints under. */
120
126
  export const PI_DURABLE_BACKEND = "pi-durable";
121
127
  /**
@@ -848,9 +854,18 @@ export function createPiDurableContact(options) {
848
854
  }
849
855
  const ownerPid = options.ownerPid ?? process.pid;
850
856
  const sendersDir = path.resolve(options.sendersDir ?? defaultMetaSendersDir());
851
- const upsert = upsertMetaSession({
852
- input: { backend: PI_DURABLE_BACKEND, nativeSessionId: id, cwd, model: null, transcriptPath: null },
853
- dir: options.sessionsDir ?? defaultMetaSessionsDir(),
857
+ const receiversDir = path.resolve(options.receiversDir ?? defaultMetaReceiversDir());
858
+ // The record and its location evidence, bound by one minted attachIncarnation under the
859
+ // record-arm lock of the receivers root this birth uses. A refusal here fails the birth;
860
+ // there is no unbound fallback. The pair is not one atomic commit: see the leaf's
861
+ // FAILURE STATES for what each failure leaves behind.
862
+ const upsert = commitPiDurableBirth({
863
+ nativeSessionId: id,
864
+ cwd,
865
+ sessionDirectory: session.directory,
866
+ ownerPid,
867
+ sessionsDir: options.sessionsDir ?? defaultMetaSessionsDir(),
868
+ receiversDir,
854
869
  });
855
870
  const gardenId = upsert.record.gardenId;
856
871
  const markerPath = writeMetaSenderMarker({
@@ -865,7 +880,7 @@ export function createPiDurableContact(options) {
865
880
  sessionsDir: upsert.dir,
866
881
  sendersDir,
867
882
  mailboxDir: path.resolve(options.mailboxDir ?? defaultMetaMailboxDir()),
868
- receiversDir: path.resolve(options.receiversDir ?? defaultMetaReceiversDir()),
883
+ receiversDir,
869
884
  };
870
885
  const client = await connect({
871
886
  command: process.execPath,
@@ -30,30 +30,58 @@
30
30
  * `--kind` token) stays with the rail that spends it; this leaf carries no argv.
31
31
  */
32
32
  /**
33
- * The closed pilot set for the herdr launch rail. Herdr's own `--kind` enum is much larger and
34
- * that is not evidence of support: every other backend is a named pre-mutation reject.
33
+ * The backends the herdr rail opens through `tab create` + `agent start --kind`. Herdr's own
34
+ * `--kind` enum is much larger and that is not evidence of support. This set alone keys the
35
+ * agent-start maps (`HERDR_AGENT_KIND`, `HERDR_CANONICAL_EXECUTABLE`): a backend outside it has no
36
+ * herdr kind, and giving it one would start a different program under its name.
35
37
  *
36
38
  * The JSDoc cast is what keeps the TYPE half of this single source honest. Without it TypeScript
37
- * infers `readonly string[]` from a `.mjs` file and `HerdrFreshCallBackend` silently widens to
39
+ * infers `readonly string[]` from a `.mjs` file and `HerdrAgentStartBackend` silently widens to
38
40
  * `string` — the tuple would still be one source at runtime while the compiler had stopped
39
41
  * checking anything. A gate pins both halves.
40
42
  *
41
43
  * @type {readonly ["pi", "claude-code"]}
42
44
  */
43
- export const HERDR_FRESH_CALL_BACKENDS = Object.freeze(["pi", "claude-code"]);
45
+ export const HERDR_AGENT_START_BACKENDS = Object.freeze(["pi", "claude-code"]);
46
+ /**
47
+ * The backends the herdr rail opens through ONE fixed `layout.apply` request on the caller's own
48
+ * herdr socket (#157 A-L1). pi-durable has no herdr agent kind, so it is launched as the package's
49
+ * own verified `run.sh pi-durable …` argv vector in a new tab — never disguised as `--kind pi`.
50
+ *
51
+ * @type {readonly ["pi-durable"]}
52
+ */
53
+ export const HERDR_LAYOUT_LAUNCH_BACKENDS = Object.freeze(["pi-durable"]);
54
+ /**
55
+ * Everything `entwurf_fresh_call` actually opens inside herdr: the union of the two launch domains.
56
+ * Admission and refusal read THIS set, so every backend outside it is a named pre-mutation reject
57
+ * and no backend is admitted by one domain while another surface says it is refused.
58
+ *
59
+ * The status pane's RAILS block renders the two domains as separate groups — agent start, then
60
+ * layout — over this aggregate (#157 A-L2). The install narration covers only the integrations it
61
+ * activated, and pi-durable is never one: it has no herdr agent integration to activate.
62
+ *
63
+ * @type {readonly ["pi", "claude-code", "pi-durable"]}
64
+ */
65
+ export const HERDR_FRESH_CALL_BACKENDS = Object.freeze([
66
+ ...HERDR_AGENT_START_BACKENDS,
67
+ ...HERDR_LAYOUT_LAUNCH_BACKENDS,
68
+ ]);
44
69
  /**
45
70
  * ONE model string per backend, and it is an example of SYNTAX, never of choice.
46
71
  *
47
72
  * `[관측: GLG, 날것 PC, 2026-09-17]` "일단 정확한 모델명을 모른다" — after a green install the first
48
73
  * thing missing is a call that works, and the two runtimes spell a model differently enough that
49
74
  * guessing fails: pi wants a provider-qualified path, Claude Code wants the vendor id alone.
50
- * That difference is the whole content of this map.
75
+ * That difference is the whole content of this map. pi-durable takes pi's shape — its preflight
76
+ * refuses a model that is not provider-qualified (`pi-durable-model-not-provider-qualified`) — so its
77
+ * example is the same shape string, not a choice of model.
51
78
  *
52
- * @type {Readonly<Record<"pi" | "claude-code", string>>}
79
+ * @type {Readonly<Record<"pi" | "claude-code" | "pi-durable", string>>}
53
80
  */
54
81
  export const MODEL_SYNTAX_EXAMPLE = Object.freeze({
55
82
  pi: "openai-codex/gpt-5.6-terra",
56
83
  "claude-code": "claude-sonnet-5",
84
+ "pi-durable": "openai-codex/gpt-5.6-terra",
57
85
  });
58
86
  /**
59
87
  * How a citizen on each backend is REACHED once it exists, in the operator's words. This is the
@@ -64,9 +92,14 @@ export const MODEL_SYNTAX_EXAMPLE = Object.freeze({
64
92
  * citizen pi: the install says green, `pi` starts, and nothing is there. Citizenship is argv-gated
65
93
  * on purpose, and that gate is invisible unless something says it out loud.
66
94
  *
67
- * @type {Readonly<Record<"pi" | "claude-code", string>>}
95
+ * pi-durable's note says what it is NOT here as much as how it is reached: it is not an integration
96
+ * this plugin activates, and herdr has no agent kind for it, so nothing detects it or associates a
97
+ * session with it.
98
+ *
99
+ * @type {Readonly<Record<"pi" | "claude-code" | "pi-durable", string>>}
68
100
  */
69
101
  export const RAIL_ENTRY_NOTE = Object.freeze({
70
102
  pi: "start it as `pi --entwurf-control` to be a garden citizen — a plain `pi` loads the extension but has no garden id, no control socket and no entwurf tools",
71
103
  "claude-code": "nothing to add — an ordinary `claude` picks up the entwurf tools through MCP",
104
+ "pi-durable": "not a Herdr integration this plugin activates — inside Herdr, `entwurf_fresh_call` opens it in a new tab through ONE layout request; Herdr has no agent kind for it, so it is neither detected nor associated with a session, and its peers placement reads unobserved",
72
105
  });
@@ -111,33 +111,7 @@ import { classifyMarkerOwner, defaultMetaMailboxDir, defaultMetaReceiversDir, de
111
111
  import { resolveNativePushAdapter } from "../pi-extensions/lib/native-push/adapter.js";
112
112
  import { probeSocketLiveness } from "../pi-extensions/lib/socket-probe.js";
113
113
  function usage(code) {
114
- console.error([
115
- "usage: node --experimental-strip-types scripts/meta-bridge-fresh-cut.ts",
116
- " (dev clone: `./run.sh meta-bridge-fresh-cut` · installed package: `entwurf meta-bridge-fresh-cut`)",
117
- "",
118
- " Open a fresh meta-bridge generation: quiesce-check every live surface, then",
119
- " archive meta-sessions/ + meta-mailbox/ to `<dir>.archive-<timestamp>` siblings,",
120
- " clear dead sender/receiver markers and dead control sockets, and open empty",
121
- " live dirs. No migration, no restore: the archive is forensic bytes only.",
122
- "",
123
- "store = ENTWURF_META_SESSIONS_DIR || <PI_CODING_AGENT_DIR|~/.pi/agent>/meta-sessions",
124
- "mailbox = ENTWURF_META_MAILBOX_DIR || <PI_CODING_AGENT_DIR|~/.pi/agent>/meta-mailbox",
125
- "sockets = ENTWURF_DIR || ~/.pi/entwurf-control",
126
- "",
127
- "EXIT CONTRACT (#54) — what already moved, not how bad it was:",
128
- ` ${FRESH_CUT_EXIT.COMPLETE} cut complete: generation archived (or none existed), fresh v3 store open,`,
129
- " residue cleared. `&& setup` is correct here.",
130
- ` ${FRESH_CUT_EXIT.NO_MOVE} NOTHING MOVED: a live/unprovable surface, an occupied archive destination,`,
131
- " an unreadable surface, or a first rename that failed. The host is unchanged —",
132
- " fix the named cause and re-run. Do NOT run setup: the store it refused is still there.",
133
- ` ${FRESH_CUT_EXIT.USAGE} usage.`,
134
- ` ${FRESH_CUT_EXIT.HALF_CUT} CUT TRANSITION INCOMPLETE: at least one archive move happened,`,
135
- " but the fresh generation is not confirmed open. Inspect, or re-run to finish under a new stamp.",
136
- ` ${FRESH_CUT_EXIT.CLEANUP_INCOMPLETE} CUT COMPLETE, CLEANUP INCOMPLETE: the generation IS archived and the fresh`,
137
- " generation IS open — install and citizen birth are unblocked, so setup may run —",
138
- " but marker/socket residue survived. Prefer fixing it and re-running BEFORE setup; after new citizen birth,",
139
- " remove the named residue manually instead of archiving the new generation with another cut.",
140
- ].join("\n"));
114
+ console.error("meta-bridge-fresh-cut: see `entwurf help meta-bridge-fresh-cut` (from that checkout's root: `./run.sh help meta-bridge-fresh-cut`)");
141
115
  process.exit(code);
142
116
  }
143
117
  /** Denote-style local timestamp for archive dir names. */
@@ -27,7 +27,7 @@ function shellQuote(s) {
27
27
  return `'${s.replace(/'/g, "'\\''")}'`;
28
28
  }
29
29
  function usage(code) {
30
- console.error("usage: node --experimental-strip-types scripts/meta-bridge-prune.ts [meta-sessions-dir] [--ttl-days N]");
30
+ console.error("meta-bridge-prune: see `entwurf help meta-bridge-prune` (from that checkout's root: `./run.sh help meta-bridge-prune`)");
31
31
  process.exit(code);
32
32
  }
33
33
  let dirArg;
@@ -37,7 +37,7 @@ const arg = process.argv[2];
37
37
  // A dash argv is a flag this command does not have, not a store directory — treating
38
38
  // it as a path would answer `--help` with "empty store, exit 0", a silent wrong fact.
39
39
  if (process.argv.length > 3 || (arg !== undefined && arg.startsWith("-"))) {
40
- console.error("usage: entwurf meta-facts [meta-sessions-dir]");
40
+ console.error("meta-facts: see `entwurf help meta-facts` (from that checkout's root: `./run.sh help meta-facts`)");
41
41
  process.exit(2);
42
42
  }
43
43
  let facts;
@@ -77,7 +77,7 @@ const arg = process.argv[2];
77
77
  // A dash argv is a flag this command does not have, not a store directory — treating it as
78
78
  // a path would answer `--help` with "empty store, exit 0", a silent wrong fact.
79
79
  if (process.argv.length > 3 || (arg !== undefined && arg.startsWith("-"))) {
80
- console.error("usage: entwurf peer-facts [meta-sessions-dir]");
80
+ console.error("peer-facts: see `entwurf help peer-facts` (from that checkout's root: `./run.sh help peer-facts`)");
81
81
  process.exit(2);
82
82
  }
83
83
  const storeDir = arg ?? defaultMetaSessionsDir();
@@ -31,9 +31,10 @@
31
31
  * seat, #105; nothing is ever created), optionally at ONE literal requested
32
32
  * cwd (cross-repo fresh, #73); returns a LAUNCH receipt only, and the new
33
33
  * address arrives later as the sender envelope of the sibling's nonce callback.
34
- * - entwurf_resume_call — reopen ONE DORMANT pi or Claude Code citizen under its OWN garden id
35
- * in a visible window; target-only, submits no prompt, LAUNCH and OBSERVATION
36
- * receipts stay apart, the caller is attributed but grants nothing.
34
+ * - entwurf_resume_call — reopen ONE DORMANT pi, pi-durable or Claude Code citizen under its OWN
35
+ * garden id in a visible window or herdr tab; target-only, submits no prompt,
36
+ * LAUNCH and OBSERVATION receipts stay apart, the caller is attributed but
37
+ * grants nothing.
37
38
  * - entwurf_retire_call — one operator-requested target, one retirement attempt; actor is not
38
39
  * permission, and action / append-record / lock-release receipts stay separate.
39
40
  * - entwurf_callback — ZERO-ARGUMENT fresh-sibling callback. Reads ENTWURF_CALLBACK_TARGET +
@@ -90,7 +91,11 @@ import {
90
91
  type VisibleResumeDeps,
91
92
  visibleResume,
92
93
  } from "../../../pi-extensions/lib/entwurf-v2-visible-resume.ts";
93
- import { dispatchFreshCall, renderDispatchedFreshCall } from "../../../pi-extensions/lib/fresh-call-dispatch.ts";
94
+ import {
95
+ dispatchFreshCall,
96
+ dispatchResumeLaunch,
97
+ renderDispatchedFreshCall,
98
+ } from "../../../pi-extensions/lib/fresh-call-dispatch.ts";
94
99
  import {
95
100
  type CodexRequestSender,
96
101
  probeNativeSenderAlive,
@@ -111,7 +116,11 @@ import {
111
116
  readMetaSenderMarker,
112
117
  requireBackend,
113
118
  } from "../../../pi-extensions/lib/meta-session.ts";
114
- import { RESUME_CALL_REJECT_HINT, resumeCall } from "../../../pi-extensions/lib/mux-resume-call.ts";
119
+ import {
120
+ RESUME_CALL_REJECT_HINT,
121
+ resumeCall,
122
+ resumePiDurableCall,
123
+ } from "../../../pi-extensions/lib/mux-resume-call.ts";
115
124
  import { registerNativeConversation } from "../../../pi-extensions/lib/native-push/register.ts";
116
125
  import {
117
126
  makeLocalTraceFact,
@@ -750,12 +759,23 @@ server.tool(
750
759
  // halves, so it is where the mux launcher is handed to the v2 composition. `entwurf-v2-visible-
751
760
  // resume` cannot open a window on its own and `mux-resume-call` cannot read a record — that is
752
761
  // the import fence in docs/mux-launch-rail.md §11, expressed as a function argument.
753
- const visibleResumeLaunch: VisibleResumeDeps["launch"] = (input) => {
754
- const launched = resumeCall({ backend: input.backend, cwd: input.cwd, runtimeArgs: input.runtimeArgs });
762
+ //
763
+ // #157 G1a: this surface does NOT choose the rail. It hands the fixed tmux mapping below to the
764
+ // shared rail root (`fresh-call-dispatch`), which reads the same capability fact fresh_call reads
765
+ // and, inside herdr, launches the herdr resume instead — never calling this mapping there.
766
+ //
767
+ // #157 B3: a pi-durable resume is the same leaf's second entry, which also carries the fixed adopt
768
+ // projection the v2 side built from its reservation; no other backend can hand it one.
769
+ const tmuxResumeLaunch: VisibleResumeDeps["launch"] = (input) => {
770
+ const launched =
771
+ input.backend === "pi-durable"
772
+ ? resumePiDurableCall({ cwd: input.cwd, runtimeArgs: input.runtimeArgs, adoptEnv: input.piDurableAdoptEnv })
773
+ : resumeCall({ backend: input.backend, cwd: input.cwd, runtimeArgs: input.runtimeArgs });
755
774
  return launched.ok
756
- ? { ok: true, handle: launched.receipt }
775
+ ? { ok: true, handle: { rail: "tmux", ...launched.receipt } }
757
776
  : { ok: false, reason: launched.reason, hint: RESUME_CALL_REJECT_HINT[launched.reason] };
758
777
  };
778
+ const visibleResumeLaunch: VisibleResumeDeps["launch"] = (input) => dispatchResumeLaunch(input, tmuxResumeLaunch);
759
779
 
760
780
  server.tool(
761
781
  "entwurf_resume_call",
@@ -153,6 +153,11 @@
153
153
  // standalone compiled adapter consumer proof. Its helper is not TS: the
154
154
  // build script byte-copies pi-extensions/lib/cc-retire-pidfd.py beside the emitted adapter.
155
155
  // Its repo imports (meta-session, entwurf-v2-visible-resume) are ALREADY emitted for the bridge.
156
+ // WHY pi-durable-owner-fence rides THIS build (#157 B3): the packaged durable bootstrap builds the owner
157
+ // fence from THIS closure and hands it to every owned open, so an installed Entwurf never imports checkout
158
+ // TypeScript. Nothing in the bridge graph imports it, so it needs its own entry. Its only repo import is
159
+ // meta-session.ts, ALREADY emitted for the bridge: ONE leaf JS, ZERO new deps. It is never in index.ts's boot
160
+ // closure.
156
161
  "include": [
157
162
  "./src/index.ts",
158
163
  "../../protocol.js",
@@ -177,6 +182,7 @@
177
182
  "../../pi-extensions/meta-bridge-pi-durable.ts",
178
183
  "../../pi-extensions/lib/cc-retire-request.ts",
179
184
  // Keep the standalone Pi adapter consumer entry; the public factory also reaches it now.
180
- "../../pi-extensions/lib/pi-retire-request.ts"
185
+ "../../pi-extensions/lib/pi-retire-request.ts",
186
+ "../../pi-extensions/lib/pi-durable-owner-fence.ts"
181
187
  ]
182
188
  }
@@ -12,7 +12,7 @@
12
12
  "windowsTargetPlatformVersion": "10.0.26100.0",
13
13
  "visualStudio": {
14
14
  "displayName": "Visual Studio Enterprise 2026",
15
- "installationVersion": "18.11.12315.225"
15
+ "installationVersion": "18.11.12328.437"
16
16
  }
17
17
  },
18
18
  "source": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@junghanacs/entwurf",
3
- "version": "0.45.0",
4
- "description": "Visible sibling sessions across independent agent harnesses: launch in Herdr or tmux, retire on request and reopen pi or Claude Code in tmux, and deliver messages by garden id; native bridges and Claude/Cortex ACP adapters.",
3
+ "version": "0.51.0",
4
+ "description": "Visible sibling sessions across independent agent harnesses: launch in Herdr or tmux, retire on request, visibly reopen supported sessions under the same id, and deliver messages by garden id; native bridges and Claude/Cortex ACP adapters.",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "Junghan Kim",
@@ -40,6 +40,8 @@
40
40
  "type": "module",
41
41
  "files": [
42
42
  "ENTWURF.json",
43
+ "ENTWURF-CLI.json",
44
+ "team.json.example",
43
45
  "protocol.js",
44
46
  "pi-extensions/",
45
47
  "native/win32-x64/",
@@ -103,23 +105,21 @@
103
105
  "@agentclientprotocol/claude-agent-acp": "0.90.0",
104
106
  "@agentclientprotocol/sdk": "1.8.0",
105
107
  "@anthropic-ai/sdk": "0.100.1",
106
- "@earendil-works/chord": "1.4.0",
107
- "@earendil-works/pi-agent-core": "1.4.0",
108
- "@earendil-works/pi-ai": "1.4.0",
109
- "@earendil-works/pi-codemode": "1.4.0",
110
- "@earendil-works/pi-coding-agent": "1.4.0",
111
- "@earendil-works/pi-durable": "1.4.0",
112
- "@earendil-works/pi-mcp": "1.4.0",
113
- "@earendil-works/pi-telemetry": "1.4.0",
114
- "@earendil-works/pi-tui": "1.4.0",
108
+ "@earendil-works/chord": "1.5.0",
109
+ "@earendil-works/pi-agent-core": "1.5.0",
110
+ "@earendil-works/pi-ai": "1.5.0",
111
+ "@earendil-works/pi-codemode": "1.5.0",
112
+ "@earendil-works/pi-coding-agent": "1.5.0",
113
+ "@earendil-works/pi-durable": "1.5.0",
114
+ "@earendil-works/pi-mcp": "1.5.0",
115
+ "@earendil-works/pi-schema": "1.5.0",
116
+ "@earendil-works/pi-telemetry": "1.5.0",
117
+ "@earendil-works/pi-tui": "1.5.0",
115
118
  "@modelcontextprotocol/sdk": "^1.12.1",
116
119
  "proper-lockfile": "4.1.2",
117
120
  "smol-toml": "^1.8.0",
118
121
  "zod": "^3.25.0 || ^4.0.0"
119
122
  },
120
- "peerDependencies": {
121
- "typebox": "*"
122
- },
123
123
  "devDependencies": {
124
124
  "@biomejs/biome": "^2.4.13",
125
125
  "@types/node": "^24.3.0",
@@ -159,6 +159,7 @@
159
159
  "check-copilot-statusline": "./run.sh check-copilot-statusline",
160
160
  "check-copilot-launch": "./run.sh check-copilot-launch",
161
161
  "check-pi-launch": "./run.sh check-pi-launch",
162
+ "check-claude-launch": "./run.sh check-claude-launch",
162
163
  "smoke-copilot-statusline-state": "./run.sh smoke-copilot-statusline-state",
163
164
  "smoke-copilot-mcp-state": "./run.sh smoke-copilot-mcp-state",
164
165
  "smoke-omp-bridge-state": "./run.sh smoke-omp-bridge-state",
@@ -199,7 +200,7 @@
199
200
  "check:toolchain": "pnpm lint && pnpm typecheck",
200
201
  "check:vitest": "./run.sh check-mux-fresh-call && ./run.sh check-acp-sdk-surface && ./run.sh check-pi-queue-oracle && ./run.sh check-tests-beside-behavior && ./run.sh check-remote-pair-installed-audit && ./run.sh check-chain-terminus-publication",
201
202
  "check:contracts": "./run.sh check-demo-reproducibility && ./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-send && ./run.sh check-entwurf-v2-runner && ./run.sh check-control-send-receipt && ./run.sh check-control-retire && ./run.sh check-pi-retire-request && ./run.sh check-cc-retire-pidfd && ./run.sh check-cc-retire-request && ./run.sh check-retirement-event && ./run.sh check-entwurf-v2-retire && ./run.sh check-compaction-send-guard && ./run.sh check-entwurf-resume-args && ./run.sh check-entwurf-v2-native-push && ./run.sh check-entwurf-v2-production && ./run.sh check-entwurf-v2-surface && ./run.sh check-entwurf-bridge-pi-free && ./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-control-socket-path && ./run.sh check-win32-preview && ./run.sh check-pack-win32-carrier && ./run.sh check-meta-listing && ./run.sh check-entwurf-fact-provider && ./run.sh check-herdr-placement && ./run.sh check-herdr-fresh-call && ./run.sh check-herdr-supply && ./run.sh check-fresh-call-dispatch && ./run.sh check-fresh-call-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-native-push-paused && ./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-acp-foreground-only && ./run.sh check-acp-set-model-readback && ./run.sh check-acp-vendor-rejection && ./run.sh check-codex-sender-identity && ./run.sh check-codex-native-push && ./run.sh check-agent-guidance-beside && ./run.sh check-pi-durable-beside && ./run.sh check-pi-durable-carrier && ./run.sh check-pi-durable-native-module && ./run.sh check-remote-pair-beside",
202
- "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-pi-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-peer-facts && ./run.sh check-herdr-plugin && ./run.sh check-herdr-plugin-profile && ./run.sh check-herdr-plugin-build && ./run.sh check-herdr-runtime-bootstrap && ./run.sh check-herdr-activation && ./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-typing-call-fence && ./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-pi-bridge-sender && ./run.sh check-pi-mcp-register && ./run.sh check-pi-mcp-bridge && ./run.sh check-codex-birth-hook && ./run.sh smoke-codex-config-state && ./run.sh smoke-codex-birth && ./run.sh check-herdr-sandbox",
203
+ "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-pi-launch && ./run.sh check-claude-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-peer-facts && ./run.sh check-herdr-plugin && ./run.sh check-herdr-plugin-profile && ./run.sh check-herdr-plugin-build && ./run.sh check-herdr-runtime-bootstrap && ./run.sh check-herdr-activation && ./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-typing-call-fence && ./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-pi-bridge-sender && ./run.sh check-pi-mcp-register && ./run.sh check-pi-mcp-bridge && ./run.sh check-codex-birth-hook && ./run.sh smoke-codex-config-state && ./run.sh smoke-codex-birth && ./run.sh check-herdr-sandbox",
203
204
  "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-pack-argv-matcher && ./run.sh check-pack-consumer-roots && ./run.sh check-package-source-routing && ./run.sh check-install-preflight && ./run.sh check-pack"
204
205
  },
205
206
  "pi": {
@@ -217,10 +218,5 @@
217
218
  "entwurf-agy-statusline": "./scripts/agy-statusline.sh",
218
219
  "entwurf-agy-imprint": "./scripts/agy-imprint.sh",
219
220
  "entwurf-copilot-statusline": "./scripts/copilot-statusline.sh"
220
- },
221
- "peerDependenciesMeta": {
222
- "typebox": {
223
- "optional": true
224
- }
225
221
  }
226
222
  }