@opencomputer/cli 0.6.5 → 0.6.7

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 (53) hide show
  1. package/README.md +21 -17
  2. package/dist/api.d.ts +96 -2
  3. package/dist/api.js +60 -7
  4. package/dist/api.js.map +1 -1
  5. package/dist/api.test.d.ts +1 -0
  6. package/dist/api.test.js +21 -0
  7. package/dist/api.test.js.map +1 -0
  8. package/dist/binding.d.ts +0 -2
  9. package/dist/binding.js +7 -31
  10. package/dist/binding.js.map +1 -1
  11. package/dist/binding.test.js +24 -3
  12. package/dist/binding.test.js.map +1 -1
  13. package/dist/commands.d.ts +1 -0
  14. package/dist/commands.js +387 -42
  15. package/dist/commands.js.map +1 -1
  16. package/dist/dev.d.ts +0 -8
  17. package/dist/dev.js +1 -159
  18. package/dist/dev.js.map +1 -1
  19. package/dist/dev.test.js +2 -90
  20. package/dist/dev.test.js.map +1 -1
  21. package/dist/doctor.d.ts +19 -0
  22. package/dist/doctor.js +207 -0
  23. package/dist/doctor.js.map +1 -0
  24. package/dist/doctor.test.d.ts +1 -0
  25. package/dist/doctor.test.js +71 -0
  26. package/dist/doctor.test.js.map +1 -0
  27. package/dist/errors.d.ts +13 -0
  28. package/dist/errors.js +74 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/errors.test.d.ts +1 -0
  31. package/dist/errors.test.js +14 -0
  32. package/dist/errors.test.js.map +1 -0
  33. package/dist/index.js +21 -4
  34. package/dist/index.js.map +1 -1
  35. package/dist/project-local.d.ts +7 -0
  36. package/dist/project-local.js +106 -0
  37. package/dist/project-local.js.map +1 -0
  38. package/dist/project-local.test.d.ts +1 -0
  39. package/dist/project-local.test.js +30 -0
  40. package/dist/project-local.test.js.map +1 -0
  41. package/dist/project.js +10 -10
  42. package/dist/project.test.js +1 -1
  43. package/dist/project.test.js.map +1 -1
  44. package/dist/template-local.d.ts +6 -0
  45. package/dist/template-local.js +57 -0
  46. package/dist/template-local.js.map +1 -0
  47. package/dist/template.d.ts +72 -0
  48. package/dist/template.js +326 -0
  49. package/dist/template.js.map +1 -0
  50. package/dist/template.test.d.ts +1 -0
  51. package/dist/template.test.js +109 -0
  52. package/dist/template.test.js.map +1 -0
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dev.test.js","sourceRoot":"","sources":["../src/dev.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.test.js","sourceRoot":"","sources":["../src/dev.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface DoctorDiagnostic {
2
+ code: string;
3
+ severity: "error" | "warning";
4
+ file: string;
5
+ line?: number;
6
+ message: string;
7
+ hint: string;
8
+ }
9
+ export interface DoctorResult {
10
+ ok: boolean;
11
+ durationMs: number;
12
+ diagnostics: DoctorDiagnostic[];
13
+ summary: {
14
+ errors: number;
15
+ warnings: number;
16
+ files: number;
17
+ };
18
+ }
19
+ export declare function doctorProject(projectRoot: string): Promise<DoctorResult>;
package/dist/doctor.js ADDED
@@ -0,0 +1,207 @@
1
+ import { access, readFile, readdir } from "node:fs/promises";
2
+ import { relative, resolve } from "node:path";
3
+ import ts from "typescript";
4
+ import { readProjectAgents, readProjectResources } from "./project.js";
5
+ async function exists(path) {
6
+ try {
7
+ await access(path);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function sourceFiles(directory) {
15
+ if (!(await exists(directory)))
16
+ return [];
17
+ const files = [];
18
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
19
+ const path = resolve(directory, entry.name);
20
+ if (entry.isDirectory())
21
+ files.push(...(await sourceFiles(path)));
22
+ else if (entry.isFile() && /\.[cm]?[jt]sx?$/.test(entry.name))
23
+ files.push(path);
24
+ }
25
+ return files.sort();
26
+ }
27
+ function envNames(source) {
28
+ return new Set(source
29
+ .split(/\r?\n/)
30
+ .map((line) => line.match(/^\s*([A-Z][A-Z0-9_]*)\s*=/)?.[1])
31
+ .filter((name) => Boolean(name)));
32
+ }
33
+ function isLiteralHttpsOrigin(expression) {
34
+ if (!ts.isStringLiteralLike(expression))
35
+ return false;
36
+ try {
37
+ const value = expression.text;
38
+ const url = new URL(value);
39
+ return url.protocol === "https:" && url.origin === value;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ function property(object, name) {
46
+ return object.properties.find((item) => ts.isPropertyAssignment(item) &&
47
+ ((ts.isIdentifier(item.name) && item.name.text === name) ||
48
+ (ts.isStringLiteralLike(item.name) && item.name.text === name)));
49
+ }
50
+ function callName(node) {
51
+ return ts.isIdentifier(node.expression) ? node.expression.text : undefined;
52
+ }
53
+ export async function doctorProject(projectRoot) {
54
+ const started = performance.now();
55
+ const diagnostics = [];
56
+ const files = await sourceFiles(resolve(projectRoot, "opencomputer"));
57
+ const requiredSecrets = new Set();
58
+ const toolNames = new Map();
59
+ for (const path of files) {
60
+ const source = await readFile(path, "utf8");
61
+ const file = relative(projectRoot, path).split("\\").join("/");
62
+ const syntax = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, path.endsWith("x") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
63
+ const toolCalls = [];
64
+ const visit = (node) => {
65
+ if (ts.isCallExpression(node)) {
66
+ const name = callName(node);
67
+ if (name === "useSecret" &&
68
+ node.arguments[0] &&
69
+ ts.isStringLiteralLike(node.arguments[0])) {
70
+ requiredSecrets.add(node.arguments[0].text);
71
+ }
72
+ if (name === "defineConnection") {
73
+ const definition = node.arguments[0];
74
+ const origin = definition && ts.isObjectLiteralExpression(definition)
75
+ ? property(definition, "origin")
76
+ : undefined;
77
+ const redirects = definition && ts.isObjectLiteralExpression(definition)
78
+ ? property(definition, "redirectOrigins")
79
+ : undefined;
80
+ const redirectsValid = !redirects ||
81
+ (ts.isArrayLiteralExpression(redirects.initializer) &&
82
+ redirects.initializer.elements.every((item) => {
83
+ if (!ts.isObjectLiteralExpression(item))
84
+ return false;
85
+ const redirectOrigin = property(item, "origin");
86
+ return Boolean(redirectOrigin &&
87
+ isLiteralHttpsOrigin(redirectOrigin.initializer));
88
+ }));
89
+ if (!origin ||
90
+ !isLiteralHttpsOrigin(origin.initializer) ||
91
+ !redirectsValid) {
92
+ const line = syntax.getLineAndCharacterOfPosition(node.getStart(syntax)).line +
93
+ 1;
94
+ diagnostics.push({
95
+ code: "connection_origin_not_literal",
96
+ severity: "error",
97
+ file,
98
+ line,
99
+ message: "Connection and redirect origins must be literal HTTPS origins without a path.",
100
+ hint: 'Use `origin: "https://api.example.com"`.',
101
+ });
102
+ }
103
+ }
104
+ if (name === "defineTool") {
105
+ const definition = node.arguments[0];
106
+ const toolName = definition && ts.isObjectLiteralExpression(definition)
107
+ ? property(definition, "name")
108
+ : undefined;
109
+ toolCalls.push({
110
+ ...(toolName && ts.isStringLiteralLike(toolName.initializer)
111
+ ? { name: toolName.initializer.text }
112
+ : {}),
113
+ line: syntax.getLineAndCharacterOfPosition(node.getStart(syntax)).line +
114
+ 1,
115
+ });
116
+ }
117
+ }
118
+ ts.forEachChild(node, visit);
119
+ };
120
+ visit(syntax);
121
+ if (toolCalls.length && !/\/agents\/[^/]+\/tools\//.test(`/${file}`)) {
122
+ diagnostics.push({
123
+ code: "tool_location_invalid",
124
+ severity: "error",
125
+ file,
126
+ line: toolCalls[0].line,
127
+ message: "Tools must be defined in an agent's tools/ directory.",
128
+ hint: "Move the tool into opencomputer/agents/<agent>/tools/<name>.ts.",
129
+ });
130
+ }
131
+ for (const tool of toolCalls) {
132
+ if (tool.name) {
133
+ const occurrences = toolNames.get(tool.name) ?? [];
134
+ occurrences.push({ file, line: tool.line });
135
+ toolNames.set(tool.name, occurrences);
136
+ }
137
+ }
138
+ if (toolCalls.some((tool) => !tool.name)) {
139
+ diagnostics.push({
140
+ code: "tool_name_not_literal",
141
+ severity: "error",
142
+ file,
143
+ message: "Every tool must declare one literal name.",
144
+ hint: 'Use `defineTool({ name: "stable-tool-id", ... })`.',
145
+ });
146
+ }
147
+ }
148
+ for (const [name, occurrences] of [...toolNames].sort(([a], [b]) => a.localeCompare(b))) {
149
+ if (occurrences.length < 2)
150
+ continue;
151
+ diagnostics.push({
152
+ code: "tool_name_duplicate",
153
+ severity: "error",
154
+ file: occurrences[1].file,
155
+ line: occurrences[1].line,
156
+ message: `Tool name ${name} is declared more than once.`,
157
+ hint: "Give every tool in the project a unique literal name.",
158
+ });
159
+ }
160
+ try {
161
+ await readProjectAgents(projectRoot);
162
+ await readProjectResources(projectRoot);
163
+ }
164
+ catch (error) {
165
+ diagnostics.push({
166
+ code: "project_contract_invalid",
167
+ severity: "error",
168
+ file: "opencomputer/",
169
+ message: error instanceof Error ? error.message : String(error),
170
+ hint: "Fix the referenced project, channel, scope, event, or resource declaration.",
171
+ });
172
+ }
173
+ const examplePath = resolve(projectRoot, "opencomputer", ".env.example");
174
+ const localPath = resolve(projectRoot, "opencomputer", ".env.local");
175
+ const declared = envNames((await exists(examplePath)) ? await readFile(examplePath, "utf8") : "");
176
+ const local = envNames((await exists(localPath)) ? await readFile(localPath, "utf8") : "");
177
+ for (const name of [...requiredSecrets].sort()) {
178
+ if (!declared.has(name)) {
179
+ diagnostics.push({
180
+ code: "secret_not_declared",
181
+ severity: "error",
182
+ file: "opencomputer/.env.example",
183
+ message: `${name} is referenced by source but not declared.`,
184
+ hint: `Add ${name}= without a value to opencomputer/.env.example.`,
185
+ });
186
+ }
187
+ if (!local.has(name)) {
188
+ diagnostics.push({
189
+ code: "development_secret_missing",
190
+ severity: "warning",
191
+ file: "opencomputer/.env.local",
192
+ message: `${name} has no local Development value.`,
193
+ hint: `Add ${name} to the ignored .env.local file for local development; ` +
194
+ `upload it separately with \`opencomputer secrets set ${name} --value-stdin\`.`,
195
+ });
196
+ }
197
+ }
198
+ const errors = diagnostics.filter((item) => item.severity === "error").length;
199
+ const warnings = diagnostics.length - errors;
200
+ return {
201
+ ok: errors === 0,
202
+ durationMs: Math.round((performance.now() - started) * 100) / 100,
203
+ diagnostics,
204
+ summary: { errors, warnings, files: files.length },
205
+ };
206
+ }
207
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { resolve } from "node:path";
5
+ import test from "node:test";
6
+ import { doctorProject } from "./doctor.js";
7
+ import { initializeAgentProject } from "./project.js";
8
+ test("doctor reports deterministic local authoring errors in under one second", async () => {
9
+ const root = await mkdtemp(resolve(tmpdir(), "opencomputer-doctor-"));
10
+ try {
11
+ const initialized = await initializeAgentProject(root);
12
+ await mkdir(resolve(initialized.agentRoot, "connections"), { recursive: true });
13
+ await writeFile(resolve(initialized.agentRoot, "connections", "github.ts"), `import { defineConnection, defineTool, useSecret } from "@opencomputer/agent";
14
+ const origin = "https://api.github.com";
15
+ export const github = defineConnection({
16
+ id: "github",
17
+ origin,
18
+ headers: { Authorization: useSecret("GITHUB_TOKEN") },
19
+ });
20
+ export const misplaced = defineTool({ name: "misplaced", execute: async () => ({ ok: true }) });
21
+ `);
22
+ const result = await doctorProject(root);
23
+ assert.equal(result.ok, false);
24
+ assert.ok(result.durationMs < 1_000, `doctor took ${result.durationMs}ms`);
25
+ assert.deepEqual(result.diagnostics.map((diagnostic) => diagnostic.code).sort(), [
26
+ "connection_origin_not_literal",
27
+ "development_secret_missing",
28
+ "secret_not_declared",
29
+ "tool_location_invalid",
30
+ ]);
31
+ assert.ok(result.diagnostics.every((diagnostic) => diagnostic.hint));
32
+ }
33
+ finally {
34
+ await rm(root, { recursive: true, force: true });
35
+ }
36
+ });
37
+ test("doctor accepts the initialized project without contacting the API", async (context) => {
38
+ const root = await mkdtemp(resolve(tmpdir(), "opencomputer-doctor-"));
39
+ try {
40
+ const fetchMock = context.mock.method(globalThis, "fetch", async () => {
41
+ throw new Error("doctor must not use the network");
42
+ });
43
+ await initializeAgentProject(root);
44
+ const result = await doctorProject(root);
45
+ assert.equal(result.ok, true);
46
+ assert.equal(result.summary.errors, 0);
47
+ assert.equal(fetchMock.mock.callCount(), 0);
48
+ }
49
+ finally {
50
+ await rm(root, { recursive: true, force: true });
51
+ }
52
+ });
53
+ test("doctor parses single-line declarations and ignores comments", async () => {
54
+ const root = await mkdtemp(resolve(tmpdir(), "opencomputer-doctor-"));
55
+ try {
56
+ const initialized = await initializeAgentProject(root);
57
+ await mkdir(resolve(initialized.agentRoot, "connections"), {
58
+ recursive: true,
59
+ });
60
+ await writeFile(resolve(initialized.agentRoot, "connections", "inline.ts"), `import { defineConnection } from "@opencomputer/agent";
61
+ // defineTool({ name: "comment-only" })
62
+ export default defineConnection({ id: "inline", origin: "https://api.example.com/path" });
63
+ `);
64
+ const result = await doctorProject(root);
65
+ assert.deepEqual(result.diagnostics.map((diagnostic) => diagnostic.code), ["connection_origin_not_literal"]);
66
+ }
67
+ finally {
68
+ await rm(root, { recursive: true, force: true });
69
+ }
70
+ });
71
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../src/doctor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface StructuredCLIError {
2
+ code: string;
3
+ message: string;
4
+ hint: string;
5
+ details?: unknown;
6
+ }
7
+ export declare class CLIError extends Error {
8
+ readonly code: string;
9
+ readonly hint: string;
10
+ readonly details?: unknown | undefined;
11
+ constructor(code: string, message: string, hint: string, details?: unknown | undefined);
12
+ }
13
+ export declare function structuredError(error: unknown): StructuredCLIError;
package/dist/errors.js ADDED
@@ -0,0 +1,74 @@
1
+ import { APIError } from "./api.js";
2
+ export class CLIError extends Error {
3
+ code;
4
+ hint;
5
+ details;
6
+ constructor(code, message, hint, details) {
7
+ super(message);
8
+ this.code = code;
9
+ this.hint = hint;
10
+ this.details = details;
11
+ }
12
+ }
13
+ export function structuredError(error) {
14
+ if (error instanceof CLIError) {
15
+ return {
16
+ code: error.code,
17
+ message: error.message,
18
+ hint: error.hint,
19
+ ...(error.details === undefined ? {} : { details: error.details }),
20
+ };
21
+ }
22
+ const message = error instanceof Error ? error.message : String(error);
23
+ if (error instanceof APIError) {
24
+ const code = error.status === 401 || error.status === 403
25
+ ? "authentication_required"
26
+ : error.status === 404
27
+ ? "resource_not_found"
28
+ : error.status === 409
29
+ ? "conflict"
30
+ : "api_request_failed";
31
+ const hint = code === "authentication_required"
32
+ ? "Run `opencomputer login` or set OPENCOMPUTER_API_KEY."
33
+ : code === "resource_not_found"
34
+ ? "Check the bound project and resource identifier, then retry."
35
+ : code === "conflict"
36
+ ? "Read the existing resource and retry with the same idempotency key."
37
+ : "Retry the command; if it persists, inspect `opencomputer logs --json`.";
38
+ return { code, message, hint, details: { status: error.status } };
39
+ }
40
+ if (/not logged in/i.test(message)) {
41
+ return {
42
+ code: "authentication_required",
43
+ message,
44
+ hint: "Run `opencomputer login` or set OPENCOMPUTER_API_KEY.",
45
+ };
46
+ }
47
+ if (/not connected to a cloud project|opencomputer link/i.test(message)) {
48
+ return {
49
+ code: "binding_required",
50
+ message,
51
+ hint: "Run `opencomputer link --project <id|slug>` or `opencomputer link --create-project <name>`.",
52
+ };
53
+ }
54
+ if (/not inside an OpenComputer app|No OpenComputer project found/i.test(message)) {
55
+ return {
56
+ code: "project_not_found",
57
+ message,
58
+ hint: "Run the command inside a project, or create one with `opencomputer init <directory>`.",
59
+ };
60
+ }
61
+ if (/unexpected argument|unknown command|requires a value|usage:|must be|choose either/i.test(message)) {
62
+ return {
63
+ code: "invalid_arguments",
64
+ message,
65
+ hint: "Run `opencomputer --help` and pass explicit non-interactive arguments.",
66
+ };
67
+ }
68
+ return {
69
+ code: "command_failed",
70
+ message,
71
+ hint: "Check the command inputs and local project state, then retry.",
72
+ };
73
+ }
74
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AASpC,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IAEA;IACA;IAJX,YACW,IAAY,EACrB,OAAe,EACN,IAAY,EACZ,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QALN,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAU;IAG5B,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAC1C,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG;oBACpB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,oBAAoB,CAAC;QAC/B,MAAM,IAAI,GACR,IAAI,KAAK,yBAAyB;YAChC,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,IAAI,KAAK,oBAAoB;gBAC7B,CAAC,CAAC,8DAA8D;gBAChE,CAAC,CAAC,IAAI,KAAK,UAAU;oBACnB,CAAC,CAAC,qEAAqE;oBACvE,CAAC,CAAC,wEAAwE,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,yBAAyB;YAC/B,OAAO;YACP,IAAI,EAAE,uDAAuD;SAC9D,CAAC;IACJ,CAAC;IACD,IAAI,qDAAqD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,OAAO;YACP,IAAI,EACF,6FAA6F;SAChG,CAAC;IACJ,CAAC;IACD,IAAI,+DAA+D,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,OAAO;YACP,IAAI,EAAE,uFAAuF;SAC9F,CAAC;IACJ,CAAC;IACD,IAAI,oFAAoF,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvG,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,OAAO;YACP,IAAI,EAAE,wEAAwE;SAC/E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO;QACP,IAAI,EAAE,+DAA+D;KACtE,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { APIError } from "./api.js";
4
+ import { CLIError, structuredError } from "./errors.js";
5
+ test("structured CLI errors always include a stable code and fix hint", () => {
6
+ assert.deepEqual(structuredError(new CLIError("doctor_failed", "Invalid project.", "Run doctor.")), { code: "doctor_failed", message: "Invalid project.", hint: "Run doctor." });
7
+ assert.deepEqual(structuredError(new APIError("Missing", 404)), {
8
+ code: "resource_not_found",
9
+ message: "Missing",
10
+ hint: "Check the bound project and resource identifier, then retry.",
11
+ details: { status: 404 },
12
+ });
13
+ });
14
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../src/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExD,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,CAAC,SAAS,CACd,eAAe,CAAC,IAAI,QAAQ,CAAC,eAAe,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC,EACjF,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,CAC5E,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE;QAC9D,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,8DAA8D;QACpE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;KACzB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFileSync } from "node:fs";
3
3
  import { runCommand } from "./commands.js";
4
+ import { structuredError } from "./errors.js";
4
5
  const VERSION = String(JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version);
5
6
  const BANNER = String.raw ` ____ ______ __
6
7
  / __ \____ ___ ____ / ____/___ ____ ___ ____ __ / /____ _____
@@ -37,7 +38,13 @@ Usage:
37
38
  opencomputer whoami
38
39
  opencomputer agents
39
40
  opencomputer init <directory|.>
40
- opencomputer link
41
+ opencomputer template validate [directory] [--repository-url <url>] [--app-url <url>]
42
+ opencomputer template build [directory] [--output <path>]
43
+ opencomputer template deploy <repository-url> [--project-name <name>] [--directory <path>]
44
+ opencomputer template clone <repository-url> --commit <sha> --project <id> [--directory <path>]
45
+ opencomputer project clone <project-id> [--directory <path>]
46
+ opencomputer link (--project <id|slug> | --create-project <name>)
47
+ opencomputer doctor
41
48
  opencomputer deploy --watch [--project <id|slug> | --create-project <name>]
42
49
  opencomputer dev [--project <id|slug> | --create-project <name>] (legacy alias)
43
50
  opencomputer session [prompt] [--agent <project-agent>] [--keep]
@@ -47,10 +54,10 @@ Usage:
47
54
  opencomputer session attach <session-id>
48
55
  opencomputer session send <session-id> <prompt> [--keep]
49
56
  opencomputer session end <session-id>
50
- opencomputer secrets set <name> [--environment development|production] [--agent <agent>|current]
57
+ opencomputer secrets set <name> --value-stdin [--environment development|production] [--agent <agent>|current]
51
58
  opencomputer secrets list [--environment development|production] [--agent <agent>|current]
52
59
  opencomputer secrets remove <name> [--environment development|production] [--agent <agent>|current]
53
- opencomputer env set <name> [--environment development|production] [--agent <agent>|current]
60
+ opencomputer env set <name> --value-stdin [--environment development|production] [--agent <agent>|current]
54
61
  opencomputer env list [--environment development|production] [--agent <agent>|current]
55
62
  opencomputer env remove <name> [--environment development|production] [--agent <agent>|current]
56
63
  opencomputer model-access connect codex [--project <id|slug>]
@@ -63,6 +70,8 @@ Usage:
63
70
  opencomputer webhooks rotate-token <webhook-id> [--project <id|slug>]
64
71
  opencomputer webhooks remove <webhook-id> [--project <id|slug>]
65
72
  opencomputer logs [--agent <agent>] [--session <session-id>] [--environment development|production] [--follow]
73
+ opencomputer channels status [--agent <agent>] [--environment development|production]
74
+ opencomputer sessions tail <session-id> [--after <cursor>] [--no-follow]
66
75
  opencomputer deploy [--alias development|production] [--watch]
67
76
  opencomputer run <agent> <prompt> [--keep]
68
77
 
@@ -70,6 +79,7 @@ Global options:
70
79
  --api-url <url> OpenComputer API (default: https://app.opencomputer.dev)
71
80
  --api-key <key> API key (or OPENCOMPUTER_API_KEY)
72
81
  --json Print machine-readable output
82
+ --idempotency-key <key> Stable retry key for mutating commands
73
83
  --verbose Print session events
74
84
  --help Show this help
75
85
  --version Show the CLI version
@@ -90,6 +100,7 @@ async function main() {
90
100
  apiKey: takeOption(args, "--api-key"),
91
101
  json: takeFlag(args, "--json"),
92
102
  verbose: takeFlag(args, "--verbose"),
103
+ idempotencyKey: takeOption(args, "--idempotency-key"),
93
104
  };
94
105
  const command = args.shift();
95
106
  if (!command) {
@@ -99,7 +110,13 @@ async function main() {
99
110
  await runCommand(command, args, globals);
100
111
  }
101
112
  main().catch((error) => {
102
- process.stderr.write(`opencomputer: ${error instanceof Error ? error.message : String(error)}\n`);
113
+ const failure = structuredError(error);
114
+ if (process.argv.includes("--json")) {
115
+ process.stderr.write(`${JSON.stringify({ error: failure })}\n`);
116
+ }
117
+ else {
118
+ process.stderr.write(`opencomputer: ${failure.message}\nfix: ${failure.hint}\n`);
119
+ }
103
120
  process.exitCode = 1;
104
121
  });
105
122
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function materializeProjectArchive(input: {
2
+ response: Response;
3
+ directory: string;
4
+ }): Promise<{
5
+ directory: string;
6
+ bytes: number;
7
+ }>;