@cef-ai/cli 0.2.7 → 0.4.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.
- package/README.md +75 -1247
- package/dist/build/duration.d.ts +22 -0
- package/dist/build/duration.d.ts.map +1 -0
- package/dist/build/duration.js +44 -0
- package/dist/build/duration.js.map +1 -0
- package/dist/build/esbuild-plugin.d.ts +32 -0
- package/dist/build/esbuild-plugin.d.ts.map +1 -0
- package/dist/build/esbuild-plugin.js +53 -0
- package/dist/build/esbuild-plugin.js.map +1 -0
- package/dist/build/lints.d.ts +55 -0
- package/dist/build/lints.d.ts.map +1 -0
- package/dist/build/lints.js +214 -0
- package/dist/build/lints.js.map +1 -0
- package/dist/build/load-config.d.ts +114 -0
- package/dist/build/load-config.d.ts.map +1 -0
- package/dist/build/load-config.js +150 -0
- package/dist/build/load-config.js.map +1 -0
- package/dist/build/manifest.d.ts +156 -0
- package/dist/build/manifest.d.ts.map +1 -0
- package/dist/build/manifest.js +111 -0
- package/dist/build/manifest.js.map +1 -0
- package/dist/build/targeting.d.ts +15 -0
- package/dist/build/targeting.d.ts.map +1 -0
- package/dist/build/targeting.js +69 -0
- package/dist/build/targeting.js.map +1 -0
- package/dist/cli-program.d.ts +14 -0
- package/dist/cli-program.d.ts.map +1 -0
- package/dist/cli-program.js +171 -0
- package/dist/cli-program.js.map +1 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +25 -65
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +41 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +252 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/inspect.d.ts +49 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +135 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/keypair.d.ts +21 -0
- package/dist/commands/keypair.d.ts.map +1 -0
- package/dist/commands/keypair.js +91 -0
- package/dist/commands/keypair.js.map +1 -0
- package/dist/commands/publish.d.ts +40 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +187 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/typegen.d.ts +36 -0
- package/dist/commands/typegen.d.ts.map +1 -0
- package/dist/commands/typegen.js +210 -0
- package/dist/commands/typegen.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cid.d.ts +3 -0
- package/dist/lib/cid.d.ts.map +1 -0
- package/dist/lib/cid.js +43 -0
- package/dist/lib/cid.js.map +1 -0
- package/dist/lib/credentials.d.ts +40 -16
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +222 -49
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/jcs.d.ts +3 -0
- package/dist/lib/jcs.d.ts.map +1 -0
- package/dist/lib/jcs.js +48 -0
- package/dist/lib/jcs.js.map +1 -0
- package/dist/lib/signing.d.ts +13 -0
- package/dist/lib/signing.d.ts.map +1 -0
- package/dist/lib/signing.js +34 -0
- package/dist/lib/signing.js.map +1 -0
- package/dist/lib.d.ts +18 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +12 -0
- package/dist/lib.js.map +1 -0
- package/dist/typegen/augment.d.ts +57 -0
- package/dist/typegen/augment.d.ts.map +1 -0
- package/dist/typegen/augment.js +87 -0
- package/dist/typegen/augment.js.map +1 -0
- package/dist/typegen/fetch.d.ts +30 -0
- package/dist/typegen/fetch.d.ts.map +1 -0
- package/dist/typegen/fetch.js +38 -0
- package/dist/typegen/fetch.js.map +1 -0
- package/dist/typegen/lockfile.d.ts +42 -0
- package/dist/typegen/lockfile.d.ts.map +1 -0
- package/dist/typegen/lockfile.js +58 -0
- package/dist/typegen/lockfile.js.map +1 -0
- package/dist/typegen/schema-to-ts.d.ts +21 -0
- package/dist/typegen/schema-to-ts.d.ts.map +1 -0
- package/dist/typegen/schema-to-ts.js +29 -0
- package/dist/typegen/schema-to-ts.js.map +1 -0
- package/package.json +23 -58
- package/dist/commands/auth/index.d.ts +0 -2
- package/dist/commands/auth/index.js +0 -162
- package/dist/commands/deploy/clone.d.ts +0 -13
- package/dist/commands/deploy/clone.js +0 -143
- package/dist/commands/deploy/delete.d.ts +0 -14
- package/dist/commands/deploy/delete.js +0 -134
- package/dist/commands/deploy/deploy.d.ts +0 -24
- package/dist/commands/deploy/deploy.js +0 -654
- package/dist/commands/deploy/index.d.ts +0 -2
- package/dist/commands/deploy/index.js +0 -216
- package/dist/commands/deploy/status.d.ts +0 -14
- package/dist/commands/deploy/status.js +0 -61
- package/dist/commands/dev/index.d.ts +0 -2
- package/dist/commands/dev/index.js +0 -134
- package/dist/commands/dev/server.d.ts +0 -14
- package/dist/commands/dev/server.js +0 -195
- package/dist/commands/dev/static/app.js +0 -633
- package/dist/commands/dev/static/index.html +0 -205
- package/dist/commands/dev/static/static/app.js +0 -633
- package/dist/commands/dev/static/static/index.html +0 -205
- package/dist/commands/dev/static/static/style.css +0 -184
- package/dist/commands/dev/static/style.css +0 -184
- package/dist/commands/playground/index.d.ts +0 -2
- package/dist/commands/playground/index.js +0 -75
- package/dist/commands/playground/test.d.ts +0 -15
- package/dist/commands/playground/test.js +0 -166
- package/dist/commands/service/index.d.ts +0 -2
- package/dist/commands/service/index.js +0 -89
- package/dist/lib/api.d.ts +0 -146
- package/dist/lib/api.js +0 -330
- package/dist/lib/config.d.ts +0 -12
- package/dist/lib/config.js +0 -145
- package/dist/lib/runtime/agent-router.d.ts +0 -12
- package/dist/lib/runtime/agent-router.js +0 -67
- package/dist/lib/runtime/context-builder.d.ts +0 -27
- package/dist/lib/runtime/context-builder.js +0 -166
- package/dist/lib/runtime/cubby-manager.d.ts +0 -20
- package/dist/lib/runtime/cubby-manager.js +0 -162
- package/dist/lib/runtime/index.d.ts +0 -51
- package/dist/lib/runtime/index.js +0 -181
- package/dist/lib/runtime/log-collector.d.ts +0 -17
- package/dist/lib/runtime/log-collector.js +0 -61
- package/dist/lib/runtime/stream-manager.d.ts +0 -10
- package/dist/lib/runtime/stream-manager.js +0 -77
- package/dist/lib/runtime/types.d.ts +0 -76
- package/dist/lib/runtime/types.js +0 -2
- package/dist/lib/transpile.d.ts +0 -1
- package/dist/lib/transpile.js +0 -9
- package/dist/lib/typecheck.d.ts +0 -31
- package/dist/lib/typecheck.js +0 -175
- package/dist/lib/types.d.ts +0 -246
- package/dist/lib/types.js +0 -2
- package/dist/lib/utils.d.ts +0 -4
- package/dist/lib/utils.js +0 -33
- package/example/.env.example +0 -6
- package/example/agents/object-detection/tasks/yolo.ts +0 -28
- package/example/agents/parking-violation-detector/tasks/detect.ts +0 -326
- package/example/cef.config.yaml +0 -91
- package/example/engagements/engagement.ts +0 -902
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,iFAAiF;IACjF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mFAAmF;IACnF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,oCAAoC;QACpC,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;IACF,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import vm from "node:vm";
|
|
4
|
+
/**
|
|
5
|
+
* Inspect a built agent directory.
|
|
6
|
+
*
|
|
7
|
+
* Reads `<agentDir>/manifest.json` for the per-engagement routing tables
|
|
8
|
+
* and executes `<agentDir>/bundle.js` in a fresh `node:vm` context to
|
|
9
|
+
* enumerate the methods actually exposed on each
|
|
10
|
+
* `globalThis.__cefAgent.engagements[id]` instance. The two views are
|
|
11
|
+
* useful for confirming that each manifest engagement's `handlerName`
|
|
12
|
+
* strings match real methods on the bundled instance.
|
|
13
|
+
*
|
|
14
|
+
* Pure exploration: no files are written, no network. Safe to run on any
|
|
15
|
+
* `dist/<agentId>/` directory.
|
|
16
|
+
*/
|
|
17
|
+
export async function cefInspect(opts) {
|
|
18
|
+
const { agentDir, print = true } = opts;
|
|
19
|
+
const manifestPath = path.join(agentDir, "manifest.json");
|
|
20
|
+
const bundlePath = path.join(agentDir, "bundle.js");
|
|
21
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
|
|
22
|
+
const bundle = await fs.readFile(bundlePath, "utf8");
|
|
23
|
+
// Run the bundle in an isolated context. The IIFE assigns
|
|
24
|
+
// { engagements: { id: instance } } to globalThis.__cefAgent.
|
|
25
|
+
const sandbox = { console };
|
|
26
|
+
sandbox.globalThis = sandbox;
|
|
27
|
+
vm.runInNewContext(bundle, sandbox);
|
|
28
|
+
const cefAgent = sandbox.__cefAgent;
|
|
29
|
+
const instances = cefAgent?.engagements ?? {};
|
|
30
|
+
const engagements = (manifest.engagements ?? []).map((e) => {
|
|
31
|
+
const inst = instances[e.id];
|
|
32
|
+
const exposedMethods = [];
|
|
33
|
+
if (inst) {
|
|
34
|
+
const seen = new Set();
|
|
35
|
+
let proto = Object.getPrototypeOf(inst);
|
|
36
|
+
while (proto && Object.getPrototypeOf(proto) !== null) {
|
|
37
|
+
for (const k of Object.getOwnPropertyNames(proto)) {
|
|
38
|
+
if (k === "constructor")
|
|
39
|
+
continue;
|
|
40
|
+
if (typeof inst[k] === "function") {
|
|
41
|
+
seen.add(k);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
proto = Object.getPrototypeOf(proto);
|
|
45
|
+
}
|
|
46
|
+
exposedMethods.push(...[...seen].sort());
|
|
47
|
+
}
|
|
48
|
+
const exposedSet = new Set(exposedMethods);
|
|
49
|
+
const missingMethods = [];
|
|
50
|
+
const handles = e.handles ?? {};
|
|
51
|
+
for (const handlerName of Object.values(handles)) {
|
|
52
|
+
if (!exposedSet.has(handlerName))
|
|
53
|
+
missingMethods.push(handlerName);
|
|
54
|
+
}
|
|
55
|
+
const out = {
|
|
56
|
+
id: e.id,
|
|
57
|
+
handles,
|
|
58
|
+
exposedMethods,
|
|
59
|
+
missingMethods,
|
|
60
|
+
};
|
|
61
|
+
if (e.goal !== undefined)
|
|
62
|
+
out.goal = e.goal;
|
|
63
|
+
return out;
|
|
64
|
+
});
|
|
65
|
+
const result = {
|
|
66
|
+
manifest: {
|
|
67
|
+
// Pre-publish manifests carry an empty `agentId`; the marketplace alias
|
|
68
|
+
// is the single human-friendly identifier (`prototype.md` §"AgentManifest.Alias").
|
|
69
|
+
alias: manifest.alias ?? manifest.agentId ?? "",
|
|
70
|
+
version: manifest.version,
|
|
71
|
+
cubbies: (manifest.cubbies ?? []).map((c) => c.alias),
|
|
72
|
+
models: Object.keys(manifest.models ?? {}),
|
|
73
|
+
handles: manifest.handles ?? [],
|
|
74
|
+
publishes: manifest.publishes ?? [],
|
|
75
|
+
targeting: manifest.targeting ?? { engagements: [] },
|
|
76
|
+
},
|
|
77
|
+
engagements,
|
|
78
|
+
};
|
|
79
|
+
if (print)
|
|
80
|
+
printInspectResult(result, cefAgent !== undefined);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
function printInspectResult(r, hasInstance) {
|
|
84
|
+
const m = r.manifest;
|
|
85
|
+
console.log(`# ${m.alias} v${m.version}`);
|
|
86
|
+
console.log("");
|
|
87
|
+
console.log("## Manifest engagements:");
|
|
88
|
+
if (r.engagements.length === 0) {
|
|
89
|
+
console.log(" (none)");
|
|
90
|
+
}
|
|
91
|
+
for (const e of r.engagements) {
|
|
92
|
+
console.log(` - ${e.id}${e.goal ? ` — ${e.goal}` : ""}`);
|
|
93
|
+
console.log(` handles:`);
|
|
94
|
+
const handleEntries = Object.entries(e.handles);
|
|
95
|
+
if (handleEntries.length === 0) {
|
|
96
|
+
console.log(` (none)`);
|
|
97
|
+
}
|
|
98
|
+
for (const [type, handlerName] of handleEntries) {
|
|
99
|
+
console.log(` - ${type} -> ${handlerName}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
console.log("");
|
|
103
|
+
console.log(`## handles: ${JSON.stringify(m.handles)}`);
|
|
104
|
+
console.log(`## publishes: ${JSON.stringify(m.publishes)}`);
|
|
105
|
+
console.log(`## targeting:`);
|
|
106
|
+
const targetingLines = JSON.stringify(m.targeting, null, 2)
|
|
107
|
+
.split("\n")
|
|
108
|
+
.map((l) => " " + l);
|
|
109
|
+
for (const line of targetingLines)
|
|
110
|
+
console.log(line);
|
|
111
|
+
console.log(`## cubbies: ${JSON.stringify(m.cubbies)}`);
|
|
112
|
+
console.log(`## models: ${JSON.stringify(m.models)}`);
|
|
113
|
+
console.log("");
|
|
114
|
+
console.log("## Bundle methods per engagement");
|
|
115
|
+
if (!hasInstance) {
|
|
116
|
+
console.log(" (no __cefAgent set - bundle did not initialise)");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
for (const e of r.engagements) {
|
|
120
|
+
console.log(` - ${e.id}:`);
|
|
121
|
+
if (e.exposedMethods.length === 0) {
|
|
122
|
+
console.log(` (no methods)`);
|
|
123
|
+
}
|
|
124
|
+
for (const name of e.exposedMethods) {
|
|
125
|
+
console.log(` - ${name}`);
|
|
126
|
+
}
|
|
127
|
+
if (e.missingMethods.length > 0) {
|
|
128
|
+
console.log(` WARNING manifest references methods not on bundle:`);
|
|
129
|
+
for (const name of e.missingMethods) {
|
|
130
|
+
console.log(` - ${name}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface CefKeypairGenerateOptions {
|
|
2
|
+
/** Write the JSON keypair to this path. Mutually exclusive with `profile`. */
|
|
3
|
+
out?: string;
|
|
4
|
+
/** Write/merge into the shared credentials file under this section. */
|
|
5
|
+
profile?: string;
|
|
6
|
+
/** Allow overwriting an existing file or profile. */
|
|
7
|
+
force?: boolean;
|
|
8
|
+
/** Override the credentials file path (tests). */
|
|
9
|
+
configFilePath?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CefKeypairGenerateResult {
|
|
12
|
+
pubkey: string;
|
|
13
|
+
/** Hex-encoded private seed. */
|
|
14
|
+
privkey: string;
|
|
15
|
+
/** File path written, when `out` or `profile` was set. */
|
|
16
|
+
path?: string;
|
|
17
|
+
/** Profile name written, when `profile` was set. */
|
|
18
|
+
profile?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function cefKeypairGenerate(opts?: CefKeypairGenerateOptions): Promise<CefKeypairGenerateResult>;
|
|
21
|
+
//# sourceMappingURL=keypair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/commands/keypair.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,yBAAyB;IACxC,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiCD,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,wBAAwB,CAAC,CA8CnC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cef keypair generate` — explicit AS Ed25519 keypair provisioning.
|
|
3
|
+
*
|
|
4
|
+
* The AS keypair represents an Agent Service identity, potentially shared
|
|
5
|
+
* across a team. This command is the *only* place a keypair is materialised;
|
|
6
|
+
* `cef publish` never auto-generates. Output sinks:
|
|
7
|
+
*
|
|
8
|
+
* - stdout (default): JSON `{ pubkey, privkey }`. Useful for `| pbcopy` or
|
|
9
|
+
* piping into a secrets manager.
|
|
10
|
+
* - `--out <path>`: writes the JSON to a file with mode 0600. Refuses
|
|
11
|
+
* existing files unless `--force`.
|
|
12
|
+
* - `--profile <name>`: writes/merges into the shared
|
|
13
|
+
* `~/.config/cef/credentials` INI file, mode 0600. Refuses to overwrite
|
|
14
|
+
* an existing profile unless `--force`. Atomic via temp + rename.
|
|
15
|
+
*
|
|
16
|
+
* The post-write banner reminds the developer this is identity material
|
|
17
|
+
* meant to be shared with their team, not generated per-developer.
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs/promises";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
import { defaultCredentialsFilePath, parseConfigFile, serializeConfigFile, } from "../lib/credentials.js";
|
|
22
|
+
import { generateKeypair } from "../lib/signing.js";
|
|
23
|
+
function bytesToHex(b) {
|
|
24
|
+
let s = "";
|
|
25
|
+
for (let i = 0; i < b.length; i++)
|
|
26
|
+
s += b[i].toString(16).padStart(2, "0");
|
|
27
|
+
return s;
|
|
28
|
+
}
|
|
29
|
+
async function exists(p) {
|
|
30
|
+
try {
|
|
31
|
+
await fs.stat(p);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (e.code === "ENOENT")
|
|
36
|
+
return false;
|
|
37
|
+
throw e;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function atomicWrite(filePath, content) {
|
|
41
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
42
|
+
// Temp in the same dir so rename stays atomic across the same fs.
|
|
43
|
+
const tmp = `${filePath}.tmp.${process.pid}.${Date.now()}`;
|
|
44
|
+
await fs.writeFile(tmp, content, { encoding: "utf8", mode: 0o600 });
|
|
45
|
+
try {
|
|
46
|
+
await fs.rename(tmp, filePath);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
await fs.rm(tmp, { force: true });
|
|
50
|
+
throw e;
|
|
51
|
+
}
|
|
52
|
+
// chmod after rename in case the file pre-existed with looser perms.
|
|
53
|
+
await fs.chmod(filePath, 0o600).catch(() => { });
|
|
54
|
+
}
|
|
55
|
+
export async function cefKeypairGenerate(opts = {}) {
|
|
56
|
+
if (opts.out !== undefined && opts.profile !== undefined) {
|
|
57
|
+
throw new Error("cef keypair generate: --out and --profile are mutually exclusive");
|
|
58
|
+
}
|
|
59
|
+
const { pubkey, privkeyBytes } = await generateKeypair();
|
|
60
|
+
const privkey = bytesToHex(privkeyBytes);
|
|
61
|
+
// Profile sink: merge into the shared credentials file.
|
|
62
|
+
if (opts.profile !== undefined) {
|
|
63
|
+
const filePath = opts.configFilePath ?? defaultCredentialsFilePath();
|
|
64
|
+
let parsed = {};
|
|
65
|
+
try {
|
|
66
|
+
const existing = await fs.readFile(filePath, "utf8");
|
|
67
|
+
parsed = parseConfigFile(existing);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
if (e.code !== "ENOENT")
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
if (parsed[opts.profile] && !opts.force) {
|
|
74
|
+
throw new Error(`cef keypair generate: profile [${opts.profile}] already exists in ${filePath} (pass --force to overwrite)`);
|
|
75
|
+
}
|
|
76
|
+
parsed[opts.profile] = { pubkey, privkey };
|
|
77
|
+
await atomicWrite(filePath, serializeConfigFile(parsed));
|
|
78
|
+
return { pubkey, privkey, path: filePath, profile: opts.profile };
|
|
79
|
+
}
|
|
80
|
+
// File sink: write the JSON keystore to `out`.
|
|
81
|
+
if (opts.out !== undefined) {
|
|
82
|
+
if ((await exists(opts.out)) && !opts.force) {
|
|
83
|
+
throw new Error(`cef keypair generate: ${opts.out} already exists (pass --force to overwrite)`);
|
|
84
|
+
}
|
|
85
|
+
await atomicWrite(opts.out, JSON.stringify({ pubkey, privkey }, null, 2) + "\n");
|
|
86
|
+
return { pubkey, privkey, path: opts.out };
|
|
87
|
+
}
|
|
88
|
+
// Default sink: stdout. Caller (CLI wrapper) prints the JSON.
|
|
89
|
+
return { pubkey, privkey };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=keypair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.js","sourceRoot":"","sources":["../../src/commands/keypair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type AsCredentials, type ResolveCredentialsOptions } from "../lib/credentials.js";
|
|
2
|
+
export interface CefPublishOptions {
|
|
3
|
+
/** Resolved marketplace base URL — no trailing slash assumed. */
|
|
4
|
+
marketplaceUrl: string;
|
|
5
|
+
/** Which `dist/<id>/` to publish; auto-detected when undefined. */
|
|
6
|
+
agentId?: string;
|
|
7
|
+
/** Hex private seed (pairs with `pubkey`); highest-priority credential source. */
|
|
8
|
+
privkey?: string;
|
|
9
|
+
/** Hex public key paired with `privkey`. */
|
|
10
|
+
pubkey?: string;
|
|
11
|
+
/** Path to a JSON keystore file `{ pubkey, privkey }`. */
|
|
12
|
+
keystore?: string;
|
|
13
|
+
/** Profile name within the shared `~/.config/cef/credentials` file. */
|
|
14
|
+
profile?: string;
|
|
15
|
+
/** Defaults to `<cwd>/dist`. */
|
|
16
|
+
distDir?: string;
|
|
17
|
+
/** Defaults to `process.cwd()`. */
|
|
18
|
+
cwd?: string;
|
|
19
|
+
/**
|
|
20
|
+
* `fetch` override — defaults to `globalThis.fetch`. Tests pass a stub so
|
|
21
|
+
* the integration spec can assert on the wire shape without touching the
|
|
22
|
+
* network.
|
|
23
|
+
*/
|
|
24
|
+
fetchImpl?: typeof fetch;
|
|
25
|
+
/**
|
|
26
|
+
* Override the credential resolver. Tests inject a fixed keypair this way
|
|
27
|
+
* so they don't have to set up flags/env/files.
|
|
28
|
+
*/
|
|
29
|
+
resolveCredentialsImpl?: (opts: ResolveCredentialsOptions) => Promise<AsCredentials>;
|
|
30
|
+
}
|
|
31
|
+
export interface CefPublishResult {
|
|
32
|
+
/** Whatever `agentId` the marketplace returned (plain alias today). */
|
|
33
|
+
agentId: string;
|
|
34
|
+
version: string;
|
|
35
|
+
manifestCid: string;
|
|
36
|
+
/** Pubkey the manifest was published as (hex). */
|
|
37
|
+
pubkey: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function cefPublish(opts: CefPublishOptions): Promise<CefPublishResult>;
|
|
40
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AA4BA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,CACvB,IAAI,EAAE,yBAAyB,KAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAqH3B"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cef publish` — POSTs a built agent's manifest to the CEF marketplace.
|
|
3
|
+
*
|
|
4
|
+
* Wire contract (matches `marketplace/scripts/smoke-publish.ts`):
|
|
5
|
+
*
|
|
6
|
+
* POST <marketplaceUrl>/api/v1/marketplace/agents
|
|
7
|
+
* Headers:
|
|
8
|
+
* Content-Type: application/json
|
|
9
|
+
* X-AS-Pubkey: <hex Ed25519 pubkey>
|
|
10
|
+
* X-AS-Signature: <hex Ed25519 signature over canonical body bytes>
|
|
11
|
+
* Body (JCS-canonicalized JSON):
|
|
12
|
+
* {
|
|
13
|
+
* agentId: <plain alias>,
|
|
14
|
+
* version: <semver>,
|
|
15
|
+
* manifest: <full AgentManifest, with agentId + agentServicePubkey filled>,
|
|
16
|
+
* issuedAt: <ISO 8601>,
|
|
17
|
+
* nonce: <base64url 16 random bytes>
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* `cef build` emits the manifest with `agentId` / `agentServicePubkey` left
|
|
21
|
+
* as empty strings; this command stamps them in (alias for `agentId`, the
|
|
22
|
+
* loaded AS pubkey for `agentServicePubkey`) before signing so the manifest
|
|
23
|
+
* the server hashes is byte-for-byte the manifest the publisher signs.
|
|
24
|
+
*/
|
|
25
|
+
import crypto from "node:crypto";
|
|
26
|
+
import fs from "node:fs/promises";
|
|
27
|
+
import path from "node:path";
|
|
28
|
+
import { resolveCredentials, } from "../lib/credentials.js";
|
|
29
|
+
import { canonicalize } from "../lib/jcs.js";
|
|
30
|
+
import { signBody } from "../lib/signing.js";
|
|
31
|
+
const DEFAULT_DIST = "dist";
|
|
32
|
+
export async function cefPublish(opts) {
|
|
33
|
+
const cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
34
|
+
const distDir = opts.distDir
|
|
35
|
+
? path.resolve(cwd, opts.distDir)
|
|
36
|
+
: path.join(cwd, DEFAULT_DIST);
|
|
37
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
38
|
+
if (!fetchImpl) {
|
|
39
|
+
throw new Error("[cef publish] no fetch implementation available (pass opts.fetchImpl or run on Node ≥18)");
|
|
40
|
+
}
|
|
41
|
+
const agentId = opts.agentId ?? (await autodetectAgentId(distDir));
|
|
42
|
+
const agentDir = path.join(distDir, agentId);
|
|
43
|
+
const manifestPath = path.join(agentDir, "manifest.json");
|
|
44
|
+
let manifestRaw;
|
|
45
|
+
try {
|
|
46
|
+
manifestRaw = await fs.readFile(manifestPath, "utf8");
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
const code = e.code;
|
|
50
|
+
if (code === "ENOENT") {
|
|
51
|
+
throw new Error(`[cef publish] manifest not found at ${manifestPath} — run \`cef build\` first`);
|
|
52
|
+
}
|
|
53
|
+
throw e;
|
|
54
|
+
}
|
|
55
|
+
let manifest;
|
|
56
|
+
try {
|
|
57
|
+
manifest = JSON.parse(manifestRaw);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
throw new Error(`[cef publish] manifest at ${manifestPath} is not valid JSON: ${e.message}`);
|
|
61
|
+
}
|
|
62
|
+
validateManifestShape(manifest, manifestPath);
|
|
63
|
+
// The plain alias is the wire identity. `cef build` writes it to
|
|
64
|
+
// `manifest.alias` (per `prototype.md` §"AgentManifest.Alias") and
|
|
65
|
+
// leaves `manifest.agentId` blank for `cef publish` to fill in.
|
|
66
|
+
const alias = (manifest.alias ?? manifest.agentId);
|
|
67
|
+
const resolver = opts.resolveCredentialsImpl ?? resolveCredentials;
|
|
68
|
+
const credResolveOpts = {
|
|
69
|
+
...(opts.privkey !== undefined ? { privkeyFlag: opts.privkey } : {}),
|
|
70
|
+
...(opts.pubkey !== undefined ? { pubkeyFlag: opts.pubkey } : {}),
|
|
71
|
+
...(opts.keystore !== undefined ? { keystoreFlag: opts.keystore } : {}),
|
|
72
|
+
...(opts.profile !== undefined ? { profileFlag: opts.profile } : {}),
|
|
73
|
+
};
|
|
74
|
+
const { pubkey, privkeyBytes } = await resolver(credResolveOpts);
|
|
75
|
+
// Stamp the manifest's identity fields. The marketplace verifies
|
|
76
|
+
// `manifest.agentId === body.agentId` and we want the persisted manifest
|
|
77
|
+
// bytes to record the AS pubkey too — so the published artifact carries
|
|
78
|
+
// its own provenance even though the wire-level signature is detached.
|
|
79
|
+
const stampedManifest = {
|
|
80
|
+
...manifest,
|
|
81
|
+
agentId: alias,
|
|
82
|
+
agentServicePubkey: pubkey,
|
|
83
|
+
};
|
|
84
|
+
const body = {
|
|
85
|
+
agentId: alias,
|
|
86
|
+
version: stampedManifest.version,
|
|
87
|
+
manifest: stampedManifest,
|
|
88
|
+
issuedAt: new Date().toISOString(),
|
|
89
|
+
nonce: randomBase64UrlNonce(16),
|
|
90
|
+
};
|
|
91
|
+
const canonical = canonicalize(body);
|
|
92
|
+
const signature = await signBody(canonical, privkeyBytes);
|
|
93
|
+
const url = `${opts.marketplaceUrl.replace(/\/+$/, "")}/api/v1/marketplace/agents`;
|
|
94
|
+
const res = await fetchImpl(url, {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: {
|
|
97
|
+
"content-type": "application/json",
|
|
98
|
+
"X-AS-Pubkey": pubkey,
|
|
99
|
+
"X-AS-Signature": signature,
|
|
100
|
+
},
|
|
101
|
+
body: canonical,
|
|
102
|
+
});
|
|
103
|
+
if (res.status === 201) {
|
|
104
|
+
const json = (await res.json());
|
|
105
|
+
if (typeof json.agentId !== "string" ||
|
|
106
|
+
typeof json.version !== "string" ||
|
|
107
|
+
typeof json.manifestCid !== "string") {
|
|
108
|
+
throw new Error(`[cef publish] unexpected 201 body: ${JSON.stringify(json)}`);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
agentId: json.agentId,
|
|
112
|
+
version: json.version,
|
|
113
|
+
manifestCid: json.manifestCid,
|
|
114
|
+
pubkey,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Friendly error path for replays. The marketplace returns
|
|
118
|
+
// `{ error: "REPLAY", ... }` on 409 (see `recordNonce`).
|
|
119
|
+
const text = await res.text();
|
|
120
|
+
if (res.status === 409) {
|
|
121
|
+
throw new Error(`[cef publish] REPLAY: nonce already used (${text})`);
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`[cef publish] marketplace returned HTTP ${res.status}: ${text}`);
|
|
124
|
+
}
|
|
125
|
+
async function autodetectAgentId(distDir) {
|
|
126
|
+
let entries;
|
|
127
|
+
try {
|
|
128
|
+
entries = await fs.readdir(distDir);
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
const code = e.code;
|
|
132
|
+
if (code === "ENOENT") {
|
|
133
|
+
throw new Error(`[cef publish] dist directory ${distDir} not found — run \`cef build\` first`);
|
|
134
|
+
}
|
|
135
|
+
throw e;
|
|
136
|
+
}
|
|
137
|
+
const candidates = [];
|
|
138
|
+
for (const name of entries) {
|
|
139
|
+
const stat = await fs.stat(path.join(distDir, name)).catch(() => null);
|
|
140
|
+
if (!stat?.isDirectory())
|
|
141
|
+
continue;
|
|
142
|
+
// Only consider dirs that actually contain a manifest.json.
|
|
143
|
+
const has = await fs
|
|
144
|
+
.stat(path.join(distDir, name, "manifest.json"))
|
|
145
|
+
.then(() => true)
|
|
146
|
+
.catch(() => false);
|
|
147
|
+
if (has)
|
|
148
|
+
candidates.push(name);
|
|
149
|
+
}
|
|
150
|
+
if (candidates.length === 0) {
|
|
151
|
+
throw new Error(`[cef publish] no built agents found in ${distDir} — run \`cef build\` first`);
|
|
152
|
+
}
|
|
153
|
+
if (candidates.length > 1) {
|
|
154
|
+
throw new Error(`[cef publish] multiple built agents in ${distDir} (${candidates
|
|
155
|
+
.sort()
|
|
156
|
+
.join(", ")}) — pass \`--agent <id>\` to pick one`);
|
|
157
|
+
}
|
|
158
|
+
return candidates[0];
|
|
159
|
+
}
|
|
160
|
+
function validateManifestShape(m, source) {
|
|
161
|
+
const missing = [];
|
|
162
|
+
// Build emits both `alias` and (placeholder) `agentId`; treat presence of
|
|
163
|
+
// either as the alias. Spec calls this out as `id (alias)`.
|
|
164
|
+
if (!m.alias && !m.agentId)
|
|
165
|
+
missing.push("alias|agentId");
|
|
166
|
+
if (!m.version)
|
|
167
|
+
missing.push("version");
|
|
168
|
+
if (!m.card)
|
|
169
|
+
missing.push("card");
|
|
170
|
+
else {
|
|
171
|
+
if (!m.card.name)
|
|
172
|
+
missing.push("card.name");
|
|
173
|
+
if (!m.card.description)
|
|
174
|
+
missing.push("card.description");
|
|
175
|
+
}
|
|
176
|
+
if (!Array.isArray(m.handles))
|
|
177
|
+
missing.push("handles[]");
|
|
178
|
+
if (!Array.isArray(m.publishes))
|
|
179
|
+
missing.push("publishes[]");
|
|
180
|
+
if (missing.length > 0) {
|
|
181
|
+
throw new Error(`[cef publish] manifest at ${source} is missing required fields: ${missing.join(", ")}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function randomBase64UrlNonce(numBytes) {
|
|
185
|
+
return crypto.randomBytes(numBytes).toString("base64url");
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public options for `cefTypegen`. CWD-relative defaults match `cefBuild`.
|
|
3
|
+
*/
|
|
4
|
+
export interface CefTypegenOptions {
|
|
5
|
+
/** Project root. Defaults to `process.cwd()`. */
|
|
6
|
+
cwd?: string;
|
|
7
|
+
/** Path to `cef.config.ts`. Defaults to `<cwd>/cef.config.ts`. */
|
|
8
|
+
configPath?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CefTypegenResult {
|
|
11
|
+
/** Absolute path to the emitted `.cef/generated.d.ts`. */
|
|
12
|
+
generatedPath: string;
|
|
13
|
+
/** Absolute path to the emitted `cef.lock.json`. */
|
|
14
|
+
lockfilePath: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate `.cef/generated.d.ts` and `cef.lock.json` from the agent's
|
|
18
|
+
* declared `models` and `uses` external references.
|
|
19
|
+
*
|
|
20
|
+
* Algorithm:
|
|
21
|
+
* 1. Load `cef.config.ts` (shared with `cefBuild` via load-config.ts).
|
|
22
|
+
* 2. Collect `models` + `uses` from all leaf agents.
|
|
23
|
+
* 3. Read the existing lockfile (if any).
|
|
24
|
+
* 4. For each entry: if the lockfile has a matching URL with a present
|
|
25
|
+
* integrity, reuse the cached body; otherwise re-fetch.
|
|
26
|
+
* 5. Schema-to-TS each model's input/output and each peer's publishes[].
|
|
27
|
+
* 6. Build the `.cef/generated.d.ts` content (header, interfaces, module
|
|
28
|
+
* augmentation block).
|
|
29
|
+
* 7. Write both artefacts.
|
|
30
|
+
*
|
|
31
|
+
* Cache reuse is keyed on the *declared* URL (lock entries also carry
|
|
32
|
+
* their declared URL). For semver-ranged URLs (`agent@^1`), we treat the
|
|
33
|
+
* declared URL as the cache key — v2's real semver resolution will revisit.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cefTypegen(opts?: CefTypegenOptions): Promise<CefTypegenResult>;
|
|
36
|
+
//# sourceMappingURL=typegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.d.ts","sourceRoot":"","sources":["../../src/commands/typegen.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;CACtB;AAiDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,UAAU,CAC9B,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAiJ3B"}
|