@blackwell-systems/gcf 2.0.2 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -20
- package/dist/cjs/browser.d.ts +9 -0
- package/dist/cjs/browser.js +25 -0
- package/dist/cjs/browser.js.map +1 -0
- package/dist/cjs/cli.d.ts +5 -0
- package/dist/cjs/cli.js +136 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/constants.d.ts +8 -0
- package/dist/cjs/constants.js +46 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/decode.d.ts +5 -0
- package/dist/cjs/decode.js +197 -0
- package/dist/cjs/decode.js.map +1 -0
- package/dist/cjs/decode_generic.d.ts +4 -0
- package/dist/cjs/decode_generic.js +678 -0
- package/dist/cjs/decode_generic.js.map +1 -0
- package/dist/cjs/delta.d.ts +15 -0
- package/dist/cjs/delta.js +73 -0
- package/dist/cjs/delta.js.map +1 -0
- package/dist/cjs/encode.d.ts +5 -0
- package/dist/cjs/encode.js +89 -0
- package/dist/cjs/encode.js.map +1 -0
- package/dist/cjs/generic.d.ts +1 -0
- package/dist/cjs/generic.js +332 -0
- package/dist/cjs/generic.js.map +1 -0
- package/dist/cjs/index.cjs +1841 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/packroot.d.ts +13 -0
- package/dist/cjs/packroot.js +50 -0
- package/dist/cjs/packroot.js.map +1 -0
- package/dist/cjs/scalar.d.ts +26 -0
- package/dist/cjs/scalar.js +339 -0
- package/dist/cjs/scalar.js.map +1 -0
- package/dist/cjs/session.d.ts +30 -0
- package/dist/cjs/session.js +140 -0
- package/dist/cjs/session.js.map +1 -0
- package/dist/cjs/stream.d.ts +66 -0
- package/dist/cjs/stream.js +127 -0
- package/dist/cjs/stream.js.map +1 -0
- package/dist/cjs/stream_generic.d.ts +37 -0
- package/dist/cjs/stream_generic.js +87 -0
- package/dist/cjs/stream_generic.js.map +1 -0
- package/dist/cjs/types.d.ts +75 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cli.js +0 -0
- package/dist/decode.d.ts.map +1 -1
- package/dist/decode.js +1 -3
- package/dist/decode.js.map +1 -1
- package/dist/decode_generic.js +34 -3
- package/dist/decode_generic.js.map +1 -1
- package/dist/scalar.js +2 -2
- package/dist/scalar.js.map +1 -1
- package/package.json +5 -4
- package/src/decode.ts +1 -3
- package/src/decode_generic.ts +33 -3
- package/src/scalar.ts +1 -1
package/README.md
CHANGED
|
@@ -203,26 +203,26 @@ Works on objects, arrays, and primitives. Arrays of uniform objects get tabular
|
|
|
203
203
|
|
|
204
204
|
GCF wins 13/15 datasets on the expanded [token efficiency benchmark](https://github.com/blackwell-systems/toon/tree/gcf-comparison). Full results: [gcformat.com/guide/benchmarks](https://gcformat.com/guide/benchmarks.html)
|
|
205
205
|
|
|
206
|
-
##
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
- [
|
|
211
|
-
- [
|
|
212
|
-
- [
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- [
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
206
|
+
## Implementations
|
|
207
|
+
|
|
208
|
+
| Language | Package | Repository |
|
|
209
|
+
|----------|---------|-----------|
|
|
210
|
+
| Go | `go get github.com/blackwell-systems/gcf-go` | [gcf-go](https://github.com/blackwell-systems/gcf-go) |
|
|
211
|
+
| TypeScript | `npm install @blackwell-systems/gcf` | [gcf-typescript](https://github.com/blackwell-systems/gcf-typescript) |
|
|
212
|
+
| Python | `pip install gcf-python` | [gcf-python](https://github.com/blackwell-systems/gcf-python) |
|
|
213
|
+
| Rust | `cargo add gcf` | [gcf-rust](https://github.com/blackwell-systems/gcf-rust) |
|
|
214
|
+
| Swift | Swift Package Manager | [gcf-swift](https://github.com/blackwell-systems/gcf-swift) |
|
|
215
|
+
| Kotlin | JitPack | [gcf-kotlin](https://github.com/blackwell-systems/gcf-kotlin) |
|
|
216
|
+
| MCP Proxy | `pip install gcf-proxy` | [gcf-proxy](https://github.com/blackwell-systems/gcf-proxy) (bidirectional, session dedup, HTTP frontend) |
|
|
217
|
+
| Claude Code Plugin | `/plugin install` | [gcf-claude-plugin](https://github.com/blackwell-systems/gcf-claude-plugin) (one-command install, session stats hook) |
|
|
218
|
+
| Codex Plugin | `codex plugin add` | [gcf-codex-plugin](https://github.com/blackwell-systems/gcf-codex-plugin) (one-command install, session stats hook) |
|
|
219
|
+
| VS Code | `ext install blackwell-systems.gcf-vscode` | [gcf-vscode](https://marketplace.visualstudio.com/items?itemName=blackwell-systems.gcf-vscode) (syntax highlighting) |
|
|
220
|
+
| n8n | `npm install n8n-nodes-gcf` | [gcf-n8n-nodes](https://github.com/blackwell-systems/gcf-n8n-nodes) (workflow encode/decode) |
|
|
221
|
+
| Tree-sitter | `npm install tree-sitter-gcf` | [tree-sitter-gcf](https://github.com/blackwell-systems/tree-sitter-gcf) |
|
|
222
|
+
|
|
223
|
+
Zero runtime dependencies. MIT licensed. All implementations support both generic profile (`encodeGeneric`) and graph profile (`encode`). CLI included in all 6 languages.
|
|
224
|
+
|
|
225
|
+
**Specification:** [SPEC v3.1 Stable](https://github.com/blackwell-systems/gcf/blob/main/SPEC.md) with 157 conformance fixtures, 33,000,000,000+ lossless round-trips verified across 5 formats and 6 languages. All implementations at v2.1.0+ (Go v1.2.0). Cross-language 6x6 matrix verified.
|
|
226
226
|
|
|
227
227
|
## License
|
|
228
228
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { Symbol, Edge, Payload, DeltaPayload, Components } from './types.js';
|
|
2
|
+
export { KIND_ABBREV, KIND_EXPAND } from './constants.js';
|
|
3
|
+
export { encode } from './encode.js';
|
|
4
|
+
export { decode } from './decode.js';
|
|
5
|
+
export { encodeGeneric } from './generic.js';
|
|
6
|
+
export { decodeGeneric } from './decode_generic.js';
|
|
7
|
+
export { formatScalar, formatKey, parseScalar, needsQuote, quoteString } from './scalar.js';
|
|
8
|
+
export { StreamEncoder, type StreamWriter, type StreamOptions } from './stream.js';
|
|
9
|
+
export { GenericStreamEncoder } from './stream_generic.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GenericStreamEncoder = exports.StreamEncoder = exports.quoteString = exports.needsQuote = exports.parseScalar = exports.formatKey = exports.formatScalar = exports.decodeGeneric = exports.encodeGeneric = exports.decode = exports.encode = exports.KIND_EXPAND = exports.KIND_ABBREV = void 0;
|
|
4
|
+
var constants_js_1 = require("./constants.js");
|
|
5
|
+
Object.defineProperty(exports, "KIND_ABBREV", { enumerable: true, get: function () { return constants_js_1.KIND_ABBREV; } });
|
|
6
|
+
Object.defineProperty(exports, "KIND_EXPAND", { enumerable: true, get: function () { return constants_js_1.KIND_EXPAND; } });
|
|
7
|
+
var encode_js_1 = require("./encode.js");
|
|
8
|
+
Object.defineProperty(exports, "encode", { enumerable: true, get: function () { return encode_js_1.encode; } });
|
|
9
|
+
var decode_js_1 = require("./decode.js");
|
|
10
|
+
Object.defineProperty(exports, "decode", { enumerable: true, get: function () { return decode_js_1.decode; } });
|
|
11
|
+
var generic_js_1 = require("./generic.js");
|
|
12
|
+
Object.defineProperty(exports, "encodeGeneric", { enumerable: true, get: function () { return generic_js_1.encodeGeneric; } });
|
|
13
|
+
var decode_generic_js_1 = require("./decode_generic.js");
|
|
14
|
+
Object.defineProperty(exports, "decodeGeneric", { enumerable: true, get: function () { return decode_generic_js_1.decodeGeneric; } });
|
|
15
|
+
var scalar_js_1 = require("./scalar.js");
|
|
16
|
+
Object.defineProperty(exports, "formatScalar", { enumerable: true, get: function () { return scalar_js_1.formatScalar; } });
|
|
17
|
+
Object.defineProperty(exports, "formatKey", { enumerable: true, get: function () { return scalar_js_1.formatKey; } });
|
|
18
|
+
Object.defineProperty(exports, "parseScalar", { enumerable: true, get: function () { return scalar_js_1.parseScalar; } });
|
|
19
|
+
Object.defineProperty(exports, "needsQuote", { enumerable: true, get: function () { return scalar_js_1.needsQuote; } });
|
|
20
|
+
Object.defineProperty(exports, "quoteString", { enumerable: true, get: function () { return scalar_js_1.quoteString; } });
|
|
21
|
+
var stream_js_1 = require("./stream.js");
|
|
22
|
+
Object.defineProperty(exports, "StreamEncoder", { enumerable: true, get: function () { return stream_js_1.StreamEncoder; } });
|
|
23
|
+
var stream_generic_js_1 = require("./stream_generic.js");
|
|
24
|
+
Object.defineProperty(exports, "GenericStreamEncoder", { enumerable: true, get: function () { return stream_generic_js_1.GenericStreamEncoder; } });
|
|
25
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":";;;AAEA,+CAA0D;AAAjD,2GAAA,WAAW,OAAA;AAAE,2GAAA,WAAW,OAAA;AACjC,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,2CAA6C;AAApC,2GAAA,aAAa,OAAA;AACtB,yDAAoD;AAA3C,kHAAA,aAAa,OAAA;AACtB,yCAA4F;AAAnF,yGAAA,YAAY,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,wGAAA,WAAW,OAAA;AACtE,yCAAmF;AAA1E,0GAAA,aAAa,OAAA;AACtB,yDAA2D;AAAlD,yHAAA,oBAAoB,OAAA"}
|
package/dist/cjs/cli.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* GCF command-line interface: encode, decode, stats.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const encode_js_1 = require("./encode.js");
|
|
9
|
+
const decode_js_1 = require("./decode.js");
|
|
10
|
+
const generic_js_1 = require("./generic.js");
|
|
11
|
+
const decode_generic_js_1 = require("./decode_generic.js");
|
|
12
|
+
const USAGE = `gcf - token-optimized wire format for LLM tool responses
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
gcf encode [file] Encode JSON graph payload to GCF (stdin if no file)
|
|
16
|
+
gcf decode [file] Decode GCF graph text to JSON (stdin if no file)
|
|
17
|
+
gcf encode-generic [file] Encode generic JSON to GCF (stdin if no file)
|
|
18
|
+
gcf decode-generic [file] Decode generic GCF to JSON (stdin if no file)
|
|
19
|
+
gcf stats [file] Compare token counts: JSON vs GCF (stdin if no file)
|
|
20
|
+
gcf version Print version
|
|
21
|
+
|
|
22
|
+
Examples:
|
|
23
|
+
gcf encode < payload.json
|
|
24
|
+
gcf decode < payload.gcf
|
|
25
|
+
gcf encode-generic < data.json
|
|
26
|
+
gcf decode-generic < data.gcf
|
|
27
|
+
gcf stats payload.json
|
|
28
|
+
`;
|
|
29
|
+
function readInput(args) {
|
|
30
|
+
if (args.length > 0 && args[0] !== '-') {
|
|
31
|
+
return (0, node_fs_1.readFileSync)(args[0], 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
return (0, node_fs_1.readFileSync)(0, 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
function payloadFromJSON(data) {
|
|
36
|
+
const obj = JSON.parse(data);
|
|
37
|
+
return {
|
|
38
|
+
tool: obj.tool ?? '',
|
|
39
|
+
tokenBudget: obj.tokenBudget ?? 0,
|
|
40
|
+
tokensUsed: obj.tokensUsed ?? 0,
|
|
41
|
+
packRoot: obj.packRoot ?? '',
|
|
42
|
+
symbols: (obj.symbols ?? []).map((s) => ({
|
|
43
|
+
qualifiedName: s.qualifiedName,
|
|
44
|
+
kind: s.kind,
|
|
45
|
+
score: s.score,
|
|
46
|
+
provenance: s.provenance,
|
|
47
|
+
distance: s.distance ?? 0,
|
|
48
|
+
})),
|
|
49
|
+
edges: (obj.edges ?? []).map((e) => ({
|
|
50
|
+
source: e.source,
|
|
51
|
+
target: e.target,
|
|
52
|
+
edgeType: e.edgeType,
|
|
53
|
+
status: e.status ?? '',
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function payloadToJSON(p) {
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
tool: p.tool,
|
|
60
|
+
tokensUsed: p.tokensUsed,
|
|
61
|
+
tokenBudget: p.tokenBudget,
|
|
62
|
+
packRoot: p.packRoot ?? '',
|
|
63
|
+
symbols: p.symbols.map(s => ({
|
|
64
|
+
qualifiedName: s.qualifiedName,
|
|
65
|
+
kind: s.kind,
|
|
66
|
+
score: s.score,
|
|
67
|
+
provenance: s.provenance,
|
|
68
|
+
distance: s.distance,
|
|
69
|
+
})),
|
|
70
|
+
edges: p.edges.map(e => ({
|
|
71
|
+
source: e.source,
|
|
72
|
+
target: e.target,
|
|
73
|
+
edgeType: e.edgeType,
|
|
74
|
+
...(e.status ? { status: e.status } : {}),
|
|
75
|
+
})),
|
|
76
|
+
}, null, 2);
|
|
77
|
+
}
|
|
78
|
+
function doEncode(data) {
|
|
79
|
+
const p = payloadFromJSON(data);
|
|
80
|
+
process.stdout.write((0, encode_js_1.encode)(p));
|
|
81
|
+
}
|
|
82
|
+
function doDecode(data) {
|
|
83
|
+
const p = (0, decode_js_1.decode)(data);
|
|
84
|
+
console.log(payloadToJSON(p));
|
|
85
|
+
}
|
|
86
|
+
function doStats(data) {
|
|
87
|
+
const p = payloadFromJSON(data);
|
|
88
|
+
const gcfOutput = (0, encode_js_1.encode)(p);
|
|
89
|
+
const jsonTokens = Math.floor(data.trim().length / 4);
|
|
90
|
+
const gcfTokens = Math.floor(gcfOutput.trim().length / 4);
|
|
91
|
+
const savings = jsonTokens > 0 ? 100 * (1 - gcfTokens / jsonTokens) : 0;
|
|
92
|
+
const barWidth = 30;
|
|
93
|
+
const jsonBar = '█'.repeat(barWidth);
|
|
94
|
+
const gcfFilled = jsonTokens > 0 ? Math.round((gcfTokens * barWidth) / jsonTokens) : 0;
|
|
95
|
+
const gcfBar = '█'.repeat(gcfFilled) + '░'.repeat(barWidth - gcfFilled);
|
|
96
|
+
console.log(`Payload: ${p.symbols.length} symbols, ${p.edges.length} edges\n`);
|
|
97
|
+
console.log(` JSON ${jsonBar} ${jsonTokens} tokens`);
|
|
98
|
+
console.log(` GCF ${gcfBar} ${gcfTokens} tokens`);
|
|
99
|
+
console.log(`\n Savings: ${Math.round(savings)}% fewer tokens with GCF`);
|
|
100
|
+
}
|
|
101
|
+
const args = process.argv.slice(2);
|
|
102
|
+
const cmd = args[0];
|
|
103
|
+
switch (cmd) {
|
|
104
|
+
case 'encode':
|
|
105
|
+
doEncode(readInput(args.slice(1)));
|
|
106
|
+
break;
|
|
107
|
+
case 'decode':
|
|
108
|
+
doDecode(readInput(args.slice(1)));
|
|
109
|
+
break;
|
|
110
|
+
case 'encode-generic':
|
|
111
|
+
process.stdout.write((0, generic_js_1.encodeGeneric)(JSON.parse(readInput(args.slice(1)))));
|
|
112
|
+
break;
|
|
113
|
+
case 'decode-generic':
|
|
114
|
+
console.log(JSON.stringify((0, decode_generic_js_1.decodeGeneric)(readInput(args.slice(1))), null, 2));
|
|
115
|
+
break;
|
|
116
|
+
case 'stats':
|
|
117
|
+
doStats(readInput(args.slice(1)));
|
|
118
|
+
break;
|
|
119
|
+
case 'version':
|
|
120
|
+
console.log('gcf 0.1.0');
|
|
121
|
+
break;
|
|
122
|
+
case '-h':
|
|
123
|
+
case '--help':
|
|
124
|
+
case 'help':
|
|
125
|
+
process.stdout.write(USAGE);
|
|
126
|
+
break;
|
|
127
|
+
default:
|
|
128
|
+
if (!cmd) {
|
|
129
|
+
process.stderr.write(USAGE);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
process.stderr.write(`unknown command: ${cmd}\n\n`);
|
|
133
|
+
process.stderr.write(USAGE);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KindAbbrev maps full kind names to short GCF abbreviations.
|
|
3
|
+
*/
|
|
4
|
+
export declare const KIND_ABBREV: Record<string, string>;
|
|
5
|
+
/**
|
|
6
|
+
* KindExpand is the reverse of KindAbbrev: maps abbreviations back to full kind names.
|
|
7
|
+
*/
|
|
8
|
+
export declare const KIND_EXPAND: Record<string, string>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KIND_EXPAND = exports.KIND_ABBREV = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* KindAbbrev maps full kind names to short GCF abbreviations.
|
|
6
|
+
*/
|
|
7
|
+
exports.KIND_ABBREV = {
|
|
8
|
+
function: 'fn',
|
|
9
|
+
type: 'type',
|
|
10
|
+
method: 'method',
|
|
11
|
+
interface: 'iface',
|
|
12
|
+
var: 'var',
|
|
13
|
+
const: 'const',
|
|
14
|
+
resource: 'resource',
|
|
15
|
+
table: 'table',
|
|
16
|
+
class: 'class',
|
|
17
|
+
selector: 'selector',
|
|
18
|
+
field: 'field',
|
|
19
|
+
route_handler: 'route',
|
|
20
|
+
external: 'ext',
|
|
21
|
+
file: 'file',
|
|
22
|
+
package: 'pkg',
|
|
23
|
+
service: 'svc',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* KindExpand is the reverse of KindAbbrev: maps abbreviations back to full kind names.
|
|
27
|
+
*/
|
|
28
|
+
exports.KIND_EXPAND = {
|
|
29
|
+
fn: 'function',
|
|
30
|
+
type: 'type',
|
|
31
|
+
method: 'method',
|
|
32
|
+
iface: 'interface',
|
|
33
|
+
var: 'var',
|
|
34
|
+
const: 'const',
|
|
35
|
+
resource: 'resource',
|
|
36
|
+
table: 'table',
|
|
37
|
+
class: 'class',
|
|
38
|
+
selector: 'selector',
|
|
39
|
+
field: 'field',
|
|
40
|
+
route: 'route_handler',
|
|
41
|
+
ext: 'external',
|
|
42
|
+
file: 'file',
|
|
43
|
+
pkg: 'package',
|
|
44
|
+
svc: 'service',
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,WAAW,GAA2B;IACjD,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,OAAO;IAClB,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,OAAO;IACtB,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;GAEG;AACU,QAAA,WAAW,GAA2B;IACjD,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,eAAe;IACtB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;CACf,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decode = decode;
|
|
4
|
+
const constants_js_1 = require("./constants.js");
|
|
5
|
+
/**
|
|
6
|
+
* Decode parses GCF text back into a Payload.
|
|
7
|
+
*/
|
|
8
|
+
function decode(input) {
|
|
9
|
+
const lines = input.split('\n');
|
|
10
|
+
if (lines.length === 0) {
|
|
11
|
+
throw new Error('gcf: empty input');
|
|
12
|
+
}
|
|
13
|
+
const header = lines[0];
|
|
14
|
+
if (!header.startsWith('GCF ')) {
|
|
15
|
+
throw new Error(`gcf: invalid header, expected 'GCF ...' got "${header}"`);
|
|
16
|
+
}
|
|
17
|
+
const p = {
|
|
18
|
+
tool: '',
|
|
19
|
+
tokenBudget: 0,
|
|
20
|
+
tokensUsed: 0,
|
|
21
|
+
symbols: [],
|
|
22
|
+
edges: [],
|
|
23
|
+
};
|
|
24
|
+
// Parse header fields.
|
|
25
|
+
parseHeader(header.slice(4), p);
|
|
26
|
+
// v3.1: tool field is optional (SHOULD be present for MCP tool responses, not required).
|
|
27
|
+
// Detect delta mode.
|
|
28
|
+
const isDelta = header.includes(' delta=true');
|
|
29
|
+
const validDeltaSections = new Set(['removed', 'added', 'edges_removed', 'edges_added']);
|
|
30
|
+
// Parse body: symbols and edges.
|
|
31
|
+
const symbols = [];
|
|
32
|
+
const symByID = new Map();
|
|
33
|
+
let currentDistance = 0;
|
|
34
|
+
let inEdges = false;
|
|
35
|
+
for (let i = 1; i < lines.length; i++) {
|
|
36
|
+
let line = lines[i].replace(/\r$/, '');
|
|
37
|
+
if (line === '')
|
|
38
|
+
continue;
|
|
39
|
+
// Skip ##! summary trailer.
|
|
40
|
+
if (line.startsWith('##! '))
|
|
41
|
+
continue;
|
|
42
|
+
// Group header.
|
|
43
|
+
if (line.startsWith('## ')) {
|
|
44
|
+
let group = line.slice(3);
|
|
45
|
+
// Strip bracket suffix: "edges [200]" -> "edges"
|
|
46
|
+
const bracketIdx = group.indexOf(' [');
|
|
47
|
+
if (bracketIdx >= 0) {
|
|
48
|
+
group = group.slice(0, bracketIdx);
|
|
49
|
+
}
|
|
50
|
+
if (isDelta && !validDeltaSections.has(group)) {
|
|
51
|
+
throw new Error(`malformed_delta: invalid delta section "${group}"`);
|
|
52
|
+
}
|
|
53
|
+
inEdges = group === 'edges';
|
|
54
|
+
if (!inEdges) {
|
|
55
|
+
switch (group) {
|
|
56
|
+
case 'targets':
|
|
57
|
+
currentDistance = 0;
|
|
58
|
+
break;
|
|
59
|
+
case 'related':
|
|
60
|
+
currentDistance = 1;
|
|
61
|
+
break;
|
|
62
|
+
case 'extended':
|
|
63
|
+
currentDistance = 2;
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
if (group.startsWith('distance_')) {
|
|
67
|
+
const d = parseInt(group.slice(9), 10);
|
|
68
|
+
if (!isNaN(d)) {
|
|
69
|
+
currentDistance = d;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Comment.
|
|
78
|
+
if (line.startsWith('# ')) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (inEdges) {
|
|
82
|
+
const edge = parseEdgeLine(line, symByID);
|
|
83
|
+
p.edges.push(edge);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const { symbol, id } = parseSymbolLine(line, currentDistance);
|
|
87
|
+
symbols.push(symbol);
|
|
88
|
+
symByID.set(id, symbol);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
p.symbols = symbols;
|
|
92
|
+
return p;
|
|
93
|
+
}
|
|
94
|
+
function parseHeader(fields, p) {
|
|
95
|
+
const parts = fields.split(/\s+/);
|
|
96
|
+
for (const part of parts) {
|
|
97
|
+
const eqIdx = part.indexOf('=');
|
|
98
|
+
if (eqIdx < 0)
|
|
99
|
+
continue;
|
|
100
|
+
const key = part.slice(0, eqIdx);
|
|
101
|
+
const value = part.slice(eqIdx + 1);
|
|
102
|
+
switch (key) {
|
|
103
|
+
case 'tool':
|
|
104
|
+
p.tool = value;
|
|
105
|
+
break;
|
|
106
|
+
case 'budget': {
|
|
107
|
+
const v = parseInt(value, 10);
|
|
108
|
+
if (isNaN(v))
|
|
109
|
+
throw new Error(`gcf: invalid budget "${value}"`);
|
|
110
|
+
p.tokenBudget = v;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'tokens': {
|
|
114
|
+
const v = parseInt(value, 10);
|
|
115
|
+
if (isNaN(v))
|
|
116
|
+
throw new Error(`gcf: invalid tokens "${value}"`);
|
|
117
|
+
p.tokensUsed = v;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case 'pack_root':
|
|
121
|
+
p.packRoot = value;
|
|
122
|
+
break;
|
|
123
|
+
case 'symbols':
|
|
124
|
+
// Informational, reconstructed from parsed symbols.
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function parseSymbolLine(line, distance) {
|
|
130
|
+
if (!line.startsWith('@')) {
|
|
131
|
+
throw new Error(`gcf: expected symbol line starting with @, got "${line}"`);
|
|
132
|
+
}
|
|
133
|
+
const parts = line.split(/\s+/);
|
|
134
|
+
if (parts.length < 5) {
|
|
135
|
+
throw new Error(`invalid_node_line: symbol line needs at least 5 fields, got ${parts.length} in "${line}"`);
|
|
136
|
+
}
|
|
137
|
+
const idStr = parts[0].slice(1); // strip @
|
|
138
|
+
const id = parseInt(idStr, 10);
|
|
139
|
+
if (isNaN(id)) {
|
|
140
|
+
throw new Error(`invalid_symbol_id: invalid symbol id "${idStr}"`);
|
|
141
|
+
}
|
|
142
|
+
let kind = parts[1];
|
|
143
|
+
if (constants_js_1.KIND_EXPAND[kind]) {
|
|
144
|
+
kind = constants_js_1.KIND_EXPAND[kind];
|
|
145
|
+
}
|
|
146
|
+
const qname = parts[2];
|
|
147
|
+
const score = parseFloat(parts[3]);
|
|
148
|
+
if (isNaN(score)) {
|
|
149
|
+
throw new Error(`invalid_score: invalid score "${parts[3]}"`);
|
|
150
|
+
}
|
|
151
|
+
const provenance = parts[4];
|
|
152
|
+
return {
|
|
153
|
+
symbol: {
|
|
154
|
+
qualifiedName: qname,
|
|
155
|
+
kind,
|
|
156
|
+
score,
|
|
157
|
+
provenance,
|
|
158
|
+
distance,
|
|
159
|
+
},
|
|
160
|
+
id,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function parseEdgeLine(line, symByID) {
|
|
164
|
+
const parts = line.split(/\s+/);
|
|
165
|
+
if (parts.length < 2) {
|
|
166
|
+
throw new Error(`gcf: edge line needs at least 2 fields, got "${line}"`);
|
|
167
|
+
}
|
|
168
|
+
const ref = parts[0];
|
|
169
|
+
const ltIdx = ref.indexOf('<');
|
|
170
|
+
if (ltIdx < 0) {
|
|
171
|
+
throw new Error(`invalid_edge_syntax: edge line missing '<' separator in "${ref}"`);
|
|
172
|
+
}
|
|
173
|
+
const targetIDStr = ref.slice(1, ltIdx); // strip leading @
|
|
174
|
+
const sourceIDStr = ref.slice(ltIdx + 2); // strip <@
|
|
175
|
+
const targetID = parseInt(targetIDStr, 10);
|
|
176
|
+
if (isNaN(targetID)) {
|
|
177
|
+
throw new Error(`gcf: invalid target id "${targetIDStr}"`);
|
|
178
|
+
}
|
|
179
|
+
const sourceID = parseInt(sourceIDStr, 10);
|
|
180
|
+
if (isNaN(sourceID)) {
|
|
181
|
+
throw new Error(`gcf: invalid source id "${sourceIDStr}"`);
|
|
182
|
+
}
|
|
183
|
+
const targetSym = symByID.get(targetID);
|
|
184
|
+
const sourceSym = symByID.get(sourceID);
|
|
185
|
+
if (!targetSym || !sourceSym) {
|
|
186
|
+
throw new Error(`unknown_edge_reference: edge references unknown symbol id(s): target=${targetID} source=${sourceID}`);
|
|
187
|
+
}
|
|
188
|
+
const edgeType = parts[1];
|
|
189
|
+
const status = parts.length >= 3 ? parts[2] : undefined;
|
|
190
|
+
return {
|
|
191
|
+
source: sourceSym.qualifiedName,
|
|
192
|
+
target: targetSym.qualifiedName,
|
|
193
|
+
edgeType,
|
|
194
|
+
status,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":";;AAMA,wBAgGC;AArGD,iDAA6C;AAE7C;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,CAAC,GAAY;QACjB,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,uBAAuB;IACvB,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhC,yFAAyF;IAEzF,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;IAEzF,iCAAiC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAE1B,4BAA4B;QAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAEtC,gBAAgB;QAChB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,iDAAiD;YACjD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,GAAG,CAAC,CAAC;YACvE,CAAC;YAED,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,KAAK,EAAE,CAAC;oBACd,KAAK,SAAS;wBACZ,eAAe,GAAG,CAAC,CAAC;wBACpB,MAAM;oBACR,KAAK,SAAS;wBACZ,eAAe,GAAG,CAAC,CAAC;wBACpB,MAAM;oBACR,KAAK,UAAU;wBACb,eAAe,GAAG,CAAC,CAAC;wBACpB,MAAM;oBACR;wBACE,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;4BAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACvC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gCACd,eAAe,GAAG,CAAC,CAAC;4BACtB,CAAC;wBACH,CAAC;wBACD,MAAM;gBACV,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,WAAW;QACX,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,CAAU;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEpC,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,MAAM;gBACT,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;gBACf,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;gBAChE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;gBAClB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;gBAChE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,WAAW;gBACd,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS;gBACZ,oDAAoD;gBACpD,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,IAAY,EACZ,QAAgB;IAEhB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,+DAA+D,KAAK,CAAC,MAAM,QAAQ,IAAI,GAAG,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,0BAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,GAAG,0BAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,OAAO;QACL,MAAM,EAAE;YACN,aAAa,EAAE,KAAK;YACpB,IAAI;YACJ,KAAK;YACL,UAAU;YACV,QAAQ;SACT;QACD,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,OAA4B;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,4DAA4D,GAAG,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB;IAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW;IAErD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,wEAAwE,QAAQ,WAAW,QAAQ,EAAE,CACtG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,aAAa;QAC/B,MAAM,EAAE,SAAS,CAAC,aAAa;QAC/B,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC"}
|