@thinkingai/ae-cli 6.0.38 → 6.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) 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-TPORIKRQ.js} +19 -15
  6. package/dist/{capability-YPOQX6PL.js → capability-VQNC5CF7.js} +19 -15
  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 +96 -37
  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-F7V55KVW.js} +333 -105
  46. package/dist/{te-engage-E7F4HTXU.js → te-engage-FMYAYCNV.js} +333 -105
  47. package/dist/{te-kb-E7NSCBRB.js → te-kb-VRMEY3D4.js} +6 -6
  48. package/dist/{te-meta-GBDTMPEL.js → te-meta-53BVXPFI.js} +7 -7
  49. package/dist/{te-meta-ZTLTSHXC.js → te-meta-TOCBPBXI.js} +7 -7
  50. package/dist/{te-system-AH7DMCAQ.js → te-system-XGS5EQIQ.js} +4 -4
  51. package/dist/{te-team-BQ3SKSZV.js → te-team-BZRDV2CM.js} +7 -7
  52. package/dist/{update-DKG6UXEM.js → update-HEDXGOJH.js} +8 -6
  53. package/package.json +4 -1
  54. package/skills/ae-agent/SKILL.md +178 -16
  55. package/skills/ae-agent/references/add-skill.md +22 -10
  56. package/skills/ae-agent/references/edit-skill.md +24 -14
  57. package/skills/ae-agent/references/find-archived-conversations.md +82 -0
  58. package/skills/ae-agent/references/restore-conversation.md +54 -0
  59. package/skills/ae-agent/references/upload-skill.md +24 -14
  60. package/skills/ae-analysis/SKILL.md +1 -1
  61. package/skills/ae-analysis/references/command_index.md +104 -42
  62. package/skills/ae-analysis/references/entity_id_import_options.md +1 -1
  63. package/skills/ae-analysis/references/project_access_detail_get.md +3 -3
  64. package/skills/ae-analysis/references/project_data_power_delete.md +3 -3
  65. package/skills/ae-analysis/references/project_data_power_get.md +3 -3
  66. package/skills/ae-analysis/references/project_data_power_list.md +3 -3
  67. package/skills/ae-analysis/references/project_data_power_upsert.md +3 -3
  68. package/skills/ae-analysis/references/project_entity_create.md +3 -3
  69. package/skills/ae-analysis/references/project_entity_delete.md +3 -3
  70. package/skills/ae-analysis/references/project_entity_event_list.md +3 -3
  71. package/skills/ae-analysis/references/project_entity_get.md +3 -3
  72. package/skills/ae-analysis/references/project_entity_list.md +3 -3
  73. package/skills/ae-analysis/references/project_entity_update.md +3 -3
  74. package/skills/ae-analysis/references/project_function_list.md +3 -3
  75. package/skills/ae-analysis/references/project_info_create.md +25 -0
  76. package/skills/ae-analysis/references/project_info_delete.md +24 -0
  77. package/skills/ae-analysis/references/project_info_get.md +3 -3
  78. package/skills/ae-analysis/references/project_info_list.md +3 -3
  79. package/skills/ae-analysis/references/project_info_update.md +3 -3
  80. package/skills/ae-analysis/references/project_mark_time_create.md +3 -3
  81. package/skills/ae-analysis/references/project_mark_time_delete.md +3 -3
  82. package/skills/ae-analysis/references/project_mark_time_list.md +3 -3
  83. package/skills/ae-analysis/references/project_mark_time_update.md +3 -3
  84. package/skills/ae-analysis/references/project_member_add.md +3 -3
  85. package/skills/ae-analysis/references/project_member_batch_update.md +3 -3
  86. package/skills/ae-analysis/references/project_member_candidate_list.md +3 -3
  87. package/skills/ae-analysis/references/project_member_handover_export.md +3 -3
  88. package/skills/ae-analysis/references/project_member_handover_run.md +3 -3
  89. package/skills/ae-analysis/references/project_member_import.md +3 -3
  90. package/skills/ae-analysis/references/project_member_list.md +3 -3
  91. package/skills/ae-analysis/references/project_member_receiver_list.md +3 -3
  92. package/skills/ae-analysis/references/project_member_remove.md +3 -3
  93. package/skills/ae-analysis/references/project_member_update.md +3 -3
  94. package/skills/ae-analysis/references/project_owner_update.md +3 -3
  95. package/skills/ae-analysis/references/project_permission_binding_list.md +3 -3
  96. package/skills/ae-analysis/references/project_receive_status_update.md +3 -3
  97. package/skills/ae-analysis/references/project_role_delete.md +3 -3
  98. package/skills/ae-analysis/references/project_role_function_list.md +3 -3
  99. package/skills/ae-analysis/references/project_role_get.md +3 -3
  100. package/skills/ae-analysis/references/project_role_list.md +3 -3
  101. package/skills/ae-analysis/references/project_role_upsert.md +3 -3
  102. package/skills/ae-analysis/references/project_role_user_list.md +3 -3
  103. package/skills/ae-analysis/references/project_space_list.md +1 -1
  104. package/skills/ae-analysis/references/project_timezone_get.md +3 -3
  105. package/skills/ae-analysis/references/project_timezone_overview.md +3 -3
  106. package/skills/ae-analysis/references/project_timezone_update.md +3 -3
  107. package/skills/ae-analysis/references/project_user_id_items_update.md +3 -3
  108. package/skills/ae-analysis/references/system_admin_function_list.md +22 -0
  109. package/skills/ae-analysis/references/system_admin_function_update.md +26 -0
  110. package/skills/ae-analysis/references/system_admin_list.md +21 -0
  111. package/skills/ae-analysis/references/system_admin_remove.md +25 -0
  112. package/skills/ae-analysis/references/system_admin_upsert.md +25 -0
  113. package/skills/ae-analysis/references/system_function_list.md +21 -0
  114. package/skills/ae-analysis/references/system_member_add.md +25 -0
  115. package/skills/ae-analysis/references/system_member_candidate_list.md +22 -0
  116. package/skills/ae-analysis/references/system_member_delete.md +25 -0
  117. package/skills/ae-analysis/references/system_member_list.md +24 -0
  118. package/skills/ae-analysis/references/system_member_mfa_unbind.md +25 -0
  119. package/skills/ae-analysis/references/system_member_password_reset.md +32 -0
  120. package/skills/ae-analysis/references/system_member_project_batch_update.md +27 -0
  121. package/skills/ae-analysis/references/system_member_status_update.md +26 -0
  122. package/skills/ae-analysis/references/system_member_update.md +23 -0
  123. package/skills/ae-analysis/references/system_mfa_get.md +21 -0
  124. package/skills/ae-analysis/references/system_mfa_update.md +25 -0
  125. package/skills/ae-analysis/references/system_node_monitor_list.md +24 -0
  126. package/skills/ae-analysis/references/system_oauth2_update.md +22 -0
  127. package/skills/ae-analysis/references/system_ops_alert_contact_delete.md +25 -0
  128. package/skills/ae-analysis/references/system_ops_alert_contact_list.md +23 -0
  129. package/skills/ae-analysis/references/system_ops_alert_contact_test.md +29 -0
  130. package/skills/ae-analysis/references/system_ops_alert_contact_upsert.md +39 -0
  131. package/skills/ae-analysis/references/system_preference_get.md +21 -0
  132. package/skills/ae-analysis/references/system_preference_update.md +22 -0
  133. package/skills/ae-analysis/references/system_project_usage_list.md +28 -0
  134. package/skills/ae-analysis/references/system_query_alert_rule_list.md +21 -0
  135. package/skills/ae-analysis/references/system_query_alert_rule_update.md +26 -0
  136. package/skills/ae-analysis/references/system_query_monitor_overview.md +26 -0
  137. package/skills/ae-analysis/references/system_query_task_cancel.md +25 -0
  138. package/skills/ae-analysis/references/system_query_task_export.md +49 -0
  139. package/skills/ae-analysis/references/system_query_task_get.md +23 -0
  140. package/skills/ae-analysis/references/system_query_task_list.md +35 -0
  141. package/skills/ae-analysis/references/system_query_task_options.md +27 -0
  142. package/skills/ae-analysis/references/system_receiver_address_delete.md +26 -0
  143. package/skills/ae-analysis/references/system_receiver_address_overview.md +21 -0
  144. package/skills/ae-analysis/references/system_receiver_address_project_list.md +21 -0
  145. package/skills/ae-analysis/references/system_receiver_address_promote.md +24 -0
  146. package/skills/ae-analysis/references/system_receiver_address_upsert.md +27 -0
  147. package/skills/ae-analysis/references/system_receiver_detection_get.md +22 -0
  148. package/skills/ae-analysis/references/system_receiver_detection_run.md +22 -0
  149. package/skills/ae-analysis/references/system_receiver_detection_update.md +25 -0
  150. package/skills/ae-analysis/references/system_role_delete.md +26 -0
  151. package/skills/ae-analysis/references/system_role_function_list.md +22 -0
  152. package/skills/ae-analysis/references/system_role_get.md +22 -0
  153. package/skills/ae-analysis/references/system_role_list.md +24 -0
  154. package/skills/ae-analysis/references/system_role_upsert.md +27 -0
  155. package/skills/ae-analysis/references/system_role_user_list.md +22 -0
  156. package/skills/ae-analysis/references/system_seat_list.md +25 -0
  157. package/skills/ae-analysis/references/system_seat_update.md +26 -0
  158. package/skills/ae-analysis/references/system_smtp_delete.md +24 -0
  159. package/skills/ae-analysis/references/system_smtp_get.md +21 -0
  160. package/skills/ae-analysis/references/system_smtp_test.md +22 -0
  161. package/skills/ae-analysis/references/system_smtp_upsert.md +31 -0
  162. package/skills/ae-analysis/references/system_third_party_login_disable.md +25 -0
  163. package/skills/ae-analysis/references/system_third_party_login_list.md +21 -0
  164. package/skills/ae-analysis/references/system_third_party_login_upsert.md +33 -0
  165. package/skills/ae-analysis/references/system_usage_overview.md +21 -0
  166. package/skills/ae-analysis/references/system_usage_trend_export.md +44 -0
  167. package/skills/ae-analysis/references/system_usage_trend_query.md +28 -0
  168. package/skills/ae-dataops/SKILL.md +1 -1
  169. package/skills/ae-dataops/references/dataops-flow-create.md +51 -16
  170. package/skills/ae-engage/SKILL.md +56 -26
  171. package/skills/ae-engage/references/activity-activity.md +3 -0
  172. package/skills/ae-engage/references/activity-approval.md +12 -4
  173. package/skills/ae-engage/references/activity-task.md +21 -6
  174. package/skills/ae-engage/references/activity-topic.md +31 -13
  175. package/skills/ae-engage/references/add-channel.md +170 -41
  176. package/skills/ae-engage/references/build-task-save-guide.md +40 -27
  177. package/skills/ae-engage/references/channel-update-config.md +3 -2
  178. package/skills/ae-engage/references/common-metric.md +48 -120
  179. package/skills/ae-engage/references/flow-detail.md +13 -0
  180. package/skills/ae-engage/references/preset-event.md +12 -32
  181. package/skills/ae-engage/references/save-flow.md +127 -64
  182. package/skills/ae-engage/references/save-task.md +197 -59
  183. package/skills/ae-engage/references/scene-config-metric.md +3 -0
  184. package/skills/ae-engage/references/scene-preset-metric.md +8 -37
  185. package/skills/ae-engage/references/scene-strategy-audience.md +51 -643
  186. package/skills/ae-engage/references/scene-strategy.md +6 -6
  187. package/skills/ae-engage/references/task-detail.md +10 -0
  188. package/skills/ae-engage/references/task-submit-approval.md +45 -0
  189. package/skills/ae-engage/references/validate-flow-node-config.md +1 -1
  190. package/skills/ae-generate-tracking-code/SKILL.md +2 -2
  191. package/skills/ae-metadata/SKILL.md +1 -1
  192. package/dist/config-BSSALXEN.js +0 -128
  193. package/dist/sync-QFP4XFN3.js +0 -485
@@ -52,9 +52,9 @@ When the user mentions a product term below (including common Chinese UI labels)
52
52
  | **Config center** | Engage scene management / config center overview | `engage-scene` | `references/scene-config-item.md` | `scene-config-param.md`, `scene-config-group.md`, `scene-preset-metric.md`, `scene-config-metric.md`, `scene-config-channel.md`, `channel-mgmt.md`, `scene-strategy.md`, `scene-template.md`; L3 reports: `config-item-trigger-report.md`, `config-item-analysis-report.md`, `config-item-strategy-comparison.md` |
53
53
  | **Scene config** | Same as config center; params, groups, metrics, channels, strategies, and templates under a config item | `engage-scene` | `references/scene-config-item.md` | Same as above; params/groups/metrics: `scene-config-param.md`, `scene-config-group.md`, `scene-preset-metric.md`, `scene-config-metric.md` |
54
54
  | **Config item** | A single config item in the config center | `engage-scene` | `references/scene-config-item.md` | `scene-config-param.md`, `scene-preset-metric.md`, `scene-config-metric.md`, `scene-strategy.md`, `scene-template.md` |
55
- | **Push channel** | Project-level message push channels (Webhook, FCM, APNS, etc.) | `engage-setting` | `references/channel-list.md` | `channel-detail.md`, `add-channel.md`, `update-channel-status.md`, `delete-channel.md`, `channel-update-config.md`, `channel-test-send.md`, `channel_touch_limits_list.md` |
55
+ | **Push channel** | Project-level message push channels (Webhook, FCM, APNS, etc.) | `engage-setting` | `references/channel-list.md` | `channel-detail.md`, `add-channel.md` (**Webhook vs Client differ**: `url` = HTTP vs scene key; custom params `user:` vs `user:`/`client:`), `update-channel-status.md`, `delete-channel.md`, `channel-update-config.md`, `channel-test-send.md`, `channel_touch_limits_list.md` |
56
56
  | **Config channel** | Config-center Webhook/client config channels (not the same as push channels) | `engage-scene` | `references/scene-config-channel.md` | `channel-mgmt.md` (create/enable-disable/copy/delete workflows). User params in `config.customsParamList` require `columnName` with `user:` prefix (e.g. `user:#account_id`); preflight names with ae-analysis `analysis-meta property list/get`. |
57
- | **Operation strategy** | Ops/delivery strategies under a config item | `engage-scene` | `references/scene-strategy.md` | Custom audience QP: [`scene-strategy-audience.md`](references/scene-strategy-audience.md) — **用户满足** `filts[0]` + **用户行为** `filts[1]` two-block mix QP; preflight props (stop + list if missing); examples A/B/C; template: `scene-template.md` |
57
+ | **Operation strategy** | Ops/delivery strategies under a config item | `engage-scene` | `references/scene-strategy.md` | Custom audience: [`scene-strategy-audience.md`](references/scene-strategy-audience.md) — semantic `definitionRequest` (Analysis condition shape); do not pass `targetClusterQp`/`qp`; preflight props (stop + list if missing); template: `scene-template.md` |
58
58
  | **Operation task** | Hermes push/engagement tasks (list, save, lifecycle, reports) | `engage-task` | `references/task-list.md` | `task-detail.md` (get), `save-task.md`, `build-task-save-guide.md`, `task-stats.md`, `task-delete.md`, `push-record-query.md`, `task-data-overview.md`, `task-data-detail.md`, `task-metric-detail.md`, `task-experiment-report.md` |
59
59
  | **Template** | Strategy templates under a config item | `engage-scene` | `references/scene-template.md` | `scene-config-param.md` (template fields reference `paramId`); enable via `template update` then `template update-status` before strategy create |
60
60
 
@@ -145,13 +145,13 @@ ae-cli engage-setting config-table delete --project-id <project_id> --info-id <i
145
145
 
146
146
  # Preset event list / update
147
147
  ae-cli engage-setting preset-event list --project-id <project_id>
148
- ae-cli engage-setting preset-event update --project-id <project_id> --add-event-desc <qp>
148
+ ae-cli engage-setting preset-event update --project-id <project_id> --add-event-definition '<semantic_event_json>'
149
149
 
150
150
  # Common metric list / get / create / update / delete
151
151
  ae-cli engage-setting common-metric list --project-id <project_id>
152
152
  ae-cli engage-setting common-metric get --project-id <project_id> --metric-name <name>
153
- ae-cli engage-setting common-metric create --project-id <project_id> --metric-type 1 --metric-name <name> --metric-qp '<qp_json>' --metric-window-num 1 --metric-window-time-unit day --display-name <display>
154
- ae-cli engage-setting common-metric update --project-id <project_id> --metric-type 1 --metric-name <name> --metric-qp '<qp_json>' --metric-window-num 1 --metric-window-time-unit day --display-name <display>
153
+ ae-cli engage-setting common-metric create --project-id <project_id> --metric-type 1 --metric-name <name> --metric-definition '<semantic_metric_json>' --metric-window-num 1 --metric-window-time-unit day --display-name <display>
154
+ ae-cli engage-setting common-metric update --project-id <project_id> --metric-type 1 --metric-name <name> --metric-definition '<semantic_metric_json>' --metric-window-num 1 --metric-window-time-unit day --display-name <display>
155
155
  ae-cli engage-setting common-metric delete --project-id <project_id> --metric-name <name> --yes
156
156
  ```
157
157
 
@@ -170,6 +170,9 @@ ae-cli engage-task task save --project-id 1 --req '{"baseInfo":{"taskName":"Demo
170
170
  # Query task details
171
171
  ae-cli engage-task task get --project-id 1 --task-id task_123
172
172
 
173
+ # Submit a saved draft task for approval
174
+ ae-cli engage-task task submit-approval --project-id 1 --task-id task_123
175
+
173
176
  ```
174
177
 
175
178
  For L3 task reports, read `references/task-data-overview.md`, `references/task-data-detail.md`,
@@ -210,6 +213,7 @@ ae-cli engage-task group list --project-id 1
210
213
  ae-cli engage-task metric list --project-id 1 --task-id task_id_123
211
214
  ae-cli engage-task channel-ref stats --project-id 1 --channel-id channel_123
212
215
  ae-cli engage-task task delete --project-id 1 --task-id task_id_123 --yes
216
+ ae-cli engage-task task submit-approval --project-id 1 --task-id task_id_123
213
217
 
214
218
  # Query the node schema
215
219
  ae-cli engage-flow node-config schema --project-id 1 --node-type message_push
@@ -241,7 +245,7 @@ ae-cli engage-scene config-group batch-delete --project-id <project_id> --group-
241
245
 
242
246
  # Preset metric get / set
243
247
  ae-cli engage-scene preset-metric get --project-id <project_id> --config-id <config_id>
244
- ae-cli engage-scene preset-metric set --project-id <project_id> --config-id <config_id> --impression-event-qp '<qp>'
248
+ ae-cli engage-scene preset-metric set --project-id <project_id> --config-id <config_id> --impression-event-definition '<semantic_event_json>'
245
249
 
246
250
  # Config metric list / get / batch-add / update-rule / batch-delete
247
251
  ae-cli engage-scene config-metric list --project-id <project_id> --config-id <config_id>
@@ -252,7 +256,7 @@ ae-cli engage-scene config-metric batch-delete --project-id <project_id> --confi
252
256
 
253
257
  # Config channel list / get / create / update / update-status / delete / query-log
254
258
  # User params: verify each customsParamList columnName via ae-analysis property list/get first; then use user:<prop_name>
255
- # Strategy custom audience: scene-strategy-audience.md — mix QP filts[0]=用户满足, filts[1]=用户行为; strategy predict for 预估人数
259
+ # Strategy custom audience: scene-strategy-audience.md — semantic definitionRequest; strategy predict for 预估人数
256
260
  # Workflows: references/channel-mgmt.md · schema: references/scene-config-channel.md
257
261
  ae-cli engage-scene config-channel list --project-id <project_id> [--channel-type 0|1]
258
262
  ae-cli engage-scene config-channel get --project-id <project_id> --channel-id <channel_id>
@@ -266,7 +270,7 @@ ae-cli engage-scene config-channel query-log --project-id <project_id> --channel
266
270
  ae-cli engage-scene strategy create --project-id <project_id> --payload '{"configId":"cfg-1","templateId":"tpl-1","strategyName":"s1"}'
267
271
  ae-cli engage-scene strategy update --project-id <project_id> --payload '{"strategyUuid":"uuid-1"}'
268
272
  ae-cli engage-scene strategy log --project-id <project_id> --strategy-uuid <uuid>
269
- ae-cli engage-scene strategy predict --project-id <project_id> --qp '<mix QP string>' --zone-offset 8 [--strategy-uuid <uuid>]
273
+ ae-cli engage-scene strategy predict --project-id <project_id> --definition-request '{"type":"condition","conditions":{...}}' --zone-offset 8 [--strategy-uuid <uuid>]
270
274
  ae-cli engage-scene strategy batch-copy --project-id <project_id> --config-id <config_id> --strategy-ids '["s1"]'
271
275
 
272
276
  # Template list / get / create / update / update-status / delete
@@ -282,6 +286,18 @@ ae-cli engage-scene template delete --project-id <project_id> --config-id <confi
282
286
 
283
287
  New capability-gateway command group `engage-activity` covers campaign activities: activities, approval workflow, topics, activity types, and standalone tasks. Complex DTOs are passed with `--payload` (native camelCase JSON).
284
288
 
289
+ ### Activity payload guardrails
290
+
291
+ Before generating any activity topic or standalone-task payload, enforce the same subset exposed by the Hermes activity UI:
292
+
293
+ - `triggerType` must be `0` (schedule single) or `1` (schedule repeat). Activity tasks do not support manual (`2`) or triggered (`3`-`6`) task types.
294
+ - Do not configure A/B or horse-race experiments. Omit `expConfig` or use only `{"enableExp":false}`, and provide exactly one non-experiment `groupContentList` group.
295
+ - Standalone activity tasks must use `triggerTimeStrategy: "fixed_time_zone"` and the parent activity `tzOffset`. Schedule times must remain inside the activity period.
296
+ - A topic root supports audience types `1` (custom) and `2` (existing cluster), not `3` (all users). A standalone activity task may use `1`, `2`, or `3`.
297
+ - Topic tasks inherit schedule, timezone, channel, frequency limits, channel touch limits, whitelist, and experiment settings from the topic. They may only add an inclusion-only custom `definitionRequest`; never generate task-level `clusterKey`, trigger rules, or shared-setting overrides. `topic get` may return the canonical task marker `targetClusterType=1`; preserve it for update if present, but never use another task-level value.
298
+ - Resolve the parent activity first and confirm it is editable (`mappingStatus` `0`, `2`, or `5`). Limits for topics, tasks, and languages are project configuration values; do not hardcode defaults.
299
+ - `approval submit` and `approval approve` validate every persisted activity task. Approval does not normalize unsupported task data. On `ACTIVITY_TASK_COMPATIBILITY_VIOLATION`, cancel/withdraw approval as needed, correct or recreate each reported task, and submit again.
300
+
285
301
  ```bash
286
302
  # Activity create / update / delete / list / get / pause / end / stats / info-list
287
303
  ae-cli engage-activity activity create --project-id <project_id> --payload '{"activityName":"a1","activityType":"other_type","tzOffset":8,"periodType":0}'
@@ -294,8 +310,8 @@ ae-cli engage-activity activity end --project-id <project_id> --activity-id <act
294
310
  ae-cli engage-activity activity stats --project-id <project_id>
295
311
  ae-cli engage-activity activity info-list --project-id <project_id> --activity-id <activity_id>
296
312
 
297
- # Approval approve / reject / cancel
298
- # Note: engage-activity.approval.submit is temporarily disabled (testing issues); do not call it.
313
+ # Approval submit / approve / reject / cancel
314
+ ae-cli engage-activity approval submit --project-id <project_id> --activity-id <activity_id> [--reason <reason>]
299
315
  ae-cli engage-activity approval approve --project-id <project_id> --activity-id <activity_id>
300
316
  ae-cli engage-activity approval reject --project-id <project_id> --activity-id <activity_id> --reason <reason>
301
317
  ae-cli engage-activity approval cancel --project-id <project_id> --activity-id <activity_id>
@@ -346,12 +362,9 @@ When the user wants to "create a flow / generate a flow canvas / save a flow", d
346
362
  - The touchpoint or delivery method
347
363
  - Whether branching is needed, and the branching conditions
348
364
  2. Do not jump directly from natural language to `--req`. You must first organize a stable intermediate intent structure, then map it to the final `req`.
349
- 3. Before building condition-related nodes, create the reusable audience directly from its semantic definition, then read back the server-authored definition only if the Engage schema explicitly needs QP-derived fields:
350
-
351
- ```bash
352
- ae-cli analysis user-cluster create --project-id <projectId> --cluster-name <condition_cluster_name> --display-name <display_name> --definition-request '<semantic-definition-json>'
353
- ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<condition_cluster_name>"]'
354
- ```
365
+ 3. Build condition-related nodes with semantic `targetDefinitionRequest` and
366
+ `triggerDefinition` objects. Resolve real event and property names through Analysis metadata;
367
+ do not create an intermediate cluster merely to obtain persisted QP.
355
368
 
356
369
  4. Before building touchpoint nodes such as `message_push`, `wechat_push`, or `webhook_push`, you must call:
357
370
 
@@ -361,7 +374,7 @@ ae-cli engage-setting channel list --project-id <projectId>
361
374
 
362
375
  5. `engage-flow flow save` is **operation-based** (protocol v2). The `--req` object must carry an `operation` of `build`, `preview`, or `commit`. Do **not** use the old `nodeList` / `edgeList` field names — use `nodes` / `edges` with `operation=build`. A legacy `nodeList`/`edgeList` payload (or a missing `operation`) is rejected with `Unsupported save_flow operation: null`.
363
376
  6. Run the lifecycle: `build` (returns `data.result.status = ready_to_preview` or `need_input`) → resolve any `data.result.next_slot` → `preview` (re-issues response fields `data.result.draft_version` + `data.result.confirm_token`) → `commit` (maps those values to request fields `draftVersion` + `confirmToken`) → reads the final ID from `data.result.result.flow_uuid`.
364
- 7. `nodes[].config` / `edges[].config` may be a JSON object or a JSON string. If `targetClusterQp` appears inside a node `config`, its value is usually a `JSON.stringify`'d string, not a raw object.
377
+ 7. `nodes[].config` / `edges[].config` may be a JSON object or a JSON string. Custom audience nodes and branches use semantic `targetDefinitionRequest`; Hermes compiles it to the node's stored execution format.
365
378
  8. You must self-check before previewing/committing:
366
379
  - There is exactly one entry node
367
380
  - There is at least one `exit_flow`
@@ -437,13 +450,13 @@ More detailed single-command guidance is available in the business-oriented `ref
437
450
  - `references/scene-config-channel.md` (`engage-scene.config-channel.{list,get,create,update,update-status,delete,query-log}`)
438
451
  - `references/channel-mgmt.md` (config channel management workflows)
439
452
  - `references/scene-strategy.md` (`engage-scene.strategy.{list,get,create,update,log,predict,batch-copy,manage}`)
440
- - `references/scene-strategy-audience.md` (custom audience mix QP: 用户满足/用户行为 two-block layout, preflight, worked examples A/B/C)
453
+ - `references/scene-strategy-audience.md` (custom audience semantic `definitionRequest`, preflight, predict)
441
454
  - `references/scene-template.md` (`engage-scene.template.{list,get,copy,create,update,update-status,delete}`)
442
455
  - `references/config-item-trigger-report.md` (`engage-scene.report.config-item-trigger`, L3)
443
456
  - `references/config-item-analysis-report.md` (`engage-scene.report.config-item-analysis`, L3)
444
457
  - `references/config-item-strategy-comparison.md` (`engage-scene.report.strategy-comparison`, L3)
445
458
  - `references/activity-activity.md` (`engage-activity.activity.{create,update,delete,list,get,pause,end,stats,info-list}`)
446
- - `references/activity-approval.md` (`engage-activity.approval.{approve,reject,cancel}`; `submit` temporarily disabled)
459
+ - `references/activity-approval.md` (`engage-activity.approval.{submit,approve,reject,cancel}`)
447
460
  - `references/activity-topic.md` (`engage-activity.topic.{create,update,remove-task,delete,get,copy}`)
448
461
  - `references/activity-activity-type.md` (`engage-activity.activity-type.{list,batch-add,update,batch-delete}`)
449
462
  - `references/activity-task.md` (`engage-activity.task.{get,create,update,copy}`)
@@ -460,6 +473,7 @@ More detailed single-command guidance is available in the business-oriented `ref
460
473
  - `references/segment-list-query.md` (`engage-task.segment-list.query`)
461
474
  - `references/group-list.md` (`engage-task.group.list`)
462
475
  - `references/task-delete.md` (`engage-task.task.delete`)
476
+ - `references/task-submit-approval.md` (`engage-task.task.submit-approval`)
463
477
 
464
478
  This split documentation structure is easier to extend later, because commands with more complex object inputs can stay centralized in the `references/` root directory.
465
479
 
@@ -471,7 +485,7 @@ This split documentation structure is easier to extend later, because commands w
471
485
 
472
486
  ### task
473
487
 
474
- `operation-log query` / `push-record query` / `segment-list *` / `ops *` / `metric *` / `race release` / `channel-ref stats` / `group *` / `task delete` / `task modify-group` / `task get` / `task list` / `task stats` / `task build-save-guide` / `task save` / `task manage` (via `engage-task`), plus L3 capabilities `engage-task.task-data.{overview,detail,metric-detail,experiment-report}`
488
+ `operation-log query` / `push-record query` / `segment-list *` / `ops *` / `metric *` / `race release` / `channel-ref stats` / `group *` / `task delete` / `task modify-group` / `task submit-approval` / `task get` / `task list` / `task stats` / `task build-save-guide` / `task save` / `task manage` (via `engage-task`), plus L3 capabilities `engage-task.task-data.{overview,detail,metric-detail,experiment-report}`
475
489
 
476
490
  ### config
477
491
 
@@ -483,7 +497,7 @@ Legacy config MCP commands are migrated into the `scene` L2 group and the three
483
497
 
484
498
  ### activity
485
499
 
486
- `activity create` / `activity update` / `activity delete` / `activity list` / `activity get` / `activity pause` / `activity end` / `activity stats` / `activity info-list` / `approval approve` / `approval reject` / `approval cancel` / `topic create` / `topic update` / `topic remove-task` / `topic delete` / `topic get` / `topic copy` / `activity-type list` / `activity-type batch-add` / `activity-type update` / `activity-type batch-delete` / `task get` / `task create` / `task update` / `task copy` (via `engage-activity`), capability ids `engage-activity.activity.{create,update,delete,list,get,pause,end,stats,info-list}`, `engage-activity.approval.{approve,reject,cancel}`, `engage-activity.topic.{create,update,remove-task,delete,get,copy}`, `engage-activity.activity-type.{list,batch-add,update,batch-delete}`, `engage-activity.task.{get,create,update,copy}`
500
+ `activity create` / `activity update` / `activity delete` / `activity list` / `activity get` / `activity pause` / `activity end` / `activity stats` / `activity info-list` / `approval submit` / `approval approve` / `approval reject` / `approval cancel` / `topic create` / `topic update` / `topic remove-task` / `topic delete` / `topic get` / `topic copy` / `activity-type list` / `activity-type batch-add` / `activity-type update` / `activity-type batch-delete` / `task get` / `task create` / `task update` / `task copy` (via `engage-activity`), capability ids `engage-activity.activity.{create,update,delete,list,get,pause,end,stats,info-list}`, `engage-activity.approval.{submit,approve,reject,cancel}`, `engage-activity.topic.{create,update,remove-task,delete,get,copy}`, `engage-activity.activity-type.{list,batch-add,update,batch-delete}`, `engage-activity.task.{get,create,update,copy}`
487
501
 
488
502
  ### workbench
489
503
 
@@ -505,19 +519,35 @@ High-risk delete commands (`risk: high-risk-write`) require explicit user author
505
519
  - Config channels (config center channel management): `engage-scene config-channel create|update|update-status` (write), `engage-scene config-channel delete` (high-risk-write)
506
520
  - Strategies and config items: `engage-scene config-item delete` (high-risk-write), `engage-scene template copy` and `engage-scene strategy manage` (write)
507
521
  - Flows: `engage-flow flow update-remark` (write), `engage-flow flow save` (write), `engage-flow flow modify-base-info` (write), `engage-flow flow manage` (write), `engage-flow flow delete` (high-risk-write)
508
- - Tasks: `engage-task task save` (write), `engage-task task manage` (write)
522
+ - Tasks: `engage-task task save` (write), `engage-task task submit-approval` (write), `engage-task task manage` (write)
509
523
 
510
524
  For task draft creation or update, use this workflow:
511
525
 
512
526
  1. `ae-cli engage-setting channel list --project-id <projectId>`
513
527
  2. `ae-cli engage-task task build-save-guide --project-id <projectId> --req '{...}'`
514
- 3. If the guide says QP-derived fields are needed (`targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, or `completionIndicatorDef.event`), call:
515
- `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>`
516
- Use the returned skill text to build those fields. For existing-cluster audiences (`targetClusterType=2`), use `analysis user-cluster get` instead of hand-writing QP.
528
+ 3. For a custom audience, pass the Analysis semantic contract as
529
+ `targetConfig.definitionRequest`. Use semantic `triggerConfig.triggerDefinition` and
530
+ `completionIndicatorDef.completionIndicators[].eventDefinition`. Build shapes from
531
+ `ae-analysis` user-cluster / audience models. For existing-cluster audiences
532
+ (`targetClusterType=2`), use `analysis user-cluster get`. For event-triggered tasks, pass
533
+ `channelType`, `triggerType`, and `eventTriggerType` to `build-save-guide`, then use its
534
+ type-specific semantic event shape. Accumulated events are aggregate conditions, continuous
535
+ events use count/eq with a value of at least 2, ordered events use sequence-step envelopes,
536
+ and every-completion events use count/eq/1. Never construct persisted QP fields.
517
537
  4. `ae-cli engage-task task save --project-id <projectId> --req '{...}'`
538
+ 5. `ae-cli engage-task task submit-approval --project-id <projectId> --task-id <taskId>`
518
539
 
519
540
  `engage-task task build-save-guide` is a read-only helper. It returns scenario-specific required fields, channel content schema, unsupported combinations, examples, and a handoff template for `save_task`.
520
541
 
521
542
  `engage-task task save` creates or updates a task configuration. It does not submit approval, does not start sending, and does not trigger task execution. If `req.taskId` is omitted it creates a new draft; if `req.taskId` is present it updates an existing **draft or paused** task. Update mode rejects running/ended tasks with `invalid_status`. Omitted fields inherit from the existing task before validation (partial rename/update is supported).
522
543
 
523
- Audience creation is not a fixed preflight step. When the guide requires QP-derived fields (`targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, `completionIndicatorDef.event`), call `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>` first and follow the returned skill definition; do not assemble raw QP manually. For existing-cluster audiences, use `analysis user-cluster get` to copy server-authored definitions when appropriate.
544
+ `engage-task task submit-approval --task-id` is the recommended approval path after `task save`.
545
+ It submits the persisted draft without requiring the Agent to reconstruct internal `trigger_rule`.
546
+ The legacy `--request` mode remains available for compatibility; provide exactly one of
547
+ `--task-id` or `--request`.
548
+
549
+ Audience creation is not a fixed preflight step. For custom task audiences, use semantic
550
+ `targetConfig.definitionRequest`; `task get` returns the same contract as
551
+ `definition_request`. `clientConfig.clientQp` is server-authored and must be omitted from
552
+ Capability requests; partial updates preserve existing server state. Do not assemble raw QP
553
+ manually.
@@ -56,6 +56,9 @@ ae-cli engage-activity activity info-list --project-id <project_id> --activity-i
56
56
  - `get`: `data.activity`.
57
57
  - `stats`: `data.status_count`.
58
58
  - `info-list`: `data.info` with `taskList` (standalone tasks) and `topicList` (topics under the activity).
59
+ This summary intentionally omits stored QP-bearing detail fields such as `qp`,
60
+ `triggerRule`, `completionIndicatorDef`, and `clientQp`. Use the corresponding task
61
+ or topic detail command to obtain the semantic definitions before editing.
59
62
  - `delete` / `pause` / `end`: `data.success`.
60
63
 
61
64
  ## Timezone (`tzOffset`)
@@ -1,14 +1,15 @@
1
1
  # engage-activity approval
2
2
 
3
- > Capability ids: `engage-activity.approval.{approve,reject,cancel}` · Domain: `engage`.
4
- >
5
- > **Temporarily disabled:** `engage-activity.approval.submit` — do not call until re-enabled.
3
+ > Capability ids: `engage-activity.approval.{submit,approve,reject,cancel}` · Domain: `engage`.
6
4
 
7
5
  Campaign activities — activity approval workflow. Current actions target an activity (`ApprovalActivityIdDealDTO`: `projectId` + `activityId` + `reason`); each is a state-changing `write` and does not support dry-run. `reject` requires `reason`; other actions treat `reason` as optional.
8
6
 
9
7
  ## Commands
10
8
 
11
9
  ```bash
10
+ # Submit an activity for approval
11
+ ae-cli engage-activity approval submit --project-id <project_id> --activity-id <activity_id> [--reason <reason>]
12
+
12
13
  # Approve an activity
13
14
  ae-cli engage-activity approval approve --project-id <project_id> --activity-id <activity_id>
14
15
 
@@ -23,6 +24,7 @@ ae-cli engage-activity approval cancel --project-id <project_id> --activity-id <
23
24
 
24
25
  | Command | Required flags | Notes |
25
26
  |---|---|---|
27
+ | submit | `--project-id`, `--activity-id` | `--reason` optional. Activity must have draft/pending standalone or topic tasks. |
26
28
  | approve | `--project-id`, `--activity-id` | `--reason` optional. |
27
29
  | reject | `--project-id`, `--activity-id`, `--reason` | `--reason` required, max 72 characters. |
28
30
  | cancel | `--project-id`, `--activity-id` | `--reason` optional. |
@@ -35,13 +37,19 @@ ae-cli engage-activity approval cancel --project-id <project_id> --activity-id <
35
37
 
36
38
  - All approval actions are `write` (real state changes) and do not support dry-run; they do not require `--yes` (only `high-risk-write` does).
37
39
  - Approve/reject require the caller to be a valid approver of the activity (enforced server-side).
38
- - Do **not** call `engage-activity.approval.submit`; it is temporarily unavailable.
40
+ - Submit requires at least one standalone or topic task under the activity that can enter approval.
41
+ - Submit and approve load complete task details and scan both standalone tasks and topic tasks before invoking the product approval service.
42
+ - Approval does not repair or normalize unsupported activity task configurations.
43
+ - If preflight returns `ACTIVITY_TASK_COMPATIBILITY_VIOLATION`, inspect `error.meta.violations`, withdraw/cancel approval when necessary, and update or recreate each reported task as scheduled, fixed-timezone, and non-experiment before resubmitting.
39
44
 
40
45
  ## Common Errors
41
46
 
42
47
  | code | when |
43
48
  |---|---|
44
49
  | `ACTIVITY_NOT_FOUND` | activity id missing in project |
50
+ | `ACTIVITY_NO_APPROVAL_TASK` | activity has no standalone/topic tasks to submit |
51
+ | `ACTIVITY_TASK_COMPATIBILITY_VIOLATION` | one or more persisted activity tasks use unsupported trigger, timezone, experiment, or content-group configuration; details are in `error.meta.violations` |
52
+ | `ACTIVITY_TRIGGER_TYPE_REQUIRED` | a persisted activity task is missing its trigger type; reported inside the compatibility violation list |
45
53
  | `ACTIVITY_STATUS_INVALID` | activity not in draft/pending |
46
54
  | `APPROVAL_NOT_PENDING` | no under-approval record |
47
55
  | `NOT_APPROVER` | caller is not a project approver |
@@ -26,9 +26,9 @@ ae-cli engage-activity task copy --project-id <project_id> --task-id <task_id> [
26
26
 
27
27
  | Command | Required flags | Notes |
28
28
  |---|---|---|
29
- | get | `--project-id`, `--task-id` | read. |
30
- | create | `--project-id`, `--payload` | payload = `OperationTaskOpDTO`; set `activityId`, leave `topicId` empty. Missing `expConfig` is auto-filled as `{"enableExp":false}`. |
31
- | update | `--project-id`, `--payload` | payload = `OperationTaskOpDTO` including `taskId`. Prefer get detail as base. Missing `expConfig` is auto-filled as `{"enableExp":false}`. |
29
+ | get | `--project-id`, `--task-id` | Only standalone tasks with an `activityId`; ordinary tasks use `engage-task task get`. |
30
+ | create | `--project-id`, `--payload` | payload = `OperationTaskOpDTO`; set `activityId`, leave `topicId` empty. Only scheduled `triggerType` `0/1` is supported. |
31
+ | update | `--project-id`, `--payload` | payload = `OperationTaskOpDTO` including `taskId`. Prefer get detail as base. Only scheduled `triggerType` `0/1` is supported. |
32
32
  | copy | `--project-id`, `--task-id` | `--new-name` optional (default source name + `_copy`). |
33
33
 
34
34
  ## Output
@@ -47,20 +47,28 @@ ae-cli engage-activity task copy --project-id <project_id> --task-id <task_id> [
47
47
  - **TEXT (rich text) params** must include both `value` and `config` (Slate.js JSON **string**). If `config` is missing, Hermes copy auto-fills
48
48
  `config = [{"type":"paragraph","children":[{"text":"<value>"}]}]` as a JSON string.
49
49
  - Missing `expConfig` on create/update is auto-filled as `{"enableExp":false}` (same shape as task `get`).
50
+ - A/B and horse-race experiments are not supported. Do not pass experiment fields or multiple content groups.
51
+ - `groupContentList` must contain exactly one non-experiment group. Put language variants in that group's `contentList`.
50
52
 
51
53
  ### Audience (`targetClusterType`)
52
54
 
53
55
  | Value | Required | Notes |
54
56
  |---|---|---|
55
57
  | `2` (existed) | `clusterKey` | From `analysis user-cluster list/get`. |
56
- | `1` (custom) | `qp` | JSON object string. |
57
- | `3` (all) | — | Do not pass `clusterKey` or `qp`. |
58
+ | `1` (custom) | `definitionRequest` | Analysis-compatible semantic condition object. |
59
+ | `3` (all) | — | Do not pass `clusterKey` or `definitionRequest`. |
60
+
61
+ `get` returns `definition_request`, `definition_status`, and optional `definition_unavailable_reason`, while hiding the stored execution QP. Reuse `definition_request` as payload `definitionRequest` for an update. `copy` converts the source internally and does not require an audience field from the caller.
58
62
 
59
63
  ## Decision Rules
60
64
 
65
+ - `triggerType` must be `0` (schedule single) or `1` (schedule repeat). Manual (`2`) and triggered (`3`-`6`) tasks belong under `engage-task`, not `engage-activity`.
66
+ - Set `triggerTimeStrategy` to `fixed_time_zone` and `tzOffset` to the parent activity timezone. User timezone and user active time are not supported.
67
+ - Keep `triggerTime`, or repeat `startDate`/`endDate`, inside the parent activity period.
68
+ - Create/update/copy is limited to editable parent activity states: draft (`0`), paused (`2`), or denied (`5`). Project-configured count and language limits remain authoritative.
61
69
  - Discover a real `task_id` via `get`/activity `info-list` first; never invent IDs.
62
70
  - `copy` duplicates the editable task config (not runtime/trigger state).
63
- - `copy` saves via **draft** add (`draft=true`), so a past schedule-single `triggerTime` is allowed; output may include `trigger_time_stale=true`. Update the time before submitting for approval (`engage-activity.approval.submit` is temporarily unavailable).
71
+ - `copy` saves via **draft** add (`draft=true`), so a past schedule-single `triggerTime` is allowed; output may include `trigger_time_stale=true`. Update the time before submitting for approval.
64
72
  - Standalone tasks must **not** include `topicId`; topic tasks use `engage-activity topic create` / `topic copy`.
65
73
 
66
74
  ## Copy errors
@@ -73,6 +81,13 @@ ae-cli engage-activity task copy --project-id <project_id> --task-id <task_id> [
73
81
  | `TASK_PROJECT_MISMATCH` | task exists but not in `--project-id` |
74
82
  | `TOPIC_TASK_FORBIDDEN` | source has `topicId` (use `topic copy`) |
75
83
  | `ACTIVITY_ID_REQUIRED` | source has no `activityId` (not a standalone activity task) |
84
+ | `ACTIVITY_TRIGGER_TYPE_UNSUPPORTED` | task uses manual or a triggered task type |
85
+ | `ACTIVITY_TRIGGER_TIME_STRATEGY_UNSUPPORTED` | task does not use `fixed_time_zone` |
86
+ | `ACTIVITY_TIMEZONE_REQUIRED` | standalone task omits `tzOffset` |
87
+ | `ACTIVITY_EXPERIMENT_UNSUPPORTED` | task enables or configures an experiment |
88
+ | `ACTIVITY_CONTENT_GROUPS_UNSUPPORTED` | task has more than one experiment-style content group |
89
+ | `ACTIVITY_TIMEZONE_MISMATCH` | task timezone differs from the parent activity |
90
+ | `ACTIVITY_SCHEDULE_OUT_OF_RANGE` | task schedule is outside the activity period |
76
91
  | `TRIGGER_TIME_REQUIRED` | schedule-single missing `triggerTime` |
77
92
  | `CHANNEL_NOT_FOUND` | source channel missing / type mismatch |
78
93
  | `TASK_COUNT_LIMIT` | project task count limit exceeded |
@@ -30,7 +30,7 @@ ae-cli engage-activity topic copy --project-id <project_id> --topic-id <topic_id
30
30
 
31
31
  | Command | Required flags | Notes |
32
32
  |---|---|---|
33
- | create | `--project-id`, `--payload` | payload = `TopicAddDTO` (camelCase). Prefer `triggerType` `0` (schedule single) or `1` (schedule repeat); activity topics do not use manual (`2`). |
33
+ | create | `--project-id`, `--payload` | payload = `TopicAddDTO` (camelCase). `triggerType` must be `0` (schedule single) or `1` (schedule repeat). |
34
34
  | update | `--project-id`, `--payload` | payload = `TopicModifyReq` (`topicId` + fields + task lists). |
35
35
  | remove-task | `--project-id`, `--task-id` | high-risk; requires `--yes`; no dry-run. Only tasks with a non-empty `topicId`. |
36
36
  | delete | `--project-id`, `--topic-id` | high-risk; requires `--yes`; no dry-run. |
@@ -42,19 +42,19 @@ ae-cli engage-activity topic copy --project-id <project_id> --topic-id <topic_id
42
42
  TEXT (rich text) params inside `groupContentList[].contentList[].content` need both `value` and Slate `config` (JSON string). If `config` is omitted, Hermes copy/create auto-fills
43
43
  `[{"type":"paragraph","children":[{"text":"<value>"}]}]`. See `activity-task.md` Channel content.
44
44
 
45
- Topic-level audience uses `topicClusterKey` / `topicQp`; do **not** pass task-level `clusterKey` at topic root.
45
+ Topic-level audience uses `topicClusterKey` / `topicDefinitionRequest`; do **not** pass task-level `clusterKey` at topic root.
46
46
 
47
47
  ### Audience (`targetClusterType`)
48
48
 
49
49
  | Value | Required | Notes |
50
50
  |---|---|---|
51
- | `1` (custom) | `topicQp` | Valid condition JSON object string (not `{}`). Use mix QP with `totalCFilter` (and optional `totalOutCFilter`). |
51
+ | `1` (custom) | `topicDefinitionRequest` | Analysis-compatible semantic condition object. |
52
52
  | `2` (existed) | `topicClusterKey` | From an existing user cluster. |
53
53
  | `3` (all) | — | **Not supported for activity topics** → `TOPIC_TARGET_CLUSTER_TYPE_UNSUPPORTED`. Use standalone `engage-activity task create` for all-users. |
54
54
 
55
- **`triggerMixQpVersion`:** For custom audience (`targetClusterType=1`) with mix QP (`totalCFilter` / `totalInCFilter`), set `"4.4"`. UI theme edit parses conditions only when this is `4.4`; missing/blank values make target-user filters render empty. Capability create/update/copy default blank to `"4.4"` (same as UI and standalone task MCP).
55
+ **`triggerMixQpVersion`:** Capability create/update/copy defaults a blank value to `"4.4"` while compiling the semantic definition.
56
56
 
57
- Task-level extra conditions go in `taskQp` as mix QP under **`totalCFilter` only** (user attrs and/or events). Do not put task-owned conditions in `totalInCFilter` that key is reserved for topic→task merge (topic `totalCFilter` is copied into task cluster `totalInCFilter` on save).
57
+ Task-level extra conditions go in each task's inclusion-only `definitionRequest`. Keep shared conditions in `topicDefinitionRequest`; Hermes performs the topic-to-task merge through the existing domain service. Topic tasks do not have an independent audience mode. `topic get` returns the canonical task marker `targetClusterType=1`; it may be retained when mapping `taskList` into `modifyTaskList`, but no other value is accepted. Do not pass task-level `clusterKey`, all-users selection, or exclusion filters.
58
58
 
59
59
  ### Trigger (`triggerType`)
60
60
 
@@ -62,7 +62,16 @@ Task-level extra conditions go in `taskQp` as mix QP under **`totalCFilter` only
62
62
  |---|---|---|
63
63
  | `0` (schedule single) | `triggerTime` (`yyyy-MM-dd HH:mm`, future) | Preferred for CLI create. |
64
64
  | `1` (schedule repeat) | `startDate`, `endDate`, `triggerCrontab` | |
65
- | `2` (manual) | — | **Not supported for activity topics** (UI only offers 0/1). Using it without `endDate` causes `CAPABILITY_EXECUTION_FAILED`. |
65
+
66
+ Manual (`2`) and every triggered type (`3`-`6`) are rejected with `ACTIVITY_TRIGGER_TYPE_UNSUPPORTED`.
67
+
68
+ ### Shared topic configuration
69
+
70
+ - A/B and horse-race experiments are not supported. Omit `expConfig` and use exactly one content group per topic task.
71
+ - The topic owns schedule, activity timezone, channel, frequency limits, channel touch limits, and whitelist.
72
+ - A topic task only owns its name, optional inclusion-only custom audience refinement, one content group, completion indicators, metrics, and description.
73
+ - Do not put schedule, trigger rules, channel, frequency, whitelist, experiment, or `clusterKey` on a topic task. The only accepted task-level `targetClusterType` is the canonical get response value `1`.
74
+ - Keep the topic schedule inside the parent activity period. Create/update/copy requires parent activity `mappingStatus` `0`, `2`, or `5`.
66
75
 
67
76
  ## Create Topic Orchestration
68
77
 
@@ -72,11 +81,11 @@ Use this workflow when a topic has a shared audience plus one or more task-level
72
81
  2. **Resolve the parent activity.** Use `activity list|get` to verify the exact `activityId`, editable status, activity dates, and timezone. For a repeated topic, keep `startDate` and `endDate` inside the activity period and interpret the cron in the activity timezone.
73
82
  3. **Resolve a real channel.** Query `engage-setting channel list`, then inspect the selected channel before composing content. If several enabled channels match and the user has not specified a provider or an already-confirmed project default, ask which one to use instead of choosing an arbitrary ID.
74
83
  4. **Read the channel content contract.** Call `engage-task task build-save-guide` with the known trigger, audience, channel type, and `channelId`. Build every `groupContentList[].contentList[].content` item from `fieldRules.channelContentSchema`; do not infer App Push keys or parameter types from memory.
75
- 5. **Prepare audience and completion inputs.** Resolve real event/property metadata and categorical values through the applicable Analysis workflow. Put the shared condition in `topicQp` or `topicClusterKey`, and only task-specific conditions in each `taskQp`. For a rolling condition such as "recent N days" that must be evaluated for future repeated sends, prefer a custom QP; use an existing cluster only after confirming that its refresh semantics match the send cadence. Build the completion goal separately in `completionIndicatorDef`.
76
- 6. **Build one native `TopicAddDTO`.** Keep nested payload keys in camelCase. Ensure `tasks` is non-empty, `frequencyLimits` and QP fields are JSON strings where documented, each task has channel content, and Android/iOS or other variants map to the correct task audience and message.
84
+ 5. **Prepare audience and completion inputs.** Resolve real event/property metadata and categorical values through the applicable Analysis workflow. Put the shared condition in `topicDefinitionRequest` or `topicClusterKey`, and only task-specific conditions in each task's `definitionRequest`. For a rolling condition such as "recent N days" that must be evaluated for future repeated sends, prefer a semantic custom definition; use an existing cluster only after confirming that its refresh semantics match the send cadence. Build the completion goal separately in `completionIndicatorDef`.
85
+ 6. **Build one native `TopicAddDTO`.** Keep nested payload keys in camelCase. Ensure `tasks` is non-empty, each semantic definition is a JSON object, each task has channel content, and Android/iOS or other variants map to the correct task audience and message.
77
86
  7. **Validate the complex payload.** Run `topic create ... --validate` while correcting the nested payload. Inspect `normalized_input` and confirm that the schedule, audience boundaries, message variants, and completion window retain the intended semantics. After `valid=true`, execute the same payload directly; do not add a redundant dry-run by default.
78
87
  8. **Create exactly once.** Run `topic create` with the validated payload. A successful response only reports `data.success`; it does not provide enough evidence to declare the whole orchestration complete.
79
- 9. **Resolve IDs and verify the saved topic.** Call `activity info-list` for the parent activity, match the new topic and tasks by their names, then call `topic get` with the returned `topicId`. Verify the channel, dates, cron, topic audience, each task audience, content, completion goal, and draft status. For custom audiences, confirm that the saved task QP keeps task-owned conditions in `totalCFilter` and the shared topic condition appears only through the topic-to-task merge.
88
+ 9. **Resolve IDs and verify the saved topic.** Call `activity info-list` for the parent activity, match the new topic and tasks by their names, then call `topic get` with the returned `topicId`. Verify the channel, dates, cron, semantic topic audience, each semantic task audience, content, completion goal, and draft status.
80
89
  10. **Verify generated audiences before reporting completion.** Read the generated topic/task cluster keys with the applicable cluster query and wait for terminal computation state. Require `refresh_status=success`, `progress=100`, `real_available=1`, and `cluster_valid=1`. A zero-user result may be valid, but reconcile it with the discovered categorical values and business expectation. If computation fails, correct only the verified cause and re-check; do not retry an unchanged request or report the topic as fully ready.
81
90
 
82
91
  Recommended command order:
@@ -95,7 +104,7 @@ activity list/get
95
104
 
96
105
  ## Output
97
106
 
98
- - `get`: `data.topic` (includes `topicClusterKey` for topic audience).
107
+ - `get`: `data.topic` (includes `topicClusterKey` for an existing audience or `topic_definition_request` plus conversion status for a custom audience).
99
108
  - `create` / `update` / `remove-task` / `delete` / `copy`: `data.success`.
100
109
  - `copy` may include `data.trigger_time_stale=true` when source schedule-single time is already past.
101
110
 
@@ -104,7 +113,7 @@ activity list/get
104
113
  - `remove-task` and `delete` are `high-risk-write` — require `--yes`, no dry-run.
105
114
  - `remove-task` only deletes **topic tasks** (`topicId` present). Standalone tasks → use `engage-task task delete`.
106
115
  - `copy` duplicates the editable topic config and its tasks (not runtime/approval state).
107
- - `copy` saves via **draft** add (`isDraft=true`), so a past schedule-single `triggerTime` is allowed; output may include `trigger_time_stale=true`. Update the time before submitting for approval (`engage-activity.approval.submit` is temporarily unavailable).
116
+ - `copy` saves via **draft** add (`isDraft=true`), so a past schedule-single `triggerTime` is allowed; output may include `trigger_time_stale=true`. Update the time before submitting for approval.
108
117
  - Prefer `topic get` as a template when inspecting channel/content fields.
109
118
 
110
119
  ## Create / update audience errors
@@ -113,9 +122,16 @@ activity list/get
113
122
  |---|---|
114
123
  | `TOPIC_TARGET_CLUSTER_TYPE_UNSUPPORTED` | `targetClusterType=3` (all); topics only allow 1/2 |
115
124
  | `TOPIC_CLUSTER_KEY_REQUIRED` | `targetClusterType=2` missing `topicClusterKey`, or topic-root `clusterKey` alias |
116
- | `TOPIC_QP_REQUIRED` | `targetClusterType=1` missing `topicQp` |
117
- | `TOPIC_QP_INVALID` | `topicQp` is not a JSON object string |
125
+ | `TOPIC_DEFINITION_REQUIRED` | `targetClusterType=1` missing `topicDefinitionRequest` |
126
+ | `TOPIC_DEFINITION_INVALID` | `topicDefinitionRequest` is not a semantic condition object |
118
127
  | `TARGET_CLUSTER_TYPE_INVALID` | `targetClusterType` not a known enum value |
128
+ | `ACTIVITY_TRIGGER_TYPE_UNSUPPORTED` | topic uses manual or a triggered task type |
129
+ | `ACTIVITY_EXPERIMENT_UNSUPPORTED` | topic or a topic task configures an experiment |
130
+ | `ACTIVITY_CONTENT_GROUPS_UNSUPPORTED` | a topic task has multiple experiment-style content groups |
131
+ | `TOPIC_TASK_OVERRIDE_UNSUPPORTED` | a topic task overrides shared topic settings or selects an independent cluster |
132
+ | `TOPIC_TASK_AUDIENCE_EXCLUSION_UNSUPPORTED` | a topic task definition contains exclusion filters |
133
+ | `ACTIVITY_STATUS_INVALID` | parent activity is not editable |
134
+ | `ACTIVITY_SCHEDULE_OUT_OF_RANGE` | topic schedule is outside the parent activity period |
119
135
 
120
136
  ## Copy errors
121
137
 
@@ -129,6 +145,8 @@ activity list/get
129
145
  | `ACTIVITY_NOT_FOUND` | parent activity missing / deleted / wrong project |
130
146
  | `TOPIC_TASKS_REQUIRED` | source topic has no tasks |
131
147
  | `ACTIVITY_STATUS_INVALID` | parent activity is approving/working/complete |
148
+ | `ACTIVITY_SCHEDULE_OUT_OF_RANGE` | source topic schedule is outside the parent activity period |
149
+ | `ACTIVITY_CONTENT_GROUPS_UNSUPPORTED` | a source topic task has multiple content groups |
132
150
  | `TOPIC_COUNT_LIMIT` | activity topic count limit exceeded |
133
151
  | `CHANNEL_NOT_FOUND` | source channel missing / type mismatch |
134
152
  | `TASK_COUNT_LIMIT` | project task count limit exceeded |