@thinkingai/ae-cli 1.0.1

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 (172) hide show
  1. package/README.md +229 -0
  2. package/bin/ae-cli.js +2 -0
  3. package/dist/auth-JXELJNDS.js +19 -0
  4. package/dist/auth-L3G3A74I.js +67 -0
  5. package/dist/chunk-3GM5LJZR.js +145 -0
  6. package/dist/chunk-JD5DXMKL.js +172 -0
  7. package/dist/chunk-KM57HI5B.js +107 -0
  8. package/dist/chunk-OVQOK35G.js +108 -0
  9. package/dist/chunk-RJNLN3KQ.js +217 -0
  10. package/dist/client-5QSQBBDB.js +16 -0
  11. package/dist/community-GMALVSRF.js +684 -0
  12. package/dist/config-Q7J3Z7Z2.js +242 -0
  13. package/dist/index.js +277 -0
  14. package/dist/raw-ZNVURYMR.js +59 -0
  15. package/dist/te-analysis-7NN3SY3I.js +871 -0
  16. package/dist/te-audience-P43BWMHM.js +350 -0
  17. package/dist/te-common-H3IPTI2I.js +144 -0
  18. package/dist/te-dataops-WCGDBJLF.js +1853 -0
  19. package/dist/te-engage-UTRVNTGU.js +1470 -0
  20. package/dist/te-meta-HGYNXVGF.js +479 -0
  21. package/package.json +53 -0
  22. package/skills/te-analysis/SKILL.md +107 -0
  23. package/skills/te-analysis/references/build-entity-details-sql.md +58 -0
  24. package/skills/te-analysis/references/build-event-details-sql.md +61 -0
  25. package/skills/te-analysis/references/create-alert.md +47 -0
  26. package/skills/te-analysis/references/create-dashboard.md +49 -0
  27. package/skills/te-analysis/references/create-or-update-dashboard-note.md +39 -0
  28. package/skills/te-analysis/references/create-public-access-link.md +43 -0
  29. package/skills/te-analysis/references/create-report.md +60 -0
  30. package/skills/te-analysis/references/create-result-cluster.md +73 -0
  31. package/skills/te-analysis/references/drilldown-user-events.md +72 -0
  32. package/skills/te-analysis/references/drilldown-users.md +75 -0
  33. package/skills/te-analysis/references/get-alert-definition-schema.md +32 -0
  34. package/skills/te-analysis/references/get-alert.md +31 -0
  35. package/skills/te-analysis/references/get-analysis-query-schema.md +36 -0
  36. package/skills/te-analysis/references/get-filter-schema.md +33 -0
  37. package/skills/te-analysis/references/get-groupby-schema.md +33 -0
  38. package/skills/te-analysis/references/get-report-definition.md +33 -0
  39. package/skills/te-analysis/references/get-table-columns.md +38 -0
  40. package/skills/te-analysis/references/list-alerts.md +33 -0
  41. package/skills/te-analysis/references/list-dashboards.md +33 -0
  42. package/skills/te-analysis/references/list-public-access-links.md +31 -0
  43. package/skills/te-analysis/references/list-reports.md +33 -0
  44. package/skills/te-analysis/references/load-filters.md +44 -0
  45. package/skills/te-analysis/references/query-adhoc.md +71 -0
  46. package/skills/te-analysis/references/query-dashboard-detail.md +35 -0
  47. package/skills/te-analysis/references/query-dashboard-report-data.md +60 -0
  48. package/skills/te-analysis/references/query-entity-details.md +60 -0
  49. package/skills/te-analysis/references/query-event-details.md +63 -0
  50. package/skills/te-analysis/references/query-report-data.md +65 -0
  51. package/skills/te-analysis/references/update-alert.md +49 -0
  52. package/skills/te-analysis/references/update-dashboard.md +45 -0
  53. package/skills/te-analysis/references/update-public-access-link.md +41 -0
  54. package/skills/te-audience/SKILL.md +63 -0
  55. package/skills/te-audience/references/create-cluster.md +65 -0
  56. package/skills/te-audience/references/create-tag.md +60 -0
  57. package/skills/te-audience/references/get-cluster-definition-schema.md +37 -0
  58. package/skills/te-audience/references/get-clusters-by-name.md +32 -0
  59. package/skills/te-audience/references/get-tag-definition-schema.md +32 -0
  60. package/skills/te-audience/references/get-tags-by-name.md +32 -0
  61. package/skills/te-audience/references/list-cluster-members.md +35 -0
  62. package/skills/te-audience/references/list-clusters.md +32 -0
  63. package/skills/te-audience/references/list-tag-members.md +36 -0
  64. package/skills/te-audience/references/list-tags.md +32 -0
  65. package/skills/te-audience/references/refresh-cluster.md +31 -0
  66. package/skills/te-audience/references/refresh-tag.md +31 -0
  67. package/skills/te-audience/references/update-cluster.md +59 -0
  68. package/skills/te-audience/references/update-tag.md +60 -0
  69. package/skills/te-common/SKILL.md +135 -0
  70. package/skills/te-common/references/get-resource-url.md +32 -0
  71. package/skills/te-common/references/list-projects.md +37 -0
  72. package/skills/te-community/SKILL.md +133 -0
  73. package/skills/te-community/references/community-activity-analysis.md +68 -0
  74. package/skills/te-community/references/community-analyzing-official-content.md +72 -0
  75. package/skills/te-community/references/community-analyzing-theme-comment.md +124 -0
  76. package/skills/te-community/references/community-character-analysis.md +71 -0
  77. package/skills/te-community/references/community-daily-report.md +82 -0
  78. package/skills/te-community/references/community-hottopic-insight.md +120 -0
  79. package/skills/te-community/references/community-release-analysis.md +79 -0
  80. package/skills/te-community/references/community-weekly-report.md +84 -0
  81. package/skills/te-community/references/get_channel_info.md +21 -0
  82. package/skills/te-community/references/get_comment_tag_analysis.md +30 -0
  83. package/skills/te-community/references/get_comments_summary.md +33 -0
  84. package/skills/te-community/references/get_corpus_tags.md +21 -0
  85. package/skills/te-community/references/get_daily_summary.md +23 -0
  86. package/skills/te-community/references/get_hot_topics.md +26 -0
  87. package/skills/te-community/references/get_livestream_analysis.md +23 -0
  88. package/skills/te-community/references/get_livestream_detail.md +34 -0
  89. package/skills/te-community/references/get_livestream_list.md +26 -0
  90. package/skills/te-community/references/get_livestream_overview.md +25 -0
  91. package/skills/te-community/references/get_livestream_room_metrics.md +26 -0
  92. package/skills/te-community/references/get_livestream_rooms.md +26 -0
  93. package/skills/te-community/references/get_overview_metrics.md +26 -0
  94. package/skills/te-community/references/get_post_detail.md +38 -0
  95. package/skills/te-community/references/get_risk_content.md +43 -0
  96. package/skills/te-community/references/get_sentiment_overview.md +34 -0
  97. package/skills/te-community/references/get_tag_trends.md +28 -0
  98. package/skills/te-community/references/get_topic_detail.md +27 -0
  99. package/skills/te-community/references/search_posts.md +48 -0
  100. package/skills/te-dataops/SKILL.md +645 -0
  101. package/skills/te-dataops/references/dataops-flow-create.md +163 -0
  102. package/skills/te-dataops/references/dataops-flow-monitor.md +118 -0
  103. package/skills/te-dataops/references/dataops-integration.md +246 -0
  104. package/skills/te-dataops/references/dataops-operations.md +107 -0
  105. package/skills/te-dataops/references/dataops-query.md +111 -0
  106. package/skills/te-dataops/references/dataops-table.md +122 -0
  107. package/skills/te-engage/SKILL.md +211 -0
  108. package/skills/te-engage/references/add-approver.md +24 -0
  109. package/skills/te-engage/references/add-channel.md +74 -0
  110. package/skills/te-engage/references/approver-list.md +19 -0
  111. package/skills/te-engage/references/cancel-query-by-request-id.md +23 -0
  112. package/skills/te-engage/references/channel-detail.md +52 -0
  113. package/skills/te-engage/references/channel-list.md +41 -0
  114. package/skills/te-engage/references/config-channel-detail.md +32 -0
  115. package/skills/te-engage/references/config-channel-list.md +27 -0
  116. package/skills/te-engage/references/config-item-analysis-report.md +34 -0
  117. package/skills/te-engage/references/config-item-detail.md +30 -0
  118. package/skills/te-engage/references/config-item-list.md +19 -0
  119. package/skills/te-engage/references/config-item-strategy-comparison.md +25 -0
  120. package/skills/te-engage/references/config-item-trigger-report.md +42 -0
  121. package/skills/te-engage/references/copy-config-template.md +29 -0
  122. package/skills/te-engage/references/delete-channel.md +24 -0
  123. package/skills/te-engage/references/delete-config-channel.md +24 -0
  124. package/skills/te-engage/references/delete-config-item.md +25 -0
  125. package/skills/te-engage/references/delete-flow.md +24 -0
  126. package/skills/te-engage/references/flow-ab-split-node-report.md +54 -0
  127. package/skills/te-engage/references/flow-detail.md +79 -0
  128. package/skills/te-engage/references/flow-list.md +19 -0
  129. package/skills/te-engage/references/flow-node-config-schema.md +44 -0
  130. package/skills/te-engage/references/flow-node-detail-report.md +55 -0
  131. package/skills/te-engage/references/flow-node-overview-report.md +52 -0
  132. package/skills/te-engage/references/flow-process-report.md +59 -0
  133. package/skills/te-engage/references/manage-flow.md +94 -0
  134. package/skills/te-engage/references/manage-strategy.md +74 -0
  135. package/skills/te-engage/references/manage-task.md +37 -0
  136. package/skills/te-engage/references/modify-flow-base-info.md +27 -0
  137. package/skills/te-engage/references/save-flow.md +870 -0
  138. package/skills/te-engage/references/strategy-detail.md +73 -0
  139. package/skills/te-engage/references/strategy-list.md +21 -0
  140. package/skills/te-engage/references/task-data-detail.md +81 -0
  141. package/skills/te-engage/references/task-data-overview.md +48 -0
  142. package/skills/te-engage/references/task-detail.md +61 -0
  143. package/skills/te-engage/references/task-experiment-report.md +51 -0
  144. package/skills/te-engage/references/task-list.md +91 -0
  145. package/skills/te-engage/references/task-metric-detail.md +56 -0
  146. package/skills/te-engage/references/task-stats.md +89 -0
  147. package/skills/te-engage/references/update-channel-status.md +32 -0
  148. package/skills/te-engage/references/update-config-channel-status.md +32 -0
  149. package/skills/te-engage/references/validate-flow-node-config.md +52 -0
  150. package/skills/te-engage/references/whitelist-list.md +19 -0
  151. package/skills/te-meta/SKILL.md +71 -0
  152. package/skills/te-meta/references/batch-create-metadata.md +37 -0
  153. package/skills/te-meta/references/batch-edit-metadata.md +36 -0
  154. package/skills/te-meta/references/create-metric.md +62 -0
  155. package/skills/te-meta/references/create-project-mark-time.md +38 -0
  156. package/skills/te-meta/references/create-virtual-event.md +64 -0
  157. package/skills/te-meta/references/create-virtual-property.md +69 -0
  158. package/skills/te-meta/references/delete-project-mark-times.md +34 -0
  159. package/skills/te-meta/references/delete-track-items.md +35 -0
  160. package/skills/te-meta/references/get-metric.md +32 -0
  161. package/skills/te-meta/references/get-project-config.md +32 -0
  162. package/skills/te-meta/references/get-track-program.md +31 -0
  163. package/skills/te-meta/references/list-entities.md +34 -0
  164. package/skills/te-meta/references/list-events.md +33 -0
  165. package/skills/te-meta/references/list-metrics.md +33 -0
  166. package/skills/te-meta/references/list-project-mark-times.md +33 -0
  167. package/skills/te-meta/references/list-project-users.md +32 -0
  168. package/skills/te-meta/references/list-properties.md +35 -0
  169. package/skills/te-meta/references/save-track-items.md +34 -0
  170. package/skills/te-meta/references/update-metric.md +61 -0
  171. package/skills/te-meta/references/update-project-mark-time.md +39 -0
  172. package/skills/te-shared/SKILL.md +115 -0
@@ -0,0 +1,242 @@
1
+ import {
2
+ getAuthStatus,
3
+ getToken
4
+ } from "./chunk-RJNLN3KQ.js";
5
+ import {
6
+ addHost,
7
+ listHosts,
8
+ removeHost,
9
+ setActiveHost,
10
+ updateHostLabel
11
+ } from "./chunk-OVQOK35G.js";
12
+
13
+ // src/commands/config.ts
14
+ import * as readline from "readline";
15
+ function registerConfig(program) {
16
+ program.command("config").description("Interactive TE host configuration manager").action(async () => {
17
+ await runConfigUI(program);
18
+ });
19
+ }
20
+ async function runConfigUI(program) {
21
+ const hosts = listHosts();
22
+ if (hosts.length === 0) {
23
+ process.stderr.write("\x1B[1m[ae-cli] No TE hosts configured. Let's add one.\x1B[0m\n\n");
24
+ const newHost = await promptNewHost();
25
+ if (!newHost) {
26
+ process.stderr.write("Cancelled.\n");
27
+ return;
28
+ }
29
+ addHost(newHost.url, newHost.label);
30
+ setActiveHost(newHost.url);
31
+ process.stderr.write(`
32
+ \x1B[32m\u2713\x1B[0m Added and activated: \x1B[1m${newHost.label}\x1B[0m ${newHost.url}
33
+ `);
34
+ await ensureAuth(newHost.url);
35
+ return;
36
+ }
37
+ await hostManagerLoop(program);
38
+ }
39
+ async function hostManagerLoop(program) {
40
+ while (true) {
41
+ const hosts = listHosts();
42
+ const items = hosts.map((h) => ({
43
+ display: formatHostLine(h),
44
+ type: "host",
45
+ url: h.url,
46
+ label: h.label,
47
+ active: h.active
48
+ }));
49
+ items.push({ display: "\x1B[2m + Add new host...\x1B[0m", type: "add", url: "", label: "", active: false });
50
+ const activeIdx = items.findIndex((i) => i.active);
51
+ process.stderr.write("\n\x1B[1mTE Host Manager\x1B[0m (\u2191\u2193 select \xB7 Enter switch \xB7 e edit label \xB7 d delete \xB7 a add \xB7 q quit)\n\n");
52
+ const result = await interactiveHostSelect(items, activeIdx >= 0 ? activeIdx : 0);
53
+ if (result.action === "quit" || result.action === "cancel") {
54
+ break;
55
+ }
56
+ const item = items[result.index];
57
+ if (result.action === "select") {
58
+ if (item.type === "add") {
59
+ await handleAddHost();
60
+ } else {
61
+ setActiveHost(item.url);
62
+ process.stderr.write(`
63
+ \x1B[32m\u2713\x1B[0m Switched to: \x1B[1m${item.label}\x1B[0m ${item.url}
64
+ `);
65
+ await ensureAuth(item.url);
66
+ break;
67
+ }
68
+ } else if (result.action === "edit" && item.type === "host") {
69
+ await handleEditLabel(item.url, item.label);
70
+ } else if (result.action === "delete" && item.type === "host") {
71
+ await handleDeleteHost(item.url, item.label, item.active);
72
+ } else if (result.action === "add") {
73
+ await handleAddHost();
74
+ }
75
+ }
76
+ }
77
+ function formatHostLine(h) {
78
+ const marker = h.active ? "\x1B[32m\u25CF\x1B[0m" : "\x1B[2m\u25CB\x1B[0m";
79
+ const labelText = h.active ? `\x1B[1;32m${h.label}\x1B[0m` : `\x1B[1m${h.label}\x1B[0m`;
80
+ const authInfo = getAuthStatus(h.url);
81
+ const authBadge = authInfo.authenticated ? `\x1B[32m\u2713\x1B[0m` : `\x1B[31m\u2717\x1B[0m`;
82
+ return `${marker} ${labelText} ${h.url} ${authBadge}`;
83
+ }
84
+ async function handleAddHost() {
85
+ const newHost = await promptNewHost();
86
+ if (!newHost) {
87
+ process.stderr.write("Cancelled.\n");
88
+ return;
89
+ }
90
+ addHost(newHost.url, newHost.label);
91
+ setActiveHost(newHost.url);
92
+ process.stderr.write(`
93
+ \x1B[32m\u2713\x1B[0m Added and activated: \x1B[1m${newHost.label}\x1B[0m ${newHost.url}
94
+ `);
95
+ await ensureAuth(newHost.url);
96
+ }
97
+ async function handleEditLabel(url, currentLabel) {
98
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
99
+ const newLabel = await new Promise(
100
+ (resolve) => rl.question(`
101
+ New label [${currentLabel}]: `, (a) => {
102
+ rl.close();
103
+ resolve(a.trim() || currentLabel);
104
+ })
105
+ );
106
+ if (newLabel !== currentLabel) {
107
+ updateHostLabel(url, newLabel);
108
+ process.stderr.write(`\x1B[32m\u2713\x1B[0m Label updated: ${newLabel}
109
+ `);
110
+ }
111
+ }
112
+ async function handleDeleteHost(url, label, isActive) {
113
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
114
+ const answer = await new Promise(
115
+ (resolve) => rl.question(`
116
+ Delete \x1B[1m${label}\x1B[0m (${url})? [y/N]: `, (a) => {
117
+ rl.close();
118
+ resolve(a.trim().toLowerCase());
119
+ })
120
+ );
121
+ if (answer === "y" || answer === "yes") {
122
+ removeHost(url);
123
+ process.stderr.write(`\x1B[32m\u2713\x1B[0m Deleted: ${label}
124
+ `);
125
+ if (isActive) {
126
+ const remaining = listHosts();
127
+ if (remaining.length > 0) {
128
+ process.stderr.write(` Active host switched to: ${remaining[0].label}
129
+ `);
130
+ } else {
131
+ process.stderr.write(" No hosts remaining. Run ae-cli config to add one.\n");
132
+ }
133
+ }
134
+ }
135
+ }
136
+ async function ensureAuth(hostUrl) {
137
+ const status = getAuthStatus(hostUrl);
138
+ if (status.authenticated) {
139
+ process.stderr.write(`\x1B[32m\u2713\x1B[0m Token valid for ${hostUrl}
140
+ `);
141
+ return;
142
+ }
143
+ process.stderr.write(`
144
+ \x1B[33m!\x1B[0m No valid token for ${hostUrl}. Starting login...
145
+ `);
146
+ try {
147
+ await getToken(hostUrl);
148
+ process.stderr.write(`\x1B[32m\u2713\x1B[0m Authenticated to ${hostUrl}
149
+ `);
150
+ } catch (err) {
151
+ process.stderr.write(`\x1B[31m\u2717\x1B[0m Auth failed: ${err.message}
152
+ `);
153
+ process.stderr.write(` You can set token manually: ae-cli auth set-token <token>
154
+ `);
155
+ }
156
+ }
157
+ async function promptNewHost() {
158
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
159
+ const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));
160
+ const url = await ask("TE host URL (e.g., https://ta.thinkingdata.cn): ");
161
+ if (!url) {
162
+ rl.close();
163
+ return null;
164
+ }
165
+ const label = await ask("Label: ");
166
+ rl.close();
167
+ if (!label) return null;
168
+ return { url: normalizeUrl(url), label };
169
+ }
170
+ function normalizeUrl(url) {
171
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
172
+ url = `https://${url}`;
173
+ }
174
+ return url.replace(/\/$/, "");
175
+ }
176
+ function interactiveHostSelect(items, initialIndex) {
177
+ return new Promise((resolve) => {
178
+ let cursor = initialIndex;
179
+ const stdin = process.stdin;
180
+ const stderr = process.stderr;
181
+ let renderCount = 0;
182
+ stderr.write("\x1B[?25l");
183
+ function render() {
184
+ if (renderCount > 0) {
185
+ stderr.write(`\x1B[${items.length}A`);
186
+ }
187
+ for (let i = 0; i < items.length; i++) {
188
+ const pointer = i === cursor ? "\x1B[36m\u276F\x1B[0m" : " ";
189
+ stderr.write(`${pointer} ${items[i].display}\x1B[K
190
+ `);
191
+ }
192
+ renderCount++;
193
+ }
194
+ render();
195
+ if (!stdin.isTTY) {
196
+ stderr.write("\x1B[?25h");
197
+ resolve({ action: "select", index: initialIndex });
198
+ return;
199
+ }
200
+ stdin.setRawMode(true);
201
+ stdin.resume();
202
+ stdin.setEncoding("utf8");
203
+ function cleanup() {
204
+ stdin.setRawMode(false);
205
+ stdin.pause();
206
+ stdin.removeListener("data", onData);
207
+ stderr.write("\x1B[?25h");
208
+ }
209
+ function onData(key) {
210
+ if (key === "\x1B[A" || key === "k") {
211
+ cursor = (cursor - 1 + items.length) % items.length;
212
+ render();
213
+ } else if (key === "\x1B[B" || key === "j") {
214
+ cursor = (cursor + 1) % items.length;
215
+ render();
216
+ } else if (key === "\r" || key === "\n") {
217
+ cleanup();
218
+ resolve({ action: "select", index: cursor });
219
+ } else if (key === "e" || key === "E") {
220
+ if (items[cursor].type === "host") {
221
+ cleanup();
222
+ resolve({ action: "edit", index: cursor });
223
+ }
224
+ } else if (key === "d" || key === "D") {
225
+ if (items[cursor].type === "host") {
226
+ cleanup();
227
+ resolve({ action: "delete", index: cursor });
228
+ }
229
+ } else if (key === "a" || key === "A") {
230
+ cleanup();
231
+ resolve({ action: "add", index: cursor });
232
+ } else if (key === "q" || key === "Q" || key === "\x1B" || key === "") {
233
+ cleanup();
234
+ resolve({ action: "quit", index: cursor });
235
+ }
236
+ }
237
+ stdin.on("data", onData);
238
+ });
239
+ }
240
+ export {
241
+ registerConfig
242
+ };
package/dist/index.js ADDED
@@ -0,0 +1,277 @@
1
+ import {
2
+ printError,
3
+ printOutput
4
+ } from "./chunk-KM57HI5B.js";
5
+ import {
6
+ getActiveHost
7
+ } from "./chunk-OVQOK35G.js";
8
+
9
+ // src/index.ts
10
+ import { Command as CommanderCommand } from "commander";
11
+ import { createRequire } from "module";
12
+
13
+ // src/framework/runner.ts
14
+ import * as readline from "readline";
15
+ async function runCommand(cmd, opts, globalOpts) {
16
+ try {
17
+ const ctx = createRuntimeContext(cmd, opts, globalOpts);
18
+ for (const flag of cmd.flags) {
19
+ if (flag.required) {
20
+ const val = opts[camelCase(flag.name)];
21
+ if (val === void 0 || val === null || val === "") {
22
+ printError("validation", `Missing required flag: --${flag.name}`, `Usage: ae-cli ${cmd.service} ${cmd.command} --${flag.name} <value>`);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ }
27
+ if (cmd.validate) {
28
+ cmd.validate(ctx);
29
+ }
30
+ if (globalOpts.dryRun) {
31
+ if (cmd.dryRun) {
32
+ const dryResult = cmd.dryRun(ctx);
33
+ printOutput(dryResult, globalOpts.format, globalOpts.jq);
34
+ } else {
35
+ printOutput({ message: "No dry-run implementation for this command" }, globalOpts.format);
36
+ }
37
+ return;
38
+ }
39
+ if (cmd.risk === "write" && !globalOpts.yes) {
40
+ const confirmed = await confirm(`This is a write operation (${cmd.service} ${cmd.command}). Continue?`);
41
+ if (!confirmed) {
42
+ process.stderr.write("Aborted.\n");
43
+ process.exit(0);
44
+ }
45
+ }
46
+ const result = await cmd.execute(ctx);
47
+ ctx.out(result);
48
+ } catch (err) {
49
+ const message = err.message || String(err);
50
+ if (message.includes("token") || message.includes("auth") || message.includes("401") || message.includes("403")) {
51
+ printError("auth", message, "Run: ae-cli auth login");
52
+ } else if (message.includes("TE API error")) {
53
+ printError("api", message);
54
+ } else {
55
+ printError("api", message);
56
+ }
57
+ process.exit(1);
58
+ }
59
+ }
60
+ function createRuntimeContext(cmd, opts, globalOpts) {
61
+ let _clientModule = null;
62
+ async function getClient() {
63
+ if (!_clientModule) {
64
+ _clientModule = await import("./client-5QSQBBDB.js");
65
+ }
66
+ return _clientModule;
67
+ }
68
+ const ctx = {
69
+ str(name) {
70
+ return String(opts[camelCase(name)] ?? "");
71
+ },
72
+ num(name) {
73
+ const val = opts[camelCase(name)];
74
+ return val !== void 0 ? Number(val) : 0;
75
+ },
76
+ bool(name) {
77
+ return Boolean(opts[camelCase(name)]);
78
+ },
79
+ json(name) {
80
+ const val = opts[camelCase(name)];
81
+ if (val === void 0 || val === null) return void 0;
82
+ if (typeof val === "object") return val;
83
+ try {
84
+ return JSON.parse(String(val));
85
+ } catch {
86
+ printError("validation", `Invalid JSON for --${name}: ${val}`);
87
+ process.exit(1);
88
+ }
89
+ },
90
+ async api(method, path, params, data) {
91
+ const client = await getClient();
92
+ if (method.toUpperCase() === "GET") {
93
+ return client.httpGet(path, params, ctx.host());
94
+ } else {
95
+ return client.httpPost(path, params, data, ctx.host());
96
+ }
97
+ },
98
+ async querySql(projectId, sql) {
99
+ const client = await getClient();
100
+ return client.querySql(projectId, sql, ctx.host());
101
+ },
102
+ async queryReportData(projectId, reportId, qp, eventModel, options) {
103
+ const client = await getClient();
104
+ return client.queryReportData(projectId, reportId, qp, eventModel, options, ctx.host());
105
+ },
106
+ async token() {
107
+ const { getToken } = await import("./auth-JXELJNDS.js");
108
+ return getToken(ctx.host());
109
+ },
110
+ host() {
111
+ if (globalOpts.host) return globalOpts.host;
112
+ return getActiveHost();
113
+ },
114
+ mcpUrl() {
115
+ return globalOpts.mcpUrl;
116
+ },
117
+ service() {
118
+ return cmd.service;
119
+ },
120
+ out(data) {
121
+ printOutput(data, globalOpts.format, globalOpts.jq);
122
+ }
123
+ };
124
+ return ctx;
125
+ }
126
+ function camelCase(str) {
127
+ return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
128
+ }
129
+ async function confirm(message) {
130
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
131
+ return new Promise((resolve) => {
132
+ rl.question(`${message} [y/N] `, (answer) => {
133
+ rl.close();
134
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
135
+ });
136
+ });
137
+ }
138
+
139
+ // src/framework/register.ts
140
+ function registerCommands(program2, commands) {
141
+ const byService = /* @__PURE__ */ new Map();
142
+ for (const cmd of commands) {
143
+ const list = byService.get(cmd.service) || [];
144
+ list.push(cmd);
145
+ byService.set(cmd.service, list);
146
+ }
147
+ for (const [service, cmds] of byService) {
148
+ let serviceCmd = program2.commands.find((c) => c.name() === service);
149
+ if (!serviceCmd) {
150
+ serviceCmd = program2.command(service).description(`${service} domain commands`);
151
+ }
152
+ for (const cmd of cmds) {
153
+ const sub = serviceCmd.command(cmd.command).description(cmd.description);
154
+ for (const flag of cmd.flags) {
155
+ const flagStr = buildFlagString(flag);
156
+ if (flag.type === "boolean") {
157
+ sub.option(flagStr, flag.desc, (value) => parseBooleanValue(value, flag.name));
158
+ } else if (flag.default !== void 0) {
159
+ sub.option(flagStr, flag.desc, String(flag.default));
160
+ } else {
161
+ sub.option(flagStr, flag.desc);
162
+ }
163
+ }
164
+ sub.action(async (opts) => {
165
+ const globalOpts = extractGlobalOptions(program2);
166
+ await runCommand(cmd, opts, globalOpts);
167
+ });
168
+ }
169
+ }
170
+ }
171
+ function buildFlagString(flag) {
172
+ const long = `--${flag.name}`;
173
+ const short = flag.alias ? `-${flag.alias}, ` : "";
174
+ if (flag.type === "boolean") {
175
+ return `${short}${long} [value]`;
176
+ }
177
+ return `${short}${long} <value>`;
178
+ }
179
+ function parseBooleanValue(value, flagName) {
180
+ if (value === void 0) {
181
+ return true;
182
+ }
183
+ const normalized = value.toLowerCase();
184
+ if (normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "y" || normalized === "on") {
185
+ return true;
186
+ }
187
+ if (normalized === "false" || normalized === "0" || normalized === "no" || normalized === "n" || normalized === "off") {
188
+ return false;
189
+ }
190
+ throw new Error(`Invalid boolean for --${flagName}: ${value}. Use true/false.`);
191
+ }
192
+ function extractGlobalOptions(program2) {
193
+ const opts = program2.opts();
194
+ return {
195
+ host: opts.host,
196
+ mcpUrl: opts.mcpUrl,
197
+ format: opts.format || "json",
198
+ jq: opts.jq,
199
+ dryRun: opts.dryRun || false,
200
+ yes: opts.yes || false
201
+ };
202
+ }
203
+
204
+ // src/index.ts
205
+ var require2 = createRequire(import.meta.url);
206
+ var { version } = require2("../package.json");
207
+ var program = new CommanderCommand();
208
+ program.name("ae-cli").version(version).description("CLI tool for ThinkingEngine (TE) analytics platform").option("--host <url>", "Override active TE host URL (e.g., https://ta.thinkingdata.cn)").option("--mcp-url <url>", "Override MCP server URL (e.g., http://localhost/mcp/http/example)").option("--format <format>", "Output format: json | table", "json").option("--jq <expr>", "jq filter expression").option("--dry-run", "Show request details without executing", false).option("--yes", "Skip confirmation for write operations", false);
209
+ async function loadCommands() {
210
+ const commands = [];
211
+ try {
212
+ const teAnalysis = await import("./te-analysis-7NN3SY3I.js");
213
+ commands.push(...teAnalysis.default);
214
+ } catch {
215
+ }
216
+ try {
217
+ const teAudience = await import("./te-audience-P43BWMHM.js");
218
+ commands.push(...teAudience.default);
219
+ } catch {
220
+ }
221
+ try {
222
+ const teMeta = await import("./te-meta-HGYNXVGF.js");
223
+ commands.push(...teMeta.default);
224
+ } catch {
225
+ }
226
+ try {
227
+ const teCommon = await import("./te-common-H3IPTI2I.js");
228
+ commands.push(...teCommon.default);
229
+ } catch {
230
+ }
231
+ try {
232
+ const engage = await import("./te-engage-UTRVNTGU.js");
233
+ commands.push(...engage.default);
234
+ } catch {
235
+ }
236
+ try {
237
+ const community = await import("./community-GMALVSRF.js");
238
+ commands.push(...community.default);
239
+ } catch {
240
+ }
241
+ try {
242
+ const dataops = await import("./te-dataops-WCGDBJLF.js");
243
+ commands.push(...dataops.default);
244
+ } catch {
245
+ }
246
+ return commands;
247
+ }
248
+ async function registerAuthCommands() {
249
+ try {
250
+ const { registerAuth } = await import("./auth-L3G3A74I.js");
251
+ registerAuth(program);
252
+ } catch {
253
+ }
254
+ }
255
+ async function registerConfigCommands() {
256
+ try {
257
+ const { registerConfig } = await import("./config-Q7J3Z7Z2.js");
258
+ registerConfig(program);
259
+ } catch {
260
+ }
261
+ }
262
+ async function registerApiCommand() {
263
+ try {
264
+ const { registerApi } = await import("./raw-ZNVURYMR.js");
265
+ registerApi(program);
266
+ } catch {
267
+ }
268
+ }
269
+ async function main() {
270
+ const commands = await loadCommands();
271
+ registerCommands(program, commands);
272
+ await registerAuthCommands();
273
+ await registerConfigCommands();
274
+ await registerApiCommand();
275
+ program.parse();
276
+ }
277
+ main();
@@ -0,0 +1,59 @@
1
+ import {
2
+ printError,
3
+ printOutput
4
+ } from "./chunk-KM57HI5B.js";
5
+ import {
6
+ httpGet,
7
+ httpPost
8
+ } from "./chunk-3GM5LJZR.js";
9
+ import {
10
+ resolveHost
11
+ } from "./chunk-RJNLN3KQ.js";
12
+ import "./chunk-OVQOK35G.js";
13
+
14
+ // src/api/raw.ts
15
+ function registerApi(program) {
16
+ program.command("api").description("Raw API call: ae-cli api <METHOD> <PATH> [options]").argument("<method>", "HTTP method (GET, POST)").argument("<path>", "API path (e.g., /v1/ta/event/catalog/listEvent)").option("--params <json>", "URL parameters as JSON").option("--data <json>", "Request body as JSON").action(async (method, apiPath, opts) => {
17
+ const globalOpts = program.opts();
18
+ const host = resolveHost(globalOpts.host);
19
+ const format = globalOpts.format || "json";
20
+ const jq = globalOpts.jq;
21
+ if (!host) {
22
+ printError("config", "No TE host configured.", "Run: ae-cli config set-host");
23
+ process.exit(1);
24
+ }
25
+ try {
26
+ let params = {};
27
+ let body = void 0;
28
+ if (opts.params) {
29
+ try {
30
+ params = JSON.parse(opts.params);
31
+ } catch {
32
+ printError("validation", `Invalid JSON for --params: ${opts.params}`);
33
+ process.exit(1);
34
+ }
35
+ }
36
+ if (opts.data) {
37
+ try {
38
+ body = JSON.parse(opts.data);
39
+ } catch {
40
+ printError("validation", `Invalid JSON for --data: ${opts.data}`);
41
+ process.exit(1);
42
+ }
43
+ }
44
+ let result;
45
+ if (method.toUpperCase() === "GET") {
46
+ result = await httpGet(apiPath, params, host);
47
+ } else {
48
+ result = await httpPost(apiPath, params, body, host);
49
+ }
50
+ printOutput(result, format, jq);
51
+ } catch (err) {
52
+ printError("api", err.message);
53
+ process.exit(1);
54
+ }
55
+ });
56
+ }
57
+ export {
58
+ registerApi
59
+ };