@ora-ai/cli 0.1.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/dist/auth-commands.d.ts +39 -0
  4. package/dist/auth-commands.d.ts.map +1 -0
  5. package/dist/auth-commands.js +116 -0
  6. package/dist/auth-commands.js.map +1 -0
  7. package/dist/core/auth.d.ts +41 -0
  8. package/dist/core/auth.d.ts.map +1 -0
  9. package/dist/core/auth.js +110 -0
  10. package/dist/core/auth.js.map +1 -0
  11. package/dist/core/config.d.ts +26 -0
  12. package/dist/core/config.d.ts.map +1 -0
  13. package/dist/core/config.js +51 -0
  14. package/dist/core/config.js.map +1 -0
  15. package/dist/core/http.d.ts +46 -0
  16. package/dist/core/http.d.ts.map +1 -0
  17. package/dist/core/http.js +82 -0
  18. package/dist/core/http.js.map +1 -0
  19. package/dist/core/login.d.ts +14 -0
  20. package/dist/core/login.d.ts.map +1 -0
  21. package/dist/core/login.js +70 -0
  22. package/dist/core/login.js.map +1 -0
  23. package/dist/core/output.d.ts +18 -0
  24. package/dist/core/output.d.ts.map +1 -0
  25. package/dist/core/output.js +94 -0
  26. package/dist/core/output.js.map +1 -0
  27. package/dist/core/run-operation.d.ts +57 -0
  28. package/dist/core/run-operation.d.ts.map +1 -0
  29. package/dist/core/run-operation.js +119 -0
  30. package/dist/core/run-operation.js.map +1 -0
  31. package/dist/core/sse.d.ts +13 -0
  32. package/dist/core/sse.d.ts.map +1 -0
  33. package/dist/core/sse.js +63 -0
  34. package/dist/core/sse.js.map +1 -0
  35. package/dist/generated/operations.d.ts +47 -0
  36. package/dist/generated/operations.d.ts.map +1 -0
  37. package/dist/generated/operations.js +2050 -0
  38. package/dist/generated/operations.js.map +1 -0
  39. package/dist/generated/types.d.ts +1039 -0
  40. package/dist/generated/types.d.ts.map +1 -0
  41. package/dist/generated/types.js +5 -0
  42. package/dist/generated/types.js.map +1 -0
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +17 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/interactive/derive-prompts.d.ts +44 -0
  48. package/dist/interactive/derive-prompts.d.ts.map +1 -0
  49. package/dist/interactive/derive-prompts.js +58 -0
  50. package/dist/interactive/derive-prompts.js.map +1 -0
  51. package/dist/interactive/inquirer-prompter.d.ts +11 -0
  52. package/dist/interactive/inquirer-prompter.d.ts.map +1 -0
  53. package/dist/interactive/inquirer-prompter.js +64 -0
  54. package/dist/interactive/inquirer-prompter.js.map +1 -0
  55. package/dist/interactive/menu.d.ts +25 -0
  56. package/dist/interactive/menu.d.ts.map +1 -0
  57. package/dist/interactive/menu.js +57 -0
  58. package/dist/interactive/menu.js.map +1 -0
  59. package/dist/interactive/prompter.d.ts +25 -0
  60. package/dist/interactive/prompter.d.ts.map +1 -0
  61. package/dist/interactive/prompter.js +14 -0
  62. package/dist/interactive/prompter.js.map +1 -0
  63. package/dist/interactive/session.d.ts +19 -0
  64. package/dist/interactive/session.d.ts.map +1 -0
  65. package/dist/interactive/session.js +204 -0
  66. package/dist/interactive/session.js.map +1 -0
  67. package/dist/program.d.ts +81 -0
  68. package/dist/program.d.ts.map +1 -0
  69. package/dist/program.js +178 -0
  70. package/dist/program.js.map +1 -0
  71. package/dist/render/ansi.d.ts +13 -0
  72. package/dist/render/ansi.d.ts.map +1 -0
  73. package/dist/render/ansi.js +34 -0
  74. package/dist/render/ansi.js.map +1 -0
  75. package/dist/render/banner.d.ts +7 -0
  76. package/dist/render/banner.d.ts.map +1 -0
  77. package/dist/render/banner.js +18 -0
  78. package/dist/render/banner.js.map +1 -0
  79. package/dist/render/glyphs.d.ts +39 -0
  80. package/dist/render/glyphs.d.ts.map +1 -0
  81. package/dist/render/glyphs.js +83 -0
  82. package/dist/render/glyphs.js.map +1 -0
  83. package/dist/render/index.d.ts +13 -0
  84. package/dist/render/index.d.ts.map +1 -0
  85. package/dist/render/index.js +24 -0
  86. package/dist/render/index.js.map +1 -0
  87. package/dist/render/insight-lines.d.ts +8 -0
  88. package/dist/render/insight-lines.d.ts.map +1 -0
  89. package/dist/render/insight-lines.js +62 -0
  90. package/dist/render/insight-lines.js.map +1 -0
  91. package/dist/render/insight.d.ts +9 -0
  92. package/dist/render/insight.d.ts.map +1 -0
  93. package/dist/render/insight.js +68 -0
  94. package/dist/render/insight.js.map +1 -0
  95. package/dist/render/journey-graph.d.ts +73 -0
  96. package/dist/render/journey-graph.d.ts.map +1 -0
  97. package/dist/render/journey-graph.js +250 -0
  98. package/dist/render/journey-graph.js.map +1 -0
  99. package/dist/render/journey.d.ts +14 -0
  100. package/dist/render/journey.d.ts.map +1 -0
  101. package/dist/render/journey.js +67 -0
  102. package/dist/render/journey.js.map +1 -0
  103. package/dist/render/live-panel.d.ts +34 -0
  104. package/dist/render/live-panel.d.ts.map +1 -0
  105. package/dist/render/live-panel.js +84 -0
  106. package/dist/render/live-panel.js.map +1 -0
  107. package/dist/render/mode.d.ts +19 -0
  108. package/dist/render/mode.d.ts.map +1 -0
  109. package/dist/render/mode.js +23 -0
  110. package/dist/render/mode.js.map +1 -0
  111. package/dist/render/registry.d.ts +17 -0
  112. package/dist/render/registry.d.ts.map +1 -0
  113. package/dist/render/registry.js +34 -0
  114. package/dist/render/registry.js.map +1 -0
  115. package/dist/render/run-list.d.ts +11 -0
  116. package/dist/render/run-list.d.ts.map +1 -0
  117. package/dist/render/run-list.js +53 -0
  118. package/dist/render/run-list.js.map +1 -0
  119. package/dist/render/spinner.d.ts +14 -0
  120. package/dist/render/spinner.d.ts.map +1 -0
  121. package/dist/render/spinner.js +37 -0
  122. package/dist/render/spinner.js.map +1 -0
  123. package/dist/render/table.d.ts +20 -0
  124. package/dist/render/table.d.ts.map +1 -0
  125. package/dist/render/table.js +29 -0
  126. package/dist/render/table.js.map +1 -0
  127. package/dist/render/trajectory.d.ts +19 -0
  128. package/dist/render/trajectory.d.ts.map +1 -0
  129. package/dist/render/trajectory.js +75 -0
  130. package/dist/render/trajectory.js.map +1 -0
  131. package/dist/render/tunnel.d.ts +10 -0
  132. package/dist/render/tunnel.d.ts.map +1 -0
  133. package/dist/render/tunnel.js +108 -0
  134. package/dist/render/tunnel.js.map +1 -0
  135. package/dist/render/usage.d.ts +29 -0
  136. package/dist/render/usage.d.ts.map +1 -0
  137. package/dist/render/usage.js +83 -0
  138. package/dist/render/usage.js.map +1 -0
  139. package/dist/tunnel-command.d.ts +15 -0
  140. package/dist/tunnel-command.d.ts.map +1 -0
  141. package/dist/tunnel-command.js +267 -0
  142. package/dist/tunnel-command.js.map +1 -0
  143. package/dist/watch.d.ts +53 -0
  144. package/dist/watch.d.ts.map +1 -0
  145. package/dist/watch.js +305 -0
  146. package/dist/watch.js.map +1 -0
  147. package/package.json +36 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The one HTTP door for every generated command.
3
+ *
4
+ * Auth policy mirrors the platform's createServiceClient: on a 401 the token
5
+ * is force-re-exchanged and the request retried EXACTLY once. 5xx is never
6
+ * retried — a POST /runs may have been admitted and billed; at-most-once is
7
+ * the CLI's promise for mutations.
8
+ *
9
+ * Non-ok responses map to ApiError carrying the platform envelope
10
+ * {error, code, details?} so output.ts can tell the 402/403 stories.
11
+ */
12
+ export class ApiError extends Error {
13
+ status;
14
+ code;
15
+ details;
16
+ constructor(message, status, code, details) {
17
+ super(message);
18
+ this.status = status;
19
+ this.code = code;
20
+ this.details = details;
21
+ this.name = "ApiError";
22
+ }
23
+ }
24
+ export class HttpClient {
25
+ apiUrl;
26
+ auth;
27
+ fetchFn;
28
+ constructor(deps) {
29
+ this.apiUrl = deps.apiUrl;
30
+ this.auth = deps.auth;
31
+ this.fetchFn = deps.fetchFn ?? fetch;
32
+ }
33
+ /** JSON operations: parsed body (null when empty), ApiError on non-ok. */
34
+ async call(opts) {
35
+ const res = await this.send(opts, "application/json");
36
+ const text = await res.text();
37
+ if (!text)
38
+ return null;
39
+ try {
40
+ return JSON.parse(text);
41
+ }
42
+ catch {
43
+ return text;
44
+ }
45
+ }
46
+ /** Stream operations: the raw ok Response, for core/sse.ts to consume. */
47
+ async open(opts) {
48
+ return this.send(opts, "text/event-stream");
49
+ }
50
+ url(opts) {
51
+ const u = new URL(`${this.apiUrl}${opts.path}`);
52
+ for (const [key, value] of Object.entries(opts.query ?? {})) {
53
+ if (value !== undefined)
54
+ u.searchParams.set(key, String(value));
55
+ }
56
+ return u.toString();
57
+ }
58
+ async send(opts, accept) {
59
+ const attempt = async (token) => this.fetchFn(this.url(opts), {
60
+ method: opts.method.toUpperCase(),
61
+ headers: {
62
+ authorization: `Bearer ${token}`,
63
+ accept,
64
+ ...(opts.body !== undefined ? { "content-type": "application/json" } : {}),
65
+ },
66
+ ...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
67
+ });
68
+ let res = await attempt(await this.auth.getToken());
69
+ if (res.status === 401) {
70
+ res = await attempt(await this.auth.forceRefresh());
71
+ }
72
+ if (!res.ok)
73
+ throw await toApiError(res);
74
+ return res;
75
+ }
76
+ }
77
+ async function toApiError(res) {
78
+ const body = (await res.json().catch(() => ({})));
79
+ const retryAfter = res.headers.get("retry-after");
80
+ return new ApiError(body.error ?? `HTTP ${res.status}`, res.status, body.code ?? "HTTP_ERROR", retryAfter ? { ...(body.details ?? {}), retryAfter } : body.details);
81
+ }
82
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Interactive api-key entry. The key is masked while typed and NEVER echoed —
3
+ * the one hard rule of the login UX. Non-TTY stdin (pipes) degrades to a plain
4
+ * single-line read so `echo $KEY | ora login` works in scripts.
5
+ *
6
+ * Raw mode delivers a PASTE as one data event carrying the whole string
7
+ * (possibly with a trailing newline) — never one event per keypress. The
8
+ * handler therefore iterates characters WITHIN each chunk: per-char masking,
9
+ * submit on the first newline wherever it appears, and control-byte noise
10
+ * stripped. A per-event handler here renders one star per paste and swallows
11
+ * a pasted trailing newline, leaving the prompt hung.
12
+ */
13
+ export declare function promptForKey(input?: NodeJS.ReadStream, output?: NodeJS.WriteStream): Promise<string>;
14
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/core/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,wBAAsB,YAAY,CAChC,KAAK,GAAE,MAAM,CAAC,UAA0B,EACxC,MAAM,GAAE,MAAM,CAAC,WAA4B,GAC1C,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Interactive api-key entry. The key is masked while typed and NEVER echoed —
3
+ * the one hard rule of the login UX. Non-TTY stdin (pipes) degrades to a plain
4
+ * single-line read so `echo $KEY | ora login` works in scripts.
5
+ *
6
+ * Raw mode delivers a PASTE as one data event carrying the whole string
7
+ * (possibly with a trailing newline) — never one event per keypress. The
8
+ * handler therefore iterates characters WITHIN each chunk: per-char masking,
9
+ * submit on the first newline wherever it appears, and control-byte noise
10
+ * stripped. A per-event handler here renders one star per paste and swallows
11
+ * a pasted trailing newline, leaving the prompt hung.
12
+ */
13
+ const CTRL_C = "\u0003";
14
+ const DEL = "\u007f";
15
+ export async function promptForKey(input = process.stdin, output = process.stdout) {
16
+ output.write("Paste your api key (ora_sk_…): ");
17
+ if (!input.isTTY) {
18
+ return new Promise((resolve) => {
19
+ let buf = "";
20
+ input.setEncoding("utf8");
21
+ input.on("data", (chunk) => {
22
+ buf += chunk;
23
+ });
24
+ input.on("end", () => resolve(buf.trim()));
25
+ });
26
+ }
27
+ return new Promise((resolve) => {
28
+ let key = "";
29
+ input.setRawMode(true);
30
+ input.resume();
31
+ input.setEncoding("utf8");
32
+ const finish = () => {
33
+ input.setRawMode(false);
34
+ input.pause();
35
+ input.off("data", onData);
36
+ output.write("\n");
37
+ resolve(key.trim());
38
+ };
39
+ const onData = (chunk) => {
40
+ if (chunk === CTRL_C) {
41
+ // A real Ctrl+C keypress arrives as a lone  chunk. Restore the
42
+ // terminal, then exit. (A  EMBEDDED in a paste is clipboard
43
+ // noise, stripped by the control-char filter below instead.)
44
+ input.setRawMode(false);
45
+ output.write("\n");
46
+ process.exit(130);
47
+ }
48
+ for (const char of chunk) {
49
+ if (char === "\r" || char === "\n") {
50
+ // Submit — and drop anything after the newline: a secret is one line.
51
+ finish();
52
+ return;
53
+ }
54
+ if (char === DEL || char === "\b") {
55
+ if (key.length > 0) {
56
+ key = key.slice(0, -1);
57
+ output.write("\b \b"); // erase the star, not just the buffer
58
+ }
59
+ continue;
60
+ }
61
+ if (char < " ")
62
+ continue; // strip other control bytes from pastes
63
+ key += char;
64
+ output.write("*");
65
+ }
66
+ };
67
+ input.on("data", onData);
68
+ });
69
+ }
70
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/core/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,MAAM,GAAG,GAAG,QAAQ,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA2B,OAAO,CAAC,KAAK,EACxC,SAA6B,OAAO,CAAC,MAAM;IAE3C,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAEhD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACjC,GAAG,IAAI,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,gEAAgE;gBAChE,6DAA6D;gBAC7D,6DAA6D;gBAC7D,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACnC,sEAAsE;oBACtE,MAAM,EAAE,CAAC;oBACT,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;oBAC/D,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,GAAG,GAAG;oBAAE,SAAS,CAAC,wCAAwC;gBAClE,GAAG,IAAI,IAAI,CAAC;gBACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Presentation. --json is a raw, scriptable passthrough; plain mode favours
3
+ * tables for list payloads; rich mode delegates to the renderer registry
4
+ * (render/registry.ts), populated by the side-effect import below (Task 6's
5
+ * trajectory/insight/journey/run-list renderers — render/index.ts), falling
6
+ * back to the same plain rendering when none of them claims the payload.
7
+ * renderError is where the CLI earns its keep: the 402 paywall and 403 scope
8
+ * stories are precomputed guidance, not bare codes.
9
+ */
10
+ import "../render/index.js";
11
+ import type { OutputMode } from "../render/mode.js";
12
+ export declare function renderResult(data: unknown, opts: {
13
+ mode: OutputMode;
14
+ }): string;
15
+ export declare function renderError(err: unknown, ctx?: {
16
+ scope?: string | null;
17
+ }): string;
18
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,CAI9E;AAsCD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAAG,MAAM,CAIrF"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Presentation. --json is a raw, scriptable passthrough; plain mode favours
3
+ * tables for list payloads; rich mode delegates to the renderer registry
4
+ * (render/registry.ts), populated by the side-effect import below (Task 6's
5
+ * trajectory/insight/journey/run-list renderers — render/index.ts), falling
6
+ * back to the same plain rendering when none of them claims the payload.
7
+ * renderError is where the CLI earns its keep: the 402 paywall and 403 scope
8
+ * stories are precomputed guidance, not bare codes.
9
+ */
10
+ import chalk from "chalk";
11
+ import "../render/index.js"; // side-effect: registers the four rich renderers (Task 6)
12
+ import { renderRich } from "../render/registry.js";
13
+ import { MAX_COLUMNS, cell, columnWidths, padLine, rowCountLabel } from "../render/table.js";
14
+ import { AuthError } from "./auth.js";
15
+ import { ApiError } from "./http.js";
16
+ export function renderResult(data, opts) {
17
+ if (opts.mode === "json")
18
+ return JSON.stringify(data, null, 2);
19
+ if (opts.mode === "rich")
20
+ return renderRich(data, renderPlain);
21
+ return renderPlain(data);
22
+ }
23
+ function renderPlain(data) {
24
+ const list = extractList(data);
25
+ if (list) {
26
+ const rows = list.filter(isRow);
27
+ const nonNull = list.filter((v) => v !== null && v !== undefined);
28
+ if (nonNull.length !== rows.length)
29
+ return JSON.stringify(data, null, 2); // primitive elements — not tabular
30
+ if (rows.length === 0)
31
+ return chalk.dim(rowCountLabel(0));
32
+ return renderTable(rows);
33
+ }
34
+ return JSON.stringify(data, null, 2);
35
+ }
36
+ function extractList(data) {
37
+ if (Array.isArray(data))
38
+ return data;
39
+ if (data && typeof data === "object" && Array.isArray(data.results)) {
40
+ return data.results;
41
+ }
42
+ return null;
43
+ }
44
+ function isRow(value) {
45
+ return typeof value === "object" && value !== null;
46
+ }
47
+ function renderTable(rows) {
48
+ const columns = Object.keys(rows[0]).slice(0, MAX_COLUMNS);
49
+ const cellRows = rows.map((r) => columns.map((c) => cell(r[c])));
50
+ const widths = columnWidths(columns, cellRows);
51
+ return [
52
+ chalk.bold(padLine(columns, widths)),
53
+ ...cellRows.map((cells) => padLine(cells, widths)),
54
+ chalk.dim(rowCountLabel(rows.length)),
55
+ ].join("\n");
56
+ }
57
+ export function renderError(err, ctx = {}) {
58
+ if (err instanceof ApiError)
59
+ return renderApiError(err, ctx);
60
+ if (err instanceof AuthError)
61
+ return authFailureStory(err.code, err.message);
62
+ return chalk.red(err instanceof Error ? err.message : String(err));
63
+ }
64
+ function authFailureStory(code, message) {
65
+ return [chalk.red(`Authentication failed (${code}): ${message}`), "Run `ora login` with a valid api key."].join("\n");
66
+ }
67
+ function renderApiError(err, ctx) {
68
+ if (err.status === 402) {
69
+ return [
70
+ chalk.red(`Limit exceeded: ${err.message}`),
71
+ ...(err.details ? [chalk.dim(JSON.stringify(err.details))] : []),
72
+ "Upgrade your plan (ora dashboard → Billing) or reduce usage.",
73
+ ].join("\n");
74
+ }
75
+ if (err.status === 403 && err.code === "INSUFFICIENT_SCOPE") {
76
+ const fromDetails = err.details?.missing;
77
+ const missing = Array.isArray(fromDetails) && fromDetails.length > 0 ? fromDetails.join(", ") : (ctx.scope ?? "unknown");
78
+ return [
79
+ chalk.red(`This api key is missing the required scope: ${missing}`),
80
+ "Mint a key with that scope (ora dashboard → Settings → API keys), then `ora login` again.",
81
+ ].join("\n");
82
+ }
83
+ if (err.status === 401)
84
+ return authFailureStory(err.code, err.message);
85
+ if (err.status === 429) {
86
+ const retryAfter = err.details?.retryAfter;
87
+ if (typeof retryAfter === "string") {
88
+ return chalk.red(`Rate limited: ${err.message}. Retry after ${retryAfter}s.`);
89
+ }
90
+ return chalk.red(`Rate limited: ${err.message}. Retry in a moment.`);
91
+ }
92
+ return chalk.red(`API error ${err.status} (${err.code}): ${err.message}`);
93
+ }
94
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The execution core: credentials resolution, path/query/body derivation, and
3
+ * the ONE call/stream dispatch path (runOperation) shared verbatim by the
4
+ * scripted commander action (program.ts's attachOperation) and the
5
+ * interactive session (interactive/session.ts).
6
+ *
7
+ * ResolvedDeps/OperationMeta are imported type-only from program.ts /
8
+ * generated/operations.ts — no runtime edge back to program.ts, so this
9
+ * module stays a leaf auth-commands.ts and session.ts can both depend on.
10
+ */
11
+ import { type OperationMeta } from "../generated/operations.js";
12
+ import type { ResolvedDeps } from "../program.js";
13
+ /** Resolves the api key + api url for a call, or reports the missing-key error and returns null. Shared by runOperation and the auth commands (login/whoami both need the same story). */
14
+ export declare function credentials(deps: ResolvedDeps, apiUrlFlag: string | undefined): {
15
+ apiKey: string;
16
+ apiUrl: string;
17
+ } | null;
18
+ /** Substitutes `{param}` placeholders in a path template with URI-encoded positionals, in declared order. */
19
+ export declare function buildPath(meta: Pick<OperationMeta, "pathTemplate" | "pathParams">, positionals: string[]): string;
20
+ /** Builds the query object from parsed commander opts, converting each param to its declared kind and omitting absent values. */
21
+ export declare function buildQuery(meta: Pick<OperationMeta, "queryParams">, opts: Record<string, unknown>): Record<string, string | number | boolean | undefined>;
22
+ export interface RunValues {
23
+ positionals: string[];
24
+ query: Record<string, string | number | boolean | undefined>;
25
+ body?: unknown;
26
+ json: boolean;
27
+ plain: boolean;
28
+ watch: boolean;
29
+ apiUrlFlag?: string;
30
+ }
31
+ /**
32
+ * The ONE execution path for a manifest operation: credentials → path/query
33
+ * → call/stream → mode-aware render. Shared verbatim by the scripted
34
+ * commander action and (Task 4) the interactive session — sets
35
+ * `process.exitCode` on failure and never throws.
36
+ */
37
+ export declare function runOperation(meta: OperationMeta, values: RunValues, deps: ResolvedDeps): Promise<void>;
38
+ export type ReadBodyResult = {
39
+ kind: "ok";
40
+ body: unknown;
41
+ } | {
42
+ kind: "error";
43
+ };
44
+ /** The one message for "a bodyRequired op has no body" — shared verbatim with the interactive session's own bodyRequired guard (session.ts) so the two doors never drift apart. */
45
+ export declare const MISSING_BODY_MESSAGE = "This command requires a JSON body: pass --file <path> (or \"-\" for stdin).";
46
+ /**
47
+ * Reads and parses --file for a body op. Returns a discriminated result, not
48
+ * a bare `unknown`, on purpose: `undefined` is also the legitimate "ok" body
49
+ * for an omitted OPTIONAL body, so the caller cannot tell "omitted" apart
50
+ * from "malformed" by checking `=== undefined` alone. On "error" this has
51
+ * already reported the message and set process.exitCode(2); the caller must
52
+ * abort unconditionally on "error" — regardless of bodyRequired — or it
53
+ * silently dispatches the request with the bad body dropped while still
54
+ * exiting non-zero (the desync a future optional-body op would hit).
55
+ */
56
+ export declare function readBody(file: string | undefined, meta: Pick<OperationMeta, "bodyRequired">, deps: Pick<ResolvedDeps, "errOut">): ReadBodyResult;
57
+ //# sourceMappingURL=run-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-operation.d.ts","sourceRoot":"","sources":["../../src/core/run-operation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,0LAA0L;AAC1L,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUzH;AAED,6GAA6G;AAC7G,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAMjH;AAED,iIAAiI;AACjI,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAQvD;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5G;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/E,mLAAmL;AACnL,eAAO,MAAM,oBAAoB,gFAA8E,CAAC;AAEhH;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EACzC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GACjC,cAAc,CAmBhB"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * The execution core: credentials resolution, path/query/body derivation, and
3
+ * the ONE call/stream dispatch path (runOperation) shared verbatim by the
4
+ * scripted commander action (program.ts's attachOperation) and the
5
+ * interactive session (interactive/session.ts).
6
+ *
7
+ * ResolvedDeps/OperationMeta are imported type-only from program.ts /
8
+ * generated/operations.ts — no runtime edge back to program.ts, so this
9
+ * module stays a leaf auth-commands.ts and session.ts can both depend on.
10
+ */
11
+ import { readFileSync } from "node:fs";
12
+ import { readConfig, resolveApiKey, resolveApiUrl } from "./config.js";
13
+ import { renderError, renderResult } from "./output.js";
14
+ import { readSse } from "./sse.js";
15
+ import { SPEC } from "../generated/operations.js";
16
+ import { resolveOutputMode } from "../render/mode.js";
17
+ import { renderEventStream, watchAfterCreate } from "../watch.js";
18
+ /** Resolves the api key + api url for a call, or reports the missing-key error and returns null. Shared by runOperation and the auth commands (login/whoami both need the same story). */
19
+ export function credentials(deps, apiUrlFlag) {
20
+ const cfg = readConfig(deps.dir);
21
+ const apiKey = resolveApiKey(cfg, deps.env);
22
+ const apiUrl = resolveApiUrl(cfg, apiUrlFlag, SPEC.server, deps.env);
23
+ if (!apiKey) {
24
+ deps.errOut(renderError(new Error("No api key configured. Run `ora login` or set ORA_API_KEY.")));
25
+ process.exitCode = 1;
26
+ return null;
27
+ }
28
+ return { apiKey, apiUrl };
29
+ }
30
+ /** Substitutes `{param}` placeholders in a path template with URI-encoded positionals, in declared order. */
31
+ export function buildPath(meta, positionals) {
32
+ let path = meta.pathTemplate;
33
+ meta.pathParams.forEach((p, i) => {
34
+ path = path.replace(`{${p.name}}`, encodeURIComponent(positionals[i] ?? ""));
35
+ });
36
+ return path;
37
+ }
38
+ /** Builds the query object from parsed commander opts, converting each param to its declared kind and omitting absent values. */
39
+ export function buildQuery(meta, opts) {
40
+ const query = {};
41
+ for (const q of meta.queryParams) {
42
+ const value = opts[q.optionKey];
43
+ if (value === undefined)
44
+ continue;
45
+ query[q.name] = q.kind === "number" ? Number(value) : q.kind === "boolean" ? Boolean(value) : String(value);
46
+ }
47
+ return query;
48
+ }
49
+ /**
50
+ * The ONE execution path for a manifest operation: credentials → path/query
51
+ * → call/stream → mode-aware render. Shared verbatim by the scripted
52
+ * commander action and (Task 4) the interactive session — sets
53
+ * `process.exitCode` on failure and never throws.
54
+ */
55
+ export async function runOperation(meta, values, deps) {
56
+ // Resolved ONCE and threaded through — no other call in this path
57
+ // re-derives mode from opts/env/tty.
58
+ const mode = resolveOutputMode({ json: values.json, plain: values.plain }, deps.env, deps.stdoutIsTty);
59
+ const creds = credentials(deps, values.apiUrlFlag);
60
+ if (!creds)
61
+ return;
62
+ const path = buildPath(meta, values.positionals);
63
+ const query = values.query;
64
+ const client = deps.makeClient(creds);
65
+ try {
66
+ if (meta.isStream) {
67
+ const res = await client.open({ method: meta.method, path, query });
68
+ await renderEventStream(readSse(res), { deps, mode });
69
+ return;
70
+ }
71
+ const data = await client.call({
72
+ method: meta.method,
73
+ path,
74
+ query,
75
+ ...(values.body !== undefined ? { body: values.body } : {}),
76
+ });
77
+ if (meta.watchable && values.watch) {
78
+ await watchAfterCreate(data, { client, deps, mode });
79
+ return;
80
+ }
81
+ deps.out(renderResult(data, { mode }));
82
+ }
83
+ catch (err) {
84
+ deps.errOut(renderError(err, { scope: meta.scope }));
85
+ process.exitCode = 1;
86
+ }
87
+ }
88
+ /** The one message for "a bodyRequired op has no body" — shared verbatim with the interactive session's own bodyRequired guard (session.ts) so the two doors never drift apart. */
89
+ export const MISSING_BODY_MESSAGE = 'This command requires a JSON body: pass --file <path> (or "-" for stdin).';
90
+ /**
91
+ * Reads and parses --file for a body op. Returns a discriminated result, not
92
+ * a bare `unknown`, on purpose: `undefined` is also the legitimate "ok" body
93
+ * for an omitted OPTIONAL body, so the caller cannot tell "omitted" apart
94
+ * from "malformed" by checking `=== undefined` alone. On "error" this has
95
+ * already reported the message and set process.exitCode(2); the caller must
96
+ * abort unconditionally on "error" — regardless of bodyRequired — or it
97
+ * silently dispatches the request with the bad body dropped while still
98
+ * exiting non-zero (the desync a future optional-body op would hit).
99
+ */
100
+ export function readBody(file, meta, deps) {
101
+ if (!file) {
102
+ if (meta.bodyRequired) {
103
+ deps.errOut(renderError(new Error(MISSING_BODY_MESSAGE)));
104
+ process.exitCode = 2;
105
+ return { kind: "error" };
106
+ }
107
+ return { kind: "ok", body: undefined };
108
+ }
109
+ try {
110
+ const raw = file === "-" ? readFileSync(0, "utf8") : readFileSync(file, "utf8");
111
+ return { kind: "ok", body: JSON.parse(raw) };
112
+ }
113
+ catch (err) {
114
+ deps.errOut(renderError(new Error(`Could not read JSON body from ${file === "-" ? "stdin" : file}: ${err.message}`)));
115
+ process.exitCode = 2;
116
+ return { kind: "error" };
117
+ }
118
+ }
119
+ //# sourceMappingURL=run-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-operation.js","sourceRoot":"","sources":["../../src/core/run-operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Minimal EventSource-over-fetch. Enough SSE for the public stream ops:
3
+ * event/data fields, ":" heartbeats skipped, multi-line data joined, CRLF
4
+ * tolerated, correct across arbitrary chunk boundaries. Reconnection is
5
+ * deliberately out of scope for v1 — the command exits when the server ends
6
+ * the stream.
7
+ */
8
+ export interface SseEvent {
9
+ event: string;
10
+ data: string;
11
+ }
12
+ export declare function readSse(res: Response): AsyncGenerator<SseEvent>;
13
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAuB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAoDtE"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Minimal EventSource-over-fetch. Enough SSE for the public stream ops:
3
+ * event/data fields, ":" heartbeats skipped, multi-line data joined, CRLF
4
+ * tolerated, correct across arbitrary chunk boundaries. Reconnection is
5
+ * deliberately out of scope for v1 — the command exits when the server ends
6
+ * the stream.
7
+ */
8
+ export async function* readSse(res) {
9
+ const body = res.body;
10
+ if (!body)
11
+ return;
12
+ const decoder = new TextDecoder();
13
+ let buffer = "";
14
+ let eventName = "message";
15
+ let dataLines = [];
16
+ const takeEvent = () => {
17
+ if (dataLines.length === 0) {
18
+ eventName = "message";
19
+ return null;
20
+ }
21
+ const event = { event: eventName, data: dataLines.join("\n") };
22
+ eventName = "message";
23
+ dataLines = [];
24
+ return event;
25
+ };
26
+ const handleLine = (rawLine) => {
27
+ const line = rawLine.replace(/\r$/, "");
28
+ if (line === "")
29
+ return takeEvent();
30
+ if (line.startsWith(":"))
31
+ return null; // heartbeat / comment
32
+ const colon = line.indexOf(":");
33
+ const field = colon === -1 ? line : line.slice(0, colon);
34
+ const value = colon === -1 ? "" : line.slice(colon + 1).replace(/^ /, "");
35
+ if (field === "event")
36
+ eventName = value;
37
+ else if (field === "data")
38
+ dataLines.push(value);
39
+ return null;
40
+ };
41
+ for await (const chunk of body) {
42
+ buffer += decoder.decode(chunk, { stream: true });
43
+ let newline;
44
+ while ((newline = buffer.indexOf("\n")) >= 0) {
45
+ const line = buffer.slice(0, newline);
46
+ buffer = buffer.slice(newline + 1);
47
+ const event = handleLine(line);
48
+ if (event)
49
+ yield event;
50
+ }
51
+ }
52
+ buffer += decoder.decode(); // flush any dangling partial character as U+FFFD
53
+ // Trailing line without a newline, then whatever is buffered as an event.
54
+ if (buffer.length > 0) {
55
+ const event = handleLine(buffer);
56
+ if (event)
57
+ yield event;
58
+ }
59
+ const tail = takeEvent();
60
+ if (tail)
61
+ yield tail;
62
+ }
63
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface PathParamMeta {
2
+ name: string;
3
+ }
4
+ export interface QueryParamMeta {
5
+ name: string;
6
+ flag: string;
7
+ optionKey: string;
8
+ required: boolean;
9
+ kind: "string" | "number" | "boolean";
10
+ description?: string;
11
+ enum?: string[];
12
+ }
13
+ export interface BodyFieldMeta {
14
+ name: string;
15
+ required: boolean;
16
+ kind: "string" | "number" | "boolean" | "object" | "array";
17
+ enum?: string[];
18
+ placeholder: string;
19
+ }
20
+ export interface OperationMeta {
21
+ id: string;
22
+ commandPath: string[];
23
+ method: "get" | "post" | "put" | "patch" | "delete";
24
+ pathTemplate: string;
25
+ summary: string;
26
+ scope: string | null;
27
+ product: string | null;
28
+ pathParams: PathParamMeta[];
29
+ queryParams: QueryParamMeta[];
30
+ hasBody: boolean;
31
+ bodyRequired: boolean;
32
+ isStream: boolean;
33
+ watchable: boolean;
34
+ help: {
35
+ command: string;
36
+ body?: string;
37
+ };
38
+ bodyFields?: BodyFieldMeta[];
39
+ }
40
+ export declare const SPEC: {
41
+ readonly version: "1.0.0";
42
+ readonly contentHash: "d1aeca5bf5255cdfbdf7836aace5a10fc4242ce23a30dd16761092e8383291b0";
43
+ readonly server: "https://api.agentfront.sh";
44
+ readonly bin: "ora";
45
+ };
46
+ export declare const OPERATIONS: OperationMeta[];
47
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/generated/operations.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,IAAI;;;;;CAKP,CAAC;AAEX,eAAO,MAAM,UAAU,EAAE,aAAa,EAu/DrC,CAAC"}