dsh-session-recall 0.7.4 → 0.7.5
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 +14 -0
- package/README.zh.md +14 -0
- package/lib/esm-DyxhIKe9.js +662 -0
- package/lib/index.d.ts +83 -2
- package/lib/index.js +458 -64
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -125,8 +125,22 @@ Plugin row config (all optional):
|
|
|
125
125
|
cjkHint: true # explain CJK zero-hit results
|
|
126
126
|
cjkFallback: true # CJK zero-hit → exact substring scan over session text
|
|
127
127
|
cjkFallbackScanMax: 50 # max sessions scanned per cross-session fallback (1..500)
|
|
128
|
+
rawScanFallback: true # degraded mode: when the index itself fails, scan logs directly
|
|
129
|
+
rawScanMaxSessions: 200 # degraded scan budget: sessions visited (1..2000)
|
|
130
|
+
rawScanMaxDurationMs: 20000 # degraded scan wall-clock ceiling (1000..120000)
|
|
131
|
+
rawScanMaxSessionBytes: 8388608 # per-log compressed-size cap in the degraded scan
|
|
128
132
|
```
|
|
129
133
|
|
|
134
|
+
## Degraded mode (v0.7.5)
|
|
135
|
+
|
|
136
|
+
When the session index itself fails — most notably `SESSION_QUERY_PERSISTENCE_FAILED`, where a single un-migratable session artifact fails *every* indexed search (the v0→v1 migration gate rejecting `subagent/descriptor` version 2, [deepseek-harness discussion #7995](https://github.com/deepseek-ai/deepseek-harness/discussions/7995)) — the `recall` tool degrades to scanning the persisted session logs directly (`$DSH_HOME/sessions`) instead of failing the call:
|
|
137
|
+
|
|
138
|
+
- **Tolerant by construction**: each log is decompressed with a bundled pure-JS zstd decoder and parsed line by line; a corrupt line or unreadable log is skipped and counted, never fatal. The exact session shape that bricks the upstream migration is searchable here.
|
|
139
|
+
- **Affordable**: session headers are read through a streaming decompressor (milliseconds each) so cwd/time/session_id scope filters run before any full decompression; a byte-level term prefilter avoids line parsing for non-matching logs; a wall-clock budget (default 20s) and a per-log size cap (default 8 MiB compressed — pure-JS zstd decompresses ~2 MB/s) keep the tool responsive. Sessions are visited newest-first, and when the budget trips, the result says which portion of the store was covered.
|
|
140
|
+
- **Honest**: results carry `diagnostics.source: "raw-scan"` and a hint explaining the degraded provenance, unreadable/oversized skips, and partial coverage. Live (not yet persisted) sessions are not included.
|
|
141
|
+
|
|
142
|
+
Disable with `rawScanFallback: false` to restore the pre-v0.7.5 fail-fast behavior.
|
|
143
|
+
|
|
130
144
|
## Failure behavior
|
|
131
145
|
|
|
132
146
|
Every failure returns a friendly `hint` instead of a raw exception: a disabled index explains the two config keys needed, a stale cursor tells the model to restart without one, an unknown `session_id` suggests discovering sessions first. Title enrichment is best-effort — a failed title batch degrades to untitled rows, never a failed search.
|
package/README.zh.md
CHANGED
|
@@ -124,8 +124,22 @@ dsh plugin --profile web add github:kittimzhe/dsh-session-recall
|
|
|
124
124
|
cjkHint: true # CJK 零命中的提示开关
|
|
125
125
|
cjkFallback: true # CJK 零命中 → 对会话文本做精确子串扫描
|
|
126
126
|
cjkFallbackScanMax: 50 # 跨会话回退时最多扫描的会话数(1..500)
|
|
127
|
+
rawScanFallback: true # 降级模式:索引整体故障时直扫会话日志
|
|
128
|
+
rawScanMaxSessions: 200 # 降级扫描预算:访问会话数(1..2000)
|
|
129
|
+
rawScanMaxDurationMs: 20000 # 降级扫描墙钟上限(1000..120000)
|
|
130
|
+
rawScanMaxSessionBytes: 8388608 # 降级扫描单日志压缩体积上限(字节)
|
|
127
131
|
```
|
|
128
132
|
|
|
133
|
+
## 降级模式(v0.7.5)
|
|
134
|
+
|
|
135
|
+
当会话索引本身故障——最典型的是 `SESSION_QUERY_PERSISTENCE_FAILED`:一个无法迁移的会话工件让**所有**索引查询全部失败(v0→v1 迁移闸门拒绝 `subagent/descriptor` version 2,见 [deepseek-harness 讨论 #7995](https://github.com/deepseek-ai/deepseek-harness/discussions/7995))——`recall` 工具降级为直接扫描持久化会话日志(`$DSH_HOME/sessions`),而不是让整个调用失败:
|
|
136
|
+
|
|
137
|
+
- **天生容错**:日志用内置的纯 JS zstd 解码器解压、逐行解析;坏行或不可读日志跳过并计数,绝不致命。上游迁移器认不了的那个会话形状,在这里照样可搜。
|
|
138
|
+
- **算得起**:会话 header 走流式解压(毫秒级),cwd/时间/session_id 过滤先于任何全量解压;字节级关键词预过滤让不含关键词的日志免去逐行解析;墙钟预算(默认 20 秒)与单日志体积上限(默认压缩后 8 MiB——纯 JS zstd 解压约 2 MB/s)保证工具响应性。会话按最新优先访问,预算用尽时结果会说明覆盖了哪部分。
|
|
139
|
+
- **诚实**:结果带 `diagnostics.source: "raw-scan"` 和降级来源提示(不可读/超限跳过数、部分覆盖说明)。未落盘的活跃会话不包含在内。
|
|
140
|
+
|
|
141
|
+
设 `rawScanFallback: false` 可恢复 v0.7.5 之前的快速失败行为。
|
|
142
|
+
|
|
129
143
|
## 失败行为
|
|
130
144
|
|
|
131
145
|
所有失败都返回友好的 `hint` 而不是裸异常:索引未开启会说明需要哪两个配置键;游标失效会告诉模型不带游标重开一次;`session_id` 不存在会建议先做跨会话搜索。标题补全是尽力而为——标题批量读取失败只降级为"无标题"行,绝不让搜索失败。
|
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
//#region node_modules/fzstd/esm/index.mjs
|
|
2
|
+
var ab = ArrayBuffer;
|
|
3
|
+
var u8 = Uint8Array;
|
|
4
|
+
var u16 = Uint16Array;
|
|
5
|
+
var i16 = Int16Array;
|
|
6
|
+
var i32 = Int32Array;
|
|
7
|
+
var slc = function(v, s, e) {
|
|
8
|
+
if (u8.prototype.slice) return u8.prototype.slice.call(v, s, e);
|
|
9
|
+
if (s == null || s < 0) s = 0;
|
|
10
|
+
if (e == null || e > v.length) e = v.length;
|
|
11
|
+
var n = new u8(e - s);
|
|
12
|
+
n.set(v.subarray(s, e));
|
|
13
|
+
return n;
|
|
14
|
+
};
|
|
15
|
+
var fill = function(v, n, s, e) {
|
|
16
|
+
if (u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e);
|
|
17
|
+
if (s == null || s < 0) s = 0;
|
|
18
|
+
if (e == null || e > v.length) e = v.length;
|
|
19
|
+
for (; s < e; ++s) v[s] = n;
|
|
20
|
+
return v;
|
|
21
|
+
};
|
|
22
|
+
var cpw = function(v, t, s, e) {
|
|
23
|
+
if (u8.prototype.copyWithin) return u8.prototype.copyWithin.call(v, t, s, e);
|
|
24
|
+
if (s == null || s < 0) s = 0;
|
|
25
|
+
if (e == null || e > v.length) e = v.length;
|
|
26
|
+
while (s < e) v[t++] = v[s++];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Codes for errors generated within this library
|
|
30
|
+
*/
|
|
31
|
+
var ZstdErrorCode = {
|
|
32
|
+
InvalidData: 0,
|
|
33
|
+
WindowSizeTooLarge: 1,
|
|
34
|
+
InvalidBlockType: 2,
|
|
35
|
+
FSEAccuracyTooHigh: 3,
|
|
36
|
+
DistanceTooFarBack: 4,
|
|
37
|
+
UnexpectedEOF: 5
|
|
38
|
+
};
|
|
39
|
+
var ec = [
|
|
40
|
+
"invalid zstd data",
|
|
41
|
+
"window size too large (>2046MB)",
|
|
42
|
+
"invalid block type",
|
|
43
|
+
"FSE accuracy too high",
|
|
44
|
+
"match distance too far back",
|
|
45
|
+
"unexpected EOF"
|
|
46
|
+
];
|
|
47
|
+
var err = function(ind, msg, nt) {
|
|
48
|
+
var e = new Error(msg || ec[ind]);
|
|
49
|
+
e.code = ind;
|
|
50
|
+
if (Error.captureStackTrace) Error.captureStackTrace(e, err);
|
|
51
|
+
if (!nt) throw e;
|
|
52
|
+
return e;
|
|
53
|
+
};
|
|
54
|
+
var rb = function(d, b, n) {
|
|
55
|
+
var i = 0, o = 0;
|
|
56
|
+
for (; i < n; ++i) o |= d[b++] << (i << 3);
|
|
57
|
+
return o;
|
|
58
|
+
};
|
|
59
|
+
var b4 = function(d, b) {
|
|
60
|
+
return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
|
|
61
|
+
};
|
|
62
|
+
var rzfh = function(dat, w) {
|
|
63
|
+
var n3 = dat[0] | dat[1] << 8 | dat[2] << 16;
|
|
64
|
+
if (n3 == 3126568 && dat[3] == 253) {
|
|
65
|
+
var flg = dat[4];
|
|
66
|
+
var ss = flg >> 5 & 1, cc = flg >> 2 & 1, df = flg & 3, fcf = flg >> 6;
|
|
67
|
+
if (flg & 8) err(0);
|
|
68
|
+
var bt = 6 - ss;
|
|
69
|
+
var db = df == 3 ? 4 : df;
|
|
70
|
+
var di = rb(dat, bt, db);
|
|
71
|
+
bt += db;
|
|
72
|
+
var fsb = fcf ? 1 << fcf : ss;
|
|
73
|
+
var fss = rb(dat, bt, fsb) + (fcf == 1 && 256);
|
|
74
|
+
var ws = fss;
|
|
75
|
+
if (!ss) {
|
|
76
|
+
var wb = 1 << 10 + (dat[5] >> 3);
|
|
77
|
+
ws = wb + (wb >> 3) * (dat[5] & 7);
|
|
78
|
+
}
|
|
79
|
+
if (ws > 2145386496) err(1);
|
|
80
|
+
var buf = new u8((w == 1 ? fss || ws : w ? 0 : ws) + 12);
|
|
81
|
+
buf[0] = 1, buf[4] = 4, buf[8] = 8;
|
|
82
|
+
return {
|
|
83
|
+
b: bt + fsb,
|
|
84
|
+
y: 0,
|
|
85
|
+
l: 0,
|
|
86
|
+
d: di,
|
|
87
|
+
w: w && w != 1 ? w : buf.subarray(12),
|
|
88
|
+
e: ws,
|
|
89
|
+
o: new i32(buf.buffer, 0, 3),
|
|
90
|
+
u: fss,
|
|
91
|
+
c: cc,
|
|
92
|
+
m: Math.min(131072, ws)
|
|
93
|
+
};
|
|
94
|
+
} else if ((n3 >> 4 | dat[3] << 20) == 25481893) return b4(dat, 4) + 8;
|
|
95
|
+
err(0);
|
|
96
|
+
};
|
|
97
|
+
var msb = function(val) {
|
|
98
|
+
var bits = 0;
|
|
99
|
+
for (; 1 << bits <= val; ++bits);
|
|
100
|
+
return bits - 1;
|
|
101
|
+
};
|
|
102
|
+
var rfse = function(dat, bt, mal) {
|
|
103
|
+
var tpos = (bt << 3) + 4;
|
|
104
|
+
var al = (dat[bt] & 15) + 5;
|
|
105
|
+
if (al > mal) err(3);
|
|
106
|
+
var sz = 1 << al;
|
|
107
|
+
var probs = sz, sym = -1, re = -1, i = -1, ht = sz;
|
|
108
|
+
var buf = new ab(512 + (sz << 2));
|
|
109
|
+
var freq = new i16(buf, 0, 256);
|
|
110
|
+
var dstate = new u16(buf, 0, 256);
|
|
111
|
+
var nstate = new u16(buf, 512, sz);
|
|
112
|
+
var bb1 = 512 + (sz << 1);
|
|
113
|
+
var syms = new u8(buf, bb1, sz);
|
|
114
|
+
var nbits = new u8(buf, bb1 + sz);
|
|
115
|
+
while (sym < 255 && probs > 0) {
|
|
116
|
+
var bits = msb(probs + 1);
|
|
117
|
+
var cbt = tpos >> 3;
|
|
118
|
+
var msk = (1 << bits + 1) - 1;
|
|
119
|
+
var val = (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7) & msk;
|
|
120
|
+
var msk1fb = (1 << bits) - 1;
|
|
121
|
+
var msv = msk - probs - 1;
|
|
122
|
+
var sval = val & msk1fb;
|
|
123
|
+
if (sval < msv) tpos += bits, val = sval;
|
|
124
|
+
else {
|
|
125
|
+
tpos += bits + 1;
|
|
126
|
+
if (val > msk1fb) val -= msv;
|
|
127
|
+
}
|
|
128
|
+
freq[++sym] = --val;
|
|
129
|
+
if (val == -1) {
|
|
130
|
+
probs += val;
|
|
131
|
+
syms[--ht] = sym;
|
|
132
|
+
} else probs -= val;
|
|
133
|
+
if (!val) do {
|
|
134
|
+
var rbt = tpos >> 3;
|
|
135
|
+
re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3;
|
|
136
|
+
tpos += 2;
|
|
137
|
+
sym += re;
|
|
138
|
+
} while (re == 3);
|
|
139
|
+
}
|
|
140
|
+
if (sym > 255 || probs) err(0);
|
|
141
|
+
var sympos = 0;
|
|
142
|
+
var sstep = (sz >> 1) + (sz >> 3) + 3;
|
|
143
|
+
var smask = sz - 1;
|
|
144
|
+
for (var s = 0; s <= sym; ++s) {
|
|
145
|
+
var sf = freq[s];
|
|
146
|
+
if (sf < 1) {
|
|
147
|
+
dstate[s] = -sf;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
for (i = 0; i < sf; ++i) {
|
|
151
|
+
syms[sympos] = s;
|
|
152
|
+
do
|
|
153
|
+
sympos = sympos + sstep & smask;
|
|
154
|
+
while (sympos >= ht);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (sympos) err(0);
|
|
158
|
+
for (i = 0; i < sz; ++i) {
|
|
159
|
+
var ns = dstate[syms[i]]++;
|
|
160
|
+
var nb = nbits[i] = al - msb(ns);
|
|
161
|
+
nstate[i] = (ns << nb) - sz;
|
|
162
|
+
}
|
|
163
|
+
return [tpos + 7 >> 3, {
|
|
164
|
+
b: al,
|
|
165
|
+
s: syms,
|
|
166
|
+
n: nbits,
|
|
167
|
+
t: nstate
|
|
168
|
+
}];
|
|
169
|
+
};
|
|
170
|
+
var rhu = function(dat, bt) {
|
|
171
|
+
var i = 0, wc = -1;
|
|
172
|
+
var buf = new u8(292), hb = dat[bt];
|
|
173
|
+
var hw = buf.subarray(0, 256);
|
|
174
|
+
var rc = buf.subarray(256, 268);
|
|
175
|
+
var ri = new u16(buf.buffer, 268);
|
|
176
|
+
if (hb < 128) {
|
|
177
|
+
var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];
|
|
178
|
+
bt += hb;
|
|
179
|
+
var epos = ebt << 3;
|
|
180
|
+
var lb = dat[bt];
|
|
181
|
+
if (!lb) err(0);
|
|
182
|
+
var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;
|
|
183
|
+
var fpos = (++bt << 3) - 8 + msb(lb);
|
|
184
|
+
for (;;) {
|
|
185
|
+
fpos -= btr1;
|
|
186
|
+
if (fpos < epos) break;
|
|
187
|
+
var cbt = fpos >> 3;
|
|
188
|
+
st1 += (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1;
|
|
189
|
+
hw[++wc] = fdt.s[st1];
|
|
190
|
+
fpos -= btr2;
|
|
191
|
+
if (fpos < epos) break;
|
|
192
|
+
cbt = fpos >> 3;
|
|
193
|
+
st2 += (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1;
|
|
194
|
+
hw[++wc] = fdt.s[st2];
|
|
195
|
+
btr1 = fdt.n[st1];
|
|
196
|
+
st1 = fdt.t[st1];
|
|
197
|
+
btr2 = fdt.n[st2];
|
|
198
|
+
st2 = fdt.t[st2];
|
|
199
|
+
}
|
|
200
|
+
if (++wc > 255) err(0);
|
|
201
|
+
} else {
|
|
202
|
+
wc = hb - 127;
|
|
203
|
+
for (; i < wc; i += 2) {
|
|
204
|
+
var byte = dat[++bt];
|
|
205
|
+
hw[i] = byte >> 4;
|
|
206
|
+
hw[i + 1] = byte & 15;
|
|
207
|
+
}
|
|
208
|
+
++bt;
|
|
209
|
+
}
|
|
210
|
+
var wes = 0;
|
|
211
|
+
for (i = 0; i < wc; ++i) {
|
|
212
|
+
var wt = hw[i];
|
|
213
|
+
if (wt > 11) err(0);
|
|
214
|
+
wes += wt && 1 << wt - 1;
|
|
215
|
+
}
|
|
216
|
+
var mb = msb(wes) + 1;
|
|
217
|
+
var ts = 1 << mb;
|
|
218
|
+
var rem = ts - wes;
|
|
219
|
+
if (rem & rem - 1) err(0);
|
|
220
|
+
hw[wc++] = msb(rem) + 1;
|
|
221
|
+
for (i = 0; i < wc; ++i) {
|
|
222
|
+
var wt = hw[i];
|
|
223
|
+
++rc[hw[i] = wt && mb + 1 - wt];
|
|
224
|
+
}
|
|
225
|
+
var hbuf = new u8(ts << 1);
|
|
226
|
+
var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);
|
|
227
|
+
ri[mb] = 0;
|
|
228
|
+
for (i = mb; i > 0; --i) {
|
|
229
|
+
var pv = ri[i];
|
|
230
|
+
fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i));
|
|
231
|
+
}
|
|
232
|
+
if (ri[0] != ts) err(0);
|
|
233
|
+
for (i = 0; i < wc; ++i) {
|
|
234
|
+
var bits = hw[i];
|
|
235
|
+
if (bits) {
|
|
236
|
+
var code = ri[bits];
|
|
237
|
+
fill(syms, i, code, ri[bits] = code + (1 << mb - bits));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return [bt, {
|
|
241
|
+
n: nb,
|
|
242
|
+
b: mb,
|
|
243
|
+
s: syms
|
|
244
|
+
}];
|
|
245
|
+
};
|
|
246
|
+
var dllt = (/*#__PURE__*/ rfse(/*#__PURE__*/ new u8([
|
|
247
|
+
81,
|
|
248
|
+
16,
|
|
249
|
+
99,
|
|
250
|
+
140,
|
|
251
|
+
49,
|
|
252
|
+
198,
|
|
253
|
+
24,
|
|
254
|
+
99,
|
|
255
|
+
12,
|
|
256
|
+
33,
|
|
257
|
+
196,
|
|
258
|
+
24,
|
|
259
|
+
99,
|
|
260
|
+
102,
|
|
261
|
+
102,
|
|
262
|
+
134,
|
|
263
|
+
70,
|
|
264
|
+
146,
|
|
265
|
+
4
|
|
266
|
+
]), 0, 6))[1];
|
|
267
|
+
var dmlt = (/*#__PURE__*/ rfse(/*#__PURE__*/ new u8([
|
|
268
|
+
33,
|
|
269
|
+
20,
|
|
270
|
+
196,
|
|
271
|
+
24,
|
|
272
|
+
99,
|
|
273
|
+
140,
|
|
274
|
+
33,
|
|
275
|
+
132,
|
|
276
|
+
16,
|
|
277
|
+
66,
|
|
278
|
+
8,
|
|
279
|
+
33,
|
|
280
|
+
132,
|
|
281
|
+
16,
|
|
282
|
+
66,
|
|
283
|
+
8,
|
|
284
|
+
33,
|
|
285
|
+
68,
|
|
286
|
+
68,
|
|
287
|
+
68,
|
|
288
|
+
68,
|
|
289
|
+
68,
|
|
290
|
+
68,
|
|
291
|
+
68,
|
|
292
|
+
68,
|
|
293
|
+
36,
|
|
294
|
+
9
|
|
295
|
+
]), 0, 6))[1];
|
|
296
|
+
var doct = (/*#__PURE__ */ rfse(/*#__PURE__*/ new u8([
|
|
297
|
+
32,
|
|
298
|
+
132,
|
|
299
|
+
16,
|
|
300
|
+
66,
|
|
301
|
+
102,
|
|
302
|
+
70,
|
|
303
|
+
68,
|
|
304
|
+
68,
|
|
305
|
+
68,
|
|
306
|
+
68,
|
|
307
|
+
36,
|
|
308
|
+
73,
|
|
309
|
+
2
|
|
310
|
+
]), 0, 5))[1];
|
|
311
|
+
var b2bl = function(b, s) {
|
|
312
|
+
var len = b.length, bl = new i32(len);
|
|
313
|
+
for (var i = 0; i < len; ++i) {
|
|
314
|
+
bl[i] = s;
|
|
315
|
+
s += 1 << b[i];
|
|
316
|
+
}
|
|
317
|
+
return bl;
|
|
318
|
+
};
|
|
319
|
+
var llb = /*#__PURE__ */ new u8((/*#__PURE__ */ new i32([
|
|
320
|
+
0,
|
|
321
|
+
0,
|
|
322
|
+
0,
|
|
323
|
+
0,
|
|
324
|
+
16843009,
|
|
325
|
+
50528770,
|
|
326
|
+
134678020,
|
|
327
|
+
202050057,
|
|
328
|
+
269422093
|
|
329
|
+
])).buffer, 0, 36);
|
|
330
|
+
var llbl = /*#__PURE__ */ b2bl(llb, 0);
|
|
331
|
+
var mlb = /*#__PURE__ */ new u8((/*#__PURE__ */ new i32([
|
|
332
|
+
0,
|
|
333
|
+
0,
|
|
334
|
+
0,
|
|
335
|
+
0,
|
|
336
|
+
0,
|
|
337
|
+
0,
|
|
338
|
+
0,
|
|
339
|
+
0,
|
|
340
|
+
16843009,
|
|
341
|
+
50528770,
|
|
342
|
+
117769220,
|
|
343
|
+
185207048,
|
|
344
|
+
252579084,
|
|
345
|
+
16
|
|
346
|
+
])).buffer, 0, 53);
|
|
347
|
+
var mlbl = /*#__PURE__ */ b2bl(mlb, 3);
|
|
348
|
+
var dhu = function(dat, out, hu) {
|
|
349
|
+
var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;
|
|
350
|
+
if (!lb) err(0);
|
|
351
|
+
var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;
|
|
352
|
+
for (; pos > eb && i < ss;) {
|
|
353
|
+
var cbt = pos >> 3;
|
|
354
|
+
var val = (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7);
|
|
355
|
+
st = (st << btr | val) & msk;
|
|
356
|
+
out[++i] = hu.s[st];
|
|
357
|
+
pos -= btr = hu.n[st];
|
|
358
|
+
}
|
|
359
|
+
if (pos != eb || i + 1 != ss) err(0);
|
|
360
|
+
};
|
|
361
|
+
var dhu4 = function(dat, out, hu) {
|
|
362
|
+
var bt = 6;
|
|
363
|
+
var sz1 = out.length + 3 >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;
|
|
364
|
+
dhu(dat.subarray(bt, bt += dat[0] | dat[1] << 8), out.subarray(0, sz1), hu);
|
|
365
|
+
dhu(dat.subarray(bt, bt += dat[2] | dat[3] << 8), out.subarray(sz1, sz2), hu);
|
|
366
|
+
dhu(dat.subarray(bt, bt += dat[4] | dat[5] << 8), out.subarray(sz2, sz3), hu);
|
|
367
|
+
dhu(dat.subarray(bt), out.subarray(sz3), hu);
|
|
368
|
+
};
|
|
369
|
+
var rzb = function(dat, st, out) {
|
|
370
|
+
var _a;
|
|
371
|
+
var bt = st.b;
|
|
372
|
+
var b0 = dat[bt], btype = b0 >> 1 & 3;
|
|
373
|
+
st.l = b0 & 1;
|
|
374
|
+
var sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13;
|
|
375
|
+
var ebt = (bt += 3) + sz;
|
|
376
|
+
if (btype == 1) {
|
|
377
|
+
if (bt >= dat.length) return;
|
|
378
|
+
st.b = bt + 1;
|
|
379
|
+
if (out) {
|
|
380
|
+
fill(out, dat[bt], st.y, st.y += sz);
|
|
381
|
+
return out;
|
|
382
|
+
}
|
|
383
|
+
return fill(new u8(sz), dat[bt]);
|
|
384
|
+
}
|
|
385
|
+
if (ebt > dat.length) return;
|
|
386
|
+
if (btype == 0) {
|
|
387
|
+
st.b = ebt;
|
|
388
|
+
if (out) {
|
|
389
|
+
out.set(dat.subarray(bt, ebt), st.y);
|
|
390
|
+
st.y += sz;
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
return slc(dat, bt, ebt);
|
|
394
|
+
}
|
|
395
|
+
if (btype == 2) {
|
|
396
|
+
var b3 = dat[bt], lbt = b3 & 3, sf = b3 >> 2 & 3;
|
|
397
|
+
var lss = b3 >> 4, lcs = 0, s4 = 0;
|
|
398
|
+
if (lbt < 2) {
|
|
399
|
+
if (sf & 1) lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12);
|
|
400
|
+
else lss = b3 >> 3;
|
|
401
|
+
} else {
|
|
402
|
+
s4 = sf;
|
|
403
|
+
if (sf < 2) lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2;
|
|
404
|
+
else if (sf == 2) lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12, lcs = dat[bt] >> 2 | dat[++bt] << 6;
|
|
405
|
+
else lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12, lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10;
|
|
406
|
+
}
|
|
407
|
+
++bt;
|
|
408
|
+
var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);
|
|
409
|
+
var spl = buf.length - lss;
|
|
410
|
+
if (lbt == 0) buf.set(dat.subarray(bt, bt += lss), spl);
|
|
411
|
+
else if (lbt == 1) fill(buf, dat[bt++], spl);
|
|
412
|
+
else {
|
|
413
|
+
var hu = st.h;
|
|
414
|
+
if (lbt == 2) {
|
|
415
|
+
var hud = rhu(dat, bt);
|
|
416
|
+
lcs += bt - (bt = hud[0]);
|
|
417
|
+
st.h = hu = hud[1];
|
|
418
|
+
} else if (!hu) err(0);
|
|
419
|
+
(s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);
|
|
420
|
+
}
|
|
421
|
+
var ns = dat[bt++];
|
|
422
|
+
if (ns) {
|
|
423
|
+
if (ns == 255) ns = (dat[bt++] | dat[bt++] << 8) + 32512;
|
|
424
|
+
else if (ns > 127) ns = ns - 128 << 8 | dat[bt++];
|
|
425
|
+
var scm = dat[bt++];
|
|
426
|
+
if (scm & 3) err(0);
|
|
427
|
+
var dts = [
|
|
428
|
+
dmlt,
|
|
429
|
+
doct,
|
|
430
|
+
dllt
|
|
431
|
+
];
|
|
432
|
+
for (var i = 2; i > -1; --i) {
|
|
433
|
+
var md = scm >> (i << 1) + 2 & 3;
|
|
434
|
+
if (md == 1) {
|
|
435
|
+
var rbuf = new u8([
|
|
436
|
+
0,
|
|
437
|
+
0,
|
|
438
|
+
dat[bt++]
|
|
439
|
+
]);
|
|
440
|
+
dts[i] = {
|
|
441
|
+
s: rbuf.subarray(2, 3),
|
|
442
|
+
n: rbuf.subarray(0, 1),
|
|
443
|
+
t: new u16(rbuf.buffer, 0, 1),
|
|
444
|
+
b: 0
|
|
445
|
+
};
|
|
446
|
+
} else if (md == 2) _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];
|
|
447
|
+
else if (md == 3) {
|
|
448
|
+
if (!st.t) err(0);
|
|
449
|
+
dts[i] = st.t[i];
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];
|
|
453
|
+
var lb = dat[ebt - 1];
|
|
454
|
+
if (!lb) err(0);
|
|
455
|
+
var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;
|
|
456
|
+
var lst = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1;
|
|
457
|
+
cbt = (spos -= oct.b) >> 3;
|
|
458
|
+
var ost = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1;
|
|
459
|
+
cbt = (spos -= mlt.b) >> 3;
|
|
460
|
+
var mst = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1;
|
|
461
|
+
for (++ns; --ns;) {
|
|
462
|
+
var llc = llt.s[lst];
|
|
463
|
+
var lbtr = llt.n[lst];
|
|
464
|
+
var mlc = mlt.s[mst];
|
|
465
|
+
var mbtr = mlt.n[mst];
|
|
466
|
+
var ofc = oct.s[ost];
|
|
467
|
+
var obtr = oct.n[ost];
|
|
468
|
+
cbt = (spos -= ofc) >> 3;
|
|
469
|
+
var ofp = 1 << ofc;
|
|
470
|
+
var off = ofp + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16 | dat[cbt + 3] << 24) >>> (spos & 7) & ofp - 1);
|
|
471
|
+
cbt = (spos -= mlb[mlc]) >> 3;
|
|
472
|
+
var ml = mlbl[mlc] + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (spos & 7) & (1 << mlb[mlc]) - 1);
|
|
473
|
+
cbt = (spos -= llb[llc]) >> 3;
|
|
474
|
+
var ll = llbl[llc] + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (spos & 7) & (1 << llb[llc]) - 1);
|
|
475
|
+
cbt = (spos -= lbtr) >> 3;
|
|
476
|
+
lst = llt.t[lst] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1);
|
|
477
|
+
cbt = (spos -= mbtr) >> 3;
|
|
478
|
+
mst = mlt.t[mst] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1);
|
|
479
|
+
cbt = (spos -= obtr) >> 3;
|
|
480
|
+
ost = oct.t[ost] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1);
|
|
481
|
+
if (off > 3) {
|
|
482
|
+
st.o[2] = st.o[1];
|
|
483
|
+
st.o[1] = st.o[0];
|
|
484
|
+
st.o[0] = off -= 3;
|
|
485
|
+
} else {
|
|
486
|
+
var idx = off - (ll != 0);
|
|
487
|
+
if (idx) {
|
|
488
|
+
off = idx == 3 ? st.o[0] - 1 : st.o[idx];
|
|
489
|
+
if (idx > 1) st.o[2] = st.o[1];
|
|
490
|
+
st.o[1] = st.o[0];
|
|
491
|
+
st.o[0] = off;
|
|
492
|
+
} else off = st.o[0];
|
|
493
|
+
}
|
|
494
|
+
for (var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i];
|
|
495
|
+
oubt += ll, spl += ll;
|
|
496
|
+
var stin = oubt - off;
|
|
497
|
+
if (stin < 0) {
|
|
498
|
+
var len = -stin;
|
|
499
|
+
var bs = st.e + stin;
|
|
500
|
+
if (len > ml) len = ml;
|
|
501
|
+
for (var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i];
|
|
502
|
+
oubt += len, ml -= len, stin = 0;
|
|
503
|
+
}
|
|
504
|
+
for (var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i];
|
|
505
|
+
oubt += ml;
|
|
506
|
+
}
|
|
507
|
+
if (oubt != spl) while (spl < buf.length) buf[oubt++] = buf[spl++];
|
|
508
|
+
else oubt = buf.length;
|
|
509
|
+
if (out) st.y += oubt;
|
|
510
|
+
else buf = slc(buf, 0, oubt);
|
|
511
|
+
} else if (out) {
|
|
512
|
+
st.y += lss;
|
|
513
|
+
if (spl) for (var i = 0; i < lss; ++i) buf[i] = buf[spl + i];
|
|
514
|
+
} else if (spl) buf = slc(buf, spl);
|
|
515
|
+
st.b = ebt;
|
|
516
|
+
return buf;
|
|
517
|
+
}
|
|
518
|
+
err(2);
|
|
519
|
+
};
|
|
520
|
+
var cct = function(bufs, ol) {
|
|
521
|
+
if (bufs.length == 1) return bufs[0];
|
|
522
|
+
var buf = new u8(ol);
|
|
523
|
+
for (var i = 0, b = 0; i < bufs.length; ++i) {
|
|
524
|
+
var chk = bufs[i];
|
|
525
|
+
buf.set(chk, b);
|
|
526
|
+
b += chk.length;
|
|
527
|
+
}
|
|
528
|
+
return buf;
|
|
529
|
+
};
|
|
530
|
+
/**
|
|
531
|
+
* Decompresses Zstandard data
|
|
532
|
+
* @param dat The input data
|
|
533
|
+
* @param buf The output buffer. If unspecified, the function will allocate
|
|
534
|
+
* exactly enough memory to fit the decompressed data. If your
|
|
535
|
+
* data has multiple frames and you know the output size, specifying
|
|
536
|
+
* it will yield better performance.
|
|
537
|
+
* @returns The decompressed data
|
|
538
|
+
*/
|
|
539
|
+
function decompress(dat, buf) {
|
|
540
|
+
var bufs = [], nb = +!buf;
|
|
541
|
+
var bt = 0, ol = 0;
|
|
542
|
+
for (; dat.length;) {
|
|
543
|
+
var st = rzfh(dat, nb || buf);
|
|
544
|
+
if (typeof st == "object") {
|
|
545
|
+
if (nb) {
|
|
546
|
+
buf = null;
|
|
547
|
+
if (st.w.length == st.u) {
|
|
548
|
+
bufs.push(buf = st.w);
|
|
549
|
+
ol += st.u;
|
|
550
|
+
}
|
|
551
|
+
} else {
|
|
552
|
+
bufs.push(buf);
|
|
553
|
+
st.e = 0;
|
|
554
|
+
}
|
|
555
|
+
for (; !st.l;) {
|
|
556
|
+
var blk = rzb(dat, st, buf);
|
|
557
|
+
if (!blk) err(5);
|
|
558
|
+
if (buf) st.e = st.y;
|
|
559
|
+
else {
|
|
560
|
+
bufs.push(blk);
|
|
561
|
+
ol += blk.length;
|
|
562
|
+
cpw(st.w, 0, blk.length);
|
|
563
|
+
st.w.set(blk, st.w.length - blk.length);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
bt = st.b + st.c * 4;
|
|
567
|
+
} else bt = st;
|
|
568
|
+
dat = dat.subarray(bt);
|
|
569
|
+
}
|
|
570
|
+
return cct(bufs, ol);
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Decompressor for Zstandard streamed data
|
|
574
|
+
*/
|
|
575
|
+
var Decompress = /* @__PURE__ */ function() {
|
|
576
|
+
/**
|
|
577
|
+
* Creates a Zstandard decompressor
|
|
578
|
+
* @param ondata The handler for stream data
|
|
579
|
+
*/
|
|
580
|
+
function Decompress(ondata) {
|
|
581
|
+
this.ondata = ondata;
|
|
582
|
+
this.c = [];
|
|
583
|
+
this.l = 0;
|
|
584
|
+
this.z = 0;
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Pushes data to be decompressed
|
|
588
|
+
* @param chunk The chunk of data to push
|
|
589
|
+
* @param final Whether or not this is the last chunk in the stream
|
|
590
|
+
*/
|
|
591
|
+
Decompress.prototype.push = function(chunk, final) {
|
|
592
|
+
if (typeof this.s == "number") {
|
|
593
|
+
var sub = Math.min(chunk.length, this.s);
|
|
594
|
+
chunk = chunk.subarray(sub);
|
|
595
|
+
this.s -= sub;
|
|
596
|
+
}
|
|
597
|
+
var ncs = chunk.length + this.l;
|
|
598
|
+
if (!this.s) {
|
|
599
|
+
if (final) {
|
|
600
|
+
if (!ncs) {
|
|
601
|
+
this.ondata(new u8(0), true);
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
if (ncs < 5) err(5);
|
|
605
|
+
} else if (ncs < 18) {
|
|
606
|
+
this.c.push(chunk);
|
|
607
|
+
this.l = ncs;
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
if (this.l) {
|
|
611
|
+
this.c.push(chunk);
|
|
612
|
+
chunk = cct(this.c, ncs);
|
|
613
|
+
this.c = [];
|
|
614
|
+
this.l = 0;
|
|
615
|
+
}
|
|
616
|
+
if (typeof (this.s = rzfh(chunk)) == "number") return this.push(chunk, final);
|
|
617
|
+
}
|
|
618
|
+
if (typeof this.s != "number") {
|
|
619
|
+
if (ncs < (this.z || 3)) {
|
|
620
|
+
if (final) err(5);
|
|
621
|
+
this.c.push(chunk);
|
|
622
|
+
this.l = ncs;
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (this.l) {
|
|
626
|
+
this.c.push(chunk);
|
|
627
|
+
chunk = cct(this.c, ncs);
|
|
628
|
+
this.c = [];
|
|
629
|
+
this.l = 0;
|
|
630
|
+
}
|
|
631
|
+
if (!this.z && ncs < (this.z = chunk[this.s.b] & 2 ? 4 : 3 + (chunk[this.s.b] >> 3 | chunk[this.s.b + 1] << 5 | chunk[this.s.b + 2] << 13))) {
|
|
632
|
+
if (final) err(5);
|
|
633
|
+
this.c.push(chunk);
|
|
634
|
+
this.l = ncs;
|
|
635
|
+
return;
|
|
636
|
+
} else this.z = 0;
|
|
637
|
+
for (;;) {
|
|
638
|
+
var blk = rzb(chunk, this.s);
|
|
639
|
+
if (!blk) {
|
|
640
|
+
if (final) err(5);
|
|
641
|
+
var adc = chunk.subarray(this.s.b);
|
|
642
|
+
this.s.b = 0;
|
|
643
|
+
this.c.push(adc), this.l += adc.length;
|
|
644
|
+
return;
|
|
645
|
+
} else {
|
|
646
|
+
this.ondata(blk, false);
|
|
647
|
+
cpw(this.s.w, 0, blk.length);
|
|
648
|
+
this.s.w.set(blk, this.s.w.length - blk.length);
|
|
649
|
+
}
|
|
650
|
+
if (this.s.l) {
|
|
651
|
+
var rest = chunk.subarray(this.s.b);
|
|
652
|
+
this.s = this.s.c * 4;
|
|
653
|
+
this.push(rest, final);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
} else if (final) err(5);
|
|
658
|
+
};
|
|
659
|
+
return Decompress;
|
|
660
|
+
}();
|
|
661
|
+
//#endregion
|
|
662
|
+
export { Decompress, ZstdErrorCode, decompress };
|