@harrylabsj/kiwi 0.7.20 → 0.7.22

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 (49) hide show
  1. package/dist/a2a/node.js +9 -0
  2. package/dist/a2a/node.js.map +1 -1
  3. package/dist/a2a/server/index.d.ts +2 -1
  4. package/dist/a2a/server/index.js +1 -1
  5. package/dist/a2a/server/index.js.map +1 -1
  6. package/dist/a2a/server/pipeline.d.ts +25 -0
  7. package/dist/a2a/server/pipeline.js +50 -0
  8. package/dist/a2a/server/pipeline.js.map +1 -1
  9. package/dist/a2a/server/server.js +1 -0
  10. package/dist/a2a/server/server.js.map +1 -1
  11. package/dist/a2a/server/types.d.ts +6 -0
  12. package/dist/agent/buyer/buyer-tools.d.ts +7 -0
  13. package/dist/agent/buyer/buyer-tools.js +46 -0
  14. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  15. package/dist/agent/buyer/scheduler.d.ts +3 -0
  16. package/dist/agent/buyer/scheduler.js.map +1 -1
  17. package/dist/agent/buyer/task-store.d.ts +5 -0
  18. package/dist/agent/buyer/task-store.js +10 -0
  19. package/dist/agent/buyer/task-store.js.map +1 -1
  20. package/dist/agent/kernel.d.ts +2 -0
  21. package/dist/agent/kernel.js +44 -9
  22. package/dist/agent/kernel.js.map +1 -1
  23. package/dist/agent/memory/schema.d.ts +1 -1
  24. package/dist/agent/memory/schema.js +67 -1
  25. package/dist/agent/memory/schema.js.map +1 -1
  26. package/dist/agent/supplier/scheduler.d.ts +84 -0
  27. package/dist/agent/supplier/scheduler.js +539 -0
  28. package/dist/agent/supplier/scheduler.js.map +1 -0
  29. package/dist/agent/supplier/store.d.ts +171 -0
  30. package/dist/agent/supplier/store.js +343 -0
  31. package/dist/agent/supplier/store.js.map +1 -0
  32. package/dist/cli.d.ts +6 -0
  33. package/dist/cli.js +191 -0
  34. package/dist/cli.js.map +1 -1
  35. package/dist/discovery/catalog-source/kiwi-source.js +4 -0
  36. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
  37. package/dist/merchant/stats-store.d.ts +74 -0
  38. package/dist/merchant/stats-store.js +147 -0
  39. package/dist/merchant/stats-store.js.map +1 -0
  40. package/dist/product-cli.d.ts +1 -1
  41. package/dist/product-cli.js +16 -1
  42. package/dist/product-cli.js.map +1 -1
  43. package/dist/product-merchant.d.ts +43 -0
  44. package/dist/product-merchant.js +75 -0
  45. package/dist/product-merchant.js.map +1 -0
  46. package/dist/product-supplier.d.ts +75 -0
  47. package/dist/product-supplier.js +233 -0
  48. package/dist/product-supplier.js.map +1 -0
  49. package/package.json +1 -1
@@ -0,0 +1,539 @@
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
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * Supplier pull scheduler(pull-relationship 设计 v0.1 §7.1/§8/§9.1)。
18
+ *
19
+ * tick() 从 supplier_observation_state.next_check_at 派生到期关系(restart-safe,
20
+ * 不依赖进程内 timer),对每个 watched/preferred 关系主动拉取公开只读事实:
21
+ *
22
+ * 1. catalog record / listings(有 catalogSource 时,§7.1 第 3 步);
23
+ * 2. Agent Card(safe-http 模板:SSRF/DNS 复查、redirect: "manual"、body 上限、
24
+ * 超时覆盖 body 读;parseAgentCard 结构校验 + secret 扫描);
25
+ * 3. UCP Profile(有 ucp_profile_url 时,仅 GET JSON + 宽松 schema 校验)。
26
+ *
27
+ * 安全不变量(§9.1):远程内容是不可信输入——只映射到本文件的固定 DTO 快照
28
+ * 字段,绝不拼进任何 prompt,不允许远程内容触发 RFQ/授权/工具调用;对
29
+ * Merchant 直连不发送 X-Buyer-Id 等稳定身份头(§9.2)。
30
+ *
31
+ * Agent Card 指纹变化 → 关系进入 review_required 并停止后续自动拉取(§8 第 5
32
+ * 步:不得静默沿用旧信任)。失败按 transient/permanent 分类指数退避 + jitter。
33
+ */
34
+ import { assertResolvableTargetUrl, assertSafeTargetUrl, } from "../../a2a/client/url-policy.js";
35
+ import { parseAgentCard } from "../../discovery/agent-card/index.js";
36
+ import { CatalogSourceError } from "../../discovery/catalog-source/errors.js";
37
+ import { contentDigest } from "../../negotiation/jcs.js";
38
+ import { isRedirectResponse, readJsonBody, SafeHttpError } from "../../net/safe-http.js";
39
+ import { computeAgentCardFingerprint } from "../../trust/records/types.js";
40
+ class SupplierPullError extends Error {
41
+ code;
42
+ permanent;
43
+ constructor(code, message, permanent) {
44
+ super(message);
45
+ this.name = "SupplierPullError";
46
+ this.code = code;
47
+ this.permanent = permanent;
48
+ }
49
+ }
50
+ const DEFAULT_BUDGET = { max_requests: 20, max_relationships: 20 };
51
+ /** §8:普通 watch 最短间隔以小时计——默认 6h,下限 1h,无变化逐步放慢封顶 24h。 */
52
+ const DEFAULT_INTERVAL_SECONDS = 6 * 3600;
53
+ const MIN_INTERVAL_SECONDS = 3600;
54
+ const MAX_INTERVAL_SECONDS = 24 * 3600;
55
+ const PERMANENT_BACKOFF_SECONDS = 24 * 3600;
56
+ const DEFAULT_TIMEOUT_MS = 15_000;
57
+ export class SupplierScheduler {
58
+ store;
59
+ catalogSource;
60
+ trustStore;
61
+ now;
62
+ fetchFn;
63
+ allowLoopback;
64
+ skipDnsCheck;
65
+ resolveIp;
66
+ random;
67
+ timeoutMs;
68
+ constructor(options) {
69
+ this.store = options.store;
70
+ this.catalogSource = options.catalogSource;
71
+ this.trustStore = options.trustStore;
72
+ const clock = options.now ?? (() => new Date().toISOString());
73
+ this.now = () => new Date(Date.parse(clock())).toISOString();
74
+ this.fetchFn = options.fetchFn ?? ((url, init) => globalThis.fetch(url, init));
75
+ this.allowLoopback = options.allowLoopback === true;
76
+ this.skipDnsCheck = options.skipDnsCheck;
77
+ this.resolveIp = options.resolveIp;
78
+ this.random = options.random ?? Math.random;
79
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
80
+ }
81
+ async tick(budget = {}) {
82
+ const b = { ...DEFAULT_BUDGET, ...budget };
83
+ const now = this.now();
84
+ const result = { checked: 0, observations: [], notified: [], errors: [] };
85
+ let requests = 0;
86
+ // 惰性过期清扫(§8:关系和规则必须有 expiry)。
87
+ for (const rel of this.store.expirableRelationships(now)) {
88
+ try {
89
+ this.store.updateStatus(rel.relationship_id, "expired");
90
+ }
91
+ catch (err) {
92
+ result.errors.push(`expire ${rel.relationship_id}: ${err instanceof Error ? err.message : String(err)}`);
93
+ }
94
+ }
95
+ for (const rel of this.store.dueRelationships(now, b.max_relationships)) {
96
+ if (requests >= b.max_requests)
97
+ break;
98
+ result.checked += 1;
99
+ const before = new Set(this.store.listObservations(rel.relationship_id).map((o) => o.observation_id));
100
+ const halted = await this.checkRelationship(rel, now, result, () => {
101
+ requests += 1;
102
+ return requests <= b.max_requests;
103
+ });
104
+ if (halted)
105
+ break;
106
+ const fresh = this.store
107
+ .listObservations(rel.relationship_id)
108
+ .filter((o) => !before.has(o.observation_id));
109
+ result.observations.push(...fresh);
110
+ if (fresh.length > 0) {
111
+ // §8 第 8 步:同一关系的多条变化合并成一次本地通知(通知本身只是
112
+ // tick 返回 + observation 落账,不引入新通知系统)。
113
+ result.notified.push({
114
+ relationship_id: rel.relationship_id,
115
+ merchant_id: rel.merchant_id,
116
+ summary: fresh.map((o) => summarize(o)).join(";"),
117
+ });
118
+ }
119
+ }
120
+ return result;
121
+ }
122
+ /**
123
+ * 拉取一个关系的所有配置来源。返回 true 表示预算耗尽应中断整个 tick。
124
+ * Agent Card 指纹变化 → review_required 并跳过后续来源(§8 第 5 步)。
125
+ */
126
+ async checkRelationship(rel, now, result, spend) {
127
+ const sources = [];
128
+ if (this.catalogSource !== undefined && typeof rel.scope.catalog_agent_id === "string") {
129
+ sources.push("catalog_search");
130
+ }
131
+ sources.push("agent_card");
132
+ if (rel.ucp_profile_url !== undefined)
133
+ sources.push("ucp_profile");
134
+ for (const source of sources) {
135
+ if (!spend())
136
+ return true;
137
+ if (source === "catalog_search") {
138
+ await this.checkCatalog(rel, now, result);
139
+ }
140
+ else if (source === "agent_card") {
141
+ const fingerprintOk = await this.checkAgentCard(rel, now, result);
142
+ if (!fingerprintOk)
143
+ return false; // review_required:停止该关系后续自动拉取
144
+ }
145
+ else {
146
+ await this.checkUcpProfile(rel, now, result);
147
+ }
148
+ }
149
+ return false;
150
+ }
151
+ // ---- catalog_search(§7.1 第 3 步:重跑限定 Merchant 的 catalog query)-----
152
+ async checkCatalog(rel, now, result) {
153
+ const source = this.catalogSource;
154
+ const catalogAgentId = rel.scope.catalog_agent_id;
155
+ const previous = this.store.getState(rel.relationship_id, "catalog_search");
156
+ let snapshot;
157
+ try {
158
+ const record = await source.getRecord(catalogAgentId);
159
+ const query = typeof rel.scope.query === "string" && rel.scope.query !== ""
160
+ ? rel.scope.query
161
+ : undefined;
162
+ const region = typeof rel.scope.region === "string" && rel.scope.region !== ""
163
+ ? rel.scope.region
164
+ : undefined;
165
+ const hits = await source.searchListings({
166
+ ...(query !== undefined ? { q: query } : {}),
167
+ ...(region !== undefined ? { region } : {}),
168
+ limit: 100,
169
+ });
170
+ // 只保留该 Merchant 的 listing,且只映射固定 DTO 字段(远程自由文本
171
+ // title/summary 不进快照、不进 observation payload、不进 prompt)。
172
+ const listings = hits
173
+ .filter((h) => h.merchant.merchant_id === rel.merchant_id)
174
+ .map((h) => {
175
+ const entry = {
176
+ listing_id: h.listing.listing_id,
177
+ listing_digest: h.listing.listing_digest,
178
+ publication_state: h.listing.publication_state,
179
+ updated_at: h.listing.updated_at,
180
+ };
181
+ if (h.listing.commercial_hints?.availability_hint !== undefined) {
182
+ entry.availability_hint = h.listing.commercial_hints.availability_hint;
183
+ }
184
+ if (h.listing.commercial_hints?.lead_time_hint !== undefined) {
185
+ entry.lead_time_hint = h.listing.commercial_hints.lead_time_hint;
186
+ }
187
+ if (h.listing.source_revision !== undefined) {
188
+ entry.source_revision = h.listing.source_revision;
189
+ }
190
+ return entry;
191
+ })
192
+ .sort((a, b) => (a.listing_id < b.listing_id ? -1 : 1));
193
+ snapshot = {
194
+ record: {
195
+ freshness_state: record.freshness_state,
196
+ verification_level: record.verification_level,
197
+ administrative_state: record.administrative_state,
198
+ updated_at: record.updated_at,
199
+ },
200
+ listings,
201
+ };
202
+ }
203
+ catch (err) {
204
+ const isRedirectReject = err instanceof CatalogSourceError && err.message.includes("redirect");
205
+ const permanent = err instanceof CatalogSourceError &&
206
+ (err.code === "response_invalid" || isRedirectReject);
207
+ this.recordFailure(rel, "catalog_search", previous, now, err, permanent, result, !isRedirectReject);
208
+ return;
209
+ }
210
+ const digest = contentDigest(snapshot);
211
+ const unchanged = previous?.content_digest === digest;
212
+ if (!unchanged && previous?.snapshot !== undefined) {
213
+ this.diffCatalogSnapshot(rel, previous.snapshot, snapshot, now);
214
+ }
215
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
216
+ this.store.recordSourceSuccess(rel.relationship_id, "catalog_search", {
217
+ checked_at: now,
218
+ next_check_at: next,
219
+ source_url_or_ref: `catalog:${catalogAgentId}`,
220
+ content_digest: digest,
221
+ snapshot: snapshot,
222
+ unchanged,
223
+ });
224
+ }
225
+ diffCatalogSnapshot(rel, oldSnap, newSnap, now) {
226
+ const oldListings = new Map(oldSnap.listings.map((l) => [l.listing_id, l]));
227
+ const newListings = new Map(newSnap.listings.map((l) => [l.listing_id, l]));
228
+ const emit = (kind, payload) => {
229
+ // content_digest 去重:同一变化重复观察到时静默,不重复落账(§6.3)。
230
+ this.store.addObservation({
231
+ relationship_id: rel.relationship_id,
232
+ kind,
233
+ source_type: "catalog_search",
234
+ payload,
235
+ content_digest: contentDigest({ kind, ...payload }),
236
+ observed_at: now,
237
+ fresh_until: now,
238
+ verified: true,
239
+ });
240
+ };
241
+ for (const [id, entry] of newListings) {
242
+ const old = oldListings.get(id);
243
+ if (old === undefined) {
244
+ emit("listing_added", { listing_id: id });
245
+ continue;
246
+ }
247
+ if (old.availability_hint !== entry.availability_hint) {
248
+ emit("availability_hint_changed", {
249
+ listing_id: id,
250
+ from: old.availability_hint ?? null,
251
+ to: entry.availability_hint ?? null,
252
+ });
253
+ }
254
+ if (old.lead_time_hint !== entry.lead_time_hint) {
255
+ emit("lead_time_hint_changed", {
256
+ listing_id: id,
257
+ from: old.lead_time_hint ?? null,
258
+ to: entry.lead_time_hint ?? null,
259
+ });
260
+ }
261
+ if (old.listing_digest !== entry.listing_digest) {
262
+ emit("listing_updated", { listing_id: id });
263
+ }
264
+ }
265
+ for (const id of oldListings.keys()) {
266
+ if (!newListings.has(id)) {
267
+ emit("listing_withdrawn", { listing_id: id });
268
+ }
269
+ }
270
+ if (oldSnap.record.freshness_state !== newSnap.record.freshness_state) {
271
+ emit("freshness_changed", {
272
+ from: oldSnap.record.freshness_state,
273
+ to: newSnap.record.freshness_state,
274
+ });
275
+ }
276
+ }
277
+ // ---- agent_card ----------------------------------------------------------
278
+ /** 返回 false 表示指纹变化已置 review_required,调用方停止该关系后续拉取。 */
279
+ async checkAgentCard(rel, now, result) {
280
+ const previous = this.store.getState(rel.relationship_id, "agent_card");
281
+ let card;
282
+ try {
283
+ const raw = await this.getJson(rel.agent_card_url);
284
+ try {
285
+ card = parseAgentCard(raw);
286
+ }
287
+ catch (err) {
288
+ throw new SupplierPullError("schema_invalid", `Agent Card rejected: ${err instanceof Error ? err.message : String(err)}`, true);
289
+ }
290
+ }
291
+ catch (err) {
292
+ const permanent = err instanceof SupplierPullError && err.permanent;
293
+ const localRejection = err instanceof SupplierPullError &&
294
+ (err.code === "unsafe_target" || err.code === "redirect");
295
+ this.recordFailure(rel, "agent_card", previous, now, err, permanent, result, !localRejection);
296
+ return true;
297
+ }
298
+ const fingerprint = computeAgentCardFingerprint(card);
299
+ // trust 接线(§8:身份证据进 trust records,结论由评估器推导)。
300
+ try {
301
+ this.trustStore?.observe({
302
+ counterparty_identity: rel.canonical_domain,
303
+ kind: "exchange_success",
304
+ observed_at: now,
305
+ domain: rel.canonical_domain,
306
+ agent_card_fingerprint: fingerprint,
307
+ });
308
+ }
309
+ catch (err) {
310
+ result.errors.push(`trust observe ${rel.relationship_id}: ${err instanceof Error ? err.message : String(err)}`);
311
+ }
312
+ const priorFingerprint = previous?.last_verified_fingerprint;
313
+ if (priorFingerprint !== undefined && priorFingerprint !== fingerprint) {
314
+ // §8 第 5 步:身份承载字段变化不得静默沿用旧信任——关系进
315
+ // review_required,停止后续自动拉取,写 profile_or_identity_changed。
316
+ this.store.addObservation({
317
+ relationship_id: rel.relationship_id,
318
+ kind: "profile_or_identity_changed",
319
+ source_type: "agent_card",
320
+ payload: { from: priorFingerprint, to: fingerprint },
321
+ content_digest: contentDigest({ kind: "profile_or_identity_changed", to: fingerprint }),
322
+ observed_at: now,
323
+ fresh_until: now,
324
+ verified: true,
325
+ });
326
+ this.store.updateStatus(rel.relationship_id, "review_required");
327
+ return false;
328
+ }
329
+ // 指纹之外的卡片快照(固定字段;description 等自由文本不进快照)。
330
+ const snapshot = {
331
+ fingerprint,
332
+ version: card.version,
333
+ capabilities: card.capabilities ?? null,
334
+ skills: (card.skills ?? []).map((s) => s.id).sort(),
335
+ interfaces: card.supportedInterfaces.map((i) => i.url).sort(),
336
+ };
337
+ const digest = contentDigest(snapshot);
338
+ const unchanged = previous?.content_digest === digest;
339
+ if (!unchanged && previous?.content_digest !== undefined) {
340
+ this.store.addObservation({
341
+ relationship_id: rel.relationship_id,
342
+ kind: "capability_changed",
343
+ source_type: "agent_card",
344
+ payload: { from: previous.content_digest, to: digest },
345
+ content_digest: contentDigest({ kind: "capability_changed", source: "agent_card", to: digest }),
346
+ observed_at: now,
347
+ fresh_until: now,
348
+ verified: true,
349
+ });
350
+ }
351
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
352
+ this.store.recordSourceSuccess(rel.relationship_id, "agent_card", {
353
+ checked_at: now,
354
+ next_check_at: next,
355
+ source_url_or_ref: rel.agent_card_url,
356
+ content_digest: digest,
357
+ snapshot,
358
+ last_verified_fingerprint: fingerprint,
359
+ unchanged,
360
+ });
361
+ return true;
362
+ }
363
+ // ---- ucp_profile -----------------------------------------------------------
364
+ async checkUcpProfile(rel, now, result) {
365
+ const url = rel.ucp_profile_url;
366
+ const previous = this.store.getState(rel.relationship_id, "ucp_profile");
367
+ let profile;
368
+ try {
369
+ const raw = await this.getJson(url);
370
+ // 宽松 schema 校验:必须是 JSON object(§7.1:仅 GET JSON + 宽松校验)。
371
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
372
+ throw new SupplierPullError("schema_invalid", "UCP profile must be a JSON object", true);
373
+ }
374
+ profile = raw;
375
+ }
376
+ catch (err) {
377
+ const permanent = err instanceof SupplierPullError && err.permanent;
378
+ const localRejection = err instanceof SupplierPullError &&
379
+ (err.code === "unsafe_target" || err.code === "redirect");
380
+ this.recordFailure(rel, "ucp_profile", previous, now, err, permanent, result, !localRejection);
381
+ return;
382
+ }
383
+ const digest = contentDigest(profile);
384
+ const unchanged = previous?.content_digest === digest;
385
+ if (!unchanged && previous?.content_digest !== undefined) {
386
+ this.store.addObservation({
387
+ relationship_id: rel.relationship_id,
388
+ kind: "capability_changed",
389
+ source_type: "ucp_profile",
390
+ payload: { from: previous.content_digest, to: digest },
391
+ content_digest: contentDigest({ kind: "capability_changed", source: "ucp_profile", to: digest }),
392
+ observed_at: now,
393
+ fresh_until: now,
394
+ verified: true,
395
+ });
396
+ }
397
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
398
+ this.store.recordSourceSuccess(rel.relationship_id, "ucp_profile", {
399
+ checked_at: now,
400
+ next_check_at: next,
401
+ source_url_or_ref: url,
402
+ content_digest: digest,
403
+ snapshot: profile,
404
+ unchanged,
405
+ });
406
+ }
407
+ // ---- 调度与退避 ------------------------------------------------------------
408
+ intervalSeconds(rel) {
409
+ const raw = Number(rel.policy.interval_seconds ?? DEFAULT_INTERVAL_SECONDS);
410
+ if (!Number.isFinite(raw) || raw <= 0)
411
+ return DEFAULT_INTERVAL_SECONDS;
412
+ return Math.max(Math.floor(raw), MIN_INTERVAL_SECONDS);
413
+ }
414
+ /** 成功后下次检查:连续无变化 interval×1.5 逐步放慢,封顶 24h(§8)。 */
415
+ scheduleAfterSuccess(rel, previous, now, unchanged) {
416
+ const base = this.intervalSeconds(rel);
417
+ const streak = unchanged ? (previous?.unchanged_count ?? 0) + 1 : 0;
418
+ const seconds = Math.min(base * 1.5 ** streak, MAX_INTERVAL_SECONDS);
419
+ return new Date(Date.parse(now) + seconds * 1000).toISOString();
420
+ }
421
+ /**
422
+ * 失败退避(§8 第 9 步):transient 指数退避 2^min(n-1,5)×interval 封顶
423
+ * 24h + ±10% jitter;permanent(4xx/SSRF 拒绝/schema 拒绝)直接 24h。
424
+ * 同时写 unreachable observation(content_digest 去重,持续失败不刷屏)。
425
+ * 例外:本地安全策略拒绝(SSRF/redirect,observeUnreachable=false)不是
426
+ * 远程事实,只退避、不写 observation。
427
+ */
428
+ recordFailure(rel, sourceType, previous, now, err, permanent, result, observeUnreachable = true) {
429
+ const message = err instanceof Error ? err.message : String(err);
430
+ const code = err instanceof SupplierPullError ? err.code : "network";
431
+ const attempts = (previous?.failure_count ?? 0) + 1;
432
+ const base = this.intervalSeconds(rel);
433
+ let seconds;
434
+ if (permanent) {
435
+ seconds = PERMANENT_BACKOFF_SECONDS;
436
+ }
437
+ else {
438
+ const backoff = Math.min(base * 2 ** Math.min(attempts - 1, 5), MAX_INTERVAL_SECONDS);
439
+ seconds = backoff * (1 + (this.random() - 0.5) * 0.2);
440
+ }
441
+ const backoffAt = new Date(Date.parse(now) + Math.floor(seconds) * 1000).toISOString();
442
+ this.store.recordSourceFailure(rel.relationship_id, sourceType, {
443
+ checked_at: now,
444
+ backoff_at: backoffAt,
445
+ });
446
+ if (observeUnreachable) {
447
+ this.store.addObservation({
448
+ relationship_id: rel.relationship_id,
449
+ kind: "unreachable",
450
+ source_type: sourceType,
451
+ payload: { error: message, permanent },
452
+ content_digest: contentDigest({ kind: "unreachable", source: sourceType, code }),
453
+ observed_at: now,
454
+ fresh_until: backoffAt,
455
+ verified: false,
456
+ });
457
+ }
458
+ result.errors.push(`${sourceType} ${rel.relationship_id}: ${message}`);
459
+ }
460
+ // ---- safe-http 拉取模板(SSRF/DNS/redirect/body 上限/超时,§9.1)-----------
461
+ async getJson(url) {
462
+ let safeUrl;
463
+ try {
464
+ safeUrl = assertSafeTargetUrl(url, { allowLoopback: this.allowLoopback });
465
+ await assertResolvableTargetUrl(safeUrl, {
466
+ ...(this.skipDnsCheck !== undefined ? { skipDnsCheck: this.skipDnsCheck } : {}),
467
+ ...(this.resolveIp !== undefined ? { resolveIp: this.resolveIp } : {}),
468
+ });
469
+ }
470
+ catch (err) {
471
+ throw new SupplierPullError("unsafe_target", `URL rejected by safety policy: ${err instanceof Error ? err.message : String(err)}`, true);
472
+ }
473
+ const controller = new AbortController();
474
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
475
+ try {
476
+ let response;
477
+ try {
478
+ response = await this.fetchFn(safeUrl.href, {
479
+ redirect: "manual",
480
+ signal: controller.signal,
481
+ headers: {
482
+ accept: "application/json",
483
+ // §9.2:不向 Merchant 直连发送稳定 X-Buyer-Id 等身份头。
484
+ "user-agent": "kiwi-buyer",
485
+ },
486
+ });
487
+ }
488
+ catch (err) {
489
+ const name = err?.name;
490
+ throw new SupplierPullError(name === "AbortError" ? "timeout" : "network", `fetch failed: ${url} (${err instanceof Error ? err.message : String(err)})`, false);
491
+ }
492
+ if (isRedirectResponse(response)) {
493
+ throw new SupplierPullError("redirect", `must not follow redirects (HTTP ${response.status} from ${url})`, true);
494
+ }
495
+ if (!response.ok) {
496
+ throw new SupplierPullError("http_error", `HTTP ${response.status} from ${url}`, response.status >= 400 && response.status < 500);
497
+ }
498
+ try {
499
+ return await readJsonBody(response, { signal: controller.signal });
500
+ }
501
+ catch (err) {
502
+ if (controller.signal.aborted) {
503
+ throw new SupplierPullError("timeout", `timed out reading response: ${url}`, false);
504
+ }
505
+ if (err instanceof SafeHttpError) {
506
+ throw new SupplierPullError(err.code, `${url}: ${err.message}`, true);
507
+ }
508
+ throw new SupplierPullError("invalid_json", `${url}: ${err instanceof Error ? err.message : String(err)}`, true);
509
+ }
510
+ }
511
+ finally {
512
+ clearTimeout(timer);
513
+ }
514
+ }
515
+ }
516
+ function summarize(obs) {
517
+ const id = typeof obs.payload.listing_id === "string" ? ` ${obs.payload.listing_id}` : "";
518
+ switch (obs.kind) {
519
+ case "listing_added":
520
+ return `新上架 listing${id}`;
521
+ case "listing_updated":
522
+ return `listing${id} 有更新`;
523
+ case "listing_withdrawn":
524
+ return `listing${id} 已下架`;
525
+ case "capability_changed":
526
+ return `供应商能力声明发生变化(${obs.source_type})`;
527
+ case "availability_hint_changed":
528
+ return `listing${id} 可用性提示变化`;
529
+ case "lead_time_hint_changed":
530
+ return `listing${id} 交期提示变化`;
531
+ case "profile_or_identity_changed":
532
+ return "供应商身份指纹变化,关系已进入 review_required";
533
+ case "freshness_changed":
534
+ return `catalog 新鲜度变化:${String(obs.payload.from)} → ${String(obs.payload.to)}`;
535
+ case "unreachable":
536
+ return `来源不可达(${obs.source_type})`;
537
+ }
538
+ }
539
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/agent/supplier/scheduler.ts"],"names":[],"mappings":"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"}