@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,8 +1,10 @@
1
1
  # ae-engage engage-setting channel create
2
2
 
3
- > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel create`
3
+ > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel create` · Capability id: `engage-setting.channel.create`
4
4
 
5
- Create a new Engage push channel.
5
+ Create a new Engage **运营设置** push channel (not config-center channels; those use `engage-scene config-channel`).
6
+
7
+ **First decide channel kind:** Webhook (`channelType=1`) and Client (`channelType=3`) share the same CLI command and outer `--req` fields, but **`config` / `pushIdType` / custom-param prefixes differ**. Do not reuse a webhook payload for client (or the reverse).
6
8
 
7
9
  ## Flags
8
10
 
@@ -11,67 +13,194 @@ Create a new Engage push channel.
11
13
  | `--project-id` / `-p` | number | Yes | Project ID |
12
14
  | `--req` | json | Yes | Channel creation request JSON object |
13
15
 
14
- ## `--req` Object Fields
16
+ ## `--req` Object Fields (common)
15
17
 
16
18
  | Field | Type | Required | Description |
17
19
  |------|------|------|------|
18
- | `channelType` | number | Yes | channel type |
19
- | `channelSubBizType` | string | Yes | channel subtype, for example `webhook`、`fcm`、`aurora` |
20
+ | `channelType` | number | Yes | `1` webhook · `3` client (see below) |
21
+ | `channelSubBizType` | string | Yes | must match type: `webhook` or `client` |
20
22
  | `channelName` | string | Yes | channel name |
21
- | `pushIdType` | string | Yes | push target ID field name |
22
- | `config` | string | Yes | channel config JSON string |
23
- | `enableTouchEvent` | number | Yes | touch event switch |
24
- | `eventClickName` | string | Yes | click event name |
25
- | `eventDeliveryName` | string | Yes | delivery event name |
26
- | `touchEventSource` | string | Yes | touch event source |
23
+ | `pushIdType` | string | Yes | prefixed property code **rules differ by channel kind** |
24
+ | `config` | string | Yes | channel config JSON **string** — **shape differs by channel kind** |
25
+ | `enableTouchEvent` | number | Yes | reach funnel: `0` off · `1` on |
26
+ | `eventClickName` | string | Yes when funnel on | click event (e.g. `ops_click`) |
27
+ | `eventDeliveryName` | string | Yes when funnel on | delivery event (e.g. `ops_view`) |
28
+ | `touchEventSource` | string | Yes | usually `custom` for custom event names |
27
29
 
28
- The outer Capability input uses `project_id` and `req`; fields inside `req` keep the native camelCase DTO shape in this table. The Hermes Capability handler assigns the outer `--project-id` to `req.projectId`, so you do not need to fill it manually and the outer value takes precedence.
30
+ The outer Capability input uses `project_id` and `req`; fields inside `req` keep the native camelCase DTO shape. The Hermes Capability handler assigns the outer `--project-id` to `req.projectId`.
29
31
 
30
32
  ## Response shape
31
33
 
32
- The created channel is under `data.item`; its response keys recursively use snake_case, such as
33
- `channel_id`, `channel_status`, and `channel_type`.
34
+ The created channel is under `data.item`; response keys recursively use snake_case (`channel_id`, `channel_status`, `channel_type`).
34
35
 
35
- ## Enum Notes
36
+ ## Webhook vs Client (read this first)
36
37
 
37
- ### `req.channelType`
38
+ | | **Webhook** | **Client** |
39
+ |--|-------------|------------|
40
+ | `channelType` | `1` | `3` |
41
+ | `channelSubBizType` | `webhook` | `client` |
42
+ | `config.url` | **HTTP(S) callback URL** (server endpoint that receives the push) | **Client config key / scene id** (e.g. `popup`, `abtest`, `difficulty_ratio`) — **not** an `http://` URL |
43
+ | `pushIdType` | Prefer **`user:`** user properties (e.g. `user:#account_id`) | **`user:`** or **`client:`** (e.g. `user:#account_id`, `client:#distinct_id`) |
44
+ | `config.userParamsList[].columnName` | Prefer **`user:`** only (validated against user dispatch props) | **`user:`** and/or **`client:`** (validated against user props + client-param list) |
45
+ | `config.authConfig` | Optional HTTP auth (`enable` / `secretKey` / `secretType`) | Usually omit / unused |
46
+ | `config.paramsList` | Content template — same type enum for both | Same |
47
+ | Reach funnel | Same outer fields | Same |
38
48
 
39
- - `1`: `WEBHOOK`
40
- - `2`: `APP_PUSH`
41
- - `3`: `CLIENT_PUSH`
42
- - `4`: `WECHAT`
43
- - `5`: `DOU_YIN`
49
+ Prefix convention (aligned with 配置中心通道管理):
44
50
 
45
- ### `req.channelSubBizType`
51
+ - User property → `user:<prop_name>` (e.g. `user:#account_id`, `user:city`)
52
+ - Client parameter → `client:<column_name>` (e.g. `client:#os`, `client:#distinct_id`)
53
+ - Never pass bare `#account_id` / `city` for `pushIdType` or `columnName`
46
54
 
47
- Common values are listed below and should usually match `channelType`:
55
+ ## Preflight
48
56
 
49
- - `webhook`: Webhook channel
50
- - `fcm`: App Push, Firebase Cloud Messaging
51
- - `aurora`: App Push, Aurora
52
- - `apns`: App Push, Apple Push Notification Service
53
- - `client`: Client Push
54
- - `wechat_mini_game`: WeChat mini game
55
- - `dou_yin_recommended_game_card`: Douyin recommended game card
57
+ ```bash
58
+ # User properties (both kinds; required for webhook custom params)
59
+ ae-cli analysis-meta property list --project-id <id> --scope user --query <kw> --limit 50
56
60
 
57
- ### `req.enableTouchEvent`
61
+ # Client parameters (client channel pushId / custom params)
62
+ ae-cli engage-setting client-param list --project-id <id>
58
63
 
59
- - `0`: disable touch events
60
- - `1`: enable touch events
64
+ # Optional: copy a real config shape
65
+ ae-cli engage-setting channel list --project-id <id>
66
+ ae-cli engage-setting channel get --project-id <id> --channel-id <id>
67
+ ```
61
68
 
62
- ## Additional Constraints
69
+ If a property / client-param is not found after list/get, stop — do not invent codes.
63
70
 
64
- - `req.config` must be a JSON string, not a JSON object.
65
- - `req.channelSubBizType` should match the actual channel capability; for example, when `channelType=1`, `webhook` is usually used.
66
- - If delivery or click callbacks are required, also check that `eventDeliveryName`, `eventClickName`, and `touchEventSource` are complete.
71
+ ---
67
72
 
68
- ## Safety Constraints
73
+ ## A. Webhook channel
74
+
75
+ ```text
76
+ channelType=1, channelSubBizType=webhook
77
+ ```
78
+
79
+ ### Webhook `config` JSON (stringified into `req.config`)
80
+
81
+ ```json
82
+ {
83
+ "url": "https://example.com/hook",
84
+ "paramsList": [
85
+ { "key": "title", "keyName": "标题", "type": "STRING", "required": 0 },
86
+ { "key": "body", "keyName": "动态正文", "type": "TEXT", "required": 0, "tips": "$[user:city]" }
87
+ ],
88
+ "userParamsList": [
89
+ {
90
+ "key": "uid",
91
+ "columnName": "user:#account_id",
92
+ "defaultValue": "-",
93
+ "columnDesc": "账号 ID"
94
+ }
95
+ ],
96
+ "authConfig": { "enable": false }
97
+ }
98
+ ```
69
99
 
70
- This command is a **write operation** and creates a new channel. Check that the `--req` fields are complete before executing.
100
+ | Field | Required | Notes |
101
+ |-------|----------|-------|
102
+ | `url` | Yes | Real HTTP(S) webhook endpoint |
103
+ | `paramsList` | No | Content template definitions |
104
+ | `userParamsList` | No | Custom params; `columnName` = `user:…`; `defaultValue` must be non-blank |
105
+ | `authConfig` | No | When `enable=true`, `secretKey` required |
71
106
 
72
- ## Examples
107
+ Do **not** put `client:…` in webhook `userParamsList` unless you have confirmed the environment accepts it — create validation uses **user** dispatch props.
108
+
109
+ ### Webhook example
73
110
 
74
111
  ```bash
75
112
  ae-cli engage-setting channel create --project-id 1 \
76
- --req '{"channelType":1,"channelSubBizType":"webhook","channelName":"demo","pushIdType":"user_id","config":"{}","enableTouchEvent":0,"eventClickName":"","eventDeliveryName":"","touchEventSource":""}'
113
+ --req '{"channelType":1,"channelSubBizType":"webhook","channelName":"demo_webhook","pushIdType":"user:#account_id","config":"{\"url\":\"https://example.com/hook\",\"paramsList\":[{\"key\":\"title\",\"keyName\":\"标题\",\"type\":\"STRING\",\"required\":0}],\"userParamsList\":[{\"key\":\"city\",\"columnName\":\"user:city\",\"defaultValue\":\"-\"}],\"authConfig\":{\"enable\":false}}","enableTouchEvent":1,"eventDeliveryName":"ops_view","eventClickName":"ops_click","touchEventSource":"custom"}'
114
+ ```
115
+
116
+ ---
117
+
118
+ ## B. Client channel
119
+
120
+ ```text
121
+ channelType=3, channelSubBizType=client
77
122
  ```
123
+
124
+ ### Client `config` JSON (stringified into `req.config`)
125
+
126
+ ```json
127
+ {
128
+ "url": "popup",
129
+ "paramsList": [
130
+ { "key": "messageType", "keyName": "消息类型", "type": "NUM", "required": 0 },
131
+ {
132
+ "key": "gifts",
133
+ "keyName": "礼包",
134
+ "type": "OBJ_ARRAY",
135
+ "required": 0,
136
+ "objArray": [
137
+ { "key": "gift_name", "keyName": "道具名", "type": "STRING", "required": 0 },
138
+ { "key": "count", "keyName": "数量", "type": "NUM", "required": 0 }
139
+ ]
140
+ }
141
+ ],
142
+ "userParamsList": [
143
+ {
144
+ "key": "os",
145
+ "columnName": "client:#os",
146
+ "defaultValue": "-",
147
+ "columnDesc": "操作系统"
148
+ },
149
+ {
150
+ "key": "city",
151
+ "columnName": "user:city",
152
+ "defaultValue": "-",
153
+ "columnDesc": "城市"
154
+ }
155
+ ]
156
+ }
157
+ ```
158
+
159
+ | Field | Required | Notes |
160
+ |-------|----------|-------|
161
+ | `url` | Yes | **Client scene / config key** (string id like `popup`, `abtest`) — not an HTTP URL |
162
+ | `paramsList` | No | Content template (same type enum as webhook) |
163
+ | `userParamsList` | No | `columnName` may be `user:…` **or** `client:…`; `defaultValue` non-blank |
164
+ | `authConfig` | No | Usually omit |
165
+
166
+ `pushIdType` examples: `user:#account_id`, `client:#distinct_id` (discover client codes via `client-param list`).
167
+
168
+ ### Client example
169
+
170
+ ```bash
171
+ ae-cli engage-setting channel create --project-id 1 \
172
+ --req '{"channelType":3,"channelSubBizType":"client","channelName":"demo_client","pushIdType":"client:#distinct_id","config":"{\"url\":\"popup\",\"paramsList\":[{\"key\":\"type\",\"keyName\":\"场景\",\"type\":\"STRING\",\"required\":0}],\"userParamsList\":[{\"key\":\"os\",\"columnName\":\"client:#os\",\"defaultValue\":\"-\"}]}","enableTouchEvent":0,"eventClickName":"","eventDeliveryName":"","touchEventSource":"custom"}'
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Content template types (`paramsList[].type`) — both kinds
178
+
179
+ | type | Meaning |
180
+ |------|---------|
181
+ | `STRING` | 文本 |
182
+ | `TEXT` | 动态文本 (`$[user:…]` / `$[client:…]` placeholders) |
183
+ | `NUM` | 数值 |
184
+ | `OBJ_ARRAY` | 对象组 (`objArray` children required) |
185
+ | `DATE` | 日期 |
186
+ | `DATE_TIME` | 时间 |
187
+ | `ARRAY` | 列表 |
188
+ | `SINGLE_SELECT` | 单选下拉 (**requires** existing config-table `tableId`) |
189
+ | `RADIO` | 单选 |
190
+
191
+ `required`: `0` optional · `1` required. `OBJ_ARRAY` children: `STRING` / `NUM` / `DATE` / `DATE_TIME` / `TEXT` / `SINGLE_SELECT` only.
192
+
193
+ ## Other channel types
194
+
195
+ `channelType` also supports `2` APP_PUSH (`fcm` / `aurora` / `apns`), `4` WECHAT, `5` DOU_YIN — each has its own `config` DTO. Discover with `channel get` on an existing channel of that subtype before creating; do not invent FCM/APNs secrets.
196
+
197
+ ## Additional Constraints
198
+
199
+ - `req.config` must be a **JSON string**, not a nested object in the CLI flag.
200
+ - Match `channelSubBizType` to `channelType` (`1`↔`webhook`, `3`↔`client`).
201
+ - When `enableTouchEvent=1`, set `touchEventSource` plus delivery/click event names.
202
+ - For webhook tests, prefer a known mock URL from `channel get` rather than inventing production endpoints.
203
+
204
+ ## Safety Constraints
205
+
206
+ This command is a **write operation**. Verify `--req` completeness and the correct webhook vs client rules before executing.
@@ -14,20 +14,27 @@ Use this sequence when creating or updating a task draft:
14
14
 
15
15
  1. Query channels with `ae-cli engage-setting channel list --project-id <projectId>`.
16
16
  2. Call `ae-cli engage-task task build-save-guide --project-id <projectId> --req '{...}'`.
17
- 3. If the guide says QP-derived fields are required, fetch the skill definition first:
18
-
19
- ```bash
20
- ae-cli engage-setting query cluster-qp-skill --project-id <projectId>
21
- # optional selectors:
22
- ae-cli engage-setting query cluster-qp-skill --project-id <projectId> --response-mode full --condition-subtype all
23
- ```
24
-
25
- Use the returned `skill` text to build:
26
-
27
- - `targetConfig.qp`
28
- - `triggerConfig.triggerRule` (required for `triggerType=3/4/5`)
29
- - `clientConfig.clientQp`
30
- - `completionIndicatorDef.event`
17
+ 3. Use semantic definitions for audience, trigger, and completion fields:
18
+
19
+ - `targetConfig.definitionRequest`
20
+ - `triggerConfig.triggerDefinition` (required for `triggerType=3/4/5`)
21
+ - `completionIndicatorDef.completionIndicators[].eventDefinition`
22
+
23
+ Build event primitives from `ae-analysis` user-cluster / audience models. Hermes wraps those
24
+ primitives in the task-specific envelope selected by `channelType`, `triggerType`, and
25
+ `eventTriggerType`, then validates the final persisted QP before save. Never construct persisted
26
+ execution QP. Follow the documented closed semantic shapes: unknown fields are rejected, and a
27
+ property `field` may be a technical-name string or a `{name,type}` reference.
28
+ Every custom-audience `event` and `behavior_sequence` requires its own `time_range`. For
29
+ `recent` and `previous`, use a positive integer `value` and only `unit=day`; `custom` requires
30
+ both `start_time` and `end_time`.
31
+
32
+ Custom audiences support `behavior_sequence` nodes, including sequence/step windows, step
33
+ filters, `completed`, and `relative_to_first`. A task `get` may return top-level `compound`
34
+ nodes when the stored member-group, event-group, and outer relations differ. Preserve those
35
+ compounds when reusing `definition_request`; flattening them changes audience semantics.
36
+ For the second sequence step, omit `relative_to_first` or set it to `false`; use `true` only
37
+ from the third step onward when its window must be measured from step 1.
31
38
 
32
39
  For existing-cluster audiences (`targetClusterType=2`), you may copy server-authored definitions via:
33
40
 
@@ -41,11 +48,8 @@ ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<cl
41
48
  Important:
42
49
 
43
50
  - Do not treat audience creation as a fixed preflight step.
44
- - Create/read the audience only when the guide indicates that you need to construct:
45
- - `targetConfig.qp`
46
- - `triggerConfig.triggerRule`
47
- - `clientConfig.clientQp`
48
- - `completionIndicatorDef.event`
51
+ - Discover event/property metadata when semantic definitions reference those fields.
52
+ - Omit the server-authored `clientConfig.clientQp`; partial updates preserve it.
49
53
 
50
54
  ---
51
55
 
@@ -64,6 +68,7 @@ Common request patterns:
64
68
  ```bash
65
69
  ae-cli engage-task task build-save-guide --project-id 1 --req '{}'
66
70
  ae-cli engage-task task build-save-guide --project-id 1 --req '{"context":{"triggerType":2,"channelId":"channel_123"}}'
71
+ ae-cli engage-task task build-save-guide --project-id 1 --req '{"context":{"channelType":2,"triggerType":3,"eventTriggerType":2}}'
67
72
  ae-cli engage-task task build-save-guide --project-id 1 --req '{"draft":{"baseInfo":{"taskName":"Demo Task"}}}'
68
73
  ```
69
74
 
@@ -92,6 +97,7 @@ Use `context` when you want scenario-specific guidance without writing a partial
92
97
  Typical fields:
93
98
 
94
99
  - `triggerType`
100
+ - `eventTriggerType`
95
101
  - `targetClusterType`
96
102
  - `channelType`
97
103
  - `channelId`
@@ -104,7 +110,9 @@ Example:
104
110
  ```json
105
111
  {
106
112
  "context": {
107
- "triggerType": 2,
113
+ "channelType": 2,
114
+ "triggerType": 3,
115
+ "eventTriggerType": 2,
108
116
  "targetClusterType": 2,
109
117
  "channelId": "channel_123"
110
118
  }
@@ -190,7 +198,7 @@ This section describes the high-level contract:
190
198
 
191
199
  - final tool is `save_task`
192
200
  - required preflight is `query_channel_list -> build_task_save_guide`
193
- - QP-derived fields require a server-authored audience: direct `analysis user-cluster create`, followed by `analysis user-cluster get`
201
+ - audience, trigger, and completion conditions use semantic definitions
194
202
  - `save_task.req` must be a grouped JSON object
195
203
 
196
204
  ### 4.6 `scenario`
@@ -224,6 +232,8 @@ It includes:
224
232
 
225
233
  - grouped block rules
226
234
  - structured conditional rules
235
+ - the server/client × `triggerType` × `eventTriggerType` combination matrix
236
+ - type-specific aggregate, continuous, ordered, and every-completion event shapes
227
237
  - related-parameter rules
228
238
  - unsupported fields / values / combinations
229
239
  - `channelContentSchema`
@@ -248,6 +258,38 @@ Do not invent free-form content items such as:
248
258
 
249
259
  Instead, use the valid item structure and put message text into `value`.
250
260
 
261
+ #### `fieldRules.blocks.triggerConfig.triggerDefinitionSchema`
262
+
263
+ For event-triggered tasks, read all of these fields before constructing `triggerDefinition`:
264
+
265
+ - `combinationMatrix`
266
+ - `ruleFields`
267
+ - `eventShapes`
268
+ - `examples`
269
+
270
+ The guide treats the A rule as a discriminated envelope:
271
+
272
+ - `eventTriggerType=0`: aggregate events
273
+ - `eventTriggerType=1`: exactly one count/eq event with value at least 2, plus optional blacklist
274
+ - `eventTriggerType=2`: at least two ordered steps with `eventDefinition` and `hasDone`
275
+ - `eventTriggerType=3`: client-side count/eq/1 events with `eventTriggerCaliberType`
276
+
277
+ Do not copy the accumulated example and only change `eventTriggerType`. Hermes rejects a final QP
278
+ whose event structure does not match its envelope.
279
+
280
+ #### `fieldRules.blocks.controlConfig.completionIndicatorDef.filterPropertySelectTypes`
281
+
282
+ Treat this as the source of truth for completion target and experiment main-goal event-filter
283
+ property types:
284
+
285
+ - `allowed` lists the supported metadata `select_type` values.
286
+ - `excluded` lists values that must not be used.
287
+ - `datetime` is excluded because the task completion-indicator editor cannot display it.
288
+
289
+ Apply this rule only to
290
+ `completionIndicatorDef.completionIndicators[].eventDefinition.filters`. Trigger-event filters have
291
+ their own scenario rules and are not subject to this completion-filter restriction.
292
+
251
293
  ### 4.9 `handoff`
252
294
 
253
295
  This is the final section before `save_task`.
@@ -278,14 +320,9 @@ Recommended usage pattern:
278
320
  3. read `fieldRules.channelContentSchema`
279
321
  4. read `handoff.reqTemplate`
280
322
  5. fix everything in `blockingPlaceholders`
281
- 6. if the guide points to an audience or QP-derived fields, call:
282
-
283
- ```bash
284
- ae-cli analysis user-cluster create --project-id <projectId> --cluster-name <condition_cluster_name> --display-name <display_name> --definition-request '<semantic-definition-json>'
285
- ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<condition_cluster_name>"]'
286
- ```
287
-
288
- 7. prefer the created cluster reference; only copy server-authored fields from `user-cluster get` when the guide explicitly requires QP-derived fields
323
+ 6. if the guide points to an audience, trigger, or completion condition, add the semantic
324
+ definition directly
325
+ 7. omit `clientConfig.clientQp`; partial updates preserve the server-authored value
289
326
  8. call `engage-task task save`
290
327
 
291
328
  ---
@@ -19,8 +19,8 @@ ae-cli engage-setting channel update-config \
19
19
  | `--channel-id` | Yes | Channel ID to update. |
20
20
  | `--enable-touch-event` | Yes | Reach funnel toggle: `1` enabled, `0` disabled. |
21
21
  | `--channel-name` | No | New channel name. |
22
- | `--push-id-type` | No | User property used as the push ID. |
23
- | `--config` | No | Channel-specific JSON config string (see ChannelConfigDTO). |
22
+ | `--push-id-type` | No | Prefixed push ID: webhook prefers `user:…`; client allows `user:…` or `client:…` (see `add-channel.md`). |
23
+ | `--config` | No | Channel JSON string. Webhook `url` = HTTP(S); client `url` = scene key. Custom `columnName` prefixes differ — see `add-channel.md`. |
24
24
  | `--touch-event-source` | No | Reach event source. |
25
25
  | `--event-delivery-name` | No | Actual delivery event name. |
26
26
  | `--event-click-name` | No | Click event name. |
@@ -33,4 +33,5 @@ ae-cli engage-setting channel update-config \
33
33
 
34
34
  - Use this command when the user asks to edit/update an existing channel's name, config, push-id type, or reach-funnel settings.
35
35
  - `--config` is the channel-specific JSON config; discover the existing config with `ae-cli engage-setting channel get` first rather than inventing it.
36
+ - Keep webhook vs client rules from `add-channel.md` when editing `url` / `pushIdType` / `userParamsList`.
36
37
  - Risk is `write`; ordinary update, no confirmation gate.
@@ -1,142 +1,115 @@
1
- # engage-setting common-metric
1
+ # Common metric semantic definitions
2
2
 
3
- > Capability ids: `engage-setting.common-metric.{list,get,create,update,delete}` · Domain: `engage`.
4
- > Auth: read uses `opsViewSetting` (list also allows `opsViewOperationTask`); write/delete use `opsEditSetting`.
3
+ > Trigger keywords: common metric, shared metric · Capability ids: `engage-setting.common-metric.{list,get,create,update,delete}` · Permission: `opsEditSetting`.
4
+
5
+ Common metric capabilities expose semantic event/formula definitions. Do not submit or reuse `metric_qp`, `Axxx`, display metadata, formula dependency internals, or property metadata.
6
+ Metric definitions and formula dependencies reject unknown fields. Event filter `field` accepts
7
+ either a technical-name string or `{"name":"...","type":"event_property"}`.
8
+
9
+ When metadata reports an event property as `array_row`, express it as an `object_group` filter
10
+ with `any_satisfy`, `none_satisfy`, or `all_satisfy`; its nested `conditions.items` may reference
11
+ only child properties of that parent. Flat filters on the `array_row` parent are rejected before
12
+ the metric is saved.
5
13
 
6
14
  ## Commands
7
15
 
8
16
  ```bash
9
- # List common metrics
10
17
  ae-cli engage-setting common-metric list --project-id <project_id>
11
-
12
- # Get a common metric detail
13
18
  ae-cli engage-setting common-metric get --project-id <project_id> --metric-name <name>
14
-
15
- # Create a PRESET common metric (metric-type must be 1)
16
- ae-cli engage-setting common-metric create \
17
- --project-id <project_id> --metric-type 1 --metric-name <name> --metric-qp '<qp_json>' \
18
- --metric-window-num 1 --metric-window-time-unit day --display-name <display>
19
-
20
- # Update a common metric
21
- ae-cli engage-setting common-metric update \
22
- --project-id <project_id> --metric-type 1 --metric-name <name> --metric-qp '<qp_json>' \
23
- --metric-window-num <num> --metric-window-time-unit day --display-name <display>
24
-
25
- # Delete a common metric (high-risk)
19
+ ae-cli engage-setting common-metric create --project-id <project_id> --metric-type 1 \
20
+ --metric-name <name> --metric-definition '<json>' \
21
+ --metric-window-num 1 --metric-window-time-unit day --display-name <display_name>
22
+ ae-cli engage-setting common-metric update --project-id <project_id> --metric-type 1 \
23
+ --metric-name <name> --metric-definition '<json>' \
24
+ --metric-window-num 1 --metric-window-time-unit day --display-name <display_name>
26
25
  ae-cli engage-setting common-metric delete --project-id <project_id> --metric-name <name> --yes
27
26
  ```
28
27
 
29
- ## Parameters
30
-
31
- ### list
32
-
33
- | Parameter | Required | Description |
34
- |---|---|---|
35
- | `--project-id` / `-p` | Yes | Numeric project ID. |
36
-
37
- ### get / delete
28
+ ## Event metric
38
29
 
39
- | Parameter | Required | Description |
40
- |---|---|---|
41
- | `--project-id` / `-p` | Yes | Numeric project ID. |
42
- | `--metric-name` | Yes | Metric name. |
43
-
44
- ### create / update
45
-
46
- | Parameter | Required | Description |
47
- |---|---|---|
48
- | `--project-id` / `-p` | Yes | Numeric project ID. |
49
- | `--metric-type` | Yes | `1` = PRESET (common metric). **create requires `1`**. Do not use `2` (CUSTOM / task-side). |
50
- | `--metric-name` | Yes | Technical name; prefer `^[a-z][0-9a-z_]{0,79}$`. |
51
- | `--metric-qp` | Yes | Complete metric QP **JSON object string** (`type=0` event or `type=1` formula). |
52
- | `--metric-window-num` | Yes | Window size (integer ≥ 1). |
53
- | `--metric-window-time-unit` | Yes | `minute` / `hour` / `day` (lowercase). |
54
- | `--display-name` | Yes | Display name. |
55
- | `--note` | No | Remark. |
56
- | `--order-id` | No | Sort order (usually omit on setting-page create). |
57
- | `--metric-setting-id` | No | Binding id (task/config metricMap; usually omit on setting-page create). |
58
- | `--metric-params` | No | Params JSON string; for formula metrics often `{"format":"float"}`. |
59
-
60
- ## Output
61
-
62
- - `list`: `data.items` (each with `project_id`, `metric_type`, `metric_name`, `metric_qp`, `metric_window_num`, `metric_window_time_unit`, `note`, `last_editer`, `last_update_time`, `order_id`, `display_name`, `metric_setting_id`, `metric_params`) and `data.total`.
63
- - `get`: `data.metric` — a single metric object with the same fields, or `null`.
64
- - `create` / `update` / `delete`: `data.success`.
65
-
66
- ## Agent workflow (Pattern A: discover → match → assemble QP → write)
67
-
68
- Unlike the Engage console (user picks events in a picker), Agents must discover real project metadata first. Never invent `event_name` / property names / `--metric-qp` placeholders such as `event`.
69
-
70
- ```bash
71
- # 1) Discover candidate events (keyword: payment / recharge / purchase / ...)
72
- ae-cli analysis-meta event list --project-id <project_id> --query <keyword> \
73
- --fields '["event_name","event_desc","authentication_status"]' --limit 20
74
-
75
- # Optional soft hint: project recharge-success event name
76
- ae-cli engage-setting preset-event list --project-id <project_id>
77
- # → data.recharge_event_desc may contain eventName (not a ready metric_qp)
78
-
79
- # 2) If filters are needed, list properties for the matched event
80
- ae-cli analysis-meta property list --project-id <project_id> \
81
- --scope event --event-name <matched_event_name>
82
-
83
- # 3) Assemble a type=0 metric QP object from the matched event, then create
84
- ae-cli engage-setting common-metric create --project-id <project_id> \
85
- --metric-type 1 --metric-name <name> --metric-qp '<qp_json>' \
86
- --metric-window-num 1 --metric-window-time-unit day --display-name <display>
30
+ ```json
31
+ {
32
+ "type": "event",
33
+ "event": "purchase",
34
+ "aggregation": "sum",
35
+ "property": "amount",
36
+ "filters": {
37
+ "relation": "and",
38
+ "items": [
39
+ {
40
+ "field": "currency",
41
+ "operator": "eq",
42
+ "values": ["USD"]
43
+ }
44
+ ]
45
+ }
46
+ }
87
47
  ```
88
48
 
89
- If multiple events remain plausible after discovery, stop and ask the user which `event_name` to use.
90
-
91
- ## `--metric-qp` example (type=0 event analysis)
92
-
93
- Pass as a single JSON **object string**. Minimal shape aligned with the Engage setting-page event metric:
49
+ Object-group filter example:
94
50
 
95
51
  ```json
96
52
  {
97
- "type": 0,
98
- "eventName": "purchase",
99
- "eventDesc": "Purchase",
100
- "eventType": "event",
101
- "analysis": "A100",
102
- "analysisDesc": "Total count",
103
- "analysisParams": "",
104
- "quota": "",
105
- "quotaDesc": "",
106
- "filts": [],
107
- "relation": 1,
108
- "customEvent": "",
109
- "customFilters": [],
110
- "eventNameDisplay": "Purchase total count",
111
- "subTableType": "",
112
- "taPropQuota": {
113
- "analysis": "A100",
114
- "analysisDesc": "Total count",
115
- "analysisParams": "",
116
- "quota": "",
117
- "quotaDesc": ""
53
+ "type": "object_group",
54
+ "field": "equipment_list",
55
+ "operator": "any_satisfy",
56
+ "conditions": {
57
+ "relation": "and",
58
+ "items": [
59
+ {
60
+ "field": "equipment_list.item_level",
61
+ "operator": "gte",
62
+ "values": [10]
63
+ }
64
+ ]
118
65
  }
119
66
  }
120
67
  ```
121
68
 
122
- CLI rejects non-JSON, non-object, and `{}` values before the request is sent.
69
+ Supported aggregations include `total_count`, `user_count`, `per_user_count`, `sum`, `avg`, `avg_per_user`, `max`, `min`, `distinct_count`, `median`, `percentile`, `variance`, and `stddev`.
123
70
 
124
- ## Preflight for config-metric batch-add
71
+ Property aggregations require `property`. `percentile` additionally requires a numeric
72
+ `percentile` greater than `0` and at most `100`:
73
+
74
+ ```json
75
+ {
76
+ "type": "event",
77
+ "event": "purchase",
78
+ "aggregation": "percentile",
79
+ "property": "amount",
80
+ "percentile": 90
81
+ }
82
+ ```
125
83
 
126
- `engage-scene config-metric batch-add --ta-metric-ids` requires TA common metrics to exist in the project. List them first:
84
+ ## Formula metric
127
85
 
128
- ```bash
129
- ae-cli engage-setting common-metric list --project-id <project_id>
86
+ ```json
87
+ {
88
+ "type": "formula",
89
+ "expression": "purchases/refunds",
90
+ "format": "percent",
91
+ "dependencies": [
92
+ {
93
+ "type": "event",
94
+ "key": "purchases",
95
+ "event": "purchase",
96
+ "aggregation": "total_count"
97
+ },
98
+ {
99
+ "type": "event",
100
+ "key": "refunds",
101
+ "event": "refund",
102
+ "aggregation": "total_count"
103
+ }
104
+ ]
105
+ }
130
106
  ```
131
107
 
132
- If `items` is empty, create PRESET metrics with `common-metric create` (Pattern A above) or treat the case as environment-blocked.
108
+ Every dependency requires a non-empty, unique `key`, and every key must be used in
109
+ `expression`. Write bare keys only: use `purchases/refunds`, never `purchases.A100/refunds.A100`.
110
+ Aggregation codes are derived from each dependency. Formula dependencies follow the same
111
+ property and percentile requirements as event metrics.
133
112
 
134
- ## Decision Rules
113
+ Resolve every event and property through `ae-cli analysis-meta event list` and the corresponding property metadata before writing. `get` and `list` return `metric_definition`, `metric_definition_status`, and an optional unavailable reason. Raw metric QP is hidden.
135
114
 
136
- - Use these commands when the user asks to manage common metrics for the analysis workbench.
137
- - Discover existing metric names with `common-metric list` first; never invent names for `get`/`update`/`delete`.
138
- - For create/update, discover events/properties via `ae-analysis` (`analysis-meta event list` / `property list`) before assembling `--metric-qp`.
139
- - `--metric-type` for setting-page common metrics is always `1` (PRESET). create rejects any other value.
140
- - `--metric-window-time-unit` must be lowercase `minute` / `hour` / `day` (not `DAY`).
141
- - `--metric-qp` must be a complete metric QP JSON object; do not pass `{}` or placeholder strings.
142
- - `delete` is `high-risk-write` and requires `--yes` (or interactive confirmation).
115
+ `metric_type=1` remains required for setting-page common metrics. Metric windows remain separate from the semantic definition, and their unit must be `minute` / `hour` / `day`.