@harrylabsj/kiwi 0.6.1 → 0.7.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.
- package/README.md +28 -0
- package/contracts/candidate-agent-dto-1.0.README.md +12 -8
- package/contracts/conformance/python-service/README.md +19 -0
- package/contracts/conformance/python-service/run.py +134 -0
- package/contracts/kiwi-catalog/1.0/listing-record.schema.json +11 -1
- package/contracts/kiwi-contracts.lock.json +7 -0
- package/contracts/manifest.json +61 -0
- package/contracts/vectors/candidate-agent.invalid-private-field.json +7 -0
- package/contracts/vectors/candidate-agent.valid.json +26 -0
- package/dist/a2a/client/client.js +39 -34
- package/dist/a2a/client/client.js.map +1 -1
- package/dist/a2a/client/url-policy.d.ts +8 -1
- package/dist/a2a/client/url-policy.js +18 -2
- package/dist/a2a/client/url-policy.js.map +1 -1
- package/dist/a2a/clock.d.ts +30 -0
- package/dist/a2a/clock.js +39 -0
- package/dist/a2a/clock.js.map +1 -0
- package/dist/a2a/negotiate.d.ts +6 -0
- package/dist/a2a/negotiate.js +10 -12
- package/dist/a2a/negotiate.js.map +1 -1
- package/dist/a2a/node.d.ts +20 -2
- package/dist/a2a/node.js +165 -19
- package/dist/a2a/node.js.map +1 -1
- package/dist/a2a/server/auth.js +11 -2
- package/dist/a2a/server/auth.js.map +1 -1
- package/dist/a2a/server/merchant-handler.d.ts +4 -0
- package/dist/a2a/server/merchant-handler.js +283 -27
- package/dist/a2a/server/merchant-handler.js.map +1 -1
- package/dist/a2a/server/pipeline.d.ts +17 -0
- package/dist/a2a/server/pipeline.js +89 -1
- package/dist/a2a/server/pipeline.js.map +1 -1
- package/dist/a2a/server/ucp.d.ts +30 -2
- package/dist/a2a/server/ucp.js +23 -14
- package/dist/a2a/server/ucp.js.map +1 -1
- package/dist/agent/agent-db.js +5 -0
- package/dist/agent/agent-db.js.map +1 -1
- package/dist/agent/buyer/buyer-tools.d.ts +5 -0
- package/dist/agent/buyer/buyer-tools.js +75 -7
- package/dist/agent/buyer/buyer-tools.js.map +1 -1
- package/dist/agent/buyer/search-loop.d.ts +3 -0
- package/dist/agent/buyer/search-loop.js +129 -0
- package/dist/agent/buyer/search-loop.js.map +1 -1
- package/dist/agent/buyer/task-store.d.ts +2 -0
- package/dist/agent/buyer/task-store.js +11 -7
- package/dist/agent/buyer/task-store.js.map +1 -1
- package/dist/agent/kernel.d.ts +6 -0
- package/dist/agent/kernel.js +100 -10
- package/dist/agent/kernel.js.map +1 -1
- package/dist/agent/memory/schema.d.ts +1 -1
- package/dist/agent/memory/schema.js +7 -1
- package/dist/agent/memory/schema.js.map +1 -1
- package/dist/agent/memory/store.d.ts +5 -0
- package/dist/agent/memory/store.js +29 -1
- package/dist/agent/memory/store.js.map +1 -1
- package/dist/agent/merchant/action-candidate.js +15 -1
- package/dist/agent/merchant/action-candidate.js.map +1 -1
- package/dist/agent/merchant/merchant-client.js +22 -4
- package/dist/agent/merchant/merchant-client.js.map +1 -1
- package/dist/agent/merchant/types.d.ts +5 -2
- package/dist/agent/merchant/types.js +6 -2
- package/dist/agent/merchant/types.js.map +1 -1
- package/dist/agent/negotiation-chat.js +34 -14
- package/dist/agent/negotiation-chat.js.map +1 -1
- package/dist/cli.d.ts +56 -0
- package/dist/cli.js +51 -3
- package/dist/cli.js.map +1 -1
- package/dist/commerce/data-source.d.ts +3 -0
- package/dist/commerce/data-source.js.map +1 -1
- package/dist/commerce/http-client.js +35 -31
- package/dist/commerce/http-client.js.map +1 -1
- package/dist/commerce/shopping-cli-source.js +63 -46
- package/dist/commerce/shopping-cli-source.js.map +1 -1
- package/dist/counterparty/a2a-direct/index.d.ts +5 -0
- package/dist/counterparty/a2a-direct/index.js +24 -0
- package/dist/counterparty/a2a-direct/index.js.map +1 -1
- package/dist/counterparty/shopping-cli-hosted/index.js +52 -19
- package/dist/counterparty/shopping-cli-hosted/index.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-record.d.ts +2 -0
- package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-source.js +39 -35
- package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
- package/dist/discovery/catalog-source/register.js +12 -1
- package/dist/discovery/catalog-source/register.js.map +1 -1
- package/dist/discovery/catalog-source/source.js +39 -35
- package/dist/discovery/catalog-source/source.js.map +1 -1
- package/dist/discovery/resolve.d.ts +15 -0
- package/dist/discovery/resolve.js +59 -35
- package/dist/discovery/resolve.js.map +1 -1
- package/dist/discovery/ucp/index.d.ts +1 -1
- package/dist/discovery/ucp/index.js +1 -1
- package/dist/discovery/ucp/index.js.map +1 -1
- package/dist/discovery/ucp/resolver.d.ts +5 -0
- package/dist/discovery/ucp/resolver.js +65 -38
- package/dist/discovery/ucp/resolver.js.map +1 -1
- package/dist/discovery/ucp/vendor.d.ts +1 -1
- package/dist/discovery/ucp/vendor.js +1 -1
- package/dist/handoff/delivery.d.ts +4 -2
- package/dist/handoff/delivery.js +6 -1
- package/dist/handoff/delivery.js.map +1 -1
- package/dist/handoff/index.d.ts +1 -1
- package/dist/handoff/index.js +1 -1
- package/dist/handoff/index.js.map +1 -1
- package/dist/handoff/ledger.d.ts +9 -0
- package/dist/handoff/ledger.js +66 -0
- package/dist/handoff/ledger.js.map +1 -1
- package/dist/handoff/transaction.d.ts +21 -3
- package/dist/handoff/transaction.js +37 -5
- package/dist/handoff/transaction.js.map +1 -1
- package/dist/handoff/ucp-checkout/channel.js +15 -10
- package/dist/handoff/ucp-checkout/channel.js.map +1 -1
- package/dist/negotiation/jcs.js +11 -8
- package/dist/negotiation/jcs.js.map +1 -1
- package/dist/negotiation/lease/store.d.ts +25 -0
- package/dist/negotiation/lease/store.js +101 -0
- package/dist/negotiation/lease/store.js.map +1 -0
- package/dist/negotiation/recovery/recover.js +25 -1
- package/dist/negotiation/recovery/recover.js.map +1 -1
- package/dist/operator/runner.d.ts +11 -0
- package/dist/operator/runner.js +20 -1
- package/dist/operator/runner.js.map +1 -1
- package/dist/product-catalog.d.ts +1 -1
- package/dist/product-catalog.js +3 -3
- package/dist/product-catalog.js.map +1 -1
- package/dist/product-cli.d.ts +1 -1
- package/dist/product-cli.js +1 -1
- package/dist/product-publish.d.ts +5 -0
- package/dist/product-publish.js +112 -7
- package/dist/product-publish.js.map +1 -1
- package/dist/supervisor/stack-config.d.ts +6 -1
- package/dist/supervisor/stack-config.js +11 -3
- package/dist/supervisor/stack-config.js.map +1 -1
- package/dist/trust/identity/message-signature.js +17 -0
- package/dist/trust/identity/message-signature.js.map +1 -1
- package/dist/weixin/channel.d.ts +2 -0
- package/dist/weixin/channel.js +17 -3
- package/dist/weixin/channel.js.map +1 -1
- package/dist/weixin/cli-weixin.js +2 -0
- package/dist/weixin/cli-weixin.js.map +1 -1
- package/dist/weixin/ilink-client.d.ts +1 -1
- package/dist/weixin/ilink-client.js +26 -1
- package/dist/weixin/ilink-client.js.map +1 -1
- package/dist/weixin/login.d.ts +3 -0
- package/dist/weixin/login.js +1 -1
- package/dist/weixin/login.js.map +1 -1
- package/package.json +9 -2
- package/dist/commerce/erp-source.d.ts +0 -51
- package/dist/commerce/erp-source.js +0 -184
- package/dist/commerce/erp-source.js.map +0 -1
- package/dist/commerce/local-db-source.d.ts +0 -50
- package/dist/commerce/local-db-source.js +0 -162
- package/dist/commerce/local-db-source.js.map +0 -1
|
@@ -18,6 +18,8 @@ import { newAgreementId, newExchangeId, newMessageId, newOfferId, } from "../../
|
|
|
18
18
|
import { finalizeEnvelope } from "../../negotiation/domain/envelope.js";
|
|
19
19
|
import { contentDigest } from "../../negotiation/jcs.js";
|
|
20
20
|
import { evaluateConditionalOffer } from "../../negotiation/condition/evaluator.js";
|
|
21
|
+
import { toMinorUnits as losslessToMinorUnits } from "../../protocol/legacy-shopping-negotiation/money.js";
|
|
22
|
+
import { createNegotiationPhase, isTerminalPhase, transitionPhase, } from "../../negotiation/state/phase.js";
|
|
21
23
|
export const MERCHANT_CAPABILITY = "com.harrylabsj.kiwi.shopping.negotiation";
|
|
22
24
|
export const MERCHANT_SKU = "SKU-001";
|
|
23
25
|
export const MERCHANT_CURRENCY = "CNY";
|
|
@@ -55,7 +57,11 @@ function seedEnvelope(seed) {
|
|
|
55
57
|
...seed,
|
|
56
58
|
});
|
|
57
59
|
}
|
|
58
|
-
|
|
60
|
+
/** offer 有效期(审查 P3:此前 valid_until 硬编码 2099——§11 "Offer with
|
|
61
|
+
* valid_until MUST NOT be accepted after that timestamp" 永不生效,陈旧
|
|
62
|
+
* 报价可被无限期接受)。24h 窗口,accept 时校验(offer_expired 拒绝)。 */
|
|
63
|
+
export const OFFER_VALIDITY_MS = 24 * 60 * 60 * 1000;
|
|
64
|
+
function offerTerms(opts, now) {
|
|
59
65
|
return {
|
|
60
66
|
items: [
|
|
61
67
|
{
|
|
@@ -65,7 +71,7 @@ function offerTerms(opts) {
|
|
|
65
71
|
},
|
|
66
72
|
],
|
|
67
73
|
fulfillment_terms: { delivery_before: MERCHANT_DELIVERY_BEFORE },
|
|
68
|
-
valid_until:
|
|
74
|
+
valid_until: new Date(Date.parse(now) + OFFER_VALIDITY_MS).toISOString(),
|
|
69
75
|
};
|
|
70
76
|
}
|
|
71
77
|
function buildAgreement(input) {
|
|
@@ -95,6 +101,13 @@ const textReply = (text, taskState = "working") => ({
|
|
|
95
101
|
messageId: newMessageId(),
|
|
96
102
|
},
|
|
97
103
|
});
|
|
104
|
+
/** 商业拒绝(offer 未知/已关闭/terms_digest 不匹配/终态重开)。
|
|
105
|
+
* decline 消息由 pipeline 按 reason_code 自动构造。 */
|
|
106
|
+
const declineReply = (reasonCode = "state_conflict") => ({
|
|
107
|
+
kind: "declined",
|
|
108
|
+
reasonCode,
|
|
109
|
+
taskState: "completed",
|
|
110
|
+
});
|
|
98
111
|
const envelopeReply = (reply) => ({
|
|
99
112
|
kind: "accepted",
|
|
100
113
|
taskState: "working",
|
|
@@ -109,6 +122,92 @@ export function createMerchantHandler(options) {
|
|
|
109
122
|
const { ledger, now, sender, counterparty } = options;
|
|
110
123
|
const offerPriceMinor = options.offerPriceMinor ?? MERCHANT_OFFER_PRICE_MINOR;
|
|
111
124
|
const conditionalByNegotiation = new Map();
|
|
125
|
+
// 审查 P2-D:终态(AGREEMENT_REACHED / WITHDRAWN / DECLINED / CANCELLED)
|
|
126
|
+
// 不得以同一 negotiation_id 重开(§17.4/§21.2)——运行时此前无任何终态
|
|
127
|
+
// 守卫:连发两份 accept 可产出两份 agreement、withdraw 后可再次成交。
|
|
128
|
+
const closedNegotiations = new Set();
|
|
129
|
+
// 每 negotiation 的相位机状态(审查 BUG-10:完整状态含 active_offer_id /
|
|
130
|
+
// resume_phase——此前只记 OPEN→终态的最小轨迹,中间相位由
|
|
131
|
+
// conditionalByNegotiation 隐式表达,规范转换表不是接收消息的权威门)。
|
|
132
|
+
const phaseStateByNegotiation = new Map();
|
|
133
|
+
// 产生商业承诺的动作:终态后一律拒绝;text-only(clarification)放行。
|
|
134
|
+
const COMMERCIAL_ACTIONS = new Set([
|
|
135
|
+
"inquiry",
|
|
136
|
+
"rfq",
|
|
137
|
+
"offer",
|
|
138
|
+
"counter_offer",
|
|
139
|
+
"conditional_offer",
|
|
140
|
+
"accept_nonbinding",
|
|
141
|
+
]);
|
|
142
|
+
/** 审查 BUG-10:把入站 action 映射到相位机事件并推进;非法转换(不在
|
|
143
|
+
* 转换表内的组合)fail-closed 返回 false(调用方 decline state_conflict)。
|
|
144
|
+
* clarification 由商家的结构化 clarification_response 应答同轮恢复,
|
|
145
|
+
* 相位净不变。相位变化(含中间相位 OFFER_OPEN)落 state_transition 事件,
|
|
146
|
+
* 重启可完整重建。 */
|
|
147
|
+
const advancePhase = async (negotiationId, event) => {
|
|
148
|
+
const state = phaseStateByNegotiation.get(negotiationId) ?? createNegotiationPhase(negotiationId);
|
|
149
|
+
let next;
|
|
150
|
+
try {
|
|
151
|
+
next = transitionPhase(state, event);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
phaseStateByNegotiation.set(negotiationId, next);
|
|
157
|
+
if (next.phase !== state.phase) {
|
|
158
|
+
await appendPhaseTransition(negotiationId, next.phase, state.phase);
|
|
159
|
+
}
|
|
160
|
+
return true;
|
|
161
|
+
};
|
|
162
|
+
/** 入站 action → 相位机事件(inquiry/rfq 是起始动作,无转换)。 */
|
|
163
|
+
const actionToPhaseEvent = (envelope) => {
|
|
164
|
+
const offerId = String(envelope.payload?.offer_id ?? "");
|
|
165
|
+
switch (envelope.action) {
|
|
166
|
+
case "offer":
|
|
167
|
+
return { type: "offer", offer_id: offerId };
|
|
168
|
+
case "counter_offer":
|
|
169
|
+
return { type: "counter_offer", offer_id: offerId };
|
|
170
|
+
case "conditional_offer":
|
|
171
|
+
return { type: "conditional_offer", offer_id: offerId };
|
|
172
|
+
case "clarification":
|
|
173
|
+
return { type: "clarification" };
|
|
174
|
+
case "clarification_response":
|
|
175
|
+
// 对称路径(方案B):商家为提问方时,买家的应答经 restore 边弹回相位;
|
|
176
|
+
// 非 AWAITING_CLARIFICATION 时相位机 fail-closed(state_conflict)。
|
|
177
|
+
return { type: "clarification_response" };
|
|
178
|
+
case "accept_nonbinding":
|
|
179
|
+
return { type: "accept_nonbinding", offer_id: offerId };
|
|
180
|
+
case "withdraw":
|
|
181
|
+
return { type: "withdraw", scope: envelope.payload?.scope === "negotiation" ? "negotiation" : "offer" };
|
|
182
|
+
case "decline":
|
|
183
|
+
return { type: "decline", scope: envelope.payload?.scope === "negotiation" ? "negotiation" : "offer" };
|
|
184
|
+
case "cancel":
|
|
185
|
+
return { type: "cancel" };
|
|
186
|
+
default:
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
/** 落 state_transition 事件并推进本机相位(recovery.deriveLocalPhase 消费)。
|
|
191
|
+
* fromPhase 必须显式传入——调用方若已把 next 写入 map 再读,from 会变成
|
|
192
|
+
* 已推进的值(审查 BUG-10 实现注记)。 */
|
|
193
|
+
const appendPhaseTransition = async (negotiationId, toPhase, fromPhase) => {
|
|
194
|
+
const current = phaseStateByNegotiation.get(negotiationId);
|
|
195
|
+
const effectiveFrom = fromPhase ?? current?.phase ?? "OPEN";
|
|
196
|
+
phaseStateByNegotiation.set(negotiationId, { ...(current ?? createNegotiationPhase(negotiationId)), phase: toPhase });
|
|
197
|
+
await ledger.append({
|
|
198
|
+
event_kind: "state_transition",
|
|
199
|
+
negotiation_id: negotiationId,
|
|
200
|
+
state_transition: { from_phase: effectiveFrom, to_phase: toPhase },
|
|
201
|
+
identity: {
|
|
202
|
+
sender_identity: sender,
|
|
203
|
+
counterparty_identity: counterparty,
|
|
204
|
+
actor: "merchant",
|
|
205
|
+
},
|
|
206
|
+
capability: { capability: MERCHANT_CAPABILITY, protocol_version: "1.0" },
|
|
207
|
+
outcome: { kind: "ok" },
|
|
208
|
+
occurred_at: now(),
|
|
209
|
+
});
|
|
210
|
+
};
|
|
112
211
|
// 每 negotiation 已解析的真实商品价(sku → {priceMinor, currency}),带
|
|
113
212
|
// TTL(评审项 L3:此前永久累积、价格永不刷新——长驻 merchant 节点内存
|
|
114
213
|
// 单调增长且价目陈旧)。
|
|
@@ -125,8 +224,16 @@ export function createMerchantHandler(options) {
|
|
|
125
224
|
if (options.productSource !== undefined) {
|
|
126
225
|
try {
|
|
127
226
|
const product = await options.productSource.getProduct(sku);
|
|
227
|
+
// 审查 BUG-04:major→minor 必须 lossless——Math.round 会把 19.995
|
|
228
|
+
// 静默改写为 1999/2000 进入报价(P2-P 已修数据源路径,此处是生产
|
|
229
|
+
// merchant handler 的剩余舍入点)。无法精确表达 → fail-closed
|
|
230
|
+
// (抛错 → resolveProduct 回退演示价并注记)。
|
|
231
|
+
const converted = losslessToMinorUnits(product.price, 2);
|
|
232
|
+
if (!converted.lossless) {
|
|
233
|
+
throw new Error(`商品源价格 ${product.price} 超出 ${MERCHANT_CURRENCY} 两位小数精度(lossy)`);
|
|
234
|
+
}
|
|
128
235
|
const resolved = {
|
|
129
|
-
priceMinor:
|
|
236
|
+
priceMinor: converted.amount_minor,
|
|
130
237
|
currency: product.currency,
|
|
131
238
|
at: Date.parse(now()),
|
|
132
239
|
};
|
|
@@ -167,12 +274,72 @@ export function createMerchantHandler(options) {
|
|
|
167
274
|
occurred_at: reply.created_at,
|
|
168
275
|
});
|
|
169
276
|
};
|
|
277
|
+
// 审查 BUG-03:从持久 Ledger 恢复状态(必须在 return 之前执行)——重启后
|
|
278
|
+
// 终态不得重开、已发出的 conditional offer 必须继续可被接受(此前
|
|
279
|
+
// conditionalByNegotiation / closedNegotiations / phaseStateByNegotiation 纯内存,
|
|
280
|
+
// 重启全丢:已终态 negotiation 可重新打开、已发 offer 返回 offer_unknown)。
|
|
281
|
+
for (const negotiationId of ledger.listNegotiations()) {
|
|
282
|
+
const events = ledger.events(negotiationId);
|
|
283
|
+
let phase = "OPEN";
|
|
284
|
+
for (const event of events) {
|
|
285
|
+
if (event.state_transition?.to_phase !== undefined) {
|
|
286
|
+
phase = event.state_transition.to_phase;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// 审查 P1-07(跨重启残留,独立验收发现):终态相位同样必须恢复——相位
|
|
290
|
+
// 取自链上 state_transition 事实(非臆造)。否则 cancel/withdraw/decline
|
|
291
|
+
// 不在 COMMERCIAL_ACTIONS、重启后 advancePhase 从全新 OPEN 状态推进:
|
|
292
|
+
// 重放的 cancel 被当作新动作接受,并落 from_phase 伪造为 OPEN 的幻影
|
|
293
|
+
// 终态转换。恢复后由相位机 fail-closed(state_conflict),与进程内一致。
|
|
294
|
+
phaseStateByNegotiation.set(negotiationId, {
|
|
295
|
+
negotiation_id: negotiationId,
|
|
296
|
+
phase,
|
|
297
|
+
});
|
|
298
|
+
if (isTerminalPhase(phase)) {
|
|
299
|
+
closedNegotiations.add(negotiationId);
|
|
300
|
+
continue; // 终态后 conditional 已删除,不恢复
|
|
301
|
+
}
|
|
302
|
+
// 恢复最后发出的 conditional_offer(message_sent 事件携带完整 envelope)
|
|
303
|
+
let lastConditional;
|
|
304
|
+
for (const event of events) {
|
|
305
|
+
if (event.event_kind !== "message_sent")
|
|
306
|
+
continue;
|
|
307
|
+
const envelope = event.wire_payload;
|
|
308
|
+
if (envelope?.action !== "conditional_offer")
|
|
309
|
+
continue;
|
|
310
|
+
const payload = envelope.payload;
|
|
311
|
+
if (payload?.offer_id === undefined)
|
|
312
|
+
continue;
|
|
313
|
+
lastConditional = {
|
|
314
|
+
conditional: envelope.payload,
|
|
315
|
+
quantity: payload.base_terms?.items?.[0]?.quantity?.value ?? MERCHANT_QUANTITY,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
if (lastConditional !== undefined) {
|
|
319
|
+
conditionalByNegotiation.set(negotiationId, lastConditional);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
170
322
|
return {
|
|
171
323
|
name: "kiwi-agent-serve-merchant",
|
|
172
324
|
async handle(ctx) {
|
|
173
325
|
const envelope = ctx.envelope;
|
|
174
326
|
const negotiationId = envelope.negotiation_id;
|
|
175
327
|
const inReplyTo = envelope.message_id;
|
|
328
|
+
// 审查 P2-D:终态不得以同一 negotiation_id 重开(§17.4/§21.2)。
|
|
329
|
+
if (closedNegotiations.has(negotiationId) && COMMERCIAL_ACTIONS.has(envelope.action)) {
|
|
330
|
+
return declineReply("state_conflict");
|
|
331
|
+
}
|
|
332
|
+
// 审查 BUG-10:每个入站 action 经规范转换表推进相位——非法转换
|
|
333
|
+
// fail-closed(state_conflict)。accept 的推进在 §15 校验通过后
|
|
334
|
+
// (见 accept 分支:被拒的 accept 不得进入 AGREEMENT_REACHED)。
|
|
335
|
+
const phaseEvent = actionToPhaseEvent(envelope);
|
|
336
|
+
const isAcceptAction = envelope.action === "accept_nonbinding";
|
|
337
|
+
if (phaseEvent !== undefined && !isAcceptAction) {
|
|
338
|
+
const advanced = await advancePhase(negotiationId, phaseEvent);
|
|
339
|
+
if (!advanced) {
|
|
340
|
+
return declineReply("state_conflict");
|
|
341
|
+
}
|
|
342
|
+
}
|
|
176
343
|
switch (envelope.action) {
|
|
177
344
|
case "inquiry": {
|
|
178
345
|
// 入站消息由 A2A pipeline 统一落 message_received(§22);这里不再
|
|
@@ -194,10 +361,16 @@ export function createMerchantHandler(options) {
|
|
|
194
361
|
payload: {
|
|
195
362
|
type: "offer",
|
|
196
363
|
offer_id: newOfferId(),
|
|
197
|
-
terms: offerTerms({ sku, priceMinor, quantity, currency }),
|
|
364
|
+
terms: offerTerms({ sku, priceMinor, quantity, currency }, now()),
|
|
198
365
|
},
|
|
199
366
|
...(note !== undefined ? { public_message: note } : {}),
|
|
200
367
|
});
|
|
368
|
+
// 审查 BUG-10:merchant 侧相位由自己的出站动作推进——rfq 的 offer
|
|
369
|
+
// 回复是 OPEN→OFFER_OPEN 的边(入站侧 rfq 是起始动作无事件)。
|
|
370
|
+
await advancePhase(negotiationId, {
|
|
371
|
+
type: "offer",
|
|
372
|
+
offer_id: String(reply.payload.offer_id ?? ""),
|
|
373
|
+
});
|
|
201
374
|
await appendSent(reply);
|
|
202
375
|
return envelopeReply(reply);
|
|
203
376
|
}
|
|
@@ -217,10 +390,14 @@ export function createMerchantHandler(options) {
|
|
|
217
390
|
type: "counter_offer",
|
|
218
391
|
offer_id: newOfferId(),
|
|
219
392
|
responding_to_offer_id: buyerOffer.offer_id ?? "",
|
|
220
|
-
proposed_terms: offerTerms({ sku, priceMinor, quantity, currency }),
|
|
393
|
+
proposed_terms: offerTerms({ sku, priceMinor, quantity, currency }, now()),
|
|
221
394
|
},
|
|
222
395
|
...(note !== undefined ? { public_message: note } : {}),
|
|
223
396
|
});
|
|
397
|
+
await advancePhase(negotiationId, {
|
|
398
|
+
type: "counter_offer",
|
|
399
|
+
offer_id: String(reply.payload.offer_id ?? ""),
|
|
400
|
+
});
|
|
224
401
|
await appendSent(reply);
|
|
225
402
|
return envelopeReply(reply);
|
|
226
403
|
}
|
|
@@ -242,11 +419,11 @@ export function createMerchantHandler(options) {
|
|
|
242
419
|
type: "conditional_offer",
|
|
243
420
|
offer_id: newOfferId(),
|
|
244
421
|
responding_to_offer_id: counter.offer_id,
|
|
245
|
-
base_terms: offerTerms({ sku, priceMinor, quantity, currency }),
|
|
422
|
+
base_terms: offerTerms({ sku, priceMinor, quantity, currency }, now()),
|
|
246
423
|
conditions: [
|
|
247
424
|
{
|
|
248
425
|
when: { all: [{ field: "aggregate.total_quantity", op: "gte", value: 100 }] },
|
|
249
|
-
then_terms: offerTerms({ sku, priceMinor: dealPriceMinor, quantity, currency }),
|
|
426
|
+
then_terms: offerTerms({ sku, priceMinor: dealPriceMinor, quantity, currency }, now()),
|
|
250
427
|
},
|
|
251
428
|
],
|
|
252
429
|
},
|
|
@@ -256,35 +433,97 @@ export function createMerchantHandler(options) {
|
|
|
256
433
|
conditional: reply.payload,
|
|
257
434
|
quantity,
|
|
258
435
|
});
|
|
436
|
+
await advancePhase(negotiationId, {
|
|
437
|
+
type: "conditional_offer",
|
|
438
|
+
offer_id: String(reply.payload.offer_id ?? ""),
|
|
439
|
+
});
|
|
259
440
|
await appendSent(reply);
|
|
260
441
|
return envelopeReply(reply);
|
|
261
442
|
}
|
|
262
443
|
case "clarification": {
|
|
263
|
-
const
|
|
264
|
-
|
|
444
|
+
const questions = envelope.payload.questions ?? [];
|
|
445
|
+
// 方案B(协议完整):商家的应答是结构化 clarification_response
|
|
446
|
+
// envelope(§8.2),in_reply_to 引用被回答的澄清消息(§8.5/§14
|
|
447
|
+
// 强制,finalizeEnvelope 校验)。payload 形状规范未冻结(§14),
|
|
448
|
+
// 携带 answers 便于对端结构化消费;人类可读文本走 public_message。
|
|
449
|
+
const reply = seedEnvelope({
|
|
450
|
+
negotiation_id: negotiationId,
|
|
451
|
+
in_reply_to: inReplyTo,
|
|
452
|
+
actor: "merchant",
|
|
453
|
+
action: "clarification_response",
|
|
454
|
+
created_at: now(),
|
|
455
|
+
payload: {
|
|
456
|
+
type: "clarification_response",
|
|
457
|
+
answers: questions.map((q) => ({
|
|
458
|
+
field: q.field ?? "…",
|
|
459
|
+
answer: `delivery before ${MERCHANT_DELIVERY_BEFORE}, payment terms negotiable (nonbinding)`,
|
|
460
|
+
})),
|
|
461
|
+
},
|
|
462
|
+
public_message: `delivery before ${MERCHANT_DELIVERY_BEFORE}, payment terms negotiable (nonbinding).`,
|
|
463
|
+
});
|
|
464
|
+
// 出站应答即恢复(restore 边,§21.2):顶层推进已把相位挂到
|
|
465
|
+
// AWAITING_CLARIFICATION,clarification_response 同轮弹回
|
|
466
|
+
// resume_phase(OFFER_OPEN/OPEN),否则「问一句再 accept」的
|
|
467
|
+
// happy path 会被相位机永久 state_conflict。恢复失败 fail-closed。
|
|
468
|
+
const restored = await advancePhase(negotiationId, { type: "clarification_response" });
|
|
469
|
+
if (!restored) {
|
|
470
|
+
return declineReply("state_conflict");
|
|
471
|
+
}
|
|
472
|
+
await appendSent(reply);
|
|
473
|
+
return envelopeReply(reply);
|
|
265
474
|
}
|
|
266
475
|
case "accept_nonbinding": {
|
|
267
476
|
const stored = conditionalByNegotiation.get(negotiationId);
|
|
268
|
-
const
|
|
477
|
+
const acceptPayload = envelope.payload;
|
|
478
|
+
const acceptedOfferId = acceptPayload.offer_id ?? "";
|
|
269
479
|
// 成交价必须来自本磋商已发出的 conditional_offer:无前置 conditional
|
|
270
|
-
// 或 accept 的 offer_id 与所存 conditional 不匹配 →
|
|
271
|
-
//
|
|
272
|
-
//
|
|
480
|
+
// 或 accept 的 offer_id 与所存 conditional 不匹配 → 拒绝成交。此前
|
|
481
|
+
// 无前置时回退基础价照样产出 agreement,从未发出的 offer_id 也照样
|
|
482
|
+
// 成交(agreement 指向不存在的 offer,审计溯源断裂)。
|
|
273
483
|
const storedOfferId = stored?.conditional?.offer_id ?? "";
|
|
274
484
|
const acceptedConditional = stored !== undefined && acceptedOfferId !== "" && acceptedOfferId === storedOfferId
|
|
275
485
|
? stored
|
|
276
486
|
: undefined;
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
487
|
+
if (acceptedConditional === undefined) {
|
|
488
|
+
return declineReply("offer_unknown");
|
|
489
|
+
}
|
|
490
|
+
// KNP §15(审查 P2-C,实验复现):terms_digest 必须是 agreed terms
|
|
491
|
+
// 的 canonical digest——错误 digest 此前也产出 agreement。任一检查
|
|
492
|
+
// 失败都不得创建 agreement。
|
|
493
|
+
const agreedTerms = evaluateConditionalOffer(acceptedConditional.conditional, {
|
|
494
|
+
"aggregate.total_quantity": acceptedConditional.quantity,
|
|
495
|
+
});
|
|
496
|
+
// 审查 P3:§11 offer 过期校验——valid_until 已过 → 拒绝(此前
|
|
497
|
+
// valid_until 硬编码 2099 永不生效,陈旧报价可被无限期接受)。
|
|
498
|
+
const validUntil = agreedTerms?.valid_until;
|
|
499
|
+
if (validUntil !== undefined) {
|
|
500
|
+
const validUntilMs = Date.parse(validUntil);
|
|
501
|
+
const nowMs = Date.parse(now());
|
|
502
|
+
if (!Number.isFinite(validUntilMs) || !Number.isFinite(nowMs) || validUntilMs < nowMs) {
|
|
503
|
+
return declineReply("offer_expired");
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
const presentedDigest = acceptPayload.terms_digest ?? "";
|
|
507
|
+
if (presentedDigest === "" || presentedDigest !== contentDigest(agreedTerms)) {
|
|
508
|
+
return declineReply("terms_digest_mismatch");
|
|
509
|
+
}
|
|
510
|
+
// 审查 P1-C:相位机是权威守卫——§15 校验通过后、构建协议之前先
|
|
511
|
+
// 推进相位并检查返回值(BUG-10 语义不变:被拒的 accept 不得进入
|
|
512
|
+
// AGREEMENT_REACHED)。推进失败(如 AWAITING_CLARIFICATION 下直接
|
|
513
|
+
// accept)fail-closed:不返回协议、不进 closedNegotiations、不删
|
|
514
|
+
// conditional,无任何终态副作用——此前忽略返回值,协议照发但相位
|
|
515
|
+
// 机拒绝推进;进程内 closedNegotiations 挡住二次 accept,重启恢复
|
|
516
|
+
// 后相位重建为 AWAITING_CLARIFICATION,二次 accept 产出重复协议。
|
|
517
|
+
const advanced = await advancePhase(negotiationId, {
|
|
518
|
+
type: "accept_nonbinding",
|
|
519
|
+
offer_id: acceptedOfferId,
|
|
520
|
+
});
|
|
521
|
+
if (!advanced) {
|
|
522
|
+
return declineReply("state_conflict");
|
|
523
|
+
}
|
|
285
524
|
const agreement = buildAgreement({
|
|
286
525
|
negotiation_id: negotiationId,
|
|
287
|
-
accepted_offer_id:
|
|
526
|
+
accepted_offer_id: acceptedOfferId,
|
|
288
527
|
agreed_terms: agreedTerms,
|
|
289
528
|
created_at: now(),
|
|
290
529
|
});
|
|
@@ -294,18 +533,35 @@ export function createMerchantHandler(options) {
|
|
|
294
533
|
parts: [{ kind: "text", text: "Agreement reached (nonbinding)." }],
|
|
295
534
|
messageId: newMessageId(),
|
|
296
535
|
};
|
|
297
|
-
// 协商终态:conditional 不再需要(评审项 L3
|
|
536
|
+
// 协商终态:conditional 不再需要(评审项 L3:此前永久累积)。
|
|
298
537
|
conditionalByNegotiation.delete(negotiationId);
|
|
538
|
+
closedNegotiations.add(negotiationId);
|
|
299
539
|
return { kind: "accepted", taskState: "completed", artifactParts: [artifactPart], message };
|
|
300
540
|
}
|
|
301
|
-
case "withdraw":
|
|
541
|
+
case "withdraw": {
|
|
542
|
+
const scope = envelope.payload.scope ?? "offer";
|
|
302
543
|
conditionalByNegotiation.delete(negotiationId);
|
|
303
|
-
|
|
304
|
-
|
|
544
|
+
// scope=offer 只关 offer 不终局(相位机 OFFER_OPEN→OPEN);scope=
|
|
545
|
+
// negotiation 才进入 WITHDRAWN 终态。
|
|
546
|
+
if (scope !== "offer") {
|
|
547
|
+
closedNegotiations.add(negotiationId);
|
|
548
|
+
await advancePhase(negotiationId, { type: "withdraw", scope: "negotiation" });
|
|
549
|
+
}
|
|
550
|
+
return textReply(`Withdrawn (scope=${scope}).`);
|
|
551
|
+
}
|
|
552
|
+
case "decline": {
|
|
553
|
+
const scope = envelope.payload.scope ?? "offer";
|
|
305
554
|
conditionalByNegotiation.delete(negotiationId);
|
|
306
|
-
|
|
555
|
+
if (scope !== "offer") {
|
|
556
|
+
closedNegotiations.add(negotiationId);
|
|
557
|
+
await advancePhase(negotiationId, { type: "decline", scope: "negotiation" });
|
|
558
|
+
}
|
|
559
|
+
return textReply(`Declined (scope=${scope}).`);
|
|
560
|
+
}
|
|
307
561
|
case "cancel":
|
|
308
562
|
conditionalByNegotiation.delete(negotiationId);
|
|
563
|
+
closedNegotiations.add(negotiationId);
|
|
564
|
+
await advancePhase(negotiationId, { type: "cancel" });
|
|
309
565
|
return textReply("Negotiation cancelled.");
|
|
310
566
|
default:
|
|
311
567
|
return { kind: "declined", reasonCode: "unsupported_action" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merchant-handler.js","sourceRoot":"","sources":["../../../src/a2a/server/merchant-handler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"merchant-handler.js","sourceRoot":"","sources":["../../../src/a2a/server/merchant-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,23 @@ export declare class InboundPipeline {
|
|
|
62
62
|
private readonly throttle;
|
|
63
63
|
constructor(options: InboundPipelineOptions);
|
|
64
64
|
private toThrottleRequest;
|
|
65
|
+
/** 从已落账 message_received 事件还原最小 A2ATask(P1-05 恢复路径)。
|
|
66
|
+
* 事件携带 remote_task_id + outcome.task_state(§24.5);消息正文不落账,
|
|
67
|
+
* 恢复的任务不含 message(与幂等重放路径的完整 task 不同,可接受)。 */
|
|
68
|
+
private taskFromLedgerEvent;
|
|
69
|
+
/**
|
|
70
|
+
* 审查 P1-05:以 Ledger 为持久事实的幂等恢复——消息已落账(message_received)
|
|
71
|
+
* 但幂等未 commit(commit 失败 / append 与 commit 之间崩溃的窗口)时,重试
|
|
72
|
+
* 必须**不重复执行 handler**(至多一次)。三个调用点:
|
|
73
|
+
* - 幂等 check 返回 "new" 但 Ledger 已有同 message_id → 恢复(不跑 handler);
|
|
74
|
+
* - ledger.append 成功后 commit 失败 → 从刚落账的事件恢复并返回稳定响应;
|
|
75
|
+
* - ledger.append 抛 ledger_duplicate_content(P2-E,首次落账成功)→ 恢复。
|
|
76
|
+
*
|
|
77
|
+
* digest 必须与链上证据一致:同 message_id 异 digest = 恶意重放 → conflict
|
|
78
|
+
* fail-closed。补 commit 是 best-effort(失败不阻断恢复响应,ledger 仍是持久
|
|
79
|
+
* 事实,下一次重试仍走本条恢复路径)。
|
|
80
|
+
*/
|
|
81
|
+
private recoverFromLedgerEvidence;
|
|
65
82
|
/** message/send 入站处理(限流 → 校验 → 幂等 → handler → Ledger → 幂等 commit)。 */
|
|
66
83
|
sendMessage(input: SendMessageInput, caller: SendMessageCaller): Promise<SendMessageResult>;
|
|
67
84
|
/** tasks/get:内存优先,miss 时回退 Ledger 视图(§23 恢复第 4 步)。 */
|
|
@@ -158,6 +158,63 @@ export class InboundPipeline {
|
|
|
158
158
|
fingerprintChanged: caller.fingerprintChanged,
|
|
159
159
|
};
|
|
160
160
|
}
|
|
161
|
+
/** 从已落账 message_received 事件还原最小 A2ATask(P1-05 恢复路径)。
|
|
162
|
+
* 事件携带 remote_task_id + outcome.task_state(§24.5);消息正文不落账,
|
|
163
|
+
* 恢复的任务不含 message(与幂等重放路径的完整 task 不同,可接受)。 */
|
|
164
|
+
taskFromLedgerEvent(event) {
|
|
165
|
+
const taskId = event.remote_task_id;
|
|
166
|
+
if (typeof taskId !== "string" || taskId.length === 0)
|
|
167
|
+
return null;
|
|
168
|
+
const result = event.outcome.kind === "ok" ? event.outcome.result : undefined;
|
|
169
|
+
const state = result === undefined ? undefined : result["task_state"];
|
|
170
|
+
if (!isKnownTaskState(state))
|
|
171
|
+
return null;
|
|
172
|
+
return { id: taskId, status: { state } };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 审查 P1-05:以 Ledger 为持久事实的幂等恢复——消息已落账(message_received)
|
|
176
|
+
* 但幂等未 commit(commit 失败 / append 与 commit 之间崩溃的窗口)时,重试
|
|
177
|
+
* 必须**不重复执行 handler**(至多一次)。三个调用点:
|
|
178
|
+
* - 幂等 check 返回 "new" 但 Ledger 已有同 message_id → 恢复(不跑 handler);
|
|
179
|
+
* - ledger.append 成功后 commit 失败 → 从刚落账的事件恢复并返回稳定响应;
|
|
180
|
+
* - ledger.append 抛 ledger_duplicate_content(P2-E,首次落账成功)→ 恢复。
|
|
181
|
+
*
|
|
182
|
+
* digest 必须与链上证据一致:同 message_id 异 digest = 恶意重放 → conflict
|
|
183
|
+
* fail-closed。补 commit 是 best-effort(失败不阻断恢复响应,ledger 仍是持久
|
|
184
|
+
* 事实,下一次重试仍走本条恢复路径)。
|
|
185
|
+
*/
|
|
186
|
+
recoverFromLedgerEvidence(senderIdentity, envelope, prior, taskOverride) {
|
|
187
|
+
// 防御性 sender 一致性(fail-closed):链上证据必须归属当前 sender——幂等
|
|
188
|
+
// 主键是 (sender_identity, message_id),他人消息的证据不得被当作自己的。
|
|
189
|
+
// 调用点已按 sender 过滤;此处兜底。
|
|
190
|
+
if (prior.event.identity.sender_identity !== senderIdentity) {
|
|
191
|
+
throw internalServerError();
|
|
192
|
+
}
|
|
193
|
+
if (prior.event.wire_digest !== envelope.digest) {
|
|
194
|
+
throw protocolError("idempotency_conflict", `message_id ${envelope.message_id} already processed with a different digest (ledger evidence, §20.3)`);
|
|
195
|
+
}
|
|
196
|
+
// taskOverride:commit 失败恢复路径传入本回合完整 task(含 message);
|
|
197
|
+
// ledger 守卫/duplicate 恢复路径无内存 task,按事件 remote_task_id 还原最小 task。
|
|
198
|
+
const task = taskOverride ?? this.taskFromLedgerEvent(prior.event);
|
|
199
|
+
if (task === null) {
|
|
200
|
+
throw internalServerError();
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
this.idempotency.commit({
|
|
204
|
+
sender_identity: senderIdentity,
|
|
205
|
+
message_id: envelope.message_id,
|
|
206
|
+
digest: envelope.digest,
|
|
207
|
+
negotiation_id: envelope.negotiation_id,
|
|
208
|
+
outcome: { kind: "ok", result: { task } },
|
|
209
|
+
ledger_event_id: prior.event.event_id,
|
|
210
|
+
ledger_event_digest: prior.event.event_digest,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (commitErr) {
|
|
214
|
+
this.logError("idempotency commit failed during ledger recovery", commitErr);
|
|
215
|
+
}
|
|
216
|
+
return { task, ledgerEvent: prior.event };
|
|
217
|
+
}
|
|
161
218
|
/** message/send 入站处理(限流 → 校验 → 幂等 → handler → Ledger → 幂等 commit)。 */
|
|
162
219
|
async sendMessage(input, caller) {
|
|
163
220
|
// 惰性清理(评审项 L2):negotiation 幂等文件的 sweep 此前无调用方,
|
|
@@ -215,6 +272,15 @@ export class InboundPipeline {
|
|
|
215
272
|
if (decision.status === "conflict") {
|
|
216
273
|
throw protocolError("idempotency_conflict", `message_id ${envelope.message_id} already processed with a different digest (replay conflict, §20.3)`);
|
|
217
274
|
}
|
|
275
|
+
// 审查 P1-05:幂等索引无记录但 Ledger 已落账同 (sender, message_id)(commit
|
|
276
|
+
// 失败 / append 与 commit 之间崩溃的窗口)→ 以 Ledger 为持久事实恢复,
|
|
277
|
+
// handler 不重复执行(至多一次)。**按 sender 过滤**:幂等主键是
|
|
278
|
+
// (sender_identity, message_id)(§20),不同 sender 用同 message_id 是
|
|
279
|
+
// 独立消息(sender 隔离),不得被他人消息的证据短路。
|
|
280
|
+
const priorOnLedger = this.ledger.findByMessageId(envelope.message_id);
|
|
281
|
+
if (priorOnLedger !== null && priorOnLedger.event.identity.sender_identity === senderIdentity) {
|
|
282
|
+
return this.recoverFromLedgerEvidence(senderIdentity, envelope, priorOnLedger);
|
|
283
|
+
}
|
|
218
284
|
// 6. 路由给 NegotiationHandler。
|
|
219
285
|
const taskId = newTaskId();
|
|
220
286
|
const handlerCtx = {
|
|
@@ -275,6 +341,22 @@ export class InboundPipeline {
|
|
|
275
341
|
// 内容策略违规:envelope 携带 ledger 不得记录的保留键(§28/§36-5)。
|
|
276
342
|
throw schemaInvalid("envelope contains reserved content that must not be recorded");
|
|
277
343
|
}
|
|
344
|
+
if (err instanceof LedgerError && err.code === "ledger_duplicate_content") {
|
|
345
|
+
// 审查 P2-E + P1-05:append 成功、幂等 commit 前崩溃的窗口。重试时
|
|
346
|
+
// 消息内容已落链(首次运行的处理结果),但幂等未 commit——此前走
|
|
347
|
+
// internalServerError 且永不 commit,消息永久卡死;且恢复路径用
|
|
348
|
+
// 本轮新 taskId 查 remote_task_id 恒 miss(事件携带首次的 taskId)。
|
|
349
|
+
// 统一走 ledger 恢复(digest 校验 + 按事件 remote_task_id 还原任务 +
|
|
350
|
+
// 补 commit):客户端拿到稳定响应,后续重试直接命中幂等短接或 ledger
|
|
351
|
+
// 守卫,handler 至多一次。真实恶意重放(同 message_id 异 digest)在
|
|
352
|
+
// digest 校验层 fail-closed(idempotency_conflict)。
|
|
353
|
+
const prior = this.ledger.findByMessageId(envelope.message_id);
|
|
354
|
+
if (prior === null) {
|
|
355
|
+
this.logError("ledger duplicate but prior event unrecoverable", err);
|
|
356
|
+
throw internalServerError();
|
|
357
|
+
}
|
|
358
|
+
return this.recoverFromLedgerEvidence(senderIdentity, envelope, prior);
|
|
359
|
+
}
|
|
278
360
|
this.logError("ledger append failed", err);
|
|
279
361
|
throw internalServerError();
|
|
280
362
|
}
|
|
@@ -294,7 +376,13 @@ export class InboundPipeline {
|
|
|
294
376
|
if (err instanceof IdempotencyConflictError) {
|
|
295
377
|
throw protocolError("idempotency_conflict", `message_id ${envelope.message_id} already processed with a different digest`);
|
|
296
378
|
}
|
|
297
|
-
|
|
379
|
+
// 审查 P1-05:commit 失败(非冲突,磁盘/瞬时)——message_received 已
|
|
380
|
+
// 落账。从 ledger 恢复并补 commit(best-effort),返回稳定响应而不是
|
|
381
|
+
// 抛错:否则客户端重试时幂等索引仍无记录 → handler 重复执行(双份
|
|
382
|
+
// agreement)。taskOverride 传本回合完整 task(含 message)。ledger
|
|
383
|
+
// 守卫兜底:即使客户端重试,也命中恢复路径。
|
|
384
|
+
this.logError("idempotency commit failed; recovering from ledger evidence", err);
|
|
385
|
+
return this.recoverFromLedgerEvidence(senderIdentity, envelope, { event: ledgerEvent }, task);
|
|
298
386
|
}
|
|
299
387
|
return { task, ledgerEvent };
|
|
300
388
|
});
|