@thinkingai/ae-cli 6.1.10 → 6.1.12

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 (232) hide show
  1. package/README.md +25 -3
  2. package/README.zh.md +25 -3
  3. package/dist/{auth-56Z45UVR.js → auth-GDV3H5I4.js} +18 -8
  4. package/dist/{auth-ENM3FE6L.js → auth-NN55553T.js} +3 -3
  5. package/dist/{capability-2H6PAOA3.js → capability-DRLGDVS4.js} +24 -17
  6. package/dist/{capability-YPOQX6PL.js → capability-P6GK3AQH.js} +24 -17
  7. package/dist/chunk-4NN5IWVN.js +26 -0
  8. package/dist/{chunk-DB4Q3ANU.js → chunk-6A2FUCIS.js} +3 -3
  9. package/dist/{chunk-PVBYJWC2.js → chunk-7KQWSBSL.js} +4 -4
  10. package/dist/{chunk-24BAVOX3.js → chunk-AXDXJTPC.js} +3 -1
  11. package/dist/{chunk-CPVTECJ3.js → chunk-DT6Y3TD7.js} +5 -5
  12. package/dist/{chunk-EGEIXA2Z.js → chunk-DWO43OIB.js} +0 -248
  13. package/dist/{chunk-V6FR6WTW.js → chunk-GJJA4CQZ.js} +34 -2
  14. package/dist/{chunk-RGXCNC4N.js → chunk-GS2P7LFD.js} +50 -17
  15. package/dist/{chunk-LYVNONC4.js → chunk-JHENBQ5B.js} +35 -0
  16. package/dist/{chunk-3P3562ZX.js → chunk-MVDZ7DBQ.js} +5 -5
  17. package/dist/{chunk-LCXU3AAT.js → chunk-NBPKWKRA.js} +2 -2
  18. package/dist/{chunk-HQ2A7ITL.js → chunk-RBNKI5ZW.js} +50 -17
  19. package/dist/{chunk-LHVM35J4.js → chunk-TS6BUGUY.js} +4 -4
  20. package/dist/chunk-TUKQZTMI.js +250 -0
  21. package/dist/{chunk-J7MZHDHQ.js → chunk-VKD5WQKN.js} +5 -5
  22. package/dist/{chunk-3KI3RRXX.js → chunk-VTXHDCBW.js} +3 -3
  23. package/dist/{chunk-KTYR3U6D.js → chunk-YTG6Q75E.js} +10 -6
  24. package/dist/{chunk-IR4ZLVPW.js → chunk-YV52FB5G.js} +25 -3
  25. package/dist/{chunk-E7UXXHO3.js → chunk-Z3OXWCIA.js} +3 -3
  26. package/dist/{cli-token-4SBMXAUK.js → cli-token-GL5MS5FK.js} +4 -4
  27. package/dist/{client-PP5FETMW.js → client-DAIPF7XN.js} +4 -4
  28. package/dist/{community-report-client-KK2QBANO.js → community-report-client-M2RW4MXD.js} +2 -2
  29. package/dist/config-4VZNLBKF.js +489 -0
  30. package/dist/index.js +94 -35
  31. package/dist/memory-RWJW4XFO.js +892 -0
  32. package/dist/memory-VO2ZJCRT.js +892 -0
  33. package/dist/{metadata-JIQ77HFY.js → metadata-YGTHR2XJ.js} +8 -8
  34. package/dist/{metadata-AN3YFZEV.js → metadata-ZRN2GHPN.js} +8 -8
  35. package/dist/{model-JASQVOFD.js → model-CLUIK3K5.js} +7 -5
  36. package/dist/{raw-XJCAT3HX.js → raw-52B4UKO4.js} +8 -7
  37. package/dist/sync-3REDHGY6.js +10259 -0
  38. package/dist/{te-agent-JHUG6DVV.js → te-agent-XNPELAKX.js} +580 -84
  39. package/dist/{te-analysis-ITKTO6JS.js → te-analysis-GJI5FZUL.js} +1152 -13
  40. package/dist/{te-analysis-RAC67YYD.js → te-analysis-N2BRDJZ5.js} +1152 -13
  41. package/dist/{te-community-QOYIYEJI.js → te-community-SQXKE5OO.js} +7 -7
  42. package/dist/{te-community-UFKI6ONP.js → te-community-TYSNU3NQ.js} +7 -7
  43. package/dist/{te-dataops-PZQ5NQLY.js → te-dataops-5TM7WZDI.js} +370 -189
  44. package/dist/{te-dataops-XTWVTJCA.js → te-dataops-OWIADNSM.js} +370 -189
  45. package/dist/{te-engage-NLZUPSBK.js → te-engage-L72HWRGO.js} +716 -118
  46. package/dist/{te-engage-E7F4HTXU.js → te-engage-QWM4GFS7.js} +716 -118
  47. package/dist/{te-experiment-N63WF7XA.js → te-experiment-2T2HEZML.js} +189 -10
  48. package/dist/{te-experiment-D32TB6ZB.js → te-experiment-PVEY7AEZ.js} +189 -10
  49. package/dist/{te-kb-E7NSCBRB.js → te-kb-VRMEY3D4.js} +6 -6
  50. package/dist/{te-meta-GBDTMPEL.js → te-meta-53BVXPFI.js} +7 -7
  51. package/dist/{te-meta-ZTLTSHXC.js → te-meta-TOCBPBXI.js} +7 -7
  52. package/dist/{te-system-AH7DMCAQ.js → te-system-XGS5EQIQ.js} +4 -4
  53. package/dist/{te-team-BQ3SKSZV.js → te-team-BZRDV2CM.js} +7 -7
  54. package/dist/{update-DKG6UXEM.js → update-HEDXGOJH.js} +8 -6
  55. package/package.json +5 -2
  56. package/skills/ae-agent/SKILL.md +178 -16
  57. package/skills/ae-agent/references/add-skill.md +22 -10
  58. package/skills/ae-agent/references/edit-skill.md +24 -14
  59. package/skills/ae-agent/references/find-archived-conversations.md +82 -0
  60. package/skills/ae-agent/references/restore-conversation.md +54 -0
  61. package/skills/ae-agent/references/upload-skill.md +24 -14
  62. package/skills/ae-analysis/SKILL.md +1 -1
  63. package/skills/ae-analysis/references/command_index.md +104 -42
  64. package/skills/ae-analysis/references/entity_id_import_options.md +1 -1
  65. package/skills/ae-analysis/references/project_access_detail_get.md +3 -3
  66. package/skills/ae-analysis/references/project_data_power_delete.md +3 -3
  67. package/skills/ae-analysis/references/project_data_power_get.md +3 -3
  68. package/skills/ae-analysis/references/project_data_power_list.md +3 -3
  69. package/skills/ae-analysis/references/project_data_power_upsert.md +3 -3
  70. package/skills/ae-analysis/references/project_entity_create.md +3 -3
  71. package/skills/ae-analysis/references/project_entity_delete.md +3 -3
  72. package/skills/ae-analysis/references/project_entity_event_list.md +3 -3
  73. package/skills/ae-analysis/references/project_entity_get.md +3 -3
  74. package/skills/ae-analysis/references/project_entity_list.md +3 -3
  75. package/skills/ae-analysis/references/project_entity_update.md +3 -3
  76. package/skills/ae-analysis/references/project_function_list.md +3 -3
  77. package/skills/ae-analysis/references/project_info_create.md +25 -0
  78. package/skills/ae-analysis/references/project_info_delete.md +24 -0
  79. package/skills/ae-analysis/references/project_info_get.md +3 -3
  80. package/skills/ae-analysis/references/project_info_list.md +3 -3
  81. package/skills/ae-analysis/references/project_info_update.md +3 -3
  82. package/skills/ae-analysis/references/project_mark_time_create.md +3 -3
  83. package/skills/ae-analysis/references/project_mark_time_delete.md +3 -3
  84. package/skills/ae-analysis/references/project_mark_time_list.md +3 -3
  85. package/skills/ae-analysis/references/project_mark_time_update.md +3 -3
  86. package/skills/ae-analysis/references/project_member_add.md +3 -3
  87. package/skills/ae-analysis/references/project_member_batch_update.md +3 -3
  88. package/skills/ae-analysis/references/project_member_candidate_list.md +3 -3
  89. package/skills/ae-analysis/references/project_member_handover_export.md +3 -3
  90. package/skills/ae-analysis/references/project_member_handover_run.md +3 -3
  91. package/skills/ae-analysis/references/project_member_import.md +3 -3
  92. package/skills/ae-analysis/references/project_member_list.md +3 -3
  93. package/skills/ae-analysis/references/project_member_receiver_list.md +3 -3
  94. package/skills/ae-analysis/references/project_member_remove.md +3 -3
  95. package/skills/ae-analysis/references/project_member_update.md +3 -3
  96. package/skills/ae-analysis/references/project_owner_update.md +3 -3
  97. package/skills/ae-analysis/references/project_permission_binding_list.md +3 -3
  98. package/skills/ae-analysis/references/project_receive_status_update.md +3 -3
  99. package/skills/ae-analysis/references/project_role_delete.md +3 -3
  100. package/skills/ae-analysis/references/project_role_function_list.md +3 -3
  101. package/skills/ae-analysis/references/project_role_get.md +3 -3
  102. package/skills/ae-analysis/references/project_role_list.md +3 -3
  103. package/skills/ae-analysis/references/project_role_upsert.md +3 -3
  104. package/skills/ae-analysis/references/project_role_user_list.md +3 -3
  105. package/skills/ae-analysis/references/project_space_list.md +1 -1
  106. package/skills/ae-analysis/references/project_timezone_get.md +3 -3
  107. package/skills/ae-analysis/references/project_timezone_overview.md +3 -3
  108. package/skills/ae-analysis/references/project_timezone_update.md +3 -3
  109. package/skills/ae-analysis/references/project_user_id_items_update.md +3 -3
  110. package/skills/ae-analysis/references/system_admin_function_list.md +22 -0
  111. package/skills/ae-analysis/references/system_admin_function_update.md +26 -0
  112. package/skills/ae-analysis/references/system_admin_list.md +21 -0
  113. package/skills/ae-analysis/references/system_admin_remove.md +25 -0
  114. package/skills/ae-analysis/references/system_admin_upsert.md +25 -0
  115. package/skills/ae-analysis/references/system_function_list.md +21 -0
  116. package/skills/ae-analysis/references/system_member_add.md +25 -0
  117. package/skills/ae-analysis/references/system_member_candidate_list.md +22 -0
  118. package/skills/ae-analysis/references/system_member_delete.md +25 -0
  119. package/skills/ae-analysis/references/system_member_list.md +24 -0
  120. package/skills/ae-analysis/references/system_member_mfa_unbind.md +25 -0
  121. package/skills/ae-analysis/references/system_member_password_reset.md +32 -0
  122. package/skills/ae-analysis/references/system_member_project_batch_update.md +27 -0
  123. package/skills/ae-analysis/references/system_member_status_update.md +26 -0
  124. package/skills/ae-analysis/references/system_member_update.md +23 -0
  125. package/skills/ae-analysis/references/system_mfa_get.md +21 -0
  126. package/skills/ae-analysis/references/system_mfa_update.md +25 -0
  127. package/skills/ae-analysis/references/system_node_monitor_list.md +24 -0
  128. package/skills/ae-analysis/references/system_oauth2_update.md +22 -0
  129. package/skills/ae-analysis/references/system_ops_alert_contact_delete.md +25 -0
  130. package/skills/ae-analysis/references/system_ops_alert_contact_list.md +23 -0
  131. package/skills/ae-analysis/references/system_ops_alert_contact_test.md +29 -0
  132. package/skills/ae-analysis/references/system_ops_alert_contact_upsert.md +39 -0
  133. package/skills/ae-analysis/references/system_preference_get.md +21 -0
  134. package/skills/ae-analysis/references/system_preference_update.md +22 -0
  135. package/skills/ae-analysis/references/system_project_usage_list.md +28 -0
  136. package/skills/ae-analysis/references/system_query_alert_rule_list.md +21 -0
  137. package/skills/ae-analysis/references/system_query_alert_rule_update.md +26 -0
  138. package/skills/ae-analysis/references/system_query_monitor_overview.md +26 -0
  139. package/skills/ae-analysis/references/system_query_task_cancel.md +25 -0
  140. package/skills/ae-analysis/references/system_query_task_export.md +49 -0
  141. package/skills/ae-analysis/references/system_query_task_get.md +23 -0
  142. package/skills/ae-analysis/references/system_query_task_list.md +35 -0
  143. package/skills/ae-analysis/references/system_query_task_options.md +27 -0
  144. package/skills/ae-analysis/references/system_receiver_address_delete.md +26 -0
  145. package/skills/ae-analysis/references/system_receiver_address_overview.md +21 -0
  146. package/skills/ae-analysis/references/system_receiver_address_project_list.md +21 -0
  147. package/skills/ae-analysis/references/system_receiver_address_promote.md +24 -0
  148. package/skills/ae-analysis/references/system_receiver_address_upsert.md +27 -0
  149. package/skills/ae-analysis/references/system_receiver_detection_get.md +22 -0
  150. package/skills/ae-analysis/references/system_receiver_detection_run.md +22 -0
  151. package/skills/ae-analysis/references/system_receiver_detection_update.md +25 -0
  152. package/skills/ae-analysis/references/system_role_delete.md +26 -0
  153. package/skills/ae-analysis/references/system_role_function_list.md +22 -0
  154. package/skills/ae-analysis/references/system_role_get.md +22 -0
  155. package/skills/ae-analysis/references/system_role_list.md +24 -0
  156. package/skills/ae-analysis/references/system_role_upsert.md +27 -0
  157. package/skills/ae-analysis/references/system_role_user_list.md +22 -0
  158. package/skills/ae-analysis/references/system_seat_list.md +25 -0
  159. package/skills/ae-analysis/references/system_seat_update.md +26 -0
  160. package/skills/ae-analysis/references/system_smtp_delete.md +24 -0
  161. package/skills/ae-analysis/references/system_smtp_get.md +21 -0
  162. package/skills/ae-analysis/references/system_smtp_test.md +22 -0
  163. package/skills/ae-analysis/references/system_smtp_upsert.md +31 -0
  164. package/skills/ae-analysis/references/system_third_party_login_disable.md +25 -0
  165. package/skills/ae-analysis/references/system_third_party_login_list.md +21 -0
  166. package/skills/ae-analysis/references/system_third_party_login_upsert.md +33 -0
  167. package/skills/ae-analysis/references/system_usage_overview.md +21 -0
  168. package/skills/ae-analysis/references/system_usage_trend_export.md +44 -0
  169. package/skills/ae-analysis/references/system_usage_trend_query.md +28 -0
  170. package/skills/ae-dataops/SKILL.md +1 -1
  171. package/skills/ae-dataops/references/dataops-flow-create.md +51 -16
  172. package/skills/ae-engage/SKILL.md +67 -27
  173. package/skills/ae-engage/references/activity-activity.md +3 -0
  174. package/skills/ae-engage/references/activity-approval.md +12 -4
  175. package/skills/ae-engage/references/activity-data-detail.md +61 -0
  176. package/skills/ae-engage/references/activity-task.md +21 -6
  177. package/skills/ae-engage/references/activity-topic.md +31 -13
  178. package/skills/ae-engage/references/add-channel.md +170 -41
  179. package/skills/ae-engage/references/build-task-save-guide.md +66 -29
  180. package/skills/ae-engage/references/channel-update-config.md +3 -2
  181. package/skills/ae-engage/references/common-metric.md +88 -115
  182. package/skills/ae-engage/references/flow-detail.md +13 -0
  183. package/skills/ae-engage/references/preset-event.md +14 -32
  184. package/skills/ae-engage/references/save-flow.md +141 -64
  185. package/skills/ae-engage/references/save-task.md +231 -58
  186. package/skills/ae-engage/references/scene-config-metric.md +3 -0
  187. package/skills/ae-engage/references/scene-preset-metric.md +8 -37
  188. package/skills/ae-engage/references/scene-strategy-audience.md +56 -643
  189. package/skills/ae-engage/references/scene-strategy.md +6 -6
  190. package/skills/ae-engage/references/task-detail.md +10 -0
  191. package/skills/ae-engage/references/task-submit-approval.md +45 -0
  192. package/skills/ae-engage/references/validate-flow-node-config.md +1 -1
  193. package/skills/ae-experiment/SKILL.md +38 -5
  194. package/skills/ae-experiment/references/check_experiment_ready.md +2 -0
  195. package/skills/ae-experiment/references/delete_metric.md +2 -0
  196. package/skills/ae-experiment/references/query_experiment_detail.md +6 -0
  197. package/skills/ae-experiment/references/query_experiment_list.md +4 -0
  198. package/skills/ae-experiment/references/query_experiment_list_archived.md +3 -0
  199. package/skills/ae-experiment/references/query_experiment_metric_trend.md +5 -5
  200. package/skills/ae-experiment/references/query_experiment_report_summary.md +4 -3
  201. package/skills/ae-experiment/references/query_experiment_sample_size_report.md +6 -5
  202. package/skills/ae-experiment/references/query_metric_detail.md +5 -0
  203. package/skills/ae-experiment/references/query_metric_list.md +3 -0
  204. package/skills/ae-experiment/references/save_build_guide.md +39 -0
  205. package/skills/ae-experiment/references/save_experiment.md +53 -3
  206. package/skills/ae-experiment/references/save_metric.md +67 -1
  207. package/skills/ae-experiment/references/save_submit_experiment.md +3 -0
  208. package/skills/ae-experiment/references/save_validate.md +33 -0
  209. package/skills/ae-experiment-design/SKILL.md +149 -0
  210. package/skills/ae-experiment-design/agents/openai.yaml +4 -0
  211. package/skills/ae-experiment-design/references/client-experiment-sdk.md +147 -0
  212. package/skills/ae-experiment-design/references/experiment-creation.md +108 -0
  213. package/skills/ae-experiment-design/references/experiment-sdk-contract.md +100 -0
  214. package/skills/ae-experiment-design/references/exposure-contract.md +91 -0
  215. package/skills/ae-experiment-design/references/hybrid-experiment-sdk.md +74 -0
  216. package/skills/ae-experiment-design/references/metric-readiness.md +143 -0
  217. package/skills/ae-experiment-design/references/platform-operations.md +105 -0
  218. package/skills/ae-experiment-design/references/sdk-index.md +76 -0
  219. package/skills/ae-experiment-design/references/sdk-integration.md +114 -0
  220. package/skills/ae-experiment-design/references/sdk-troubleshooting.md +139 -0
  221. package/skills/ae-experiment-design/references/server-experiment-sdk.md +78 -0
  222. package/skills/ae-experiment-design/scripts/calculate_experiment_plan.py +450 -0
  223. package/skills/ae-experiment-insight/SKILL.md +149 -0
  224. package/skills/ae-experiment-insight/agents/openai.yaml +4 -0
  225. package/skills/ae-experiment-insight/references/decision-framework.md +69 -0
  226. package/skills/ae-experiment-insight/references/diagnostic-playbook.md +225 -0
  227. package/skills/ae-experiment-insight/references/platform-operations.md +82 -0
  228. package/skills/ae-experiment-insight/scripts/analyze_experiment.py +478 -0
  229. package/skills/ae-generate-tracking-code/SKILL.md +2 -2
  230. package/skills/ae-metadata/SKILL.md +1 -1
  231. package/dist/config-BSSALXEN.js +0 -128
  232. package/dist/sync-QFP4XFN3.js +0 -485
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createCapabilityCommand
3
- } from "./chunk-PVBYJWC2.js";
3
+ } from "./chunk-7KQWSBSL.js";
4
4
  import {
5
5
  registerCapabilityGatewayRoute
6
6
  } from "./chunk-PTE56QPL.js";
7
- import "./chunk-HQ2A7ITL.js";
8
- import "./chunk-KTYR3U6D.js";
9
- import "./chunk-E7UXXHO3.js";
10
- import "./chunk-IR4ZLVPW.js";
11
- import "./chunk-V6FR6WTW.js";
12
- import "./chunk-24BAVOX3.js";
13
- import "./chunk-LYVNONC4.js";
7
+ import "./chunk-YTG6Q75E.js";
8
+ import "./chunk-RBNKI5ZW.js";
9
+ import "./chunk-Z3OXWCIA.js";
10
+ import "./chunk-YV52FB5G.js";
11
+ import "./chunk-GJJA4CQZ.js";
12
+ import "./chunk-AXDXJTPC.js";
13
+ import "./chunk-JHENBQ5B.js";
14
14
 
15
15
  // src/commands/te-experiment/capability-shared.ts
16
16
  function createExperimentCapabilityCommand(config) {
@@ -37,6 +37,9 @@ function readRequiredStringArray(ctx, name) {
37
37
  function addOptionalString(input, name, value) {
38
38
  if (value !== "") input[name] = value;
39
39
  }
40
+ function addOptionalBoolean(input, ctx, flagName, fieldName) {
41
+ if (ctx.str(flagName) !== "") input[fieldName] = ctx.bool(flagName);
42
+ }
40
43
 
41
44
  // src/commands/te-experiment/bucket/list.ts
42
45
  var bucketList = createExperimentCapabilityCommand({
@@ -241,7 +244,12 @@ var experimentSave = createExperimentCapabilityCommand({
241
244
  description: "Create or update an experiment draft.",
242
245
  flags: [
243
246
  { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
244
- { name: "req", type: "json", required: true, desc: "Native camelCase experiment save request object." }
247
+ {
248
+ name: "req",
249
+ type: "json",
250
+ required: true,
251
+ desc: "Native camelCase request; custom audiences use targeting.definitionRequest, never targetConfig."
252
+ }
245
253
  ],
246
254
  risk: "write",
247
255
  validate: (ctx) => {
@@ -440,7 +448,12 @@ var metricSave = createExperimentCapabilityCommand({
440
448
  description: "Create or update an experiment metric.",
441
449
  flags: [
442
450
  { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
443
- { name: "req", type: "json", required: true, desc: "Native camelCase metric save request object." }
451
+ {
452
+ name: "req",
453
+ type: "json",
454
+ required: true,
455
+ desc: "Native camelCase request; use metricDefinition, never metricConfig or calcType."
456
+ }
444
457
  ],
445
458
  risk: "write",
446
459
  validate: (ctx) => {
@@ -466,6 +479,162 @@ var operationLogQuery = createExperimentCapabilityCommand({
466
479
  })
467
480
  });
468
481
 
482
+ // src/commands/te-experiment/save/build-guide.ts
483
+ var saveBuildGuide = createExperimentCapabilityCommand({
484
+ resource: "save",
485
+ command: "build-guide",
486
+ capabilityId: "experiment.save.build-guide",
487
+ description: "Build a read-only save guide for feature, traffic layer, experiment, or metric saves. WARNING: data.guide.example_args.req keys are recursively snake_cased for display; do not copy them into --req. Final save DTOs require camelCase (e.g. expName). Prefer capability inspect <final-save-id> input_schema.properties.req.",
488
+ flags: [
489
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
490
+ {
491
+ name: "operation-mode",
492
+ type: "string",
493
+ required: true,
494
+ desc: "Save operation mode: save_feature, save_traffic_layer, save_experiment, or save_metric."
495
+ }
496
+ ],
497
+ risk: "read",
498
+ validate: (ctx) => {
499
+ const mode = ctx.str("operation-mode");
500
+ if (!["save_feature", "save_traffic_layer", "save_experiment", "save_metric"].includes(mode)) {
501
+ throw new Error("Flag --operation-mode must be one of: save_feature, save_traffic_layer, save_experiment, save_metric");
502
+ }
503
+ },
504
+ buildInput: (ctx) => ({
505
+ project_id: ctx.num("project-id"),
506
+ operation_mode: ctx.str("operation-mode")
507
+ })
508
+ });
509
+
510
+ // src/commands/te-experiment/save/validate.ts
511
+ var saveValidate = createExperimentCapabilityCommand({
512
+ resource: "save",
513
+ command: "validate",
514
+ capabilityId: "experiment.save.validate",
515
+ description: "Dry-run validation for feature, traffic layer, experiment, or metric save requests. WARNING: valid=true is not a final-save schema pass; snake_case req keys (e.g. exp_name) can still fail on experiment \u2026 save. Always pass camelCase --req. Do not copy example_args.req key casing from this response.",
516
+ flags: [
517
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
518
+ {
519
+ name: "operation-mode",
520
+ type: "string",
521
+ required: true,
522
+ desc: "Save operation mode: save_feature, save_traffic_layer, save_experiment, or save_metric."
523
+ },
524
+ {
525
+ name: "req",
526
+ type: "json",
527
+ required: true,
528
+ desc: "Candidate camelCase save request object (expName/metricId/\u2026). Never use snake_case DTO keys."
529
+ }
530
+ ],
531
+ risk: "read",
532
+ validate: (ctx) => {
533
+ const mode = ctx.str("operation-mode");
534
+ if (!["save_feature", "save_traffic_layer", "save_experiment", "save_metric"].includes(mode)) {
535
+ throw new Error("Flag --operation-mode must be one of: save_feature, save_traffic_layer, save_experiment, save_metric");
536
+ }
537
+ readRequiredObject(ctx, "req");
538
+ },
539
+ buildInput: (ctx) => ({
540
+ project_id: ctx.num("project-id"),
541
+ operation_mode: ctx.str("operation-mode"),
542
+ req: readRequiredObject(ctx, "req")
543
+ })
544
+ });
545
+
546
+ // src/commands/te-experiment/report/metric-trend.ts
547
+ var reportMetricTrend = createExperimentCapabilityCommand({
548
+ resource: "report",
549
+ command: "metric-trend",
550
+ capabilityId: "experiment.report.metric-trend",
551
+ description: "Query an experiment metric trend report for a date range.",
552
+ flags: [
553
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
554
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
555
+ { name: "metric-id", type: "string", required: true, desc: "Metric ID." },
556
+ { name: "start-time", type: "string", required: true, desc: "Start date in yyyy-MM-dd format." },
557
+ { name: "end-time", type: "string", required: true, desc: "End date in yyyy-MM-dd format." },
558
+ {
559
+ name: "request-id",
560
+ type: "string",
561
+ required: false,
562
+ desc: "Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted."
563
+ },
564
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." }
565
+ ],
566
+ risk: "read",
567
+ buildInput: (ctx) => {
568
+ const input = {
569
+ project_id: ctx.num("project-id"),
570
+ exp_id: ctx.str("exp-id"),
571
+ metric_id: ctx.str("metric-id"),
572
+ start_time: ctx.str("start-time"),
573
+ end_time: ctx.str("end-time")
574
+ };
575
+ addOptionalString(input, "request_id", ctx.str("request-id"));
576
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
577
+ return input;
578
+ }
579
+ });
580
+
581
+ // src/commands/te-experiment/report/sample-size.ts
582
+ var reportSampleSize = createExperimentCapabilityCommand({
583
+ resource: "report",
584
+ command: "sample-size",
585
+ capabilityId: "experiment.report.sample-size",
586
+ description: "Query an experiment sample-size report for a date range.",
587
+ flags: [
588
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
589
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
590
+ { name: "start-time", type: "string", required: true, desc: "Start date in yyyy-MM-dd format." },
591
+ { name: "end-time", type: "string", required: true, desc: "End date in yyyy-MM-dd format." },
592
+ {
593
+ name: "request-id",
594
+ type: "string",
595
+ required: false,
596
+ desc: "Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted."
597
+ },
598
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." },
599
+ { name: "by-hour", type: "boolean", required: false, desc: "Break results down by hour." }
600
+ ],
601
+ risk: "read",
602
+ buildInput: (ctx) => {
603
+ const input = {
604
+ project_id: ctx.num("project-id"),
605
+ exp_id: ctx.str("exp-id"),
606
+ start_time: ctx.str("start-time"),
607
+ end_time: ctx.str("end-time")
608
+ };
609
+ addOptionalString(input, "request_id", ctx.str("request-id"));
610
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
611
+ addOptionalBoolean(input, ctx, "by-hour", "by_hour");
612
+ return input;
613
+ }
614
+ });
615
+
616
+ // src/commands/te-experiment/report/summary.ts
617
+ var reportSummary = createExperimentCapabilityCommand({
618
+ resource: "report",
619
+ command: "summary",
620
+ capabilityId: "experiment.report.summary",
621
+ description: "Query an experiment report summary.",
622
+ flags: [
623
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
624
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
625
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." }
626
+ ],
627
+ risk: "read",
628
+ buildInput: (ctx) => {
629
+ const input = {
630
+ project_id: ctx.num("project-id"),
631
+ exp_id: ctx.str("exp-id")
632
+ };
633
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
634
+ return input;
635
+ }
636
+ });
637
+
469
638
  // src/commands/te-experiment/traffic-layer/batch-delete.ts
470
639
  var trafficLayerBatchDelete = createExperimentCapabilityCommand({
471
640
  resource: "traffic-layer",
@@ -541,10 +710,15 @@ var commands = [
541
710
  experimentUpdateGroup,
542
711
  experimentBatchDelete,
543
712
  operationLogQuery,
713
+ saveBuildGuide,
714
+ saveValidate,
544
715
  trafficLayerSave,
545
716
  trafficLayerGet,
546
717
  trafficLayerList,
547
718
  trafficLayerBatchDelete,
719
+ reportSummary,
720
+ reportSampleSize,
721
+ reportMetricTrend,
548
722
  metricSave,
549
723
  metricGet,
550
724
  metricList,
@@ -583,6 +757,11 @@ export {
583
757
  metricList,
584
758
  metricSave,
585
759
  operationLogQuery,
760
+ reportMetricTrend,
761
+ reportSampleSize,
762
+ reportSummary,
763
+ saveBuildGuide,
764
+ saveValidate,
586
765
  trafficLayerBatchDelete,
587
766
  trafficLayerGet,
588
767
  trafficLayerList,
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createCapabilityCommand
3
- } from "./chunk-LHVM35J4.js";
3
+ } from "./chunk-TS6BUGUY.js";
4
4
  import {
5
5
  registerCapabilityGatewayRoute
6
6
  } from "./chunk-PTE56QPL.js";
7
- import "./chunk-RGXCNC4N.js";
8
- import "./chunk-KTYR3U6D.js";
9
- import "./chunk-E7UXXHO3.js";
10
- import "./chunk-IR4ZLVPW.js";
11
- import "./chunk-V6FR6WTW.js";
12
- import "./chunk-24BAVOX3.js";
13
- import "./chunk-LYVNONC4.js";
7
+ import "./chunk-YTG6Q75E.js";
8
+ import "./chunk-GS2P7LFD.js";
9
+ import "./chunk-Z3OXWCIA.js";
10
+ import "./chunk-YV52FB5G.js";
11
+ import "./chunk-GJJA4CQZ.js";
12
+ import "./chunk-AXDXJTPC.js";
13
+ import "./chunk-JHENBQ5B.js";
14
14
 
15
15
  // src/commands/te-experiment/capability-shared.ts
16
16
  function createExperimentCapabilityCommand(config) {
@@ -37,6 +37,9 @@ function readRequiredStringArray(ctx, name) {
37
37
  function addOptionalString(input, name, value) {
38
38
  if (value !== "") input[name] = value;
39
39
  }
40
+ function addOptionalBoolean(input, ctx, flagName, fieldName) {
41
+ if (ctx.str(flagName) !== "") input[fieldName] = ctx.bool(flagName);
42
+ }
40
43
 
41
44
  // src/commands/te-experiment/bucket/list.ts
42
45
  var bucketList = createExperimentCapabilityCommand({
@@ -241,7 +244,12 @@ var experimentSave = createExperimentCapabilityCommand({
241
244
  description: "Create or update an experiment draft.",
242
245
  flags: [
243
246
  { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
244
- { name: "req", type: "json", required: true, desc: "Native camelCase experiment save request object." }
247
+ {
248
+ name: "req",
249
+ type: "json",
250
+ required: true,
251
+ desc: "Native camelCase request; custom audiences use targeting.definitionRequest, never targetConfig."
252
+ }
245
253
  ],
246
254
  risk: "write",
247
255
  validate: (ctx) => {
@@ -440,7 +448,12 @@ var metricSave = createExperimentCapabilityCommand({
440
448
  description: "Create or update an experiment metric.",
441
449
  flags: [
442
450
  { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
443
- { name: "req", type: "json", required: true, desc: "Native camelCase metric save request object." }
451
+ {
452
+ name: "req",
453
+ type: "json",
454
+ required: true,
455
+ desc: "Native camelCase request; use metricDefinition, never metricConfig or calcType."
456
+ }
444
457
  ],
445
458
  risk: "write",
446
459
  validate: (ctx) => {
@@ -466,6 +479,162 @@ var operationLogQuery = createExperimentCapabilityCommand({
466
479
  })
467
480
  });
468
481
 
482
+ // src/commands/te-experiment/save/build-guide.ts
483
+ var saveBuildGuide = createExperimentCapabilityCommand({
484
+ resource: "save",
485
+ command: "build-guide",
486
+ capabilityId: "experiment.save.build-guide",
487
+ description: "Build a read-only save guide for feature, traffic layer, experiment, or metric saves. WARNING: data.guide.example_args.req keys are recursively snake_cased for display; do not copy them into --req. Final save DTOs require camelCase (e.g. expName). Prefer capability inspect <final-save-id> input_schema.properties.req.",
488
+ flags: [
489
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
490
+ {
491
+ name: "operation-mode",
492
+ type: "string",
493
+ required: true,
494
+ desc: "Save operation mode: save_feature, save_traffic_layer, save_experiment, or save_metric."
495
+ }
496
+ ],
497
+ risk: "read",
498
+ validate: (ctx) => {
499
+ const mode = ctx.str("operation-mode");
500
+ if (!["save_feature", "save_traffic_layer", "save_experiment", "save_metric"].includes(mode)) {
501
+ throw new Error("Flag --operation-mode must be one of: save_feature, save_traffic_layer, save_experiment, save_metric");
502
+ }
503
+ },
504
+ buildInput: (ctx) => ({
505
+ project_id: ctx.num("project-id"),
506
+ operation_mode: ctx.str("operation-mode")
507
+ })
508
+ });
509
+
510
+ // src/commands/te-experiment/save/validate.ts
511
+ var saveValidate = createExperimentCapabilityCommand({
512
+ resource: "save",
513
+ command: "validate",
514
+ capabilityId: "experiment.save.validate",
515
+ description: "Dry-run validation for feature, traffic layer, experiment, or metric save requests. WARNING: valid=true is not a final-save schema pass; snake_case req keys (e.g. exp_name) can still fail on experiment \u2026 save. Always pass camelCase --req. Do not copy example_args.req key casing from this response.",
516
+ flags: [
517
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
518
+ {
519
+ name: "operation-mode",
520
+ type: "string",
521
+ required: true,
522
+ desc: "Save operation mode: save_feature, save_traffic_layer, save_experiment, or save_metric."
523
+ },
524
+ {
525
+ name: "req",
526
+ type: "json",
527
+ required: true,
528
+ desc: "Candidate camelCase save request object (expName/metricId/\u2026). Never use snake_case DTO keys."
529
+ }
530
+ ],
531
+ risk: "read",
532
+ validate: (ctx) => {
533
+ const mode = ctx.str("operation-mode");
534
+ if (!["save_feature", "save_traffic_layer", "save_experiment", "save_metric"].includes(mode)) {
535
+ throw new Error("Flag --operation-mode must be one of: save_feature, save_traffic_layer, save_experiment, save_metric");
536
+ }
537
+ readRequiredObject(ctx, "req");
538
+ },
539
+ buildInput: (ctx) => ({
540
+ project_id: ctx.num("project-id"),
541
+ operation_mode: ctx.str("operation-mode"),
542
+ req: readRequiredObject(ctx, "req")
543
+ })
544
+ });
545
+
546
+ // src/commands/te-experiment/report/metric-trend.ts
547
+ var reportMetricTrend = createExperimentCapabilityCommand({
548
+ resource: "report",
549
+ command: "metric-trend",
550
+ capabilityId: "experiment.report.metric-trend",
551
+ description: "Query an experiment metric trend report for a date range.",
552
+ flags: [
553
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
554
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
555
+ { name: "metric-id", type: "string", required: true, desc: "Metric ID." },
556
+ { name: "start-time", type: "string", required: true, desc: "Start date in yyyy-MM-dd format." },
557
+ { name: "end-time", type: "string", required: true, desc: "End date in yyyy-MM-dd format." },
558
+ {
559
+ name: "request-id",
560
+ type: "string",
561
+ required: false,
562
+ desc: "Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted."
563
+ },
564
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." }
565
+ ],
566
+ risk: "read",
567
+ buildInput: (ctx) => {
568
+ const input = {
569
+ project_id: ctx.num("project-id"),
570
+ exp_id: ctx.str("exp-id"),
571
+ metric_id: ctx.str("metric-id"),
572
+ start_time: ctx.str("start-time"),
573
+ end_time: ctx.str("end-time")
574
+ };
575
+ addOptionalString(input, "request_id", ctx.str("request-id"));
576
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
577
+ return input;
578
+ }
579
+ });
580
+
581
+ // src/commands/te-experiment/report/sample-size.ts
582
+ var reportSampleSize = createExperimentCapabilityCommand({
583
+ resource: "report",
584
+ command: "sample-size",
585
+ capabilityId: "experiment.report.sample-size",
586
+ description: "Query an experiment sample-size report for a date range.",
587
+ flags: [
588
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
589
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
590
+ { name: "start-time", type: "string", required: true, desc: "Start date in yyyy-MM-dd format." },
591
+ { name: "end-time", type: "string", required: true, desc: "End date in yyyy-MM-dd format." },
592
+ {
593
+ name: "request-id",
594
+ type: "string",
595
+ required: false,
596
+ desc: "Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted."
597
+ },
598
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." },
599
+ { name: "by-hour", type: "boolean", required: false, desc: "Break results down by hour." }
600
+ ],
601
+ risk: "read",
602
+ buildInput: (ctx) => {
603
+ const input = {
604
+ project_id: ctx.num("project-id"),
605
+ exp_id: ctx.str("exp-id"),
606
+ start_time: ctx.str("start-time"),
607
+ end_time: ctx.str("end-time")
608
+ };
609
+ addOptionalString(input, "request_id", ctx.str("request-id"));
610
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
611
+ addOptionalBoolean(input, ctx, "by-hour", "by_hour");
612
+ return input;
613
+ }
614
+ });
615
+
616
+ // src/commands/te-experiment/report/summary.ts
617
+ var reportSummary = createExperimentCapabilityCommand({
618
+ resource: "report",
619
+ command: "summary",
620
+ capabilityId: "experiment.report.summary",
621
+ description: "Query an experiment report summary.",
622
+ flags: [
623
+ { name: "project-id", type: "number", required: true, alias: "p", desc: "Numeric project ID." },
624
+ { name: "exp-id", type: "string", required: true, desc: "Experiment ID." },
625
+ { name: "force-refresh", type: "boolean", required: false, desc: "Force refresh report data." }
626
+ ],
627
+ risk: "read",
628
+ buildInput: (ctx) => {
629
+ const input = {
630
+ project_id: ctx.num("project-id"),
631
+ exp_id: ctx.str("exp-id")
632
+ };
633
+ addOptionalBoolean(input, ctx, "force-refresh", "force_refresh");
634
+ return input;
635
+ }
636
+ });
637
+
469
638
  // src/commands/te-experiment/traffic-layer/batch-delete.ts
470
639
  var trafficLayerBatchDelete = createExperimentCapabilityCommand({
471
640
  resource: "traffic-layer",
@@ -541,10 +710,15 @@ var commands = [
541
710
  experimentUpdateGroup,
542
711
  experimentBatchDelete,
543
712
  operationLogQuery,
713
+ saveBuildGuide,
714
+ saveValidate,
544
715
  trafficLayerSave,
545
716
  trafficLayerGet,
546
717
  trafficLayerList,
547
718
  trafficLayerBatchDelete,
719
+ reportSummary,
720
+ reportSampleSize,
721
+ reportMetricTrend,
548
722
  metricSave,
549
723
  metricGet,
550
724
  metricList,
@@ -583,6 +757,11 @@ export {
583
757
  metricList,
584
758
  metricSave,
585
759
  operationLogQuery,
760
+ reportMetricTrend,
761
+ reportSampleSize,
762
+ reportSummary,
763
+ saveBuildGuide,
764
+ saveValidate,
586
765
  trafficLayerBatchDelete,
587
766
  trafficLayerGet,
588
767
  trafficLayerList,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  kbApi,
3
3
  kbUpload
4
- } from "./chunk-3KI3RRXX.js";
5
- import "./chunk-E7UXXHO3.js";
6
- import "./chunk-IR4ZLVPW.js";
7
- import "./chunk-V6FR6WTW.js";
8
- import "./chunk-24BAVOX3.js";
9
- import "./chunk-LYVNONC4.js";
4
+ } from "./chunk-VTXHDCBW.js";
5
+ import "./chunk-Z3OXWCIA.js";
6
+ import "./chunk-YV52FB5G.js";
7
+ import "./chunk-GJJA4CQZ.js";
8
+ import "./chunk-AXDXJTPC.js";
9
+ import "./chunk-JHENBQ5B.js";
10
10
 
11
11
  // src/commands/te-kb/query.ts
12
12
  var API_PATH = "/agent/api/external/knowledge-bases/query";
@@ -2,13 +2,13 @@ import {
2
2
  callMcpTool,
3
3
  parseMcpResult,
4
4
  resolveMcpUrl
5
- } from "./chunk-CPVTECJ3.js";
6
- import "./chunk-LCXU3AAT.js";
7
- import "./chunk-E7UXXHO3.js";
8
- import "./chunk-IR4ZLVPW.js";
9
- import "./chunk-V6FR6WTW.js";
10
- import "./chunk-24BAVOX3.js";
11
- import "./chunk-LYVNONC4.js";
5
+ } from "./chunk-MVDZ7DBQ.js";
6
+ import "./chunk-NBPKWKRA.js";
7
+ import "./chunk-Z3OXWCIA.js";
8
+ import "./chunk-YV52FB5G.js";
9
+ import "./chunk-GJJA4CQZ.js";
10
+ import "./chunk-AXDXJTPC.js";
11
+ import "./chunk-JHENBQ5B.js";
12
12
 
13
13
  // src/commands/te-meta/shared.ts
14
14
  function createMcpCommand(config) {
@@ -2,13 +2,13 @@ import {
2
2
  callMcpTool,
3
3
  parseMcpResult,
4
4
  resolveMcpUrl
5
- } from "./chunk-3P3562ZX.js";
6
- import "./chunk-LCXU3AAT.js";
7
- import "./chunk-E7UXXHO3.js";
8
- import "./chunk-IR4ZLVPW.js";
9
- import "./chunk-V6FR6WTW.js";
10
- import "./chunk-24BAVOX3.js";
11
- import "./chunk-LYVNONC4.js";
5
+ } from "./chunk-DT6Y3TD7.js";
6
+ import "./chunk-NBPKWKRA.js";
7
+ import "./chunk-Z3OXWCIA.js";
8
+ import "./chunk-YV52FB5G.js";
9
+ import "./chunk-GJJA4CQZ.js";
10
+ import "./chunk-AXDXJTPC.js";
11
+ import "./chunk-JHENBQ5B.js";
12
12
 
13
13
  // src/commands/te-meta/shared.ts
14
14
  function createMcpCommand(config) {
@@ -6,14 +6,14 @@ import {
6
6
  putToMainApp,
7
7
  tryLoadTeAgentSandboxCredentials,
8
8
  uploadToMainApp
9
- } from "./chunk-J7MZHDHQ.js";
9
+ } from "./chunk-VKD5WQKN.js";
10
10
  import {
11
11
  safeJsonParse
12
- } from "./chunk-V6FR6WTW.js";
12
+ } from "./chunk-GJJA4CQZ.js";
13
13
  import {
14
14
  CliValidationError
15
- } from "./chunk-24BAVOX3.js";
16
- import "./chunk-LYVNONC4.js";
15
+ } from "./chunk-AXDXJTPC.js";
16
+ import "./chunk-JHENBQ5B.js";
17
17
 
18
18
  // src/commands/te-system/shared.ts
19
19
  import { readFileSync } from "fs";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  getAuthHeaders,
3
3
  kbApi
4
- } from "./chunk-3KI3RRXX.js";
4
+ } from "./chunk-VTXHDCBW.js";
5
5
  import {
6
6
  printError,
7
7
  printOutput
8
- } from "./chunk-KTYR3U6D.js";
9
- import "./chunk-E7UXXHO3.js";
10
- import "./chunk-IR4ZLVPW.js";
11
- import "./chunk-V6FR6WTW.js";
12
- import "./chunk-24BAVOX3.js";
13
- import "./chunk-LYVNONC4.js";
8
+ } from "./chunk-YTG6Q75E.js";
9
+ import "./chunk-Z3OXWCIA.js";
10
+ import "./chunk-YV52FB5G.js";
11
+ import "./chunk-GJJA4CQZ.js";
12
+ import "./chunk-AXDXJTPC.js";
13
+ import "./chunk-JHENBQ5B.js";
14
14
 
15
15
  // src/commands/te-team/shared.ts
16
16
  var API_PREFIX = process.env.AE_API_PREFIX ?? "/agent";
@@ -7,16 +7,18 @@ import {
7
7
  printError,
8
8
  printOutput,
9
9
  recordVersionSyncResult
10
- } from "./chunk-KTYR3U6D.js";
10
+ } from "./chunk-YTG6Q75E.js";
11
11
  import {
12
12
  peekCliToken
13
- } from "./chunk-E7UXXHO3.js";
14
- import "./chunk-IR4ZLVPW.js";
13
+ } from "./chunk-Z3OXWCIA.js";
14
+ import {
15
+ missingAeHostHint
16
+ } from "./chunk-YV52FB5G.js";
15
17
  import {
16
18
  getActiveHost,
17
19
  normalizeUrl
18
- } from "./chunk-V6FR6WTW.js";
19
- import "./chunk-LYVNONC4.js";
20
+ } from "./chunk-GJJA4CQZ.js";
21
+ import "./chunk-JHENBQ5B.js";
20
22
 
21
23
  // src/commands/update.ts
22
24
  var HOST_OPTION_DESC = "Override active AE host URL (e.g., https://ta.thinkingdata.cn)";
@@ -73,7 +75,7 @@ async function resolveTargetVersion(program, opts) {
73
75
  }
74
76
  const host = resolveUpdateHost(program, opts);
75
77
  if (!host) {
76
- failUpdate("No AE host configured.", "Run: ae-cli config set-host <url>, or pass --target <version>.");
78
+ failUpdate("No AE host configured.", missingAeHostHint("Alternatively, pass --target <version>."));
77
79
  return null;
78
80
  }
79
81
  const token = peekCliToken(host);