@harrylabsj/kiwi 0.7.22 → 0.8.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 (140) hide show
  1. package/README.md +45 -10
  2. package/dist/a2a/node.js +1 -1
  3. package/dist/a2a/node.js.map +1 -1
  4. package/dist/agent/buyer/buyer-tools.js +15 -8
  5. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  6. package/dist/agent/buyer/scheduler.d.ts +1 -0
  7. package/dist/agent/buyer/scheduler.js +5 -1
  8. package/dist/agent/buyer/scheduler.js.map +1 -1
  9. package/dist/agent/buyer/task-store.js +5 -2
  10. package/dist/agent/buyer/task-store.js.map +1 -1
  11. package/dist/agent/chat-tools.js +10 -3
  12. package/dist/agent/chat-tools.js.map +1 -1
  13. package/dist/agent/context/fencing.d.ts +27 -0
  14. package/dist/agent/context/fencing.js +126 -0
  15. package/dist/agent/context/fencing.js.map +1 -0
  16. package/dist/agent/context/grounding.d.ts +18 -0
  17. package/dist/agent/context/grounding.js +22 -0
  18. package/dist/agent/context/grounding.js.map +1 -0
  19. package/dist/agent/host/events.d.ts +31 -0
  20. package/dist/agent/host/events.js +62 -0
  21. package/dist/agent/host/events.js.map +1 -0
  22. package/dist/agent/host/tui-renderer.d.ts +17 -0
  23. package/dist/agent/host/tui-renderer.js +125 -0
  24. package/dist/agent/host/tui-renderer.js.map +1 -0
  25. package/dist/agent/host/web-renderer.d.ts +71 -0
  26. package/dist/agent/host/web-renderer.js +185 -0
  27. package/dist/agent/host/web-renderer.js.map +1 -0
  28. package/dist/agent/kernel-builder.d.ts +3 -1
  29. package/dist/agent/kernel-builder.js +4 -1
  30. package/dist/agent/kernel-builder.js.map +1 -1
  31. package/dist/agent/kernel.d.ts +20 -1
  32. package/dist/agent/kernel.js +251 -14
  33. package/dist/agent/kernel.js.map +1 -1
  34. package/dist/agent/merchant/intelligence/backend.d.ts +40 -0
  35. package/dist/agent/merchant/intelligence/backend.js +2 -0
  36. package/dist/agent/merchant/intelligence/backend.js.map +1 -0
  37. package/dist/agent/merchant/intelligence/default-backend.d.ts +38 -0
  38. package/dist/agent/merchant/intelligence/default-backend.js +454 -0
  39. package/dist/agent/merchant/intelligence/default-backend.js.map +1 -0
  40. package/dist/agent/merchant/intelligence/http-analytics-source.d.ts +55 -0
  41. package/dist/agent/merchant/intelligence/http-analytics-source.js +193 -0
  42. package/dist/agent/merchant/intelligence/http-analytics-source.js.map +1 -0
  43. package/dist/agent/merchant/intelligence/types.d.ts +109 -0
  44. package/dist/agent/merchant/intelligence/types.js +2 -0
  45. package/dist/agent/merchant/intelligence/types.js.map +1 -0
  46. package/dist/agent/merchant/merchant-enrichment.d.ts +10 -0
  47. package/dist/agent/merchant/merchant-enrichment.js +38 -0
  48. package/dist/agent/merchant/merchant-enrichment.js.map +1 -0
  49. package/dist/agent/merchant/merchant-grounding.d.ts +5 -0
  50. package/dist/agent/merchant/merchant-grounding.js +76 -0
  51. package/dist/agent/merchant/merchant-grounding.js.map +1 -0
  52. package/dist/agent/merchant/merchant-presentations.d.ts +8 -0
  53. package/dist/agent/merchant/merchant-presentations.js +184 -0
  54. package/dist/agent/merchant/merchant-presentations.js.map +1 -0
  55. package/dist/agent/merchant/merchant-tools.d.ts +8 -0
  56. package/dist/agent/merchant/merchant-tools.js +208 -9
  57. package/dist/agent/merchant/merchant-tools.js.map +1 -1
  58. package/dist/agent/presentation/registry.d.ts +14 -0
  59. package/dist/agent/presentation/registry.js +24 -0
  60. package/dist/agent/presentation/registry.js.map +1 -0
  61. package/dist/agent/presentation/runner.d.ts +11 -0
  62. package/dist/agent/presentation/runner.js +17 -0
  63. package/dist/agent/presentation/runner.js.map +1 -0
  64. package/dist/agent/presentation/sanitize.d.ts +16 -0
  65. package/dist/agent/presentation/sanitize.js +37 -0
  66. package/dist/agent/presentation/sanitize.js.map +1 -0
  67. package/dist/agent/presentation/types.d.ts +28 -0
  68. package/dist/agent/presentation/types.js +8 -0
  69. package/dist/agent/presentation/types.js.map +1 -0
  70. package/dist/agent/session.d.ts +1 -1
  71. package/dist/agent/session.js +2 -2
  72. package/dist/agent/session.js.map +1 -1
  73. package/dist/agent/skills/registry.d.ts +11 -0
  74. package/dist/agent/skills/registry.js +119 -0
  75. package/dist/agent/skills/registry.js.map +1 -0
  76. package/dist/agent/skills/tools.d.ts +6 -0
  77. package/dist/agent/skills/tools.js +36 -0
  78. package/dist/agent/skills/tools.js.map +1 -0
  79. package/dist/agent/skills/types.d.ts +9 -0
  80. package/dist/agent/skills/types.js +2 -0
  81. package/dist/agent/skills/types.js.map +1 -0
  82. package/dist/agent/supplier/scheduler.d.ts +2 -0
  83. package/dist/agent/supplier/scheduler.js +101 -22
  84. package/dist/agent/supplier/scheduler.js.map +1 -1
  85. package/dist/agent/supplier/store.d.ts +2 -0
  86. package/dist/agent/supplier/store.js +44 -0
  87. package/dist/agent/supplier/store.js.map +1 -1
  88. package/dist/agent/system-prompt.d.ts +5 -1
  89. package/dist/agent/system-prompt.js +20 -3
  90. package/dist/agent/system-prompt.js.map +1 -1
  91. package/dist/cli.js +34 -14
  92. package/dist/cli.js.map +1 -1
  93. package/dist/config/profile.d.ts +21 -0
  94. package/dist/config/profile.js +59 -0
  95. package/dist/config/profile.js.map +1 -1
  96. package/dist/discovery/catalog-source/kiwi-record.d.ts +2 -0
  97. package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
  98. package/dist/discovery/catalog-source/kiwi-source.js +2 -0
  99. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
  100. package/dist/handoff/authorization.js +1 -1
  101. package/dist/http/merchant-server.d.ts +65 -0
  102. package/dist/http/merchant-server.js +346 -0
  103. package/dist/http/merchant-server.js.map +1 -0
  104. package/dist/merchant/stats-store.d.ts +7 -0
  105. package/dist/merchant/stats-store.js +11 -0
  106. package/dist/merchant/stats-store.js.map +1 -1
  107. package/dist/negotiation/action-candidate.js +1 -1
  108. package/dist/operator/types.d.ts +1 -1
  109. package/dist/product-cli.d.ts +2 -2
  110. package/dist/product-cli.js +5 -3
  111. package/dist/product-cli.js.map +1 -1
  112. package/dist/product-supplier.d.ts +73 -0
  113. package/dist/product-supplier.js +224 -5
  114. package/dist/product-supplier.js.map +1 -1
  115. package/dist/runtime/fake-model.d.ts +1 -1
  116. package/dist/trust/identity/jwk.d.ts +11 -0
  117. package/dist/trust/identity/jwk.js +2 -0
  118. package/dist/trust/identity/jwk.js.map +1 -0
  119. package/dist/trust/identity/jws.d.ts +2 -1
  120. package/dist/trust/identity/jws.js.map +1 -1
  121. package/dist/trust/identity/keys.d.ts +2 -1
  122. package/dist/trust/identity/keys.js.map +1 -1
  123. package/dist/trust/identity/message-signature.d.ts +1 -14
  124. package/dist/trust/identity/message-signature.js.map +1 -1
  125. package/dist/weixin/channel.d.ts +3 -0
  126. package/dist/weixin/channel.js +18 -2
  127. package/dist/weixin/channel.js.map +1 -1
  128. package/examples/profiles/merchant.deepseek.yaml +6 -0
  129. package/examples/profiles/merchant.fake.yaml +6 -0
  130. package/examples/profiles/merchant.local.yaml +6 -0
  131. package/package.json +7 -6
  132. package/skills/kiwi-buyer/SKILL.md +66 -0
  133. package/skills/merchant/catalog-operations/SKILL.md +17 -0
  134. package/skills/merchant/change-approval/SKILL.md +16 -0
  135. package/skills/merchant/human-review/SKILL.md +17 -0
  136. package/skills/merchant/inventory-operations/SKILL.md +17 -0
  137. package/skills/merchant/negotiation-review/SKILL.md +18 -0
  138. package/skills/merchant/performance-insights/SKILL.md +19 -0
  139. package/contracts/candidate-agent-dto-1.0.README.md +0 -43
  140. package/contracts/conformance/python-service/README.md +0 -19
@@ -0,0 +1,454 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { LedgerStore } from "../../../negotiation/ledger/index.js";
4
+ import { TERMINAL_PHASES } from "../../../negotiation/state/phase.js";
5
+ import { openMerchantStatsStore } from "../../../merchant/stats-store.js";
6
+ import { publicCandidatePreview } from "../merchant-enrichment.js";
7
+ const DEFAULT_DAYS = 14;
8
+ const MAX_DAYS = 90;
9
+ function utcNow() {
10
+ return new Date().toISOString();
11
+ }
12
+ function dayShift(day, delta) {
13
+ return new Date(Date.parse(`${day}T00:00:00Z`) + delta * 86_400_000).toISOString().slice(0, 10);
14
+ }
15
+ function periodWindow(period, now) {
16
+ const today = now.slice(0, 10);
17
+ const label = period ?? `${DEFAULT_DAYS}d`;
18
+ const match = /^(\d+)d$/i.exec(label);
19
+ if (match?.[1] === undefined)
20
+ throw new Error("period must use Nd syntax, for example 7d or 30d");
21
+ const days = Number(match[1]);
22
+ if (!Number.isSafeInteger(days) || days < 1 || days > MAX_DAYS) {
23
+ throw new Error(`period days must be between 1 and ${MAX_DAYS}`);
24
+ }
25
+ return { label: `${days}d`, since: dayShift(today, -(days - 1)) };
26
+ }
27
+ function metricBucket(date, granularity) {
28
+ if (granularity === "day")
29
+ return date;
30
+ if (granularity === "month")
31
+ return `${date.slice(0, 7)}-01`;
32
+ const parsed = new Date(`${date}T00:00:00Z`);
33
+ const day = parsed.getUTCDay();
34
+ const mondayOffset = day === 0 ? -6 : 1 - day;
35
+ return dayShift(date, mondayOffset);
36
+ }
37
+ function aggregateMetricPoints(points, granularity) {
38
+ if (granularity === "day")
39
+ return points;
40
+ const totals = new Map();
41
+ for (const point of points) {
42
+ const bucket = metricBucket(point.date, granularity);
43
+ totals.set(bucket, (totals.get(bucket) ?? 0) + point.value);
44
+ }
45
+ return [...totals.entries()].map(([date, value]) => ({ date, value }));
46
+ }
47
+ function aggregateDistinctBuyerPoints(rows, granularity) {
48
+ const buckets = new Map();
49
+ for (const row of rows) {
50
+ const bucket = metricBucket(row.day, granularity);
51
+ const identities = buckets.get(bucket) ?? new Set();
52
+ identities.add(row.buyer_identity);
53
+ buckets.set(bucket, identities);
54
+ }
55
+ return [...buckets.entries()]
56
+ .sort(([left], [right]) => left.localeCompare(right))
57
+ .map(([date, identities]) => ({ date, value: identities.size }));
58
+ }
59
+ function readStatsPath(dataDir) {
60
+ return path.join(dataDir, "a2a", "stats.sqlite");
61
+ }
62
+ function assertOwned(requested, owner) {
63
+ if (requested !== owner)
64
+ throw new Error("merchant identity does not match the bound session");
65
+ }
66
+ function extractNegotiation(negotiationId, events) {
67
+ const tail = events.at(-1);
68
+ if (tail === undefined)
69
+ return undefined;
70
+ let phase = tail.state_transition?.to_phase ?? "OPEN";
71
+ let buyerIdentity = tail.identity.counterparty_identity;
72
+ let updatedAt = tail.recorded_at;
73
+ const skus = new Set();
74
+ let quantity;
75
+ let price;
76
+ let currency;
77
+ let agreementId;
78
+ for (const event of events) {
79
+ if (event.recorded_at > updatedAt)
80
+ updatedAt = event.recorded_at;
81
+ if (event.state_transition?.to_phase !== undefined)
82
+ phase = event.state_transition.to_phase;
83
+ if (event.identity.counterparty_identity !== "")
84
+ buyerIdentity = event.identity.counterparty_identity;
85
+ if (event.agreement_id !== undefined)
86
+ agreementId = event.agreement_id;
87
+ const payload = event.wire_payload;
88
+ const items = payload?.payload?.terms?.items ?? [];
89
+ for (const item of items) {
90
+ if (item.sku)
91
+ skus.add(item.sku);
92
+ }
93
+ const item = items[0];
94
+ if (item?.quantity?.value !== undefined)
95
+ quantity = item.quantity.value;
96
+ if (item?.unit_price?.amount_minor !== undefined)
97
+ price = item.unit_price.amount_minor;
98
+ if (item?.unit_price?.currency !== undefined)
99
+ currency = item.unit_price.currency;
100
+ }
101
+ return {
102
+ negotiation_id: negotiationId,
103
+ phase,
104
+ buyer_identity: buyerIdentity,
105
+ skus: [...skus],
106
+ ...(quantity === undefined ? {} : { quantity }),
107
+ ...(price === undefined ? {} : { latest_price_minor: price }),
108
+ ...(currency === undefined ? {} : { currency }),
109
+ needs_human_review: phase === "AWAITING_CLARIFICATION",
110
+ updated_at: updatedAt,
111
+ ...(agreementId === undefined ? {} : { agreement_id: agreementId }),
112
+ };
113
+ }
114
+ function agreementsReachedSince(dataDir, since) {
115
+ const ledger = new LedgerStore({ dir: path.join(dataDir, "a2a"), now: utcNow });
116
+ let count = 0;
117
+ for (const negotiationId of ledger.listNegotiations()) {
118
+ if (ledger.events(negotiationId).some((event) => event.state_transition?.to_phase === "AGREEMENT_REACHED" && event.recorded_at.slice(0, 10) >= since)) {
119
+ count += 1;
120
+ }
121
+ }
122
+ return count;
123
+ }
124
+ export class DefaultMerchantIntelligenceBackend {
125
+ merchantId;
126
+ dataDir;
127
+ merchantClient;
128
+ approvals;
129
+ now;
130
+ analyticsSource;
131
+ principalId;
132
+ constructor(deps) {
133
+ this.merchantId = deps.merchant_id;
134
+ this.dataDir = deps.data_dir;
135
+ this.merchantClient = deps.merchant_client;
136
+ this.approvals = deps.approvals;
137
+ this.analyticsSource = deps.analytics_source;
138
+ this.principalId = deps.principal_id ?? this.merchantId;
139
+ this.now = deps.now ?? utcNow;
140
+ }
141
+ validateSourceMetric(metric) {
142
+ if (metric === null || typeof metric !== "object" || Array.isArray(metric))
143
+ return false;
144
+ const value = metric;
145
+ return (typeof value.name === "string" && value.name.length > 0 && value.name.length <= 80 &&
146
+ (value.value === null || (typeof value.value === "number" && Number.isFinite(value.value))) &&
147
+ (value.unit === "count" || value.unit === "percent" || value.unit === "minor_currency") &&
148
+ typeof value.observed_at === "string" && value.observed_at.length > 0 &&
149
+ (value.currency === undefined || typeof value.currency === "string") &&
150
+ (value.note === undefined || typeof value.note === "string"));
151
+ }
152
+ async readAnalyticsMetrics(period) {
153
+ if (this.analyticsSource === undefined)
154
+ return { metrics: [], limitations: [] };
155
+ try {
156
+ const result = await this.analyticsSource.getMetrics({ merchant_id: this.merchantId, period });
157
+ if (result === null || typeof result !== "object" || !Array.isArray(result.metrics)) {
158
+ return { metrics: [], limitations: [{ source: "analytics", note: "分析数据源返回了无效结构" }] };
159
+ }
160
+ const metrics = [];
161
+ const names = new Set();
162
+ let invalidCount = 0;
163
+ let duplicateCount = 0;
164
+ for (const metric of result.metrics) {
165
+ if (!this.validateSourceMetric(metric)) {
166
+ invalidCount += 1;
167
+ continue;
168
+ }
169
+ if (names.has(metric.name)) {
170
+ duplicateCount += 1;
171
+ continue;
172
+ }
173
+ names.add(metric.name);
174
+ metrics.push(metric);
175
+ }
176
+ return {
177
+ metrics,
178
+ limitations: [
179
+ ...(Array.isArray(result.limitations) ? result.limitations.filter((item) => item !== null && typeof item === "object" &&
180
+ typeof item.source === "string" && typeof item.note === "string") : []),
181
+ ...(invalidCount > 0 ? [{ source: "analytics", note: `${invalidCount} 个指标因格式无效被丢弃` }] : []),
182
+ ...(duplicateCount > 0 ? [{ source: "analytics", note: `${duplicateCount} 个重复指标被丢弃` }] : []),
183
+ ],
184
+ };
185
+ }
186
+ catch {
187
+ return { metrics: [], limitations: [{ source: "analytics", note: "销售/活动分析数据源暂时不可用" }] };
188
+ }
189
+ }
190
+ validSourceSeries(value, metric, period, granularity) {
191
+ if (value === null || typeof value !== "object" || Array.isArray(value))
192
+ return false;
193
+ const series = value;
194
+ if (series.metric !== metric || series.period !== period || series.granularity !== granularity ||
195
+ (series.unit !== "count" && series.unit !== "percent" && series.unit !== "minor_currency") ||
196
+ !Array.isArray(series.points) || series.points.length > 10_000)
197
+ return false;
198
+ return series.points.every((point) => {
199
+ if (point === null || typeof point !== "object" || Array.isArray(point))
200
+ return false;
201
+ const item = point;
202
+ return typeof item.date === "string" && item.date.length > 0 && item.date.length <= 32 &&
203
+ typeof item.value === "number" && Number.isFinite(item.value);
204
+ }) && (series.currency === undefined || typeof series.currency === "string") &&
205
+ (series.note === undefined || typeof series.note === "string");
206
+ }
207
+ async getBusinessSnapshot(input) {
208
+ assertOwned(input.merchant_id, this.merchantId);
209
+ const now = this.now();
210
+ const window = periodWindow(input.period, now);
211
+ const limitations = [];
212
+ let distinctBuyers = null;
213
+ let contactEvents = null;
214
+ let negotiations = null;
215
+ let topSkuContacts = [];
216
+ const statsPath = readStatsPath(this.dataDir);
217
+ if (existsSync(statsPath)) {
218
+ const store = openMerchantStatsStore({ dbPath: statsPath });
219
+ try {
220
+ const totals = store.totalsSince(window.since);
221
+ distinctBuyers = totals.distinct_buyers;
222
+ contactEvents = totals.contact_events;
223
+ negotiations = totals.negotiations;
224
+ topSkuContacts = store.topSkus(window.since, 10);
225
+ }
226
+ finally {
227
+ store.close();
228
+ }
229
+ }
230
+ else {
231
+ limitations.push({ source: "merchant_stats", note: "没有买家触达统计数据" });
232
+ }
233
+ const [negotiationDigest, reviews, catalogHealth] = await Promise.all([
234
+ this.getNegotiationDigest({ merchant_id: this.merchantId, status: "active", limit: 100 }),
235
+ this.merchantClient.getHumanReviewQueue(this.merchantId),
236
+ this.getCatalogHealth({ merchant_id: this.merchantId }),
237
+ ]);
238
+ const pending = await this.getPendingActions();
239
+ const analytics = await this.readAnalyticsMetrics(window.label);
240
+ const metricNames = new Set([
241
+ "distinct_buyers",
242
+ "contact_events",
243
+ "negotiations",
244
+ "agreements_reached",
245
+ "agreement_rate",
246
+ "human_review_count",
247
+ "pending_action_count",
248
+ "active_negotiations",
249
+ ]);
250
+ const acceptedAnalytics = analytics.metrics.filter((metric) => {
251
+ if (metricNames.has(metric.name)) {
252
+ analytics.limitations.push({ source: "analytics", note: `指标 ${metric.name} 与本地权威源冲突,已拒绝外部值` });
253
+ return false;
254
+ }
255
+ metricNames.add(metric.name);
256
+ return true;
257
+ });
258
+ const agreementsReached = agreementsReachedSince(this.dataDir, window.since);
259
+ const rawAgreementRate = negotiations === null || negotiations === 0
260
+ ? null
261
+ : Math.round((agreementsReached / negotiations) * 10_000) / 100;
262
+ const agreementRate = rawAgreementRate === null ? null : Math.min(100, Math.max(0, rawAgreementRate));
263
+ if (rawAgreementRate !== null && rawAgreementRate !== agreementRate) {
264
+ limitations.push({ source: "agreement_rate", note: "成交记录与触达统计窗口不完全一致,比例已限制在 0–100%" });
265
+ }
266
+ if (negotiations === null) {
267
+ limitations.push({ source: "negotiation_ledger", note: "无法计算 agreements_reached 和 agreement_rate" });
268
+ }
269
+ else if (negotiations === 0) {
270
+ limitations.push({ source: "agreement_rate", note: "分母 negotiations 为 0,agreement_rate 不适用" });
271
+ }
272
+ return {
273
+ merchant_id: input.merchant_id,
274
+ period: window.label,
275
+ generated_at: now,
276
+ metrics: [
277
+ {
278
+ name: "distinct_buyers",
279
+ value: distinctBuyers,
280
+ unit: "count",
281
+ observed_at: now,
282
+ note: "按认证身份去重,不等同于真实自然人数量",
283
+ },
284
+ { name: "contact_events", value: contactEvents, unit: "count", observed_at: now },
285
+ { name: "negotiations", value: negotiations, unit: "count", observed_at: now },
286
+ { name: "agreements_reached", value: negotiations === null ? null : agreementsReached, unit: "count", observed_at: now },
287
+ {
288
+ name: "agreement_rate",
289
+ value: agreementRate,
290
+ unit: "percent",
291
+ observed_at: now,
292
+ note: "agreements_reached / negotiations;分母为统计窗口内的触达磋商数",
293
+ },
294
+ { name: "human_review_count", value: reviews.length, unit: "count", observed_at: now },
295
+ { name: "pending_action_count", value: pending.length, unit: "count", observed_at: now },
296
+ { name: "active_negotiations", value: negotiationDigest.length, unit: "count", observed_at: now },
297
+ ...acceptedAnalytics,
298
+ ],
299
+ alerts: {
300
+ active_negotiations: negotiationDigest.length,
301
+ human_reviews: reviews.length,
302
+ pending_actions: pending.length,
303
+ low_stock: null,
304
+ },
305
+ top_sku_contacts: topSkuContacts,
306
+ limitations: [
307
+ ...limitations,
308
+ ...analytics.limitations,
309
+ ...(catalogHealth.out_of_stock === null
310
+ ? [{ source: "inventory", note: "当前没有精确库存数据,无法计算缺货数量" }]
311
+ : [{ source: "inventory", note: "当前没有统一低库存阈值数据源" }]),
312
+ ],
313
+ };
314
+ }
315
+ async queryMetric(input) {
316
+ assertOwned(input.merchant_id, this.merchantId);
317
+ const now = this.now();
318
+ const window = periodWindow(input.period, now);
319
+ const granularity = input.granularity ?? "day";
320
+ if (!["distinct_buyers", "contact_events", "negotiations"].includes(input.metric)) {
321
+ if (this.analyticsSource !== undefined) {
322
+ try {
323
+ const sourceSeries = await this.analyticsSource.queryMetric({
324
+ merchant_id: this.merchantId,
325
+ metric: input.metric,
326
+ period: window.label,
327
+ granularity,
328
+ });
329
+ if (sourceSeries !== undefined) {
330
+ if (!this.validSourceSeries(sourceSeries, input.metric, window.label, granularity)) {
331
+ return { metric: input.metric, unit: "count", period: window.label, granularity, points: [], note: "分析数据源返回了无效指标序列" };
332
+ }
333
+ return sourceSeries;
334
+ }
335
+ }
336
+ catch {
337
+ return {
338
+ metric: input.metric,
339
+ unit: "count",
340
+ period: window.label,
341
+ granularity,
342
+ points: [],
343
+ note: "分析数据源暂时不可用",
344
+ };
345
+ }
346
+ }
347
+ return {
348
+ metric: input.metric,
349
+ unit: "count",
350
+ period: window.label,
351
+ granularity,
352
+ points: [],
353
+ note: "当前数据源不提供该指标",
354
+ };
355
+ }
356
+ const statsPath = readStatsPath(this.dataDir);
357
+ if (!existsSync(statsPath)) {
358
+ return {
359
+ metric: input.metric,
360
+ unit: "count",
361
+ period: window.label,
362
+ granularity,
363
+ points: [],
364
+ note: "没有买家触达统计数据",
365
+ };
366
+ }
367
+ const store = openMerchantStatsStore({ dbPath: statsPath });
368
+ try {
369
+ if (input.metric === "distinct_buyers" && granularity !== "day") {
370
+ return {
371
+ metric: input.metric,
372
+ unit: "count",
373
+ period: window.label,
374
+ granularity,
375
+ points: aggregateDistinctBuyerPoints(store.dailyBuyerIdentitiesSince(window.since), granularity),
376
+ };
377
+ }
378
+ const daily = store.dailySince(window.since);
379
+ const byDay = new Map(daily.map((row) => [row.day, row]));
380
+ const days = Number(window.label.slice(0, -1));
381
+ const points = [];
382
+ for (let i = 0; i < days; i += 1) {
383
+ const date = dayShift(window.since, i);
384
+ const row = byDay.get(date);
385
+ const field = input.metric === "contact_events"
386
+ ? "contact_events"
387
+ : input.metric === "negotiations"
388
+ ? "negotiations"
389
+ : "distinct_buyers";
390
+ points.push({ date, value: row?.[field] ?? 0 });
391
+ }
392
+ return {
393
+ metric: input.metric,
394
+ unit: "count",
395
+ period: window.label,
396
+ granularity,
397
+ points: aggregateMetricPoints(points, granularity),
398
+ };
399
+ }
400
+ finally {
401
+ store.close();
402
+ }
403
+ }
404
+ async getCatalogHealth(input) {
405
+ assertOwned(input.merchant_id, this.merchantId);
406
+ const products = await this.merchantClient.listProducts(input.merchant_id);
407
+ const outOfStock = products.some((product) => product.stock === undefined)
408
+ ? null
409
+ : products.filter((product) => (product.stock ?? 0) <= 0).length;
410
+ return {
411
+ total: products.length,
412
+ active: products.filter((product) => !product.paused).length,
413
+ paused: products.filter((product) => product.paused).length,
414
+ out_of_stock: outOfStock,
415
+ observed_at: this.now(),
416
+ };
417
+ }
418
+ async getNegotiationDigest(input) {
419
+ assertOwned(input.merchant_id, this.merchantId);
420
+ const ledger = new LedgerStore({ dir: path.join(this.dataDir, "a2a"), now: this.now });
421
+ const wanted = input.status ?? "all";
422
+ const rows = [];
423
+ for (const negotiationId of ledger.listNegotiations()) {
424
+ const row = extractNegotiation(negotiationId, ledger.events(negotiationId));
425
+ if (row === undefined)
426
+ continue;
427
+ const active = !TERMINAL_PHASES.includes(row.phase);
428
+ const agreement = row.agreement_id !== undefined || row.phase === "AGREEMENT_REACHED";
429
+ if (wanted === "active" && !active)
430
+ continue;
431
+ if (wanted === "agreement" && !agreement)
432
+ continue;
433
+ rows.push(row);
434
+ }
435
+ return rows.sort((a, b) => b.updated_at.localeCompare(a.updated_at)).slice(0, Math.max(1, Math.min(input.limit ?? 20, 100)));
436
+ }
437
+ async getPendingActions() {
438
+ return this.approvals.listPending().map((candidate) => ({
439
+ candidate_id: candidate.candidate_id,
440
+ tool: candidate.tool,
441
+ risk: candidate.risk,
442
+ status: candidate.status,
443
+ expires_at: candidate.expires_at,
444
+ stale_sensitive: true,
445
+ }));
446
+ }
447
+ async getCandidatePreview(input) {
448
+ if (input.principal_id !== this.principalId) {
449
+ throw new Error("principal identity does not match the bound session");
450
+ }
451
+ return publicCandidatePreview(this.approvals.get(input.candidate_id));
452
+ }
453
+ }
454
+ //# sourceMappingURL=default-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-backend.js","sourceRoot":"","sources":["../../../../src/agent/merchant/intelligence/default-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ */
7
+ import type { MerchantAnalyticsSource } from "./types.js";
8
+ import type { MetricSeries, MetricValue, DataLimitation } from "./types.js";
9
+ export interface HttpMerchantAnalyticsSourceOptions {
10
+ /** HTTPS is required for remote services; HTTP is allowed only on loopback. */
11
+ baseUrl: string;
12
+ /** Kept in memory for the request only; never included in error messages. */
13
+ token?: string;
14
+ fetchImpl?: typeof fetch;
15
+ timeoutMs?: number;
16
+ maxResponseBytes?: number;
17
+ }
18
+ export declare class MerchantAnalyticsHttpError extends Error {
19
+ readonly status?: number;
20
+ readonly code: "configuration" | "transport" | "protocol" | "auth" | "unavailable";
21
+ constructor(code: MerchantAnalyticsHttpError["code"], message: string, status?: number);
22
+ }
23
+ /**
24
+ * Generic server-side adapter for order, sales, campaign or advertising
25
+ * services. The remote service is never exposed to the model as a tool.
26
+ *
27
+ * Contract:
28
+ * GET /v1/merchant/analytics/metrics?merchant_id=...&period=7d
29
+ * -> { ok: true, merchant_id, metrics, limitations? }
30
+ * GET /v1/merchant/analytics/series?merchant_id=...&metric=...&period=7d&granularity=day
31
+ * -> { ok: true, merchant_id, series: MetricSeries }
32
+ * A 404 on the series endpoint means the source does not provide that metric.
33
+ */
34
+ export declare class HttpMerchantAnalyticsSource implements MerchantAnalyticsSource {
35
+ private readonly baseUrl;
36
+ private readonly token;
37
+ private readonly fetchImpl;
38
+ private readonly timeoutMs;
39
+ private readonly maxResponseBytes;
40
+ constructor(options: HttpMerchantAnalyticsSourceOptions);
41
+ private request;
42
+ getMetrics(input: {
43
+ merchant_id: string;
44
+ period: string;
45
+ }): Promise<{
46
+ metrics: MetricValue[];
47
+ limitations?: DataLimitation[];
48
+ }>;
49
+ queryMetric(input: {
50
+ merchant_id: string;
51
+ metric: string;
52
+ period: string;
53
+ granularity: "day" | "week" | "month";
54
+ }): Promise<MetricSeries | undefined>;
55
+ }