@thinkingai/ae-cli 6.1.19 → 6.1.21

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.
Files changed (370) hide show
  1. package/README.md +96 -38
  2. package/README.zh.md +96 -38
  3. package/dist/{auth-QPEVVBKT.js → auth-XZNXFRJS.js} +236 -127
  4. package/dist/{capability-ASI62I4A.js → capability-FYTU3X6L.js} +80 -37
  5. package/dist/{chunk-QL6R6TSK.js → chunk-4NRCTUZJ.js} +27045 -477
  6. package/dist/{chunk-JYMGHGCE.js → chunk-57RRFUEZ.js} +42 -15
  7. package/dist/chunk-6ZIQV5GW.js +26 -0
  8. package/dist/{chunk-KZ6ZHF5J.js → chunk-7FTTULED.js} +14 -14
  9. package/dist/chunk-7XGFSUOM.js +623 -0
  10. package/dist/chunk-CCS66K4K.js +155 -0
  11. package/dist/{chunk-B5HMQAOM.js → chunk-DVMLWQD4.js} +8 -186
  12. package/dist/{chunk-KEWVSO64.js → chunk-DX5CDO34.js} +28 -18
  13. package/dist/chunk-EQ255HKO.js +38248 -0
  14. package/dist/{chunk-6QK7SYYY.js → chunk-HBGADCKA.js} +29 -37
  15. package/dist/{chunk-GJXRF7Y6.js → chunk-HFGZGYCG.js} +54 -81
  16. package/dist/chunk-JOCDD4ON.js +15 -0
  17. package/dist/{chunk-TKHSULJT.js → chunk-KPQY44JQ.js} +6 -0
  18. package/dist/{chunk-FR2EDAQM.js → chunk-MAPZ7VB6.js} +90 -2
  19. package/dist/chunk-V2NUHPXF.js +196 -0
  20. package/dist/{chunk-S5PONFBM.js → chunk-VYXXOKYS.js} +9 -9
  21. package/dist/{community-report-client-6OL6GBQW.js → community-report-client-CU22W53K.js} +2 -4
  22. package/dist/{config-XNMACCKX.js → config-XO3LI3SA.js} +8 -9
  23. package/dist/context-IFJI3LIT.js +46 -0
  24. package/dist/{data-integration-4NZGZ45E.js → data-integration-HNGUKFIC.js} +55 -44
  25. package/dist/index.js +122 -112
  26. package/dist/{local-data-upload-client-EFHDLXFG.js → local-data-upload-client-GTRIT64F.js} +4 -5
  27. package/dist/{memory-HBJQ2GC5.js → memory-QGPSNCQS.js} +4 -6
  28. package/dist/{metadata-62EWBEIG.js → metadata-DI5BMYFU.js} +8 -10
  29. package/dist/{model-BHLJ2QMT.js → model-RNPQXIBI.js} +4 -6
  30. package/dist/{personal-semantic-preference-JBVMAI7L.js → personal-semantic-preference-5C3WUXFI.js} +11 -10
  31. package/dist/{project-semantic-BQ4MPUS5.js → project-semantic-3LF6Q6JZ.js} +29 -25
  32. package/dist/{sync-MUWPRM5I.js → sync-O45NXEQY.js} +7 -8
  33. package/dist/{te-agent-WQZTMEK4.js → te-agent-K5MSPNHJ.js} +393 -90
  34. package/dist/{te-analysis-MNCG65LU.js → te-analysis-AISWCOOZ.js} +1175 -377
  35. package/dist/{te-community-BNE6KREL.js → te-community-4OYU3BDA.js} +10 -33
  36. package/dist/{te-dataops-TXLKM2W6.js → te-dataops-NFIPB6FX.js} +19 -20
  37. package/dist/{te-engage-TPKLRVTL.js → te-engage-BAM3GBFX.js} +13 -15
  38. package/dist/{te-experiment-6BYKTCY7.js → te-experiment-GUTZXZ5Z.js} +132 -16
  39. package/dist/te-kb-3TS73NO6.js +1992 -0
  40. package/dist/{te-system-44LZJDTQ.js → te-system-STMHLS5J.js} +12 -9
  41. package/dist/{te-team-XMP47YXE.js → te-team-3I5AOX3N.js} +6 -8
  42. package/dist/{update-UODFOZ4P.js → update-RZXLPCRH.js} +7 -8
  43. package/package.json +29 -19
  44. package/skills/ae-agent/SKILL.md +30 -13
  45. package/skills/ae-agent/references/agent-distribution.md +94 -0
  46. package/skills/ae-agent/references/approval-request.md +4 -0
  47. package/skills/ae-agent/references/command_index.md +9 -2
  48. package/skills/ae-agent/references/create-automation.md +20 -2
  49. package/skills/ae-agent/references/get-agent-context.md +70 -0
  50. package/skills/ae-agent/references/list-automations.md +18 -3
  51. package/skills/ae-agent/references/list-mcp-credentials.md +1 -1
  52. package/skills/ae-agent/references/mcp-token.md +3 -3
  53. package/skills/ae-agent/references/set-mcp-credential.md +0 -1
  54. package/skills/ae-agent/references/update-automation.md +18 -0
  55. package/skills/ae-analysis/SKILL.md +101 -79
  56. package/skills/ae-analysis/references/adhoc_export.md +11 -18
  57. package/skills/ae-analysis/references/adhoc_run.md +17 -7
  58. package/skills/ae-analysis/references/agent_review_detail.md +11 -0
  59. package/skills/ae-analysis/references/agent_review_evidence.md +46 -0
  60. package/skills/ae-analysis/references/agent_review_list.md +9 -0
  61. package/skills/ae-analysis/references/agent_review_preflight.md +96 -0
  62. package/skills/ae-analysis/references/agent_review_priorities_comparisons.md +76 -0
  63. package/skills/ae-analysis/references/agent_review_records.md +9 -0
  64. package/skills/ae-analysis/references/agent_review_retry.md +12 -0
  65. package/skills/ae-analysis/references/agent_review_review.md +16 -0
  66. package/skills/ae-analysis/references/agent_review_submit_to_page.md +184 -0
  67. package/skills/ae-analysis/references/ai_models/attribution.md +29 -0
  68. package/skills/ae-analysis/references/ai_models/distribution.md +40 -0
  69. package/skills/ae-analysis/references/ai_models/event.md +108 -0
  70. package/skills/ae-analysis/references/ai_models/funnel.md +46 -0
  71. package/skills/ae-analysis/references/ai_models/heat_map.md +26 -0
  72. package/skills/ae-analysis/references/ai_models/interval.md +20 -0
  73. package/skills/ae-analysis/references/ai_models/path.md +38 -0
  74. package/skills/ae-analysis/references/ai_models/prop_analysis.md +39 -0
  75. package/skills/ae-analysis/references/ai_models/rank_list.md +25 -0
  76. package/skills/ae-analysis/references/ai_models/retention.md +70 -0
  77. package/skills/ae-analysis/references/ai_models/revenue.md +28 -0
  78. package/skills/ae-analysis/references/ai_models/sql.md +74 -0
  79. package/skills/ae-analysis/references/ai_models/tag.md +19 -0
  80. package/skills/ae-analysis/references/ai_models.md +32 -453
  81. package/skills/ae-analysis/references/alert_create.md +7 -7
  82. package/skills/ae-analysis/references/alert_delete.md +4 -6
  83. package/skills/ae-analysis/references/alert_detail_list.md +7 -9
  84. package/skills/ae-analysis/references/alert_get.md +5 -7
  85. package/skills/ae-analysis/references/alert_job_list.md +4 -6
  86. package/skills/ae-analysis/references/alert_list.md +6 -8
  87. package/skills/ae-analysis/references/alert_notice_config_list.md +4 -6
  88. package/skills/ae-analysis/references/alert_start.md +5 -7
  89. package/skills/ae-analysis/references/alert_stop.md +5 -7
  90. package/skills/ae-analysis/references/alert_update.md +8 -8
  91. package/skills/ae-analysis/references/analysis_data_export.md +72 -0
  92. package/skills/ae-analysis/references/analysis_data_retrieval.md +32 -196
  93. package/skills/ae-analysis/references/analysis_gateway_assets.md +23 -180
  94. package/skills/ae-analysis/references/analysis_interpretation.md +37 -17
  95. package/skills/ae-analysis/references/asset_abnormal_get.md +0 -1
  96. package/skills/ae-analysis/references/asset_abnormal_list.md +0 -1
  97. package/skills/ae-analysis/references/asset_authentication_export.md +4 -0
  98. package/skills/ae-analysis/references/asset_authentication_list.md +7 -1
  99. package/skills/ae-analysis/references/asset_authentication_update.md +5 -1
  100. package/skills/ae-analysis/references/asset_batch_dashboard_schedule_freeze.md +8 -6
  101. package/skills/ae-analysis/references/asset_batch_delete.md +6 -6
  102. package/skills/ae-analysis/references/asset_batch_disable_auto_backup.md +4 -5
  103. package/skills/ae-analysis/references/asset_batch_disable_auto_update.md +5 -6
  104. package/skills/ae-analysis/references/asset_batch_handover.md +4 -5
  105. package/skills/ae-analysis/references/asset_batch_info_export.md +4 -5
  106. package/skills/ae-analysis/references/asset_batch_sql_export.md +5 -6
  107. package/skills/ae-analysis/references/asset_dependency_list.md +4 -5
  108. package/skills/ae-analysis/references/asset_export.md +4 -5
  109. package/skills/ae-analysis/references/asset_impact_list.md +5 -9
  110. package/skills/ae-analysis/references/asset_lineage_get.md +5 -6
  111. package/skills/ae-analysis/references/asset_list.md +4 -5
  112. package/skills/ae-analysis/references/asset_query_history_list.md +4 -8
  113. package/skills/ae-analysis/references/asset_recent_list.md +0 -1
  114. package/skills/ae-analysis/references/asset_search.md +12 -9
  115. package/skills/ae-analysis/references/asset_url_get.md +3 -4
  116. package/skills/ae-analysis/references/bi_panel_copy.md +2 -2
  117. package/skills/ae-analysis/references/bi_panel_page_data_export.md +4 -12
  118. package/skills/ae-analysis/references/bi_panel_page_data_run.md +2 -0
  119. package/skills/ae-analysis/references/catalog_export.md +4 -17
  120. package/skills/ae-analysis/references/catalog_list.md +4 -4
  121. package/skills/ae-analysis/references/check_delete.md +5 -7
  122. package/skills/ae-analysis/references/check_export.md +11 -11
  123. package/skills/ae-analysis/references/check_get.md +8 -10
  124. package/skills/ae-analysis/references/check_list.md +4 -6
  125. package/skills/ae-analysis/references/check_retry.md +8 -10
  126. package/skills/ae-analysis/references/check_run.md +2 -4
  127. package/skills/ae-analysis/references/command_index.md +46 -28
  128. package/skills/ae-analysis/references/cross_source_config.md +84 -0
  129. package/skills/ae-analysis/references/dashboard_report_data_export.md +5 -13
  130. package/skills/ae-analysis/references/dashboard_report_data_run.md +1 -1
  131. package/skills/ae-analysis/references/dashboard_update.md +15 -4
  132. package/skills/ae-analysis/references/datatable_columns_get.md +0 -1
  133. package/skills/ae-analysis/references/datatable_influence_list.md +0 -1
  134. package/skills/ae-analysis/references/datatable_version_get.md +0 -1
  135. package/skills/ae-analysis/references/datatable_version_list.md +0 -1
  136. package/skills/ae-analysis/references/debug_device_add.md +1 -2
  137. package/skills/ae-analysis/references/drilldown_entities_export.md +3 -3
  138. package/skills/ae-analysis/references/drilldown_events_export.md +3 -2
  139. package/skills/ae-analysis/references/drilldown_user_events_export.md +2 -2
  140. package/skills/ae-analysis/references/entity_detail_export.md +3 -2
  141. package/skills/ae-analysis/references/entity_detail_run.md +1 -0
  142. package/skills/ae-analysis/references/event_blacklist_add.md +5 -7
  143. package/skills/ae-analysis/references/event_blacklist_list.md +4 -6
  144. package/skills/ae-analysis/references/event_blacklist_update.md +6 -8
  145. package/skills/ae-analysis/references/event_changelog_list.md +0 -1
  146. package/skills/ae-analysis/references/event_create.md +0 -1
  147. package/skills/ae-analysis/references/event_detail_export.md +3 -2
  148. package/skills/ae-analysis/references/event_detail_run.md +1 -0
  149. package/skills/ae-analysis/references/event_export.md +0 -1
  150. package/skills/ae-analysis/references/event_get.md +0 -1
  151. package/skills/ae-analysis/references/event_hide_update.md +0 -1
  152. package/skills/ae-analysis/references/event_influence_list.md +0 -1
  153. package/skills/ae-analysis/references/event_list.md +0 -1
  154. package/skills/ae-analysis/references/event_property_bundle_export.md +5 -14
  155. package/skills/ae-analysis/references/event_property_bundle_import.md +2 -6
  156. package/skills/ae-analysis/references/event_relation_update.md +0 -1
  157. package/skills/ae-analysis/references/event_update.md +0 -1
  158. package/skills/ae-analysis/references/exchange_config_update.md +0 -1
  159. package/skills/ae-analysis/references/exchange_rate_refresh.md +0 -1
  160. package/skills/ae-analysis/references/exchange_rule_list.md +0 -1
  161. package/skills/ae-analysis/references/exchange_rule_update.md +0 -1
  162. package/skills/ae-analysis/references/exchange_rule_validate.md +0 -1
  163. package/skills/ae-analysis/references/governance_recommendation_decisions.md +23 -0
  164. package/skills/ae-analysis/references/governance_recommendation_export.md +108 -0
  165. package/skills/ae-analysis/references/governance_recommendation_submit.md +41 -0
  166. package/skills/ae-analysis/references/history_tag_data_drilldown_export.md +4 -4
  167. package/skills/ae-analysis/references/history_tag_data_export.md +3 -3
  168. package/skills/ae-analysis/references/ingest_error_list.md +7 -9
  169. package/skills/ae-analysis/references/ingest_summary.md +6 -8
  170. package/skills/ae-analysis/references/live_data_export.md +10 -10
  171. package/skills/ae-analysis/references/live_data_list.md +7 -9
  172. package/skills/ae-analysis/references/metadata_resolution.md +78 -0
  173. package/skills/ae-analysis/references/metric_export.md +0 -1
  174. package/skills/ae-analysis/references/metric_get.md +0 -1
  175. package/skills/ae-analysis/references/metric_list.md +4 -5
  176. package/skills/ae-analysis/references/metric_update.md +0 -1
  177. package/skills/ae-analysis/references/operation_record_export.md +4 -5
  178. package/skills/ae-analysis/references/operation_record_list.md +4 -5
  179. package/skills/ae-analysis/references/personal_semantic_preference_list.md +18 -1
  180. package/skills/ae-analysis/references/plan_change_log_export.md +10 -10
  181. package/skills/ae-analysis/references/plan_change_log_list.md +4 -6
  182. package/skills/ae-analysis/references/plan_delete_items.md +2 -4
  183. package/skills/ae-analysis/references/plan_export.md +9 -9
  184. package/skills/ae-analysis/references/plan_generate.md +2 -4
  185. package/skills/ae-analysis/references/plan_get.md +4 -6
  186. package/skills/ae-analysis/references/plan_import_excel.md +6 -8
  187. package/skills/ae-analysis/references/plan_save_items.md +2 -4
  188. package/skills/ae-analysis/references/plan_sync_from_meta.md +4 -6
  189. package/skills/ae-analysis/references/project_access_detail_get.md +0 -1
  190. package/skills/ae-analysis/references/project_data_power_get.md +0 -1
  191. package/skills/ae-analysis/references/project_data_power_list.md +0 -1
  192. package/skills/ae-analysis/references/project_data_power_upsert.md +0 -1
  193. package/skills/ae-analysis/references/project_entity_create.md +0 -1
  194. package/skills/ae-analysis/references/project_entity_event_list.md +0 -1
  195. package/skills/ae-analysis/references/project_entity_get.md +0 -1
  196. package/skills/ae-analysis/references/project_entity_list.md +0 -1
  197. package/skills/ae-analysis/references/project_entity_update.md +0 -1
  198. package/skills/ae-analysis/references/project_function_list.md +0 -1
  199. package/skills/ae-analysis/references/project_info_get.md +0 -1
  200. package/skills/ae-analysis/references/project_info_list.md +0 -1
  201. package/skills/ae-analysis/references/project_info_update.md +0 -1
  202. package/skills/ae-analysis/references/project_mark_time_create.md +0 -1
  203. package/skills/ae-analysis/references/project_mark_time_list.md +0 -1
  204. package/skills/ae-analysis/references/project_mark_time_update.md +0 -1
  205. package/skills/ae-analysis/references/project_member_add.md +6 -5
  206. package/skills/ae-analysis/references/project_member_batch_update.md +0 -1
  207. package/skills/ae-analysis/references/project_member_candidate_list.md +4 -3
  208. package/skills/ae-analysis/references/project_member_handover_run.md +2 -3
  209. package/skills/ae-analysis/references/project_member_list.md +0 -1
  210. package/skills/ae-analysis/references/project_member_receiver_list.md +0 -1
  211. package/skills/ae-analysis/references/project_member_update.md +0 -1
  212. package/skills/ae-analysis/references/project_owner_update.md +0 -1
  213. package/skills/ae-analysis/references/project_permission_binding_list.md +0 -1
  214. package/skills/ae-analysis/references/project_role_function_list.md +0 -1
  215. package/skills/ae-analysis/references/project_role_get.md +0 -1
  216. package/skills/ae-analysis/references/project_role_list.md +0 -1
  217. package/skills/ae-analysis/references/project_role_upsert.md +32 -2
  218. package/skills/ae-analysis/references/project_role_user_list.md +0 -1
  219. package/skills/ae-analysis/references/project_semantic_knowledge_wiki.md +214 -0
  220. package/skills/ae-analysis/references/project_semantic_knowledge_wiki_plan_schema.md +93 -0
  221. package/skills/ae-analysis/references/project_timezone_get.md +0 -1
  222. package/skills/ae-analysis/references/project_timezone_overview.md +0 -1
  223. package/skills/ae-analysis/references/project_timezone_update.md +0 -1
  224. package/skills/ae-analysis/references/project_user_id_items_update.md +0 -1
  225. package/skills/ae-analysis/references/property_changelog_list.md +0 -1
  226. package/skills/ae-analysis/references/property_create.md +0 -1
  227. package/skills/ae-analysis/references/property_export.md +0 -1
  228. package/skills/ae-analysis/references/property_get.md +0 -1
  229. package/skills/ae-analysis/references/property_hide_update.md +0 -1
  230. package/skills/ae-analysis/references/property_influence_list.md +0 -1
  231. package/skills/ae-analysis/references/property_list.md +3 -4
  232. package/skills/ae-analysis/references/property_related_events.md +0 -1
  233. package/skills/ae-analysis/references/property_relation_update.md +0 -1
  234. package/skills/ae-analysis/references/property_update.md +0 -1
  235. package/skills/ae-analysis/references/report_create.md +4 -2
  236. package/skills/ae-analysis/references/report_data_export.md +11 -9
  237. package/skills/ae-analysis/references/report_data_run.md +14 -7
  238. package/skills/ae-analysis/references/report_get.md +5 -3
  239. package/skills/ae-analysis/references/report_list.md +2 -0
  240. package/skills/ae-analysis/references/report_update.md +5 -3
  241. package/skills/ae-analysis/references/rule_create.md +5 -6
  242. package/skills/ae-analysis/references/rule_delete.md +5 -5
  243. package/skills/ae-analysis/references/rule_list.md +3 -4
  244. package/skills/ae-analysis/references/rule_schema.md +3 -4
  245. package/skills/ae-analysis/references/rule_update.md +5 -6
  246. package/skills/ae-analysis/references/sdk_sample_generate.md +2 -4
  247. package/skills/ae-analysis/references/sql_table_columns.md +1 -1
  248. package/skills/ae-analysis/references/super_metadata_batch_create.md +1 -1
  249. package/skills/ae-analysis/references/super_metadata_batch_edit.md +1 -1
  250. package/skills/ae-analysis/references/system_member_add.md +1 -2
  251. package/skills/ae-analysis/references/system_member_status_update.md +1 -1
  252. package/skills/ae-analysis/references/system_ops_alert_contact_list.md +1 -1
  253. package/skills/ae-analysis/references/system_ops_alert_contact_test.md +0 -1
  254. package/skills/ae-analysis/references/system_query_monitor_overview.md +3 -3
  255. package/skills/ae-analysis/references/system_query_task_export.md +4 -14
  256. package/skills/ae-analysis/references/system_query_task_get.md +1 -1
  257. package/skills/ae-analysis/references/system_query_task_list.md +5 -6
  258. package/skills/ae-analysis/references/system_receiver_address_upsert.md +3 -3
  259. package/skills/ae-analysis/references/system_receiver_detection_get.md +1 -1
  260. package/skills/ae-analysis/references/system_third_party_login_disable.md +1 -1
  261. package/skills/ae-analysis/references/system_usage_trend_export.md +3 -12
  262. package/skills/ae-analysis/references/user_cluster_list.md +1 -1
  263. package/skills/ae-analysis/references/user_cluster_member_export.md +4 -4
  264. package/skills/ae-analysis/references/user_tag_create.md +23 -1
  265. package/skills/ae-analysis/references/user_tag_list.md +1 -1
  266. package/skills/ae-analysis/references/user_tag_member_export.md +4 -4
  267. package/skills/ae-analysis/references/user_tag_models.md +9 -1
  268. package/skills/ae-analysis/references/user_tag_update.md +14 -2
  269. package/skills/ae-analysis/references/virtual_event_create.md +10 -5
  270. package/skills/ae-analysis/references/virtual_event_get.md +0 -1
  271. package/skills/ae-analysis/references/virtual_property_create.md +0 -1
  272. package/skills/ae-analysis/references/virtual_property_sql_rule_update.md +0 -1
  273. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/build-project-semantic-wiki.mjs +1054 -0
  274. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/company-kb.mjs +112 -0
  275. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/default-compile-rules.md +30 -0
  276. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/generate-build-ir.mjs +2735 -0
  277. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/package-wiki-source-zip.mjs +376 -0
  278. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/plan-kb-source-sync.mjs +264 -0
  279. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/precompiled-source.mjs +49 -0
  280. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/upload-kb-sources-concurrently.mjs +200 -0
  281. package/skills/ae-analysis/scripts/read_results.py +197 -0
  282. package/skills/ae-analysis-global/SKILL.md +1 -1
  283. package/skills/ae-capability/SKILL.md +1 -1
  284. package/skills/ae-community/SKILL.md +1 -1
  285. package/skills/ae-current-context/SKILL.md +53 -0
  286. package/skills/ae-data-integration/SKILL.md +6 -4
  287. package/skills/ae-data-integration/references/dimension-routing.md +36 -0
  288. package/skills/ae-data-integration/references/lark-bitable-source.md +288 -0
  289. package/skills/ae-data-integration/references/lark-sheet-source.md +130 -0
  290. package/skills/ae-data-integration/references/local-analysis.md +2 -0
  291. package/skills/ae-data-integration/references/manual-export-source.md +83 -0
  292. package/skills/ae-data-integration/references/reuse.md +2 -0
  293. package/skills/ae-data-integration/references/sink-upload.md +32 -0
  294. package/skills/ae-data-integration/references/source-inspect.md +1 -1
  295. package/skills/ae-data-integration/references/tracking-plan.md +5 -2
  296. package/skills/ae-data-integration/references/transform.md +1 -1
  297. package/skills/ae-data-integration/references/ue-mapping.md +7 -4
  298. package/skills/ae-data-integration/references/ue-routing.md +17 -1
  299. package/skills/ae-data-integration-helper/SKILL.md +5 -5
  300. package/skills/ae-data-integration-helper/references/android_sdk_faq.md +3 -3
  301. package/skills/ae-data-integration-helper/references/c_sdk_faq.md +3 -3
  302. package/skills/ae-data-integration-helper/references/cocoscreator_sdk_faq.md +1 -1
  303. package/skills/ae-data-integration-helper/references/cpp_server_sdk_faq.md +3 -3
  304. package/skills/ae-data-integration-helper/references/ios_sdk_faq.md +1 -1
  305. package/skills/ae-data-integration-helper/references/java_sdk_faq.md +3 -3
  306. package/skills/ae-data-integration-helper/references/javascript_sdk_faq.md +1 -1
  307. package/skills/ae-data-integration-helper/references/logbus2_guide.md +1 -1
  308. package/skills/ae-data-integration-helper/references/logbus2_parser_plugin.md +2 -2
  309. package/skills/ae-data-integration-helper/references/minigame_sdk_faq.md +2 -2
  310. package/skills/ae-data-integration-helper/references/miniprogram_sdk_faq.md +1 -1
  311. package/skills/ae-data-integration-helper/references/python_sdk_faq.md +2 -2
  312. package/skills/ae-data-integration-helper/references/restful_api_notes.md +2 -2
  313. package/skills/ae-data-integration-helper/references/sdk_log_guide.md +3 -3
  314. package/skills/ae-data-integration-helper/references/sdk_usage_notes.md +11 -11
  315. package/skills/ae-data-integration-helper/references/unity_sdk_faq.md +1 -1
  316. package/skills/ae-dataops/SKILL.md +1 -1
  317. package/skills/ae-engage/SKILL.md +4 -3
  318. package/skills/ae-engage/references/build-task-save-guide.md +3 -0
  319. package/skills/ae-engage/references/flow-metric-update.md +115 -1
  320. package/skills/ae-engage/references/save-flow.md +3 -0
  321. package/skills/ae-engage/references/save-task.md +21 -0
  322. package/skills/ae-engage/references/task-metric-update.md +151 -0
  323. package/skills/ae-experiment/SKILL.md +14 -7
  324. package/skills/ae-experiment/references/save_submit_external_experiment.md +52 -0
  325. package/skills/ae-experiment-design/SKILL.md +3 -3
  326. package/skills/ae-experiment-design/references/platform-operations.md +1 -1
  327. package/skills/ae-experiment-insight/SKILL.md +2 -2
  328. package/skills/ae-experiment-insight/references/platform-operations.md +1 -1
  329. package/skills/ae-generate-tracking-code/SKILL.md +2 -1
  330. package/skills/ae-generate-tracking-code/references/client-sdk-insert.md +1 -1
  331. package/skills/ae-generate-tracking-code/references/datax-config.md +1 -1
  332. package/skills/ae-generate-tracking-code/references/logbus-config.md +1 -1
  333. package/skills/ae-generate-tracking-code/references/modes.md +1 -1
  334. package/skills/ae-generate-tracking-code/references/server-sdk-insert.md +5 -5
  335. package/skills/ae-generate-tracking-code/references/snippet-delivery.md +3 -3
  336. package/skills/ae-generate-tracking-plan/SKILL.md +27 -15
  337. package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +1 -1
  338. package/skills/ae-generate-tracking-plan/references/te-api.md +1 -0
  339. package/skills/ae-generate-tracking-plan/references/xlsx-schema.md +3 -2
  340. package/skills/ae-kb/SKILL.md +147 -37
  341. package/skills/ae-kb/references/analysis-workflow.md +292 -0
  342. package/skills/ae-kb/references/query-workflow.md +59 -29
  343. package/skills/ae-kb/references/source-mutations.md +95 -0
  344. package/skills/ae-kb/references/versions.md +46 -0
  345. package/skills/ae-kb-discovery/SKILL.md +5 -1
  346. package/skills/ae-metadata/SKILL.md +1 -1
  347. package/skills/ae-migrate-tracking-code/SKILL.md +195 -0
  348. package/skills/ae-migrate-tracking-code/references/ae-preset-properties.md +76 -0
  349. package/skills/ae-migrate-tracking-code/references/ir.md +167 -0
  350. package/skills/ae-migrate-tracking-code/references/mapping-framework.md +112 -0
  351. package/skills/ae-migrate-tracking-code/references/providers/README.md +58 -0
  352. package/skills/ae-migrate-tracking-code/references/providers/amplitude.md +208 -0
  353. package/skills/ae-migrate-tracking-code/references/providers/firebase.md +160 -0
  354. package/skills/ae-migrate-tracking-code/references/providers/ga4.md +92 -0
  355. package/skills/ae-migrate-tracking-code/references/providers/mixpanel.md +150 -0
  356. package/skills/ae-migrate-tracking-code/references/providers/sensors-data.md +146 -0
  357. package/skills/ae-project-semantic/SKILL.md +1 -1
  358. package/skills/ae-system/SKILL.md +5 -5
  359. package/skills/ae-team/SKILL.md +2 -2
  360. package/skills/ae-use-agent/SKILL.md +42 -0
  361. package/skills/ae-use-agent/references/local-agent.md +114 -0
  362. package/dist/auth-UMJAA72O.js +0 -15
  363. package/dist/chunk-533JK3YX.js +0 -72
  364. package/dist/chunk-DKEXH6Q5.js +0 -72
  365. package/dist/chunk-O6K2ODUE.js +0 -318
  366. package/dist/chunk-RWXIXOZG.js +0 -326
  367. package/dist/client-N7NGZUNI.js +0 -204
  368. package/dist/te-kb-BUD6N3NI.js +0 -1222
  369. package/skills/ae-agent/references/auto-provision-mcp-credentials.md +0 -57
  370. package/skills/ae-analysis/metadata_resolution.md +0 -184
@@ -0,0 +1,623 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import {
3
+ getActiveHost,
4
+ getConfigDir,
5
+ getFallbackCliToken,
6
+ normalizeUrl,
7
+ safeJsonParse,
8
+ safeReadJsonFile
9
+ } from "./chunk-7FTTULED.js";
10
+ import {
11
+ PermissionError,
12
+ logger
13
+ } from "./chunk-MAPZ7VB6.js";
14
+
15
+ // src/core/secure-store.ts
16
+ import crypto from "crypto";
17
+ import fs from "fs";
18
+ import os from "os";
19
+ import path from "path";
20
+ import { execFileSync } from "child_process";
21
+ var STORE_DIR_SUFFIX = "secure-tokens";
22
+ var SCRYPT_SALT = Buffer.from("ae-cli-secure-store-v1");
23
+ var SCRYPT_N = 16384;
24
+ var SCRYPT_R = 8;
25
+ var SCRYPT_P = 1;
26
+ var KEY_LEN = 32;
27
+ var NONCE_LEN = 12;
28
+ function getMachineId() {
29
+ if (process.platform === "darwin") {
30
+ try {
31
+ const out = execFileSync("ioreg", ["-rd1", "-c", "IOPlatformExpertDevice"], {
32
+ encoding: "utf8",
33
+ timeout: 3e3
34
+ });
35
+ const match = out.match(/IOPlatformUUID.*?=.*?"([0-9A-F-]{36})"/i);
36
+ if (match?.[1]) return `darwin:${match[1]}`;
37
+ } catch {
38
+ }
39
+ }
40
+ if (process.platform === "linux") {
41
+ for (const candidate of ["/etc/machine-id", "/var/lib/dbus/machine-id"]) {
42
+ try {
43
+ const id = fs.readFileSync(candidate, "utf8").trim();
44
+ if (id) return `linux:${id}`;
45
+ } catch {
46
+ }
47
+ }
48
+ }
49
+ if (process.platform === "win32") {
50
+ try {
51
+ const out = execFileSync(
52
+ "reg",
53
+ ["query", "HKLM\\SOFTWARE\\Microsoft\\Cryptography", "/v", "MachineGuid"],
54
+ { encoding: "utf8", timeout: 3e3 }
55
+ );
56
+ const match = out.match(/MachineGuid\s+REG_SZ\s+([0-9a-f-]+)/i);
57
+ if (match?.[1]) return `win32:${match[1]}`;
58
+ } catch {
59
+ }
60
+ }
61
+ logger.warn("secure-store: using fallback machine-id (HOME+hostname+platform)");
62
+ return `fallback:${os.homedir()}|${os.hostname()}|${os.platform()}`;
63
+ }
64
+ var cachedMachineId;
65
+ var cachedKey;
66
+ function getKey() {
67
+ if (!cachedMachineId) cachedMachineId = getMachineId();
68
+ if (!cachedKey) {
69
+ cachedKey = crypto.scryptSync(cachedMachineId, SCRYPT_SALT, KEY_LEN, {
70
+ N: SCRYPT_N,
71
+ r: SCRYPT_R,
72
+ p: SCRYPT_P
73
+ });
74
+ }
75
+ return cachedKey;
76
+ }
77
+ function encrypt(plaintext) {
78
+ const nonce = crypto.randomBytes(NONCE_LEN);
79
+ const cipher = crypto.createCipheriv("aes-256-gcm", getKey(), nonce);
80
+ const data = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
81
+ return {
82
+ nonce: nonce.toString("hex"),
83
+ tag: cipher.getAuthTag().toString("hex"),
84
+ data: data.toString("hex")
85
+ };
86
+ }
87
+ function decrypt(blob) {
88
+ const decipher = crypto.createDecipheriv("aes-256-gcm", getKey(), Buffer.from(blob.nonce, "hex"));
89
+ decipher.setAuthTag(Buffer.from(blob.tag, "hex"));
90
+ return Buffer.concat([
91
+ decipher.update(Buffer.from(blob.data, "hex")),
92
+ decipher.final()
93
+ ]).toString("utf8");
94
+ }
95
+ function storeDir() {
96
+ return path.join(getConfigDir(), STORE_DIR_SUFFIX);
97
+ }
98
+ function safeHost(host) {
99
+ return normalizeUrl(host).replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9._-]/g, "_");
100
+ }
101
+ function legacyFilePath(host) {
102
+ return path.join(storeDir(), `${safeHost(host)}.enc.json`);
103
+ }
104
+ function vaultFilePath(host) {
105
+ return path.join(storeDir(), `${safeHost(host)}.accounts.v1.enc.json`);
106
+ }
107
+ function ensureStoreDir() {
108
+ const dir = storeDir();
109
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true, mode: 448 });
110
+ try {
111
+ fs.chmodSync(dir, 448);
112
+ } catch {
113
+ }
114
+ }
115
+ function atomicWriteEncrypted(filePath, value) {
116
+ ensureStoreDir();
117
+ const tempPath = `${filePath}.${process.pid}.${crypto.randomBytes(6).toString("hex")}.tmp`;
118
+ const blob = encrypt(JSON.stringify(value));
119
+ try {
120
+ fs.writeFileSync(tempPath, JSON.stringify(blob, null, 2), { encoding: "utf8", mode: 384 });
121
+ try {
122
+ fs.chmodSync(tempPath, 384);
123
+ } catch {
124
+ }
125
+ fs.renameSync(tempPath, filePath);
126
+ try {
127
+ fs.chmodSync(filePath, 384);
128
+ } catch {
129
+ }
130
+ } finally {
131
+ try {
132
+ fs.rmSync(tempPath, { force: true });
133
+ } catch {
134
+ }
135
+ }
136
+ }
137
+ function readEncrypted(filePath, label) {
138
+ if (!fs.existsSync(filePath)) return null;
139
+ try {
140
+ const blob = safeJsonParse(fs.readFileSync(filePath, "utf8"));
141
+ if (!blob?.nonce || !blob?.tag || !blob?.data) {
142
+ logger.warn(`secure-store: malformed ${label}`);
143
+ return null;
144
+ }
145
+ return safeJsonParse(decrypt(blob));
146
+ } catch (error) {
147
+ logger.error(`secure-store: decrypt failed for ${label}: ${error.message}`);
148
+ return null;
149
+ }
150
+ }
151
+ function tokenFingerprint(token) {
152
+ return crypto.createHash("sha256").update(token).digest("hex").slice(0, 24);
153
+ }
154
+ function credentialId(token) {
155
+ return `cred_${tokenFingerprint(token).slice(0, 12)}`;
156
+ }
157
+ function legacyProjectionPayload(cliToken) {
158
+ return {
159
+ accessToken: "",
160
+ refreshToken: "",
161
+ accessExpiresAt: "1970-01-01T00:00:00.000Z",
162
+ cliToken
163
+ };
164
+ }
165
+ function writeLegacyProjection(host, credential) {
166
+ atomicWriteEncrypted(legacyFilePath(host), legacyProjectionPayload(credential.cliToken));
167
+ return {
168
+ credentialId: credential.id,
169
+ tokenFingerprint: tokenFingerprint(credential.cliToken)
170
+ };
171
+ }
172
+ function readVaultRaw(host) {
173
+ const normalizedHost = normalizeUrl(host);
174
+ const vault = readEncrypted(vaultFilePath(normalizedHost), `${normalizedHost} account vault`);
175
+ if (!vault || vault.version !== 1 || !Array.isArray(vault.credentials)) return null;
176
+ const credentials = vault.credentials.filter((entry) => entry?.id && entry?.cliToken);
177
+ if (credentials.length === 0 || !credentials.some((entry) => entry.id === vault.activeCredentialId)) return null;
178
+ return { ...vault, host: normalizedHost, credentials };
179
+ }
180
+ function writeVault(host, vault) {
181
+ atomicWriteEncrypted(vaultFilePath(host), vault);
182
+ }
183
+ function removeFile(filePath) {
184
+ try {
185
+ fs.rmSync(filePath, { force: true });
186
+ } catch {
187
+ }
188
+ }
189
+ function load(host) {
190
+ return readEncrypted(legacyFilePath(host), normalizeUrl(host));
191
+ }
192
+ function loadCredentialVault(host) {
193
+ const normalizedHost = normalizeUrl(host);
194
+ let vault = readVaultRaw(normalizedHost);
195
+ const legacyToken = load(normalizedHost)?.cliToken?.trim();
196
+ if (!vault) {
197
+ if (!legacyToken) return null;
198
+ const imported = { id: credentialId(legacyToken), cliToken: legacyToken };
199
+ vault = {
200
+ version: 1,
201
+ host: normalizedHost,
202
+ activeCredentialId: imported.id,
203
+ credentials: [imported],
204
+ legacyProjection: {
205
+ credentialId: imported.id,
206
+ tokenFingerprint: tokenFingerprint(legacyToken)
207
+ }
208
+ };
209
+ writeVault(normalizedHost, vault);
210
+ logger.info(`secure-store: migrated legacy CLI token for ${normalizedHost}`);
211
+ return vault;
212
+ }
213
+ if (legacyToken) {
214
+ let credential = vault.credentials.find((entry) => entry.cliToken === legacyToken);
215
+ let changed = false;
216
+ if (!credential) {
217
+ credential = { id: credentialId(legacyToken), cliToken: legacyToken };
218
+ vault.credentials.push(credential);
219
+ changed = true;
220
+ logger.info(`secure-store: imported CLI token changed by an older CLI for ${normalizedHost}`);
221
+ }
222
+ const fingerprint = tokenFingerprint(legacyToken);
223
+ if (vault.activeCredentialId !== credential.id || vault.legacyProjection?.credentialId !== credential.id || vault.legacyProjection?.tokenFingerprint !== fingerprint) {
224
+ vault.activeCredentialId = credential.id;
225
+ vault.legacyProjection = { credentialId: credential.id, tokenFingerprint: fingerprint };
226
+ changed = true;
227
+ }
228
+ if (changed) writeVault(normalizedHost, vault);
229
+ return vault;
230
+ }
231
+ if (vault.legacyProjection) {
232
+ const projection = vault.legacyProjection;
233
+ const projected = vault.credentials.find((entry) => entry.id === projection.credentialId && tokenFingerprint(entry.cliToken) === projection.tokenFingerprint);
234
+ if (projected) {
235
+ vault.credentials = vault.credentials.filter((entry) => entry.id !== projected.id);
236
+ logger.info(`secure-store: honored legacy logout for ${normalizedHost}`);
237
+ }
238
+ vault.legacyProjection = void 0;
239
+ if (vault.credentials.length === 0) {
240
+ removeFile(vaultFilePath(normalizedHost));
241
+ return null;
242
+ }
243
+ if (!vault.credentials.some((entry) => entry.id === vault.activeCredentialId)) {
244
+ vault.activeCredentialId = vault.credentials[0].id;
245
+ }
246
+ }
247
+ const active = vault.credentials.find((entry) => entry.id === vault.activeCredentialId);
248
+ vault.legacyProjection = writeLegacyProjection(normalizedHost, active);
249
+ writeVault(normalizedHost, vault);
250
+ return vault;
251
+ }
252
+ function getActiveCredential(host) {
253
+ const vault = loadCredentialVault(host);
254
+ return vault?.credentials.find((entry) => entry.id === vault.activeCredentialId) ?? null;
255
+ }
256
+ function listCredentials(host) {
257
+ return loadCredentialVault(host)?.credentials ?? [];
258
+ }
259
+ function saveCredential(host, credential, options = {}) {
260
+ const normalizedHost = normalizeUrl(host);
261
+ const existingVault = loadCredentialVault(normalizedHost);
262
+ if (options.add && !credential.account) {
263
+ throw new SecureStoreAuthError(
264
+ `This host does not return account identity from CLI token validation. Upgrade the server before using auth login --add for ${normalizedHost}.`
265
+ );
266
+ }
267
+ const sameAccount = credential.account ? existingVault?.credentials.find((entry) => entry.account?.openId === credential.account.openId || entry.account?.loginName === credential.account.loginName) : void 0;
268
+ const sameToken = existingVault?.credentials.find((entry) => entry.cliToken === credential.cliToken);
269
+ const saved = {
270
+ ...sameAccount ?? sameToken ?? { id: credentialId(credential.cliToken) },
271
+ ...credential
272
+ };
273
+ let credentials;
274
+ if (options.add) {
275
+ credentials = (existingVault?.credentials ?? []).filter((entry) => entry.id !== saved.id);
276
+ credentials.push(saved);
277
+ } else {
278
+ credentials = [saved];
279
+ }
280
+ const legacyProjection = writeLegacyProjection(normalizedHost, saved);
281
+ writeVault(normalizedHost, {
282
+ version: 1,
283
+ host: normalizedHost,
284
+ activeCredentialId: saved.id,
285
+ credentials,
286
+ legacyProjection
287
+ });
288
+ logger.info(`secure-store: saved CLI credential for ${normalizedHost}`);
289
+ return saved;
290
+ }
291
+ function updateCredentialMetadata(host, cliToken, metadata) {
292
+ const normalizedHost = normalizeUrl(host);
293
+ const vault = loadCredentialVault(normalizedHost);
294
+ if (!vault) return;
295
+ const index = vault.credentials.findIndex((entry) => entry.cliToken === cliToken);
296
+ if (index < 0) return;
297
+ vault.credentials[index] = {
298
+ ...vault.credentials[index],
299
+ ...metadata.account ? { account: metadata.account } : {},
300
+ ...metadata.cliTokenExpiresAt ? { cliTokenExpiresAt: metadata.cliTokenExpiresAt } : {}
301
+ };
302
+ writeVault(normalizedHost, vault);
303
+ }
304
+ function markCredentialRenewed(host, cliToken, date) {
305
+ const normalizedHost = normalizeUrl(host);
306
+ const vault = loadCredentialVault(normalizedHost);
307
+ const credential = vault?.credentials.find((entry) => entry.cliToken === cliToken);
308
+ if (!vault || !credential) return;
309
+ credential.lastRenewedOn = date;
310
+ writeVault(normalizedHost, vault);
311
+ }
312
+ function activateCredential(host, account) {
313
+ const normalizedHost = normalizeUrl(host);
314
+ const vault = loadCredentialVault(normalizedHost);
315
+ if (!vault) throw new SecureStoreAuthError(`No stored CLI credentials for ${normalizedHost}.`);
316
+ const matches = vault.credentials.filter((entry) => entry.account?.loginName === account || entry.account?.openId === account);
317
+ if (matches.length === 0) {
318
+ throw new SecureStoreAuthError(`No stored account '${account}' for ${normalizedHost}. Run: ae-cli auth list --host ${normalizedHost}`);
319
+ }
320
+ if (matches.length > 1) {
321
+ throw new SecureStoreAuthError(`Account '${account}' is ambiguous for ${normalizedHost}; use its open_id.`);
322
+ }
323
+ const selected = matches[0];
324
+ vault.activeCredentialId = selected.id;
325
+ vault.legacyProjection = writeLegacyProjection(normalizedHost, selected);
326
+ writeVault(normalizedHost, vault);
327
+ return selected;
328
+ }
329
+ function removeActiveCredential(host) {
330
+ const normalizedHost = normalizeUrl(host);
331
+ const vault = loadCredentialVault(normalizedHost);
332
+ if (!vault) return { removed: null, active: null };
333
+ const removed = vault.credentials.find((entry) => entry.id === vault.activeCredentialId) ?? null;
334
+ vault.credentials = vault.credentials.filter((entry) => entry.id !== vault.activeCredentialId);
335
+ if (vault.credentials.length === 0) {
336
+ removeFile(legacyFilePath(normalizedHost));
337
+ removeFile(vaultFilePath(normalizedHost));
338
+ return { removed, active: null };
339
+ }
340
+ const active = vault.credentials[0];
341
+ vault.activeCredentialId = active.id;
342
+ vault.legacyProjection = writeLegacyProjection(normalizedHost, active);
343
+ writeVault(normalizedHost, vault);
344
+ return { removed, active };
345
+ }
346
+ function clearAllCredentials(host) {
347
+ const normalizedHost = normalizeUrl(host);
348
+ removeFile(legacyFilePath(normalizedHost));
349
+ removeFile(vaultFilePath(normalizedHost));
350
+ logger.info(`secure-store: all CLI credentials cleared for ${normalizedHost}`);
351
+ }
352
+ function loadCliToken(host) {
353
+ return getActiveCredential(host)?.cliToken ?? null;
354
+ }
355
+ var SecureStoreAuthError = class extends Error {
356
+ constructor(message) {
357
+ super(message);
358
+ this.name = "SecureStoreAuthError";
359
+ }
360
+ };
361
+
362
+ // src/core/cli-token.ts
363
+ import crypto2 from "crypto";
364
+ import fs2 from "fs";
365
+ import path2 from "path";
366
+ var CLI_TOKEN_GENERATE_PATH = "/v1/ta/cli/token/generate";
367
+ var CLI_TOKEN_RENEW_PATH = "/v1/ta/cli/token/renew";
368
+ var CLI_TOKEN_VALIDATE_PATH = "/v1/ta/cli/token/validate";
369
+ var CliTokenValidationUnavailableError = class extends Error {
370
+ constructor(message) {
371
+ super(message);
372
+ this.name = "CliTokenValidationUnavailableError";
373
+ }
374
+ };
375
+ function isExplicitCliTokenRejection(data, responseText) {
376
+ const code = String(data?.code ?? data?.error?.code ?? "");
377
+ const message = String(data?.return_message ?? data?.message ?? data?.error?.message ?? responseText);
378
+ return /cli[_-]?token[_-]?(invalid|expired)/i.test(code) || /cli[-_\s]?token.*\b(invalid|expired)\b/i.test(message) || /\b(invalid|expired)\b.*cli[-_\s]?token/i.test(message);
379
+ }
380
+ function optionalNonEmptyString(...values) {
381
+ return values.find((value) => typeof value === "string" && value.trim());
382
+ }
383
+ function optionalIsoDate(...values) {
384
+ const value = values.find((candidate) => typeof candidate === "string" && candidate.trim() || typeof candidate === "number");
385
+ if (value === void 0) return void 0;
386
+ const date = new Date(value);
387
+ return Number.isFinite(date.getTime()) ? date.toISOString() : void 0;
388
+ }
389
+ var cliTokenCache = /* @__PURE__ */ new Map();
390
+ var renewedLocalDate = /* @__PURE__ */ new Map();
391
+ var renewInFlight = /* @__PURE__ */ new Map();
392
+ function tokenFingerprint2(cliToken) {
393
+ return crypto2.createHash("sha256").update(cliToken).digest("hex").slice(0, 16);
394
+ }
395
+ function renewKey(hostUrl, cliToken) {
396
+ return `${normalizeUrl(hostUrl)}#${tokenFingerprint2(cliToken)}`;
397
+ }
398
+ function renewStateFilePath() {
399
+ return path2.join(getConfigDir(), "cli-token-renew.json");
400
+ }
401
+ function localRenewDate(now = /* @__PURE__ */ new Date()) {
402
+ const y = now.getFullYear();
403
+ const m = String(now.getMonth() + 1).padStart(2, "0");
404
+ const d = String(now.getDate()).padStart(2, "0");
405
+ return `${y}-${m}-${d}`;
406
+ }
407
+ function loadRenewStore() {
408
+ try {
409
+ const file = renewStateFilePath();
410
+ if (!fs2.existsSync(file)) return {};
411
+ const data = safeReadJsonFile(file);
412
+ return data && typeof data === "object" && !Array.isArray(data) ? data : {};
413
+ } catch {
414
+ return {};
415
+ }
416
+ }
417
+ function saveRenewStore(store) {
418
+ const file = renewStateFilePath();
419
+ if (Object.keys(store).length === 0) {
420
+ try {
421
+ fs2.rmSync(file, { force: true });
422
+ } catch {
423
+ }
424
+ return;
425
+ }
426
+ const dir = getConfigDir();
427
+ if (!fs2.existsSync(dir)) fs2.mkdirSync(dir, { recursive: true });
428
+ fs2.writeFileSync(file, JSON.stringify(store, null, 2), { encoding: "utf8", mode: 384 });
429
+ try {
430
+ fs2.chmodSync(file, 384);
431
+ } catch {
432
+ }
433
+ }
434
+ function persistedRenewDate(hostUrl, cliToken) {
435
+ const credential = getActiveCredential(hostUrl);
436
+ if (credential?.cliToken === cliToken && credential.lastRenewedOn) return credential.lastRenewedOn;
437
+ return loadRenewStore()[renewKey(hostUrl, cliToken)]?.date;
438
+ }
439
+ function markRenewSucceeded(hostUrl, cliToken, date) {
440
+ const key = renewKey(hostUrl, cliToken);
441
+ renewedLocalDate.set(key, date);
442
+ markCredentialRenewed(hostUrl, cliToken, date);
443
+ const store = loadRenewStore();
444
+ store[key] = { date };
445
+ saveRenewStore(store);
446
+ }
447
+ function clearCliTokenCache(hostUrl) {
448
+ if (!hostUrl) {
449
+ cliTokenCache.clear();
450
+ renewedLocalDate.clear();
451
+ renewInFlight.clear();
452
+ return;
453
+ }
454
+ const normalizedHost = normalizeUrl(hostUrl);
455
+ cliTokenCache.delete(normalizedHost);
456
+ for (const key of [...renewedLocalDate.keys()]) {
457
+ if (key.startsWith(`${normalizedHost}#`)) renewedLocalDate.delete(key);
458
+ }
459
+ for (const key of [...renewInFlight.keys()]) {
460
+ if (key.startsWith(`${normalizedHost}#`)) renewInFlight.delete(key);
461
+ }
462
+ }
463
+ async function generateCliToken(hostUrl, accessToken) {
464
+ if (!accessToken) throw new Error("CLI token generation requires the access token returned by auth login.");
465
+ const url = `${hostUrl.replace(/\/+$/, "")}${CLI_TOKEN_GENERATE_PATH}`;
466
+ const resp = await fetch(url, {
467
+ method: "GET",
468
+ headers: { Authorization: `bearer ${accessToken}` }
469
+ });
470
+ if (!resp.ok) {
471
+ if (resp.status === 403) {
472
+ const text = await resp.text();
473
+ let body = {};
474
+ try {
475
+ body = text ? safeJsonParse(text) : {};
476
+ } catch {
477
+ }
478
+ const message = body.message ?? body.return_message ?? "CLI access is disabled for this account.";
479
+ const code = body.code ?? (String(message).includes("CLI_ACCESS_DISABLED") ? "CLI_ACCESS_DISABLED" : void 0);
480
+ throw new PermissionError(message, code, body.hint);
481
+ }
482
+ throw new Error(`CLI token generate HTTP error: ${resp.status} ${resp.statusText}`);
483
+ }
484
+ const data = safeJsonParse(await resp.text());
485
+ if (data.return_code !== 0) {
486
+ const message = data.return_message || data.message || "unknown";
487
+ if (data.code === "CLI_ACCESS_DISABLED" || String(message).includes("CLI_ACCESS_DISABLED")) {
488
+ throw new PermissionError(message, "CLI_ACCESS_DISABLED", data.hint);
489
+ }
490
+ throw new Error(`CLI token generate error: ${message} (code: ${data.return_code})`);
491
+ }
492
+ const cliToken = data.data?.userSecret ?? data.data?.user_secret;
493
+ if (!cliToken) throw new Error("CLI token generate error: empty userSecret in response");
494
+ return cliToken;
495
+ }
496
+ async function validateCliTokenOnServer(hostUrl, cliToken) {
497
+ const url = `${hostUrl.replace(/\/+$/, "")}${CLI_TOKEN_VALIDATE_PATH}`;
498
+ let resp;
499
+ try {
500
+ resp = await fetch(url, {
501
+ method: "GET",
502
+ headers: { Accept: "application/json", "cli-token": cliToken }
503
+ });
504
+ } catch (error) {
505
+ throw new CliTokenValidationUnavailableError(`Unable to validate CLI token for ${hostUrl}: ${error.message}`);
506
+ }
507
+ const responseText = await resp.text();
508
+ let body;
509
+ try {
510
+ body = safeJsonParse(responseText);
511
+ } catch {
512
+ body = void 0;
513
+ }
514
+ if (isExplicitCliTokenRejection(body, responseText)) {
515
+ throw new SecureStoreAuthError(
516
+ `CLI token is invalid or expired for ${hostUrl}. Run: ae-cli auth logout --host ${hostUrl}, then ae-cli auth login --host ${hostUrl}`
517
+ );
518
+ }
519
+ if (!resp.ok) {
520
+ throw new CliTokenValidationUnavailableError(
521
+ `CLI token validation is unavailable for ${hostUrl} (HTTP ${resp.status} ${resp.statusText})`
522
+ );
523
+ }
524
+ if (body?.return_code !== 0) {
525
+ throw new CliTokenValidationUnavailableError(`CLI token validation returned an unsupported response for ${hostUrl}`);
526
+ }
527
+ const data = body?.data;
528
+ const openId = optionalNonEmptyString(data?.openId, data?.open_id);
529
+ const loginName = optionalNonEmptyString(data?.loginName, data?.login_name);
530
+ const userName = optionalNonEmptyString(data?.userName, data?.user_name);
531
+ const account = openId && loginName && userName ? { openId, loginName, userName } : void 0;
532
+ const cliTokenExpiresAt = optionalIsoDate(data?.expiresAt, data?.expires_at);
533
+ return {
534
+ ...account ? { account } : {},
535
+ ...cliTokenExpiresAt ? { cliTokenExpiresAt } : {}
536
+ };
537
+ }
538
+ async function renewCliTokenOnServer(hostUrl, cliToken) {
539
+ const url = new URL(`${hostUrl.replace(/\/+$/, "")}${CLI_TOKEN_RENEW_PATH}`);
540
+ url.searchParams.set("cli-token", cliToken);
541
+ const resp = await fetch(url.toString(), { method: "GET", headers: { Accept: "application/json" } });
542
+ const text = await resp.text();
543
+ let data;
544
+ try {
545
+ data = text ? safeJsonParse(text) : {};
546
+ } catch {
547
+ data = {};
548
+ }
549
+ if (!resp.ok) throw new Error(`CLI token renew HTTP error: ${resp.status} ${resp.statusText}`);
550
+ if (data?.return_code !== void 0 && data.return_code !== 0) {
551
+ throw new Error(`CLI token renew error: ${data.return_message || "unknown"} (code: ${data.return_code})`);
552
+ }
553
+ }
554
+ async function maybeRenewCliTokenDaily(hostUrl, cliToken) {
555
+ const key = renewKey(hostUrl, cliToken);
556
+ const today = localRenewDate();
557
+ if (renewedLocalDate.get(key) === today || persistedRenewDate(hostUrl, cliToken) === today) {
558
+ renewedLocalDate.set(key, today);
559
+ return;
560
+ }
561
+ const existing = renewInFlight.get(key);
562
+ if (existing) return existing;
563
+ const attempt = (async () => {
564
+ try {
565
+ await renewCliTokenOnServer(hostUrl, cliToken);
566
+ markRenewSucceeded(hostUrl, cliToken, today);
567
+ logger.info(`cli-token: renewed for ${normalizeUrl(hostUrl)} (local day ${today})`);
568
+ } catch (error) {
569
+ logger.warn(`cli-token: renew failed for ${normalizeUrl(hostUrl)}: ${error?.message || error}; business call proceeds`);
570
+ } finally {
571
+ renewInFlight.delete(key);
572
+ }
573
+ })();
574
+ renewInFlight.set(key, attempt);
575
+ await attempt;
576
+ }
577
+ function peekCliToken(hostOverride) {
578
+ const hostUrl = hostOverride || getActiveHost();
579
+ if (!hostUrl) return void 0;
580
+ const normalizedHost = normalizeUrl(hostUrl);
581
+ const stored = loadCliToken(normalizedHost);
582
+ if (stored) {
583
+ cliTokenCache.set(normalizedHost, stored);
584
+ return stored;
585
+ }
586
+ return cliTokenCache.get(normalizedHost) || getFallbackCliToken(normalizedHost) || void 0;
587
+ }
588
+ async function getCliToken(hostOverride) {
589
+ const resolvedHost = hostOverride || getActiveHost();
590
+ if (!resolvedHost) throw new SecureStoreAuthError("No AE host configured. Run: ae-cli auth login --host <url>");
591
+ const hostUrl = normalizeUrl(resolvedHost);
592
+ const stored = loadCliToken(hostUrl);
593
+ let token = stored || getFallbackCliToken(hostUrl) || cliTokenCache.get(hostUrl);
594
+ if (!token) {
595
+ throw new SecureStoreAuthError(`No stored CLI token for ${hostUrl}. Run: ae-cli auth login --host ${hostUrl}`);
596
+ }
597
+ cliTokenCache.set(hostUrl, token);
598
+ await maybeRenewCliTokenDaily(hostUrl, token);
599
+ return token;
600
+ }
601
+ async function mintCliToken(hostUrl, accessToken) {
602
+ logger.info(`Generating CLI token for ${hostUrl}`);
603
+ const cliToken = await generateCliToken(hostUrl, accessToken);
604
+ cliTokenCache.set(normalizeUrl(hostUrl), cliToken);
605
+ return cliToken;
606
+ }
607
+
608
+ export {
609
+ getActiveCredential,
610
+ listCredentials,
611
+ saveCredential,
612
+ updateCredentialMetadata,
613
+ activateCredential,
614
+ removeActiveCredential,
615
+ clearAllCredentials,
616
+ SecureStoreAuthError,
617
+ CliTokenValidationUnavailableError,
618
+ clearCliTokenCache,
619
+ validateCliTokenOnServer,
620
+ peekCliToken,
621
+ getCliToken,
622
+ mintCliToken
623
+ };