piclaw 0.0.19 → 0.0.21

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 (270) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/defult-D5RLDUrI.js +1 -0
  3. package/.output/public/assets/{dist-CMBqBOCp.js → dist-BH_oa-kv.js} +1 -1
  4. package/.output/public/assets/index-7JvURuHy.js +204 -0
  5. package/.output/public/assets/index-K43slwjJ.css +1 -0
  6. package/.output/public/index.html +11 -2
  7. package/.output/server/_...path_.get.mjs +16 -0
  8. package/.output/server/_chunks/app.mjs +261 -181
  9. package/.output/server/_chunks/browser.mjs +4 -1
  10. package/.output/server/_chunks/config.mjs +4 -0
  11. package/.output/server/_chunks/db.mjs +32 -28
  12. package/.output/server/_chunks/device-bus.mjs +123 -0
  13. package/.output/server/_chunks/dummy.mjs +1 -1
  14. package/.output/server/_chunks/logger.mjs +23 -0
  15. package/.output/server/_chunks/login.mjs +1 -1
  16. package/.output/server/_chunks/notes.mjs +1 -3
  17. package/.output/server/_chunks/renderer-template.mjs +1 -1
  18. package/.output/server/_chunks/sandbox.mjs +217 -0
  19. package/.output/server/_chunks/server.mjs +2302 -122
  20. package/.output/server/_chunks/terminal.mjs +63 -8
  21. package/.output/server/_chunks/uploads.mjs +60 -0
  22. package/.output/server/_chunks/virtual.mjs +192 -54
  23. package/.output/server/_id_.delete.mjs +5 -2
  24. package/.output/server/_id_.patch.mjs +2 -0
  25. package/.output/server/_id_2.delete.mjs +8 -0
  26. package/.output/server/_jid_.delete.mjs +5 -2
  27. package/.output/server/_jid_.patch.mjs +37 -4
  28. package/.output/server/_jid_2.delete.mjs +5 -2
  29. package/.output/server/_libs/@acemir/cssom+[...].mjs +2269 -1137
  30. package/.output/server/_libs/@google/genai.mjs +337 -273
  31. package/.output/server/_libs/@mariozechner/pi-agent-core+[...].mjs +381 -2073
  32. package/.output/server/_libs/@mariozechner/pi-coding-agent+[...].mjs +231 -131
  33. package/.output/server/_libs/_.mjs +3 -2
  34. package/.output/server/_libs/_10.mjs +2 -4
  35. package/.output/server/_libs/_11.mjs +2 -4
  36. package/.output/server/_libs/_12.mjs +2 -3
  37. package/.output/server/_libs/_13.mjs +2 -3
  38. package/.output/server/_libs/_14.mjs +2 -4
  39. package/.output/server/_libs/_15.mjs +2 -4
  40. package/.output/server/_libs/_16.mjs +2 -3
  41. package/.output/server/_libs/_17.mjs +2 -4
  42. package/.output/server/_libs/_18.mjs +2 -2
  43. package/.output/server/_libs/_19.mjs +2 -2
  44. package/.output/server/_libs/_2.mjs +3 -3
  45. package/.output/server/_libs/_20.mjs +2 -2
  46. package/.output/server/_libs/_21.mjs +2 -2
  47. package/.output/server/_libs/_22.mjs +2 -2
  48. package/.output/server/_libs/_23.mjs +2 -2
  49. package/.output/server/_libs/_24.mjs +2 -2
  50. package/.output/server/_libs/_25.mjs +2 -2
  51. package/.output/server/_libs/_26.mjs +2 -2
  52. package/.output/server/_libs/_27.mjs +2 -2
  53. package/.output/server/_libs/_28.mjs +2 -2
  54. package/.output/server/_libs/_29.mjs +2 -2
  55. package/.output/server/_libs/_3.mjs +3 -3
  56. package/.output/server/_libs/_30.mjs +2 -2
  57. package/.output/server/_libs/_31.mjs +2 -2
  58. package/.output/server/_libs/_32.mjs +2 -2
  59. package/.output/server/_libs/_33.mjs +2 -2
  60. package/.output/server/_libs/_34.mjs +2 -2
  61. package/.output/server/_libs/_35.mjs +2 -2
  62. package/.output/server/_libs/_36.mjs +2 -2
  63. package/.output/server/_libs/_37.mjs +2 -2
  64. package/.output/server/_libs/_38.mjs +2 -2
  65. package/.output/server/_libs/_39.mjs +2 -2
  66. package/.output/server/_libs/_4.mjs +4 -3
  67. package/.output/server/_libs/_40.mjs +2 -2
  68. package/.output/server/_libs/_41.mjs +2 -2
  69. package/.output/server/_libs/_42.mjs +2 -2
  70. package/.output/server/_libs/_43.mjs +2 -2
  71. package/.output/server/_libs/_44.mjs +2 -2
  72. package/.output/server/_libs/_45.mjs +2 -2
  73. package/.output/server/_libs/_46.mjs +2 -2
  74. package/.output/server/_libs/_47.mjs +2 -2
  75. package/.output/server/_libs/_48.mjs +2 -2
  76. package/.output/server/_libs/_49.mjs +2 -2
  77. package/.output/server/_libs/_5.mjs +2 -3
  78. package/.output/server/_libs/_50.mjs +2 -2
  79. package/.output/server/_libs/_51.mjs +2 -2
  80. package/.output/server/_libs/_52.mjs +2 -2
  81. package/.output/server/_libs/_53.mjs +2 -2
  82. package/.output/server/_libs/_54.mjs +2 -2
  83. package/.output/server/_libs/_55.mjs +2 -2
  84. package/.output/server/_libs/_56.mjs +2 -2
  85. package/.output/server/_libs/_57.mjs +2 -2
  86. package/.output/server/_libs/_58.mjs +2 -2
  87. package/.output/server/_libs/_59.mjs +2 -2
  88. package/.output/server/_libs/_6.mjs +2 -3
  89. package/.output/server/_libs/_60.mjs +2 -2
  90. package/.output/server/_libs/_61.mjs +2 -2
  91. package/.output/server/_libs/_62.mjs +2 -2
  92. package/.output/server/_libs/_63.mjs +2 -2
  93. package/.output/server/_libs/_64.mjs +2 -2
  94. package/.output/server/_libs/_65.mjs +2 -2
  95. package/.output/server/_libs/_66.mjs +2 -2
  96. package/.output/server/_libs/_67.mjs +2 -2
  97. package/.output/server/_libs/_68.mjs +2 -2
  98. package/.output/server/_libs/_69.mjs +2 -2
  99. package/.output/server/_libs/_7.mjs +2 -5
  100. package/.output/server/_libs/_70.mjs +2 -2
  101. package/.output/server/_libs/_71.mjs +2 -2
  102. package/.output/server/_libs/_72.mjs +2 -2
  103. package/.output/server/_libs/_73.mjs +2 -2
  104. package/.output/server/_libs/_74.mjs +2 -2
  105. package/.output/server/_libs/_75.mjs +2 -2
  106. package/.output/server/_libs/_76.mjs +2 -2
  107. package/.output/server/_libs/_77.mjs +2 -2
  108. package/.output/server/_libs/_78.mjs +2 -2
  109. package/.output/server/_libs/_79.mjs +2 -2
  110. package/.output/server/_libs/_8.mjs +2 -3
  111. package/.output/server/_libs/_80.mjs +2 -2
  112. package/.output/server/_libs/_81.mjs +2 -2
  113. package/.output/server/_libs/_82.mjs +2 -2
  114. package/.output/server/_libs/_83.mjs +2 -2
  115. package/.output/server/_libs/_84.mjs +2 -2
  116. package/.output/server/_libs/_85.mjs +2 -2
  117. package/.output/server/_libs/_86.mjs +2 -2
  118. package/.output/server/_libs/_87.mjs +2 -2
  119. package/.output/server/_libs/_88.mjs +2 -2
  120. package/.output/server/_libs/_89.mjs +2 -2
  121. package/.output/server/_libs/_9.mjs +2 -4
  122. package/.output/server/_libs/_90.mjs +5 -2
  123. package/.output/server/_libs/_91.mjs +3 -2
  124. package/.output/server/_libs/_92.mjs +2 -2
  125. package/.output/server/_libs/_93.mjs +2 -2
  126. package/.output/server/_libs/_94.mjs +2 -2
  127. package/.output/server/_libs/agent-base.mjs +1 -1
  128. package/.output/server/_libs/cheerio+[...].mjs +1 -1
  129. package/.output/server/_libs/data-uri-to-buffer.mjs +2 -67
  130. package/.output/server/_libs/data-urls+[...].mjs +1 -1
  131. package/.output/server/_libs/diff.mjs +1 -1
  132. package/.output/server/_libs/exodus__bytes.mjs +99 -81
  133. package/.output/server/_libs/fetch-blob+node-domexception.mjs +1 -1
  134. package/.output/server/_libs/h3+rou3+srvx.mjs +34 -4
  135. package/.output/server/_libs/html-encoding-sniffer.mjs +1 -1
  136. package/.output/server/_libs/https-proxy-agent.mjs +2 -2
  137. package/.output/server/_libs/jsdom.mjs +1 -1
  138. package/.output/server/_libs/just-bash+[...].mjs +4676 -3916
  139. package/.output/server/_libs/mariozechner__jiti.mjs +1 -1
  140. package/.output/server/_libs/mariozechner__pi-ai.mjs +1472 -0
  141. package/.output/server/_libs/md4x.mjs +1 -1
  142. package/.output/server/_libs/mime.mjs +838 -1
  143. package/.output/server/_libs/node-fetch.mjs +4 -4
  144. package/.output/server/_libs/node-liblzma.mjs +1 -1
  145. package/.output/server/_libs/silvia-odwyer__photon-node.mjs +1 -1
  146. package/.output/server/_routes/api/auth/approve.mjs +2 -0
  147. package/.output/server/_routes/api/auth/revoke.mjs +2 -0
  148. package/.output/server/_routes/api/auth/status.mjs +25 -6
  149. package/.output/server/_routes/api/browser2.mjs +1 -1
  150. package/.output/server/_routes/api/config2.mjs +2 -0
  151. package/.output/server/_routes/api/device_events.mjs +36 -0
  152. package/.output/server/_routes/api/files/groups.mjs +1 -2
  153. package/.output/server/_routes/api/files/raw.mjs +1 -1
  154. package/.output/server/_routes/api/groups.mjs +5 -3
  155. package/.output/server/_routes/api/groups2.mjs +18 -6
  156. package/.output/server/_routes/api/health.mjs +1 -2
  157. package/.output/server/_routes/api/messages.mjs +7 -1
  158. package/.output/server/_routes/api/notes/delete.mjs +4 -1
  159. package/.output/server/_routes/api/notes/write.mjs +2 -0
  160. package/.output/server/_routes/api/ntfy/setup.mjs +8 -0
  161. package/.output/server/_routes/api/pi/apikey.mjs +3 -2
  162. package/.output/server/_routes/api/pi/apikey_providers.mjs +1 -2
  163. package/.output/server/_routes/api/pi/commands.mjs +13 -3
  164. package/.output/server/_routes/api/pi/login/events.mjs +0 -1
  165. package/.output/server/_routes/api/pi/login/respond.mjs +2 -1
  166. package/.output/server/_routes/api/pi/login.mjs +1 -2
  167. package/.output/server/_routes/api/pi/logout.mjs +2 -1
  168. package/.output/server/_routes/api/pi/models.mjs +1 -2
  169. package/.output/server/_routes/api/pi/models_config2.mjs +2 -0
  170. package/.output/server/_routes/api/pi/settings2.mjs +2 -0
  171. package/.output/server/_routes/api/pi/status.mjs +1 -2
  172. package/.output/server/_routes/api/proxy.mjs +19 -1
  173. package/.output/server/_routes/api/sandbox.mjs +26 -0
  174. package/.output/server/_routes/api/sandbox2.mjs +17 -0
  175. package/.output/server/_routes/api/send.mjs +26 -18
  176. package/.output/server/_routes/api/status.mjs +1 -3
  177. package/.output/server/_routes/api/stop.mjs +11 -0
  178. package/.output/server/_routes/api/store/plugins.mjs +75 -0
  179. package/.output/server/_routes/api/store/skills.mjs +11 -0
  180. package/.output/server/_routes/api/tasks2.mjs +3 -2
  181. package/.output/server/_routes/api/telegram/setup.mjs +5 -2
  182. package/.output/server/_routes/api/telegram/status.mjs +1 -2
  183. package/.output/server/_routes/api/terminal2.mjs +2 -1
  184. package/.output/server/_routes/api/tunnel/setup.mjs +4 -2
  185. package/.output/server/_runtime.mjs +1 -2
  186. package/.output/server/_utils.mjs +10 -2
  187. package/.output/server/index.mjs +1 -1
  188. package/.output/server/node_modules/amdefine/amdefine.js +301 -0
  189. package/.output/server/node_modules/amdefine/package.json +16 -0
  190. package/.output/server/node_modules/compressjs/lib/BWT.js +420 -0
  191. package/.output/server/node_modules/compressjs/lib/BWTC.js +234 -0
  192. package/.output/server/node_modules/compressjs/lib/BitStream.js +108 -0
  193. package/.output/server/node_modules/compressjs/lib/Bzip2.js +936 -0
  194. package/.output/server/node_modules/compressjs/lib/CRC32.js +105 -0
  195. package/.output/server/node_modules/compressjs/lib/Context1Model.js +56 -0
  196. package/.output/server/node_modules/compressjs/lib/DefSumModel.js +152 -0
  197. package/.output/server/node_modules/compressjs/lib/DeflateDistanceModel.js +55 -0
  198. package/.output/server/node_modules/compressjs/lib/Dmc.js +197 -0
  199. package/.output/server/node_modules/compressjs/lib/DummyRangeCoder.js +81 -0
  200. package/.output/server/node_modules/compressjs/lib/FenwickModel.js +194 -0
  201. package/.output/server/node_modules/compressjs/lib/Huffman.js +514 -0
  202. package/.output/server/node_modules/compressjs/lib/HuffmanAllocator.js +227 -0
  203. package/.output/server/node_modules/compressjs/lib/LogDistanceModel.js +46 -0
  204. package/.output/server/node_modules/compressjs/lib/Lzjb.js +300 -0
  205. package/.output/server/node_modules/compressjs/lib/LzjbR.js +241 -0
  206. package/.output/server/node_modules/compressjs/lib/Lzp3.js +273 -0
  207. package/.output/server/node_modules/compressjs/lib/MTFModel.js +208 -0
  208. package/.output/server/node_modules/compressjs/lib/NoModel.js +46 -0
  209. package/.output/server/node_modules/compressjs/lib/PPM.js +343 -0
  210. package/.output/server/node_modules/compressjs/lib/RangeCoder.js +238 -0
  211. package/.output/server/node_modules/compressjs/lib/Simple.js +111 -0
  212. package/.output/server/node_modules/compressjs/lib/Stream.js +53 -0
  213. package/.output/server/node_modules/compressjs/lib/Util.js +324 -0
  214. package/.output/server/node_modules/compressjs/lib/freeze.js +14 -0
  215. package/.output/server/node_modules/compressjs/main.js +29 -0
  216. package/.output/server/node_modules/compressjs/package.json +35 -0
  217. package/.output/server/package.json +2 -1
  218. package/README.md +10 -1
  219. package/lib/index.d.mts +1 -0
  220. package/lib/index.mjs +1 -0
  221. package/lib/piclaw.mjs +100 -0
  222. package/lib/utils.mjs +96 -0
  223. package/package.json +16 -11
  224. package/.output/public/assets/defult-CMO6TZ5a.js +0 -1
  225. package/.output/public/assets/index-jdnbJw-M.js +0 -204
  226. package/.output/public/assets/index-ooXrRwgl.css +0 -1
  227. package/.output/server/_chunks/commands.mjs +0 -282
  228. package/.output/server/_chunks/pi.mjs +0 -202
  229. package/.output/server/_chunks/session.mjs +0 -1114
  230. package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +0 -299
  231. package/.output/server/_libs/@aws-sdk/client-bedrock-runtime+[...].mjs +0 -17828
  232. package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +0 -122
  233. package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +0 -417
  234. package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +0 -54
  235. package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +0 -1151
  236. package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +0 -50
  237. package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +0 -369
  238. package/.output/server/_libs/@tootallnate/quickjs-emscripten+[...].mjs +0 -3011
  239. package/.output/server/_libs/_100.mjs +0 -2
  240. package/.output/server/_libs/_101.mjs +0 -2
  241. package/.output/server/_libs/_102.mjs +0 -5
  242. package/.output/server/_libs/_103.mjs +0 -3
  243. package/.output/server/_libs/_104.mjs +0 -2
  244. package/.output/server/_libs/_105.mjs +0 -3
  245. package/.output/server/_libs/_106.mjs +0 -2
  246. package/.output/server/_libs/_107.mjs +0 -2
  247. package/.output/server/_libs/_95.mjs +0 -2
  248. package/.output/server/_libs/_96.mjs +0 -2
  249. package/.output/server/_libs/_97.mjs +0 -2
  250. package/.output/server/_libs/_98.mjs +0 -2
  251. package/.output/server/_libs/_99.mjs +0 -2
  252. package/.output/server/_libs/amdefine.mjs +0 -188
  253. package/.output/server/_libs/ast-types.mjs +0 -2270
  254. package/.output/server/_libs/aws-sdk__nested-clients.mjs +0 -3141
  255. package/.output/server/_libs/basic-ftp.mjs +0 -1906
  256. package/.output/server/_libs/compressjs.mjs +0 -50
  257. package/.output/server/_libs/degenerator+[...].mjs +0 -9964
  258. package/.output/server/_libs/get-uri.mjs +0 -413
  259. package/.output/server/_libs/http-proxy-agent.mjs +0 -123
  260. package/.output/server/_libs/ip-address.mjs +0 -1423
  261. package/.output/server/_libs/lru-cache.mjs +0 -732
  262. package/.output/server/_libs/netmask.mjs +0 -139
  263. package/.output/server/_libs/pac-proxy-agent+[...].mjs +0 -3104
  264. package/.output/server/_libs/proxy-agent+proxy-from-env.mjs +0 -204
  265. package/.output/server/_libs/smithy__core.mjs +0 -192
  266. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  267. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  268. package/.output/server/node_modules/tslib/package.json +0 -47
  269. package/.output/server/node_modules/tslib/tslib.js +0 -484
  270. package/bin/piclaw.mjs +0 -195
@@ -0,0 +1,420 @@
1
+ /** Burrows-Wheeler transform, computed with the Induced Sorting Suffix Array
2
+ * construction mechanism (sais). Code is a port of:
3
+ * https://sites.google.com/site/yuta256/sais
4
+ * which is:
5
+ * Copyright (c) 2008-2010 Yuta Mori All Rights Reserved.
6
+ * and licensed under an MIT/X11 license. I generally looked at both
7
+ * the C and the Java implementations to guide my work.
8
+ *
9
+ * This JavaScript port is:
10
+ * Copyright (c) 2013 C. Scott Ananian
11
+ * and licensed under GPLv2; see the README at the top level of this package.
12
+ */
13
+ if (typeof define !== 'function') { var define = require('amdefine')(module); }
14
+ define(['./freeze', './Util'], function(freeze, Util) {
15
+ var ASSERT = console.assert.bind(console);
16
+
17
+ // we're dispensing with the "arbitrary alphabet" stuff of the source
18
+ // and just using Uint8Arrays.
19
+
20
+ /** Find the start or end of each bucket. */
21
+ var getCounts = function(T, C, n, k) {
22
+ var i;
23
+ for (i = 0; i < k; i++) { C[i] = 0; }
24
+ for (i = 0; i < n; i++) { C[T[i]]++; }
25
+ };
26
+ var getBuckets = function(C, B, k, end) {
27
+ var i, sum = 0;
28
+ if (end) {
29
+ for (i = 0; i < k; i++) { sum += C[i]; B[i] = sum; }
30
+ } else {
31
+ for (i = 0; i < k; i++) { sum += C[i]; B[i] = sum - C[i]; }
32
+ }
33
+ };
34
+
35
+ /** Sort all type LMS suffixes */
36
+ var LMSsort = function(T, SA, C, B, n, k) {
37
+ var b, i, j;
38
+ var c0, c1;
39
+ /* compute SAl */
40
+ if (C === B) { getCounts(T, C, n, k); }
41
+ getBuckets(C, B, k, false); /* find starts of buckets */
42
+ j = n - 1;
43
+ b = B[c1 = T[j]];
44
+ j--;
45
+ SA[b++] = (T[j] < c1) ? ~j : j;
46
+ for (i = 0; i < n; i++) {
47
+ if ((j = SA[i]) > 0) {
48
+ ASSERT(T[j] >= T[j+1]);
49
+ if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
50
+ ASSERT(i < b);
51
+ j--;
52
+ SA[b++] = (T[j] < c1) ? ~j : j;
53
+ SA[i] = 0;
54
+ } else if (j < 0) {
55
+ SA[i] = ~j;
56
+ }
57
+ }
58
+ /* compute SAs */
59
+ if (C === B) { getCounts(T, C, n, k); }
60
+ getBuckets(C, B, k, 1); /* find ends of buckets */
61
+ for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
62
+ if ((j = SA[i]) > 0) {
63
+ ASSERT(T[j] <= T[j+1]);
64
+ if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
65
+ ASSERT(b <= i);
66
+ j--;
67
+ SA[--b] = (T[j] > c1) ? ~(j+1) : j;
68
+ SA[i] = 0;
69
+ }
70
+ }
71
+ };
72
+
73
+ var LMSpostproc = function(T, SA, n, m) {
74
+ var i, j, p, q, plen, qlen, name;
75
+ var c0, c1;
76
+ var diff;
77
+
78
+ /* compact all the sorted substrings into the first m items of SA
79
+ * 2*m must not be larger than n (provable) */
80
+ ASSERT(n > 0);
81
+ for (i = 0; (p = SA[i]) < 0; i++) { SA[i] = ~p; ASSERT((i+1) < n); }
82
+ if (i < m) {
83
+ for (j = i, i++; ; i++) {
84
+ ASSERT(i < n);
85
+ if ((p = SA[i]) < 0) {
86
+ SA[j++] = ~p; SA[i] = 0;
87
+ if (j === m) { break; }
88
+ }
89
+ }
90
+ }
91
+
92
+ /* store the length of all substrings */
93
+ c0 = T[i = j = n - 1];
94
+ do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) >= c1) );
95
+ for (; i >= 0; ) {
96
+ do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) <= c1) );
97
+ if (i >= 0) {
98
+ SA[m + ((i + 1) >>> 1)] = j - i; j = i + 1;
99
+ do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) >= c1) );
100
+ }
101
+ }
102
+
103
+ /* find the lexicographic names of all substrings */
104
+ for (i = 0, name = 0, q = n, qlen = 0; i < m; i++) {
105
+ p = SA[i]; plen = SA[m + (p >>> 1)]; diff = true;
106
+ if ((plen === qlen) && ((q + plen) < n)) {
107
+ for (j = 0; (j < plen) && (T[p + j] === T[q + j]); ) { j++; }
108
+ if (j === plen) { diff = false; }
109
+ }
110
+ if (diff) { name++; q = p; qlen = plen; }
111
+ SA[m + (p >>> 1)] = name;
112
+ }
113
+
114
+ return name;
115
+ };
116
+
117
+ /* compute SA and BWT */
118
+ var induceSA = function(T, SA, C, B, n, k) {
119
+ var b, i, j;
120
+ var c0, c1;
121
+ /* compute SAl */
122
+ if (C === B) { getCounts(T, C, n, k); }
123
+ getBuckets(C, B, k, false); /* find starts of buckets */
124
+ j = n - 1;
125
+ b = B[c1 = T[j]];
126
+ SA[b++] = ((j > 0) && (T[j-1] < c1)) ? ~j : j;
127
+ for (i = 0; i < n; i++) {
128
+ j = SA[i]; SA[i] = ~j;
129
+ if (j > 0) {
130
+ j--;
131
+ ASSERT( T[j] >= T[j + 1] );
132
+ if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1=c0]; }
133
+ ASSERT( i < b );
134
+ SA[b++] = ((j > 0) && (T[j-1] < c1)) ? ~j : j;
135
+ }
136
+ }
137
+ /* compute SAs */
138
+ if (C === B) { getCounts(T, C, n, k); }
139
+ getBuckets(C, B, k, true); /* find ends of buckets */
140
+ for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
141
+ if ((j = SA[i]) > 0) {
142
+ j--;
143
+ ASSERT( T[j] <= T[j + 1] );
144
+ if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
145
+ ASSERT( b <= i );
146
+ SA[--b] = ((j === 0) || (T[j - 1] > c1)) ? ~j : j;
147
+ } else {
148
+ SA[i] = ~j;
149
+ }
150
+ }
151
+ };
152
+
153
+ var computeBWT = function(T, SA, C, B, n, k) {
154
+ var b, i, j, pidx = -1;
155
+ var c0, c1;
156
+ /* compute SAl */
157
+ if (C === B) { getCounts(T, C, n, k); }
158
+ getBuckets(C, B, k, false); /* find starts of buckets */
159
+ j = n - 1;
160
+ b = B[c1 = T[j]];
161
+ SA[b++] = ((j > 0) && (T[j - 1] < c1)) ? ~j : j;
162
+ for (i = 0; i < n; i++) {
163
+ if ((j=SA[i]) > 0) {
164
+ j--;
165
+ ASSERT( T[j] >= T[j+1] );
166
+ SA[i] = ~(c0 = T[j]);
167
+ if (c0 !== c1) { B[c1] = b; b = B[c1 = c0]; }
168
+ ASSERT( i < b );
169
+ SA[b++] = ((j > 0) && (T[j - 1] < c1)) ? ~j : j;
170
+ } else if (j !== 0) {
171
+ SA[i] = ~j;
172
+ }
173
+ }
174
+ /* compute SAs */
175
+ if (C === B) { getCounts(T, C, n, k); }
176
+ getBuckets(C, B, k, true); /* find ends of buckets */
177
+ for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
178
+ if ((j = SA[i]) > 0) {
179
+ j--;
180
+ ASSERT( T[j] <= T[j+1] );
181
+ SA[i] = c0 = T[j];
182
+ if (c0 !== c1) { B[c1] = b; b = B[c1 = c0]; }
183
+ ASSERT( b <= i );
184
+ SA[--b] = ((j > 0) && (T[j-1] > c1)) ? (~T[j-1]) : j;
185
+ } else if (j !== 0) {
186
+ SA[i] = ~j;
187
+ } else {
188
+ pidx = i;
189
+ }
190
+ }
191
+ return pidx;
192
+ };
193
+
194
+ /* find the suffix array SA of T[0..n-1] in {0..k-1}^n
195
+ use a working space (excluding T and SA) of at most 2n+O(1) for a
196
+ constant alphabet */
197
+ var SA_IS = function(T, SA, fs, n, k, isbwt) {
198
+ var C, B, RA;
199
+ var i, j, b, c, m, p, q, name, pidx = 0, newfs;
200
+ var c0, c1;
201
+ var flags = 0;
202
+
203
+ // allocate temporary storage [CSA]
204
+ if (k <= 256) {
205
+ C = Util.makeS32Buffer(k);
206
+ if (k <= fs) { B = SA.subarray(n + fs - k); flags = 1; }
207
+ else { B = Util.makeS32Buffer(k); flags = 3; }
208
+ } else if (k <= fs) {
209
+ C = SA.subarray(n + fs - k);
210
+ if (k <= (fs - k)) { B = SA.subarray(n + fs - k * 2); flags = 0; }
211
+ else if (k <= 1024) { B = Util.makeS32Buffer(k); flags = 2; }
212
+ else { B = C; flags = 8; }
213
+ } else {
214
+ C = B = Util.makeS32Buffer(k);
215
+ flags = 4 | 8;
216
+ }
217
+
218
+ /* stage 1: reduce the problem by at least 1/2
219
+ sort all the LMS-substrings */
220
+ getCounts(T, C, n, k);
221
+ getBuckets(C, B, k, true); /* find ends of buckets */
222
+ for (i = 0; i < n; i++) { SA[i] = 0; }
223
+ b = -1; i = n - 1; j = n; m = 0; c0 = T[n - 1];
224
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
225
+ for (; i >= 0 ;) {
226
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) <= c1));
227
+ if ( i >= 0 ) {
228
+ if ( b >= 0 ) { SA[b] = j; }
229
+ b = --B[c1];
230
+ j = i;
231
+ ++m;
232
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
233
+ }
234
+ }
235
+
236
+ if (m > 1) {
237
+ LMSsort(T, SA, C, B, n, k);
238
+ name = LMSpostproc(T, SA, n, m);
239
+ } else if (m === 1) {
240
+ SA[b] = j + 1;
241
+ name = 1;
242
+ } else {
243
+ name = 0;
244
+ }
245
+
246
+ /* stage 2: solve the reduced problem
247
+ recurse if names are not yet unique */
248
+ if(name < m) {
249
+ if((flags & 4) !== 0) { C = null; B = null; }
250
+ if((flags & 2) !== 0) { B = null; }
251
+ newfs = (n + fs) - (m * 2);
252
+ if((flags & (1 | 4 | 8)) === 0) {
253
+ if((k + name) <= newfs) { newfs -= k; }
254
+ else { flags |= 8; }
255
+ }
256
+ ASSERT( (n >>> 1) <= (newfs + m) );
257
+ for (i = m + (n >>> 1) - 1, j = m * 2 + newfs - 1; m <= i; i--) {
258
+ if(SA[i] !== 0) { SA[j--] = SA[i] - 1; }
259
+ }
260
+ RA = SA.subarray(m + newfs);
261
+ SA_IS(RA, SA, newfs, m, name, false);
262
+ RA = null;
263
+
264
+ i = n - 1; j = m * 2 - 1; c0 = T[n - 1];
265
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
266
+ for (; i >= 0 ;) {
267
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) <= c1));
268
+ if ( i >= 0 ) {
269
+ SA[j--] = i + 1;
270
+ do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
271
+ }
272
+ }
273
+
274
+ for (i = 0; i < m; i++) { SA[i] = SA[m + SA[i]]; }
275
+ if((flags & 4) !== 0) { C = B = Util.makeS32Buffer(k); }
276
+ if((flags & 2) !== 0) { B = Util.makeS32Buffer(k); }
277
+ }
278
+
279
+ /* stage 3: induce the result for the original problem */
280
+ if((flags & 8) !== 0) { getCounts(T, C, n, k); }
281
+ /* put all left-most S characters into their buckets */
282
+ if (m > 1) {
283
+ getBuckets(C, B, k, true); /* find ends of buckets */
284
+ i = m - 1; j = n; p = SA[m - 1]; c1 = T[p];
285
+ do {
286
+ q = B[c0 = c1];
287
+ while (q < j) { SA[--j] = 0; }
288
+ do {
289
+ SA[--j] = p;
290
+ if(--i < 0) { break; }
291
+ p = SA[i];
292
+ } while((c1 = T[p]) === c0);
293
+ } while (i >= 0 );
294
+ while ( j > 0 ) { SA[--j] = 0; }
295
+ }
296
+ if (!isbwt) { induceSA(T, SA, C, B, n, k); }
297
+ else { pidx = computeBWT(T, SA, C, B, n, k); }
298
+ C = null; B = null;
299
+ return pidx;
300
+ };
301
+
302
+ var BWT = Object.create(null);
303
+ /** SA should be a Int32Array (signed!); T can be any typed array.
304
+ * alphabetSize is optional if T is an Uint8Array or Uint16Array. */
305
+ BWT.suffixsort = function(T, SA, n, alphabetSize) {
306
+ ASSERT( T && SA && T.length >= n && SA.length >= n );
307
+ if (n <= 1) {
308
+ if (n === 1) { SA[0] = 0; }
309
+ return 0;
310
+ }
311
+ if (!alphabetSize) {
312
+ if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
313
+ else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
314
+ else throw new Error('Need to specify alphabetSize');
315
+ }
316
+ ASSERT( alphabetSize > 0 );
317
+ if (T.BYTES_PER_ELEMENT) {
318
+ ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
319
+ }
320
+ return SA_IS(T, SA, 0, n, alphabetSize, false);
321
+ };
322
+ /** Burrows-Wheeler Transform.
323
+ A should be Int32Array (signed!); T can be any typed array.
324
+ U is the same type as T (it is used for output).
325
+ alphabetSize is optional if T is an Uint8Array or Uint16Array.
326
+ ASSUMES STRING IS TERMINATED WITH AN EOF CHARACTER.
327
+ */
328
+ BWT.bwtransform = function(T, U, A, n, alphabetSize) {
329
+ var i, pidx;
330
+ ASSERT( T && U && A );
331
+ ASSERT( T.length >= n && U.length >= n && A.length >= n );
332
+ if (n <= 1) {
333
+ if (n === 1) { U[0] = T[0]; }
334
+ return n;
335
+ }
336
+ if (!alphabetSize) {
337
+ if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
338
+ else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
339
+ else throw new Error('Need to specify alphabetSize');
340
+ }
341
+ ASSERT( alphabetSize > 0 );
342
+ if (T.BYTES_PER_ELEMENT) {
343
+ ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
344
+ }
345
+ pidx = SA_IS(T, A, 0, n, alphabetSize, true);
346
+ U[0] = T[n - 1];
347
+ for (i = 0; i < pidx ; i++) { U[i + 1] = A[i]; }
348
+ for (i += 1; i < n; i++) { U[i] = A[i]; }
349
+ return pidx + 1;
350
+ };
351
+ /** Reverses transform above. (ASSUMED STRING IS TERMINATED WITH EOF.) */
352
+ BWT.unbwtransform = function(T, U, LF, n, pidx) {
353
+ var C = Util.makeU32Buffer(256);
354
+ var i, t;
355
+ for (i=0; i<256; i++) { C[i] = 0; }
356
+ for (i=0; i<n; i++) { LF[i] = C[T[i]]++; }
357
+ for (i=0, t=0; i<256; i++) { t += C[i]; C[i] = t - C[i]; }
358
+ for (i=n-1, t=0; i>=0; i--) {
359
+ t = LF[t] + C[U[i]=T[t]];
360
+ t += (t<pidx) ? 1 : 0;
361
+ }
362
+ C = null;
363
+ };
364
+
365
+ /** Burrows-Wheeler Transform.
366
+ A should be Int32Array (signed!); T can be any typed array.
367
+ U is the same type as T (it is used for output).
368
+ alphabetSize is optional if T is an Uint8Array or Uint16Array.
369
+ ASSUMES STRING IS CYCLIC.
370
+ (XXX: this is twice as inefficient as I'd like! [CSA])
371
+ */
372
+ BWT.bwtransform2 = function(T, U, n, alphabetSize) {
373
+ var i, j, pidx = 0;
374
+ ASSERT( T && U );
375
+ ASSERT( T.length >= n && U.length >= n );
376
+ if (n <= 1) {
377
+ if (n === 1) { U[0] = T[0]; }
378
+ return 0;
379
+ }
380
+ if (!alphabetSize) {
381
+ if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
382
+ else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
383
+ else throw new Error('Need to specify alphabetSize');
384
+ }
385
+ ASSERT( alphabetSize > 0 );
386
+ if (T.BYTES_PER_ELEMENT) {
387
+ ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
388
+ }
389
+ // double length of T
390
+ var TT;
391
+ if (T.length >= n*2) {
392
+ TT = T; // do it in place if possible
393
+ } else if (alphabetSize <= 256) {
394
+ TT = Util.makeU8Buffer(n*2);
395
+ } else if (alphabetSize <= 65536) {
396
+ TT = Util.makeU16Buffer(n*2);
397
+ } else {
398
+ TT = Util.makeU32Buffer(n*2);
399
+ }
400
+ if (TT!==T) {
401
+ for (i=0; i<n; i++) { TT[i] = T[i]; }
402
+ }
403
+ for (i=0; i<n; i++) { TT[n+i] = TT[i]; }
404
+ // sort doubled string
405
+ var A = Util.makeS32Buffer(n*2);
406
+ SA_IS(TT, A, 0, n*2, alphabetSize, false);
407
+ for (i=0, j=0; i<2*n; i++) {
408
+ var s = A[i];
409
+ if (s < n) {
410
+ if (s === 0) { pidx = j; }
411
+ if (--s < 0) { s = n-1; }
412
+ U[j++] = T[s];
413
+ }
414
+ }
415
+ ASSERT(j===n);
416
+ return pidx;
417
+ };
418
+
419
+ return freeze(BWT);
420
+ });
@@ -0,0 +1,234 @@
1
+ /* A simple bzip-like BWT compressor with a range encoder; written as a
2
+ * self-test of the BWT package. */
3
+ if (typeof define !== 'function') { var define = require('amdefine')(module); }
4
+ define(['./freeze','./BWT','./DefSumModel','./FenwickModel','./LogDistanceModel','./NoModel','./RangeCoder','./Stream','./Util'], function(freeze, BWT, DefSumModel, FenwickModel, LogDistanceModel, NoModel, RangeCoder, Stream, Util) {
5
+ var EOF = Stream.EOF;
6
+
7
+ var F_PROB_MAX = 0xFF00;
8
+ var F_PROB_INCR = 0x0100;
9
+
10
+ BWTC = Object.create(null);
11
+ BWTC.MAGIC = "bwtc";
12
+ BWTC.compressFile = Util.compressFileHelper(BWTC.MAGIC, function(input, output, size, props, finalByte) {
13
+ var encoder = new RangeCoder(output);
14
+ encoder.encodeStart(finalByte, 1);
15
+
16
+ var blockSize = 9;
17
+ if (typeof(props)==='number' && props >= 1 && props <= 9) {
18
+ blockSize = props;
19
+ }
20
+ encoder.encodeByte(blockSize);
21
+ var fast = (blockSize <= 5);
22
+ blockSize *= 100000;
23
+
24
+ var block = Util.makeU8Buffer(blockSize);
25
+ var readBlock = function() {
26
+ var pos;
27
+ for (pos=0; pos < blockSize; ) {
28
+ var ch = input.readByte();
29
+ if (ch < 0) { break; }
30
+ block[pos++] = ch;
31
+ }
32
+ return pos;
33
+ };
34
+ var U = Util.makeU8Buffer(blockSize);
35
+ var A = Util.makeS32Buffer(blockSize);
36
+ var M = Util.makeU8Buffer(256); // move to front array
37
+ var bitModelFactory = NoModel.factory(encoder);
38
+ var lenModel = new LogDistanceModel(blockSize, 0,
39
+ bitModelFactory,
40
+ bitModelFactory);
41
+ var length, b, c, pidx, i, j;
42
+ do {
43
+ length = readBlock();
44
+ if (length === 0) { break; }
45
+ // indicate that there's another block comin'
46
+ // and encode the length of the block if necessary
47
+ if (length === block.length) {
48
+ encoder.encodeFreq(1, 0, 3); // "full size block"
49
+ b = block;
50
+ } else {
51
+ encoder.encodeFreq(1, 1, 3); // "short block"
52
+ lenModel.encode(length);
53
+ b = block.subarray(0, length);
54
+ }
55
+ pidx = BWT.bwtransform(b, U, A, length, 256);
56
+ lenModel.encode(pidx); // starting index
57
+ // encode the alphabet subset used
58
+ var useTree = Util.makeU16Buffer(512);
59
+ for (i=0; i<length; i++) {
60
+ c = U[i];
61
+ useTree[256+c] = 1;
62
+ }
63
+ for (i=255; i>0; i--) { // sum all the way up the tree
64
+ useTree[i] = useTree[2*i] + useTree[2*i + 1];
65
+ }
66
+ useTree[0] = 1; // sentinel
67
+ for (i=1; i<512; i++) {
68
+ var parent = i>>>1;
69
+ var full = 1 << (9-Util.fls(i));
70
+ if (useTree[parent] === 0 || useTree[parent] === (full*2)) {
71
+ /* already known full/empty */
72
+ } else if (i >= 256) {
73
+ encoder.encodeBit(useTree[i]); // leaf node
74
+ } else {
75
+ var v = useTree[i];
76
+ v = (v===0) ? 0 : (v===full) ? 2 : 1;
77
+ encoder.encodeFreq(1, v, 3);
78
+ }
79
+ }
80
+ // remap symbols to this subset
81
+ var alphabetSize = 0;
82
+ for (i=0; i<256; i++) {
83
+ if (useTree[256+i]) { // symbol in use
84
+ M[alphabetSize++] = i;
85
+ }
86
+ }
87
+ useTree = null;
88
+ // MTF encoding of U
89
+ for (i=0; i<length; i++) {
90
+ c = U[i];
91
+ for (j=0; j<alphabetSize; j++) {
92
+ if (M[j] === c) {
93
+ break;
94
+ }
95
+ }
96
+ console.assert(j<alphabetSize);
97
+ U[i] = j;
98
+ // move to front
99
+ for (; j>0; j--) {
100
+ M[j] = M[j-1];
101
+ }
102
+ M[0] = c;
103
+ }
104
+ // RLE/range encoding
105
+ var model = new FenwickModel(encoder, alphabetSize+1,
106
+ F_PROB_MAX, F_PROB_INCR);
107
+ if (fast) { model = new DefSumModel(encoder, alphabetSize+1); }
108
+ var runLength = 0;
109
+ var emitLastRun = function() {
110
+ // binary encode runs of zeros
111
+ while (runLength !== 0) {
112
+ if (runLength&1) {
113
+ model.encode(0); // RUNA
114
+ runLength-=1;
115
+ } else {
116
+ model.encode(1); // RUNB
117
+ runLength-=2;
118
+ }
119
+ runLength >>>= 1;
120
+ }
121
+ };
122
+ for (i=0; i<length; i++) {
123
+ c = U[i];
124
+ if (c === 0) {
125
+ runLength++;
126
+ } else {
127
+ emitLastRun();
128
+ model.encode(c+1);
129
+ // reset for next
130
+ runLength = 0;
131
+ }
132
+ }
133
+ emitLastRun();
134
+ // done with this block!
135
+ } while (length === block.length);
136
+
137
+ encoder.encodeFreq(1, 2, 3); // "no more blocks"
138
+ encoder.encodeFinish();
139
+ }, true);
140
+
141
+ BWTC.decompressFile = Util.decompressFileHelper(BWTC.MAGIC, function(input, output, size) {
142
+ var decoder = new RangeCoder(input);
143
+ decoder.decodeStart(true/* already read the extra byte */);
144
+ var blockSize = decoder.decodeByte();
145
+ console.assert(blockSize >= 1 && blockSize <= 9);
146
+ var fast = (blockSize <= 5);
147
+ blockSize *= 100000;
148
+
149
+ var block = Util.makeU8Buffer(blockSize);
150
+ var U = Util.makeU8Buffer(blockSize);
151
+ var A = Util.makeS32Buffer(blockSize);
152
+ var M = Util.makeU8Buffer(256); // move to front array
153
+ var bitModelFactory = NoModel.factory(decoder);
154
+ var lenModel = new LogDistanceModel(blockSize, 0,
155
+ bitModelFactory,
156
+ bitModelFactory);
157
+ var b, length, i, j, c;
158
+ while (true) {
159
+ var blockIndicator = decoder.decodeCulFreq(3);
160
+ decoder.decodeUpdate(1, blockIndicator, 3);
161
+ if (blockIndicator === 0) { // full-length block
162
+ length = blockSize;
163
+ b = block;
164
+ } else if (blockIndicator === 1) { // short block
165
+ length = lenModel.decode();
166
+ b = block.subarray(0, length);
167
+ } else if (blockIndicator === 2) { // all done, no more blocks
168
+ break;
169
+ }
170
+ // read starting index for unBWT
171
+ var pidx = lenModel.decode();
172
+ // decode the alphabet subset used
173
+ var useTree = Util.makeU16Buffer(512);
174
+ useTree[0] = 1; // sentinel
175
+ for (i=1; i<512; i++) {
176
+ var parent = i>>>1;
177
+ var full = 1 << (9-Util.fls(i));
178
+ if (useTree[parent] === 0 || useTree[parent] === (full*2)) {
179
+ /* already known full/empty */
180
+ useTree[i] = useTree[parent] >>> 1;
181
+ } else if (i >= 256) {
182
+ useTree[i] = decoder.decodeBit(); // leaf node
183
+ } else {
184
+ var v = decoder.decodeCulFreq(3);
185
+ decoder.decodeUpdate(1, v, 3);
186
+ useTree[i] = (v===2) ? full : v;
187
+ }
188
+ }
189
+ // remap symbols to this subset
190
+ var alphabetSize = 0;
191
+ for (i=0; i<256; i++) {
192
+ if (useTree[256+i]) { // symbol in use
193
+ M[alphabetSize++] = i;
194
+ }
195
+ }
196
+ useTree = null;
197
+ // RLE/range decoding
198
+ var model = new FenwickModel(decoder, alphabetSize+1,
199
+ F_PROB_MAX, F_PROB_INCR);
200
+ if (fast) { model = new DefSumModel(decoder, alphabetSize+1, true);}
201
+ var val = 1; // repeat count
202
+ for (i=0; i<length; ) {
203
+ c = model.decode();
204
+ if (c===0) {
205
+ for (j=0; j<val; j++) { b[i++] = 0; }
206
+ val *= 2;
207
+ } else if (c===1) {
208
+ for (j=0; j<val; j++) { b[i++] = 0; b[i++] = 0; }
209
+ val *= 2;
210
+ } else {
211
+ val = 1;
212
+ b[i++] = c-1;
213
+ }
214
+ }
215
+ // MTF decode
216
+ for (i=0; i<length; i++) {
217
+ j = b[i];
218
+ b[i] = c = M[j];
219
+ // move to front
220
+ for (; j>0; j--) {
221
+ M[j] = M[j-1];
222
+ }
223
+ M[0] = c;
224
+ }
225
+ // unBWT
226
+ BWT.unbwtransform(block, U, A, length, pidx);
227
+ // emit!
228
+ output.write(U, 0, length);
229
+ }
230
+ decoder.decodeFinish();
231
+ });
232
+
233
+ return BWTC;
234
+ });