@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.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/agent.d.ts +17 -0
- package/dist/agent.js +134 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-error.d.ts +3 -0
- package/dist/api-error.js +80 -0
- package/dist/api-error.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +19 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +1978 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agents.d.ts +131 -0
- package/dist/commands/agents.js +439 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/analytics.d.ts +25 -0
- package/dist/commands/analytics.js +166 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/api.d.ts +19 -0
- package/dist/commands/api.js +278 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/appearance.d.ts +19 -0
- package/dist/commands/appearance.js +63 -0
- package/dist/commands/appearance.js.map +1 -0
- package/dist/commands/artifact.d.ts +33 -0
- package/dist/commands/artifact.js +235 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/audit-log.d.ts +32 -0
- package/dist/commands/audit-log.js +102 -0
- package/dist/commands/audit-log.js.map +1 -0
- package/dist/commands/auth.d.ts +47 -0
- package/dist/commands/auth.js +117 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/caps.d.ts +82 -0
- package/dist/commands/caps.js +213 -0
- package/dist/commands/caps.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.js +76 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +45 -0
- package/dist/commands/deploy.js +892 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +33 -0
- package/dist/commands/dev.js +655 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/directories.d.ts +60 -0
- package/dist/commands/directories.js +83 -0
- package/dist/commands/directories.js.map +1 -0
- package/dist/commands/doctor.d.ts +13 -0
- package/dist/commands/doctor.js +123 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/embed-keys.d.ts +61 -0
- package/dist/commands/embed-keys.js +165 -0
- package/dist/commands/embed-keys.js.map +1 -0
- package/dist/commands/env.d.ts +59 -0
- package/dist/commands/env.js +300 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/files.d.ts +14 -0
- package/dist/commands/files.js +84 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/git-credential.d.ts +1 -0
- package/dist/commands/git-credential.js +70 -0
- package/dist/commands/git-credential.js.map +1 -0
- package/dist/commands/kartas.d.ts +101 -0
- package/dist/commands/kartas.js +289 -0
- package/dist/commands/kartas.js.map +1 -0
- package/dist/commands/keys.d.ts +33 -0
- package/dist/commands/keys.js +141 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/login.d.ts +22 -0
- package/dist/commands/login.js +78 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +14 -0
- package/dist/commands/logs.js +89 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/members.d.ts +32 -0
- package/dist/commands/members.js +77 -0
- package/dist/commands/members.js.map +1 -0
- package/dist/commands/model-keys.d.ts +22 -0
- package/dist/commands/model-keys.js +222 -0
- package/dist/commands/model-keys.js.map +1 -0
- package/dist/commands/open.d.ts +29 -0
- package/dist/commands/open.js +119 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/parity.d.ts +15 -0
- package/dist/commands/parity.js +73 -0
- package/dist/commands/parity.js.map +1 -0
- package/dist/commands/rollback.d.ts +21 -0
- package/dist/commands/rollback.js +26 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/schedules.d.ts +52 -0
- package/dist/commands/schedules.js +231 -0
- package/dist/commands/schedules.js.map +1 -0
- package/dist/commands/scopes.d.ts +3 -0
- package/dist/commands/scopes.js +21 -0
- package/dist/commands/scopes.js.map +1 -0
- package/dist/commands/sessions.d.ts +53 -0
- package/dist/commands/sessions.js +142 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/setup.d.ts +28 -0
- package/dist/commands/setup.js +949 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +19 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.js +120 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.d.ts +3 -0
- package/dist/commands/usage.js +37 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/webhooks.d.ts +47 -0
- package/dist/commands/webhooks.js +156 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/commands/whoami.d.ts +7 -0
- package/dist/commands/whoami.js +17 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/completions.d.ts +13 -0
- package/dist/completions.js +120 -0
- package/dist/completions.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +14 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/device-flow.d.ts +9 -0
- package/dist/device-flow.js +127 -0
- package/dist/device-flow.js.map +1 -0
- package/dist/harness-preflight.d.ts +24 -0
- package/dist/harness-preflight.js +252 -0
- package/dist/harness-preflight.js.map +1 -0
- package/dist/harnesses.d.ts +11 -0
- package/dist/harnesses.js +112 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/login-offer.d.ts +9 -0
- package/dist/login-offer.js +36 -0
- package/dist/login-offer.js.map +1 -0
- package/dist/manifest.d.ts +15 -0
- package/dist/manifest.js +142 -0
- package/dist/manifest.js.map +1 -0
- package/dist/money.d.ts +1 -0
- package/dist/money.js +16 -0
- package/dist/money.js.map +1 -0
- package/dist/output.d.ts +2 -0
- package/dist/output.js +20 -0
- package/dist/output.js.map +1 -0
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.js +95 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scaffold.d.ts +16 -0
- package/dist/scaffold.js +74 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/setup-scan.d.ts +21 -0
- package/dist/setup-scan.js +127 -0
- package/dist/setup-scan.js.map +1 -0
- package/dist/templates.d.ts +14 -0
- package/dist/templates.js +65 -0
- package/dist/templates.js.map +1 -0
- package/dist/validators.d.ts +10 -0
- package/dist/validators.js +116 -0
- package/dist/validators.js.map +1 -0
- package/dist/version-check.d.ts +25 -0
- package/dist/version-check.js +68 -0
- package/dist/version-check.js.map +1 -0
- package/node_modules/@dharta/sdk/LICENSE +21 -0
- package/node_modules/@dharta/sdk/README.md +87 -0
- package/node_modules/@dharta/sdk/dist/errors.d.ts +20 -0
- package/node_modules/@dharta/sdk/dist/errors.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/errors.js +51 -0
- package/node_modules/@dharta/sdk/dist/errors.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/http.d.ts +26 -0
- package/node_modules/@dharta/sdk/dist/http.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/http.js +136 -0
- package/node_modules/@dharta/sdk/dist/http.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/index.d.ts +15 -0
- package/node_modules/@dharta/sdk/dist/index.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/index.js +21 -0
- package/node_modules/@dharta/sdk/dist/index.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/resources.d.ts +48 -0
- package/node_modules/@dharta/sdk/dist/resources.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/resources.js +150 -0
- package/node_modules/@dharta/sdk/dist/resources.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/types.d.ts +94 -0
- package/node_modules/@dharta/sdk/dist/types.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/types.js +59 -0
- package/node_modules/@dharta/sdk/dist/types.js.map +1 -0
- package/node_modules/@dharta/sdk/package.json +32 -0
- package/node_modules/@dharta/sdk/src/errors.ts +58 -0
- package/node_modules/@dharta/sdk/src/http.ts +166 -0
- package/node_modules/@dharta/sdk/src/index.ts +36 -0
- package/node_modules/@dharta/sdk/src/resources.ts +197 -0
- package/node_modules/@dharta/sdk/src/types.ts +179 -0
- package/package.json +38 -0
- package/src/agent.ts +147 -0
- package/src/api-error.ts +88 -0
- package/src/browser.ts +20 -0
- package/src/cli.ts +2339 -0
- package/src/commands/agents.ts +635 -0
- package/src/commands/analytics.ts +181 -0
- package/src/commands/api.ts +297 -0
- package/src/commands/appearance.ts +79 -0
- package/src/commands/artifact.ts +331 -0
- package/src/commands/audit-log.ts +125 -0
- package/src/commands/auth.ts +186 -0
- package/src/commands/caps.ts +302 -0
- package/src/commands/create.ts +114 -0
- package/src/commands/deploy.ts +1122 -0
- package/src/commands/dev.ts +792 -0
- package/src/commands/directories.ts +136 -0
- package/src/commands/doctor.ts +138 -0
- package/src/commands/embed-keys.ts +237 -0
- package/src/commands/env.ts +369 -0
- package/src/commands/files.ts +124 -0
- package/src/commands/git-credential.ts +78 -0
- package/src/commands/kartas.ts +439 -0
- package/src/commands/keys.ts +206 -0
- package/src/commands/login.ts +115 -0
- package/src/commands/logs.ts +111 -0
- package/src/commands/members.ts +109 -0
- package/src/commands/model-keys.ts +278 -0
- package/src/commands/open.ts +173 -0
- package/src/commands/parity.ts +96 -0
- package/src/commands/rollback.ts +45 -0
- package/src/commands/schedules.ts +290 -0
- package/src/commands/scopes.ts +22 -0
- package/src/commands/sessions.ts +225 -0
- package/src/commands/setup.ts +1176 -0
- package/src/commands/status.ts +94 -0
- package/src/commands/update.ts +157 -0
- package/src/commands/usage.ts +41 -0
- package/src/commands/webhooks.ts +200 -0
- package/src/commands/whoami.ts +24 -0
- package/src/completions.ts +168 -0
- package/src/config.ts +143 -0
- package/src/context.ts +59 -0
- package/src/device-flow.ts +174 -0
- package/src/harness-preflight.ts +293 -0
- package/src/harnesses.ts +117 -0
- package/src/index.ts +3 -0
- package/src/login-offer.ts +49 -0
- package/src/manifest.ts +153 -0
- package/src/money.ts +15 -0
- package/src/output.ts +22 -0
- package/src/runtime.ts +127 -0
- package/src/scaffold.ts +102 -0
- package/src/setup-scan.ts +154 -0
- package/src/templates.ts +85 -0
- package/src/validators.ts +124 -0
- package/src/version-check.ts +75 -0
- package/templates/blank/CLAUDE.md +21 -0
- package/templates/blank/dharta.toml +11 -0
- package/templates/faq-agent/CLAUDE.md +51 -0
- package/templates/faq-agent/dharta.toml +11 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { table } from "../output.js";
|
|
3
|
+
import { maskEnvValue } from "./env.js";
|
|
4
|
+
import { closestChoice, normalizeNonBlank } from "../validators.js";
|
|
5
|
+
const DHARTA_AUDIENCES = ["members", "anonymous", "off"];
|
|
6
|
+
const DHARTA_ROLES = ["viewer", "participant", "manager"];
|
|
7
|
+
export function validateKartaCreateOptions(name, options) {
|
|
8
|
+
normalizeNonBlank(name, "dharta name");
|
|
9
|
+
normalizeNonBlank(options.agent ?? "", "Agent slug");
|
|
10
|
+
normalizeNonBlank(options.slug ?? "", "dharta vanity slug");
|
|
11
|
+
normalizeAudience(options.access ?? "members");
|
|
12
|
+
normalizeRole(options.memberRole ?? "participant");
|
|
13
|
+
for (const email of options.members ?? [])
|
|
14
|
+
normalizeNonBlank(email, "karta member email");
|
|
15
|
+
}
|
|
16
|
+
export async function kartasCreateData(ctx, name, options) {
|
|
17
|
+
validateKartaCreateOptions(name, options);
|
|
18
|
+
const access = normalizeAudience(options.access ?? "members");
|
|
19
|
+
const role = normalizeRole(options.memberRole ?? "participant");
|
|
20
|
+
const agent = normalizeNonBlank(options.agent ?? "", "Agent slug");
|
|
21
|
+
const slug = normalizeNonBlank(options.slug ?? "", "dharta vanity slug");
|
|
22
|
+
return ctx.http.request({
|
|
23
|
+
method: "POST",
|
|
24
|
+
path: "/api/kartas",
|
|
25
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
26
|
+
body: {
|
|
27
|
+
agent,
|
|
28
|
+
name: name.trim(),
|
|
29
|
+
vanity_slug: slug.toLowerCase(),
|
|
30
|
+
access_audience: access === "off" ? null : access,
|
|
31
|
+
members: (options.members ?? []).map((email) => ({ email: email.trim(), role })),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function kartasCreate(ctx, name, options) {
|
|
36
|
+
const { karta } = await kartasCreateData(ctx, name, options);
|
|
37
|
+
return karta.url
|
|
38
|
+
? `Created ${karta.name ?? karta.id}. Stable URL: ${karta.url}`
|
|
39
|
+
: `Created ${karta.name ?? karta.id}. Stable URL is off.`;
|
|
40
|
+
}
|
|
41
|
+
export async function kartasListData(ctx, options = {}) {
|
|
42
|
+
const query = new URLSearchParams();
|
|
43
|
+
if (options.agent !== undefined)
|
|
44
|
+
query.set("agent", normalizeNonBlank(options.agent, "Agent slug"));
|
|
45
|
+
if (options.named)
|
|
46
|
+
query.set("named", "true");
|
|
47
|
+
// Archived kartas are hidden by default; --archived lists only those.
|
|
48
|
+
if (options.archived)
|
|
49
|
+
query.set("archived", "true");
|
|
50
|
+
const suffix = query.size > 0 ? `?${query.toString()}` : "";
|
|
51
|
+
const response = await ctx.http.request({ path: `/api/kartas${suffix}` });
|
|
52
|
+
return response.data;
|
|
53
|
+
}
|
|
54
|
+
export async function kartasList(ctx, options = {}) {
|
|
55
|
+
const kartas = await kartasListData(ctx, options);
|
|
56
|
+
if (kartas.length === 0)
|
|
57
|
+
return options.named ? "No named kartas yet." : "No kartas yet.";
|
|
58
|
+
return table(kartas.map((karta) => ({
|
|
59
|
+
id: karta.id,
|
|
60
|
+
name: karta.name ?? "—",
|
|
61
|
+
agent: karta.agent?.slug ?? "—",
|
|
62
|
+
slug: karta.vanity_slug ?? "—",
|
|
63
|
+
access: accessLabel(karta),
|
|
64
|
+
url: karta.url ?? "—",
|
|
65
|
+
})));
|
|
66
|
+
}
|
|
67
|
+
export async function kartasShowData(ctx, id) {
|
|
68
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
69
|
+
const response = await ctx.http.request({
|
|
70
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}`,
|
|
71
|
+
});
|
|
72
|
+
return response.karta;
|
|
73
|
+
}
|
|
74
|
+
export async function kartasShow(ctx, id) {
|
|
75
|
+
const karta = await kartasShowData(ctx, id);
|
|
76
|
+
const members = karta.members?.length
|
|
77
|
+
? table(karta.members.map((member) => ({
|
|
78
|
+
id: String(member.id), email: member.email, role: member.role,
|
|
79
|
+
})))
|
|
80
|
+
: "No people listed.";
|
|
81
|
+
return [
|
|
82
|
+
`karta: ${karta.name ?? karta.id} (${karta.id})`,
|
|
83
|
+
`Agent: ${karta.agent?.slug ?? "—"}`,
|
|
84
|
+
`Vanity slug: ${karta.vanity_slug ?? "—"}`,
|
|
85
|
+
`Stable URL access: ${accessLabel(karta)}`,
|
|
86
|
+
`Signed-in access: ${karta.access_model === "native_shared" ? "managed here" : "controlled by the existing agent integration"}`,
|
|
87
|
+
`URL: ${karta.url ?? "—"}`,
|
|
88
|
+
"",
|
|
89
|
+
"People",
|
|
90
|
+
members,
|
|
91
|
+
].join("\n");
|
|
92
|
+
}
|
|
93
|
+
export function validateKartaConfigureOptions(options) {
|
|
94
|
+
if (options.name === undefined && options.slug === undefined && options.access === undefined) {
|
|
95
|
+
throw new Error("Set at least one of --name, --slug, or --access.");
|
|
96
|
+
}
|
|
97
|
+
if (options.name !== undefined)
|
|
98
|
+
normalizeNonBlank(options.name, "dharta name");
|
|
99
|
+
if (options.slug !== undefined)
|
|
100
|
+
normalizeNonBlank(options.slug, "dharta vanity slug");
|
|
101
|
+
if (options.access !== undefined)
|
|
102
|
+
normalizeAudience(options.access);
|
|
103
|
+
}
|
|
104
|
+
export function validateKartaNameOptions(options) {
|
|
105
|
+
normalizeNonBlank(options.name ?? "", "dharta name");
|
|
106
|
+
normalizeNonBlank(options.slug ?? "", "dharta vanity slug");
|
|
107
|
+
}
|
|
108
|
+
export async function kartasNameData(ctx, id, options) {
|
|
109
|
+
validateKartaNameOptions(options);
|
|
110
|
+
return kartasConfigureData(ctx, id, { name: options.name, slug: options.slug });
|
|
111
|
+
}
|
|
112
|
+
export async function kartasName(ctx, id, options) {
|
|
113
|
+
const { karta } = await kartasNameData(ctx, id, options);
|
|
114
|
+
return `Named ${karta.id} as ${karta.name} (/kartas/${karta.vanity_slug}). Stable URL access remains ${accessLabel(karta)}.`;
|
|
115
|
+
}
|
|
116
|
+
export async function kartasConfigureData(ctx, id, options) {
|
|
117
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
118
|
+
validateKartaConfigureOptions(options);
|
|
119
|
+
const body = {};
|
|
120
|
+
if (options.name !== undefined)
|
|
121
|
+
body.name = options.name.trim();
|
|
122
|
+
if (options.slug !== undefined)
|
|
123
|
+
body.vanity_slug = options.slug.trim().toLowerCase();
|
|
124
|
+
if (options.access !== undefined) {
|
|
125
|
+
const access = normalizeAudience(options.access);
|
|
126
|
+
body.access_audience = access === "off" ? null : access;
|
|
127
|
+
}
|
|
128
|
+
return ctx.http.request({
|
|
129
|
+
method: "PATCH",
|
|
130
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}`,
|
|
131
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
132
|
+
body,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
export async function kartasConfigure(ctx, id, options) {
|
|
136
|
+
const { karta } = await kartasConfigureData(ctx, id, options);
|
|
137
|
+
return karta.url
|
|
138
|
+
? `Updated ${karta.name ?? karta.id}. Stable URL: ${karta.url}`
|
|
139
|
+
: `Updated ${karta.name ?? karta.id}. Stable URL is off.`;
|
|
140
|
+
}
|
|
141
|
+
// Retire a dharta. A REVERSIBLE archive, never a delete: the durable workspace
|
|
142
|
+
// and its history survive untouched, and `dharta kartas restore` brings them
|
|
143
|
+
// back. Erasing the underlying tree is a separate admin operation (RFC 0036
|
|
144
|
+
// W7) - list-tidying must never destroy an end user's accumulated work.
|
|
145
|
+
export async function kartasArchiveData(ctx, id) {
|
|
146
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
147
|
+
return ctx.http.request({
|
|
148
|
+
method: "DELETE",
|
|
149
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}`,
|
|
150
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function kartasArchive(ctx, id) {
|
|
154
|
+
const { karta } = await kartasArchiveData(ctx, id);
|
|
155
|
+
return (`Archived ${karta.name ?? karta.id}. Its files and history are kept - ` +
|
|
156
|
+
`restore with: dharta kartas restore ${karta.id}`);
|
|
157
|
+
}
|
|
158
|
+
export async function kartasRestoreData(ctx, id) {
|
|
159
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
160
|
+
return ctx.http.request({
|
|
161
|
+
method: "POST",
|
|
162
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}/restore`,
|
|
163
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export async function kartasRestore(ctx, id) {
|
|
167
|
+
const { karta } = await kartasRestoreData(ctx, id);
|
|
168
|
+
return karta.url
|
|
169
|
+
? `Restored ${karta.name ?? karta.id}. Stable URL: ${karta.url}`
|
|
170
|
+
: `Restored ${karta.name ?? karta.id}.`;
|
|
171
|
+
}
|
|
172
|
+
export async function kartaMembersGrantData(ctx, id, email, role) {
|
|
173
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
174
|
+
const normalizedEmail = normalizeNonBlank(email, "person email");
|
|
175
|
+
const normalizedRole = normalizeRole(role);
|
|
176
|
+
return ctx.http.request({
|
|
177
|
+
method: "POST",
|
|
178
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}/members`,
|
|
179
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
180
|
+
body: { email: normalizedEmail, role: normalizedRole },
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
export async function kartaMembersGrant(ctx, id, email, role) {
|
|
184
|
+
const { member } = await kartaMembersGrantData(ctx, id, email, role);
|
|
185
|
+
return `Granted ${member.email} ${member.role} access to karta ${id}.`;
|
|
186
|
+
}
|
|
187
|
+
export async function kartaMembersSetRoleData(ctx, id, membershipId, role) {
|
|
188
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
189
|
+
const memberId = normalizeNonBlank(membershipId, "dharta membership id");
|
|
190
|
+
const normalizedRole = normalizeRole(role);
|
|
191
|
+
return ctx.http.request({
|
|
192
|
+
method: "PATCH",
|
|
193
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}/members/${encodeURIComponent(memberId)}`,
|
|
194
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
195
|
+
body: { role: normalizedRole },
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
export async function kartaMembersSetRole(ctx, id, membershipId, role) {
|
|
199
|
+
const { member } = await kartaMembersSetRoleData(ctx, id, membershipId, role);
|
|
200
|
+
return `${member.email} is now a ${member.role} on karta ${id}.`;
|
|
201
|
+
}
|
|
202
|
+
export async function kartaMembersRevokeData(ctx, id, membershipId) {
|
|
203
|
+
const kartaId = normalizeNonBlank(id, "dharta id");
|
|
204
|
+
const memberId = normalizeNonBlank(membershipId, "dharta membership id");
|
|
205
|
+
await ctx.http.request({
|
|
206
|
+
method: "DELETE",
|
|
207
|
+
path: `/api/kartas/${encodeURIComponent(kartaId)}/members/${encodeURIComponent(memberId)}`,
|
|
208
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
209
|
+
});
|
|
210
|
+
return { id: kartaId, membership_id: memberId, revoked: true };
|
|
211
|
+
}
|
|
212
|
+
export async function kartaMembersRevoke(ctx, id, membershipId) {
|
|
213
|
+
await kartaMembersRevokeData(ctx, id, membershipId);
|
|
214
|
+
return `Revoked dharta membership ${membershipId} from ${id}.`;
|
|
215
|
+
}
|
|
216
|
+
function normalizeAudience(audience) {
|
|
217
|
+
const normalized = normalizeNonBlank(audience, "karta access audience");
|
|
218
|
+
if (DHARTA_AUDIENCES.includes(normalized))
|
|
219
|
+
return normalized;
|
|
220
|
+
const suggestion = closestChoice(normalized, DHARTA_AUDIENCES);
|
|
221
|
+
throw new Error(`Unknown karta access ${normalized}. Allowed values: ${DHARTA_AUDIENCES.join(", ")}.` +
|
|
222
|
+
(suggestion ? ` Did you mean ${suggestion}?` : ""));
|
|
223
|
+
}
|
|
224
|
+
function normalizeRole(role) {
|
|
225
|
+
const normalized = normalizeNonBlank(role, "karta member role");
|
|
226
|
+
if (DHARTA_ROLES.includes(normalized))
|
|
227
|
+
return normalized;
|
|
228
|
+
const suggestion = closestChoice(normalized, DHARTA_ROLES);
|
|
229
|
+
throw new Error(`Unknown karta member role ${normalized}. Allowed roles: ${DHARTA_ROLES.join(", ")}.` +
|
|
230
|
+
(suggestion ? ` Did you mean ${suggestion}?` : ""));
|
|
231
|
+
}
|
|
232
|
+
function accessLabel(karta) {
|
|
233
|
+
if (karta.access_audience === "members")
|
|
234
|
+
return "specific people (sign-in required)";
|
|
235
|
+
if (karta.access_audience === "anonymous")
|
|
236
|
+
return "anyone with the link";
|
|
237
|
+
return "off";
|
|
238
|
+
}
|
|
239
|
+
function envPath(agent, karta, name) {
|
|
240
|
+
const base = `/api/agents/${encodeURIComponent(agent)}/instances/${encodeURIComponent(karta)}/env`;
|
|
241
|
+
return name === undefined ? base : `${base}/${encodeURIComponent(name)}`;
|
|
242
|
+
}
|
|
243
|
+
export async function kartaEnvListData(ctx, agent, karta) {
|
|
244
|
+
const agentSlug = normalizeNonBlank(agent, "agent slug");
|
|
245
|
+
const kartaId = normalizeNonBlank(karta, "dharta id");
|
|
246
|
+
const response = await ctx.http.request({
|
|
247
|
+
path: envPath(agentSlug, kartaId),
|
|
248
|
+
});
|
|
249
|
+
return response.env ?? [];
|
|
250
|
+
}
|
|
251
|
+
export async function kartaEnvList(ctx, agent, karta) {
|
|
252
|
+
const env = await kartaEnvListData(ctx, agent, karta);
|
|
253
|
+
if (env.length === 0)
|
|
254
|
+
return "No per-dharta environment variables set.";
|
|
255
|
+
return table(env.map((row) => ({
|
|
256
|
+
name: row.name,
|
|
257
|
+
// Secret values are never returned by the API; non-secret (--plain) values
|
|
258
|
+
// are masked here too so a routine list never prints a token to the
|
|
259
|
+
// terminal. Use `--json` for raw values. Shared with `dharta env list`.
|
|
260
|
+
value: maskEnvValue(row, false),
|
|
261
|
+
updated: row.updated_at ?? "—",
|
|
262
|
+
by: row.updated_by ?? "—",
|
|
263
|
+
})));
|
|
264
|
+
}
|
|
265
|
+
export async function kartaEnvSetData(ctx, agent, karta, name, value, options = {}) {
|
|
266
|
+
const agentSlug = normalizeNonBlank(agent, "agent slug");
|
|
267
|
+
const kartaId = normalizeNonBlank(karta, "dharta id");
|
|
268
|
+
const varName = normalizeNonBlank(name, "variable name");
|
|
269
|
+
return ctx.http.request({
|
|
270
|
+
method: "PUT",
|
|
271
|
+
path: envPath(agentSlug, kartaId, varName),
|
|
272
|
+
body: options.secret === undefined ? { value } : { value, secret: options.secret },
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
export async function kartaEnvSet(ctx, agent, karta, name, value, options = {}) {
|
|
276
|
+
const row = await kartaEnvSetData(ctx, agent, karta, name, value, options);
|
|
277
|
+
return `Set ${row.name} on ${karta}.`;
|
|
278
|
+
}
|
|
279
|
+
export async function kartaEnvUnsetData(ctx, agent, karta, name) {
|
|
280
|
+
const agentSlug = normalizeNonBlank(agent, "agent slug");
|
|
281
|
+
const kartaId = normalizeNonBlank(karta, "dharta id");
|
|
282
|
+
const varName = normalizeNonBlank(name, "variable name");
|
|
283
|
+
await ctx.http.request({ method: "DELETE", path: envPath(agentSlug, kartaId, varName) });
|
|
284
|
+
}
|
|
285
|
+
export async function kartaEnvUnset(ctx, agent, karta, name) {
|
|
286
|
+
await kartaEnvUnsetData(ctx, agent, karta, name);
|
|
287
|
+
return `Removed ${name} from ${karta}.`;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=kartas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kartas.js","sourceRoot":"","sources":["../../src/commands/kartas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CliContext } from "../context.js";
|
|
2
|
+
import { type ApiKeyScope } from "@dharta/sdk";
|
|
3
|
+
interface ApiKey {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
prefix: string;
|
|
7
|
+
scopes: ApiKeyScope[];
|
|
8
|
+
mode?: string;
|
|
9
|
+
expires_at?: string | null;
|
|
10
|
+
created_at: string;
|
|
11
|
+
last_used_at: string | null;
|
|
12
|
+
revoked_at: string | null;
|
|
13
|
+
}
|
|
14
|
+
interface ApiKeyCreateResponse {
|
|
15
|
+
api_key: ApiKey;
|
|
16
|
+
secret: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ApiKeyCreateOptions {
|
|
19
|
+
expiresAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function keysListData(ctx: CliContext): Promise<ApiKey[]>;
|
|
22
|
+
export declare function keysList(ctx: CliContext): Promise<string>;
|
|
23
|
+
export declare function keysCreateData(ctx: CliContext, name: string, scopes: ApiKeyScope[], opts?: ApiKeyCreateOptions): Promise<ApiKeyCreateResponse>;
|
|
24
|
+
export declare function keysCreate(ctx: CliContext, name: string, scopes: ApiKeyScope[], opts?: ApiKeyCreateOptions): Promise<string>;
|
|
25
|
+
export declare function validateKeysCreateInput(name: string, scopes: ApiKeyScope[], opts?: ApiKeyCreateOptions): void;
|
|
26
|
+
export declare function keysRevokeData(ctx: CliContext, id: string): Promise<{
|
|
27
|
+
id: string;
|
|
28
|
+
revoked: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function keysRevoke(ctx: CliContext, id: string): Promise<string>;
|
|
31
|
+
export declare function keysRenameData(ctx: CliContext, id: string, name: string): Promise<ApiKey>;
|
|
32
|
+
export declare function keysRename(ctx: CliContext, id: string, name: string): Promise<string>;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { API_KEY_SCOPES } from "@dharta/sdk";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { fmtTs, table } from "../output.js";
|
|
4
|
+
import { closestChoice, normalizeIsoTimestamp, normalizeNonBlank } from "../validators.js";
|
|
5
|
+
import { formatScopes, SENSITIVE_API_KEY_SCOPES } from "./scopes.js";
|
|
6
|
+
const MAX_FORCED_EXPIRY_MS = 90 * 24 * 60 * 60 * 1000;
|
|
7
|
+
export async function keysListData(ctx) {
|
|
8
|
+
try {
|
|
9
|
+
const res = await ctx.http.request({ path: "/api_keys" });
|
|
10
|
+
return res.data;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw addKeysListScopeGuidance(error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function keysList(ctx) {
|
|
17
|
+
const keys = await keysListData(ctx);
|
|
18
|
+
if (keys.length === 0)
|
|
19
|
+
return "No API keys. Create one with: dharta keys create <name> --scope agents:read";
|
|
20
|
+
return table(keys.map((k) => ({
|
|
21
|
+
prefix: k.prefix,
|
|
22
|
+
name: k.name,
|
|
23
|
+
scopes: formatScopes(k.scopes, ","),
|
|
24
|
+
created: fmtTs(k.created_at),
|
|
25
|
+
last_used: fmtTs(k.last_used_at),
|
|
26
|
+
revoked: fmtTs(k.revoked_at),
|
|
27
|
+
})));
|
|
28
|
+
}
|
|
29
|
+
export async function keysCreateData(ctx, name, scopes, opts = {}) {
|
|
30
|
+
validateKeysCreateInput(name, scopes, opts);
|
|
31
|
+
const normalizedScopes = normalizeScopes(scopes);
|
|
32
|
+
const normalizedOpts = normalizeCreateOptions(normalizedScopes, opts);
|
|
33
|
+
const body = { name: normalizeKeyName(name), scopes: normalizedScopes };
|
|
34
|
+
if (normalizedOpts.expiresAt !== undefined)
|
|
35
|
+
body.expires_at = normalizedOpts.expiresAt;
|
|
36
|
+
return ctx.http.request({
|
|
37
|
+
method: "POST",
|
|
38
|
+
path: "/api_keys",
|
|
39
|
+
body,
|
|
40
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export async function keysCreate(ctx, name, scopes, opts = {}) {
|
|
44
|
+
const res = await keysCreateData(ctx, name, scopes, opts);
|
|
45
|
+
return [
|
|
46
|
+
`Created key ${res.api_key.prefix} (${res.api_key.id})`,
|
|
47
|
+
`Scopes: ${res.api_key.scopes.join(",")}`,
|
|
48
|
+
res.api_key.expires_at ? `Expires: ${res.api_key.expires_at}` : null,
|
|
49
|
+
"",
|
|
50
|
+
`Secret (shown once — store it now):`,
|
|
51
|
+
res.secret,
|
|
52
|
+
].filter((line) => line !== null).join("\n");
|
|
53
|
+
}
|
|
54
|
+
export function validateKeysCreateInput(name, scopes, opts = {}) {
|
|
55
|
+
normalizeKeyName(name);
|
|
56
|
+
normalizeCreateOptions(normalizeScopes(scopes), opts);
|
|
57
|
+
}
|
|
58
|
+
export async function keysRevokeData(ctx, id) {
|
|
59
|
+
const normalizedId = normalizeNonBlank(id, "API key id");
|
|
60
|
+
await ctx.http.request({
|
|
61
|
+
method: "DELETE",
|
|
62
|
+
path: `/api_keys/${encodeURIComponent(normalizedId)}`,
|
|
63
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
64
|
+
});
|
|
65
|
+
return { id: normalizedId, revoked: true };
|
|
66
|
+
}
|
|
67
|
+
export async function keysRevoke(ctx, id) {
|
|
68
|
+
const res = await keysRevokeData(ctx, id);
|
|
69
|
+
return `Revoked ${res.id}.`;
|
|
70
|
+
}
|
|
71
|
+
export async function keysRenameData(ctx, id, name) {
|
|
72
|
+
const normalizedId = normalizeNonBlank(id, "API key id");
|
|
73
|
+
const normalizedName = normalizeKeyName(name);
|
|
74
|
+
const res = await ctx.http.request({
|
|
75
|
+
method: "PATCH",
|
|
76
|
+
path: `/api_keys/${encodeURIComponent(normalizedId)}`,
|
|
77
|
+
body: { name: normalizedName },
|
|
78
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
79
|
+
});
|
|
80
|
+
return res.api_key;
|
|
81
|
+
}
|
|
82
|
+
export async function keysRename(ctx, id, name) {
|
|
83
|
+
const key = await keysRenameData(ctx, id, name);
|
|
84
|
+
return `Renamed ${key.prefix} to ${key.name}.`;
|
|
85
|
+
}
|
|
86
|
+
function normalizeKeyName(name) {
|
|
87
|
+
const normalized = name.trim();
|
|
88
|
+
if (!normalized) {
|
|
89
|
+
throw new Error("API key name cannot be blank.");
|
|
90
|
+
}
|
|
91
|
+
return normalized;
|
|
92
|
+
}
|
|
93
|
+
function normalizeScopes(scopes) {
|
|
94
|
+
if (scopes.length === 0) {
|
|
95
|
+
throw new Error("Pass at least one --scope, e.g. --scope agents:read.");
|
|
96
|
+
}
|
|
97
|
+
const allowed = new Set(API_KEY_SCOPES);
|
|
98
|
+
const normalized = scopes.map((scope) => normalizeNonBlank(scope, "API key scope"));
|
|
99
|
+
const unknown = normalized.filter((scope) => !allowed.has(scope));
|
|
100
|
+
if (unknown.length > 0) {
|
|
101
|
+
const suggestion = unknown.length === 1 ? closestChoice(unknown[0], API_KEY_SCOPES) : null;
|
|
102
|
+
throw new Error(`Unknown --scope ${unknown.join(", ")}. Allowed scopes: ${API_KEY_SCOPES.join(", ")}.` +
|
|
103
|
+
(suggestion ? ` Did you mean ${suggestion}?` : ""));
|
|
104
|
+
}
|
|
105
|
+
return normalized;
|
|
106
|
+
}
|
|
107
|
+
function normalizeCreateOptions(scopes, opts) {
|
|
108
|
+
const normalized = { ...opts };
|
|
109
|
+
if (opts.expiresAt !== undefined) {
|
|
110
|
+
normalized.expiresAt = normalizeIsoTimestamp(opts.expiresAt, "--expires-at");
|
|
111
|
+
if (new Date(normalized.expiresAt).getTime() <= Date.now()) {
|
|
112
|
+
throw new Error("--expires-at must be in the future.");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const forced = scopes.filter((scope) => SENSITIVE_API_KEY_SCOPES.has(scope));
|
|
116
|
+
if (forced.length === 0)
|
|
117
|
+
return normalized;
|
|
118
|
+
if (normalized.expiresAt === undefined) {
|
|
119
|
+
throw new Error(`Sensitive scopes require --expires-at within 90 days: ${forced.join(", ")}.`);
|
|
120
|
+
}
|
|
121
|
+
if (new Date(normalized.expiresAt).getTime() > Date.now() + MAX_FORCED_EXPIRY_MS) {
|
|
122
|
+
throw new Error("Sensitive scopes require --expires-at within 90 days.");
|
|
123
|
+
}
|
|
124
|
+
return normalized;
|
|
125
|
+
}
|
|
126
|
+
function addKeysListScopeGuidance(error) {
|
|
127
|
+
if (error instanceof Error) {
|
|
128
|
+
const status = error.status;
|
|
129
|
+
if (status === 403 &&
|
|
130
|
+
/scope/i.test(error.message) &&
|
|
131
|
+
/(keys:read|keys:write)/.test(error.message) &&
|
|
132
|
+
!error.message.includes("Listing API keys requires")) {
|
|
133
|
+
error.message +=
|
|
134
|
+
`${error.message.endsWith(".") ? "" : "."} ` +
|
|
135
|
+
"Listing API keys requires `keys:read` or `keys:write`.";
|
|
136
|
+
}
|
|
137
|
+
return error;
|
|
138
|
+
}
|
|
139
|
+
return new Error(String(error));
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type DeviceFlowOptions } from "../device-flow.js";
|
|
2
|
+
export interface LoginOptions {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
gitBaseUrl?: string;
|
|
5
|
+
profile?: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
runGit?: (args: string[]) => Promise<boolean>;
|
|
9
|
+
deviceFlow?: Partial<DeviceFlowOptions>;
|
|
10
|
+
log?: (line: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface LoginResult {
|
|
13
|
+
path: string;
|
|
14
|
+
helperInstalled: boolean;
|
|
15
|
+
gitBaseUrl: string;
|
|
16
|
+
organization: {
|
|
17
|
+
slug: string;
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
20
|
+
keyName: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function login(opts?: LoginOptions): Promise<LoginResult>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import { HttpClient } from "@dharta/sdk";
|
|
4
|
+
import { cliFormatError, cliFormatNetworkError } from "../api-error.js";
|
|
5
|
+
import { DEFAULT_BASE_URL, DEFAULT_GIT_BASE_URL, saveProfile, } from "../config.js";
|
|
6
|
+
import { deviceFlowLogin } from "../device-flow.js";
|
|
7
|
+
import { normalizeHttpUrl, normalizeNonBlank } from "../validators.js";
|
|
8
|
+
// Default path is the RFC 8628 device flow (no key ever pasted); the
|
|
9
|
+
// `--with-token` / apiKey path is the gh-parity fallback for CI and
|
|
10
|
+
// air-gapped boxes.
|
|
11
|
+
export async function login(opts = {}) {
|
|
12
|
+
const baseUrl = opts.baseUrl === undefined ? DEFAULT_BASE_URL : normalizeHttpUrl(opts.baseUrl, "--base-url");
|
|
13
|
+
const gitBaseUrl = opts.gitBaseUrl === undefined ? DEFAULT_GIT_BASE_URL : normalizeHttpUrl(opts.gitBaseUrl, "--git-base-url");
|
|
14
|
+
const profileName = opts.profile === undefined ? "default" : normalizeNonBlank(opts.profile, "--profile");
|
|
15
|
+
const key = opts.apiKey ??
|
|
16
|
+
(await deviceFlowLogin({
|
|
17
|
+
baseUrl,
|
|
18
|
+
clientName: hostname(),
|
|
19
|
+
fetchImpl: opts.fetchImpl,
|
|
20
|
+
log: opts.log,
|
|
21
|
+
...opts.deviceFlow,
|
|
22
|
+
}));
|
|
23
|
+
if (!key) {
|
|
24
|
+
throw new Error("No API key provided. Run `dharta login` for the browser flow, or pipe a key: " +
|
|
25
|
+
"echo $DHARTA_API_KEY | dharta login --with-token");
|
|
26
|
+
}
|
|
27
|
+
// Validate the credential and learn who it is in one round-trip.
|
|
28
|
+
const http = new HttpClient({
|
|
29
|
+
apiKey: key,
|
|
30
|
+
baseUrl,
|
|
31
|
+
fetch: opts.fetchImpl,
|
|
32
|
+
formatError: cliFormatError,
|
|
33
|
+
formatNetworkError: cliFormatNetworkError,
|
|
34
|
+
});
|
|
35
|
+
const me = await http.request({ path: "/me" });
|
|
36
|
+
// RFC 0043 D8: the data-plane host this org clones karta workspaces from (the helper
|
|
37
|
+
// mints against it; the clone bytes never pass through the control plane).
|
|
38
|
+
const workspaceGitBaseUrl = me.workspace_git?.base_url;
|
|
39
|
+
const path = await saveProfile(profileName, {
|
|
40
|
+
api_key: key,
|
|
41
|
+
base_url: baseUrl,
|
|
42
|
+
git_base_url: gitBaseUrl,
|
|
43
|
+
workspace_git_base_url: workspaceGitBaseUrl,
|
|
44
|
+
});
|
|
45
|
+
const runGitFn = opts.runGit ?? runGit;
|
|
46
|
+
// RFC 0011 GIT-5: wire the credential helper so `git push dharta`
|
|
47
|
+
// never prompts. Scoped to the git host only; the key itself stays
|
|
48
|
+
// in ~/.dharta/config.toml (the helper reads it at use time, so
|
|
49
|
+
// re-login/rotation needs no re-wiring). Best effort: a machine
|
|
50
|
+
// without git still logs in fine.
|
|
51
|
+
const helperInstalled = await runGitFn([
|
|
52
|
+
"config",
|
|
53
|
+
"--global",
|
|
54
|
+
`credential.${gitBaseUrl}.helper`,
|
|
55
|
+
"!dharta git-credential",
|
|
56
|
+
]);
|
|
57
|
+
// RFC 0043 D8: the same helper for the workspace clone host, plus useHttpPath so git
|
|
58
|
+
// passes the karta id in the path (the helper mints a per-karta read-only token).
|
|
59
|
+
if (workspaceGitBaseUrl) {
|
|
60
|
+
await runGitFn(["config", "--global", `credential.${workspaceGitBaseUrl}.helper`, "!dharta git-credential"]);
|
|
61
|
+
await runGitFn(["config", "--global", `credential.${workspaceGitBaseUrl}.useHttpPath`, "true"]);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
path,
|
|
65
|
+
helperInstalled,
|
|
66
|
+
gitBaseUrl,
|
|
67
|
+
organization: me.organization,
|
|
68
|
+
keyName: me.api_key.name,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function runGit(args) {
|
|
72
|
+
return new Promise((resolvePromise) => {
|
|
73
|
+
const proc = spawn("git", args, { stdio: "ignore" });
|
|
74
|
+
proc.on("error", () => resolvePromise(false));
|
|
75
|
+
proc.on("close", (code) => resolvePromise(code === 0));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CliContext } from "../context.js";
|
|
2
|
+
export interface LogLine {
|
|
3
|
+
ts: string;
|
|
4
|
+
level?: string;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LogsOptions {
|
|
8
|
+
tail?: boolean;
|
|
9
|
+
since?: string;
|
|
10
|
+
pollIntervalMs?: number;
|
|
11
|
+
maxIterations?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function validateLogsOptions(opts: LogsOptions): void;
|
|
14
|
+
export declare function logsTail(ctx: CliContext, slug: string, opts: LogsOptions, write: (line: string) => void): Promise<number>;
|