@optima-chat/ads-cli 0.5.0

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 (182) hide show
  1. package/.claude/CLAUDE.md +279 -0
  2. package/dist/commands/account/check.d.ts +6 -0
  3. package/dist/commands/account/check.d.ts.map +1 -0
  4. package/dist/commands/account/check.js +179 -0
  5. package/dist/commands/account/check.js.map +1 -0
  6. package/dist/commands/account/create.d.ts +6 -0
  7. package/dist/commands/account/create.d.ts.map +1 -0
  8. package/dist/commands/account/create.js +172 -0
  9. package/dist/commands/account/create.js.map +1 -0
  10. package/dist/commands/account/index.d.ts +6 -0
  11. package/dist/commands/account/index.d.ts.map +1 -0
  12. package/dist/commands/account/index.js +11 -0
  13. package/dist/commands/account/index.js.map +1 -0
  14. package/dist/commands/ad/create.d.ts +6 -0
  15. package/dist/commands/ad/create.d.ts.map +1 -0
  16. package/dist/commands/ad/create.js +77 -0
  17. package/dist/commands/ad/create.js.map +1 -0
  18. package/dist/commands/ad/delete.d.ts +6 -0
  19. package/dist/commands/ad/delete.d.ts.map +1 -0
  20. package/dist/commands/ad/delete.js +50 -0
  21. package/dist/commands/ad/delete.js.map +1 -0
  22. package/dist/commands/ad/index.d.ts +6 -0
  23. package/dist/commands/ad/index.d.ts.map +1 -0
  24. package/dist/commands/ad/index.js +17 -0
  25. package/dist/commands/ad/index.js.map +1 -0
  26. package/dist/commands/ad/info.d.ts +6 -0
  27. package/dist/commands/ad/info.d.ts.map +1 -0
  28. package/dist/commands/ad/info.js +90 -0
  29. package/dist/commands/ad/info.js.map +1 -0
  30. package/dist/commands/ad/list.d.ts +6 -0
  31. package/dist/commands/ad/list.d.ts.map +1 -0
  32. package/dist/commands/ad/list.js +94 -0
  33. package/dist/commands/ad/list.js.map +1 -0
  34. package/dist/commands/ad/update.d.ts +6 -0
  35. package/dist/commands/ad/update.d.ts.map +1 -0
  36. package/dist/commands/ad/update.js +42 -0
  37. package/dist/commands/ad/update.js.map +1 -0
  38. package/dist/commands/ad-group/create.d.ts +6 -0
  39. package/dist/commands/ad-group/create.d.ts.map +1 -0
  40. package/dist/commands/ad-group/create.js +59 -0
  41. package/dist/commands/ad-group/create.js.map +1 -0
  42. package/dist/commands/ad-group/delete.d.ts +6 -0
  43. package/dist/commands/ad-group/delete.d.ts.map +1 -0
  44. package/dist/commands/ad-group/delete.js +49 -0
  45. package/dist/commands/ad-group/delete.js.map +1 -0
  46. package/dist/commands/ad-group/index.d.ts +6 -0
  47. package/dist/commands/ad-group/index.d.ts.map +1 -0
  48. package/dist/commands/ad-group/index.js +17 -0
  49. package/dist/commands/ad-group/index.js.map +1 -0
  50. package/dist/commands/ad-group/info.d.ts +6 -0
  51. package/dist/commands/ad-group/info.d.ts.map +1 -0
  52. package/dist/commands/ad-group/info.js +59 -0
  53. package/dist/commands/ad-group/info.js.map +1 -0
  54. package/dist/commands/ad-group/list.d.ts +6 -0
  55. package/dist/commands/ad-group/list.d.ts.map +1 -0
  56. package/dist/commands/ad-group/list.js +83 -0
  57. package/dist/commands/ad-group/list.js.map +1 -0
  58. package/dist/commands/ad-group/update.d.ts +6 -0
  59. package/dist/commands/ad-group/update.d.ts.map +1 -0
  60. package/dist/commands/ad-group/update.js +56 -0
  61. package/dist/commands/ad-group/update.js.map +1 -0
  62. package/dist/commands/auth/index.d.ts +6 -0
  63. package/dist/commands/auth/index.d.ts.map +1 -0
  64. package/dist/commands/auth/index.js +13 -0
  65. package/dist/commands/auth/index.js.map +1 -0
  66. package/dist/commands/auth/login.d.ts +10 -0
  67. package/dist/commands/auth/login.d.ts.map +1 -0
  68. package/dist/commands/auth/login.js +154 -0
  69. package/dist/commands/auth/login.js.map +1 -0
  70. package/dist/commands/auth/logout.d.ts +6 -0
  71. package/dist/commands/auth/logout.d.ts.map +1 -0
  72. package/dist/commands/auth/logout.js +28 -0
  73. package/dist/commands/auth/logout.js.map +1 -0
  74. package/dist/commands/auth/status.d.ts +6 -0
  75. package/dist/commands/auth/status.d.ts.map +1 -0
  76. package/dist/commands/auth/status.js +47 -0
  77. package/dist/commands/auth/status.js.map +1 -0
  78. package/dist/commands/campaign/create.d.ts +6 -0
  79. package/dist/commands/campaign/create.d.ts.map +1 -0
  80. package/dist/commands/campaign/create.js +58 -0
  81. package/dist/commands/campaign/create.js.map +1 -0
  82. package/dist/commands/campaign/delete.d.ts +6 -0
  83. package/dist/commands/campaign/delete.d.ts.map +1 -0
  84. package/dist/commands/campaign/delete.js +49 -0
  85. package/dist/commands/campaign/delete.js.map +1 -0
  86. package/dist/commands/campaign/index.d.ts +6 -0
  87. package/dist/commands/campaign/index.d.ts.map +1 -0
  88. package/dist/commands/campaign/index.js +17 -0
  89. package/dist/commands/campaign/index.js.map +1 -0
  90. package/dist/commands/campaign/info.d.ts +6 -0
  91. package/dist/commands/campaign/info.d.ts.map +1 -0
  92. package/dist/commands/campaign/info.js +57 -0
  93. package/dist/commands/campaign/info.js.map +1 -0
  94. package/dist/commands/campaign/list.d.ts +6 -0
  95. package/dist/commands/campaign/list.d.ts.map +1 -0
  96. package/dist/commands/campaign/list.js +71 -0
  97. package/dist/commands/campaign/list.js.map +1 -0
  98. package/dist/commands/campaign/update.d.ts +6 -0
  99. package/dist/commands/campaign/update.d.ts.map +1 -0
  100. package/dist/commands/campaign/update.js +56 -0
  101. package/dist/commands/campaign/update.js.map +1 -0
  102. package/dist/commands/config.d.ts +6 -0
  103. package/dist/commands/config.d.ts.map +1 -0
  104. package/dist/commands/config.js +104 -0
  105. package/dist/commands/config.js.map +1 -0
  106. package/dist/commands/keyword/add.d.ts +6 -0
  107. package/dist/commands/keyword/add.d.ts.map +1 -0
  108. package/dist/commands/keyword/add.js +47 -0
  109. package/dist/commands/keyword/add.js.map +1 -0
  110. package/dist/commands/keyword/delete.d.ts +6 -0
  111. package/dist/commands/keyword/delete.d.ts.map +1 -0
  112. package/dist/commands/keyword/delete.js +50 -0
  113. package/dist/commands/keyword/delete.js.map +1 -0
  114. package/dist/commands/keyword/index.d.ts +6 -0
  115. package/dist/commands/keyword/index.d.ts.map +1 -0
  116. package/dist/commands/keyword/index.js +15 -0
  117. package/dist/commands/keyword/index.js.map +1 -0
  118. package/dist/commands/keyword/list.d.ts +6 -0
  119. package/dist/commands/keyword/list.d.ts.map +1 -0
  120. package/dist/commands/keyword/list.js +77 -0
  121. package/dist/commands/keyword/list.js.map +1 -0
  122. package/dist/commands/keyword/update.d.ts +6 -0
  123. package/dist/commands/keyword/update.d.ts.map +1 -0
  124. package/dist/commands/keyword/update.js +51 -0
  125. package/dist/commands/keyword/update.js.map +1 -0
  126. package/dist/commands/query.d.ts +6 -0
  127. package/dist/commands/query.d.ts.map +1 -0
  128. package/dist/commands/query.js +71 -0
  129. package/dist/commands/query.js.map +1 -0
  130. package/dist/config.d.ts +32 -0
  131. package/dist/config.d.ts.map +1 -0
  132. package/dist/config.js +10 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/index.d.ts +7 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +75 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/lib/api-client.d.ts +100 -0
  139. package/dist/lib/api-client.d.ts.map +1 -0
  140. package/dist/lib/api-client.js +186 -0
  141. package/dist/lib/api-client.js.map +1 -0
  142. package/dist/lib/callback-server.d.ts +32 -0
  143. package/dist/lib/callback-server.d.ts.map +1 -0
  144. package/dist/lib/callback-server.js +132 -0
  145. package/dist/lib/callback-server.js.map +1 -0
  146. package/dist/lib/google-ads-client.d.ts +177 -0
  147. package/dist/lib/google-ads-client.d.ts.map +1 -0
  148. package/dist/lib/google-ads-client.js +826 -0
  149. package/dist/lib/google-ads-client.js.map +1 -0
  150. package/dist/lib/oauth2-manager.d.ts +27 -0
  151. package/dist/lib/oauth2-manager.d.ts.map +1 -0
  152. package/dist/lib/oauth2-manager.js +123 -0
  153. package/dist/lib/oauth2-manager.js.map +1 -0
  154. package/dist/lib/token-store.d.ts +43 -0
  155. package/dist/lib/token-store.d.ts.map +1 -0
  156. package/dist/lib/token-store.js +103 -0
  157. package/dist/lib/token-store.js.map +1 -0
  158. package/dist/utils/config.d.ts +9 -0
  159. package/dist/utils/config.d.ts.map +1 -0
  160. package/dist/utils/config.js +34 -0
  161. package/dist/utils/config.js.map +1 -0
  162. package/dist/utils/customer-id.d.ts +10 -0
  163. package/dist/utils/customer-id.d.ts.map +1 -0
  164. package/dist/utils/customer-id.js +29 -0
  165. package/dist/utils/customer-id.js.map +1 -0
  166. package/dist/utils/env-updater.d.ts +8 -0
  167. package/dist/utils/env-updater.d.ts.map +1 -0
  168. package/dist/utils/env-updater.js +45 -0
  169. package/dist/utils/env-updater.js.map +1 -0
  170. package/dist/utils/errors.d.ts +32 -0
  171. package/dist/utils/errors.d.ts.map +1 -0
  172. package/dist/utils/errors.js +68 -0
  173. package/dist/utils/errors.js.map +1 -0
  174. package/dist/utils/logger.d.ts +10 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +25 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/dist/utils/optima-config.d.ts +9 -0
  179. package/dist/utils/optima-config.d.ts.map +1 -0
  180. package/dist/utils/optima-config.js +83 -0
  181. package/dist/utils/optima-config.js.map +1 -0
  182. package/package.json +67 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * API Client - 调用 ads-backend REST API
3
+ */
4
+ export interface ApiClientConfig {
5
+ baseUrl?: string;
6
+ }
7
+ export declare class ApiClient {
8
+ private client;
9
+ private tokenStore;
10
+ constructor(config?: ApiClientConfig);
11
+ getAuthStatus(): Promise<{
12
+ connected: boolean;
13
+ accessibleCustomerIds: string[];
14
+ }>;
15
+ getConnectUrl(): string;
16
+ disconnect(): Promise<void>;
17
+ listAccounts(): Promise<{
18
+ accounts: Array<{
19
+ customerId: string;
20
+ }>;
21
+ }>;
22
+ getAccount(customerId: string): Promise<unknown>;
23
+ checkAccount(customerId: string): Promise<{
24
+ connected: boolean;
25
+ customerId: string;
26
+ info?: unknown;
27
+ }>;
28
+ listCampaigns(customerId: string, options?: {
29
+ status?: string;
30
+ limit?: number;
31
+ }): Promise<unknown[]>;
32
+ getCampaign(customerId: string, campaignId: string): Promise<unknown>;
33
+ createCampaign(customerId: string, campaign: {
34
+ name: string;
35
+ budgetAmountMicros: number;
36
+ advertisingChannelType?: string;
37
+ status?: string;
38
+ }): Promise<unknown>;
39
+ updateCampaign(customerId: string, campaignId: string, update: {
40
+ name?: string;
41
+ status?: string;
42
+ budgetAmountMicros?: number;
43
+ }): Promise<unknown>;
44
+ deleteCampaign(customerId: string, campaignId: string): Promise<unknown>;
45
+ listAdGroups(customerId: string, options?: {
46
+ campaignId?: string;
47
+ status?: string;
48
+ limit?: number;
49
+ }): Promise<unknown[]>;
50
+ getAdGroup(customerId: string, adGroupId: string): Promise<unknown>;
51
+ createAdGroup(customerId: string, adGroup: {
52
+ name: string;
53
+ campaignId: string;
54
+ cpcBidMicros?: number;
55
+ status?: string;
56
+ }): Promise<unknown>;
57
+ updateAdGroup(customerId: string, adGroupId: string, update: {
58
+ name?: string;
59
+ status?: string;
60
+ cpcBidMicros?: number;
61
+ }): Promise<unknown>;
62
+ deleteAdGroup(customerId: string, adGroupId: string): Promise<unknown>;
63
+ listKeywords(customerId: string, options?: {
64
+ campaignId?: string;
65
+ status?: string;
66
+ limit?: number;
67
+ }): Promise<unknown[]>;
68
+ addKeywords(customerId: string, adGroupId: string, keywords: Array<{
69
+ text: string;
70
+ matchType?: string;
71
+ }>): Promise<unknown>;
72
+ updateKeyword(customerId: string, adGroupId: string, criterionId: string, update: {
73
+ status?: string;
74
+ cpcBidMicros?: number;
75
+ }): Promise<unknown>;
76
+ deleteKeyword(customerId: string, adGroupId: string, criterionId: string): Promise<unknown>;
77
+ listAds(customerId: string, options?: {
78
+ campaignId?: string;
79
+ adGroupId?: string;
80
+ status?: string;
81
+ limit?: number;
82
+ }): Promise<unknown[]>;
83
+ getAd(customerId: string, adGroupId: string, adId: string): Promise<unknown>;
84
+ createAd(customerId: string, ad: {
85
+ adGroupId: string;
86
+ headlines: string[];
87
+ descriptions: string[];
88
+ finalUrl: string;
89
+ path1?: string;
90
+ path2?: string;
91
+ status?: string;
92
+ }): Promise<unknown>;
93
+ updateAd(customerId: string, adGroupId: string, adId: string, update: {
94
+ status?: string;
95
+ }): Promise<unknown>;
96
+ deleteAd(customerId: string, adGroupId: string, adId: string): Promise<unknown>;
97
+ query(customerId: string, gaqlQuery: string): Promise<unknown[]>;
98
+ }
99
+ export declare function getApiClient(): ApiClient;
100
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * API Client - 调用 ads-backend REST API
3
+ */
4
+ import axios from 'axios';
5
+ import { TokenStore } from './token-store.js';
6
+ export class ApiClient {
7
+ client;
8
+ tokenStore;
9
+ constructor(config) {
10
+ const baseUrl = config?.baseUrl ||
11
+ process.env.ADS_BACKEND_URL ||
12
+ 'https://ads-api.optima.onl';
13
+ this.tokenStore = new TokenStore();
14
+ this.client = axios.create({
15
+ baseURL: `${baseUrl}/api/v1`,
16
+ timeout: 30000,
17
+ headers: {
18
+ 'Content-Type': 'application/json',
19
+ },
20
+ });
21
+ // Add auth token to requests
22
+ this.client.interceptors.request.use(async (config) => {
23
+ const token = await this.tokenStore.getToken();
24
+ if (token) {
25
+ config.headers.Authorization = `Bearer ${token}`;
26
+ }
27
+ return config;
28
+ });
29
+ // Handle errors
30
+ this.client.interceptors.response.use((response) => response, (error) => {
31
+ if (error.response?.status === 401) {
32
+ throw new Error('未授权访问。请运行 `google-ads auth login` 登录。');
33
+ }
34
+ const message = error.response?.data?.message ||
35
+ error.message;
36
+ throw new Error(message);
37
+ });
38
+ }
39
+ // ============ Auth ============
40
+ async getAuthStatus() {
41
+ const { data } = await this.client.get('/auth/google-ads/status');
42
+ return data;
43
+ }
44
+ getConnectUrl() {
45
+ const baseUrl = process.env.ADS_BACKEND_URL || 'https://ads-api.optima.onl';
46
+ return `${baseUrl}/api/v1/auth/google-ads/connect`;
47
+ }
48
+ async disconnect() {
49
+ await this.client.delete('/auth/google-ads/disconnect');
50
+ }
51
+ // ============ Accounts ============
52
+ async listAccounts() {
53
+ const { data } = await this.client.get('/accounts');
54
+ return data;
55
+ }
56
+ async getAccount(customerId) {
57
+ const { data } = await this.client.get(`/accounts/${customerId}`);
58
+ return data;
59
+ }
60
+ async checkAccount(customerId) {
61
+ const { data } = await this.client.get(`/accounts/${customerId}/check`);
62
+ return data;
63
+ }
64
+ // ============ Campaigns ============
65
+ async listCampaigns(customerId, options) {
66
+ const params = new URLSearchParams();
67
+ if (options?.status)
68
+ params.append('status', options.status);
69
+ if (options?.limit)
70
+ params.append('limit', String(options.limit));
71
+ const { data } = await this.client.get(`/customers/${customerId}/campaigns?${params}`);
72
+ return data;
73
+ }
74
+ async getCampaign(customerId, campaignId) {
75
+ const { data } = await this.client.get(`/customers/${customerId}/campaigns/${campaignId}`);
76
+ return data;
77
+ }
78
+ async createCampaign(customerId, campaign) {
79
+ const { data } = await this.client.post(`/customers/${customerId}/campaigns`, campaign);
80
+ return data;
81
+ }
82
+ async updateCampaign(customerId, campaignId, update) {
83
+ const { data } = await this.client.patch(`/customers/${customerId}/campaigns/${campaignId}`, update);
84
+ return data;
85
+ }
86
+ async deleteCampaign(customerId, campaignId) {
87
+ const { data } = await this.client.delete(`/customers/${customerId}/campaigns/${campaignId}`);
88
+ return data;
89
+ }
90
+ // ============ Ad Groups ============
91
+ async listAdGroups(customerId, options) {
92
+ const params = new URLSearchParams();
93
+ if (options?.campaignId)
94
+ params.append('campaignId', options.campaignId);
95
+ if (options?.status)
96
+ params.append('status', options.status);
97
+ if (options?.limit)
98
+ params.append('limit', String(options.limit));
99
+ const { data } = await this.client.get(`/customers/${customerId}/ad-groups?${params}`);
100
+ return data;
101
+ }
102
+ async getAdGroup(customerId, adGroupId) {
103
+ const { data } = await this.client.get(`/customers/${customerId}/ad-groups/${adGroupId}`);
104
+ return data;
105
+ }
106
+ async createAdGroup(customerId, adGroup) {
107
+ const { data } = await this.client.post(`/customers/${customerId}/ad-groups`, adGroup);
108
+ return data;
109
+ }
110
+ async updateAdGroup(customerId, adGroupId, update) {
111
+ const { data } = await this.client.patch(`/customers/${customerId}/ad-groups/${adGroupId}`, update);
112
+ return data;
113
+ }
114
+ async deleteAdGroup(customerId, adGroupId) {
115
+ const { data } = await this.client.delete(`/customers/${customerId}/ad-groups/${adGroupId}`);
116
+ return data;
117
+ }
118
+ // ============ Keywords ============
119
+ async listKeywords(customerId, options) {
120
+ const params = new URLSearchParams();
121
+ if (options?.campaignId)
122
+ params.append('campaignId', options.campaignId);
123
+ if (options?.status)
124
+ params.append('status', options.status);
125
+ if (options?.limit)
126
+ params.append('limit', String(options.limit));
127
+ const { data } = await this.client.get(`/customers/${customerId}/keywords?${params}`);
128
+ return data;
129
+ }
130
+ async addKeywords(customerId, adGroupId, keywords) {
131
+ const { data } = await this.client.post(`/customers/${customerId}/keywords`, { adGroupId, keywords });
132
+ return data;
133
+ }
134
+ async updateKeyword(customerId, adGroupId, criterionId, update) {
135
+ const { data } = await this.client.patch(`/customers/${customerId}/keywords/${adGroupId}/${criterionId}`, update);
136
+ return data;
137
+ }
138
+ async deleteKeyword(customerId, adGroupId, criterionId) {
139
+ const { data } = await this.client.delete(`/customers/${customerId}/keywords/${adGroupId}/${criterionId}`);
140
+ return data;
141
+ }
142
+ // ============ Ads ============
143
+ async listAds(customerId, options) {
144
+ const params = new URLSearchParams();
145
+ if (options?.campaignId)
146
+ params.append('campaignId', options.campaignId);
147
+ if (options?.adGroupId)
148
+ params.append('adGroupId', options.adGroupId);
149
+ if (options?.status)
150
+ params.append('status', options.status);
151
+ if (options?.limit)
152
+ params.append('limit', String(options.limit));
153
+ const { data } = await this.client.get(`/customers/${customerId}/ads?${params}`);
154
+ return data;
155
+ }
156
+ async getAd(customerId, adGroupId, adId) {
157
+ const { data } = await this.client.get(`/customers/${customerId}/ads/${adGroupId}/${adId}`);
158
+ return data;
159
+ }
160
+ async createAd(customerId, ad) {
161
+ const { data } = await this.client.post(`/customers/${customerId}/ads`, ad);
162
+ return data;
163
+ }
164
+ async updateAd(customerId, adGroupId, adId, update) {
165
+ const { data } = await this.client.patch(`/customers/${customerId}/ads/${adGroupId}/${adId}`, update);
166
+ return data;
167
+ }
168
+ async deleteAd(customerId, adGroupId, adId) {
169
+ const { data } = await this.client.delete(`/customers/${customerId}/ads/${adGroupId}/${adId}`);
170
+ return data;
171
+ }
172
+ // ============ Query ============
173
+ async query(customerId, gaqlQuery) {
174
+ const { data } = await this.client.post(`/customers/${customerId}/query`, { query: gaqlQuery });
175
+ return data;
176
+ }
177
+ }
178
+ // Singleton instance
179
+ let apiClient = null;
180
+ export function getApiClient() {
181
+ if (!apiClient) {
182
+ apiClient = new ApiClient();
183
+ }
184
+ return apiClient;
185
+ }
186
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * OAuth2 Callback Server - 本地服务器接收 OAuth 回调
3
+ */
4
+ export declare class CallbackServer {
5
+ private app;
6
+ private server;
7
+ private port;
8
+ private codeResolver;
9
+ private errorResolver;
10
+ constructor(port?: number);
11
+ /**
12
+ * 设置路由
13
+ */
14
+ private setupRoutes;
15
+ /**
16
+ * 启动服务器
17
+ */
18
+ start(): Promise<void>;
19
+ /**
20
+ * 等待 OAuth 回调
21
+ */
22
+ waitForCallback(): Promise<string>;
23
+ /**
24
+ * 关闭服务器
25
+ */
26
+ close(): Promise<void>;
27
+ /**
28
+ * 获取端口号
29
+ */
30
+ getPort(): number;
31
+ }
32
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/lib/callback-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAAyC;gBAElD,IAAI,GAAE,MAAa;IAM/B;;OAEG;IACH,OAAO,CAAC,WAAW;IA+DnB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAYlC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * OAuth2 Callback Server - 本地服务器接收 OAuth 回调
3
+ */
4
+ import express from 'express';
5
+ export class CallbackServer {
6
+ app;
7
+ server = null;
8
+ port;
9
+ codeResolver = null;
10
+ errorResolver = null;
11
+ constructor(port = 9001) {
12
+ this.port = port;
13
+ this.app = express();
14
+ this.setupRoutes();
15
+ }
16
+ /**
17
+ * 设置路由
18
+ */
19
+ setupRoutes() {
20
+ // OAuth 回调路由
21
+ this.app.get('/callback', (req, res) => {
22
+ const { code, error } = req.query;
23
+ if (error) {
24
+ res.send(`
25
+ <html>
26
+ <body style="font-family: sans-serif; padding: 40px; text-align: center;">
27
+ <h1 style="color: #e74c3c;">❌ 授权失败</h1>
28
+ <p>错误: ${error}</p>
29
+ <p style="color: #7f8c8d;">您可以关闭此窗口</p>
30
+ </body>
31
+ </html>
32
+ `);
33
+ if (this.errorResolver) {
34
+ this.errorResolver(new Error(`OAuth 授权失败: ${error}`));
35
+ }
36
+ return;
37
+ }
38
+ if (!code || typeof code !== 'string') {
39
+ res.send(`
40
+ <html>
41
+ <body style="font-family: sans-serif; padding: 40px; text-align: center;">
42
+ <h1 style="color: #e74c3c;">❌ 授权失败</h1>
43
+ <p>未收到授权码</p>
44
+ <p style="color: #7f8c8d;">您可以关闭此窗口</p>
45
+ </body>
46
+ </html>
47
+ `);
48
+ if (this.errorResolver) {
49
+ this.errorResolver(new Error('未收到授权码'));
50
+ }
51
+ return;
52
+ }
53
+ // 成功
54
+ res.send(`
55
+ <html>
56
+ <body style="font-family: sans-serif; padding: 40px; text-align: center;">
57
+ <h1 style="color: #27ae60;">✅ 授权成功!</h1>
58
+ <p>您可以关闭此窗口,返回终端继续操作</p>
59
+ <script>
60
+ setTimeout(() => window.close(), 2000);
61
+ </script>
62
+ </body>
63
+ </html>
64
+ `);
65
+ if (this.codeResolver) {
66
+ this.codeResolver(code);
67
+ }
68
+ });
69
+ // 健康检查
70
+ this.app.get('/health', (req, res) => {
71
+ res.send('OK');
72
+ });
73
+ }
74
+ /**
75
+ * 启动服务器
76
+ */
77
+ start() {
78
+ return new Promise((resolve, reject) => {
79
+ try {
80
+ this.server = this.app.listen(this.port, () => {
81
+ resolve();
82
+ });
83
+ this.server.on('error', (error) => {
84
+ if (error.code === 'EADDRINUSE') {
85
+ reject(new Error(`端口 ${this.port} 已被占用,请使用 --port 指定其他端口`));
86
+ }
87
+ else {
88
+ reject(error);
89
+ }
90
+ });
91
+ }
92
+ catch (error) {
93
+ reject(error);
94
+ }
95
+ });
96
+ }
97
+ /**
98
+ * 等待 OAuth 回调
99
+ */
100
+ waitForCallback() {
101
+ return new Promise((resolve, reject) => {
102
+ this.codeResolver = resolve;
103
+ this.errorResolver = reject;
104
+ // 设置超时(5 分钟)
105
+ setTimeout(() => {
106
+ reject(new Error('等待授权超时(5 分钟),请重试'));
107
+ }, 5 * 60 * 1000);
108
+ });
109
+ }
110
+ /**
111
+ * 关闭服务器
112
+ */
113
+ close() {
114
+ return new Promise((resolve) => {
115
+ if (this.server) {
116
+ this.server.close(() => {
117
+ resolve();
118
+ });
119
+ }
120
+ else {
121
+ resolve();
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * 获取端口号
127
+ */
128
+ getPort() {
129
+ return this.port;
130
+ }
131
+ }
132
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../src/lib/callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Google Ads Client - 封装 Google Ads API
3
+ */
4
+ import { Customer } from 'google-ads-api';
5
+ /**
6
+ * Google Ads Client 封装类
7
+ */
8
+ export declare class GoogleAdsClient {
9
+ private api;
10
+ private oauth;
11
+ private config;
12
+ constructor();
13
+ /**
14
+ * 获取 Customer 对象(带认证)
15
+ */
16
+ getCustomer(customerId: string): Promise<Customer>;
17
+ /**
18
+ * 执行 GAQL 查询
19
+ */
20
+ query(customerId: string, gaqlQuery: string): Promise<any[]>;
21
+ /**
22
+ * 获取客户账号信息
23
+ */
24
+ getCustomerInfo(customerId: string): Promise<any>;
25
+ /**
26
+ * 列出可访问的客户账号
27
+ */
28
+ listAccessibleCustomers(): Promise<string[]>;
29
+ /**
30
+ * 列出广告系列
31
+ */
32
+ listCampaigns(customerId: string, options?: {
33
+ status?: string;
34
+ limit?: number;
35
+ }): Promise<any[]>;
36
+ /**
37
+ * 获取广告系列详情
38
+ */
39
+ getCampaign(customerId: string, campaignId: string): Promise<any>;
40
+ /**
41
+ * 列出广告组
42
+ */
43
+ listAdGroups(customerId: string, campaignId?: string, options?: {
44
+ status?: string;
45
+ limit?: number;
46
+ }): Promise<any[]>;
47
+ /**
48
+ * 获取广告组详情
49
+ */
50
+ getAdGroup(customerId: string, adGroupId: string): Promise<any>;
51
+ /**
52
+ * 更新广告组
53
+ */
54
+ updateAdGroup(customerId: string, adGroupId: string, updateData: {
55
+ status?: string;
56
+ name?: string;
57
+ cpcBidMicros?: number;
58
+ }): Promise<any>;
59
+ /**
60
+ * 列出关键词
61
+ */
62
+ listKeywords(customerId: string, campaignId?: string, options?: {
63
+ status?: string;
64
+ limit?: number;
65
+ }): Promise<any[]>;
66
+ /**
67
+ * 获取效果数据
68
+ */
69
+ getPerformanceMetrics(customerId: string, options: {
70
+ level: 'campaign' | 'ad_group' | 'keyword' | 'ad';
71
+ dateRange?: string;
72
+ campaignId?: string;
73
+ limit?: number;
74
+ }): Promise<any[]>;
75
+ /**
76
+ * 创建广告系列
77
+ *
78
+ * 使用 mutateResources API 批量创建预算和广告系列
79
+ */
80
+ createCampaign(customerId: string, campaignData: {
81
+ name: string;
82
+ budget_amount_micros: number;
83
+ advertising_channel_type?: string;
84
+ status?: string;
85
+ }): Promise<any>;
86
+ /**
87
+ * 创建广告组
88
+ */
89
+ createAdGroup(customerId: string, adGroupData: {
90
+ name: string;
91
+ campaign_id: string;
92
+ cpc_bid_micros?: number;
93
+ status?: string;
94
+ }): Promise<any>;
95
+ /**
96
+ * 添加关键词
97
+ */
98
+ addKeywords(customerId: string, adGroupId: string, keywords: Array<{
99
+ text: string;
100
+ match_type?: string;
101
+ }>): Promise<any>;
102
+ /**
103
+ * 删除广告系列
104
+ */
105
+ deleteCampaign(customerId: string, campaignId: string): Promise<any>;
106
+ /**
107
+ * 删除广告组
108
+ */
109
+ deleteAdGroup(customerId: string, adGroupId: string): Promise<any>;
110
+ /**
111
+ * 删除关键词
112
+ */
113
+ deleteKeyword(customerId: string, adGroupId: string, criterionId: string): Promise<any>;
114
+ /**
115
+ * 更新关键词(状态、出价)
116
+ */
117
+ updateKeyword(customerId: string, adGroupId: string, criterionId: string, updateData: {
118
+ status?: string;
119
+ cpcBidMicros?: number;
120
+ }): Promise<any>;
121
+ /**
122
+ * 更新广告系列状态
123
+ */
124
+ updateCampaignStatus(customerId: string, campaignId: string, status: 'ENABLED' | 'PAUSED' | 'REMOVED'): Promise<any>;
125
+ /**
126
+ * 更新广告系列(支持状态、名称、预算)
127
+ */
128
+ updateCampaign(customerId: string, campaignId: string, updateData: {
129
+ status?: string;
130
+ name?: string;
131
+ budgetAmountMicros?: number;
132
+ }): Promise<any>;
133
+ /**
134
+ * 列出广告
135
+ */
136
+ listAds(customerId: string, options?: {
137
+ campaignId?: string;
138
+ adGroupId?: string;
139
+ status?: string;
140
+ limit?: number;
141
+ }): Promise<any[]>;
142
+ /**
143
+ * 获取广告详情
144
+ */
145
+ getAd(customerId: string, adGroupId: string, adId: string): Promise<any>;
146
+ /**
147
+ * 更新广告状态
148
+ */
149
+ updateAd(customerId: string, adGroupId: string, adId: string, updateData: {
150
+ status?: string;
151
+ }): Promise<any>;
152
+ /**
153
+ * 创建响应式搜索广告 (RSA)
154
+ */
155
+ createAd(customerId: string, adData: {
156
+ adGroupId: string;
157
+ headlines: string[];
158
+ descriptions: string[];
159
+ finalUrl: string;
160
+ path1?: string;
161
+ path2?: string;
162
+ status?: string;
163
+ }): Promise<any>;
164
+ /**
165
+ * 删除广告
166
+ */
167
+ deleteAd(customerId: string, adGroupId: string, adId: string): Promise<any>;
168
+ /**
169
+ * 发送 MCC 关联邀请
170
+ * 从 Manager Account (MCC) 向客户账号发送关联邀请
171
+ *
172
+ * @param clientCustomerId 客户账号的 Customer ID
173
+ * @returns manager_link_id 用于客户接受邀请
174
+ */
175
+ sendLinkInvitation(clientCustomerId: string): Promise<string>;
176
+ }
177
+ //# sourceMappingURL=google-ads-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-ads-client.d.ts","sourceRoot":"","sources":["../../src/lib/google-ads-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAgB,QAAQ,EAAoC,MAAM,gBAAgB,CAAC;AAK1F;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAgC;;IAc9C;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBxD;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAclE;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAmBvD;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBlD;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAChD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAoClB;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BvE;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACpE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAsClB;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsBrE;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;QACrE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,GAAG,CAAC;IAgChB;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACpE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA4ClB;;OAEG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;QACvD,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;QAClD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAgFlB;;;;OAIG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE;QACrD,IAAI,EAAE,MAAM,CAAC;QACb,oBAAoB,EAAE,MAAM,CAAC;QAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IA0DhB;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE;QACnD,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BhB;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BjB;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY1E;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAYxE;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY7F;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE;QAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,GAAG,CAAC;IA6BhB;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;IAI1H;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;QACvE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC,GAAG,CAAC;IAiEhB;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA6ClB;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA4B9E;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;QAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BhB;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;QACzC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IAgChB;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAYjF;;;;;;OAMG;IACG,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA8EpE"}