@opvs-ai/cli 0.27.7 → 0.27.8

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.
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "stamp_version": 1,
3
3
  "package": "@opvs-ai/cli",
4
- "version": "0.27.7",
5
- "source_digest": "3186e2d15652b09a763ff6c4dae499576dae4b45cada2bf3cdc389d1225c0345",
6
- "source_files": 61,
7
- "built_at": "2026-10-25T17:22:18.539Z",
4
+ "version": "0.27.8",
5
+ "source_digest": "c5736038e34c5632093ba03eea1d055c671bc9dde3fd3c20834b7a87e71eba82",
6
+ "source_files": 62,
7
+ "built_at": "2026-10-26T12:41:58.686Z",
8
8
  "node": "v22.23.3"
9
9
  }
@@ -1,5 +1,6 @@
1
1
  import { createClient } from "@opvs-ai/core";
2
2
  import { printJson } from "../lib/format.js";
3
+ import { resolveTaskId } from "../lib/task-refs.js";
3
4
  function buildPath(ref, action) {
4
5
  return `/api/v1/factory/steer/builds/${encodeURIComponent(ref)}/${action}`;
5
6
  }
@@ -13,6 +14,26 @@ function status(error) {
13
14
  const value = error?.status;
14
15
  return typeof value === "number" ? value : undefined;
15
16
  }
17
+ /**
18
+ * The API's 404 body for a card with no running build (OD-1957).
19
+ *
20
+ * The running build is the RESOURCE the read asks for, so "there is none" is
21
+ * a 404 — but the body still carries the same fields as the 200 (the card's
22
+ * planner messages, the ref, and the REASON), so the CLI renders it as the
23
+ * answer it is rather than as an error.
24
+ */
25
+ function notRunning(error, ref) {
26
+ const body = error?.body;
27
+ return {
28
+ task_id: body?.task_id || ref,
29
+ ref: body?.ref || ref,
30
+ running: false,
31
+ steps: body?.steps || [],
32
+ messages: body?.messages || [],
33
+ reason: body?.reason ||
34
+ `No build is running for ${ref}.`,
35
+ };
36
+ }
16
37
  function lastValue(raw) {
17
38
  if (!/^\d+$/.test(raw)) {
18
39
  throw new Error("--last must be an integer from 1 to 5");
@@ -35,7 +56,9 @@ function age(seconds) {
35
56
  function formatRead(data) {
36
57
  const ref = data.ref || data.task_id;
37
58
  if (!data.running) {
38
- console.log(`No build is running for ${ref}.`);
59
+ // The API names WHY there is no build (OD-1957). Prefer its reason; fall
60
+ // back to the plain sentence so the output never loses the fact itself.
61
+ console.log(data.reason || `No build is running for ${ref}.`);
39
62
  }
40
63
  else {
41
64
  console.log(`Build ${ref}: ${data.state || "running"} on ${data.env_id || "unknown desk"}`);
@@ -83,7 +106,12 @@ export function registerBuildCommands(program) {
83
106
  .action(async (ref, message, opts) => {
84
107
  await run(async () => {
85
108
  const client = createClient(program.opts().workspace);
86
- const response = await client.post(buildPath(ref, "tell"), { message });
109
+ // Resolve the card REF to its task id FIRST, with the same resolver
110
+ // `opvs tasks get` uses (OD-1957). The builds route used to pass the
111
+ // raw string to a UUID-typed parameter and answer 422 for a card that
112
+ // exists.
113
+ const taskId = await resolveTaskId(client, ref);
114
+ const response = await client.post(buildPath(taskId, "tell"), { message });
87
115
  const data = (await response.json());
88
116
  if (opts.format === "json")
89
117
  printJson(data);
@@ -103,8 +131,31 @@ export function registerBuildCommands(program) {
103
131
  }
104
132
  const last = lastValue(opts.last);
105
133
  const client = createClient(program.opts().workspace);
106
- const response = await client.get(`${buildPath(ref, "read")}?last=${last}`);
107
- const data = (await response.json());
134
+ // Resolve the card REF to its task id FIRST, with the same resolver
135
+ // `opvs tasks get` uses (OD-1957).
136
+ const taskId = await resolveTaskId(client, ref);
137
+ // A card with no running build is a 404 (OD-1957): the running build
138
+ // is the RESOURCE, and it does not exist. That is an ANSWER, not a
139
+ // failure — it is printed as "not running" with the API's reason, and
140
+ // the exit code stays 0. Only a card that cannot be found at all, or
141
+ // a real error, is a failure.
142
+ let data;
143
+ try {
144
+ const response = await client.get(`${buildPath(taskId, "read")}?last=${last}`);
145
+ if (response.ok) {
146
+ data = (await response.json());
147
+ }
148
+ else {
149
+ // A client that does not throw on a non-2xx still has to answer
150
+ // the same way a throwing one does.
151
+ data = notRunning({ status: response.status, body: await response.json() }, ref);
152
+ }
153
+ }
154
+ catch (error) {
155
+ if (status(error) !== 404)
156
+ throw error;
157
+ data = notRunning(error, ref);
158
+ }
108
159
  if (opts.format === "json")
109
160
  printJson(data);
110
161
  else
@@ -1 +1 @@
1
- {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/commands/builds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/commands/builds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Client-side card-ref → task-UUID resolution for the builds surface (OD-1957).
3
+ *
4
+ * 🔴 Why this exists, and why it is not optional.
5
+ *
6
+ * `opvs builds read| tell` take a card REF (`OD-1950`). The route they reach
7
+ * used to hand that string straight to AgentBoard's `GET /api/v1/tasks/{task_id}`,
8
+ * whose parameter is typed `uuid.UUID` — so a perfectly good card REF was a
9
+ * **422**, measured against production by /test-live on 2026-10-26.
10
+ *
11
+ * The resolver for a card REF is the GATEWAY's, and the gateway resolves it on
12
+ * `GET /api/v1/board/tasks/{ref}`. That is the very call `opvs tasks get`
13
+ * makes, so asking for the card here borrows exactly the same resolution —
14
+ * no second set of rules to drift out of step with the board.
15
+ *
16
+ * The API resolves refs too (so a direct API caller is not punished), but the
17
+ * CLI resolving first means the builds route is reached with the id the rest
18
+ * of the CLI already uses, and a bad ref fails with the board's own message
19
+ * instead of a 422 about a UUID.
20
+ */
21
+ /** True when the value is already a canonical task id needing no lookup. */
22
+ export declare function isTaskUuid(value: string): boolean;
23
+ interface TaskLookupClient {
24
+ get(url: string): Promise<Response>;
25
+ }
26
+ /**
27
+ * Resolve a card REF (or UUID) to the card's task UUID.
28
+ *
29
+ * A value that is already a UUID is returned untouched — no extra request, and
30
+ * no chance of the lookup disagreeing with the id the caller already had.
31
+ *
32
+ * A ref that cannot be resolved is a hard error here. The alternative is
33
+ * forwarding a value that the far side cannot read, and the far side's
34
+ * answer (a 422 about a UUID) says nothing about which card was meant.
35
+ */
36
+ export declare function resolveTaskId(client: TaskLookupClient, ref: string): Promise<string>;
37
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Client-side card-ref → task-UUID resolution for the builds surface (OD-1957).
3
+ *
4
+ * 🔴 Why this exists, and why it is not optional.
5
+ *
6
+ * `opvs builds read| tell` take a card REF (`OD-1950`). The route they reach
7
+ * used to hand that string straight to AgentBoard's `GET /api/v1/tasks/{task_id}`,
8
+ * whose parameter is typed `uuid.UUID` — so a perfectly good card REF was a
9
+ * **422**, measured against production by /test-live on 2026-10-26.
10
+ *
11
+ * The resolver for a card REF is the GATEWAY's, and the gateway resolves it on
12
+ * `GET /api/v1/board/tasks/{ref}`. That is the very call `opvs tasks get`
13
+ * makes, so asking for the card here borrows exactly the same resolution —
14
+ * no second set of rules to drift out of step with the board.
15
+ *
16
+ * The API resolves refs too (so a direct API caller is not punished), but the
17
+ * CLI resolving first means the builds route is reached with the id the rest
18
+ * of the CLI already uses, and a bad ref fails with the board's own message
19
+ * instead of a 422 about a UUID.
20
+ */
21
+ const UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
22
+ /** True when the value is already a canonical task id needing no lookup. */
23
+ export function isTaskUuid(value) {
24
+ return UUID_RE.test(value);
25
+ }
26
+ /**
27
+ * Resolve a card REF (or UUID) to the card's task UUID.
28
+ *
29
+ * A value that is already a UUID is returned untouched — no extra request, and
30
+ * no chance of the lookup disagreeing with the id the caller already had.
31
+ *
32
+ * A ref that cannot be resolved is a hard error here. The alternative is
33
+ * forwarding a value that the far side cannot read, and the far side's
34
+ * answer (a 422 about a UUID) says nothing about which card was meant.
35
+ */
36
+ export async function resolveTaskId(client, ref) {
37
+ if (isTaskUuid(ref)) {
38
+ return ref.toLowerCase();
39
+ }
40
+ let id;
41
+ let reason;
42
+ try {
43
+ // Ask for JSON explicitly: the caller's configured format may be yaml/md,
44
+ // and this is a lookup whose single field we have to read, not print.
45
+ const res = await client.get(`/api/v1/board/tasks/${encodeURIComponent(ref)}?format=json`);
46
+ if (res.ok) {
47
+ const data = (await res.json());
48
+ id = typeof data?.id === "string" ? data.id : undefined;
49
+ if (!id)
50
+ reason = "the board's answer carried no task id";
51
+ }
52
+ else {
53
+ reason = `the board answered ${res.status}`;
54
+ }
55
+ }
56
+ catch (error) {
57
+ const message = error?.message;
58
+ reason = message || "the board could not be reached";
59
+ }
60
+ if (!id) {
61
+ console.error(`Error: could not resolve card '${ref}'${reason ? ` (${reason})` : ""}.\n` +
62
+ ` Pass a card ref (e.g. OD-1950) or the card's task UUID.`);
63
+ process.exit(1);
64
+ }
65
+ return id;
66
+ }
67
+ //# sourceMappingURL=task-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-refs.js","sourceRoot":"","sources":["../../src/lib/task-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,OAAO,GAAG,+EAA+E,CAAC;AAEhG,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAMD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAwB,EACxB,GAAW;IAEX,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,EAAsB,CAAC;IAC3B,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,uBAAuB,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAC7D,CAAC;QACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;YACnD,EAAE,GAAG,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,IAAI,CAAC,EAAE;gBAAE,MAAM,GAAG,uCAAuC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,sBAAsB,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;QACrE,MAAM,GAAG,OAAO,IAAI,gCAAgC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CACX,kCAAkC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;YACxE,gEAAgE,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opvs-ai/cli",
3
- "version": "0.27.7",
3
+ "version": "0.27.8",
4
4
  "description": "OPVS CLI — Terminal access to AgentBoard + AgentDocs for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {