@cotal-ai/cli 0.49.0 → 0.50.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 (49) hide show
  1. package/dist/command.d.ts.map +1 -1
  2. package/dist/command.js +8 -0
  3. package/dist/command.js.map +1 -1
  4. package/dist/commands/agents.d.ts +143 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +126 -49
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/doctor.d.ts.map +1 -1
  9. package/dist/commands/doctor.js +175 -11
  10. package/dist/commands/doctor.js.map +1 -1
  11. package/dist/commands/join.d.ts.map +1 -1
  12. package/dist/commands/join.js +9 -1
  13. package/dist/commands/join.js.map +1 -1
  14. package/dist/commands/setup.d.ts +1 -1
  15. package/dist/commands/setup.d.ts.map +1 -1
  16. package/dist/commands/setup.js +1 -1
  17. package/dist/commands/status.d.ts +11 -3
  18. package/dist/commands/status.d.ts.map +1 -1
  19. package/dist/commands/status.js +176 -13
  20. package/dist/commands/status.js.map +1 -1
  21. package/dist/commands/up.d.ts.map +1 -1
  22. package/dist/commands/up.js +12 -1
  23. package/dist/commands/up.js.map +1 -1
  24. package/dist/commands/update.d.ts.map +1 -1
  25. package/dist/commands/update.js +19 -7
  26. package/dist/commands/update.js.map +1 -1
  27. package/dist/lib/auth-proc.d.ts.map +1 -1
  28. package/dist/lib/auth-proc.js +2 -1
  29. package/dist/lib/auth-proc.js.map +1 -1
  30. package/dist/lib/control.d.ts +28 -1
  31. package/dist/lib/control.d.ts.map +1 -1
  32. package/dist/lib/control.js +58 -11
  33. package/dist/lib/control.js.map +1 -1
  34. package/dist/lib/delivery-proc.d.ts +21 -5
  35. package/dist/lib/delivery-proc.d.ts.map +1 -1
  36. package/dist/lib/delivery-proc.js +82 -18
  37. package/dist/lib/delivery-proc.js.map +1 -1
  38. package/dist/lib/delivery-responder.d.ts +92 -0
  39. package/dist/lib/delivery-responder.d.ts.map +1 -0
  40. package/dist/lib/delivery-responder.js +78 -0
  41. package/dist/lib/delivery-responder.js.map +1 -0
  42. package/dist/lib/manager-proc.d.ts.map +1 -1
  43. package/dist/lib/manager-proc.js +4 -1
  44. package/dist/lib/manager-proc.js.map +1 -1
  45. package/dist/lib/self-exec.d.ts +15 -1
  46. package/dist/lib/self-exec.d.ts.map +1 -1
  47. package/dist/lib/self-exec.js +30 -3
  48. package/dist/lib/self-exec.js.map +1 -1
  49. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiH7F,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B;;;oCAGgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;uFAEuF;AACvF,wBAAsB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGxG"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAwH7F,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B;;;oCAGgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;uFAEuF;AACvF,wBAAsB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGxG"}
package/dist/command.js CHANGED
@@ -87,6 +87,14 @@ function skipAutoReconcile(argv) {
87
87
  return true;
88
88
  if (argv.includes("--help") || argv.includes("-h"))
89
89
  return true; // command-specific help must not mutate state
90
+ // A dry run promises to plan and print while mutating NOTHING, and the boot-gate reconcile is a
91
+ // mutation of the operator-global seed store, manifest and npm prefix — it ran BEFORE the command
92
+ // body could reject the invocation, so `down --preserve-state --dry-run` (an unsupported
93
+ // combination) migrated the whole store to the invoking binary's generation and only then printed
94
+ // the usage refusal, leaving an older live deployment on a store it no longer matches (#1620). The
95
+ // planning surface reads what is installed; it never seeds to make the plan prettier.
96
+ if (argv.includes("--dry-run"))
97
+ return true;
90
98
  if (name === "update")
91
99
  return true; // update owns one explicit reconcile; never auto-refresh then force-refresh
92
100
  // The seed is skipped for an INTERNAL CHILD re-exec — the `up`/`spawn` that spawns the delivery
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAA+B,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,EACjB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;4EAG4E;AAC5E,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAEjG,SAAS,IAAI,CAAC,QAAmB;IAC/B,+FAA+F;IAC/F,kFAAkF;IAClF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;QAClC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,2CAA2C,CAAC;IACxE,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IACtF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED;sDACsD;AACtD,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,IAAc;IACxD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACzB,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAU,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpF,kGAAkG;QAClG,8FAA8F;QAC9F,8DAA8D;QAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,WAAW,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,yBAAyB,EAAE,CAAC;IAClC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACtH,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,8CAA8C;IAC/G,gGAAgG;IAChG,kGAAkG;IAClG,yFAAyF;IACzF,kGAAkG;IAClG,mGAAmG;IACnG,sFAAsF;IACtF,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,4EAA4E;IAChH,gGAAgG;IAChG,qGAAqG;IACrG,oGAAoG;IACpG,qGAAqG;IACrG,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,CAAC,gHAAgH;IACnK,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,CAAC,mDAAmD;IACtG,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,oBAAoB,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAC5G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,IAAI,GAAI,CAAuB,EAAE,IAAI,CAAC;IAC5C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACvE,CAAC;AAWD;;uFAEuF;AACvF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAkB,EAAE,IAAc,EAAE,OAAsB,EAAE;IACvF,iGAAiG;IACjG,iGAAiG;IACjG,6FAA6F;IAC7F,0BAA0B;IAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,YAAY,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,+FAA+F;IAC/F,+FAA+F;IAC/F,yFAAyF;IACzF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAAE,OAAO;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,QAAmB,CAAC;IACxB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAU,SAAS,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,2FAA2F;QAC3F,6EAA6E;QAC7E,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,gEAAgE;IAC7F,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,CAAC;QACf,OAAO;IACT,CAAC;IACD,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,8FAA8F;IAC9F,6FAA6F;IAC7F,2FAA2F;IAC3F,iEAAiE;IACjE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnF,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,4FAA4F;IAC5F,wFAAwF;IACxF,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC;gBAAE,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,mFAAmF;QACnF,uFAAuF;QACvF,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,GAAI,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YACjC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,8FAA8F;QAC9F,2FAA2F;QAC3F,4FAA4F;QAC5F,8FAA8F;QAC9F,+FAA+F;QAC/F,oBAAoB;QACpB,IAAI,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,4FAA4F;QAC5F,6FAA6F;QAC7F,sFAAsF;QACtF,6BAA6B;QAC7B,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QACjC,oFAAoF;QACpF,8EAA8E;QAC9E,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
- import { type CompletionResult, type ParsedArgs } from "@cotal-ai/core";
1
+ import { standaloneConnectOpts, type CompletionResult, type ParsedArgs, type SpaceAuth } from "@cotal-ai/core";
2
+ import { type ScatterInstanceReply } from "../lib/control.js";
2
3
  export declare const stopFlags: readonly [{
3
4
  readonly name: "space";
4
5
  readonly type: "string";
@@ -154,6 +155,77 @@ type AgentRow = {
154
155
  * recorded: when no override was requested it stays absent rather than inventing an effective
155
156
  * provider default Cotal cannot observe. */
156
157
  export declare function agentIdentity(r: Pick<AgentRow, "agent" | "model" | "variant" | "mode">): string;
158
+ /**
159
+ * WHERE does the named seat live? A `stop` or `attach` can only be served by the manager actually
160
+ * HOSTING the seat, and the class queue does not know which one that is — so without this the verb
161
+ * is answered by whichever instance wins the race and fails on a seat that plainly exists.
162
+ *
163
+ * This is a POSITIVE lookup, not a retry after a miss, and that is forced by measurement: a manager
164
+ * asked about a seat it does not host answers `not-found: no agent "<n>"` — the SAME code and the
165
+ * same message it gives for a name that exists nowhere. "Hosted elsewhere" and "does not exist" are
166
+ * indistinguishable from a single manager's answer, so a caller that retried on a miss would scatter
167
+ * for a typo and, worse, could only ever report the ambiguous message. Asking every instance is the
168
+ * only construction that can tell the two apart — which is also what lets the error finally say
169
+ * which case it is.
170
+ *
171
+ * Costs a second one-shot instrument. The scatter's freeze read belongs to the PRIVILEGED tier;
172
+ * `stop`/`attach` mint ADMIN, which is denied that read deliberately ("the admin tier never
173
+ * scatters"). Rather than widen admin for convenience, the lookup runs as its own privileged
174
+ * instrument and the admin instrument is then minted pinned to the answer.
175
+ */
176
+ export type SeatLocation = {
177
+ kind: "pin";
178
+ instanceId: string;
179
+ } | {
180
+ kind: "unpinned";
181
+ } | {
182
+ kind: "absent";
183
+ checked: number;
184
+ }
185
+ /** #1638 item 3: the search could not settle. At least one registered instance did not answer
186
+ * FOR ITSELF, so the seat may be sitting on it; absence is not what was established. */
187
+ | {
188
+ kind: "unknown";
189
+ answered: number;
190
+ silent: string[];
191
+ refused: {
192
+ instanceId: string;
193
+ error: string;
194
+ }[];
195
+ };
196
+ /**
197
+ * WHAT THE SCATTER ESTABLISHED about one seat name — the whole decision, as a function of the rows
198
+ * alone, so it is gradable without a broker.
199
+ *
200
+ * ANSWERED FOR ITSELF means an instance returned its own roster. A slot that never answered and one
201
+ * that answered with a REFUSAL are the same fact for this search: neither stated which seats it
202
+ * hosts, so neither licenses a conclusion about a seat that might be sitting on it (#1638 item 3).
203
+ * The refusal half is the reachable-but-errored row `scatterManager` reports, which the older
204
+ * filter counted as a manager that had looked and found nothing.
205
+ *
206
+ * Absence is a claim about the WHOLE space, so it is concluded only when the whole space answered.
207
+ */
208
+ export declare function locateSeatIn(instances: readonly ScatterInstanceReply[], name: string): SeatLocation;
209
+ /**
210
+ * What a `stop`/`attach`/`input` that did not find its seat TELLS the operator — and the difference
211
+ * between the two things it can mean (#1638 item 3).
212
+ *
213
+ * ABSENT is a claim about the whole space and is only made when the whole space answered for
214
+ * itself. A registration that gave no answer within the deadline is NOT told to "retry": a manager
215
+ * whose host died never deregisters, so its row stays in the registry indefinitely and answers
216
+ * nothing, and a retry against it loops forever. Say what is known (registered, silent), what it
217
+ * may mean (a live slow host OR a dead registration), and the two real actions.
218
+ *
219
+ * UNKNOWN is the other case and it used to print as the first one. The seat may be sitting on the
220
+ * instance that did not answer, so "no managed agent <name>" was a definite negative drawn from an
221
+ * incomplete search — and it names the instance COUNT, which is the shape a reader believes.
222
+ * Measured on a live mesh: a seat that `ps` listed as running the whole time was reported absent,
223
+ * and the same command with `--on` succeeded first time. A retry loop that reads the old sentence
224
+ * as "already gone" stops looking for a seat that is still running.
225
+ */
226
+ export declare function seatMissRefusal(name: string, verb: string, loc: Extract<SeatLocation, {
227
+ kind: "absent" | "unknown";
228
+ }>): string;
157
229
  /** Render one managed-agent row (process fact, mesh fact, optional auth-health line), indented for
158
230
  * the per-manager grouping a class scatter prints.
159
231
  *
@@ -219,6 +291,76 @@ export declare function reconnectNotice(est: {
219
291
  * close their terminal.
220
292
  */
221
293
  export declare function heldSessionNotice(pending: number, verdict: AttachVerdict["kind"]): string | undefined;
294
+ /** Why attach cannot redeem a session grant, said in terms of what the command actually resolved.
295
+ *
296
+ * Three distinct states, kept distinct because the remedy differs and a single sentence covering
297
+ * all three is the defect issue #722 opened on (its old text named an internal work item and no
298
+ * root at all). A USER-AUTH mesh holds no local seed by design. A REGISTERED static mesh has a
299
+ * root and it is named, so an operator can see which directory the command used rather than
300
+ * guessing at their cwd.
301
+ *
302
+ * The third arm is an INVARIANT, not advice, and is written that way on purpose. A connection with
303
+ * no resolved root is what the type allows, and no supported route reaches redemption in that
304
+ * state: both off-registry routes are refused earlier, which `smoke:attach-auth-root` measures
305
+ * rather than assumes. So that arm says what its own existence would mean instead of offering a
306
+ * remedy for a situation that cannot currently arise. */
307
+ /** The mesh contract that decides how attach redeems a session grant. The mode is the REGISTERED
308
+ * one (`MeshTarget.mode`), carried forward from the resolve. It is the only input to the decision:
309
+ * `spaceAuth` says whether a SEALED mesh's seed is present, and is never consulted to decide which
310
+ * kind of mesh this is. */
311
+ export type AttachSessionTarget = {
312
+ space: string;
313
+ server: string;
314
+ root?: string;
315
+ spaceAuth?: SpaceAuth;
316
+ mode?: "auth" | "open" | "user";
317
+ auth: {
318
+ bearer?: unknown;
319
+ };
320
+ };
321
+ /**
322
+ * HOW this mesh's session grant is redeemed, as a closed union with no optional credential.
323
+ *
324
+ * `bare` and `session-caller` are structurally distinct rather than "session-caller, but the creds
325
+ * may be missing". That distinction is the whole fix for #1205. An optional `creds?: string` on the
326
+ * redeem path invites exactly one question at every call site — "is the seed there?" — and answering
327
+ * it with `!creds` is the defect: an OPEN mesh has no seed BY DESIGN, so absence means "bare",
328
+ * while on a SEALED mesh the same absence means "refuse". One field cannot carry both meanings, so
329
+ * the mode is named and the compiler makes every consumer read the name.
330
+ */
331
+ export type RedeemLink = {
332
+ mode: "bare";
333
+ tls: boolean;
334
+ } | {
335
+ mode: "session-caller";
336
+ tls: boolean;
337
+ creds: string;
338
+ };
339
+ /** The ONE place a {@link RedeemLink} becomes NATS connect options. Both connections on the redeem
340
+ * path (the session link and the abandoned-session hand-back) go through here, so neither can
341
+ * invent a credential for an open mesh or drop one on a sealed mesh, and a third caller gets the
342
+ * same two arms for free. */
343
+ export declare function redeemConnectOpts(link: RedeemLink): ReturnType<typeof standaloneConnectOpts>;
344
+ /**
345
+ * Which redeem contract this target gets: a bare open-mesh connection, a seed-backed mint, or a
346
+ * loud refusal. Graded by `smoke:attach-open-mode`, whose mutations flip each arm in turn.
347
+ *
348
+ * EXHAUSTIVE over the three recorded modes on purpose, with `user` named rather than reached by
349
+ * fallthrough. A `user` entry holds no local seed by design and its two-step redemption is not
350
+ * wired, so it must refuse even on the day a user-mode root happens to carry static material on
351
+ * disk; letting it fall through to the seed test would silently mint on the wrong identity plane.
352
+ * An UNRECORDED mode (a raw off-registry connection) is the conservative arm: it is not known to be
353
+ * open, so it takes the sealed test and refuses without a seed.
354
+ */
355
+ export declare function attachSessionMaterial(t: AttachSessionTarget): {
356
+ kind: "bare";
357
+ } | {
358
+ kind: "mint";
359
+ auth: SpaceAuth;
360
+ } | {
361
+ kind: "fatal";
362
+ message: string;
363
+ };
222
364
  /** How the attach finished, decided inside the loop and acted on outside it — so the terminal is
223
365
  * always given back before anything prints or exits. */
224
366
  type AttachVerdict = {
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -116,14 +116,33 @@ async function locateSeat(v, name) {
116
116
  const scatter = await scatterManager(probe.space, probe.server, "ps", probe.auth, probe.spaceAuth);
117
117
  if (!scatter.ok)
118
118
  return { kind: "unpinned" }; // cannot locate ⇒ behave exactly as before, never worse
119
- const reachable = scatter.instances.filter((i) => i.reachable);
120
- const unreachable = scatter.instances.filter((i) => !i.reachable).map((i) => i.instanceId);
121
- if (reachable.length <= 1 && !unreachable.length)
119
+ return locateSeatIn(scatter.instances, name);
120
+ }
121
+ /**
122
+ * WHAT THE SCATTER ESTABLISHED about one seat name — the whole decision, as a function of the rows
123
+ * alone, so it is gradable without a broker.
124
+ *
125
+ * ANSWERED FOR ITSELF means an instance returned its own roster. A slot that never answered and one
126
+ * that answered with a REFUSAL are the same fact for this search: neither stated which seats it
127
+ * hosts, so neither licenses a conclusion about a seat that might be sitting on it (#1638 item 3).
128
+ * The refusal half is the reachable-but-errored row `scatterManager` reports, which the older
129
+ * filter counted as a manager that had looked and found nothing.
130
+ *
131
+ * Absence is a claim about the WHOLE space, so it is concluded only when the whole space answered.
132
+ */
133
+ export function locateSeatIn(instances, name) {
134
+ const reachable = instances.filter((i) => i.reachable);
135
+ const silent = instances.filter((i) => !i.reachable).map((i) => i.instanceId);
136
+ if (reachable.length <= 1 && !silent.length)
122
137
  return { kind: "unpinned" };
123
- const host = reachable.find((i) => (i.data ?? []).some((r) => r.name === name));
138
+ const answered = reachable.filter((i) => i.error === undefined);
139
+ const refused = reachable.filter((i) => i.error !== undefined).map((i) => ({ instanceId: i.instanceId, error: i.error }));
140
+ const host = answered.find((i) => (i.data ?? []).some((r) => r.name === name));
124
141
  if (host)
125
142
  return { kind: "pin", instanceId: host.instanceId };
126
- return { kind: "absent", checked: reachable.length, unreachable };
143
+ if (silent.length || refused.length)
144
+ return { kind: "unknown", answered: answered.length, silent, refused };
145
+ return { kind: "absent", checked: answered.length };
127
146
  }
128
147
  /** Resolve `--on` for a targeted verb: an explicit pin wins; otherwise locate the seat. Returns the
129
148
  * instance to address, or exits with an error that says WHICH case the miss was. */
@@ -136,17 +155,38 @@ async function pinForTarget(v, verb) {
136
155
  return loc.instanceId;
137
156
  if (loc.kind === "unpinned")
138
157
  return undefined;
139
- // The honest error #383 asked for: name the search, not just the absence. A registration that
140
- // gave no answer within the deadline is NOT told to "retry": a manager whose host died never
141
- // deregisters, so its row stays in the registry indefinitely and answers nothing, and a retry
142
- // against it loops forever. Say what is known (registered, silent), what it may mean (a live
143
- // slow host OR a dead registration), and the two real actions.
144
- const missed = loc.unreachable.length
145
- ? ` ${loc.unreachable.length} registered manager instance(s) gave no answer within the deadline (${loc.unreachable.join(", ")}). Either that host is alive but slow, or it died and its registration was never removed; if it is dead, deregister it. To address it directly: \`${verb} --on <instance>\` (the whole id, as printed).`
146
- : "";
147
- console.error(c.red(`✗ no managed agent "${v.name}" on any of the ${loc.checked} reachable manager instance(s) in this space.${missed}`));
158
+ console.error(c.red(`✗ ${seatMissRefusal(String(v.name), verb, loc)}`));
148
159
  process.exit(1);
149
160
  }
161
+ /**
162
+ * What a `stop`/`attach`/`input` that did not find its seat TELLS the operator — and the difference
163
+ * between the two things it can mean (#1638 item 3).
164
+ *
165
+ * ABSENT is a claim about the whole space and is only made when the whole space answered for
166
+ * itself. A registration that gave no answer within the deadline is NOT told to "retry": a manager
167
+ * whose host died never deregisters, so its row stays in the registry indefinitely and answers
168
+ * nothing, and a retry against it loops forever. Say what is known (registered, silent), what it
169
+ * may mean (a live slow host OR a dead registration), and the two real actions.
170
+ *
171
+ * UNKNOWN is the other case and it used to print as the first one. The seat may be sitting on the
172
+ * instance that did not answer, so "no managed agent <name>" was a definite negative drawn from an
173
+ * incomplete search — and it names the instance COUNT, which is the shape a reader believes.
174
+ * Measured on a live mesh: a seat that `ps` listed as running the whole time was reported absent,
175
+ * and the same command with `--on` succeeded first time. A retry loop that reads the old sentence
176
+ * as "already gone" stops looking for a seat that is still running.
177
+ */
178
+ export function seatMissRefusal(name, verb, loc) {
179
+ const address = `To address one directly: \`${verb} --on <instance>\` (the whole id, as printed).`;
180
+ if (loc.kind === "absent")
181
+ return `no managed agent "${name}" on any of the ${loc.checked} reachable manager instance(s) in this space.`;
182
+ const silent = loc.silent.length
183
+ ? ` ${loc.silent.length} registered manager instance(s) gave no answer within the deadline (${loc.silent.join(", ")}). Either that host is alive but slow, or it died and its registration was never removed; if it is dead, deregister it.`
184
+ : "";
185
+ const refused = loc.refused.length
186
+ ? ` ${loc.refused.length} refused the read rather than answering (${loc.refused.map((r) => `${r.instanceId}: ${r.error}`).join("; ")}).`
187
+ : "";
188
+ return `could not establish where "${name}" is: ${loc.answered} manager instance(s) answered and none hosts it, but ${loc.silent.length + loc.refused.length} did not answer for themselves, so this is NOT a report that it is gone — it may be running on one of those.${silent}${refused} ${address}`;
189
+ }
150
190
  /**
151
191
  * What one SILENT manager instance's row says. The wording lives here, in the CLI, and not in the
152
192
  * scatter that produced the fact: core reports a frozen slot that did not answer, and turning that
@@ -494,9 +534,10 @@ async function establishAttachSession(v, on, reconnect, first) {
494
534
  if (!reply.ok)
495
535
  return { ok: false, kind: attachRefusal(reply.code, reply.details), message: reply.error ?? "error", fromManager: true };
496
536
  // P2 item 6: the reply is the holder-bound §13.6 session GRANT (no ws:// URL). Redeem it over the
497
- // mesh mint a per-session, rails-only caller cred from the local space seed, connect, and drive
498
- // the terminal through the session rail. USER mesh (bearer, no local seed): refuse LOUD the
499
- // 2-step user-mode redemption callout is the #29 follow-up, deliberately not wired here.
537
+ // mesh. A static-auth mesh mints a per-session, rails-only caller cred from the resolved root's
538
+ // seed. A registered open mesh has no seed: the same bare connection `askManagerEp` already used
539
+ // for the control round trip opens the caller rail. USER mesh (bearer, no local seed): refuse LOUD
540
+ // — the 2-step user-mode redemption callout is the #29 follow-up, deliberately not wired here.
500
541
  const { grant } = reply.data;
501
542
  // The trust material the TARGET resolved, not a second answer walked up from the cwd. This used
502
543
  // to be `loadSpaceAuth(authDir(findCotalRoot()), t.space)`, which is the defect behind issue #722:
@@ -518,17 +559,27 @@ async function establishAttachSession(v, on, reconnect, first) {
518
559
  if (shadow)
519
560
  console.error(`! this directory resolves to ${shadow.cwdRoot}, whose .cotal/auth holds a DIFFERENT trust chain for space "${t.space}".\n` +
520
561
  ` attach used ${t.root}, the root this mesh resolved to. The other one is not being used, and is worth a look.`);
521
- const auth = t.spaceAuth;
522
- if (!auth)
523
- return {
524
- ok: false, kind: "fatal",
525
- message: attachNoSeedMessage(t),
526
- };
562
+ const tls = t.auth.tls === true;
527
563
  const id = newIdentity();
528
- const creds = await mintCreds(auth, id, "session-caller", {
529
- sessionCaller: { endpoint: grant.endpoint, sessionId: grant.sessionId, epoch: grant.serving.epoch },
530
- expiresAt: Math.floor(grant.exp / 1000), // grant.exp is ms (now+ttlMs); the JWT exp is seconds
531
- });
564
+ // WHICH CONTRACT redeems this grant is decided ONCE, by the recorded mesh mode, and the answer is
565
+ // a value this function then carries. It is never re-derived from the absence of a seed: that
566
+ // inference is issue #1205 itself, where an open mesh (which holds no seed BY DESIGN) was read as
567
+ // a static mesh whose seed had gone missing, and every open attach was refused.
568
+ const material = attachSessionMaterial(t);
569
+ if (material.kind === "fatal")
570
+ return { ok: false, kind: "fatal", message: material.message };
571
+ const link = material.kind === "bare"
572
+ // An open mesh has no credential system: the same bare connection the control round trip
573
+ // already used opens the caller rail. Nothing is minted and nothing is invented.
574
+ ? { mode: "bare", tls }
575
+ : {
576
+ mode: "session-caller",
577
+ tls,
578
+ creds: await mintCreds(material.auth, id, "session-caller", {
579
+ sessionCaller: { endpoint: grant.endpoint, sessionId: grant.sessionId, epoch: grant.serving.epoch },
580
+ expiresAt: Math.floor(grant.exp / 1000), // grant.exp is ms (now+ttlMs); the JWT exp is seconds
581
+ }),
582
+ };
532
583
  // maxReconnectAttempts is the whole difference between the two modes, and it is deliberate.
533
584
  // ONE-SHOT keeps the old -1: the NATS layer redials forever under a single session.
534
585
  // RECONNECTING uses 0, because that redial is what breaks the attach rather than saving it — the
@@ -539,7 +590,7 @@ async function establishAttachSession(v, on, reconnect, first) {
539
590
  // real repaint, instead of a restored socket over a session that ended without us.
540
591
  const nc = await dialerFor(t.server)({
541
592
  servers: t.server,
542
- ...standaloneConnectOpts({ creds, tls: false }),
593
+ ...redeemConnectOpts(link),
543
594
  inboxPrefix: `_INBOX_${id.id}`,
544
595
  maxReconnectAttempts: reconnect ? 0 : -1,
545
596
  // Detection latency is part of the defect, not a detail of it. A laptop waking from sleep does
@@ -553,21 +604,46 @@ async function establishAttachSession(v, on, reconnect, first) {
553
604
  // half-opens a link is what would grade this line, and it does not exist here yet.
554
605
  ...(reconnect ? { pingInterval: 10_000 } : {}),
555
606
  });
556
- return { ok: true, nc, grant, creds, inbox: id.id, server: t.server };
607
+ return { ok: true, nc, grant, link, inbox: id.id, server: t.server };
557
608
  }
558
- /** Why attach cannot redeem a session grant, said in terms of what the command actually resolved.
559
- *
560
- * Three distinct states, kept distinct because the remedy differs and a single sentence covering
561
- * all three is the defect issue #722 opened on (its old text named an internal work item and no
562
- * root at all). A USER-AUTH mesh holds no local seed by design. A REGISTERED static mesh has a
563
- * root and it is named, so an operator can see which directory the command used rather than
564
- * guessing at their cwd.
609
+ /** The ONE place a {@link RedeemLink} becomes NATS connect options. Both connections on the redeem
610
+ * path (the session link and the abandoned-session hand-back) go through here, so neither can
611
+ * invent a credential for an open mesh or drop one on a sealed mesh, and a third caller gets the
612
+ * same two arms for free. */
613
+ export function redeemConnectOpts(link) {
614
+ return link.mode === "bare"
615
+ ? standaloneConnectOpts({ tls: link.tls })
616
+ : standaloneConnectOpts({ creds: link.creds, tls: link.tls });
617
+ }
618
+ /**
619
+ * Which redeem contract this target gets: a bare open-mesh connection, a seed-backed mint, or a
620
+ * loud refusal. Graded by `smoke:attach-open-mode`, whose mutations flip each arm in turn.
565
621
  *
566
- * The third arm is an INVARIANT, not advice, and is written that way on purpose. A connection with
567
- * no resolved root is what the type allows, and no supported route reaches redemption in that
568
- * state: both off-registry routes are refused earlier, which `smoke:attach-auth-root` measures
569
- * rather than assumes. So that arm says what its own existence would mean instead of offering a
570
- * remedy for a situation that cannot currently arise. */
622
+ * EXHAUSTIVE over the three recorded modes on purpose, with `user` named rather than reached by
623
+ * fallthrough. A `user` entry holds no local seed by design and its two-step redemption is not
624
+ * wired, so it must refuse even on the day a user-mode root happens to carry static material on
625
+ * disk; letting it fall through to the seed test would silently mint on the wrong identity plane.
626
+ * An UNRECORDED mode (a raw off-registry connection) is the conservative arm: it is not known to be
627
+ * open, so it takes the sealed test and refuses without a seed.
628
+ */
629
+ export function attachSessionMaterial(t) {
630
+ switch (t.mode) {
631
+ // An OPEN mesh: no credential system at all, so there is no seed to be missing and nothing to
632
+ // mint. This is the arm issue #1205 did not have.
633
+ case "open":
634
+ return { kind: "bare" };
635
+ // A USER mesh: refused by name, and refused EVEN IF a seed is present, because the bearer plane
636
+ // is the control surface there and static material would be the wrong identity.
637
+ case "user":
638
+ return { kind: "fatal", message: attachNoSeedMessage(t) };
639
+ // SEALED (`auth`) and unrecorded: the seed is required, and its absence is a refusal. A sealed
640
+ // mesh must never be rescued by the open arm — that is the failure a fix for #1205 is most
641
+ // likely to introduce, and `smoke:attach-open-mode` asserts the refusal by name against a live
642
+ // sealed broker.
643
+ default:
644
+ return t.spaceAuth ? { kind: "mint", auth: t.spaceAuth } : { kind: "fatal", message: attachNoSeedMessage(t) };
645
+ }
646
+ }
571
647
  function attachNoSeedMessage(t) {
572
648
  const shadow = t.root === undefined ? undefined : divergentCwdAnchor(t.root, t.space);
573
649
  const shadowLine = shadow
@@ -578,7 +654,7 @@ function attachNoSeedMessage(t) {
578
654
  return `${head}\n broker ${t.server}\n This is a USER-AUTH mesh, which holds no local seed by design; two-step user-mode redemption is not wired yet, so attach is unavailable on it from every directory, not just this one.${shadowLine}`;
579
655
  if (t.root === undefined)
580
656
  return `${head}\n broker ${t.server}\n This connection resolved NO checkout root, and no supported route reaches redemption in that state: an off-registry \`--server\` on an unregistered space is refused for missing credentials, and \`--creds\` is refused at the control surface, both before a session grant is asked for. Reaching this sentence means a route now exists that skips both refusals.${shadowLine}`;
581
- return `${head}\n broker ${t.server}\n resolved root ${t.root}\n A static-auth mesh keeps this space's seed under <root>/.cotal/auth. That root is what this command resolved and connected with, so if it is not the checkout holding this space's auth, re-register the mesh with \`cotal meshes add ${t.space} --server ${t.server} --root <dir>\`.${shadowLine}`;
657
+ return `${head}\n broker ${t.server}\n resolved root ${t.root}\n This is a static-auth mesh. Attach still needs this space's seed under ${t.root}/.cotal/auth. Restore the seed at that checkout. This mesh is not open, so attach will not connect without the seed.${shadowLine}`;
582
658
  }
583
659
  /**
584
660
  * Tell the manager a session is over, so it gets its slot back.
@@ -590,15 +666,16 @@ function attachNoSeedMessage(t) {
590
666
  * to 2 — one slot per outage, held until the seat or the manager ends it, against a ceiling of 64.
591
667
  *
592
668
  * The mechanism is the advisory close frame the rail already defines; the manager's bridge ends on
593
- * it. It has to be published with THIS session's caller credential, the only one scoped to this
594
- * session's subjects, so a re-establishment cannot send it on the abandoned session's behalf — a
595
- * fresh session's credential covers a fresh session's subjects. Hence a short-lived connection
596
- * minted from the credential the abandoned session already had.
669
+ * it. On a static-auth mesh it has to be published with THIS session's caller credential, the only
670
+ * one scoped to this session's subjects, so a re-establishment cannot send it on the abandoned
671
+ * session's behalf. On a registered open mesh there is no session-caller seed: the same bare
672
+ * connection the session used hands the slot back. Hence a short-lived connection minted from the
673
+ * abandoned session's own material, never an invented seed.
597
674
  */
598
675
  async function releaseAbandonedSession(s) {
599
676
  const nc = await dialerFor(s.server)({
600
677
  servers: s.server,
601
- ...standaloneConnectOpts({ creds: s.creds, tls: false }),
678
+ ...redeemConnectOpts(s.link),
602
679
  inboxPrefix: `_INBOX_${s.inbox}`,
603
680
  maxReconnectAttempts: 0,
604
681
  timeout: LINK_DEADLINE_MS,
@@ -799,7 +876,7 @@ async function runAttachLoop(vv, pin, reconnect, key, hold) {
799
876
  releaseStdin();
800
877
  const late = await attempting.catch(() => undefined);
801
878
  if (late?.ok) {
802
- abandoned.push({ grant: late.grant, creds: late.creds, inbox: late.inbox, server: late.server });
879
+ abandoned.push({ grant: late.grant, link: late.link, inbox: late.inbox, server: late.server });
803
880
  // And CLOSE the link that session came up on. Nothing here will ever read it, and an open
804
881
  // NATS connection is a ref'd handle: measured, the attach printed `detached from` and then
805
882
  // sat there forever, because the hand-back mints its own short-lived connection from the
@@ -877,7 +954,7 @@ async function runAttachLoop(vv, pin, reconnect, key, hold) {
877
954
  handedBack = await flushed(est.nc);
878
955
  }
879
956
  if (!handedBack && reconnect) {
880
- abandoned.push({ grant: est.grant, creds: est.creds, inbox: est.inbox, server: est.server });
957
+ abandoned.push({ grant: est.grant, link: est.link, inbox: est.inbox, server: est.server });
881
958
  }
882
959
  await closeLink(est.nc);
883
960
  }