@bolloon/bolloon-agent 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -111
- package/dist/agents/gateway-group.js +231 -6
- package/dist/agents/group-autopilot.js +256 -0
- package/dist/agents/pi-sdk-tools.js +302 -0
- package/dist/agents/pi-sdk.js +89 -140
- package/dist/agents/task-group.js +21 -4
- package/dist/cli/log-gate.js +68 -4
- package/dist/cli/mention-data.js +1 -1
- package/dist/cli/model-selector.js +84 -104
- package/dist/cli/setup-wizard.js +2 -10
- package/dist/cli/tui-select.js +99 -10
- package/dist/cli-entry.js +1 -9
- package/dist/electron-build/agents/gateway-group.js +814 -0
- package/dist/electron-build/agents/gateway-group.js.map +1 -0
- package/dist/electron-build/agents/group-autopilot.js +302 -0
- package/dist/electron-build/agents/group-autopilot.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-tools.js +302 -0
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +88 -139
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/task-group.js +601 -0
- package/dist/electron-build/agents/task-group.js.map +1 -0
- package/dist/electron-build/agents/task-public-text.js +97 -0
- package/dist/electron-build/agents/task-public-text.js.map +1 -0
- package/dist/electron-build/efficode/compress.js +86 -0
- package/dist/electron-build/efficode/compress.js.map +1 -0
- package/dist/electron-build/efficode/crc32.js +44 -0
- package/dist/electron-build/efficode/crc32.js.map +1 -0
- package/dist/electron-build/efficode/did.js +74 -0
- package/dist/electron-build/efficode/did.js.map +1 -0
- package/dist/electron-build/efficode/lz77.js +175 -0
- package/dist/electron-build/efficode/lz77.js.map +1 -0
- package/dist/electron-build/efficode/negotiate.js +233 -0
- package/dist/electron-build/efficode/negotiate.js.map +1 -0
- package/dist/electron-build/efficode/ops.js +96 -0
- package/dist/electron-build/efficode/ops.js.map +1 -0
- package/dist/electron-build/efficode/packet.js +279 -0
- package/dist/electron-build/efficode/packet.js.map +1 -0
- package/dist/electron-build/efficode/types.js +50 -0
- package/dist/electron-build/efficode/types.js.map +1 -0
- package/dist/electron-build/kernel/code-write-gate.js +55 -0
- package/dist/electron-build/kernel/code-write-gate.js.map +1 -0
- package/dist/electron-build/kernel/run-lifecycle.js +23 -0
- package/dist/electron-build/kernel/run-lifecycle.js.map +1 -1
- package/dist/electron-build/kernel/run-resume.js +62 -0
- package/dist/electron-build/kernel/run-resume.js.map +1 -0
- package/dist/electron-build/kernel/session-lifecycle.js +223 -0
- package/dist/electron-build/kernel/session-lifecycle.js.map +1 -0
- package/dist/electron-build/kernel/turn-selfcheck.js +65 -0
- package/dist/electron-build/kernel/turn-selfcheck.js.map +1 -0
- package/dist/electron-build/llm/config-store.js +2 -2
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/model-selection.js +16 -2
- package/dist/electron-build/llm/model-selection.js.map +1 -1
- package/dist/electron-build/llm/pi-ai.js +2 -2
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/orbitdb/cid-database.js +98 -19
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
- package/dist/electron-build/orbitdb/group-access.js +399 -0
- package/dist/electron-build/orbitdb/group-access.js.map +1 -0
- package/dist/index.js +143 -10
- package/dist/ios/bolloon-web.json +3 -3
- package/dist/ios/sw.js +1 -1
- package/dist/kernel/code-write-gate.js +47 -0
- package/dist/kernel/gate-scan.js +5 -1
- package/dist/kernel/plan-harness.js +3 -2
- package/dist/kernel/roster.js +6 -6
- package/dist/kernel/run-lifecycle.js +21 -0
- package/dist/kernel/run-resume.js +58 -0
- package/dist/kernel/session-lifecycle.js +210 -0
- package/dist/kernel/turn-selfcheck.js +60 -0
- package/dist/llm/config-store.js +2 -2
- package/dist/llm/model-selection.js +16 -2
- package/dist/llm/pi-ai.js +2 -2
- package/dist/orbitdb/cid-database.js +95 -19
- package/dist/web/bolloon-web.json +3 -3
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* efficode/negotiate - 智能体"用哪种语言交流"的声明与协商
|
|
4
|
+
*
|
|
5
|
+
* 三条硬规则 (照 leo 的要求):
|
|
6
|
+
* ① 只有**双方都声明** efficode 才用 Efficode;
|
|
7
|
+
* ② 单方声明 / 对端不支持 / 对端声明了本机不认识的字符串 ⇒ **明确回落自然语言**, 并记一笔;
|
|
8
|
+
* ③ 声明语言**不是** efficode 的载荷, **绝不去解析它** (不猜、不试解) ——
|
|
9
|
+
* `decodeFromPeer` 里那条 `EFFICODE_LANG_UNSUPPORTED` 就是这条的落地处。
|
|
10
|
+
*
|
|
11
|
+
* 记录: 每次裁决写 ~/.bolloon/efficode-lang.jsonl (只记语言名与原因, **不记正文/DID**)。
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.AGENT_LANGS = void 0;
|
|
48
|
+
exports.normalizeLang = normalizeLang;
|
|
49
|
+
exports.unknownLangNames = unknownLangNames;
|
|
50
|
+
exports.negotiateLang = negotiateLang;
|
|
51
|
+
exports.encodeForPeer = encodeForPeer;
|
|
52
|
+
exports.decodeFromPeer = decodeFromPeer;
|
|
53
|
+
exports.defaultDeclaredLang = defaultDeclaredLang;
|
|
54
|
+
exports.langDecisionLogPath = langDecisionLogPath;
|
|
55
|
+
exports.recordLangDecision = recordLangDecision;
|
|
56
|
+
exports.readLangDecisionLog = readLangDecisionLog;
|
|
57
|
+
const fs = __importStar(require("node:fs"));
|
|
58
|
+
const os = __importStar(require("node:os"));
|
|
59
|
+
const path = __importStar(require("node:path"));
|
|
60
|
+
const types_js_1 = require("./types.js");
|
|
61
|
+
const packet_js_1 = require("./packet.js");
|
|
62
|
+
const ops_js_1 = require("./ops.js");
|
|
63
|
+
exports.AGENT_LANGS = ['natural', 'efficode'];
|
|
64
|
+
/** 把任意外来声明归一成两个已知值之一; 其他一律 null (= 未知语言, **不是** natural) */
|
|
65
|
+
function normalizeLang(v) {
|
|
66
|
+
if (typeof v === 'string') {
|
|
67
|
+
const s = v.trim();
|
|
68
|
+
if (s === 'natural' || s === 'efficode')
|
|
69
|
+
return s;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(v)) {
|
|
73
|
+
// manifest 里的 supportedLangs 形态: 优先 efficode (更专的声明优先)
|
|
74
|
+
if (v.some((x) => x === 'efficode'))
|
|
75
|
+
return 'efficode';
|
|
76
|
+
if (v.some((x) => x === 'natural'))
|
|
77
|
+
return 'natural';
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** 声明里出现了哪些**本机不认识**的语言字符串 (用于如实标注, 不当成 natural) */
|
|
83
|
+
function unknownLangNames(v) {
|
|
84
|
+
const arr = Array.isArray(v) ? v : v == null ? [] : [v];
|
|
85
|
+
return arr
|
|
86
|
+
.map((x) => (typeof x === 'string' ? x.trim() : ''))
|
|
87
|
+
.filter((s) => s && !exports.AGENT_LANGS.includes(s));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 协商。`mine`/`theirs` 可以是 'natural' | 'efficode' | 字符串数组 | undefined | 任意外来值。
|
|
91
|
+
* 任何"不是恰好双方 efficode"的情形都落到 natural。
|
|
92
|
+
*/
|
|
93
|
+
function negotiateLang(mine, theirs) {
|
|
94
|
+
const m = normalizeLang(mine);
|
|
95
|
+
const t = normalizeLang(theirs);
|
|
96
|
+
const mUnknown = unknownLangNames(mine);
|
|
97
|
+
const tUnknown = unknownLangNames(theirs);
|
|
98
|
+
const declared = {
|
|
99
|
+
mine: Array.isArray(mine) ? mine.join('|') : mine == null ? null : String(mine),
|
|
100
|
+
theirs: Array.isArray(theirs) ? theirs.join('|') : theirs == null ? null : String(theirs),
|
|
101
|
+
};
|
|
102
|
+
const unknownSide = mUnknown.length && tUnknown.length ? 'both' : mUnknown.length ? 'mine' : tUnknown.length ? 'theirs' : null;
|
|
103
|
+
if (m === 'efficode' && t === 'efficode') {
|
|
104
|
+
return { lang: 'efficode', fallback: false, reason: '双方都声明 efficode', declared, unknownSide };
|
|
105
|
+
}
|
|
106
|
+
const wanted = m === 'efficode' || t === 'efficode';
|
|
107
|
+
let reason;
|
|
108
|
+
if (!m && !t) {
|
|
109
|
+
reason = unknownSide ? '双方都没有可识别的语言声明' : '双方都没声明语言';
|
|
110
|
+
}
|
|
111
|
+
else if (m === 'efficode') {
|
|
112
|
+
reason = unknownSide
|
|
113
|
+
? `对端声明了本机不认识的语言 (${tUnknown.join(',')}) → 回落自然语言`
|
|
114
|
+
: '对端没声明 efficode → 回落自然语言';
|
|
115
|
+
}
|
|
116
|
+
else if (t === 'efficode') {
|
|
117
|
+
reason = '本机没声明 efficode → 回落自然语言';
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
reason = unknownSide ? '声明里只有本机不认识的语言 → 回落自然语言' : '双方都只声明 natural';
|
|
121
|
+
}
|
|
122
|
+
return { lang: 'natural', fallback: wanted, reason, declared, unknownSide };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 出站: **双方都声明** efficode 才编码; 否则原文直发 (声明 natural)。
|
|
126
|
+
* 走的是文本模式 (整个包 Base64), 所以线上仍是可打印文本, 任何文本通道都能带。
|
|
127
|
+
*
|
|
128
|
+
* 指令构造 (照规范的前缀表达式): `@DID:<身份> <op> !SEND`
|
|
129
|
+
* —— 正文进**数据块**, 指令段只放"这是什么"。
|
|
130
|
+
*/
|
|
131
|
+
function encodeForPeer(opts) {
|
|
132
|
+
const decision = negotiateLang(opts.mine, opts.theirs);
|
|
133
|
+
if (decision.lang !== 'efficode') {
|
|
134
|
+
return { text: opts.text, lang: 'natural', decision, bytes: 0, note: decision.reason, symbolic: '' };
|
|
135
|
+
}
|
|
136
|
+
const instructions = [];
|
|
137
|
+
if (opts.from)
|
|
138
|
+
instructions.push({ op: '@DID:', value: opts.from });
|
|
139
|
+
instructions.push({ op: opts.op ?? '#DATA:', value: '' });
|
|
140
|
+
instructions.push({ op: '!SEND' });
|
|
141
|
+
const packed = (0, packet_js_1.buildPacket)({
|
|
142
|
+
from: opts.from,
|
|
143
|
+
instructions,
|
|
144
|
+
data: opts.text,
|
|
145
|
+
mode: 'text',
|
|
146
|
+
compression: 'deflate',
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
text: Buffer.from(packed).toString('base64'),
|
|
150
|
+
lang: 'efficode',
|
|
151
|
+
decision,
|
|
152
|
+
bytes: packed.length,
|
|
153
|
+
note: '',
|
|
154
|
+
symbolic: (0, ops_js_1.instructionsToSymbolic)(instructions),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 入站:**严格**按对端声明的语言分派。
|
|
159
|
+
* - 声明 efficode 且本机也声明支持 → 真解包 (畸形/CRC 不符 → 抛, 不许"解一半");
|
|
160
|
+
* - 声明不是 efficode (含未知字符串) → 原样返回, **不进解码器**。
|
|
161
|
+
*/
|
|
162
|
+
function decodeFromPeer(opts) {
|
|
163
|
+
const raw = Array.isArray(opts.declaredLang)
|
|
164
|
+
? opts.declaredLang.join('|')
|
|
165
|
+
: opts.declaredLang == null
|
|
166
|
+
? null
|
|
167
|
+
: String(opts.declaredLang);
|
|
168
|
+
const declared = normalizeLang(opts.declaredLang);
|
|
169
|
+
const mineOk = normalizeLang(opts.mine) === 'efficode';
|
|
170
|
+
if (declared !== 'efficode') {
|
|
171
|
+
return {
|
|
172
|
+
text: opts.payload,
|
|
173
|
+
declaredLang: declared,
|
|
174
|
+
declaredRaw: raw,
|
|
175
|
+
decoded: false,
|
|
176
|
+
note: raw && declared === null
|
|
177
|
+
? `对端声明的语言「${raw}」本机不认识 → 不解析, 原样呈现`
|
|
178
|
+
: '对端未声明 efficode → 原样呈现',
|
|
179
|
+
bytes: 0,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (!mineOk) {
|
|
183
|
+
throw new types_js_1.EfficodeError('EFFICODE_LANG_UNSUPPORTED', '对端声明 efficode, 但本机未声明支持 → 拒绝解码 (不许硬解)');
|
|
184
|
+
}
|
|
185
|
+
const p = (0, packet_js_1.parsePacket)(opts.payload);
|
|
186
|
+
return { text: p.data, declaredLang: declared, declaredRaw: raw, decoded: true, note: '', bytes: p.bytes };
|
|
187
|
+
}
|
|
188
|
+
/** 本机默认声明哪种语言 (没给 = natural; 声明不变量绝不会"猜"成 efficode) */
|
|
189
|
+
function defaultDeclaredLang(env = process.env) {
|
|
190
|
+
const v = String(env.BOLLOON_EFFICODE_LANG ?? '').trim();
|
|
191
|
+
return normalizeLang(v) ?? 'natural';
|
|
192
|
+
}
|
|
193
|
+
// ============== 裁决记录 (只记语言与原因, 不记正文) ==============
|
|
194
|
+
function langDecisionLogPath(env = process.env) {
|
|
195
|
+
const home = env.BOLLOON_HOME || path.join(os.homedir() || '/tmp', '.bolloon');
|
|
196
|
+
return path.join(home, 'efficode-lang.jsonl');
|
|
197
|
+
}
|
|
198
|
+
/** 记一笔 (失败绝不打断主路径 —— 记录是旁路) */
|
|
199
|
+
function recordLangDecision(decision, meta) {
|
|
200
|
+
try {
|
|
201
|
+
const file = langDecisionLogPath();
|
|
202
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
203
|
+
const line = JSON.stringify({
|
|
204
|
+
ts: new Date().toISOString(),
|
|
205
|
+
channel: meta.channel,
|
|
206
|
+
peer: meta.peer ? String(meta.peer).slice(0, 64) : null,
|
|
207
|
+
lang: decision.lang,
|
|
208
|
+
fallback: decision.fallback,
|
|
209
|
+
reason: decision.reason,
|
|
210
|
+
unknownSide: decision.unknownSide,
|
|
211
|
+
declared: decision.declared,
|
|
212
|
+
});
|
|
213
|
+
fs.appendFileSync(file, line + '\n', 'utf-8');
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** 读回记录 (门用来断言"真记了一笔") */
|
|
221
|
+
function readLangDecisionLog(env = process.env) {
|
|
222
|
+
try {
|
|
223
|
+
return fs
|
|
224
|
+
.readFileSync(langDecisionLogPath(env), 'utf-8')
|
|
225
|
+
.split('\n')
|
|
226
|
+
.filter(Boolean)
|
|
227
|
+
.map((l) => JSON.parse(l));
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=negotiate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiate.js","sourceRoot":"","sources":["../../../src/efficode/negotiate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* efficode/ops - 指令集 / 词典 (符号 ↔ 二进制操作码)
|
|
4
|
+
*
|
|
5
|
+
* 照 leo 的规范: 符号化指令集 + 前缀表达式。
|
|
6
|
+
* @DID: 身份 1 载荷 = 身份串
|
|
7
|
+
* #DATA: 数据 2 载荷 = 数据正文
|
|
8
|
+
* #REQ: 请求 3 载荷 = 请求内容
|
|
9
|
+
* !ACK 确认 4 无载荷
|
|
10
|
+
* !SEND 发送 5 无载荷
|
|
11
|
+
* !END 结束 6 无载荷
|
|
12
|
+
*
|
|
13
|
+
* 指令段二进制形状 (逐条): [1B opcode][varint payloadLen][payload UTF-8]
|
|
14
|
+
* 末尾**没有**隐式终止符 —— 靠 payloadLen 自描述; 少一个字节就报截断。
|
|
15
|
+
*
|
|
16
|
+
* 严格性: 任何不在表里的 opcode 一律抛 EFFICODE_UNKNOWN_OPCODE。
|
|
17
|
+
* (变异 M1 会把这里改成"宽容跳过", 门必须变红 —— 这就是那条断言存在的意义。)
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.OP_TABLE = void 0;
|
|
21
|
+
exports.opBySymbol = opBySymbol;
|
|
22
|
+
exports.opByCode = opByCode;
|
|
23
|
+
exports.isKnownOpCode = isKnownOpCode;
|
|
24
|
+
exports.instructionsToSymbolic = instructionsToSymbolic;
|
|
25
|
+
exports.symbolicToInstructions = symbolicToInstructions;
|
|
26
|
+
const types_js_1 = require("./types.js");
|
|
27
|
+
exports.OP_TABLE = [
|
|
28
|
+
{ symbol: '@DID:', code: 1, hasPayload: true, prefix: '@DID:' },
|
|
29
|
+
{ symbol: '#DATA:', code: 2, hasPayload: true, prefix: '#DATA:' },
|
|
30
|
+
{ symbol: '#REQ:', code: 3, hasPayload: true, prefix: '#REQ:' },
|
|
31
|
+
{ symbol: '!ACK', code: 4, hasPayload: false, prefix: '!ACK' },
|
|
32
|
+
{ symbol: '!SEND', code: 5, hasPayload: false, prefix: '!SEND' },
|
|
33
|
+
{ symbol: '!END', code: 6, hasPayload: false, prefix: '!END' },
|
|
34
|
+
];
|
|
35
|
+
const BY_SYMBOL = new Map(exports.OP_TABLE.map((d) => [d.symbol, d]));
|
|
36
|
+
const BY_CODE = new Map(exports.OP_TABLE.map((d) => [d.code, d]));
|
|
37
|
+
function opBySymbol(symbol) {
|
|
38
|
+
const d = BY_SYMBOL.get(symbol);
|
|
39
|
+
if (!d)
|
|
40
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `未知符号 ${String(symbol)}`);
|
|
41
|
+
return d;
|
|
42
|
+
}
|
|
43
|
+
/** 按 opcode 取定义; 未知一律抛 (不返回 undefined 让上层"随便处理") */
|
|
44
|
+
function opByCode(code, offset = -1) {
|
|
45
|
+
const d = BY_CODE.get(code);
|
|
46
|
+
if (!d)
|
|
47
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `操作码 ${code} 不在指令表内`, offset);
|
|
48
|
+
return d;
|
|
49
|
+
}
|
|
50
|
+
function isKnownOpCode(code) {
|
|
51
|
+
return BY_CODE.has(code);
|
|
52
|
+
}
|
|
53
|
+
/** 指令序列 → 前缀表达式文本 (调试/文本模式可读形态) */
|
|
54
|
+
function instructionsToSymbolic(instructions) {
|
|
55
|
+
return instructions
|
|
56
|
+
.map((ins) => {
|
|
57
|
+
const def = opBySymbol(ins.op);
|
|
58
|
+
return def.hasPayload ? `${def.prefix}${ins.value ?? ''}` : def.prefix;
|
|
59
|
+
})
|
|
60
|
+
.join(' ');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 前缀表达式文本 → 指令序列。
|
|
64
|
+
*
|
|
65
|
+
* 解析规则 (写死, 免得被当成"随便切"):
|
|
66
|
+
* ① 按空白切词;
|
|
67
|
+
* ② 词首是 sigil 字符 (@ / # / !) → 必须匹配一条**已知**前缀, 否则抛 UNKNOWN_OPCODE;
|
|
68
|
+
* ③ 不带 sigil 的词 → 追加到**上一条**指令的载荷后面 (没有上一条 → 抛);
|
|
69
|
+
* ④ 控制指令 (!ACK/!SEND/!END) 后面不许跟载荷。
|
|
70
|
+
*/
|
|
71
|
+
function symbolicToInstructions(text) {
|
|
72
|
+
const out = [];
|
|
73
|
+
const words = String(text || '').trim().split(/\s+/).filter(Boolean);
|
|
74
|
+
for (const token of words) {
|
|
75
|
+
const isSigil = /^[@#!]/.test(token);
|
|
76
|
+
if (!isSigil) {
|
|
77
|
+
const last = out[out.length - 1];
|
|
78
|
+
if (!last || !opBySymbol(last.op).hasPayload) {
|
|
79
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `前缀表达式含未知指令: ${token.slice(0, 24)}`);
|
|
80
|
+
}
|
|
81
|
+
last.value = `${last.value ?? ''} ${token}`.trim();
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const def = exports.OP_TABLE.find((d) => token.startsWith(d.prefix));
|
|
85
|
+
if (!def)
|
|
86
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `前缀表达式含未知指令: ${token.slice(0, 24)}`);
|
|
87
|
+
if (def.hasPayload)
|
|
88
|
+
out.push({ op: def.symbol, value: token.slice(def.prefix.length) });
|
|
89
|
+
else if (token === def.prefix)
|
|
90
|
+
out.push({ op: def.symbol });
|
|
91
|
+
else
|
|
92
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.prefix} 不接受载荷: ${token.slice(0, 24)}`);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../../src/efficode/ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* efficode/packet - 包封装 (帧结构 + CRC32 尾段 + 严格解析)
|
|
4
|
+
*
|
|
5
|
+
* 布局 (照规范):
|
|
6
|
+
* [Header 2B] | [DID 验证段 32B] | [指令段 动态] | [数据块 动态] | [CRC32 4B]
|
|
7
|
+
*
|
|
8
|
+
* Header 2B:
|
|
9
|
+
* byte0: version(高 4 位) | mode(低 4 位) mode: 0=compact · 1=text
|
|
10
|
+
* byte1: flags bit0=有 DID 段 · bit1=有指令段 · bit2=有数据块
|
|
11
|
+
* bit3=数据块已压缩 · bit4..7=保留 (必须 0)
|
|
12
|
+
*
|
|
13
|
+
* 指令段: [varint opLen][opBytes] opBytes 见 ops.ts 的逐条形状
|
|
14
|
+
* 数据块: [varint dataLen][dataBytes] dataBytes[0] = 压缩算法 id (见 compress.ts)
|
|
15
|
+
*
|
|
16
|
+
* 两条硬纪律 (变异 M1/M2 就是拆这两条, 门必须变红):
|
|
17
|
+
* ① 解析必须**逐段自描述**: 长度对不上就报截断, 不许"能解多少解多少";
|
|
18
|
+
* ② 尾段 CRC32 覆盖 CRC 之前的**全部**字节, 对不上就报 CRC_MISMATCH,
|
|
19
|
+
* 绝不放行"内容看着像就收下"。
|
|
20
|
+
*
|
|
21
|
+
* 诚实边界:
|
|
22
|
+
* - "DID 段 32B" 在规范里是固定段; 参考实现允许省略 (省 32B), 省略时 flags 如实写 0,
|
|
23
|
+
* 解码端按 flags 解, **不假设**段存在;
|
|
24
|
+
* - CRC32 只防传输损坏, **不是**防篡改 (无密钥)。防篡改要真签名 —— 规范中, 见 did.ts 注释。
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.buildPacket = buildPacket;
|
|
28
|
+
exports.encodePacket = encodePacket;
|
|
29
|
+
exports.parsePacket = parsePacket;
|
|
30
|
+
exports.packetToMessage = packetToMessage;
|
|
31
|
+
exports.messageFromSymbolic = messageFromSymbolic;
|
|
32
|
+
const crc32_js_1 = require("./crc32.js");
|
|
33
|
+
const types_js_1 = require("./types.js");
|
|
34
|
+
const compress_js_1 = require("./compress.js");
|
|
35
|
+
const did_js_1 = require("./did.js");
|
|
36
|
+
const ops_js_1 = require("./ops.js");
|
|
37
|
+
const MODE_TO_NUM = { compact: 0, text: 1 };
|
|
38
|
+
const NUM_TO_MODE = { 0: 'compact', 1: 'text' };
|
|
39
|
+
const F_HAS_DID = 1 << 0;
|
|
40
|
+
const F_HAS_OP = 1 << 1;
|
|
41
|
+
const F_HAS_DATA = 1 << 2;
|
|
42
|
+
const F_COMPRESSED = 1 << 3;
|
|
43
|
+
const FLAG_RESERVED = 0xf0;
|
|
44
|
+
function writeVarint(out, n) {
|
|
45
|
+
let v = n >>> 0;
|
|
46
|
+
while (v >= 0x80) {
|
|
47
|
+
out.push((v & 0x7f) | 0x80);
|
|
48
|
+
v >>>= 7;
|
|
49
|
+
}
|
|
50
|
+
out.push(v & 0xff);
|
|
51
|
+
}
|
|
52
|
+
function readVarint(buf, pos) {
|
|
53
|
+
let value = 0;
|
|
54
|
+
let shift = 0;
|
|
55
|
+
let i = pos;
|
|
56
|
+
for (;;) {
|
|
57
|
+
if (i >= buf.length)
|
|
58
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', 'varint 未读完就到底', i);
|
|
59
|
+
const b = buf[i++];
|
|
60
|
+
value |= (b & 0x7f) << shift;
|
|
61
|
+
if ((b & 0x80) === 0)
|
|
62
|
+
break;
|
|
63
|
+
shift += 7;
|
|
64
|
+
if (shift > 28)
|
|
65
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', 'varint 超过 32 位上限', i);
|
|
66
|
+
}
|
|
67
|
+
return { value: value >>> 0, next: i };
|
|
68
|
+
}
|
|
69
|
+
/** 指令序列 → 指令段字节 (不含外层 varint 长度) */
|
|
70
|
+
function encodeInstructions(instructions) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const ins of instructions) {
|
|
73
|
+
const def = (0, ops_js_1.opBySymbol)(ins.op);
|
|
74
|
+
out.push(def.code);
|
|
75
|
+
const payload = def.hasPayload ? Buffer.from(String(ins.value ?? ''), 'utf-8') : Buffer.alloc(0);
|
|
76
|
+
if (!def.hasPayload && (ins.value ?? '') !== '') {
|
|
77
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.symbol} 不接受载荷`);
|
|
78
|
+
}
|
|
79
|
+
writeVarint(out, payload.length);
|
|
80
|
+
for (const b of payload)
|
|
81
|
+
out.push(b);
|
|
82
|
+
}
|
|
83
|
+
return Uint8Array.from(out);
|
|
84
|
+
}
|
|
85
|
+
/** 指令段字节 → 指令序列 (严格: 未知 opcode / 截断都抛) */
|
|
86
|
+
function decodeInstructions(buf) {
|
|
87
|
+
const out = [];
|
|
88
|
+
let pos = 0;
|
|
89
|
+
while (pos < buf.length) {
|
|
90
|
+
const code = buf[pos];
|
|
91
|
+
const def = (0, ops_js_1.opByCode)(code, pos); // 未知 opcode → 抛 (变异 M1 拆掉这里 → 门变红)
|
|
92
|
+
pos += 1;
|
|
93
|
+
const len = readVarint(buf, pos);
|
|
94
|
+
pos = len.next;
|
|
95
|
+
if (def.hasPayload) {
|
|
96
|
+
if (pos + len.value > buf.length) {
|
|
97
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', `指令 ${def.symbol} 声明 ${len.value}B 载荷但只剩 ${buf.length - pos}B`, pos);
|
|
98
|
+
}
|
|
99
|
+
out.push({ op: def.symbol, value: Buffer.from(buf.subarray(pos, pos + len.value)).toString('utf-8') });
|
|
100
|
+
pos += len.value;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (len.value !== 0) {
|
|
104
|
+
throw new types_js_1.EfficodeError('EFFICODE_UNKNOWN_OPCODE', `控制指令 ${def.symbol} 声明了 ${len.value}B 载荷`, pos);
|
|
105
|
+
}
|
|
106
|
+
out.push({ op: def.symbol });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** 打包 (总是产出二进制; mode 记在 header 里) */
|
|
112
|
+
function buildPacket(msg) {
|
|
113
|
+
const mode = msg.mode ?? 'compact';
|
|
114
|
+
if (!(mode in MODE_TO_NUM)) {
|
|
115
|
+
// 语音/声波模式等未实现模式 = 显式拒绝, 不静默降级
|
|
116
|
+
throw new types_js_1.EfficodeError('EFFICODE_MODE_NOT_IMPLEMENTED', `模式 ${String(mode)} 未实现 (只有 compact/text)`);
|
|
117
|
+
}
|
|
118
|
+
const instructions = msg.instructions ?? [];
|
|
119
|
+
if (!instructions.length)
|
|
120
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_FLAGS', '指令段不能为空 (至少一条指令)');
|
|
121
|
+
const hasDid = typeof msg.from === 'string' && msg.from.length > 0;
|
|
122
|
+
const didSeg = hasDid ? (0, did_js_1.encodeDidSegment)(msg.from) : null;
|
|
123
|
+
if (didSeg && didSeg.length !== types_js_1.DID_SEGMENT_BYTES) {
|
|
124
|
+
throw new types_js_1.EfficodeError('EFFICODE_DID_SEGMENT_BAD', `DID 段长度异常 ${didSeg.length}B`);
|
|
125
|
+
}
|
|
126
|
+
const opBytes = encodeInstructions(instructions);
|
|
127
|
+
const rawData = Buffer.from(msg.data ?? '', 'utf-8');
|
|
128
|
+
const algo = msg.compression ?? (0, compress_js_1.pickAlgo)(new Uint8Array(rawData));
|
|
129
|
+
const dataBlock = rawData.length > 0 ? (0, compress_js_1.compressBlock)(new Uint8Array(rawData), algo) : new Uint8Array(0);
|
|
130
|
+
let flags = F_HAS_OP;
|
|
131
|
+
if (didSeg)
|
|
132
|
+
flags |= F_HAS_DID;
|
|
133
|
+
if (dataBlock.length > 0)
|
|
134
|
+
flags |= F_HAS_DATA;
|
|
135
|
+
if (dataBlock.length > 0 && algo !== 'none')
|
|
136
|
+
flags |= F_COMPRESSED;
|
|
137
|
+
const out = [];
|
|
138
|
+
out.push(((types_js_1.EFFICODE_VERSION & 0xf) << 4) | (MODE_TO_NUM[mode] & 0xf));
|
|
139
|
+
out.push(flags);
|
|
140
|
+
if (didSeg)
|
|
141
|
+
for (const b of didSeg)
|
|
142
|
+
out.push(b);
|
|
143
|
+
writeVarint(out, opBytes.length);
|
|
144
|
+
for (const b of opBytes)
|
|
145
|
+
out.push(b);
|
|
146
|
+
if (dataBlock.length > 0) {
|
|
147
|
+
writeVarint(out, dataBlock.length);
|
|
148
|
+
for (const b of dataBlock)
|
|
149
|
+
out.push(b);
|
|
150
|
+
}
|
|
151
|
+
const head = Uint8Array.from(out);
|
|
152
|
+
const crc = (0, crc32_js_1.crc32Bytes)(head);
|
|
153
|
+
const packet = new Uint8Array(head.length + types_js_1.CRC_BYTES);
|
|
154
|
+
packet.set(head, 0);
|
|
155
|
+
packet.set(crc, head.length);
|
|
156
|
+
return packet;
|
|
157
|
+
}
|
|
158
|
+
/** 编码成要上网的形态: text 模式 → Base64 串; compact 模式 → 二进制 */
|
|
159
|
+
function encodePacket(msg) {
|
|
160
|
+
const packet = buildPacket(msg);
|
|
161
|
+
const mode = msg.mode ?? 'compact';
|
|
162
|
+
return mode === 'text' ? Buffer.from(packet).toString('base64') : packet;
|
|
163
|
+
}
|
|
164
|
+
/** 解析 (严格)。入参可以是二进制包或 text 模式的 Base64 串 */
|
|
165
|
+
function parsePacket(input) {
|
|
166
|
+
let mode;
|
|
167
|
+
let buf;
|
|
168
|
+
if (typeof input === 'string') {
|
|
169
|
+
mode = 'text';
|
|
170
|
+
const cleaned = input.trim();
|
|
171
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(cleaned) || cleaned.length % 4 !== 0) {
|
|
172
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_BASE64', '文本模式载荷不是合法 Base64');
|
|
173
|
+
}
|
|
174
|
+
buf = new Uint8Array(Buffer.from(cleaned, 'base64'));
|
|
175
|
+
if (buf.length === 0)
|
|
176
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_BASE64', 'Base64 解出 0 字节');
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
mode = 'compact';
|
|
180
|
+
buf = input;
|
|
181
|
+
}
|
|
182
|
+
if (buf.length < types_js_1.MIN_PACKET_BYTES) {
|
|
183
|
+
throw new types_js_1.EfficodeError('EFFICODE_TOO_SHORT', `包 ${buf.length}B < 最短合法 ${types_js_1.MIN_PACKET_BYTES}B`);
|
|
184
|
+
}
|
|
185
|
+
const version = (buf[0] >> 4) & 0xf;
|
|
186
|
+
if (version !== types_js_1.EFFICODE_VERSION) {
|
|
187
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_VERSION', `包版本 ${version} 不被支持 (本实现只认 ${types_js_1.EFFICODE_VERSION})`, 0);
|
|
188
|
+
}
|
|
189
|
+
const modeNum = buf[0] & 0xf;
|
|
190
|
+
const declaredMode = NUM_TO_MODE[modeNum];
|
|
191
|
+
if (!declaredMode)
|
|
192
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_MODE', `未知模式 id=${modeNum}`, 0);
|
|
193
|
+
if (declaredMode !== mode) {
|
|
194
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_MODE', `传输形态(${mode})与包头声明(${declaredMode})不一致`, 0);
|
|
195
|
+
}
|
|
196
|
+
const flags = buf[1];
|
|
197
|
+
if ((flags & FLAG_RESERVED) !== 0) {
|
|
198
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_FLAGS', `flags 保留位被置位: 0x${flags.toString(16)}`, 1);
|
|
199
|
+
}
|
|
200
|
+
let pos = 2;
|
|
201
|
+
let didDigest = null;
|
|
202
|
+
let didSegmentHex = null;
|
|
203
|
+
if (flags & F_HAS_DID) {
|
|
204
|
+
if (pos + types_js_1.DID_SEGMENT_BYTES > buf.length) {
|
|
205
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', `声明有 DID 段但只剩 ${buf.length - pos}B`, pos);
|
|
206
|
+
}
|
|
207
|
+
const seg = buf.subarray(pos, pos + types_js_1.DID_SEGMENT_BYTES);
|
|
208
|
+
const parsed = (0, did_js_1.decodeDidSegment)(seg); // algo 未知 → 抛
|
|
209
|
+
didDigest = (0, did_js_1.didDigestString)(parsed);
|
|
210
|
+
didSegmentHex = Buffer.from(seg).toString('hex');
|
|
211
|
+
pos += types_js_1.DID_SEGMENT_BYTES;
|
|
212
|
+
}
|
|
213
|
+
let instructions = [];
|
|
214
|
+
if (flags & F_HAS_OP) {
|
|
215
|
+
const opLen = readVarint(buf, pos);
|
|
216
|
+
pos = opLen.next;
|
|
217
|
+
if (pos + opLen.value > buf.length) {
|
|
218
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', `指令段声明 ${opLen.value}B 但只剩 ${buf.length - pos}B`, pos);
|
|
219
|
+
}
|
|
220
|
+
instructions = decodeInstructions(buf.subarray(pos, pos + opLen.value));
|
|
221
|
+
pos += opLen.value;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
throw new types_js_1.EfficodeError('EFFICODE_BAD_FLAGS', 'flags 声明无指令段 —— 本实现不接受无指令的包', 1);
|
|
225
|
+
}
|
|
226
|
+
let data = '';
|
|
227
|
+
let compression = 'none';
|
|
228
|
+
let rawDataBytes = 0;
|
|
229
|
+
if (flags & F_HAS_DATA) {
|
|
230
|
+
const dataLen = readVarint(buf, pos);
|
|
231
|
+
pos = dataLen.next;
|
|
232
|
+
if (pos + dataLen.value > buf.length) {
|
|
233
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRUNCATED', `数据块声明 ${dataLen.value}B 但只剩 ${buf.length - pos}B`, pos);
|
|
234
|
+
}
|
|
235
|
+
const block = buf.subarray(pos, pos + dataLen.value);
|
|
236
|
+
const un = (0, compress_js_1.decompressBlock)(block);
|
|
237
|
+
compression = un.algo;
|
|
238
|
+
rawDataBytes = un.data.length;
|
|
239
|
+
data = Buffer.from(un.data).toString('utf-8');
|
|
240
|
+
pos += dataLen.value;
|
|
241
|
+
}
|
|
242
|
+
const expectCrcAt = buf.length - types_js_1.CRC_BYTES;
|
|
243
|
+
if (pos !== expectCrcAt) {
|
|
244
|
+
throw new types_js_1.EfficodeError('EFFICODE_TRAILING_BYTES', `解析在 ${pos}B 结束, 但 CRC 段在 ${expectCrcAt}B —— 中间有 ${expectCrcAt - pos}B 垃圾`, pos);
|
|
245
|
+
}
|
|
246
|
+
const head = buf.subarray(0, expectCrcAt);
|
|
247
|
+
const want = (0, crc32_js_1.readCrc32Bytes)(buf, expectCrcAt);
|
|
248
|
+
const got = (0, crc32_js_1.crc32)(head);
|
|
249
|
+
if (want !== got) {
|
|
250
|
+
throw new types_js_1.EfficodeError('EFFICODE_CRC_MISMATCH', `CRC32 不符: 包内 0x${want.toString(16)}, 实算 0x${got.toString(16)}`, expectCrcAt);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
mode: declaredMode,
|
|
254
|
+
didDigest,
|
|
255
|
+
didSegmentHex,
|
|
256
|
+
instructions,
|
|
257
|
+
data,
|
|
258
|
+
compression,
|
|
259
|
+
bytes: buf.length,
|
|
260
|
+
rawDataBytes,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/** 便捷: 包 → 语义消息 (保留符号化形态, 供文本模式/调试面读取) */
|
|
264
|
+
function packetToMessage(input) {
|
|
265
|
+
const p = parsePacket(input);
|
|
266
|
+
return {
|
|
267
|
+
instructions: p.instructions,
|
|
268
|
+
data: p.data || undefined,
|
|
269
|
+
mode: p.mode,
|
|
270
|
+
compression: p.compression,
|
|
271
|
+
bytes: p.bytes,
|
|
272
|
+
symbolic: (0, ops_js_1.instructionsToSymbolic)(p.instructions),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/** 从符号化文本造一条消息 (调试/文本模式入口) */
|
|
276
|
+
function messageFromSymbolic(text, data) {
|
|
277
|
+
return { instructions: (0, ops_js_1.symbolicToInstructions)(text), data, mode: 'compact' };
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=packet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../src/efficode/packet.ts"],"names":[],"mappings":"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"}
|