@dharta/cli 0.6.77

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -0
  3. package/dist/agent.d.ts +17 -0
  4. package/dist/agent.js +134 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/api-error.d.ts +3 -0
  7. package/dist/api-error.js +80 -0
  8. package/dist/api-error.js.map +1 -0
  9. package/dist/browser.d.ts +1 -0
  10. package/dist/browser.js +19 -0
  11. package/dist/browser.js.map +1 -0
  12. package/dist/cli.d.ts +5 -0
  13. package/dist/cli.js +1978 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/agents.d.ts +131 -0
  16. package/dist/commands/agents.js +439 -0
  17. package/dist/commands/agents.js.map +1 -0
  18. package/dist/commands/analytics.d.ts +25 -0
  19. package/dist/commands/analytics.js +166 -0
  20. package/dist/commands/analytics.js.map +1 -0
  21. package/dist/commands/api.d.ts +19 -0
  22. package/dist/commands/api.js +278 -0
  23. package/dist/commands/api.js.map +1 -0
  24. package/dist/commands/appearance.d.ts +19 -0
  25. package/dist/commands/appearance.js +63 -0
  26. package/dist/commands/appearance.js.map +1 -0
  27. package/dist/commands/artifact.d.ts +33 -0
  28. package/dist/commands/artifact.js +235 -0
  29. package/dist/commands/artifact.js.map +1 -0
  30. package/dist/commands/audit-log.d.ts +32 -0
  31. package/dist/commands/audit-log.js +102 -0
  32. package/dist/commands/audit-log.js.map +1 -0
  33. package/dist/commands/auth.d.ts +47 -0
  34. package/dist/commands/auth.js +117 -0
  35. package/dist/commands/auth.js.map +1 -0
  36. package/dist/commands/caps.d.ts +82 -0
  37. package/dist/commands/caps.js +213 -0
  38. package/dist/commands/caps.js.map +1 -0
  39. package/dist/commands/create.d.ts +22 -0
  40. package/dist/commands/create.js +76 -0
  41. package/dist/commands/create.js.map +1 -0
  42. package/dist/commands/deploy.d.ts +45 -0
  43. package/dist/commands/deploy.js +892 -0
  44. package/dist/commands/deploy.js.map +1 -0
  45. package/dist/commands/dev.d.ts +33 -0
  46. package/dist/commands/dev.js +655 -0
  47. package/dist/commands/dev.js.map +1 -0
  48. package/dist/commands/directories.d.ts +60 -0
  49. package/dist/commands/directories.js +83 -0
  50. package/dist/commands/directories.js.map +1 -0
  51. package/dist/commands/doctor.d.ts +13 -0
  52. package/dist/commands/doctor.js +123 -0
  53. package/dist/commands/doctor.js.map +1 -0
  54. package/dist/commands/embed-keys.d.ts +61 -0
  55. package/dist/commands/embed-keys.js +165 -0
  56. package/dist/commands/embed-keys.js.map +1 -0
  57. package/dist/commands/env.d.ts +59 -0
  58. package/dist/commands/env.js +300 -0
  59. package/dist/commands/env.js.map +1 -0
  60. package/dist/commands/files.d.ts +14 -0
  61. package/dist/commands/files.js +84 -0
  62. package/dist/commands/files.js.map +1 -0
  63. package/dist/commands/git-credential.d.ts +1 -0
  64. package/dist/commands/git-credential.js +70 -0
  65. package/dist/commands/git-credential.js.map +1 -0
  66. package/dist/commands/kartas.d.ts +101 -0
  67. package/dist/commands/kartas.js +289 -0
  68. package/dist/commands/kartas.js.map +1 -0
  69. package/dist/commands/keys.d.ts +33 -0
  70. package/dist/commands/keys.js +141 -0
  71. package/dist/commands/keys.js.map +1 -0
  72. package/dist/commands/login.d.ts +22 -0
  73. package/dist/commands/login.js +78 -0
  74. package/dist/commands/login.js.map +1 -0
  75. package/dist/commands/logs.d.ts +14 -0
  76. package/dist/commands/logs.js +89 -0
  77. package/dist/commands/logs.js.map +1 -0
  78. package/dist/commands/members.d.ts +32 -0
  79. package/dist/commands/members.js +77 -0
  80. package/dist/commands/members.js.map +1 -0
  81. package/dist/commands/model-keys.d.ts +22 -0
  82. package/dist/commands/model-keys.js +222 -0
  83. package/dist/commands/model-keys.js.map +1 -0
  84. package/dist/commands/open.d.ts +29 -0
  85. package/dist/commands/open.js +119 -0
  86. package/dist/commands/open.js.map +1 -0
  87. package/dist/commands/parity.d.ts +15 -0
  88. package/dist/commands/parity.js +73 -0
  89. package/dist/commands/parity.js.map +1 -0
  90. package/dist/commands/rollback.d.ts +21 -0
  91. package/dist/commands/rollback.js +26 -0
  92. package/dist/commands/rollback.js.map +1 -0
  93. package/dist/commands/schedules.d.ts +52 -0
  94. package/dist/commands/schedules.js +231 -0
  95. package/dist/commands/schedules.js.map +1 -0
  96. package/dist/commands/scopes.d.ts +3 -0
  97. package/dist/commands/scopes.js +21 -0
  98. package/dist/commands/scopes.js.map +1 -0
  99. package/dist/commands/sessions.d.ts +53 -0
  100. package/dist/commands/sessions.js +142 -0
  101. package/dist/commands/sessions.js.map +1 -0
  102. package/dist/commands/setup.d.ts +28 -0
  103. package/dist/commands/setup.js +949 -0
  104. package/dist/commands/setup.js.map +1 -0
  105. package/dist/commands/status.d.ts +19 -0
  106. package/dist/commands/status.js +63 -0
  107. package/dist/commands/status.js.map +1 -0
  108. package/dist/commands/update.d.ts +14 -0
  109. package/dist/commands/update.js +120 -0
  110. package/dist/commands/update.js.map +1 -0
  111. package/dist/commands/usage.d.ts +3 -0
  112. package/dist/commands/usage.js +37 -0
  113. package/dist/commands/usage.js.map +1 -0
  114. package/dist/commands/webhooks.d.ts +47 -0
  115. package/dist/commands/webhooks.js +156 -0
  116. package/dist/commands/webhooks.js.map +1 -0
  117. package/dist/commands/whoami.d.ts +7 -0
  118. package/dist/commands/whoami.js +17 -0
  119. package/dist/commands/whoami.js.map +1 -0
  120. package/dist/completions.d.ts +13 -0
  121. package/dist/completions.js +120 -0
  122. package/dist/completions.js.map +1 -0
  123. package/dist/config.d.ts +20 -0
  124. package/dist/config.js +98 -0
  125. package/dist/config.js.map +1 -0
  126. package/dist/context.d.ts +14 -0
  127. package/dist/context.js +38 -0
  128. package/dist/context.js.map +1 -0
  129. package/dist/device-flow.d.ts +9 -0
  130. package/dist/device-flow.js +127 -0
  131. package/dist/device-flow.js.map +1 -0
  132. package/dist/harness-preflight.d.ts +24 -0
  133. package/dist/harness-preflight.js +252 -0
  134. package/dist/harness-preflight.js.map +1 -0
  135. package/dist/harnesses.d.ts +11 -0
  136. package/dist/harnesses.js +112 -0
  137. package/dist/harnesses.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.js +3 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/login-offer.d.ts +9 -0
  142. package/dist/login-offer.js +36 -0
  143. package/dist/login-offer.js.map +1 -0
  144. package/dist/manifest.d.ts +15 -0
  145. package/dist/manifest.js +142 -0
  146. package/dist/manifest.js.map +1 -0
  147. package/dist/money.d.ts +1 -0
  148. package/dist/money.js +16 -0
  149. package/dist/money.js.map +1 -0
  150. package/dist/output.d.ts +2 -0
  151. package/dist/output.js +20 -0
  152. package/dist/output.js.map +1 -0
  153. package/dist/runtime.d.ts +19 -0
  154. package/dist/runtime.js +95 -0
  155. package/dist/runtime.js.map +1 -0
  156. package/dist/scaffold.d.ts +16 -0
  157. package/dist/scaffold.js +74 -0
  158. package/dist/scaffold.js.map +1 -0
  159. package/dist/setup-scan.d.ts +21 -0
  160. package/dist/setup-scan.js +127 -0
  161. package/dist/setup-scan.js.map +1 -0
  162. package/dist/templates.d.ts +14 -0
  163. package/dist/templates.js +65 -0
  164. package/dist/templates.js.map +1 -0
  165. package/dist/validators.d.ts +10 -0
  166. package/dist/validators.js +116 -0
  167. package/dist/validators.js.map +1 -0
  168. package/dist/version-check.d.ts +25 -0
  169. package/dist/version-check.js +68 -0
  170. package/dist/version-check.js.map +1 -0
  171. package/node_modules/@dharta/sdk/LICENSE +21 -0
  172. package/node_modules/@dharta/sdk/README.md +87 -0
  173. package/node_modules/@dharta/sdk/dist/errors.d.ts +20 -0
  174. package/node_modules/@dharta/sdk/dist/errors.d.ts.map +1 -0
  175. package/node_modules/@dharta/sdk/dist/errors.js +51 -0
  176. package/node_modules/@dharta/sdk/dist/errors.js.map +1 -0
  177. package/node_modules/@dharta/sdk/dist/http.d.ts +26 -0
  178. package/node_modules/@dharta/sdk/dist/http.d.ts.map +1 -0
  179. package/node_modules/@dharta/sdk/dist/http.js +136 -0
  180. package/node_modules/@dharta/sdk/dist/http.js.map +1 -0
  181. package/node_modules/@dharta/sdk/dist/index.d.ts +15 -0
  182. package/node_modules/@dharta/sdk/dist/index.d.ts.map +1 -0
  183. package/node_modules/@dharta/sdk/dist/index.js +21 -0
  184. package/node_modules/@dharta/sdk/dist/index.js.map +1 -0
  185. package/node_modules/@dharta/sdk/dist/resources.d.ts +48 -0
  186. package/node_modules/@dharta/sdk/dist/resources.d.ts.map +1 -0
  187. package/node_modules/@dharta/sdk/dist/resources.js +150 -0
  188. package/node_modules/@dharta/sdk/dist/resources.js.map +1 -0
  189. package/node_modules/@dharta/sdk/dist/types.d.ts +94 -0
  190. package/node_modules/@dharta/sdk/dist/types.d.ts.map +1 -0
  191. package/node_modules/@dharta/sdk/dist/types.js +59 -0
  192. package/node_modules/@dharta/sdk/dist/types.js.map +1 -0
  193. package/node_modules/@dharta/sdk/package.json +32 -0
  194. package/node_modules/@dharta/sdk/src/errors.ts +58 -0
  195. package/node_modules/@dharta/sdk/src/http.ts +166 -0
  196. package/node_modules/@dharta/sdk/src/index.ts +36 -0
  197. package/node_modules/@dharta/sdk/src/resources.ts +197 -0
  198. package/node_modules/@dharta/sdk/src/types.ts +179 -0
  199. package/package.json +38 -0
  200. package/src/agent.ts +147 -0
  201. package/src/api-error.ts +88 -0
  202. package/src/browser.ts +20 -0
  203. package/src/cli.ts +2339 -0
  204. package/src/commands/agents.ts +635 -0
  205. package/src/commands/analytics.ts +181 -0
  206. package/src/commands/api.ts +297 -0
  207. package/src/commands/appearance.ts +79 -0
  208. package/src/commands/artifact.ts +331 -0
  209. package/src/commands/audit-log.ts +125 -0
  210. package/src/commands/auth.ts +186 -0
  211. package/src/commands/caps.ts +302 -0
  212. package/src/commands/create.ts +114 -0
  213. package/src/commands/deploy.ts +1122 -0
  214. package/src/commands/dev.ts +792 -0
  215. package/src/commands/directories.ts +136 -0
  216. package/src/commands/doctor.ts +138 -0
  217. package/src/commands/embed-keys.ts +237 -0
  218. package/src/commands/env.ts +369 -0
  219. package/src/commands/files.ts +124 -0
  220. package/src/commands/git-credential.ts +78 -0
  221. package/src/commands/kartas.ts +439 -0
  222. package/src/commands/keys.ts +206 -0
  223. package/src/commands/login.ts +115 -0
  224. package/src/commands/logs.ts +111 -0
  225. package/src/commands/members.ts +109 -0
  226. package/src/commands/model-keys.ts +278 -0
  227. package/src/commands/open.ts +173 -0
  228. package/src/commands/parity.ts +96 -0
  229. package/src/commands/rollback.ts +45 -0
  230. package/src/commands/schedules.ts +290 -0
  231. package/src/commands/scopes.ts +22 -0
  232. package/src/commands/sessions.ts +225 -0
  233. package/src/commands/setup.ts +1176 -0
  234. package/src/commands/status.ts +94 -0
  235. package/src/commands/update.ts +157 -0
  236. package/src/commands/usage.ts +41 -0
  237. package/src/commands/webhooks.ts +200 -0
  238. package/src/commands/whoami.ts +24 -0
  239. package/src/completions.ts +168 -0
  240. package/src/config.ts +143 -0
  241. package/src/context.ts +59 -0
  242. package/src/device-flow.ts +174 -0
  243. package/src/harness-preflight.ts +293 -0
  244. package/src/harnesses.ts +117 -0
  245. package/src/index.ts +3 -0
  246. package/src/login-offer.ts +49 -0
  247. package/src/manifest.ts +153 -0
  248. package/src/money.ts +15 -0
  249. package/src/output.ts +22 -0
  250. package/src/runtime.ts +127 -0
  251. package/src/scaffold.ts +102 -0
  252. package/src/setup-scan.ts +154 -0
  253. package/src/templates.ts +85 -0
  254. package/src/validators.ts +124 -0
  255. package/src/version-check.ts +75 -0
  256. package/templates/blank/CLAUDE.md +21 -0
  257. package/templates/blank/dharta.toml +11 -0
  258. package/templates/faq-agent/CLAUDE.md +51 -0
  259. package/templates/faq-agent/dharta.toml +11 -0
@@ -0,0 +1,89 @@
1
+ import { cliFormatRawError } from "../api-error.js";
2
+ import { validateAgentSlug } from "../agent.js";
3
+ import { normalizeIsoTimestamp, validateIsoTimestamp } from "../validators.js";
4
+ export function validateLogsOptions(opts) {
5
+ if (opts.since !== undefined)
6
+ validateIsoTimestamp(opts.since, "--since");
7
+ }
8
+ // Streams or polls the agent's logs. SSE-first: if the server
9
+ // answers with `Content-Type: text/event-stream`, we parse the stream;
10
+ // otherwise we fall through to JSON polling with `since=`.
11
+ //
12
+ // Output is written line-by-line to `write` so the CLI can stream
13
+ // directly to stdout and tests can capture the sequence.
14
+ export async function logsTail(ctx, slug, opts, write) {
15
+ const normalizedSlug = validateAgentSlug(slug, "agent slug");
16
+ const base = `/api/agents/${encodeURIComponent(normalizedSlug)}/logs`;
17
+ const initialSince = opts.since === undefined ? undefined : normalizeIsoTimestamp(opts.since, "--since");
18
+ let emitted = 0;
19
+ const emit = (line) => {
20
+ emitted += 1;
21
+ write(formatLine(line));
22
+ };
23
+ if (opts.tail) {
24
+ const res = await ctx.http.raw(`${base}?tail=1`, {
25
+ headers: { Accept: "text/event-stream" },
26
+ });
27
+ if (!res.ok)
28
+ throw await cliFormatRawError(res);
29
+ const ctype = res.headers.get("content-type") ?? "";
30
+ if (ctype.includes("text/event-stream") && res.body) {
31
+ await consumeSse(res.body, emit);
32
+ return emitted;
33
+ }
34
+ // Fall through to polling if server didn't accept SSE.
35
+ }
36
+ let since = initialSince ?? new Date(Date.now() - 60_000).toISOString();
37
+ const maxIter = opts.maxIterations ?? Infinity;
38
+ for (let i = 0; i < maxIter; i++) {
39
+ const url = `${base}?since=${encodeURIComponent(since)}`;
40
+ const res = await ctx.http.request({
41
+ path: url,
42
+ });
43
+ for (const line of res.data)
44
+ emit(line);
45
+ if (res.next_since)
46
+ since = res.next_since;
47
+ if (!opts.tail)
48
+ return emitted; // single shot for `--since` without `--tail`
49
+ await sleep(opts.pollIntervalMs ?? 2000);
50
+ }
51
+ return emitted;
52
+ }
53
+ function formatLine(line) {
54
+ const level = line.level ? `[${line.level}] ` : "";
55
+ return `${line.ts} ${level}${line.message}`;
56
+ }
57
+ async function consumeSse(body, emit) {
58
+ const reader = body.getReader();
59
+ const decoder = new TextDecoder();
60
+ let buf = "";
61
+ for (;;) {
62
+ const { value, done } = await reader.read();
63
+ if (done)
64
+ break;
65
+ buf += decoder.decode(value, { stream: true });
66
+ let idx;
67
+ while ((idx = buf.indexOf("\n\n")) >= 0) {
68
+ const block = buf.slice(0, idx);
69
+ buf = buf.slice(idx + 2);
70
+ const dataLine = block
71
+ .split("\n")
72
+ .filter((l) => l.startsWith("data:"))
73
+ .map((l) => l.slice(5).trim())
74
+ .join("\n");
75
+ if (!dataLine)
76
+ continue;
77
+ try {
78
+ emit(JSON.parse(dataLine));
79
+ }
80
+ catch {
81
+ emit({ ts: new Date().toISOString(), message: dataLine });
82
+ }
83
+ }
84
+ }
85
+ }
86
+ function sleep(ms) {
87
+ return new Promise((r) => setTimeout(r, ms));
88
+ }
89
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { CliContext } from "../context.js";
2
+ export interface MemberRow {
3
+ id: number;
4
+ email: string;
5
+ role: string;
6
+ }
7
+ export interface InvitationRow {
8
+ id: number;
9
+ email: string;
10
+ role: string;
11
+ }
12
+ interface MembersEnvelope {
13
+ data: MemberRow[];
14
+ invitations: InvitationRow[];
15
+ }
16
+ export declare function membersListData(ctx: CliContext): Promise<MembersEnvelope>;
17
+ export declare function membersList(ctx: CliContext): Promise<string>;
18
+ export declare function membersInviteData(ctx: CliContext, email: string, role: string): Promise<{
19
+ invitation: InvitationRow;
20
+ }>;
21
+ export declare function membersInvite(ctx: CliContext, email: string, role: string): Promise<string>;
22
+ export declare function validateMembersInviteInput(email: string): void;
23
+ export declare function membersSetRoleData(ctx: CliContext, id: string, role: string): Promise<{
24
+ member: MemberRow;
25
+ }>;
26
+ export declare function membersSetRole(ctx: CliContext, id: string, role: string): Promise<string>;
27
+ export declare function membersRemoveData(ctx: CliContext, id: string): Promise<{
28
+ id: string;
29
+ removed: boolean;
30
+ }>;
31
+ export declare function membersRemove(ctx: CliContext, id: string): Promise<string>;
32
+ export {};
@@ -0,0 +1,77 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { table } from "../output.js";
3
+ import { closestChoice, normalizeNonBlank, parsePositiveInteger } from "../validators.js";
4
+ const MEMBER_ROLES = ["owner", "admin", "developer", "billing", "viewer"];
5
+ export async function membersListData(ctx) {
6
+ return ctx.http.request({ path: "/api/members" });
7
+ }
8
+ export async function membersList(ctx) {
9
+ const res = await membersListData(ctx);
10
+ const members = res.data.length ? table(res.data.map((m) => ({ id: String(m.id), email: m.email, role: m.role }))) : "No members.";
11
+ const invites = res.invitations.length
12
+ ? table(res.invitations.map((i) => ({ id: String(i.id), email: i.email, role: i.role })))
13
+ : "No pending invitations. Invite someone with: dharta members invite <email> --role viewer";
14
+ return `Members\n${members}\n\nInvitations\n${invites}`;
15
+ }
16
+ export async function membersInviteData(ctx, email, role) {
17
+ validateMembersInviteInput(email);
18
+ const normalizedEmail = normalizeEmail(email);
19
+ const normalizedRole = normalizeRole(role);
20
+ return ctx.http.request({
21
+ method: "POST",
22
+ path: "/api/members/invitations",
23
+ body: { email: normalizedEmail, role: normalizedRole },
24
+ headers: { "Idempotency-Key": randomUUID() },
25
+ });
26
+ }
27
+ export async function membersInvite(ctx, email, role) {
28
+ const res = await membersInviteData(ctx, email, role);
29
+ return `Invited ${res.invitation.email} as ${res.invitation.role}.`;
30
+ }
31
+ export function validateMembersInviteInput(email) {
32
+ normalizeEmail(email);
33
+ }
34
+ export async function membersSetRoleData(ctx, id, role) {
35
+ const memberId = parsePositiveInteger(id, "member id");
36
+ const normalizedRole = normalizeRole(role);
37
+ return ctx.http.request({
38
+ method: "PATCH",
39
+ path: `/api/members/${encodeURIComponent(memberId)}`,
40
+ body: { role: normalizedRole },
41
+ headers: { "Idempotency-Key": randomUUID() },
42
+ });
43
+ }
44
+ export async function membersSetRole(ctx, id, role) {
45
+ const res = await membersSetRoleData(ctx, id, role);
46
+ return `${res.member.email} is now ${res.member.role}.`;
47
+ }
48
+ export async function membersRemoveData(ctx, id) {
49
+ const memberId = parsePositiveInteger(id, "member id");
50
+ await ctx.http.request({
51
+ method: "DELETE",
52
+ path: `/api/members/${encodeURIComponent(memberId)}`,
53
+ headers: { "Idempotency-Key": randomUUID() },
54
+ });
55
+ return { id: String(memberId), removed: true };
56
+ }
57
+ export async function membersRemove(ctx, id) {
58
+ const res = await membersRemoveData(ctx, id);
59
+ return `Removed member ${res.id}.`;
60
+ }
61
+ function normalizeEmail(email) {
62
+ const normalized = email.trim();
63
+ if (!normalized) {
64
+ throw new Error("Member email cannot be blank.");
65
+ }
66
+ return normalized;
67
+ }
68
+ function normalizeRole(role) {
69
+ const normalized = normalizeNonBlank(role, "Member role");
70
+ if (MEMBER_ROLES.includes(normalized)) {
71
+ return normalized;
72
+ }
73
+ const suggestion = closestChoice(normalized, MEMBER_ROLES);
74
+ throw new Error(`Unknown member role ${normalized}. Allowed roles: ${MEMBER_ROLES.join(", ")}.` +
75
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
76
+ }
77
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/commands/members.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CliContext } from "../context.js";
2
+ import type { ModelKey, ModelKeyProvider } from "@dharta/sdk";
3
+ export declare const MODEL_API_FORMATS: readonly ["anthropic_messages", "openai_chat_completions", "openai_responses", "bedrock_converse", "vertex_generate_content"];
4
+ export interface ModelKeyCreateOptions {
5
+ key?: string;
6
+ keyStdin?: boolean;
7
+ authType?: string;
8
+ endpointUrl?: string;
9
+ apiFormat?: string;
10
+ }
11
+ export declare function modelKeysListData(ctx: CliContext): Promise<ModelKey[]>;
12
+ export declare function modelKeysList(ctx: CliContext): Promise<string>;
13
+ export declare function modelKeysCreateData(ctx: CliContext, provider: ModelKeyProvider, name: string, opts?: ModelKeyCreateOptions): Promise<ModelKey>;
14
+ export declare function modelKeysCreate(ctx: CliContext, provider: ModelKeyProvider, name: string, opts?: ModelKeyCreateOptions): Promise<string>;
15
+ export declare function validateModelKeysCreateOptions(provider: ModelKeyProvider, name: string, opts?: ModelKeyCreateOptions): void;
16
+ export declare function prepareModelKeysCreateOptions(provider: ModelKeyProvider, name: string, opts?: ModelKeyCreateOptions, read?: () => Promise<string>): Promise<ModelKeyCreateOptions>;
17
+ export declare function modelKeysRevokeData(ctx: CliContext, id: string): Promise<{
18
+ id: number;
19
+ revoked: boolean;
20
+ }>;
21
+ export declare function modelKeysRevoke(ctx: CliContext, id: string): Promise<string>;
22
+ export declare function validateModelKeyId(id: string): void;
@@ -0,0 +1,222 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { fmtTs, table } from "../output.js";
3
+ import { closestChoice, normalizeHttpUrl, normalizeNonBlank, parsePositiveInteger } from "../validators.js";
4
+ const MODEL_KEY_PROVIDERS = ["anthropic", "openai", "bedrock", "vertex", "openrouter", "xai", "google"];
5
+ export const MODEL_API_FORMATS = [
6
+ "anthropic_messages",
7
+ "openai_chat_completions",
8
+ "openai_responses",
9
+ "bedrock_converse",
10
+ "vertex_generate_content",
11
+ ];
12
+ const MODEL_KEY_AUTH_TYPES = ["api_key", "oauth_subscription"];
13
+ export async function modelKeysListData(ctx) {
14
+ const res = await ctx.http.request({ path: "/model_keys" });
15
+ return res.data;
16
+ }
17
+ export async function modelKeysList(ctx) {
18
+ const keys = await modelKeysListData(ctx);
19
+ if (keys.length === 0)
20
+ return "No model keys. Store one with: dharta model-keys create <provider> <name> --key-stdin";
21
+ return table(keys.map((key) => ({
22
+ id: String(key.id),
23
+ provider: key.provider,
24
+ name: key.name,
25
+ tail: key.tail,
26
+ created: fmtTs(key.created_at),
27
+ revoked: fmtTs(key.revoked_at),
28
+ })));
29
+ }
30
+ export async function modelKeysCreateData(ctx, provider, name, opts = {}) {
31
+ validateModelKeysCreateOptions(provider, name, opts);
32
+ const normalizedProvider = normalizeProvider(provider);
33
+ const normalizedName = normalizeModelKeyName(name);
34
+ const plaintext = await resolvePlaintext(opts);
35
+ const normalizedAuthType = opts.authType === undefined ? undefined : normalizeAuthType(opts.authType);
36
+ const body = { provider: normalizedProvider, name: normalizedName, plaintext };
37
+ if (normalizedAuthType)
38
+ body.auth_type = normalizedAuthType;
39
+ if (opts.endpointUrl)
40
+ body.endpoint_url = normalizeEndpointUrl(opts.endpointUrl);
41
+ if (opts.apiFormat)
42
+ body.api_format = normalizeApiFormat(opts.apiFormat);
43
+ try {
44
+ const res = await ctx.http.request({
45
+ method: "POST",
46
+ path: "/model_keys",
47
+ body,
48
+ headers: { "Idempotency-Key": randomUUID() },
49
+ });
50
+ return res.model_key;
51
+ }
52
+ catch (error) {
53
+ throw addModelKeysWriteScopeGuidance(error);
54
+ }
55
+ }
56
+ export async function modelKeysCreate(ctx, provider, name, opts = {}) {
57
+ const key = await modelKeysCreateData(ctx, provider, name, opts);
58
+ return `Stored ${key.provider} connector ${key.name} (${key.id}).`;
59
+ }
60
+ export function validateModelKeysCreateOptions(provider, name, opts = {}) {
61
+ const normalizedProvider = normalizeProvider(provider);
62
+ normalizeModelKeyName(name);
63
+ const normalizedAuthType = opts.authType === undefined ? undefined : normalizeAuthType(opts.authType);
64
+ if (normalizedAuthType === "oauth_subscription" && normalizedProvider !== "anthropic") {
65
+ throw new Error("--auth-type oauth_subscription is only supported for the anthropic provider.");
66
+ }
67
+ if (opts.key !== undefined && opts.keyStdin) {
68
+ throw new Error("Use either --key or --key-stdin, not both.");
69
+ }
70
+ if (opts.key !== undefined) {
71
+ normalizePlaintext(opts.key, "--key");
72
+ }
73
+ else if (!opts.keyStdin) {
74
+ throw new Error("Model key plaintext is required. Pass --key or --key-stdin.");
75
+ }
76
+ else if (process.stdin.isTTY) {
77
+ throw new Error("No piped input. Usage: echo $PROVIDER_API_KEY | dharta model-keys create anthropic Claude --key-stdin");
78
+ }
79
+ if (opts.endpointUrl !== undefined) {
80
+ normalizeEndpointUrl(opts.endpointUrl);
81
+ }
82
+ if (opts.apiFormat !== undefined) {
83
+ normalizeApiFormat(opts.apiFormat);
84
+ }
85
+ }
86
+ function normalizeProvider(provider) {
87
+ const normalized = normalizeNonBlank(provider, "Model key provider");
88
+ if (MODEL_KEY_PROVIDERS.includes(normalized)) {
89
+ return normalized;
90
+ }
91
+ const suggestion = closestChoice(normalized, MODEL_KEY_PROVIDERS);
92
+ throw new Error(`Unknown model key provider ${normalized}. Allowed providers: ${MODEL_KEY_PROVIDERS.join(", ")}.` +
93
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
94
+ }
95
+ function normalizeAuthType(authType) {
96
+ const normalized = normalizeNonBlank(authType, "--auth-type");
97
+ if (MODEL_KEY_AUTH_TYPES.includes(normalized)) {
98
+ return normalized;
99
+ }
100
+ const suggestion = closestChoice(normalized, MODEL_KEY_AUTH_TYPES);
101
+ throw new Error(`Unknown --auth-type ${normalized}. Allowed auth types: ${MODEL_KEY_AUTH_TYPES.join(", ")}.` +
102
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
103
+ }
104
+ function normalizeApiFormat(apiFormat) {
105
+ const normalized = normalizeNonBlank(apiFormat, "--api-format");
106
+ if (MODEL_API_FORMATS.includes(normalized)) {
107
+ return normalized;
108
+ }
109
+ const suggestion = closestChoice(normalized, MODEL_API_FORMATS);
110
+ throw new Error(`Unknown --api-format ${normalized}. Allowed API formats: ${MODEL_API_FORMATS.join(", ")}.` +
111
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
112
+ }
113
+ export async function prepareModelKeysCreateOptions(provider, name, opts = {}, read = readModelKeyStdin) {
114
+ validateModelKeysCreateOptions(provider, name, opts);
115
+ if (!opts.keyStdin)
116
+ return opts;
117
+ return { ...opts, key: normalizeModelKeyStdin(await read()), keyStdin: false };
118
+ }
119
+ export async function modelKeysRevokeData(ctx, id) {
120
+ const normalizedId = normalizeNonBlank(id, "Model key id");
121
+ const numericId = parseModelKeyId(normalizedId);
122
+ try {
123
+ await ctx.http.request({
124
+ method: "DELETE",
125
+ path: `/model_keys/${encodeURIComponent(normalizedId)}`,
126
+ headers: { "Idempotency-Key": randomUUID() },
127
+ });
128
+ }
129
+ catch (error) {
130
+ throw addModelKeysWriteScopeGuidance(error);
131
+ }
132
+ return { id: numericId, revoked: true };
133
+ }
134
+ export async function modelKeysRevoke(ctx, id) {
135
+ const res = await modelKeysRevokeData(ctx, id);
136
+ return `Revoked ${res.id}.`;
137
+ }
138
+ export function validateModelKeyId(id) {
139
+ normalizeModelKeyId(id);
140
+ }
141
+ async function resolvePlaintext(opts) {
142
+ if (opts.key !== undefined && opts.keyStdin) {
143
+ throw new Error("Use either --key or --key-stdin, not both.");
144
+ }
145
+ if (opts.key !== undefined)
146
+ return normalizePlaintext(opts.key, "--key");
147
+ if (opts.keyStdin) {
148
+ return readModelKeyStdin();
149
+ }
150
+ throw new Error("Model key plaintext is required. Pass --key or --key-stdin.");
151
+ }
152
+ async function readModelKeyStdin() {
153
+ if (process.stdin.isTTY) {
154
+ throw new Error("No piped input. Usage: echo $PROVIDER_API_KEY | dharta model-keys create anthropic Claude --key-stdin");
155
+ }
156
+ const chunks = [];
157
+ for await (const chunk of process.stdin)
158
+ chunks.push(Buffer.from(chunk));
159
+ return normalizeModelKeyStdin(Buffer.concat(chunks).toString("utf8"));
160
+ }
161
+ function normalizeModelKeyStdin(value) {
162
+ const text = value.trim();
163
+ if (text)
164
+ return text;
165
+ throw new Error("No model key on stdin. Usage: echo $PROVIDER_API_KEY | dharta model-keys create anthropic Claude --key-stdin");
166
+ }
167
+ function normalizeModelKeyName(name) {
168
+ const normalized = name.trim();
169
+ if (!normalized) {
170
+ throw new Error("Model key name cannot be blank.");
171
+ }
172
+ return normalized;
173
+ }
174
+ function normalizeModelKeyId(id) {
175
+ const normalized = normalizeNonBlank(id, "Model key id");
176
+ parseModelKeyId(normalized);
177
+ return normalized;
178
+ }
179
+ function parseModelKeyId(id) {
180
+ return parsePositiveInteger(id, "Model key id");
181
+ }
182
+ function normalizePlaintext(value, flag) {
183
+ const normalized = value.trim();
184
+ if (!normalized) {
185
+ throw new Error(`${flag} cannot be blank.`);
186
+ }
187
+ return normalized;
188
+ }
189
+ function normalizeEndpointUrl(value) {
190
+ const normalized = normalizeHttpUrl(value, "--endpoint-url");
191
+ const parsed = new URL(normalized);
192
+ if (parsed.protocol !== "https:") {
193
+ throw new Error("--endpoint-url must use https.");
194
+ }
195
+ if (parsed.username || parsed.password || parsed.search || parsed.hash) {
196
+ throw new Error("--endpoint-url cannot include credentials, a query string, or a fragment.");
197
+ }
198
+ return normalized;
199
+ }
200
+ // Storing or revoking a connector needs `model_keys:write`, a tenant-admin
201
+ // scope that the `dharta login` device-flow credential deliberately never
202
+ // carries (that key is long-lived and non-admin, so it can't hold a
203
+ // forced-expiry admin scope). A CLI login therefore always 403s here. The
204
+ // generic scope hint says "manage key scopes", but the login key's scopes are
205
+ // fixed — you cannot add the scope to it — so name the real path: store the
206
+ // connector in the dashboard, or mint a bounded key and re-auth with a token.
207
+ function addModelKeysWriteScopeGuidance(error) {
208
+ if (!(error instanceof Error))
209
+ return new Error(String(error));
210
+ const status = error.status;
211
+ if (status === 403 &&
212
+ /model_keys:write/.test(error.message) &&
213
+ !error.message.includes("dharta login --with-token")) {
214
+ error.message +=
215
+ `${error.message.endsWith(".") ? "" : "."} ` +
216
+ "The `dharta login` credential cannot hold model_keys:write. Store the connector from the dashboard " +
217
+ "(`dharta open model-keys`), or mint a bounded key with model_keys:write there (`dharta open api-keys`) " +
218
+ "and re-authenticate with `dharta login --with-token`.";
219
+ }
220
+ return error;
221
+ }
222
+ //# sourceMappingURL=model-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-keys.js","sourceRoot":"","sources":["../../src/commands/model-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { CliContext } from "../context.js";
2
+ import { type AgentInferOptions } from "../agent.js";
3
+ export interface OpenOptions extends AgentInferOptions {
4
+ openBrowserImpl?: (url: string) => Promise<boolean>;
5
+ }
6
+ export interface OpenData {
7
+ slug?: string;
8
+ target: "agent" | "console" | "billing" | "security" | "api-keys" | "model-keys" | "webhooks" | "connected-accounts";
9
+ url: string;
10
+ live_version: number | null;
11
+ redirected_to_console: boolean;
12
+ }
13
+ declare const HANDOFF_TARGETS: {
14
+ readonly billing: "/billing";
15
+ readonly security: "/account/security";
16
+ readonly "api-keys": "/api_keys";
17
+ readonly "model-keys": "/model_keys";
18
+ readonly webhooks: "/webhook_endpoints";
19
+ readonly "connected-accounts": "/account/connected_accounts";
20
+ };
21
+ export declare const OPEN_TARGETS_HELP: string;
22
+ export declare function isHandoffTarget(target: string | undefined): target is keyof typeof HANDOFF_TARGETS;
23
+ export declare function normalizeOpenTarget(target: string | undefined): string | undefined;
24
+ export declare function validateOpenTarget(target: string | undefined): void;
25
+ export declare function openHandoffData(baseUrl: string, target: keyof typeof HANDOFF_TARGETS): OpenData;
26
+ export declare function openHandoff(baseUrl: string, target: keyof typeof HANDOFF_TARGETS, opts?: Pick<OpenOptions, "openBrowserImpl">): Promise<string>;
27
+ export declare function openData(ctx: CliContext, target: string | undefined, opts?: AgentInferOptions): Promise<OpenData>;
28
+ export declare function open(ctx: CliContext, target: string | undefined, opts?: OpenOptions): Promise<string>;
29
+ export {};
@@ -0,0 +1,119 @@
1
+ // `dharta open [target]` (RFC 0013 CLI-5): open the hosted chat page,
2
+ // the agent console, or account handoff pages. URLs come from the
3
+ // control plane so the CLI never re-derives the host scheme.
4
+ import { openBrowser } from "../browser.js";
5
+ import { inferAgentSlug } from "../agent.js";
6
+ const HANDOFF_TARGETS = {
7
+ billing: "/billing",
8
+ security: "/account/security",
9
+ "api-keys": "/api_keys",
10
+ "model-keys": "/model_keys",
11
+ webhooks: "/webhook_endpoints",
12
+ "connected-accounts": "/account/connected_accounts",
13
+ };
14
+ export const OPEN_TARGETS_HELP = ["console", ...Object.keys(HANDOFF_TARGETS)].join(", ");
15
+ const OPEN_TARGETS = ["console", ...Object.keys(HANDOFF_TARGETS)];
16
+ export function isHandoffTarget(target) {
17
+ return target !== undefined && target in HANDOFF_TARGETS;
18
+ }
19
+ export function normalizeOpenTarget(target) {
20
+ return target === undefined ? undefined : target.trim();
21
+ }
22
+ export function validateOpenTarget(target) {
23
+ const normalizedTarget = normalizeOpenTarget(target);
24
+ if (target !== undefined && normalizedTarget === "") {
25
+ throw new Error("target cannot be blank.");
26
+ }
27
+ if (normalizedTarget !== undefined && normalizedTarget !== "console" && !isHandoffTarget(normalizedTarget)) {
28
+ const suggestion = closestTarget(normalizedTarget);
29
+ throw new Error(`Unknown target '${normalizedTarget}'. Use one of: ${OPEN_TARGETS_HELP}.` +
30
+ (suggestion ? ` Did you mean '${suggestion}'?` : ""));
31
+ }
32
+ }
33
+ function closestTarget(input) {
34
+ let best = null;
35
+ for (const target of OPEN_TARGETS) {
36
+ const distance = levenshtein(input, target);
37
+ if (distance <= 2 && (!best || distance < best.distance)) {
38
+ best = { target, distance };
39
+ }
40
+ }
41
+ return best?.target ?? null;
42
+ }
43
+ function levenshtein(a, b) {
44
+ const previous = Array.from({ length: b.length + 1 }, (_, i) => i);
45
+ const current = Array.from({ length: b.length + 1 }, () => 0);
46
+ for (let i = 1; i <= a.length; i += 1) {
47
+ current[0] = i;
48
+ for (let j = 1; j <= b.length; j += 1) {
49
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
50
+ current[j] = Math.min(current[j - 1] + 1, previous[j] + 1, previous[j - 1] + cost);
51
+ }
52
+ previous.splice(0, previous.length, ...current);
53
+ }
54
+ return previous[b.length];
55
+ }
56
+ export function openHandoffData(baseUrl, target) {
57
+ return {
58
+ target,
59
+ url: absoluteUrl(baseUrl, HANDOFF_TARGETS[target]),
60
+ live_version: null,
61
+ redirected_to_console: false,
62
+ };
63
+ }
64
+ export async function openHandoff(baseUrl, target, opts = {}) {
65
+ const data = openHandoffData(baseUrl, target);
66
+ const opened = await (opts.openBrowserImpl ?? openBrowser)(data.url);
67
+ return opened ? `Opening ${data.url}` : `Open this in your browser: ${data.url}`;
68
+ }
69
+ // Resolve the URL without opening anything - the --json path prints
70
+ // this object instead of launching a browser.
71
+ export async function openData(ctx, target, opts = {}) {
72
+ const normalizedTarget = normalizeOpenTarget(target);
73
+ if (isHandoffTarget(normalizedTarget)) {
74
+ return openHandoffData(ctx.baseUrl, normalizedTarget);
75
+ }
76
+ validateOpenTarget(normalizedTarget);
77
+ if (normalizedTarget === "console" && !hasAgentSelector(opts)) {
78
+ return {
79
+ target: "console",
80
+ url: absoluteUrl(ctx.baseUrl, "/agents"),
81
+ live_version: null,
82
+ redirected_to_console: false,
83
+ };
84
+ }
85
+ const slug = await inferAgentSlug(opts);
86
+ const shown = await ctx.http.request({
87
+ path: `/api/agents/${encodeURIComponent(slug)}`,
88
+ });
89
+ const wantsAgent = normalizedTarget !== "console";
90
+ const noRelease = shown.live_version == null;
91
+ const redirected = wantsAgent && noRelease;
92
+ return {
93
+ slug,
94
+ target: wantsAgent && !redirected ? "agent" : "console",
95
+ url: wantsAgent && !redirected ? shown.agent_url : shown.console_url,
96
+ live_version: shown.live_version ?? null,
97
+ redirected_to_console: redirected,
98
+ };
99
+ }
100
+ export async function open(ctx, target, opts = {}) {
101
+ const data = await openData(ctx, target, opts);
102
+ const opened = await (opts.openBrowserImpl ?? openBrowser)(data.url);
103
+ const prefix = data.redirected_to_console
104
+ ? `Nothing is deployed on ${data.slug} yet - deploy with: git push dharta main\n` +
105
+ "Opening the agent console instead.\n"
106
+ : "";
107
+ return prefix + (opened ? `Opening ${data.url}` : `Open this in your browser: ${data.url}`);
108
+ }
109
+ function hasAgentSelector(opts) {
110
+ return (opts.agent !== undefined ||
111
+ opts.project !== undefined ||
112
+ opts.path !== undefined ||
113
+ opts.dir !== undefined ||
114
+ (opts.env ?? process.env).DHARTA_PROJECT !== undefined);
115
+ }
116
+ function absoluteUrl(baseUrl, path) {
117
+ return `${baseUrl.replace(/\/+$/, "")}${path}`;
118
+ }
119
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CliContext } from "../context.js";
2
+ import { type AgentInferOptions } from "../agent.js";
3
+ export declare function prepareReleaseDir(ctx: CliContext, releaseVersion: string, opts?: AgentInferOptions & {
4
+ fetchImpl?: typeof fetch;
5
+ }): Promise<{
6
+ dir: string;
7
+ version: number;
8
+ commitSha: string;
9
+ }>;
10
+ export declare function fetchRemoteEnv(ctx: CliContext, opts?: AgentInferOptions & {
11
+ includeSecrets?: boolean;
12
+ }): Promise<{
13
+ values: Record<string, string>;
14
+ withheld: string[];
15
+ }>;