@cotal-ai/workspace 0.11.5 → 0.11.6

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.
@@ -49,8 +49,7 @@ export interface ExtensionsManifest {
49
49
  /** The extensions prefix: `<config>/cotal/extensions` — its own npm installation root. */
50
50
  export declare function extensionsDir(): string;
51
51
  export declare function extensionsManifestPath(): string;
52
- /** The extension-prefix writer lock a lock DIRECTORY (see {@link inspectLock}: `mkdir` is the
53
- * portable atomic create-exclusive, with no empty-file window a racer could misread as stale). */
52
+ /** The extension-prefix writer lock. See {@link inspectLock} for its atomic publish/reclaim rules. */
54
53
  export declare function extensionMutationLockPath(): string;
55
54
  export type ExtensionMutationLockState = {
56
55
  readonly state: "absent" | "stale";
@@ -80,6 +79,16 @@ export declare function extensionLocalProcesses(ext: InstalledExtension): readon
80
79
  export declare function extensionProvides(ext: InstalledExtension): readonly ExtensionRef[];
81
80
  /** The installed package's on-disk root inside the prefix. */
82
81
  export declare function extensionPackageDir(pkg: string): string;
82
+ export interface BoundExtensionPeer {
83
+ readonly owner: string;
84
+ readonly peer: string;
85
+ readonly source: string;
86
+ readonly destination: string;
87
+ }
88
+ /** Bind installed extensions' shared peers to the current host. Callers must hold the extension lock. */
89
+ export declare function bindExtensionPeers(owners: readonly string[], operationPkg: string, opts?: {
90
+ force?: boolean;
91
+ }): readonly BoundExtensionPeer[];
83
92
  /** The installed package's CURRENT version, read from disk (undefined when not installed). */
84
93
  export declare function installedExtensionVersion(pkg: string): string | undefined;
85
94
  //# sourceMappingURL=extensions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AAEH;;qBAEqB;AACrB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;oGACgG;IAChG,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAC3B;qFACiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACpD;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;mGACmG;AACnG,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,GACtC;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;+EAC+E;AAC/E,wBAAgB,0BAA0B,IAAI,0BAA0B,CAGvE;AAED;kFACkF;AAClF,wBAAgB,sBAAsB,IAAI,kBAAkB,CAY3D;AAED;qGACqG;AACrG,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAOlE;AAED;yGACyG;AACzG,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,SAAS,CAMjE;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAUxD;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,YAAY,CAE3D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,YAAY,GAAG,YAAY,CAkBvE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,YAAY,EAAE,CAExF;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,YAAY,EAAE,CAElF;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,8FAA8F;AAC9F,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKzE"}
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
1
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
2
2
  import { randomBytes } from "node:crypto";
3
3
  import { basename, dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
4
5
  import { globalConfigDir } from "@cotal-ai/core";
5
6
  import { inspectLock } from "./advisory-lock.js";
6
7
  import { localProcessPath } from "./local-process.js";
@@ -11,8 +12,7 @@ export function extensionsDir() {
11
12
  export function extensionsManifestPath() {
12
13
  return join(extensionsDir(), "extensions.json");
13
14
  }
14
- /** The extension-prefix writer lock a lock DIRECTORY (see {@link inspectLock}: `mkdir` is the
15
- * portable atomic create-exclusive, with no empty-file window a racer could misread as stale). */
15
+ /** The extension-prefix writer lock. See {@link inspectLock} for its atomic publish/reclaim rules. */
16
16
  export function extensionMutationLockPath() {
17
17
  return join(dirname(extensionsDir()), ".extensions.lock");
18
18
  }
@@ -108,6 +108,71 @@ export function extensionProvides(ext) {
108
108
  export function extensionPackageDir(pkg) {
109
109
  return join(extensionsDir(), "node_modules", pkg);
110
110
  }
111
+ /** Locate a shared package in this host's module graph. */
112
+ function hostPackageDir(name) {
113
+ let dir = dirname(fileURLToPath(import.meta.resolve(name)));
114
+ for (;;) {
115
+ const pj = join(dir, "package.json");
116
+ if (existsSync(pj) && JSON.parse(readFileSync(pj, "utf8")).name === name)
117
+ return dir;
118
+ const parent = dirname(dir);
119
+ if (parent === dir)
120
+ throw new Error(`couldn't locate ${name}'s package root from its resolved entry`);
121
+ dir = parent;
122
+ }
123
+ }
124
+ /** Bind installed extensions' shared peers to the current host. Callers must hold the extension lock. */
125
+ export function bindExtensionPeers(owners, operationPkg, opts = {}) {
126
+ const planned = [];
127
+ for (const owner of owners) {
128
+ let meta;
129
+ try {
130
+ meta = JSON.parse(readFileSync(join(extensionPackageDir(owner), "package.json"), "utf8"));
131
+ }
132
+ catch (e) {
133
+ throw new Error(`${operationPkg} cannot preserve installed extension ${owner}'s shared peers: ${e.message}`);
134
+ }
135
+ for (const peer of Object.keys(meta.peerDependencies ?? {}).filter((name) => name.startsWith("@cotal-ai/"))) {
136
+ let source;
137
+ try {
138
+ source = realpathSync(hostPackageDir(peer));
139
+ }
140
+ catch {
141
+ throw new Error(`${operationPkg}: ${owner} peer-depends on ${peer}, which this cotal binary does not carry - the peer can't be linked`);
142
+ }
143
+ planned.push({
144
+ owner,
145
+ peer,
146
+ source,
147
+ destination: join(extensionPackageDir(owner), "node_modules", ...peer.split("/")),
148
+ });
149
+ }
150
+ }
151
+ const bound = [];
152
+ for (const link of planned) {
153
+ let current;
154
+ try {
155
+ current = realpathSync(link.destination);
156
+ }
157
+ catch {
158
+ // Missing and dangling links are both repaired below.
159
+ }
160
+ if (!opts.force && current === link.source)
161
+ continue;
162
+ try {
163
+ rmSync(link.destination, { recursive: true, force: true });
164
+ mkdirSync(dirname(link.destination), { recursive: true });
165
+ symlinkSync(link.source, link.destination, "junction");
166
+ if (realpathSync(link.destination) !== link.source)
167
+ throw new Error("the resulting link resolves to a different package");
168
+ }
169
+ catch (e) {
170
+ throw new Error(`${operationPkg} could not link ${link.peer} for ${link.owner}: ${e.message}`);
171
+ }
172
+ bound.push(link);
173
+ }
174
+ return bound;
175
+ }
111
176
  /** The installed package's CURRENT version, read from disk (undefined when not installed). */
112
177
  export function installedExtensionVersion(pkg) {
113
178
  const p = join(extensionPackageDir(pkg), "package.json");
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAuBzB;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/G;AAiDD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAC3E,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,CAAC,CAAC,CAWZ"}
1
+ {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AA8CzB;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/G;AAiDD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAC3E,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,CAAC,CAAC,CAeZ"}
@@ -2,7 +2,8 @@ import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
4
  import { registry } from "@cotal-ai/core";
5
- import { extensionPackageDir, extensionMutationLockState, extensionProvides, installedExtensionVersion, loadExtensionsManifest, } from "./extensions.js";
5
+ import { bindExtensionPeers, extensionPackageDir, extensionMutationLockPath, extensionProvides, installedExtensionVersion, loadExtensionsManifest, } from "./extensions.js";
6
+ import { acquireLock } from "./advisory-lock.js";
6
7
  /**
7
8
  * The generic manifest-materialize primitive: verify an installed package's version pin, resolve
8
9
  * its entry, and dynamic-`import()` it (which self-registers its extensions into the shared core
@@ -21,6 +22,24 @@ function importFailure(pkg, ext, e) {
21
22
  /** Process-wide single-flight serializer: two `import()`s must not share a staging/validation window,
22
23
  * so their advertised-key checks can't interleave. */
23
24
  let loadChain = Promise.resolve();
25
+ function enqueueLoad(load) {
26
+ const run = loadChain.then(load);
27
+ loadChain = run.then(() => undefined, () => undefined);
28
+ return run;
29
+ }
30
+ async function withExtensionLock(load) {
31
+ const held = acquireLock(extensionMutationLockPath(), {
32
+ label: "extension materialization",
33
+ waitMs: 0,
34
+ onTimeout: (owner) => new Error(`extension install/remove is in progress (pid ${owner.pid}) - retry after the active \`cotal ext\` command finishes`),
35
+ });
36
+ try {
37
+ await load();
38
+ }
39
+ finally {
40
+ held.release();
41
+ }
42
+ }
24
43
  /**
25
44
  * Verify the pin, resolve the entry, and import the package TRANSACTIONALLY and INVISIBLY. The
26
45
  * import's self-registrations are STAGED (never resolvable while it runs); they publish atomically
@@ -30,9 +49,13 @@ let loadChain = Promise.resolve();
30
49
  * share a validation window.
31
50
  */
32
51
  export async function importInstalledExtension(ext, advertised) {
33
- const run = loadChain.then(() => loadOne(ext, advertised));
34
- loadChain = run.then(() => undefined, () => undefined);
35
- return run;
52
+ if (registry.has(advertised.kind, advertised.name))
53
+ return;
54
+ return enqueueLoad(async () => {
55
+ if (registry.has(advertised.kind, advertised.name))
56
+ return;
57
+ await withExtensionLock(() => loadOne(ext, advertised));
58
+ });
36
59
  }
37
60
  async function loadOne(ext, advertised) {
38
61
  // Idempotent: if a prior load (a concurrent first call now serialized ahead of us on loadChain, or an
@@ -42,9 +65,6 @@ async function loadOne(ext, advertised) {
42
65
  // publishes ALL of a package's keys, so a sibling ref requested concurrently is live here too.
43
66
  if (registry.has(advertised.kind, advertised.name))
44
67
  return;
45
- const mutation = extensionMutationLockState();
46
- if (mutation.state === "active")
47
- throw new Error(`extension install/remove is in progress (pid ${mutation.owner}) - retry after the active \`cotal ext\` command finishes`);
48
68
  const pkg = ext.pkg;
49
69
  const onDisk = installedExtensionVersion(pkg);
50
70
  if (!onDisk) {
@@ -53,6 +73,9 @@ async function loadOne(ext, advertised) {
53
73
  if (onDisk !== ext.version) {
54
74
  throw new Error(`extension ${pkg} is ${onDisk} on disk but the manifest pinned ${ext.version} (its cached command surface may be stale) - re-add it: \`cotal ext add ${ext.spec}\``);
55
75
  }
76
+ // The prefix is machine-global, but global installs, npx, and source worktrees are distinct hosts.
77
+ // Rebind before the first import in this process so registration lands in this host's core registry.
78
+ bindExtensionPeers([pkg], pkg);
56
79
  const dir = extensionPackageDir(pkg);
57
80
  const meta = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
58
81
  let entry = meta.main ?? "index.js";
@@ -103,11 +126,13 @@ export function manifestExtensionNames(kind) {
103
126
  * exact `cotal ext add <pkg>` for an official name; a bare caller gets the generic form).
104
127
  */
105
128
  export async function materializeFromManifest(ref, opts = {}) {
106
- const ext = loadExtensionsManifest().extensions.find((candidate) => extensionProvides(candidate).some((provided) => provided.kind === ref.kind && provided.name === ref.name));
107
- if (!ext) {
108
- throw new Error(opts.hint?.(ref) ?? `no installed extension provides ${ref.kind} "${ref.name}" - install it with \`cotal ext add <npm-package>\``);
109
- }
110
- await importInstalledExtension(ext, ref); // throws if the package doesn't advertise ref; else ref is now committed
129
+ await enqueueLoad(() => withExtensionLock(async () => {
130
+ const ext = loadExtensionsManifest().extensions.find((candidate) => extensionProvides(candidate).some((provided) => provided.kind === ref.kind && provided.name === ref.name));
131
+ if (!ext) {
132
+ throw new Error(opts.hint?.(ref) ?? `no installed extension provides ${ref.kind} "${ref.name}" - install it with \`cotal ext add <npm-package>\``);
133
+ }
134
+ await loadOne(ext, ref);
135
+ }));
111
136
  return registry.resolve(ref.kind, ref.name);
112
137
  }
113
138
  //# sourceMappingURL=materialize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAqC,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AAEH,SAAS,aAAa,CAAC,GAAW,EAAE,GAAuB,EAAE,CAAU;IACrE,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC;QACnH,CAAC,CAAC,mIAAmI;QACrI,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,IAAI,KAAK,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,sBAAsB,OAAO,GAAG,aAAa,oCAAoC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;AACjJ,CAAC;AAED;uDACuD;AACvD,IAAI,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAEjD,SAAS,WAAW,CAAC,IAAyB;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,SAAS,GAAG,GAAG,CAAC,IAAI,CAClB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAyB;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,yBAAyB,EAAE,EAAE;QACpD,KAAK,EAAE,2BAA2B;QAClC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,gDAAgD,KAAK,CAAC,GAAG,2DAA2D,CAAC;KACtJ,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAuB,EAAE,UAAwB;IAC9F,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3D,OAAO,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3D,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAuB,EAAE,UAAwB;IACtE,sGAAsG;IACtG,wFAAwF;IACxF,mGAAmG;IACnG,iGAAiG;IACjG,+FAA+F;IAC/F,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,4CAA4C,mBAAmB,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC;IAChJ,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,OAAO,MAAM,oCAAoC,GAAG,CAAC,OAAO,2EAA2E,GAAG,CAAC,IAAI,IAAI,CACpK,CAAC;IACJ,CAAC;IACD,mGAAmG;IACnG,qGAAqG;IACrG,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyC,CAAC;IACjH,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IACpC,MAAM,GAAG,GAAI,IAAI,CAAC,OAA+C,EAAE,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,KAAK,GAAG,GAAG,CAAC;SACpC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,GAA6B,CAAC;QACxC,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;IAClE,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,sFAAsF;QACtF,+FAA+F;QAC/F,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,qDAAqD;IACzF,CAAC;IACD,8FAA8F;IAC9F,6FAA6F;IAC7F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,kCAAkC,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,kCAAkC,GAAG,CAAC,IAAI,IAAI,CACnJ,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC,UAAU;QACnD,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC;YAAE,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAiB,EACjB,OAAiD,EAAE;IAEnD,MAAM,WAAW,CAAC,GAAG,EAAE,CACrB,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACjE,iBAAiB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAC1G,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,mCAAmC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,qDAAqD,CAClI,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CACH,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AACjD,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.11.5",
4
+ "version": "0.11.6",
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.11.5"
21
+ "@cotal-ai/core": "0.11.6"
22
22
  },
23
23
  "files": [
24
24
  "dist"