@forbocai/test-game 0.6.0 → 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/dist/cli.js +1832 -40
- package/dist/cli.mjs +2568 -18
- package/dist/index.d.mts +3 -5
- package/dist/index.d.ts +3 -5
- package/dist/index.js +1796 -23
- package/dist/index.mjs +2534 -4
- package/package.json +4 -2
package/dist/cli.mjs
CHANGED
|
@@ -1,27 +1,2577 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
9
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
10
|
+
}) : x)(function(x) {
|
|
11
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
12
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
13
|
+
});
|
|
14
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
15
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
16
|
+
};
|
|
17
|
+
var __copyProps = (to, from, except, desc) => {
|
|
18
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
19
|
+
for (let key of __getOwnPropNames(from))
|
|
20
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
21
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
26
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
27
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
28
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
29
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
30
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
31
|
+
mod
|
|
32
|
+
));
|
|
5
33
|
|
|
6
|
-
//
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
34
|
+
// ../../node_modules/color-name/index.js
|
|
35
|
+
var require_color_name = __commonJS({
|
|
36
|
+
"../../node_modules/color-name/index.js"(exports, module) {
|
|
37
|
+
"use strict";
|
|
38
|
+
module.exports = {
|
|
39
|
+
"aliceblue": [240, 248, 255],
|
|
40
|
+
"antiquewhite": [250, 235, 215],
|
|
41
|
+
"aqua": [0, 255, 255],
|
|
42
|
+
"aquamarine": [127, 255, 212],
|
|
43
|
+
"azure": [240, 255, 255],
|
|
44
|
+
"beige": [245, 245, 220],
|
|
45
|
+
"bisque": [255, 228, 196],
|
|
46
|
+
"black": [0, 0, 0],
|
|
47
|
+
"blanchedalmond": [255, 235, 205],
|
|
48
|
+
"blue": [0, 0, 255],
|
|
49
|
+
"blueviolet": [138, 43, 226],
|
|
50
|
+
"brown": [165, 42, 42],
|
|
51
|
+
"burlywood": [222, 184, 135],
|
|
52
|
+
"cadetblue": [95, 158, 160],
|
|
53
|
+
"chartreuse": [127, 255, 0],
|
|
54
|
+
"chocolate": [210, 105, 30],
|
|
55
|
+
"coral": [255, 127, 80],
|
|
56
|
+
"cornflowerblue": [100, 149, 237],
|
|
57
|
+
"cornsilk": [255, 248, 220],
|
|
58
|
+
"crimson": [220, 20, 60],
|
|
59
|
+
"cyan": [0, 255, 255],
|
|
60
|
+
"darkblue": [0, 0, 139],
|
|
61
|
+
"darkcyan": [0, 139, 139],
|
|
62
|
+
"darkgoldenrod": [184, 134, 11],
|
|
63
|
+
"darkgray": [169, 169, 169],
|
|
64
|
+
"darkgreen": [0, 100, 0],
|
|
65
|
+
"darkgrey": [169, 169, 169],
|
|
66
|
+
"darkkhaki": [189, 183, 107],
|
|
67
|
+
"darkmagenta": [139, 0, 139],
|
|
68
|
+
"darkolivegreen": [85, 107, 47],
|
|
69
|
+
"darkorange": [255, 140, 0],
|
|
70
|
+
"darkorchid": [153, 50, 204],
|
|
71
|
+
"darkred": [139, 0, 0],
|
|
72
|
+
"darksalmon": [233, 150, 122],
|
|
73
|
+
"darkseagreen": [143, 188, 143],
|
|
74
|
+
"darkslateblue": [72, 61, 139],
|
|
75
|
+
"darkslategray": [47, 79, 79],
|
|
76
|
+
"darkslategrey": [47, 79, 79],
|
|
77
|
+
"darkturquoise": [0, 206, 209],
|
|
78
|
+
"darkviolet": [148, 0, 211],
|
|
79
|
+
"deeppink": [255, 20, 147],
|
|
80
|
+
"deepskyblue": [0, 191, 255],
|
|
81
|
+
"dimgray": [105, 105, 105],
|
|
82
|
+
"dimgrey": [105, 105, 105],
|
|
83
|
+
"dodgerblue": [30, 144, 255],
|
|
84
|
+
"firebrick": [178, 34, 34],
|
|
85
|
+
"floralwhite": [255, 250, 240],
|
|
86
|
+
"forestgreen": [34, 139, 34],
|
|
87
|
+
"fuchsia": [255, 0, 255],
|
|
88
|
+
"gainsboro": [220, 220, 220],
|
|
89
|
+
"ghostwhite": [248, 248, 255],
|
|
90
|
+
"gold": [255, 215, 0],
|
|
91
|
+
"goldenrod": [218, 165, 32],
|
|
92
|
+
"gray": [128, 128, 128],
|
|
93
|
+
"green": [0, 128, 0],
|
|
94
|
+
"greenyellow": [173, 255, 47],
|
|
95
|
+
"grey": [128, 128, 128],
|
|
96
|
+
"honeydew": [240, 255, 240],
|
|
97
|
+
"hotpink": [255, 105, 180],
|
|
98
|
+
"indianred": [205, 92, 92],
|
|
99
|
+
"indigo": [75, 0, 130],
|
|
100
|
+
"ivory": [255, 255, 240],
|
|
101
|
+
"khaki": [240, 230, 140],
|
|
102
|
+
"lavender": [230, 230, 250],
|
|
103
|
+
"lavenderblush": [255, 240, 245],
|
|
104
|
+
"lawngreen": [124, 252, 0],
|
|
105
|
+
"lemonchiffon": [255, 250, 205],
|
|
106
|
+
"lightblue": [173, 216, 230],
|
|
107
|
+
"lightcoral": [240, 128, 128],
|
|
108
|
+
"lightcyan": [224, 255, 255],
|
|
109
|
+
"lightgoldenrodyellow": [250, 250, 210],
|
|
110
|
+
"lightgray": [211, 211, 211],
|
|
111
|
+
"lightgreen": [144, 238, 144],
|
|
112
|
+
"lightgrey": [211, 211, 211],
|
|
113
|
+
"lightpink": [255, 182, 193],
|
|
114
|
+
"lightsalmon": [255, 160, 122],
|
|
115
|
+
"lightseagreen": [32, 178, 170],
|
|
116
|
+
"lightskyblue": [135, 206, 250],
|
|
117
|
+
"lightslategray": [119, 136, 153],
|
|
118
|
+
"lightslategrey": [119, 136, 153],
|
|
119
|
+
"lightsteelblue": [176, 196, 222],
|
|
120
|
+
"lightyellow": [255, 255, 224],
|
|
121
|
+
"lime": [0, 255, 0],
|
|
122
|
+
"limegreen": [50, 205, 50],
|
|
123
|
+
"linen": [250, 240, 230],
|
|
124
|
+
"magenta": [255, 0, 255],
|
|
125
|
+
"maroon": [128, 0, 0],
|
|
126
|
+
"mediumaquamarine": [102, 205, 170],
|
|
127
|
+
"mediumblue": [0, 0, 205],
|
|
128
|
+
"mediumorchid": [186, 85, 211],
|
|
129
|
+
"mediumpurple": [147, 112, 219],
|
|
130
|
+
"mediumseagreen": [60, 179, 113],
|
|
131
|
+
"mediumslateblue": [123, 104, 238],
|
|
132
|
+
"mediumspringgreen": [0, 250, 154],
|
|
133
|
+
"mediumturquoise": [72, 209, 204],
|
|
134
|
+
"mediumvioletred": [199, 21, 133],
|
|
135
|
+
"midnightblue": [25, 25, 112],
|
|
136
|
+
"mintcream": [245, 255, 250],
|
|
137
|
+
"mistyrose": [255, 228, 225],
|
|
138
|
+
"moccasin": [255, 228, 181],
|
|
139
|
+
"navajowhite": [255, 222, 173],
|
|
140
|
+
"navy": [0, 0, 128],
|
|
141
|
+
"oldlace": [253, 245, 230],
|
|
142
|
+
"olive": [128, 128, 0],
|
|
143
|
+
"olivedrab": [107, 142, 35],
|
|
144
|
+
"orange": [255, 165, 0],
|
|
145
|
+
"orangered": [255, 69, 0],
|
|
146
|
+
"orchid": [218, 112, 214],
|
|
147
|
+
"palegoldenrod": [238, 232, 170],
|
|
148
|
+
"palegreen": [152, 251, 152],
|
|
149
|
+
"paleturquoise": [175, 238, 238],
|
|
150
|
+
"palevioletred": [219, 112, 147],
|
|
151
|
+
"papayawhip": [255, 239, 213],
|
|
152
|
+
"peachpuff": [255, 218, 185],
|
|
153
|
+
"peru": [205, 133, 63],
|
|
154
|
+
"pink": [255, 192, 203],
|
|
155
|
+
"plum": [221, 160, 221],
|
|
156
|
+
"powderblue": [176, 224, 230],
|
|
157
|
+
"purple": [128, 0, 128],
|
|
158
|
+
"rebeccapurple": [102, 51, 153],
|
|
159
|
+
"red": [255, 0, 0],
|
|
160
|
+
"rosybrown": [188, 143, 143],
|
|
161
|
+
"royalblue": [65, 105, 225],
|
|
162
|
+
"saddlebrown": [139, 69, 19],
|
|
163
|
+
"salmon": [250, 128, 114],
|
|
164
|
+
"sandybrown": [244, 164, 96],
|
|
165
|
+
"seagreen": [46, 139, 87],
|
|
166
|
+
"seashell": [255, 245, 238],
|
|
167
|
+
"sienna": [160, 82, 45],
|
|
168
|
+
"silver": [192, 192, 192],
|
|
169
|
+
"skyblue": [135, 206, 235],
|
|
170
|
+
"slateblue": [106, 90, 205],
|
|
171
|
+
"slategray": [112, 128, 144],
|
|
172
|
+
"slategrey": [112, 128, 144],
|
|
173
|
+
"snow": [255, 250, 250],
|
|
174
|
+
"springgreen": [0, 255, 127],
|
|
175
|
+
"steelblue": [70, 130, 180],
|
|
176
|
+
"tan": [210, 180, 140],
|
|
177
|
+
"teal": [0, 128, 128],
|
|
178
|
+
"thistle": [216, 191, 216],
|
|
179
|
+
"tomato": [255, 99, 71],
|
|
180
|
+
"turquoise": [64, 224, 208],
|
|
181
|
+
"violet": [238, 130, 238],
|
|
182
|
+
"wheat": [245, 222, 179],
|
|
183
|
+
"white": [255, 255, 255],
|
|
184
|
+
"whitesmoke": [245, 245, 245],
|
|
185
|
+
"yellow": [255, 255, 0],
|
|
186
|
+
"yellowgreen": [154, 205, 50]
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// ../../node_modules/color-convert/conversions.js
|
|
192
|
+
var require_conversions = __commonJS({
|
|
193
|
+
"../../node_modules/color-convert/conversions.js"(exports, module) {
|
|
194
|
+
"use strict";
|
|
195
|
+
var cssKeywords = require_color_name();
|
|
196
|
+
var reverseKeywords = {};
|
|
197
|
+
for (const key of Object.keys(cssKeywords)) {
|
|
198
|
+
reverseKeywords[cssKeywords[key]] = key;
|
|
199
|
+
}
|
|
200
|
+
var convert = {
|
|
201
|
+
rgb: { channels: 3, labels: "rgb" },
|
|
202
|
+
hsl: { channels: 3, labels: "hsl" },
|
|
203
|
+
hsv: { channels: 3, labels: "hsv" },
|
|
204
|
+
hwb: { channels: 3, labels: "hwb" },
|
|
205
|
+
cmyk: { channels: 4, labels: "cmyk" },
|
|
206
|
+
xyz: { channels: 3, labels: "xyz" },
|
|
207
|
+
lab: { channels: 3, labels: "lab" },
|
|
208
|
+
lch: { channels: 3, labels: "lch" },
|
|
209
|
+
hex: { channels: 1, labels: ["hex"] },
|
|
210
|
+
keyword: { channels: 1, labels: ["keyword"] },
|
|
211
|
+
ansi16: { channels: 1, labels: ["ansi16"] },
|
|
212
|
+
ansi256: { channels: 1, labels: ["ansi256"] },
|
|
213
|
+
hcg: { channels: 3, labels: ["h", "c", "g"] },
|
|
214
|
+
apple: { channels: 3, labels: ["r16", "g16", "b16"] },
|
|
215
|
+
gray: { channels: 1, labels: ["gray"] }
|
|
216
|
+
};
|
|
217
|
+
module.exports = convert;
|
|
218
|
+
for (const model of Object.keys(convert)) {
|
|
219
|
+
if (!("channels" in convert[model])) {
|
|
220
|
+
throw new Error("missing channels property: " + model);
|
|
221
|
+
}
|
|
222
|
+
if (!("labels" in convert[model])) {
|
|
223
|
+
throw new Error("missing channel labels property: " + model);
|
|
224
|
+
}
|
|
225
|
+
if (convert[model].labels.length !== convert[model].channels) {
|
|
226
|
+
throw new Error("channel and label counts mismatch: " + model);
|
|
227
|
+
}
|
|
228
|
+
const { channels, labels } = convert[model];
|
|
229
|
+
delete convert[model].channels;
|
|
230
|
+
delete convert[model].labels;
|
|
231
|
+
Object.defineProperty(convert[model], "channels", { value: channels });
|
|
232
|
+
Object.defineProperty(convert[model], "labels", { value: labels });
|
|
233
|
+
}
|
|
234
|
+
convert.rgb.hsl = function(rgb) {
|
|
235
|
+
const r = rgb[0] / 255;
|
|
236
|
+
const g = rgb[1] / 255;
|
|
237
|
+
const b = rgb[2] / 255;
|
|
238
|
+
const min = Math.min(r, g, b);
|
|
239
|
+
const max = Math.max(r, g, b);
|
|
240
|
+
const delta = max - min;
|
|
241
|
+
let h;
|
|
242
|
+
let s;
|
|
243
|
+
if (max === min) {
|
|
244
|
+
h = 0;
|
|
245
|
+
} else if (r === max) {
|
|
246
|
+
h = (g - b) / delta;
|
|
247
|
+
} else if (g === max) {
|
|
248
|
+
h = 2 + (b - r) / delta;
|
|
249
|
+
} else if (b === max) {
|
|
250
|
+
h = 4 + (r - g) / delta;
|
|
251
|
+
}
|
|
252
|
+
h = Math.min(h * 60, 360);
|
|
253
|
+
if (h < 0) {
|
|
254
|
+
h += 360;
|
|
255
|
+
}
|
|
256
|
+
const l = (min + max) / 2;
|
|
257
|
+
if (max === min) {
|
|
258
|
+
s = 0;
|
|
259
|
+
} else if (l <= 0.5) {
|
|
260
|
+
s = delta / (max + min);
|
|
261
|
+
} else {
|
|
262
|
+
s = delta / (2 - max - min);
|
|
263
|
+
}
|
|
264
|
+
return [h, s * 100, l * 100];
|
|
265
|
+
};
|
|
266
|
+
convert.rgb.hsv = function(rgb) {
|
|
267
|
+
let rdif;
|
|
268
|
+
let gdif;
|
|
269
|
+
let bdif;
|
|
270
|
+
let h;
|
|
271
|
+
let s;
|
|
272
|
+
const r = rgb[0] / 255;
|
|
273
|
+
const g = rgb[1] / 255;
|
|
274
|
+
const b = rgb[2] / 255;
|
|
275
|
+
const v = Math.max(r, g, b);
|
|
276
|
+
const diff = v - Math.min(r, g, b);
|
|
277
|
+
const diffc = function(c) {
|
|
278
|
+
return (v - c) / 6 / diff + 1 / 2;
|
|
279
|
+
};
|
|
280
|
+
if (diff === 0) {
|
|
281
|
+
h = 0;
|
|
282
|
+
s = 0;
|
|
283
|
+
} else {
|
|
284
|
+
s = diff / v;
|
|
285
|
+
rdif = diffc(r);
|
|
286
|
+
gdif = diffc(g);
|
|
287
|
+
bdif = diffc(b);
|
|
288
|
+
if (r === v) {
|
|
289
|
+
h = bdif - gdif;
|
|
290
|
+
} else if (g === v) {
|
|
291
|
+
h = 1 / 3 + rdif - bdif;
|
|
292
|
+
} else if (b === v) {
|
|
293
|
+
h = 2 / 3 + gdif - rdif;
|
|
294
|
+
}
|
|
295
|
+
if (h < 0) {
|
|
296
|
+
h += 1;
|
|
297
|
+
} else if (h > 1) {
|
|
298
|
+
h -= 1;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return [
|
|
302
|
+
h * 360,
|
|
303
|
+
s * 100,
|
|
304
|
+
v * 100
|
|
305
|
+
];
|
|
306
|
+
};
|
|
307
|
+
convert.rgb.hwb = function(rgb) {
|
|
308
|
+
const r = rgb[0];
|
|
309
|
+
const g = rgb[1];
|
|
310
|
+
let b = rgb[2];
|
|
311
|
+
const h = convert.rgb.hsl(rgb)[0];
|
|
312
|
+
const w = 1 / 255 * Math.min(r, Math.min(g, b));
|
|
313
|
+
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
|
|
314
|
+
return [h, w * 100, b * 100];
|
|
315
|
+
};
|
|
316
|
+
convert.rgb.cmyk = function(rgb) {
|
|
317
|
+
const r = rgb[0] / 255;
|
|
318
|
+
const g = rgb[1] / 255;
|
|
319
|
+
const b = rgb[2] / 255;
|
|
320
|
+
const k = Math.min(1 - r, 1 - g, 1 - b);
|
|
321
|
+
const c = (1 - r - k) / (1 - k) || 0;
|
|
322
|
+
const m = (1 - g - k) / (1 - k) || 0;
|
|
323
|
+
const y = (1 - b - k) / (1 - k) || 0;
|
|
324
|
+
return [c * 100, m * 100, y * 100, k * 100];
|
|
325
|
+
};
|
|
326
|
+
function comparativeDistance(x, y) {
|
|
327
|
+
return (x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2 + (x[2] - y[2]) ** 2;
|
|
328
|
+
}
|
|
329
|
+
convert.rgb.keyword = function(rgb) {
|
|
330
|
+
const reversed = reverseKeywords[rgb];
|
|
331
|
+
if (reversed) {
|
|
332
|
+
return reversed;
|
|
333
|
+
}
|
|
334
|
+
let currentClosestDistance = Infinity;
|
|
335
|
+
let currentClosestKeyword;
|
|
336
|
+
for (const keyword of Object.keys(cssKeywords)) {
|
|
337
|
+
const value = cssKeywords[keyword];
|
|
338
|
+
const distance = comparativeDistance(rgb, value);
|
|
339
|
+
if (distance < currentClosestDistance) {
|
|
340
|
+
currentClosestDistance = distance;
|
|
341
|
+
currentClosestKeyword = keyword;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return currentClosestKeyword;
|
|
345
|
+
};
|
|
346
|
+
convert.keyword.rgb = function(keyword) {
|
|
347
|
+
return cssKeywords[keyword];
|
|
348
|
+
};
|
|
349
|
+
convert.rgb.xyz = function(rgb) {
|
|
350
|
+
let r = rgb[0] / 255;
|
|
351
|
+
let g = rgb[1] / 255;
|
|
352
|
+
let b = rgb[2] / 255;
|
|
353
|
+
r = r > 0.04045 ? ((r + 0.055) / 1.055) ** 2.4 : r / 12.92;
|
|
354
|
+
g = g > 0.04045 ? ((g + 0.055) / 1.055) ** 2.4 : g / 12.92;
|
|
355
|
+
b = b > 0.04045 ? ((b + 0.055) / 1.055) ** 2.4 : b / 12.92;
|
|
356
|
+
const x = r * 0.4124 + g * 0.3576 + b * 0.1805;
|
|
357
|
+
const y = r * 0.2126 + g * 0.7152 + b * 0.0722;
|
|
358
|
+
const z = r * 0.0193 + g * 0.1192 + b * 0.9505;
|
|
359
|
+
return [x * 100, y * 100, z * 100];
|
|
360
|
+
};
|
|
361
|
+
convert.rgb.lab = function(rgb) {
|
|
362
|
+
const xyz = convert.rgb.xyz(rgb);
|
|
363
|
+
let x = xyz[0];
|
|
364
|
+
let y = xyz[1];
|
|
365
|
+
let z = xyz[2];
|
|
366
|
+
x /= 95.047;
|
|
367
|
+
y /= 100;
|
|
368
|
+
z /= 108.883;
|
|
369
|
+
x = x > 8856e-6 ? x ** (1 / 3) : 7.787 * x + 16 / 116;
|
|
370
|
+
y = y > 8856e-6 ? y ** (1 / 3) : 7.787 * y + 16 / 116;
|
|
371
|
+
z = z > 8856e-6 ? z ** (1 / 3) : 7.787 * z + 16 / 116;
|
|
372
|
+
const l = 116 * y - 16;
|
|
373
|
+
const a = 500 * (x - y);
|
|
374
|
+
const b = 200 * (y - z);
|
|
375
|
+
return [l, a, b];
|
|
376
|
+
};
|
|
377
|
+
convert.hsl.rgb = function(hsl) {
|
|
378
|
+
const h = hsl[0] / 360;
|
|
379
|
+
const s = hsl[1] / 100;
|
|
380
|
+
const l = hsl[2] / 100;
|
|
381
|
+
let t2;
|
|
382
|
+
let t3;
|
|
383
|
+
let val;
|
|
384
|
+
if (s === 0) {
|
|
385
|
+
val = l * 255;
|
|
386
|
+
return [val, val, val];
|
|
387
|
+
}
|
|
388
|
+
if (l < 0.5) {
|
|
389
|
+
t2 = l * (1 + s);
|
|
390
|
+
} else {
|
|
391
|
+
t2 = l + s - l * s;
|
|
392
|
+
}
|
|
393
|
+
const t1 = 2 * l - t2;
|
|
394
|
+
const rgb = [0, 0, 0];
|
|
395
|
+
for (let i = 0; i < 3; i++) {
|
|
396
|
+
t3 = h + 1 / 3 * -(i - 1);
|
|
397
|
+
if (t3 < 0) {
|
|
398
|
+
t3++;
|
|
399
|
+
}
|
|
400
|
+
if (t3 > 1) {
|
|
401
|
+
t3--;
|
|
402
|
+
}
|
|
403
|
+
if (6 * t3 < 1) {
|
|
404
|
+
val = t1 + (t2 - t1) * 6 * t3;
|
|
405
|
+
} else if (2 * t3 < 1) {
|
|
406
|
+
val = t2;
|
|
407
|
+
} else if (3 * t3 < 2) {
|
|
408
|
+
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
|
|
409
|
+
} else {
|
|
410
|
+
val = t1;
|
|
411
|
+
}
|
|
412
|
+
rgb[i] = val * 255;
|
|
413
|
+
}
|
|
414
|
+
return rgb;
|
|
415
|
+
};
|
|
416
|
+
convert.hsl.hsv = function(hsl) {
|
|
417
|
+
const h = hsl[0];
|
|
418
|
+
let s = hsl[1] / 100;
|
|
419
|
+
let l = hsl[2] / 100;
|
|
420
|
+
let smin = s;
|
|
421
|
+
const lmin = Math.max(l, 0.01);
|
|
422
|
+
l *= 2;
|
|
423
|
+
s *= l <= 1 ? l : 2 - l;
|
|
424
|
+
smin *= lmin <= 1 ? lmin : 2 - lmin;
|
|
425
|
+
const v = (l + s) / 2;
|
|
426
|
+
const sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s);
|
|
427
|
+
return [h, sv * 100, v * 100];
|
|
428
|
+
};
|
|
429
|
+
convert.hsv.rgb = function(hsv) {
|
|
430
|
+
const h = hsv[0] / 60;
|
|
431
|
+
const s = hsv[1] / 100;
|
|
432
|
+
let v = hsv[2] / 100;
|
|
433
|
+
const hi = Math.floor(h) % 6;
|
|
434
|
+
const f = h - Math.floor(h);
|
|
435
|
+
const p = 255 * v * (1 - s);
|
|
436
|
+
const q = 255 * v * (1 - s * f);
|
|
437
|
+
const t = 255 * v * (1 - s * (1 - f));
|
|
438
|
+
v *= 255;
|
|
439
|
+
switch (hi) {
|
|
440
|
+
case 0:
|
|
441
|
+
return [v, t, p];
|
|
442
|
+
case 1:
|
|
443
|
+
return [q, v, p];
|
|
444
|
+
case 2:
|
|
445
|
+
return [p, v, t];
|
|
446
|
+
case 3:
|
|
447
|
+
return [p, q, v];
|
|
448
|
+
case 4:
|
|
449
|
+
return [t, p, v];
|
|
450
|
+
case 5:
|
|
451
|
+
return [v, p, q];
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
convert.hsv.hsl = function(hsv) {
|
|
455
|
+
const h = hsv[0];
|
|
456
|
+
const s = hsv[1] / 100;
|
|
457
|
+
const v = hsv[2] / 100;
|
|
458
|
+
const vmin = Math.max(v, 0.01);
|
|
459
|
+
let sl;
|
|
460
|
+
let l;
|
|
461
|
+
l = (2 - s) * v;
|
|
462
|
+
const lmin = (2 - s) * vmin;
|
|
463
|
+
sl = s * vmin;
|
|
464
|
+
sl /= lmin <= 1 ? lmin : 2 - lmin;
|
|
465
|
+
sl = sl || 0;
|
|
466
|
+
l /= 2;
|
|
467
|
+
return [h, sl * 100, l * 100];
|
|
468
|
+
};
|
|
469
|
+
convert.hwb.rgb = function(hwb) {
|
|
470
|
+
const h = hwb[0] / 360;
|
|
471
|
+
let wh = hwb[1] / 100;
|
|
472
|
+
let bl = hwb[2] / 100;
|
|
473
|
+
const ratio = wh + bl;
|
|
474
|
+
let f;
|
|
475
|
+
if (ratio > 1) {
|
|
476
|
+
wh /= ratio;
|
|
477
|
+
bl /= ratio;
|
|
478
|
+
}
|
|
479
|
+
const i = Math.floor(6 * h);
|
|
480
|
+
const v = 1 - bl;
|
|
481
|
+
f = 6 * h - i;
|
|
482
|
+
if ((i & 1) !== 0) {
|
|
483
|
+
f = 1 - f;
|
|
484
|
+
}
|
|
485
|
+
const n = wh + f * (v - wh);
|
|
486
|
+
let r;
|
|
487
|
+
let g;
|
|
488
|
+
let b;
|
|
489
|
+
switch (i) {
|
|
490
|
+
default:
|
|
491
|
+
case 6:
|
|
492
|
+
case 0:
|
|
493
|
+
r = v;
|
|
494
|
+
g = n;
|
|
495
|
+
b = wh;
|
|
496
|
+
break;
|
|
497
|
+
case 1:
|
|
498
|
+
r = n;
|
|
499
|
+
g = v;
|
|
500
|
+
b = wh;
|
|
501
|
+
break;
|
|
502
|
+
case 2:
|
|
503
|
+
r = wh;
|
|
504
|
+
g = v;
|
|
505
|
+
b = n;
|
|
506
|
+
break;
|
|
507
|
+
case 3:
|
|
508
|
+
r = wh;
|
|
509
|
+
g = n;
|
|
510
|
+
b = v;
|
|
511
|
+
break;
|
|
512
|
+
case 4:
|
|
513
|
+
r = n;
|
|
514
|
+
g = wh;
|
|
515
|
+
b = v;
|
|
516
|
+
break;
|
|
517
|
+
case 5:
|
|
518
|
+
r = v;
|
|
519
|
+
g = wh;
|
|
520
|
+
b = n;
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
return [r * 255, g * 255, b * 255];
|
|
524
|
+
};
|
|
525
|
+
convert.cmyk.rgb = function(cmyk) {
|
|
526
|
+
const c = cmyk[0] / 100;
|
|
527
|
+
const m = cmyk[1] / 100;
|
|
528
|
+
const y = cmyk[2] / 100;
|
|
529
|
+
const k = cmyk[3] / 100;
|
|
530
|
+
const r = 1 - Math.min(1, c * (1 - k) + k);
|
|
531
|
+
const g = 1 - Math.min(1, m * (1 - k) + k);
|
|
532
|
+
const b = 1 - Math.min(1, y * (1 - k) + k);
|
|
533
|
+
return [r * 255, g * 255, b * 255];
|
|
534
|
+
};
|
|
535
|
+
convert.xyz.rgb = function(xyz) {
|
|
536
|
+
const x = xyz[0] / 100;
|
|
537
|
+
const y = xyz[1] / 100;
|
|
538
|
+
const z = xyz[2] / 100;
|
|
539
|
+
let r;
|
|
540
|
+
let g;
|
|
541
|
+
let b;
|
|
542
|
+
r = x * 3.2406 + y * -1.5372 + z * -0.4986;
|
|
543
|
+
g = x * -0.9689 + y * 1.8758 + z * 0.0415;
|
|
544
|
+
b = x * 0.0557 + y * -0.204 + z * 1.057;
|
|
545
|
+
r = r > 31308e-7 ? 1.055 * r ** (1 / 2.4) - 0.055 : r * 12.92;
|
|
546
|
+
g = g > 31308e-7 ? 1.055 * g ** (1 / 2.4) - 0.055 : g * 12.92;
|
|
547
|
+
b = b > 31308e-7 ? 1.055 * b ** (1 / 2.4) - 0.055 : b * 12.92;
|
|
548
|
+
r = Math.min(Math.max(0, r), 1);
|
|
549
|
+
g = Math.min(Math.max(0, g), 1);
|
|
550
|
+
b = Math.min(Math.max(0, b), 1);
|
|
551
|
+
return [r * 255, g * 255, b * 255];
|
|
552
|
+
};
|
|
553
|
+
convert.xyz.lab = function(xyz) {
|
|
554
|
+
let x = xyz[0];
|
|
555
|
+
let y = xyz[1];
|
|
556
|
+
let z = xyz[2];
|
|
557
|
+
x /= 95.047;
|
|
558
|
+
y /= 100;
|
|
559
|
+
z /= 108.883;
|
|
560
|
+
x = x > 8856e-6 ? x ** (1 / 3) : 7.787 * x + 16 / 116;
|
|
561
|
+
y = y > 8856e-6 ? y ** (1 / 3) : 7.787 * y + 16 / 116;
|
|
562
|
+
z = z > 8856e-6 ? z ** (1 / 3) : 7.787 * z + 16 / 116;
|
|
563
|
+
const l = 116 * y - 16;
|
|
564
|
+
const a = 500 * (x - y);
|
|
565
|
+
const b = 200 * (y - z);
|
|
566
|
+
return [l, a, b];
|
|
567
|
+
};
|
|
568
|
+
convert.lab.xyz = function(lab) {
|
|
569
|
+
const l = lab[0];
|
|
570
|
+
const a = lab[1];
|
|
571
|
+
const b = lab[2];
|
|
572
|
+
let x;
|
|
573
|
+
let y;
|
|
574
|
+
let z;
|
|
575
|
+
y = (l + 16) / 116;
|
|
576
|
+
x = a / 500 + y;
|
|
577
|
+
z = y - b / 200;
|
|
578
|
+
const y2 = y ** 3;
|
|
579
|
+
const x2 = x ** 3;
|
|
580
|
+
const z2 = z ** 3;
|
|
581
|
+
y = y2 > 8856e-6 ? y2 : (y - 16 / 116) / 7.787;
|
|
582
|
+
x = x2 > 8856e-6 ? x2 : (x - 16 / 116) / 7.787;
|
|
583
|
+
z = z2 > 8856e-6 ? z2 : (z - 16 / 116) / 7.787;
|
|
584
|
+
x *= 95.047;
|
|
585
|
+
y *= 100;
|
|
586
|
+
z *= 108.883;
|
|
587
|
+
return [x, y, z];
|
|
588
|
+
};
|
|
589
|
+
convert.lab.lch = function(lab) {
|
|
590
|
+
const l = lab[0];
|
|
591
|
+
const a = lab[1];
|
|
592
|
+
const b = lab[2];
|
|
593
|
+
let h;
|
|
594
|
+
const hr = Math.atan2(b, a);
|
|
595
|
+
h = hr * 360 / 2 / Math.PI;
|
|
596
|
+
if (h < 0) {
|
|
597
|
+
h += 360;
|
|
598
|
+
}
|
|
599
|
+
const c = Math.sqrt(a * a + b * b);
|
|
600
|
+
return [l, c, h];
|
|
601
|
+
};
|
|
602
|
+
convert.lch.lab = function(lch) {
|
|
603
|
+
const l = lch[0];
|
|
604
|
+
const c = lch[1];
|
|
605
|
+
const h = lch[2];
|
|
606
|
+
const hr = h / 360 * 2 * Math.PI;
|
|
607
|
+
const a = c * Math.cos(hr);
|
|
608
|
+
const b = c * Math.sin(hr);
|
|
609
|
+
return [l, a, b];
|
|
610
|
+
};
|
|
611
|
+
convert.rgb.ansi16 = function(args, saturation = null) {
|
|
612
|
+
const [r, g, b] = args;
|
|
613
|
+
let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation;
|
|
614
|
+
value = Math.round(value / 50);
|
|
615
|
+
if (value === 0) {
|
|
616
|
+
return 30;
|
|
617
|
+
}
|
|
618
|
+
let ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255));
|
|
619
|
+
if (value === 2) {
|
|
620
|
+
ansi += 60;
|
|
621
|
+
}
|
|
622
|
+
return ansi;
|
|
623
|
+
};
|
|
624
|
+
convert.hsv.ansi16 = function(args) {
|
|
625
|
+
return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
|
|
626
|
+
};
|
|
627
|
+
convert.rgb.ansi256 = function(args) {
|
|
628
|
+
const r = args[0];
|
|
629
|
+
const g = args[1];
|
|
630
|
+
const b = args[2];
|
|
631
|
+
if (r === g && g === b) {
|
|
632
|
+
if (r < 8) {
|
|
633
|
+
return 16;
|
|
634
|
+
}
|
|
635
|
+
if (r > 248) {
|
|
636
|
+
return 231;
|
|
637
|
+
}
|
|
638
|
+
return Math.round((r - 8) / 247 * 24) + 232;
|
|
639
|
+
}
|
|
640
|
+
const ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5);
|
|
641
|
+
return ansi;
|
|
642
|
+
};
|
|
643
|
+
convert.ansi16.rgb = function(args) {
|
|
644
|
+
let color = args % 10;
|
|
645
|
+
if (color === 0 || color === 7) {
|
|
646
|
+
if (args > 50) {
|
|
647
|
+
color += 3.5;
|
|
648
|
+
}
|
|
649
|
+
color = color / 10.5 * 255;
|
|
650
|
+
return [color, color, color];
|
|
651
|
+
}
|
|
652
|
+
const mult = (~~(args > 50) + 1) * 0.5;
|
|
653
|
+
const r = (color & 1) * mult * 255;
|
|
654
|
+
const g = (color >> 1 & 1) * mult * 255;
|
|
655
|
+
const b = (color >> 2 & 1) * mult * 255;
|
|
656
|
+
return [r, g, b];
|
|
657
|
+
};
|
|
658
|
+
convert.ansi256.rgb = function(args) {
|
|
659
|
+
if (args >= 232) {
|
|
660
|
+
const c = (args - 232) * 10 + 8;
|
|
661
|
+
return [c, c, c];
|
|
662
|
+
}
|
|
663
|
+
args -= 16;
|
|
664
|
+
let rem;
|
|
665
|
+
const r = Math.floor(args / 36) / 5 * 255;
|
|
666
|
+
const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
|
|
667
|
+
const b = rem % 6 / 5 * 255;
|
|
668
|
+
return [r, g, b];
|
|
669
|
+
};
|
|
670
|
+
convert.rgb.hex = function(args) {
|
|
671
|
+
const integer = ((Math.round(args[0]) & 255) << 16) + ((Math.round(args[1]) & 255) << 8) + (Math.round(args[2]) & 255);
|
|
672
|
+
const string = integer.toString(16).toUpperCase();
|
|
673
|
+
return "000000".substring(string.length) + string;
|
|
674
|
+
};
|
|
675
|
+
convert.hex.rgb = function(args) {
|
|
676
|
+
const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
|
|
677
|
+
if (!match) {
|
|
678
|
+
return [0, 0, 0];
|
|
679
|
+
}
|
|
680
|
+
let colorString = match[0];
|
|
681
|
+
if (match[0].length === 3) {
|
|
682
|
+
colorString = colorString.split("").map((char) => {
|
|
683
|
+
return char + char;
|
|
684
|
+
}).join("");
|
|
685
|
+
}
|
|
686
|
+
const integer = parseInt(colorString, 16);
|
|
687
|
+
const r = integer >> 16 & 255;
|
|
688
|
+
const g = integer >> 8 & 255;
|
|
689
|
+
const b = integer & 255;
|
|
690
|
+
return [r, g, b];
|
|
691
|
+
};
|
|
692
|
+
convert.rgb.hcg = function(rgb) {
|
|
693
|
+
const r = rgb[0] / 255;
|
|
694
|
+
const g = rgb[1] / 255;
|
|
695
|
+
const b = rgb[2] / 255;
|
|
696
|
+
const max = Math.max(Math.max(r, g), b);
|
|
697
|
+
const min = Math.min(Math.min(r, g), b);
|
|
698
|
+
const chroma = max - min;
|
|
699
|
+
let grayscale;
|
|
700
|
+
let hue;
|
|
701
|
+
if (chroma < 1) {
|
|
702
|
+
grayscale = min / (1 - chroma);
|
|
703
|
+
} else {
|
|
704
|
+
grayscale = 0;
|
|
705
|
+
}
|
|
706
|
+
if (chroma <= 0) {
|
|
707
|
+
hue = 0;
|
|
708
|
+
} else if (max === r) {
|
|
709
|
+
hue = (g - b) / chroma % 6;
|
|
710
|
+
} else if (max === g) {
|
|
711
|
+
hue = 2 + (b - r) / chroma;
|
|
712
|
+
} else {
|
|
713
|
+
hue = 4 + (r - g) / chroma;
|
|
714
|
+
}
|
|
715
|
+
hue /= 6;
|
|
716
|
+
hue %= 1;
|
|
717
|
+
return [hue * 360, chroma * 100, grayscale * 100];
|
|
718
|
+
};
|
|
719
|
+
convert.hsl.hcg = function(hsl) {
|
|
720
|
+
const s = hsl[1] / 100;
|
|
721
|
+
const l = hsl[2] / 100;
|
|
722
|
+
const c = l < 0.5 ? 2 * s * l : 2 * s * (1 - l);
|
|
723
|
+
let f = 0;
|
|
724
|
+
if (c < 1) {
|
|
725
|
+
f = (l - 0.5 * c) / (1 - c);
|
|
726
|
+
}
|
|
727
|
+
return [hsl[0], c * 100, f * 100];
|
|
728
|
+
};
|
|
729
|
+
convert.hsv.hcg = function(hsv) {
|
|
730
|
+
const s = hsv[1] / 100;
|
|
731
|
+
const v = hsv[2] / 100;
|
|
732
|
+
const c = s * v;
|
|
733
|
+
let f = 0;
|
|
734
|
+
if (c < 1) {
|
|
735
|
+
f = (v - c) / (1 - c);
|
|
736
|
+
}
|
|
737
|
+
return [hsv[0], c * 100, f * 100];
|
|
738
|
+
};
|
|
739
|
+
convert.hcg.rgb = function(hcg) {
|
|
740
|
+
const h = hcg[0] / 360;
|
|
741
|
+
const c = hcg[1] / 100;
|
|
742
|
+
const g = hcg[2] / 100;
|
|
743
|
+
if (c === 0) {
|
|
744
|
+
return [g * 255, g * 255, g * 255];
|
|
745
|
+
}
|
|
746
|
+
const pure = [0, 0, 0];
|
|
747
|
+
const hi = h % 1 * 6;
|
|
748
|
+
const v = hi % 1;
|
|
749
|
+
const w = 1 - v;
|
|
750
|
+
let mg = 0;
|
|
751
|
+
switch (Math.floor(hi)) {
|
|
752
|
+
case 0:
|
|
753
|
+
pure[0] = 1;
|
|
754
|
+
pure[1] = v;
|
|
755
|
+
pure[2] = 0;
|
|
756
|
+
break;
|
|
757
|
+
case 1:
|
|
758
|
+
pure[0] = w;
|
|
759
|
+
pure[1] = 1;
|
|
760
|
+
pure[2] = 0;
|
|
761
|
+
break;
|
|
762
|
+
case 2:
|
|
763
|
+
pure[0] = 0;
|
|
764
|
+
pure[1] = 1;
|
|
765
|
+
pure[2] = v;
|
|
766
|
+
break;
|
|
767
|
+
case 3:
|
|
768
|
+
pure[0] = 0;
|
|
769
|
+
pure[1] = w;
|
|
770
|
+
pure[2] = 1;
|
|
771
|
+
break;
|
|
772
|
+
case 4:
|
|
773
|
+
pure[0] = v;
|
|
774
|
+
pure[1] = 0;
|
|
775
|
+
pure[2] = 1;
|
|
776
|
+
break;
|
|
777
|
+
default:
|
|
778
|
+
pure[0] = 1;
|
|
779
|
+
pure[1] = 0;
|
|
780
|
+
pure[2] = w;
|
|
781
|
+
}
|
|
782
|
+
mg = (1 - c) * g;
|
|
783
|
+
return [
|
|
784
|
+
(c * pure[0] + mg) * 255,
|
|
785
|
+
(c * pure[1] + mg) * 255,
|
|
786
|
+
(c * pure[2] + mg) * 255
|
|
787
|
+
];
|
|
788
|
+
};
|
|
789
|
+
convert.hcg.hsv = function(hcg) {
|
|
790
|
+
const c = hcg[1] / 100;
|
|
791
|
+
const g = hcg[2] / 100;
|
|
792
|
+
const v = c + g * (1 - c);
|
|
793
|
+
let f = 0;
|
|
794
|
+
if (v > 0) {
|
|
795
|
+
f = c / v;
|
|
796
|
+
}
|
|
797
|
+
return [hcg[0], f * 100, v * 100];
|
|
798
|
+
};
|
|
799
|
+
convert.hcg.hsl = function(hcg) {
|
|
800
|
+
const c = hcg[1] / 100;
|
|
801
|
+
const g = hcg[2] / 100;
|
|
802
|
+
const l = g * (1 - c) + 0.5 * c;
|
|
803
|
+
let s = 0;
|
|
804
|
+
if (l > 0 && l < 0.5) {
|
|
805
|
+
s = c / (2 * l);
|
|
806
|
+
} else if (l >= 0.5 && l < 1) {
|
|
807
|
+
s = c / (2 * (1 - l));
|
|
808
|
+
}
|
|
809
|
+
return [hcg[0], s * 100, l * 100];
|
|
810
|
+
};
|
|
811
|
+
convert.hcg.hwb = function(hcg) {
|
|
812
|
+
const c = hcg[1] / 100;
|
|
813
|
+
const g = hcg[2] / 100;
|
|
814
|
+
const v = c + g * (1 - c);
|
|
815
|
+
return [hcg[0], (v - c) * 100, (1 - v) * 100];
|
|
816
|
+
};
|
|
817
|
+
convert.hwb.hcg = function(hwb) {
|
|
818
|
+
const w = hwb[1] / 100;
|
|
819
|
+
const b = hwb[2] / 100;
|
|
820
|
+
const v = 1 - b;
|
|
821
|
+
const c = v - w;
|
|
822
|
+
let g = 0;
|
|
823
|
+
if (c < 1) {
|
|
824
|
+
g = (v - c) / (1 - c);
|
|
825
|
+
}
|
|
826
|
+
return [hwb[0], c * 100, g * 100];
|
|
827
|
+
};
|
|
828
|
+
convert.apple.rgb = function(apple) {
|
|
829
|
+
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
|
|
830
|
+
};
|
|
831
|
+
convert.rgb.apple = function(rgb) {
|
|
832
|
+
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
|
|
833
|
+
};
|
|
834
|
+
convert.gray.rgb = function(args) {
|
|
835
|
+
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
|
|
836
|
+
};
|
|
837
|
+
convert.gray.hsl = function(args) {
|
|
838
|
+
return [0, 0, args[0]];
|
|
839
|
+
};
|
|
840
|
+
convert.gray.hsv = convert.gray.hsl;
|
|
841
|
+
convert.gray.hwb = function(gray) {
|
|
842
|
+
return [0, 100, gray[0]];
|
|
843
|
+
};
|
|
844
|
+
convert.gray.cmyk = function(gray) {
|
|
845
|
+
return [0, 0, 0, gray[0]];
|
|
846
|
+
};
|
|
847
|
+
convert.gray.lab = function(gray) {
|
|
848
|
+
return [gray[0], 0, 0];
|
|
849
|
+
};
|
|
850
|
+
convert.gray.hex = function(gray) {
|
|
851
|
+
const val = Math.round(gray[0] / 100 * 255) & 255;
|
|
852
|
+
const integer = (val << 16) + (val << 8) + val;
|
|
853
|
+
const string = integer.toString(16).toUpperCase();
|
|
854
|
+
return "000000".substring(string.length) + string;
|
|
855
|
+
};
|
|
856
|
+
convert.rgb.gray = function(rgb) {
|
|
857
|
+
const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
|
|
858
|
+
return [val / 255 * 100];
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
// ../../node_modules/color-convert/route.js
|
|
864
|
+
var require_route = __commonJS({
|
|
865
|
+
"../../node_modules/color-convert/route.js"(exports, module) {
|
|
866
|
+
"use strict";
|
|
867
|
+
var conversions = require_conversions();
|
|
868
|
+
function buildGraph() {
|
|
869
|
+
const graph = {};
|
|
870
|
+
const models = Object.keys(conversions);
|
|
871
|
+
for (let len = models.length, i = 0; i < len; i++) {
|
|
872
|
+
graph[models[i]] = {
|
|
873
|
+
// http://jsperf.com/1-vs-infinity
|
|
874
|
+
// micro-opt, but this is simple.
|
|
875
|
+
distance: -1,
|
|
876
|
+
parent: null
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
return graph;
|
|
880
|
+
}
|
|
881
|
+
function deriveBFS(fromModel) {
|
|
882
|
+
const graph = buildGraph();
|
|
883
|
+
const queue = [fromModel];
|
|
884
|
+
graph[fromModel].distance = 0;
|
|
885
|
+
while (queue.length) {
|
|
886
|
+
const current = queue.pop();
|
|
887
|
+
const adjacents = Object.keys(conversions[current]);
|
|
888
|
+
for (let len = adjacents.length, i = 0; i < len; i++) {
|
|
889
|
+
const adjacent = adjacents[i];
|
|
890
|
+
const node = graph[adjacent];
|
|
891
|
+
if (node.distance === -1) {
|
|
892
|
+
node.distance = graph[current].distance + 1;
|
|
893
|
+
node.parent = current;
|
|
894
|
+
queue.unshift(adjacent);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
return graph;
|
|
899
|
+
}
|
|
900
|
+
function link(from, to) {
|
|
901
|
+
return function(args) {
|
|
902
|
+
return to(from(args));
|
|
903
|
+
};
|
|
904
|
+
}
|
|
905
|
+
function wrapConversion(toModel, graph) {
|
|
906
|
+
const path = [graph[toModel].parent, toModel];
|
|
907
|
+
let fn = conversions[graph[toModel].parent][toModel];
|
|
908
|
+
let cur = graph[toModel].parent;
|
|
909
|
+
while (graph[cur].parent) {
|
|
910
|
+
path.unshift(graph[cur].parent);
|
|
911
|
+
fn = link(conversions[graph[cur].parent][cur], fn);
|
|
912
|
+
cur = graph[cur].parent;
|
|
913
|
+
}
|
|
914
|
+
fn.conversion = path;
|
|
915
|
+
return fn;
|
|
916
|
+
}
|
|
917
|
+
module.exports = function(fromModel) {
|
|
918
|
+
const graph = deriveBFS(fromModel);
|
|
919
|
+
const conversion = {};
|
|
920
|
+
const models = Object.keys(graph);
|
|
921
|
+
for (let len = models.length, i = 0; i < len; i++) {
|
|
922
|
+
const toModel = models[i];
|
|
923
|
+
const node = graph[toModel];
|
|
924
|
+
if (node.parent === null) {
|
|
925
|
+
continue;
|
|
926
|
+
}
|
|
927
|
+
conversion[toModel] = wrapConversion(toModel, graph);
|
|
928
|
+
}
|
|
929
|
+
return conversion;
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
});
|
|
933
|
+
|
|
934
|
+
// ../../node_modules/color-convert/index.js
|
|
935
|
+
var require_color_convert = __commonJS({
|
|
936
|
+
"../../node_modules/color-convert/index.js"(exports, module) {
|
|
937
|
+
"use strict";
|
|
938
|
+
var conversions = require_conversions();
|
|
939
|
+
var route = require_route();
|
|
940
|
+
var convert = {};
|
|
941
|
+
var models = Object.keys(conversions);
|
|
942
|
+
function wrapRaw(fn) {
|
|
943
|
+
const wrappedFn = function(...args) {
|
|
944
|
+
const arg0 = args[0];
|
|
945
|
+
if (arg0 === void 0 || arg0 === null) {
|
|
946
|
+
return arg0;
|
|
947
|
+
}
|
|
948
|
+
if (arg0.length > 1) {
|
|
949
|
+
args = arg0;
|
|
950
|
+
}
|
|
951
|
+
return fn(args);
|
|
952
|
+
};
|
|
953
|
+
if ("conversion" in fn) {
|
|
954
|
+
wrappedFn.conversion = fn.conversion;
|
|
955
|
+
}
|
|
956
|
+
return wrappedFn;
|
|
957
|
+
}
|
|
958
|
+
function wrapRounded(fn) {
|
|
959
|
+
const wrappedFn = function(...args) {
|
|
960
|
+
const arg0 = args[0];
|
|
961
|
+
if (arg0 === void 0 || arg0 === null) {
|
|
962
|
+
return arg0;
|
|
963
|
+
}
|
|
964
|
+
if (arg0.length > 1) {
|
|
965
|
+
args = arg0;
|
|
966
|
+
}
|
|
967
|
+
const result = fn(args);
|
|
968
|
+
if (typeof result === "object") {
|
|
969
|
+
for (let len = result.length, i = 0; i < len; i++) {
|
|
970
|
+
result[i] = Math.round(result[i]);
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
return result;
|
|
974
|
+
};
|
|
975
|
+
if ("conversion" in fn) {
|
|
976
|
+
wrappedFn.conversion = fn.conversion;
|
|
977
|
+
}
|
|
978
|
+
return wrappedFn;
|
|
979
|
+
}
|
|
980
|
+
models.forEach((fromModel) => {
|
|
981
|
+
convert[fromModel] = {};
|
|
982
|
+
Object.defineProperty(convert[fromModel], "channels", { value: conversions[fromModel].channels });
|
|
983
|
+
Object.defineProperty(convert[fromModel], "labels", { value: conversions[fromModel].labels });
|
|
984
|
+
const routes = route(fromModel);
|
|
985
|
+
const routeModels = Object.keys(routes);
|
|
986
|
+
routeModels.forEach((toModel) => {
|
|
987
|
+
const fn = routes[toModel];
|
|
988
|
+
convert[fromModel][toModel] = wrapRounded(fn);
|
|
989
|
+
convert[fromModel][toModel].raw = wrapRaw(fn);
|
|
990
|
+
});
|
|
991
|
+
});
|
|
992
|
+
module.exports = convert;
|
|
993
|
+
}
|
|
994
|
+
});
|
|
995
|
+
|
|
996
|
+
// ../../node_modules/chalk/node_modules/ansi-styles/index.js
|
|
997
|
+
var require_ansi_styles = __commonJS({
|
|
998
|
+
"../../node_modules/chalk/node_modules/ansi-styles/index.js"(exports, module) {
|
|
999
|
+
"use strict";
|
|
1000
|
+
var wrapAnsi16 = (fn, offset) => (...args) => {
|
|
1001
|
+
const code = fn(...args);
|
|
1002
|
+
return `\x1B[${code + offset}m`;
|
|
1003
|
+
};
|
|
1004
|
+
var wrapAnsi256 = (fn, offset) => (...args) => {
|
|
1005
|
+
const code = fn(...args);
|
|
1006
|
+
return `\x1B[${38 + offset};5;${code}m`;
|
|
1007
|
+
};
|
|
1008
|
+
var wrapAnsi16m = (fn, offset) => (...args) => {
|
|
1009
|
+
const rgb = fn(...args);
|
|
1010
|
+
return `\x1B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
|
|
1011
|
+
};
|
|
1012
|
+
var ansi2ansi = (n) => n;
|
|
1013
|
+
var rgb2rgb = (r, g, b) => [r, g, b];
|
|
1014
|
+
var setLazyProperty = (object, property, get) => {
|
|
1015
|
+
Object.defineProperty(object, property, {
|
|
1016
|
+
get: () => {
|
|
1017
|
+
const value = get();
|
|
1018
|
+
Object.defineProperty(object, property, {
|
|
1019
|
+
value,
|
|
1020
|
+
enumerable: true,
|
|
1021
|
+
configurable: true
|
|
1022
|
+
});
|
|
1023
|
+
return value;
|
|
1024
|
+
},
|
|
1025
|
+
enumerable: true,
|
|
1026
|
+
configurable: true
|
|
1027
|
+
});
|
|
1028
|
+
};
|
|
1029
|
+
var colorConvert;
|
|
1030
|
+
var makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
|
|
1031
|
+
if (colorConvert === void 0) {
|
|
1032
|
+
colorConvert = require_color_convert();
|
|
1033
|
+
}
|
|
1034
|
+
const offset = isBackground ? 10 : 0;
|
|
1035
|
+
const styles = {};
|
|
1036
|
+
for (const [sourceSpace, suite] of Object.entries(colorConvert)) {
|
|
1037
|
+
const name = sourceSpace === "ansi16" ? "ansi" : sourceSpace;
|
|
1038
|
+
if (sourceSpace === targetSpace) {
|
|
1039
|
+
styles[name] = wrap(identity, offset);
|
|
1040
|
+
} else if (typeof suite === "object") {
|
|
1041
|
+
styles[name] = wrap(suite[targetSpace], offset);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
return styles;
|
|
1045
|
+
};
|
|
1046
|
+
function assembleStyles() {
|
|
1047
|
+
const codes = /* @__PURE__ */ new Map();
|
|
1048
|
+
const styles = {
|
|
1049
|
+
modifier: {
|
|
1050
|
+
reset: [0, 0],
|
|
1051
|
+
// 21 isn't widely supported and 22 does the same thing
|
|
1052
|
+
bold: [1, 22],
|
|
1053
|
+
dim: [2, 22],
|
|
1054
|
+
italic: [3, 23],
|
|
1055
|
+
underline: [4, 24],
|
|
1056
|
+
inverse: [7, 27],
|
|
1057
|
+
hidden: [8, 28],
|
|
1058
|
+
strikethrough: [9, 29]
|
|
1059
|
+
},
|
|
1060
|
+
color: {
|
|
1061
|
+
black: [30, 39],
|
|
1062
|
+
red: [31, 39],
|
|
1063
|
+
green: [32, 39],
|
|
1064
|
+
yellow: [33, 39],
|
|
1065
|
+
blue: [34, 39],
|
|
1066
|
+
magenta: [35, 39],
|
|
1067
|
+
cyan: [36, 39],
|
|
1068
|
+
white: [37, 39],
|
|
1069
|
+
// Bright color
|
|
1070
|
+
blackBright: [90, 39],
|
|
1071
|
+
redBright: [91, 39],
|
|
1072
|
+
greenBright: [92, 39],
|
|
1073
|
+
yellowBright: [93, 39],
|
|
1074
|
+
blueBright: [94, 39],
|
|
1075
|
+
magentaBright: [95, 39],
|
|
1076
|
+
cyanBright: [96, 39],
|
|
1077
|
+
whiteBright: [97, 39]
|
|
1078
|
+
},
|
|
1079
|
+
bgColor: {
|
|
1080
|
+
bgBlack: [40, 49],
|
|
1081
|
+
bgRed: [41, 49],
|
|
1082
|
+
bgGreen: [42, 49],
|
|
1083
|
+
bgYellow: [43, 49],
|
|
1084
|
+
bgBlue: [44, 49],
|
|
1085
|
+
bgMagenta: [45, 49],
|
|
1086
|
+
bgCyan: [46, 49],
|
|
1087
|
+
bgWhite: [47, 49],
|
|
1088
|
+
// Bright color
|
|
1089
|
+
bgBlackBright: [100, 49],
|
|
1090
|
+
bgRedBright: [101, 49],
|
|
1091
|
+
bgGreenBright: [102, 49],
|
|
1092
|
+
bgYellowBright: [103, 49],
|
|
1093
|
+
bgBlueBright: [104, 49],
|
|
1094
|
+
bgMagentaBright: [105, 49],
|
|
1095
|
+
bgCyanBright: [106, 49],
|
|
1096
|
+
bgWhiteBright: [107, 49]
|
|
1097
|
+
}
|
|
1098
|
+
};
|
|
1099
|
+
styles.color.gray = styles.color.blackBright;
|
|
1100
|
+
styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
|
|
1101
|
+
styles.color.grey = styles.color.blackBright;
|
|
1102
|
+
styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
|
|
1103
|
+
for (const [groupName, group] of Object.entries(styles)) {
|
|
1104
|
+
for (const [styleName, style] of Object.entries(group)) {
|
|
1105
|
+
styles[styleName] = {
|
|
1106
|
+
open: `\x1B[${style[0]}m`,
|
|
1107
|
+
close: `\x1B[${style[1]}m`
|
|
1108
|
+
};
|
|
1109
|
+
group[styleName] = styles[styleName];
|
|
1110
|
+
codes.set(style[0], style[1]);
|
|
1111
|
+
}
|
|
1112
|
+
Object.defineProperty(styles, groupName, {
|
|
1113
|
+
value: group,
|
|
1114
|
+
enumerable: false
|
|
1115
|
+
});
|
|
1116
|
+
}
|
|
1117
|
+
Object.defineProperty(styles, "codes", {
|
|
1118
|
+
value: codes,
|
|
1119
|
+
enumerable: false
|
|
1120
|
+
});
|
|
1121
|
+
styles.color.close = "\x1B[39m";
|
|
1122
|
+
styles.bgColor.close = "\x1B[49m";
|
|
1123
|
+
setLazyProperty(styles.color, "ansi", () => makeDynamicStyles(wrapAnsi16, "ansi16", ansi2ansi, false));
|
|
1124
|
+
setLazyProperty(styles.color, "ansi256", () => makeDynamicStyles(wrapAnsi256, "ansi256", ansi2ansi, false));
|
|
1125
|
+
setLazyProperty(styles.color, "ansi16m", () => makeDynamicStyles(wrapAnsi16m, "rgb", rgb2rgb, false));
|
|
1126
|
+
setLazyProperty(styles.bgColor, "ansi", () => makeDynamicStyles(wrapAnsi16, "ansi16", ansi2ansi, true));
|
|
1127
|
+
setLazyProperty(styles.bgColor, "ansi256", () => makeDynamicStyles(wrapAnsi256, "ansi256", ansi2ansi, true));
|
|
1128
|
+
setLazyProperty(styles.bgColor, "ansi16m", () => makeDynamicStyles(wrapAnsi16m, "rgb", rgb2rgb, true));
|
|
1129
|
+
return styles;
|
|
1130
|
+
}
|
|
1131
|
+
Object.defineProperty(module, "exports", {
|
|
1132
|
+
enumerable: true,
|
|
1133
|
+
get: assembleStyles
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
});
|
|
1137
|
+
|
|
1138
|
+
// ../../node_modules/has-flag/index.js
|
|
1139
|
+
var require_has_flag = __commonJS({
|
|
1140
|
+
"../../node_modules/has-flag/index.js"(exports, module) {
|
|
1141
|
+
"use strict";
|
|
1142
|
+
module.exports = (flag, argv = process.argv) => {
|
|
1143
|
+
const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
|
|
1144
|
+
const position = argv.indexOf(prefix + flag);
|
|
1145
|
+
const terminatorPosition = argv.indexOf("--");
|
|
1146
|
+
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
|
|
1151
|
+
// ../../node_modules/supports-color/index.js
|
|
1152
|
+
var require_supports_color = __commonJS({
|
|
1153
|
+
"../../node_modules/supports-color/index.js"(exports, module) {
|
|
1154
|
+
"use strict";
|
|
1155
|
+
var os = __require("os");
|
|
1156
|
+
var tty = __require("tty");
|
|
1157
|
+
var hasFlag = require_has_flag();
|
|
1158
|
+
var { env } = process;
|
|
1159
|
+
var forceColor;
|
|
1160
|
+
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
|
|
1161
|
+
forceColor = 0;
|
|
1162
|
+
} else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
|
|
1163
|
+
forceColor = 1;
|
|
1164
|
+
}
|
|
1165
|
+
if ("FORCE_COLOR" in env) {
|
|
1166
|
+
if (env.FORCE_COLOR === "true") {
|
|
1167
|
+
forceColor = 1;
|
|
1168
|
+
} else if (env.FORCE_COLOR === "false") {
|
|
1169
|
+
forceColor = 0;
|
|
1170
|
+
} else {
|
|
1171
|
+
forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
function translateLevel(level) {
|
|
1175
|
+
if (level === 0) {
|
|
1176
|
+
return false;
|
|
1177
|
+
}
|
|
1178
|
+
return {
|
|
1179
|
+
level,
|
|
1180
|
+
hasBasic: true,
|
|
1181
|
+
has256: level >= 2,
|
|
1182
|
+
has16m: level >= 3
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
function supportsColor(haveStream, streamIsTTY) {
|
|
1186
|
+
if (forceColor === 0) {
|
|
1187
|
+
return 0;
|
|
1188
|
+
}
|
|
1189
|
+
if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
|
|
1190
|
+
return 3;
|
|
1191
|
+
}
|
|
1192
|
+
if (hasFlag("color=256")) {
|
|
1193
|
+
return 2;
|
|
1194
|
+
}
|
|
1195
|
+
if (haveStream && !streamIsTTY && forceColor === void 0) {
|
|
1196
|
+
return 0;
|
|
1197
|
+
}
|
|
1198
|
+
const min = forceColor || 0;
|
|
1199
|
+
if (env.TERM === "dumb") {
|
|
1200
|
+
return min;
|
|
1201
|
+
}
|
|
1202
|
+
if (process.platform === "win32") {
|
|
1203
|
+
const osRelease = os.release().split(".");
|
|
1204
|
+
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
|
|
1205
|
+
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
1206
|
+
}
|
|
1207
|
+
return 1;
|
|
1208
|
+
}
|
|
1209
|
+
if ("CI" in env) {
|
|
1210
|
+
if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env) || env.CI_NAME === "codeship") {
|
|
1211
|
+
return 1;
|
|
1212
|
+
}
|
|
1213
|
+
return min;
|
|
1214
|
+
}
|
|
1215
|
+
if ("TEAMCITY_VERSION" in env) {
|
|
1216
|
+
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
1217
|
+
}
|
|
1218
|
+
if (env.COLORTERM === "truecolor") {
|
|
1219
|
+
return 3;
|
|
1220
|
+
}
|
|
1221
|
+
if ("TERM_PROGRAM" in env) {
|
|
1222
|
+
const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
|
|
1223
|
+
switch (env.TERM_PROGRAM) {
|
|
1224
|
+
case "iTerm.app":
|
|
1225
|
+
return version >= 3 ? 3 : 2;
|
|
1226
|
+
case "Apple_Terminal":
|
|
1227
|
+
return 2;
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
if (/-256(color)?$/i.test(env.TERM)) {
|
|
1231
|
+
return 2;
|
|
1232
|
+
}
|
|
1233
|
+
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
|
|
1234
|
+
return 1;
|
|
1235
|
+
}
|
|
1236
|
+
if ("COLORTERM" in env) {
|
|
1237
|
+
return 1;
|
|
1238
|
+
}
|
|
1239
|
+
return min;
|
|
1240
|
+
}
|
|
1241
|
+
function getSupportLevel(stream) {
|
|
1242
|
+
const level = supportsColor(stream, stream && stream.isTTY);
|
|
1243
|
+
return translateLevel(level);
|
|
1244
|
+
}
|
|
1245
|
+
module.exports = {
|
|
1246
|
+
supportsColor: getSupportLevel,
|
|
1247
|
+
stdout: translateLevel(supportsColor(true, tty.isatty(1))),
|
|
1248
|
+
stderr: translateLevel(supportsColor(true, tty.isatty(2)))
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
});
|
|
1252
|
+
|
|
1253
|
+
// ../../node_modules/chalk/source/util.js
|
|
1254
|
+
var require_util = __commonJS({
|
|
1255
|
+
"../../node_modules/chalk/source/util.js"(exports, module) {
|
|
1256
|
+
"use strict";
|
|
1257
|
+
var stringReplaceAll = (string, substring, replacer) => {
|
|
1258
|
+
let index = string.indexOf(substring);
|
|
1259
|
+
if (index === -1) {
|
|
1260
|
+
return string;
|
|
1261
|
+
}
|
|
1262
|
+
const substringLength = substring.length;
|
|
1263
|
+
let endIndex = 0;
|
|
1264
|
+
let returnValue = "";
|
|
1265
|
+
do {
|
|
1266
|
+
returnValue += string.substr(endIndex, index - endIndex) + substring + replacer;
|
|
1267
|
+
endIndex = index + substringLength;
|
|
1268
|
+
index = string.indexOf(substring, endIndex);
|
|
1269
|
+
} while (index !== -1);
|
|
1270
|
+
returnValue += string.substr(endIndex);
|
|
1271
|
+
return returnValue;
|
|
1272
|
+
};
|
|
1273
|
+
var stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {
|
|
1274
|
+
let endIndex = 0;
|
|
1275
|
+
let returnValue = "";
|
|
1276
|
+
do {
|
|
1277
|
+
const gotCR = string[index - 1] === "\r";
|
|
1278
|
+
returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? "\r\n" : "\n") + postfix;
|
|
1279
|
+
endIndex = index + 1;
|
|
1280
|
+
index = string.indexOf("\n", endIndex);
|
|
1281
|
+
} while (index !== -1);
|
|
1282
|
+
returnValue += string.substr(endIndex);
|
|
1283
|
+
return returnValue;
|
|
1284
|
+
};
|
|
1285
|
+
module.exports = {
|
|
1286
|
+
stringReplaceAll,
|
|
1287
|
+
stringEncaseCRLFWithFirstIndex
|
|
1288
|
+
};
|
|
1289
|
+
}
|
|
1290
|
+
});
|
|
1291
|
+
|
|
1292
|
+
// ../../node_modules/chalk/source/templates.js
|
|
1293
|
+
var require_templates = __commonJS({
|
|
1294
|
+
"../../node_modules/chalk/source/templates.js"(exports, module) {
|
|
1295
|
+
"use strict";
|
|
1296
|
+
var TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
|
|
1297
|
+
var STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
|
|
1298
|
+
var STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
|
|
1299
|
+
var ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi;
|
|
1300
|
+
var ESCAPES = /* @__PURE__ */ new Map([
|
|
1301
|
+
["n", "\n"],
|
|
1302
|
+
["r", "\r"],
|
|
1303
|
+
["t", " "],
|
|
1304
|
+
["b", "\b"],
|
|
1305
|
+
["f", "\f"],
|
|
1306
|
+
["v", "\v"],
|
|
1307
|
+
["0", "\0"],
|
|
1308
|
+
["\\", "\\"],
|
|
1309
|
+
["e", "\x1B"],
|
|
1310
|
+
["a", "\x07"]
|
|
1311
|
+
]);
|
|
1312
|
+
function unescape(c) {
|
|
1313
|
+
const u = c[0] === "u";
|
|
1314
|
+
const bracket = c[1] === "{";
|
|
1315
|
+
if (u && !bracket && c.length === 5 || c[0] === "x" && c.length === 3) {
|
|
1316
|
+
return String.fromCharCode(parseInt(c.slice(1), 16));
|
|
1317
|
+
}
|
|
1318
|
+
if (u && bracket) {
|
|
1319
|
+
return String.fromCodePoint(parseInt(c.slice(2, -1), 16));
|
|
1320
|
+
}
|
|
1321
|
+
return ESCAPES.get(c) || c;
|
|
1322
|
+
}
|
|
1323
|
+
function parseArguments(name, arguments_) {
|
|
1324
|
+
const results = [];
|
|
1325
|
+
const chunks = arguments_.trim().split(/\s*,\s*/g);
|
|
1326
|
+
let matches;
|
|
1327
|
+
for (const chunk of chunks) {
|
|
1328
|
+
const number = Number(chunk);
|
|
1329
|
+
if (!Number.isNaN(number)) {
|
|
1330
|
+
results.push(number);
|
|
1331
|
+
} else if (matches = chunk.match(STRING_REGEX)) {
|
|
1332
|
+
results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));
|
|
1333
|
+
} else {
|
|
1334
|
+
throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
return results;
|
|
1338
|
+
}
|
|
1339
|
+
function parseStyle(style) {
|
|
1340
|
+
STYLE_REGEX.lastIndex = 0;
|
|
1341
|
+
const results = [];
|
|
1342
|
+
let matches;
|
|
1343
|
+
while ((matches = STYLE_REGEX.exec(style)) !== null) {
|
|
1344
|
+
const name = matches[1];
|
|
1345
|
+
if (matches[2]) {
|
|
1346
|
+
const args = parseArguments(name, matches[2]);
|
|
1347
|
+
results.push([name].concat(args));
|
|
1348
|
+
} else {
|
|
1349
|
+
results.push([name]);
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
return results;
|
|
1353
|
+
}
|
|
1354
|
+
function buildStyle(chalk2, styles) {
|
|
1355
|
+
const enabled = {};
|
|
1356
|
+
for (const layer of styles) {
|
|
1357
|
+
for (const style of layer.styles) {
|
|
1358
|
+
enabled[style[0]] = layer.inverse ? null : style.slice(1);
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
let current = chalk2;
|
|
1362
|
+
for (const [styleName, styles2] of Object.entries(enabled)) {
|
|
1363
|
+
if (!Array.isArray(styles2)) {
|
|
1364
|
+
continue;
|
|
1365
|
+
}
|
|
1366
|
+
if (!(styleName in current)) {
|
|
1367
|
+
throw new Error(`Unknown Chalk style: ${styleName}`);
|
|
1368
|
+
}
|
|
1369
|
+
current = styles2.length > 0 ? current[styleName](...styles2) : current[styleName];
|
|
1370
|
+
}
|
|
1371
|
+
return current;
|
|
1372
|
+
}
|
|
1373
|
+
module.exports = (chalk2, temporary) => {
|
|
1374
|
+
const styles = [];
|
|
1375
|
+
const chunks = [];
|
|
1376
|
+
let chunk = [];
|
|
1377
|
+
temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {
|
|
1378
|
+
if (escapeCharacter) {
|
|
1379
|
+
chunk.push(unescape(escapeCharacter));
|
|
1380
|
+
} else if (style) {
|
|
1381
|
+
const string = chunk.join("");
|
|
1382
|
+
chunk = [];
|
|
1383
|
+
chunks.push(styles.length === 0 ? string : buildStyle(chalk2, styles)(string));
|
|
1384
|
+
styles.push({ inverse, styles: parseStyle(style) });
|
|
1385
|
+
} else if (close) {
|
|
1386
|
+
if (styles.length === 0) {
|
|
1387
|
+
throw new Error("Found extraneous } in Chalk template literal");
|
|
1388
|
+
}
|
|
1389
|
+
chunks.push(buildStyle(chalk2, styles)(chunk.join("")));
|
|
1390
|
+
chunk = [];
|
|
1391
|
+
styles.pop();
|
|
1392
|
+
} else {
|
|
1393
|
+
chunk.push(character);
|
|
1394
|
+
}
|
|
1395
|
+
});
|
|
1396
|
+
chunks.push(chunk.join(""));
|
|
1397
|
+
if (styles.length > 0) {
|
|
1398
|
+
const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? "" : "s"} (\`}\`)`;
|
|
1399
|
+
throw new Error(errMessage);
|
|
1400
|
+
}
|
|
1401
|
+
return chunks.join("");
|
|
1402
|
+
};
|
|
1403
|
+
}
|
|
1404
|
+
});
|
|
1405
|
+
|
|
1406
|
+
// ../../node_modules/chalk/source/index.js
|
|
1407
|
+
var require_source = __commonJS({
|
|
1408
|
+
"../../node_modules/chalk/source/index.js"(exports, module) {
|
|
1409
|
+
"use strict";
|
|
1410
|
+
var ansiStyles = require_ansi_styles();
|
|
1411
|
+
var { stdout: stdoutColor, stderr: stderrColor } = require_supports_color();
|
|
1412
|
+
var {
|
|
1413
|
+
stringReplaceAll,
|
|
1414
|
+
stringEncaseCRLFWithFirstIndex
|
|
1415
|
+
} = require_util();
|
|
1416
|
+
var { isArray } = Array;
|
|
1417
|
+
var levelMapping = [
|
|
1418
|
+
"ansi",
|
|
1419
|
+
"ansi",
|
|
1420
|
+
"ansi256",
|
|
1421
|
+
"ansi16m"
|
|
1422
|
+
];
|
|
1423
|
+
var styles = /* @__PURE__ */ Object.create(null);
|
|
1424
|
+
var applyOptions = (object, options = {}) => {
|
|
1425
|
+
if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
|
|
1426
|
+
throw new Error("The `level` option should be an integer from 0 to 3");
|
|
1427
|
+
}
|
|
1428
|
+
const colorLevel = stdoutColor ? stdoutColor.level : 0;
|
|
1429
|
+
object.level = options.level === void 0 ? colorLevel : options.level;
|
|
1430
|
+
};
|
|
1431
|
+
var ChalkClass = class {
|
|
1432
|
+
constructor(options) {
|
|
1433
|
+
return chalkFactory(options);
|
|
1434
|
+
}
|
|
1435
|
+
};
|
|
1436
|
+
var chalkFactory = (options) => {
|
|
1437
|
+
const chalk3 = {};
|
|
1438
|
+
applyOptions(chalk3, options);
|
|
1439
|
+
chalk3.template = (...arguments_) => chalkTag(chalk3.template, ...arguments_);
|
|
1440
|
+
Object.setPrototypeOf(chalk3, Chalk.prototype);
|
|
1441
|
+
Object.setPrototypeOf(chalk3.template, chalk3);
|
|
1442
|
+
chalk3.template.constructor = () => {
|
|
1443
|
+
throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.");
|
|
1444
|
+
};
|
|
1445
|
+
chalk3.template.Instance = ChalkClass;
|
|
1446
|
+
return chalk3.template;
|
|
1447
|
+
};
|
|
1448
|
+
function Chalk(options) {
|
|
1449
|
+
return chalkFactory(options);
|
|
1450
|
+
}
|
|
1451
|
+
for (const [styleName, style] of Object.entries(ansiStyles)) {
|
|
1452
|
+
styles[styleName] = {
|
|
1453
|
+
get() {
|
|
1454
|
+
const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);
|
|
1455
|
+
Object.defineProperty(this, styleName, { value: builder });
|
|
1456
|
+
return builder;
|
|
1457
|
+
}
|
|
1458
|
+
};
|
|
1459
|
+
}
|
|
1460
|
+
styles.visible = {
|
|
1461
|
+
get() {
|
|
1462
|
+
const builder = createBuilder(this, this._styler, true);
|
|
1463
|
+
Object.defineProperty(this, "visible", { value: builder });
|
|
1464
|
+
return builder;
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1467
|
+
var usedModels = ["rgb", "hex", "keyword", "hsl", "hsv", "hwb", "ansi", "ansi256"];
|
|
1468
|
+
for (const model of usedModels) {
|
|
1469
|
+
styles[model] = {
|
|
1470
|
+
get() {
|
|
1471
|
+
const { level } = this;
|
|
1472
|
+
return function(...arguments_) {
|
|
1473
|
+
const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);
|
|
1474
|
+
return createBuilder(this, styler, this._isEmpty);
|
|
1475
|
+
};
|
|
1476
|
+
}
|
|
1477
|
+
};
|
|
1478
|
+
}
|
|
1479
|
+
for (const model of usedModels) {
|
|
1480
|
+
const bgModel = "bg" + model[0].toUpperCase() + model.slice(1);
|
|
1481
|
+
styles[bgModel] = {
|
|
1482
|
+
get() {
|
|
1483
|
+
const { level } = this;
|
|
1484
|
+
return function(...arguments_) {
|
|
1485
|
+
const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);
|
|
1486
|
+
return createBuilder(this, styler, this._isEmpty);
|
|
1487
|
+
};
|
|
1488
|
+
}
|
|
1489
|
+
};
|
|
1490
|
+
}
|
|
1491
|
+
var proto = Object.defineProperties(() => {
|
|
1492
|
+
}, {
|
|
1493
|
+
...styles,
|
|
1494
|
+
level: {
|
|
1495
|
+
enumerable: true,
|
|
1496
|
+
get() {
|
|
1497
|
+
return this._generator.level;
|
|
1498
|
+
},
|
|
1499
|
+
set(level) {
|
|
1500
|
+
this._generator.level = level;
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
});
|
|
1504
|
+
var createStyler = (open, close, parent) => {
|
|
1505
|
+
let openAll;
|
|
1506
|
+
let closeAll;
|
|
1507
|
+
if (parent === void 0) {
|
|
1508
|
+
openAll = open;
|
|
1509
|
+
closeAll = close;
|
|
1510
|
+
} else {
|
|
1511
|
+
openAll = parent.openAll + open;
|
|
1512
|
+
closeAll = close + parent.closeAll;
|
|
1513
|
+
}
|
|
1514
|
+
return {
|
|
1515
|
+
open,
|
|
1516
|
+
close,
|
|
1517
|
+
openAll,
|
|
1518
|
+
closeAll,
|
|
1519
|
+
parent
|
|
1520
|
+
};
|
|
1521
|
+
};
|
|
1522
|
+
var createBuilder = (self, _styler, _isEmpty) => {
|
|
1523
|
+
const builder = (...arguments_) => {
|
|
1524
|
+
if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {
|
|
1525
|
+
return applyStyle(builder, chalkTag(builder, ...arguments_));
|
|
1526
|
+
}
|
|
1527
|
+
return applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" "));
|
|
1528
|
+
};
|
|
1529
|
+
Object.setPrototypeOf(builder, proto);
|
|
1530
|
+
builder._generator = self;
|
|
1531
|
+
builder._styler = _styler;
|
|
1532
|
+
builder._isEmpty = _isEmpty;
|
|
1533
|
+
return builder;
|
|
1534
|
+
};
|
|
1535
|
+
var applyStyle = (self, string) => {
|
|
1536
|
+
if (self.level <= 0 || !string) {
|
|
1537
|
+
return self._isEmpty ? "" : string;
|
|
1538
|
+
}
|
|
1539
|
+
let styler = self._styler;
|
|
1540
|
+
if (styler === void 0) {
|
|
1541
|
+
return string;
|
|
1542
|
+
}
|
|
1543
|
+
const { openAll, closeAll } = styler;
|
|
1544
|
+
if (string.indexOf("\x1B") !== -1) {
|
|
1545
|
+
while (styler !== void 0) {
|
|
1546
|
+
string = stringReplaceAll(string, styler.close, styler.open);
|
|
1547
|
+
styler = styler.parent;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
const lfIndex = string.indexOf("\n");
|
|
1551
|
+
if (lfIndex !== -1) {
|
|
1552
|
+
string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
|
|
1553
|
+
}
|
|
1554
|
+
return openAll + string + closeAll;
|
|
1555
|
+
};
|
|
1556
|
+
var template;
|
|
1557
|
+
var chalkTag = (chalk3, ...strings) => {
|
|
1558
|
+
const [firstString] = strings;
|
|
1559
|
+
if (!isArray(firstString) || !isArray(firstString.raw)) {
|
|
1560
|
+
return strings.join(" ");
|
|
1561
|
+
}
|
|
1562
|
+
const arguments_ = strings.slice(1);
|
|
1563
|
+
const parts = [firstString.raw[0]];
|
|
1564
|
+
for (let i = 1; i < firstString.length; i++) {
|
|
1565
|
+
parts.push(
|
|
1566
|
+
String(arguments_[i - 1]).replace(/[{}\\]/g, "\\$&"),
|
|
1567
|
+
String(firstString.raw[i])
|
|
1568
|
+
);
|
|
1569
|
+
}
|
|
1570
|
+
if (template === void 0) {
|
|
1571
|
+
template = require_templates();
|
|
1572
|
+
}
|
|
1573
|
+
return template(chalk3, parts.join(""));
|
|
1574
|
+
};
|
|
1575
|
+
Object.defineProperties(Chalk.prototype, styles);
|
|
1576
|
+
var chalk2 = Chalk();
|
|
1577
|
+
chalk2.supportsColor = stdoutColor;
|
|
1578
|
+
chalk2.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
1579
|
+
chalk2.stderr.supportsColor = stderrColor;
|
|
1580
|
+
module.exports = chalk2;
|
|
1581
|
+
}
|
|
1582
|
+
});
|
|
1583
|
+
|
|
1584
|
+
// src/game.ts
|
|
1585
|
+
import { createInterface } from "readline/promises";
|
|
1586
|
+
import { stdin as input, stdout as output } from "process";
|
|
1587
|
+
|
|
1588
|
+
// src/features/autoplay/slices/harnessSlice.ts
|
|
1589
|
+
import { createSlice } from "@reduxjs/toolkit";
|
|
1590
|
+
|
|
1591
|
+
// src/lib/coverage.ts
|
|
1592
|
+
var REQUIRED_GROUPS = [
|
|
1593
|
+
"status",
|
|
1594
|
+
"npc_lifecycle",
|
|
1595
|
+
"npc_process_chat",
|
|
1596
|
+
"memory_list",
|
|
1597
|
+
"memory_recall",
|
|
1598
|
+
"memory_store",
|
|
1599
|
+
"memory_clear",
|
|
1600
|
+
"memory_export",
|
|
1601
|
+
"bridge_rules",
|
|
1602
|
+
"bridge_validate",
|
|
1603
|
+
"bridge_preset",
|
|
1604
|
+
"soul_export",
|
|
1605
|
+
"soul_import",
|
|
1606
|
+
"soul_list",
|
|
1607
|
+
"soul_chat",
|
|
1608
|
+
"ghost_lifecycle",
|
|
1609
|
+
"cortex_init"
|
|
1610
|
+
];
|
|
1611
|
+
|
|
1612
|
+
// src/features/autoplay/slices/harnessSlice.ts
|
|
1613
|
+
var initialState = {
|
|
1614
|
+
covered: {}
|
|
1615
|
+
};
|
|
1616
|
+
var harnessSlice = createSlice({
|
|
1617
|
+
name: "harness",
|
|
1618
|
+
initialState,
|
|
1619
|
+
reducers: {
|
|
1620
|
+
markCovered: (state, action) => {
|
|
1621
|
+
state.covered[action.payload] = true;
|
|
1622
|
+
},
|
|
1623
|
+
resetCoverage: (state) => {
|
|
1624
|
+
state.covered = {};
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
});
|
|
1628
|
+
var harnessReducer = harnessSlice.reducer;
|
|
1629
|
+
var harnessActions = harnessSlice.actions;
|
|
1630
|
+
var selectMissingGroups = (covered) => REQUIRED_GROUPS.filter((g) => !covered[g]);
|
|
1631
|
+
|
|
1632
|
+
// src/features/mechanics/slices/socialSlice.ts
|
|
1633
|
+
import { createSlice as createSlice2 } from "@reduxjs/toolkit";
|
|
1634
|
+
var initialState2 = {};
|
|
1635
|
+
var socialSlice = createSlice2({
|
|
1636
|
+
name: "social",
|
|
1637
|
+
initialState: initialState2,
|
|
1638
|
+
reducers: {
|
|
1639
|
+
setDialogue: (state, action) => {
|
|
1640
|
+
state.activeDialogue = action.payload;
|
|
1641
|
+
},
|
|
1642
|
+
setTradeOffer: (state, action) => {
|
|
1643
|
+
state.activeTrade = action.payload;
|
|
1644
|
+
},
|
|
1645
|
+
clearSocialState: (state) => {
|
|
1646
|
+
state.activeDialogue = void 0;
|
|
1647
|
+
state.activeTrade = void 0;
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
});
|
|
1651
|
+
var socialReducer = socialSlice.reducer;
|
|
1652
|
+
var socialActions = socialSlice.actions;
|
|
1653
|
+
|
|
1654
|
+
// src/features/mechanics/slices/stealthSlice.ts
|
|
1655
|
+
import { createSlice as createSlice3 } from "@reduxjs/toolkit";
|
|
1656
|
+
var initialState3 = {
|
|
1657
|
+
doorOpen: false,
|
|
1658
|
+
alertLevel: 0
|
|
1659
|
+
};
|
|
1660
|
+
var stealthSlice = createSlice3({
|
|
1661
|
+
name: "stealth",
|
|
1662
|
+
initialState: initialState3,
|
|
1663
|
+
reducers: {
|
|
1664
|
+
setDoorOpen: (state, action) => {
|
|
1665
|
+
state.doorOpen = action.payload;
|
|
1666
|
+
},
|
|
1667
|
+
bumpAlert: (state, action) => {
|
|
1668
|
+
state.alertLevel = Math.max(0, Math.min(100, state.alertLevel + action.payload));
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
});
|
|
1672
|
+
var stealthReducer = stealthSlice.reducer;
|
|
1673
|
+
var stealthActions = stealthSlice.actions;
|
|
1674
|
+
|
|
1675
|
+
// src/features/entities/slices/npcsSlice.ts
|
|
1676
|
+
import { createEntityAdapter, createSlice as createSlice4 } from "@reduxjs/toolkit";
|
|
1677
|
+
var npcsAdapter = createEntityAdapter();
|
|
1678
|
+
var npcsSlice = createSlice4({
|
|
1679
|
+
name: "npcs",
|
|
1680
|
+
initialState: npcsAdapter.getInitialState(),
|
|
1681
|
+
reducers: {
|
|
1682
|
+
upsertNPC: npcsAdapter.upsertOne,
|
|
1683
|
+
moveNPC: (state, action) => {
|
|
1684
|
+
npcsAdapter.updateOne(state, {
|
|
1685
|
+
id: action.payload.id,
|
|
1686
|
+
changes: { position: action.payload.position }
|
|
1687
|
+
});
|
|
1688
|
+
},
|
|
1689
|
+
patchNPC: (state, action) => {
|
|
1690
|
+
npcsAdapter.updateOne(state, {
|
|
1691
|
+
id: action.payload.id,
|
|
1692
|
+
changes: action.payload.patch
|
|
1693
|
+
});
|
|
1694
|
+
},
|
|
1695
|
+
/**
|
|
1696
|
+
* Applies a validated verdict handed back via the SDK (real CLI output).
|
|
1697
|
+
* This is a "fat reducer" containing business logic for state transitions.
|
|
1698
|
+
*/
|
|
1699
|
+
applyNpcVerdict: (state, action) => {
|
|
1700
|
+
const { id, verdict } = action.payload;
|
|
1701
|
+
const npc = state.entities[id];
|
|
1702
|
+
if (!npc) return;
|
|
1703
|
+
npcsAdapter.updateOne(state, {
|
|
1704
|
+
id,
|
|
1705
|
+
changes: {
|
|
1706
|
+
...verdict.stateDelta,
|
|
1707
|
+
// If the action is a MOVE, update the position from the payload
|
|
1708
|
+
position: verdict.action.type === "MOVE" ? verdict.action.payload.targetHex : npc.position
|
|
1709
|
+
}
|
|
1710
|
+
});
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
});
|
|
1714
|
+
var npcsReducer = npcsSlice.reducer;
|
|
1715
|
+
var npcsActions = npcsSlice.actions;
|
|
1716
|
+
var npcsSelectors = npcsAdapter.getSelectors(
|
|
1717
|
+
(root) => root.npcs
|
|
1718
|
+
);
|
|
1719
|
+
|
|
1720
|
+
// src/features/entities/slices/playerSlice.ts
|
|
1721
|
+
import { createSlice as createSlice5 } from "@reduxjs/toolkit";
|
|
1722
|
+
var initialState4 = {
|
|
1723
|
+
name: "Scout",
|
|
1724
|
+
hp: 100,
|
|
1725
|
+
hidden: true,
|
|
1726
|
+
position: { x: 1, y: 1 },
|
|
1727
|
+
inventory: ["coin-pouch"]
|
|
1728
|
+
};
|
|
1729
|
+
var playerSlice = createSlice5({
|
|
1730
|
+
name: "player",
|
|
1731
|
+
initialState: initialState4,
|
|
1732
|
+
reducers: {
|
|
1733
|
+
setPosition: (state, action) => {
|
|
1734
|
+
state.position = action.payload;
|
|
1735
|
+
},
|
|
1736
|
+
setHidden: (state, action) => {
|
|
1737
|
+
state.hidden = action.payload;
|
|
1738
|
+
},
|
|
1739
|
+
patchPlayer: (state, action) => {
|
|
1740
|
+
Object.assign(state, action.payload);
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
});
|
|
1744
|
+
var playerReducer = playerSlice.reducer;
|
|
1745
|
+
var playerActions = playerSlice.actions;
|
|
1746
|
+
|
|
1747
|
+
// src/features/store/slices/memorySlice.ts
|
|
1748
|
+
import { createEntityAdapter as createEntityAdapter2, createSlice as createSlice6 } from "@reduxjs/toolkit";
|
|
1749
|
+
var memoryAdapter = createEntityAdapter2();
|
|
1750
|
+
var memorySlice = createSlice6({
|
|
1751
|
+
name: "memory",
|
|
1752
|
+
initialState: memoryAdapter.getInitialState(),
|
|
1753
|
+
reducers: {
|
|
1754
|
+
storeMemory: memoryAdapter.addOne,
|
|
1755
|
+
clearMemoryForNpc: (state, action) => {
|
|
1756
|
+
const npcMemories = Object.values(state.entities).filter((r) => r?.npcId === action.payload).map((r) => r.id);
|
|
1757
|
+
memoryAdapter.removeMany(state, npcMemories);
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
});
|
|
1761
|
+
var memoryReducer = memorySlice.reducer;
|
|
1762
|
+
var memoryActions = memorySlice.actions;
|
|
1763
|
+
var memorySelectors = memoryAdapter.getSelectors(
|
|
1764
|
+
(root) => root.memory
|
|
1765
|
+
);
|
|
1766
|
+
|
|
1767
|
+
// src/features/store/slices/soulSlice.ts
|
|
1768
|
+
import { createSlice as createSlice7 } from "@reduxjs/toolkit";
|
|
1769
|
+
var initialState5 = {
|
|
1770
|
+
exportsByNpc: {},
|
|
1771
|
+
importedSoulTxIds: []
|
|
1772
|
+
};
|
|
1773
|
+
var soulSlice = createSlice7({
|
|
1774
|
+
name: "soul",
|
|
1775
|
+
initialState: initialState5,
|
|
1776
|
+
reducers: {
|
|
1777
|
+
markSoulExported: (state, action) => {
|
|
1778
|
+
state.exportsByNpc[action.payload.npcId] = action.payload.txId;
|
|
1779
|
+
},
|
|
1780
|
+
markSoulImported: (state, action) => {
|
|
1781
|
+
state.importedSoulTxIds.push(action.payload);
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
});
|
|
1785
|
+
var soulReducer = soulSlice.reducer;
|
|
1786
|
+
var soulActions = soulSlice.actions;
|
|
13
1787
|
|
|
14
|
-
|
|
1788
|
+
// src/features/terminal/slices/transcriptSlice.ts
|
|
1789
|
+
import { createSlice as createSlice8 } from "@reduxjs/toolkit";
|
|
1790
|
+
var initialState6 = {
|
|
1791
|
+
entries: []
|
|
1792
|
+
};
|
|
1793
|
+
var transcriptSlice = createSlice8({
|
|
1794
|
+
name: "transcript",
|
|
1795
|
+
initialState: initialState6,
|
|
1796
|
+
reducers: {
|
|
1797
|
+
recordTranscript: {
|
|
1798
|
+
reducer: (state, action) => {
|
|
1799
|
+
state.entries.push(action.payload);
|
|
1800
|
+
},
|
|
1801
|
+
prepare: (payload) => ({
|
|
1802
|
+
payload: {
|
|
1803
|
+
...payload,
|
|
1804
|
+
id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
1805
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
1806
|
+
}
|
|
1807
|
+
})
|
|
1808
|
+
},
|
|
1809
|
+
resetTranscript: (state) => {
|
|
1810
|
+
state.entries = [];
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
});
|
|
1814
|
+
var transcriptReducer = transcriptSlice.reducer;
|
|
1815
|
+
var transcriptActions = transcriptSlice.actions;
|
|
1816
|
+
|
|
1817
|
+
// src/features/terminal/slices/uiSlice.ts
|
|
1818
|
+
import { createSlice as createSlice9 } from "@reduxjs/toolkit";
|
|
1819
|
+
var initialState7 = {
|
|
1820
|
+
mode: "autoplay",
|
|
1821
|
+
messages: ["SYSTEM_OVERRIDE :: terminal HUD online"]
|
|
1822
|
+
};
|
|
1823
|
+
var uiSlice = createSlice9({
|
|
1824
|
+
name: "ui",
|
|
1825
|
+
initialState: initialState7,
|
|
1826
|
+
reducers: {
|
|
1827
|
+
setMode: (state, action) => {
|
|
1828
|
+
state.mode = action.payload;
|
|
1829
|
+
},
|
|
1830
|
+
addMessage: (state, action) => {
|
|
1831
|
+
state.messages.push(action.payload);
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
});
|
|
1835
|
+
var uiReducer = uiSlice.reducer;
|
|
1836
|
+
var uiActions = uiSlice.actions;
|
|
1837
|
+
|
|
1838
|
+
// src/lib/commandRunner.ts
|
|
1839
|
+
import { exec } from "child_process";
|
|
1840
|
+
import { promisify } from "util";
|
|
1841
|
+
var execAsync = promisify(exec);
|
|
1842
|
+
var runCommand = async (command) => {
|
|
1843
|
+
try {
|
|
1844
|
+
const { stdout, stderr } = await execAsync(command.command, { timeout: 1e4 });
|
|
1845
|
+
const output2 = [stdout, stderr].filter(Boolean).join("\n").trim();
|
|
1846
|
+
return { status: "ok", output: output2 || "Command completed." };
|
|
1847
|
+
} catch (error) {
|
|
1848
|
+
const output2 = [error?.stdout, error?.stderr, error?.message].filter(Boolean).join("\n").trim();
|
|
1849
|
+
return { status: "error", output: output2 || "Command failed." };
|
|
1850
|
+
}
|
|
1851
|
+
};
|
|
15
1852
|
|
|
16
|
-
|
|
17
|
-
|
|
1853
|
+
// src/lib/theme.ts
|
|
1854
|
+
var import_chalk = __toESM(require_source());
|
|
1855
|
+
var THEME = {
|
|
1856
|
+
// --- PRIMARY NEONS & CORES ---
|
|
1857
|
+
VOID: "#abe7ff",
|
|
1858
|
+
// Core Cyan (210)
|
|
1859
|
+
SOURCE: "#7fbfff",
|
|
1860
|
+
// Data Blue (175)
|
|
1861
|
+
CHROME: "#ebebeb",
|
|
1862
|
+
// Bright Silver (244)
|
|
1863
|
+
AZURE: "#0b0bef",
|
|
1864
|
+
// Deep Cyber Azure (18)
|
|
1865
|
+
SKY: "#d7ffff",
|
|
1866
|
+
// Cold Sky (234)
|
|
1867
|
+
PLASMA: "#0000ff",
|
|
1868
|
+
// Pure Plasma (11)
|
|
1869
|
+
// --- STATUS & ALERTS (REDS/GOLDS) ---
|
|
1870
|
+
CRITICAL: "#ff0000",
|
|
1871
|
+
// Pure Red (249)
|
|
1872
|
+
ERROR: "#b30000",
|
|
1873
|
+
// Blood Red (215)
|
|
1874
|
+
WARNING: "#fff31b",
|
|
1875
|
+
// Warning Yellow (250)
|
|
1876
|
+
GOLD: "#dbcb13",
|
|
1877
|
+
// Amber Gold (237)
|
|
1878
|
+
SCARLET: "#d70000",
|
|
1879
|
+
// Signal Scarlet (233)
|
|
1880
|
+
PULSE: "#a3270b",
|
|
1881
|
+
// Deep Pulse (201)
|
|
1882
|
+
// --- ENTITIES & FACTIONS ---
|
|
1883
|
+
PLAYER: "#ffffff",
|
|
1884
|
+
// Pure White (253)
|
|
1885
|
+
NPC: "#efbf77",
|
|
1886
|
+
// Civilian Tan (245)
|
|
1887
|
+
DOOMGUARD: "#8b0000",
|
|
1888
|
+
// Doomguard Crimson (180)
|
|
1889
|
+
MILLER: "#af632f",
|
|
1890
|
+
// Miller Rust (211)
|
|
1891
|
+
SYNTH: "#fff393",
|
|
1892
|
+
// Synth Yellow (251)
|
|
1893
|
+
ORACLE: "#fff7c7",
|
|
1894
|
+
// Oracle Cream (252)
|
|
1895
|
+
// --- SPECIALIZED MODULES ---
|
|
1896
|
+
BIO: "#5f7367",
|
|
1897
|
+
// Bio-Digital (136)
|
|
1898
|
+
TOXIC: "#2f4337",
|
|
1899
|
+
// Toxic Waste (75)
|
|
1900
|
+
RECALL: "#c7c337",
|
|
1901
|
+
// Memory Lime (226)
|
|
1902
|
+
SOUL: "#af6b8f",
|
|
1903
|
+
// Soul Pink (213)
|
|
1904
|
+
NEURAL: "#975777",
|
|
1905
|
+
// Neural Magenta (192)
|
|
1906
|
+
GHOST: "#db7f3b",
|
|
1907
|
+
// Ghost Orange (235)
|
|
1908
|
+
ECHO: "#6b6b97",
|
|
1909
|
+
// Echo Purple (152)
|
|
1910
|
+
// --- ATMOSPHERIC & HUES ---
|
|
1911
|
+
WRECKED: "#43272f",
|
|
1912
|
+
// Bruised Dark (95)
|
|
1913
|
+
DEEP_VOID: "#0b0b0f",
|
|
1914
|
+
// Near Black (17)
|
|
1915
|
+
GLITCH: "#4b2f37",
|
|
1916
|
+
// Glitch Maroon (106)
|
|
1917
|
+
FOREST: "#1f2b1f",
|
|
1918
|
+
// Deep Forest (43)
|
|
1919
|
+
RUST: "#632f1f",
|
|
1920
|
+
// Industrial Rust (137)
|
|
1921
|
+
LEAD: "#2f2f3f",
|
|
1922
|
+
// Lead Grey (69)
|
|
1923
|
+
// --- INFRASTRUCTURE ---
|
|
1924
|
+
DIM: "#2f2f2f",
|
|
1925
|
+
// Interface Grey (68)
|
|
1926
|
+
BORDER: "#3f3f3f",
|
|
1927
|
+
// Panel Grey (92)
|
|
1928
|
+
METAL: "#6b6b6b",
|
|
1929
|
+
// Steel (151)
|
|
1930
|
+
OBSIDIAN: "#070000",
|
|
1931
|
+
// Void Black (12)
|
|
1932
|
+
STEEL: "#ababab"
|
|
1933
|
+
// Polished Steel (209)
|
|
1934
|
+
};
|
|
1935
|
+
var hex = {
|
|
1936
|
+
void: import_chalk.default.hex(THEME.VOID),
|
|
1937
|
+
source: import_chalk.default.hex(THEME.SOURCE),
|
|
1938
|
+
chrome: import_chalk.default.hex(THEME.CHROME).bold,
|
|
1939
|
+
azure: import_chalk.default.hex(THEME.AZURE),
|
|
1940
|
+
sky: import_chalk.default.hex(THEME.SKY),
|
|
1941
|
+
plasma: import_chalk.default.hex(THEME.PLASMA).bold,
|
|
1942
|
+
critical: import_chalk.default.hex(THEME.CRITICAL).bold,
|
|
1943
|
+
error: import_chalk.default.hex(THEME.ERROR),
|
|
1944
|
+
warning: import_chalk.default.hex(THEME.WARNING),
|
|
1945
|
+
gold: import_chalk.default.hex(THEME.GOLD),
|
|
1946
|
+
scarlet: import_chalk.default.hex(THEME.SCARLET),
|
|
1947
|
+
pulse: import_chalk.default.hex(THEME.PULSE),
|
|
1948
|
+
player: import_chalk.default.hex(THEME.PLAYER).bold,
|
|
1949
|
+
npc: import_chalk.default.hex(THEME.NPC),
|
|
1950
|
+
doomguard: import_chalk.default.hex(THEME.DOOMGUARD).bold,
|
|
1951
|
+
miller: import_chalk.default.hex(THEME.MILLER),
|
|
1952
|
+
synth: import_chalk.default.hex(THEME.SYNTH),
|
|
1953
|
+
oracle: import_chalk.default.hex(THEME.ORACLE),
|
|
1954
|
+
bio: import_chalk.default.hex(THEME.BIO),
|
|
1955
|
+
toxic: import_chalk.default.hex(THEME.TOXIC),
|
|
1956
|
+
recall: import_chalk.default.hex(THEME.RECALL),
|
|
1957
|
+
soul: import_chalk.default.hex(THEME.SOUL),
|
|
1958
|
+
neural: import_chalk.default.hex(THEME.NEURAL),
|
|
1959
|
+
ghost: import_chalk.default.hex(THEME.GHOST),
|
|
1960
|
+
echo: import_chalk.default.hex(THEME.ECHO),
|
|
1961
|
+
wrecked: import_chalk.default.hex(THEME.WRECKED),
|
|
1962
|
+
deep: import_chalk.default.hex(THEME.DEEP_VOID),
|
|
1963
|
+
glitch: import_chalk.default.hex(THEME.GLITCH),
|
|
1964
|
+
forest: import_chalk.default.hex(THEME.FOREST),
|
|
1965
|
+
rust: import_chalk.default.hex(THEME.RUST),
|
|
1966
|
+
lead: import_chalk.default.hex(THEME.LEAD),
|
|
1967
|
+
dim: import_chalk.default.hex(THEME.DIM),
|
|
1968
|
+
border: import_chalk.default.hex(THEME.BORDER),
|
|
1969
|
+
metal: import_chalk.default.hex(THEME.METAL),
|
|
1970
|
+
obsidian: import_chalk.default.hex(THEME.OBSIDIAN),
|
|
1971
|
+
steel: import_chalk.default.hex(THEME.STEEL)
|
|
1972
|
+
};
|
|
1973
|
+
var RUNES = "\u16A0 \u16A2 \u16A6 \u16A8 \u16B1 \u16B2 \u16B7 \u16B9";
|
|
1974
|
+
var zalgo = (text) => {
|
|
1975
|
+
const map = {
|
|
1976
|
+
"a": "\xE1",
|
|
1977
|
+
"e": "\xE9",
|
|
1978
|
+
"i": "\xED",
|
|
1979
|
+
"o": "\xF3",
|
|
1980
|
+
"u": "\xFA",
|
|
1981
|
+
"A": "\xC1",
|
|
1982
|
+
"E": "\xC9",
|
|
1983
|
+
"I": "\xCD",
|
|
1984
|
+
"O": "\xD3",
|
|
1985
|
+
"U": "\xDA"
|
|
1986
|
+
};
|
|
1987
|
+
return text.split("").map((c) => map[c] || c).join("");
|
|
1988
|
+
};
|
|
1989
|
+
var BOOT_ART = `
|
|
1990
|
+
. .
|
|
1991
|
+
.n . . n.
|
|
1992
|
+
. .dP dP 9b 9b. .
|
|
1993
|
+
4 qXb . dX Xb . dXp t
|
|
1994
|
+
dX. 9Xb .dXb __ __ dXb. dXP .Xb
|
|
1995
|
+
9XXb._ dXp' d9b . . d9b 'qXb _.dXXP
|
|
1996
|
+
9XXb._ Xb dXp 99b 9b dP 99b dXp bX _.dXXP
|
|
1997
|
+
9XXb._ Xb dXp 99b 9b dP 99b dXp bX _.dXXP
|
|
1998
|
+
9XXb(eb.XbP . Y8. .8P . XbP.be)dXXP
|
|
1999
|
+
'8Xdb..888P dP "88b d88" 9b 988..dbX8'
|
|
2000
|
+
'8888888P d8 "888888" 8b 98888888'
|
|
2001
|
+
"88888" d888 "8888" 888b "88888"
|
|
2002
|
+
"888" d88888 "88" 88888b "888"
|
|
2003
|
+
"8" d888888b d8b d8888888b "8"
|
|
2004
|
+
d88888888bd888bd888888888
|
|
2005
|
+
"988888888888888888888"
|
|
2006
|
+
"98888888888888888P"
|
|
2007
|
+
"9888888888888P"
|
|
2008
|
+
"988888888P"
|
|
2009
|
+
"98888P"
|
|
2010
|
+
"98P"
|
|
2011
|
+
"V"
|
|
2012
|
+
`;
|
|
2013
|
+
var SKULL_ART = `
|
|
2014
|
+
______
|
|
2015
|
+
.-" "-.
|
|
2016
|
+
/ \\
|
|
2017
|
+
| |
|
|
2018
|
+
|, .-. .-. ,|
|
|
2019
|
+
| )(__/ \\__)( |
|
|
2020
|
+
|/ /\\ \\|
|
|
2021
|
+
(_ ^^ _)
|
|
2022
|
+
\\__|IIIIII|__/
|
|
2023
|
+
| \\IIIIII/ |
|
|
2024
|
+
\\ /
|
|
2025
|
+
\`--------\`
|
|
2026
|
+
`;
|
|
2027
|
+
var NEURAL_ART = `
|
|
2028
|
+
____ ____
|
|
2029
|
+
/ \\____/ \\
|
|
2030
|
+
/ /\\ \\__/ /\\ \\
|
|
2031
|
+
/ / \\ \\/ / \\ \\
|
|
2032
|
+
\\ \\__/ /\\ \\__/ /
|
|
2033
|
+
\\ / \\ /
|
|
2034
|
+
\\____/ \\____/
|
|
2035
|
+
`;
|
|
2036
|
+
var FRAGMENTS = [
|
|
2037
|
+
"The sky above the port was the color of television, tuned to a dead channel. - Gibson",
|
|
2038
|
+
"Reality is that which, when you stop believing in it, doesn't go away. - Dick",
|
|
2039
|
+
"The most merciful thing in the world is the inability of the human mind to correlate all its contents. - Lovecraft",
|
|
2040
|
+
"High-tech low-life. The Sprawl is watching.",
|
|
2041
|
+
"In the chrome-plated silence of the machine, we find our demons.",
|
|
2042
|
+
"Ritual silence. The daimon whispers in the code.",
|
|
2043
|
+
"Steel and sorcery. The lambdas are binding the void."
|
|
2044
|
+
];
|
|
2045
|
+
var getRandomFragment = () => FRAGMENTS[Math.floor(Math.random() * FRAGMENTS.length)];
|
|
18
2046
|
|
|
19
|
-
|
|
20
|
-
|
|
2047
|
+
// src/lib/render.ts
|
|
2048
|
+
var cellAt = (pos, state) => {
|
|
2049
|
+
const isBlocked = state.grid.blocked.some((b) => b.x === pos.x && b.y === pos.y);
|
|
2050
|
+
if (isBlocked) return hex.border("#");
|
|
2051
|
+
if (state.player.position.x === pos.x && state.player.position.y === pos.y) {
|
|
2052
|
+
return hex.player("P");
|
|
2053
|
+
}
|
|
2054
|
+
for (const npc of Object.values(state.npcs.entities)) {
|
|
2055
|
+
if (!npc) continue;
|
|
2056
|
+
if (npc.position.x === pos.x && npc.position.y === pos.y) {
|
|
2057
|
+
if (npc.id === "miller") return hex.miller("M");
|
|
2058
|
+
if (npc.id === "doomguard") return hex.doomguard("D");
|
|
2059
|
+
return hex.npc("N");
|
|
2060
|
+
}
|
|
2061
|
+
}
|
|
2062
|
+
return hex.dim(".");
|
|
2063
|
+
};
|
|
2064
|
+
var renderGrid = (state) => {
|
|
2065
|
+
const rows = [];
|
|
2066
|
+
for (let y = 0; y < state.grid.height; y += 1) {
|
|
2067
|
+
const cells = [];
|
|
2068
|
+
for (let x = 0; x < state.grid.width; x += 1) {
|
|
2069
|
+
cells.push(cellAt({ x, y }, state));
|
|
2070
|
+
}
|
|
2071
|
+
rows.push(cells.join(" "));
|
|
2072
|
+
}
|
|
2073
|
+
return rows.join("\n");
|
|
2074
|
+
};
|
|
2075
|
+
var renderLegend = () => `${hex.chrome("Legend")} :: ${hex.player("P")}=${hex.azure("Scout")} ${hex.doomguard("D")}=${hex.critical("Doomguard")} ${hex.miller("M")}=${hex.gold("Miller")} ${hex.border("#")}=${hex.metal("Blocked")} ${hex.dim(".")}=${hex.steel("Open")}
|
|
2076
|
+
${hex.source(RUNES)}`;
|
|
2077
|
+
|
|
2078
|
+
// src/store.ts
|
|
2079
|
+
import { configureStore } from "@reduxjs/toolkit";
|
|
2080
|
+
|
|
2081
|
+
// src/features/mechanics/slices/gridSlice.ts
|
|
2082
|
+
import { createSlice as createSlice10 } from "@reduxjs/toolkit";
|
|
2083
|
+
var initialState8 = {
|
|
2084
|
+
width: 8,
|
|
2085
|
+
height: 8,
|
|
2086
|
+
blocked: [{ x: 4, y: 4 }, { x: 4, y: 5 }, { x: 6, y: 2 }]
|
|
2087
|
+
};
|
|
2088
|
+
var gridSlice = createSlice10({
|
|
2089
|
+
name: "grid",
|
|
2090
|
+
initialState: initialState8,
|
|
2091
|
+
reducers: {
|
|
2092
|
+
setGridSize: (state, action) => {
|
|
2093
|
+
state.width = action.payload.width;
|
|
2094
|
+
state.height = action.payload.height;
|
|
2095
|
+
},
|
|
2096
|
+
setBlocked: (state, action) => {
|
|
2097
|
+
state.blocked = action.payload;
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
});
|
|
2101
|
+
var gridReducer = gridSlice.reducer;
|
|
2102
|
+
var gridActions = gridSlice.actions;
|
|
2103
|
+
|
|
2104
|
+
// src/features/mechanics/slices/bridgeSlice.ts
|
|
2105
|
+
import { createSlice as createSlice11 } from "@reduxjs/toolkit";
|
|
2106
|
+
var initialState9 = {
|
|
2107
|
+
maxJumpForce: 500,
|
|
2108
|
+
maxMoveDistance: 2,
|
|
2109
|
+
activePreset: "default"
|
|
2110
|
+
};
|
|
2111
|
+
var bridgeSlice = createSlice11({
|
|
2112
|
+
name: "bridge",
|
|
2113
|
+
initialState: initialState9,
|
|
2114
|
+
reducers: {
|
|
2115
|
+
setBridgeRules: (state, action) => {
|
|
2116
|
+
Object.assign(state, action.payload);
|
|
2117
|
+
},
|
|
2118
|
+
loadBridgePreset: (state, action) => {
|
|
2119
|
+
state.activePreset = action.payload;
|
|
2120
|
+
if (action.payload === "social") {
|
|
2121
|
+
state.maxMoveDistance = 1;
|
|
2122
|
+
}
|
|
2123
|
+
if (action.payload === "default") {
|
|
2124
|
+
state.maxMoveDistance = 2;
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
}
|
|
2128
|
+
});
|
|
2129
|
+
var bridgeReducer = bridgeSlice.reducer;
|
|
2130
|
+
var bridgeActions = bridgeSlice.actions;
|
|
21
2131
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
2132
|
+
// src/features/store/slices/inventorySlice.ts
|
|
2133
|
+
import { createSlice as createSlice12 } from "@reduxjs/toolkit";
|
|
2134
|
+
var initialState10 = {
|
|
2135
|
+
byOwner: {
|
|
2136
|
+
player: ["coin-pouch"],
|
|
2137
|
+
miller: ["medkit"]
|
|
2138
|
+
}
|
|
2139
|
+
};
|
|
2140
|
+
var inventorySlice = createSlice12({
|
|
2141
|
+
name: "inventory",
|
|
2142
|
+
initialState: initialState10,
|
|
2143
|
+
reducers: {
|
|
2144
|
+
setOwnerInventory: (state, action) => {
|
|
2145
|
+
state.byOwner[action.payload.ownerId] = action.payload.items;
|
|
2146
|
+
}
|
|
2147
|
+
}
|
|
2148
|
+
});
|
|
2149
|
+
var inventoryReducer = inventorySlice.reducer;
|
|
2150
|
+
var inventoryActions = inventorySlice.actions;
|
|
2151
|
+
|
|
2152
|
+
// src/features/autoplay/slices/scenarioSlice.ts
|
|
2153
|
+
import { createSlice as createSlice13 } from "@reduxjs/toolkit";
|
|
2154
|
+
var steps = [
|
|
2155
|
+
{
|
|
2156
|
+
id: "stealth-door-open",
|
|
2157
|
+
title: "Spatial Strategy & Stealth",
|
|
2158
|
+
description: "Armory door is left open. Doomguard patrol processes observation and stores memory.",
|
|
2159
|
+
eventType: "stealth",
|
|
2160
|
+
commands: [
|
|
2161
|
+
{ group: "status", command: "forbocai status", expectedRoutes: ["GET /status"] },
|
|
2162
|
+
{
|
|
2163
|
+
group: "npc_lifecycle",
|
|
2164
|
+
command: "forbocai npc create doomguard",
|
|
2165
|
+
expectedRoutes: ["local only"]
|
|
2166
|
+
},
|
|
2167
|
+
{
|
|
2168
|
+
group: "npc_lifecycle",
|
|
2169
|
+
command: "forbocai npc state doomguard",
|
|
2170
|
+
expectedRoutes: ["local only"]
|
|
2171
|
+
},
|
|
2172
|
+
{
|
|
2173
|
+
group: "npc_lifecycle",
|
|
2174
|
+
command: "forbocai npc update doomguard faction Doomguards",
|
|
2175
|
+
expectedRoutes: ["local only"]
|
|
2176
|
+
},
|
|
2177
|
+
{
|
|
2178
|
+
group: "npc_process_chat",
|
|
2179
|
+
command: 'forbocai npc process doomguard "The armory door is open"',
|
|
2180
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2181
|
+
},
|
|
2182
|
+
{
|
|
2183
|
+
group: "memory_store",
|
|
2184
|
+
command: 'forbocai memory store doomguard "Armory door found open at x:5, y:12"',
|
|
2185
|
+
expectedRoutes: ["POST /npcs/{id}/memory"]
|
|
2186
|
+
},
|
|
2187
|
+
{
|
|
2188
|
+
group: "memory_list",
|
|
2189
|
+
command: "forbocai memory list doomguard",
|
|
2190
|
+
expectedRoutes: ["GET /npcs/{id}/memory"]
|
|
2191
|
+
},
|
|
2192
|
+
{
|
|
2193
|
+
group: "bridge_rules",
|
|
2194
|
+
command: "forbocai bridge rules",
|
|
2195
|
+
expectedRoutes: ["GET /bridge/rules"]
|
|
2196
|
+
}
|
|
2197
|
+
]
|
|
2198
|
+
},
|
|
2199
|
+
{
|
|
2200
|
+
id: "social-miller-encounter",
|
|
2201
|
+
title: "Social Simulation",
|
|
2202
|
+
description: "Miller encounter triggers recall, dialogue, and trade offer.",
|
|
2203
|
+
eventType: "social",
|
|
2204
|
+
commands: [
|
|
2205
|
+
{
|
|
2206
|
+
group: "npc_lifecycle",
|
|
2207
|
+
command: "forbocai npc create miller",
|
|
2208
|
+
expectedRoutes: ["local only"]
|
|
2209
|
+
},
|
|
2210
|
+
{
|
|
2211
|
+
group: "npc_process_chat",
|
|
2212
|
+
command: 'forbocai npc chat miller --text "I come in peace"',
|
|
2213
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2214
|
+
},
|
|
2215
|
+
{
|
|
2216
|
+
group: "memory_recall",
|
|
2217
|
+
command: 'forbocai memory recall miller "player interaction"',
|
|
2218
|
+
expectedRoutes: ["POST /npcs/{id}/memory/recall"]
|
|
2219
|
+
},
|
|
2220
|
+
{
|
|
2221
|
+
group: "bridge_preset",
|
|
2222
|
+
command: "forbocai bridge preset social",
|
|
2223
|
+
expectedRoutes: ["POST /rules/presets/{id}"]
|
|
2224
|
+
},
|
|
2225
|
+
{
|
|
2226
|
+
group: "soul_export",
|
|
2227
|
+
command: "forbocai soul export miller",
|
|
2228
|
+
expectedRoutes: ["POST /npcs/{id}/soul/export", "POST /npcs/{id}/soul/confirm"]
|
|
2229
|
+
},
|
|
2230
|
+
{
|
|
2231
|
+
group: "soul_list",
|
|
2232
|
+
command: "forbocai soul list",
|
|
2233
|
+
expectedRoutes: ["GET /souls"]
|
|
2234
|
+
}
|
|
2235
|
+
]
|
|
2236
|
+
},
|
|
2237
|
+
{
|
|
2238
|
+
id: "escape-realtime-pursuit",
|
|
2239
|
+
title: "Real-Time Escape",
|
|
2240
|
+
description: "Harness loop fires process commands and validates jump force via bridge rules.",
|
|
2241
|
+
eventType: "escape",
|
|
2242
|
+
commands: [
|
|
2243
|
+
{
|
|
2244
|
+
group: "bridge_validate",
|
|
2245
|
+
command: "forbocai bridge validate doomguard-jump",
|
|
2246
|
+
expectedRoutes: ["POST /bridge/validate", "POST /bridge/validate/{id}"]
|
|
2247
|
+
},
|
|
2248
|
+
{
|
|
2249
|
+
group: "npc_process_chat",
|
|
2250
|
+
command: 'forbocai npc process doomguard "Player is escaping"',
|
|
2251
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2252
|
+
},
|
|
2253
|
+
{
|
|
2254
|
+
group: "npc_process_chat",
|
|
2255
|
+
command: 'forbocai npc process doomguard "Player jumped the gap"',
|
|
2256
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2257
|
+
},
|
|
2258
|
+
{
|
|
2259
|
+
group: "npc_process_chat",
|
|
2260
|
+
command: 'forbocai npc process doomguard "Player reached the gate"',
|
|
2261
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2262
|
+
},
|
|
2263
|
+
{
|
|
2264
|
+
group: "ghost_lifecycle",
|
|
2265
|
+
command: "forbocai ghost run smoke",
|
|
2266
|
+
expectedRoutes: ["POST /ghost/run"]
|
|
2267
|
+
},
|
|
2268
|
+
{
|
|
2269
|
+
group: "ghost_lifecycle",
|
|
2270
|
+
command: "forbocai ghost status ghost-001",
|
|
2271
|
+
expectedRoutes: ["GET /ghost/{id}/status"]
|
|
2272
|
+
},
|
|
2273
|
+
{
|
|
2274
|
+
group: "ghost_lifecycle",
|
|
2275
|
+
command: "forbocai ghost results ghost-001",
|
|
2276
|
+
expectedRoutes: ["GET /ghost/{id}/results"]
|
|
2277
|
+
},
|
|
2278
|
+
{
|
|
2279
|
+
group: "ghost_lifecycle",
|
|
2280
|
+
command: "forbocai ghost stop ghost-001",
|
|
2281
|
+
expectedRoutes: ["POST /ghost/{id}/stop"]
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
group: "ghost_lifecycle",
|
|
2285
|
+
command: "forbocai ghost history",
|
|
2286
|
+
expectedRoutes: ["GET /ghost/history"]
|
|
2287
|
+
}
|
|
2288
|
+
]
|
|
2289
|
+
},
|
|
2290
|
+
{
|
|
2291
|
+
id: "persistence-recovery",
|
|
2292
|
+
title: "Persistence & Recovery",
|
|
2293
|
+
description: "Exercises memory export/clear and soul import/chat continuity.",
|
|
2294
|
+
eventType: "persistence",
|
|
2295
|
+
commands: [
|
|
2296
|
+
{
|
|
2297
|
+
group: "memory_export",
|
|
2298
|
+
command: "forbocai memory export doomguard",
|
|
2299
|
+
expectedRoutes: ["local only"]
|
|
2300
|
+
},
|
|
2301
|
+
{
|
|
2302
|
+
group: "memory_clear",
|
|
2303
|
+
command: "forbocai memory clear doomguard",
|
|
2304
|
+
expectedRoutes: ["DELETE /npcs/{id}/memory/clear"]
|
|
2305
|
+
},
|
|
2306
|
+
{
|
|
2307
|
+
group: "soul_import",
|
|
2308
|
+
command: "forbocai soul import tx-demo-001",
|
|
2309
|
+
expectedRoutes: ["GET /souls/{txId}", "POST /npcs/import", "POST /npcs/import/confirm"]
|
|
2310
|
+
},
|
|
2311
|
+
{
|
|
2312
|
+
group: "soul_chat",
|
|
2313
|
+
command: 'forbocai soul chat doomguard --text "What do you remember?"',
|
|
2314
|
+
expectedRoutes: ["POST /npcs/{id}/directive", "POST /npcs/{id}/context", "POST /npcs/{id}/verdict"]
|
|
2315
|
+
},
|
|
2316
|
+
{
|
|
2317
|
+
group: "cortex_init",
|
|
2318
|
+
command: "forbocai cortex init --remote",
|
|
2319
|
+
expectedRoutes: ["POST /cortex/init"]
|
|
2320
|
+
}
|
|
2321
|
+
]
|
|
2322
|
+
}
|
|
2323
|
+
];
|
|
2324
|
+
var scenarioSlice = createSlice13({
|
|
2325
|
+
name: "scenario",
|
|
2326
|
+
initialState: {
|
|
2327
|
+
steps
|
|
2328
|
+
},
|
|
2329
|
+
reducers: {}
|
|
2330
|
+
});
|
|
2331
|
+
var scenarioReducer = scenarioSlice.reducer;
|
|
2332
|
+
|
|
2333
|
+
// src/listeners.ts
|
|
2334
|
+
import { createListenerMiddleware, isAnyOf } from "@reduxjs/toolkit";
|
|
2335
|
+
var listenerMiddleware = createListenerMiddleware();
|
|
2336
|
+
listenerMiddleware.startListening({
|
|
2337
|
+
matcher: isAnyOf(npcsActions.moveNPC, npcsActions.patchNPC, npcsActions.applyNpcVerdict),
|
|
2338
|
+
effect: (action, listenerApi) => {
|
|
2339
|
+
const state = listenerApi.getState();
|
|
2340
|
+
if (npcsActions.moveNPC.match(action)) {
|
|
2341
|
+
const npc = state.npcs.entities[action.payload.id];
|
|
2342
|
+
if (npc) {
|
|
2343
|
+
listenerApi.dispatch(uiActions.addMessage(`${npc.name} moved to ${action.payload.position.x},${action.payload.position.y}`));
|
|
2344
|
+
}
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2347
|
+
});
|
|
2348
|
+
|
|
2349
|
+
// src/store.ts
|
|
2350
|
+
var createTestGameStore = () => configureStore({
|
|
2351
|
+
reducer: {
|
|
2352
|
+
npcs: npcsReducer,
|
|
2353
|
+
player: playerReducer,
|
|
2354
|
+
grid: gridReducer,
|
|
2355
|
+
stealth: stealthReducer,
|
|
2356
|
+
social: socialReducer,
|
|
2357
|
+
bridge: bridgeReducer,
|
|
2358
|
+
memory: memoryReducer,
|
|
2359
|
+
inventory: inventoryReducer,
|
|
2360
|
+
soul: soulReducer,
|
|
2361
|
+
ui: uiReducer,
|
|
2362
|
+
transcript: transcriptReducer,
|
|
2363
|
+
scenario: scenarioReducer,
|
|
2364
|
+
harness: harnessReducer
|
|
2365
|
+
},
|
|
2366
|
+
middleware: (getDefaultMiddleware) => getDefaultMiddleware().prepend(listenerMiddleware.middleware)
|
|
2367
|
+
});
|
|
2368
|
+
|
|
2369
|
+
// src/game.ts
|
|
2370
|
+
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
2371
|
+
var tryParseVerdict = (output2) => {
|
|
2372
|
+
try {
|
|
2373
|
+
const match = output2.match(/\{[\s\S]*\}/);
|
|
2374
|
+
if (match) return JSON.parse(match[0]);
|
|
2375
|
+
} catch {
|
|
2376
|
+
return null;
|
|
2377
|
+
}
|
|
2378
|
+
return null;
|
|
2379
|
+
};
|
|
2380
|
+
var applyScenarioInitialState = (step, store) => {
|
|
2381
|
+
if (step.eventType === "stealth") {
|
|
2382
|
+
store.dispatch(stealthActions.setDoorOpen(true));
|
|
2383
|
+
store.dispatch(stealthActions.bumpAlert(25));
|
|
2384
|
+
store.dispatch(
|
|
2385
|
+
npcsActions.upsertNPC({
|
|
2386
|
+
id: "doomguard",
|
|
2387
|
+
name: "Doomguard Patrol",
|
|
2388
|
+
faction: "Doomguards",
|
|
2389
|
+
hp: 100,
|
|
2390
|
+
suspicion: 40,
|
|
2391
|
+
inventory: [],
|
|
2392
|
+
knownSecrets: [],
|
|
2393
|
+
position: { x: 5, y: 10 }
|
|
2394
|
+
})
|
|
2395
|
+
);
|
|
2396
|
+
store.dispatch(
|
|
2397
|
+
memoryActions.storeMemory({
|
|
2398
|
+
id: "mem-door-001",
|
|
2399
|
+
npcId: "doomguard",
|
|
2400
|
+
text: "Armory door found open at x:5, y:12",
|
|
2401
|
+
importance: 0.9
|
|
2402
|
+
})
|
|
2403
|
+
);
|
|
2404
|
+
}
|
|
2405
|
+
if (step.eventType === "social") {
|
|
2406
|
+
store.dispatch(
|
|
2407
|
+
npcsActions.upsertNPC({
|
|
2408
|
+
id: "miller",
|
|
2409
|
+
name: "Miller",
|
|
2410
|
+
faction: "Neutral",
|
|
2411
|
+
hp: 100,
|
|
2412
|
+
suspicion: 50,
|
|
2413
|
+
inventory: ["medkit"],
|
|
2414
|
+
knownSecrets: ["player_stole_rations"],
|
|
2415
|
+
position: { x: 5, y: 12 }
|
|
2416
|
+
})
|
|
2417
|
+
);
|
|
2418
|
+
store.dispatch(socialActions.setDialogue("I know you took those rations..."));
|
|
2419
|
+
store.dispatch(socialActions.setTradeOffer({ npcId: "miller", item: "medkit", price: 100 }));
|
|
2420
|
+
store.dispatch(npcsActions.patchNPC({ id: "miller", patch: { suspicion: 75 } }));
|
|
2421
|
+
}
|
|
2422
|
+
if (step.eventType === "escape") {
|
|
2423
|
+
store.dispatch(playerActions.setHidden(false));
|
|
2424
|
+
}
|
|
2425
|
+
if (step.eventType === "persistence") {
|
|
2426
|
+
store.dispatch(soulActions.markSoulExported({ npcId: "doomguard", txId: "tx-demo-001" }));
|
|
2427
|
+
store.dispatch(soulActions.markSoulImported("tx-demo-001"));
|
|
2428
|
+
store.dispatch(memoryActions.clearMemoryForNpc("doomguard"));
|
|
2429
|
+
}
|
|
2430
|
+
};
|
|
2431
|
+
var runGame = async ({
|
|
2432
|
+
mode
|
|
2433
|
+
}) => {
|
|
2434
|
+
console.log("\n" + hex.azure(NEURAL_ART));
|
|
2435
|
+
console.log(hex.critical("SYSTEM_OVERRIDE") + ` // ` + hex.void("NEURAL_LINK_ESTABLISHED"));
|
|
2436
|
+
console.log(hex.warning(`[VOID::WATCHER]`) + hex.dim(` Echoes session booting at mode=${hex.azure(mode)}
|
|
2437
|
+
`));
|
|
2438
|
+
const store = createTestGameStore();
|
|
2439
|
+
store.dispatch(uiActions.setMode(mode));
|
|
2440
|
+
store.dispatch(
|
|
2441
|
+
npcsActions.upsertNPC({
|
|
2442
|
+
id: "scout",
|
|
2443
|
+
name: "Scout",
|
|
2444
|
+
faction: "Player",
|
|
2445
|
+
hp: 100,
|
|
2446
|
+
suspicion: 0,
|
|
2447
|
+
inventory: ["coin-pouch"],
|
|
2448
|
+
knownSecrets: [],
|
|
2449
|
+
position: { x: 1, y: 1 }
|
|
2450
|
+
})
|
|
2451
|
+
);
|
|
2452
|
+
const rl = mode === "manual" ? createInterface({ input, output }) : null;
|
|
2453
|
+
console.log(renderLegend());
|
|
2454
|
+
for (const step of store.getState().scenario.steps) {
|
|
2455
|
+
if (mode === "manual") {
|
|
2456
|
+
console.log(`
|
|
2457
|
+
` + hex.border(`\u256D\u2500 `) + hex.sky(step.title) + hex.border(` \u2500\u256E`));
|
|
2458
|
+
console.log(hex.dim(zalgo(step.description)));
|
|
2459
|
+
console.log(hex.border(`\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F
|
|
2460
|
+
`));
|
|
2461
|
+
console.log(renderGrid(store.getState()));
|
|
2462
|
+
await rl?.question(hex.player(`> `) + hex.chrome(`Execute trace segment :: `) + hex.source(`[${step.id}]`));
|
|
2463
|
+
} else {
|
|
2464
|
+
console.log(`
|
|
2465
|
+
` + hex.steel(`:: `) + hex.sky(step.title) + ` ` + hex.dim(`[${step.id}]`));
|
|
2466
|
+
console.log(hex.dim(zalgo(step.description)));
|
|
2467
|
+
}
|
|
2468
|
+
applyScenarioInitialState(step, store);
|
|
2469
|
+
for (const command of step.commands) {
|
|
2470
|
+
const result = await runCommand(command);
|
|
2471
|
+
store.dispatch(harnessActions.markCovered(command.group));
|
|
2472
|
+
store.dispatch(
|
|
2473
|
+
transcriptActions.recordTranscript({
|
|
2474
|
+
scenarioId: step.id,
|
|
2475
|
+
commandGroup: command.group,
|
|
2476
|
+
command: command.command,
|
|
2477
|
+
expectedRoutes: command.expectedRoutes,
|
|
2478
|
+
status: result.status,
|
|
2479
|
+
output: result.output
|
|
2480
|
+
})
|
|
2481
|
+
);
|
|
2482
|
+
if (command.group === "npc_process_chat") {
|
|
2483
|
+
const verdict = tryParseVerdict(result.output);
|
|
2484
|
+
if (verdict && verdict.action) {
|
|
2485
|
+
const npcIdMatch = command.command.match(/npc (?:process|chat) (\w+)/);
|
|
2486
|
+
const npcId = npcIdMatch ? npcIdMatch[1] : null;
|
|
2487
|
+
if (npcId) {
|
|
2488
|
+
store.dispatch(npcsActions.applyNpcVerdict({ id: npcId, verdict }));
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
if (command.group === "bridge_validate") {
|
|
2493
|
+
const validation = tryParseVerdict(result.output);
|
|
2494
|
+
if (validation && !validation.valid) {
|
|
2495
|
+
store.dispatch(uiActions.addMessage(`System Bridge Blocked Action: ${validation.reason}`));
|
|
2496
|
+
}
|
|
2497
|
+
}
|
|
2498
|
+
const group = command.group;
|
|
2499
|
+
let statusColor = result.status === "ok" ? hex.gold : hex.critical;
|
|
2500
|
+
if (result.status === "ok" && group === "status") statusColor = hex.plasma;
|
|
2501
|
+
let cmdColor = hex.source;
|
|
2502
|
+
if (group.startsWith("memory")) cmdColor = hex.bio;
|
|
2503
|
+
if (group.startsWith("soul")) cmdColor = hex.soul;
|
|
2504
|
+
if (group.startsWith("ghost")) cmdColor = hex.ghost;
|
|
2505
|
+
if (group.startsWith("npc")) cmdColor = hex.azure;
|
|
2506
|
+
if (group.startsWith("bridge")) cmdColor = hex.recall;
|
|
2507
|
+
if (group === "cortex_init") cmdColor = hex.neural;
|
|
2508
|
+
console.log(`${statusColor(`[${result.status}]`)} ${cmdColor(command.command)}`);
|
|
2509
|
+
if (result.status === "error") {
|
|
2510
|
+
process.stderr.write(hex.critical(SKULL_ART));
|
|
2511
|
+
console.log(hex.critical("LOG_ERR_CRITICAL") + ` // ` + hex.rust("BIT_ROT_DETECTED") + ` // ` + hex.glitch("V_OID_LEAK"));
|
|
2512
|
+
if (result.output) {
|
|
2513
|
+
console.log(hex.dim(` | `) + hex.glitch(result.output.split("\n")[0]));
|
|
2514
|
+
}
|
|
2515
|
+
}
|
|
2516
|
+
}
|
|
2517
|
+
if (mode === "autoplay") {
|
|
2518
|
+
const fragment = getRandomFragment();
|
|
2519
|
+
console.log(`
|
|
2520
|
+
` + hex.bio(`\u16EB`) + ` ` + hex.dim.italic(`"${fragment}"`));
|
|
2521
|
+
process.stdout.write(hex.dim(" " + zalgo(":: synchronizing_neural_bus...") + " "));
|
|
2522
|
+
const dots = [".", "..", "..."];
|
|
2523
|
+
for (const dot of dots) {
|
|
2524
|
+
process.stdout.write(hex.echo(dot));
|
|
2525
|
+
await delay(250);
|
|
2526
|
+
}
|
|
2527
|
+
console.log("\n");
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
rl?.close();
|
|
2531
|
+
const state = store.getState();
|
|
2532
|
+
const missingGroups = selectMissingGroups(state.harness.covered);
|
|
2533
|
+
const complete = missingGroups.length === 0;
|
|
2534
|
+
const summaryText = complete ? `ALL_BINDINGS_COMPLETE :: Coverage achieved.` : `VOID_GAPS_DETECTED :: Missing groups -> ${missingGroups.join(", ")}`;
|
|
2535
|
+
const summary = complete ? hex.chrome(summaryText) : hex.scarlet(summaryText);
|
|
2536
|
+
console.log("\n" + hex.lead("=== ") + hex.steel("Transcript Summary // ") + hex.rust("chrome rain ledger") + hex.lead(" ==="));
|
|
2537
|
+
for (const entry of state.transcript.entries) {
|
|
2538
|
+
const statusColor = entry.status === "ok" ? hex.gold : hex.critical;
|
|
2539
|
+
let groupColor = hex.source;
|
|
2540
|
+
if (entry.commandGroup.startsWith("memory")) groupColor = hex.bio;
|
|
2541
|
+
if (entry.commandGroup.startsWith("soul")) groupColor = hex.soul;
|
|
2542
|
+
if (entry.commandGroup.startsWith("ghost")) groupColor = hex.ghost;
|
|
2543
|
+
if (entry.commandGroup.startsWith("npc")) groupColor = hex.azure;
|
|
2544
|
+
if (entry.commandGroup.startsWith("bridge")) groupColor = hex.recall;
|
|
2545
|
+
if (entry.commandGroup === "cortex_init") groupColor = hex.neural;
|
|
2546
|
+
console.log(
|
|
2547
|
+
`${hex.dim(entry.at.split("T")[1].split(".")[0])} | ${groupColor(entry.commandGroup.padEnd(16))} | ${statusColor(entry.status.padEnd(5))} | ${hex.player(entry.command)}`
|
|
2548
|
+
);
|
|
2549
|
+
}
|
|
2550
|
+
console.log("\n" + hex.plasma(RUNES));
|
|
2551
|
+
console.log(summary);
|
|
2552
|
+
console.log(hex.dim(`Compliance is monitored by the Watcher in the Code. \u{1F441}\uFE0F`));
|
|
2553
|
+
return {
|
|
2554
|
+
complete,
|
|
2555
|
+
missingGroups,
|
|
2556
|
+
transcript: state.transcript.entries,
|
|
2557
|
+
summary
|
|
2558
|
+
};
|
|
2559
|
+
};
|
|
2560
|
+
|
|
2561
|
+
// src/cli.ts
|
|
2562
|
+
var usage = () => {
|
|
2563
|
+
console.log(hex.void(BOOT_ART));
|
|
2564
|
+
console.log(hex.border(`\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557`));
|
|
2565
|
+
console.log(hex.border(`\u2551 `) + hex.void(`ECHOES OF THE SPIRE // TERMINAL HARNESS`) + hex.border(` \u2551`));
|
|
2566
|
+
console.log(hex.border(`\u2551 `) + hex.critical(`SYSTEM_OVERRIDE :: NEURAL_LINK_ESTABLISHED`) + hex.border(` \u2551`));
|
|
2567
|
+
console.log(hex.border(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D`));
|
|
2568
|
+
console.log("\n" + hex.source(RUNES) + "\n");
|
|
2569
|
+
console.log(hex.player("Usage:"));
|
|
2570
|
+
console.log(` forbocai-test-game --mode ${hex.void("autoplay")}|${hex.void("manual")}`);
|
|
2571
|
+
console.log("\n" + hex.player("Defaults:"));
|
|
2572
|
+
console.log(` --mode ${hex.void("autoplay")}`);
|
|
2573
|
+
console.log("\n " + hex.success("[ok]") + ` ${zalgo("Command completed in shell mode.")}`);
|
|
2574
|
+
console.log(" " + hex.error("[error]") + ` ` + hex.critical("LOG_ERR_CRITICAL") + ` - ${zalgo("command failed and was recorded.")}`);
|
|
25
2575
|
};
|
|
26
2576
|
var getArgValue = (name) => {
|
|
27
2577
|
const idx = process.argv.findIndex((a) => a === name);
|