@armoriq/sdk-dev 0.2.14 → 0.3.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/_build_env.d.ts +11 -18
- package/dist/_build_env.d.ts.map +1 -1
- package/dist/_build_env.js +18 -6
- package/dist/_build_env.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +15 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +259 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +14 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +132 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cli/commands/orgs.d.ts +10 -0
- package/dist/cli/commands/orgs.d.ts.map +1 -0
- package/dist/cli/commands/orgs.js +152 -0
- package/dist/cli/commands/orgs.js.map +1 -0
- package/dist/cli/commands/status.d.ts +9 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +103 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +141 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/state.d.ts +22 -0
- package/dist/cli/state.d.ts.map +1 -0
- package/dist/cli/state.js +91 -0
- package/dist/cli/state.js.map +1 -0
- package/dist/cli/util.d.ts +19 -0
- package/dist/cli/util.d.ts.map +1 -0
- package/dist/cli/util.js +107 -0
- package/dist/cli/util.js.map +1 -0
- package/dist/client.d.ts +72 -13
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +323 -26
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +64 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +215 -0
- package/dist/config.js.map +1 -0
- package/dist/exceptions.d.ts +4 -2
- package/dist/exceptions.d.ts.map +1 -1
- package/dist/exceptions.js +6 -2
- package/dist/exceptions.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/google_adk.d.ts +107 -0
- package/dist/integrations/google_adk.d.ts.map +1 -0
- package/dist/integrations/google_adk.js +301 -0
- package/dist/integrations/google_adk.js.map +1 -0
- package/dist/models.d.ts +36 -2
- package/dist/models.d.ts.map +1 -1
- package/dist/plan_builder.d.ts +53 -0
- package/dist/plan_builder.d.ts.map +1 -0
- package/dist/plan_builder.js +110 -0
- package/dist/plan_builder.js.map +1 -0
- package/dist/session.d.ts +75 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +486 -0
- package/dist/session.js.map +1 -0
- package/package.json +9 -2
package/dist/_build_env.d.ts
CHANGED
|
@@ -9,25 +9,18 @@
|
|
|
9
9
|
* main branch → ARMORIQ_ENV = "production" (prod URLs; published as stable)
|
|
10
10
|
* dev branch → ARMORIQ_ENV = "staging" (staging URLs; published as -dev)
|
|
11
11
|
*
|
|
12
|
-
* The baked constant is the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* / PROXY_ENDPOINT env vars.
|
|
12
|
+
* The baked constant is the branch-baked default. Set ARMORIQ_ENV=local
|
|
13
|
+
* (or staging/production) in your shell to override at runtime. Per-
|
|
14
|
+
* endpoint env vars (BACKEND_ENDPOINT / IAP_ENDPOINT / PROXY_ENDPOINT)
|
|
15
|
+
* and constructor args still win over both.
|
|
17
16
|
*/
|
|
18
|
-
export
|
|
19
|
-
export declare const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
readonly staging: {
|
|
26
|
-
readonly backend: "https://staging-api.armoriq.ai";
|
|
27
|
-
readonly proxy: "https://cloud-run-proxy.armoriq.io";
|
|
28
|
-
readonly iap: "https://iap-staging.armoriq.ai";
|
|
29
|
-
};
|
|
30
|
-
};
|
|
17
|
+
export type EnvName = 'production' | 'staging' | 'local';
|
|
18
|
+
export declare const ARMORIQ_ENV: EnvName;
|
|
19
|
+
export declare const ENDPOINTS: Record<EnvName, {
|
|
20
|
+
backend: string;
|
|
21
|
+
proxy: string;
|
|
22
|
+
iap: string;
|
|
23
|
+
}>;
|
|
31
24
|
export type EndpointKind = 'backend' | 'proxy' | 'iap';
|
|
32
25
|
export declare function resolveEndpoint(kind: EndpointKind): string;
|
|
33
26
|
//# sourceMappingURL=_build_env.d.ts.map
|
package/dist/_build_env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_build_env.d.ts","sourceRoot":"","sources":["../src/_build_env.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"_build_env.d.ts","sourceRoot":"","sources":["../src/_build_env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,eAAO,MAAM,WAAW,EAAE,OAAmB,CAAC;AAY9C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAgBtF,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAUvD,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAE1D"}
|
package/dist/_build_env.js
CHANGED
|
@@ -10,11 +10,10 @@
|
|
|
10
10
|
* main branch → ARMORIQ_ENV = "production" (prod URLs; published as stable)
|
|
11
11
|
* dev branch → ARMORIQ_ENV = "staging" (staging URLs; published as -dev)
|
|
12
12
|
*
|
|
13
|
-
* The baked constant is the
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* / PROXY_ENDPOINT env vars.
|
|
13
|
+
* The baked constant is the branch-baked default. Set ARMORIQ_ENV=local
|
|
14
|
+
* (or staging/production) in your shell to override at runtime. Per-
|
|
15
|
+
* endpoint env vars (BACKEND_ENDPOINT / IAP_ENDPOINT / PROXY_ENDPOINT)
|
|
16
|
+
* and constructor args still win over both.
|
|
18
17
|
*/
|
|
19
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
19
|
exports.ENDPOINTS = exports.ARMORIQ_ENV = void 0;
|
|
@@ -29,6 +28,7 @@ exports.ARMORIQ_ENV = 'staging';
|
|
|
29
28
|
// staging-api.armoriq.ai → conmap-auto-staging (us-central1)
|
|
30
29
|
// iap-staging.armoriq.ai → csrg-execution-service-staging (us-central1)
|
|
31
30
|
// cloud-run-proxy.armoriq.io → armoriq-proxy-dev (europe-west1)
|
|
31
|
+
// local: same ports the Python SDK uses.
|
|
32
32
|
exports.ENDPOINTS = {
|
|
33
33
|
production: {
|
|
34
34
|
backend: 'https://api.armoriq.ai',
|
|
@@ -40,8 +40,20 @@ exports.ENDPOINTS = {
|
|
|
40
40
|
proxy: 'https://cloud-run-proxy.armoriq.io',
|
|
41
41
|
iap: 'https://iap-staging.armoriq.ai',
|
|
42
42
|
},
|
|
43
|
+
local: {
|
|
44
|
+
backend: 'http://127.0.0.1:3000',
|
|
45
|
+
proxy: 'http://127.0.0.1:3001',
|
|
46
|
+
iap: 'http://127.0.0.1:8080',
|
|
47
|
+
},
|
|
43
48
|
};
|
|
49
|
+
function activeEnv() {
|
|
50
|
+
const override = (process.env.ARMORIQ_ENV || '').trim().toLowerCase();
|
|
51
|
+
if (override === 'production' || override === 'staging' || override === 'local') {
|
|
52
|
+
return override;
|
|
53
|
+
}
|
|
54
|
+
return exports.ARMORIQ_ENV;
|
|
55
|
+
}
|
|
44
56
|
function resolveEndpoint(kind) {
|
|
45
|
-
return exports.ENDPOINTS[
|
|
57
|
+
return exports.ENDPOINTS[activeEnv()][kind];
|
|
46
58
|
}
|
|
47
59
|
//# sourceMappingURL=_build_env.js.map
|
package/dist/_build_env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_build_env.js","sourceRoot":"","sources":["../src/_build_env.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"_build_env.js","sourceRoot":"","sources":["../src/_build_env.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AA4CH,0CAEC;AA1CY,QAAA,WAAW,GAAY,SAAS,CAAC;AAE9C,oEAAoE;AACpE,UAAU;AACV,gEAAgE;AAChE,gEAAgE;AAChE,gEAAgE;AAChE,aAAa;AACb,qFAAqF;AACrF,qFAAqF;AACrF,sFAAsF;AACtF,2CAA2C;AAC9B,QAAA,SAAS,GAAqE;IACzF,UAAU,EAAE;QACV,OAAO,EAAE,wBAAwB;QACjC,KAAK,EAAE,0BAA0B;QACjC,GAAG,EAAE,wBAAwB;KAC9B;IACD,OAAO,EAAE;QACP,OAAO,EAAE,gCAAgC;QACzC,KAAK,EAAE,oCAAoC;QAC3C,GAAG,EAAE,gCAAgC;KACtC;IACD,KAAK,EAAE;QACL,OAAO,EAAE,uBAAuB;QAChC,KAAK,EAAE,uBAAuB;QAC9B,GAAG,EAAE,uBAAuB;KAC7B;CACF,CAAC;AAIF,SAAS,SAAS;IAChB,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtE,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,mBAAW,CAAC;AACrB,CAAC;AAED,SAAgB,eAAe,CAAC,IAAkB;IAChD,OAAO,iBAAS,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* armoriq login / logout / whoami — OAuth 2.0 device-code flow (RFC 8628).
|
|
3
|
+
* Mirrors armoriq_sdk/cli_auth.py.
|
|
4
|
+
*
|
|
5
|
+
* The browser approval page either redirects straight back to our
|
|
6
|
+
* local callback with the key, or — if the callback can't be reached —
|
|
7
|
+
* we fall back to polling /auth/device/token.
|
|
8
|
+
*/
|
|
9
|
+
export declare function cmdLogin(args: {
|
|
10
|
+
backend?: string;
|
|
11
|
+
org?: string;
|
|
12
|
+
}): Promise<number>;
|
|
13
|
+
export declare function cmdLogout(): number;
|
|
14
|
+
export declare function cmdWhoami(): number;
|
|
15
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgHH,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0GxF;AAED,wBAAgB,SAAS,IAAI,MAAM,CAOlC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAkBlC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* armoriq login / logout / whoami — OAuth 2.0 device-code flow (RFC 8628).
|
|
4
|
+
* Mirrors armoriq_sdk/cli_auth.py.
|
|
5
|
+
*
|
|
6
|
+
* The browser approval page either redirects straight back to our
|
|
7
|
+
* local callback with the key, or — if the callback can't be reached —
|
|
8
|
+
* we fall back to polling /auth/device/token.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.cmdLogin = cmdLogin;
|
|
48
|
+
exports.cmdLogout = cmdLogout;
|
|
49
|
+
exports.cmdWhoami = cmdWhoami;
|
|
50
|
+
const http = __importStar(require("http"));
|
|
51
|
+
const net = __importStar(require("net"));
|
|
52
|
+
const url_1 = require("url");
|
|
53
|
+
const child_process_1 = require("child_process");
|
|
54
|
+
const axios_1 = __importDefault(require("axios"));
|
|
55
|
+
const credentials_1 = require("../../credentials");
|
|
56
|
+
const util_1 = require("../util");
|
|
57
|
+
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
58
|
+
<html><head><meta charset="utf-8"><title>ArmorIQ</title>
|
|
59
|
+
<style>
|
|
60
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
61
|
+
display: flex; align-items: center; justify-content: center; height: 100vh;
|
|
62
|
+
margin: 0; background: #f8fafc; color: #1e293b; }
|
|
63
|
+
.card { text-align: center; padding: 3rem; background: white;
|
|
64
|
+
border-radius: 1rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
65
|
+
max-width: 400px; }
|
|
66
|
+
.check { width: 64px; height: 64px; background: #dcfce7; border-radius: 50%;
|
|
67
|
+
display: flex; align-items: center; justify-content: center;
|
|
68
|
+
margin: 0 auto 1.5rem; }
|
|
69
|
+
.check svg { width: 32px; height: 32px; color: #16a34a; }
|
|
70
|
+
h2 { margin: 0 0 0.5rem; font-size: 1.25rem; }
|
|
71
|
+
p { margin: 0; font-size: 0.875rem; color: #64748b; }
|
|
72
|
+
</style></head><body>
|
|
73
|
+
<div class="card">
|
|
74
|
+
<div class="check">
|
|
75
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
76
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
|
|
77
|
+
</svg>
|
|
78
|
+
</div>
|
|
79
|
+
<h2>Authorized</h2>
|
|
80
|
+
<p>You can close this tab and return to your terminal.</p>
|
|
81
|
+
</div>
|
|
82
|
+
</body></html>`;
|
|
83
|
+
function findFreePort() {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const server = net.createServer();
|
|
86
|
+
server.unref();
|
|
87
|
+
server.on('error', reject);
|
|
88
|
+
server.listen(0, '127.0.0.1', () => {
|
|
89
|
+
const addr = server.address();
|
|
90
|
+
if (addr && typeof addr === 'object') {
|
|
91
|
+
const port = addr.port;
|
|
92
|
+
server.close(() => resolve(port));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
reject(new Error('Could not get free port'));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function startCallbackServer(port) {
|
|
101
|
+
let resolveResult;
|
|
102
|
+
const once = new Promise((resolve) => {
|
|
103
|
+
resolveResult = resolve;
|
|
104
|
+
});
|
|
105
|
+
const server = http.createServer((req, res) => {
|
|
106
|
+
const url = new url_1.URL(req.url ?? '/', `http://localhost:${port}`);
|
|
107
|
+
if (url.pathname === '/callback') {
|
|
108
|
+
const params = Object.fromEntries(url.searchParams.entries());
|
|
109
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
110
|
+
res.end(SUCCESS_HTML);
|
|
111
|
+
const result = {
|
|
112
|
+
api_key: params.key,
|
|
113
|
+
email: params.email,
|
|
114
|
+
user_id: params.user_id,
|
|
115
|
+
org_id: params.org_id,
|
|
116
|
+
};
|
|
117
|
+
if (result.api_key)
|
|
118
|
+
resolveResult(result);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
res.writeHead(404);
|
|
122
|
+
res.end();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
server.listen(port, '127.0.0.1');
|
|
126
|
+
return { server, once };
|
|
127
|
+
}
|
|
128
|
+
function openBrowser(url) {
|
|
129
|
+
const cmd = process.platform === 'darwin'
|
|
130
|
+
? `open "${url}"`
|
|
131
|
+
: process.platform === 'win32'
|
|
132
|
+
? `start "" "${url}"`
|
|
133
|
+
: `xdg-open "${url}"`;
|
|
134
|
+
(0, child_process_1.exec)(cmd, () => {
|
|
135
|
+
/* best-effort */
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function sleep(ms) {
|
|
139
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
140
|
+
}
|
|
141
|
+
async function cmdLogin(args) {
|
|
142
|
+
const backend = (args.backend ?? process.env.ARMORIQ_BACKEND_URL ?? (0, util_1.backendBase)()).replace(/\/+$/, '');
|
|
143
|
+
const requestedOrg = (args.org ?? '').trim();
|
|
144
|
+
(0, util_1.out)('');
|
|
145
|
+
(0, util_1.out)(' \x1b[1m\x1b[36m┃ ArmorIQ Login\x1b[0m');
|
|
146
|
+
(0, util_1.out)('');
|
|
147
|
+
const port = await findFreePort();
|
|
148
|
+
const callbackUrl = `http://localhost:${port}/callback`;
|
|
149
|
+
const { server, once: callbackOnce } = startCallbackServer(port);
|
|
150
|
+
let dc;
|
|
151
|
+
try {
|
|
152
|
+
const r = await axios_1.default.post(`${backend}/auth/device/code`, { callback_url: callbackUrl }, { timeout: 10000 });
|
|
153
|
+
dc = r.data;
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
server.close();
|
|
157
|
+
(0, util_1.out)(` ${util_1.CROSS} Failed to request device code: ${e.message}`);
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
const { device_code, user_code, verification_uri_complete } = dc;
|
|
161
|
+
const interval = Number(dc.interval ?? 5) || 5;
|
|
162
|
+
const expiresIn = Number(dc.expires_in ?? 600) || 600;
|
|
163
|
+
const sep = verification_uri_complete.includes('?') ? '&' : '?';
|
|
164
|
+
let browserUrl = `${verification_uri_complete}${sep}callback=${encodeURIComponent(callbackUrl)}`;
|
|
165
|
+
if (requestedOrg)
|
|
166
|
+
browserUrl += `&org=${encodeURIComponent(requestedOrg)}`;
|
|
167
|
+
(0, util_1.out)(' Opening browser...\n');
|
|
168
|
+
openBrowser(browserUrl);
|
|
169
|
+
(0, util_1.out)(' If the browser didn\'t open, visit:');
|
|
170
|
+
(0, util_1.out)(` \x1b[36m\x1b[1m${browserUrl}\x1b[0m\n`);
|
|
171
|
+
(0, util_1.out)(` Confirm this code in your browser: \x1b[1m${user_code}\x1b[0m\n`);
|
|
172
|
+
process.stdout.write(' Waiting for authorization...');
|
|
173
|
+
const deadline = Date.now() + expiresIn * 1000;
|
|
174
|
+
let result;
|
|
175
|
+
let lastErr;
|
|
176
|
+
while (Date.now() < deadline && !result) {
|
|
177
|
+
// Race callback vs poll; whichever resolves first wins.
|
|
178
|
+
const callbackOrTimeout = Promise.race([
|
|
179
|
+
callbackOnce.then((r) => ({ kind: 'cb', value: r })),
|
|
180
|
+
sleep(interval * 1000).then(() => ({ kind: 'tick' })),
|
|
181
|
+
]);
|
|
182
|
+
const tick = await callbackOrTimeout;
|
|
183
|
+
if (tick.kind === 'cb' && tick.value.api_key) {
|
|
184
|
+
result = tick.value;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const pr = await axios_1.default.post(`${backend}/auth/device/token`, { deviceCode: device_code }, { timeout: 10000, validateStatus: () => true });
|
|
189
|
+
const data = pr.data ?? {};
|
|
190
|
+
const err = data.error;
|
|
191
|
+
if (err === 'authorization_pending' || err === 'slow_down')
|
|
192
|
+
continue;
|
|
193
|
+
if (err) {
|
|
194
|
+
lastErr = data.error_description || err;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
if (data.api_key) {
|
|
198
|
+
result = {
|
|
199
|
+
api_key: data.api_key,
|
|
200
|
+
email: data.email,
|
|
201
|
+
user_id: data.user_id,
|
|
202
|
+
org_id: data.org_id,
|
|
203
|
+
};
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// network blip; keep polling
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
server.close();
|
|
212
|
+
if (!result || !result.api_key) {
|
|
213
|
+
(0, util_1.out)(` ${util_1.CROSS}`);
|
|
214
|
+
(0, util_1.out)(` ${util_1.CROSS} ${lastErr ?? 'Timed out waiting for authorization. Run `armoriq login` again.'}`);
|
|
215
|
+
return 1;
|
|
216
|
+
}
|
|
217
|
+
(0, credentials_1.saveCredentials)({
|
|
218
|
+
apiKey: result.api_key,
|
|
219
|
+
email: result.email ?? '',
|
|
220
|
+
userId: result.user_id ?? '',
|
|
221
|
+
orgId: result.org_id ?? '',
|
|
222
|
+
savedAt: new Date().toISOString(),
|
|
223
|
+
});
|
|
224
|
+
(0, util_1.out)(` ${util_1.CHECK}`);
|
|
225
|
+
(0, util_1.out)('');
|
|
226
|
+
(0, util_1.out)(` ${util_1.CHECK} Logged in as \x1b[1m${result.email ?? 'unknown'}\x1b[0m (org: ${result.org_id ?? 'unknown'})`);
|
|
227
|
+
(0, util_1.out)(` ${util_1.CHECK} API key saved to ${(0, credentials_1.getCredentialsPath)()}`);
|
|
228
|
+
(0, util_1.out)('');
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
function cmdLogout() {
|
|
232
|
+
if ((0, credentials_1.clearCredentials)()) {
|
|
233
|
+
(0, util_1.out)(` ${util_1.CHECK} Credentials removed from ${(0, credentials_1.getCredentialsPath)()}`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
(0, util_1.out)(' \x1b[2mNo credentials found — already logged out.\x1b[0m');
|
|
237
|
+
}
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
function cmdWhoami() {
|
|
241
|
+
const creds = (0, credentials_1.loadCredentials)();
|
|
242
|
+
if (!creds) {
|
|
243
|
+
(0, util_1.out)(' \x1b[2mNot logged in. Run `armoriq login` to authenticate.\x1b[0m');
|
|
244
|
+
return 0;
|
|
245
|
+
}
|
|
246
|
+
(0, util_1.out)('');
|
|
247
|
+
(0, util_1.out)(' \x1b[1m\x1b[36m┃ ArmorIQ Credentials\x1b[0m');
|
|
248
|
+
(0, util_1.out)('');
|
|
249
|
+
const keyPreview = creds.apiKey.length > 16 ? creds.apiKey.slice(0, 16) + '...' : creds.apiKey;
|
|
250
|
+
(0, util_1.out)(` Email: \x1b[1m${creds.email || 'unknown'}\x1b[0m`);
|
|
251
|
+
(0, util_1.out)(` API Key: \x1b[2m${keyPreview}\x1b[0m`);
|
|
252
|
+
(0, util_1.out)(` User ID: \x1b[2m${creds.userId || 'n/a'}\x1b[0m`);
|
|
253
|
+
(0, util_1.out)(` Org ID: \x1b[2m${creds.orgId || 'n/a'}\x1b[0m`);
|
|
254
|
+
(0, util_1.out)(` Saved at: \x1b[2m${creds.savedAt || 'n/a'}\x1b[0m`);
|
|
255
|
+
(0, util_1.out)(` File: \x1b[2m${(0, credentials_1.getCredentialsPath)()}\x1b[0m`);
|
|
256
|
+
(0, util_1.out)('');
|
|
257
|
+
return 0;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* armoriq keys list / revoke / prune — API key management.
|
|
3
|
+
* Mirrors PR #24 (TS) by symmetry; backend routes already exist:
|
|
4
|
+
* GET /api-keys (JwtAuthGuard — uses credentials JWT)
|
|
5
|
+
* POST /api-keys/:id/revoke (JwtAuthGuard)
|
|
6
|
+
*/
|
|
7
|
+
export declare function cmdKeysList(): Promise<number>;
|
|
8
|
+
export declare function cmdKeysRevoke(args: {
|
|
9
|
+
id: string;
|
|
10
|
+
}): Promise<number>;
|
|
11
|
+
export declare function cmdKeysPrune(args: {
|
|
12
|
+
yes?: boolean;
|
|
13
|
+
}): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiDH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA0BnD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4C3E"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* armoriq keys list / revoke / prune — API key management.
|
|
4
|
+
* Mirrors PR #24 (TS) by symmetry; backend routes already exist:
|
|
5
|
+
* GET /api-keys (JwtAuthGuard — uses credentials JWT)
|
|
6
|
+
* POST /api-keys/:id/revoke (JwtAuthGuard)
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.cmdKeysList = cmdKeysList;
|
|
13
|
+
exports.cmdKeysRevoke = cmdKeysRevoke;
|
|
14
|
+
exports.cmdKeysPrune = cmdKeysPrune;
|
|
15
|
+
const axios_1 = __importDefault(require("axios"));
|
|
16
|
+
const util_1 = require("../util");
|
|
17
|
+
const state_1 = require("../state");
|
|
18
|
+
const KEY_COUNT_WARN_THRESHOLD = 8;
|
|
19
|
+
async function listKeys(apiKey) {
|
|
20
|
+
const url = `${(0, util_1.backendBase)()}/api-keys`;
|
|
21
|
+
const response = await axios_1.default.get(url, {
|
|
22
|
+
headers: { 'X-API-Key': apiKey },
|
|
23
|
+
timeout: 12000,
|
|
24
|
+
validateStatus: () => true,
|
|
25
|
+
});
|
|
26
|
+
if (response.status === 401)
|
|
27
|
+
throw new util_1.CLIError('API key rejected (401). Try `armoriq login` again.');
|
|
28
|
+
if (response.status >= 400)
|
|
29
|
+
throw new util_1.CLIError(`Failed to list keys (HTTP ${response.status}).`);
|
|
30
|
+
const data = response.data;
|
|
31
|
+
if (Array.isArray(data))
|
|
32
|
+
return data;
|
|
33
|
+
if (Array.isArray(data?.data))
|
|
34
|
+
return data.data;
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
async function revokeKey(apiKey, keyId) {
|
|
38
|
+
const url = `${(0, util_1.backendBase)()}/api-keys/${keyId}/revoke`;
|
|
39
|
+
const response = await axios_1.default.post(url, {}, {
|
|
40
|
+
headers: { 'X-API-Key': apiKey, 'Content-Type': 'application/json' },
|
|
41
|
+
timeout: 12000,
|
|
42
|
+
validateStatus: () => true,
|
|
43
|
+
});
|
|
44
|
+
if (response.status === 401)
|
|
45
|
+
throw new util_1.CLIError('API key rejected (401). Try `armoriq login` again.');
|
|
46
|
+
if (response.status >= 400) {
|
|
47
|
+
throw new util_1.CLIError(`Failed to revoke key ${keyId} (HTTP ${response.status}): ${response.data?.message ?? ''}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function cmdKeysList() {
|
|
51
|
+
const creds = (0, util_1.requireCredentials)();
|
|
52
|
+
const keys = await listKeys(creds.apiKey);
|
|
53
|
+
if (keys.length === 0) {
|
|
54
|
+
(0, util_1.out)('No API keys found for this account.');
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
const nameW = Math.max('NAME'.length, ...keys.map((k) => (k.name ?? '').length));
|
|
58
|
+
const idW = Math.max('ID'.length, ...keys.map((k) => k.id.length));
|
|
59
|
+
(0, util_1.out)(` ${'NAME'.padEnd(nameW)} ${'ID'.padEnd(idW)} STATUS LAST USED`);
|
|
60
|
+
(0, util_1.out)(' ' + '-'.repeat(nameW + idW + 30));
|
|
61
|
+
for (const k of keys) {
|
|
62
|
+
const name = (k.name ?? '').padEnd(nameW);
|
|
63
|
+
const id = k.id.padEnd(idW);
|
|
64
|
+
const status = (k.status ?? 'unknown').padEnd(8);
|
|
65
|
+
const last = k.lastUsedAt ?? '-';
|
|
66
|
+
(0, util_1.out)(` ${name} ${id} ${status} ${last}`);
|
|
67
|
+
}
|
|
68
|
+
(0, util_1.out)('');
|
|
69
|
+
if (keys.length > KEY_COUNT_WARN_THRESHOLD) {
|
|
70
|
+
(0, util_1.out)(`\x1b[33m!\x1b[0m You have ${keys.length} API keys. Consider \`armoriq keys prune\` to revoke unused keys.`);
|
|
71
|
+
}
|
|
72
|
+
(0, state_1.appendLog)('keys-list', { count: keys.length });
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
async function cmdKeysRevoke(args) {
|
|
76
|
+
if (!args.id)
|
|
77
|
+
throw new util_1.CLIError('Key id is required: `armoriq keys revoke <id>`.');
|
|
78
|
+
const creds = (0, util_1.requireCredentials)();
|
|
79
|
+
await revokeKey(creds.apiKey, args.id);
|
|
80
|
+
(0, util_1.out)(`${util_1.CHECK} Revoked key ${args.id}.`);
|
|
81
|
+
(0, state_1.appendLog)('keys-revoke', { id: args.id });
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
async function cmdKeysPrune(args) {
|
|
85
|
+
const creds = (0, util_1.requireCredentials)();
|
|
86
|
+
const keys = await listKeys(creds.apiKey);
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
const candidates = keys.filter((k) => {
|
|
89
|
+
if (k.status && k.status.toLowerCase() === 'revoked')
|
|
90
|
+
return false;
|
|
91
|
+
if (k.id === creds.apiKey)
|
|
92
|
+
return false;
|
|
93
|
+
if (k.expiresAt && new Date(k.expiresAt).getTime() < now)
|
|
94
|
+
return true;
|
|
95
|
+
if (k.lastUsedAt) {
|
|
96
|
+
const ageDays = (now - new Date(k.lastUsedAt).getTime()) / 86400000;
|
|
97
|
+
if (ageDays > 90)
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
if (!k.lastUsedAt && k.createdAt) {
|
|
101
|
+
const ageDays = (now - new Date(k.createdAt).getTime()) / 86400000;
|
|
102
|
+
if (ageDays > 30)
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
});
|
|
107
|
+
if (candidates.length === 0) {
|
|
108
|
+
(0, util_1.out)('Nothing to prune — all keys are either active, recent, or already revoked.');
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
(0, util_1.out)(`Found ${candidates.length} prune candidate(s):`);
|
|
112
|
+
for (const k of candidates) {
|
|
113
|
+
(0, util_1.out)(` ${k.id} ${k.name ?? ''} (last used ${k.lastUsedAt ?? 'never'})`);
|
|
114
|
+
}
|
|
115
|
+
if (!args.yes) {
|
|
116
|
+
(0, util_1.out)('');
|
|
117
|
+
(0, util_1.out)('Re-run with --yes to actually revoke these.');
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
for (const k of candidates) {
|
|
121
|
+
try {
|
|
122
|
+
await revokeKey(creds.apiKey, k.id);
|
|
123
|
+
(0, util_1.out)(`${util_1.CHECK} Revoked ${k.id}`);
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
(0, util_1.out)(`\x1b[31m✘\x1b[0m Failed to revoke ${k.id}: ${e.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
(0, state_1.appendLog)('keys-prune', { revoked: candidates.length });
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/cli/commands/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* armoriq orgs / switch-org — list and switch ArmorIQ organizations.
|
|
3
|
+
* Mirrors armoriq_sdk/cli.py:cmd_orgs / cmd_switch_org.
|
|
4
|
+
*/
|
|
5
|
+
export declare function cmdOrgs(): Promise<number>;
|
|
6
|
+
export declare function cmdSwitchOrg(args: {
|
|
7
|
+
org: string;
|
|
8
|
+
keyName?: string;
|
|
9
|
+
}): Promise<number>;
|
|
10
|
+
//# sourceMappingURL=orgs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/orgs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CA0C/C;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD3F"}
|