@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.
Files changed (153) hide show
  1. package/README.md +75 -1247
  2. package/dist/build/duration.d.ts +22 -0
  3. package/dist/build/duration.d.ts.map +1 -0
  4. package/dist/build/duration.js +44 -0
  5. package/dist/build/duration.js.map +1 -0
  6. package/dist/build/esbuild-plugin.d.ts +32 -0
  7. package/dist/build/esbuild-plugin.d.ts.map +1 -0
  8. package/dist/build/esbuild-plugin.js +53 -0
  9. package/dist/build/esbuild-plugin.js.map +1 -0
  10. package/dist/build/lints.d.ts +55 -0
  11. package/dist/build/lints.d.ts.map +1 -0
  12. package/dist/build/lints.js +214 -0
  13. package/dist/build/lints.js.map +1 -0
  14. package/dist/build/load-config.d.ts +114 -0
  15. package/dist/build/load-config.d.ts.map +1 -0
  16. package/dist/build/load-config.js +150 -0
  17. package/dist/build/load-config.js.map +1 -0
  18. package/dist/build/manifest.d.ts +156 -0
  19. package/dist/build/manifest.d.ts.map +1 -0
  20. package/dist/build/manifest.js +111 -0
  21. package/dist/build/manifest.js.map +1 -0
  22. package/dist/build/targeting.d.ts +15 -0
  23. package/dist/build/targeting.d.ts.map +1 -0
  24. package/dist/build/targeting.js +69 -0
  25. package/dist/build/targeting.js.map +1 -0
  26. package/dist/cli-program.d.ts +14 -0
  27. package/dist/cli-program.d.ts.map +1 -0
  28. package/dist/cli-program.js +171 -0
  29. package/dist/cli-program.js.map +1 -0
  30. package/dist/cli.d.ts +2 -2
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +25 -65
  33. package/dist/cli.js.map +1 -0
  34. package/dist/commands/build.d.ts +41 -0
  35. package/dist/commands/build.d.ts.map +1 -0
  36. package/dist/commands/build.js +252 -0
  37. package/dist/commands/build.js.map +1 -0
  38. package/dist/commands/inspect.d.ts +49 -0
  39. package/dist/commands/inspect.d.ts.map +1 -0
  40. package/dist/commands/inspect.js +135 -0
  41. package/dist/commands/inspect.js.map +1 -0
  42. package/dist/commands/keypair.d.ts +21 -0
  43. package/dist/commands/keypair.d.ts.map +1 -0
  44. package/dist/commands/keypair.js +91 -0
  45. package/dist/commands/keypair.js.map +1 -0
  46. package/dist/commands/publish.d.ts +40 -0
  47. package/dist/commands/publish.d.ts.map +1 -0
  48. package/dist/commands/publish.js +187 -0
  49. package/dist/commands/publish.js.map +1 -0
  50. package/dist/commands/typegen.d.ts +36 -0
  51. package/dist/commands/typegen.d.ts.map +1 -0
  52. package/dist/commands/typegen.js +210 -0
  53. package/dist/commands/typegen.js.map +1 -0
  54. package/dist/index.d.ts +6 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +6 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/cid.d.ts +3 -0
  59. package/dist/lib/cid.d.ts.map +1 -0
  60. package/dist/lib/cid.js +43 -0
  61. package/dist/lib/cid.js.map +1 -0
  62. package/dist/lib/credentials.d.ts +40 -16
  63. package/dist/lib/credentials.d.ts.map +1 -0
  64. package/dist/lib/credentials.js +222 -49
  65. package/dist/lib/credentials.js.map +1 -0
  66. package/dist/lib/jcs.d.ts +3 -0
  67. package/dist/lib/jcs.d.ts.map +1 -0
  68. package/dist/lib/jcs.js +48 -0
  69. package/dist/lib/jcs.js.map +1 -0
  70. package/dist/lib/signing.d.ts +13 -0
  71. package/dist/lib/signing.d.ts.map +1 -0
  72. package/dist/lib/signing.js +34 -0
  73. package/dist/lib/signing.js.map +1 -0
  74. package/dist/lib.d.ts +18 -0
  75. package/dist/lib.d.ts.map +1 -0
  76. package/dist/lib.js +12 -0
  77. package/dist/lib.js.map +1 -0
  78. package/dist/typegen/augment.d.ts +57 -0
  79. package/dist/typegen/augment.d.ts.map +1 -0
  80. package/dist/typegen/augment.js +87 -0
  81. package/dist/typegen/augment.js.map +1 -0
  82. package/dist/typegen/fetch.d.ts +30 -0
  83. package/dist/typegen/fetch.d.ts.map +1 -0
  84. package/dist/typegen/fetch.js +38 -0
  85. package/dist/typegen/fetch.js.map +1 -0
  86. package/dist/typegen/lockfile.d.ts +42 -0
  87. package/dist/typegen/lockfile.d.ts.map +1 -0
  88. package/dist/typegen/lockfile.js +58 -0
  89. package/dist/typegen/lockfile.js.map +1 -0
  90. package/dist/typegen/schema-to-ts.d.ts +21 -0
  91. package/dist/typegen/schema-to-ts.d.ts.map +1 -0
  92. package/dist/typegen/schema-to-ts.js +29 -0
  93. package/dist/typegen/schema-to-ts.js.map +1 -0
  94. package/package.json +23 -58
  95. package/dist/commands/auth/index.d.ts +0 -2
  96. package/dist/commands/auth/index.js +0 -162
  97. package/dist/commands/deploy/clone.d.ts +0 -13
  98. package/dist/commands/deploy/clone.js +0 -143
  99. package/dist/commands/deploy/delete.d.ts +0 -14
  100. package/dist/commands/deploy/delete.js +0 -134
  101. package/dist/commands/deploy/deploy.d.ts +0 -24
  102. package/dist/commands/deploy/deploy.js +0 -654
  103. package/dist/commands/deploy/index.d.ts +0 -2
  104. package/dist/commands/deploy/index.js +0 -216
  105. package/dist/commands/deploy/status.d.ts +0 -14
  106. package/dist/commands/deploy/status.js +0 -61
  107. package/dist/commands/dev/index.d.ts +0 -2
  108. package/dist/commands/dev/index.js +0 -134
  109. package/dist/commands/dev/server.d.ts +0 -14
  110. package/dist/commands/dev/server.js +0 -195
  111. package/dist/commands/dev/static/app.js +0 -633
  112. package/dist/commands/dev/static/index.html +0 -205
  113. package/dist/commands/dev/static/static/app.js +0 -633
  114. package/dist/commands/dev/static/static/index.html +0 -205
  115. package/dist/commands/dev/static/static/style.css +0 -184
  116. package/dist/commands/dev/static/style.css +0 -184
  117. package/dist/commands/playground/index.d.ts +0 -2
  118. package/dist/commands/playground/index.js +0 -75
  119. package/dist/commands/playground/test.d.ts +0 -15
  120. package/dist/commands/playground/test.js +0 -166
  121. package/dist/commands/service/index.d.ts +0 -2
  122. package/dist/commands/service/index.js +0 -89
  123. package/dist/lib/api.d.ts +0 -146
  124. package/dist/lib/api.js +0 -330
  125. package/dist/lib/config.d.ts +0 -12
  126. package/dist/lib/config.js +0 -145
  127. package/dist/lib/runtime/agent-router.d.ts +0 -12
  128. package/dist/lib/runtime/agent-router.js +0 -67
  129. package/dist/lib/runtime/context-builder.d.ts +0 -27
  130. package/dist/lib/runtime/context-builder.js +0 -166
  131. package/dist/lib/runtime/cubby-manager.d.ts +0 -20
  132. package/dist/lib/runtime/cubby-manager.js +0 -162
  133. package/dist/lib/runtime/index.d.ts +0 -51
  134. package/dist/lib/runtime/index.js +0 -181
  135. package/dist/lib/runtime/log-collector.d.ts +0 -17
  136. package/dist/lib/runtime/log-collector.js +0 -61
  137. package/dist/lib/runtime/stream-manager.d.ts +0 -10
  138. package/dist/lib/runtime/stream-manager.js +0 -77
  139. package/dist/lib/runtime/types.d.ts +0 -76
  140. package/dist/lib/runtime/types.js +0 -2
  141. package/dist/lib/transpile.d.ts +0 -1
  142. package/dist/lib/transpile.js +0 -9
  143. package/dist/lib/typecheck.d.ts +0 -31
  144. package/dist/lib/typecheck.js +0 -175
  145. package/dist/lib/types.d.ts +0 -246
  146. package/dist/lib/types.js +0 -2
  147. package/dist/lib/utils.d.ts +0 -4
  148. package/dist/lib/utils.js +0 -33
  149. package/example/.env.example +0 -6
  150. package/example/agents/object-detection/tasks/yolo.ts +0 -28
  151. package/example/agents/parking-violation-detector/tasks/detect.ts +0 -326
  152. package/example/cef.config.yaml +0 -91
  153. package/example/engagements/engagement.ts +0 -902
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Commander program factory shared by `./cli.ts` (the bin entry) and the
3
+ * integration tests. Splitting it out keeps the binary itself a thin
4
+ * wrapper that just calls `buildProgram().parseAsync(argv)` while letting
5
+ * tests construct the same wiring without triggering top-level argv
6
+ * parsing on import.
7
+ */
8
+ import { readFileSync } from "node:fs";
9
+ import path from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ import { Command } from "commander";
12
+ import { cefBuild } from "./commands/build.js";
13
+ import { cefInspect } from "./commands/inspect.js";
14
+ import { cefKeypairGenerate } from "./commands/keypair.js";
15
+ import { cefPublish } from "./commands/publish.js";
16
+ import { cefTypegen } from "./commands/typegen.js";
17
+ export const DEFAULT_MARKETPLACE_URL = "https://agent-marketplace.compute.dev.ddcdragon.com";
18
+ function defaultOnError(err) {
19
+ const msg = err instanceof Error ? err.message : String(err);
20
+ console.error(msg);
21
+ process.exit(1);
22
+ }
23
+ export function buildProgram(opts = {}) {
24
+ const onError = opts.onError ?? defaultOnError;
25
+ // dist/cli-program.js → ../package.json (when running compiled).
26
+ // src/cli-program.ts → ../package.json (when running via vitest in src/).
27
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
28
+ const pkg = JSON.parse(readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
29
+ const program = new Command();
30
+ program
31
+ .name("cef")
32
+ .description("CEF agent build & test CLI")
33
+ .version(pkg.version);
34
+ program
35
+ .command("build")
36
+ .description("Build agent bundle.js + manifest.json")
37
+ .option("--config <path>", "Path to cef.config.ts")
38
+ .option("--out <dir>", "Output directory", "dist")
39
+ .action(async (subOpts) => {
40
+ try {
41
+ const result = await cefBuild({
42
+ configPath: subOpts.config,
43
+ outDir: subOpts.out,
44
+ });
45
+ for (const a of result.agents) {
46
+ console.log(`[ok] ${a.agentId} -> ${a.bundlePath} (${a.bundleBytes} bytes)`);
47
+ console.log(`[ok] ${a.agentId} -> ${a.manifestPath}`);
48
+ }
49
+ }
50
+ catch (e) {
51
+ onError(e);
52
+ }
53
+ });
54
+ program
55
+ .command("typegen")
56
+ .description("Generate .cef/generated.d.ts and update cef.lock.json")
57
+ .option("--config <path>", "Path to cef.config.ts")
58
+ .action(async (subOpts) => {
59
+ try {
60
+ const result = await cefTypegen({ configPath: subOpts.config });
61
+ console.log(`[ok] ${result.generatedPath}`);
62
+ console.log(`[ok] ${result.lockfilePath}`);
63
+ }
64
+ catch (e) {
65
+ onError(e);
66
+ }
67
+ });
68
+ program
69
+ .command("inspect <agentDir>")
70
+ .description("Inspect a built bundle + manifest")
71
+ .action(async (agentDir) => {
72
+ try {
73
+ const result = await cefInspect({ agentDir });
74
+ const anyMissing = result.engagements.some((e) => e.missingMethods.length > 0);
75
+ if (anyMissing)
76
+ process.exit(2);
77
+ }
78
+ catch (e) {
79
+ onError(e);
80
+ }
81
+ });
82
+ // Stubs — implemented in subsequent milestones.
83
+ program
84
+ .command("test")
85
+ .description("(stub) run agent tests")
86
+ .action(() => {
87
+ console.log("cef test: not yet implemented (use vitest directly for now)");
88
+ });
89
+ program
90
+ .command("publish")
91
+ .description("Publish a built agent's manifest to the marketplace")
92
+ .option("--marketplace <url>", "Marketplace base URL (overrides $CEF_MARKETPLACE_URL)")
93
+ .option("--agent <id>", "Which dist/<id>/ to publish (defaults to the only built agent)")
94
+ .option("--privkey <hex>", "AS private key (hex, 64 chars). Pair with --pubkey.")
95
+ .option("--pubkey <hex>", "AS public key (hex, 64 chars). Pair with --privkey.")
96
+ .option("--keystore <path>", "Path to a JSON keystore file `{ pubkey, privkey }`")
97
+ .option("--profile <name>", "Profile section in ~/.config/cef/credentials (default: 'default')")
98
+ .option("--out <dir>", "Output directory the build wrote to (defaults to dist)", "dist")
99
+ .action(async (subOpts) => {
100
+ try {
101
+ const marketplaceUrl = subOpts.marketplace ??
102
+ process.env.CEF_MARKETPLACE_URL ??
103
+ DEFAULT_MARKETPLACE_URL;
104
+ const publishOpts = {
105
+ marketplaceUrl,
106
+ ...(subOpts.agent !== undefined ? { agentId: subOpts.agent } : {}),
107
+ ...(subOpts.privkey !== undefined ? { privkey: subOpts.privkey } : {}),
108
+ ...(subOpts.pubkey !== undefined ? { pubkey: subOpts.pubkey } : {}),
109
+ ...(subOpts.keystore !== undefined ? { keystore: subOpts.keystore } : {}),
110
+ ...(subOpts.profile !== undefined ? { profile: subOpts.profile } : {}),
111
+ ...(subOpts.out !== undefined ? { distDir: subOpts.out } : {}),
112
+ ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),
113
+ };
114
+ const result = await cefPublish(publishOpts);
115
+ console.log(`✓ Published ${result.agentId}@${result.version}`);
116
+ console.log(` agentId: ${result.agentId}`);
117
+ console.log(` pubkey: ${result.pubkey}`);
118
+ console.log(` manifestCid: ${result.manifestCid}`);
119
+ }
120
+ catch (e) {
121
+ // CredentialsError carries either a single-line typo message or
122
+ // the canonical multi-line "no AS credentials configured" guidance
123
+ // block. Both ship through `onError` unchanged — the default impl
124
+ // writes to stderr, which is what we want.
125
+ onError(e);
126
+ }
127
+ });
128
+ const keypair = program
129
+ .command("keypair")
130
+ .description("Manage AS Ed25519 keypairs (Agent Service identity)");
131
+ keypair
132
+ .command("generate")
133
+ .description("Generate a new AS keypair (stdout, --out file, or --profile)")
134
+ .option("--out <path>", "Write the JSON keypair to <path> (mode 0600); refuses existing unless --force")
135
+ .option("--profile <name>", "Write/merge into ~/.config/cef/credentials under [<name>] (mode 0600)")
136
+ .option("--force", "Overwrite an existing --out file or --profile section")
137
+ .action(async (subOpts) => {
138
+ try {
139
+ const result = await cefKeypairGenerate({
140
+ ...(subOpts.out !== undefined ? { out: subOpts.out } : {}),
141
+ ...(subOpts.profile !== undefined ? { profile: subOpts.profile } : {}),
142
+ ...(subOpts.force !== undefined ? { force: subOpts.force } : {}),
143
+ });
144
+ if (result.path === undefined && result.profile === undefined) {
145
+ // Default sink: print the JSON to stdout.
146
+ process.stdout.write(JSON.stringify({ pubkey: result.pubkey, privkey: result.privkey }) +
147
+ "\n");
148
+ return;
149
+ }
150
+ const profileSuffix = result.profile
151
+ ? ` [profile: ${result.profile}]`
152
+ : "";
153
+ console.log(`✓ AS keypair written to ${result.path}${profileSuffix}`);
154
+ console.log(` Pubkey: ${result.pubkey}`);
155
+ console.log(" This keypair is your Agent Service identity. Keep the private key safe.");
156
+ console.log(" To share with your team, hand them the file or sync it through your team's");
157
+ console.log(" secrets manager — do NOT generate a new one for each developer.");
158
+ }
159
+ catch (e) {
160
+ onError(e);
161
+ }
162
+ });
163
+ program
164
+ .command("dev")
165
+ .description("(stub) run dev loop")
166
+ .action(() => {
167
+ console.log("cef dev: not yet implemented");
168
+ });
169
+ return program;
170
+ }
171
+ //# sourceMappingURL=cli-program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-program.js","sourceRoot":"","sources":["../src/cli-program.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import { Command } from 'commander';
3
- export declare function createProgram(): Command;
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js CHANGED
@@ -1,69 +1,29 @@
1
1
  #!/usr/bin/env node
2
- import fs from 'fs';
3
- import path from 'path';
4
- import { fileURLToPath } from 'url';
5
- import { Command } from 'commander';
6
- import { registerAuthCommands } from './commands/auth/index.js';
7
- import { registerDeployCommands } from './commands/deploy/index.js';
8
- import { registerServiceCommands } from './commands/service/index.js';
9
- import { registerPlaygroundCommands } from './commands/playground/index.js';
10
- import { registerDevCommands } from './commands/dev/index.js';
11
- function getVersion() {
12
- try {
13
- const dir = path.dirname(fileURLToPath(import.meta.url));
14
- const pkgPath = path.join(dir, '..', 'package.json');
15
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
16
- return pkg.version ?? '0.0.0';
17
- }
18
- catch {
19
- return '0.0.0';
20
- }
2
+ /**
3
+ * `cef` CLI binary entry point. Wires the programmatic command functions
4
+ * (re-exported from `./lib.ts`) into commander subcommands.
5
+ *
6
+ * Subcommands implemented:
7
+ * - build : bundle agents per cef.config.ts
8
+ * - typegen : generate .cef/generated.d.ts + cef.lock.json
9
+ * - inspect : print manifest routing + bundle methods for a built agent
10
+ * - publish : sign + POST a built manifest to the marketplace API
11
+ *
12
+ * Stubs (planned for the next phase):
13
+ * - test, dev
14
+ */
15
+ import { buildProgram } from "./cli-program.js";
16
+ function fail(err) {
17
+ const msg = err instanceof Error ? err.message : String(err);
18
+ console.error(msg);
19
+ process.exit(1);
21
20
  }
22
- function showWelcome(version) {
23
- console.log(`
24
- \x1b[1mCEF AI CLI\x1b[0m \x1b[2mv${version}\x1b[0m
25
-
26
- \x1b[36mQuick start:\x1b[0m
27
-
28
- \x1b[33m$\x1b[0m cef login Authenticate with CEF platform
29
- \x1b[33m$\x1b[0m cef dev Start local dev server with UI
30
- \x1b[33m$\x1b[0m cef deploy Deploy topology to orchestrator
31
- \x1b[33m$\x1b[0m cef status Compare local vs deployed state
32
-
33
- \x1b[36mOther commands:\x1b[0m
34
-
35
- \x1b[33m$\x1b[0m cef service list List agent services
36
- \x1b[33m$\x1b[0m cef service create Create a new agent service
37
- \x1b[33m$\x1b[0m cef clone --pubkey <key> Download existing service
38
- \x1b[33m$\x1b[0m cef delete Delete deployed entities
39
- \x1b[33m$\x1b[0m cef --help Show all options
40
-
41
- \x1b[2mDocs: https://github.com/CEF-AI/deploy-sdk#readme\x1b[0m
42
- `);
21
+ // Top-level await is fine: the package is "type": "module" with
22
+ // "module": "NodeNext" which targets ES2022.
23
+ try {
24
+ await buildProgram().parseAsync(process.argv);
43
25
  }
44
- export function createProgram() {
45
- const program = new Command();
46
- program
47
- .name('cef')
48
- .description('CEF AI command-line interface')
49
- .version(getVersion(), '-V, --version');
50
- registerAuthCommands(program);
51
- registerDeployCommands(program);
52
- registerServiceCommands(program);
53
- registerPlaygroundCommands(program);
54
- registerDevCommands(program);
55
- return program;
56
- }
57
- const isDirectRun = process.argv[1] &&
58
- (fileURLToPath(import.meta.url) === process.argv[1] ||
59
- process.argv[1].endsWith('/cli.js'));
60
- if (isDirectRun) {
61
- const program = createProgram();
62
- // No args (or only node + script): show welcome instead of crashing into deploy
63
- const userArgs = process.argv.slice(2);
64
- if (userArgs.length === 0) {
65
- showWelcome(getVersion());
66
- process.exit(0);
67
- }
68
- program.parse();
26
+ catch (e) {
27
+ fail(e);
69
28
  }
29
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,SAAS,IAAI,CAAC,GAAY;IACxB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,gEAAgE;AAChE,6CAA6C;AAC7C,IAAI,CAAC;IACH,MAAM,YAAY,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,CAAC,CAAC,CAAC;AACV,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Public options for `cefBuild`. Defaults are deliberately CWD-relative so
3
+ * the function is usable both from the CLI binary and programmatically
4
+ * from tests / scripts.
5
+ */
6
+ export interface CefBuildOptions {
7
+ /** Project root. Defaults to `process.cwd()`. */
8
+ cwd?: string;
9
+ /** Path to `cef.config.ts`. Defaults to `<cwd>/cef.config.ts`. */
10
+ configPath?: string;
11
+ /** Output root. Defaults to `<cwd>/dist`. Each agent gets `<outDir>/<agentId>/`. */
12
+ outDir?: string;
13
+ }
14
+ export interface CefBuildResult {
15
+ agents: Array<{
16
+ agentId: string;
17
+ bundlePath: string;
18
+ manifestPath: string;
19
+ bundleBytes: number;
20
+ }>;
21
+ }
22
+ /**
23
+ * Build all agents declared in `cef.config.ts` to `<outDir>/<agentId>/`.
24
+ *
25
+ * For each leaf agent we:
26
+ * 1. Normalize the engagement layer (`entry` shorthand → one default
27
+ * engagement, or pass `engagements[]` through with absolute paths).
28
+ * 2. Run static lints PER ENGAGEMENT (so each entry source gets its own
29
+ * publishes derivation).
30
+ * 3. Bundle all engagements into one IIFE (with footer that builds
31
+ * `__cefAgent.engagements[id] = new Cls()`).
32
+ * 4. Execute the bundle in a fresh `vm` sandbox to read decorator metadata
33
+ * per engagement.
34
+ * 5. Combine that metadata + lint output + agent-level config to emit
35
+ * `manifest.json` (engagements[] + targeting + agent-level cubbies/...).
36
+ *
37
+ * Returns a list of artefact paths suitable for further pipeline stages
38
+ * (e.g. `cef publish` consuming the bundle/manifest pair).
39
+ */
40
+ export declare function cefBuild(opts?: CefBuildOptions): Promise<CefBuildResult>;
41
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AA2KD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4FlF"}
@@ -0,0 +1,252 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import vm from "node:vm";
5
+ import * as esbuild from "esbuild";
6
+ import { ENGAGEMENT_METADATA } from "@cef-ai/agent-sdk";
7
+ import { ESBUILD_GLOBAL_NAME, IIFE_FOOTER, } from "../build/esbuild-plugin.js";
8
+ import { lintAgentSource } from "../build/lints.js";
9
+ import { flattenAgents, loadConfig, normalizeEngagements, } from "../build/load-config.js";
10
+ import { emitManifest, } from "../build/manifest.js";
11
+ import { validateTargeting } from "../build/targeting.js";
12
+ /**
13
+ * Walk up from `start` looking for an existing `node_modules` directory.
14
+ * Mirrors {@link loadConfig}'s walk so the temp wrapper file is placed
15
+ * somewhere that node's ESM resolver / esbuild can locate `@cef-ai/agent-sdk`.
16
+ *
17
+ * Returns the *parent* directory (the one CONTAINING `node_modules`), or
18
+ * `null` if none was found.
19
+ */
20
+ async function findNodeModulesParent(start) {
21
+ let dir = path.resolve(start);
22
+ while (true) {
23
+ try {
24
+ const stat = await fs.stat(path.join(dir, "node_modules"));
25
+ if (stat.isDirectory())
26
+ return dir;
27
+ }
28
+ catch {
29
+ // not here, keep walking up
30
+ }
31
+ const parent = path.dirname(dir);
32
+ if (parent === dir)
33
+ return null;
34
+ dir = parent;
35
+ }
36
+ }
37
+ /**
38
+ * Generate the temporary wrapper module that imports each engagement's
39
+ * default export and re-exports the map as `engagements`. esbuild bundles
40
+ * this wrapper as the entry point; the IIFE footer (see esbuild-plugin.ts)
41
+ * picks the map up from `globalThis.__cefBundle.engagements` and
42
+ * instantiates each class.
43
+ *
44
+ * Imports use absolute file paths so resolution doesn't depend on the
45
+ * wrapper's directory.
46
+ */
47
+ function renderWrapperSource(engagements) {
48
+ const importLines = engagements
49
+ .map((e, i) => `import _e${i} from ${JSON.stringify(e.entry)};`)
50
+ .join("\n");
51
+ const mapBody = engagements
52
+ .map((e, i) => ` ${JSON.stringify(e.id)}: _e${i}`)
53
+ .join(",\n");
54
+ return `${importLines}\nexport const engagements = {\n${mapBody}\n};\n`;
55
+ }
56
+ /**
57
+ * Bundle one agent's engagement set into `<outDir>/<agentId>/bundle.js`.
58
+ *
59
+ * The flow is:
60
+ * 1. Render a temp wrapper that pulls in every engagement's default
61
+ * export and re-exports them under `engagements`.
62
+ * 2. Run esbuild on the wrapper (IIFE + footer).
63
+ * 3. Execute the bundle in a fresh `vm` context to read each engagement
64
+ * class's decorator metadata (the `__cefAgent.engagements[id]`
65
+ * instance's `constructor[ENGAGEMENT_METADATA]`).
66
+ *
67
+ * Decorators are still TC39-stage-2 syntax in our SDK, so we feed esbuild
68
+ * a `tsconfigRaw` that turns on `experimentalDecorators` regardless of
69
+ * what the host project's tsconfig says.
70
+ */
71
+ async function bundleAgent(args) {
72
+ const { agent, engagements, configDir, outDir } = args;
73
+ const agentOutDir = path.join(outDir, agent.id);
74
+ const bundlePath = path.join(agentOutDir, "bundle.js");
75
+ await fs.mkdir(agentOutDir, { recursive: true });
76
+ // Place the wrapper inside an existing `node_modules/.cef/build-cache/`
77
+ // ancestor so its `@cef-ai/agent-sdk` import (transitively reached through
78
+ // the engagement files) resolves identically to how loadConfig does it.
79
+ const nmParent = await findNodeModulesParent(configDir);
80
+ if (!nmParent) {
81
+ throw new Error(`[@cef-ai/cli] could not find a node_modules ancestor of ${configDir}; install dependencies first`);
82
+ }
83
+ const cacheDir = path.join(nmParent, "node_modules", ".cef", "build-cache");
84
+ await fs.mkdir(cacheDir, { recursive: true });
85
+ const wrapperPath = path.join(cacheDir, `wrapper-${agent.id}-${process.pid}-${crypto.randomBytes(6).toString("hex")}.ts`);
86
+ await fs.writeFile(wrapperPath, renderWrapperSource(engagements), "utf8");
87
+ try {
88
+ await esbuild.build({
89
+ entryPoints: [wrapperPath],
90
+ bundle: true,
91
+ format: "iife",
92
+ target: "es2022",
93
+ platform: "neutral",
94
+ globalName: ESBUILD_GLOBAL_NAME,
95
+ outfile: bundlePath,
96
+ footer: { js: IIFE_FOOTER },
97
+ logLevel: "silent",
98
+ // Inline everything; the runtime sandbox has no module loader.
99
+ external: [],
100
+ tsconfigRaw: JSON.stringify({
101
+ compilerOptions: {
102
+ experimentalDecorators: true,
103
+ target: "es2022",
104
+ useDefineForClassFields: false,
105
+ },
106
+ }),
107
+ conditions: ["import", "node"],
108
+ });
109
+ }
110
+ finally {
111
+ await fs.unlink(wrapperPath).catch(() => { });
112
+ }
113
+ // Read the metadata back by executing the bundle in a fresh vm sandbox.
114
+ // The IIFE constructs one instance per engagement and assigns the map to
115
+ // globalThis.__cefAgent.engagements[id]; ENGAGEMENT_METADATA hangs off
116
+ // each instance's class.
117
+ const bundleSource = await fs.readFile(bundlePath, "utf8");
118
+ const sandbox = { console };
119
+ sandbox.globalThis = sandbox;
120
+ try {
121
+ vm.runInNewContext(bundleSource, sandbox);
122
+ }
123
+ catch (e) {
124
+ const msg = e?.message ?? String(e);
125
+ throw new Error(`[@cef-ai/cli] agent "${agent.id}" threw while initializing for metadata extraction. ` +
126
+ `Constructors must be side-effect-free for cef build to read decorator metadata. ` +
127
+ `Original error: ${msg}`);
128
+ }
129
+ const cefAgent = sandbox.__cefAgent;
130
+ if (!cefAgent || !cefAgent.engagements) {
131
+ throw new Error(`[@cef-ai/cli] agent "${agent.id}": bundle did not set globalThis.__cefAgent.engagements`);
132
+ }
133
+ const metas = new Map();
134
+ for (const e of engagements) {
135
+ const inst = cefAgent.engagements[e.id];
136
+ if (!inst) {
137
+ throw new Error(`[@cef-ai/cli] engagement "${e.id}" in agent "${agent.id}": not present in __cefAgent.engagements`);
138
+ }
139
+ const meta = inst.constructor[ENGAGEMENT_METADATA];
140
+ if (!meta) {
141
+ throw new Error(`[@cef-ai/cli] engagement "${e.id}" in agent "${agent.id}": class has no @OnEvent/@OnStart/@OnClose/@Engagement decorators`);
142
+ }
143
+ if (meta.id !== undefined && meta.id !== e.id) {
144
+ throw new Error(`[@cef-ai/cli] engagement "${e.id}" in agent "${agent.id}": @Engagement decorator declares id "${meta.id}" but config declares "${e.id}"`);
145
+ }
146
+ metas.set(e.id, meta);
147
+ }
148
+ const stat = await fs.stat(bundlePath);
149
+ return { bundlePath, bundleBytes: stat.size, metas };
150
+ }
151
+ /**
152
+ * Build all agents declared in `cef.config.ts` to `<outDir>/<agentId>/`.
153
+ *
154
+ * For each leaf agent we:
155
+ * 1. Normalize the engagement layer (`entry` shorthand → one default
156
+ * engagement, or pass `engagements[]` through with absolute paths).
157
+ * 2. Run static lints PER ENGAGEMENT (so each entry source gets its own
158
+ * publishes derivation).
159
+ * 3. Bundle all engagements into one IIFE (with footer that builds
160
+ * `__cefAgent.engagements[id] = new Cls()`).
161
+ * 4. Execute the bundle in a fresh `vm` sandbox to read decorator metadata
162
+ * per engagement.
163
+ * 5. Combine that metadata + lint output + agent-level config to emit
164
+ * `manifest.json` (engagements[] + targeting + agent-level cubbies/...).
165
+ *
166
+ * Returns a list of artefact paths suitable for further pipeline stages
167
+ * (e.g. `cef publish` consuming the bundle/manifest pair).
168
+ */
169
+ export async function cefBuild(opts = {}) {
170
+ const cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
171
+ const configPath = opts.configPath
172
+ ? path.resolve(cwd, opts.configPath)
173
+ : path.join(cwd, "cef.config.ts");
174
+ const outDir = opts.outDir ? path.resolve(cwd, opts.outDir) : path.join(cwd, "dist");
175
+ const configDir = path.dirname(configPath);
176
+ const config = await loadConfig(configPath, configDir);
177
+ const leaves = flattenAgents(config);
178
+ const agents = [];
179
+ for (const agent of leaves) {
180
+ const engagements = normalizeEngagements(agent, configDir);
181
+ // 1. Static lints — runs BEFORE esbuild so authors get a clean error
182
+ // location on the source rather than a transformed bundle line.
183
+ // Per-engagement so every entry source is audited and we collect
184
+ // per-engagement publishes for the manifest.
185
+ const declaredCubbyAliases = new Set((agent.cubbies ?? []).map((c) => c.alias));
186
+ const declaredModelAliases = new Set(Object.keys(agent.models ?? {}));
187
+ const perEngagementPublishes = new Map();
188
+ for (const e of engagements) {
189
+ const lintResult = lintAgentSource({
190
+ entryPath: e.entry,
191
+ declaredCubbyAliases,
192
+ declaredModelAliases,
193
+ });
194
+ perEngagementPublishes.set(e.id, lintResult.publishes);
195
+ }
196
+ // 2. Validate targeting BEFORE bundling so authors get an early failure
197
+ // that points at cef.config.ts rather than wading through esbuild
198
+ // output for what's a config-level mistake.
199
+ const { targeting } = validateTargeting({
200
+ agentId: agent.id,
201
+ engagementIds: engagements.map((e) => e.id),
202
+ targeting: agent.targeting,
203
+ });
204
+ const { bundlePath, bundleBytes, metas } = await bundleAgent({
205
+ agent,
206
+ engagements,
207
+ configDir,
208
+ outDir,
209
+ });
210
+ const engagementInputs = engagements.map((e) => {
211
+ const meta = metas.get(e.id);
212
+ const input = {
213
+ id: e.id,
214
+ events: meta.events ?? {},
215
+ lifecycle: meta.lifecycle ?? {},
216
+ publishes: perEngagementPublishes.get(e.id) ?? [],
217
+ };
218
+ if (meta.goal !== undefined)
219
+ input.goal = meta.goal;
220
+ return input;
221
+ });
222
+ const manifestPath = path.join(outDir, agent.id, "manifest.json");
223
+ await emitManifest(manifestPath, {
224
+ agentId: agent.id,
225
+ version: agent.version,
226
+ bundlePath,
227
+ engagements: engagementInputs,
228
+ config: {
229
+ alias: agent.alias,
230
+ source: agent.source,
231
+ card: agent.card,
232
+ requiredScopes: agent.requiredScopes,
233
+ idleTimeout: agent.idleTimeout,
234
+ cubbies: agent.cubbies,
235
+ settings: agent.settings,
236
+ models: agent.models,
237
+ uses: agent.uses,
238
+ eventSchemas: agent.eventSchemas,
239
+ },
240
+ configDir,
241
+ targeting,
242
+ });
243
+ agents.push({
244
+ agentId: agent.id,
245
+ bundlePath,
246
+ manifestPath,
247
+ bundleBytes,
248
+ });
249
+ }
250
+ return { agents };
251
+ }
252
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Targeting } from "../build/load-config.js";
2
+ /**
3
+ * Public options for `cefInspect`. The agent directory is the only required
4
+ * input; logging can be disabled when calling programmatically (tests).
5
+ */
6
+ export interface CefInspectOptions {
7
+ /** Directory containing `manifest.json` and `bundle.js`. */
8
+ agentDir: string;
9
+ /** When false, suppress console output. Defaults to true. */
10
+ print?: boolean;
11
+ }
12
+ export interface InspectEngagement {
13
+ id: string;
14
+ goal?: string;
15
+ /** eventType → handlerName, copied from `manifest.engagements[i].handles`. */
16
+ handles: Record<string, string>;
17
+ /** Method names exposed on this engagement's instance, sorted alphabetically. */
18
+ exposedMethods: string[];
19
+ /** Names referenced by manifest routing that aren't on the engagement instance. */
20
+ missingMethods: string[];
21
+ }
22
+ export interface CefInspectResult {
23
+ manifest: {
24
+ /** Marketplace alias / build id. */
25
+ alias: string;
26
+ version: string;
27
+ cubbies: string[];
28
+ models: string[];
29
+ handles: string[];
30
+ publishes: string[];
31
+ targeting: Targeting;
32
+ };
33
+ engagements: InspectEngagement[];
34
+ }
35
+ /**
36
+ * Inspect a built agent directory.
37
+ *
38
+ * Reads `<agentDir>/manifest.json` for the per-engagement routing tables
39
+ * and executes `<agentDir>/bundle.js` in a fresh `node:vm` context to
40
+ * enumerate the methods actually exposed on each
41
+ * `globalThis.__cefAgent.engagements[id]` instance. The two views are
42
+ * useful for confirming that each manifest engagement's `handlerName`
43
+ * strings match real methods on the bundled instance.
44
+ *
45
+ * Pure exploration: no files are written, no network. Safe to run on any
46
+ * `dist/<agentId>/` directory.
47
+ */
48
+ export declare function cefInspect(opts: CefInspectOptions): Promise<CefInspectResult>;
49
+ //# sourceMappingURL=inspect.d.ts.map