@cotal-ai/cli 0.11.1 → 0.11.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/command.d.ts.map +1 -1
- package/dist/command.js +8 -2
- package/dist/command.js.map +1 -1
- package/dist/commands/down.d.ts +8 -14
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +190 -103
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/endpoints.d.ts +5 -0
- package/dist/commands/endpoints.d.ts.map +1 -0
- package/dist/commands/endpoints.js +42 -0
- package/dist/commands/endpoints.js.map +1 -0
- package/dist/commands/ext.d.ts +4 -4
- package/dist/commands/ext.d.ts.map +1 -1
- package/dist/commands/ext.js +326 -102
- package/dist/commands/ext.js.map +1 -1
- package/dist/commands/spawn-manifest.d.ts.map +1 -1
- package/dist/commands/spawn-manifest.js +23 -10
- package/dist/commands/spawn-manifest.js.map +1 -1
- package/dist/commands/spawn.d.ts +1 -1
- package/dist/commands/spawn.d.ts.map +1 -1
- package/dist/commands/spawn.js +3 -2
- package/dist/commands/spawn.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +18 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +4 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/ext-loader.d.ts +12 -1
- package/dist/ext-loader.d.ts.map +1 -1
- package/dist/ext-loader.js +87 -15
- package/dist/ext-loader.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/manifest/model.d.ts +1 -1
- package/dist/lib/manifest/model.d.ts.map +1 -1
- package/dist/lib/manifest/schema.d.ts +1 -5
- package/dist/lib/manifest/schema.d.ts.map +1 -1
- package/dist/lib/manifest/schema.js +2 -1
- package/dist/lib/manifest/schema.js.map +1 -1
- package/package.json +3 -3
package/dist/command.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA8D7F,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,CAqExG"}
|
package/dist/command.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { commandUsage, parseCommandArgs } from "@cotal-ai/core";
|
|
2
2
|
import { c, staleStoreHint } from "./ui.js";
|
|
3
|
-
import { isExtensionStub, materializeExtensionCommand, overlayExtensions, setCommandSurface } from "./ext-loader.js";
|
|
3
|
+
import { isExtensionStub, materializeExtension, materializeExtensionCommand, overlayExtensions, setCommandSurface, setInstalledExtensionsEnabled, } from "./ext-loader.js";
|
|
4
4
|
/** Display order for the help groups — an explicit ranking, NOT registration order: modules
|
|
5
5
|
* self-register on import and the dev runner (tsx) doesn't guarantee entry-import evaluation
|
|
6
6
|
* order, so the daemon surface could otherwise print above Setup. Groups not listed here
|
|
@@ -54,6 +54,7 @@ function isArgError(e) {
|
|
|
54
54
|
* The single entry point a composition root calls — no hardcoded command list.
|
|
55
55
|
* Parsing happens HERE, from the command's declared specs; `run` gets parsed args. */
|
|
56
56
|
export async function runCli(registry, argv, opts = {}) {
|
|
57
|
+
setInstalledExtensionsEnabled(Boolean(opts.extensions));
|
|
57
58
|
let commands;
|
|
58
59
|
try {
|
|
59
60
|
commands = opts.extensions ? overlayExtensions(registry) : registry.all("command");
|
|
@@ -96,7 +97,12 @@ export async function runCli(registry, argv, opts = {}) {
|
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
try {
|
|
99
|
-
|
|
100
|
+
const parsed = parseCommandArgs(cmd, rest);
|
|
101
|
+
if (opts.extensions && cmd.requiredExtensions) {
|
|
102
|
+
for (const ref of cmd.requiredExtensions(parsed))
|
|
103
|
+
await materializeExtension(ref);
|
|
104
|
+
}
|
|
105
|
+
await cmd.run(parsed);
|
|
100
106
|
}
|
|
101
107
|
catch (e) {
|
|
102
108
|
// A bad flag/arg prints the command's help, not a stack trace. Trim node's verbose
|
package/dist/command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,CAAC,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,
|
|
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,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;AAEzB;;;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,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,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,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,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"}
|
package/dist/commands/down.d.ts
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
1
|
-
import { type ParsedArgs } from "@cotal-ai/core";
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
1
|
+
import { type CompletionResult, type ParsedArgs } from "@cotal-ai/core";
|
|
2
|
+
/** Complete selective component names without importing installed packages. */
|
|
3
|
+
export declare function downComplete(argv: string[]): CompletionResult;
|
|
4
|
+
/** Stop the whole local stack by default, or only named self-registered process components. The
|
|
5
|
+
* manifest forms remain ownership-scoped deploy teardown and cannot be mixed with components. */
|
|
6
6
|
export declare function down(args: ParsedArgs): Promise<void>;
|
|
7
|
-
/** Every pidfile a background mesh records under `.cotal/`, in stop order (manager → delivery →
|
|
8
|
-
* auth service → web → nats: the manager's graceful shutdown releases its lease OVER nats, so nats
|
|
9
|
-
* must outlive it). Shared with `cotal clean`, which refuses local-state deletion while any of
|
|
10
|
-
* these is still alive. */
|
|
11
|
-
export declare function pidfileTargets(space: string): Array<[file: string, label: string]>;
|
|
12
7
|
export declare const isAlive: (pid: number) => boolean;
|
|
8
|
+
/** Compatibility inventory for `clean`; lifecycle commands use the registered descriptors above. */
|
|
9
|
+
export declare function pidfileTargets(space: string): Array<[file: string, label: string]>;
|
|
13
10
|
export type PidfileState = {
|
|
14
11
|
pid?: number;
|
|
15
12
|
live: boolean;
|
|
16
13
|
note?: string;
|
|
17
14
|
};
|
|
18
|
-
/**
|
|
19
|
-
* and `status` so they can never drift: only a positive integer pid counts (an empty/corrupt
|
|
20
|
-
* pidfile parses to 0, and POSIX `kill(0, 0)` probes our own process group), and EPERM reads as
|
|
21
|
-
* ALIVE (the process exists, we merely can't signal it). */
|
|
15
|
+
/** Shared hardened pid probe: positive integers only, and EPERM means the process exists. */
|
|
22
16
|
export declare function pidfileState(path: string): PidfileState;
|
|
23
17
|
//# sourceMappingURL=down.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAaxE,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAS7D;AAED;kGACkG;AAClG,wBAAsB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E1D;AAOD,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,OAErC,CAAC;AA4FF,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAQlF;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAOvD"}
|
package/dist/commands/down.js
CHANGED
|
@@ -1,145 +1,232 @@
|
|
|
1
|
-
import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { closeSync, existsSync, openSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
2
3
|
import {} from "@cotal-ai/core";
|
|
3
|
-
import { removeMeshesByRoot } from "@cotal-ai/workspace";
|
|
4
|
+
import { localProcessPath, removeMeshesByRoot, } from "@cotal-ai/workspace";
|
|
5
|
+
import { extensionNames, localProcessSurface } from "../ext-loader.js";
|
|
4
6
|
import { c } from "../ui.js";
|
|
5
|
-
import {
|
|
7
|
+
import { cotalRoot } from "../lib/paths.js";
|
|
6
8
|
import { resolveSpace } from "../lib/status.js";
|
|
7
9
|
import { downManifest } from "./down-manifest.js";
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
/** Complete selective component names without importing installed packages. */
|
|
11
|
+
export function downComplete(argv) {
|
|
12
|
+
if (argv.some((word) => word === "-f" || word === "--file" || word === "--run"))
|
|
13
|
+
return { items: [], directive: "nofiles" };
|
|
14
|
+
if ((argv[argv.length - 1] ?? "").startsWith("-"))
|
|
15
|
+
return { items: [], directive: "nofiles" };
|
|
16
|
+
const used = new Set(argv.slice(0, -1).filter((word) => !word.startsWith("-")));
|
|
17
|
+
return {
|
|
18
|
+
items: extensionNames("local-process").filter((name) => !used.has(name)).map((value) => ({ value })),
|
|
19
|
+
directive: "nofiles",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Stop the whole local stack by default, or only named self-registered process components. The
|
|
23
|
+
* manifest forms remain ownership-scoped deploy teardown and cannot be mixed with components. */
|
|
12
24
|
export async function down(args) {
|
|
13
25
|
const values = args.values;
|
|
26
|
+
const requested = [...new Set(args.positionals)];
|
|
27
|
+
if ((values.file || values.run) && requested.length) {
|
|
28
|
+
throw new Error("component names cannot be combined with --file or --run");
|
|
29
|
+
}
|
|
14
30
|
if (values.file || values.run) {
|
|
15
31
|
await downManifest(values.file ?? "<run>", { run: values.run, dryRun: Boolean(values["dry-run"]) });
|
|
16
32
|
return;
|
|
17
33
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
34
|
+
const all = localProcessSurface();
|
|
35
|
+
const known = all.map((component) => component.name).sort();
|
|
36
|
+
const unknown = requested.filter((name) => !known.includes(name));
|
|
37
|
+
if (unknown.length)
|
|
38
|
+
throw new Error(`unknown component${unknown.length > 1 ? "s" : ""} ${unknown.map((name) => JSON.stringify(name)).join(", ")} - known: ${known.join(", ")}`);
|
|
39
|
+
const selected = (requested.length ? requested.map((name) => all.find((part) => part.name === name)) : all)
|
|
40
|
+
.sort((a, b) => Number(Boolean(a.stopLast)) - Number(Boolean(b.stopLast)) || (a.order ?? 50) - (b.order ?? 50));
|
|
41
|
+
const context = { root: cotalRoot(), space: resolveSpace(process.cwd()) };
|
|
42
|
+
if (selected.some((component) => component.stopLast)) {
|
|
43
|
+
const selectedNames = new Set(selected.map((component) => component.name));
|
|
44
|
+
const dependants = all.filter((component) => !selectedNames.has(component.name) && processAlive(component, context));
|
|
45
|
+
if (dependants.length) {
|
|
46
|
+
throw new Error(`cannot stop ${selected.filter((component) => component.stopLast).map((component) => component.name).join(", ")} while ${dependants.map((component) => component.name).join(", ")} ${dependants.length === 1 ? "is" : "are"} still running - name them too, or run bare \`cotal down\``);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (values["dry-run"]) {
|
|
50
|
+
const recorded = selected.filter((component) => processRecorded(component, context));
|
|
51
|
+
for (const component of recorded)
|
|
52
|
+
console.log(c.dim(`would stop ${component.label}`));
|
|
53
|
+
if (!recorded.length) {
|
|
54
|
+
const target = requested.length ? requested.join(", ") : "the local stack";
|
|
55
|
+
console.error(c.red(`Nothing running for ${target} (no recorded pidfiles).`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
console.log(c.dim("Dry run - nothing was changed. Re-run without --dry-run to stop these components."));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
22
61
|
let any = false;
|
|
23
62
|
let allStopped = true;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
63
|
+
for (const component of selected) {
|
|
64
|
+
any = processRecorded(component, context) || any;
|
|
65
|
+
if (component.stopLast && !allStopped) {
|
|
66
|
+
console.error(c.red(`✗ not stopping ${component.label} because an earlier component did not stop`));
|
|
28
67
|
continue;
|
|
29
|
-
|
|
30
|
-
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await stop(component, context);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
31
73
|
allStopped = false;
|
|
74
|
+
console.error(c.red(`✗ ${e.message}`));
|
|
75
|
+
}
|
|
32
76
|
}
|
|
33
|
-
// A process we could not stop (EPERM, or a SIGKILL survivor) is still RUNNING: presenting the
|
|
34
|
-
// mesh as cleanly down — sweeping artifacts and the registry entry — would let a later `clean`
|
|
35
|
-
// delete the store underneath it. Keep everything and fail loud instead.
|
|
36
77
|
if (!allStopped) {
|
|
37
|
-
console.error(c.red("✗ not cleanly stopped - keeping
|
|
78
|
+
console.error(c.red("✗ not cleanly stopped - keeping artifacts and the registry entry"));
|
|
38
79
|
process.exitCode = 1;
|
|
39
80
|
return;
|
|
40
81
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
removeMeshesByRoot(cotalRoot());
|
|
82
|
+
for (const component of selected) {
|
|
83
|
+
for (const artifact of component.artifacts ?? [])
|
|
84
|
+
rmSync(localProcessPath(artifact, context), { force: true });
|
|
85
|
+
}
|
|
86
|
+
// The broker owns the mesh registry entry and transient whole-mesh launch material. Selective
|
|
87
|
+
// control-plane shutdown leaves both intact so `cotal up` can heal only what was stopped.
|
|
88
|
+
if (selected.some((component) => component.clearsMesh)) {
|
|
89
|
+
rmSync(join(context.root, ".cotal", "run"), { recursive: true, force: true });
|
|
90
|
+
removeMeshesByRoot(context.root);
|
|
91
|
+
}
|
|
52
92
|
if (!any) {
|
|
53
|
-
|
|
93
|
+
const target = requested.length ? requested.join(", ") : "the local stack";
|
|
94
|
+
console.error(c.red(`Nothing running for ${target} (no recorded pidfiles).`));
|
|
54
95
|
process.exit(1);
|
|
55
96
|
}
|
|
56
97
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return [
|
|
63
|
-
["manager.pid", "manager"],
|
|
64
|
-
["delivery.pid", "delivery daemon"],
|
|
65
|
-
[`auth-service.${encodeURIComponent(space)}.pid`, "user-auth service"],
|
|
66
|
-
["web.pid", "web dashboard"],
|
|
67
|
-
["nats.pid", "nats-server"],
|
|
68
|
-
];
|
|
69
|
-
}
|
|
70
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
98
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
99
|
+
const parsePid = (raw) => {
|
|
100
|
+
const pid = Number(raw.trim());
|
|
101
|
+
return Number.isInteger(pid) && pid > 0 ? pid : undefined;
|
|
102
|
+
};
|
|
71
103
|
export const isAlive = (pid) => {
|
|
72
104
|
try {
|
|
73
105
|
process.kill(pid, 0);
|
|
74
106
|
return true;
|
|
75
107
|
}
|
|
76
108
|
catch (e) {
|
|
77
|
-
// EPERM = the process EXISTS but we may not signal it (e.g. launched from a differently
|
|
78
|
-
// elevated context). For safety that counts as alive; only ESRCH-style "no such process"
|
|
79
|
-
// reads as dead.
|
|
80
109
|
return e.code === "EPERM";
|
|
81
110
|
}
|
|
82
111
|
};
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
* pidfile parses to 0, and POSIX `kill(0, 0)` probes our own process group), and EPERM reads as
|
|
86
|
-
* ALIVE (the process exists, we merely can't signal it). */
|
|
87
|
-
export function pidfileState(path) {
|
|
88
|
-
if (!existsSync(path))
|
|
89
|
-
return { live: false, note: "no pidfile" };
|
|
90
|
-
const pid = Number(readFileSync(path, "utf8").trim());
|
|
91
|
-
if (!Number.isInteger(pid) || pid <= 0)
|
|
92
|
-
return { live: false, note: "bad pidfile" };
|
|
93
|
-
return isAlive(pid) ? { pid, live: true } : { pid, live: false, note: "stale pidfile" };
|
|
112
|
+
function processRecorded(component, context) {
|
|
113
|
+
return existsSync(localProcessPath(component.pidFile, context)) || (component.artifacts ?? []).map((artifact) => localProcessPath(artifact, context)).some(existsSync);
|
|
94
114
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
* still-dying manager. Poll the pid, escalate to SIGKILL if it overstays, then confirm it's gone.
|
|
99
|
-
* Returns whether the process is confirmed absent. The pidfile is removed only once that is
|
|
100
|
-
* established: erasing the record of a process we could NOT stop (EPERM — alive but
|
|
101
|
-
* unsignalable) would let a later `cotal clean` delete the store underneath a live broker. */
|
|
102
|
-
async function stop(pidPath, label) {
|
|
103
|
-
const s = pidfileState(pidPath);
|
|
104
|
-
if (!s.live) {
|
|
105
|
-
// Dead or unusable record (stale pid, empty/corrupt file) — nothing to stop, drop it.
|
|
106
|
-
rmSync(pidPath, { force: true });
|
|
107
|
-
if (s.pid)
|
|
108
|
-
console.log(c.dim(`${label} (pid ${s.pid}) was not running.`));
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
const pid = s.pid;
|
|
112
|
-
try {
|
|
113
|
-
process.kill(pid, "SIGTERM");
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
// The probe said alive, the signal was refused: EPERM (differently elevated context) or
|
|
117
|
-
// similar. The process is still running — keep its pidfile and fail loud.
|
|
118
|
-
console.error(c.red(`✗ cannot stop ${label} (pid ${pid}): ${e.code ?? e.message}`));
|
|
115
|
+
function processAlive(component, context) {
|
|
116
|
+
const pidPath = localProcessPath(component.pidFile, context);
|
|
117
|
+
if (!existsSync(pidPath))
|
|
119
118
|
return false;
|
|
119
|
+
const pid = parsePid(readFileSync(pidPath, "utf8"));
|
|
120
|
+
return pid !== undefined && isAlive(pid);
|
|
121
|
+
}
|
|
122
|
+
/** Stop one recorded process and await its actual exit before the next dependency is stopped. */
|
|
123
|
+
async function stop(component, context) {
|
|
124
|
+
const pidPath = localProcessPath(component.pidFile, context);
|
|
125
|
+
const found = processRecorded(component, context);
|
|
126
|
+
if (!existsSync(pidPath))
|
|
127
|
+
return found;
|
|
128
|
+
const rawPid = readFileSync(pidPath, "utf8").trim();
|
|
129
|
+
if (rawPid.startsWith("removing:")) {
|
|
130
|
+
const owner = parsePid(rawPid.slice("removing:".length));
|
|
131
|
+
throw new Error(owner && isAlive(owner)
|
|
132
|
+
? `${component.name} extension removal is in progress (pid ${owner})`
|
|
133
|
+
: `${component.name} has a stale extension-removal reservation at ${pidPath} - remove that file and retry`);
|
|
120
134
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
while (isAlive(pid) && Date.now() < graceDeadline)
|
|
126
|
-
await sleep(100);
|
|
127
|
-
if (isAlive(pid)) {
|
|
135
|
+
const pid = parsePid(rawPid);
|
|
136
|
+
const marker = `${pidPath}.stopping`;
|
|
137
|
+
let markerFd;
|
|
138
|
+
for (;;) {
|
|
128
139
|
try {
|
|
129
|
-
|
|
140
|
+
markerFd = openSync(marker, "wx", 0o600);
|
|
141
|
+
writeFileSync(markerFd, String(process.pid));
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
if (markerFd !== undefined) {
|
|
146
|
+
closeSync(markerFd);
|
|
147
|
+
rmSync(marker, { force: true });
|
|
148
|
+
markerFd = undefined;
|
|
149
|
+
}
|
|
150
|
+
if (e.code !== "EEXIST")
|
|
151
|
+
throw e;
|
|
152
|
+
let owner;
|
|
153
|
+
try {
|
|
154
|
+
owner = parsePid(readFileSync(marker, "utf8"));
|
|
155
|
+
}
|
|
156
|
+
catch (readErr) {
|
|
157
|
+
if (readErr.code === "ENOENT")
|
|
158
|
+
continue;
|
|
159
|
+
throw readErr;
|
|
160
|
+
}
|
|
161
|
+
if (owner && isAlive(owner))
|
|
162
|
+
throw new Error(`${component.name} is already being stopped by another \`cotal down\` (pid ${owner})`);
|
|
163
|
+
// A dead owner cannot finish cleanup. Reclaim its marker and retry the exclusive create.
|
|
164
|
+
rmSync(marker, { force: true });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
closeSync(markerFd);
|
|
168
|
+
let stopped = false;
|
|
169
|
+
try {
|
|
170
|
+
if (pid === undefined) {
|
|
171
|
+
console.log(c.dim(`${component.label} had an invalid pidfile.`));
|
|
172
|
+
stopped = true;
|
|
173
|
+
return true;
|
|
130
174
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
175
|
+
try {
|
|
176
|
+
process.kill(pid, "SIGTERM");
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
if (isAlive(pid))
|
|
180
|
+
throw new Error(`could not signal ${component.label} (pid ${pid})`);
|
|
181
|
+
console.log(c.dim(`${component.label} (pid ${pid}) was not running.`));
|
|
182
|
+
stopped = true;
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
const graceDeadline = Date.now() + 15_000;
|
|
186
|
+
while (isAlive(pid) && Date.now() < graceDeadline)
|
|
134
187
|
await sleep(100);
|
|
188
|
+
if (isAlive(pid)) {
|
|
189
|
+
try {
|
|
190
|
+
process.kill(pid, "SIGKILL");
|
|
191
|
+
}
|
|
192
|
+
catch { /* raced to exit */ }
|
|
193
|
+
const hardDeadline = Date.now() + 3_000;
|
|
194
|
+
while (isAlive(pid) && Date.now() < hardDeadline)
|
|
195
|
+
await sleep(100);
|
|
196
|
+
}
|
|
197
|
+
if (isAlive(pid))
|
|
198
|
+
throw new Error(`${component.label} (pid ${pid}) did not exit; its pidfile was preserved`);
|
|
199
|
+
stopped = true;
|
|
200
|
+
console.log(c.green(`✓ stopped ${component.label} (pid ${pid})`));
|
|
201
|
+
return true;
|
|
135
202
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
203
|
+
finally {
|
|
204
|
+
if (stopped || pid === undefined || !isAlive(pid)) {
|
|
205
|
+
rmSync(pidPath, { force: true });
|
|
206
|
+
}
|
|
207
|
+
rmSync(marker, { force: true });
|
|
141
208
|
}
|
|
142
|
-
|
|
143
|
-
|
|
209
|
+
}
|
|
210
|
+
/** Compatibility inventory for `clean`; lifecycle commands use the registered descriptors above. */
|
|
211
|
+
export function pidfileTargets(space) {
|
|
212
|
+
return [
|
|
213
|
+
["manager.pid", "manager"],
|
|
214
|
+
["delivery.pid", "delivery daemon"],
|
|
215
|
+
[`auth-service.${encodeURIComponent(space)}.pid`, "user-auth service"],
|
|
216
|
+
["web.pid", "web dashboard"],
|
|
217
|
+
["nats.pid", "nats-server"],
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
/** Shared hardened pid probe: positive integers only, and EPERM means the process exists. */
|
|
221
|
+
export function pidfileState(path) {
|
|
222
|
+
if (!existsSync(path))
|
|
223
|
+
return { live: false, note: "no pidfile" };
|
|
224
|
+
const raw = readFileSync(path, "utf8").trim();
|
|
225
|
+
if (raw.startsWith("removing:"))
|
|
226
|
+
return { live: false, note: "extension removal in progress" };
|
|
227
|
+
const pid = parsePid(raw);
|
|
228
|
+
if (!pid)
|
|
229
|
+
return { live: false, note: "bad pidfile" };
|
|
230
|
+
return isAlive(pid) ? { pid, live: true } : { pid, live: false, note: "stale pidfile" };
|
|
144
231
|
}
|
|
145
232
|
//# sourceMappingURL=down.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ParsedArgs, Presence } from "@cotal-ai/core";
|
|
2
|
+
/** List the mesh presence roster, including infrastructure endpoints such as the manager. */
|
|
3
|
+
export declare function endpoints(args: ParsedArgs): Promise<void>;
|
|
4
|
+
export declare function printEndpoints(roster: Presence[], space: string): void;
|
|
5
|
+
//# sourceMappingURL=endpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI3D,6FAA6F;AAC7F,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA4BtE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { openTransient } from "../lib/transient.js";
|
|
2
|
+
import { c, statusBadge } from "../ui.js";
|
|
3
|
+
/** List the mesh presence roster, including infrastructure endpoints such as the manager. */
|
|
4
|
+
export async function endpoints(args) {
|
|
5
|
+
const { ep, space } = await openTransient(args.values, "endpoints");
|
|
6
|
+
try {
|
|
7
|
+
await ep.waitForPresenceSnapshot();
|
|
8
|
+
printEndpoints(ep.getRoster(), space);
|
|
9
|
+
}
|
|
10
|
+
finally {
|
|
11
|
+
await ep.stop();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function printEndpoints(roster, space) {
|
|
15
|
+
if (!roster.length) {
|
|
16
|
+
console.log(c.dim(`(no endpoints present in "${space}")`));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const counts = new Map();
|
|
20
|
+
for (const presence of roster) {
|
|
21
|
+
const name = presence.card.name.toLowerCase();
|
|
22
|
+
counts.set(name, (counts.get(name) ?? 0) + 1);
|
|
23
|
+
}
|
|
24
|
+
const rows = roster
|
|
25
|
+
.map((presence) => {
|
|
26
|
+
const role = presence.card.role ? `/${presence.card.role}` : "";
|
|
27
|
+
const duplicate = (counts.get(presence.card.name.toLowerCase()) ?? 0) > 1;
|
|
28
|
+
return {
|
|
29
|
+
presence,
|
|
30
|
+
label: `${presence.card.name}${role}${duplicate ? ` [${presence.card.id}]` : ""}`,
|
|
31
|
+
kind: presence.card.kind ?? "endpoint",
|
|
32
|
+
};
|
|
33
|
+
})
|
|
34
|
+
.sort((a, b) => a.label.localeCompare(b.label));
|
|
35
|
+
const labelWidth = Math.max(...rows.map((row) => row.label.length));
|
|
36
|
+
const kindWidth = Math.max(...rows.map((row) => row.kind.length));
|
|
37
|
+
for (const row of rows) {
|
|
38
|
+
const activity = row.presence.activity ? ` ${c.dim(row.presence.activity)}` : "";
|
|
39
|
+
console.log(`${c.bold(row.label.padEnd(labelWidth))} ${c.dim(row.kind.padEnd(kindWidth))} ${statusBadge(row.presence.status)}${activity}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/ext.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type ParsedArgs } from "@cotal-ai/core";
|
|
2
2
|
/**
|
|
3
|
-
* `cotal ext` — operator-installed
|
|
3
|
+
* `cotal ext` — operator-installed extensions. `add` installs an npm package into the
|
|
4
4
|
* cotal-owned prefix (never the user's project), imports it ONCE so it self-registers into the
|
|
5
|
-
* live `Registry`, verifies the registration actually landed, and caches
|
|
6
|
-
*
|
|
7
|
-
* dispatch imports the package lazily
|
|
5
|
+
* live `Registry`, verifies the registration actually landed, and caches every contributed key
|
|
6
|
+
* plus command display metadata. From then on, help and <TAB> read the cache (no import), and
|
|
7
|
+
* dispatch/provider resolution imports the package lazily with live objects.
|
|
8
8
|
*
|
|
9
9
|
* Add-time guarantees (design-review conditions — each converts a silent failure into a loud one):
|
|
10
10
|
* - shared `@cotal-ai/*` packages must be PEER dependencies of the extension; each is linked to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../src/commands/ext.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../src/commands/ext.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0BzE;;;;;;;;;;;;;;GAcG;AAEH,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzD"}
|