@thinkingai/ae-cli 6.0.22 → 6.0.27
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/{auth-RDN6D5HU.js → auth-7TQRGLBC.js} +13 -15
- package/dist/auth-MEJ642P4.js +13 -0
- package/dist/chunk-2NDGFQHW.js +190 -0
- package/dist/{chunk-5FBLRSMU.js → chunk-7QQ4233A.js} +3 -3
- package/dist/{chunk-U6QPKCN3.js → chunk-AJTH7LT3.js} +10 -116
- package/dist/chunk-BXMXMUD7.js +254 -0
- package/dist/chunk-C4DH76LX.js +59 -0
- package/dist/chunk-GWZ5MYWE.js +209 -0
- package/dist/{chunk-E34XH4GW.js → chunk-KCA6BA5D.js} +8 -8
- package/dist/{chunk-XE2PI5DS.js → chunk-KGJQCYVC.js} +1 -1
- package/dist/chunk-LG5YT7P7.js +59 -0
- package/dist/{chunk-2W7HULUD.js → chunk-MDJGDI6K.js} +2 -2
- package/dist/{chunk-H52CSLJW.js → chunk-R77JT7XD.js} +53 -6
- package/dist/{chunk-WPXHCP4A.js → chunk-YCLVYFK7.js} +52 -9
- package/dist/{chunk-4EUZRJPO.js → chunk-YNQFYBDB.js} +102 -14
- package/dist/{chunk-YACCPUNQ.js → chunk-ZAOL36CG.js} +1 -1
- package/dist/cli-token-TVQRSE46.js +18 -0
- package/dist/{client-VTJMUZ4O.js → client-2643Z5AG.js} +3 -3
- package/dist/{config-2SDTLGOC.js → config-ZVPARN4R.js} +4 -9
- package/dist/index.js +27 -24
- package/dist/{metadata-JZ2OTWBK.js → metadata-IPSPQBX3.js} +56 -65
- package/dist/metadata-N5REJ7R7.js +411 -0
- package/dist/{model-ZYMRN4VS.js → model-T3KZJWLW.js} +2 -2
- package/dist/{raw-NGYHAL3F.js → raw-OHSUK42D.js} +4 -4
- package/dist/{sync-JVLX6TGW.js → sync-ULT5SECP.js} +3 -3
- package/dist/{te-agent-QPZTLHPH.js → te-agent-QLIVKRUN.js} +1146 -61
- package/dist/{te-analysis-WWX3Z6RP.js → te-analysis-2U5EPXQC.js} +1213 -341
- package/dist/te-analysis-QMZ2UH7F.js +2419 -0
- package/dist/{te-audience-UXGHUVBB.js → te-audience-PVMKQAFH.js} +5 -5
- package/dist/te-audience-XMRMVD2V.js +599 -0
- package/dist/{te-common-7XXH73MF.js → te-common-CFGQXTFV.js} +5 -5
- package/dist/te-common-SDB3O2QG.js +130 -0
- package/dist/{te-community-QKE67HR2.js → te-community-6A7LKYUH.js} +5 -5
- package/dist/te-community-GMWFGILT.js +687 -0
- package/dist/te-dataops-6LIPYNGH.js +1864 -0
- package/dist/{te-dataops-6W7NNYST.js → te-dataops-Z53CTG2U.js} +90 -68
- package/dist/{te-engage-NCFAQFX3.js → te-engage-AGREUOW7.js} +30 -15
- package/dist/te-engage-MIIUKY6M.js +1525 -0
- package/dist/{te-kb-K5BQYUCM.js → te-kb-KQJ53M3A.js} +4 -4
- package/dist/{te-meta-LJZBOSMO.js → te-meta-QLANJ4B4.js} +5 -5
- package/dist/te-meta-TOA6FWDE.js +595 -0
- package/dist/{te-team-DHK5R7MV.js → te-team-TQGMNHQQ.js} +5 -5
- package/package.json +3 -1
- package/skills/ae-agent/SKILL.md +158 -189
- package/skills/ae-agent/references/accept-skill-share.md +39 -0
- package/skills/ae-agent/references/add-attachment.md +57 -0
- package/skills/ae-agent/references/add-mcp.md +75 -0
- package/skills/ae-agent/references/add-model.md +70 -0
- package/skills/ae-agent/references/add-skill.md +71 -0
- package/skills/ae-agent/references/approve-skill.md +41 -0
- package/skills/ae-agent/references/attachment-stats.md +50 -0
- package/skills/ae-agent/references/auto-provision-mcp-credentials.md +57 -0
- package/skills/ae-agent/references/cancel-skill-submission.md +39 -0
- package/skills/ae-agent/references/copy-skill.md +53 -0
- package/skills/ae-agent/references/create-agent.md +71 -0
- package/skills/ae-agent/references/create-automation.md +99 -0
- package/skills/ae-agent/references/del-agent.md +38 -0
- package/skills/ae-agent/references/del-attachment.md +35 -0
- package/skills/ae-agent/references/del-mcp.md +35 -0
- package/skills/ae-agent/references/del-model.md +37 -0
- package/skills/ae-agent/references/del-skill-asset.md +41 -0
- package/skills/ae-agent/references/del-skill-reference.md +41 -0
- package/skills/ae-agent/references/del-skill-script.md +41 -0
- package/skills/ae-agent/references/del-skill.md +36 -0
- package/skills/ae-agent/references/edit-skill.md +64 -0
- package/skills/ae-agent/references/get-agent.md +37 -0
- package/skills/ae-agent/references/get-skill-content.md +36 -0
- package/skills/ae-agent/references/list-agents.md +40 -0
- package/skills/ae-agent/references/list-attachments.md +42 -0
- package/skills/ae-agent/references/list-automations.md +41 -0
- package/skills/ae-agent/references/list-mcp-credentials.md +65 -0
- package/skills/ae-agent/references/list-mcp-market.md +58 -0
- package/skills/ae-agent/references/list-mcps.md +37 -0
- package/skills/ae-agent/references/list-models.md +38 -0
- package/skills/ae-agent/references/list-skill-assets.md +35 -0
- package/skills/ae-agent/references/list-skill-market.md +59 -0
- package/skills/ae-agent/references/list-skill-references.md +36 -0
- package/skills/ae-agent/references/list-skill-scripts.md +35 -0
- package/skills/ae-agent/references/list-skill-shares.md +49 -0
- package/skills/ae-agent/references/list-skill-submissions.md +45 -0
- package/skills/ae-agent/references/list-skills.md +37 -0
- package/skills/ae-agent/references/mcp-auth-disconnect.md +50 -0
- package/skills/ae-agent/references/mcp-auth-start.md +61 -0
- package/skills/ae-agent/references/mcp-auth-status.md +56 -0
- package/skills/ae-agent/references/mcp-stats.md +68 -0
- package/skills/ae-agent/references/mcp-token.md +63 -0
- package/skills/ae-agent/references/mcp-tools.md +55 -0
- package/skills/ae-agent/references/read-skill-asset.md +51 -0
- package/skills/ae-agent/references/read-skill-reference.md +50 -0
- package/skills/ae-agent/references/read-skill-script.md +51 -0
- package/skills/ae-agent/references/reject-skill-share.md +37 -0
- package/skills/ae-agent/references/reject-skill.md +42 -0
- package/skills/ae-agent/references/rescan-skills.md +44 -0
- package/skills/ae-agent/references/set-mcp-credential.md +67 -0
- package/skills/ae-agent/references/set-mcp-meta.md +52 -0
- package/skills/ae-agent/references/set-skill-meta.md +51 -0
- package/skills/ae-agent/references/share-skill.md +50 -0
- package/skills/ae-agent/references/submit-skill.md +51 -0
- package/skills/ae-agent/references/test-model.md +61 -0
- package/skills/ae-agent/references/toggle-mcp.md +39 -0
- package/skills/ae-agent/references/toggle-model.md +37 -0
- package/skills/ae-agent/references/toggle-skill.md +37 -0
- package/skills/ae-agent/references/update-agent.md +71 -0
- package/skills/ae-agent/references/update-automation.md +83 -0
- package/skills/ae-agent/references/update-mcp.md +79 -0
- package/skills/ae-agent/references/update-model.md +77 -0
- package/skills/ae-agent/references/upload-skill-asset.md +49 -0
- package/skills/ae-agent/references/upload-skill-reference.md +51 -0
- package/skills/ae-agent/references/upload-skill-script.md +49 -0
- package/skills/ae-agent/references/upload-skill.md +89 -0
- package/skills/ae-analysis/SKILL.md +53 -25
- package/skills/ae-analysis/references/analysis_gateway_assets.md +129 -0
- package/skills/ae-analysis/references/artifact_download.md +17 -0
- package/skills/ae-analysis/references/bi_panel_copy.md +15 -0
- package/skills/ae-analysis/references/bi_panel_create.md +15 -0
- package/skills/ae-analysis/references/bi_panel_delete.md +15 -0
- package/skills/ae-analysis/references/bi_panel_get.md +18 -0
- package/skills/ae-analysis/references/bi_panel_list.md +15 -0
- package/skills/ae-analysis/references/bi_panel_page_data_export.md +25 -0
- package/skills/ae-analysis/references/bi_panel_page_data_run.md +15 -0
- package/skills/ae-analysis/references/bi_panel_share.md +15 -0
- package/skills/ae-analysis/references/bi_panel_update.md +15 -0
- package/skills/ae-analysis/references/dashboard_abnormal_get.md +15 -0
- package/skills/ae-analysis/references/dashboard_copy.md +17 -0
- package/skills/ae-analysis/references/dashboard_create.md +15 -0
- package/skills/ae-analysis/references/dashboard_daily_report_send.md +17 -0
- package/skills/ae-analysis/references/dashboard_daily_report_update.md +17 -0
- package/skills/ae-analysis/references/dashboard_definition_export.md +33 -0
- package/skills/ae-analysis/references/dashboard_definition_import.md +15 -0
- package/skills/ae-analysis/references/dashboard_delete.md +15 -0
- package/skills/ae-analysis/references/dashboard_freeze.md +15 -0
- package/skills/ae-analysis/references/dashboard_get.md +15 -0
- package/skills/ae-analysis/references/dashboard_handover.md +15 -0
- package/skills/ae-analysis/references/dashboard_list.md +15 -0
- package/skills/ae-analysis/references/dashboard_report_data_export.md +25 -0
- package/skills/ae-analysis/references/dashboard_report_data_run.md +15 -0
- package/skills/ae-analysis/references/dashboard_share.md +15 -0
- package/skills/ae-analysis/references/dashboard_share_info.md +15 -0
- package/skills/ae-analysis/references/dashboard_task_status.md +15 -0
- package/skills/ae-analysis/references/dashboard_update.md +16 -0
- package/skills/ae-analysis/references/favorite_add.md +15 -0
- package/skills/ae-analysis/references/favorite_remove.md +15 -0
- package/skills/ae-analysis/references/folder_create.md +15 -0
- package/skills/ae-analysis/references/folder_delete.md +15 -0
- package/skills/ae-analysis/references/folder_members.md +15 -0
- package/skills/ae-analysis/references/folder_share.md +15 -0
- package/skills/ae-analysis/references/project_space_create.md +15 -0
- package/skills/ae-analysis/references/project_space_delete.md +15 -0
- package/skills/ae-analysis/references/project_space_get.md +18 -0
- package/skills/ae-analysis/references/project_space_list.md +15 -0
- package/skills/ae-analysis/references/project_space_members.md +15 -0
- package/skills/ae-analysis/references/project_space_share.md +15 -0
- package/skills/ae-analysis/references/public_link_create.md +15 -0
- package/skills/ae-analysis/references/public_link_delete.md +15 -0
- package/skills/ae-analysis/references/public_link_list.md +15 -0
- package/skills/ae-analysis/references/public_link_offline.md +15 -0
- package/skills/ae-analysis/references/public_link_update.md +15 -0
- package/skills/ae-analysis/references/query_cancel.md +15 -0
- package/skills/ae-analysis/references/run_inspect.md +22 -0
- package/skills/ae-dataops/references/dataops-flow-create.md +2 -2
- package/skills/ae-dataops/references/dataops-flow-monitor.md +3 -3
- package/skills/ae-dataops/references/dataops-integration.md +1 -0
- package/skills/ae-engage/references/flow-node-config-schema.md +32 -8
- package/skills/ae-engage/references/save-flow.md +65 -29
- package/skills/ae-engage/references/validate-flow-node-config.md +28 -10
- package/skills/ae-generate-tracking-plan/SKILL.md +9 -7
- package/skills/ae-metadata/references/metadata_data_table_csv_write.md +5 -3
- package/skills/ae-metadata/references/metadata_data_table_sql_write.md +5 -4
- package/skills/ae-metadata/references/metadata_property_dimension_table_create_and_bind_csv.md +5 -3
- package/dist/auth-I2G7OAU2.js +0 -19
- package/dist/chunk-FPE5LGVU.js +0 -105
- package/dist/cli-token-6AGEDJF4.js +0 -14
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
printError,
|
|
3
3
|
printOutput
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZAOL36CG.js";
|
|
5
5
|
import {
|
|
6
6
|
clearCliToken,
|
|
7
7
|
mintCliToken
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2NDGFQHW.js";
|
|
9
9
|
import {
|
|
10
10
|
clear,
|
|
11
|
-
clearToken,
|
|
12
|
-
getAuthStatus,
|
|
13
11
|
load,
|
|
14
12
|
resolveHost,
|
|
15
13
|
save
|
|
16
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-AJTH7LT3.js";
|
|
17
15
|
import {
|
|
18
16
|
getFallbackCliToken,
|
|
19
17
|
loadConfig,
|
|
20
18
|
logger,
|
|
19
|
+
normalizeUrl,
|
|
21
20
|
removeHost,
|
|
22
21
|
saveConfig
|
|
23
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-YCLVYFK7.js";
|
|
24
23
|
|
|
25
24
|
// src/core/device-auth.ts
|
|
26
25
|
import { execFileSync } from "child_process";
|
|
@@ -234,13 +233,14 @@ function resolveAuthHost(program, opts) {
|
|
|
234
233
|
}
|
|
235
234
|
function activateHostAfterLogin(host, explicitHostOverride) {
|
|
236
235
|
if (!explicitHostOverride) return;
|
|
236
|
+
const normalized = normalizeUrl(host);
|
|
237
237
|
const config = loadConfig();
|
|
238
|
-
if (!config.hosts[
|
|
239
|
-
config.hosts[
|
|
238
|
+
if (!config.hosts[normalized]) {
|
|
239
|
+
config.hosts[normalized] = { label: normalized };
|
|
240
240
|
}
|
|
241
|
-
config.activeHost =
|
|
241
|
+
config.activeHost = normalized;
|
|
242
242
|
saveConfig(config);
|
|
243
|
-
logger.info(`Active host set to ${
|
|
243
|
+
logger.info(`Active host set to ${normalized} after login`);
|
|
244
244
|
}
|
|
245
245
|
async function persistDeviceTokens(host, tokens) {
|
|
246
246
|
const DEFAULT_EXPIRES_IN = 72e3;
|
|
@@ -369,15 +369,14 @@ function registerAuth(program) {
|
|
|
369
369
|
authenticated: true,
|
|
370
370
|
host,
|
|
371
371
|
source: "sandbox-cli-token",
|
|
372
|
-
hasCliToken: true
|
|
372
|
+
hasCliToken: true,
|
|
373
|
+
note: "sandbox-provisioned cli-token.json; no user access token in secure-store"
|
|
373
374
|
},
|
|
374
375
|
program.opts().format || "json"
|
|
375
376
|
);
|
|
376
377
|
return;
|
|
377
378
|
}
|
|
378
|
-
|
|
379
|
-
const authenticated = tokenStatus.authenticated;
|
|
380
|
-
printOutput({ authenticated, host, source: tokenStatus.source ?? "none" }, program.opts().format || "json");
|
|
379
|
+
printOutput({ authenticated: false, host, source: "none" }, program.opts().format || "json");
|
|
381
380
|
});
|
|
382
381
|
auth.command("logout").description("Clear stored credentials (access token, CLI token, and host config) for a host (--host or active host)").option("--host <url>", HOST_OPTION_DESC).action((opts) => {
|
|
383
382
|
const host = resolveAuthHost(program, opts);
|
|
@@ -386,7 +385,6 @@ function registerAuth(program) {
|
|
|
386
385
|
process.exit(1);
|
|
387
386
|
}
|
|
388
387
|
clearCliToken(host);
|
|
389
|
-
clearToken(host);
|
|
390
388
|
clear(host);
|
|
391
389
|
removeHost(host);
|
|
392
390
|
process.stderr.write(`[ae-cli] Credentials and config cleared for ${host}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getToken,
|
|
3
|
+
load,
|
|
4
|
+
loadCliToken,
|
|
5
|
+
save
|
|
6
|
+
} from "./chunk-AJTH7LT3.js";
|
|
7
|
+
import {
|
|
8
|
+
getActiveHost,
|
|
9
|
+
getConfigDir,
|
|
10
|
+
getFallbackCliToken,
|
|
11
|
+
listHosts,
|
|
12
|
+
logger,
|
|
13
|
+
normalizeUrl,
|
|
14
|
+
safeJsonParse,
|
|
15
|
+
safeReadJsonFile
|
|
16
|
+
} from "./chunk-YCLVYFK7.js";
|
|
17
|
+
|
|
18
|
+
// src/core/cli-token.ts
|
|
19
|
+
import fs from "fs";
|
|
20
|
+
import path from "path";
|
|
21
|
+
var CLI_TOKEN_GENERATE_PATH = "/v1/ta/cli/token/generate";
|
|
22
|
+
var _cliTokenCache = /* @__PURE__ */ new Map();
|
|
23
|
+
var _renewedLocalDateByHost = /* @__PURE__ */ new Map();
|
|
24
|
+
var _renewInFlightByHost = /* @__PURE__ */ new Map();
|
|
25
|
+
function renewHostKey(hostUrl) {
|
|
26
|
+
return normalizeUrl(hostUrl);
|
|
27
|
+
}
|
|
28
|
+
function renewStateFilePath() {
|
|
29
|
+
return path.join(getConfigDir(), "cli-token-renew.json");
|
|
30
|
+
}
|
|
31
|
+
function localRenewDate(now = /* @__PURE__ */ new Date()) {
|
|
32
|
+
const y = now.getFullYear();
|
|
33
|
+
const m = String(now.getMonth() + 1).padStart(2, "0");
|
|
34
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
35
|
+
return `${y}-${m}-${d}`;
|
|
36
|
+
}
|
|
37
|
+
function loadRenewStore() {
|
|
38
|
+
try {
|
|
39
|
+
const file = renewStateFilePath();
|
|
40
|
+
if (!fs.existsSync(file)) return {};
|
|
41
|
+
const data = safeReadJsonFile(file);
|
|
42
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return {};
|
|
43
|
+
return data;
|
|
44
|
+
} catch {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function saveRenewStore(store) {
|
|
49
|
+
const dir = getConfigDir();
|
|
50
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
51
|
+
const file = renewStateFilePath();
|
|
52
|
+
if (Object.keys(store).length === 0) {
|
|
53
|
+
try {
|
|
54
|
+
fs.unlinkSync(file);
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
fs.writeFileSync(file, JSON.stringify(store, null, 2), { encoding: "utf8" });
|
|
60
|
+
try {
|
|
61
|
+
fs.chmodSync(file, 384);
|
|
62
|
+
} catch {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function clearRenewState(hostUrl) {
|
|
66
|
+
if (hostUrl) {
|
|
67
|
+
const key = renewHostKey(hostUrl);
|
|
68
|
+
_renewedLocalDateByHost.delete(key);
|
|
69
|
+
_renewInFlightByHost.delete(key);
|
|
70
|
+
if (key !== hostUrl) {
|
|
71
|
+
_renewedLocalDateByHost.delete(hostUrl);
|
|
72
|
+
_renewInFlightByHost.delete(hostUrl);
|
|
73
|
+
}
|
|
74
|
+
const store = loadRenewStore();
|
|
75
|
+
let changed = false;
|
|
76
|
+
for (const k of /* @__PURE__ */ new Set([key, hostUrl])) {
|
|
77
|
+
if (store[k]) {
|
|
78
|
+
delete store[k];
|
|
79
|
+
changed = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (changed) {
|
|
83
|
+
saveRenewStore(store);
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
_renewedLocalDateByHost.clear();
|
|
88
|
+
_renewInFlightByHost.clear();
|
|
89
|
+
saveRenewStore({});
|
|
90
|
+
}
|
|
91
|
+
async function generateCliToken(hostUrl) {
|
|
92
|
+
const accessToken = await getToken(hostUrl);
|
|
93
|
+
const base = hostUrl.replace(/\/+$/, "");
|
|
94
|
+
const url = `${base}${CLI_TOKEN_GENERATE_PATH}`;
|
|
95
|
+
const resp = await fetch(url, {
|
|
96
|
+
method: "GET",
|
|
97
|
+
headers: {
|
|
98
|
+
"Authorization": `bearer ${accessToken}`
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (!resp.ok) {
|
|
102
|
+
throw new Error(`CLI token generate HTTP error: ${resp.status} ${resp.statusText}`);
|
|
103
|
+
}
|
|
104
|
+
const data = safeJsonParse(await resp.text());
|
|
105
|
+
if (data.return_code !== 0) {
|
|
106
|
+
throw new Error(`CLI token generate error: ${data.return_message || "unknown"} (code: ${data.return_code})`);
|
|
107
|
+
}
|
|
108
|
+
const cliToken = data.data?.userSecret;
|
|
109
|
+
if (!cliToken) {
|
|
110
|
+
throw new Error("CLI token generate error: empty userSecret in response");
|
|
111
|
+
}
|
|
112
|
+
return cliToken;
|
|
113
|
+
}
|
|
114
|
+
function persistCliTokenIfPossible(hostUrl, cliToken) {
|
|
115
|
+
const existing = load(hostUrl);
|
|
116
|
+
if (!existing) {
|
|
117
|
+
logger.info(`cli-token: no secure-store session for ${hostUrl}, keeping token in-process only`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
save(hostUrl, { ...existing, cliToken });
|
|
121
|
+
}
|
|
122
|
+
function clearPersistedCliToken(hostUrl) {
|
|
123
|
+
const existing = load(hostUrl);
|
|
124
|
+
if (existing?.cliToken) {
|
|
125
|
+
save(hostUrl, { ...existing, cliToken: void 0 });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function getCliToken(hostOverride) {
|
|
129
|
+
const hostUrl = hostOverride || getActiveHost();
|
|
130
|
+
let token = _cliTokenCache.get(hostUrl);
|
|
131
|
+
if (!token) {
|
|
132
|
+
const storedToken = loadCliToken(hostUrl);
|
|
133
|
+
if (storedToken) {
|
|
134
|
+
_cliTokenCache.set(hostUrl, storedToken);
|
|
135
|
+
logger.info(`Using persisted CLI token (secure-store) for ${hostUrl}`);
|
|
136
|
+
token = storedToken;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!token) {
|
|
140
|
+
const fallbackToken = getFallbackCliToken(hostUrl);
|
|
141
|
+
if (fallbackToken) {
|
|
142
|
+
_cliTokenCache.set(hostUrl, fallbackToken);
|
|
143
|
+
logger.info(`Using sandbox-provisioned CLI token (fallback file) for ${hostUrl}`);
|
|
144
|
+
token = fallbackToken;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!token) {
|
|
148
|
+
token = await mintCliToken(hostUrl);
|
|
149
|
+
}
|
|
150
|
+
return token;
|
|
151
|
+
}
|
|
152
|
+
async function mintCliToken(hostUrl) {
|
|
153
|
+
logger.info(`Generating CLI token for ${hostUrl}`);
|
|
154
|
+
const cliToken = await generateCliToken(hostUrl);
|
|
155
|
+
_cliTokenCache.set(hostUrl, cliToken);
|
|
156
|
+
persistCliTokenIfPossible(hostUrl, cliToken);
|
|
157
|
+
logger.info(`CLI token generated, cached, and persisted for ${hostUrl}`);
|
|
158
|
+
return cliToken;
|
|
159
|
+
}
|
|
160
|
+
function clearCliToken(hostUrl) {
|
|
161
|
+
if (hostUrl) {
|
|
162
|
+
_cliTokenCache.delete(hostUrl);
|
|
163
|
+
clearPersistedCliToken(hostUrl);
|
|
164
|
+
clearRenewState(hostUrl);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
_cliTokenCache.clear();
|
|
168
|
+
clearRenewState();
|
|
169
|
+
for (const { url } of listHosts()) {
|
|
170
|
+
clearPersistedCliToken(url);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function setCliTokenManual(token, hostUrl) {
|
|
174
|
+
_cliTokenCache.set(hostUrl, token);
|
|
175
|
+
persistCliTokenIfPossible(hostUrl, token);
|
|
176
|
+
logger.info(`CLI token set for ${hostUrl}`);
|
|
177
|
+
}
|
|
178
|
+
function _resetRenewMemoryForTest() {
|
|
179
|
+
_renewedLocalDateByHost.clear();
|
|
180
|
+
_renewInFlightByHost.clear();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export {
|
|
184
|
+
localRenewDate,
|
|
185
|
+
getCliToken,
|
|
186
|
+
mintCliToken,
|
|
187
|
+
clearCliToken,
|
|
188
|
+
setCliTokenManual,
|
|
189
|
+
_resetRenewMemoryForTest
|
|
190
|
+
};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAnalysisMappingPathForClusterMode
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KGJQCYVC.js";
|
|
4
4
|
import {
|
|
5
5
|
PermissionError
|
|
6
6
|
} from "./chunk-NOO24N7W.js";
|
|
7
7
|
import {
|
|
8
8
|
clearCliToken,
|
|
9
9
|
getCliToken
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2NDGFQHW.js";
|
|
11
11
|
import {
|
|
12
12
|
getActiveHost,
|
|
13
13
|
logger,
|
|
14
14
|
safeJsonParse
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-YCLVYFK7.js";
|
|
16
16
|
|
|
17
17
|
// src/core/mcp.ts
|
|
18
18
|
async function permissionMessage(resp) {
|
|
@@ -2,13 +2,9 @@ import {
|
|
|
2
2
|
getActiveHost,
|
|
3
3
|
getConfigDir,
|
|
4
4
|
logger,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
|
|
9
|
-
// src/core/auth.ts
|
|
10
|
-
import fs2 from "fs";
|
|
11
|
-
import path2 from "path";
|
|
5
|
+
normalizeUrl,
|
|
6
|
+
safeJsonParse
|
|
7
|
+
} from "./chunk-YCLVYFK7.js";
|
|
12
8
|
|
|
13
9
|
// src/core/secure-store.ts
|
|
14
10
|
import crypto from "crypto";
|
|
@@ -236,24 +232,8 @@ var SecureStoreAuthError = class extends Error {
|
|
|
236
232
|
};
|
|
237
233
|
|
|
238
234
|
// src/core/auth.ts
|
|
239
|
-
var TOKENS_FILE = path2.join(getConfigDir(), "tokens.json");
|
|
240
|
-
var LEGACY_MCP_TOKENS_FILE = path2.join(getConfigDir(), "mcp-tokens.json");
|
|
241
|
-
var LEGACY_DIR = path2.join(process.env.HOME || "", ".te-mcp");
|
|
242
|
-
(function removeLegacyMcpTokens() {
|
|
243
|
-
try {
|
|
244
|
-
if (fs2.existsSync(LEGACY_MCP_TOKENS_FILE)) {
|
|
245
|
-
fs2.rmSync(LEGACY_MCP_TOKENS_FILE);
|
|
246
|
-
logger.info("auth: removed legacy mcp-tokens.json (plaintext MCP token file)");
|
|
247
|
-
}
|
|
248
|
-
} catch {
|
|
249
|
-
}
|
|
250
|
-
})();
|
|
251
|
-
function ensureDir() {
|
|
252
|
-
const dir = getConfigDir();
|
|
253
|
-
if (!fs2.existsSync(dir)) fs2.mkdirSync(dir, { recursive: true });
|
|
254
|
-
}
|
|
255
235
|
function resolveHost(hostOverride) {
|
|
256
|
-
if (hostOverride) return hostOverride;
|
|
236
|
+
if (hostOverride) return normalizeUrl(hostOverride);
|
|
257
237
|
return getActiveHost();
|
|
258
238
|
}
|
|
259
239
|
async function validateToken(token, hostUrl) {
|
|
@@ -270,89 +250,11 @@ async function validateToken(token, hostUrl) {
|
|
|
270
250
|
return false;
|
|
271
251
|
}
|
|
272
252
|
}
|
|
273
|
-
function
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const migrated = {};
|
|
279
|
-
for (const [key, val] of Object.entries(data)) {
|
|
280
|
-
const url = key.startsWith("http") ? key : `https://${key}`;
|
|
281
|
-
migrated[url] = val;
|
|
282
|
-
}
|
|
283
|
-
ensureDir();
|
|
284
|
-
fs2.writeFileSync(TOKENS_FILE, JSON.stringify(migrated, null, 2));
|
|
285
|
-
return migrated;
|
|
286
|
-
}
|
|
287
|
-
if (fs2.existsSync(TOKENS_FILE)) {
|
|
288
|
-
const data = safeReadJsonFile(TOKENS_FILE);
|
|
289
|
-
if (data && typeof data === "object" && !Array.isArray(data) && Object.keys(data).length === 0) {
|
|
290
|
-
try {
|
|
291
|
-
fs2.unlinkSync(TOKENS_FILE);
|
|
292
|
-
} catch {
|
|
293
|
-
}
|
|
294
|
-
return {};
|
|
295
|
-
}
|
|
296
|
-
let needsMigration = false;
|
|
297
|
-
const migrated = {};
|
|
298
|
-
for (const [key, val] of Object.entries(data)) {
|
|
299
|
-
if (!key.startsWith("http")) {
|
|
300
|
-
migrated[`https://${key}`] = val;
|
|
301
|
-
needsMigration = true;
|
|
302
|
-
} else {
|
|
303
|
-
migrated[key] = val;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
if (needsMigration) {
|
|
307
|
-
fs2.writeFileSync(TOKENS_FILE, JSON.stringify(migrated, null, 2));
|
|
308
|
-
return migrated;
|
|
309
|
-
}
|
|
310
|
-
return data;
|
|
311
|
-
}
|
|
312
|
-
} catch {
|
|
313
|
-
}
|
|
314
|
-
return {};
|
|
315
|
-
}
|
|
316
|
-
function saveAllTokens(tokens) {
|
|
317
|
-
ensureDir();
|
|
318
|
-
if (Object.keys(tokens).length === 0) {
|
|
319
|
-
try {
|
|
320
|
-
fs2.unlinkSync(TOKENS_FILE);
|
|
321
|
-
} catch {
|
|
322
|
-
}
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
fs2.writeFileSync(TOKENS_FILE, JSON.stringify(tokens, null, 2));
|
|
326
|
-
try {
|
|
327
|
-
fs2.chmodSync(TOKENS_FILE, 384);
|
|
328
|
-
} catch {
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
function loadToken(hostUrl) {
|
|
332
|
-
const tokens = loadAllTokens();
|
|
333
|
-
const entry = tokens[hostUrl];
|
|
334
|
-
if (!entry || !entry.token) return null;
|
|
335
|
-
return { host: hostUrl, token: entry.token, updatedAt: entry.updatedAt };
|
|
336
|
-
}
|
|
337
|
-
function saveToken(token, hostUrl) {
|
|
338
|
-
const tokens = loadAllTokens();
|
|
339
|
-
tokens[hostUrl] = { token, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
340
|
-
saveAllTokens(tokens);
|
|
341
|
-
logger.info(`Token saved for ${hostUrl}`);
|
|
342
|
-
}
|
|
343
|
-
function clearToken(hostUrl) {
|
|
344
|
-
const tokens = loadAllTokens();
|
|
345
|
-
delete tokens[hostUrl];
|
|
346
|
-
saveAllTokens(tokens);
|
|
347
|
-
}
|
|
348
|
-
function getAuthStatus(hostUrl) {
|
|
349
|
-
const cached = loadToken(hostUrl);
|
|
350
|
-
if (cached) {
|
|
351
|
-
const ageMs = Date.now() - new Date(cached.updatedAt).getTime();
|
|
352
|
-
const hours = Math.round(ageMs / 36e5);
|
|
353
|
-
return { authenticated: true, host: hostUrl, tokenAge: `${hours}h ago`, source: "cache" };
|
|
354
|
-
}
|
|
355
|
-
return { authenticated: false, host: hostUrl };
|
|
253
|
+
function invalidateAccessTokenForRetry(hostUrl) {
|
|
254
|
+
const payload = load(hostUrl);
|
|
255
|
+
if (!payload) return;
|
|
256
|
+
save(hostUrl, { ...payload, accessExpiresAt: (/* @__PURE__ */ new Date(0)).toISOString() });
|
|
257
|
+
logger.info(`auth: marked access token stale for retry on ${hostUrl}`);
|
|
356
258
|
}
|
|
357
259
|
async function getToken(hostUrl) {
|
|
358
260
|
if (!hostUrl) {
|
|
@@ -361,11 +263,6 @@ async function getToken(hostUrl) {
|
|
|
361
263
|
Run: ae-cli config set-host <url>`
|
|
362
264
|
);
|
|
363
265
|
}
|
|
364
|
-
const cached = loadToken(hostUrl);
|
|
365
|
-
if (cached && cached.token) {
|
|
366
|
-
logger.info(`Using cached token for ${hostUrl}`);
|
|
367
|
-
return cached.token;
|
|
368
|
-
}
|
|
369
266
|
try {
|
|
370
267
|
const secureToken = await getValidAccessToken(hostUrl);
|
|
371
268
|
logger.info(`Using secure-store token for ${hostUrl}`);
|
|
@@ -391,9 +288,6 @@ export {
|
|
|
391
288
|
SecureStoreAuthError,
|
|
392
289
|
resolveHost,
|
|
393
290
|
validateToken,
|
|
394
|
-
|
|
395
|
-
saveToken,
|
|
396
|
-
clearToken,
|
|
397
|
-
getAuthStatus,
|
|
291
|
+
invalidateAccessTokenForRetry,
|
|
398
292
|
getToken
|
|
399
293
|
};
|