@thinkingai/ae-cli 6.0.37 → 6.0.39
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/README.md +25 -3
- package/README.zh.md +25 -3
- package/dist/{auth-56Z45UVR.js → auth-GDV3H5I4.js} +18 -8
- package/dist/{auth-ENM3FE6L.js → auth-NN55553T.js} +3 -3
- package/dist/{capability-2H6PAOA3.js → capability-TPORIKRQ.js} +19 -15
- package/dist/{capability-YPOQX6PL.js → capability-VQNC5CF7.js} +19 -15
- package/dist/chunk-4NN5IWVN.js +26 -0
- package/dist/{chunk-DB4Q3ANU.js → chunk-6A2FUCIS.js} +3 -3
- package/dist/{chunk-PVBYJWC2.js → chunk-7KQWSBSL.js} +4 -4
- package/dist/{chunk-24BAVOX3.js → chunk-AXDXJTPC.js} +3 -1
- package/dist/{chunk-CPVTECJ3.js → chunk-DT6Y3TD7.js} +5 -5
- package/dist/{chunk-EGEIXA2Z.js → chunk-DWO43OIB.js} +0 -248
- package/dist/{chunk-V6FR6WTW.js → chunk-GJJA4CQZ.js} +34 -2
- package/dist/{chunk-RGXCNC4N.js → chunk-GS2P7LFD.js} +50 -17
- package/dist/{chunk-LYVNONC4.js → chunk-JHENBQ5B.js} +35 -0
- package/dist/{chunk-3P3562ZX.js → chunk-MVDZ7DBQ.js} +5 -5
- package/dist/{chunk-LCXU3AAT.js → chunk-NBPKWKRA.js} +2 -2
- package/dist/{chunk-HQ2A7ITL.js → chunk-RBNKI5ZW.js} +50 -17
- package/dist/{chunk-LHVM35J4.js → chunk-TS6BUGUY.js} +4 -4
- package/dist/chunk-TUKQZTMI.js +250 -0
- package/dist/{chunk-J7MZHDHQ.js → chunk-VKD5WQKN.js} +5 -5
- package/dist/{chunk-3KI3RRXX.js → chunk-VTXHDCBW.js} +3 -3
- package/dist/{chunk-KTYR3U6D.js → chunk-YTG6Q75E.js} +10 -6
- package/dist/{chunk-IR4ZLVPW.js → chunk-YV52FB5G.js} +25 -3
- package/dist/{chunk-E7UXXHO3.js → chunk-Z3OXWCIA.js} +3 -3
- package/dist/{cli-token-4SBMXAUK.js → cli-token-GL5MS5FK.js} +4 -4
- package/dist/{client-PP5FETMW.js → client-DAIPF7XN.js} +4 -4
- package/dist/{community-report-client-KK2QBANO.js → community-report-client-M2RW4MXD.js} +2 -2
- package/dist/config-4VZNLBKF.js +489 -0
- package/dist/index.js +96 -37
- package/dist/memory-RWJW4XFO.js +892 -0
- package/dist/memory-VO2ZJCRT.js +892 -0
- package/dist/{metadata-JIQ77HFY.js → metadata-YGTHR2XJ.js} +8 -8
- package/dist/{metadata-AN3YFZEV.js → metadata-ZRN2GHPN.js} +8 -8
- package/dist/{model-JASQVOFD.js → model-CLUIK3K5.js} +7 -5
- package/dist/{raw-XJCAT3HX.js → raw-52B4UKO4.js} +8 -7
- package/dist/sync-3REDHGY6.js +10259 -0
- package/dist/{te-agent-JHUG6DVV.js → te-agent-XNPELAKX.js} +580 -84
- package/dist/{te-analysis-IWQZO423.js → te-analysis-GJI5FZUL.js} +1611 -25
- package/dist/{te-analysis-X222IRYR.js → te-analysis-N2BRDJZ5.js} +1611 -25
- package/dist/{te-community-QOYIYEJI.js → te-community-SQXKE5OO.js} +7 -7
- package/dist/{te-community-UFKI6ONP.js → te-community-TYSNU3NQ.js} +7 -7
- package/dist/{te-dataops-PZQ5NQLY.js → te-dataops-5TM7WZDI.js} +370 -189
- package/dist/{te-dataops-XTWVTJCA.js → te-dataops-OWIADNSM.js} +370 -189
- package/dist/{te-engage-NLZUPSBK.js → te-engage-F7V55KVW.js} +333 -105
- package/dist/{te-engage-E7F4HTXU.js → te-engage-FMYAYCNV.js} +333 -105
- package/dist/{te-kb-E7NSCBRB.js → te-kb-VRMEY3D4.js} +6 -6
- package/dist/{te-meta-GBDTMPEL.js → te-meta-53BVXPFI.js} +7 -7
- package/dist/{te-meta-ZTLTSHXC.js → te-meta-TOCBPBXI.js} +7 -7
- package/dist/{te-system-AH7DMCAQ.js → te-system-XGS5EQIQ.js} +4 -4
- package/dist/{te-team-BQ3SKSZV.js → te-team-BZRDV2CM.js} +7 -7
- package/dist/{update-DKG6UXEM.js → update-HEDXGOJH.js} +8 -6
- package/package.json +5 -2
- package/skills/ae-agent/SKILL.md +178 -16
- package/skills/ae-agent/references/add-skill.md +22 -10
- package/skills/ae-agent/references/edit-skill.md +24 -14
- package/skills/ae-agent/references/find-archived-conversations.md +82 -0
- package/skills/ae-agent/references/restore-conversation.md +54 -0
- package/skills/ae-agent/references/upload-skill.md +24 -14
- package/skills/ae-analysis/SKILL.md +1 -1
- package/skills/ae-analysis/references/command_index.md +109 -42
- package/skills/ae-analysis/references/debug_data_list.md +28 -0
- package/skills/ae-analysis/references/debug_device_add.md +23 -0
- package/skills/ae-analysis/references/debug_device_list.md +19 -0
- package/skills/ae-analysis/references/debug_device_select.md +22 -0
- package/skills/ae-analysis/references/entity_id_import_options.md +1 -1
- package/skills/ae-analysis/references/plan_sync_display_names.md +28 -0
- package/skills/ae-analysis/references/project_access_detail_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_delete.md +3 -3
- package/skills/ae-analysis/references/project_data_power_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_list.md +3 -3
- package/skills/ae-analysis/references/project_data_power_upsert.md +3 -3
- package/skills/ae-analysis/references/project_entity_create.md +3 -3
- package/skills/ae-analysis/references/project_entity_delete.md +3 -3
- package/skills/ae-analysis/references/project_entity_event_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_get.md +3 -3
- package/skills/ae-analysis/references/project_entity_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_update.md +3 -3
- package/skills/ae-analysis/references/project_function_list.md +3 -3
- package/skills/ae-analysis/references/project_info_create.md +25 -0
- package/skills/ae-analysis/references/project_info_delete.md +24 -0
- package/skills/ae-analysis/references/project_info_get.md +3 -3
- package/skills/ae-analysis/references/project_info_list.md +3 -3
- package/skills/ae-analysis/references/project_info_update.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_create.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_delete.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_list.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_update.md +3 -3
- package/skills/ae-analysis/references/project_member_add.md +3 -3
- package/skills/ae-analysis/references/project_member_batch_update.md +3 -3
- package/skills/ae-analysis/references/project_member_candidate_list.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_export.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_run.md +3 -3
- package/skills/ae-analysis/references/project_member_import.md +3 -3
- package/skills/ae-analysis/references/project_member_list.md +3 -3
- package/skills/ae-analysis/references/project_member_receiver_list.md +3 -3
- package/skills/ae-analysis/references/project_member_remove.md +3 -3
- package/skills/ae-analysis/references/project_member_update.md +3 -3
- package/skills/ae-analysis/references/project_owner_update.md +3 -3
- package/skills/ae-analysis/references/project_permission_binding_list.md +3 -3
- package/skills/ae-analysis/references/project_receive_status_update.md +3 -3
- package/skills/ae-analysis/references/project_role_delete.md +3 -3
- package/skills/ae-analysis/references/project_role_function_list.md +3 -3
- package/skills/ae-analysis/references/project_role_get.md +3 -3
- package/skills/ae-analysis/references/project_role_list.md +3 -3
- package/skills/ae-analysis/references/project_role_upsert.md +3 -3
- package/skills/ae-analysis/references/project_role_user_list.md +3 -3
- package/skills/ae-analysis/references/project_space_list.md +1 -1
- package/skills/ae-analysis/references/project_timezone_get.md +3 -3
- package/skills/ae-analysis/references/project_timezone_overview.md +3 -3
- package/skills/ae-analysis/references/project_timezone_update.md +3 -3
- package/skills/ae-analysis/references/project_user_id_items_update.md +3 -3
- package/skills/ae-analysis/references/system_admin_function_list.md +22 -0
- package/skills/ae-analysis/references/system_admin_function_update.md +26 -0
- package/skills/ae-analysis/references/system_admin_list.md +21 -0
- package/skills/ae-analysis/references/system_admin_remove.md +25 -0
- package/skills/ae-analysis/references/system_admin_upsert.md +25 -0
- package/skills/ae-analysis/references/system_function_list.md +21 -0
- package/skills/ae-analysis/references/system_member_add.md +25 -0
- package/skills/ae-analysis/references/system_member_candidate_list.md +22 -0
- package/skills/ae-analysis/references/system_member_delete.md +25 -0
- package/skills/ae-analysis/references/system_member_list.md +24 -0
- package/skills/ae-analysis/references/system_member_mfa_unbind.md +25 -0
- package/skills/ae-analysis/references/system_member_password_reset.md +32 -0
- package/skills/ae-analysis/references/system_member_project_batch_update.md +27 -0
- package/skills/ae-analysis/references/system_member_status_update.md +26 -0
- package/skills/ae-analysis/references/system_member_update.md +23 -0
- package/skills/ae-analysis/references/system_mfa_get.md +21 -0
- package/skills/ae-analysis/references/system_mfa_update.md +25 -0
- package/skills/ae-analysis/references/system_node_monitor_list.md +24 -0
- package/skills/ae-analysis/references/system_oauth2_update.md +22 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_delete.md +25 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_list.md +23 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_test.md +29 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_upsert.md +39 -0
- package/skills/ae-analysis/references/system_preference_get.md +21 -0
- package/skills/ae-analysis/references/system_preference_update.md +22 -0
- package/skills/ae-analysis/references/system_project_usage_list.md +28 -0
- package/skills/ae-analysis/references/system_query_alert_rule_list.md +21 -0
- package/skills/ae-analysis/references/system_query_alert_rule_update.md +26 -0
- package/skills/ae-analysis/references/system_query_monitor_overview.md +26 -0
- package/skills/ae-analysis/references/system_query_task_cancel.md +25 -0
- package/skills/ae-analysis/references/system_query_task_export.md +49 -0
- package/skills/ae-analysis/references/system_query_task_get.md +23 -0
- package/skills/ae-analysis/references/system_query_task_list.md +35 -0
- package/skills/ae-analysis/references/system_query_task_options.md +27 -0
- package/skills/ae-analysis/references/system_receiver_address_delete.md +26 -0
- package/skills/ae-analysis/references/system_receiver_address_overview.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_project_list.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_promote.md +24 -0
- package/skills/ae-analysis/references/system_receiver_address_upsert.md +27 -0
- package/skills/ae-analysis/references/system_receiver_detection_get.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_run.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_update.md +25 -0
- package/skills/ae-analysis/references/system_role_delete.md +26 -0
- package/skills/ae-analysis/references/system_role_function_list.md +22 -0
- package/skills/ae-analysis/references/system_role_get.md +22 -0
- package/skills/ae-analysis/references/system_role_list.md +24 -0
- package/skills/ae-analysis/references/system_role_upsert.md +27 -0
- package/skills/ae-analysis/references/system_role_user_list.md +22 -0
- package/skills/ae-analysis/references/system_seat_list.md +25 -0
- package/skills/ae-analysis/references/system_seat_update.md +26 -0
- package/skills/ae-analysis/references/system_smtp_delete.md +24 -0
- package/skills/ae-analysis/references/system_smtp_get.md +21 -0
- package/skills/ae-analysis/references/system_smtp_test.md +22 -0
- package/skills/ae-analysis/references/system_smtp_upsert.md +31 -0
- package/skills/ae-analysis/references/system_third_party_login_disable.md +25 -0
- package/skills/ae-analysis/references/system_third_party_login_list.md +21 -0
- package/skills/ae-analysis/references/system_third_party_login_upsert.md +33 -0
- package/skills/ae-analysis/references/system_usage_overview.md +21 -0
- package/skills/ae-analysis/references/system_usage_trend_export.md +44 -0
- package/skills/ae-analysis/references/system_usage_trend_query.md +28 -0
- package/skills/ae-dataops/SKILL.md +1 -1
- package/skills/ae-dataops/references/dataops-flow-create.md +51 -16
- package/skills/ae-engage/SKILL.md +56 -26
- package/skills/ae-engage/references/activity-activity.md +3 -0
- package/skills/ae-engage/references/activity-approval.md +12 -4
- package/skills/ae-engage/references/activity-task.md +21 -6
- package/skills/ae-engage/references/activity-topic.md +31 -13
- package/skills/ae-engage/references/add-channel.md +170 -41
- package/skills/ae-engage/references/build-task-save-guide.md +40 -27
- package/skills/ae-engage/references/channel-update-config.md +3 -2
- package/skills/ae-engage/references/common-metric.md +48 -120
- package/skills/ae-engage/references/flow-detail.md +13 -0
- package/skills/ae-engage/references/preset-event.md +12 -32
- package/skills/ae-engage/references/save-flow.md +127 -64
- package/skills/ae-engage/references/save-task.md +197 -59
- package/skills/ae-engage/references/scene-config-metric.md +3 -0
- package/skills/ae-engage/references/scene-preset-metric.md +8 -37
- package/skills/ae-engage/references/scene-strategy-audience.md +51 -643
- package/skills/ae-engage/references/scene-strategy.md +6 -6
- package/skills/ae-engage/references/task-detail.md +10 -0
- package/skills/ae-engage/references/task-submit-approval.md +45 -0
- package/skills/ae-engage/references/validate-flow-node-config.md +1 -1
- package/skills/ae-generate-tracking-code/SKILL.md +24 -8
- package/skills/ae-generate-tracking-code/references/debug-script.md +46 -37
- package/skills/ae-generate-tracking-plan/SKILL.md +26 -1
- package/skills/ae-metadata/SKILL.md +1 -1
- package/dist/config-BSSALXEN.js +0 -128
- package/dist/sync-QFP4XFN3.js +0 -485
|
@@ -1,247 +1,3 @@
|
|
|
1
|
-
// src/core/multiselect.ts
|
|
2
|
-
var MultiselectCancelled = class extends Error {
|
|
3
|
-
constructor() {
|
|
4
|
-
super("Selection cancelled by user");
|
|
5
|
-
this.name = "MultiselectCancelled";
|
|
6
|
-
}
|
|
7
|
-
};
|
|
8
|
-
function buildRows(items) {
|
|
9
|
-
const rows = [];
|
|
10
|
-
let lastGroup;
|
|
11
|
-
for (let i = 0; i < items.length; i++) {
|
|
12
|
-
const it = items[i];
|
|
13
|
-
if (it.group && it.group !== lastGroup) {
|
|
14
|
-
rows.push({ kind: "header", groupLabel: it.group });
|
|
15
|
-
lastGroup = it.group;
|
|
16
|
-
}
|
|
17
|
-
rows.push({ kind: "item", itemIndex: i, item: it });
|
|
18
|
-
}
|
|
19
|
-
return rows;
|
|
20
|
-
}
|
|
21
|
-
function promptMultiselect(opts) {
|
|
22
|
-
const { title, items } = opts;
|
|
23
|
-
if (items.length === 0) {
|
|
24
|
-
return Promise.resolve([]);
|
|
25
|
-
}
|
|
26
|
-
const stderr = process.stderr;
|
|
27
|
-
const stdin = process.stdin;
|
|
28
|
-
if (!stdin.isTTY) {
|
|
29
|
-
return Promise.reject(
|
|
30
|
-
new Error("ae-cli sync requires a TTY for multi-select; please run in an interactive terminal")
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
const rows = buildRows(items);
|
|
34
|
-
const itemRowIndices = [];
|
|
35
|
-
rows.forEach((r, idx) => {
|
|
36
|
-
if (r.kind === "item") itemRowIndices.push(idx);
|
|
37
|
-
});
|
|
38
|
-
const selected = /* @__PURE__ */ new Set();
|
|
39
|
-
items.forEach((it, idx) => {
|
|
40
|
-
if (it.preselected) selected.add(idx);
|
|
41
|
-
});
|
|
42
|
-
let cursorRowIdx = itemRowIndices[0];
|
|
43
|
-
let renderCount = 0;
|
|
44
|
-
function totalLines() {
|
|
45
|
-
return rows.length + 2;
|
|
46
|
-
}
|
|
47
|
-
function render() {
|
|
48
|
-
if (renderCount > 0) {
|
|
49
|
-
stderr.write(`\x1B[${totalLines()}A`);
|
|
50
|
-
}
|
|
51
|
-
stderr.write(`${title} (space: select \xB7 a: select all/none \xB7 enter: confirm \xB7 q: cancel)\x1B[K
|
|
52
|
-
`);
|
|
53
|
-
stderr.write(`\x1B[K
|
|
54
|
-
`);
|
|
55
|
-
rows.forEach((row, ridx) => {
|
|
56
|
-
if (row.kind === "header") {
|
|
57
|
-
stderr.write(` \x1B[90m\u2500\u2500 ${row.groupLabel} \u2500\u2500\x1B[0m\x1B[K
|
|
58
|
-
`);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
const isCursor = ridx === cursorRowIdx;
|
|
62
|
-
const isSelected = selected.has(row.itemIndex);
|
|
63
|
-
const pointer = isCursor ? "\x1B[36m\u276F\x1B[0m" : " ";
|
|
64
|
-
const checkbox = isSelected ? "\x1B[32m[x]\x1B[0m" : "[ ]";
|
|
65
|
-
const label = row.item.label;
|
|
66
|
-
const hint = row.item.hint ? ` \x1B[90m${row.item.hint}\x1B[0m` : "";
|
|
67
|
-
stderr.write(`${pointer} ${checkbox} ${label}${hint}\x1B[K
|
|
68
|
-
`);
|
|
69
|
-
});
|
|
70
|
-
renderCount++;
|
|
71
|
-
}
|
|
72
|
-
return new Promise((resolve, reject) => {
|
|
73
|
-
stderr.write("\x1B[?25l");
|
|
74
|
-
stdin.setRawMode(true);
|
|
75
|
-
stdin.resume();
|
|
76
|
-
stdin.setEncoding("utf8");
|
|
77
|
-
function cleanup() {
|
|
78
|
-
stdin.setRawMode(false);
|
|
79
|
-
stdin.pause();
|
|
80
|
-
stdin.removeListener("data", onData);
|
|
81
|
-
stderr.write("\x1B[?25h");
|
|
82
|
-
}
|
|
83
|
-
function moveCursor(direction) {
|
|
84
|
-
const cur = itemRowIndices.indexOf(cursorRowIdx);
|
|
85
|
-
const next = (cur + direction + itemRowIndices.length) % itemRowIndices.length;
|
|
86
|
-
cursorRowIdx = itemRowIndices[next];
|
|
87
|
-
render();
|
|
88
|
-
}
|
|
89
|
-
function toggleAll() {
|
|
90
|
-
if (selected.size === items.length) {
|
|
91
|
-
selected.clear();
|
|
92
|
-
} else {
|
|
93
|
-
items.forEach((_, idx) => selected.add(idx));
|
|
94
|
-
}
|
|
95
|
-
render();
|
|
96
|
-
}
|
|
97
|
-
function onData(key) {
|
|
98
|
-
if (key === "\x1B[A" || key === "k") {
|
|
99
|
-
moveCursor(-1);
|
|
100
|
-
} else if (key === "\x1B[B" || key === "j") {
|
|
101
|
-
moveCursor(1);
|
|
102
|
-
} else if (key === " ") {
|
|
103
|
-
const row = rows[cursorRowIdx];
|
|
104
|
-
if (row.kind === "item") {
|
|
105
|
-
const idx = row.itemIndex;
|
|
106
|
-
if (selected.has(idx)) selected.delete(idx);
|
|
107
|
-
else selected.add(idx);
|
|
108
|
-
render();
|
|
109
|
-
}
|
|
110
|
-
} else if (key === "a" || key === "A") {
|
|
111
|
-
toggleAll();
|
|
112
|
-
} else if (key === "\r" || key === "\n") {
|
|
113
|
-
if (selected.size === 0) {
|
|
114
|
-
stderr.write("\x07");
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
cleanup();
|
|
118
|
-
const result = Array.from(selected).map((i) => items[i].value);
|
|
119
|
-
resolve(result);
|
|
120
|
-
} else if (key === "q" || key === "Q" || key === "\x1B" || key === "") {
|
|
121
|
-
cleanup();
|
|
122
|
-
reject(new MultiselectCancelled());
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
stdin.on("data", onData);
|
|
126
|
-
render();
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
function promptSingleCheckboxSelect(opts) {
|
|
130
|
-
const { title, items } = opts;
|
|
131
|
-
if (items.length === 0) return Promise.reject(new Error("No items to select"));
|
|
132
|
-
const stderr = process.stderr;
|
|
133
|
-
const stdin = process.stdin;
|
|
134
|
-
if (!stdin.isTTY) return Promise.reject(new Error("A TTY is required for single-select"));
|
|
135
|
-
const preselectedIndex = items.findIndex((item) => item.preselected);
|
|
136
|
-
let cursor = preselectedIndex >= 0 ? preselectedIndex : 0;
|
|
137
|
-
let selected = preselectedIndex >= 0 ? preselectedIndex : null;
|
|
138
|
-
let renderCount = 0;
|
|
139
|
-
const lines = items.length + 2;
|
|
140
|
-
function render() {
|
|
141
|
-
if (renderCount > 0) stderr.write(`\x1B[${lines}A`);
|
|
142
|
-
stderr.write(`${title} (space: select \xB7 enter: confirm \xB7 q: cancel)\x1B[K
|
|
143
|
-
`);
|
|
144
|
-
stderr.write(`\x1B[K
|
|
145
|
-
`);
|
|
146
|
-
items.forEach((it, idx) => {
|
|
147
|
-
const pointer = idx === cursor ? "\x1B[36m\u276F\x1B[0m" : " ";
|
|
148
|
-
const checkbox = selected === idx ? "\x1B[32m[x]\x1B[0m" : "[ ]";
|
|
149
|
-
const hint = it.hint ? ` \x1B[90m${it.hint}\x1B[0m` : "";
|
|
150
|
-
stderr.write(`${pointer} ${checkbox} ${it.label}${hint}\x1B[K
|
|
151
|
-
`);
|
|
152
|
-
});
|
|
153
|
-
renderCount++;
|
|
154
|
-
}
|
|
155
|
-
return new Promise((resolve, reject) => {
|
|
156
|
-
stderr.write("\x1B[?25l");
|
|
157
|
-
stdin.setRawMode(true);
|
|
158
|
-
stdin.resume();
|
|
159
|
-
stdin.setEncoding("utf8");
|
|
160
|
-
function cleanup() {
|
|
161
|
-
stdin.setRawMode(false);
|
|
162
|
-
stdin.pause();
|
|
163
|
-
stdin.removeListener("data", onData);
|
|
164
|
-
stderr.write("\x1B[?25h");
|
|
165
|
-
}
|
|
166
|
-
function moveCursor(direction) {
|
|
167
|
-
cursor = (cursor + direction + items.length) % items.length;
|
|
168
|
-
render();
|
|
169
|
-
}
|
|
170
|
-
function onData(key) {
|
|
171
|
-
if (key === "\x1B[A" || key === "k") {
|
|
172
|
-
moveCursor(-1);
|
|
173
|
-
} else if (key === "\x1B[B" || key === "j") {
|
|
174
|
-
moveCursor(1);
|
|
175
|
-
} else if (key === " ") {
|
|
176
|
-
selected = cursor;
|
|
177
|
-
render();
|
|
178
|
-
} else if (key === "\r" || key === "\n") {
|
|
179
|
-
if (selected === null) {
|
|
180
|
-
stderr.write("\x07");
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
cleanup();
|
|
184
|
-
resolve(items[selected].value);
|
|
185
|
-
} else if (key === "q" || key === "Q" || key === "\x1B" || key === "") {
|
|
186
|
-
cleanup();
|
|
187
|
-
reject(new MultiselectCancelled());
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
stdin.on("data", onData);
|
|
191
|
-
render();
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
function promptSingleSelect(opts) {
|
|
195
|
-
const { title, items } = opts;
|
|
196
|
-
if (items.length === 0) return Promise.reject(new Error("No items to select"));
|
|
197
|
-
const stderr = process.stderr;
|
|
198
|
-
const stdin = process.stdin;
|
|
199
|
-
if (!stdin.isTTY) return Promise.reject(new Error("A TTY is required for single-select"));
|
|
200
|
-
let cursor = 0;
|
|
201
|
-
let renderCount = 0;
|
|
202
|
-
const lines = items.length + 1;
|
|
203
|
-
function render() {
|
|
204
|
-
if (renderCount > 0) stderr.write(`\x1B[${lines}A`);
|
|
205
|
-
stderr.write(`${title}\x1B[K
|
|
206
|
-
`);
|
|
207
|
-
items.forEach((it, idx) => {
|
|
208
|
-
const pointer = idx === cursor ? "\x1B[36m\u276F\x1B[0m" : " ";
|
|
209
|
-
stderr.write(`${pointer} ${it.label}\x1B[K
|
|
210
|
-
`);
|
|
211
|
-
});
|
|
212
|
-
renderCount++;
|
|
213
|
-
}
|
|
214
|
-
return new Promise((resolve, reject) => {
|
|
215
|
-
stderr.write("\x1B[?25l");
|
|
216
|
-
stdin.setRawMode(true);
|
|
217
|
-
stdin.resume();
|
|
218
|
-
stdin.setEncoding("utf8");
|
|
219
|
-
function cleanup() {
|
|
220
|
-
stdin.setRawMode(false);
|
|
221
|
-
stdin.pause();
|
|
222
|
-
stdin.removeListener("data", onData);
|
|
223
|
-
stderr.write("\x1B[?25h");
|
|
224
|
-
}
|
|
225
|
-
function onData(key) {
|
|
226
|
-
if (key === "\x1B[A" || key === "k") {
|
|
227
|
-
cursor = (cursor - 1 + items.length) % items.length;
|
|
228
|
-
render();
|
|
229
|
-
} else if (key === "\x1B[B" || key === "j") {
|
|
230
|
-
cursor = (cursor + 1) % items.length;
|
|
231
|
-
render();
|
|
232
|
-
} else if (key === "\r" || key === "\n") {
|
|
233
|
-
cleanup();
|
|
234
|
-
resolve(items[cursor].value);
|
|
235
|
-
} else if (key === "q" || key === "Q" || key === "\x1B" || key === "") {
|
|
236
|
-
cleanup();
|
|
237
|
-
reject(new MultiselectCancelled());
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
stdin.on("data", onData);
|
|
241
|
-
render();
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
|
|
245
1
|
// src/commands/sync/scanners.ts
|
|
246
2
|
import { createHash } from "crypto";
|
|
247
3
|
import { readdirSync, readFileSync as readFileSync2, statSync, lstatSync, existsSync as existsSync2, realpathSync } from "fs";
|
|
@@ -533,10 +289,6 @@ function describeSource(_c) {
|
|
|
533
289
|
}
|
|
534
290
|
|
|
535
291
|
export {
|
|
536
|
-
MultiselectCancelled,
|
|
537
|
-
promptMultiselect,
|
|
538
|
-
promptSingleCheckboxSelect,
|
|
539
|
-
promptSingleSelect,
|
|
540
292
|
SKILL_MANIFEST_FILE,
|
|
541
293
|
readSkillManifestEntries,
|
|
542
294
|
writeSkillManifestEntries,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
logger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JHENBQ5B.js";
|
|
4
4
|
|
|
5
5
|
// src/core/json-utils.ts
|
|
6
6
|
import fs from "fs";
|
|
@@ -105,7 +105,7 @@ function readSandboxCliTokenEntry() {
|
|
|
105
105
|
const data = safeReadJsonFile(file);
|
|
106
106
|
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
107
107
|
const url = data.url;
|
|
108
|
-
const token = data.token;
|
|
108
|
+
const token = data.token ?? data["cli-token"];
|
|
109
109
|
if (url && token) {
|
|
110
110
|
return { url, token };
|
|
111
111
|
}
|
|
@@ -210,6 +210,7 @@ function setActiveHost(url) {
|
|
|
210
210
|
}
|
|
211
211
|
function addHost(url, label) {
|
|
212
212
|
url = normalizeUrl(url);
|
|
213
|
+
label = normalizeLabel(label);
|
|
213
214
|
const config = loadConfig();
|
|
214
215
|
assertUniqueHostLabel(config, label, url);
|
|
215
216
|
config.hosts[url] = { label };
|
|
@@ -218,6 +219,24 @@ function addHost(url, label) {
|
|
|
218
219
|
}
|
|
219
220
|
saveConfig(config);
|
|
220
221
|
}
|
|
222
|
+
function updateHostLabel(url, label) {
|
|
223
|
+
url = normalizeUrl(url);
|
|
224
|
+
label = normalizeLabel(label);
|
|
225
|
+
const config = loadConfig();
|
|
226
|
+
if (!config.hosts[url]) {
|
|
227
|
+
throw new Error(`Host is not configured: ${url}`);
|
|
228
|
+
}
|
|
229
|
+
assertUniqueHostLabel(config, label, url);
|
|
230
|
+
config.hosts[url].label = label;
|
|
231
|
+
saveConfig(config);
|
|
232
|
+
}
|
|
233
|
+
function normalizeLabel(label) {
|
|
234
|
+
const normalized = label.trim();
|
|
235
|
+
if (!normalized) {
|
|
236
|
+
throw new Error("Label cannot be empty.");
|
|
237
|
+
}
|
|
238
|
+
return normalized;
|
|
239
|
+
}
|
|
221
240
|
function assertUniqueHostLabel(config, label, excludeUrl) {
|
|
222
241
|
const duplicate = Object.entries(config.hosts).find(([url, entry]) => url !== excludeUrl && entry.label === label);
|
|
223
242
|
if (duplicate) {
|
|
@@ -242,6 +261,17 @@ function listHosts() {
|
|
|
242
261
|
active: url === config.activeHost
|
|
243
262
|
}));
|
|
244
263
|
}
|
|
264
|
+
function resolveHostSelector(env) {
|
|
265
|
+
const raw = env.trim();
|
|
266
|
+
const selector = raw.startsWith("http://") || raw.startsWith("https://") ? normalizeUrl(raw) : raw;
|
|
267
|
+
const hosts = listHosts();
|
|
268
|
+
const byUrl = hosts.find((host) => host.url === selector);
|
|
269
|
+
if (byUrl) return { status: "found", host: byUrl };
|
|
270
|
+
const byLabel = hosts.filter((host) => host.label === raw);
|
|
271
|
+
if (byLabel.length === 1) return { status: "found", host: byLabel[0] };
|
|
272
|
+
if (byLabel.length > 1) return { status: "duplicate-label", matches: byLabel };
|
|
273
|
+
return { status: "not-found", hosts };
|
|
274
|
+
}
|
|
245
275
|
function getConfigDir() {
|
|
246
276
|
return CONFIG_DIR;
|
|
247
277
|
}
|
|
@@ -259,7 +289,9 @@ export {
|
|
|
259
289
|
getActiveHost,
|
|
260
290
|
setActiveHost,
|
|
261
291
|
addHost,
|
|
292
|
+
updateHostLabel,
|
|
262
293
|
removeHost,
|
|
263
294
|
listHosts,
|
|
295
|
+
resolveHostSelector,
|
|
264
296
|
getConfigDir
|
|
265
297
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
clearCliToken,
|
|
3
3
|
getCliToken
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Z3OXWCIA.js";
|
|
5
5
|
import {
|
|
6
6
|
safeJsonParse
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-GJJA4CQZ.js";
|
|
8
8
|
import {
|
|
9
9
|
PermissionError
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AXDXJTPC.js";
|
|
11
11
|
import {
|
|
12
12
|
logger
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-JHENBQ5B.js";
|
|
14
14
|
|
|
15
15
|
// src/core/capability-api.ts
|
|
16
16
|
import { readFile } from "fs/promises";
|
|
@@ -52,6 +52,14 @@ async function permissionMessage(resp) {
|
|
|
52
52
|
}
|
|
53
53
|
return "Permission denied for this resource (HTTP 403)";
|
|
54
54
|
}
|
|
55
|
+
async function permissionError(resp) {
|
|
56
|
+
const codeResponse = resp.clone();
|
|
57
|
+
const message = await permissionMessage(resp);
|
|
58
|
+
const body = safeJsonParse(await codeResponse.text());
|
|
59
|
+
const error = isRecord(body?.error) ? body.error : void 0;
|
|
60
|
+
const code = nonEmptyString(error?.code) ?? nonEmptyString(body?.code);
|
|
61
|
+
return new PermissionError(message, code);
|
|
62
|
+
}
|
|
55
63
|
function isInvalidCliTokenMessage(message) {
|
|
56
64
|
return /\byour token is invalid\b/i.test(message) || /\bcli[-_\s]?token\b.*\binvalid\b/i.test(message) || /\binvalid\b.*\bcli[-_\s]?token\b/i.test(message);
|
|
57
65
|
}
|
|
@@ -149,22 +157,26 @@ async function requestMultipartOnce(url, token, form) {
|
|
|
149
157
|
body: form
|
|
150
158
|
});
|
|
151
159
|
}
|
|
152
|
-
async function callGateway(host, domain, pathAfterV1, method, body, queryParams = {}) {
|
|
153
|
-
return (await callGatewayWithEnvelope(host, domain, pathAfterV1, method, body, queryParams)).data;
|
|
160
|
+
async function callGateway(host, domain, pathAfterV1, method, body, queryParams = {}, options = {}) {
|
|
161
|
+
return (await callGatewayWithEnvelope(host, domain, pathAfterV1, method, body, queryParams, options)).data;
|
|
154
162
|
}
|
|
155
|
-
async function callGatewayWithEnvelope(host, domain, pathAfterV1, method, body, queryParams = {}) {
|
|
156
|
-
const url = buildCapabilityGatewayUrl(host, domain, pathAfterV1, queryParams);
|
|
163
|
+
async function callGatewayWithEnvelope(host, domain, pathAfterV1, method, body, queryParams = {}, options = {}) {
|
|
164
|
+
const url = buildCapabilityGatewayUrl(options.apiBaseUrl ?? host, domain, pathAfterV1, queryParams);
|
|
157
165
|
const token = await getCliToken(host);
|
|
158
166
|
let resp = await requestOnce(url, method, token, body);
|
|
159
167
|
let permissionMsg;
|
|
160
168
|
if (resp.status === 403) {
|
|
161
|
-
|
|
169
|
+
const error = await permissionError(resp);
|
|
170
|
+
permissionMsg = error.message;
|
|
162
171
|
if (!isInvalidCliTokenMessage(permissionMsg)) {
|
|
163
|
-
throw
|
|
172
|
+
throw error;
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
|
-
if (resp.status === 401
|
|
167
|
-
|
|
175
|
+
if (resp.status === 401) {
|
|
176
|
+
if (options.retryOnUnauthorized === false) {
|
|
177
|
+
await throwCapabilityHttpError(resp);
|
|
178
|
+
}
|
|
179
|
+
logger.warn(`Capability gateway request failed (HTTP 401) for ${host}, refreshing CLI token`);
|
|
168
180
|
clearCliToken(host);
|
|
169
181
|
const newToken = await getCliToken(host);
|
|
170
182
|
process.stderr.write(`[ae-cli] CLI token refreshed for ${host}
|
|
@@ -176,6 +188,19 @@ async function callGatewayWithEnvelope(host, domain, pathAfterV1, method, body,
|
|
|
176
188
|
if (!resp.ok) {
|
|
177
189
|
await throwCapabilityHttpError(resp);
|
|
178
190
|
}
|
|
191
|
+
} else if (resp.status === 403 && permissionMsg) {
|
|
192
|
+
logger.warn(`Capability gateway request failed (${permissionMsg}) for ${host}, refreshing CLI token`);
|
|
193
|
+
clearCliToken(host);
|
|
194
|
+
const newToken = await getCliToken(host);
|
|
195
|
+
process.stderr.write(`[ae-cli] CLI token refreshed for ${host}
|
|
196
|
+
`);
|
|
197
|
+
resp = await requestOnce(url, method, newToken, body);
|
|
198
|
+
if (resp.status === 403) {
|
|
199
|
+
throw await permissionError(resp);
|
|
200
|
+
}
|
|
201
|
+
if (!resp.ok) {
|
|
202
|
+
await throwCapabilityHttpError(resp);
|
|
203
|
+
}
|
|
179
204
|
} else if (!resp.ok) {
|
|
180
205
|
await throwCapabilityHttpError(resp);
|
|
181
206
|
}
|
|
@@ -186,7 +211,7 @@ async function fetchCapabilityGateway(host, domain, pathAfterV1, method = "GET",
|
|
|
186
211
|
const token = await getCliToken(host);
|
|
187
212
|
let resp = await requestOnce(url, method, token, body, accept);
|
|
188
213
|
if (resp.status === 403) {
|
|
189
|
-
throw
|
|
214
|
+
throw await permissionError(resp);
|
|
190
215
|
}
|
|
191
216
|
if (resp.status === 401) {
|
|
192
217
|
logger.warn(`Capability gateway request failed (HTTP 401) for ${host}, refreshing CLI token`);
|
|
@@ -196,7 +221,7 @@ async function fetchCapabilityGateway(host, domain, pathAfterV1, method = "GET",
|
|
|
196
221
|
`);
|
|
197
222
|
resp = await requestOnce(url, method, newToken, body, accept);
|
|
198
223
|
if (resp.status === 403) {
|
|
199
|
-
throw
|
|
224
|
+
throw await permissionError(resp);
|
|
200
225
|
}
|
|
201
226
|
if (!resp.ok) {
|
|
202
227
|
await throwCapabilityHttpError(resp);
|
|
@@ -275,7 +300,7 @@ async function uploadInputFileBytes(host, domain, projectId, purpose, bytes, fil
|
|
|
275
300
|
const token = await getCliToken(host);
|
|
276
301
|
let resp = await requestMultipartOnce(url, token, form);
|
|
277
302
|
if (resp.status === 403) {
|
|
278
|
-
throw
|
|
303
|
+
throw await permissionError(resp);
|
|
279
304
|
}
|
|
280
305
|
if (resp.status === 401) {
|
|
281
306
|
logger.warn(`Capability gateway request failed (HTTP 401) for ${host}, refreshing CLI token`);
|
|
@@ -285,7 +310,7 @@ async function uploadInputFileBytes(host, domain, projectId, purpose, bytes, fil
|
|
|
285
310
|
`);
|
|
286
311
|
resp = await requestMultipartOnce(url, newToken, form);
|
|
287
312
|
if (resp.status === 403) {
|
|
288
|
-
throw
|
|
313
|
+
throw await permissionError(resp);
|
|
289
314
|
}
|
|
290
315
|
if (!resp.ok) {
|
|
291
316
|
await throwCapabilityHttpError(resp);
|
|
@@ -295,6 +320,13 @@ async function uploadInputFileBytes(host, domain, projectId, purpose, bytes, fil
|
|
|
295
320
|
}
|
|
296
321
|
return unwrapCapabilityEnvelope(parseCapabilityResponse(await resp.text()));
|
|
297
322
|
}
|
|
323
|
+
async function callCapabilityApi(host, domain, action, method = "POST", params = {}, options = {}) {
|
|
324
|
+
const isGet = method === "GET";
|
|
325
|
+
if (isGet) {
|
|
326
|
+
return callGateway(host, domain, action.replace(/^\/+|\/+$/g, ""), "GET", void 0, {}, options);
|
|
327
|
+
}
|
|
328
|
+
return callGateway(host, domain, action.replace(/^\/+|\/+$/g, ""), method, params, {}, options);
|
|
329
|
+
}
|
|
298
330
|
|
|
299
331
|
export {
|
|
300
332
|
CapabilityGatewayError,
|
|
@@ -309,5 +341,6 @@ export {
|
|
|
309
341
|
dryRunCapability,
|
|
310
342
|
validateCapability,
|
|
311
343
|
uploadInputFile,
|
|
312
|
-
uploadInputFileBytes
|
|
344
|
+
uploadInputFileBytes,
|
|
345
|
+
callCapabilityApi
|
|
313
346
|
};
|
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
32
|
+
|
|
1
33
|
// src/core/logger.ts
|
|
2
34
|
import fs from "fs";
|
|
3
35
|
import path from "path";
|
|
@@ -82,5 +114,8 @@ var Logger = class {
|
|
|
82
114
|
var logger = new Logger();
|
|
83
115
|
|
|
84
116
|
export {
|
|
117
|
+
__require,
|
|
118
|
+
__commonJS,
|
|
119
|
+
__toESM,
|
|
85
120
|
logger
|
|
86
121
|
};
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAnalysisMappingPathForClusterMode
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NBPKWKRA.js";
|
|
4
4
|
import {
|
|
5
5
|
clearCliToken,
|
|
6
6
|
getCliToken
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Z3OXWCIA.js";
|
|
8
8
|
import {
|
|
9
9
|
getActiveHost,
|
|
10
10
|
safeJsonParse
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-GJJA4CQZ.js";
|
|
12
12
|
import {
|
|
13
13
|
PermissionError
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-AXDXJTPC.js";
|
|
15
15
|
import {
|
|
16
16
|
logger
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-JHENBQ5B.js";
|
|
18
18
|
|
|
19
19
|
// src/core/mcp.ts
|
|
20
20
|
async function permissionMessage(resp) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getSandboxClusterInfoFilePath,
|
|
3
3
|
safeReadJsonFile
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GJJA4CQZ.js";
|
|
5
5
|
import {
|
|
6
6
|
logger
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JHENBQ5B.js";
|
|
8
8
|
|
|
9
9
|
// src/core/cluster-info.ts
|
|
10
10
|
import fs from "fs";
|