@harrylabsj/kiwi 0.7.21 → 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 (146) 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.d.ts +7 -0
  5. package/dist/agent/buyer/buyer-tools.js +53 -0
  6. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  7. package/dist/agent/buyer/scheduler.d.ts +4 -0
  8. package/dist/agent/buyer/scheduler.js +5 -1
  9. package/dist/agent/buyer/scheduler.js.map +1 -1
  10. package/dist/agent/buyer/task-store.d.ts +5 -0
  11. package/dist/agent/buyer/task-store.js +13 -0
  12. package/dist/agent/buyer/task-store.js.map +1 -1
  13. package/dist/agent/chat-tools.js +10 -3
  14. package/dist/agent/chat-tools.js.map +1 -1
  15. package/dist/agent/context/fencing.d.ts +27 -0
  16. package/dist/agent/context/fencing.js +126 -0
  17. package/dist/agent/context/fencing.js.map +1 -0
  18. package/dist/agent/context/grounding.d.ts +18 -0
  19. package/dist/agent/context/grounding.js +22 -0
  20. package/dist/agent/context/grounding.js.map +1 -0
  21. package/dist/agent/host/events.d.ts +31 -0
  22. package/dist/agent/host/events.js +62 -0
  23. package/dist/agent/host/events.js.map +1 -0
  24. package/dist/agent/host/tui-renderer.d.ts +17 -0
  25. package/dist/agent/host/tui-renderer.js +125 -0
  26. package/dist/agent/host/tui-renderer.js.map +1 -0
  27. package/dist/agent/host/web-renderer.d.ts +71 -0
  28. package/dist/agent/host/web-renderer.js +185 -0
  29. package/dist/agent/host/web-renderer.js.map +1 -0
  30. package/dist/agent/kernel-builder.d.ts +3 -1
  31. package/dist/agent/kernel-builder.js +4 -1
  32. package/dist/agent/kernel-builder.js.map +1 -1
  33. package/dist/agent/kernel.d.ts +22 -1
  34. package/dist/agent/kernel.js +294 -22
  35. package/dist/agent/kernel.js.map +1 -1
  36. package/dist/agent/memory/schema.d.ts +1 -1
  37. package/dist/agent/memory/schema.js +67 -1
  38. package/dist/agent/memory/schema.js.map +1 -1
  39. package/dist/agent/merchant/intelligence/backend.d.ts +40 -0
  40. package/dist/agent/merchant/intelligence/backend.js +2 -0
  41. package/dist/agent/merchant/intelligence/backend.js.map +1 -0
  42. package/dist/agent/merchant/intelligence/default-backend.d.ts +38 -0
  43. package/dist/agent/merchant/intelligence/default-backend.js +454 -0
  44. package/dist/agent/merchant/intelligence/default-backend.js.map +1 -0
  45. package/dist/agent/merchant/intelligence/http-analytics-source.d.ts +55 -0
  46. package/dist/agent/merchant/intelligence/http-analytics-source.js +193 -0
  47. package/dist/agent/merchant/intelligence/http-analytics-source.js.map +1 -0
  48. package/dist/agent/merchant/intelligence/types.d.ts +109 -0
  49. package/dist/agent/merchant/intelligence/types.js +2 -0
  50. package/dist/agent/merchant/intelligence/types.js.map +1 -0
  51. package/dist/agent/merchant/merchant-enrichment.d.ts +10 -0
  52. package/dist/agent/merchant/merchant-enrichment.js +38 -0
  53. package/dist/agent/merchant/merchant-enrichment.js.map +1 -0
  54. package/dist/agent/merchant/merchant-grounding.d.ts +5 -0
  55. package/dist/agent/merchant/merchant-grounding.js +76 -0
  56. package/dist/agent/merchant/merchant-grounding.js.map +1 -0
  57. package/dist/agent/merchant/merchant-presentations.d.ts +8 -0
  58. package/dist/agent/merchant/merchant-presentations.js +184 -0
  59. package/dist/agent/merchant/merchant-presentations.js.map +1 -0
  60. package/dist/agent/merchant/merchant-tools.d.ts +8 -0
  61. package/dist/agent/merchant/merchant-tools.js +208 -9
  62. package/dist/agent/merchant/merchant-tools.js.map +1 -1
  63. package/dist/agent/presentation/registry.d.ts +14 -0
  64. package/dist/agent/presentation/registry.js +24 -0
  65. package/dist/agent/presentation/registry.js.map +1 -0
  66. package/dist/agent/presentation/runner.d.ts +11 -0
  67. package/dist/agent/presentation/runner.js +17 -0
  68. package/dist/agent/presentation/runner.js.map +1 -0
  69. package/dist/agent/presentation/sanitize.d.ts +16 -0
  70. package/dist/agent/presentation/sanitize.js +37 -0
  71. package/dist/agent/presentation/sanitize.js.map +1 -0
  72. package/dist/agent/presentation/types.d.ts +28 -0
  73. package/dist/agent/presentation/types.js +8 -0
  74. package/dist/agent/presentation/types.js.map +1 -0
  75. package/dist/agent/session.d.ts +1 -1
  76. package/dist/agent/session.js +2 -2
  77. package/dist/agent/session.js.map +1 -1
  78. package/dist/agent/skills/registry.d.ts +11 -0
  79. package/dist/agent/skills/registry.js +119 -0
  80. package/dist/agent/skills/registry.js.map +1 -0
  81. package/dist/agent/skills/tools.d.ts +6 -0
  82. package/dist/agent/skills/tools.js +36 -0
  83. package/dist/agent/skills/tools.js.map +1 -0
  84. package/dist/agent/skills/types.d.ts +9 -0
  85. package/dist/agent/skills/types.js +2 -0
  86. package/dist/agent/skills/types.js.map +1 -0
  87. package/dist/agent/supplier/scheduler.d.ts +86 -0
  88. package/dist/agent/supplier/scheduler.js +618 -0
  89. package/dist/agent/supplier/scheduler.js.map +1 -0
  90. package/dist/agent/supplier/store.d.ts +173 -0
  91. package/dist/agent/supplier/store.js +387 -0
  92. package/dist/agent/supplier/store.js.map +1 -0
  93. package/dist/agent/system-prompt.d.ts +5 -1
  94. package/dist/agent/system-prompt.js +20 -3
  95. package/dist/agent/system-prompt.js.map +1 -1
  96. package/dist/cli.d.ts +5 -0
  97. package/dist/cli.js +177 -12
  98. package/dist/cli.js.map +1 -1
  99. package/dist/config/profile.d.ts +21 -0
  100. package/dist/config/profile.js +59 -0
  101. package/dist/config/profile.js.map +1 -1
  102. package/dist/discovery/catalog-source/kiwi-record.d.ts +2 -0
  103. package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
  104. package/dist/discovery/catalog-source/kiwi-source.js +2 -0
  105. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
  106. package/dist/handoff/authorization.js +1 -1
  107. package/dist/http/merchant-server.d.ts +65 -0
  108. package/dist/http/merchant-server.js +346 -0
  109. package/dist/http/merchant-server.js.map +1 -0
  110. package/dist/merchant/stats-store.d.ts +7 -0
  111. package/dist/merchant/stats-store.js +11 -0
  112. package/dist/merchant/stats-store.js.map +1 -1
  113. package/dist/negotiation/action-candidate.js +1 -1
  114. package/dist/operator/types.d.ts +1 -1
  115. package/dist/product-cli.d.ts +2 -2
  116. package/dist/product-cli.js +14 -2
  117. package/dist/product-cli.js.map +1 -1
  118. package/dist/product-supplier.d.ts +148 -0
  119. package/dist/product-supplier.js +452 -0
  120. package/dist/product-supplier.js.map +1 -0
  121. package/dist/runtime/fake-model.d.ts +1 -1
  122. package/dist/trust/identity/jwk.d.ts +11 -0
  123. package/dist/trust/identity/jwk.js +2 -0
  124. package/dist/trust/identity/jwk.js.map +1 -0
  125. package/dist/trust/identity/jws.d.ts +2 -1
  126. package/dist/trust/identity/jws.js.map +1 -1
  127. package/dist/trust/identity/keys.d.ts +2 -1
  128. package/dist/trust/identity/keys.js.map +1 -1
  129. package/dist/trust/identity/message-signature.d.ts +1 -14
  130. package/dist/trust/identity/message-signature.js.map +1 -1
  131. package/dist/weixin/channel.d.ts +3 -0
  132. package/dist/weixin/channel.js +18 -2
  133. package/dist/weixin/channel.js.map +1 -1
  134. package/examples/profiles/merchant.deepseek.yaml +6 -0
  135. package/examples/profiles/merchant.fake.yaml +6 -0
  136. package/examples/profiles/merchant.local.yaml +6 -0
  137. package/package.json +7 -6
  138. package/skills/kiwi-buyer/SKILL.md +66 -0
  139. package/skills/merchant/catalog-operations/SKILL.md +17 -0
  140. package/skills/merchant/change-approval/SKILL.md +16 -0
  141. package/skills/merchant/human-review/SKILL.md +17 -0
  142. package/skills/merchant/inventory-operations/SKILL.md +17 -0
  143. package/skills/merchant/negotiation-review/SKILL.md +18 -0
  144. package/skills/merchant/performance-insights/SKILL.md +19 -0
  145. package/contracts/candidate-agent-dto-1.0.README.md +0 -43
  146. package/contracts/conformance/python-service/README.md +0 -19
@@ -0,0 +1,618 @@
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
+ import { assertSupplierEndpointAuthority, SupplierStoreError } from "./store.js";
41
+ class SupplierPullError extends Error {
42
+ code;
43
+ permanent;
44
+ constructor(code, message, permanent) {
45
+ super(message);
46
+ this.name = "SupplierPullError";
47
+ this.code = code;
48
+ this.permanent = permanent;
49
+ }
50
+ }
51
+ const DEFAULT_BUDGET = { max_requests: 20, max_relationships: 20 };
52
+ /** §8:普通 watch 最短间隔以小时计——默认 6h,下限 1h,无变化逐步放慢封顶 24h。 */
53
+ const DEFAULT_INTERVAL_SECONDS = 6 * 3600;
54
+ const MIN_INTERVAL_SECONDS = 3600;
55
+ const MAX_INTERVAL_SECONDS = 24 * 3600;
56
+ const PERMANENT_BACKOFF_SECONDS = 24 * 3600;
57
+ const DEFAULT_TIMEOUT_MS = 15_000;
58
+ export class SupplierScheduler {
59
+ store;
60
+ catalogSource;
61
+ trustStore;
62
+ now;
63
+ fetchFn;
64
+ allowLoopback;
65
+ skipDnsCheck;
66
+ resolveIp;
67
+ random;
68
+ timeoutMs;
69
+ constructor(options) {
70
+ this.store = options.store;
71
+ this.catalogSource = options.catalogSource;
72
+ this.trustStore = options.trustStore;
73
+ const clock = options.now ?? (() => new Date().toISOString());
74
+ this.now = () => new Date(Date.parse(clock())).toISOString();
75
+ this.fetchFn = options.fetchFn ?? ((url, init) => globalThis.fetch(url, init));
76
+ this.allowLoopback = options.allowLoopback === true;
77
+ this.skipDnsCheck = options.skipDnsCheck;
78
+ this.resolveIp = options.resolveIp;
79
+ this.random = options.random ?? Math.random;
80
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
81
+ }
82
+ async tick(budget = {}) {
83
+ const b = { ...DEFAULT_BUDGET, ...budget };
84
+ const now = this.now();
85
+ const result = {
86
+ checked: 0,
87
+ requests_used: 0,
88
+ observations: [],
89
+ notified: [],
90
+ errors: [],
91
+ };
92
+ let requests = 0;
93
+ // 惰性过期清扫(§8:关系和规则必须有 expiry)。
94
+ for (const rel of this.store.expirableRelationships(now)) {
95
+ try {
96
+ this.store.updateStatus(rel.relationship_id, "expired");
97
+ }
98
+ catch (err) {
99
+ result.errors.push(`expire ${rel.relationship_id}: ${err instanceof Error ? err.message : String(err)}`);
100
+ }
101
+ }
102
+ for (const rel of this.store.dueRelationships(now, b.max_relationships)) {
103
+ if (requests >= b.max_requests)
104
+ break;
105
+ result.checked += 1;
106
+ const before = new Set(this.store.listObservations(rel.relationship_id).map((o) => o.observation_id));
107
+ const halted = await this.checkRelationship(rel, now, result, () => {
108
+ if (requests >= b.max_requests)
109
+ return false;
110
+ requests += 1;
111
+ result.requests_used = requests;
112
+ return true;
113
+ });
114
+ if (halted)
115
+ break;
116
+ const fresh = this.store
117
+ .listObservations(rel.relationship_id)
118
+ .filter((o) => !before.has(o.observation_id));
119
+ result.observations.push(...fresh);
120
+ if (fresh.length > 0) {
121
+ // §8 第 8 步:同一关系的多条变化合并成一次本地通知(通知本身只是
122
+ // tick 返回 + observation 落账,不引入新通知系统)。
123
+ result.notified.push({
124
+ relationship_id: rel.relationship_id,
125
+ merchant_id: rel.merchant_id,
126
+ summary: fresh.map((o) => summarize(o)).join(";"),
127
+ });
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ /**
133
+ * 拉取一个关系的所有配置来源。返回 true 表示预算耗尽应中断整个 tick。
134
+ * Agent Card 指纹变化 → review_required 并跳过后续来源(§8 第 5 步)。
135
+ */
136
+ async checkRelationship(rel, now, result, spend) {
137
+ try {
138
+ assertSupplierEndpointAuthority(rel.canonical_domain, rel.agent_card_url);
139
+ if (rel.ucp_profile_url !== undefined) {
140
+ assertSupplierEndpointAuthority(rel.canonical_domain, rel.ucp_profile_url);
141
+ }
142
+ }
143
+ catch (err) {
144
+ this.requireReview(rel, now, err instanceof Error ? err.message : String(err), {}, "agent_card");
145
+ return false;
146
+ }
147
+ const sources = [];
148
+ if (this.catalogSource !== undefined && typeof rel.scope.catalog_agent_id === "string") {
149
+ sources.push("catalog_search");
150
+ }
151
+ sources.push("agent_card");
152
+ if (rel.ucp_profile_url !== undefined)
153
+ sources.push("ucp_profile");
154
+ for (const source of sources) {
155
+ const state = this.store.getState(rel.relationship_id, source);
156
+ if ((state?.backoff_until !== undefined &&
157
+ Date.parse(state.backoff_until) > Date.parse(now)) ||
158
+ (state?.next_check_at !== undefined &&
159
+ Date.parse(state.next_check_at) > Date.parse(now))) {
160
+ continue;
161
+ }
162
+ if (source === "catalog_search") {
163
+ if (!(await this.checkCatalog(rel, now, result, spend)))
164
+ return true;
165
+ if (this.store.getRelationship(rel.relationship_id)?.status === "review_required") {
166
+ return false;
167
+ }
168
+ }
169
+ else if (source === "agent_card") {
170
+ if (!spend())
171
+ return true;
172
+ const fingerprintOk = await this.checkAgentCard(rel, now, result);
173
+ if (!fingerprintOk)
174
+ return false; // review_required:停止该关系后续自动拉取
175
+ }
176
+ else {
177
+ if (!spend())
178
+ return true;
179
+ await this.checkUcpProfile(rel, now, result);
180
+ }
181
+ }
182
+ return false;
183
+ }
184
+ // ---- catalog_search(§7.1 第 3 步:重跑限定 Merchant 的 catalog query)-----
185
+ async checkCatalog(rel, now, result, spend) {
186
+ const source = this.catalogSource;
187
+ const catalogAgentId = rel.scope.catalog_agent_id;
188
+ const previous = this.store.getState(rel.relationship_id, "catalog_search");
189
+ let snapshot;
190
+ try {
191
+ if (!spend())
192
+ return false;
193
+ const record = await source.getRecord(catalogAgentId);
194
+ const identityChanged = record.canonical_domain !== rel.canonical_domain ||
195
+ record.agent_card_url !== rel.agent_card_url ||
196
+ (record.ucp_profile_url ?? undefined) !== rel.ucp_profile_url ||
197
+ (record.merchant_id ?? record.catalog_agent_id) !== rel.merchant_id;
198
+ if (identityChanged) {
199
+ this.requireReview(rel, now, "catalog identity-bearing fields changed", {
200
+ catalog_agent_id: catalogAgentId,
201
+ });
202
+ return true;
203
+ }
204
+ assertSupplierEndpointAuthority(record.canonical_domain, record.agent_card_url);
205
+ if (record.ucp_profile_url !== undefined) {
206
+ assertSupplierEndpointAuthority(record.canonical_domain, record.ucp_profile_url);
207
+ }
208
+ if (record.administrative_state !== "active" ||
209
+ record.freshness_state === "unreachable" ||
210
+ record.verification_level === "discovered") {
211
+ this.requireReview(rel, now, "catalog governance no longer permits automatic pull", {
212
+ administrative_state: record.administrative_state,
213
+ freshness_state: record.freshness_state,
214
+ verification_level: record.verification_level,
215
+ });
216
+ return true;
217
+ }
218
+ const query = typeof rel.scope.query === "string" && rel.scope.query !== ""
219
+ ? rel.scope.query
220
+ : undefined;
221
+ const region = typeof rel.scope.region === "string" && rel.scope.region !== ""
222
+ ? rel.scope.region
223
+ : undefined;
224
+ if (!spend())
225
+ return false;
226
+ const hits = await source.searchListings({
227
+ owner_agent_id: catalogAgentId,
228
+ ...(query !== undefined ? { q: query } : {}),
229
+ ...(region !== undefined ? { region } : {}),
230
+ });
231
+ // 只保留该 Merchant 的 listing,且只映射固定 DTO 字段(远程自由文本
232
+ // title/summary 不进快照、不进 observation payload、不进 prompt)。
233
+ const listings = hits
234
+ .filter((h) => h.listing.owner_agent_id === catalogAgentId)
235
+ .map((h) => {
236
+ const entry = {
237
+ listing_id: h.listing.listing_id,
238
+ listing_digest: h.listing.listing_digest,
239
+ publication_state: h.listing.publication_state,
240
+ updated_at: h.listing.updated_at,
241
+ };
242
+ if (h.listing.commercial_hints?.availability_hint !== undefined) {
243
+ entry.availability_hint = h.listing.commercial_hints.availability_hint;
244
+ }
245
+ if (h.listing.commercial_hints?.lead_time_hint !== undefined) {
246
+ entry.lead_time_hint = h.listing.commercial_hints.lead_time_hint;
247
+ }
248
+ if (h.listing.source_revision !== undefined) {
249
+ entry.source_revision = h.listing.source_revision;
250
+ }
251
+ return entry;
252
+ })
253
+ .sort((a, b) => (a.listing_id < b.listing_id ? -1 : 1));
254
+ snapshot = {
255
+ record: {
256
+ freshness_state: record.freshness_state,
257
+ verification_level: record.verification_level,
258
+ administrative_state: record.administrative_state,
259
+ updated_at: record.updated_at,
260
+ },
261
+ listings,
262
+ };
263
+ }
264
+ catch (err) {
265
+ if (err instanceof SupplierStoreError) {
266
+ this.requireReview(rel, now, err.message, { catalog_agent_id: catalogAgentId });
267
+ return true;
268
+ }
269
+ const isRedirectReject = err instanceof CatalogSourceError && err.message.includes("redirect");
270
+ const permanent = err instanceof CatalogSourceError &&
271
+ (err.code === "response_invalid" || isRedirectReject);
272
+ this.recordFailure(rel, "catalog_search", previous, now, err, permanent, result, !isRedirectReject);
273
+ return true;
274
+ }
275
+ const digest = contentDigest(snapshot);
276
+ const unchanged = previous?.content_digest === digest;
277
+ if (!unchanged && previous?.snapshot !== undefined) {
278
+ this.diffCatalogSnapshot(rel, previous.snapshot, snapshot, now);
279
+ }
280
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
281
+ this.store.recordSourceSuccess(rel.relationship_id, "catalog_search", {
282
+ checked_at: now,
283
+ next_check_at: next,
284
+ source_url_or_ref: `catalog:${catalogAgentId}`,
285
+ content_digest: digest,
286
+ snapshot: snapshot,
287
+ unchanged,
288
+ });
289
+ return true;
290
+ }
291
+ requireReview(rel, now, reason, details, source = "catalog_search") {
292
+ this.store.addObservation({
293
+ relationship_id: rel.relationship_id,
294
+ kind: "profile_or_identity_changed",
295
+ source_type: source,
296
+ payload: { reason, ...details },
297
+ content_digest: contentDigest({ kind: "profile_or_identity_changed", reason, ...details }),
298
+ observed_at: now,
299
+ fresh_until: now,
300
+ verified: true,
301
+ });
302
+ this.store.updateStatus(rel.relationship_id, "review_required");
303
+ }
304
+ diffCatalogSnapshot(rel, oldSnap, newSnap, now) {
305
+ const oldListings = new Map(oldSnap.listings.map((l) => [l.listing_id, l]));
306
+ const newListings = new Map(newSnap.listings.map((l) => [l.listing_id, l]));
307
+ const emit = (kind, payload) => {
308
+ // content_digest 去重:同一变化重复观察到时静默,不重复落账(§6.3)。
309
+ this.store.addObservation({
310
+ relationship_id: rel.relationship_id,
311
+ kind,
312
+ source_type: "catalog_search",
313
+ payload,
314
+ content_digest: contentDigest({ kind, ...payload }),
315
+ observed_at: now,
316
+ fresh_until: now,
317
+ verified: true,
318
+ });
319
+ };
320
+ for (const [id, entry] of newListings) {
321
+ const old = oldListings.get(id);
322
+ if (old === undefined) {
323
+ emit("listing_added", { listing_id: id });
324
+ continue;
325
+ }
326
+ if (old.availability_hint !== entry.availability_hint) {
327
+ emit("availability_hint_changed", {
328
+ listing_id: id,
329
+ from: old.availability_hint ?? null,
330
+ to: entry.availability_hint ?? null,
331
+ });
332
+ }
333
+ if (old.lead_time_hint !== entry.lead_time_hint) {
334
+ emit("lead_time_hint_changed", {
335
+ listing_id: id,
336
+ from: old.lead_time_hint ?? null,
337
+ to: entry.lead_time_hint ?? null,
338
+ });
339
+ }
340
+ if (old.listing_digest !== entry.listing_digest) {
341
+ emit("listing_updated", { listing_id: id });
342
+ }
343
+ }
344
+ for (const id of oldListings.keys()) {
345
+ if (!newListings.has(id)) {
346
+ emit("listing_withdrawn", { listing_id: id });
347
+ }
348
+ }
349
+ if (oldSnap.record.freshness_state !== newSnap.record.freshness_state) {
350
+ emit("freshness_changed", {
351
+ from: oldSnap.record.freshness_state,
352
+ to: newSnap.record.freshness_state,
353
+ });
354
+ }
355
+ }
356
+ // ---- agent_card ----------------------------------------------------------
357
+ /** 返回 false 表示指纹变化已置 review_required,调用方停止该关系后续拉取。 */
358
+ async checkAgentCard(rel, now, result) {
359
+ const previous = this.store.getState(rel.relationship_id, "agent_card");
360
+ let card;
361
+ try {
362
+ const raw = await this.getJson(rel.agent_card_url);
363
+ try {
364
+ card = parseAgentCard(raw);
365
+ }
366
+ catch (err) {
367
+ throw new SupplierPullError("schema_invalid", `Agent Card rejected: ${err instanceof Error ? err.message : String(err)}`, true);
368
+ }
369
+ }
370
+ catch (err) {
371
+ const permanent = err instanceof SupplierPullError && err.permanent;
372
+ const localRejection = err instanceof SupplierPullError &&
373
+ (err.code === "unsafe_target" || err.code === "redirect");
374
+ this.recordFailure(rel, "agent_card", previous, now, err, permanent, result, !localRejection);
375
+ return true;
376
+ }
377
+ const fingerprint = computeAgentCardFingerprint(card);
378
+ const priorFingerprint = previous?.last_verified_fingerprint;
379
+ if (priorFingerprint !== undefined && priorFingerprint !== fingerprint) {
380
+ // §8 第 5 步:身份承载字段变化不得静默沿用旧信任——关系进
381
+ // review_required,停止后续自动拉取,写 profile_or_identity_changed。
382
+ this.store.addObservation({
383
+ relationship_id: rel.relationship_id,
384
+ kind: "profile_or_identity_changed",
385
+ source_type: "agent_card",
386
+ payload: { from: priorFingerprint, to: fingerprint },
387
+ content_digest: contentDigest({ kind: "profile_or_identity_changed", to: fingerprint }),
388
+ observed_at: now,
389
+ fresh_until: now,
390
+ verified: true,
391
+ });
392
+ this.store.updateStatus(rel.relationship_id, "review_required");
393
+ return false;
394
+ }
395
+ // 只有身份指纹仍一致时,才把本次拉取记为成功交换;变化不能覆盖旧信任。
396
+ try {
397
+ this.trustStore?.observe({
398
+ counterparty_identity: rel.canonical_domain,
399
+ kind: "exchange_success",
400
+ observed_at: now,
401
+ domain: rel.canonical_domain,
402
+ agent_card_fingerprint: fingerprint,
403
+ });
404
+ }
405
+ catch (err) {
406
+ result.errors.push(`trust observe ${rel.relationship_id}: ${err instanceof Error ? err.message : String(err)}`);
407
+ }
408
+ // 指纹之外的卡片快照(固定字段;description 等自由文本不进快照)。
409
+ const snapshot = {
410
+ fingerprint,
411
+ version: card.version,
412
+ capabilities: card.capabilities ?? null,
413
+ skills: (card.skills ?? []).map((s) => s.id).sort(),
414
+ interfaces: card.supportedInterfaces.map((i) => i.url).sort(),
415
+ };
416
+ const digest = contentDigest(snapshot);
417
+ const unchanged = previous?.content_digest === digest;
418
+ if (!unchanged && previous?.content_digest !== undefined) {
419
+ this.store.addObservation({
420
+ relationship_id: rel.relationship_id,
421
+ kind: "capability_changed",
422
+ source_type: "agent_card",
423
+ payload: { from: previous.content_digest, to: digest },
424
+ content_digest: contentDigest({ kind: "capability_changed", source: "agent_card", to: digest }),
425
+ observed_at: now,
426
+ fresh_until: now,
427
+ verified: true,
428
+ });
429
+ }
430
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
431
+ this.store.recordSourceSuccess(rel.relationship_id, "agent_card", {
432
+ checked_at: now,
433
+ next_check_at: next,
434
+ source_url_or_ref: rel.agent_card_url,
435
+ content_digest: digest,
436
+ snapshot,
437
+ last_verified_fingerprint: fingerprint,
438
+ unchanged,
439
+ });
440
+ return true;
441
+ }
442
+ // ---- ucp_profile -----------------------------------------------------------
443
+ async checkUcpProfile(rel, now, result) {
444
+ const url = rel.ucp_profile_url;
445
+ const previous = this.store.getState(rel.relationship_id, "ucp_profile");
446
+ let profile;
447
+ try {
448
+ const raw = await this.getJson(url);
449
+ // 宽松 schema 校验:必须是 JSON object(§7.1:仅 GET JSON + 宽松校验)。
450
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
451
+ throw new SupplierPullError("schema_invalid", "UCP profile must be a JSON object", true);
452
+ }
453
+ profile = raw;
454
+ }
455
+ catch (err) {
456
+ const permanent = err instanceof SupplierPullError && err.permanent;
457
+ const localRejection = err instanceof SupplierPullError &&
458
+ (err.code === "unsafe_target" || err.code === "redirect");
459
+ this.recordFailure(rel, "ucp_profile", previous, now, err, permanent, result, !localRejection);
460
+ return;
461
+ }
462
+ const digest = contentDigest(profile);
463
+ const unchanged = previous?.content_digest === digest;
464
+ if (!unchanged && previous?.content_digest !== undefined) {
465
+ this.store.addObservation({
466
+ relationship_id: rel.relationship_id,
467
+ kind: "capability_changed",
468
+ source_type: "ucp_profile",
469
+ payload: { from: previous.content_digest, to: digest },
470
+ content_digest: contentDigest({ kind: "capability_changed", source: "ucp_profile", to: digest }),
471
+ observed_at: now,
472
+ fresh_until: now,
473
+ verified: true,
474
+ });
475
+ }
476
+ const next = this.scheduleAfterSuccess(rel, previous, now, unchanged);
477
+ this.store.recordSourceSuccess(rel.relationship_id, "ucp_profile", {
478
+ checked_at: now,
479
+ next_check_at: next,
480
+ source_url_or_ref: url,
481
+ content_digest: digest,
482
+ snapshot: profile,
483
+ unchanged,
484
+ });
485
+ }
486
+ // ---- 调度与退避 ------------------------------------------------------------
487
+ intervalSeconds(rel) {
488
+ const raw = Number(rel.policy.interval_seconds ?? DEFAULT_INTERVAL_SECONDS);
489
+ if (!Number.isFinite(raw) || raw <= 0)
490
+ return DEFAULT_INTERVAL_SECONDS;
491
+ return Math.max(Math.floor(raw), MIN_INTERVAL_SECONDS);
492
+ }
493
+ /** 成功后下次检查:连续无变化 interval×1.5 逐步放慢,封顶 24h(§8)。 */
494
+ scheduleAfterSuccess(rel, previous, now, unchanged) {
495
+ const base = this.intervalSeconds(rel);
496
+ const streak = unchanged ? (previous?.unchanged_count ?? 0) + 1 : 0;
497
+ const seconds = Math.min(base * 1.5 ** streak, MAX_INTERVAL_SECONDS);
498
+ return new Date(Date.parse(now) + seconds * 1000).toISOString();
499
+ }
500
+ /**
501
+ * 失败退避(§8 第 9 步):transient 指数退避 2^min(n-1,5)×interval 封顶
502
+ * 24h + ±10% jitter;permanent(4xx/SSRF 拒绝/schema 拒绝)直接 24h。
503
+ * 同时写 unreachable observation(content_digest 去重,持续失败不刷屏)。
504
+ * 例外:本地安全策略拒绝(SSRF/redirect,observeUnreachable=false)不是
505
+ * 远程事实,只退避、不写 observation。
506
+ */
507
+ recordFailure(rel, sourceType, previous, now, err, permanent, result, observeUnreachable = true) {
508
+ const message = err instanceof Error ? err.message : String(err);
509
+ const code = err instanceof SupplierPullError ? err.code : "network";
510
+ const attempts = (previous?.failure_count ?? 0) + 1;
511
+ const base = this.intervalSeconds(rel);
512
+ let seconds;
513
+ if (permanent) {
514
+ seconds = PERMANENT_BACKOFF_SECONDS;
515
+ }
516
+ else {
517
+ const backoff = Math.min(base * 2 ** Math.min(attempts - 1, 5), MAX_INTERVAL_SECONDS);
518
+ seconds = backoff * (1 + (this.random() - 0.5) * 0.2);
519
+ }
520
+ const backoffAt = new Date(Date.parse(now) + Math.floor(seconds) * 1000).toISOString();
521
+ this.store.recordSourceFailure(rel.relationship_id, sourceType, {
522
+ checked_at: now,
523
+ backoff_at: backoffAt,
524
+ });
525
+ if (observeUnreachable) {
526
+ this.store.addObservation({
527
+ relationship_id: rel.relationship_id,
528
+ kind: "unreachable",
529
+ source_type: sourceType,
530
+ payload: { error: message, permanent },
531
+ content_digest: contentDigest({ kind: "unreachable", source: sourceType, code }),
532
+ observed_at: now,
533
+ fresh_until: backoffAt,
534
+ verified: false,
535
+ });
536
+ }
537
+ result.errors.push(`${sourceType} ${rel.relationship_id}: ${message}`);
538
+ }
539
+ // ---- safe-http 拉取模板(SSRF/DNS/redirect/body 上限/超时,§9.1)-----------
540
+ async getJson(url) {
541
+ let safeUrl;
542
+ try {
543
+ safeUrl = assertSafeTargetUrl(url, { allowLoopback: this.allowLoopback });
544
+ await assertResolvableTargetUrl(safeUrl, {
545
+ ...(this.skipDnsCheck !== undefined ? { skipDnsCheck: this.skipDnsCheck } : {}),
546
+ ...(this.resolveIp !== undefined ? { resolveIp: this.resolveIp } : {}),
547
+ });
548
+ }
549
+ catch (err) {
550
+ throw new SupplierPullError("unsafe_target", `URL rejected by safety policy: ${err instanceof Error ? err.message : String(err)}`, true);
551
+ }
552
+ const controller = new AbortController();
553
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
554
+ try {
555
+ let response;
556
+ try {
557
+ response = await this.fetchFn(safeUrl.href, {
558
+ redirect: "manual",
559
+ signal: controller.signal,
560
+ headers: {
561
+ accept: "application/json",
562
+ // §9.2:不向 Merchant 直连发送稳定 X-Buyer-Id 等身份头。
563
+ "user-agent": "kiwi-buyer",
564
+ },
565
+ });
566
+ }
567
+ catch (err) {
568
+ const name = err?.name;
569
+ throw new SupplierPullError(name === "AbortError" ? "timeout" : "network", `fetch failed: ${url} (${err instanceof Error ? err.message : String(err)})`, false);
570
+ }
571
+ if (isRedirectResponse(response)) {
572
+ throw new SupplierPullError("redirect", `must not follow redirects (HTTP ${response.status} from ${url})`, true);
573
+ }
574
+ if (!response.ok) {
575
+ throw new SupplierPullError("http_error", `HTTP ${response.status} from ${url}`, response.status >= 400 && response.status < 500);
576
+ }
577
+ try {
578
+ return await readJsonBody(response, { signal: controller.signal });
579
+ }
580
+ catch (err) {
581
+ if (controller.signal.aborted) {
582
+ throw new SupplierPullError("timeout", `timed out reading response: ${url}`, false);
583
+ }
584
+ if (err instanceof SafeHttpError) {
585
+ throw new SupplierPullError(err.code, `${url}: ${err.message}`, true);
586
+ }
587
+ throw new SupplierPullError("invalid_json", `${url}: ${err instanceof Error ? err.message : String(err)}`, true);
588
+ }
589
+ }
590
+ finally {
591
+ clearTimeout(timer);
592
+ }
593
+ }
594
+ }
595
+ function summarize(obs) {
596
+ const id = typeof obs.payload.listing_id === "string" ? ` ${obs.payload.listing_id}` : "";
597
+ switch (obs.kind) {
598
+ case "listing_added":
599
+ return `新上架 listing${id}`;
600
+ case "listing_updated":
601
+ return `listing${id} 有更新`;
602
+ case "listing_withdrawn":
603
+ return `listing${id} 已下架`;
604
+ case "capability_changed":
605
+ return `供应商能力声明发生变化(${obs.source_type})`;
606
+ case "availability_hint_changed":
607
+ return `listing${id} 可用性提示变化`;
608
+ case "lead_time_hint_changed":
609
+ return `listing${id} 交期提示变化`;
610
+ case "profile_or_identity_changed":
611
+ return "供应商身份指纹变化,关系已进入 review_required";
612
+ case "freshness_changed":
613
+ return `catalog 新鲜度变化:${String(obs.payload.from)} → ${String(obs.payload.to)}`;
614
+ case "unreachable":
615
+ return `来源不可达(${obs.source_type})`;
616
+ }
617
+ }
618
+ //# 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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"}