@cotal-ai/workspace 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth-paths.d.ts +1 -1
- package/dist/auth-paths.d.ts.map +1 -1
- package/dist/auth-paths.js +4 -3
- package/dist/auth-paths.js.map +1 -1
- package/dist/bin-path.d.ts +21 -0
- package/dist/bin-path.d.ts.map +1 -0
- package/dist/bin-path.js +96 -0
- package/dist/bin-path.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mesh-registry.d.ts +5 -3
- package/dist/mesh-registry.d.ts.map +1 -1
- package/dist/mesh-registry.js +19 -11
- package/dist/mesh-registry.js.map +1 -1
- package/dist/preflight.d.ts +7 -4
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +9 -7
- package/dist/preflight.js.map +1 -1
- package/package.json +2 -2
package/dist/auth-paths.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SpaceAuth } from "@cotal-ai/core";
|
|
2
2
|
export declare function authDir(root: string): string;
|
|
3
3
|
/** Find the project's `.cotal/` by walking up from `start` (like git finds `.git`), returning the
|
|
4
4
|
* directory that *contains* `.cotal/`. Falls back to `start` when none is found up the tree (a
|
package/dist/auth-paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-paths.d.ts","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"auth-paths.d.ts","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAe9E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;iGAEiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,CAQnE;AAED;;iGAEiG;AACjG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAIhE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAIhE"}
|
package/dist/auth-paths.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { existsSync,
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join, dirname, resolve } from "node:path";
|
|
3
|
+
import { mkSecretDir, writeSecretFile } from "@cotal-ai/core";
|
|
3
4
|
/**
|
|
4
5
|
* On-disk auth-material I/O for a local checkout's `.cotal/` — machine-local path resolution plus
|
|
5
6
|
* reading/writing the space trust material. Lives in `@cotal-ai/workspace` (not core) because it's a
|
|
@@ -32,9 +33,9 @@ export function findCotalRoot(start = process.cwd()) {
|
|
|
32
33
|
* The system-account `sys.signingSeed` is STRIPPED before writing: it is broker-admin minting capability,
|
|
33
34
|
* so it never lands on disk (it lives only in the in-memory {@link createSpaceAuth} result). */
|
|
34
35
|
export function saveSpaceAuth(dir, auth) {
|
|
35
|
-
|
|
36
|
+
mkSecretDir(dir); // harden the auth dir BEFORE the secret lands (private ACL on win32, 0700 POSIX)
|
|
36
37
|
const onDisk = { ...auth, sys: { pub: auth.sys.pub, jwt: auth.sys.jwt } };
|
|
37
|
-
|
|
38
|
+
writeSecretFile(join(dir, AUTH_FILE), JSON.stringify(onDisk, null, 2));
|
|
38
39
|
}
|
|
39
40
|
/** Load the space trust material, or undefined if auth was never set up here. */
|
|
40
41
|
export function loadSpaceAuth(dir) {
|
package/dist/auth-paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-paths.js","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"auth-paths.js","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAE9E;;;;;;;;;GASG;AAEH,MAAM,SAAS,GAAG,WAAW,CAAC;AAE9B,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;iGAEiG;AACjG,MAAM,UAAU,aAAa,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IACzD,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;iGAEiG;AACjG,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,IAAe;IACxD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,iFAAiF;IACnG,MAAM,MAAM,GAAc,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;IACrF,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAc,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve `bin` to a concrete executable path, or `undefined` if not found. The single shared
|
|
3
|
+
* resolver behind every "is this binary available / what exactly will we launch" decision:
|
|
4
|
+
* - a connector's `requires` preflight (manager + CLI manifest) — boolean-ised as `!!resolveOnPath(bin)`;
|
|
5
|
+
* - the PtyRuntime, which launches the EXACT path returned (resolve once; never validate one file
|
|
6
|
+
* and then launch a different one).
|
|
7
|
+
*
|
|
8
|
+
* `env` is explicit so a caller resolves against the SAME environment it will act on. Preflights pass
|
|
9
|
+
* the operator env (default `process.env`); the PtyRuntime passes `spec.env` — its post-P3-isolation
|
|
10
|
+
* launch env — so executable selection can't escape isolation: a poisoned manager PATH can't make the
|
|
11
|
+
* child launch a different shim than the preflight saw.
|
|
12
|
+
*
|
|
13
|
+
* POSIX: the name IS the file — a bare name is looked up across PATH, an explicit path checked as
|
|
14
|
+
* given, each via `accessSync(X_OK)`. Windows: there is no execute bit, so `accessSync(X_OK)` is
|
|
15
|
+
* existence-only; a bare name (or a path lacking a known executable extension) is tried against each
|
|
16
|
+
* `PATHEXT` extension IN ORDER — executables before scripts — so a real `claude.exe` beats a
|
|
17
|
+
* `claude.cmd` shim in the same directory; a name that already carries a `PATHEXT` extension is taken
|
|
18
|
+
* as-is.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveOnPath(bin: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
21
|
+
//# sourceMappingURL=bin-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-path.d.ts","sourceRoot":"","sources":["../src/bin-path.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAmDnG"}
|
package/dist/bin-path.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import { join, delimiter, resolve, extname } from "node:path";
|
|
3
|
+
const isWindows = process.platform === "win32";
|
|
4
|
+
/**
|
|
5
|
+
* Fallback executable extensions when `PATHEXT` is unset — a deliberately NARROWED subset of
|
|
6
|
+
* cmd.exe's documented default (which also carries `.VBS/.VBE/.JS/.JSE/.WSF/.WSH/.MSC`), ordered so
|
|
7
|
+
* a real executable (`.COM`/`.EXE`) wins over a script shim (`.BAT`/`.CMD`) when both share a
|
|
8
|
+
* directory. NOT "the cmd default" — only the extensions Cotal knows how to launch.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD";
|
|
11
|
+
/** Read an env var by canonical name, case-insensitively. `env` may be a plain object (a launch
|
|
12
|
+
* `spec.env`), not Node's case-folding Windows `process.env` proxy, and on Windows `PATH`/`PATHEXT`
|
|
13
|
+
* can arrive under any casing (`Path`, `Pathext`). Exact hit wins; else first case-insensitive match. */
|
|
14
|
+
function envGet(env, name) {
|
|
15
|
+
if (env[name] !== undefined)
|
|
16
|
+
return env[name];
|
|
17
|
+
const lower = name.toLowerCase();
|
|
18
|
+
for (const key of Object.keys(env))
|
|
19
|
+
if (key.toLowerCase() === lower)
|
|
20
|
+
return env[key];
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve `bin` to a concrete executable path, or `undefined` if not found. The single shared
|
|
25
|
+
* resolver behind every "is this binary available / what exactly will we launch" decision:
|
|
26
|
+
* - a connector's `requires` preflight (manager + CLI manifest) — boolean-ised as `!!resolveOnPath(bin)`;
|
|
27
|
+
* - the PtyRuntime, which launches the EXACT path returned (resolve once; never validate one file
|
|
28
|
+
* and then launch a different one).
|
|
29
|
+
*
|
|
30
|
+
* `env` is explicit so a caller resolves against the SAME environment it will act on. Preflights pass
|
|
31
|
+
* the operator env (default `process.env`); the PtyRuntime passes `spec.env` — its post-P3-isolation
|
|
32
|
+
* launch env — so executable selection can't escape isolation: a poisoned manager PATH can't make the
|
|
33
|
+
* child launch a different shim than the preflight saw.
|
|
34
|
+
*
|
|
35
|
+
* POSIX: the name IS the file — a bare name is looked up across PATH, an explicit path checked as
|
|
36
|
+
* given, each via `accessSync(X_OK)`. Windows: there is no execute bit, so `accessSync(X_OK)` is
|
|
37
|
+
* existence-only; a bare name (or a path lacking a known executable extension) is tried against each
|
|
38
|
+
* `PATHEXT` extension IN ORDER — executables before scripts — so a real `claude.exe` beats a
|
|
39
|
+
* `claude.cmd` shim in the same directory; a name that already carries a `PATHEXT` extension is taken
|
|
40
|
+
* as-is.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveOnPath(bin, env = process.env) {
|
|
43
|
+
// Probe `.COM`/`.EXE` FIRST and ALWAYS — independent of what PATHEXT contains OR its order, because
|
|
44
|
+
// they're always executable on Windows. Then the script extensions PATHEXT actually lists (or our
|
|
45
|
+
// default), in their order. So a co-located `foo.exe` always wins over a `foo.cmd` shim, and a
|
|
46
|
+
// stripped/reordered/hostile PATHEXT (even one that OMITS `.EXE`) can't force shim selection. (A
|
|
47
|
+
// deliberate divergence from cmd's strict PATHEXT-order lookup: a real `.exe` launches directly;
|
|
48
|
+
// a shim needs a cmd.exe wrapper.)
|
|
49
|
+
const isExecutableExt = (e) => e.toLowerCase() === ".com" || e.toLowerCase() === ".exe";
|
|
50
|
+
const scriptExts = isWindows
|
|
51
|
+
? (envGet(env, "PATHEXT") ?? DEFAULT_PATHEXT)
|
|
52
|
+
.split(";")
|
|
53
|
+
.map((e) => e.trim())
|
|
54
|
+
.filter((e) => e && !isExecutableExt(e))
|
|
55
|
+
: [];
|
|
56
|
+
const exts = isWindows ? [".COM", ".EXE", ...scriptExts] : [];
|
|
57
|
+
// An explicit extension is honored as-is when it's one Cotal launches (`.com/.exe/.bat/.cmd`) or one
|
|
58
|
+
// PATHEXT lists — so `foo.cmd` is taken literally even when a stripped PATHEXT omits `.CMD`.
|
|
59
|
+
const honorExts = isWindows
|
|
60
|
+
? new Set([".com", ".exe", ".bat", ".cmd", ...scriptExts].map((e) => e.toLowerCase()))
|
|
61
|
+
: new Set();
|
|
62
|
+
// The candidate filenames to probe for one base path. POSIX: just the base. Windows: the base
|
|
63
|
+
// as-is when it already carries a known executable/script extension, else the base + each ext.
|
|
64
|
+
const candidates = (base) => {
|
|
65
|
+
if (!isWindows)
|
|
66
|
+
return [base];
|
|
67
|
+
const ext = extname(base).toLowerCase();
|
|
68
|
+
if (ext && honorExts.has(ext))
|
|
69
|
+
return [base];
|
|
70
|
+
return exts.map((e) => base + e);
|
|
71
|
+
};
|
|
72
|
+
const probe = (base) => {
|
|
73
|
+
for (const cand of candidates(base)) {
|
|
74
|
+
try {
|
|
75
|
+
accessSync(cand, constants.X_OK);
|
|
76
|
+
return cand;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// not this candidate — keep trying
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
};
|
|
84
|
+
// An explicit path (absolute or with a separator) is checked as given, never PATH-scanned.
|
|
85
|
+
if (bin.includes("/") || bin.includes("\\"))
|
|
86
|
+
return probe(resolve(bin));
|
|
87
|
+
for (const dir of (envGet(env, "PATH") ?? "").split(delimiter)) {
|
|
88
|
+
if (!dir)
|
|
89
|
+
continue;
|
|
90
|
+
const hit = probe(join(dir, bin));
|
|
91
|
+
if (hit)
|
|
92
|
+
return hit;
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=bin-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-path.js","sourceRoot":"","sources":["../src/bin-path.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
package/dist/mesh-registry.d.ts
CHANGED
|
@@ -22,9 +22,11 @@ export interface MeshEntry {
|
|
|
22
22
|
/** ISO timestamp of when the record was written. */
|
|
23
23
|
ts: string;
|
|
24
24
|
}
|
|
25
|
-
/** The cotal machine-home dir
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
/** The cotal machine-home dir, overridable via `COTAL_HOME` so tests sandbox it and never touch the
|
|
26
|
+
* real one. POSIX: `~/.cotal`. Windows: `%LOCALAPPDATA%\Cotal` — the platform's place for per-user
|
|
27
|
+
* app state (a dotdir in the profile root is a Unix idiom; `%LOCALAPPDATA%` is already a per-user
|
|
28
|
+
* private dir, so secrets under it start owner-only). The single source of that path for the
|
|
29
|
+
* registry, the current pointer, and the onboard marker. */
|
|
28
30
|
export declare function homeCotalDir(): string;
|
|
29
31
|
/** Directory holding the per-mesh registry files (`~/.cotal/meshes`). */
|
|
30
32
|
export declare function meshesDir(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-registry.d.ts","sourceRoot":"","sources":["../src/mesh-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mesh-registry.d.ts","sourceRoot":"","sources":["../src/mesh-registry.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAS;IACxB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;6DAI6D;AAC7D,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AAED,yEAAyE;AACzE,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAUD,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAW7C;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;2CAC2C;AAC3C,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAgBxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE7D;AAED;;oBAEoB;AACpB,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAM/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
|
package/dist/mesh-registry.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync, readdirSync, renameSync, rmSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
4
|
+
import { mkSecretDir, writeSecretFile } from "@cotal-ai/core";
|
|
5
|
+
/** The cotal machine-home dir, overridable via `COTAL_HOME` so tests sandbox it and never touch the
|
|
6
|
+
* real one. POSIX: `~/.cotal`. Windows: `%LOCALAPPDATA%\Cotal` — the platform's place for per-user
|
|
7
|
+
* app state (a dotdir in the profile root is a Unix idiom; `%LOCALAPPDATA%` is already a per-user
|
|
8
|
+
* private dir, so secrets under it start owner-only). The single source of that path for the
|
|
9
|
+
* registry, the current pointer, and the onboard marker. */
|
|
7
10
|
export function homeCotalDir() {
|
|
8
|
-
|
|
11
|
+
if (process.env.COTAL_HOME)
|
|
12
|
+
return process.env.COTAL_HOME;
|
|
13
|
+
if (process.platform === "win32" && process.env.LOCALAPPDATA)
|
|
14
|
+
return join(process.env.LOCALAPPDATA, "Cotal");
|
|
15
|
+
return join(homedir(), ".cotal");
|
|
9
16
|
}
|
|
10
17
|
/** Directory holding the per-mesh registry files (`~/.cotal/meshes`). */
|
|
11
18
|
export function meshesDir() {
|
|
@@ -19,14 +26,15 @@ function currentFile() {
|
|
|
19
26
|
}
|
|
20
27
|
/** Record (or refresh) a running mesh — atomic write, 0600 (the file points at a secrets dir). */
|
|
21
28
|
export function recordMesh(m) {
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
29
|
+
// The filenames in here ARE the space names, so a world-traversable dir would leak them to other
|
|
30
|
+
// local users even though the file contents are private. Keep the dir readable only by us
|
|
31
|
+
// (0700 POSIX / hardened ACL win32).
|
|
32
|
+
mkSecretDir(meshesDir());
|
|
25
33
|
const file = meshFile(m.space);
|
|
26
34
|
// Per-process temp name so two concurrent `up`s for the same space can't stomp each other's
|
|
27
35
|
// half-written file before the rename.
|
|
28
36
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
29
|
-
|
|
37
|
+
writeSecretFile(tmp, JSON.stringify(m, null, 2)); // hardened before rename; rename preserves the ACL/mode
|
|
30
38
|
renameSync(tmp, file); // atomic replace — a reader never sees a half-written record
|
|
31
39
|
}
|
|
32
40
|
/** Drop a mesh from the registry (on `cotal down` / a stale-entry prune). Absent ⇒ no-op. */
|
|
@@ -69,8 +77,8 @@ export function getCurrent() {
|
|
|
69
77
|
}
|
|
70
78
|
}
|
|
71
79
|
export function setCurrent(space) {
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
mkSecretDir(homeCotalDir());
|
|
81
|
+
writeSecretFile(currentFile(), space);
|
|
74
82
|
}
|
|
75
83
|
export function clearCurrent() {
|
|
76
84
|
rmSync(currentFile(), { force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-registry.js","sourceRoot":"","sources":["../src/mesh-registry.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mesh-registry.js","sourceRoot":"","sources":["../src/mesh-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/preflight.d.ts
CHANGED
|
@@ -37,10 +37,13 @@ export declare function preflightTarget(target: MeshTarget, probeCreds?: string)
|
|
|
37
37
|
}>;
|
|
38
38
|
/**
|
|
39
39
|
* Drop registry entries whose broker is gone — a `cotal up` that crashed or was `kill -9`'d without
|
|
40
|
-
* `cotal down` leaves a record behind.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
40
|
+
* `cotal down` leaves a record behind. This is liveness-only and we hold NO creds for these meshes,
|
|
41
|
+
* so it uses the silent TCP+INFO {@link isReachable} probe — NOT a credless `probeConnect`, whose
|
|
42
|
+
* auth-rejection-as-liveness would log a broker auth error on every live AUTH mesh it sweeps.
|
|
43
|
+
* `isReachable` is true for any live broker (open or auth, since INFO precedes auth); only a truly
|
|
44
|
+
* dead one (refused/timeout) prunes. An EXPLICIT call (never wired into resolution itself), so
|
|
45
|
+
* registry mutation stays opt-in: callers that act on the registry (`spawn`/`use`/`meshes`, the
|
|
46
|
+
* manager control commands) invoke it; `<TAB>` completion must not.
|
|
44
47
|
*/
|
|
45
48
|
export declare function pruneStaleMeshes(): Promise<void>;
|
|
46
49
|
//# sourceMappingURL=preflight.d.ts.map
|
package/dist/preflight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;;GAUG;AAEH;;kGAEkG;AAClG,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,yBAAyB,GACzB,wBAAwB,GACxB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB;;;;;oGAKoG;AACpG,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,MAAM,EAAE,eAAe,GAAG,aAAa,EACvC,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAa5C;AAED;;;uFAGuF;AACvF,wBAAsB,eAAe,CACnC,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAO/E;AAED
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;;GAUG;AAEH;;kGAEkG;AAClG,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,yBAAyB,GACzB,wBAAwB,GACxB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB;;;;;oGAKoG;AACpG,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,MAAM,EAAE,eAAe,GAAG,aAAa,EACvC,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAa5C;AAED;;;uFAGuF;AACvF,wBAAsB,eAAe,CACnC,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAO/E;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD"}
|
package/dist/preflight.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mintCreds, newIdentity, probeConnect } from "@cotal-ai/core";
|
|
1
|
+
import { mintCreds, newIdentity, probeConnect, isReachable } from "@cotal-ai/core";
|
|
2
2
|
import { loadMeshes, removeMesh } from "./mesh-registry.js";
|
|
3
3
|
/** Pure decision tree — separated from I/O so the whole branch tree is unit-testable (it's the
|
|
4
4
|
* riskiest logic: a wrong branch prunes a LIVE registry entry). Only a registry-OWNED source
|
|
@@ -37,15 +37,17 @@ export async function preflightTarget(target, probeCreds) {
|
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Drop registry entries whose broker is gone — a `cotal up` that crashed or was `kill -9`'d without
|
|
40
|
-
* `cotal down` leaves a record behind.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
40
|
+
* `cotal down` leaves a record behind. This is liveness-only and we hold NO creds for these meshes,
|
|
41
|
+
* so it uses the silent TCP+INFO {@link isReachable} probe — NOT a credless `probeConnect`, whose
|
|
42
|
+
* auth-rejection-as-liveness would log a broker auth error on every live AUTH mesh it sweeps.
|
|
43
|
+
* `isReachable` is true for any live broker (open or auth, since INFO precedes auth); only a truly
|
|
44
|
+
* dead one (refused/timeout) prunes. An EXPLICIT call (never wired into resolution itself), so
|
|
45
|
+
* registry mutation stays opt-in: callers that act on the registry (`spawn`/`use`/`meshes`, the
|
|
46
|
+
* manager control commands) invoke it; `<TAB>` completion must not.
|
|
44
47
|
*/
|
|
45
48
|
export async function pruneStaleMeshes() {
|
|
46
49
|
await Promise.all(loadMeshes().map(async (m) => {
|
|
47
|
-
|
|
48
|
-
if (!r.ok && r.reason === "unreachable")
|
|
50
|
+
if (!(await isReachable(m.server)))
|
|
49
51
|
removeMesh(m.space);
|
|
50
52
|
}));
|
|
51
53
|
}
|
package/dist/preflight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAyB5D;;;;;oGAKoG;AACpG,MAAM,UAAU,wBAAwB,CACtC,MAA4B,EAC5B,MAAuC,EACvC,OAAgB;IAEhB,mGAAmG;IACnG,iGAAiG;IACjG,MAAM,YAAY,GAChB,MAAM,KAAK,UAAU;QACrB,MAAM,KAAK,SAAS;QACpB,MAAM,KAAK,YAAY;QACvB,MAAM,KAAK,gBAAgB,CAAC;IAC9B,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAClF,IAAI,YAAY,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;IACrF,IAAI,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACzE,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;AACnD,CAAC;AAED;;;uFAGuF;AACvF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAkB,EAClB,UAAmB;IAEnB,MAAM,KAAK,GACT,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cotal-ai/workspace",
|
|
3
3
|
"description": "Cotal machine-local workstation layer: the ~/.cotal mesh registry, target resolution, preflight, on-disk auth-path I/O, and the command-copy renderer — operator concerns over a local checkout, kept separate from the wire protocol in @cotal-ai/core.",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.2",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@cotal-ai/core": "0.8.
|
|
21
|
+
"@cotal-ai/core": "0.8.2"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"dist"
|