@clize/clize 0.7.6 → 0.7.8

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 (46) hide show
  1. package/README.md +14 -13
  2. package/dist/cli.js +207 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.js +6 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/addresses.js +1 -1
  7. package/dist/core/addresses.js.map +1 -1
  8. package/dist/core/billing.js +1 -1
  9. package/dist/core/billing.js.map +1 -1
  10. package/dist/core/domains.js +39 -3
  11. package/dist/core/domains.js.map +1 -1
  12. package/dist/core/email.js +13 -2
  13. package/dist/core/email.js.map +1 -1
  14. package/dist/core/media.js +409 -0
  15. package/dist/core/media.js.map +1 -0
  16. package/dist/index.js +4 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/providers/email/cloudflare-outbound.js +8 -0
  19. package/dist/providers/email/cloudflare-outbound.js.map +1 -1
  20. package/dist/providers/email/resend.js +1 -0
  21. package/dist/providers/email/resend.js.map +1 -1
  22. package/dist/providers/email/ses.js +2 -0
  23. package/dist/providers/email/ses.js.map +1 -1
  24. package/dist/providers/index.js +20 -0
  25. package/dist/providers/index.js.map +1 -1
  26. package/dist/providers/media/google.js +153 -0
  27. package/dist/providers/media/google.js.map +1 -0
  28. package/dist/providers/media/kunavo.js +156 -0
  29. package/dist/providers/media/kunavo.js.map +1 -0
  30. package/dist/providers/media/openai.js +102 -0
  31. package/dist/providers/media/openai.js.map +1 -0
  32. package/dist/providers/media/suno.js +71 -0
  33. package/dist/providers/media/suno.js.map +1 -0
  34. package/dist/remote.js +12 -1
  35. package/dist/remote.js.map +1 -1
  36. package/dist/state/file-store.js +62 -0
  37. package/dist/state/file-store.js.map +1 -1
  38. package/package.json +4 -2
  39. package/skills/clize/SKILL.md +18 -4
  40. package/skills/clize-site-build/SKILL.md +17 -18
  41. package/dist/server/stripe.js +0 -68
  42. package/dist/server/stripe.js.map +0 -1
  43. package/dist/server/worker.js +0 -407
  44. package/dist/server/worker.js.map +0 -1
  45. package/dist/state/d1-store.js +0 -315
  46. package/dist/state/d1-store.js.map +0 -1
@@ -1,315 +0,0 @@
1
- import { InsufficientBalanceError } from "../lib/errors.js";
2
- function rowToTenant(r) {
3
- return {
4
- id: String(r.id),
5
- email: r.email ?? undefined,
6
- plan: String(r.plan),
7
- status: String(r.status),
8
- cfAccountId: r.cf_account_id ?? undefined,
9
- monthlySpendLimitUsd: r.monthly_spend_limit_usd == null ? null : Number(r.monthly_spend_limit_usd),
10
- outboundProvider: String(r.outbound_provider),
11
- dryRun: Boolean(r.dry_run),
12
- githubId: r.github_id ?? undefined,
13
- createdAt: String(r.created_at),
14
- updatedAt: String(r.updated_at),
15
- };
16
- }
17
- export class D1Store {
18
- db;
19
- constructor(db) {
20
- this.db = db;
21
- }
22
- // ---- 身份单元(域名)----
23
- async getIdentity(tenantId, domain) {
24
- const row = await this.db
25
- .prepare("SELECT data FROM identities WHERE domain=? AND tenant_id=?")
26
- .bind(domain.toLowerCase(), tenantId)
27
- .first();
28
- return row ? JSON.parse(row.data) : undefined;
29
- }
30
- async findOwner(domain) {
31
- const row = await this.db
32
- .prepare("SELECT tenant_id, data FROM identities WHERE domain=?")
33
- .bind(domain.toLowerCase())
34
- .first();
35
- return row ? { tenantId: row.tenant_id, identity: JSON.parse(row.data) } : undefined;
36
- }
37
- async listIdentities(tenantId) {
38
- const { results } = await this.db
39
- .prepare("SELECT data FROM identities WHERE tenant_id=?")
40
- .bind(tenantId)
41
- .all();
42
- return results.map((r) => JSON.parse(r.data));
43
- }
44
- async upsertIdentity(tenantId, partial) {
45
- const domain = partial.domain.toLowerCase();
46
- const now = new Date().toISOString();
47
- const existing = await this.getIdentity(tenantId, domain);
48
- const merged = existing
49
- ? { ...existing, ...partial, tenantId, domain, updatedAt: now }
50
- : {
51
- tenantId,
52
- registrar: "cloudflare",
53
- status: "pending",
54
- createdAt: now,
55
- updatedAt: now,
56
- ...partial,
57
- domain,
58
- };
59
- await this.db
60
- .prepare("INSERT INTO identities (domain, tenant_id, data, updated_at) VALUES (?,?,?,?) " +
61
- "ON CONFLICT(domain) DO UPDATE SET tenant_id=excluded.tenant_id, data=excluded.data, updated_at=excluded.updated_at")
62
- .bind(domain, tenantId, JSON.stringify(merged), now)
63
- .run();
64
- return merged;
65
- }
66
- async removeIdentity(tenantId, domain) {
67
- await this.db
68
- .prepare("DELETE FROM identities WHERE domain=? AND tenant_id=?")
69
- .bind(domain.toLowerCase(), tenantId)
70
- .run();
71
- }
72
- // ---- 审计 ----
73
- async appendAudit(tenantId, entry) {
74
- await this.db
75
- .prepare("INSERT INTO audit (tenant_id, ts, action, detail, cost, dry_run) VALUES (?,?,?,?,?,?)")
76
- .bind(tenantId, new Date().toISOString(), entry.action, JSON.stringify(entry.detail ?? {}), entry.cost ?? null, entry.dryRun ? 1 : 0)
77
- .run();
78
- }
79
- async spentThisMonth(tenantId) {
80
- const prefix = new Date().toISOString().slice(0, 7); // YYYY-MM
81
- const row = await this.db
82
- .prepare("SELECT COALESCE(SUM(cost),0) AS s FROM audit WHERE tenant_id=? AND dry_run=0 AND cost IS NOT NULL AND substr(ts,1,7)=?")
83
- .bind(tenantId, prefix)
84
- .first();
85
- return row?.s ?? 0;
86
- }
87
- async recentAudit(tenantId, limit) {
88
- const { results } = await this.db
89
- .prepare("SELECT ts, action, detail, cost, dry_run FROM audit WHERE tenant_id=? ORDER BY id DESC LIMIT ?")
90
- .bind(tenantId, limit)
91
- .all();
92
- return results.map((r) => ({
93
- ts: r.ts,
94
- action: r.action,
95
- detail: JSON.parse(r.detail || "{}"),
96
- cost: r.cost ?? undefined,
97
- dryRun: Boolean(r.dry_run),
98
- }));
99
- }
100
- // ---- 租户 ----
101
- async getTenant(id) {
102
- const r = await this.db
103
- .prepare("SELECT * FROM tenants WHERE id=?")
104
- .bind(id)
105
- .first();
106
- return r ? rowToTenant(r) : undefined;
107
- }
108
- async upsertTenant(t) {
109
- await this.db
110
- .prepare("INSERT INTO tenants (id,email,plan,status,cf_account_id,monthly_spend_limit_usd,outbound_provider,dry_run,github_id,created_at,updated_at) " +
111
- "VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET email=excluded.email,plan=excluded.plan,status=excluded.status," +
112
- "cf_account_id=excluded.cf_account_id,monthly_spend_limit_usd=excluded.monthly_spend_limit_usd," +
113
- "outbound_provider=excluded.outbound_provider,dry_run=excluded.dry_run,github_id=excluded.github_id,updated_at=excluded.updated_at")
114
- .bind(t.id, t.email ?? null, t.plan, t.status, t.cfAccountId ?? null, t.monthlySpendLimitUsd, t.outboundProvider, t.dryRun ? 1 : 0, t.githubId ?? null, t.createdAt, t.updatedAt)
115
- .run();
116
- return t;
117
- }
118
- // ---- 地址 ----
119
- async upsertAddress(tenantId, partial) {
120
- const address = partial.address.toLowerCase();
121
- const domain = (partial.domain ?? address.split("@")[1] ?? "").toLowerCase();
122
- const now = new Date().toISOString();
123
- const existing = await this.getAddress(tenantId, address);
124
- const merged = existing
125
- ? { ...existing, ...partial, tenantId, address, domain, updatedAt: now }
126
- : { tenantId, createdAt: now, updatedAt: now, ...partial, address, domain };
127
- await this.db
128
- .prepare("INSERT INTO addresses (tenant_id,address,domain,data,updated_at) VALUES (?,?,?,?,?) " +
129
- "ON CONFLICT(tenant_id,address) DO UPDATE SET domain=excluded.domain,data=excluded.data,updated_at=excluded.updated_at")
130
- .bind(tenantId, address, domain, JSON.stringify(merged), now)
131
- .run();
132
- return merged;
133
- }
134
- async getAddress(tenantId, address) {
135
- const r = await this.db
136
- .prepare("SELECT data FROM addresses WHERE tenant_id=? AND address=?")
137
- .bind(tenantId, address.toLowerCase())
138
- .first();
139
- return r ? JSON.parse(r.data) : undefined;
140
- }
141
- async listAddresses(tenantId, domain) {
142
- const stmt = domain
143
- ? this.db
144
- .prepare("SELECT data FROM addresses WHERE tenant_id=? AND domain=?")
145
- .bind(tenantId, domain.toLowerCase())
146
- : this.db.prepare("SELECT data FROM addresses WHERE tenant_id=?").bind(tenantId);
147
- const { results } = await stmt.all();
148
- return results.map((r) => JSON.parse(r.data));
149
- }
150
- async removeAddress(tenantId, address) {
151
- await this.db
152
- .prepare("DELETE FROM addresses WHERE tenant_id=? AND address=?")
153
- .bind(tenantId, address.toLowerCase())
154
- .run();
155
- }
156
- // ---- 已发邮件 ----
157
- async appendSent(tenantId, entry) {
158
- await this.db
159
- .prepare("INSERT INTO sent (tenant_id,ts,from_addr,to_addr,subject,text,html,provider_id) VALUES (?,?,?,?,?,?,?,?)")
160
- .bind(tenantId, new Date().toISOString(), entry.from, entry.to, entry.subject, entry.text ?? null, entry.html ?? null, entry.id ?? null)
161
- .run();
162
- }
163
- async listSent(tenantId) {
164
- const { results } = await this.db
165
- .prepare("SELECT ts,from_addr,to_addr,subject,text,html,provider_id FROM sent WHERE tenant_id=? ORDER BY id DESC LIMIT 500")
166
- .bind(tenantId)
167
- .all();
168
- return results.map((r) => ({
169
- ts: r.ts,
170
- from: r.from_addr,
171
- to: r.to_addr,
172
- subject: r.subject,
173
- text: r.text ?? undefined,
174
- html: r.html ?? undefined,
175
- id: r.provider_id ?? undefined,
176
- }));
177
- }
178
- // ---- 计费(余额 + 流水)----
179
- async getBalanceUsd(tenantId) {
180
- const r = await this.db
181
- .prepare("SELECT balance_usd FROM tenants WHERE id=?")
182
- .bind(tenantId)
183
- .first();
184
- return r ? Number(r.balance_usd) : null;
185
- }
186
- async chargeBalance(tenantId, amountUsd, entry) {
187
- const now = new Date().toISOString();
188
- // 单条原子条件扣减:仅当余额足够才扣;changes=0 → 余额不足。
189
- const res = (await this.db
190
- .prepare("UPDATE tenants SET balance_usd = balance_usd - ?, updated_at=? WHERE id=? AND balance_usd >= ?")
191
- .bind(amountUsd, now, tenantId, amountUsd)
192
- .run());
193
- if (!res?.meta?.changes) {
194
- const bal = (await this.getBalanceUsd(tenantId)) ?? 0;
195
- throw new InsufficientBalanceError(`余额不足:本次需 $${amountUsd.toFixed(2)},当前余额 $${bal.toFixed(2)}。请充值后重试(clize recharge)。`);
196
- }
197
- const after = (await this.getBalanceUsd(tenantId)) ?? 0;
198
- await this.insertLedger(tenantId, "debit", amountUsd, after, entry.action, entry.detail);
199
- return { balanceAfter: after };
200
- }
201
- async creditBalance(tenantId, amountUsd, entry) {
202
- const now = new Date().toISOString();
203
- const res = (await this.db
204
- .prepare("UPDATE tenants SET balance_usd = balance_usd + ?, updated_at=? WHERE id=?")
205
- .bind(amountUsd, now, tenantId)
206
- .run());
207
- if (!res?.meta?.changes)
208
- throw new Error(`充值失败:未找到租户 ${tenantId}`);
209
- const after = (await this.getBalanceUsd(tenantId)) ?? 0;
210
- await this.insertLedger(tenantId, "credit", amountUsd, after, entry.action, entry.detail);
211
- return { balanceAfter: after };
212
- }
213
- async listLedger(tenantId, limit) {
214
- const { results } = await this.db
215
- .prepare("SELECT ts, kind, amount_usd, balance_after, action, detail FROM ledger WHERE tenant_id=? ORDER BY id DESC LIMIT ?")
216
- .bind(tenantId, limit)
217
- .all();
218
- return results.map((r) => ({
219
- ts: r.ts,
220
- kind: r.kind === "credit" ? "credit" : "debit",
221
- amountUsd: Number(r.amount_usd),
222
- balanceAfter: Number(r.balance_after),
223
- action: r.action,
224
- detail: r.detail ? JSON.parse(r.detail) : undefined,
225
- }));
226
- }
227
- async insertLedger(tenantId, kind, amountUsd, balanceAfter, action, detail) {
228
- await this.db
229
- .prepare("INSERT INTO ledger (tenant_id, ts, kind, amount_usd, balance_after, action, detail) VALUES (?,?,?,?,?,?,?)")
230
- .bind(tenantId, new Date().toISOString(), kind, amountUsd, balanceAfter, action, detail ? JSON.stringify(detail) : null)
231
- .run();
232
- }
233
- // ---- 控制面:API key → 租户(账户原语;不在 StateStore 接口里)----
234
- /** 按 GitHub 用户 id 找租户(OAuth 登录 / 找回)。 */
235
- async tenantByGithubId(githubId) {
236
- const r = await this.db
237
- .prepare("SELECT id FROM tenants WHERE github_id=?")
238
- .bind(githubId)
239
- .first();
240
- return r?.id;
241
- }
242
- /** 按 key 的 sha256 解析租户 id(未命中 / 已吊销 → undefined)。 */
243
- async tenantForKeyHash(keyHash) {
244
- const r = await this.db
245
- .prepare("SELECT tenant_id FROM api_keys WHERE key_hash=? AND revoked=0")
246
- .bind(keyHash)
247
- .first();
248
- return r?.tenant_id;
249
- }
250
- /** 幂等记录 Stripe webhook 事件:首次插入返回 true,重复返回 false(防重复入账)。 */
251
- async recordEventOnce(eventId) {
252
- const res = (await this.db
253
- .prepare("INSERT OR IGNORE INTO stripe_events (id, ts) VALUES (?, ?)")
254
- .bind(eventId, new Date().toISOString())
255
- .run());
256
- return !!res?.meta?.changes;
257
- }
258
- /** 记录 key 最近使用时间。 */
259
- async touchKey(keyHash) {
260
- await this.db
261
- .prepare("UPDATE api_keys SET last_used_at=? WHERE key_hash=?")
262
- .bind(new Date().toISOString(), keyHash)
263
- .run();
264
- }
265
- /** 签发:把一个 key 的 sha256 绑到租户(明文 key 由调用方生成、只回显一次)。 */
266
- async insertApiKey(keyHash, tenantId, name) {
267
- await this.db
268
- .prepare("INSERT INTO api_keys (key_hash, tenant_id, name, created_at) VALUES (?,?,?,?)")
269
- .bind(keyHash, tenantId, name ?? null, new Date().toISOString())
270
- .run();
271
- }
272
- // ---- 运营端(admin)聚合 ----
273
- /** 列出所有租户(含余额),按创建时间倒序。仅 admin 端点调用。 */
274
- async listAllTenants() {
275
- // github 用户名没单独建列,但登录时写进了 api_keys.name = "github:<login>";
276
- // 取该租户最近一个 github: 前缀的 key 名反推用户名,免 schema 迁移 + 适配存量数据。
277
- const { results } = await this.db
278
- .prepare("SELECT t.id, t.github_id, t.email, t.plan, t.status, t.balance_usd, t.created_at, " +
279
- "(SELECT name FROM api_keys WHERE tenant_id = t.id AND name LIKE 'github:%' ORDER BY created_at DESC LIMIT 1) AS gh_name " +
280
- "FROM tenants t ORDER BY t.created_at DESC")
281
- .all();
282
- return results.map((r) => {
283
- const login = r.gh_name ? r.gh_name.replace(/^github:/, "") : "";
284
- return {
285
- id: r.id,
286
- githubId: r.github_id ?? undefined,
287
- githubLogin: login || undefined,
288
- email: r.email ?? undefined,
289
- plan: r.plan,
290
- status: r.status,
291
- balanceUsd: Number(r.balance_usd) || 0,
292
- createdAt: r.created_at,
293
- };
294
- });
295
- }
296
- /** 全局聚合:租户数 / 总余额 / 累计入账(credit)/ 累计扣费(debit)。 */
297
- async adminTotals() {
298
- const t = await this.db
299
- .prepare("SELECT COUNT(*) AS c, COALESCE(SUM(balance_usd),0) AS b FROM tenants")
300
- .first();
301
- const cr = await this.db
302
- .prepare("SELECT COALESCE(SUM(amount_usd),0) AS s FROM ledger WHERE kind='credit'")
303
- .first();
304
- const deb = await this.db
305
- .prepare("SELECT COALESCE(SUM(amount_usd),0) AS s FROM ledger WHERE kind='debit'")
306
- .first();
307
- return {
308
- tenantCount: Number(t?.c) || 0,
309
- totalBalanceUsd: Number(t?.b) || 0,
310
- totalCreditedUsd: Number(cr?.s) || 0,
311
- totalDebitedUsd: Number(deb?.s) || 0,
312
- };
313
- }
314
- }
315
- //# sourceMappingURL=d1-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"d1-store.js","sourceRoot":"","sources":["../../src/state/d1-store.ts"],"names":[],"mappings":"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"}