@miraland-labs/conduit-bridge 0.9.10 → 0.9.11

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Local Bridge CLI for [Conduit](https://github.com/miralandlabs/conduit). Connects a computer to one organization, claims work, and drives a local agent.
4
4
 
5
- **Package version:** `0.9.10` — heartbeat protocol 2 requires a clean workspace plus a ready, versioned driver lane before dispatch. Cursor assignments with `external_network` allow-list `WebFetch(*)` so headless fetches are not auto-rejected. Attempt worktrees fetch/start from the initiative base when the source tip is behind or history was rewritten, without resetting the source checkout. Also includes **ops** helpers for macOS / Linux / Windows, LaunchAgent/systemd **PATH** for `~/.local/bin`, disconnect/disengage, multi-driver lanes, shared slots **1–4**, worktrees, and optional `--ensure-checkout`. Protocol 1 heartbeats remain compatible for presence but cannot receive work.
5
+ **Package version:** `0.9.11` — heartbeat protocol 2 requires a clean workspace plus a ready, versioned driver lane before dispatch. Cursor assignments with `external_network` allow-list `WebFetch(*)` and pass `--force` (required for headless fetch); research-only networked runs also deny `Shell(*)` / `Write(**)`. Attempt worktrees fetch/start from the initiative base when the source tip is behind or history was rewritten, without resetting the source checkout. Also includes **ops** helpers for macOS / Linux / Windows, LaunchAgent/systemd **PATH** for `~/.local/bin`, disconnect/disengage, multi-driver lanes, shared slots **1–4**, worktrees, and optional `--ensure-checkout`. Protocol 1 heartbeats remain compatible for presence but cannot receive work.
6
6
 
7
7
  ## Prerequisites
8
8
 
package/dist/driver.js CHANGED
@@ -440,10 +440,12 @@ export const codexDriver = {
440
440
  * Current Cursor Agent schema accepts only `permissions.{allow,deny}` (no
441
441
  * `version` / `approvalMode`). Outside the allow list is denied without --force.
442
442
  *
443
- * `external_network` maps to WebFetch(*) without it, headless `-p` runs get
444
- * "User Rejected" on every fetch (no interactive approval). Deliberately not
445
- * `--force`/`--yolo`: that would also auto-allow unlisted Shell commands.
446
- * Codex's parallel is sandbox_workspace_write.network_access=true.
443
+ * `external_network` maps to WebFetch(*) plus `--force` on the run (see
444
+ * cursorRunArgs). Field evidence: allow-listing WebFetch alone still yields
445
+ * "User Rejected" under headless `-p`; `--force` is required for fetch to
446
+ * succeed. Because `--force` auto-allows unlisted tools, research-only
447
+ * networked assignments also deny Shell(*) and Write(**). Codex's parallel is
448
+ * sandbox_workspace_write.network_access=true.
447
449
  */
448
450
  export function cursorPermissionsForGrants(grants, verificationCommands = [], capabilities = []) {
449
451
  const allow = [];
@@ -457,7 +459,16 @@ export function cursorPermissionsForGrants(grants, verificationCommands = [], ca
457
459
  // Cursor docs: WebFetch(domainOrPattern); WebFetch(*) auto-approves any domain.
458
460
  if (capabilities.includes("external_network"))
459
461
  allow.push("WebFetch(*)");
460
- return { allow, deny: deniedCommands.map((command) => `Shell(${command})`) };
462
+ const deny = deniedCommands.map((command) => `Shell(${command})`);
463
+ // --force opens anything not denied; lock shell/write when the assignment has no mutate/shell grants.
464
+ if (capabilities.includes("external_network")
465
+ && !grants.includes("repo_write")
466
+ && !grants.includes("test_run")
467
+ && !grants.includes("branch_create")
468
+ && !grants.includes("pr_create")) {
469
+ deny.push("Shell(*)", "Write(**)");
470
+ }
471
+ return { allow, deny };
461
472
  }
462
473
  /**
463
474
  * Cursor CLI arguments. Deliberately no `--mode plan` for read-only assignments: plan mode is not an
@@ -475,6 +486,9 @@ export function cursorRunArgs(input) {
475
486
  const args = ["-p", "--output-format", "json", "--workspace", input.workspace];
476
487
  if (input.trustWorkspace)
477
488
  args.push("--trust");
489
+ // Headless WebFetch requires --force even when WebFetch(*) is allow-listed (Cursor CLI 2026.07+).
490
+ if (input.capabilities?.includes("external_network"))
491
+ args.push("--force");
478
492
  if (input.model)
479
493
  args.push("--model", input.model);
480
494
  if (input.resumeSessionId)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miraland-labs/conduit-bridge",
3
- "version": "0.9.10",
3
+ "version": "0.9.11",
4
4
  "description": "Conduit Bridge CLI — join, connect, disconnect, multi-driver lanes, and run Claude Code / Codex / Cursor / OpenCode / Kiro / Antigravity agents for a Conduit organization",
5
5
  "type": "module",
6
6
  "bin": {