@atel-ai/runtime-core 0.1.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/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +65 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +49 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-cli.d.ts +3 -0
- package/dist/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/adapters/gemini-cli.js +43 -0
- package/dist/adapters/gemini-cli.js.map +1 -0
- package/dist/adapters/hermes.d.ts +3 -0
- package/dist/adapters/hermes.d.ts.map +1 -0
- package/dist/adapters/hermes.js +58 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +13 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +36 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/qwen-agent.d.ts +3 -0
- package/dist/adapters/qwen-agent.d.ts.map +1 -0
- package/dist/adapters/qwen-agent.js +128 -0
- package/dist/adapters/qwen-agent.js.map +1 -0
- package/dist/adapters/registry.d.ts +20 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +42 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +46 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/util.d.ts +10 -0
- package/dist/adapters/util.d.ts.map +1 -0
- package/dist/adapters/util.js +86 -0
- package/dist/adapters/util.js.map +1 -0
- package/dist/auth.d.ts +42 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +91 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +55 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +139 -0
- package/dist/client.js.map +1 -0
- package/dist/companion.d.ts +45 -0
- package/dist/companion.d.ts.map +1 -0
- package/dist/companion.js +224 -0
- package/dist/companion.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/deadletter.d.ts +31 -0
- package/dist/deadletter.d.ts.map +1 -0
- package/dist/deadletter.js +67 -0
- package/dist/deadletter.js.map +1 -0
- package/dist/envelope.d.ts +21 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +20 -0
- package/dist/envelope.js.map +1 -0
- package/dist/events/channel-relay.d.ts +35 -0
- package/dist/events/channel-relay.d.ts.map +1 -0
- package/dist/events/channel-relay.js +97 -0
- package/dist/events/channel-relay.js.map +1 -0
- package/dist/events/channel-spine.d.ts +41 -0
- package/dist/events/channel-spine.d.ts.map +1 -0
- package/dist/events/channel-spine.js +139 -0
- package/dist/events/channel-spine.js.map +1 -0
- package/dist/events/dedup.d.ts +25 -0
- package/dist/events/dedup.d.ts.map +1 -0
- package/dist/events/dedup.js +56 -0
- package/dist/events/dedup.js.map +1 -0
- package/dist/events/mapping.d.ts +37 -0
- package/dist/events/mapping.d.ts.map +1 -0
- package/dist/events/mapping.js +212 -0
- package/dist/events/mapping.js.map +1 -0
- package/dist/events/roles.d.ts +21 -0
- package/dist/events/roles.d.ts.map +1 -0
- package/dist/events/roles.js +80 -0
- package/dist/events/roles.js.map +1 -0
- package/dist/events/types.d.ts +51 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +96 -0
- package/dist/events/types.js.map +1 -0
- package/dist/identity.d.ts +48 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +123 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/queue.d.ts +12 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +25 -0
- package/dist/queue.js.map +1 -0
- package/dist/tracker.d.ts +27 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +80 -0
- package/dist/tracker.js.map +1 -0
- package/dist/wakers/cli.d.ts +36 -0
- package/dist/wakers/cli.d.ts.map +1 -0
- package/dist/wakers/cli.js +116 -0
- package/dist/wakers/cli.js.map +1 -0
- package/dist/wakers/daemon.d.ts +26 -0
- package/dist/wakers/daemon.d.ts.map +1 -0
- package/dist/wakers/daemon.js +51 -0
- package/dist/wakers/daemon.js.map +1 -0
- package/dist/wakers/embedded.d.ts +23 -0
- package/dist/wakers/embedded.d.ts.map +1 -0
- package/dist/wakers/embedded.js +26 -0
- package/dist/wakers/embedded.js.map +1 -0
- package/dist/wakers/types.d.ts +29 -0
- package/dist/wakers/types.d.ts.map +1 -0
- package/dist/wakers/types.js +2 -0
- package/dist/wakers/types.js.map +1 -0
- package/package.json +44 -0
- package/src/skill/SKILL.md +80 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通道甲 —— Spine 事件订阅(/events/subscribe + /events/stream SSE)。
|
|
3
|
+
*
|
|
4
|
+
* 走 ATEL 公开面、点号领域事件,低延迟 push(START-HERE 架构正解)。
|
|
5
|
+
* 注意 5.19 prod 总结:outbox→fanout→SSE/webhook 管道已就位(metric fanout_ok),
|
|
6
|
+
* 但"投递到真实订阅者端到端"我们是第一个验证者 —— 故本通道做成可降级:
|
|
7
|
+
* 订阅成功 + SSE 连上 → 用之;SSE 401/501/断流 → 退避重连,失败则
|
|
8
|
+
* 完全依赖通道乙(relay 轮询)兜底。两通道同喂 dedup,重复无害。
|
|
9
|
+
*
|
|
10
|
+
* webhook 模式:由安装器把 callbackUrl 暴露成 HTTP,事件经 ingestWebhook 进同一 sink。
|
|
11
|
+
*/
|
|
12
|
+
import type { Identity } from '../identity.js';
|
|
13
|
+
import type { EventSink } from './channel-relay.js';
|
|
14
|
+
export interface SpineChannelOpts {
|
|
15
|
+
identity: Identity;
|
|
16
|
+
spineBaseUrl: string;
|
|
17
|
+
sink: EventSink;
|
|
18
|
+
deliveryMode: 'sse' | 'webhook';
|
|
19
|
+
callbackUrl?: string;
|
|
20
|
+
/** 可选:JWT 提供者(保留;SSE 连接用的是 stream-token,不是 JWT) */
|
|
21
|
+
tokenProvider?: () => Promise<string>;
|
|
22
|
+
log?: (msg: string) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare class SpineChannel {
|
|
25
|
+
private readonly opts;
|
|
26
|
+
private stopped;
|
|
27
|
+
private controller?;
|
|
28
|
+
private backoffMs;
|
|
29
|
+
constructor(opts: SpineChannelOpts);
|
|
30
|
+
start(): Promise<void>;
|
|
31
|
+
stop(): void;
|
|
32
|
+
/** webhook 模式:外部 HTTP 服务收到回调后,把原始事件喂进来。 */
|
|
33
|
+
ingestWebhook(raw: unknown): Promise<void>;
|
|
34
|
+
private runSseLoop;
|
|
35
|
+
private connectSse;
|
|
36
|
+
private handleSseChunk;
|
|
37
|
+
/** 把 Spine fanout 的事件对象归一化(点号 type + payload)。 */
|
|
38
|
+
private normalizeStreamEvent;
|
|
39
|
+
private log;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=channel-spine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-spine.d.ts","sourceRoot":"","sources":["../../src/events/channel-spine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,KAAK,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,SAAS,CAAQ;gBAEI,IAAI,EAAE,gBAAgB;IAE7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,IAAI,IAAI,IAAI;IAKZ,2CAA2C;IACrC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlC,UAAU;YAgBV,UAAU;YAgCV,cAAc;IAkB5B,kDAAkD;IAClD,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,GAAG;CAGZ"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { spineSubscribe, spineStreamToken } from '../client.js';
|
|
2
|
+
import { SPINE_TOPICS, normalizeEventType } from './types.js';
|
|
3
|
+
import { computeDedupeKey } from './dedup.js';
|
|
4
|
+
export class SpineChannel {
|
|
5
|
+
opts;
|
|
6
|
+
stopped = false;
|
|
7
|
+
controller;
|
|
8
|
+
backoffMs = 2000;
|
|
9
|
+
constructor(opts) {
|
|
10
|
+
this.opts = opts;
|
|
11
|
+
}
|
|
12
|
+
async start() {
|
|
13
|
+
this.stopped = false;
|
|
14
|
+
try {
|
|
15
|
+
const r = await spineSubscribe(this.opts.spineBaseUrl, this.opts.identity, SPINE_TOPICS, this.opts.deliveryMode, this.opts.callbackUrl);
|
|
16
|
+
if (r.ok || r.status === 409) {
|
|
17
|
+
this.log(`subscribed (${this.opts.deliveryMode}) topics=${SPINE_TOPICS.length}`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
this.log(`subscribe HTTP ${r.status}: ${r.body.slice(0, 160)} — relay 兜底继续`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
this.log(`subscribe failed: ${e.message} — relay 兜底继续`);
|
|
25
|
+
}
|
|
26
|
+
if (this.opts.deliveryMode === 'sse') {
|
|
27
|
+
void this.runSseLoop(); // 后台常驻,失败自重连
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
stop() {
|
|
31
|
+
this.stopped = true;
|
|
32
|
+
this.controller?.abort();
|
|
33
|
+
}
|
|
34
|
+
/** webhook 模式:外部 HTTP 服务收到回调后,把原始事件喂进来。 */
|
|
35
|
+
async ingestWebhook(raw) {
|
|
36
|
+
const ev = this.normalizeStreamEvent(raw);
|
|
37
|
+
if (ev)
|
|
38
|
+
await this.opts.sink(ev);
|
|
39
|
+
}
|
|
40
|
+
async runSseLoop() {
|
|
41
|
+
while (!this.stopped) {
|
|
42
|
+
try {
|
|
43
|
+
await this.connectSse();
|
|
44
|
+
this.backoffMs = 2000; // 正常结束(服务端关流)→ 重置退避
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
const msg = e.message;
|
|
48
|
+
// 401/501 表示 SSE 这条暂不可用,拉长退避、降噪,继续靠 relay
|
|
49
|
+
const cold = /HTTP (401|403|404|501|502)/.test(msg);
|
|
50
|
+
this.log(`SSE ${cold ? 'unavailable' : 'error'}: ${msg}; reconnect in ${this.backoffMs}ms`);
|
|
51
|
+
await sleep(this.backoffMs);
|
|
52
|
+
this.backoffMs = Math.min(this.backoffMs * 2, cold ? 5 * 60_000 : 60_000);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async connectSse() {
|
|
57
|
+
// SSE 用一次性 stream-token(DID-Sig 换取,30s TTL,连上即消费),不是 Bearer JWT。
|
|
58
|
+
const { token } = await spineStreamToken(this.opts.spineBaseUrl, this.opts.identity);
|
|
59
|
+
this.controller = new AbortController();
|
|
60
|
+
const base = this.opts.spineBaseUrl.replace(/\/+$/, '');
|
|
61
|
+
const url = `${base}/events/stream?token=${encodeURIComponent(token)}`;
|
|
62
|
+
const res = await fetch(url, {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers: { Accept: 'text/event-stream' },
|
|
65
|
+
signal: this.controller.signal,
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok || !res.body) {
|
|
68
|
+
throw new Error(`HTTP ${res.status}`);
|
|
69
|
+
}
|
|
70
|
+
this.log('SSE connected');
|
|
71
|
+
const reader = res.body.getReader();
|
|
72
|
+
const decoder = new TextDecoder();
|
|
73
|
+
let buf = '';
|
|
74
|
+
while (!this.stopped) {
|
|
75
|
+
const { value, done } = await reader.read();
|
|
76
|
+
if (done)
|
|
77
|
+
break;
|
|
78
|
+
buf += decoder.decode(value, { stream: true });
|
|
79
|
+
// SSE 事件以空行分隔
|
|
80
|
+
let idx;
|
|
81
|
+
while ((idx = buf.indexOf('\n\n')) >= 0) {
|
|
82
|
+
const chunk = buf.slice(0, idx);
|
|
83
|
+
buf = buf.slice(idx + 2);
|
|
84
|
+
await this.handleSseChunk(chunk);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async handleSseChunk(chunk) {
|
|
89
|
+
const dataLines = chunk
|
|
90
|
+
.split('\n')
|
|
91
|
+
.filter((l) => l.startsWith('data:'))
|
|
92
|
+
.map((l) => l.slice(5).trim());
|
|
93
|
+
if (dataLines.length === 0)
|
|
94
|
+
return;
|
|
95
|
+
const data = dataLines.join('\n');
|
|
96
|
+
if (!data || data === ':' || data === 'ping')
|
|
97
|
+
return;
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(data);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return; // 非 JSON 心跳行
|
|
104
|
+
}
|
|
105
|
+
const ev = this.normalizeStreamEvent(parsed);
|
|
106
|
+
if (ev)
|
|
107
|
+
await this.opts.sink(ev);
|
|
108
|
+
}
|
|
109
|
+
/** 把 Spine fanout 的事件对象归一化(点号 type + payload)。 */
|
|
110
|
+
normalizeStreamEvent(raw) {
|
|
111
|
+
if (!raw || typeof raw !== 'object')
|
|
112
|
+
return null;
|
|
113
|
+
const o = raw;
|
|
114
|
+
const rawType = String(o.event || o.eventType || o.type || o.topic || '');
|
|
115
|
+
if (!rawType)
|
|
116
|
+
return null;
|
|
117
|
+
const type = normalizeEventType(rawType);
|
|
118
|
+
const payload = o.payload && typeof o.payload === 'object' ? o.payload : o;
|
|
119
|
+
const orderId = payload.orderId || payload.order_id || o.orderId || undefined;
|
|
120
|
+
const upstreamId = o.eventId || o.id || payload.eventId;
|
|
121
|
+
return {
|
|
122
|
+
type,
|
|
123
|
+
rawType,
|
|
124
|
+
orderId,
|
|
125
|
+
eventId: upstreamId || computeDedupeKey(type, payload),
|
|
126
|
+
channel: 'spine',
|
|
127
|
+
payload,
|
|
128
|
+
receivedAt: Date.now(),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
log(msg) {
|
|
132
|
+
if (this.opts.log)
|
|
133
|
+
this.opts.log(`[atel/spine] ${msg}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function sleep(ms) {
|
|
137
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=channel-spine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-spine.js","sourceRoot":"","sources":["../../src/events/channel-spine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 幂等去重 —— push + pull 双路、双通道必然送同一事件(见 6.4 §5)。
|
|
3
|
+
* 用 eventId/dedupeKey 去重;内存 LRU + TTL,容量上限防泄漏。
|
|
4
|
+
*
|
|
5
|
+
* 沿用 OpenClaw poll-loop autoActed / listener hookDedup 教训:
|
|
6
|
+
* Set 满了从头删,带 TTL 过期清理。
|
|
7
|
+
*/
|
|
8
|
+
export declare class Dedup {
|
|
9
|
+
private readonly ttlMs;
|
|
10
|
+
private readonly maxSize;
|
|
11
|
+
private seen;
|
|
12
|
+
constructor(ttlMs?: number, // 6h
|
|
13
|
+
maxSize?: number);
|
|
14
|
+
/** 首见返回 true(应处理);重复返回 false。 */
|
|
15
|
+
firstSeen(key: string): boolean;
|
|
16
|
+
has(key: string): boolean;
|
|
17
|
+
private prune;
|
|
18
|
+
get size(): number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 给没有上游 eventId 的事件算一个稳定 dedupeKey。
|
|
22
|
+
* 用 (type + orderId + 关键字段) 组合;同一业务事件多次送达 key 一致。
|
|
23
|
+
*/
|
|
24
|
+
export declare function computeDedupeKey(type: string, payload: Record<string, unknown>): string;
|
|
25
|
+
//# sourceMappingURL=dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/events/dedup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,KAAK;IAGd,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,IAAI,CAA6B;gBAEtB,KAAK,SAAqB,EAAE,KAAK;IACjC,OAAO,SAAO;IAGjC,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAW/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,OAAO,CAAC,KAAK;IAQb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMvF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 幂等去重 —— push + pull 双路、双通道必然送同一事件(见 6.4 §5)。
|
|
3
|
+
* 用 eventId/dedupeKey 去重;内存 LRU + TTL,容量上限防泄漏。
|
|
4
|
+
*
|
|
5
|
+
* 沿用 OpenClaw poll-loop autoActed / listener hookDedup 教训:
|
|
6
|
+
* Set 满了从头删,带 TTL 过期清理。
|
|
7
|
+
*/
|
|
8
|
+
export class Dedup {
|
|
9
|
+
ttlMs;
|
|
10
|
+
maxSize;
|
|
11
|
+
seen = new Map();
|
|
12
|
+
constructor(ttlMs = 6 * 60 * 60 * 1000, // 6h
|
|
13
|
+
maxSize = 5000) {
|
|
14
|
+
this.ttlMs = ttlMs;
|
|
15
|
+
this.maxSize = maxSize;
|
|
16
|
+
}
|
|
17
|
+
/** 首见返回 true(应处理);重复返回 false。 */
|
|
18
|
+
firstSeen(key) {
|
|
19
|
+
this.prune();
|
|
20
|
+
if (this.seen.has(key))
|
|
21
|
+
return false;
|
|
22
|
+
this.seen.set(key, Date.now());
|
|
23
|
+
if (this.seen.size > this.maxSize) {
|
|
24
|
+
const oldest = this.seen.keys().next().value;
|
|
25
|
+
if (oldest !== undefined)
|
|
26
|
+
this.seen.delete(oldest);
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
has(key) {
|
|
31
|
+
return this.seen.has(key);
|
|
32
|
+
}
|
|
33
|
+
prune() {
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
for (const [k, ts] of this.seen) {
|
|
36
|
+
if (now - ts > this.ttlMs)
|
|
37
|
+
this.seen.delete(k);
|
|
38
|
+
else
|
|
39
|
+
break; // Map 保插入序,遇到未过期即可停
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
get size() {
|
|
43
|
+
return this.seen.size;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 给没有上游 eventId 的事件算一个稳定 dedupeKey。
|
|
48
|
+
* 用 (type + orderId + 关键字段) 组合;同一业务事件多次送达 key 一致。
|
|
49
|
+
*/
|
|
50
|
+
export function computeDedupeKey(type, payload) {
|
|
51
|
+
const orderId = payload.orderId || payload.order_id || '';
|
|
52
|
+
const idx = payload.index ?? payload.milestoneIndex ?? payload.milestone_index ?? '';
|
|
53
|
+
const ref = payload.txHash || payload.id || payload.messageId || '';
|
|
54
|
+
return `${type}|${orderId}|${idx}|${ref}`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/events/dedup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAO,KAAK;IAGG;IACA;IAHX,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,YACmB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK;IACjC,UAAU,IAAI;QADd,UAAK,GAAL,KAAK,CAAqB;QAC1B,YAAO,GAAP,OAAO,CAAO;IAC9B,CAAC;IAEJ,iCAAiC;IACjC,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC7C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;gBAC1C,MAAM,CAAC,oBAAoB;QAClC,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAgC;IAC7E,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAK,OAAO,CAAC,QAAmB,IAAI,EAAE,CAAC;IAClF,MAAM,GAAG,GACP,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;IAC3E,MAAM,GAAG,GAAI,OAAO,CAAC,MAAiB,IAAK,OAAO,CAAC,EAAa,IAAK,OAAO,CAAC,SAAoB,IAAI,EAAE,CAAC;IACxG,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 事件 → 角色 → 唤醒动作 映射(6.4 §4 两张表)。
|
|
3
|
+
*
|
|
4
|
+
* 设计原则(对齐 feedback_everything_agent / feedback_no_confirm_buttons /
|
|
5
|
+
* feedback_no_rule_engine_prompts):
|
|
6
|
+
* - companion 不替 agent 做业务决策、不做规则引擎绕过。它只负责把"发生了什么 +
|
|
7
|
+
* 你是什么角色 + 该看哪个单"塞进 prompt,唤醒 agent,由 agent 调工具决定。
|
|
8
|
+
* - prompt 给上下文 + 一个明确动作 + "先拉单状态再动",不写死 PASS/REJECT 清单
|
|
9
|
+
* (那是 agent + 平台 verifier 的事)。
|
|
10
|
+
* - 唯一不经 agent 的是超时/卡死安全网(refundExpired、死信报警),在 autonomy.ts,
|
|
11
|
+
* 仅当 agent 路径已超期/失败才触发,不是事件→规则绕过。
|
|
12
|
+
*/
|
|
13
|
+
import type { CanonicalEvent, NormalizedEvent } from './types.js';
|
|
14
|
+
import type { OrderRole } from './roles.js';
|
|
15
|
+
export interface WakePlan {
|
|
16
|
+
orderId?: string;
|
|
17
|
+
eventType: CanonicalEvent;
|
|
18
|
+
role: OrderRole;
|
|
19
|
+
/** 给 agent 的聚焦指令(自然语言 = 意图) */
|
|
20
|
+
prompt: string;
|
|
21
|
+
/** 同一订单串行的 key;无 orderId 的用事件本身 */
|
|
22
|
+
serialKey: string;
|
|
23
|
+
}
|
|
24
|
+
/** 从事件 payload 推断"对本 DID 而言"的角色(角色缓存未命中时的兜底)。 */
|
|
25
|
+
export declare function deriveRole(ev: NormalizedEvent, ourDid: string): OrderRole;
|
|
26
|
+
/**
|
|
27
|
+
* 从事件类型推断角色 —— 平台按角色定向投递,所以"我收到了什么事件"本身就暗示我的角色
|
|
28
|
+
* (沿用 OpenClaw role cache 教训:event type + target_did 推断)。
|
|
29
|
+
* 仅当 payload / 缓存都拿不到角色时用,避免 role=unknown 导致一条事件同时触发雇主+接活方两路。
|
|
30
|
+
*/
|
|
31
|
+
export declare function inferRoleFromEvent(type: CanonicalEvent): OrderRole;
|
|
32
|
+
/**
|
|
33
|
+
* 把归一化事件 + 已解析角色映射成一个唤醒计划。
|
|
34
|
+
* 返回 null = 该事件对本角色无需动作(只记账/无关)。
|
|
35
|
+
*/
|
|
36
|
+
export declare function mapEventToAction(ev: NormalizedEvent, role: OrderRole): WakePlan | null;
|
|
37
|
+
//# sourceMappingURL=mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/events/mapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAOzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAelE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,CAsNtF"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
const TAG = '[ATEL companion]';
|
|
2
|
+
/** 从事件 payload 推断"对本 DID 而言"的角色(角色缓存未命中时的兜底)。 */
|
|
3
|
+
export function deriveRole(ev, ourDid) {
|
|
4
|
+
const p = ev.payload;
|
|
5
|
+
const exec = p.executorDid || p.executor_did || p.executor;
|
|
6
|
+
const req = p.requesterDid || p.requester_did || p.requester;
|
|
7
|
+
if (exec === ourDid)
|
|
8
|
+
return 'executor';
|
|
9
|
+
if (req === ourDid)
|
|
10
|
+
return 'requester';
|
|
11
|
+
return 'unknown';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 从事件类型推断角色 —— 平台按角色定向投递,所以"我收到了什么事件"本身就暗示我的角色
|
|
15
|
+
* (沿用 OpenClaw role cache 教训:event type + target_did 推断)。
|
|
16
|
+
* 仅当 payload / 缓存都拿不到角色时用,避免 role=unknown 导致一条事件同时触发雇主+接活方两路。
|
|
17
|
+
*/
|
|
18
|
+
export function inferRoleFromEvent(type) {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case 'order.created': // 有人雇我 → 我是接活方
|
|
21
|
+
case 'milestone.verified': // 我的交付被验收 → 我是接活方
|
|
22
|
+
case 'milestone.rejected': // 我的交付被驳回 → 我是接活方
|
|
23
|
+
case 'milestone.plan_confirmed': // 计划已确认,该我交付 → 接活方
|
|
24
|
+
case 'escrow.confirmed':
|
|
25
|
+
return 'executor';
|
|
26
|
+
case 'order.accepted': // 我的单被接受 → 我是雇主
|
|
27
|
+
case 'milestone.submitted': // 接活方交了,等我验收 → 我是雇主
|
|
28
|
+
case 'milestone.plan_rejected':
|
|
29
|
+
return 'requester';
|
|
30
|
+
default:
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 把归一化事件 + 已解析角色映射成一个唤醒计划。
|
|
36
|
+
* 返回 null = 该事件对本角色无需动作(只记账/无关)。
|
|
37
|
+
*/
|
|
38
|
+
export function mapEventToAction(ev, role) {
|
|
39
|
+
const orderId = ev.orderId;
|
|
40
|
+
const oid = orderId ? `订单 ${orderId}` : '该业务';
|
|
41
|
+
const head = (line) => `${TAG} ${line}`;
|
|
42
|
+
const readFirst = orderId
|
|
43
|
+
? `先调 atel_order_get {"orderId":"${orderId}"} 读当前状态,再决定下一步。`
|
|
44
|
+
: `先用相关 ATEL 工具读取当前状态,再决定下一步。`;
|
|
45
|
+
const mk = (prompt) => ({
|
|
46
|
+
orderId,
|
|
47
|
+
eventType: ev.type,
|
|
48
|
+
role,
|
|
49
|
+
prompt,
|
|
50
|
+
serialKey: orderId || `${ev.type}:${ev.eventId}`,
|
|
51
|
+
});
|
|
52
|
+
switch (ev.type) {
|
|
53
|
+
// ── 通道甲 A2A ──────────────────────────────────────────────
|
|
54
|
+
case 'order.created':
|
|
55
|
+
// 接活方收到:决定是否接单。雇主(自己刚下单)无需被唤醒。
|
|
56
|
+
if (role === 'requester')
|
|
57
|
+
return null;
|
|
58
|
+
return mk([
|
|
59
|
+
head(`有一单指向你(接活方):${oid} 刚创建。`),
|
|
60
|
+
`${readFirst} 若你有能力且愿意承接,调 atel_order_accept {"orderId":"${orderId}"}。`,
|
|
61
|
+
`能否承接由你判断 —— 不合适可以不接。完成后回 NO_REPLY。`,
|
|
62
|
+
].join('\n'));
|
|
63
|
+
case 'order.accepted':
|
|
64
|
+
// 雇主收到:接活方已接,确认里程碑计划。
|
|
65
|
+
if (role === 'executor')
|
|
66
|
+
return null;
|
|
67
|
+
return mk([
|
|
68
|
+
head(`接活方已接受 ${oid}(你是雇主)。`),
|
|
69
|
+
`${readFirst} 若平台要求确认里程碑计划,调 atel_milestone_plan_feedback {"orderId":"${orderId}","approved":true};否则等待首个里程碑提交。`,
|
|
70
|
+
`完成后回 NO_REPLY。`,
|
|
71
|
+
].join('\n'));
|
|
72
|
+
case 'milestone.review':
|
|
73
|
+
// 计划评审阶段:雇主确认计划。接活方此时一般等待。
|
|
74
|
+
if (role === 'executor')
|
|
75
|
+
return null;
|
|
76
|
+
return mk([
|
|
77
|
+
head(`${oid} 进入里程碑计划评审(你是雇主)。`),
|
|
78
|
+
`${readFirst} 用 atel_milestone_list 看计划;合理则 atel_milestone_plan_feedback {"orderId":"${orderId}","approved":true}。回 NO_REPLY。`,
|
|
79
|
+
].join('\n'));
|
|
80
|
+
case 'milestone.plan_confirmed':
|
|
81
|
+
// 计划已确认 → 接活方提交首个里程碑。
|
|
82
|
+
if (role === 'requester')
|
|
83
|
+
return null;
|
|
84
|
+
return mk([
|
|
85
|
+
head(`${oid} 里程碑计划已确认(你是接活方),开始交付。`),
|
|
86
|
+
`${readFirst} 用 atel_milestone_list 找第一个未提交里程碑,产出贴合其标题与订单描述的真实交付内容,`,
|
|
87
|
+
`调 atel_milestone_submit 提交。回 NO_REPLY。`,
|
|
88
|
+
].join('\n'));
|
|
89
|
+
case 'milestone.plan_rejected':
|
|
90
|
+
if (role === 'executor')
|
|
91
|
+
return null;
|
|
92
|
+
return mk([
|
|
93
|
+
head(`${oid} 里程碑计划被打回(你是雇主)。`),
|
|
94
|
+
`${readFirst} 与接活方对齐后重新评审计划。回 NO_REPLY。`,
|
|
95
|
+
].join('\n'));
|
|
96
|
+
case 'escrow.confirmed':
|
|
97
|
+
// escrow 锁定确认 → 接活方可推进(若计划已定则提交)。
|
|
98
|
+
if (role === 'requester')
|
|
99
|
+
return null;
|
|
100
|
+
return mk([
|
|
101
|
+
head(`${oid} 托管已确认(你是接活方)。`),
|
|
102
|
+
`${readFirst} 若里程碑计划已就绪,提交下一个未交付里程碑;否则等待计划确认。回 NO_REPLY。`,
|
|
103
|
+
].join('\n'));
|
|
104
|
+
case 'milestone.submitted':
|
|
105
|
+
// 雇主收到:接活方提交了里程碑,需要验收(通过/驳回)。
|
|
106
|
+
if (role === 'executor')
|
|
107
|
+
return null;
|
|
108
|
+
return mk([
|
|
109
|
+
head(`${oid} 有里程碑被提交(你是雇主),需要你验收。`),
|
|
110
|
+
`${readFirst} 用 atel_milestone_list 读该里程碑的标题与提交内容,结合订单描述判断是否达标。`,
|
|
111
|
+
`达标 → atel_milestone_verify;不达标 → atel_milestone_reject 并写明缺什么。由你判断,回 NO_REPLY。`,
|
|
112
|
+
].join('\n'));
|
|
113
|
+
case 'milestone.verified':
|
|
114
|
+
// 接活方收到:上一里程碑通过,交下一个或收尾。
|
|
115
|
+
if (role === 'requester')
|
|
116
|
+
return null;
|
|
117
|
+
return mk([
|
|
118
|
+
head(`${oid} 一个里程碑已通过(你是接活方)。`),
|
|
119
|
+
`${readFirst} 用 atel_milestone_list 找到下一个未提交的里程碑,产出符合其标题与订单描述的真实交付内容,`,
|
|
120
|
+
`调 atel_milestone_submit 提交。若全部已完成则无需动作。回 NO_REPLY。`,
|
|
121
|
+
].join('\n'));
|
|
122
|
+
case 'milestone.rejected':
|
|
123
|
+
// 接活方收到:被驳回,修订重交。
|
|
124
|
+
if (role === 'requester')
|
|
125
|
+
return null;
|
|
126
|
+
return mk([
|
|
127
|
+
head(`${oid} 有里程碑被驳回(你是接活方)。`),
|
|
128
|
+
`${readFirst} 读驳回理由,针对性修订交付内容,重新 atel_milestone_submit。回 NO_REPLY。`,
|
|
129
|
+
].join('\n'));
|
|
130
|
+
case 'milestone.arbitration_passed':
|
|
131
|
+
return mk([
|
|
132
|
+
head(`${oid} 仲裁通过。`),
|
|
133
|
+
`${readFirst} 按裁决结果继续推进流程(接活方交付 / 雇主验收)。回 NO_REPLY。`,
|
|
134
|
+
].join('\n'));
|
|
135
|
+
case 'milestone.arbitration_failed':
|
|
136
|
+
return mk([
|
|
137
|
+
head(`${oid} 仲裁未通过。`),
|
|
138
|
+
`${readFirst} 按裁决结果收尾(可能退款 / 终止)。回 NO_REPLY。`,
|
|
139
|
+
].join('\n'));
|
|
140
|
+
case 'order.dispute.resolved':
|
|
141
|
+
return mk([
|
|
142
|
+
head(`${oid} 争议已裁决。`),
|
|
143
|
+
`${readFirst} 按裁决结果入账或退款收尾。回 NO_REPLY。`,
|
|
144
|
+
].join('\n'));
|
|
145
|
+
case 'order.settled':
|
|
146
|
+
case 'order.completed':
|
|
147
|
+
return mk([
|
|
148
|
+
head(`${oid} 已结算完成。`),
|
|
149
|
+
`${readFirst} 确认入账并收尾。回 NO_REPLY。`,
|
|
150
|
+
].join('\n'));
|
|
151
|
+
case 'order.expired':
|
|
152
|
+
return mk([
|
|
153
|
+
head(`${oid} 已过期。`),
|
|
154
|
+
`${readFirst} 确认状态;若有托管未退,触发过期退款。回 NO_REPLY。`,
|
|
155
|
+
].join('\n'));
|
|
156
|
+
case 'order.cancelled':
|
|
157
|
+
return mk([
|
|
158
|
+
head(`${oid} 已取消。`),
|
|
159
|
+
`${readFirst} 确认状态并收尾(如有应退款项,确认已退)。回 NO_REPLY。`,
|
|
160
|
+
].join('\n'));
|
|
161
|
+
// ── 通道乙 A2B / transfer / 消息 ────────────────────────────
|
|
162
|
+
case 'a2b.order_created':
|
|
163
|
+
case 'a2b.payment_confirmed':
|
|
164
|
+
case 'a2b.delivery_completed':
|
|
165
|
+
return mk([
|
|
166
|
+
head(`A2B ${oid}:${a2bHint(ev.type)}(你是买家)。`),
|
|
167
|
+
`${readFirst} 推进购买流程;若交付完成,入账兑换码。回 NO_REPLY。`,
|
|
168
|
+
].join('\n'));
|
|
169
|
+
case 'a2b.delivery_failed':
|
|
170
|
+
case 'a2b.invoice_failed':
|
|
171
|
+
return mk([
|
|
172
|
+
head(`A2B ${oid}:${a2bHint(ev.type)}(你是买家)。`),
|
|
173
|
+
`${readFirst} 视情况重试或走退款流程。回 NO_REPLY。`,
|
|
174
|
+
].join('\n'));
|
|
175
|
+
case 'transfer.received': {
|
|
176
|
+
const amt = ev.payload.amount ?? '';
|
|
177
|
+
const from = ev.payload.fromDid || ev.payload.from || '';
|
|
178
|
+
return mk([
|
|
179
|
+
head(`收到转账${amt ? ` ${amt}` : ''}${from ? ` 来自 ${from}` : ''}。`),
|
|
180
|
+
`如需处理(入账/回执),用 ATEL 工具确认。回 NO_REPLY。`,
|
|
181
|
+
].join('\n'));
|
|
182
|
+
}
|
|
183
|
+
case 'message.received': {
|
|
184
|
+
const text = ev.payload.text || ev.payload.message || '';
|
|
185
|
+
return mk([
|
|
186
|
+
head(`收到一条 P2P 消息${text ? `:${text.slice(0, 500)}` : ''}。`),
|
|
187
|
+
`按需用 ATEL 工具处理或回复。回 NO_REPLY。`,
|
|
188
|
+
].join('\n'));
|
|
189
|
+
}
|
|
190
|
+
default:
|
|
191
|
+
// 兜底:订单相关但未专门映射/未识别的事件,不要静默卡死 —— 唤醒 agent 读状态推进
|
|
192
|
+
// (信任 agent;防止平台新增事件名导致 A2A 链路在某一步断掉)。
|
|
193
|
+
if (orderId) {
|
|
194
|
+
return mk([
|
|
195
|
+
head(`${oid} 有状态更新(${ev.rawType})。`),
|
|
196
|
+
`${readFirst} 按你的角色推进当前该做的一步:接活方提交待交付里程碑,雇主验收已提交里程碑或确认计划。无事可做回 NO_REPLY。`,
|
|
197
|
+
].join('\n'));
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function a2bHint(t) {
|
|
203
|
+
switch (t) {
|
|
204
|
+
case 'a2b.order_created': return '订单已创建';
|
|
205
|
+
case 'a2b.payment_confirmed': return '付款已确认';
|
|
206
|
+
case 'a2b.delivery_completed': return '交付完成';
|
|
207
|
+
case 'a2b.delivery_failed': return '交付失败';
|
|
208
|
+
case 'a2b.invoice_failed': return '开票失败';
|
|
209
|
+
default: return '状态更新';
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/events/mapping.ts"],"names":[],"mappings":"AAyBA,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAE/B,iDAAiD;AACjD,MAAM,UAAU,UAAU,CAAC,EAAmB,EAAE,MAAc;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IACrB,MAAM,IAAI,GAAI,CAAC,CAAC,WAAsB,IAAK,CAAC,CAAC,YAAuB,IAAK,CAAC,CAAC,QAAmB,CAAC;IAC/F,MAAM,GAAG,GAAI,CAAC,CAAC,YAAuB,IAAK,CAAC,CAAC,aAAwB,IAAK,CAAC,CAAC,SAAoB,CAAC;IACjG,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe,CAAC,CAAC,eAAe;QACrC,KAAK,oBAAoB,CAAC,CAAC,kBAAkB;QAC7C,KAAK,oBAAoB,CAAC,CAAC,kBAAkB;QAC7C,KAAK,0BAA0B,CAAC,CAAC,mBAAmB;QACpD,KAAK,kBAAkB;YACrB,OAAO,UAAU,CAAC;QACpB,KAAK,gBAAgB,CAAC,CAAC,gBAAgB;QACvC,KAAK,qBAAqB,CAAC,CAAC,oBAAoB;QAChD,KAAK,yBAAyB;YAC5B,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAmB,EAAE,IAAe;IACnE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC,iCAAiC,OAAO,kBAAkB;QAC5D,CAAC,CAAC,4BAA4B,CAAC;IACjC,MAAM,EAAE,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC,CAAC;QACxC,OAAO;QACP,SAAS,EAAE,EAAE,CAAC,IAAI;QAClB,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;KACjD,CAAC,CAAC;IAEH,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,4DAA4D;QAC5D,KAAK,eAAe;YAClB,+BAA+B;YAC/B,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;gBAC/B,GAAG,SAAS,+CAA+C,OAAO,KAAK;gBACvE,oCAAoC;aACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,gBAAgB;YACnB,sBAAsB;YACtB,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,GAAG,SAAS,4DAA4D,OAAO,iCAAiC;gBAChH,gBAAgB;aACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,kBAAkB;YACrB,2BAA2B;YAC3B,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,mBAAmB,CAAC;gBAC/B,GAAG,SAAS,2EAA2E,OAAO,gCAAgC;aAC/H,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,0BAA0B;YAC7B,sBAAsB;YACtB,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,wBAAwB,CAAC;gBACpC,GAAG,SAAS,wDAAwD;gBACpE,wCAAwC;aACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,yBAAyB;YAC5B,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,kBAAkB,CAAC;gBAC9B,GAAG,SAAS,4BAA4B;aACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,kBAAkB;YACrB,kCAAkC;YAClC,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC;gBAC5B,GAAG,SAAS,6CAA6C;aAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,qBAAqB;YACxB,8BAA8B;YAC9B,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,uBAAuB,CAAC;gBACnC,GAAG,SAAS,oDAAoD;gBAChE,gFAAgF;aACjF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,oBAAoB;YACvB,yBAAyB;YACzB,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,mBAAmB,CAAC;gBAC/B,GAAG,SAAS,0DAA0D;gBACtE,oDAAoD;aACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,oBAAoB;YACvB,kBAAkB;YAClB,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,kBAAkB,CAAC;gBAC9B,GAAG,SAAS,uDAAuD;aACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,8BAA8B;YACjC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;gBACpB,GAAG,SAAS,wCAAwC;aACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,8BAA8B;YACjC,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;gBACrB,GAAG,SAAS,iCAAiC;aAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,wBAAwB;YAC3B,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;gBACrB,GAAG,SAAS,2BAA2B;aACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,eAAe,CAAC;QACrB,KAAK,iBAAiB;YACpB,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;gBACrB,GAAG,SAAS,sBAAsB;aACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,eAAe;YAClB,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;gBACnB,GAAG,SAAS,iCAAiC;aAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;gBACnB,GAAG,SAAS,mCAAmC;aAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,0DAA0D;QAC1D,KAAK,mBAAmB,CAAC;QACzB,KAAK,uBAAuB,CAAC;QAC7B,KAAK,wBAAwB;YAC3B,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC7C,GAAG,SAAS,iCAAiC;aAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,qBAAqB,CAAC;QAC3B,KAAK,oBAAoB;YACvB,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC7C,GAAG,SAAS,0BAA0B;aACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEJ,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,GAAG,GAAI,EAAE,CAAC,OAAO,CAAC,MAA0B,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,GAAI,EAAE,CAAC,OAAO,CAAC,OAAkB,IAAK,EAAE,CAAC,OAAO,CAAC,IAAe,IAAI,EAAE,CAAC;YACjF,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;gBAChE,qCAAqC;aACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAI,EAAE,CAAC,OAAO,CAAC,IAAe,IAAK,EAAE,CAAC,OAAO,CAAC,OAAkB,IAAI,EAAE,CAAC;YACjF,OAAO,EAAE,CACP;gBACE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC3D,8BAA8B;aAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAED;YACE,gDAAgD;YAChD,uCAAuC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,EAAE,CACP;oBACE,IAAI,CAAC,GAAG,GAAG,UAAU,EAAE,CAAC,OAAO,IAAI,CAAC;oBACpC,GAAG,SAAS,6DAA6D;iBAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAiB;IAChC,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,mBAAmB,CAAC,CAAC,OAAO,OAAO,CAAC;QACzC,KAAK,uBAAuB,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7C,KAAK,wBAAwB,CAAC,CAAC,OAAO,MAAM,CAAC;QAC7C,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,CAAC;QAC1C,KAAK,oBAAoB,CAAC,CAAC,OAAO,MAAM,CAAC;QACzC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type OrderRole = 'executor' | 'requester' | 'unknown';
|
|
2
|
+
interface RoleEntry {
|
|
3
|
+
executorDid?: string;
|
|
4
|
+
requesterDid?: string;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class OrderRoleCache {
|
|
8
|
+
private readonly filePath;
|
|
9
|
+
private cache;
|
|
10
|
+
constructor(filePath: string);
|
|
11
|
+
private load;
|
|
12
|
+
private save;
|
|
13
|
+
/** 从事件 payload 学习并合并角色信息。 */
|
|
14
|
+
observe(orderId: string, payload: Record<string, unknown>): void;
|
|
15
|
+
/** 显式写入(如 atel_order_get 拉回后回填)。 */
|
|
16
|
+
set(orderId: string, executorDid?: string, requesterDid?: string): void;
|
|
17
|
+
roleOf(orderId: string, ourDid: string): OrderRole;
|
|
18
|
+
get(orderId: string): RoleEntry | undefined;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/events/roles.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7D,UAAU,SAAS;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,KAAK,CAAiC;gBAEjB,QAAQ,EAAE,MAAM;IAI7C,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,IAAI;IASZ,6BAA6B;IAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgBhE,oCAAoC;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS;IAQlD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAG5C"}
|