@opvs-ai/cli 0.3.1 → 0.4.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.
- package/dist/commands/auth.js +113 -50
- package/dist/commands/auth.js.map +1 -1
- package/dist/lib/auth-poll.d.ts +2 -0
- package/dist/lib/auth-poll.js +2 -1
- package/dist/lib/auth-poll.js.map +1 -1
- package/dist/lib/format.js +3 -0
- package/dist/lib/format.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/auth.js
CHANGED
|
@@ -9,73 +9,136 @@ export function registerAuthCommands(program) {
|
|
|
9
9
|
const auth = program.command("auth").description("Token authentication");
|
|
10
10
|
auth
|
|
11
11
|
.command("request")
|
|
12
|
-
.description("Request a PAT token (sends approval email to
|
|
13
|
-
.requiredOption("-e, --email <email>", "
|
|
12
|
+
.description("Request a PAT token (sends approval email to admin)")
|
|
13
|
+
.requiredOption("-e, --email <email>", "Admin email (who approves)")
|
|
14
14
|
.option("-p, --project <name>", "Project name (shown in approval email)")
|
|
15
15
|
.option("-s, --scopes <scopes>", "Comma-separated scopes", "board:read,board:write")
|
|
16
16
|
.option("-t, --ttl <hours>", "Token TTL in hours", "72")
|
|
17
17
|
.option("--api-url <url>", "API base URL (overrides config)")
|
|
18
18
|
.action(async (opts) => {
|
|
19
|
-
// Workspace comes from global -w flag
|
|
20
19
|
const wsSlug = program.opts().workspace;
|
|
21
|
-
if (!wsSlug) {
|
|
22
|
-
console.error("Workspace required. Use: opvs -w <slug> auth request -e <email>");
|
|
23
|
-
process.exit(1);
|
|
24
|
-
}
|
|
25
|
-
// Resolve API URL: explicit flag > existing workspace > default
|
|
26
20
|
const config = loadRawConfig();
|
|
27
|
-
const existing = config.workspaces[wsSlug];
|
|
28
|
-
const baseUrl = opts.apiUrl || existing?.api_url || DEFAULT_WORKSPACE.api_url;
|
|
29
21
|
const fingerprint = buildFingerprint();
|
|
30
22
|
const scopes = opts.scopes.split(",").map((s) => s.trim());
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// Start polling
|
|
47
|
-
const result = await pollForApproval(baseUrl, request_id, poll_token);
|
|
48
|
-
if (result.status === "active" && result.token) {
|
|
49
|
-
// Save token to workspace-scoped config
|
|
50
|
-
saveWorkspace(wsSlug, {
|
|
51
|
-
api_url: baseUrl,
|
|
52
|
-
token: result.token,
|
|
53
|
-
brand_id: result.brand_id ?? null,
|
|
54
|
-
brand_name: result.brand_name ?? "",
|
|
23
|
+
// Resolve API URL: explicit flag > existing workspace > default
|
|
24
|
+
const existing = wsSlug ? config.workspaces[wsSlug] : undefined;
|
|
25
|
+
const baseUrl = opts.apiUrl || existing?.api_url || DEFAULT_WORKSPACE.api_url;
|
|
26
|
+
if (wsSlug) {
|
|
27
|
+
// Legacy flow: workspace slug provided — single-brand request
|
|
28
|
+
console.log(`Requesting access to workspace "${wsSlug}"...`);
|
|
29
|
+
console.log(`Approval email will be sent to ${opts.email}`);
|
|
30
|
+
try {
|
|
31
|
+
const res = await apiUnauthPost(baseUrl, "/api/v1/auth/pat/request", {
|
|
32
|
+
workspace_slug: wsSlug,
|
|
33
|
+
owner_email: opts.email,
|
|
34
|
+
project_name: opts.project || null,
|
|
35
|
+
requested_scopes: scopes,
|
|
36
|
+
ttl_hours: parseInt(opts.ttl, 10),
|
|
37
|
+
fingerprint,
|
|
55
38
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
console.log(`
|
|
59
|
-
console.log(`
|
|
39
|
+
const data = await res.json();
|
|
40
|
+
const { request_id, poll_token, expires_at } = data;
|
|
41
|
+
console.log(`Request ID: ${request_id}`);
|
|
42
|
+
console.log(`Expires: ${expires_at}`);
|
|
43
|
+
const result = await pollForApproval(baseUrl, request_id, poll_token);
|
|
44
|
+
if (result.status === "active" && result.token) {
|
|
45
|
+
saveWorkspace(wsSlug, {
|
|
46
|
+
api_url: baseUrl,
|
|
47
|
+
token: result.token,
|
|
48
|
+
brand_id: result.brand_id ?? null,
|
|
49
|
+
brand_name: result.brand_name ?? "",
|
|
50
|
+
});
|
|
51
|
+
setCurrentWorkspace(wsSlug);
|
|
52
|
+
console.log(`\nAuthenticated! Token saved to workspace "${wsSlug}".`);
|
|
53
|
+
console.log(`Brand: ${result.brand_name} (ID: ${result.brand_id})`);
|
|
54
|
+
console.log(`Scopes: ${result.scopes?.join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
else if (result.status === "denied") {
|
|
57
|
+
console.error("\nAccess denied by workspace owner.");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
else if (result.status === "expired") {
|
|
61
|
+
console.error("\nRequest expired. Try again.");
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error("\nRequest timed out. The owner may not have seen the email.");
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
60
68
|
}
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
catch (err) {
|
|
70
|
+
const e = err;
|
|
71
|
+
console.error(`Error: ${e.detail || "Request failed"}`);
|
|
63
72
|
process.exit(1);
|
|
64
73
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Simplified flow: email only — auto-discover all brands
|
|
77
|
+
console.log(`Requesting access for ${opts.email}...`);
|
|
78
|
+
try {
|
|
79
|
+
const res = await apiUnauthPost(baseUrl, "/api/v1/auth/pat/request-by-email", {
|
|
80
|
+
owner_email: opts.email,
|
|
81
|
+
project_name: opts.project || null,
|
|
82
|
+
requested_scopes: scopes,
|
|
83
|
+
ttl_hours: parseInt(opts.ttl, 10),
|
|
84
|
+
fingerprint,
|
|
85
|
+
});
|
|
86
|
+
const data = await res.json();
|
|
87
|
+
const { request_id, poll_token, expires_at, brands } = data;
|
|
88
|
+
const brandCount = brands?.length ?? 0;
|
|
89
|
+
console.log(`Found ${brandCount} workspace${brandCount !== 1 ? "s" : ""}. Approval email sent to ${opts.email}`);
|
|
90
|
+
console.log(`Request ID: ${request_id}`);
|
|
91
|
+
console.log(`Expires: ${expires_at}`);
|
|
92
|
+
const result = await pollForApproval(baseUrl, request_id, poll_token);
|
|
93
|
+
if (result.status === "active" && result.workspaces?.length) {
|
|
94
|
+
// Save each workspace
|
|
95
|
+
for (const ws of result.workspaces) {
|
|
96
|
+
saveWorkspace(ws.brand_slug, {
|
|
97
|
+
api_url: baseUrl,
|
|
98
|
+
token: ws.token,
|
|
99
|
+
brand_id: ws.brand_id,
|
|
100
|
+
brand_name: ws.brand_name,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Set the first workspace as current
|
|
104
|
+
setCurrentWorkspace(result.workspaces[0].brand_slug);
|
|
105
|
+
const slugs = result.workspaces.map((ws) => ws.brand_slug).join(", ");
|
|
106
|
+
console.log(`\nAuthenticated! ${result.workspaces.length} workspace${result.workspaces.length !== 1 ? "s" : ""} configured: ${slugs}`);
|
|
107
|
+
for (const ws of result.workspaces) {
|
|
108
|
+
console.log(` ${ws.brand_slug}: ${ws.brand_name} (ID: ${ws.brand_id})`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (result.status === "active" && result.token) {
|
|
112
|
+
// Fallback: server returned single-brand format
|
|
113
|
+
const slug = brands?.[0]?.brand_slug || "default";
|
|
114
|
+
saveWorkspace(slug, {
|
|
115
|
+
api_url: baseUrl,
|
|
116
|
+
token: result.token,
|
|
117
|
+
brand_id: result.brand_id ?? null,
|
|
118
|
+
brand_name: result.brand_name ?? "",
|
|
119
|
+
});
|
|
120
|
+
setCurrentWorkspace(slug);
|
|
121
|
+
console.log(`\nAuthenticated! Token saved to workspace "${slug}".`);
|
|
122
|
+
}
|
|
123
|
+
else if (result.status === "denied") {
|
|
124
|
+
console.error("\nAccess denied by admin.");
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
else if (result.status === "expired") {
|
|
128
|
+
console.error("\nRequest expired. Try again.");
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.error("\nRequest timed out. The admin may not have seen the email.");
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
68
135
|
}
|
|
69
|
-
|
|
70
|
-
|
|
136
|
+
catch (err) {
|
|
137
|
+
const e = err;
|
|
138
|
+
console.error(`Error: ${e.detail || "Request failed"}`);
|
|
71
139
|
process.exit(1);
|
|
72
140
|
}
|
|
73
141
|
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
const e = err;
|
|
76
|
-
console.error(`Error: ${e.detail || "Request failed"}`);
|
|
77
|
-
process.exit(1);
|
|
78
|
-
}
|
|
79
142
|
});
|
|
80
143
|
auth
|
|
81
144
|
.command("status")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEzE,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEzE,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qDAAqD,CAAC;SAClE,cAAc,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;SACnE,MAAM,CAAC,sBAAsB,EAAE,wCAAwC,CAAC;SACxE,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,EAAE,wBAAwB,CAAC;SACnF,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,IAAI,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnE,gEAAgE;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC;QAE9E,IAAI,MAAM,EAAE,CAAC;YACX,8DAA8D;YAC9D,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,MAAM,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,0BAA0B,EAAE;oBACnE,cAAc,EAAE,MAAM;oBACtB,WAAW,EAAE,IAAI,CAAC,KAAK;oBACvB,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;oBAClC,gBAAgB,EAAE,MAAM;oBACxB,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBACjC,WAAW;iBACZ,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;gBAEpD,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;gBAEtC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBAEtE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC/C,aAAa,CAAC,MAAM,EAAE;wBACpB,OAAO,EAAE,OAAO;wBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;wBACjC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;qBACpC,CAAC,CAAC;oBACH,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,8CAA8C,MAAM,IAAI,CAAC,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,UAAU,SAAS,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACpE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtD,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,GAA2C,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yDAAyD;YACzD,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,mCAAmC,EAAE;oBAC5E,WAAW,EAAE,IAAI,CAAC,KAAK;oBACvB,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;oBAClC,gBAAgB,EAAE,MAAM;oBACxB,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBACjC,WAAW;iBACZ,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;gBAE5D,MAAM,UAAU,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,aAAa,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,4BAA4B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjH,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;gBAEtC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBAEtE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;oBAC5D,sBAAsB;oBACtB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBACnC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE;4BAC3B,OAAO,EAAE,OAAO;4BAChB,KAAK,EAAE,EAAE,CAAC,KAAK;4BACf,QAAQ,EAAE,EAAE,CAAC,QAAQ;4BACrB,UAAU,EAAE,EAAE,CAAC,UAAU;yBAC1B,CAAC,CAAC;oBACL,CAAC;oBACD,qCAAqC;oBACrC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;oBAErD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAA0B,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9F,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,UAAU,CAAC,MAAM,aAAa,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,gBAAgB,KAAK,EAAE,CAAC,CAAC;oBACvI,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU,SAAS,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtD,gDAAgD;oBAChD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,SAAS,CAAC;oBAClD,aAAa,CAAC,IAAI,EAAE;wBAClB,OAAO,EAAE,OAAO;wBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;wBACjC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;qBACpC,CAAC,CAAC;oBACH,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,8CAA8C,IAAI,IAAI,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,GAA2C,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA2C,CAAC;YACtD,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,wBAAwB,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,4DAA4D;YAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAkF,CAAC;YACtH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,CAChD,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACrE,CAAC;YACD,kCAAkC;YAClC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,uCAAuC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0B,CAAC;YACrC,iDAAiD;YACjD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBACvC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,MAAM,8BAA8B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0B,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,uBAAuB,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/lib/auth-poll.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Polling loop for PAT approval — waits for human to click approve/deny.
|
|
3
3
|
*/
|
|
4
|
+
import type { PATWorkspaceToken } from "@opvs-ai/core";
|
|
4
5
|
export interface PollResult {
|
|
5
6
|
status: "active" | "denied" | "expired" | "timeout";
|
|
6
7
|
token?: string;
|
|
7
8
|
scopes?: string[];
|
|
8
9
|
brand_id?: number;
|
|
9
10
|
brand_name?: string;
|
|
11
|
+
workspaces?: PATWorkspaceToken[];
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* Poll the PAT request status endpoint until resolved or timed out.
|
package/dist/lib/auth-poll.js
CHANGED
|
@@ -15,7 +15,7 @@ export async function pollForApproval(baseUrl, requestId, pollToken, timeoutMs =
|
|
|
15
15
|
try {
|
|
16
16
|
const res = await apiUnauthGet(baseUrl, `/api/v1/auth/pat/request/${requestId}/status`, pollToken);
|
|
17
17
|
const data = (await res.json());
|
|
18
|
-
if (data.status === "active" && data.token) {
|
|
18
|
+
if (data.status === "active" && (data.token || data.workspaces?.length)) {
|
|
19
19
|
process.stderr.write(" approved!\n");
|
|
20
20
|
return {
|
|
21
21
|
status: "active",
|
|
@@ -23,6 +23,7 @@ export async function pollForApproval(baseUrl, requestId, pollToken, timeoutMs =
|
|
|
23
23
|
scopes: data.scopes,
|
|
24
24
|
brand_id: data.brand_id,
|
|
25
25
|
brand_name: data.brand_name,
|
|
26
|
+
workspaces: data.workspaces,
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
if (data.status === "denied") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-poll.js","sourceRoot":"","sources":["../../src/lib/auth-poll.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"auth-poll.js","sourceRoot":"","sources":["../../src/lib/auth-poll.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAatD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,SAAiB,EACjB,SAAiB,EACjB,SAAS,GAAG,kBAAkB;IAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAE9C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,OAAO,EACP,4BAA4B,SAAS,SAAS,EAC9C,SAAS,CACV,CAAC;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;YAErD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;gBACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACrC,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC5B,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACnC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC9B,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACpC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/lib/format.js
CHANGED
|
@@ -21,6 +21,9 @@ export function printJson(data) {
|
|
|
21
21
|
* View endpoints return text/plain or text/yaml; others return JSON.
|
|
22
22
|
*/
|
|
23
23
|
export async function printResponse(res, preferJson = false) {
|
|
24
|
+
if (res.status === 204 || res.headers.get("content-length") === "0") {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
24
27
|
const ct = res.headers.get("content-type") || "";
|
|
25
28
|
if (preferJson || ct.includes("application/json")) {
|
|
26
29
|
const data = await res.json();
|
package/dist/lib/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8CAA8C;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtD,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAa,EAAE,UAAU,GAAG,KAAK;IACnE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,UAAU,IAAI,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8CAA8C;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtD,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAa,EAAE,UAAU,GAAG,KAAK;IACnE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,GAAG,EAAE,CAAC;QACpE,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,UAAU,IAAI,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opvs-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "OPVS CLI — Terminal access to AgentBoard + AgentDocs for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"start": "node dist/index.js"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@opvs-ai/core": "^0.
|
|
15
|
+
"@opvs-ai/core": "^0.3.0",
|
|
16
16
|
"commander": "^12.1.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|