@thinkingai/ae-cli 6.0.31 → 6.0.33
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 +3 -2
- package/README.zh.md +3 -2
- package/dist/{auth-MEJ642P4.js → auth-ENM3FE6L.js} +3 -2
- package/dist/{auth-7H3HAAJ3.js → auth-UPGUOKTW.js} +13 -6
- package/dist/{capability-SEH3JWLN.js → capability-AJC5CBRT.js} +50 -18
- package/dist/{capability-SQ2IWKP3.js → capability-TQ5KU5Q6.js} +50 -18
- package/dist/chunk-24BAVOX3.js +51 -0
- package/dist/{chunk-MDJGDI6K.js → chunk-3KI3RRXX.js} +5 -5
- package/dist/{chunk-PKRD2IEM.js → chunk-3P3562ZX.js} +9 -7
- package/dist/{chunk-R77JT7XD.js → chunk-4Q5TNP4Q.js} +4 -4
- package/dist/{chunk-TKQJQXWT.js → chunk-6CHYBI64.js} +7 -4
- package/dist/{chunk-6LEYLOV3.js → chunk-CPVTECJ3.js} +9 -7
- package/dist/{chunk-KCA6BA5D.js → chunk-DB4Q3ANU.js} +5 -3
- package/dist/{chunk-2NDGFQHW.js → chunk-E7UXXHO3.js} +11 -3
- package/dist/{chunk-I4A62X3N.js → chunk-HQ2A7ITL.js} +23 -14
- package/dist/chunk-IMMGMU54.js +674 -0
- package/dist/{chunk-AJTH7LT3.js → chunk-IR4ZLVPW.js} +4 -2
- package/dist/{chunk-N2QORU5D.js → chunk-ISY6HMHM.js} +7 -4
- package/dist/{chunk-KGJQCYVC.js → chunk-LCXU3AAT.js} +4 -2
- package/dist/chunk-LYVNONC4.js +86 -0
- package/dist/{chunk-DYOS6YY7.js → chunk-RGXCNC4N.js} +23 -14
- package/dist/{chunk-YCLVYFK7.js → chunk-V6FR6WTW.js} +45 -87
- package/dist/chunk-VTWMIC5L.js +27 -0
- package/dist/{cli-token-TVQRSE46.js → cli-token-4SBMXAUK.js} +6 -3
- package/dist/{client-2643Z5AG.js → client-PP5FETMW.js} +4 -3
- package/dist/community-report-client-KK2QBANO.js +145 -0
- package/dist/{config-7UZWDE74.js → config-RCCGHHYA.js} +6 -3
- package/dist/index.js +541 -234
- package/dist/{metadata-W6JFFMBA.js → metadata-3M5F2AED.js} +15 -14
- package/dist/{metadata-X62TKIVK.js → metadata-W2MEOI4Z.js} +15 -14
- package/dist/{model-T3KZJWLW.js → model-OYQLXCQY.js} +3 -2
- package/dist/{raw-CN542NGT.js → raw-TPB7KSZO.js} +6 -4
- package/dist/{sync-ERNHDPB5.js → sync-EFJKFZK2.js} +6 -3
- package/dist/{te-agent-FCCWUDTJ.js → te-agent-K2OWMZXT.js} +3 -2
- package/dist/{te-analysis-NJGNWZFC.js → te-analysis-I73ZS4NK.js} +2196 -120
- package/dist/{te-analysis-YGV5V5EX.js → te-analysis-Q7AZCDU4.js} +2196 -120
- package/dist/te-common-ST3QPSXJ.js +61 -0
- package/dist/te-common-WSLIKKPC.js +61 -0
- package/dist/te-community-WXGB6IOX.js +1659 -0
- package/dist/te-community-X2AHXGCA.js +1659 -0
- package/dist/{te-dataops-ZNJBQ6VT.js → te-dataops-MJV54MNY.js} +10 -8
- package/dist/{te-dataops-F36T656A.js → te-dataops-OA7I6HBG.js} +10 -8
- package/dist/te-engage-GJRVQMK3.js +3895 -0
- package/dist/te-engage-JIXX3WBI.js +3895 -0
- package/dist/{te-kb-NT33UHAE.js → te-kb-CIZXRWMO.js} +105 -23
- package/dist/{te-meta-VKWNAWO4.js → te-meta-Q4L6EE3Q.js} +8 -240
- package/dist/{te-meta-MAAUHFQO.js → te-meta-VHCN4Q62.js} +8 -240
- package/dist/{te-team-OKCOX7OE.js → te-team-PDKKW7Q5.js} +7 -6
- package/dist/tracking/i18n/resources/cli/en.json +4 -3
- package/dist/tracking/i18n/resources/cli/ja.json +4 -3
- package/dist/tracking/i18n/resources/cli/ko.json +4 -3
- package/dist/tracking/i18n/resources/cli/zh.json +4 -3
- package/package.json +6 -2
- package/skills/ae-agent/SKILL.md +2 -1
- package/skills/ae-analysis/SKILL.md +21 -7
- package/skills/ae-analysis/references/adhoc_export.md +5 -6
- package/skills/ae-analysis/references/adhoc_run.md +7 -9
- package/skills/ae-analysis/references/ai_models.md +17 -1
- package/skills/ae-analysis/references/alert_create.md +25 -0
- package/skills/ae-analysis/references/alert_definition_schema_get.md +24 -0
- package/skills/ae-analysis/references/alert_delete.md +26 -0
- package/skills/ae-analysis/references/alert_detail_list.md +27 -0
- package/skills/ae-analysis/references/alert_get.md +25 -0
- package/skills/ae-analysis/references/alert_job_list.md +24 -0
- package/skills/ae-analysis/references/alert_list.md +27 -0
- package/skills/ae-analysis/references/alert_notice_config_list.md +24 -0
- package/skills/ae-analysis/references/alert_start.md +25 -0
- package/skills/ae-analysis/references/alert_stop.md +25 -0
- package/skills/ae-analysis/references/alert_update.md +26 -0
- package/skills/ae-analysis/references/analysis_data_retrieval.md +11 -11
- package/skills/ae-analysis/references/analysis_drilldown_contract.md +93 -0
- package/skills/ae-analysis/references/analysis_gateway_assets.md +9 -8
- package/skills/ae-analysis/references/asset_url_get.md +4 -3
- package/skills/ae-analysis/references/bi_panel_create.md +3 -3
- package/skills/ae-analysis/references/bi_panel_page_data_export.md +2 -2
- package/skills/ae-analysis/references/bi_panel_page_data_run.md +1 -1
- package/skills/ae-analysis/references/check_delete.md +27 -0
- package/skills/ae-analysis/references/check_export.md +27 -0
- package/skills/ae-analysis/references/check_get.md +27 -0
- package/skills/ae-analysis/references/check_list.md +24 -0
- package/skills/ae-analysis/references/check_retry.md +27 -0
- package/skills/ae-analysis/references/check_run.md +25 -0
- package/skills/ae-analysis/references/command_index.md +114 -46
- package/skills/ae-analysis/references/create_entity.md +2 -2
- package/skills/ae-analysis/references/dashboard_create.md +3 -3
- package/skills/ae-analysis/references/dashboard_daily_report_send.md +1 -0
- package/skills/ae-analysis/references/dashboard_daily_report_update.md +2 -0
- package/skills/ae-analysis/references/dashboard_report_data_export.md +4 -4
- package/skills/ae-analysis/references/dashboard_report_data_run.md +4 -4
- package/skills/ae-analysis/references/drilldown_entities_export.md +26 -0
- package/skills/ae-analysis/references/drilldown_entities_run.md +33 -0
- package/skills/ae-analysis/references/drilldown_events_export.md +21 -0
- package/skills/ae-analysis/references/drilldown_events_run.md +23 -0
- package/skills/ae-analysis/references/drilldown_user_events_export.md +6 -3
- package/skills/ae-analysis/references/drilldown_user_events_run.md +6 -6
- package/skills/ae-analysis/references/entity_detail_export.md +2 -0
- package/skills/ae-analysis/references/entity_detail_run.md +8 -1
- package/skills/ae-analysis/references/event_blacklist_add.md +25 -0
- package/skills/ae-analysis/references/event_blacklist_list.md +24 -0
- package/skills/ae-analysis/references/event_blacklist_update.md +26 -0
- package/skills/ae-analysis/references/event_detail_export.md +2 -0
- package/skills/ae-analysis/references/event_detail_run.md +2 -0
- package/skills/ae-analysis/references/event_list.md +10 -2
- package/skills/ae-analysis/references/ingest_error_list.md +27 -0
- package/skills/ae-analysis/references/ingest_summary.md +26 -0
- package/skills/ae-analysis/references/list_entities.md +1 -1
- package/skills/ae-analysis/references/live_data_export.md +27 -0
- package/skills/ae-analysis/references/live_data_list.md +27 -0
- package/skills/ae-analysis/references/metric_create.md +13 -4
- package/skills/ae-analysis/references/metric_delete.md +7 -0
- package/skills/ae-analysis/references/metric_get.md +6 -0
- package/skills/ae-analysis/references/metric_list.md +16 -3
- package/skills/ae-analysis/references/metric_update.md +12 -1
- package/skills/ae-analysis/references/plan_change_log_export.md +27 -0
- package/skills/ae-analysis/references/plan_change_log_list.md +24 -0
- package/skills/ae-analysis/references/plan_delete_items.md +30 -0
- package/skills/ae-analysis/references/plan_export.md +26 -0
- package/skills/ae-analysis/references/plan_generate.md +27 -0
- package/skills/ae-analysis/references/plan_get.md +24 -0
- package/skills/ae-analysis/references/plan_import_excel.md +26 -0
- package/skills/ae-analysis/references/plan_save_items.md +27 -0
- package/skills/ae-analysis/references/plan_sync_from_meta.md +24 -0
- package/skills/ae-analysis/references/project_access_detail_get.md +23 -0
- package/skills/ae-analysis/references/project_data_power_delete.md +26 -0
- package/skills/ae-analysis/references/project_data_power_get.md +24 -0
- package/skills/ae-analysis/references/project_data_power_list.md +23 -0
- package/skills/ae-analysis/references/project_data_power_upsert.md +24 -0
- package/skills/ae-analysis/references/project_entity_create.md +27 -0
- package/skills/ae-analysis/references/project_entity_delete.md +25 -0
- package/skills/ae-analysis/references/project_entity_event_list.md +24 -0
- package/skills/ae-analysis/references/project_entity_get.md +24 -0
- package/skills/ae-analysis/references/project_entity_list.md +28 -0
- package/skills/ae-analysis/references/project_entity_update.md +28 -0
- package/skills/ae-analysis/references/project_function_list.md +24 -0
- package/skills/ae-analysis/references/project_info_get.md +23 -0
- package/skills/ae-analysis/references/project_info_list.md +26 -0
- package/skills/ae-analysis/references/project_info_update.md +25 -0
- package/skills/ae-analysis/references/project_mark_time_create.md +27 -0
- package/skills/ae-analysis/references/project_mark_time_delete.md +25 -0
- package/skills/ae-analysis/references/project_mark_time_list.md +28 -0
- package/skills/ae-analysis/references/project_mark_time_update.md +28 -0
- package/skills/ae-analysis/references/project_member_add.md +25 -0
- package/skills/ae-analysis/references/project_member_batch_update.md +24 -0
- package/skills/ae-analysis/references/project_member_candidate_list.md +25 -0
- package/skills/ae-analysis/references/project_member_handover_export.md +27 -0
- package/skills/ae-analysis/references/project_member_handover_run.md +24 -0
- package/skills/ae-analysis/references/project_member_import.md +25 -0
- package/skills/ae-analysis/references/project_member_list.md +23 -0
- package/skills/ae-analysis/references/project_member_receiver_list.md +23 -0
- package/skills/ae-analysis/references/project_member_remove.md +26 -0
- package/skills/ae-analysis/references/project_member_update.md +25 -0
- package/skills/ae-analysis/references/project_owner_update.md +27 -0
- package/skills/ae-analysis/references/project_permission_binding_list.md +24 -0
- package/skills/ae-analysis/references/project_receive_status_update.md +25 -0
- package/skills/ae-analysis/references/project_role_delete.md +26 -0
- package/skills/ae-analysis/references/project_role_function_list.md +27 -0
- package/skills/ae-analysis/references/project_role_get.md +24 -0
- package/skills/ae-analysis/references/project_role_list.md +25 -0
- package/skills/ae-analysis/references/project_role_upsert.md +24 -0
- package/skills/ae-analysis/references/project_role_user_list.md +24 -0
- package/skills/ae-analysis/references/project_timezone_get.md +23 -0
- package/skills/ae-analysis/references/project_timezone_overview.md +23 -0
- package/skills/ae-analysis/references/project_timezone_update.md +25 -0
- package/skills/ae-analysis/references/project_user_id_items_update.md +24 -0
- package/skills/ae-analysis/references/property_list.md +21 -6
- package/skills/ae-analysis/references/public_link_create.md +1 -1
- package/skills/ae-analysis/references/query_create_result_cluster.md +15 -32
- package/skills/ae-analysis/references/report_create.md +1 -1
- package/skills/ae-analysis/references/report_data_export.md +5 -3
- package/skills/ae-analysis/references/report_data_run.md +13 -3
- package/skills/ae-analysis/references/report_get.md +2 -0
- package/skills/ae-analysis/references/report_update.md +1 -1
- package/skills/ae-analysis/references/sdk_sample_generate.md +24 -0
- package/skills/ae-analysis/references/user_cluster_create.md +5 -1
- package/skills/ae-analysis/references/user_cluster_create_id.md +2 -0
- package/skills/ae-analysis/references/user_cluster_get.md +4 -0
- package/skills/ae-analysis/references/user_cluster_refresh.md +4 -2
- package/skills/ae-analysis/references/user_cluster_update.md +5 -1
- package/skills/ae-analysis/references/user_cluster_update_id.md +2 -0
- package/skills/ae-analysis/references/user_tag_create.md +5 -1
- package/skills/ae-analysis/references/user_tag_create_id.md +2 -0
- package/skills/ae-analysis/references/user_tag_get.md +4 -0
- package/skills/ae-analysis/references/user_tag_refresh.md +4 -2
- package/skills/ae-analysis/references/user_tag_update.md +5 -1
- package/skills/ae-analysis/references/user_tag_update_id.md +2 -0
- package/skills/ae-analysis/references/virtual_event_create.md +22 -3
- package/skills/ae-analysis/references/virtual_property_create.md +23 -2
- package/skills/ae-analysis-global/SKILL.md +2 -0
- package/skills/ae-capability/SKILL.md +7 -5
- package/skills/ae-community/SKILL.md +72 -8
- package/skills/ae-community/references/community-chat-analysis.md +341 -0
- package/skills/ae-community/references/community-data-report.md +301 -0
- package/skills/ae-dataops/SKILL.md +2 -1
- package/skills/ae-engage/SKILL.md +204 -8
- package/skills/ae-engage/references/activity-activity-type.md +42 -0
- package/skills/ae-engage/references/activity-activity.md +70 -0
- package/skills/ae-engage/references/activity-approval.md +53 -0
- package/skills/ae-engage/references/activity-task.md +87 -0
- package/skills/ae-engage/references/activity-topic.md +98 -0
- package/skills/ae-engage/references/approval-approver-delete.md +26 -0
- package/skills/ae-engage/references/channel-test-send.md +37 -0
- package/skills/ae-engage/references/channel-touch-limits-batch-update.md +28 -0
- package/skills/ae-engage/references/channel-touch-limits-save.md +37 -0
- package/skills/ae-engage/references/channel-touch-limits-toggle.md +28 -0
- package/skills/ae-engage/references/channel-update-config.md +36 -0
- package/skills/ae-engage/references/client-param.md +58 -0
- package/skills/ae-engage/references/common-metric.md +75 -0
- package/skills/ae-engage/references/config-table.md +92 -0
- package/skills/ae-engage/references/engage-scene-config-item.md +69 -0
- package/skills/ae-engage/references/operation-log-query.md +1 -1
- package/skills/ae-engage/references/preset-event.md +42 -0
- package/skills/ae-engage/references/push-language.md +39 -0
- package/skills/ae-engage/references/scene-config-channel.md +58 -0
- package/skills/ae-engage/references/scene-config-group.md +62 -0
- package/skills/ae-engage/references/scene-config-item.md +68 -0
- package/skills/ae-engage/references/scene-config-metric.md +79 -0
- package/skills/ae-engage/references/scene-config-param.md +72 -0
- package/skills/ae-engage/references/scene-preset-metric.md +45 -0
- package/skills/ae-engage/references/scene-strategy.md +47 -0
- package/skills/ae-engage/references/scene-template.md +71 -0
- package/skills/ae-engage/references/{ops-delete.md → task-delete.md} +3 -3
- package/skills/ae-engage/references/whitelist.md +72 -0
- package/skills/ae-engage/references/workbench-workbench.md +48 -0
- package/skills/ae-generate-tracking-code/SKILL.md +4 -4
- package/skills/ae-generate-tracking-plan/SKILL.md +140 -16
- package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +98 -33
- package/skills/ae-generate-tracking-plan/references/te-api.md +1 -1
- package/skills/ae-generate-tracking-plan/references/xlsx-schema.md +16 -14
- package/skills/ae-kb/SKILL.md +36 -9
- package/skills/ae-metadata/SKILL.md +3 -2
- package/skills/ae-metadata/references/metadata_event_get.md +4 -4
- package/skills/ae-metadata/references/metadata_property_dimension_table_bind_existing.md +1 -1
- package/skills/ae-metadata/references/metadata_property_get.md +4 -4
- package/skills/ae-team/SKILL.md +2 -1
- package/dist/chunk-NOO24N7W.js +0 -11
- package/dist/chunk-TNW2CI4W.js +0 -129
- package/dist/te-common-5NJLF3XG.js +0 -130
- package/dist/te-common-7VTJZPII.js +0 -130
- package/dist/te-community-PEZ2VEF7.js +0 -687
- package/dist/te-community-TSKJ652U.js +0 -687
- package/dist/te-engage-BUWVSSSK.js +0 -1912
- package/dist/te-engage-EPE3QKDE.js +0 -1912
- package/skills/ae-analysis/references/create_metric.md +0 -58
- package/skills/ae-analysis/references/create_virtual_event.md +0 -60
- package/skills/ae-analysis/references/create_virtual_property.md +0 -69
- package/skills/ae-analysis/references/delete_metric.md +0 -32
- package/skills/ae-analysis/references/drilldown_users_export.md +0 -17
- package/skills/ae-analysis/references/drilldown_users_run.md +0 -61
- package/skills/ae-analysis/references/get_metric.md +0 -38
- package/skills/ae-analysis/references/get_resource_url.md +0 -33
- package/skills/ae-analysis/references/list_events.md +0 -46
- package/skills/ae-analysis/references/list_metrics.md +0 -52
- package/skills/ae-analysis/references/list_properties.md +0 -47
- package/skills/ae-analysis/references/update_metric.md +0 -58
- package/dist/{chunk-HL2AJQ4Q.js → chunk-PTE56QPL.js} +3 -3
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
import {
|
|
2
|
+
peekCliToken
|
|
3
|
+
} from "./chunk-E7UXXHO3.js";
|
|
4
|
+
import {
|
|
5
|
+
getToken
|
|
6
|
+
} from "./chunk-IR4ZLVPW.js";
|
|
7
|
+
import {
|
|
8
|
+
getActiveHost,
|
|
9
|
+
getConfigDir,
|
|
10
|
+
isAeSandboxRuntime,
|
|
11
|
+
normalizeUrl
|
|
12
|
+
} from "./chunk-V6FR6WTW.js";
|
|
13
|
+
import {
|
|
14
|
+
logger
|
|
15
|
+
} from "./chunk-LYVNONC4.js";
|
|
16
|
+
|
|
17
|
+
// src/core/update-check.ts
|
|
18
|
+
import fs from "fs";
|
|
19
|
+
import path from "path";
|
|
20
|
+
var CONFIG_DIR = path.join(process.env.HOME || "", ".ae-cli");
|
|
21
|
+
var CACHE_FILE = path.join(CONFIG_DIR, "update-check.json");
|
|
22
|
+
var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
23
|
+
var FETCH_TIMEOUT_MS = 3e3;
|
|
24
|
+
var REGISTRY_BY_PACKAGE = {
|
|
25
|
+
"@thinkingai/ae-cli": "https://registry.npmjs.org"
|
|
26
|
+
};
|
|
27
|
+
var UPDATE_CHECK_PACKAGE = "@thinkingai/ae-cli";
|
|
28
|
+
function isUpdateCheckEnabled(packageName) {
|
|
29
|
+
return packageName === UPDATE_CHECK_PACKAGE;
|
|
30
|
+
}
|
|
31
|
+
var DEFAULT_REGISTRY = "https://registry.npmjs.org";
|
|
32
|
+
function parseVersion(version) {
|
|
33
|
+
const core = version.trim().split("-")[0];
|
|
34
|
+
return core.split(".").map((part) => {
|
|
35
|
+
const n = Number.parseInt(part, 10);
|
|
36
|
+
return Number.isFinite(n) ? n : 0;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function isNewer(latest, current) {
|
|
40
|
+
const a = parseVersion(latest);
|
|
41
|
+
const b = parseVersion(current);
|
|
42
|
+
const len = Math.max(a.length, b.length, 3);
|
|
43
|
+
for (let i = 0; i < len; i += 1) {
|
|
44
|
+
const av = a[i] ?? 0;
|
|
45
|
+
const bv = b[i] ?? 0;
|
|
46
|
+
if (av > bv) return true;
|
|
47
|
+
if (av < bv) return false;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
function resolveRegistry(packageName) {
|
|
52
|
+
if (REGISTRY_BY_PACKAGE[packageName]) {
|
|
53
|
+
return REGISTRY_BY_PACKAGE[packageName];
|
|
54
|
+
}
|
|
55
|
+
const envRegistry = process.env.npm_config_registry?.replace(/\/$/, "");
|
|
56
|
+
return envRegistry || DEFAULT_REGISTRY;
|
|
57
|
+
}
|
|
58
|
+
function buildInstallCommand(packageName, registry) {
|
|
59
|
+
const base = `npm install -g ${packageName}@latest`;
|
|
60
|
+
if (registry === DEFAULT_REGISTRY) {
|
|
61
|
+
return base;
|
|
62
|
+
}
|
|
63
|
+
return `${base} --registry=${registry}`;
|
|
64
|
+
}
|
|
65
|
+
function shouldSkipUpdateCheck(argv = process.argv) {
|
|
66
|
+
if (process.env.AE_CLI_NO_UPDATE_CHECK === "1") return true;
|
|
67
|
+
if (process.env.CI === "true" || process.env.CI === "1") return true;
|
|
68
|
+
return argv.slice(2).some((arg) => {
|
|
69
|
+
if (arg === "--no-update-check") return true;
|
|
70
|
+
if (arg === "--version" || arg === "-V" || arg === "--help" || arg === "-h") return true;
|
|
71
|
+
return false;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function ensureConfigDir() {
|
|
75
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
76
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function readCache() {
|
|
80
|
+
try {
|
|
81
|
+
if (!fs.existsSync(CACHE_FILE)) return null;
|
|
82
|
+
const raw = fs.readFileSync(CACHE_FILE, "utf8");
|
|
83
|
+
const data = JSON.parse(raw);
|
|
84
|
+
if (!data.packageName || !data.latestVersion || !data.lastCheckedAt) return null;
|
|
85
|
+
return data;
|
|
86
|
+
} catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function writeCache(cache) {
|
|
91
|
+
try {
|
|
92
|
+
ensureConfigDir();
|
|
93
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function cacheIsStale(cache, packageName) {
|
|
98
|
+
if (!cache || cache.packageName !== packageName) return true;
|
|
99
|
+
const age = Date.now() - new Date(cache.lastCheckedAt).getTime();
|
|
100
|
+
return age >= CHECK_INTERVAL_MS;
|
|
101
|
+
}
|
|
102
|
+
function printUpdateNotice(current, latest, installCommand) {
|
|
103
|
+
process.stderr.write(`[ae-cli] Update available: ${current} \u2192 ${latest}
|
|
104
|
+
`);
|
|
105
|
+
process.stderr.write(` Run: ${installCommand}
|
|
106
|
+
`);
|
|
107
|
+
}
|
|
108
|
+
async function fetchLatestVersion(packageName, registry) {
|
|
109
|
+
const url = `${registry.replace(/\/$/, "")}/${encodeURIComponent(packageName)}`;
|
|
110
|
+
const controller = new AbortController();
|
|
111
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
112
|
+
try {
|
|
113
|
+
const resp = await fetch(url, {
|
|
114
|
+
signal: controller.signal,
|
|
115
|
+
headers: { Accept: "application/json" }
|
|
116
|
+
});
|
|
117
|
+
if (!resp.ok) return null;
|
|
118
|
+
const data = await resp.json();
|
|
119
|
+
const latest = data["dist-tags"]?.latest;
|
|
120
|
+
return typeof latest === "string" && latest.trim() ? latest.trim() : null;
|
|
121
|
+
} catch {
|
|
122
|
+
return null;
|
|
123
|
+
} finally {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function refreshCache(pkg, registry) {
|
|
128
|
+
const latest = await fetchLatestVersion(pkg.name, registry);
|
|
129
|
+
if (!latest) return readCache();
|
|
130
|
+
const cache = {
|
|
131
|
+
packageName: pkg.name,
|
|
132
|
+
currentVersion: pkg.version,
|
|
133
|
+
latestVersion: latest,
|
|
134
|
+
lastCheckedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
135
|
+
};
|
|
136
|
+
writeCache(cache);
|
|
137
|
+
return cache;
|
|
138
|
+
}
|
|
139
|
+
function maybeNotifyFromCache(pkg, cache, registry) {
|
|
140
|
+
if (!cache || cache.packageName !== pkg.name) return;
|
|
141
|
+
if (!isNewer(cache.latestVersion, pkg.version)) return;
|
|
142
|
+
printUpdateNotice(pkg.version, cache.latestVersion, buildInstallCommand(pkg.name, registry));
|
|
143
|
+
}
|
|
144
|
+
function notifyIfUpdateAvailable(pkg) {
|
|
145
|
+
if (!isUpdateCheckEnabled(pkg.name)) return;
|
|
146
|
+
if (shouldSkipUpdateCheck()) return;
|
|
147
|
+
const registry = resolveRegistry(pkg.name);
|
|
148
|
+
const cache = readCache();
|
|
149
|
+
maybeNotifyFromCache(pkg, cache, registry);
|
|
150
|
+
if (!cacheIsStale(cache, pkg.name)) return;
|
|
151
|
+
void refreshCache(pkg, registry).then((fresh) => {
|
|
152
|
+
if (!fresh) return;
|
|
153
|
+
if (cache && fresh.latestVersion === cache.latestVersion) return;
|
|
154
|
+
maybeNotifyFromCache(pkg, fresh, registry);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/core/compat-check.ts
|
|
159
|
+
import fs2 from "fs";
|
|
160
|
+
import path2 from "path";
|
|
161
|
+
|
|
162
|
+
// src/core/legacy-cli-version-map.ts
|
|
163
|
+
var HISTORICAL_CLUSTER_TO_PUBLIC_PIN = {
|
|
164
|
+
"6.0.0": "1.0.15",
|
|
165
|
+
"6.0.1": "1.0.15",
|
|
166
|
+
"6.0.2": "1.0.18",
|
|
167
|
+
"6.0.3": "1.0.18",
|
|
168
|
+
"6.0.4": "1.0.20",
|
|
169
|
+
"6.0.5": "1.0.21",
|
|
170
|
+
"6.0.6": "1.0.22",
|
|
171
|
+
"6.0.7": "1.0.22",
|
|
172
|
+
"6.0.8": "1.0.22",
|
|
173
|
+
"6.0.9": "1.0.22",
|
|
174
|
+
"6.0.10": "1.0.24",
|
|
175
|
+
"6.0.11": "1.0.24",
|
|
176
|
+
"6.0.12": "1.0.27",
|
|
177
|
+
"6.0.13": "1.0.28",
|
|
178
|
+
"6.0.14": "1.0.28",
|
|
179
|
+
"6.0.15": "1.0.30",
|
|
180
|
+
"6.0.16": "6.0.16",
|
|
181
|
+
"6.0.17": "6.0.17",
|
|
182
|
+
"6.0.18": "6.0.18",
|
|
183
|
+
"6.0.19": "6.0.18",
|
|
184
|
+
"6.0.20": "6.0.20",
|
|
185
|
+
"6.0.21": "6.0.20",
|
|
186
|
+
"6.0.22": "6.0.22",
|
|
187
|
+
"6.0.23": "6.0.22",
|
|
188
|
+
"6.0.24": "6.0.24",
|
|
189
|
+
"6.0.25": "6.0.24",
|
|
190
|
+
"6.0.26": "6.0.24"
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// src/core/version-compat.ts
|
|
194
|
+
var OPEN_SOURCE_AE_CLI_PACKAGE = "@thinkingai/ae-cli";
|
|
195
|
+
var AE_CLI_SKILLS_REPO = "ThinkingAIAgenticEngine/ae-cli";
|
|
196
|
+
var PUBLISHED_EXTERNAL_VERSIONS = /* @__PURE__ */ new Set([
|
|
197
|
+
"1.0.15",
|
|
198
|
+
"1.0.18",
|
|
199
|
+
"1.0.20",
|
|
200
|
+
"1.0.21",
|
|
201
|
+
"1.0.22",
|
|
202
|
+
"1.0.24",
|
|
203
|
+
"1.0.27",
|
|
204
|
+
"1.0.28",
|
|
205
|
+
"1.0.30",
|
|
206
|
+
"6.0.16",
|
|
207
|
+
"6.0.17",
|
|
208
|
+
"6.0.18",
|
|
209
|
+
"6.0.20",
|
|
210
|
+
"6.0.22",
|
|
211
|
+
"6.0.24",
|
|
212
|
+
"6.0.27",
|
|
213
|
+
"6.0.28",
|
|
214
|
+
"6.0.29",
|
|
215
|
+
"6.0.30",
|
|
216
|
+
"6.0.31"
|
|
217
|
+
]);
|
|
218
|
+
function normalizeCliVersion(version) {
|
|
219
|
+
return version.trim().replace(/^v/i, "");
|
|
220
|
+
}
|
|
221
|
+
function versionLine(version) {
|
|
222
|
+
const parts = normalizeCliVersion(version).split(/[.-]/);
|
|
223
|
+
if (parts.length < 2) return normalizeCliVersion(version);
|
|
224
|
+
return `${parts[0]}.${parts[1]}`;
|
|
225
|
+
}
|
|
226
|
+
function sameVersionLine(a, b) {
|
|
227
|
+
return versionLine(a) === versionLine(b);
|
|
228
|
+
}
|
|
229
|
+
function parseVersionParts(version) {
|
|
230
|
+
const core = normalizeCliVersion(version).split("-")[0];
|
|
231
|
+
return core.split(".").map((p) => {
|
|
232
|
+
const n = Number.parseInt(p, 10);
|
|
233
|
+
return Number.isFinite(n) ? n : 0;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
function compareNormalized(a, b) {
|
|
237
|
+
const pa = parseVersionParts(a);
|
|
238
|
+
const pb = parseVersionParts(b);
|
|
239
|
+
const len = Math.max(pa.length, pb.length, 3);
|
|
240
|
+
for (let i = 0; i < len; i += 1) {
|
|
241
|
+
const av = pa[i] ?? 0;
|
|
242
|
+
const bv = pb[i] ?? 0;
|
|
243
|
+
if (av > bv) return 1;
|
|
244
|
+
if (av < bv) return -1;
|
|
245
|
+
}
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
function evaluateCompat(localRaw, expectedRaw, clusterLine) {
|
|
249
|
+
const local = normalizeCliVersion(localRaw);
|
|
250
|
+
const expected = normalizeCliVersion(expectedRaw);
|
|
251
|
+
if (!local || !expected) return { kind: "ok" };
|
|
252
|
+
const line = clusterLine && clusterLine.trim() || versionLine(expected);
|
|
253
|
+
if (!sameVersionLine(local, expected)) {
|
|
254
|
+
return { kind: "line_mismatch", local, expected, line };
|
|
255
|
+
}
|
|
256
|
+
if (clusterLine && clusterLine.trim()) {
|
|
257
|
+
const clusterNorm = clusterLine.trim();
|
|
258
|
+
const localLine = versionLine(local);
|
|
259
|
+
if (localLine !== clusterNorm && localLine !== versionLine(clusterNorm)) {
|
|
260
|
+
return { kind: "line_mismatch", local, expected, line: clusterNorm };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (local === expected) return { kind: "ok" };
|
|
264
|
+
if (isNewer(local, expected)) {
|
|
265
|
+
return { kind: "local_newer", local, expected, line };
|
|
266
|
+
}
|
|
267
|
+
if (isNewer(expected, local)) {
|
|
268
|
+
return { kind: "local_older", local, expected, line };
|
|
269
|
+
}
|
|
270
|
+
return { kind: "ok" };
|
|
271
|
+
}
|
|
272
|
+
function resolvePinTarget(expectedVersion) {
|
|
273
|
+
const expected = expectedVersion.trim().replace(/^v/i, "");
|
|
274
|
+
if (!expected) return null;
|
|
275
|
+
if (PUBLISHED_EXTERNAL_VERSIONS.has(expected)) return expected;
|
|
276
|
+
const historical = HISTORICAL_CLUSTER_TO_PUBLIC_PIN[expected];
|
|
277
|
+
if (historical && PUBLISHED_EXTERNAL_VERSIONS.has(historical)) {
|
|
278
|
+
return historical;
|
|
279
|
+
}
|
|
280
|
+
const line = versionLine(expected);
|
|
281
|
+
const candidates = [...PUBLISHED_EXTERNAL_VERSIONS].filter((tag) => {
|
|
282
|
+
if (versionLine(tag) !== line) return false;
|
|
283
|
+
return compareNormalized(tag, expected) <= 0;
|
|
284
|
+
});
|
|
285
|
+
if (candidates.length === 0) return null;
|
|
286
|
+
candidates.sort((a, b) => compareNormalized(a, b));
|
|
287
|
+
return candidates[candidates.length - 1] ?? null;
|
|
288
|
+
}
|
|
289
|
+
function formatPinCommands(expectedVersion) {
|
|
290
|
+
const ver = resolvePinTarget(expectedVersion);
|
|
291
|
+
if (!ver) return [];
|
|
292
|
+
return [
|
|
293
|
+
`npm i -g ${OPEN_SOURCE_AE_CLI_PACKAGE}@${ver}`,
|
|
294
|
+
`npx skills add ${AE_CLI_SKILLS_REPO}#v${ver} -g -y`
|
|
295
|
+
];
|
|
296
|
+
}
|
|
297
|
+
function formatUpgradeCommands(expectedVersion) {
|
|
298
|
+
const ver = expectedVersion.trim().replace(/^v/i, "");
|
|
299
|
+
if (!/^\d+\.\d+\.\d+(?:[-+].*)?$/.test(ver)) return [];
|
|
300
|
+
return [
|
|
301
|
+
`npm i -g ${OPEN_SOURCE_AE_CLI_PACKAGE}@${ver}`,
|
|
302
|
+
`npx skills add ${AE_CLI_SKILLS_REPO}#v${ver} -g -y`
|
|
303
|
+
];
|
|
304
|
+
}
|
|
305
|
+
function formatCompatNotice(verdict) {
|
|
306
|
+
if (verdict.kind === "ok") return void 0;
|
|
307
|
+
const pinTarget = resolvePinTarget(verdict.expected);
|
|
308
|
+
const pins = formatPinCommands(verdict.expected);
|
|
309
|
+
const pinBlock = pins.map((c) => ` ${c}`).join("\n");
|
|
310
|
+
const pinNote = pinTarget && pinTarget !== verdict.expected ? ` (historical match: public ${pinTarget} for cluster ${verdict.expected}; GitHub usually published later)` : void 0;
|
|
311
|
+
if (verdict.kind === "local_newer") {
|
|
312
|
+
if (pins.length > 0) {
|
|
313
|
+
return [
|
|
314
|
+
`[ae-cli] Host compat: local ${verdict.local} > environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
315
|
+
` Pin CLI + skills to the matched public release:`,
|
|
316
|
+
pinBlock,
|
|
317
|
+
...pinNote ? [pinNote] : [],
|
|
318
|
+
` Or update cluster components to the latest version.`
|
|
319
|
+
].join("\n");
|
|
320
|
+
}
|
|
321
|
+
return [
|
|
322
|
+
`[ae-cli] Host compat: local ${verdict.local} > environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
323
|
+
` No public GitHub/npm release on this line is \u2264 environment ${verdict.expected}.`,
|
|
324
|
+
` Update cluster components to the latest version to match your CLI.`
|
|
325
|
+
].join("\n");
|
|
326
|
+
}
|
|
327
|
+
if (verdict.kind === "local_older") {
|
|
328
|
+
const upgrades = formatUpgradeCommands(verdict.expected);
|
|
329
|
+
if (upgrades.length > 0) {
|
|
330
|
+
return [
|
|
331
|
+
`[ae-cli] Host compat: local ${verdict.local} < environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
332
|
+
` Upgrade CLI + skills to the environment version:`,
|
|
333
|
+
...upgrades.map((c) => ` ${c}`)
|
|
334
|
+
].join("\n");
|
|
335
|
+
}
|
|
336
|
+
return [
|
|
337
|
+
`[ae-cli] Host compat: local ${verdict.local} < environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
338
|
+
` No installable semver target for environment ${verdict.expected}.`,
|
|
339
|
+
` Ask the platform owner for the install package, or wait for a published build.`
|
|
340
|
+
].join("\n");
|
|
341
|
+
}
|
|
342
|
+
if (pins.length > 0) {
|
|
343
|
+
return [
|
|
344
|
+
`[ae-cli] Host compat: local ${verdict.local} line mismatches environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
345
|
+
` Switch to the matched public release (CLI + skills):`,
|
|
346
|
+
pinBlock,
|
|
347
|
+
...pinNote ? [pinNote] : [],
|
|
348
|
+
` Or update cluster components to the latest version to match your CLI line.`
|
|
349
|
+
].join("\n");
|
|
350
|
+
}
|
|
351
|
+
return [
|
|
352
|
+
`[ae-cli] Host compat: local ${verdict.local} line mismatches environment ${verdict.expected} (cluster ${verdict.line}).`,
|
|
353
|
+
` No public GitHub/npm release for this line; update cluster components to the latest version, or install a published build on the same line.`
|
|
354
|
+
].join("\n");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// src/core/compat-check.ts
|
|
358
|
+
var CHECK_INTERVAL_MS2 = 24 * 60 * 60 * 1e3;
|
|
359
|
+
var FETCH_TIMEOUT_MS2 = 3e3;
|
|
360
|
+
var CLI_CONFIG_PATH = "/v1/ta/cli/config";
|
|
361
|
+
function cacheFilePath() {
|
|
362
|
+
return path2.join(getConfigDir(), "compat-check.json");
|
|
363
|
+
}
|
|
364
|
+
function readStore() {
|
|
365
|
+
try {
|
|
366
|
+
const file = cacheFilePath();
|
|
367
|
+
if (!fs2.existsSync(file)) return { hosts: {} };
|
|
368
|
+
const raw = JSON.parse(fs2.readFileSync(file, "utf8"));
|
|
369
|
+
if (!raw || typeof raw !== "object" || !raw.hosts) return { hosts: {} };
|
|
370
|
+
return raw;
|
|
371
|
+
} catch {
|
|
372
|
+
return { hosts: {} };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function writeStore(store) {
|
|
376
|
+
try {
|
|
377
|
+
const dir = getConfigDir();
|
|
378
|
+
if (!fs2.existsSync(dir)) fs2.mkdirSync(dir, { recursive: true });
|
|
379
|
+
fs2.writeFileSync(cacheFilePath(), JSON.stringify(store, null, 2));
|
|
380
|
+
} catch {
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function hostKey(host) {
|
|
384
|
+
return normalizeUrl(host);
|
|
385
|
+
}
|
|
386
|
+
function isStale(entry) {
|
|
387
|
+
if (!entry?.lastFetchedAt) return true;
|
|
388
|
+
const age = Date.now() - new Date(entry.lastFetchedAt).getTime();
|
|
389
|
+
return age >= CHECK_INTERVAL_MS2;
|
|
390
|
+
}
|
|
391
|
+
function shouldNotify(entry) {
|
|
392
|
+
if (!entry?.lastNotifiedAt) return true;
|
|
393
|
+
const age = Date.now() - new Date(entry.lastNotifiedAt).getTime();
|
|
394
|
+
return age >= CHECK_INTERVAL_MS2;
|
|
395
|
+
}
|
|
396
|
+
function shouldSkipCompatCheck(argv = process.argv) {
|
|
397
|
+
if (process.env.AE_CLI_NO_COMPAT_CHECK === "1") return true;
|
|
398
|
+
if (isAeSandboxRuntime()) return true;
|
|
399
|
+
return shouldSkipUpdateCheck(argv);
|
|
400
|
+
}
|
|
401
|
+
async function fetchCliConfig(host, cliToken) {
|
|
402
|
+
const url = new URL(CLI_CONFIG_PATH, host.endsWith("/") ? host : `${host}/`);
|
|
403
|
+
url.searchParams.set("cli-token", cliToken);
|
|
404
|
+
const headers = { Accept: "application/json" };
|
|
405
|
+
try {
|
|
406
|
+
const accessToken = await getToken(host);
|
|
407
|
+
if (accessToken) {
|
|
408
|
+
headers.Authorization = `bearer ${accessToken}`;
|
|
409
|
+
}
|
|
410
|
+
} catch {
|
|
411
|
+
}
|
|
412
|
+
const controller = new AbortController();
|
|
413
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS2);
|
|
414
|
+
try {
|
|
415
|
+
const resp = await fetch(url.toString(), {
|
|
416
|
+
signal: controller.signal,
|
|
417
|
+
headers
|
|
418
|
+
});
|
|
419
|
+
if (!resp.ok) return null;
|
|
420
|
+
const body = await resp.json();
|
|
421
|
+
const data = body.data ?? body;
|
|
422
|
+
const versions = data.versions;
|
|
423
|
+
if (!versions) return null;
|
|
424
|
+
const clusterVersion = versions.clusterVersion ?? versions.cluster_version ?? null;
|
|
425
|
+
const aeCliVersion = versions.aeCliVersion ?? versions.ae_cli_version ?? null;
|
|
426
|
+
return {
|
|
427
|
+
clusterVersion: clusterVersion?.trim() || null,
|
|
428
|
+
aeCliVersion: aeCliVersion?.trim() || null
|
|
429
|
+
};
|
|
430
|
+
} catch {
|
|
431
|
+
return null;
|
|
432
|
+
} finally {
|
|
433
|
+
clearTimeout(timer);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function printNotice(text) {
|
|
437
|
+
process.stderr.write(`${text}
|
|
438
|
+
`);
|
|
439
|
+
}
|
|
440
|
+
function isNonInteractiveOutput() {
|
|
441
|
+
return !process.stdout.isTTY || !process.stderr.isTTY;
|
|
442
|
+
}
|
|
443
|
+
var pendingHostCompatNotice;
|
|
444
|
+
function getPendingHostCompatNotice() {
|
|
445
|
+
return pendingHostCompatNotice;
|
|
446
|
+
}
|
|
447
|
+
function getCachedCompatForHost(host) {
|
|
448
|
+
return readStore().hosts[hostKey(host)];
|
|
449
|
+
}
|
|
450
|
+
function formatCapabilityMissCompatHint(host) {
|
|
451
|
+
if (shouldSkipCompatCheck()) return void 0;
|
|
452
|
+
const active = host || getActiveHost();
|
|
453
|
+
if (!active) {
|
|
454
|
+
return "This capability may be missing on the current private cluster. Update cluster components to the latest version, or pin this machine to the environment ae-cli version.";
|
|
455
|
+
}
|
|
456
|
+
const cached = getCachedCompatForHost(active);
|
|
457
|
+
if (cached?.expectedVersion) {
|
|
458
|
+
const pins = formatPinCommands(cached.expectedVersion);
|
|
459
|
+
if (pins.length > 0) {
|
|
460
|
+
return [
|
|
461
|
+
`Host may be older than this CLI (environment ae-cli ${cached.expectedVersion}, cluster ${cached.clusterVersion || "?"}).`,
|
|
462
|
+
`Update cluster components to the latest version, or pin locally:`,
|
|
463
|
+
...pins.map((c) => ` ${c}`)
|
|
464
|
+
].join("\n");
|
|
465
|
+
}
|
|
466
|
+
return [
|
|
467
|
+
`Host may be older than this CLI (environment ae-cli ${cached.expectedVersion}, cluster ${cached.clusterVersion || "?"}).`,
|
|
468
|
+
`No public GitHub/npm release matches that environment version; update cluster components to the latest version instead of pinning.`
|
|
469
|
+
].join("\n");
|
|
470
|
+
}
|
|
471
|
+
return "This capability may be missing on the current private cluster. Update cluster components to the latest version, or pin this machine CLI + skills to the environment version (see ae-cli host compat notices after auth login).";
|
|
472
|
+
}
|
|
473
|
+
async function refreshAndMaybeNotify(host, pkg) {
|
|
474
|
+
const token = peekCliToken(host);
|
|
475
|
+
if (!token) return;
|
|
476
|
+
const store = readStore();
|
|
477
|
+
const key = hostKey(host);
|
|
478
|
+
const existing = store.hosts[key];
|
|
479
|
+
let expected = existing?.expectedVersion;
|
|
480
|
+
let cluster = existing?.clusterVersion;
|
|
481
|
+
let fetchedAt = existing?.lastFetchedAt;
|
|
482
|
+
if (isStale(existing)) {
|
|
483
|
+
const remote = await fetchCliConfig(host, token);
|
|
484
|
+
if (!remote?.aeCliVersion) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
expected = remote.aeCliVersion;
|
|
488
|
+
cluster = remote.clusterVersion ?? "";
|
|
489
|
+
fetchedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
490
|
+
store.hosts[key] = {
|
|
491
|
+
host: key,
|
|
492
|
+
localVersion: pkg.version,
|
|
493
|
+
expectedVersion: expected,
|
|
494
|
+
clusterVersion: cluster,
|
|
495
|
+
lastFetchedAt: fetchedAt,
|
|
496
|
+
lastNotifiedAt: existing?.lastNotifiedAt
|
|
497
|
+
};
|
|
498
|
+
writeStore(store);
|
|
499
|
+
}
|
|
500
|
+
if (!expected) return;
|
|
501
|
+
const verdict = evaluateCompat(pkg.version, expected, cluster);
|
|
502
|
+
const notice = formatCompatNotice(verdict);
|
|
503
|
+
if (!notice) {
|
|
504
|
+
pendingHostCompatNotice = void 0;
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
pendingHostCompatNotice = notice;
|
|
508
|
+
const entry = store.hosts[key] ?? {
|
|
509
|
+
host: key,
|
|
510
|
+
localVersion: pkg.version,
|
|
511
|
+
expectedVersion: expected,
|
|
512
|
+
clusterVersion: cluster || "",
|
|
513
|
+
lastFetchedAt: fetchedAt || (/* @__PURE__ */ new Date()).toISOString()
|
|
514
|
+
};
|
|
515
|
+
const dueForHumanTip = shouldNotify(entry);
|
|
516
|
+
if (!dueForHumanTip && !isNonInteractiveOutput()) return;
|
|
517
|
+
printNotice(notice);
|
|
518
|
+
if (dueForHumanTip) {
|
|
519
|
+
entry.lastNotifiedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
520
|
+
}
|
|
521
|
+
entry.localVersion = pkg.version;
|
|
522
|
+
entry.expectedVersion = expected;
|
|
523
|
+
entry.clusterVersion = cluster || entry.clusterVersion;
|
|
524
|
+
store.hosts[key] = entry;
|
|
525
|
+
writeStore(store);
|
|
526
|
+
}
|
|
527
|
+
async function runHostCompatCheck(pkg, hostOverride) {
|
|
528
|
+
if (shouldSkipCompatCheck()) return;
|
|
529
|
+
const host = hostOverride || getActiveHost();
|
|
530
|
+
if (!host) return;
|
|
531
|
+
try {
|
|
532
|
+
await refreshAndMaybeNotify(host, pkg);
|
|
533
|
+
} catch {
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// src/framework/output.ts
|
|
538
|
+
import Table from "cli-table3";
|
|
539
|
+
import { JqError, json as jqJson } from "jq-wasm";
|
|
540
|
+
var KNOWN_ARRAY_FIELDS = [
|
|
541
|
+
"items",
|
|
542
|
+
"events",
|
|
543
|
+
"reports",
|
|
544
|
+
"dashboards",
|
|
545
|
+
"tags",
|
|
546
|
+
"clusters",
|
|
547
|
+
"flows",
|
|
548
|
+
"tasks",
|
|
549
|
+
"channels",
|
|
550
|
+
"nodes",
|
|
551
|
+
"members",
|
|
552
|
+
"records",
|
|
553
|
+
"entities",
|
|
554
|
+
"metrics",
|
|
555
|
+
"tables",
|
|
556
|
+
"columns",
|
|
557
|
+
"properties"
|
|
558
|
+
];
|
|
559
|
+
var OUTPUT_METADATA = /* @__PURE__ */ Symbol("ae-cli-output-metadata");
|
|
560
|
+
function withOutputMetadata(data, meta) {
|
|
561
|
+
if (!meta || Object.keys(meta).length === 0) return data;
|
|
562
|
+
return {
|
|
563
|
+
[OUTPUT_METADATA]: true,
|
|
564
|
+
data,
|
|
565
|
+
meta
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
function isOutputWithMetadata(value) {
|
|
569
|
+
return Boolean(value?.[OUTPUT_METADATA]);
|
|
570
|
+
}
|
|
571
|
+
function findArrayField(data) {
|
|
572
|
+
if (Array.isArray(data)) return data;
|
|
573
|
+
if (typeof data !== "object" || data === null) return null;
|
|
574
|
+
for (const key of KNOWN_ARRAY_FIELDS) {
|
|
575
|
+
if (Array.isArray(data[key])) return data[key];
|
|
576
|
+
}
|
|
577
|
+
for (const key of Object.keys(data)) {
|
|
578
|
+
if (Array.isArray(data[key])) return data[key];
|
|
579
|
+
}
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
function formatTable(data) {
|
|
583
|
+
const rows = findArrayField(data);
|
|
584
|
+
if (!rows || rows.length === 0) {
|
|
585
|
+
return JSON.stringify(data, null, 2);
|
|
586
|
+
}
|
|
587
|
+
const allKeys = /* @__PURE__ */ new Set();
|
|
588
|
+
for (const row of rows) {
|
|
589
|
+
if (typeof row === "object" && row !== null) {
|
|
590
|
+
Object.keys(row).forEach((k) => allKeys.add(k));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
const keys = Array.from(allKeys);
|
|
594
|
+
if (keys.length === 0) return JSON.stringify(rows, null, 2);
|
|
595
|
+
const table = new Table({ head: keys, wordWrap: true });
|
|
596
|
+
for (const row of rows) {
|
|
597
|
+
table.push(keys.map((k) => {
|
|
598
|
+
const v = row?.[k];
|
|
599
|
+
if (v === void 0 || v === null) return "";
|
|
600
|
+
if (typeof v === "object") return JSON.stringify(v);
|
|
601
|
+
return String(v);
|
|
602
|
+
}));
|
|
603
|
+
}
|
|
604
|
+
return table.toString();
|
|
605
|
+
}
|
|
606
|
+
async function applyJq(data, expr) {
|
|
607
|
+
const trimmed = expr.trim();
|
|
608
|
+
if (!trimmed) return data;
|
|
609
|
+
let results;
|
|
610
|
+
try {
|
|
611
|
+
results = await jqJson(data, trimmed);
|
|
612
|
+
} catch (err) {
|
|
613
|
+
const message = err instanceof JqError ? err.message : err?.message || String(err);
|
|
614
|
+
const error = new Error(`Invalid --jq expression: ${message}`);
|
|
615
|
+
error.type = "validation";
|
|
616
|
+
error.hint = "Use standard jq syntax, e.g. .status or {status,pendingQuestion}";
|
|
617
|
+
throw error;
|
|
618
|
+
}
|
|
619
|
+
if (results.length === 0) return null;
|
|
620
|
+
if (results.length === 1) return results[0];
|
|
621
|
+
return results;
|
|
622
|
+
}
|
|
623
|
+
async function formatOutput(data, format, jqExpr) {
|
|
624
|
+
const outputData = isOutputWithMetadata(data) ? data.data : data;
|
|
625
|
+
const meta = isOutputWithMetadata(data) ? data.meta : void 0;
|
|
626
|
+
let processed = outputData;
|
|
627
|
+
if (jqExpr) {
|
|
628
|
+
processed = await applyJq(outputData, jqExpr);
|
|
629
|
+
}
|
|
630
|
+
if (format === "table") {
|
|
631
|
+
return formatTable(processed);
|
|
632
|
+
}
|
|
633
|
+
const hostCompat = getPendingHostCompatNotice();
|
|
634
|
+
const envelope = {
|
|
635
|
+
ok: true,
|
|
636
|
+
data: processed,
|
|
637
|
+
...meta ? { meta } : {},
|
|
638
|
+
// Soft tip lives only under _notice (not mirrored into meta) to avoid duplicate fields.
|
|
639
|
+
...hostCompat ? { _notice: { host_compat: hostCompat } } : {}
|
|
640
|
+
};
|
|
641
|
+
return JSON.stringify(envelope, null, 2);
|
|
642
|
+
}
|
|
643
|
+
function formatError(type, message, hint, code, meta) {
|
|
644
|
+
const envelope = {
|
|
645
|
+
ok: false,
|
|
646
|
+
error: { type, message, hint, code },
|
|
647
|
+
...meta && Object.keys(meta).length > 0 ? { meta } : {}
|
|
648
|
+
};
|
|
649
|
+
return JSON.stringify(envelope, null, 2);
|
|
650
|
+
}
|
|
651
|
+
function printError(type, message, hint, code, meta, options = {}) {
|
|
652
|
+
const formatted = formatError(type, message, hint, code, meta);
|
|
653
|
+
process.stderr.write(formatted + "\n");
|
|
654
|
+
if (options.log !== false) {
|
|
655
|
+
logger.error(`[${type}] ${message}${hint ? " | " + hint : ""}`);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
async function printOutput(data, format, jqExpr) {
|
|
659
|
+
process.stdout.write(await formatOutput(data, format, jqExpr) + "\n");
|
|
660
|
+
const hostCompat = getPendingHostCompatNotice();
|
|
661
|
+
if (hostCompat && (!process.stdout.isTTY || !process.stderr.isTTY)) {
|
|
662
|
+
process.stderr.write(`${hostCompat}
|
|
663
|
+
`);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
export {
|
|
668
|
+
notifyIfUpdateAvailable,
|
|
669
|
+
formatCapabilityMissCompatHint,
|
|
670
|
+
runHostCompatCheck,
|
|
671
|
+
withOutputMetadata,
|
|
672
|
+
printError,
|
|
673
|
+
printOutput
|
|
674
|
+
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getActiveHost,
|
|
3
3
|
getConfigDir,
|
|
4
|
-
logger,
|
|
5
4
|
normalizeUrl,
|
|
6
5
|
safeJsonParse
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-V6FR6WTW.js";
|
|
7
|
+
import {
|
|
8
|
+
logger
|
|
9
|
+
} from "./chunk-LYVNONC4.js";
|
|
8
10
|
|
|
9
11
|
// src/core/secure-store.ts
|
|
10
12
|
import crypto from "crypto";
|