praetom 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 (102) hide show
  1. package/README.md +82 -0
  2. package/dist/_esm-loader.d.ts +49 -0
  3. package/dist/_esm-loader.d.ts.map +1 -0
  4. package/dist/_esm-loader.js +131 -0
  5. package/dist/_esm-loader.js.map +1 -0
  6. package/dist/_internal.d.ts +63 -0
  7. package/dist/_internal.d.ts.map +1 -0
  8. package/dist/_internal.js +357 -0
  9. package/dist/_internal.js.map +1 -0
  10. package/dist/browser.d.ts +90 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +357 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/cli/cli.d.ts +3 -0
  15. package/dist/cli/cli.d.ts.map +1 -0
  16. package/dist/cli/cli.js +97 -0
  17. package/dist/cli/cli.js.map +1 -0
  18. package/dist/cli/commands/discover.d.ts +3 -0
  19. package/dist/cli/commands/discover.d.ts.map +1 -0
  20. package/dist/cli/commands/discover.js +15 -0
  21. package/dist/cli/commands/discover.js.map +1 -0
  22. package/dist/cli/commands/features.d.ts +5 -0
  23. package/dist/cli/commands/features.d.ts.map +1 -0
  24. package/dist/cli/commands/features.js +83 -0
  25. package/dist/cli/commands/features.js.map +1 -0
  26. package/dist/cli/commands/init.d.ts +3 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -0
  28. package/dist/cli/commands/init.js +52 -0
  29. package/dist/cli/commands/init.js.map +1 -0
  30. package/dist/cli/commands/login.d.ts +20 -0
  31. package/dist/cli/commands/login.d.ts.map +1 -0
  32. package/dist/cli/commands/login.js +138 -0
  33. package/dist/cli/commands/login.js.map +1 -0
  34. package/dist/cli/commands/logout.d.ts +3 -0
  35. package/dist/cli/commands/logout.d.ts.map +1 -0
  36. package/dist/cli/commands/logout.js +15 -0
  37. package/dist/cli/commands/logout.js.map +1 -0
  38. package/dist/cli/commands/rotate.d.ts +3 -0
  39. package/dist/cli/commands/rotate.d.ts.map +1 -0
  40. package/dist/cli/commands/rotate.js +33 -0
  41. package/dist/cli/commands/rotate.js.map +1 -0
  42. package/dist/cli/commands/status.d.ts +3 -0
  43. package/dist/cli/commands/status.d.ts.map +1 -0
  44. package/dist/cli/commands/status.js +54 -0
  45. package/dist/cli/commands/status.js.map +1 -0
  46. package/dist/cli/commands/uninstall.d.ts +3 -0
  47. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  48. package/dist/cli/commands/uninstall.js +63 -0
  49. package/dist/cli/commands/uninstall.js.map +1 -0
  50. package/dist/cli/commands/usage.d.ts +3 -0
  51. package/dist/cli/commands/usage.d.ts.map +1 -0
  52. package/dist/cli/commands/usage.js +19 -0
  53. package/dist/cli/commands/usage.js.map +1 -0
  54. package/dist/cli/commands/whoami.d.ts +3 -0
  55. package/dist/cli/commands/whoami.d.ts.map +1 -0
  56. package/dist/cli/commands/whoami.js +37 -0
  57. package/dist/cli/commands/whoami.js.map +1 -0
  58. package/dist/cli/util/agent-env.d.ts +13 -0
  59. package/dist/cli/util/agent-env.d.ts.map +1 -0
  60. package/dist/cli/util/agent-env.js +28 -0
  61. package/dist/cli/util/agent-env.js.map +1 -0
  62. package/dist/cli/util/api.d.ts +36 -0
  63. package/dist/cli/util/api.d.ts.map +1 -0
  64. package/dist/cli/util/api.js +84 -0
  65. package/dist/cli/util/api.js.map +1 -0
  66. package/dist/cli/util/auth-file.d.ts +25 -0
  67. package/dist/cli/util/auth-file.d.ts.map +1 -0
  68. package/dist/cli/util/auth-file.js +74 -0
  69. package/dist/cli/util/auth-file.js.map +1 -0
  70. package/dist/cli/util/git.d.ts +28 -0
  71. package/dist/cli/util/git.d.ts.map +1 -0
  72. package/dist/cli/util/git.js +103 -0
  73. package/dist/cli/util/git.js.map +1 -0
  74. package/dist/cli/util/run.d.ts +26 -0
  75. package/dist/cli/util/run.d.ts.map +1 -0
  76. package/dist/cli/util/run.js +31 -0
  77. package/dist/cli/util/run.js.map +1 -0
  78. package/dist/edge.d.ts +34 -0
  79. package/dist/edge.d.ts.map +1 -0
  80. package/dist/edge.js +127 -0
  81. package/dist/edge.js.map +1 -0
  82. package/dist/server.d.ts +69 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +193 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/vite/index.d.ts +48 -0
  87. package/dist/vite/index.d.ts.map +1 -0
  88. package/dist/vite/index.js +138 -0
  89. package/dist/vite/index.js.map +1 -0
  90. package/dist/webpack/index.d.ts +64 -0
  91. package/dist/webpack/index.d.ts.map +1 -0
  92. package/dist/webpack/index.js +106 -0
  93. package/dist/webpack/index.js.map +1 -0
  94. package/dist/webpack/loader.d.ts +27 -0
  95. package/dist/webpack/loader.d.ts.map +1 -0
  96. package/dist/webpack/loader.js +54 -0
  97. package/dist/webpack/loader.js.map +1 -0
  98. package/dist/webpack/shared.d.ts +25 -0
  99. package/dist/webpack/shared.d.ts.map +1 -0
  100. package/dist/webpack/shared.js +63 -0
  101. package/dist/webpack/shared.js.map +1 -0
  102. package/package.json +79 -0
@@ -0,0 +1,52 @@
1
+ import { apiRequest, NotAuthenticatedError, workspaceQuery } from "../util/api.js";
2
+ import { resolveRepo } from "../util/git.js";
3
+ export async function initCommand(ctx) {
4
+ const repo = await resolveRepo(ctx.repo);
5
+ if (!repo) {
6
+ fail(ctx, "Couldn't determine the repository. Pass --repo owner/name, or run this from inside a git checkout with a GitHub remote.");
7
+ }
8
+ if (!ctx.json) {
9
+ process.stdout.write(`Installing praetom into ${repo.owner}/${repo.name}…\n`);
10
+ }
11
+ let result;
12
+ try {
13
+ result = await apiRequest("/api/cli/install", {
14
+ method: "POST",
15
+ body: { owner: repo.owner, name: repo.name },
16
+ query: workspaceQuery(ctx),
17
+ });
18
+ }
19
+ catch (e) {
20
+ if (e instanceof NotAuthenticatedError) {
21
+ fail(ctx, e.message);
22
+ }
23
+ throw e;
24
+ }
25
+ if (ctx.json) {
26
+ process.stdout.write(JSON.stringify({
27
+ ok: true,
28
+ repo: `${repo.owner}/${repo.name}`,
29
+ prUrl: result.prUrl,
30
+ prNumber: result.prNumber,
31
+ branch: result.branch,
32
+ framework: result.framework,
33
+ }) + "\n");
34
+ return;
35
+ }
36
+ process.stdout.write(`\nFramework detected: ${result.framework}\n` +
37
+ `Pull request opened: ${result.prUrl}\n\n` +
38
+ `Next:\n` +
39
+ ` 1. Review and merge the pull request.\n` +
40
+ ` 2. Deploy your service.\n` +
41
+ ` 3. Run \`praetom status\` to watch the install go live.\n`);
42
+ }
43
+ function fail(ctx, message) {
44
+ if (ctx.json) {
45
+ process.stdout.write(JSON.stringify({ ok: false, error: message }) + "\n");
46
+ }
47
+ else {
48
+ process.stderr.write(`${message}\n`);
49
+ }
50
+ process.exit(1);
51
+ }
52
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAe;IAC/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CACF,GAAG,EACH,yHAAyH,CAC1H,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,IAAK,CAAC,KAAK,IAAI,IAAK,CAAC,IAAI,KAAK,CAC1D,CAAC;IACJ,CAAC;IAED,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAkB,kBAAkB,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,IAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAK,CAAC,IAAI,EAAE;YAC9C,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;YACb,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,IAAK,CAAC,KAAK,IAAI,IAAK,CAAC,IAAI,EAAE;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,GAAG,IAAI,CACV,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,MAAM,CAAC,SAAS,IAAI;QAC3C,wBAAwB,MAAM,CAAC,KAAK,MAAM;QAC1C,SAAS;QACT,2CAA2C;QAC3C,6BAA6B;QAC7B,6DAA6D,CAChE,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,GAAe,EAAE,OAAe;IAC5C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ /**
3
+ * OAuth-style device-authorization handshake. The CLI:
4
+ *
5
+ * 1. Asks praetom to start a session (returns short user_code +
6
+ * long device_code + verification URL).
7
+ * 2. Prints the URL + user_code, then opens the browser.
8
+ * 3. The user signs in on praetom.com (if needed), confirms the
9
+ * user_code matches, clicks Approve.
10
+ * 4. We poll praetom every couple seconds until approved, expired, or
11
+ * the user cancels (Ctrl-C).
12
+ * 5. On approval, the freshly-minted personal access token is written
13
+ * to ~/.config/praetom/auth.json.
14
+ *
15
+ * Replaces the old paste-token flow. To go back to manual paste, set
16
+ * PRAETOM_TOKEN in the environment before calling other commands —
17
+ * `praetom login` is purely for the device-flow path.
18
+ */
19
+ export declare function loginCommand(ctx: RunContext): Promise<void>;
20
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmBjD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGjE"}
@@ -0,0 +1,138 @@
1
+ import { spawn } from "node:child_process";
2
+ import { writeAuth, DEFAULT_API_BASE } from "../util/auth-file.js";
3
+ /**
4
+ * OAuth-style device-authorization handshake. The CLI:
5
+ *
6
+ * 1. Asks praetom to start a session (returns short user_code +
7
+ * long device_code + verification URL).
8
+ * 2. Prints the URL + user_code, then opens the browser.
9
+ * 3. The user signs in on praetom.com (if needed), confirms the
10
+ * user_code matches, clicks Approve.
11
+ * 4. We poll praetom every couple seconds until approved, expired, or
12
+ * the user cancels (Ctrl-C).
13
+ * 5. On approval, the freshly-minted personal access token is written
14
+ * to ~/.config/praetom/auth.json.
15
+ *
16
+ * Replaces the old paste-token flow. To go back to manual paste, set
17
+ * PRAETOM_TOKEN in the environment before calling other commands —
18
+ * `praetom login` is purely for the device-flow path.
19
+ */
20
+ export async function loginCommand(ctx) {
21
+ if (ctx.nonInteractive) {
22
+ const msg = "praetom login: --non-interactive set; can't open a browser. Set PRAETOM_TOKEN in the environment instead.";
23
+ if (ctx.json) {
24
+ process.stdout.write(JSON.stringify({ error: "non_interactive" }) + "\n");
25
+ }
26
+ else {
27
+ process.stderr.write(`${msg}\n`);
28
+ }
29
+ process.exit(2);
30
+ }
31
+ const apiBase = (process.env["PRAETOM_API_BASE"] ?? DEFAULT_API_BASE).replace(/\/+$/, "");
32
+ // Start the handshake.
33
+ const start = await fetchJson(`${apiBase}/api/cli/auth/device-start`, { method: "POST" });
34
+ if (!start.ok) {
35
+ process.stderr.write(`praetom login failed: ${start.error}\n`);
36
+ process.exit(1);
37
+ }
38
+ const session = start.value;
39
+ if (!ctx.json) {
40
+ process.stdout.write(`\nVisit: ${session.verification_uri}\n` +
41
+ `Code: ${session.user_code}\n\n` +
42
+ `Opening your browser...\n`);
43
+ }
44
+ openBrowser(session.verification_uri_complete);
45
+ // Poll until approved or expired.
46
+ const intervalMs = Math.max(1, session.interval) * 1000;
47
+ const deadline = Date.now() + session.expires_in * 1000;
48
+ let lastDot = Date.now();
49
+ while (Date.now() < deadline) {
50
+ await sleep(intervalMs);
51
+ const poll = await fetchJson(`${apiBase}/api/cli/auth/device-poll`, {
52
+ method: "POST",
53
+ body: JSON.stringify({ device_code: session.device_code }),
54
+ contentType: "application/json",
55
+ });
56
+ if (!poll.ok) {
57
+ process.stderr.write(`\npraetom login failed: ${poll.error}\n`);
58
+ process.exit(1);
59
+ }
60
+ const r = poll.value;
61
+ if (r.status === "approved") {
62
+ await writeAuth(r.token, apiBase);
63
+ if (ctx.json) {
64
+ process.stdout.write(JSON.stringify({ signedIn: true, prefix: r.prefix }) + "\n");
65
+ }
66
+ else {
67
+ process.stdout.write(`\nSigned in. Token (prefix ${r.prefix}…) saved to ~/.config/praetom/auth.json.\n`);
68
+ }
69
+ return;
70
+ }
71
+ if (r.status === "expired") {
72
+ process.stderr.write("\nCode expired before approval. Run `praetom login` again.\n");
73
+ process.exit(1);
74
+ }
75
+ if (r.status === "consumed") {
76
+ process.stderr.write("\nThis code was already approved and the token was claimed by another `praetom login`. Run `praetom login` again.\n");
77
+ process.exit(1);
78
+ }
79
+ if (r.status === "error") {
80
+ process.stderr.write(`\npraetom login failed: ${r.error}\n`);
81
+ process.exit(1);
82
+ }
83
+ // status === "pending" — print a dot every 5s so the user knows
84
+ // we're still waiting.
85
+ if (!ctx.json && Date.now() - lastDot > 5000) {
86
+ process.stdout.write(".");
87
+ lastDot = Date.now();
88
+ }
89
+ }
90
+ process.stderr.write("\nTimed out waiting for approval. Run `praetom login` again.\n");
91
+ process.exit(1);
92
+ }
93
+ async function fetchJson(url, init = {}) {
94
+ const headers = {
95
+ Accept: "application/json",
96
+ "User-Agent": "praetom-cli",
97
+ };
98
+ if (init.contentType)
99
+ headers["Content-Type"] = init.contentType;
100
+ let res;
101
+ try {
102
+ res = await fetch(url, {
103
+ method: init.method ?? "GET",
104
+ headers,
105
+ body: init.body,
106
+ });
107
+ }
108
+ catch (e) {
109
+ return { ok: false, error: `network error: ${e.message}` };
110
+ }
111
+ const text = await res.text().catch(() => "");
112
+ if (!res.ok) {
113
+ return {
114
+ ok: false,
115
+ error: `${url} → ${res.status}: ${text.slice(0, 200)}`,
116
+ };
117
+ }
118
+ try {
119
+ return { ok: true, value: JSON.parse(text) };
120
+ }
121
+ catch {
122
+ return { ok: false, error: `non-JSON response from ${url}` };
123
+ }
124
+ }
125
+ function openBrowser(url) {
126
+ const platform = process.platform;
127
+ const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
128
+ try {
129
+ spawn(cmd, [url], { stdio: "ignore", detached: true }).unref();
130
+ }
131
+ catch {
132
+ // Ignore — the URL is already printed for the user to copy.
133
+ }
134
+ }
135
+ function sleep(ms) {
136
+ return new Promise((r) => setTimeout(r, ms));
137
+ }
138
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function logoutCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAalE"}
@@ -0,0 +1,15 @@
1
+ import { deleteAuth, authFilePath } from "../util/auth-file.js";
2
+ export async function logoutCommand(ctx) {
3
+ const removed = await deleteAuth();
4
+ if (ctx.json) {
5
+ process.stdout.write(JSON.stringify({ removed, path: authFilePath() }) + "\n");
6
+ return;
7
+ }
8
+ if (removed) {
9
+ process.stdout.write(`Removed ${authFilePath()}\n`);
10
+ }
11
+ else {
12
+ process.stdout.write(`No auth file at ${authFilePath()}\n`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,GAAG,IAAI,CACzD,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,YAAY,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function rotateCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=rotate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rotate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYjD,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiClE"}
@@ -0,0 +1,33 @@
1
+ import { apiRequest, workspaceQuery } from "../util/api.js";
2
+ import { resolveRepo } from "../util/git.js";
3
+ export async function rotateCommand(ctx) {
4
+ const repo = await resolveRepo(ctx.repo);
5
+ if (!repo) {
6
+ fail(ctx, "Couldn't determine the repository. Pass --repo owner/name, or run this from inside a git checkout with a GitHub remote.");
7
+ }
8
+ if (!ctx.json) {
9
+ process.stdout.write(`Rotating ingest token for ${repo.owner}/${repo.name}…\n`);
10
+ }
11
+ const result = await apiRequest("/api/cli/rotate", {
12
+ method: "POST",
13
+ body: { owner: repo.owner, name: repo.name },
14
+ query: workspaceQuery(ctx),
15
+ });
16
+ if (ctx.json) {
17
+ process.stdout.write(JSON.stringify({ repo: `${repo.owner}/${repo.name}`, ...result }) + "\n");
18
+ return;
19
+ }
20
+ process.stdout.write(`\nIngest token rotated. ${result.filesCommitted} file(s) updated.\n` +
21
+ `Pull request opened: ${result.prUrl}\n\n` +
22
+ `Merge and deploy to swap the token live. \`praetom status\` will reflect it.\n`);
23
+ }
24
+ function fail(ctx, message) {
25
+ if (ctx.json) {
26
+ process.stdout.write(JSON.stringify({ ok: false, error: message }) + "\n");
27
+ }
28
+ else {
29
+ process.stderr.write(`${message}\n`);
30
+ }
31
+ process.exit(1);
32
+ }
33
+ //# sourceMappingURL=rotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../../src/cli/commands/rotate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CACF,GAAG,EACH,yHAAyH,CAC1H,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,IAAK,CAAC,KAAK,IAAI,IAAK,CAAC,IAAI,KAAK,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,iBAAiB,EAAE;QACjE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,IAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAK,CAAC,IAAI,EAAE;QAC9C,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,IAAK,CAAC,KAAK,IAAI,IAAK,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,MAAM,CAAC,cAAc,qBAAqB;QACnE,wBAAwB,MAAM,CAAC,KAAK,MAAM;QAC1C,gFAAgF,CACnF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,GAAe,EAAE,OAAe;IAC5C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function statusCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAyBjD,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
@@ -0,0 +1,54 @@
1
+ import { apiRequest, workspaceQuery } from "../util/api.js";
2
+ import { resolveRepo } from "../util/git.js";
3
+ export async function statusCommand(ctx) {
4
+ const repo = await resolveRepo(ctx.repo);
5
+ const query = {
6
+ ...workspaceQuery(ctx),
7
+ };
8
+ if (repo)
9
+ query.repo = `${repo.owner}/${repo.name}`;
10
+ const res = await apiRequest("/api/cli/installs", { query });
11
+ if (ctx.json) {
12
+ process.stdout.write(JSON.stringify(res) + "\n");
13
+ return;
14
+ }
15
+ if (res.installs.length === 0) {
16
+ const scope = repo ? `${repo.owner}/${repo.name}` : res.workspaceSlug;
17
+ process.stdout.write(`No installs recorded for ${scope}.\n`);
18
+ return;
19
+ }
20
+ for (const row of res.installs) {
21
+ process.stdout.write(`${row.owner}/${row.name} ${pad(row.status, 10)} PR #${row.prNumber} ${row.framework}\n` +
22
+ ` ${row.prUrl}\n` +
23
+ ` ${describeTimeline(row)}\n\n`);
24
+ }
25
+ }
26
+ function describeTimeline(row) {
27
+ const parts = [`opened ${fmt(row.openedAt)}`];
28
+ if (row.mergedAt)
29
+ parts.push(`merged ${fmt(row.mergedAt)}`);
30
+ if (row.closedUnmergedAt)
31
+ parts.push(`closed ${fmt(row.closedUnmergedAt)}`);
32
+ if (row.lastPingAt)
33
+ parts.push(`last ping ${fmt(row.lastPingAt)}`);
34
+ if (row.firstSpanAt)
35
+ parts.push(`first span ${fmt(row.firstSpanAt)}`);
36
+ return parts.join(" · ");
37
+ }
38
+ function fmt(iso) {
39
+ if (!iso)
40
+ return "—";
41
+ const d = new Date(iso);
42
+ if (Number.isNaN(d.getTime()))
43
+ return iso;
44
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
45
+ const dd = String(d.getDate()).padStart(2, "0");
46
+ const yyyy = d.getFullYear();
47
+ const hh = String(d.getHours()).padStart(2, "0");
48
+ const min = String(d.getMinutes()).padStart(2, "0");
49
+ return `${mm}/${dd}/${yyyy} ${hh}:${min}`;
50
+ }
51
+ function pad(s, n) {
52
+ return s.length >= n ? s : s + " ".repeat(n - s.length);
53
+ }
54
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function uninstallCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiErE"}
@@ -0,0 +1,63 @@
1
+ import { apiRequest, NotAuthenticatedError, workspaceQuery } from "../util/api.js";
2
+ import { resolveRepo } from "../util/git.js";
3
+ export async function uninstallCommand(ctx) {
4
+ const repo = await resolveRepo(ctx.repo);
5
+ if (!repo) {
6
+ fail(ctx, "Couldn't determine the repository. Pass --repo owner/name, or run this from inside a git checkout with a GitHub remote.");
7
+ }
8
+ if (!ctx.json) {
9
+ process.stdout.write(`Uninstalling praetom from ${repo.owner}/${repo.name}…\n`);
10
+ }
11
+ let result;
12
+ try {
13
+ result = await apiRequest("/api/cli/uninstall", {
14
+ method: "POST",
15
+ body: { owner: repo.owner, name: repo.name },
16
+ query: workspaceQuery(ctx),
17
+ });
18
+ }
19
+ catch (e) {
20
+ if (e instanceof NotAuthenticatedError) {
21
+ fail(ctx, e.message);
22
+ }
23
+ throw e;
24
+ }
25
+ if (ctx.json) {
26
+ process.stdout.write(JSON.stringify({ repo: `${repo.owner}/${repo.name}`, ...result }) + "\n");
27
+ return;
28
+ }
29
+ const lines = ["", `Pull request opened: ${result.prUrl}`, ""];
30
+ if (result.filesDeleted.length > 0) {
31
+ lines.push(`Deleted ${result.filesDeleted.length} file(s):`);
32
+ for (const p of result.filesDeleted)
33
+ lines.push(` - ${p}`);
34
+ }
35
+ if (result.filesEdited.length > 0) {
36
+ lines.push(`Edited ${result.filesEdited.length} file(s) (stripped @praetom/* entries):`);
37
+ for (const p of result.filesEdited)
38
+ lines.push(` - ${p}`);
39
+ }
40
+ if (result.filesSkipped.length > 0) {
41
+ lines.push("");
42
+ lines.push("Needs manual cleanup — these files were modified rather than added by install, so safe-revert isn't possible:");
43
+ for (const p of result.filesSkipped)
44
+ lines.push(` - ${p}`);
45
+ }
46
+ lines.push("");
47
+ lines.push(result.tokenRevoked
48
+ ? "Per-repository ingest token revoked on praetom's side."
49
+ : "No active ingest token to revoke (already revoked, or never issued).");
50
+ lines.push("");
51
+ lines.push("Merge and deploy to stop reporting telemetry from this repository.");
52
+ process.stdout.write(lines.join("\n") + "\n");
53
+ }
54
+ function fail(ctx, message) {
55
+ if (ctx.json) {
56
+ process.stdout.write(JSON.stringify({ ok: false, error: message }) + "\n");
57
+ }
58
+ else {
59
+ process.stderr.write(`${message}\n`);
60
+ }
61
+ process.exit(1);
62
+ }
63
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function usageCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAajD,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjE"}
@@ -0,0 +1,19 @@
1
+ import { apiRequest, workspaceQuery } from "../util/api.js";
2
+ export async function usageCommand(ctx) {
3
+ const res = await apiRequest("/api/cli/usage", {
4
+ query: workspaceQuery(ctx),
5
+ });
6
+ if (ctx.json) {
7
+ process.stdout.write(JSON.stringify(res) + "\n");
8
+ return;
9
+ }
10
+ process.stdout.write(`Usage — ${res.workspaceSlug}\n` +
11
+ `${"─".repeat(40)}\n` +
12
+ `features ${res.features}\n` +
13
+ `repositories ${res.repositories}\n` +
14
+ `installs ${res.installs}\n` +
15
+ ` live ${res.liveInstalls}\n` +
16
+ `ingest tokens ${res.ingestTokens}\n` +
17
+ `spans (30d) ${res.spans30d ?? "—"}\n`);
18
+ }
19
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/cli/commands/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAY5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAe;IAChD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAgB,gBAAgB,EAAE;QAC5D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,GAAG,CAAC,aAAa,IAAI;QAC9B,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;QACrB,oBAAoB,GAAG,CAAC,QAAQ,IAAI;QACpC,oBAAoB,GAAG,CAAC,YAAY,IAAI;QACxC,oBAAoB,GAAG,CAAC,QAAQ,IAAI;QACpC,oBAAoB,GAAG,CAAC,YAAY,IAAI;QACxC,oBAAoB,GAAG,CAAC,YAAY,IAAI;QACxC,oBAAoB,GAAG,CAAC,QAAQ,IAAI,GAAG,IAAI,CAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunContext } from "../util/run.js";
2
+ export declare function whoamiCommand(ctx: RunContext): Promise<void>;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAoBjD,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuClE"}
@@ -0,0 +1,37 @@
1
+ import { apiRequest, NotAuthenticatedError } from "../util/api.js";
2
+ export async function whoamiCommand(ctx) {
3
+ let me;
4
+ try {
5
+ me = await apiRequest("/api/cli/me");
6
+ }
7
+ catch (e) {
8
+ if (e instanceof NotAuthenticatedError) {
9
+ if (ctx.json) {
10
+ process.stdout.write(JSON.stringify({ authenticated: false }) + "\n");
11
+ }
12
+ else {
13
+ process.stderr.write(`${e.message}\n`);
14
+ }
15
+ process.exit(1);
16
+ }
17
+ throw e;
18
+ }
19
+ if (ctx.json) {
20
+ process.stdout.write(JSON.stringify({ authenticated: true, ...me }) + "\n");
21
+ return;
22
+ }
23
+ if (me.kind === "user") {
24
+ process.stdout.write(`user ${me.userId}\n` +
25
+ `scope ${me.scope}\n` +
26
+ `auth ${me.authMode}\n` +
27
+ `\nThis token is user-scoped. Workspace-specific commands (init, ` +
28
+ `status, features, rotate) need a workspace-scoped token until ` +
29
+ `--workspace selection lands on the server.\n`);
30
+ return;
31
+ }
32
+ process.stdout.write(`workspace ${me.workspaceName} (${me.workspaceSlug})\n` +
33
+ `scope ${me.scope}\n` +
34
+ `auth ${me.authMode}\n` +
35
+ (me.repoSlug ? `repo ${me.repoSlug}\n` : ""));
36
+ }
37
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAmBnE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,IAAI,EAAc,CAAC;IACnB,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,UAAU,CAAa,aAAa,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,EAAE,CAAC,MAAM,IAAI;YACzB,cAAc,EAAE,CAAC,KAAK,IAAI;YAC1B,cAAc,EAAE,CAAC,QAAQ,IAAI;YAC7B,kEAAkE;YAClE,gEAAgE;YAChE,8CAA8C,CACjD,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,EAAE,CAAC,aAAa,KAAK,EAAE,CAAC,aAAa,KAAK;QACtD,cAAc,EAAE,CAAC,KAAK,IAAI;QAC1B,cAAc,EAAE,CAAC,QAAQ,IAAI;QAC7B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Detect whether the CLI is being invoked by a known AI coding agent.
3
+ * When an agent is detected, the CLI flips into machine-friendly defaults
4
+ * (--json output, --non-interactive prompts) so the agent can parse the
5
+ * output and never gets stuck on an interactive prompt.
6
+ *
7
+ * Adding a new agent: read its environment-variable conventions from its
8
+ * docs and append a new entry. The detection is intentionally loose — the
9
+ * presence of the env var is enough; we don't try to verify it.
10
+ */
11
+ export type AgentId = "claude-code" | "cursor" | "codex" | "windsurf" | "aider" | "continue";
12
+ export declare function detectAgent(): AgentId | null;
13
+ //# sourceMappingURL=agent-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-env.d.ts","sourceRoot":"","sources":["../../../src/cli/util/agent-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,OAAO,GACf,aAAa,GACb,QAAQ,GACR,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,CAAC;AAgBf,wBAAgB,WAAW,IAAI,OAAO,GAAG,IAAI,CAO5C"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Detect whether the CLI is being invoked by a known AI coding agent.
3
+ * When an agent is detected, the CLI flips into machine-friendly defaults
4
+ * (--json output, --non-interactive prompts) so the agent can parse the
5
+ * output and never gets stuck on an interactive prompt.
6
+ *
7
+ * Adding a new agent: read its environment-variable conventions from its
8
+ * docs and append a new entry. The detection is intentionally loose — the
9
+ * presence of the env var is enough; we don't try to verify it.
10
+ */
11
+ const SIGNATURES = [
12
+ { id: "claude-code", envVars: ["CLAUDECODE", "CLAUDE_CODE_ENTRYPOINT"] },
13
+ { id: "cursor", envVars: ["CURSOR_TRACE_ID", "CURSOR_SESSION_ID"] },
14
+ { id: "codex", envVars: ["CODEX_SESSION_ID", "OPENAI_CODEX"] },
15
+ { id: "windsurf", envVars: ["WINDSURF_SESSION_ID"] },
16
+ { id: "aider", envVars: ["AIDER_SESSION"] },
17
+ { id: "continue", envVars: ["CONTINUE_SESSION_ID"] },
18
+ ];
19
+ export function detectAgent() {
20
+ for (const sig of SIGNATURES) {
21
+ for (const v of sig.envVars) {
22
+ if (process.env[v])
23
+ return sig.id;
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ //# sourceMappingURL=agent-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-env.js","sourceRoot":"","sources":["../../../src/cli/util/agent-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,MAAM,UAAU,GAAqB;IACnC,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,wBAAwB,CAAC,EAAE;IACxE,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,EAAE;IACnE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE;IAC9D,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE;IACpD,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE;IAC3C,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE;CACrD,CAAC;AAEF,MAAM,UAAU,WAAW;IACzB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * HTTP client for the praetom API. Wraps fetch with the Bearer header and
3
+ * normalizes errors into shapes commands can branch on.
4
+ */
5
+ import { type AuthState } from "./auth-file.js";
6
+ export declare class ApiError extends Error {
7
+ status: number;
8
+ body: string;
9
+ constructor(status: number, body: string, message?: string);
10
+ }
11
+ export declare class NotAuthenticatedError extends Error {
12
+ constructor();
13
+ }
14
+ export declare function requireAuth(): Promise<AuthState>;
15
+ interface RequestOptions {
16
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
17
+ body?: unknown;
18
+ /** Query-string parameters merged into the request URL. Undefined values are skipped. */
19
+ query?: Record<string, string | undefined>;
20
+ /** Override the API base for this request only. */
21
+ apiBase?: string;
22
+ /** Skip the Bearer header (for unauthenticated endpoints). */
23
+ unauthenticated?: boolean;
24
+ }
25
+ export declare function apiRequest<T>(path: string, opts?: RequestOptions): Promise<T>;
26
+ /**
27
+ * Build the standard query bag every workspace-scoped command sends:
28
+ * just `workspace` when `--workspace <slug>` was passed. Returns
29
+ * `undefined` when there's nothing to send so callers don't pollute the
30
+ * URL with empty query strings.
31
+ */
32
+ export declare function workspaceQuery(ctx: {
33
+ workspace: string | undefined;
34
+ }): Record<string, string | undefined> | undefined;
35
+ export {};
36
+ //# sourceMappingURL=api.d.ts.map