@openrig/cli 0.3.2 → 0.3.3

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 (146) hide show
  1. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +8 -8
  2. package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
  3. package/daemon/dist/adapters/cmux-transport.js +51 -9
  4. package/daemon/dist/adapters/cmux-transport.js.map +1 -1
  5. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  6. package/daemon/dist/adapters/codex-runtime-adapter.js +32 -4
  7. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  8. package/daemon/dist/adapters/tmux.d.ts +32 -1
  9. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  10. package/daemon/dist/adapters/tmux.js +75 -2
  11. package/daemon/dist/adapters/tmux.js.map +1 -1
  12. package/daemon/dist/db/migrations/042_rig_archive.d.ts +16 -0
  13. package/daemon/dist/db/migrations/042_rig_archive.d.ts.map +1 -0
  14. package/daemon/dist/db/migrations/042_rig_archive.js +21 -0
  15. package/daemon/dist/db/migrations/042_rig_archive.js.map +1 -0
  16. package/daemon/dist/domain/ps-projection.d.ts +6 -1
  17. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  18. package/daemon/dist/domain/ps-projection.js +10 -1
  19. package/daemon/dist/domain/ps-projection.js.map +1 -1
  20. package/daemon/dist/domain/rig-expansion-service.d.ts +1 -1
  21. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  22. package/daemon/dist/domain/rig-expansion-service.js +12 -10
  23. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  24. package/daemon/dist/domain/rig-repository.d.ts +28 -2
  25. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  26. package/daemon/dist/domain/rig-repository.js +40 -3
  27. package/daemon/dist/domain/rig-repository.js.map +1 -1
  28. package/daemon/dist/domain/rigspec-instantiator.d.ts +176 -0
  29. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  30. package/daemon/dist/domain/rigspec-instantiator.js +305 -37
  31. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  32. package/daemon/dist/domain/rigspec-preflight.d.ts +19 -1
  33. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  34. package/daemon/dist/domain/rigspec-preflight.js +30 -12
  35. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  36. package/daemon/dist/domain/rigspec-schema.d.ts +1 -0
  37. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  38. package/daemon/dist/domain/rigspec-schema.js +4 -1
  39. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  40. package/daemon/dist/domain/session-transport.d.ts +15 -0
  41. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  42. package/daemon/dist/domain/session-transport.js +8 -3
  43. package/daemon/dist/domain/session-transport.js.map +1 -1
  44. package/daemon/dist/domain/topology-converge.d.ts +97 -0
  45. package/daemon/dist/domain/topology-converge.d.ts.map +1 -0
  46. package/daemon/dist/domain/topology-converge.js +70 -0
  47. package/daemon/dist/domain/topology-converge.js.map +1 -0
  48. package/daemon/dist/domain/types.d.ts +6 -0
  49. package/daemon/dist/domain/types.d.ts.map +1 -1
  50. package/daemon/dist/domain/types.js.map +1 -1
  51. package/daemon/dist/domain/whoami-service.d.ts +8 -0
  52. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  53. package/daemon/dist/domain/whoami-service.js +1 -0
  54. package/daemon/dist/domain/whoami-service.js.map +1 -1
  55. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  56. package/daemon/dist/domain/workflow-runtime.js +9 -1
  57. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  58. package/daemon/dist/domain/workflow-spec-cache.d.ts +19 -0
  59. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  60. package/daemon/dist/domain/workflow-spec-cache.js +26 -0
  61. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  62. package/daemon/dist/routes/ps.js +4 -1
  63. package/daemon/dist/routes/ps.js.map +1 -1
  64. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  65. package/daemon/dist/routes/rigs.js +124 -2
  66. package/daemon/dist/routes/rigs.js.map +1 -1
  67. package/daemon/dist/startup.d.ts.map +1 -1
  68. package/daemon/dist/startup.js +2 -1
  69. package/daemon/dist/startup.js.map +1 -1
  70. package/daemon/docs/reference/getting-started.md +69 -0
  71. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +79 -9
  72. package/dist/commands/add.d.ts +4 -0
  73. package/dist/commands/add.d.ts.map +1 -0
  74. package/dist/commands/add.js +115 -0
  75. package/dist/commands/add.js.map +1 -0
  76. package/dist/commands/archive.d.ts +10 -0
  77. package/dist/commands/archive.d.ts.map +1 -0
  78. package/dist/commands/archive.js +68 -0
  79. package/dist/commands/archive.js.map +1 -0
  80. package/dist/commands/bootstrap.js +2 -2
  81. package/dist/commands/bootstrap.js.map +1 -1
  82. package/dist/commands/discover.js +2 -2
  83. package/dist/commands/discover.js.map +1 -1
  84. package/dist/commands/down.d.ts +1 -1
  85. package/dist/commands/down.d.ts.map +1 -1
  86. package/dist/commands/down.js +91 -3
  87. package/dist/commands/down.js.map +1 -1
  88. package/dist/commands/ps.d.ts.map +1 -1
  89. package/dist/commands/ps.js +22 -3
  90. package/dist/commands/ps.js.map +1 -1
  91. package/dist/commands/send.d.ts.map +1 -1
  92. package/dist/commands/send.js +11 -0
  93. package/dist/commands/send.js.map +1 -1
  94. package/dist/commands/setup.d.ts +7 -0
  95. package/dist/commands/setup.d.ts.map +1 -1
  96. package/dist/commands/setup.js +28 -1
  97. package/dist/commands/setup.js.map +1 -1
  98. package/dist/commands/status.d.ts.map +1 -1
  99. package/dist/commands/status.js +35 -2
  100. package/dist/commands/status.js.map +1 -1
  101. package/dist/commands/unarchive.d.ts +10 -0
  102. package/dist/commands/unarchive.d.ts.map +1 -0
  103. package/dist/commands/unarchive.js +53 -0
  104. package/dist/commands/unarchive.js.map +1 -0
  105. package/dist/commands/up.d.ts.map +1 -1
  106. package/dist/commands/up.js +50 -0
  107. package/dist/commands/up.js.map +1 -1
  108. package/dist/commands/whoami.d.ts.map +1 -1
  109. package/dist/commands/whoami.js +4 -1
  110. package/dist/commands/whoami.js.map +1 -1
  111. package/dist/commands/workflow.d.ts.map +1 -1
  112. package/dist/commands/workflow.js +2 -3
  113. package/dist/commands/workflow.js.map +1 -1
  114. package/dist/commands/workspace.d.ts.map +1 -1
  115. package/dist/commands/workspace.js +2 -3
  116. package/dist/commands/workspace.js.map +1 -1
  117. package/dist/daemon-lifecycle.d.ts +23 -0
  118. package/dist/daemon-lifecycle.d.ts.map +1 -1
  119. package/dist/daemon-lifecycle.js +24 -0
  120. package/dist/daemon-lifecycle.js.map +1 -1
  121. package/dist/index.d.ts +3 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +7 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/mcp-server.d.ts.map +1 -1
  126. package/dist/mcp-server.js +29 -0
  127. package/dist/mcp-server.js.map +1 -1
  128. package/dist/release-surface/affected-skills.d.ts +49 -0
  129. package/dist/release-surface/affected-skills.d.ts.map +1 -0
  130. package/dist/release-surface/affected-skills.js +153 -0
  131. package/dist/release-surface/affected-skills.js.map +1 -0
  132. package/dist/release-surface/extract-surface.d.ts +23 -0
  133. package/dist/release-surface/extract-surface.d.ts.map +1 -0
  134. package/dist/release-surface/extract-surface.js +193 -0
  135. package/dist/release-surface/extract-surface.js.map +1 -0
  136. package/dist/release-surface/generate.d.ts +2 -0
  137. package/dist/release-surface/generate.d.ts.map +1 -0
  138. package/dist/release-surface/generate.js +51 -0
  139. package/dist/release-surface/generate.js.map +1 -0
  140. package/dist/release-surface/surface-diff.d.ts +40 -0
  141. package/dist/release-surface/surface-diff.d.ts.map +1 -0
  142. package/dist/release-surface/surface-diff.js +212 -0
  143. package/dist/release-surface/surface-diff.js.map +1 -0
  144. package/package.json +1 -1
  145. package/ui/dist/assets/{index-GjTxfi9S.js → index-CrJgCmkX.js} +146 -141
  146. package/ui/dist/index.html +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rigspec-instantiator.d.ts","sourceRoot":"","sources":["../../src/domain/rigspec-instantiator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rigspec-instantiator.d.ts","sourceRoot":"","sources":["../../src/domain/rigspec-instantiator.ts"],"names":[],"mappings":"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"}
@@ -240,8 +240,8 @@ export class RigInstantiator {
240
240
  }
241
241
  // -- Pod-aware instantiator (AgentSpec reboot) --
242
242
  import { RigSpecCodec as PodRigSpecCodec } from "./rigspec-codec.js";
243
- import { RigSpecSchema as PodRigSpecSchema } from "./rigspec-schema.js";
244
- import { rigPreflight } from "./rigspec-preflight.js";
243
+ import { RigSpecSchema as PodRigSpecSchema, VALID_EDGE_KINDS } from "./rigspec-schema.js";
244
+ import { rigPreflight, preflightValidatedSpec } from "./rigspec-preflight.js";
245
245
  import { resolveAgentRef } from "./agent-resolver.js";
246
246
  import { resolveNodeConfig } from "./profile-resolver.js";
247
247
  import { resolveStartup } from "./startup-resolver.js";
@@ -296,6 +296,57 @@ export class PodRigInstantiator {
296
296
  if (!preflight.ready) {
297
297
  return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
298
298
  }
299
+ // OPR.0.3.3.24: parse/validate/preflight is the separable FRONT-END; the
300
+ // persistence CORE (createPod + create-node + edges + events, in one tx)
301
+ // takes the already-parsed+validated spec so `expand` and the `add_member`
302
+ // converge op compose it WITHOUT fabricating a synthetic rig spec.
303
+ return this.materializeValidatedSpec(rigSpec, rigRoot, opts);
304
+ }
305
+ /**
306
+ * materialize with a STRUCTURED front (OPR.0.3.3.24): the YAML-free sibling of
307
+ * materialize(). Runs the SAME front-end (validate + preflight, via the
308
+ * preflight CORE using this adapter's fsOps) on an already-built raw spec
309
+ * OBJECT, then the persistence core - so `expand` (and the add_member op) drop
310
+ * the synthetic-spec YAML round-trip. Byte-identical to materialize(yaml): same
311
+ * validate(externalQualifiedIds), same preflight checks, same MaterializeOutcome
312
+ * error codes (validation_failed / preflight_failed / target_rig_not_found /
313
+ * materialize_conflict). fsOps stays encapsulated here (the expansion service
314
+ * has none) - this wrapper is mechanics only, no behaviour/layering change.
315
+ */
316
+ async materializeStructured(raw, rigRoot, opts) {
317
+ const targetRig = opts?.targetRigId ? this.deps.rigRepo.getRig(opts.targetRigId) : null;
318
+ if (opts?.targetRigId && !targetRig) {
319
+ return { ok: false, code: "target_rig_not_found", message: `Rig "${opts.targetRigId}" not found` };
320
+ }
321
+ const validation = PodRigSpecSchema.validate(raw, {
322
+ externalQualifiedIds: targetRig?.nodes.map((node) => node.logicalId),
323
+ });
324
+ if (!validation.valid) {
325
+ return { ok: false, code: "validation_failed", errors: validation.errors };
326
+ }
327
+ const rigSpec = PodRigSpecSchema.normalize(raw);
328
+ const preflight = preflightValidatedSpec(rigSpec, {
329
+ rigRoot,
330
+ cwdOverride: opts?.cwdOverride,
331
+ fsOps: this.deps.fsOps,
332
+ rigNameOverride: targetRig?.rig.name,
333
+ });
334
+ if (!preflight.ready) {
335
+ return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
336
+ }
337
+ return this.materializeValidatedSpec(rigSpec, rigRoot, opts);
338
+ }
339
+ /**
340
+ * materialize CORE (OPR.0.3.3.24): the persistence body of materialize, taking
341
+ * an already-parsed + validated + preflighted PodRigSpec. Creates pods +
342
+ * member nodes (via the create-node primitive) + edges + events in one
343
+ * transaction. Parse/validate/preflight is the caller's separable front-end
344
+ * (materialize() for YAML; expand/add_member build + validate a structured
345
+ * spec). This is the cut that lets `expand` drop its synthetic-spec hack and
346
+ * `add_member` reuse the exact create path — create+launch only, no identity
347
+ * migration.
348
+ */
349
+ async materializeValidatedSpec(rigSpec, rigRoot, opts) {
299
350
  const persistedEvents = [];
300
351
  const nodeResults = [];
301
352
  try {
@@ -342,26 +393,17 @@ export class PodRigInstantiator {
342
393
  }));
343
394
  for (const member of pod.members) {
344
395
  const qualifiedId = `${pod.id}.${member.id}`;
345
- const effectiveCwd = resolveLaunchCwd(member.cwd, rigRoot, opts?.cwdOverride);
346
- const node = this.deps.rigRepo.addNode(materializedRigId, qualifiedId, {
347
- runtime: member.runtime,
348
- model: member.model,
349
- codexConfigProfile: member.codexConfigProfile,
350
- cwd: effectiveCwd,
351
- restorePolicy: member.restorePolicy,
396
+ const { node, event } = this.createMemberNode({
397
+ rigId: materializedRigId,
398
+ qualifiedId,
399
+ member,
352
400
  podId: podRecord.id,
353
- agentRef: member.agentRef,
354
- profile: member.profile,
355
- label: member.label,
401
+ rigRoot,
402
+ cwdOverride: opts?.cwdOverride,
356
403
  });
357
404
  logicalIdToNodeId.set(qualifiedId, node.id);
358
405
  nodeResults.push({ logicalId: qualifiedId, status: "materialized" });
359
- persistedEvents.push(this.deps.eventBus.persistWithinTransaction({
360
- type: "node.added",
361
- rigId: materializedRigId,
362
- nodeId: node.id,
363
- logicalId: qualifiedId,
364
- }));
406
+ persistedEvents.push(event);
365
407
  }
366
408
  }
367
409
  for (const pod of rigSpec.pods) {
@@ -434,6 +476,17 @@ export class PodRigInstantiator {
434
476
  return { ok: false, code: "validation_failed", errors: validation.errors };
435
477
  }
436
478
  const rigSpec = PodRigSpecSchema.normalize(raw);
479
+ return this.launchValidatedSpec(rigSpec, rigRoot, targetRigId);
480
+ }
481
+ /**
482
+ * launch CORE (OPR.0.3.3.24): given an already-parsed+validated spec whose
483
+ * nodes are already materialized, compute launch order and bring each node
484
+ * live via the launch-binding primitive. Extracted from launchMaterialized so
485
+ * `expand` (and the add_member op) launch a structured spec WITHOUT a YAML
486
+ * round-trip; launchMaterialized(yaml) is the parse/validate/normalize front
487
+ * over it. Behaviour identical (loop body relocated verbatim).
488
+ */
489
+ async launchValidatedSpec(rigSpec, rigRoot, targetRigId) {
437
490
  const launchOrder = this.computePodLaunchOrder(rigSpec);
438
491
  const podWarnings = [];
439
492
  const nodeResults = [];
@@ -458,25 +511,15 @@ export class PodRigInstantiator {
458
511
  });
459
512
  continue;
460
513
  }
461
- const launched = memberContext.member.agentRef === "builtin:terminal"
462
- ? await this.launchExistingTerminalMember({
463
- rigId: targetRigId,
464
- rigSpec,
465
- rigRoot,
466
- pod: memberContext.pod,
467
- member: memberContext.member,
468
- qualifiedId: logicalId,
469
- nodeId: node.id,
470
- })
471
- : await this.launchExistingAgentMember({
472
- rigId: targetRigId,
473
- rigSpec,
474
- rigRoot,
475
- pod: memberContext.pod,
476
- member: memberContext.member,
477
- qualifiedId: logicalId,
478
- nodeId: node.id,
479
- });
514
+ const launched = await this.launchBinding({
515
+ rigId: targetRigId,
516
+ rigSpec,
517
+ rigRoot,
518
+ pod: memberContext.pod,
519
+ member: memberContext.member,
520
+ qualifiedId: logicalId,
521
+ nodeId: node.id,
522
+ });
480
523
  if (launched.warnings?.length) {
481
524
  podWarnings.push(...launched.warnings);
482
525
  }
@@ -496,6 +539,187 @@ export class PodRigInstantiator {
496
539
  },
497
540
  };
498
541
  }
542
+ /**
543
+ * add_member converge op (OPR.0.3.3.24): add a single MEMBER to an EXISTING
544
+ * pod in a live rig, composing the two extracted primitives — createMemberNode
545
+ * (create-node) + launchBinding (launch-binding) — WITHOUT createPod and
546
+ * WITHOUT fabricating a synthetic rig spec.
547
+ *
548
+ * Identity-migration-FREE: the new node mints a fresh node id + fresh logical
549
+ * id + fresh `@rigged_*` at launch; no existing seat's logical id,
550
+ * continuity_state, queue routing, or session is re-keyed. This is the
551
+ * source-visible fault line that lets add_member ship while move/fork wait for
552
+ * the 0.4.0 identity stack.
553
+ *
554
+ * Versus materialize: this does NOT call materializeValidatedSpec (which always
555
+ * createPods and carries the pod-exists conflict guard). It resolves the
556
+ * EXISTING pod's DB id via `podRepo.getPodByNamespace` and creates the one node
557
+ * directly under it. The pod-exists guard is lifted (adding to a live pod is
558
+ * not a conflict); the per-member duplicate-logical-id guard is KEPT (AC-3).
559
+ */
560
+ async addMemberToPod(rigId, podNamespace, memberFragment, rigRoot, opts) {
561
+ // 1. Resolve the rig.
562
+ const rig = this.deps.rigRepo.getRig(rigId);
563
+ if (!rig) {
564
+ return { ok: false, code: "rig_not_found", message: `Rig "${rigId}" not found.` };
565
+ }
566
+ // 2. Resolve the EXISTING pod's DB id via getPodByNamespace (the corrected
567
+ // pod-id source — NOT a pre-computed namespace->podId map). Honest not-found
568
+ // with the available namespaces so the caller can correct the handle.
569
+ const pod = this.deps.podRepo.getPodByNamespace(rigId, podNamespace);
570
+ if (!pod) {
571
+ const available = this.deps.podRepo.getPodsForRig(rigId).map((p) => p.namespace);
572
+ const hint = available.length > 0 ? available.join(", ") : "(none)";
573
+ return {
574
+ ok: false,
575
+ code: "pod_not_found",
576
+ message: `Pod "${podNamespace}" not found in rig "${rig.rig.name}". Existing pods: ${hint}. Check the namespace, or add a new pod with \`rig expand\`.`,
577
+ };
578
+ }
579
+ // 3. Build a minimal one-pod-one-member raw spec around the EXISTING pod so
580
+ // the new member runs the SAME validate + preflight the materialize front
581
+ // does — without a whole-rig spec or a YAML round-trip. The member fragment
582
+ // is embedded raw (spec snake_case shape, as expand's structured path emits);
583
+ // validate/normalize is the type gate.
584
+ const rawSpec = {
585
+ version: "0.2",
586
+ name: rig.rig.name,
587
+ pods: [{ id: podNamespace, label: pod.label, members: [memberFragment], edges: [] }],
588
+ edges: [],
589
+ };
590
+ // 4. Validate + normalize. externalQualifiedIds is the existing rig's node
591
+ // set (matches the materialize front; used for cross-pod edge resolution).
592
+ const validation = PodRigSpecSchema.validate(rawSpec, {
593
+ externalQualifiedIds: rig.nodes.map((node) => node.logicalId),
594
+ });
595
+ if (!validation.valid) {
596
+ return { ok: false, code: "validation_failed", errors: validation.errors };
597
+ }
598
+ const rigSpec = PodRigSpecSchema.normalize(rawSpec);
599
+ const member = rigSpec.pods[0].members[0];
600
+ const qualifiedId = `${podNamespace}.${member.id}`;
601
+ // 5. KEEP the per-member duplicate-logical-id guard (AC-3). The pod-exists
602
+ // guard is lifted (we are adding to a live pod on purpose), but minting a
603
+ // colliding logical id would be a real seat collision — reject it honestly.
604
+ // (validate's externalQualifiedIds only resolves edge targets; it does NOT
605
+ // reject a member colliding with an existing node, so this guard is load-bearing.)
606
+ if (rig.nodes.some((node) => node.logicalId === qualifiedId)) {
607
+ return {
608
+ ok: false,
609
+ code: "member_conflict",
610
+ message: `Member "${qualifiedId}" already exists in rig "${rig.rig.name}". Pick a different member id, or remove the existing seat first.`,
611
+ };
612
+ }
613
+ // 6. Preflight the new member on the normalized spec (same checks the
614
+ // materialize front runs, via the core, using this adapter's fsOps).
615
+ // rigNameOverride suppresses the rig-name-collision check (we are appending
616
+ // to an existing rig, exactly like expand's structured path).
617
+ const preflight = preflightValidatedSpec(rigSpec, {
618
+ rigRoot,
619
+ cwdOverride: opts?.cwdOverride,
620
+ fsOps: this.deps.fsOps,
621
+ rigNameOverride: rig.rig.name,
622
+ });
623
+ if (!preflight.ready) {
624
+ return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
625
+ }
626
+ // 7. Validate + resolve any declared pod-local edges BEFORE creating the
627
+ // node, so a bad edge fails fast with no orphan seat. Two honest failure
628
+ // classes: (a) DECLARATION validity (non-array / empty fields / a kind
629
+ // outside the canonical VALID_EDGE_KINDS - mirrors the rigspec pod-local
630
+ // edge contract, NOT a second looser path) -> validation_failed; (b) live
631
+ // ENDPOINT resolution against the new member + existing pod-mates ->
632
+ // edge_unresolved. Edges carry NO runtime behavior yet (the edge-runtime
633
+ // fence); we persist the declared graph so it is NOT silently dropped (FM2).
634
+ const rawEdges = opts?.edges;
635
+ if (rawEdges !== undefined && rawEdges !== null && !Array.isArray(rawEdges)) {
636
+ return { ok: false, code: "validation_failed", errors: ["edges: must be an array of { from, to, kind }"] };
637
+ }
638
+ const declaredEdges = Array.isArray(rawEdges) ? rawEdges : [];
639
+ const edgeErrors = [];
640
+ declaredEdges.forEach((edge, i) => {
641
+ if (typeof edge?.from !== "string" || typeof edge?.to !== "string" || typeof edge?.kind !== "string"
642
+ || edge.from.trim() === "" || edge.to.trim() === "" || edge.kind.trim() === "") {
643
+ edgeErrors.push(`edges[${i}]: from, to, and kind are required non-empty strings`);
644
+ return;
645
+ }
646
+ if (!VALID_EDGE_KINDS.has(edge.kind)) {
647
+ edgeErrors.push(`edges[${i}].kind: must be one of ${[...VALID_EDGE_KINDS].join(", ")} (got "${edge.kind}")`);
648
+ }
649
+ });
650
+ if (edgeErrors.length > 0) {
651
+ return { ok: false, code: "validation_failed", errors: edgeErrors };
652
+ }
653
+ const knownLogicalIds = new Set([...rig.nodes.map((node) => node.logicalId), qualifiedId]);
654
+ const resolvedEdges = [];
655
+ for (const edge of declaredEdges) {
656
+ const from = `${podNamespace}.${edge.from}`;
657
+ const to = `${podNamespace}.${edge.to}`;
658
+ if (!knownLogicalIds.has(from) || !knownLogicalIds.has(to)) {
659
+ const missing = !knownLogicalIds.has(from) ? from : to;
660
+ return { ok: false, code: "edge_unresolved", message: `Pod-local edge references "${missing}", which is neither the new member "${qualifiedId}" nor an existing seat in rig "${rig.rig.name}". Use member ids within pod "${podNamespace}".` };
661
+ }
662
+ resolvedEdges.push({ from, to, kind: edge.kind });
663
+ }
664
+ // 8. create-node into the EXISTING pod (pod_id = resolved pod.id) + persist
665
+ // the resolved pod-local edges, all in one tx so the node row, the
666
+ // node.added event, and the edges commit atomically (mirroring the
667
+ // materialize core); subscribers notified after commit.
668
+ let createdNodeId = "";
669
+ let createdEvent;
670
+ const tx = this.db.transaction(() => {
671
+ const { node, event } = this.createMemberNode({
672
+ rigId,
673
+ qualifiedId,
674
+ member,
675
+ podId: pod.id,
676
+ rigRoot,
677
+ cwdOverride: opts?.cwdOverride,
678
+ });
679
+ createdNodeId = node.id;
680
+ createdEvent = event;
681
+ if (resolvedEdges.length > 0) {
682
+ const logicalIdToNodeId = new Map(rig.nodes.map((n) => [n.logicalId, n.id]));
683
+ logicalIdToNodeId.set(qualifiedId, node.id);
684
+ for (const edge of resolvedEdges) {
685
+ this.deps.rigRepo.addEdge(rigId, logicalIdToNodeId.get(edge.from), logicalIdToNodeId.get(edge.to), edge.kind);
686
+ }
687
+ }
688
+ });
689
+ tx();
690
+ if (createdEvent)
691
+ this.deps.eventBus.notifySubscribers(createdEvent);
692
+ // 9. launch-binding for the one new node (startup projection + delivery +
693
+ // readiness + `@rigged_*`). The minimal spec supplies the member/pod/rig
694
+ // context launchBinding needs; the derived session name is
695
+ // `${podNamespace}-${member.id}@${rig.name}` — queue-addressable immediately.
696
+ const launched = await this.launchBinding({
697
+ rigId,
698
+ rigSpec,
699
+ rigRoot,
700
+ pod: rigSpec.pods[0],
701
+ member,
702
+ qualifiedId,
703
+ nodeId: createdNodeId,
704
+ cwdOverride: opts?.cwdOverride,
705
+ });
706
+ return {
707
+ ok: true,
708
+ result: {
709
+ podId: pod.id,
710
+ podNamespace,
711
+ node: {
712
+ logicalId: qualifiedId,
713
+ nodeId: createdNodeId,
714
+ status: launched.status,
715
+ error: launched.error,
716
+ sessionName: launched.sessionName,
717
+ },
718
+ edges: resolvedEdges,
719
+ warnings: launched.warnings,
720
+ },
721
+ };
722
+ }
499
723
  async instantiate(rigSpecYaml, rigRoot, opts) {
500
724
  // 1. Parse + validate
501
725
  let rigSpec;
@@ -894,6 +1118,50 @@ export class PodRigInstantiator {
894
1118
  const member = pod?.members.find((entry) => entry.id === memberId);
895
1119
  return pod && member ? { pod, member } : null;
896
1120
  }
1121
+ /**
1122
+ * create-node primitive (OPR.0.3.3.24): mint a fresh node row for one member
1123
+ * (fresh stable id + fresh qualified logical id, `pod_id` = the given pod) plus
1124
+ * the matching `node.added` event. Extracted from materialize's loop so the
1125
+ * `add_member` converge op and a de-YAML'd `expand` create a member node
1126
+ * WITHOUT fabricating a synthetic rig spec. Identity-migration-FREE: addNode
1127
+ * mints a brand-new identity; nothing existing re-keys. The caller pushes the
1128
+ * returned `event` into its transaction's persisted-events list.
1129
+ */
1130
+ createMemberNode(input) {
1131
+ const effectiveCwd = resolveLaunchCwd(input.member.cwd, input.rigRoot, input.cwdOverride);
1132
+ const node = this.deps.rigRepo.addNode(input.rigId, input.qualifiedId, {
1133
+ runtime: input.member.runtime,
1134
+ model: input.member.model,
1135
+ codexConfigProfile: input.member.codexConfigProfile,
1136
+ cwd: effectiveCwd,
1137
+ restorePolicy: input.member.restorePolicy,
1138
+ podId: input.podId,
1139
+ agentRef: input.member.agentRef,
1140
+ profile: input.member.profile,
1141
+ label: input.member.label,
1142
+ });
1143
+ const event = this.deps.eventBus.persistWithinTransaction({
1144
+ type: "node.added",
1145
+ rigId: input.rigId,
1146
+ nodeId: node.id,
1147
+ logicalId: input.qualifiedId,
1148
+ });
1149
+ return { node, event };
1150
+ }
1151
+ /**
1152
+ * launch-binding primitive (OPR.0.3.3.24): given an already-created node and
1153
+ * its member context, bring it fully live — harness launch + startup
1154
+ * projection + delivery + readiness + `@rigged_*` metadata. Dispatches the
1155
+ * terminal vs agent launch path. Extracted as an independently-callable
1156
+ * primitive so launchMaterialized's loop, `expand`, and the `add_member`
1157
+ * converge op all launch a node WITHOUT fabricating a synthetic rig spec.
1158
+ * Behaviour is identical to the prior inline dispatch.
1159
+ */
1160
+ async launchBinding(input) {
1161
+ return input.member.agentRef === "builtin:terminal"
1162
+ ? this.launchExistingTerminalMember(input)
1163
+ : this.launchExistingAgentMember(input);
1164
+ }
897
1165
  async launchExistingAgentMember(input) {
898
1166
  const resolveResult = input.resolveResult ?? resolveAgentRef(input.member.agentRef, input.rigRoot, this.deps.fsOps);
899
1167
  if (!resolveResult.ok) {