@crowdedkingdoms/crowdyjs 8.22.0 → 10.0.0
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/MIGRATION.md +66 -0
- package/README.md +111 -7
- package/dist/crowdy-client.d.ts +3 -0
- package/dist/crowdy-client.d.ts.map +1 -1
- package/dist/crowdy-client.js +2 -0
- package/dist/domains/playerCodeProjects.d.ts +25 -0
- package/dist/domains/playerCodeProjects.d.ts.map +1 -0
- package/dist/domains/playerCodeProjects.js +299 -0
- package/dist/domains/playerCompute.d.ts +1 -1
- package/dist/domains/playerCompute.js +1 -1
- package/dist/generated/graphql.d.ts +792 -7
- package/dist/generated/graphql.d.ts.map +1 -1
- package/dist/generated/graphql.js +57 -0
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/kit/npcs.d.ts.map +1 -1
- package/dist/kit/social.d.ts.map +1 -1
- package/dist/live-coding/assets/browser-authoring-index.json +1 -0
- package/dist/live-coding/assets/manifest.json +19 -0
- package/dist/live-coding/assets/tree-sitter-rust.wasm +0 -0
- package/dist/live-coding/assets/web-tree-sitter.wasm +0 -0
- package/dist/live-coding/browser-authoring-index.generated.d.ts +2 -0
- package/dist/live-coding/browser-authoring-index.generated.d.ts.map +1 -0
- package/dist/live-coding/browser-authoring-index.generated.js +5127 -0
- package/dist/live-coding/lsp-protocol.d.ts +98 -0
- package/dist/live-coding/lsp-protocol.d.ts.map +1 -0
- package/dist/live-coding/lsp-protocol.js +70 -0
- package/dist/live-coding/monaco-services.d.ts +22 -0
- package/dist/live-coding/monaco-services.d.ts.map +1 -0
- package/dist/live-coding/monaco-services.js +69 -0
- package/dist/live-coding/platform-index.d.ts +29 -0
- package/dist/live-coding/platform-index.d.ts.map +1 -0
- package/dist/live-coding/platform-index.js +281 -0
- package/dist/live-coding/rust-analysis.d.ts +24 -0
- package/dist/live-coding/rust-analysis.d.ts.map +1 -0
- package/dist/live-coding/rust-analysis.js +375 -0
- package/dist/live-coding/rust-lsp-server.d.ts +43 -0
- package/dist/live-coding/rust-lsp-server.d.ts.map +1 -0
- package/dist/live-coding/rust-lsp-server.js +455 -0
- package/dist/live-coding/rust-lsp.worker.d.ts +2 -0
- package/dist/live-coding/rust-lsp.worker.d.ts.map +1 -0
- package/dist/live-coding/rust-lsp.worker.js +26 -0
- package/dist/live-coding/vfs.d.ts +41 -0
- package/dist/live-coding/vfs.d.ts.map +1 -0
- package/dist/live-coding/vfs.js +174 -0
- package/dist/live-coding/worker-transport.d.ts +63 -0
- package/dist/live-coding/worker-transport.d.ts.map +1 -0
- package/dist/live-coding/worker-transport.js +217 -0
- package/dist/mod-studio/controller.d.ts +188 -0
- package/dist/mod-studio/controller.d.ts.map +1 -0
- package/dist/mod-studio/controller.js +915 -0
- package/dist/mod-studio/diagnostics.d.ts +22 -0
- package/dist/mod-studio/diagnostics.d.ts.map +1 -0
- package/dist/mod-studio/diagnostics.js +141 -0
- package/dist/mod-studio/dom-shell.d.ts +55 -0
- package/dist/mod-studio/dom-shell.d.ts.map +1 -0
- package/dist/mod-studio/dom-shell.js +527 -0
- package/dist/mod-studio/editor.d.ts +17 -0
- package/dist/mod-studio/editor.d.ts.map +1 -0
- package/dist/mod-studio/editor.js +1 -0
- package/dist/mod-studio/index.d.ts +10 -0
- package/dist/mod-studio/index.d.ts.map +1 -0
- package/dist/mod-studio/index.js +9 -0
- package/dist/mod-studio/models.d.ts +149 -0
- package/dist/mod-studio/models.d.ts.map +1 -0
- package/dist/mod-studio/models.js +62 -0
- package/dist/mod-studio/monaco-editor.d.ts +16 -0
- package/dist/mod-studio/monaco-editor.d.ts.map +1 -0
- package/dist/mod-studio/monaco-editor.js +548 -0
- package/dist/mod-studio/mount.d.ts +17 -0
- package/dist/mod-studio/mount.d.ts.map +1 -0
- package/dist/mod-studio/mount.js +86 -0
- package/dist/mod-studio/starter-projects.d.ts +11 -0
- package/dist/mod-studio/starter-projects.d.ts.map +1 -0
- package/dist/mod-studio/starter-projects.js +102 -0
- package/dist/mod-studio/styles.d.ts +2 -0
- package/dist/mod-studio/styles.d.ts.map +1 -0
- package/dist/mod-studio/styles.js +14 -0
- package/dist/mod-studio/textarea-editor.d.ts +8 -0
- package/dist/mod-studio/textarea-editor.d.ts.map +1 -0
- package/dist/mod-studio/textarea-editor.js +71 -0
- package/package.json +18 -6
- package/dist/live-coding/ide.d.ts +0 -16
- package/dist/live-coding/ide.d.ts.map +0 -1
- package/dist/live-coding/ide.js +0 -399
- package/dist/live-coding/live-coding-controller.d.ts +0 -75
- package/dist/live-coding/live-coding-controller.d.ts.map +0 -1
- package/dist/live-coding/live-coding-controller.js +0 -141
- package/dist/live-coding/mount.d.ts +0 -26
- package/dist/live-coding/mount.d.ts.map +0 -1
- package/dist/live-coding/mount.js +0 -108
- package/dist/live-coding/templates.d.ts +0 -17
- package/dist/live-coding/templates.d.ts.map +0 -1
- package/dist/live-coding/templates.js +0 -59
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
export const DEFAULT_VFS_LIMITS = {
|
|
2
|
+
maxFiles: 32,
|
|
3
|
+
maxFileBytes: 256 * 1024,
|
|
4
|
+
maxWorkspaceBytes: 1024 * 1024,
|
|
5
|
+
};
|
|
6
|
+
export class VfsLimitError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = 'VFS_LIMIT';
|
|
10
|
+
this.name = 'VfsLimitError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class VirtualFileSystem {
|
|
14
|
+
constructor(workspaceUri = 'file:///player-mod', limits = {}) {
|
|
15
|
+
this.files = new Map();
|
|
16
|
+
this.encoder = new TextEncoder();
|
|
17
|
+
this.totalBytes = 0;
|
|
18
|
+
this.workspaceUri = workspaceUri.replace(/\/+$/, '');
|
|
19
|
+
const root = new URL(this.workspaceUri);
|
|
20
|
+
if (root.protocol !== 'file:' ||
|
|
21
|
+
root.search ||
|
|
22
|
+
root.hash ||
|
|
23
|
+
!root.pathname.startsWith('/') ||
|
|
24
|
+
root.pathname === '/') {
|
|
25
|
+
throw new Error('workspaceUri must be a non-root file URI');
|
|
26
|
+
}
|
|
27
|
+
this.limits = { ...DEFAULT_VFS_LIMITS, ...limits };
|
|
28
|
+
this.assertLimits();
|
|
29
|
+
}
|
|
30
|
+
get size() {
|
|
31
|
+
return this.files.size;
|
|
32
|
+
}
|
|
33
|
+
get bytes() {
|
|
34
|
+
return this.totalBytes;
|
|
35
|
+
}
|
|
36
|
+
open(item) {
|
|
37
|
+
const path = this.pathForUri(item.uri);
|
|
38
|
+
const previous = this.files.get(item.uri);
|
|
39
|
+
if (!previous && this.files.size >= this.limits.maxFiles) {
|
|
40
|
+
throw new VfsLimitError(`Workspace file limit is ${this.limits.maxFiles}`);
|
|
41
|
+
}
|
|
42
|
+
if (previous && item.version <= previous.version) {
|
|
43
|
+
return previous;
|
|
44
|
+
}
|
|
45
|
+
const next = this.makeDocument(item, path);
|
|
46
|
+
this.ensureFits(next.bytes, previous?.bytes ?? 0);
|
|
47
|
+
if (previous)
|
|
48
|
+
this.totalBytes -= previous.bytes;
|
|
49
|
+
this.files.set(item.uri, next);
|
|
50
|
+
this.totalBytes += next.bytes;
|
|
51
|
+
return next;
|
|
52
|
+
}
|
|
53
|
+
change(uri, version, changes) {
|
|
54
|
+
const previous = this.require(uri);
|
|
55
|
+
if (version <= previous.version) {
|
|
56
|
+
return { applied: false, document: previous };
|
|
57
|
+
}
|
|
58
|
+
let text = previous.text;
|
|
59
|
+
for (const change of changes) {
|
|
60
|
+
if (!change.range) {
|
|
61
|
+
text = change.text;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const start = offsetAt(text, change.range.start);
|
|
65
|
+
const end = offsetAt(text, change.range.end);
|
|
66
|
+
if (end < start)
|
|
67
|
+
throw new Error('Invalid content change range');
|
|
68
|
+
text = text.slice(0, start) + change.text + text.slice(end);
|
|
69
|
+
}
|
|
70
|
+
const next = this.makeDocument({
|
|
71
|
+
uri,
|
|
72
|
+
version,
|
|
73
|
+
languageId: previous.languageId,
|
|
74
|
+
text,
|
|
75
|
+
}, previous.path);
|
|
76
|
+
this.ensureFits(next.bytes, previous.bytes);
|
|
77
|
+
this.files.set(uri, next);
|
|
78
|
+
this.totalBytes += next.bytes - previous.bytes;
|
|
79
|
+
return { applied: true, document: next };
|
|
80
|
+
}
|
|
81
|
+
close(uri) {
|
|
82
|
+
const previous = this.files.get(uri);
|
|
83
|
+
if (!previous)
|
|
84
|
+
return false;
|
|
85
|
+
this.files.delete(uri);
|
|
86
|
+
this.totalBytes -= previous.bytes;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
get(uri) {
|
|
90
|
+
return this.files.get(uri);
|
|
91
|
+
}
|
|
92
|
+
require(uri) {
|
|
93
|
+
const document = this.files.get(uri);
|
|
94
|
+
if (!document)
|
|
95
|
+
throw new Error(`Document is not open: ${uri}`);
|
|
96
|
+
return document;
|
|
97
|
+
}
|
|
98
|
+
documents() {
|
|
99
|
+
return [...this.files.values()];
|
|
100
|
+
}
|
|
101
|
+
clear() {
|
|
102
|
+
this.files.clear();
|
|
103
|
+
this.totalBytes = 0;
|
|
104
|
+
}
|
|
105
|
+
pathForUri(uri) {
|
|
106
|
+
let parsed;
|
|
107
|
+
try {
|
|
108
|
+
parsed = new URL(uri);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw new Error(`Invalid document URI: ${uri}`);
|
|
112
|
+
}
|
|
113
|
+
if (parsed.protocol !== 'file:' ||
|
|
114
|
+
parsed.search ||
|
|
115
|
+
parsed.hash ||
|
|
116
|
+
!uri.startsWith(`${this.workspaceUri}/`)) {
|
|
117
|
+
throw new Error(`Document is outside ${this.workspaceUri}`);
|
|
118
|
+
}
|
|
119
|
+
const relative = decodeURIComponent(parsed.pathname.slice(new URL(this.workspaceUri).pathname.length + 1));
|
|
120
|
+
if (relative.length === 0 ||
|
|
121
|
+
relative.startsWith('/') ||
|
|
122
|
+
relative.split('/').some((part) => part === '' || part === '..' || part === '.')) {
|
|
123
|
+
throw new Error(`Unsafe document path: ${relative}`);
|
|
124
|
+
}
|
|
125
|
+
return relative;
|
|
126
|
+
}
|
|
127
|
+
makeDocument(item, path) {
|
|
128
|
+
if (!Number.isSafeInteger(item.version) || item.version < 0) {
|
|
129
|
+
throw new Error('Document version must be a non-negative safe integer');
|
|
130
|
+
}
|
|
131
|
+
const bytes = this.encoder.encode(item.text).byteLength;
|
|
132
|
+
if (bytes > this.limits.maxFileBytes) {
|
|
133
|
+
throw new VfsLimitError(`${path} is ${bytes} bytes; file limit is ${this.limits.maxFileBytes}`);
|
|
134
|
+
}
|
|
135
|
+
return Object.freeze({ ...item, path, bytes });
|
|
136
|
+
}
|
|
137
|
+
ensureFits(nextBytes, replacedBytes) {
|
|
138
|
+
const total = this.totalBytes - replacedBytes + nextBytes;
|
|
139
|
+
if (total > this.limits.maxWorkspaceBytes) {
|
|
140
|
+
throw new VfsLimitError(`Workspace is ${total} bytes; limit is ${this.limits.maxWorkspaceBytes}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
assertLimits() {
|
|
144
|
+
for (const [name, value] of Object.entries(this.limits)) {
|
|
145
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
146
|
+
throw new Error(`${name} must be a positive safe integer`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (this.limits.maxFileBytes > this.limits.maxWorkspaceBytes) {
|
|
150
|
+
throw new Error('maxFileBytes cannot exceed maxWorkspaceBytes');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function offsetAt(text, position) {
|
|
155
|
+
if (!Number.isSafeInteger(position.line) ||
|
|
156
|
+
!Number.isSafeInteger(position.character) ||
|
|
157
|
+
position.line < 0 ||
|
|
158
|
+
position.character < 0) {
|
|
159
|
+
throw new Error('Invalid document position');
|
|
160
|
+
}
|
|
161
|
+
let offset = 0;
|
|
162
|
+
for (let line = 0; line < position.line; line++) {
|
|
163
|
+
const newline = text.indexOf('\n', offset);
|
|
164
|
+
if (newline < 0)
|
|
165
|
+
throw new Error('Document position is outside the text');
|
|
166
|
+
offset = newline + 1;
|
|
167
|
+
}
|
|
168
|
+
const newline = text.indexOf('\n', offset);
|
|
169
|
+
const lineEnd = newline < 0 ? text.length : newline;
|
|
170
|
+
const target = offset + position.character;
|
|
171
|
+
if (target > lineEnd)
|
|
172
|
+
throw new Error('Document position is outside the text');
|
|
173
|
+
return target;
|
|
174
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AbstractMessageReader, AbstractMessageWriter, type DataCallback, type Disposable, type Message } from 'vscode-jsonrpc';
|
|
2
|
+
import { type JsonRpcMessage } from './lsp-protocol.js';
|
|
3
|
+
export type { Disposable };
|
|
4
|
+
export interface LanguageWorkerLike {
|
|
5
|
+
postMessage(message: unknown): void;
|
|
6
|
+
addEventListener(type: 'message' | 'error' | 'messageerror', listener: EventListener): void;
|
|
7
|
+
removeEventListener(type: 'message' | 'error' | 'messageerror', listener: EventListener): void;
|
|
8
|
+
terminate(): void;
|
|
9
|
+
}
|
|
10
|
+
/** Standard vscode-jsonrpc MessageReader over structured-clone worker messages. */
|
|
11
|
+
export declare class WorkerMessageReader extends AbstractMessageReader {
|
|
12
|
+
private readonly worker;
|
|
13
|
+
private callback;
|
|
14
|
+
private listening;
|
|
15
|
+
constructor(worker: LanguageWorkerLike);
|
|
16
|
+
listen(callback: DataCallback): Disposable;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
private readonly onMessage;
|
|
19
|
+
private readonly onMessageError;
|
|
20
|
+
private readonly onWorkerError;
|
|
21
|
+
}
|
|
22
|
+
/** Standard vscode-jsonrpc MessageWriter over structured-clone worker messages. */
|
|
23
|
+
export declare class WorkerMessageWriter extends AbstractMessageWriter {
|
|
24
|
+
private readonly worker;
|
|
25
|
+
private disposed;
|
|
26
|
+
private errorCount;
|
|
27
|
+
constructor(worker: LanguageWorkerLike);
|
|
28
|
+
write(message: Message): Promise<void>;
|
|
29
|
+
end(): void;
|
|
30
|
+
dispose(): void;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkerLanguageClientOptions {
|
|
33
|
+
requestTimeoutMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* LSP 3.17 JSON-RPC client over a real vscode-jsonrpc MessageConnection.
|
|
37
|
+
* Monaco providers adapt editor calls to this connection; transport framing,
|
|
38
|
+
* request ids, cancellation, errors, and notifications are standard JSON-RPC.
|
|
39
|
+
*/
|
|
40
|
+
export declare class WorkerLanguageClient {
|
|
41
|
+
private readonly worker;
|
|
42
|
+
private readonly options;
|
|
43
|
+
private readonly reader;
|
|
44
|
+
private readonly writer;
|
|
45
|
+
private readonly connection;
|
|
46
|
+
private readonly transportErrorHandlers;
|
|
47
|
+
private readonly persistentErrorHandlers;
|
|
48
|
+
private readonly readerErrorDisposable;
|
|
49
|
+
private disposed;
|
|
50
|
+
private terminateTimer;
|
|
51
|
+
constructor(worker: LanguageWorkerLike, options?: WorkerLanguageClientOptions);
|
|
52
|
+
initialize(params: unknown): Promise<unknown>;
|
|
53
|
+
request(method: string, params?: unknown): Promise<unknown>;
|
|
54
|
+
notify(method: string, params?: unknown): Promise<void>;
|
|
55
|
+
onNotification(method: string, callback: (params: unknown) => void): Disposable;
|
|
56
|
+
/** Observe worker/transport failures for editor fallback and telemetry. */
|
|
57
|
+
onError(callback: (error: Error) => void): Disposable;
|
|
58
|
+
shutdown(): void;
|
|
59
|
+
dispose(): void;
|
|
60
|
+
}
|
|
61
|
+
export declare function createDefaultRustLanguageWorker(): Worker;
|
|
62
|
+
export declare function isWorkerLspMessage(value: unknown): value is JsonRpcMessage;
|
|
63
|
+
//# sourceMappingURL=worker-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-transport.d.ts","sourceRoot":"","sources":["../../src/live-coding/worker-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAErB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,OAAO,EACb,MAAM,gBAAgB,CAAC;AASxB,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,gBAAgB,CACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,cAAc,EAC1C,QAAQ,EAAE,aAAa,GACtB,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,cAAc,EAC1C,QAAQ,EAAE,aAAa,GACtB,IAAI,CAAC;IACR,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,mFAAmF;AACnF,qBAAa,mBAAoB,SAAQ,qBAAqB;IAIhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAS;gBAEG,MAAM,EAAE,kBAAkB;IAIvD,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU;IAUjC,OAAO,IAAI,IAAI;IAWxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAOxB;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE7B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAM5B;CACH;AAED,mFAAmF;AACnF,qBAAa,mBAAoB,SAAQ,qBAAqB;IAIhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;gBAEM,MAAM,EAAE,kBAAkB;IAIvD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,GAAG,IAAI,IAAI;IAIF,OAAO,IAAI,IAAI;CAIzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAW7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqC;IAC5E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqC;IAC7E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA8C;gBAGjD,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,2BAAgC;IAYtD,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAMnD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAsD3D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAClC,UAAU;IAIb,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,UAAU;IAQrD,QAAQ,IAAI,IAAI;IAehB,OAAO,IAAI,IAAI;CAahB;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAKxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAE1E"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { AbstractMessageReader, AbstractMessageWriter, CancellationTokenSource, } from 'vscode-jsonrpc';
|
|
2
|
+
import { ExitNotification, InitializeRequest, InitializedNotification, ShutdownRequest, createProtocolConnection, } from 'vscode-languageserver-protocol';
|
|
3
|
+
import { decodeJsonRpcMessage, } from './lsp-protocol.js';
|
|
4
|
+
/** Standard vscode-jsonrpc MessageReader over structured-clone worker messages. */
|
|
5
|
+
export class WorkerMessageReader extends AbstractMessageReader {
|
|
6
|
+
constructor(worker) {
|
|
7
|
+
super();
|
|
8
|
+
this.worker = worker;
|
|
9
|
+
this.callback = null;
|
|
10
|
+
this.listening = false;
|
|
11
|
+
this.onMessage = (event) => {
|
|
12
|
+
const decoded = decodeJsonRpcMessage(event.data);
|
|
13
|
+
if (!decoded.ok) {
|
|
14
|
+
this.fireError(new Error(decoded.message));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.callback?.(decoded.message);
|
|
18
|
+
};
|
|
19
|
+
this.onMessageError = () => {
|
|
20
|
+
this.fireError(new Error('Language worker sent an unreadable message'));
|
|
21
|
+
};
|
|
22
|
+
this.onWorkerError = (event) => {
|
|
23
|
+
const message = 'message' in event && typeof event.message === 'string'
|
|
24
|
+
? event.message
|
|
25
|
+
: 'Language worker failed';
|
|
26
|
+
this.fireError(new Error(message));
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
listen(callback) {
|
|
30
|
+
if (this.listening)
|
|
31
|
+
throw new Error('WorkerMessageReader is already listening');
|
|
32
|
+
this.listening = true;
|
|
33
|
+
this.callback = callback;
|
|
34
|
+
this.worker.addEventListener('message', this.onMessage);
|
|
35
|
+
this.worker.addEventListener('messageerror', this.onMessageError);
|
|
36
|
+
this.worker.addEventListener('error', this.onWorkerError);
|
|
37
|
+
return { dispose: () => this.dispose() };
|
|
38
|
+
}
|
|
39
|
+
dispose() {
|
|
40
|
+
if (this.listening) {
|
|
41
|
+
this.worker.removeEventListener('message', this.onMessage);
|
|
42
|
+
this.worker.removeEventListener('messageerror', this.onMessageError);
|
|
43
|
+
this.worker.removeEventListener('error', this.onWorkerError);
|
|
44
|
+
}
|
|
45
|
+
this.listening = false;
|
|
46
|
+
this.callback = null;
|
|
47
|
+
super.dispose();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Standard vscode-jsonrpc MessageWriter over structured-clone worker messages. */
|
|
51
|
+
export class WorkerMessageWriter extends AbstractMessageWriter {
|
|
52
|
+
constructor(worker) {
|
|
53
|
+
super();
|
|
54
|
+
this.worker = worker;
|
|
55
|
+
this.disposed = false;
|
|
56
|
+
this.errorCount = 0;
|
|
57
|
+
}
|
|
58
|
+
write(message) {
|
|
59
|
+
if (this.disposed)
|
|
60
|
+
return Promise.reject(new Error('Worker writer is disposed'));
|
|
61
|
+
try {
|
|
62
|
+
this.worker.postMessage(message);
|
|
63
|
+
return Promise.resolve();
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
this.errorCount++;
|
|
67
|
+
this.fireError(error, message, this.errorCount);
|
|
68
|
+
return Promise.reject(error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
end() {
|
|
72
|
+
this.dispose();
|
|
73
|
+
}
|
|
74
|
+
dispose() {
|
|
75
|
+
this.disposed = true;
|
|
76
|
+
super.dispose();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* LSP 3.17 JSON-RPC client over a real vscode-jsonrpc MessageConnection.
|
|
81
|
+
* Monaco providers adapt editor calls to this connection; transport framing,
|
|
82
|
+
* request ids, cancellation, errors, and notifications are standard JSON-RPC.
|
|
83
|
+
*/
|
|
84
|
+
export class WorkerLanguageClient {
|
|
85
|
+
constructor(worker, options = {}) {
|
|
86
|
+
this.worker = worker;
|
|
87
|
+
this.options = options;
|
|
88
|
+
this.transportErrorHandlers = new Set();
|
|
89
|
+
this.persistentErrorHandlers = new Set();
|
|
90
|
+
this.disposed = false;
|
|
91
|
+
this.terminateTimer = null;
|
|
92
|
+
this.reader = new WorkerMessageReader(worker);
|
|
93
|
+
this.writer = new WorkerMessageWriter(worker);
|
|
94
|
+
this.readerErrorDisposable = this.reader.onError((error) => {
|
|
95
|
+
for (const handler of this.transportErrorHandlers)
|
|
96
|
+
handler(error);
|
|
97
|
+
for (const handler of this.persistentErrorHandlers)
|
|
98
|
+
handler(error);
|
|
99
|
+
});
|
|
100
|
+
this.connection = createProtocolConnection(this.reader, this.writer);
|
|
101
|
+
this.connection.listen();
|
|
102
|
+
}
|
|
103
|
+
async initialize(params) {
|
|
104
|
+
const result = await this.request(InitializeRequest.type.method, params);
|
|
105
|
+
await this.notify(InitializedNotification.type.method, {});
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
request(method, params) {
|
|
109
|
+
if (this.disposed)
|
|
110
|
+
return Promise.reject(new Error('Language client is disposed'));
|
|
111
|
+
const cancellation = new CancellationTokenSource();
|
|
112
|
+
const timeoutMs = this.options.requestTimeoutMs ?? 3000;
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
let settled = false;
|
|
115
|
+
const onTransportError = (error) => {
|
|
116
|
+
if (settled)
|
|
117
|
+
return;
|
|
118
|
+
settled = true;
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
cancellation.cancel();
|
|
121
|
+
cancellation.dispose();
|
|
122
|
+
this.transportErrorHandlers.delete(onTransportError);
|
|
123
|
+
reject(error);
|
|
124
|
+
};
|
|
125
|
+
const timer = setTimeout(() => {
|
|
126
|
+
if (settled)
|
|
127
|
+
return;
|
|
128
|
+
settled = true;
|
|
129
|
+
cancellation.cancel();
|
|
130
|
+
cancellation.dispose();
|
|
131
|
+
this.transportErrorHandlers.delete(onTransportError);
|
|
132
|
+
reject(new Error(`Language request timed out: ${method}`));
|
|
133
|
+
}, timeoutMs);
|
|
134
|
+
this.transportErrorHandlers.add(onTransportError);
|
|
135
|
+
const request = params === undefined
|
|
136
|
+
? this.connection.sendRequest(method, cancellation.token)
|
|
137
|
+
: this.connection.sendRequest(method, params, cancellation.token);
|
|
138
|
+
void request
|
|
139
|
+
.then((value) => {
|
|
140
|
+
if (settled)
|
|
141
|
+
return;
|
|
142
|
+
settled = true;
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
cancellation.dispose();
|
|
145
|
+
this.transportErrorHandlers.delete(onTransportError);
|
|
146
|
+
resolve(value);
|
|
147
|
+
}, (error) => {
|
|
148
|
+
if (settled)
|
|
149
|
+
return;
|
|
150
|
+
settled = true;
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
cancellation.dispose();
|
|
153
|
+
this.transportErrorHandlers.delete(onTransportError);
|
|
154
|
+
reject(error instanceof Error
|
|
155
|
+
? error
|
|
156
|
+
: new Error('Language request failed'));
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
notify(method, params) {
|
|
161
|
+
if (this.disposed)
|
|
162
|
+
return Promise.reject(new Error('Language client is disposed'));
|
|
163
|
+
return this.connection.sendNotification(method, params);
|
|
164
|
+
}
|
|
165
|
+
onNotification(method, callback) {
|
|
166
|
+
return this.connection.onNotification(method, callback);
|
|
167
|
+
}
|
|
168
|
+
/** Observe worker/transport failures for editor fallback and telemetry. */
|
|
169
|
+
onError(callback) {
|
|
170
|
+
if (this.disposed)
|
|
171
|
+
return { dispose() { } };
|
|
172
|
+
this.persistentErrorHandlers.add(callback);
|
|
173
|
+
return {
|
|
174
|
+
dispose: () => this.persistentErrorHandlers.delete(callback),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
shutdown() {
|
|
178
|
+
if (this.disposed || this.terminateTimer)
|
|
179
|
+
return;
|
|
180
|
+
const finish = () => {
|
|
181
|
+
if (this.disposed)
|
|
182
|
+
return;
|
|
183
|
+
void this.connection
|
|
184
|
+
.sendNotification(ExitNotification.type.method)
|
|
185
|
+
.catch(() => { })
|
|
186
|
+
.finally(() => this.dispose());
|
|
187
|
+
};
|
|
188
|
+
void this.request(ShutdownRequest.type.method)
|
|
189
|
+
.catch(() => { })
|
|
190
|
+
.finally(finish);
|
|
191
|
+
this.terminateTimer = setTimeout(finish, this.options.requestTimeoutMs ?? 3000);
|
|
192
|
+
}
|
|
193
|
+
dispose() {
|
|
194
|
+
if (this.disposed)
|
|
195
|
+
return;
|
|
196
|
+
this.disposed = true;
|
|
197
|
+
if (this.terminateTimer)
|
|
198
|
+
clearTimeout(this.terminateTimer);
|
|
199
|
+
this.terminateTimer = null;
|
|
200
|
+
this.transportErrorHandlers.clear();
|
|
201
|
+
this.persistentErrorHandlers.clear();
|
|
202
|
+
this.readerErrorDisposable.dispose();
|
|
203
|
+
this.connection.dispose();
|
|
204
|
+
this.reader.dispose();
|
|
205
|
+
this.writer.dispose();
|
|
206
|
+
this.worker.terminate();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export function createDefaultRustLanguageWorker() {
|
|
210
|
+
return new Worker(new URL('./rust-lsp.worker.js', import.meta.url), {
|
|
211
|
+
type: 'module',
|
|
212
|
+
name: 'crowdy-rust-lsp',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
export function isWorkerLspMessage(value) {
|
|
216
|
+
return decodeJsonRpcMessage(value).ok;
|
|
217
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { type PlayerCodeBrokerOptions, type PlayerCodeGridBounds } from '../player-runtime/player-code-broker.js';
|
|
2
|
+
import type { PlayerComputeAPI } from '../domains/playerCompute.js';
|
|
3
|
+
import type { PlayerWalletAPI } from '../domains/playerWallet.js';
|
|
4
|
+
import { type ModStudioDiagnostic } from './diagnostics.js';
|
|
5
|
+
import { type ModStudioFileRef, type ModStudioPairingPreference, type ModStudioProject, type ModStudioProjectMetadata, type ModStudioProjectProvider, type ModStudioProjectSummary, type ModStudioReferenceFile, type ModStudioSaveState, type ModStudioTarget } from './models.js';
|
|
6
|
+
import { type ModStudioNewProjectOptions } from './starter-projects.js';
|
|
7
|
+
export type ModStudioPhase = 'IDLE' | 'TESTING_DRAFT' | 'DEPLOYING_LIVE' | 'COMPILING' | 'ENABLING' | 'RUNNING' | 'COMPILE_FAILED' | 'STOPPING' | 'STOPPED' | 'PARTIAL_FAILURE' | 'ERROR';
|
|
8
|
+
export type ModStudioPolledSurface = 'runs' | 'logs' | 'usage';
|
|
9
|
+
export interface ModStudioRuntimeStatus {
|
|
10
|
+
phase: ModStudioPhase;
|
|
11
|
+
target?: ModStudioTarget;
|
|
12
|
+
message?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ModStudioUsageSnapshot {
|
|
15
|
+
hourUnitsUsed: string;
|
|
16
|
+
dayUnitsUsed: string;
|
|
17
|
+
unitsPerHour: string | null;
|
|
18
|
+
unitsPerDay: string | null;
|
|
19
|
+
compilesThisHour: number;
|
|
20
|
+
maxCompilesPerHour: number;
|
|
21
|
+
gateStatus: string;
|
|
22
|
+
gateReason: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface ModStudioWalletSnapshot {
|
|
25
|
+
balanceCents: string;
|
|
26
|
+
currency: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ModStudioRun {
|
|
29
|
+
runId: string;
|
|
30
|
+
moduleName: string;
|
|
31
|
+
triggerSource: string;
|
|
32
|
+
startedAt: string;
|
|
33
|
+
durationUs: number;
|
|
34
|
+
fuelUsed: string;
|
|
35
|
+
success: boolean;
|
|
36
|
+
errorMessage?: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface ModStudioInvokeResult {
|
|
39
|
+
resultBase64?: string | null;
|
|
40
|
+
resultJson?: string | null;
|
|
41
|
+
fuelUsed?: string;
|
|
42
|
+
durationUs?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ModStudioState {
|
|
45
|
+
projects: readonly ModStudioProjectSummary[];
|
|
46
|
+
project: ModStudioProject | null;
|
|
47
|
+
personalLibraryFiles: readonly ModStudioReferenceFile[];
|
|
48
|
+
commonFiles: readonly ModStudioReferenceFile[];
|
|
49
|
+
openFiles: readonly ModStudioFileRef[];
|
|
50
|
+
activeFile: ModStudioFileRef | null;
|
|
51
|
+
saveState: ModStudioSaveState;
|
|
52
|
+
saveMessage?: string;
|
|
53
|
+
runtime: ModStudioRuntimeStatus;
|
|
54
|
+
buildOutput: string;
|
|
55
|
+
authoritativeDiagnostics: readonly ModStudioDiagnostic[];
|
|
56
|
+
localDiagnostics: readonly ModStudioDiagnostic[];
|
|
57
|
+
runs: readonly ModStudioRun[];
|
|
58
|
+
logs: readonly ModStudioRun[];
|
|
59
|
+
usage: ModStudioUsageSnapshot | null;
|
|
60
|
+
wallet: ModStudioWalletSnapshot | null;
|
|
61
|
+
invokeResult: ModStudioInvokeResult | null;
|
|
62
|
+
}
|
|
63
|
+
export type ModStudioPlayerCompute = Pick<PlayerComputeAPI, 'deploy' | 'versions' | 'setEnabled' | 'setRequires' | 'artifactBytes' | 'usage' | 'runs' | 'logs' | 'invoke'>;
|
|
64
|
+
export type ModStudioPlayerWallet = Pick<PlayerWalletAPI, 'balance'>;
|
|
65
|
+
export interface ModStudioBroker {
|
|
66
|
+
start(bytes: ArrayBuffer): Promise<void>;
|
|
67
|
+
stop(): void;
|
|
68
|
+
}
|
|
69
|
+
export interface ModStudioControllerOptions {
|
|
70
|
+
projectProvider: ModStudioProjectProvider;
|
|
71
|
+
playerCompute: ModStudioPlayerCompute;
|
|
72
|
+
playerWallet?: ModStudioPlayerWallet;
|
|
73
|
+
appId: string;
|
|
74
|
+
gridId: string;
|
|
75
|
+
initialProjectId?: string;
|
|
76
|
+
/** Required only when a project has a CLIENT target. */
|
|
77
|
+
grid?: PlayerCodeGridBounds;
|
|
78
|
+
/** Platform-owned glue worker; required only for CLIENT execution. */
|
|
79
|
+
workerUrl?: string | URL;
|
|
80
|
+
/** Page-side allow-listed host-call router; required only for CLIENT execution. */
|
|
81
|
+
onHostCall?: PlayerCodeBrokerOptions['onHostCall'];
|
|
82
|
+
onPresentation?: PlayerCodeBrokerOptions['onPresentation'];
|
|
83
|
+
/** Host-visible effective permissions; server authorization remains final. */
|
|
84
|
+
targetPermissions?: Partial<Record<ModStudioTarget, {
|
|
85
|
+
canWrite: boolean;
|
|
86
|
+
canRun: boolean;
|
|
87
|
+
}>>;
|
|
88
|
+
clientTickIntervalMs?: number;
|
|
89
|
+
autosaveMs?: number;
|
|
90
|
+
retryMs?: number;
|
|
91
|
+
compilePollMs?: number;
|
|
92
|
+
compilePollLimit?: number;
|
|
93
|
+
monitorPollMs?: number;
|
|
94
|
+
sleep?: (ms: number) => Promise<void>;
|
|
95
|
+
brokerFactory?: (options: PlayerCodeBrokerOptions) => ModStudioBroker;
|
|
96
|
+
isOnline?: () => boolean;
|
|
97
|
+
onStateChange?: (state: ModStudioState) => void;
|
|
98
|
+
}
|
|
99
|
+
export interface ModStudioStopResult {
|
|
100
|
+
serverStopped: boolean | null;
|
|
101
|
+
clientStopped: boolean | null;
|
|
102
|
+
failures: string[];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Headless project-first Mod Studio driver. It owns optimistic project saves,
|
|
106
|
+
* file CRUD, deployment ordering, runtime polling, and client hot swaps; the
|
|
107
|
+
* DOM mount is only a view over this state.
|
|
108
|
+
*/
|
|
109
|
+
export declare class ModStudioController {
|
|
110
|
+
private readonly options;
|
|
111
|
+
private state;
|
|
112
|
+
private readonly listeners;
|
|
113
|
+
private autosaveTimer;
|
|
114
|
+
private retryTimer;
|
|
115
|
+
private savePromise;
|
|
116
|
+
private editGeneration;
|
|
117
|
+
private persistedGeneration;
|
|
118
|
+
private conflictRemote;
|
|
119
|
+
private broker;
|
|
120
|
+
private operationGeneration;
|
|
121
|
+
private readonly visibleSurfaces;
|
|
122
|
+
private readonly surfaceTimers;
|
|
123
|
+
private pageVisible;
|
|
124
|
+
private destroyed;
|
|
125
|
+
constructor(options: ModStudioControllerOptions);
|
|
126
|
+
getState(): ModStudioState;
|
|
127
|
+
subscribe(listener: (state: ModStudioState) => void): () => void;
|
|
128
|
+
canTarget(target: ModStudioTarget, action: 'write' | 'run'): boolean;
|
|
129
|
+
initialize(): Promise<void>;
|
|
130
|
+
createProject(options: Omit<ModStudioNewProjectOptions, 'appId' | 'gridId'>): Promise<ModStudioProject>;
|
|
131
|
+
switchProject(projectId: string): Promise<void>;
|
|
132
|
+
private loadProject;
|
|
133
|
+
private installProject;
|
|
134
|
+
openFile(ref: ModStudioFileRef): void;
|
|
135
|
+
closeFile(ref: ModStudioFileRef): void;
|
|
136
|
+
fileContent(ref: ModStudioFileRef): string;
|
|
137
|
+
addFile(target: ModStudioTarget, path: string, content?: string): void;
|
|
138
|
+
renameFile(target: ModStudioTarget, path: string, nextPath: string): void;
|
|
139
|
+
deleteFile(target: ModStudioTarget, path: string): void;
|
|
140
|
+
importReferenceFile(reference: ModStudioReferenceFile, destinationPath?: string): Promise<void>;
|
|
141
|
+
saveProjectFileToLibrary(target: ModStudioTarget, path: string, title?: string): Promise<ModStudioReferenceFile>;
|
|
142
|
+
updateFile(target: ModStudioTarget, path: string, content: string): void;
|
|
143
|
+
updateSettings(patch: Partial<Pick<ModStudioProjectMetadata, 'name' | 'description' | 'serverModuleName' | 'clientModuleName' | 'pairingPreference'>>): void;
|
|
144
|
+
setPairingPreference(preference: ModStudioPairingPreference): void;
|
|
145
|
+
setLocalDiagnostics(diagnostics: readonly ModStudioDiagnostic[]): void;
|
|
146
|
+
/**
|
|
147
|
+
* Flush all edits in one optimistic-concurrency save. If edits arrive while
|
|
148
|
+
* the request is in flight, a second atomic save follows with the new
|
|
149
|
+
* revision instead of overwriting local content with the earlier response.
|
|
150
|
+
*/
|
|
151
|
+
saveNow(): Promise<boolean>;
|
|
152
|
+
retrySave(): Promise<boolean>;
|
|
153
|
+
acceptRemoteConflict(): Promise<void>;
|
|
154
|
+
overwriteConflict(): Promise<boolean>;
|
|
155
|
+
testDraft(): Promise<void>;
|
|
156
|
+
deployLive(): Promise<void>;
|
|
157
|
+
private deployProject;
|
|
158
|
+
private compileTarget;
|
|
159
|
+
private recordBuild;
|
|
160
|
+
private enableServer;
|
|
161
|
+
private runClient;
|
|
162
|
+
stopProject(): Promise<ModStudioStopResult>;
|
|
163
|
+
invoke(exportName: string, paramsJson?: string): Promise<ModStudioInvokeResult>;
|
|
164
|
+
setSurfaceVisible(surface: ModStudioPolledSurface, visible: boolean): void;
|
|
165
|
+
setPageVisible(visible: boolean): void;
|
|
166
|
+
refreshSurface(surface: ModStudioPolledSurface): Promise<void>;
|
|
167
|
+
destroy(): void;
|
|
168
|
+
private performSaveLoop;
|
|
169
|
+
private markEdited;
|
|
170
|
+
private scheduleRetry;
|
|
171
|
+
private scheduleSurfacePoll;
|
|
172
|
+
private restartVisibleSurfacePolling;
|
|
173
|
+
private stopSurfacePolling;
|
|
174
|
+
private clearSurfaceTimer;
|
|
175
|
+
private clearSaveTimers;
|
|
176
|
+
private clearTimer;
|
|
177
|
+
private clientRuntimeOptions;
|
|
178
|
+
private checkOperation;
|
|
179
|
+
private sleep;
|
|
180
|
+
private requireProject;
|
|
181
|
+
private requireFile;
|
|
182
|
+
private assertProjectTarget;
|
|
183
|
+
private scope;
|
|
184
|
+
private setRuntime;
|
|
185
|
+
private update;
|
|
186
|
+
private ensureAlive;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/mod-studio/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC1B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAOL,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EAErB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,eAAe,GACf,gBAAgB,GAChB,WAAW,GACX,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,OAAO,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC7C,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC/C,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACvC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,sBAAsB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzD,gBAAgB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9B,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,gBAAgB,EACd,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,aAAa,GACb,eAAe,GACf,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,CACX,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,wBAAwB,CAAC;IAC1C,aAAa,EAAE,sBAAsB,CAAC;IACtC,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACzB,mFAAmF;IACnF,UAAU,CAAC,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,CACzB,MAAM,CAAC,eAAe,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAChE,CAAC;IACF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,eAAe,CAAC;IACtE,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD;;;;GAIG;AACH,qBAAa,mBAAmB;IAoClB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAnCpC,OAAO,CAAC,KAAK,CAiBX;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IACxE,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IACJ,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEG,OAAO,EAAE,0BAA0B;IAIhE,QAAQ,IAAI,cAAc;IAI1B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAMhE,SAAS,CACP,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,OAAO,GAAG,KAAK,GACtB,OAAO;IASJ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C3B,aAAa,CACjB,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,OAAO,GAAG,QAAQ,CAAC,GAC5D,OAAO,CAAC,gBAAgB,CAAC;IAmBtB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQvC,WAAW;IAQzB,OAAO,CAAC,cAAc;IA8BtB,QAAQ,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IASrC,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAWtC,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM;IAI1C,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,IAAI;IAsBlE,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgCzE,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYjD,mBAAmB,CACvB,SAAS,EAAE,sBAAsB,EACjC,eAAe,SAAiB,GAC/B,OAAO,CAAC,IAAI,CAAC;IA0BV,wBAAwB,CAC5B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC;IAuBlC,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAYxE,cAAc,CACZ,KAAK,EAAE,OAAO,CACZ,IAAI,CACF,wBAAwB,EACtB,MAAM,GACN,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,CACtB,CACF,GACA,IAAI;IAWP,oBAAoB,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAIlE,mBAAmB,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,GAAG,IAAI;IAItE;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB3B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAY7B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAerC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAInB,aAAa;YAyEb,aAAa;IA4E3B,OAAO,CAAC,WAAW;YAcL,YAAY;YAiBZ,SAAS;IAwCjB,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAgD3C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAerF,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAa1E,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhC,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BpE,OAAO,IAAI,IAAI;YAWD,eAAe;IAmD7B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,WAAW;CAGpB"}
|