create-cf-open-agents-api 0.2.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 (94) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +25 -0
  3. package/README.md +96 -0
  4. package/dist/answers.d.ts +30 -0
  5. package/dist/answers.js +83 -0
  6. package/dist/answers.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +31 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +51 -0
  11. package/dist/commands/doctor.js +26 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/commands/init.d.ts +177 -0
  14. package/dist/commands/init.js +85 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/setup.d.ts +67 -0
  17. package/dist/commands/setup.js +31 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/vendor.d.ts +69 -0
  20. package/dist/commands/vendor.js +37 -0
  21. package/dist/commands/vendor.js.map +1 -0
  22. package/dist/doctor.d.ts +26 -0
  23. package/dist/doctor.js +136 -0
  24. package/dist/doctor.js.map +1 -0
  25. package/dist/exec.d.ts +16 -0
  26. package/dist/exec.js +33 -0
  27. package/dist/exec.js.map +1 -0
  28. package/dist/fs.d.ts +24 -0
  29. package/dist/fs.js +54 -0
  30. package/dist/fs.js.map +1 -0
  31. package/dist/index.d.ts +16 -0
  32. package/dist/index.js +17 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/init.d.ts +37 -0
  35. package/dist/init.js +179 -0
  36. package/dist/init.js.map +1 -0
  37. package/dist/jsonc.d.ts +17 -0
  38. package/dist/jsonc.js +55 -0
  39. package/dist/jsonc.js.map +1 -0
  40. package/dist/plan.d.ts +23 -0
  41. package/dist/plan.js +36 -0
  42. package/dist/plan.js.map +1 -0
  43. package/dist/project.d.ts +62 -0
  44. package/dist/project.js +52 -0
  45. package/dist/project.js.map +1 -0
  46. package/dist/setup.d.ts +26 -0
  47. package/dist/setup.js +139 -0
  48. package/dist/setup.js.map +1 -0
  49. package/dist/steps/agents-file.d.ts +5 -0
  50. package/dist/steps/agents-file.js +19 -0
  51. package/dist/steps/agents-file.js.map +1 -0
  52. package/dist/steps/dev-vars.d.ts +17 -0
  53. package/dist/steps/dev-vars.js +65 -0
  54. package/dist/steps/dev-vars.js.map +1 -0
  55. package/dist/steps/entry.d.ts +7 -0
  56. package/dist/steps/entry.js +36 -0
  57. package/dist/steps/entry.js.map +1 -0
  58. package/dist/steps/gitignore.d.ts +5 -0
  59. package/dist/steps/gitignore.js +20 -0
  60. package/dist/steps/gitignore.js.map +1 -0
  61. package/dist/steps/package-json.d.ts +12 -0
  62. package/dist/steps/package-json.js +45 -0
  63. package/dist/steps/package-json.js.map +1 -0
  64. package/dist/steps/standalone.d.ts +8 -0
  65. package/dist/steps/standalone.js +18 -0
  66. package/dist/steps/standalone.js.map +1 -0
  67. package/dist/steps/tsconfig.d.ts +4 -0
  68. package/dist/steps/tsconfig.js +18 -0
  69. package/dist/steps/tsconfig.js.map +1 -0
  70. package/dist/steps/vendor.d.ts +30 -0
  71. package/dist/steps/vendor.js +158 -0
  72. package/dist/steps/vendor.js.map +1 -0
  73. package/dist/steps/wrangler.d.ts +35 -0
  74. package/dist/steps/wrangler.js +197 -0
  75. package/dist/steps/wrangler.js.map +1 -0
  76. package/dist/templates/agents.d.ts +27 -0
  77. package/dist/templates/agents.js +265 -0
  78. package/dist/templates/agents.js.map +1 -0
  79. package/dist/templates/standalone.d.ts +12 -0
  80. package/dist/templates/standalone.js +44 -0
  81. package/dist/templates/standalone.js.map +1 -0
  82. package/dist/token.d.ts +3 -0
  83. package/dist/token.js +7 -0
  84. package/dist/token.js.map +1 -0
  85. package/dist/ui.d.ts +33 -0
  86. package/dist/ui.js +82 -0
  87. package/dist/ui.js.map +1 -0
  88. package/dist/vendor.d.ts +9 -0
  89. package/dist/vendor.js +14 -0
  90. package/dist/vendor.js.map +1 -0
  91. package/dist/versions.d.ts +30 -0
  92. package/dist/versions.js +33 -0
  93. package/dist/versions.js.map +1 -0
  94. package/package.json +54 -0
@@ -0,0 +1,52 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { basename, join } from "node:path";
3
+ import { CliError } from "./plan.js";
4
+ const CONFIG_FILES = ["wrangler.jsonc", "wrangler.json"];
5
+ /** Finds the Wrangler configuration; a directory without one becomes a new project. */
6
+ export function locateProject(root) {
7
+ const configPath = CONFIG_FILES.map((file) => join(root, file)).find((path) => existsSync(path));
8
+ if (!configPath && existsSync(join(root, "wrangler.toml")))
9
+ throw new CliError("wrangler.toml is not supported; convert it to wrangler.jsonc first (wrangler types can help).");
10
+ if (!configPath && existsSync(join(root, "packages", "supervisor", "package.json")))
11
+ throw new CliError(`${root} looks like the CF-Open-Agents-API repository; run the CLI in your own project (or pass a directory).`);
12
+ return {
13
+ root,
14
+ mode: configPath ? "retrofit" : "standalone",
15
+ configPath: configPath ?? join(root, "wrangler.jsonc"),
16
+ packageManager: detectPackageManager(root),
17
+ };
18
+ }
19
+ export function detectPackageManager(root) {
20
+ const manifest = readManifest(root);
21
+ const declared = typeof manifest?.packageManager === "string" ? manifest.packageManager : "";
22
+ for (const manager of ["pnpm", "yarn", "bun"])
23
+ if (declared.startsWith(manager))
24
+ return manager;
25
+ if (existsSync(join(root, "pnpm-lock.yaml")))
26
+ return "pnpm";
27
+ if (existsSync(join(root, "yarn.lock")))
28
+ return "yarn";
29
+ if (existsSync(join(root, "bun.lock")) || existsSync(join(root, "bun.lockb")))
30
+ return "bun";
31
+ return "npm";
32
+ }
33
+ export function readManifest(root) {
34
+ const path = join(root, "package.json");
35
+ if (!existsSync(path))
36
+ return;
37
+ try {
38
+ return JSON.parse(readFileSync(path, "utf8"));
39
+ }
40
+ catch {
41
+ throw new CliError("package.json is not valid JSON");
42
+ }
43
+ }
44
+ /** A Worker name from a directory name: lowercase, dashes, no leading or trailing dash. */
45
+ export function workerNameFrom(root) {
46
+ const name = basename(root)
47
+ .toLowerCase()
48
+ .replace(/[^a-z0-9-]+/g, "-")
49
+ .replace(/^-+|-+$/g, "");
50
+ return name || "agents";
51
+ }
52
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type Runner } from "./exec.js";
2
+ import { Plan } from "./plan.js";
3
+ import { type WranglerConfig } from "./project.js";
4
+ import { type Prompter, type Reporter } from "./ui.js";
5
+ export interface SetupOptions {
6
+ dir: string;
7
+ dryRun: boolean;
8
+ /** Read secret values from the environment instead of prompting. */
9
+ fromEnv: boolean;
10
+ skipSecrets: boolean;
11
+ skipBuckets: boolean;
12
+ prompter?: Prompter;
13
+ reporter?: Reporter;
14
+ runner?: Runner;
15
+ env?: NodeJS.ProcessEnv;
16
+ }
17
+ interface Wrangler {
18
+ (args: readonly string[], input?: string): ReturnType<Runner>;
19
+ describe(args: readonly string[]): string;
20
+ }
21
+ /** Creates the R2 buckets the configuration names; an existing bucket is a skip. */
22
+ export declare function ensureBuckets(config: WranglerConfig, wrangler: Wrangler, plan: Plan, dryRun: boolean): void;
23
+ /** The 32-hex account ids `wrangler whoami` prints. */
24
+ export declare function accountIds(output: string): string[];
25
+ export declare function runSetup(options: SetupOptions): Promise<Plan>;
26
+ export {};
package/dist/setup.js ADDED
@@ -0,0 +1,139 @@
1
+ import { join, resolve } from "node:path";
2
+ import { packageManagerExec, run } from "./exec.js";
3
+ import { readIfExists } from "./fs.js";
4
+ import { parseJsonc } from "./jsonc.js";
5
+ import { CliError, Plan } from "./plan.js";
6
+ import { locateProject } from "./project.js";
7
+ import { parseDevVars } from "./steps/dev-vars.js";
8
+ import { MINIMUM_TOKEN_LENGTH, randomToken } from "./token.js";
9
+ import { clackPrompter, clackReporter, defaultPrompter, interactive, plainReporter, } from "./ui.js";
10
+ const PROVIDER_SECRETS = ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "MODEL_API_KEY"];
11
+ const R2_SECRETS = ["R2_ACCESS_KEY_ID", "R2_SECRET_ACCESS_KEY"];
12
+ const ACCOUNT_SECRET = "CLOUDFLARE_R2_ACCOUNT_ID";
13
+ const R2_TOKEN_HELP = "R2 → Manage R2 API Tokens in the Cloudflare dashboard: create a token with Object Read & Write on the workspaces bucket.";
14
+ function wranglerFor(project, runner) {
15
+ const exec = packageManagerExec(project.packageManager);
16
+ // wrangler runs with the project as cwd, so the configuration is named relative to it.
17
+ const configArgs = ["--config", project.configPath.slice(project.root.length + 1)];
18
+ const call = ((args, input) => runner(exec[0] ?? "npx", [...exec.slice(1), "wrangler", ...args, ...configArgs], {
19
+ cwd: project.root,
20
+ input,
21
+ }));
22
+ call.describe = (args) => [...exec, "wrangler", ...args, ...configArgs].join(" ");
23
+ return call;
24
+ }
25
+ /** Creates the R2 buckets the configuration names; an existing bucket is a skip. */
26
+ export function ensureBuckets(config, wrangler, plan, dryRun) {
27
+ for (const bucket of config.r2_buckets ?? []) {
28
+ if (!bucket.bucket_name)
29
+ continue;
30
+ const args = ["r2", "bucket", "create", bucket.bucket_name];
31
+ if (dryRun) {
32
+ plan.add({
33
+ status: "created",
34
+ file: `r2 bucket ${bucket.bucket_name}`,
35
+ note: `Would run ${wrangler.describe(args)}`,
36
+ });
37
+ continue;
38
+ }
39
+ const result = wrangler(args);
40
+ const output = result.stdout + result.stderr;
41
+ if (result.ok)
42
+ plan.add({ status: "created", file: `r2 bucket ${bucket.bucket_name}` });
43
+ else if (/already exists/i.test(output))
44
+ plan.add({ status: "skipped", file: `r2 bucket ${bucket.bucket_name}` });
45
+ else
46
+ throw new CliError(`Creating bucket ${bucket.bucket_name} failed:\n${output.trim()}`);
47
+ }
48
+ }
49
+ /** The 32-hex account ids `wrangler whoami` prints. */
50
+ export function accountIds(output) {
51
+ return [...new Set(output.match(/\b[0-9a-f]{32}\b/g) ?? [])];
52
+ }
53
+ async function resolveAccountId(wrangler, prompter, env) {
54
+ const fromEnv = env.CLOUDFLARE_R2_ACCOUNT_ID ?? env.CLOUDFLARE_ACCOUNT_ID;
55
+ if (fromEnv)
56
+ return fromEnv;
57
+ const whoami = wrangler(["whoami"]);
58
+ const ids = accountIds(whoami.stdout);
59
+ if (ids.length === 1 && ids[0])
60
+ return ids[0];
61
+ if (ids.length > 1)
62
+ return prompter.select("Cloudflare account", ids.map((id) => ({ value: id, label: id })), ids[0] ?? "");
63
+ return prompter.text("Cloudflare account id (dashboard → Workers & Pages → Account details)", "");
64
+ }
65
+ function secretNames(root) {
66
+ const devVars = parseDevVars(readIfExists(join(root, ".dev.vars")) ?? "");
67
+ const provider = PROVIDER_SECRETS.filter((name) => devVars.has(name));
68
+ return ["API_TOKEN", ...provider, ...R2_SECRETS, ACCOUNT_SECRET];
69
+ }
70
+ async function collectSecrets(names, root, wrangler, prompter, options) {
71
+ const env = options.env ?? process.env;
72
+ const devVars = parseDevVars(readIfExists(join(root, ".dev.vars")) ?? "");
73
+ const values = {};
74
+ for (const name of names) {
75
+ if (options.fromEnv) {
76
+ const value = env[name];
77
+ if (!value)
78
+ throw new CliError(`--from-env: ${name} is not set in the environment`);
79
+ values[name] = value;
80
+ continue;
81
+ }
82
+ values[name] = await promptSecret(name, devVars.get(name), wrangler, prompter, env);
83
+ }
84
+ return values;
85
+ }
86
+ async function promptSecret(name, local, wrangler, prompter, env) {
87
+ if (name === ACCOUNT_SECRET)
88
+ return resolveAccountId(wrangler, prompter, env);
89
+ if (name === "API_TOKEN") {
90
+ if (local &&
91
+ local.length >= MINIMUM_TOKEN_LENGTH &&
92
+ (await prompter.confirm("Use the API_TOKEN from .dev.vars in production?", true)))
93
+ return local;
94
+ if (await prompter.confirm("Generate a new API_TOKEN? (No = type one)", true))
95
+ return randomToken();
96
+ }
97
+ if (name === "R2_ACCESS_KEY_ID")
98
+ console.log(R2_TOKEN_HELP);
99
+ const value = await prompter.password(`${name}`);
100
+ if (name === "API_TOKEN" && value.length < MINIMUM_TOKEN_LENGTH)
101
+ throw new CliError(`API_TOKEN must be at least ${MINIMUM_TOKEN_LENGTH} characters`);
102
+ return value;
103
+ }
104
+ export async function runSetup(options) {
105
+ const root = resolve(options.dir);
106
+ const project = locateProject(root);
107
+ if (project.mode === "standalone")
108
+ throw new CliError("No Wrangler configuration here; run create-cf-open-agents-api init first.");
109
+ const text = readIfExists(project.configPath) ?? "";
110
+ const config = parseJsonc(text, project.configPath);
111
+ const prompter = options.prompter ?? (options.fromEnv || !interactive() ? defaultPrompter() : clackPrompter());
112
+ const reporter = options.reporter ?? (interactive() ? clackReporter() : plainReporter());
113
+ const wrangler = wranglerFor(project, options.runner ?? run);
114
+ const plan = new Plan();
115
+ reporter.intro(`Production setup for ${config.name ?? project.root}${options.dryRun ? " (dry run)" : ""}`);
116
+ if (!options.skipBuckets)
117
+ ensureBuckets(config, wrangler, plan, options.dryRun);
118
+ if (!options.skipSecrets) {
119
+ const names = secretNames(root);
120
+ if (options.dryRun)
121
+ plan.add({
122
+ status: "updated",
123
+ file: `secrets ${names.join(", ")}`,
124
+ note: `Would run ${wrangler.describe(["secret", "bulk"])} with the values on stdin`,
125
+ });
126
+ else {
127
+ const values = await collectSecrets(names, root, wrangler, prompter, options);
128
+ const result = wrangler(["secret", "bulk"], JSON.stringify(values));
129
+ if (!result.ok)
130
+ throw new CliError(`wrangler secret bulk failed:\n${(result.stdout + result.stderr).trim()}`);
131
+ plan.add({ status: "updated", file: `secrets ${names.join(", ")}` });
132
+ }
133
+ }
134
+ plan.note("LOCAL_BACKUPS stays out of production: the Sandbox SDK then signs presigned R2 URLs with the R2 secrets.");
135
+ plan.note(`Deploy with ${wrangler.describe(["deploy"])}; the first deploy pushes both images and takes several minutes.`);
136
+ reporter.plan(plan, options.dryRun ? "Dry run: nothing was changed" : "Done");
137
+ return plan;
138
+ }
139
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Files } from "../fs.js";
2
+ import type { StepResult } from "../plan.js";
3
+ import { type CompositionInput } from "../templates/agents.js";
4
+ /** Writes the composition module; an edited file is kept unless `--force`. */
5
+ export declare function ensureAgentsFile(files: Files, path: string, composition: CompositionInput, force: boolean): StepResult;
@@ -0,0 +1,19 @@
1
+ import { renderComposition } from "../templates/agents.js";
2
+ /** Writes the composition module; an edited file is kept unless `--force`. */
3
+ export function ensureAgentsFile(files, path, composition, force) {
4
+ const content = renderComposition(composition);
5
+ const existing = files.read(path);
6
+ if (existing !== undefined && existing !== content && !force) {
7
+ const file = path
8
+ .slice(files.root.length + 1)
9
+ .split("\\")
10
+ .join("/");
11
+ return {
12
+ status: "skipped",
13
+ file,
14
+ note: `${file} exists with different content and was kept; --force rewrites it from the template.`,
15
+ };
16
+ }
17
+ return files.write(path, content);
18
+ }
19
+ //# sourceMappingURL=agents-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-file.js","sourceRoot":"","sources":["../../src/steps/agents-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAElF,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAC9B,KAAY,EACZ,IAAY,EACZ,WAA6B,EAC7B,KAAc;IAEd,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI;aACd,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aAC5B,KAAK,CAAC,IAAI,CAAC;aACX,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI;YACJ,IAAI,EAAE,GAAG,IAAI,qFAAqF;SACnG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Files } from "../fs.js";
2
+ import type { StepResult } from "../plan.js";
3
+ export interface DevVarsOptions {
4
+ files: Files;
5
+ /** The provider secret to add as an empty line, with the comment that explains it. */
6
+ secret?: {
7
+ name: string;
8
+ comment: string;
9
+ };
10
+ token?: () => string;
11
+ }
12
+ /** Parses `KEY=value` lines; comments and unknown lines keep their place. */
13
+ export declare function parseDevVars(text: string): Map<string, string>;
14
+ /** `.dev.vars` with a usable API token, the provider key line and local backups. */
15
+ export declare function ensureDevVars(options: DevVarsOptions): StepResult;
16
+ /** The committed example next to `.dev.vars`: existing lines stay, missing keys are appended. */
17
+ export declare function ensureDevVarsExample(options: DevVarsOptions): StepResult;
@@ -0,0 +1,65 @@
1
+ import { join } from "node:path";
2
+ import { MINIMUM_TOKEN_LENGTH, randomToken } from "../token.js";
3
+ const LOCAL_BACKUPS_COMMENT = "# Store sandbox backups on the local R2 emulator during `wrangler dev`; unset in production.";
4
+ const TOKEN_COMMENT = "# Bearer token clients send; at least 32 characters. A caller must use the same value.";
5
+ /** Parses `KEY=value` lines; comments and unknown lines keep their place. */
6
+ export function parseDevVars(text) {
7
+ const values = new Map();
8
+ for (const line of text.split(/\r?\n/)) {
9
+ const match = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/.exec(line);
10
+ if (match?.[1] !== undefined)
11
+ values.set(match[1], (match[2] ?? "").trim());
12
+ }
13
+ return values;
14
+ }
15
+ function upsertLine(lines, key, value, comment) {
16
+ const index = lines.findIndex((line) => new RegExp(`^\\s*${key}\\s*=`).test(line));
17
+ if (index >= 0) {
18
+ lines[index] = `${key}=${value}`;
19
+ return;
20
+ }
21
+ if (lines.length > 0 && lines.at(-1) !== "")
22
+ lines.push("");
23
+ if (comment)
24
+ lines.push(comment);
25
+ lines.push(`${key}=${value}`);
26
+ }
27
+ const trimTrailing = (lines) => {
28
+ while (lines.length > 0 && lines.at(-1) === "")
29
+ lines.pop();
30
+ return lines;
31
+ };
32
+ /** `.dev.vars` with a usable API token, the provider key line and local backups. */
33
+ export function ensureDevVars(options) {
34
+ const path = join(options.files.root, ".dev.vars");
35
+ const existing = options.files.read(path) ?? "";
36
+ const values = parseDevVars(existing);
37
+ const lines = trimTrailing(existing.split(/\r?\n/));
38
+ const notes = [];
39
+ const token = values.get("API_TOKEN") ?? "";
40
+ if (token.length < MINIMUM_TOKEN_LENGTH) {
41
+ upsertLine(lines, "API_TOKEN", (options.token ?? randomToken)(), TOKEN_COMMENT);
42
+ if (token)
43
+ notes.push(`.dev.vars: API_TOKEN was shorter than ${MINIMUM_TOKEN_LENGTH} characters and was replaced.`);
44
+ }
45
+ if (options.secret && !values.has(options.secret.name))
46
+ upsertLine(lines, options.secret.name, "", options.secret.comment);
47
+ if (!values.has("LOCAL_BACKUPS"))
48
+ upsertLine(lines, "LOCAL_BACKUPS", "true", LOCAL_BACKUPS_COMMENT);
49
+ return options.files.write(path, `${lines.join("\n")}\n`, notes.length > 0 ? notes.join(" ") : undefined);
50
+ }
51
+ /** The committed example next to `.dev.vars`: existing lines stay, missing keys are appended. */
52
+ export function ensureDevVarsExample(options) {
53
+ const path = join(options.files.root, ".dev.vars.example");
54
+ const existing = options.files.read(path) ?? "";
55
+ const values = parseDevVars(existing);
56
+ const lines = trimTrailing(existing.split(/\r?\n/));
57
+ if (!values.has("API_TOKEN"))
58
+ lines.push("API_TOKEN=replace-with-at-least-32-random-characters");
59
+ if (options.secret && !values.has(options.secret.name))
60
+ lines.push(options.secret.comment, `${options.secret.name}=`);
61
+ if (!values.has("LOCAL_BACKUPS"))
62
+ lines.push(LOCAL_BACKUPS_COMMENT, "LOCAL_BACKUPS=true");
63
+ return options.files.write(path, `${lines.join("\n")}\n`);
64
+ }
65
+ //# sourceMappingURL=dev-vars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-vars.js","sourceRoot":"","sources":["../../src/steps/dev-vars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Files } from "../fs.js";
2
+ import { type StepResult } from "../plan.js";
3
+ export declare const EXPORTED_CLASSES: readonly ["Agents", "Models", "SessionDO", "TenantCatalogDO", "HarnessDO", "SandboxDO", "ContainerProxy"];
4
+ /** The module specifier from the entry file to the composition, matching its import style. */
5
+ export declare function agentsSpecifier(entryPath: string, agentsPath: string, entrySource: string): string;
6
+ /** Appends the class re-export to the existing entry once. */
7
+ export declare function ensureEntryExports(files: Files, entryPath: string, agentsPath: string): StepResult;
@@ -0,0 +1,36 @@
1
+ import { dirname, relative } from "node:path";
2
+ import { CliError } from "../plan.js";
3
+ export const EXPORTED_CLASSES = [
4
+ "Agents",
5
+ "Models",
6
+ "SessionDO",
7
+ "TenantCatalogDO",
8
+ "HarnessDO",
9
+ "SandboxDO",
10
+ "ContainerProxy",
11
+ ];
12
+ /** The module specifier from the entry file to the composition, matching its import style. */
13
+ export function agentsSpecifier(entryPath, agentsPath, entrySource) {
14
+ const raw = relative(dirname(entryPath), agentsPath).split("\\").join("/");
15
+ const bare = raw.replace(/\.ts$/, "");
16
+ const withDot = bare.startsWith(".") ? bare : `./${bare}`;
17
+ const extensioned = /from\s+["']\.{1,2}\/[^"']+\.js["']/.test(entrySource);
18
+ return extensioned ? `${withDot}.js` : withDot;
19
+ }
20
+ /** Appends the class re-export to the existing entry once. */
21
+ export function ensureEntryExports(files, entryPath, agentsPath) {
22
+ const source = files.read(entryPath);
23
+ if (source === undefined)
24
+ throw new CliError(`The Wrangler entry ${entryPath} does not exist; point main at your Worker entry first.`);
25
+ const file = entryPath
26
+ .slice(files.root.length + 1)
27
+ .split("\\")
28
+ .join("/");
29
+ if (/export\s*\{[^}]*\bSessionDO\b[^}]*\}\s*from/.test(source))
30
+ return { status: "skipped", file };
31
+ const specifier = agentsSpecifier(entryPath, agentsPath, source);
32
+ const line = `export { ${EXPORTED_CLASSES.join(", ")} } from "${specifier}";`;
33
+ const separator = source.endsWith("\n") ? "" : "\n";
34
+ return files.write(entryPath, `${source}${separator}${line}\n`);
35
+ }
36
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/steps/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,gBAAgB;CACR,CAAC;AAEX,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,UAAkB,EAClB,WAAmB;IAEnB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,oCAAoC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3E,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AACjD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAChC,KAAY,EACZ,SAAiB,EACjB,UAAkB;IAElB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS;QACtB,MAAM,IAAI,QAAQ,CAChB,sBAAsB,SAAS,yDAAyD,CACzF,CAAC;IACJ,MAAM,IAAI,GAAG,SAAS;SACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SAC5B,KAAK,CAAC,IAAI,CAAC;SACX,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,IAAI,6CAA6C,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,YAAY,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Files } from "../fs.js";
2
+ import type { StepResult } from "../plan.js";
3
+ export declare const IGNORED: readonly [".cf-open-agents-api/", ".dev.vars"];
4
+ /** Appends the snapshot directory and the local secrets file once. */
5
+ export declare function ensureGitignore(files: Files): StepResult;
@@ -0,0 +1,20 @@
1
+ import { join } from "node:path";
2
+ import { VENDOR_DIRECTORY } from "../versions.js";
3
+ export const IGNORED = [`${VENDOR_DIRECTORY}/`, ".dev.vars"];
4
+ /** Appends the snapshot directory and the local secrets file once. */
5
+ export function ensureGitignore(files) {
6
+ const path = join(files.root, ".gitignore");
7
+ const existing = files.read(path) ?? "";
8
+ const lines = existing.split(/\r?\n/);
9
+ const present = new Set(lines.map((line) => line.trim()));
10
+ const missing = IGNORED.filter((entry) => !present.has(entry) && !present.has(entry.replace(/\/$/, "")));
11
+ if (missing.length === 0)
12
+ return { status: "skipped", file: ".gitignore" };
13
+ while (lines.length > 0 && lines.at(-1) === "")
14
+ lines.pop();
15
+ if (lines.length > 0)
16
+ lines.push("");
17
+ lines.push("# CF-Open-Agents-API image snapshot and local secrets", ...missing);
18
+ return files.write(path, `${lines.join("\n")}\n`);
19
+ }
20
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/steps/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,gBAAgB,GAAG,EAAE,WAAW,CAAU,CAAC;AAEtE,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CACzE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC3E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,uDAAuD,EAAE,GAAG,OAAO,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Files } from "../fs.js";
2
+ import { type StepResult } from "../plan.js";
3
+ export interface PackageJsonOptions {
4
+ files: Files;
5
+ dependencies: Record<string, string>;
6
+ devDependencies: Record<string, string>;
7
+ scripts: Record<string, string>;
8
+ force: boolean;
9
+ }
10
+ /** Adds pinned dependencies and the vendor hook; other versions are kept unless `--force`. */
11
+ export declare function ensurePackageJson(options: PackageJsonOptions): StepResult;
12
+ export declare const vendorScript = "create-cf-open-agents-api vendor";
@@ -0,0 +1,45 @@
1
+ import { join } from "node:path";
2
+ import { openJsonc, parseJsonc, setValue } from "../jsonc.js";
3
+ import { CliError } from "../plan.js";
4
+ import { CLI_NAME } from "../versions.js";
5
+ const VENDOR_SCRIPT = `${CLI_NAME} vendor`;
6
+ /** Adds pinned dependencies and the vendor hook; other versions are kept unless `--force`. */
7
+ export function ensurePackageJson(options) {
8
+ const path = join(options.files.root, "package.json");
9
+ const text = options.files.read(path);
10
+ if (text === undefined)
11
+ throw new CliError("package.json is missing; run this in a Node project.");
12
+ let document = openJsonc(text);
13
+ const notes = [];
14
+ const kept = [];
15
+ const upsert = (field, wanted) => {
16
+ for (const [name, version] of Object.entries(wanted)) {
17
+ const current = parseJsonc(document.text, "package.json")[field]?.[name];
18
+ if (current === version)
19
+ continue;
20
+ if (current !== undefined && !options.force) {
21
+ kept.push(`${name}@${current} (wanted ${version})`);
22
+ continue;
23
+ }
24
+ document = setValue(document, [field, name], version);
25
+ }
26
+ };
27
+ upsert("dependencies", options.dependencies);
28
+ upsert("devDependencies", options.devDependencies);
29
+ for (const [name, command] of Object.entries(options.scripts)) {
30
+ const current = parseJsonc(document.text, "package.json").scripts?.[name];
31
+ if (current === command || current?.includes(command))
32
+ continue;
33
+ const next = name === "postinstall" && current ? `${current} && ${command}` : command;
34
+ if (current && next === command && !options.force) {
35
+ kept.push(`scripts.${name} (wanted ${command})`);
36
+ continue;
37
+ }
38
+ document = setValue(document, ["scripts", name], next);
39
+ }
40
+ if (kept.length > 0)
41
+ notes.push(`package.json kept existing entries: ${kept.join(", ")}; --force overwrites them.`);
42
+ return options.files.write(path, document.text, notes.length > 0 ? notes.join(" ") : undefined);
43
+ }
44
+ export const vendorScript = VENDOR_SCRIPT;
45
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/steps/package-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Files } from "../fs.js";
2
+ import type { StepResult } from "../plan.js";
3
+ import { type SkeletonInput } from "../templates/standalone.js";
4
+ export interface StandaloneOptions extends SkeletonInput {
5
+ files: Files;
6
+ }
7
+ /** The files a new Workers project needs before the shared upserts run; existing files are kept. */
8
+ export declare function ensureStandaloneSkeleton(options: StandaloneOptions): StepResult[];
@@ -0,0 +1,18 @@
1
+ import { join } from "node:path";
2
+ import { gitignoreSkeleton, packageSkeleton, tsconfigSkeleton, wranglerSkeleton, } from "../templates/standalone.js";
3
+ /** The files a new Workers project needs before the shared upserts run; existing files are kept. */
4
+ export function ensureStandaloneSkeleton(options) {
5
+ const write = (file, content) => {
6
+ const path = join(options.files.root, file);
7
+ if (options.files.exists(path))
8
+ return { status: "skipped", file };
9
+ return options.files.write(path, content);
10
+ };
11
+ return [
12
+ write("package.json", packageSkeleton(options)),
13
+ write("tsconfig.json", tsconfigSkeleton()),
14
+ write("wrangler.jsonc", wranglerSkeleton(options)),
15
+ write(".gitignore", gitignoreSkeleton()),
16
+ ];
17
+ }
18
+ //# sourceMappingURL=standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/steps/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EACL,iBAAiB,EACjB,eAAe,EAEf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAMpC,oGAAoG;AACpG,MAAM,UAAU,wBAAwB,CAAC,OAA0B;IACjE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAe,EAAc,EAAE;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,KAAK,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC;QAC1C,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,KAAK,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;KACzC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Files } from "../fs.js";
2
+ import type { StepResult } from "../plan.js";
3
+ /** Keeps the snapshot out of a tsconfig that would otherwise scan it. */
4
+ export declare function ensureTsconfigExclude(files: Files): StepResult;
@@ -0,0 +1,18 @@
1
+ import { join } from "node:path";
2
+ import { appendItem, collapsePrimitiveArrays, openJsonc, parseJsonc } from "../jsonc.js";
3
+ import { VENDOR_DIRECTORY } from "../versions.js";
4
+ /** Keeps the snapshot out of a tsconfig that would otherwise scan it. */
5
+ export function ensureTsconfigExclude(files) {
6
+ const path = join(files.root, "tsconfig.json");
7
+ const text = files.read(path);
8
+ if (text === undefined)
9
+ return { status: "skipped", file: "tsconfig.json" };
10
+ const config = parseJsonc(text, "tsconfig.json");
11
+ const broad = !config.include || config.include.some((pattern) => pattern.includes("**"));
12
+ const excluded = (config.exclude ?? []).some((pattern) => pattern.replace(/^\.\//, "").startsWith(VENDOR_DIRECTORY));
13
+ if (!broad || excluded)
14
+ return { status: "skipped", file: "tsconfig.json" };
15
+ const document = collapsePrimitiveArrays(appendItem(openJsonc(text), ["exclude"], VENDOR_DIRECTORY));
16
+ return files.write(path, document.text, `tsconfig.json now excludes ${VENDOR_DIRECTORY}; add it to your linter's ignore list too.`);
17
+ }
18
+ //# sourceMappingURL=tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../../src/steps/tsconfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOlD,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CAAC,KAAY;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,UAAU,CAAW,IAAI,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACvD,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAC1D,CAAC;IACF,IAAI,CAAC,KAAK,IAAI,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,uBAAuB,CACtC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAC3D,CAAC;IACF,OAAO,KAAK,CAAC,KAAK,CAChB,IAAI,EACJ,QAAQ,CAAC,IAAI,EACb,8BAA8B,gBAAgB,4CAA4C,CAC3F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type Runner } from "../exec.js";
2
+ import { type StepResult } from "../plan.js";
3
+ export interface VendorOptions {
4
+ root: string;
5
+ /** The CLI version; the snapshot tag is `v<version>` unless `ref` says otherwise. */
6
+ version: string;
7
+ ref?: string;
8
+ /** A local checkout to copy from instead of downloading the tag archive. */
9
+ source?: string;
10
+ force: boolean;
11
+ dryRun: boolean;
12
+ fetch?: typeof globalThis.fetch;
13
+ runner?: Runner;
14
+ env?: NodeJS.ProcessEnv;
15
+ }
16
+ export interface VendorManifest {
17
+ name: string;
18
+ version: string;
19
+ ref: string;
20
+ source: string;
21
+ createdAt: string;
22
+ }
23
+ export declare const SKIP_VENDOR_VARIABLE = "CF_OPEN_AGENTS_API_SKIP_VENDOR";
24
+ export declare const SOURCE_VARIABLE = "CF_OPEN_AGENTS_API_SOURCE";
25
+ export declare function vendorDirectory(root: string): string;
26
+ export declare function readVendorManifest(root: string): VendorManifest | undefined;
27
+ /** Ensures `.cf-open-agents-api/` holds the snapshot the Dockerfiles build from. */
28
+ export declare function ensureVendor(options: VendorOptions): Promise<StepResult>;
29
+ /** The package directories a snapshot holds, for `doctor`. */
30
+ export declare function snapshotPackages(root: string): string[];