@cotal-ai/cli 0.11.6 → 0.13.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 (91) hide show
  1. package/dist/commands/backup.d.ts +13 -0
  2. package/dist/commands/backup.d.ts.map +1 -0
  3. package/dist/commands/backup.js +443 -0
  4. package/dist/commands/backup.js.map +1 -0
  5. package/dist/commands/channels.d.ts +10 -0
  6. package/dist/commands/channels.d.ts.map +1 -1
  7. package/dist/commands/channels.js.map +1 -1
  8. package/dist/commands/clean.d.ts +12 -2
  9. package/dist/commands/clean.d.ts.map +1 -1
  10. package/dist/commands/clean.js +174 -28
  11. package/dist/commands/clean.js.map +1 -1
  12. package/dist/commands/down-manifest.d.ts.map +1 -1
  13. package/dist/commands/down-manifest.js +83 -16
  14. package/dist/commands/down-manifest.js.map +1 -1
  15. package/dist/commands/down.d.ts +5 -0
  16. package/dist/commands/down.d.ts.map +1 -1
  17. package/dist/commands/down.js +367 -5
  18. package/dist/commands/down.js.map +1 -1
  19. package/dist/commands/join.d.ts.map +1 -1
  20. package/dist/commands/join.js +46 -1
  21. package/dist/commands/join.js.map +1 -1
  22. package/dist/commands/mint.d.ts.map +1 -1
  23. package/dist/commands/mint.js +19 -5
  24. package/dist/commands/mint.js.map +1 -1
  25. package/dist/commands/spawn.d.ts +4 -0
  26. package/dist/commands/spawn.d.ts.map +1 -1
  27. package/dist/commands/spawn.js +81 -42
  28. package/dist/commands/spawn.js.map +1 -1
  29. package/dist/commands/status.d.ts.map +1 -1
  30. package/dist/commands/status.js +3 -2
  31. package/dist/commands/status.js.map +1 -1
  32. package/dist/commands/up.d.ts +12 -0
  33. package/dist/commands/up.d.ts.map +1 -1
  34. package/dist/commands/up.js +1149 -193
  35. package/dist/commands/up.js.map +1 -1
  36. package/dist/commands/use.d.ts +3 -3
  37. package/dist/commands/use.d.ts.map +1 -1
  38. package/dist/commands/use.js +3 -3
  39. package/dist/commands/use.js.map +1 -1
  40. package/dist/console/app.js +1 -1
  41. package/dist/console/app.js.map +1 -1
  42. package/dist/console/ui/NeedsYou.js +1 -1
  43. package/dist/console/ui/NeedsYou.js.map +1 -1
  44. package/dist/console/ui/Tiles.d.ts +6 -3
  45. package/dist/console/ui/Tiles.d.ts.map +1 -1
  46. package/dist/console/ui/Tiles.js +6 -3
  47. package/dist/console/ui/Tiles.js.map +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +21 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/auth-proc.d.ts +21 -0
  52. package/dist/lib/auth-proc.d.ts.map +1 -1
  53. package/dist/lib/auth-proc.js +89 -15
  54. package/dist/lib/auth-proc.js.map +1 -1
  55. package/dist/lib/backup-artifact.d.ts +50 -0
  56. package/dist/lib/backup-artifact.d.ts.map +1 -0
  57. package/dist/lib/backup-artifact.js +290 -0
  58. package/dist/lib/backup-artifact.js.map +1 -0
  59. package/dist/lib/delivery-proc.d.ts +7 -2
  60. package/dist/lib/delivery-proc.d.ts.map +1 -1
  61. package/dist/lib/delivery-proc.js +29 -19
  62. package/dist/lib/delivery-proc.js.map +1 -1
  63. package/dist/lib/endpoint-cut.d.ts +5 -0
  64. package/dist/lib/endpoint-cut.d.ts.map +1 -0
  65. package/dist/lib/endpoint-cut.js +53 -0
  66. package/dist/lib/endpoint-cut.js.map +1 -0
  67. package/dist/lib/isolated-broker.d.ts +70 -0
  68. package/dist/lib/isolated-broker.d.ts.map +1 -0
  69. package/dist/lib/isolated-broker.js +436 -0
  70. package/dist/lib/isolated-broker.js.map +1 -0
  71. package/dist/lib/maintenance-files.d.ts +10 -0
  72. package/dist/lib/maintenance-files.d.ts.map +1 -0
  73. package/dist/lib/maintenance-files.js +60 -0
  74. package/dist/lib/maintenance-files.js.map +1 -0
  75. package/dist/lib/manager-proc.d.ts +4 -0
  76. package/dist/lib/manager-proc.d.ts.map +1 -1
  77. package/dist/lib/manager-proc.js +2 -0
  78. package/dist/lib/manager-proc.js.map +1 -1
  79. package/dist/lib/manifest/ledger.d.ts +4 -2
  80. package/dist/lib/manifest/ledger.d.ts.map +1 -1
  81. package/dist/lib/manifest/ledger.js +8 -10
  82. package/dist/lib/manifest/ledger.js.map +1 -1
  83. package/dist/lib/restore.d.ts +52 -0
  84. package/dist/lib/restore.d.ts.map +1 -0
  85. package/dist/lib/restore.js +801 -0
  86. package/dist/lib/restore.js.map +1 -0
  87. package/dist/view/mesh-view.d.ts +6 -1
  88. package/dist/view/mesh-view.d.ts.map +1 -1
  89. package/dist/view/mesh-view.js +8 -3
  90. package/dist/view/mesh-view.js.map +1 -1
  91. package/package.json +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-proc.d.ts","sourceRoot":"","sources":["../../src/lib/delivery-proc.ts"],"names":[],"mappings":"AAmBA,KAAK,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAWrG,qGAAqG;AACrG,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAeD;;0GAE0G;AAC1G,wBAAgB,8BAA8B,IAAI,IAAI,CAKrD;AAED;;8FAE8F;AAC9F,wBAAgB,qBAAqB,CAAC,CAAC,GAAE,IAAS,GAAG,MAAM,CAkB1D;AAED;;;;sFAIsF;AACtF,wBAAsB,cAAc,CAAC,CAAC,GAAE,IAAS,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8BhF;AAED,oFAAoF;AACpF,wBAAgB,YAAY,IAAI,IAAI,CAanC;AAED;;;;+FAI+F;AAC/F,wBAAsB,kBAAkB,CAAC,CAAC,GAAE,IAAS,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAIpF"}
1
+ {"version":3,"file":"delivery-proc.d.ts","sourceRoot":"","sources":["../../src/lib/delivery-proc.ts"],"names":[],"mappings":"AAmBA,KAAK,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAWzJ,qGAAqG;AACrG,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAeD;;0GAE0G;AAC1G,wBAAgB,8BAA8B,IAAI,IAAI,CAKrD;AAED;;8FAE8F;AAC9F,wBAAgB,qBAAqB,CAAC,CAAC,GAAE,IAAS,GAAG,MAAM,CAkB1D;AAED;;;;sFAIsF;AACtF,wBAAsB,cAAc,CAAC,CAAC,GAAE,IAAS,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BhF;AAED;;;mDAGmD;AACnD,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBlD;AAED;;;;+FAI+F;AAC/F,wBAAsB,kBAAkB,CAAC,CAAC,GAAE,IAAS,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAIpF"}
@@ -1,13 +1,15 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { existsSync, openSync, closeSync, writeFileSync, readFileSync, rmSync } from "node:fs";
3
- import { DEFAULT_SERVER, mintCreds, mkSecretDir, newIdentity, waitForDeliveryLease, writeSecretFile, } from "@cotal-ai/core";
4
- import { authDir, findCotalRoot, loadSpaceAuth } from "@cotal-ai/workspace";
3
+ import { DEFAULT_SERVER, mintCreds, newIdentity, waitForDeliveryLease, } from "@cotal-ai/core";
4
+ import { DELIVERY_CREDS_KEY, authDir, findCotalRoot, loadSpaceAuth, workspaceSecretStore } from "@cotal-ai/workspace";
5
5
  import { selfArgv } from "./self-exec.js";
6
6
  import { resolveSpace } from "./status.js";
7
7
  import { cotalPath } from "./paths.js";
8
8
  import { ensureManager, managerHasDeliveryMarker, managerUp, stopManager } from "./manager-proc.js";
9
9
  const PID_PATH = () => cotalPath("delivery.pid");
10
- const CREDS_PATH = () => cotalPath("delivery.creds");
10
+ // The daemon's cred goes through the secret-store seam; the shared key (== the filename, so the
11
+ // file stays `.cotal/delivery.creds`) comes from workspace — never a hand-copied literal.
12
+ const credsStore = () => workspaceSecretStore(findCotalRoot());
11
13
  function alive(pid) {
12
14
  try {
13
15
  process.kill(pid, 0);
@@ -89,8 +91,9 @@ export async function ensureDelivery(o = {}) {
89
91
  const space = o.space ?? resolveSpace(process.cwd());
90
92
  const server = o.server ?? DEFAULT_SERVER;
91
93
  if (!deliveryUp()) {
92
- mkSecretDir(cotalPath()); // harden .cotal/ before the cred lands (born under a private ACL, no race)
93
- writeSecretFile(CREDS_PATH(), creds);
94
+ // The store's put hardens `.cotal/` first (the cred is born under a private ACL, no race) and
95
+ // lands it atomically — same path and bytes as before the seam.
96
+ await credsStore().put(DELIVERY_CREDS_KEY, creds);
94
97
  startDeliveryDetached({ ...o, space, server });
95
98
  }
96
99
  // ALWAYS wait for the daemon to be READY (lease flipped ready AFTER it bound ctl.delivery) before
@@ -102,22 +105,29 @@ export async function ensureDelivery(o = {}) {
102
105
  console.error("• delivery daemon not yet ready (responder not bound) - boot durable joins will reconcile when it is");
103
106
  return { running: true };
104
107
  }
105
- /** Stop the detached delivery daemon if we started one, and drop its creds file. */
106
- export function stopDelivery() {
107
- rmSync(CREDS_PATH(), { force: true });
108
- const p = PID_PATH();
109
- if (!existsSync(p))
110
- return;
111
- const pid = Number(readFileSync(p, "utf8").trim());
112
- if (Number.isFinite(pid)) {
113
- try {
114
- process.kill(pid, "SIGTERM");
115
- }
116
- catch {
117
- /* already gone */
108
+ /** Stop the detached delivery daemon if we started one, and drop its creds from the store. The pid
109
+ * kill runs even if the creds delete fails (finally) — a delete error must never leave the daemon
110
+ * alive to outlive the teardown and reattach to a restarted broker; the error still propagates
111
+ * after the kill so the caller can surface it. */
112
+ export async function stopDelivery() {
113
+ try {
114
+ await credsStore().delete(DELIVERY_CREDS_KEY);
115
+ }
116
+ finally {
117
+ const p = PID_PATH();
118
+ if (existsSync(p)) {
119
+ const pid = Number(readFileSync(p, "utf8").trim());
120
+ if (Number.isFinite(pid)) {
121
+ try {
122
+ process.kill(pid, "SIGTERM");
123
+ }
124
+ catch {
125
+ /* already gone */
126
+ }
127
+ }
128
+ rmSync(p);
118
129
  }
119
130
  }
120
- rmSync(p);
121
131
  }
122
132
  /** Bring up the control plane in the correct cutover order: OLD-manager preflight → delivery daemon
123
133
  * (auth only, fails closed on a live old manager) → manager (lifecycle, writes the delivery-aware
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-proc.js","sourceRoot":"","sources":["../../src/lib/delivery-proc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpG,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AACjD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAIrD,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;mDACmD;AACnD,SAAS,OAAO;IACd,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;gDAEgD;AAChD,SAAS,qBAAqB;IAC5B,OAAO,SAAS,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACpD,CAAC;AAED;;0GAE0G;AAC1G,MAAM,UAAU,8BAA8B;IAC5C,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACnH,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;8FAE8F;AAC9F,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE;IAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACX,GAAG,IAAI;QACP,SAAS;QACT,SAAS;QACT,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACtC,UAAU;QACV,CAAC,CAAC,MAAM,IAAI,cAAc;KAC3B,CAAC;IACF,mGAAmG;IACnG,gGAAgG;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxI,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;;;sFAIsF;AACtF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU,EAAE;IAC/C,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,kDAAkD;IAC7F,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CACX,yJAAyJ,CAC1J,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,uGAAuG;IACvG,wGAAwG;IACxG,sGAAsG;IACtG,kBAAkB;IAClB,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAE,CAAC;IACtD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,cAAc,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,2EAA2E;QACrG,eAAe,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,kGAAkG;IAClG,uGAAuG;IACvG,wGAAwG;IACxG,mEAAmE;IACnE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK;QACR,OAAO,CAAC,KAAK,CAAC,sGAAsG,CAAC,CAAC;IACxH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;;+FAI+F;AAC/F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU,EAAE;IACnD,8BAA8B,EAAE,CAAC;IACjC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"delivery-proc.js","sourceRoot":"","sources":["../../src/lib/delivery-proc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACX,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpG,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AACjD,gGAAgG;AAChG,0FAA0F;AAC1F,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC;AAI/D,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;mDACmD;AACnD,SAAS,OAAO;IACd,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;gDAEgD;AAChD,SAAS,qBAAqB;IAC5B,OAAO,SAAS,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACpD,CAAC;AAED;;0GAE0G;AAC1G,MAAM,UAAU,8BAA8B;IAC5C,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACnH,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;8FAE8F;AAC9F,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE;IAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACX,GAAG,IAAI;QACP,SAAS;QACT,SAAS;QACT,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACtC,UAAU;QACV,CAAC,CAAC,MAAM,IAAI,cAAc;KAC3B,CAAC;IACF,mGAAmG;IACnG,gGAAgG;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxI,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;;;sFAIsF;AACtF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU,EAAE;IAC/C,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,kDAAkD;IAC7F,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CACX,yJAAyJ,CAC1J,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,uGAAuG;IACvG,wGAAwG;IACxG,sGAAsG;IACtG,kBAAkB;IAClB,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAE,CAAC;IACtD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,cAAc,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,8FAA8F;QAC9F,gEAAgE;QAChE,MAAM,UAAU,EAAE,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAClD,qBAAqB,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,kGAAkG;IAClG,uGAAuG;IACvG,wGAAwG;IACxG,mEAAmE;IACnE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK;QACR,OAAO,CAAC,KAAK,CAAC,sGAAsG,CAAC,CAAC;IACxH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;mDAGmD;AACnD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,UAAU,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;+FAI+F;AAC/F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU,EAAE;IACnD,8BAA8B,EAAE,CAAC;IACjC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Refuse every positive listener signal, including auth rejection from an otherwise live broker. */
2
+ export declare function assertEndpointUnreachable(server: string): Promise<void>;
3
+ /** Allow normal shutdown latency, but publish no cut while the exact recorded endpoint still answers. */
4
+ export declare function waitForEndpointUnreachable(server: string, timeoutMs?: number): Promise<void>;
5
+ //# sourceMappingURL=endpoint-cut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-cut.d.ts","sourceRoot":"","sources":["../../src/lib/endpoint-cut.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B7E;AAED,yGAAyG;AACzG,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlG"}
@@ -0,0 +1,53 @@
1
+ import { createConnection } from "node:net";
2
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
3
+ /** Refuse every positive listener signal, including auth rejection from an otherwise live broker. */
4
+ export async function assertEndpointUnreachable(server) {
5
+ let endpoint;
6
+ try {
7
+ endpoint = new URL(server);
8
+ }
9
+ catch {
10
+ throw new Error(`maintenance cannot prove invalid recorded NATS endpoint ${server} unreachable`);
11
+ }
12
+ if (!endpoint.hostname || !["nats:", "tls:"].includes(endpoint.protocol))
13
+ throw new Error(`maintenance cannot prove invalid recorded NATS endpoint ${server} unreachable`);
14
+ await new Promise((resolve, reject) => {
15
+ const socket = createConnection({ host: endpoint.hostname, port: Number(endpoint.port) || 4222 });
16
+ let settled = false;
17
+ const finish = (error) => {
18
+ if (settled)
19
+ return;
20
+ settled = true;
21
+ socket.destroy();
22
+ if (error)
23
+ reject(error);
24
+ else
25
+ resolve();
26
+ };
27
+ socket.setTimeout(500);
28
+ socket.once("connect", () => finish(new Error(`maintenance requires the recorded NATS endpoint ${server} to have no listener`)));
29
+ socket.once("timeout", () => finish(new Error(`maintenance could not prove the recorded NATS endpoint ${server} unreachable`)));
30
+ socket.once("error", (error) => {
31
+ if (error.code === "ECONNREFUSED")
32
+ finish();
33
+ else
34
+ finish(new Error(`maintenance could not prove the recorded NATS endpoint ${server} unreachable: ${error.message}`));
35
+ });
36
+ });
37
+ }
38
+ /** Allow normal shutdown latency, but publish no cut while the exact recorded endpoint still answers. */
39
+ export async function waitForEndpointUnreachable(server, timeoutMs = 20_000) {
40
+ const deadline = Date.now() + timeoutMs;
41
+ for (;;) {
42
+ try {
43
+ await assertEndpointUnreachable(server);
44
+ return;
45
+ }
46
+ catch (error) {
47
+ if (Date.now() >= deadline)
48
+ throw error;
49
+ }
50
+ await sleep(100);
51
+ }
52
+ }
53
+ //# sourceMappingURL=endpoint-cut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-cut.js","sourceRoot":"","sources":["../../src/lib/endpoint-cut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhF,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,2DAA2D,MAAM,cAAc,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,2DAA2D,MAAM,cAAc,CAAC,CAAC;IACnG,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAClG,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACjI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0DAA0D,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;QAChI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;YACpD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,MAAM,EAAE,CAAC;;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,0DAA0D,MAAM,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3H,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAAc,EAAE,SAAS,GAAG,MAAM;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,MAAM,KAAK,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { type NatsConnection } from "@nats-io/transport-node";
2
+ import { type BackupPermissionScope, type RestorePermissionScope, type SpaceAuth } from "@cotal-ai/core";
3
+ import type { MaintenanceAuthMode, ProcessOwner } from "@cotal-ai/workspace";
4
+ export interface PrivateAttemptsDirectory {
5
+ path: string;
6
+ identity: {
7
+ dev: bigint;
8
+ ino: bigint;
9
+ };
10
+ }
11
+ export declare function ensurePrivateAttemptsDir(root: string): PrivateAttemptsDirectory;
12
+ /** With the maintenance journal at `ready` and no live claim, nothing may legitimately live in the
13
+ * private attempts directory: every entry is residue of a dead attempt (staging, clones, broker
14
+ * run files) and is removed before new maintenance work begins. Strict — a failed removal aborts
15
+ * the caller rather than proceeding over unowned residue. */
16
+ export declare function sweepAttemptResidue(root: string): void;
17
+ export interface AttemptDirectory {
18
+ path: string;
19
+ identity: {
20
+ dev: bigint;
21
+ ino: bigint;
22
+ };
23
+ cleanup(): void;
24
+ }
25
+ export declare function createAttemptClone(root: string, sourceStore: string, attemptId: string): AttemptDirectory;
26
+ export interface IsolatedRunFile {
27
+ path: string;
28
+ dev: string;
29
+ ino: string;
30
+ }
31
+ export interface IsolatedBroker {
32
+ server: string;
33
+ initialLogin: IsolatedMaintenanceLogin;
34
+ brokerOwner: ProcessOwner;
35
+ watchdogOwner: ProcessOwner;
36
+ /** Attempt-owned run files (config, broker log, pid handshake) for claim journaling. */
37
+ runFiles: readonly IsolatedRunFile[];
38
+ addLogin(scope: IsolatedMaintenanceScope | ((connId: string) => IsolatedMaintenanceScope)): Promise<IsolatedMaintenanceLogin>;
39
+ stop(): Promise<void>;
40
+ }
41
+ export type IsolatedMaintenanceScope = {
42
+ profile: "backup";
43
+ scope: BackupPermissionScope;
44
+ } | {
45
+ profile: "restore";
46
+ scope: RestorePermissionScope;
47
+ } | {
48
+ profile: "infrastructure";
49
+ streams: readonly string[];
50
+ };
51
+ export interface IsolatedMaintenanceLogin {
52
+ readonly user: string;
53
+ readonly pass: string;
54
+ readonly connId: string;
55
+ readonly scope: IsolatedMaintenanceScope;
56
+ }
57
+ export declare function connectIsolatedBroker(broker: Pick<IsolatedBroker, "server">, login: IsolatedMaintenanceLogin): Promise<NatsConnection>;
58
+ export declare function startIsolatedBroker(options: {
59
+ root: string;
60
+ storeDir: string;
61
+ space: string;
62
+ mode: MaintenanceAuthMode;
63
+ auth?: SpaceAuth;
64
+ deadline: Date;
65
+ label: "backup" | "restore" | "quarantine";
66
+ initialScope: IsolatedMaintenanceScope;
67
+ /** Attempt id prefixing the run files, tying them to the journaled maintenance attempt. */
68
+ attemptId?: string;
69
+ }): Promise<IsolatedBroker>;
70
+ //# sourceMappingURL=isolated-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated-broker.d.ts","sourceRoot":"","sources":["../../src/lib/isolated-broker.ts"],"names":[],"mappings":"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"}