@vwork/cli 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/codegen.js CHANGED
@@ -36,16 +36,32 @@ export async function runCodegenCommand(command, client, config) {
36
36
  const bindingNames = arrayFlag(command.flags.binding);
37
37
  const sourceCode = stringFlag(command.flags["source-code"]);
38
38
  const draftInvoke = draftInvokeInput(command);
39
- return {
40
- value: await client.request("POST", `${appPath}/functions/${encodeURIComponent(functionName)}/codegen`, {
41
- prompt,
42
- auth_required: command.flags["no-auth"] === true ? false : true,
43
- ...(bindingNames.length > 0 ? { binding_names: bindingNames } : {}),
44
- ...(sourceCode ? { source_code: sourceCode } : {}),
45
- ...(command.flags.repair === true ? { repair: { enabled: true, max_attempts: 2 } } : {}),
46
- ...(draftInvoke ? { draft_invoke: draftInvoke } : {})
47
- })
39
+ const session = await client.request("POST", `${appPath}/codegen-sessions`, {
40
+ target: `workerd_function:${functionName}`,
41
+ title: `${functionName} codegen`,
42
+ description: prompt
43
+ });
44
+ const requestBody = {
45
+ session_id: String(session.id),
46
+ prompt,
47
+ auth_required: command.flags["no-auth"] === true ? false : true,
48
+ ...(bindingNames.length > 0 ? { binding_names: bindingNames } : {}),
49
+ ...(sourceCode ? { source_code: sourceCode } : {}),
50
+ ...(command.flags.repair === true ? { repair: { enabled: true, max_attempts: 2 } } : {}),
51
+ ...(draftInvoke ? { draft_invoke: draftInvoke } : {})
48
52
  };
53
+ try {
54
+ return {
55
+ value: await client.request("POST", `${appPath}/functions/${encodeURIComponent(functionName)}/codegen`, requestBody)
56
+ };
57
+ }
58
+ catch (error) {
59
+ if (!isGatewayTimeout(error))
60
+ throw error;
61
+ return {
62
+ value: await waitForCodegenSessionRun(client, appPath, String(session.id))
63
+ };
64
+ }
49
65
  }
50
66
  if (group === "runs" && action === "list") {
51
67
  const body = await client.request("GET", `${appPath}/code-generations`);
@@ -100,7 +116,8 @@ function draftInvokeInput(command) {
100
116
  return {
101
117
  enabled: true,
102
118
  ...(body ? { body } : {}),
103
- ...(bindings ? { bindings } : {})
119
+ ...(bindings ? { bindings } : {}),
120
+ response_contract: "vwork_function_output_v1"
104
121
  };
105
122
  }
106
123
  function optionalJsonObjectFlag(command, key) {
@@ -113,6 +130,24 @@ function optionalJsonObjectFlag(command, key) {
113
130
  }
114
131
  return parsed;
115
132
  }
133
+ async function waitForCodegenSessionRun(client, appPath, sessionId) {
134
+ const deadline = Date.now() + 180_000;
135
+ let lastRuns = [];
136
+ do {
137
+ const body = await client.request("GET", `${appPath}/codegen-sessions/${encodeURIComponent(sessionId)}/runs`);
138
+ lastRuns = body.code_generations;
139
+ if (lastRuns.length > 0)
140
+ return lastRuns[0];
141
+ await sleep(3_000);
142
+ } while (Date.now() < deadline);
143
+ throw new Error(`Timed out waiting for codegen run in session ${sessionId}`);
144
+ }
145
+ function isGatewayTimeout(error) {
146
+ return Boolean(error && typeof error === "object" && "status" in error && error.status === 524);
147
+ }
148
+ function sleep(ms) {
149
+ return new Promise((resolve) => setTimeout(resolve, ms));
150
+ }
116
151
  function mcpConfigSnippet(command, config) {
117
152
  const workspace = stringFlag(command.flags.workspace) ?? process.cwd();
118
153
  const appId = stringFlag(command.flags.app) ?? config.appId;
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import { resolve } from "node:path";
2
4
  import { fileURLToPath } from "node:url";
3
5
  import { runOclifCli } from "./oclif-command.js";
4
6
  export async function runCli(argv, env, cwd) {
@@ -8,10 +10,21 @@ export async function runCli(argv, env, cwd) {
8
10
  export function isDirectCliEntrypoint(moduleUrl, argvPath) {
9
11
  if (!argvPath)
10
12
  return false;
11
- return normalizePath(fileURLToPath(moduleUrl)) === normalizePath(argvPath);
13
+ const argvPaths = new Set(candidatePaths(argvPath));
14
+ return candidatePaths(fileURLToPath(moduleUrl)).some((candidate) => argvPaths.has(candidate));
12
15
  }
13
16
  function normalizePath(value) {
14
- return value.replace(/\\/g, "/");
17
+ return resolve(value).replace(/\\/g, "/").toLowerCase();
18
+ }
19
+ function candidatePaths(value) {
20
+ const paths = new Set([normalizePath(value)]);
21
+ try {
22
+ paths.add(normalizePath(realpathSync.native(value)));
23
+ }
24
+ catch {
25
+ // Keep the direct normalized path when realpath cannot resolve.
26
+ }
27
+ return [...paths];
15
28
  }
16
29
  function withRuntime(env, cwd, run) {
17
30
  const originalEnv = process.env;
@@ -18,7 +18,7 @@ import { renderJson, renderTable } from "./output.js";
18
18
  import { runQueueCommand } from "./queues.js";
19
19
  import { runRuntimeCommand } from "./runtime.js";
20
20
  import { runSecretCommand } from "./secrets.js";
21
- const COMMAND_ROOTS = new Set(["apps", "db", "migrations", "functions", "codegen", "secrets", "kv", "queues", "runtime", "observability", "login", "whoami"]);
21
+ const COMMAND_ROOTS = new Set(["apps", "db", "migrations", "functions", "codegen", "secrets", "kv", "queues", "runtime", "observability", "login", "whoami", "version"]);
22
22
  export class VWorkCliCommand extends Command {
23
23
  static description = "Manage VWork apps, database rows, migrations, and functions.";
24
24
  static strict = false;
@@ -102,6 +102,10 @@ export class VWorkCliCommand extends Command {
102
102
  this.log(helpText());
103
103
  return;
104
104
  }
105
+ if (command.path[0] === "version") {
106
+ this.log(packageVersion());
107
+ return;
108
+ }
105
109
  if (command.path[0] === "login") {
106
110
  const config = resolveCliConfigFromFlags(command.flags, process.env, process.cwd());
107
111
  const root = process.env.VWORK_HOME ?? join(homedir(), ".vwork");
@@ -253,6 +257,12 @@ function helpText() {
253
257
  " observability access-logs",
254
258
  " login authenticate with VWork",
255
259
  " whoami show the authenticated VWork user",
260
+ " version show CLI version",
261
+ "",
262
+ "Version:",
263
+ " vwork --version",
264
+ " vwork -v",
265
+ " vwork version",
256
266
  ""
257
267
  ].join("\n");
258
268
  }
@@ -335,6 +345,9 @@ function resourceHelpText(resource) {
335
345
  ],
336
346
  whoami: [
337
347
  "whoami"
348
+ ],
349
+ version: [
350
+ "version"
338
351
  ]
339
352
  };
340
353
  const resourceCommands = commands[resource];
package/package.json CHANGED
@@ -1,31 +1,31 @@
1
- {
2
- "name": "@vwork/cli",
3
- "version": "0.1.3",
4
- "type": "module",
5
- "files": [
6
- "dist/*.js",
7
- "dist/auth/*.js",
8
- "package.json"
9
- ],
10
- "publishConfig": {
11
- "registry": "https://registry.npmjs.org/"
12
- },
13
- "bin": {
14
- "vwork": "dist/index.js"
15
- },
16
- "dependencies": {
17
- "@oclif/core": "^4.11.7",
1
+ {
2
+ "name": "@vwork/cli",
3
+ "version": "0.1.5",
4
+ "type": "module",
5
+ "files": [
6
+ "dist/*.js",
7
+ "dist/auth/*.js",
8
+ "package.json"
9
+ ],
10
+ "publishConfig": {
11
+ "registry": "https://registry.npmjs.org/"
12
+ },
13
+ "bin": {
14
+ "vwork": "dist/index.js"
15
+ },
16
+ "scripts": {
17
+ "dev": "tsx src/index.ts",
18
+ "build": "tsc -p tsconfig.json",
19
+ "test": "pnpm --filter @vwork/platform-client build && tsx --test src/test/*.test.ts",
20
+ "typecheck": "pnpm --filter @vwork/platform-client build && tsc -p tsconfig.json --noEmit"
21
+ },
22
+ "dependencies": {
23
+ "@oclif/core": "^4.11.7",
18
24
  "@vwork/platform-client": "^0.1.0"
19
- },
20
- "devDependencies": {
21
- "@types/node": "^22.10.2",
22
- "tsx": "^4.19.2",
23
- "typescript": "^5.7.2"
24
- },
25
- "scripts": {
26
- "dev": "tsx src/index.ts",
27
- "build": "tsc -p tsconfig.json",
28
- "test": "pnpm --filter @vwork/platform-client build && tsx --test src/test/*.test.ts",
29
- "typecheck": "pnpm --filter @vwork/platform-client build && tsc -p tsconfig.json --noEmit"
30
- }
31
- }
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.10.2",
28
+ "tsx": "^4.19.2",
29
+ "typescript": "^5.7.2"
30
+ }
31
+ }