@bolloon/bolloon-agent 0.5.0 → 0.5.2

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 (121) hide show
  1. package/README.md +39 -0
  2. package/dist/agents/agent-lang.js +101 -0
  3. package/dist/agents/agent-manifest-protocol.js +4 -0
  4. package/dist/agents/execution-supervisor.js +87 -5
  5. package/dist/agents/gateway-group.js +44 -3
  6. package/dist/agents/model-policy.js +651 -0
  7. package/dist/agents/pi-sdk-tools.js +84 -33
  8. package/dist/agents/pi-sdk.js +184 -31
  9. package/dist/agents/run-store.js +53 -0
  10. package/dist/agents/task/task-runner.js +8 -1
  11. package/dist/agents/workflow-pivot-loop.js +22 -13
  12. package/dist/cli/clipboard.js +65 -0
  13. package/dist/cli/ink-app.js +145 -17
  14. package/dist/cli/log-gate.js +386 -0
  15. package/dist/cli/mention-data.js +2 -0
  16. package/dist/cli/model-selector.js +538 -0
  17. package/dist/cli/reply-hygiene.js +54 -0
  18. package/dist/cli/setup-wizard.js +686 -69
  19. package/dist/cli/startup-notice.js +160 -0
  20. package/dist/cli/stores.js +22 -1
  21. package/dist/cli/theme.js +49 -0
  22. package/dist/cli/tui-select.js +970 -0
  23. package/dist/cli-entry.js +125 -18
  24. package/dist/efficode/compress.js +78 -0
  25. package/dist/efficode/crc32.js +38 -0
  26. package/dist/efficode/did.js +66 -0
  27. package/dist/efficode/index.js +24 -0
  28. package/dist/efficode/lz77.js +170 -0
  29. package/dist/efficode/negotiate.js +187 -0
  30. package/dist/efficode/ops.js +87 -0
  31. package/dist/efficode/packet.js +271 -0
  32. package/dist/efficode/types.js +45 -0
  33. package/dist/electron-build/agents/agent-manifest-protocol.js +4 -0
  34. package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -1
  35. package/dist/electron-build/agents/execution-supervisor.js +86 -4
  36. package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
  37. package/dist/electron-build/agents/goal-store.js.map +1 -1
  38. package/dist/electron-build/agents/model-policy.js +706 -0
  39. package/dist/electron-build/agents/model-policy.js.map +1 -0
  40. package/dist/electron-build/agents/pi-sdk-tools.js +84 -33
  41. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
  42. package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
  43. package/dist/electron-build/agents/pi-sdk.js +185 -31
  44. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  45. package/dist/electron-build/agents/run-store.js +55 -1
  46. package/dist/electron-build/agents/run-store.js.map +1 -1
  47. package/dist/electron-build/agents/task/task-runner.js +8 -1
  48. package/dist/electron-build/agents/task/task-runner.js.map +1 -1
  49. package/dist/electron-build/agents/workflow-pivot-loop.js +22 -13
  50. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
  51. package/dist/electron-build/llm/config-store.js +146 -6
  52. package/dist/electron-build/llm/config-store.js.map +1 -1
  53. package/dist/electron-build/llm/connection-probe.js +764 -0
  54. package/dist/electron-build/llm/connection-probe.js.map +1 -0
  55. package/dist/electron-build/llm/custom-provider-store.js +272 -0
  56. package/dist/electron-build/llm/custom-provider-store.js.map +1 -0
  57. package/dist/electron-build/llm/data/provider-catalog-baked.js +23 -0
  58. package/dist/electron-build/llm/data/provider-catalog-baked.js.map +1 -0
  59. package/dist/electron-build/llm/model-catalog.js +778 -0
  60. package/dist/electron-build/llm/model-catalog.js.map +1 -0
  61. package/dist/electron-build/llm/model-discovery.js +1202 -0
  62. package/dist/electron-build/llm/model-discovery.js.map +1 -0
  63. package/dist/electron-build/llm/model-selection.js +1315 -0
  64. package/dist/electron-build/llm/model-selection.js.map +1 -0
  65. package/dist/electron-build/llm/pi-ai.js +751 -55
  66. package/dist/electron-build/llm/pi-ai.js.map +1 -1
  67. package/dist/electron-build/llm/provider-catalog.js +969 -0
  68. package/dist/electron-build/llm/provider-catalog.js.map +1 -0
  69. package/dist/electron-build/llm/provider-registry.js +950 -0
  70. package/dist/electron-build/llm/provider-registry.js.map +1 -0
  71. package/dist/electron-build/llm/tool-name.js +266 -0
  72. package/dist/electron-build/llm/tool-name.js.map +1 -0
  73. package/dist/electron-build/utils/dual-source-facts.js +236 -0
  74. package/dist/electron-build/utils/dual-source-facts.js.map +1 -0
  75. package/dist/electron-build/utils/dual-source.js +32 -156
  76. package/dist/electron-build/utils/dual-source.js.map +1 -1
  77. package/dist/electron-build/utils/update-manager.js +22 -72
  78. package/dist/electron-build/utils/update-manager.js.map +1 -1
  79. package/dist/electron-build/utils/update-state.js +2 -19
  80. package/dist/electron-build/utils/update-state.js.map +1 -1
  81. package/dist/electron-build/utils/version-identity.js +193 -0
  82. package/dist/electron-build/utils/version-identity.js.map +1 -0
  83. package/dist/electron-build/utils/version-info.js +47 -101
  84. package/dist/electron-build/utils/version-info.js.map +1 -1
  85. package/dist/index.js +282 -96
  86. package/dist/ios/bolloon-web.json +10 -0
  87. package/dist/ios/mobile-contacts.js +44 -11
  88. package/dist/ios/mobile-core.js +1723 -84
  89. package/dist/ios/mobile-tasks.js +339 -0
  90. package/dist/ios/mobile-update.js +1442 -0
  91. package/dist/ios/mobile.js +308 -35
  92. package/dist/ios/routes-llm-config.js +344 -52
  93. package/dist/ios/routes-mobile-tasks.js +353 -0
  94. package/dist/ios/server.js +163 -4
  95. package/dist/ios/sw.js +1 -1
  96. package/dist/llm/config-store.js +146 -6
  97. package/dist/llm/connection-probe.js +744 -0
  98. package/dist/llm/custom-provider-store.js +224 -0
  99. package/dist/llm/data/provider-catalog-baked.js +19 -0
  100. package/dist/llm/model-catalog.js +717 -0
  101. package/dist/llm/model-discovery.js +1137 -0
  102. package/dist/llm/model-selection.js +1241 -0
  103. package/dist/llm/pi-ai.js +732 -54
  104. package/dist/llm/provider-catalog.js +898 -0
  105. package/dist/llm/provider-registry.js +917 -0
  106. package/dist/llm/tool-name.js +220 -0
  107. package/dist/setup/onboard.js +34 -8
  108. package/dist/utils/dual-source-facts.js +223 -0
  109. package/dist/utils/dual-source.js +12 -141
  110. package/dist/utils/update-manager.js +16 -59
  111. package/dist/utils/update-state.js +6 -18
  112. package/dist/utils/version-identity.js +176 -0
  113. package/dist/utils/version-info.js +9 -78
  114. package/dist/web/bolloon-web.json +10 -0
  115. package/dist/web/mobile-core.js +1721 -84
  116. package/dist/web/mobile-update.js +1442 -0
  117. package/dist/web/mobile.js +372 -35
  118. package/dist/web/routes-llm-config.js +344 -52
  119. package/dist/web/sw.js +1 -1
  120. package/package.json +1 -1
  121. package/scripts/build-web.ts +36 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * efficode/negotiate - 智能体"用哪种语言交流"的声明与协商
3
+ *
4
+ * 三条硬规则 (照 leo 的要求):
5
+ * ① 只有**双方都声明** efficode 才用 Efficode;
6
+ * ② 单方声明 / 对端不支持 / 对端声明了本机不认识的字符串 ⇒ **明确回落自然语言**, 并记一笔;
7
+ * ③ 声明语言**不是** efficode 的载荷, **绝不去解析它** (不猜、不试解) ——
8
+ * `decodeFromPeer` 里那条 `EFFICODE_LANG_UNSUPPORTED` 就是这条的落地处。
9
+ *
10
+ * 记录: 每次裁决写 ~/.bolloon/efficode-lang.jsonl (只记语言名与原因, **不记正文/DID**)。
11
+ */
12
+ import * as fs from 'node:fs';
13
+ import * as os from 'node:os';
14
+ import * as path from 'node:path';
15
+ import { EfficodeError } from './types.js';
16
+ import { buildPacket, parsePacket } from './packet.js';
17
+ import { instructionsToSymbolic } from './ops.js';
18
+ export const AGENT_LANGS = ['natural', 'efficode'];
19
+ /** 把任意外来声明归一成两个已知值之一; 其他一律 null (= 未知语言, **不是** natural) */
20
+ export function normalizeLang(v) {
21
+ if (typeof v === 'string') {
22
+ const s = v.trim();
23
+ if (s === 'natural' || s === 'efficode')
24
+ return s;
25
+ return null;
26
+ }
27
+ if (Array.isArray(v)) {
28
+ // manifest 里的 supportedLangs 形态: 优先 efficode (更专的声明优先)
29
+ if (v.some((x) => x === 'efficode'))
30
+ return 'efficode';
31
+ if (v.some((x) => x === 'natural'))
32
+ return 'natural';
33
+ return null;
34
+ }
35
+ return null;
36
+ }
37
+ /** 声明里出现了哪些**本机不认识**的语言字符串 (用于如实标注, 不当成 natural) */
38
+ export function unknownLangNames(v) {
39
+ const arr = Array.isArray(v) ? v : v == null ? [] : [v];
40
+ return arr
41
+ .map((x) => (typeof x === 'string' ? x.trim() : ''))
42
+ .filter((s) => s && !AGENT_LANGS.includes(s));
43
+ }
44
+ /**
45
+ * 协商。`mine`/`theirs` 可以是 'natural' | 'efficode' | 字符串数组 | undefined | 任意外来值。
46
+ * 任何"不是恰好双方 efficode"的情形都落到 natural。
47
+ */
48
+ export function negotiateLang(mine, theirs) {
49
+ const m = normalizeLang(mine);
50
+ const t = normalizeLang(theirs);
51
+ const mUnknown = unknownLangNames(mine);
52
+ const tUnknown = unknownLangNames(theirs);
53
+ const declared = {
54
+ mine: Array.isArray(mine) ? mine.join('|') : mine == null ? null : String(mine),
55
+ theirs: Array.isArray(theirs) ? theirs.join('|') : theirs == null ? null : String(theirs),
56
+ };
57
+ const unknownSide = mUnknown.length && tUnknown.length ? 'both' : mUnknown.length ? 'mine' : tUnknown.length ? 'theirs' : null;
58
+ if (m === 'efficode' && t === 'efficode') {
59
+ return { lang: 'efficode', fallback: false, reason: '双方都声明 efficode', declared, unknownSide };
60
+ }
61
+ const wanted = m === 'efficode' || t === 'efficode';
62
+ let reason;
63
+ if (!m && !t) {
64
+ reason = unknownSide ? '双方都没有可识别的语言声明' : '双方都没声明语言';
65
+ }
66
+ else if (m === 'efficode') {
67
+ reason = unknownSide
68
+ ? `对端声明了本机不认识的语言 (${tUnknown.join(',')}) → 回落自然语言`
69
+ : '对端没声明 efficode → 回落自然语言';
70
+ }
71
+ else if (t === 'efficode') {
72
+ reason = '本机没声明 efficode → 回落自然语言';
73
+ }
74
+ else {
75
+ reason = unknownSide ? '声明里只有本机不认识的语言 → 回落自然语言' : '双方都只声明 natural';
76
+ }
77
+ return { lang: 'natural', fallback: wanted, reason, declared, unknownSide };
78
+ }
79
+ /**
80
+ * 出站: **双方都声明** efficode 才编码; 否则原文直发 (声明 natural)。
81
+ * 走的是文本模式 (整个包 Base64), 所以线上仍是可打印文本, 任何文本通道都能带。
82
+ *
83
+ * 指令构造 (照规范的前缀表达式): `@DID:<身份> <op> !SEND`
84
+ * —— 正文进**数据块**, 指令段只放"这是什么"。
85
+ */
86
+ export function encodeForPeer(opts) {
87
+ const decision = negotiateLang(opts.mine, opts.theirs);
88
+ if (decision.lang !== 'efficode') {
89
+ return { text: opts.text, lang: 'natural', decision, bytes: 0, note: decision.reason, symbolic: '' };
90
+ }
91
+ const instructions = [];
92
+ if (opts.from)
93
+ instructions.push({ op: '@DID:', value: opts.from });
94
+ instructions.push({ op: opts.op ?? '#DATA:', value: '' });
95
+ instructions.push({ op: '!SEND' });
96
+ const packed = buildPacket({
97
+ from: opts.from,
98
+ instructions,
99
+ data: opts.text,
100
+ mode: 'text',
101
+ compression: 'deflate',
102
+ });
103
+ return {
104
+ text: Buffer.from(packed).toString('base64'),
105
+ lang: 'efficode',
106
+ decision,
107
+ bytes: packed.length,
108
+ note: '',
109
+ symbolic: instructionsToSymbolic(instructions),
110
+ };
111
+ }
112
+ /**
113
+ * 入站:**严格**按对端声明的语言分派。
114
+ * - 声明 efficode 且本机也声明支持 → 真解包 (畸形/CRC 不符 → 抛, 不许"解一半");
115
+ * - 声明不是 efficode (含未知字符串) → 原样返回, **不进解码器**。
116
+ */
117
+ export function decodeFromPeer(opts) {
118
+ const raw = Array.isArray(opts.declaredLang)
119
+ ? opts.declaredLang.join('|')
120
+ : opts.declaredLang == null
121
+ ? null
122
+ : String(opts.declaredLang);
123
+ const declared = normalizeLang(opts.declaredLang);
124
+ const mineOk = normalizeLang(opts.mine) === 'efficode';
125
+ if (declared !== 'efficode') {
126
+ return {
127
+ text: opts.payload,
128
+ declaredLang: declared,
129
+ declaredRaw: raw,
130
+ decoded: false,
131
+ note: raw && declared === null
132
+ ? `对端声明的语言「${raw}」本机不认识 → 不解析, 原样呈现`
133
+ : '对端未声明 efficode → 原样呈现',
134
+ bytes: 0,
135
+ };
136
+ }
137
+ if (!mineOk) {
138
+ throw new EfficodeError('EFFICODE_LANG_UNSUPPORTED', '对端声明 efficode, 但本机未声明支持 → 拒绝解码 (不许硬解)');
139
+ }
140
+ const p = parsePacket(opts.payload);
141
+ return { text: p.data, declaredLang: declared, declaredRaw: raw, decoded: true, note: '', bytes: p.bytes };
142
+ }
143
+ /** 本机默认声明哪种语言 (没给 = natural; 声明不变量绝不会"猜"成 efficode) */
144
+ export function defaultDeclaredLang(env = process.env) {
145
+ const v = String(env.BOLLOON_EFFICODE_LANG ?? '').trim();
146
+ return normalizeLang(v) ?? 'natural';
147
+ }
148
+ // ============== 裁决记录 (只记语言与原因, 不记正文) ==============
149
+ export function langDecisionLogPath(env = process.env) {
150
+ const home = env.BOLLOON_HOME || path.join(os.homedir() || '/tmp', '.bolloon');
151
+ return path.join(home, 'efficode-lang.jsonl');
152
+ }
153
+ /** 记一笔 (失败绝不打断主路径 —— 记录是旁路) */
154
+ export function recordLangDecision(decision, meta) {
155
+ try {
156
+ const file = langDecisionLogPath();
157
+ fs.mkdirSync(path.dirname(file), { recursive: true });
158
+ const line = JSON.stringify({
159
+ ts: new Date().toISOString(),
160
+ channel: meta.channel,
161
+ peer: meta.peer ? String(meta.peer).slice(0, 64) : null,
162
+ lang: decision.lang,
163
+ fallback: decision.fallback,
164
+ reason: decision.reason,
165
+ unknownSide: decision.unknownSide,
166
+ declared: decision.declared,
167
+ });
168
+ fs.appendFileSync(file, line + '\n', 'utf-8');
169
+ return true;
170
+ }
171
+ catch {
172
+ return false;
173
+ }
174
+ }
175
+ /** 读回记录 (门用来断言"真记了一笔") */
176
+ export function readLangDecisionLog(env = process.env) {
177
+ try {
178
+ return fs
179
+ .readFileSync(langDecisionLogPath(env), 'utf-8')
180
+ .split('\n')
181
+ .filter(Boolean)
182
+ .map((l) => JSON.parse(l));
183
+ }
184
+ catch {
185
+ return [];
186
+ }
187
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * efficode/ops - 指令集 / 词典 (符号 ↔ 二进制操作码)
3
+ *
4
+ * 照 leo 的规范: 符号化指令集 + 前缀表达式。
5
+ * @DID: 身份 1 载荷 = 身份串
6
+ * #DATA: 数据 2 载荷 = 数据正文
7
+ * #REQ: 请求 3 载荷 = 请求内容
8
+ * !ACK 确认 4 无载荷
9
+ * !SEND 发送 5 无载荷
10
+ * !END 结束 6 无载荷
11
+ *
12
+ * 指令段二进制形状 (逐条): [1B opcode][varint payloadLen][payload UTF-8]
13
+ * 末尾**没有**隐式终止符 —— 靠 payloadLen 自描述; 少一个字节就报截断。
14
+ *
15
+ * 严格性: 任何不在表里的 opcode 一律抛 EFFICODE_UNKNOWN_OPCODE。
16
+ * (变异 M1 会把这里改成"宽容跳过", 门必须变红 —— 这就是那条断言存在的意义。)
17
+ */
18
+ import { EfficodeError } from './types.js';
19
+ export const OP_TABLE = [
20
+ { symbol: '@DID:', code: 1, hasPayload: true, prefix: '@DID:' },
21
+ { symbol: '#DATA:', code: 2, hasPayload: true, prefix: '#DATA:' },
22
+ { symbol: '#REQ:', code: 3, hasPayload: true, prefix: '#REQ:' },
23
+ { symbol: '!ACK', code: 4, hasPayload: false, prefix: '!ACK' },
24
+ { symbol: '!SEND', code: 5, hasPayload: false, prefix: '!SEND' },
25
+ { symbol: '!END', code: 6, hasPayload: false, prefix: '!END' },
26
+ ];
27
+ const BY_SYMBOL = new Map(OP_TABLE.map((d) => [d.symbol, d]));
28
+ const BY_CODE = new Map(OP_TABLE.map((d) => [d.code, d]));
29
+ export function opBySymbol(symbol) {
30
+ const d = BY_SYMBOL.get(symbol);
31
+ if (!d)
32
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `未知符号 ${String(symbol)}`);
33
+ return d;
34
+ }
35
+ /** 按 opcode 取定义; 未知一律抛 (不返回 undefined 让上层"随便处理") */
36
+ export function opByCode(code, offset = -1) {
37
+ const d = BY_CODE.get(code);
38
+ if (!d)
39
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `操作码 ${code} 不在指令表内`, offset);
40
+ return d;
41
+ }
42
+ export function isKnownOpCode(code) {
43
+ return BY_CODE.has(code);
44
+ }
45
+ /** 指令序列 → 前缀表达式文本 (调试/文本模式可读形态) */
46
+ export function instructionsToSymbolic(instructions) {
47
+ return instructions
48
+ .map((ins) => {
49
+ const def = opBySymbol(ins.op);
50
+ return def.hasPayload ? `${def.prefix}${ins.value ?? ''}` : def.prefix;
51
+ })
52
+ .join(' ');
53
+ }
54
+ /**
55
+ * 前缀表达式文本 → 指令序列。
56
+ *
57
+ * 解析规则 (写死, 免得被当成"随便切"):
58
+ * ① 按空白切词;
59
+ * ② 词首是 sigil 字符 (@ / # / !) → 必须匹配一条**已知**前缀, 否则抛 UNKNOWN_OPCODE;
60
+ * ③ 不带 sigil 的词 → 追加到**上一条**指令的载荷后面 (没有上一条 → 抛);
61
+ * ④ 控制指令 (!ACK/!SEND/!END) 后面不许跟载荷。
62
+ */
63
+ export function symbolicToInstructions(text) {
64
+ const out = [];
65
+ const words = String(text || '').trim().split(/\s+/).filter(Boolean);
66
+ for (const token of words) {
67
+ const isSigil = /^[@#!]/.test(token);
68
+ if (!isSigil) {
69
+ const last = out[out.length - 1];
70
+ if (!last || !opBySymbol(last.op).hasPayload) {
71
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `前缀表达式含未知指令: ${token.slice(0, 24)}`);
72
+ }
73
+ last.value = `${last.value ?? ''} ${token}`.trim();
74
+ continue;
75
+ }
76
+ const def = OP_TABLE.find((d) => token.startsWith(d.prefix));
77
+ if (!def)
78
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `前缀表达式含未知指令: ${token.slice(0, 24)}`);
79
+ if (def.hasPayload)
80
+ out.push({ op: def.symbol, value: token.slice(def.prefix.length) });
81
+ else if (token === def.prefix)
82
+ out.push({ op: def.symbol });
83
+ else
84
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.prefix} 不接受载荷: ${token.slice(0, 24)}`);
85
+ }
86
+ return out;
87
+ }
@@ -0,0 +1,271 @@
1
+ /**
2
+ * efficode/packet - 包封装 (帧结构 + CRC32 尾段 + 严格解析)
3
+ *
4
+ * 布局 (照规范):
5
+ * [Header 2B] | [DID 验证段 32B] | [指令段 动态] | [数据块 动态] | [CRC32 4B]
6
+ *
7
+ * Header 2B:
8
+ * byte0: version(高 4 位) | mode(低 4 位) mode: 0=compact · 1=text
9
+ * byte1: flags bit0=有 DID 段 · bit1=有指令段 · bit2=有数据块
10
+ * bit3=数据块已压缩 · bit4..7=保留 (必须 0)
11
+ *
12
+ * 指令段: [varint opLen][opBytes] opBytes 见 ops.ts 的逐条形状
13
+ * 数据块: [varint dataLen][dataBytes] dataBytes[0] = 压缩算法 id (见 compress.ts)
14
+ *
15
+ * 两条硬纪律 (变异 M1/M2 就是拆这两条, 门必须变红):
16
+ * ① 解析必须**逐段自描述**: 长度对不上就报截断, 不许"能解多少解多少";
17
+ * ② 尾段 CRC32 覆盖 CRC 之前的**全部**字节, 对不上就报 CRC_MISMATCH,
18
+ * 绝不放行"内容看着像就收下"。
19
+ *
20
+ * 诚实边界:
21
+ * - "DID 段 32B" 在规范里是固定段; 参考实现允许省略 (省 32B), 省略时 flags 如实写 0,
22
+ * 解码端按 flags 解, **不假设**段存在;
23
+ * - CRC32 只防传输损坏, **不是**防篡改 (无密钥)。防篡改要真签名 —— 规范中, 见 did.ts 注释。
24
+ */
25
+ import { crc32Bytes, readCrc32Bytes, crc32 } from './crc32.js';
26
+ import { DID_SEGMENT_BYTES, EfficodeError, EFFICODE_VERSION, CRC_BYTES, MIN_PACKET_BYTES } from './types.js';
27
+ import { compressBlock, decompressBlock, pickAlgo } from './compress.js';
28
+ import { decodeDidSegment, didDigestString, encodeDidSegment } from './did.js';
29
+ import { instructionsToSymbolic, opByCode, opBySymbol, symbolicToInstructions } from './ops.js';
30
+ const MODE_TO_NUM = { compact: 0, text: 1 };
31
+ const NUM_TO_MODE = { 0: 'compact', 1: 'text' };
32
+ const F_HAS_DID = 1 << 0;
33
+ const F_HAS_OP = 1 << 1;
34
+ const F_HAS_DATA = 1 << 2;
35
+ const F_COMPRESSED = 1 << 3;
36
+ const FLAG_RESERVED = 0xf0;
37
+ function writeVarint(out, n) {
38
+ let v = n >>> 0;
39
+ while (v >= 0x80) {
40
+ out.push((v & 0x7f) | 0x80);
41
+ v >>>= 7;
42
+ }
43
+ out.push(v & 0xff);
44
+ }
45
+ function readVarint(buf, pos) {
46
+ let value = 0;
47
+ let shift = 0;
48
+ let i = pos;
49
+ for (;;) {
50
+ if (i >= buf.length)
51
+ throw new EfficodeError('EFFICODE_TRUNCATED', 'varint 未读完就到底', i);
52
+ const b = buf[i++];
53
+ value |= (b & 0x7f) << shift;
54
+ if ((b & 0x80) === 0)
55
+ break;
56
+ shift += 7;
57
+ if (shift > 28)
58
+ throw new EfficodeError('EFFICODE_TRUNCATED', 'varint 超过 32 位上限', i);
59
+ }
60
+ return { value: value >>> 0, next: i };
61
+ }
62
+ /** 指令序列 → 指令段字节 (不含外层 varint 长度) */
63
+ function encodeInstructions(instructions) {
64
+ const out = [];
65
+ for (const ins of instructions) {
66
+ const def = opBySymbol(ins.op);
67
+ out.push(def.code);
68
+ const payload = def.hasPayload ? Buffer.from(String(ins.value ?? ''), 'utf-8') : Buffer.alloc(0);
69
+ if (!def.hasPayload && (ins.value ?? '') !== '') {
70
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.symbol} 不接受载荷`);
71
+ }
72
+ writeVarint(out, payload.length);
73
+ for (const b of payload)
74
+ out.push(b);
75
+ }
76
+ return Uint8Array.from(out);
77
+ }
78
+ /** 指令段字节 → 指令序列 (严格: 未知 opcode / 截断都抛) */
79
+ function decodeInstructions(buf) {
80
+ const out = [];
81
+ let pos = 0;
82
+ while (pos < buf.length) {
83
+ const code = buf[pos];
84
+ const def = opByCode(code, pos); // 未知 opcode → 抛 (变异 M1 拆掉这里 → 门变红)
85
+ pos += 1;
86
+ const len = readVarint(buf, pos);
87
+ pos = len.next;
88
+ if (def.hasPayload) {
89
+ if (pos + len.value > buf.length) {
90
+ throw new EfficodeError('EFFICODE_TRUNCATED', `指令 ${def.symbol} 声明 ${len.value}B 载荷但只剩 ${buf.length - pos}B`, pos);
91
+ }
92
+ out.push({ op: def.symbol, value: Buffer.from(buf.subarray(pos, pos + len.value)).toString('utf-8') });
93
+ pos += len.value;
94
+ }
95
+ else {
96
+ if (len.value !== 0) {
97
+ throw new EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.symbol} 声明了 ${len.value}B 载荷`, pos);
98
+ }
99
+ out.push({ op: def.symbol });
100
+ }
101
+ }
102
+ return out;
103
+ }
104
+ /** 打包 (总是产出二进制; mode 记在 header 里) */
105
+ export function buildPacket(msg) {
106
+ const mode = msg.mode ?? 'compact';
107
+ if (!(mode in MODE_TO_NUM)) {
108
+ // 语音/声波模式等未实现模式 = 显式拒绝, 不静默降级
109
+ throw new EfficodeError('EFFICODE_MODE_NOT_IMPLEMENTED', `模式 ${String(mode)} 未实现 (只有 compact/text)`);
110
+ }
111
+ const instructions = msg.instructions ?? [];
112
+ if (!instructions.length)
113
+ throw new EfficodeError('EFFICODE_BAD_FLAGS', '指令段不能为空 (至少一条指令)');
114
+ const hasDid = typeof msg.from === 'string' && msg.from.length > 0;
115
+ const didSeg = hasDid ? encodeDidSegment(msg.from) : null;
116
+ if (didSeg && didSeg.length !== DID_SEGMENT_BYTES) {
117
+ throw new EfficodeError('EFFICODE_DID_SEGMENT_BAD', `DID 段长度异常 ${didSeg.length}B`);
118
+ }
119
+ const opBytes = encodeInstructions(instructions);
120
+ const rawData = Buffer.from(msg.data ?? '', 'utf-8');
121
+ const algo = msg.compression ?? pickAlgo(new Uint8Array(rawData));
122
+ const dataBlock = rawData.length > 0 ? compressBlock(new Uint8Array(rawData), algo) : new Uint8Array(0);
123
+ let flags = F_HAS_OP;
124
+ if (didSeg)
125
+ flags |= F_HAS_DID;
126
+ if (dataBlock.length > 0)
127
+ flags |= F_HAS_DATA;
128
+ if (dataBlock.length > 0 && algo !== 'none')
129
+ flags |= F_COMPRESSED;
130
+ const out = [];
131
+ out.push(((EFFICODE_VERSION & 0xf) << 4) | (MODE_TO_NUM[mode] & 0xf));
132
+ out.push(flags);
133
+ if (didSeg)
134
+ for (const b of didSeg)
135
+ out.push(b);
136
+ writeVarint(out, opBytes.length);
137
+ for (const b of opBytes)
138
+ out.push(b);
139
+ if (dataBlock.length > 0) {
140
+ writeVarint(out, dataBlock.length);
141
+ for (const b of dataBlock)
142
+ out.push(b);
143
+ }
144
+ const head = Uint8Array.from(out);
145
+ const crc = crc32Bytes(head);
146
+ const packet = new Uint8Array(head.length + CRC_BYTES);
147
+ packet.set(head, 0);
148
+ packet.set(crc, head.length);
149
+ return packet;
150
+ }
151
+ /** 编码成要上网的形态: text 模式 → Base64 串; compact 模式 → 二进制 */
152
+ export function encodePacket(msg) {
153
+ const packet = buildPacket(msg);
154
+ const mode = msg.mode ?? 'compact';
155
+ return mode === 'text' ? Buffer.from(packet).toString('base64') : packet;
156
+ }
157
+ /** 解析 (严格)。入参可以是二进制包或 text 模式的 Base64 串 */
158
+ export function parsePacket(input) {
159
+ let mode;
160
+ let buf;
161
+ if (typeof input === 'string') {
162
+ mode = 'text';
163
+ const cleaned = input.trim();
164
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(cleaned) || cleaned.length % 4 !== 0) {
165
+ throw new EfficodeError('EFFICODE_BAD_BASE64', '文本模式载荷不是合法 Base64');
166
+ }
167
+ buf = new Uint8Array(Buffer.from(cleaned, 'base64'));
168
+ if (buf.length === 0)
169
+ throw new EfficodeError('EFFICODE_BAD_BASE64', 'Base64 解出 0 字节');
170
+ }
171
+ else {
172
+ mode = 'compact';
173
+ buf = input;
174
+ }
175
+ if (buf.length < MIN_PACKET_BYTES) {
176
+ throw new EfficodeError('EFFICODE_TOO_SHORT', `包 ${buf.length}B < 最短合法 ${MIN_PACKET_BYTES}B`);
177
+ }
178
+ const version = (buf[0] >> 4) & 0xf;
179
+ if (version !== EFFICODE_VERSION) {
180
+ throw new EfficodeError('EFFICODE_BAD_VERSION', `包版本 ${version} 不被支持 (本实现只认 ${EFFICODE_VERSION})`, 0);
181
+ }
182
+ const modeNum = buf[0] & 0xf;
183
+ const declaredMode = NUM_TO_MODE[modeNum];
184
+ if (!declaredMode)
185
+ throw new EfficodeError('EFFICODE_BAD_MODE', `未知模式 id=${modeNum}`, 0);
186
+ if (declaredMode !== mode) {
187
+ throw new EfficodeError('EFFICODE_BAD_MODE', `传输形态(${mode})与包头声明(${declaredMode})不一致`, 0);
188
+ }
189
+ const flags = buf[1];
190
+ if ((flags & FLAG_RESERVED) !== 0) {
191
+ throw new EfficodeError('EFFICODE_BAD_FLAGS', `flags 保留位被置位: 0x${flags.toString(16)}`, 1);
192
+ }
193
+ let pos = 2;
194
+ let didDigest = null;
195
+ let didSegmentHex = null;
196
+ if (flags & F_HAS_DID) {
197
+ if (pos + DID_SEGMENT_BYTES > buf.length) {
198
+ throw new EfficodeError('EFFICODE_TRUNCATED', `声明有 DID 段但只剩 ${buf.length - pos}B`, pos);
199
+ }
200
+ const seg = buf.subarray(pos, pos + DID_SEGMENT_BYTES);
201
+ const parsed = decodeDidSegment(seg); // algo 未知 → 抛
202
+ didDigest = didDigestString(parsed);
203
+ didSegmentHex = Buffer.from(seg).toString('hex');
204
+ pos += DID_SEGMENT_BYTES;
205
+ }
206
+ let instructions = [];
207
+ if (flags & F_HAS_OP) {
208
+ const opLen = readVarint(buf, pos);
209
+ pos = opLen.next;
210
+ if (pos + opLen.value > buf.length) {
211
+ throw new EfficodeError('EFFICODE_TRUNCATED', `指令段声明 ${opLen.value}B 但只剩 ${buf.length - pos}B`, pos);
212
+ }
213
+ instructions = decodeInstructions(buf.subarray(pos, pos + opLen.value));
214
+ pos += opLen.value;
215
+ }
216
+ else {
217
+ throw new EfficodeError('EFFICODE_BAD_FLAGS', 'flags 声明无指令段 —— 本实现不接受无指令的包', 1);
218
+ }
219
+ let data = '';
220
+ let compression = 'none';
221
+ let rawDataBytes = 0;
222
+ if (flags & F_HAS_DATA) {
223
+ const dataLen = readVarint(buf, pos);
224
+ pos = dataLen.next;
225
+ if (pos + dataLen.value > buf.length) {
226
+ throw new EfficodeError('EFFICODE_TRUNCATED', `数据块声明 ${dataLen.value}B 但只剩 ${buf.length - pos}B`, pos);
227
+ }
228
+ const block = buf.subarray(pos, pos + dataLen.value);
229
+ const un = decompressBlock(block);
230
+ compression = un.algo;
231
+ rawDataBytes = un.data.length;
232
+ data = Buffer.from(un.data).toString('utf-8');
233
+ pos += dataLen.value;
234
+ }
235
+ const expectCrcAt = buf.length - CRC_BYTES;
236
+ if (pos !== expectCrcAt) {
237
+ throw new EfficodeError('EFFICODE_TRAILING_BYTES', `解析在 ${pos}B 结束, 但 CRC 段在 ${expectCrcAt}B —— 中间有 ${expectCrcAt - pos}B 垃圾`, pos);
238
+ }
239
+ const head = buf.subarray(0, expectCrcAt);
240
+ const want = readCrc32Bytes(buf, expectCrcAt);
241
+ const got = crc32(head);
242
+ if (want !== got) {
243
+ throw new EfficodeError('EFFICODE_CRC_MISMATCH', `CRC32 不符: 包内 0x${want.toString(16)}, 实算 0x${got.toString(16)}`, expectCrcAt);
244
+ }
245
+ return {
246
+ mode: declaredMode,
247
+ didDigest,
248
+ didSegmentHex,
249
+ instructions,
250
+ data,
251
+ compression,
252
+ bytes: buf.length,
253
+ rawDataBytes,
254
+ };
255
+ }
256
+ /** 便捷: 包 → 语义消息 (保留符号化形态, 供文本模式/调试面读取) */
257
+ export function packetToMessage(input) {
258
+ const p = parsePacket(input);
259
+ return {
260
+ instructions: p.instructions,
261
+ data: p.data || undefined,
262
+ mode: p.mode,
263
+ compression: p.compression,
264
+ bytes: p.bytes,
265
+ symbolic: instructionsToSymbolic(p.instructions),
266
+ };
267
+ }
268
+ /** 从符号化文本造一条消息 (调试/文本模式入口) */
269
+ export function messageFromSymbolic(text, data) {
270
+ return { instructions: symbolicToInstructions(text), data, mode: 'compact' };
271
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * efficode/types - Efficode 参考实现的公共类型
3
+ *
4
+ * 设计口径 (照 leo 给的规范, 不自行发明新协议):
5
+ * - 符号化指令集 + 前缀表达式: @DID: 身份 · #DATA: 数据 · #REQ: 请求 · !ACK/!SEND/!END 控制
6
+ * - 两种模式: 文本模式 (调试/低带宽, 可 Base64) 与 二进制模式 (默认, 高密度)
7
+ * - 自解压数据块: 数据块自带轻量解码规则 (压缩算法 id + 原始长度), 接收方按规则直接展开
8
+ * - 包结构: [Header 2B] | [DID 验证段 32B] | [指令段 动态] | [数据块 动态] | [CRC32 4B]
9
+ *
10
+ * 诚实标注 (都写进 docs/wiki/efficode.md, 不在这里当已验证结论):
11
+ * - 本文件是**参考实现**: 能真编真解、逐字节回环、畸形包报错;
12
+ * - 语音/声波模式 (ggwave 类) **未实现** —— 只留 `mode` 枚举里的保留位, 编码时显式拒绝;
13
+ * - 链上签名验证 / ECC 临时会话密钥 **规范中** —— 本实现只做 DID 摘要段, 不做签名;
14
+ * - 压缩率/信息密度这类宣传数字一律按**实测**写, 见 scripts/verify-efficode.ts 的真测输出。
15
+ */
16
+ export const COMPRESSION_IDS = {
17
+ none: 0,
18
+ lz77: 1,
19
+ deflate: 2,
20
+ };
21
+ export const COMPRESSION_BY_ID = {
22
+ 0: 'none',
23
+ 1: 'lz77',
24
+ 2: 'deflate',
25
+ };
26
+ /** 包版本 (Header 高 4 位) */
27
+ export const EFFICODE_VERSION = 1;
28
+ /** DID 段固定长度 (字节) —— 照规范: 32B */
29
+ export const DID_SEGMENT_BYTES = 32;
30
+ /** CRC32 尾段固定长度 (字节) */
31
+ export const CRC_BYTES = 4;
32
+ /** 最短合法包 = Header 2 + 无 DID 段 + 指令段最少 (varint 长度 1 + 一条控制指令 2) + 无数据块 + CRC 4 = 9B
33
+ * (DID 段 32B 是**可选**省略的, 所以不放进来; 带 DID 的包应 ≥ 41B, 由 flags 驱动逐段校验而不是靠这个下限) */
34
+ export const MIN_PACKET_BYTES = 2 + 1 + 2 + CRC_BYTES;
35
+ export class EfficodeError extends Error {
36
+ code;
37
+ /** 出错位置 (字节偏移); 拿不到时为 -1 */
38
+ offset;
39
+ constructor(code, message, offset = -1) {
40
+ super(`${code}: ${message}${offset >= 0 ? ` (offset=${offset})` : ''}`);
41
+ this.name = 'EfficodeError';
42
+ this.code = code;
43
+ this.offset = offset;
44
+ }
45
+ }
@@ -104,6 +104,10 @@ function setLocalManifest(m) {
104
104
  localManifest.exportments = [];
105
105
  if (!('sciences' in m))
106
106
  localManifest.sciences = [];
107
+ // 2026-09-28: 交流语言声明同规矩 —— 不给就显式清空, 免得旧的 efficode 声明在对端已经不支持时还留着.
108
+ // (老 manifest 语义不变: 没有 supportedLangs = 没声明 = 自然语言)
109
+ if (!('supportedLangs' in m))
110
+ localManifest.supportedLangs = [];
107
111
  // 2026-09-18: 网络脉冲 (只记公开统计; 不落 DID/正文; 统计失败绝不影响主路径)
108
112
  try {
109
113
  const did = String(localManifest.ownerPublicKey || '');
@@ -1 +1 @@
1
- {"version":3,"file":"agent-manifest-protocol.js","sourceRoot":"","sources":["../../../src/agents/agent-manifest-protocol.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DH,oCAAoC;AACpC;IACE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,8BAAqC,QAAuB;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,mCAA0C,IAMzC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,4BAAmC,IAMlC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,oCAAoC;AACpC,oBAA2B,IAAY;IACrC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACzD,CAAC;AAED,qDAAqD;AACrD,MAAM,aAAa,GAAkB;IACnC,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,CAAC;CACf,CAAC;AAEF,0BAAiC,CAAyB;IACxD,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,yDAAyD;IACzD,sCAAsC;IACtC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QAAE,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC;IAChD,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;QAAE,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;IACtD,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;QAAE,aAAa,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1D,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;QAAE,aAAa,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpD,oDAAoD;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC;QAC1C,KAAK,kDAAO,oBAAoB,IAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAClD,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACvG,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;oBACvC,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;IACE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,uBAA8B,KAAyB;IACrD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACrE,IAAI,GAAG,IAAI,CAAC;QAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;;QAC3C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,8FAA8F;AAC9F,oDAAoD;AAEpD,uBAA8B,CAAgB;IAC5C,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,GAAG,IAAI,CAAC;QAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;QAC5E,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,0BAAiC,CAAmB;IAClD,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,CAAC;IACxD,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IACpF,IAAI,GAAG,IAAI,CAAC;QAAE,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;QAClF,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,4BAAmC,CAAqB;IACtD,aAAa,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5D,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,IAAI,GAAG,IAAI,CAAC;QAAE,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;QACtF,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,yBAAgC,CAAkB;IAChD,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,GAAG,IAAI,CAAC;QAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;QAChF,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,+CAA+C;AAC/C,MAAM,eAAe,GAA+B,IAAI,GAAG,EAAE,CAAC,CAAE,uBAAuB;AAEvF,6BAAoC,CAAgB;IAClD,IAAI,CAAC,CAAC,cAAc;QAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC/D,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QAC3C,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,kDAAO,oBAAoB,IAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClD,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;wBACvC,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrG,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC;AACX,CAAC;AAED;IACE,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,mBAA0B,UAAkB,EAAE,cAAuB;IACnE,MAAM,MAAM,GAAG,cAAc;QAC3B,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAoB;QAC1E,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QACjG,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"agent-manifest-protocol.js","sourceRoot":"","sources":["../../../src/agents/agent-manifest-protocol.ts"],"names":[],"mappings":"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"}