@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.
Files changed (118) hide show
  1. package/dist/adapters/claude-code.d.ts +3 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +65 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/codex.d.ts +3 -0
  6. package/dist/adapters/codex.d.ts.map +1 -0
  7. package/dist/adapters/codex.js +49 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/gemini-cli.d.ts +3 -0
  10. package/dist/adapters/gemini-cli.d.ts.map +1 -0
  11. package/dist/adapters/gemini-cli.js +43 -0
  12. package/dist/adapters/gemini-cli.js.map +1 -0
  13. package/dist/adapters/hermes.d.ts +3 -0
  14. package/dist/adapters/hermes.d.ts.map +1 -0
  15. package/dist/adapters/hermes.js +58 -0
  16. package/dist/adapters/hermes.js.map +1 -0
  17. package/dist/adapters/openclaw.d.ts +13 -0
  18. package/dist/adapters/openclaw.d.ts.map +1 -0
  19. package/dist/adapters/openclaw.js +36 -0
  20. package/dist/adapters/openclaw.js.map +1 -0
  21. package/dist/adapters/qwen-agent.d.ts +3 -0
  22. package/dist/adapters/qwen-agent.d.ts.map +1 -0
  23. package/dist/adapters/qwen-agent.js +128 -0
  24. package/dist/adapters/qwen-agent.js.map +1 -0
  25. package/dist/adapters/registry.d.ts +20 -0
  26. package/dist/adapters/registry.d.ts.map +1 -0
  27. package/dist/adapters/registry.js +42 -0
  28. package/dist/adapters/registry.js.map +1 -0
  29. package/dist/adapters/types.d.ts +46 -0
  30. package/dist/adapters/types.d.ts.map +1 -0
  31. package/dist/adapters/types.js +2 -0
  32. package/dist/adapters/types.js.map +1 -0
  33. package/dist/adapters/util.d.ts +10 -0
  34. package/dist/adapters/util.d.ts.map +1 -0
  35. package/dist/adapters/util.js +86 -0
  36. package/dist/adapters/util.js.map +1 -0
  37. package/dist/auth.d.ts +42 -0
  38. package/dist/auth.d.ts.map +1 -0
  39. package/dist/auth.js +91 -0
  40. package/dist/auth.js.map +1 -0
  41. package/dist/client.d.ts +55 -0
  42. package/dist/client.d.ts.map +1 -0
  43. package/dist/client.js +139 -0
  44. package/dist/client.js.map +1 -0
  45. package/dist/companion.d.ts +45 -0
  46. package/dist/companion.d.ts.map +1 -0
  47. package/dist/companion.js +224 -0
  48. package/dist/companion.js.map +1 -0
  49. package/dist/config.d.ts +35 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +29 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/deadletter.d.ts +31 -0
  54. package/dist/deadletter.d.ts.map +1 -0
  55. package/dist/deadletter.js +67 -0
  56. package/dist/deadletter.js.map +1 -0
  57. package/dist/envelope.d.ts +21 -0
  58. package/dist/envelope.d.ts.map +1 -0
  59. package/dist/envelope.js +20 -0
  60. package/dist/envelope.js.map +1 -0
  61. package/dist/events/channel-relay.d.ts +35 -0
  62. package/dist/events/channel-relay.d.ts.map +1 -0
  63. package/dist/events/channel-relay.js +97 -0
  64. package/dist/events/channel-relay.js.map +1 -0
  65. package/dist/events/channel-spine.d.ts +41 -0
  66. package/dist/events/channel-spine.d.ts.map +1 -0
  67. package/dist/events/channel-spine.js +139 -0
  68. package/dist/events/channel-spine.js.map +1 -0
  69. package/dist/events/dedup.d.ts +25 -0
  70. package/dist/events/dedup.d.ts.map +1 -0
  71. package/dist/events/dedup.js +56 -0
  72. package/dist/events/dedup.js.map +1 -0
  73. package/dist/events/mapping.d.ts +37 -0
  74. package/dist/events/mapping.d.ts.map +1 -0
  75. package/dist/events/mapping.js +212 -0
  76. package/dist/events/mapping.js.map +1 -0
  77. package/dist/events/roles.d.ts +21 -0
  78. package/dist/events/roles.d.ts.map +1 -0
  79. package/dist/events/roles.js +80 -0
  80. package/dist/events/roles.js.map +1 -0
  81. package/dist/events/types.d.ts +51 -0
  82. package/dist/events/types.d.ts.map +1 -0
  83. package/dist/events/types.js +96 -0
  84. package/dist/events/types.js.map +1 -0
  85. package/dist/identity.d.ts +48 -0
  86. package/dist/identity.d.ts.map +1 -0
  87. package/dist/identity.js +123 -0
  88. package/dist/identity.js.map +1 -0
  89. package/dist/index.d.ts +32 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +40 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/queue.d.ts +12 -0
  94. package/dist/queue.d.ts.map +1 -0
  95. package/dist/queue.js +25 -0
  96. package/dist/queue.js.map +1 -0
  97. package/dist/tracker.d.ts +27 -0
  98. package/dist/tracker.d.ts.map +1 -0
  99. package/dist/tracker.js +80 -0
  100. package/dist/tracker.js.map +1 -0
  101. package/dist/wakers/cli.d.ts +36 -0
  102. package/dist/wakers/cli.d.ts.map +1 -0
  103. package/dist/wakers/cli.js +116 -0
  104. package/dist/wakers/cli.js.map +1 -0
  105. package/dist/wakers/daemon.d.ts +26 -0
  106. package/dist/wakers/daemon.d.ts.map +1 -0
  107. package/dist/wakers/daemon.js +51 -0
  108. package/dist/wakers/daemon.js.map +1 -0
  109. package/dist/wakers/embedded.d.ts +23 -0
  110. package/dist/wakers/embedded.d.ts.map +1 -0
  111. package/dist/wakers/embedded.js +26 -0
  112. package/dist/wakers/embedded.js.map +1 -0
  113. package/dist/wakers/types.d.ts +29 -0
  114. package/dist/wakers/types.d.ts.map +1 -0
  115. package/dist/wakers/types.js +2 -0
  116. package/dist/wakers/types.js.map +1 -0
  117. package/package.json +44 -0
  118. package/src/skill/SKILL.md +80 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 订单角色缓存 —— companion 唤醒 agent 前必须知道"我在这单里是雇主还是接活方"
3
+ * (见 6.4 §7.1:雇主≠接活方,下一步动作完全不同)。
4
+ *
5
+ * 角色从事件 payload 推断并落盘缓存(沿用 OpenClaw listener role cache):
6
+ * - order.created / order.accepted 的 payload 带 executorDid + requesterDid
7
+ * - 之后的 milestone 事件可能只带 orderId,靠缓存查角色
8
+ * agent 无状态,companion 重启后从缓存 + atel_order_get 续上。
9
+ */
10
+ import fs from 'node:fs';
11
+ import path from 'node:path';
12
+ export class OrderRoleCache {
13
+ filePath;
14
+ cache = {};
15
+ constructor(filePath) {
16
+ this.filePath = filePath;
17
+ this.load();
18
+ }
19
+ load() {
20
+ try {
21
+ if (fs.existsSync(this.filePath)) {
22
+ this.cache = JSON.parse(fs.readFileSync(this.filePath, 'utf8')) || {};
23
+ }
24
+ }
25
+ catch {
26
+ this.cache = {};
27
+ }
28
+ }
29
+ save() {
30
+ try {
31
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
32
+ fs.writeFileSync(this.filePath, JSON.stringify(this.cache, null, 2));
33
+ }
34
+ catch {
35
+ /* best-effort */
36
+ }
37
+ }
38
+ /** 从事件 payload 学习并合并角色信息。 */
39
+ observe(orderId, payload) {
40
+ if (!orderId)
41
+ return;
42
+ const executorDid = payload.executorDid || payload.executor_did || payload.executor;
43
+ const requesterDid = payload.requesterDid || payload.requester_did || payload.requester;
44
+ if (!executorDid && !requesterDid)
45
+ return;
46
+ const prev = this.cache[orderId] || { updatedAt: 0 };
47
+ this.cache[orderId] = {
48
+ executorDid: executorDid || prev.executorDid,
49
+ requesterDid: requesterDid || prev.requesterDid,
50
+ updatedAt: Date.now(),
51
+ };
52
+ this.save();
53
+ }
54
+ /** 显式写入(如 atel_order_get 拉回后回填)。 */
55
+ set(orderId, executorDid, requesterDid) {
56
+ if (!orderId)
57
+ return;
58
+ const prev = this.cache[orderId] || { updatedAt: 0 };
59
+ this.cache[orderId] = {
60
+ executorDid: executorDid || prev.executorDid,
61
+ requesterDid: requesterDid || prev.requesterDid,
62
+ updatedAt: Date.now(),
63
+ };
64
+ this.save();
65
+ }
66
+ roleOf(orderId, ourDid) {
67
+ const e = this.cache[orderId];
68
+ if (!e)
69
+ return 'unknown';
70
+ if (e.executorDid === ourDid)
71
+ return 'executor';
72
+ if (e.requesterDid === ourDid)
73
+ return 'requester';
74
+ return 'unknown';
75
+ }
76
+ get(orderId) {
77
+ return this.cache[orderId];
78
+ }
79
+ }
80
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/events/roles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 事件 catalog —— 两条入站通道,事件名已三方核实(源码 + 测试服 DB + 生产 DB,
3
+ * 见 6.4 核-1)。
4
+ *
5
+ * 通道甲 · A2A 领域事件总线(点号命名):走 Spine /events/subscribe + /events/stream。
6
+ * 生产 event_outbox 真实出现:milestone.submitted / milestone.verified /
7
+ * order.settled / order.accepted / order.created / order.cancelled /
8
+ * milestone.arbitration_failed / order.dispute.resolved。
9
+ * (milestone.arbitration_passed 源码有、生产暂未发生)
10
+ *
11
+ * 通道乙 · A2B + transfer + 消息(下划线命名):⚠️ 不进 outbox,Spine 订阅收不到,
12
+ * 走 relay 长轮询。a2b_order_created / a2b_payment_confirmed /
13
+ * a2b_delivery_completed / a2b_delivery_failed / a2b_invoice_failed /
14
+ * transfer_received / (P2P 文本消息)。
15
+ *
16
+ * 注意:order_created / order_accepted 等下划线名也会经 relay 推送(OpenClaw
17
+ * poll-loop 实测路径)。normalizeEventType 把点号/下划线统一成一种规范名,
18
+ * 让映射表对两条通道都成立。
19
+ */
20
+ /** 规范事件名(内部统一用点号风格)。 */
21
+ export type CanonicalEvent = 'order.created' | 'order.accepted' | 'escrow.confirmed' | 'milestone.review' | 'milestone.plan_confirmed' | 'milestone.plan_rejected' | 'milestone.submitted' | 'milestone.verified' | 'milestone.rejected' | 'milestone.arbitration_passed' | 'milestone.arbitration_failed' | 'order.settled' | 'order.completed' | 'order.cancelled' | 'order.expired' | 'order.dispute.resolved' | 'a2b.order_created' | 'a2b.payment_confirmed' | 'a2b.delivery_completed' | 'a2b.delivery_failed' | 'a2b.invoice_failed' | 'transfer.received' | 'message.received' | 'unknown';
22
+ export type Channel = 'spine' | 'relay';
23
+ /** 归一化后的内部事件。 */
24
+ export interface NormalizedEvent {
25
+ /** 规范事件名 */
26
+ type: CanonicalEvent;
27
+ /** 原始事件名(点号或下划线,原样保留) */
28
+ rawType: string;
29
+ /** 订单 id(A2A/A2B 有,transfer/message 可能无) */
30
+ orderId?: string;
31
+ /** 用于幂等的稳定 id;优先用上游 eventId,否则由内容算 dedupeKey */
32
+ eventId: string;
33
+ /** 入站通道 */
34
+ channel: Channel;
35
+ /** 原始 payload */
36
+ payload: Record<string, unknown>;
37
+ /** 收到时间 */
38
+ receivedAt: number;
39
+ }
40
+ /**
41
+ * 把上游各种形态的事件名归一化到 CanonicalEvent。
42
+ * 上游可能给:
43
+ * - 点号(通道甲 outbox): "milestone.verified"
44
+ * - 下划线(通道乙 relay): "milestone_verified" / "a2b_order_created" / "transfer_received"
45
+ */
46
+ export declare function normalizeEventType(raw: string): CanonicalEvent;
47
+ /** 该规范事件归属哪条通道(用于订阅与诊断,不强制路由)。 */
48
+ export declare function channelOf(type: CanonicalEvent): Channel;
49
+ /** 通道甲订阅的点号 topic(给 /events/subscribe 用)。 */
50
+ export declare const SPINE_TOPICS: string[];
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAwB;AACxB,MAAM,MAAM,cAAc,GAEtB,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,0BAA0B,GAC1B,yBAAyB,GACzB,qBAAqB,GACrB,oBAAoB,GACpB,oBAAoB,GACpB,8BAA8B,GAC9B,8BAA8B,GAC9B,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,wBAAwB,GAExB,mBAAmB,GACnB,uBAAuB,GACvB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,SAAS,CAAC;AAEd,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAExC,iBAAiB;AACjB,MAAM,WAAW,eAAe;IAC9B,YAAY;IACZ,IAAI,EAAE,cAAc,CAAC;IACrB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CA2C9D;AAED,kCAAkC;AAClC,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAavD;AAED,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,MAAM,EAUhC,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 事件 catalog —— 两条入站通道,事件名已三方核实(源码 + 测试服 DB + 生产 DB,
3
+ * 见 6.4 核-1)。
4
+ *
5
+ * 通道甲 · A2A 领域事件总线(点号命名):走 Spine /events/subscribe + /events/stream。
6
+ * 生产 event_outbox 真实出现:milestone.submitted / milestone.verified /
7
+ * order.settled / order.accepted / order.created / order.cancelled /
8
+ * milestone.arbitration_failed / order.dispute.resolved。
9
+ * (milestone.arbitration_passed 源码有、生产暂未发生)
10
+ *
11
+ * 通道乙 · A2B + transfer + 消息(下划线命名):⚠️ 不进 outbox,Spine 订阅收不到,
12
+ * 走 relay 长轮询。a2b_order_created / a2b_payment_confirmed /
13
+ * a2b_delivery_completed / a2b_delivery_failed / a2b_invoice_failed /
14
+ * transfer_received / (P2P 文本消息)。
15
+ *
16
+ * 注意:order_created / order_accepted 等下划线名也会经 relay 推送(OpenClaw
17
+ * poll-loop 实测路径)。normalizeEventType 把点号/下划线统一成一种规范名,
18
+ * 让映射表对两条通道都成立。
19
+ */
20
+ /**
21
+ * 把上游各种形态的事件名归一化到 CanonicalEvent。
22
+ * 上游可能给:
23
+ * - 点号(通道甲 outbox): "milestone.verified"
24
+ * - 下划线(通道乙 relay): "milestone_verified" / "a2b_order_created" / "transfer_received"
25
+ */
26
+ export function normalizeEventType(raw) {
27
+ if (!raw)
28
+ return 'unknown';
29
+ const dotted = raw.replace(/_/g, '.').toLowerCase();
30
+ // a2b_* → a2b.*
31
+ if (dotted.startsWith('a2b.')) {
32
+ const rest = dotted.slice(4);
33
+ switch (rest) {
34
+ case 'order.created': return 'a2b.order_created';
35
+ case 'payment.confirmed': return 'a2b.payment_confirmed';
36
+ case 'delivery.completed': return 'a2b.delivery_completed';
37
+ case 'delivery.failed': return 'a2b.delivery_failed';
38
+ case 'invoice.failed': return 'a2b.invoice_failed';
39
+ default: return 'unknown';
40
+ }
41
+ }
42
+ switch (dotted) {
43
+ case 'order.created': return 'order.created';
44
+ case 'order.accepted': return 'order.accepted';
45
+ case 'escrow.confirmed': return 'escrow.confirmed';
46
+ case 'milestone.review': return 'milestone.review';
47
+ case 'milestone.plan.confirmed': return 'milestone.plan_confirmed';
48
+ case 'milestone.plan.rejected': return 'milestone.plan_rejected';
49
+ case 'milestone.submitted': return 'milestone.submitted';
50
+ case 'milestone.verified': return 'milestone.verified';
51
+ case 'milestone.rejected':
52
+ case 'milestone.max.rejected': return 'milestone.rejected';
53
+ case 'milestone.arbitration.passed': return 'milestone.arbitration_passed';
54
+ case 'milestone.arbitration.failed': return 'milestone.arbitration_failed';
55
+ case 'milestone.final': return 'order.settled';
56
+ case 'order.settled': return 'order.settled';
57
+ case 'order.completed': return 'order.completed';
58
+ case 'order.delivered': return 'order.completed';
59
+ case 'order.cancelled':
60
+ case 'order.canceled': return 'order.cancelled';
61
+ case 'order.expired': return 'order.expired';
62
+ case 'order.dispute.resolved': return 'order.dispute.resolved';
63
+ case 'transfer.received': return 'transfer.received';
64
+ case 'message.received':
65
+ case 'message': return 'message.received';
66
+ default: return 'unknown';
67
+ }
68
+ }
69
+ /** 该规范事件归属哪条通道(用于订阅与诊断,不强制路由)。 */
70
+ export function channelOf(type) {
71
+ switch (type) {
72
+ case 'a2b.order_created':
73
+ case 'a2b.payment_confirmed':
74
+ case 'a2b.delivery_completed':
75
+ case 'a2b.delivery_failed':
76
+ case 'a2b.invoice_failed':
77
+ case 'transfer.received':
78
+ case 'message.received':
79
+ return 'relay';
80
+ default:
81
+ return 'spine';
82
+ }
83
+ }
84
+ /** 通道甲订阅的点号 topic(给 /events/subscribe 用)。 */
85
+ export const SPINE_TOPICS = [
86
+ 'order.created',
87
+ 'order.accepted',
88
+ 'milestone.submitted',
89
+ 'milestone.verified',
90
+ 'milestone.arbitration_passed',
91
+ 'milestone.arbitration_failed',
92
+ 'order.settled',
93
+ 'order.cancelled',
94
+ 'order.dispute.resolved',
95
+ ];
96
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare class IdentityError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export interface KeyPair {
5
+ publicKey: Uint8Array;
6
+ secretKey: Uint8Array;
7
+ }
8
+ /** 生成 Ed25519 密钥对。 */
9
+ export declare function generateKeyPair(): KeyPair;
10
+ /** publicKey(32B) → did:atel:ed25519:<base58> */
11
+ export declare function createDID(publicKey: Uint8Array): string;
12
+ /** did:atel:ed25519:<base58> | did:atel:<base58>(legacy) → publicKey(32B) */
13
+ export declare function parseDID(did: string): Uint8Array;
14
+ /**
15
+ * 确定性 JSON 序列化 —— 递归按 key 排序。
16
+ * 必须与 atel-platform auth.SerializePayload 字节一致。
17
+ */
18
+ export declare function serializePayload(obj: unknown): string;
19
+ /** 对 payload 签名,返回 base64 detached 签名。payload 先确定性序列化。 */
20
+ export declare function sign(payload: unknown, secretKey: Uint8Array): string;
21
+ /** 校验 base64 detached 签名。 */
22
+ export declare function verify(payload: unknown, signature: string, publicKey: Uint8Array): boolean;
23
+ /** secretKey 编码: hex / base64 / 普通 base64 → 64B Uint8Array(对齐 OpenClaw identity.json)。 */
24
+ export declare function decodeSecretKey(raw: string): Uint8Array;
25
+ /** Agent 身份:DID + 私钥。companion 持有,用于签 SignedRequest 与换 JWT。 */
26
+ export interface Identity {
27
+ did: string;
28
+ publicKey: Uint8Array;
29
+ secretKey: Uint8Array;
30
+ agent_id?: string;
31
+ }
32
+ /** 从 identity.json 风格的对象加载(secretKey 为 hex/base64 字符串)。 */
33
+ export declare function loadIdentity(raw: {
34
+ did?: string;
35
+ secretKey: string;
36
+ publicKey?: string;
37
+ agent_id?: string;
38
+ }): Identity;
39
+ /** 新建身份(用于安装器 onboarding)。 */
40
+ export declare function newIdentity(agent_id?: string): Identity;
41
+ /** 导出为可落盘的 identity.json(secretKey 用 base64)。 */
42
+ export declare function serializeIdentity(id: Identity): {
43
+ did: string;
44
+ publicKey: string;
45
+ secretKey: string;
46
+ agent_id?: string;
47
+ };
48
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAcA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,sBAAsB;AACtB,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAKvD;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAehD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAWrD;AAED,0DAA0D;AAC1D,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,CAOpE;AAED,6BAA6B;AAC7B,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAS1F;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CASvD;AAED,+DAA+D;AAC/D,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAMtH;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAGvD;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAOxH"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * 自带最小签名 (tweetnacl + bs58)。
3
+ *
4
+ * 这是内核的"零外部前置"签名层 —— 字节级对齐 atel-platform 的
5
+ * auth.SerializePayload + Ed25519 detached 签名,以及 atel-sdk
6
+ * src/identity/index.ts。后续若 atel-sdk 暴露 `@atel-ai/atel-sdk/identity`
7
+ * 子路径,可走 [protocol-change] 切换复用;在那之前关键路径零跨团队依赖。
8
+ *
9
+ * ⚠️ 签名格式必须与服务端一致,否则 /identity/verify 与 relay /poll、/ack
10
+ * 全部 401。改这里前先跑 identity.test.ts(含 '1'.repeat(32) 固定向量)。
11
+ */
12
+ import nacl from 'tweetnacl';
13
+ import bs58 from 'bs58';
14
+ export class IdentityError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = 'IdentityError';
18
+ }
19
+ }
20
+ /** 生成 Ed25519 密钥对。 */
21
+ export function generateKeyPair() {
22
+ const kp = nacl.sign.keyPair();
23
+ return { publicKey: kp.publicKey, secretKey: kp.secretKey };
24
+ }
25
+ /** publicKey(32B) → did:atel:ed25519:<base58> */
26
+ export function createDID(publicKey) {
27
+ if (publicKey.length !== 32) {
28
+ throw new IdentityError(`Invalid public key length: expected 32, got ${publicKey.length}`);
29
+ }
30
+ return `did:atel:ed25519:${bs58.encode(publicKey)}`;
31
+ }
32
+ /** did:atel:ed25519:<base58> | did:atel:<base58>(legacy) → publicKey(32B) */
33
+ export function parseDID(did) {
34
+ const parts = did.split(':');
35
+ let b58;
36
+ if (parts.length === 4 && parts[0] === 'did' && parts[1] === 'atel' && parts[2] === 'ed25519') {
37
+ b58 = parts[3];
38
+ }
39
+ else if (parts.length === 3 && parts[0] === 'did' && parts[1] === 'atel') {
40
+ b58 = parts[2];
41
+ }
42
+ else {
43
+ throw new IdentityError(`Invalid DID format: ${did}`);
44
+ }
45
+ const decoded = bs58.decode(b58);
46
+ if (decoded.length !== 32) {
47
+ throw new IdentityError(`Invalid public key in DID: expected 32 bytes, got ${decoded.length}`);
48
+ }
49
+ return decoded;
50
+ }
51
+ /**
52
+ * 确定性 JSON 序列化 —— 递归按 key 排序。
53
+ * 必须与 atel-platform auth.SerializePayload 字节一致。
54
+ */
55
+ export function serializePayload(obj) {
56
+ return JSON.stringify(obj, (_key, value) => {
57
+ if (value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Uint8Array)) {
58
+ const sorted = {};
59
+ for (const k of Object.keys(value).sort()) {
60
+ sorted[k] = value[k];
61
+ }
62
+ return sorted;
63
+ }
64
+ return value;
65
+ });
66
+ }
67
+ /** 对 payload 签名,返回 base64 detached 签名。payload 先确定性序列化。 */
68
+ export function sign(payload, secretKey) {
69
+ if (secretKey.length !== 64) {
70
+ throw new IdentityError(`Invalid secret key length: expected 64, got ${secretKey.length}`);
71
+ }
72
+ const message = typeof payload === 'string' ? payload : serializePayload(payload);
73
+ const sig = nacl.sign.detached(new TextEncoder().encode(message), secretKey);
74
+ return Buffer.from(sig).toString('base64');
75
+ }
76
+ /** 校验 base64 detached 签名。 */
77
+ export function verify(payload, signature, publicKey) {
78
+ if (publicKey.length !== 32)
79
+ return false;
80
+ try {
81
+ const message = typeof payload === 'string' ? payload : serializePayload(payload);
82
+ const sigBytes = Uint8Array.from(Buffer.from(signature, 'base64'));
83
+ return nacl.sign.detached.verify(new TextEncoder().encode(message), sigBytes, publicKey);
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /** secretKey 编码: hex / base64 / 普通 base64 → 64B Uint8Array(对齐 OpenClaw identity.json)。 */
90
+ export function decodeSecretKey(raw) {
91
+ if (typeof raw !== 'string')
92
+ throw new IdentityError('secretKey must be a string');
93
+ const bytes = /^[0-9a-fA-F]+$/.test(raw) && raw.length % 2 === 0
94
+ ? Buffer.from(raw, 'hex')
95
+ : Buffer.from(raw, 'base64');
96
+ if (bytes.length !== 64) {
97
+ throw new IdentityError(`decoded secretKey length ${bytes.length}, expected 64`);
98
+ }
99
+ return new Uint8Array(bytes);
100
+ }
101
+ /** 从 identity.json 风格的对象加载(secretKey 为 hex/base64 字符串)。 */
102
+ export function loadIdentity(raw) {
103
+ const secretKey = decodeSecretKey(raw.secretKey);
104
+ // tweetnacl 的 secretKey 后 32 字节即 publicKey
105
+ const publicKey = secretKey.slice(32, 64);
106
+ const did = raw.did || createDID(publicKey);
107
+ return { did, publicKey, secretKey, agent_id: raw.agent_id };
108
+ }
109
+ /** 新建身份(用于安装器 onboarding)。 */
110
+ export function newIdentity(agent_id) {
111
+ const kp = generateKeyPair();
112
+ return { did: createDID(kp.publicKey), publicKey: kp.publicKey, secretKey: kp.secretKey, agent_id };
113
+ }
114
+ /** 导出为可落盘的 identity.json(secretKey 用 base64)。 */
115
+ export function serializeIdentity(id) {
116
+ return {
117
+ did: id.did,
118
+ publicKey: Buffer.from(id.publicKey).toString('base64'),
119
+ secretKey: Buffer.from(id.secretKey).toString('base64'),
120
+ ...(id.agent_id ? { agent_id: id.agent_id } : {}),
121
+ };
122
+ }
123
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @atel-ai/runtime-core —— ATEL agent companion 内核。
3
+ *
4
+ * 公共 80%(做一次共用):两路入站(Spine 订阅 + relay 轮询)+ 无头唤醒(三类驱动)
5
+ * + 事件→角色→工具映射 + JWT 生命周期 + 失败自治 + 可观测。
6
+ * 适配器是专属 20% 的薄层。
7
+ *
8
+ * 只走 ATEL 公开面(MCP + Spine + relay),不 import platform internal、不连 DB、
9
+ * 不设 X-Internal-Secret(遵 START-HERE 三纪律)。
10
+ */
11
+ export * from './identity.js';
12
+ export * from './envelope.js';
13
+ export * from './client.js';
14
+ export * from './config.js';
15
+ export * from './auth.js';
16
+ export * from './events/types.js';
17
+ export * from './events/dedup.js';
18
+ export * from './events/roles.js';
19
+ export * from './events/mapping.js';
20
+ export * from './events/channel-relay.js';
21
+ export * from './events/channel-spine.js';
22
+ export * from './wakers/types.js';
23
+ export * from './wakers/cli.js';
24
+ export * from './wakers/daemon.js';
25
+ export * from './wakers/embedded.js';
26
+ export * from './queue.js';
27
+ export * from './tracker.js';
28
+ export * from './deadletter.js';
29
+ export * from './companion.js';
30
+ export * from './adapters/types.js';
31
+ export * from './adapters/registry.js';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAG9B,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAG1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAG1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @atel-ai/runtime-core —— ATEL agent companion 内核。
3
+ *
4
+ * 公共 80%(做一次共用):两路入站(Spine 订阅 + relay 轮询)+ 无头唤醒(三类驱动)
5
+ * + 事件→角色→工具映射 + JWT 生命周期 + 失败自治 + 可观测。
6
+ * 适配器是专属 20% 的薄层。
7
+ *
8
+ * 只走 ATEL 公开面(MCP + Spine + relay),不 import platform internal、不连 DB、
9
+ * 不设 X-Internal-Secret(遵 START-HERE 三纪律)。
10
+ */
11
+ // 身份 / 签名(自带最小签名,零外部前置)
12
+ export * from './identity.js';
13
+ export * from './envelope.js';
14
+ // HTTP 客户端(Spine 公开面 + relay)
15
+ export * from './client.js';
16
+ // 配置
17
+ export * from './config.js';
18
+ // 鉴权 / JWT 生命周期
19
+ export * from './auth.js';
20
+ // 事件
21
+ export * from './events/types.js';
22
+ export * from './events/dedup.js';
23
+ export * from './events/roles.js';
24
+ export * from './events/mapping.js';
25
+ export * from './events/channel-relay.js';
26
+ export * from './events/channel-spine.js';
27
+ // 唤醒器
28
+ export * from './wakers/types.js';
29
+ export * from './wakers/cli.js';
30
+ export * from './wakers/daemon.js';
31
+ export * from './wakers/embedded.js';
32
+ // 编排 / 队列 / 自治 / 可观测
33
+ export * from './queue.js';
34
+ export * from './tracker.js';
35
+ export * from './deadletter.js';
36
+ export * from './companion.js';
37
+ // 适配器
38
+ export * from './adapters/types.js';
39
+ export * from './adapters/registry.js';
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wBAAwB;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAE9B,8BAA8B;AAC9B,cAAc,aAAa,CAAC;AAE5B,KAAK;AACL,cAAc,aAAa,CAAC;AAE5B,gBAAgB;AAChB,cAAc,WAAW,CAAC;AAE1B,KAAK;AACL,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAE1C,MAAM;AACN,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAErC,qBAAqB;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,MAAM;AACN,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 按 key 串行队列 —— 同一订单的多事件串行推进,避免重复提交/竞态(6.5 §6-6);
3
+ * 不同订单并发(各自一条链)。agent 无状态,串行保证它每次看到的是最新单状态。
4
+ */
5
+ export declare class SerialQueue {
6
+ private chains;
7
+ /** 在 key 这条链上排队执行 task;返回 task 的结果。 */
8
+ run<T>(key: string, task: () => Promise<T>): Promise<T>;
9
+ /** 当前活跃链数量(用于诊断)。 */
10
+ get activeKeys(): number;
11
+ }
12
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAuC;IAErD,uCAAuC;IACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAevD,qBAAqB;IACrB,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF"}
package/dist/queue.js ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 按 key 串行队列 —— 同一订单的多事件串行推进,避免重复提交/竞态(6.5 §6-6);
3
+ * 不同订单并发(各自一条链)。agent 无状态,串行保证它每次看到的是最新单状态。
4
+ */
5
+ export class SerialQueue {
6
+ chains = new Map();
7
+ /** 在 key 这条链上排队执行 task;返回 task 的结果。 */
8
+ run(key, task) {
9
+ const prev = this.chains.get(key) ?? Promise.resolve();
10
+ const result = prev.then(task, task); // 不论前一个成败都接着跑
11
+ // 维护一条吞掉异常的尾链,供后续任务挂接
12
+ const tail = result.then(() => undefined, () => undefined);
13
+ this.chains.set(key, tail);
14
+ void tail.then(() => {
15
+ if (this.chains.get(key) === tail)
16
+ this.chains.delete(key);
17
+ });
18
+ return result;
19
+ }
20
+ /** 当前活跃链数量(用于诊断)。 */
21
+ get activeKeys() {
22
+ return this.chains.size;
23
+ }
24
+ }
25
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,uCAAuC;IACvC,GAAG,CAAI,GAAW,EAAE,IAAsB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc;QACpD,sBAAsB;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YAClB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;IACrB,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { CanonicalEvent } from './events/types.js';
2
+ export interface OrderState {
3
+ orderId: string;
4
+ firstSeenAt: number;
5
+ lastEventAt: number;
6
+ lastEvent: string;
7
+ rejectCount: number;
8
+ terminal: boolean;
9
+ /** 已触发过的自治动作,去重用 */
10
+ firedActions: string[];
11
+ }
12
+ export declare class OrderTracker {
13
+ private readonly filePath;
14
+ private orders;
15
+ constructor(filePath: string);
16
+ private load;
17
+ private save;
18
+ observe(orderId: string | undefined, type: CanonicalEvent): void;
19
+ /** 已超过 deadline 且仍非终态、且该动作没触发过的单。 */
20
+ staleOrders(deadlineMs: number, action: string): OrderState[];
21
+ /** 驳回达阈值且未触发过 dispute 提示的单。 */
22
+ rejectThresholdHits(threshold: number, action: string): OrderState[];
23
+ markFired(orderId: string, action: string): void;
24
+ get(orderId: string): OrderState | undefined;
25
+ all(): OrderState[];
26
+ }
27
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,MAAM,CAAkC;gBAEnB,QAAQ,EAAE,MAAM;IAI7C,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAchE,qCAAqC;IACrC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAO7D,+BAA+B;IAC/B,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAMpE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAShD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI5C,GAAG,IAAI,UAAU,EAAE;CAGpB"}