@blackwell-systems/gcf 2.1.2 → 2.2.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/README.md +1 -1
- package/dist/cjs/index.cjs +189 -3
- package/dist/cli.js +0 -0
- package/dist/decode_generic.js +74 -0
- package/dist/decode_generic.js.map +1 -1
- package/dist/generic.js +162 -5
- package/dist/generic.js.map +1 -1
- package/package.json +2 -2
- package/src/decode_generic.ts +80 -0
- package/src/generic.ts +157 -5
- package/dist/cjs/browser.d.ts +0 -9
- package/dist/cjs/browser.js +0 -25
- package/dist/cjs/browser.js.map +0 -1
- package/dist/cjs/cli.d.ts +0 -5
- package/dist/cjs/cli.js +0 -136
- package/dist/cjs/cli.js.map +0 -1
- package/dist/cjs/constants.d.ts +0 -8
- package/dist/cjs/constants.js +0 -46
- package/dist/cjs/constants.js.map +0 -1
- package/dist/cjs/decode.d.ts +0 -5
- package/dist/cjs/decode.js +0 -197
- package/dist/cjs/decode.js.map +0 -1
- package/dist/cjs/decode_generic.d.ts +0 -4
- package/dist/cjs/decode_generic.js +0 -678
- package/dist/cjs/decode_generic.js.map +0 -1
- package/dist/cjs/delta.d.ts +0 -15
- package/dist/cjs/delta.js +0 -73
- package/dist/cjs/delta.js.map +0 -1
- package/dist/cjs/encode.d.ts +0 -5
- package/dist/cjs/encode.js +0 -89
- package/dist/cjs/encode.js.map +0 -1
- package/dist/cjs/generic.d.ts +0 -1
- package/dist/cjs/generic.js +0 -332
- package/dist/cjs/generic.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -11
- package/dist/cjs/index.js +0 -32
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/packroot.d.ts +0 -13
- package/dist/cjs/packroot.js +0 -50
- package/dist/cjs/packroot.js.map +0 -1
- package/dist/cjs/scalar.d.ts +0 -26
- package/dist/cjs/scalar.js +0 -339
- package/dist/cjs/scalar.js.map +0 -1
- package/dist/cjs/session.d.ts +0 -30
- package/dist/cjs/session.js +0 -140
- package/dist/cjs/session.js.map +0 -1
- package/dist/cjs/stream.d.ts +0 -66
- package/dist/cjs/stream.js +0 -127
- package/dist/cjs/stream.js.map +0 -1
- package/dist/cjs/stream_generic.d.ts +0 -37
- package/dist/cjs/stream_generic.js +0 -87
- package/dist/cjs/stream_generic.js.map +0 -1
- package/dist/cjs/types.d.ts +0 -75
- package/dist/cjs/types.js +0 -3
- package/dist/cjs/types.js.map +0 -1
package/dist/cjs/index.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
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.verifyDelta = exports.encodeDelta = exports.encodeWithSession = exports.Session = 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 session_js_1 = require("./session.js");
|
|
12
|
-
Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_js_1.Session; } });
|
|
13
|
-
Object.defineProperty(exports, "encodeWithSession", { enumerable: true, get: function () { return session_js_1.encodeWithSession; } });
|
|
14
|
-
var delta_js_1 = require("./delta.js");
|
|
15
|
-
Object.defineProperty(exports, "encodeDelta", { enumerable: true, get: function () { return delta_js_1.encodeDelta; } });
|
|
16
|
-
Object.defineProperty(exports, "verifyDelta", { enumerable: true, get: function () { return delta_js_1.verifyDelta; } });
|
|
17
|
-
// packRoot is Node-only (uses crypto.createHash). Import directly: import { packRoot } from '@blackwell-systems/gcf/dist/packroot.js'
|
|
18
|
-
var generic_js_1 = require("./generic.js");
|
|
19
|
-
Object.defineProperty(exports, "encodeGeneric", { enumerable: true, get: function () { return generic_js_1.encodeGeneric; } });
|
|
20
|
-
var decode_generic_js_1 = require("./decode_generic.js");
|
|
21
|
-
Object.defineProperty(exports, "decodeGeneric", { enumerable: true, get: function () { return decode_generic_js_1.decodeGeneric; } });
|
|
22
|
-
var scalar_js_1 = require("./scalar.js");
|
|
23
|
-
Object.defineProperty(exports, "formatScalar", { enumerable: true, get: function () { return scalar_js_1.formatScalar; } });
|
|
24
|
-
Object.defineProperty(exports, "formatKey", { enumerable: true, get: function () { return scalar_js_1.formatKey; } });
|
|
25
|
-
Object.defineProperty(exports, "parseScalar", { enumerable: true, get: function () { return scalar_js_1.parseScalar; } });
|
|
26
|
-
Object.defineProperty(exports, "needsQuote", { enumerable: true, get: function () { return scalar_js_1.needsQuote; } });
|
|
27
|
-
Object.defineProperty(exports, "quoteString", { enumerable: true, get: function () { return scalar_js_1.quoteString; } });
|
|
28
|
-
var stream_js_1 = require("./stream.js");
|
|
29
|
-
Object.defineProperty(exports, "StreamEncoder", { enumerable: true, get: function () { return stream_js_1.StreamEncoder; } });
|
|
30
|
-
var stream_generic_js_1 = require("./stream_generic.js");
|
|
31
|
-
Object.defineProperty(exports, "GenericStreamEncoder", { enumerable: true, get: function () { return stream_generic_js_1.GenericStreamEncoder; } });
|
|
32
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AACA,+CAA0D;AAAjD,2GAAA,WAAW,OAAA;AAAE,2GAAA,WAAW,OAAA;AACjC,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,2CAA0D;AAAjD,qGAAA,OAAO,OAAA;AAAE,+GAAA,iBAAiB,OAAA;AACnC,uCAAsD;AAA7C,uGAAA,WAAW,OAAA;AAAE,uGAAA,WAAW,OAAA;AACjC,sIAAsI;AACtI,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/packroot.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Symbol, Edge } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Compute a content-addressed PackRoot hash for a set of symbols and edges.
|
|
4
|
-
*
|
|
5
|
-
* Algorithm:
|
|
6
|
-
* 1. Build canonical symbol records: S\t{kind}\t{qname}\t{score}\t{provenance}\t{distance}\n
|
|
7
|
-
* 2. Build canonical edge records: E\t{srcKind}\t{source}\t{tgtKind}\t{target}\t{edgeType}\n
|
|
8
|
-
* 3. Sort both arrays independently by UTF-8 byte order
|
|
9
|
-
* 4. Concatenate: all symbols then all edges
|
|
10
|
-
* 5. SHA-256 hash
|
|
11
|
-
* 6. Return sha256:{hex}
|
|
12
|
-
*/
|
|
13
|
-
export declare function packRoot(symbols: Symbol[], edges: Edge[], symbolKinds?: Map<string, string>): string;
|
package/dist/cjs/packroot.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.packRoot = packRoot;
|
|
4
|
-
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const constants_js_1 = require("./constants.js");
|
|
6
|
-
const scalar_js_1 = require("./scalar.js");
|
|
7
|
-
/**
|
|
8
|
-
* Compute a content-addressed PackRoot hash for a set of symbols and edges.
|
|
9
|
-
*
|
|
10
|
-
* Algorithm:
|
|
11
|
-
* 1. Build canonical symbol records: S\t{kind}\t{qname}\t{score}\t{provenance}\t{distance}\n
|
|
12
|
-
* 2. Build canonical edge records: E\t{srcKind}\t{source}\t{tgtKind}\t{target}\t{edgeType}\n
|
|
13
|
-
* 3. Sort both arrays independently by UTF-8 byte order
|
|
14
|
-
* 4. Concatenate: all symbols then all edges
|
|
15
|
-
* 5. SHA-256 hash
|
|
16
|
-
* 6. Return sha256:{hex}
|
|
17
|
-
*/
|
|
18
|
-
function packRoot(symbols, edges, symbolKinds) {
|
|
19
|
-
const symRecords = [];
|
|
20
|
-
const edgeRecords = [];
|
|
21
|
-
// Build symbol records.
|
|
22
|
-
for (const s of symbols) {
|
|
23
|
-
const kind = constants_js_1.KIND_ABBREV[s.kind] || s.kind;
|
|
24
|
-
symRecords.push(`S\t${kind}\t${s.qualifiedName}\t${(0, scalar_js_1.formatNumber)(s.score)}\t${s.provenance}\t${s.distance}\n`);
|
|
25
|
-
}
|
|
26
|
-
// Build edge records.
|
|
27
|
-
// For edges, we need kind lookups for source and target.
|
|
28
|
-
// Build a map of qualifiedName -> kind from symbols.
|
|
29
|
-
const kindMap = symbolKinds ?? new Map();
|
|
30
|
-
if (!symbolKinds) {
|
|
31
|
-
for (const s of symbols) {
|
|
32
|
-
const kind = constants_js_1.KIND_ABBREV[s.kind] || s.kind;
|
|
33
|
-
kindMap.set(s.qualifiedName, kind);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
for (const e of edges) {
|
|
37
|
-
const srcKind = kindMap.get(e.source) || 'fn';
|
|
38
|
-
const tgtKind = kindMap.get(e.target) || 'fn';
|
|
39
|
-
edgeRecords.push(`E\t${srcKind}\t${e.source}\t${tgtKind}\t${e.target}\t${e.edgeType}\n`);
|
|
40
|
-
}
|
|
41
|
-
// Sort both arrays by UTF-8 byte order.
|
|
42
|
-
symRecords.sort();
|
|
43
|
-
edgeRecords.sort();
|
|
44
|
-
// Concatenate.
|
|
45
|
-
const data = symRecords.join('') + edgeRecords.join('');
|
|
46
|
-
// SHA-256 hash.
|
|
47
|
-
const hash = (0, node_crypto_1.createHash)('sha256').update(data, 'utf8').digest('hex');
|
|
48
|
-
return `sha256:${hash}`;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=packroot.js.map
|
package/dist/cjs/packroot.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packroot.js","sourceRoot":"","sources":["../../src/packroot.ts"],"names":[],"mappings":";;AAgBA,4BAqCC;AArDD,6CAAyC;AAEzC,iDAA6C;AAC7C,2CAA2C;AAE3C;;;;;;;;;;GAUG;AACH,SAAgB,QAAQ,CAAC,OAAiB,EAAE,KAAa,EAAE,WAAiC;IAC1F,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,wBAAwB;IACxB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,0BAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,aAAa,KAAK,IAAA,wBAAY,EAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;IAChH,CAAC;IAED,sBAAsB;IACtB,yDAAyD;IACzD,qDAAqD;IACrD,MAAM,OAAO,GAAG,WAAW,IAAI,IAAI,GAAG,EAAkB,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,0BAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC9C,WAAW,CAAC,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,wCAAwC;IACxC,UAAU,CAAC,IAAI,EAAE,CAAC;IAClB,WAAW,CAAC,IAAI,EAAE,CAAC;IAEnB,eAAe;IACf,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAExD,gBAAgB;IAChB,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1B,CAAC"}
|
package/dist/cjs/scalar.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Common scalar grammar for GCF.
|
|
3
|
-
* Shared between encoder, decoder, and streaming encoder.
|
|
4
|
-
*/
|
|
5
|
-
/** Check if a string value must be quoted per Section 2.4. */
|
|
6
|
-
export declare function needsQuote(s: string): boolean;
|
|
7
|
-
/** Produce a JSON-compatible quoted string. */
|
|
8
|
-
export declare function quoteString(s: string): string;
|
|
9
|
-
/** Format a JS value as a GCF scalar. delimiter is '|', ',', or 0. */
|
|
10
|
-
export declare function formatScalar(v: unknown, delimiter?: number): string;
|
|
11
|
-
/** Format a number per Section 2.3 canonical rules. */
|
|
12
|
-
export declare function formatNumber(f: number): string;
|
|
13
|
-
/** Check if a key is a valid bare key. */
|
|
14
|
-
export declare function isBareKey(s: string): boolean;
|
|
15
|
-
/** Format a key, quoting if necessary. */
|
|
16
|
-
export declare function formatKey(s: string): string;
|
|
17
|
-
/** Parse a GCF scalar token per Section 2.1 precedence. */
|
|
18
|
-
export declare function parseScalar(s: string, tabularContext: boolean): any;
|
|
19
|
-
export declare const MISSING: unique symbol;
|
|
20
|
-
export declare const ATTACHMENT: unique symbol;
|
|
21
|
-
/** Parse a JSON-compatible quoted string. */
|
|
22
|
-
export declare function parseQuotedString(s: string): string;
|
|
23
|
-
/** Split a string on a delimiter, respecting quoted strings. */
|
|
24
|
-
export declare function splitRespectingQuotes(s: string, delim: string): string[];
|
|
25
|
-
/** Split a field declaration like {id,"display name","a,b"}. */
|
|
26
|
-
export declare function splitFieldDecl(s: string): string[];
|
package/dist/cjs/scalar.js
DELETED
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Common scalar grammar for GCF.
|
|
4
|
-
* Shared between encoder, decoder, and streaming encoder.
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ATTACHMENT = exports.MISSING = void 0;
|
|
8
|
-
exports.needsQuote = needsQuote;
|
|
9
|
-
exports.quoteString = quoteString;
|
|
10
|
-
exports.formatScalar = formatScalar;
|
|
11
|
-
exports.formatNumber = formatNumber;
|
|
12
|
-
exports.isBareKey = isBareKey;
|
|
13
|
-
exports.formatKey = formatKey;
|
|
14
|
-
exports.parseScalar = parseScalar;
|
|
15
|
-
exports.parseQuotedString = parseQuotedString;
|
|
16
|
-
exports.splitRespectingQuotes = splitRespectingQuotes;
|
|
17
|
-
exports.splitFieldDecl = splitFieldDecl;
|
|
18
|
-
const JSON_NUMBER_RE = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
|
|
19
|
-
const NUMERIC_LIKE_RE = /^[+-]\.?\d|^\.\d|^0\d/;
|
|
20
|
-
/** Check if a string value must be quoted per Section 2.4. */
|
|
21
|
-
function needsQuote(s) {
|
|
22
|
-
if (s === '')
|
|
23
|
-
return true;
|
|
24
|
-
if (s === '-' || s === '~' || s === '^' || s === 'true' || s === 'false')
|
|
25
|
-
return true;
|
|
26
|
-
if (JSON_NUMBER_RE.test(s))
|
|
27
|
-
return true;
|
|
28
|
-
if (NUMERIC_LIKE_RE.test(s))
|
|
29
|
-
return true;
|
|
30
|
-
if (s[0] === ' ' || s[s.length - 1] === ' ')
|
|
31
|
-
return true;
|
|
32
|
-
if (s[0] === '#' || s[0] === '@' || s[0] === '.')
|
|
33
|
-
return true;
|
|
34
|
-
for (let i = 0; i < s.length; i++) {
|
|
35
|
-
const c = s.charCodeAt(i);
|
|
36
|
-
if (c === 0x22 || c === 0x5c || c < 0x20 || c === 0x0a || c === 0x0d ||
|
|
37
|
-
c === 0x7c || c === 0x2c)
|
|
38
|
-
return true; // " \ control \n \r | ,
|
|
39
|
-
// C1 control characters
|
|
40
|
-
if (c >= 0x80 && c <= 0x9f)
|
|
41
|
-
return true;
|
|
42
|
-
// Unicode whitespace beyond ASCII
|
|
43
|
-
if (c > 0x7f && (c === 0xa0 || c === 0x2028 || c === 0x2029 || c === 0xfeff ||
|
|
44
|
-
c === 0x1680 || (c >= 0x2000 && c <= 0x200a) || c === 0x202f ||
|
|
45
|
-
c === 0x205f || c === 0x3000))
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
/** Produce a JSON-compatible quoted string. */
|
|
51
|
-
function quoteString(s) {
|
|
52
|
-
let out = '"';
|
|
53
|
-
for (let i = 0; i < s.length; i++) {
|
|
54
|
-
const c = s.charCodeAt(i);
|
|
55
|
-
switch (c) {
|
|
56
|
-
case 0x22:
|
|
57
|
-
out += '\\"';
|
|
58
|
-
break;
|
|
59
|
-
case 0x5c:
|
|
60
|
-
out += '\\\\';
|
|
61
|
-
break;
|
|
62
|
-
case 0x08:
|
|
63
|
-
out += '\\b';
|
|
64
|
-
break;
|
|
65
|
-
case 0x0c:
|
|
66
|
-
out += '\\f';
|
|
67
|
-
break;
|
|
68
|
-
case 0x0a:
|
|
69
|
-
out += '\\n';
|
|
70
|
-
break;
|
|
71
|
-
case 0x0d:
|
|
72
|
-
out += '\\r';
|
|
73
|
-
break;
|
|
74
|
-
case 0x09:
|
|
75
|
-
out += '\\t';
|
|
76
|
-
break;
|
|
77
|
-
default:
|
|
78
|
-
if (c < 0x20) {
|
|
79
|
-
out += '\\u' + c.toString(16).padStart(4, '0');
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
out += s[i];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return out + '"';
|
|
87
|
-
}
|
|
88
|
-
/** Format a JS value as a GCF scalar. delimiter is '|', ',', or 0. */
|
|
89
|
-
function formatScalar(v, delimiter = 0) {
|
|
90
|
-
if (v === null || v === undefined)
|
|
91
|
-
return '-';
|
|
92
|
-
if (typeof v === 'boolean')
|
|
93
|
-
return v ? 'true' : 'false';
|
|
94
|
-
if (typeof v === 'number')
|
|
95
|
-
return formatNumber(v);
|
|
96
|
-
const s = String(v);
|
|
97
|
-
if (needsQuote(s) || (delimiter && s.includes(String.fromCharCode(delimiter)))) {
|
|
98
|
-
return quoteString(s);
|
|
99
|
-
}
|
|
100
|
-
return s;
|
|
101
|
-
}
|
|
102
|
-
/** Format a number per Section 2.3 canonical rules. */
|
|
103
|
-
function formatNumber(f) {
|
|
104
|
-
if (Object.is(f, -0))
|
|
105
|
-
return '-0';
|
|
106
|
-
if (f === 0)
|
|
107
|
-
return '0';
|
|
108
|
-
const abs = Math.abs(f);
|
|
109
|
-
if (abs >= 1e-6 && abs < 1e21) {
|
|
110
|
-
return toPreciseDecimal(f);
|
|
111
|
-
}
|
|
112
|
-
// Exponent notation.
|
|
113
|
-
let s = f.toExponential();
|
|
114
|
-
// Normalize: lowercase e, no leading zeros in exponent.
|
|
115
|
-
s = s.replace(/[eE]\+?0*(\d)/, 'e+$1').replace(/[eE]-0*(\d)/, 'e-$1');
|
|
116
|
-
return s;
|
|
117
|
-
}
|
|
118
|
-
function toPreciseDecimal(f) {
|
|
119
|
-
// String(f) produces the shortest representation that round-trips through parseFloat.
|
|
120
|
-
return String(f);
|
|
121
|
-
}
|
|
122
|
-
const BARE_KEY_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
123
|
-
/** Check if a key is a valid bare key. */
|
|
124
|
-
function isBareKey(s) {
|
|
125
|
-
return BARE_KEY_RE.test(s);
|
|
126
|
-
}
|
|
127
|
-
/** Format a key, quoting if necessary. */
|
|
128
|
-
function formatKey(s) {
|
|
129
|
-
return isBareKey(s) ? s : quoteString(s);
|
|
130
|
-
}
|
|
131
|
-
// --- Decoder scalar parsing ---
|
|
132
|
-
/** Parse a GCF scalar token per Section 2.1 precedence. */
|
|
133
|
-
function parseScalar(s, tabularContext) {
|
|
134
|
-
if (s === '')
|
|
135
|
-
return '';
|
|
136
|
-
// 1. Quoted string.
|
|
137
|
-
if (s[0] === '"')
|
|
138
|
-
return parseQuotedString(s);
|
|
139
|
-
// 2. Null.
|
|
140
|
-
if (s === '-')
|
|
141
|
-
return null;
|
|
142
|
-
// 3. Missing (tabular only).
|
|
143
|
-
if (s === '~') {
|
|
144
|
-
if (!tabularContext)
|
|
145
|
-
throw new Error('invalid_missing: ~ outside tabular row cell');
|
|
146
|
-
return exports.MISSING;
|
|
147
|
-
}
|
|
148
|
-
// 4. Attachment (tabular only). Plain ^ or ^{fields} (inline schema).
|
|
149
|
-
if (s === '^' || (s.startsWith('^{') && s.endsWith('}'))) {
|
|
150
|
-
if (!tabularContext)
|
|
151
|
-
throw new Error('invalid_attachment_marker: ^ outside tabular row cell');
|
|
152
|
-
if (s === '^')
|
|
153
|
-
return exports.ATTACHMENT;
|
|
154
|
-
// Inline schema: return the schema string for the caller to parse.
|
|
155
|
-
return { __inlineSchema: s.slice(1) }; // e.g. "{name,email,tier}"
|
|
156
|
-
}
|
|
157
|
-
// 5. Boolean.
|
|
158
|
-
if (s === 'true')
|
|
159
|
-
return true;
|
|
160
|
-
if (s === 'false')
|
|
161
|
-
return false;
|
|
162
|
-
// 6. Number.
|
|
163
|
-
if (JSON_NUMBER_RE.test(s)) {
|
|
164
|
-
const f = Number(s);
|
|
165
|
-
if (!isNaN(f))
|
|
166
|
-
return f;
|
|
167
|
-
}
|
|
168
|
-
// 7. Bare string.
|
|
169
|
-
return s;
|
|
170
|
-
}
|
|
171
|
-
exports.MISSING = Symbol('missing');
|
|
172
|
-
exports.ATTACHMENT = Symbol('attachment');
|
|
173
|
-
/** Parse a JSON-compatible quoted string. */
|
|
174
|
-
function parseQuotedString(s) {
|
|
175
|
-
if (s.length < 2 || s[0] !== '"')
|
|
176
|
-
throw new Error('unterminated_quote');
|
|
177
|
-
let out = '';
|
|
178
|
-
let i = 1;
|
|
179
|
-
while (i < s.length) {
|
|
180
|
-
if (s[i] === '"') {
|
|
181
|
-
if (i + 1 !== s.length)
|
|
182
|
-
throw new Error('trailing_characters: after closing quote');
|
|
183
|
-
return out;
|
|
184
|
-
}
|
|
185
|
-
if (s[i] === '\\') {
|
|
186
|
-
if (i + 1 >= s.length)
|
|
187
|
-
throw new Error('unterminated_quote');
|
|
188
|
-
i++;
|
|
189
|
-
switch (s[i]) {
|
|
190
|
-
case '"':
|
|
191
|
-
out += '"';
|
|
192
|
-
break;
|
|
193
|
-
case '\\':
|
|
194
|
-
out += '\\';
|
|
195
|
-
break;
|
|
196
|
-
case '/':
|
|
197
|
-
out += '/';
|
|
198
|
-
break;
|
|
199
|
-
case 'b':
|
|
200
|
-
out += '\b';
|
|
201
|
-
break;
|
|
202
|
-
case 'f':
|
|
203
|
-
out += '\f';
|
|
204
|
-
break;
|
|
205
|
-
case 'n':
|
|
206
|
-
out += '\n';
|
|
207
|
-
break;
|
|
208
|
-
case 'r':
|
|
209
|
-
out += '\r';
|
|
210
|
-
break;
|
|
211
|
-
case 't':
|
|
212
|
-
out += '\t';
|
|
213
|
-
break;
|
|
214
|
-
case 'u': {
|
|
215
|
-
if (i + 4 >= s.length)
|
|
216
|
-
throw new Error('invalid_escape: incomplete unicode');
|
|
217
|
-
const hex = s.slice(i + 1, i + 5);
|
|
218
|
-
const code = parseInt(hex, 16);
|
|
219
|
-
if (isNaN(code))
|
|
220
|
-
throw new Error(`invalid_escape: invalid unicode \\u${hex}`);
|
|
221
|
-
// Surrogate pair handling.
|
|
222
|
-
if (code >= 0xd800 && code <= 0xdbff) {
|
|
223
|
-
if (i + 10 >= s.length || s[i + 5] !== '\\' || s[i + 6] !== 'u') {
|
|
224
|
-
throw new Error('invalid_surrogate: isolated high surrogate');
|
|
225
|
-
}
|
|
226
|
-
const hex2 = s.slice(i + 7, i + 11);
|
|
227
|
-
const low = parseInt(hex2, 16);
|
|
228
|
-
if (isNaN(low) || low < 0xdc00 || low > 0xdfff) {
|
|
229
|
-
throw new Error('invalid_surrogate: invalid low surrogate');
|
|
230
|
-
}
|
|
231
|
-
out += String.fromCodePoint(0x10000 + (code - 0xd800) * 0x400 + (low - 0xdc00));
|
|
232
|
-
i += 11;
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
if (code >= 0xdc00 && code <= 0xdfff) {
|
|
236
|
-
throw new Error('invalid_surrogate: isolated low surrogate');
|
|
237
|
-
}
|
|
238
|
-
out += String.fromCharCode(code);
|
|
239
|
-
i += 5;
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
default: throw new Error(`invalid_escape: unknown \\${s[i]}`);
|
|
243
|
-
}
|
|
244
|
-
i++;
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
if (s.charCodeAt(i) < 0x20) {
|
|
248
|
-
throw new Error(`invalid_escape: unescaped control U+${s.charCodeAt(i).toString(16).padStart(4, '0')}`);
|
|
249
|
-
}
|
|
250
|
-
out += s[i];
|
|
251
|
-
i++;
|
|
252
|
-
}
|
|
253
|
-
throw new Error('unterminated_quote');
|
|
254
|
-
}
|
|
255
|
-
/** Split a string on a delimiter, respecting quoted strings. */
|
|
256
|
-
function splitRespectingQuotes(s, delim) {
|
|
257
|
-
const parts = [];
|
|
258
|
-
let current = '';
|
|
259
|
-
let inQuote = false;
|
|
260
|
-
let escaped = false;
|
|
261
|
-
for (let i = 0; i < s.length; i++) {
|
|
262
|
-
if (escaped) {
|
|
263
|
-
current += s[i];
|
|
264
|
-
escaped = false;
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
if (s[i] === '\\' && inQuote) {
|
|
268
|
-
current += s[i];
|
|
269
|
-
escaped = true;
|
|
270
|
-
continue;
|
|
271
|
-
}
|
|
272
|
-
if (s[i] === '"') {
|
|
273
|
-
inQuote = !inQuote;
|
|
274
|
-
current += s[i];
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
if (s[i] === delim && !inQuote) {
|
|
278
|
-
parts.push(current);
|
|
279
|
-
current = '';
|
|
280
|
-
continue;
|
|
281
|
-
}
|
|
282
|
-
current += s[i];
|
|
283
|
-
}
|
|
284
|
-
parts.push(current);
|
|
285
|
-
return parts;
|
|
286
|
-
}
|
|
287
|
-
/** Split a field declaration like {id,"display name","a,b"}. */
|
|
288
|
-
function splitFieldDecl(s) {
|
|
289
|
-
if (s.length < 2 || s[0] !== '{')
|
|
290
|
-
throw new Error('invalid field declaration');
|
|
291
|
-
const closeIdx = findClosingBrace(s);
|
|
292
|
-
if (closeIdx < 0)
|
|
293
|
-
throw new Error('invalid field declaration');
|
|
294
|
-
const inner = s.slice(1, closeIdx);
|
|
295
|
-
if (!inner)
|
|
296
|
-
return [];
|
|
297
|
-
const raw = splitRespectingQuotes(inner, ',');
|
|
298
|
-
const fields = [];
|
|
299
|
-
const seen = new Set();
|
|
300
|
-
for (const f of raw) {
|
|
301
|
-
const trimmed = f.trim();
|
|
302
|
-
let name;
|
|
303
|
-
if (trimmed.length >= 2 && trimmed[0] === '"' && trimmed[trimmed.length - 1] === '"') {
|
|
304
|
-
name = parseQuotedString(trimmed);
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
if (!isBareKey(trimmed))
|
|
308
|
-
throw new Error(`invalid field name: ${trimmed}`);
|
|
309
|
-
name = trimmed;
|
|
310
|
-
}
|
|
311
|
-
if (seen.has(name))
|
|
312
|
-
throw new Error(`duplicate_field_name: ${name}`);
|
|
313
|
-
seen.add(name);
|
|
314
|
-
fields.push(name);
|
|
315
|
-
}
|
|
316
|
-
return fields;
|
|
317
|
-
}
|
|
318
|
-
function findClosingBrace(s) {
|
|
319
|
-
let inQuote = false;
|
|
320
|
-
let escaped = false;
|
|
321
|
-
for (let i = 0; i < s.length; i++) {
|
|
322
|
-
if (escaped) {
|
|
323
|
-
escaped = false;
|
|
324
|
-
continue;
|
|
325
|
-
}
|
|
326
|
-
if (s[i] === '\\' && inQuote) {
|
|
327
|
-
escaped = true;
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
|
-
if (s[i] === '"') {
|
|
331
|
-
inQuote = !inQuote;
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
if (s[i] === '}' && !inQuote)
|
|
335
|
-
return i;
|
|
336
|
-
}
|
|
337
|
-
return -1;
|
|
338
|
-
}
|
|
339
|
-
//# sourceMappingURL=scalar.js.map
|
package/dist/cjs/scalar.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scalar.js","sourceRoot":"","sources":["../../src/scalar.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/session.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Payload, Symbol } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Session tracks symbols that have been transmitted to a client, enabling
|
|
4
|
-
* subsequent responses to reference them by ID without full retransmission.
|
|
5
|
-
* This makes multi-call workflows progressively cheaper.
|
|
6
|
-
*/
|
|
7
|
-
export declare class Session {
|
|
8
|
-
private symbols;
|
|
9
|
-
private nextID;
|
|
10
|
-
/** Returns true if the symbol has been sent in a previous response. */
|
|
11
|
-
transmitted(qname: string): boolean;
|
|
12
|
-
/** Returns the session-global ID for a previously transmitted symbol, or -1 if not found. */
|
|
13
|
-
getID(qname: string): number;
|
|
14
|
-
/**
|
|
15
|
-
* Record marks symbols as transmitted and assigns session-global IDs.
|
|
16
|
-
* Call this after a successful encode to register newly-sent symbols.
|
|
17
|
-
*/
|
|
18
|
-
record(symbols: Symbol[]): void;
|
|
19
|
-
/** Returns the number of symbols tracked in this session. */
|
|
20
|
-
size(): number;
|
|
21
|
-
/** Clears the session state. */
|
|
22
|
-
reset(): void;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Encode a payload using GCF with session deduplication.
|
|
26
|
-
* Symbols that were already transmitted in prior responses are emitted as
|
|
27
|
-
* bare references (`@N # previously transmitted`) instead of full declarations.
|
|
28
|
-
* After encoding, newly-sent symbols are recorded in the session.
|
|
29
|
-
*/
|
|
30
|
-
export declare function encodeWithSession(p: Payload, sess: Session | null): string;
|
package/dist/cjs/session.js
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Session = void 0;
|
|
4
|
-
exports.encodeWithSession = encodeWithSession;
|
|
5
|
-
const constants_js_1 = require("./constants.js");
|
|
6
|
-
const encode_js_1 = require("./encode.js");
|
|
7
|
-
/**
|
|
8
|
-
* Session tracks symbols that have been transmitted to a client, enabling
|
|
9
|
-
* subsequent responses to reference them by ID without full retransmission.
|
|
10
|
-
* This makes multi-call workflows progressively cheaper.
|
|
11
|
-
*/
|
|
12
|
-
class Session {
|
|
13
|
-
symbols = new Map();
|
|
14
|
-
nextID = 0;
|
|
15
|
-
/** Returns true if the symbol has been sent in a previous response. */
|
|
16
|
-
transmitted(qname) {
|
|
17
|
-
return this.symbols.has(qname);
|
|
18
|
-
}
|
|
19
|
-
/** Returns the session-global ID for a previously transmitted symbol, or -1 if not found. */
|
|
20
|
-
getID(qname) {
|
|
21
|
-
const id = this.symbols.get(qname);
|
|
22
|
-
return id !== undefined ? id : -1;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Record marks symbols as transmitted and assigns session-global IDs.
|
|
26
|
-
* Call this after a successful encode to register newly-sent symbols.
|
|
27
|
-
*/
|
|
28
|
-
record(symbols) {
|
|
29
|
-
for (const sym of symbols) {
|
|
30
|
-
if (!this.symbols.has(sym.qualifiedName)) {
|
|
31
|
-
this.symbols.set(sym.qualifiedName, this.nextID);
|
|
32
|
-
this.nextID++;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/** Returns the number of symbols tracked in this session. */
|
|
37
|
-
size() {
|
|
38
|
-
return this.symbols.size;
|
|
39
|
-
}
|
|
40
|
-
/** Clears the session state. */
|
|
41
|
-
reset() {
|
|
42
|
-
this.symbols.clear();
|
|
43
|
-
this.nextID = 0;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.Session = Session;
|
|
47
|
-
function groupByDistance(symbols) {
|
|
48
|
-
if (symbols.length === 0)
|
|
49
|
-
return [];
|
|
50
|
-
const groups = [];
|
|
51
|
-
let current = null;
|
|
52
|
-
for (const s of symbols) {
|
|
53
|
-
if (current === null || current.distance !== s.distance) {
|
|
54
|
-
current = { distance: s.distance, symbols: [] };
|
|
55
|
-
groups.push(current);
|
|
56
|
-
}
|
|
57
|
-
current.symbols.push(s);
|
|
58
|
-
}
|
|
59
|
-
return groups;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Encode a payload using GCF with session deduplication.
|
|
63
|
-
* Symbols that were already transmitted in prior responses are emitted as
|
|
64
|
-
* bare references (`@N # previously transmitted`) instead of full declarations.
|
|
65
|
-
* After encoding, newly-sent symbols are recorded in the session.
|
|
66
|
-
*/
|
|
67
|
-
function encodeWithSession(p, sess) {
|
|
68
|
-
if (!sess) {
|
|
69
|
-
return (0, encode_js_1.encode)(p);
|
|
70
|
-
}
|
|
71
|
-
const lines = [];
|
|
72
|
-
// Header with session=true marker.
|
|
73
|
-
let header = `GCF profile=graph tool=${p.tool}`;
|
|
74
|
-
if (p.tokenBudget)
|
|
75
|
-
header += ` budget=${p.tokenBudget}`;
|
|
76
|
-
if (p.tokensUsed)
|
|
77
|
-
header += ` tokens=${p.tokensUsed}`;
|
|
78
|
-
header += ` symbols=${p.symbols.length}`;
|
|
79
|
-
if (p.edges.length > 0)
|
|
80
|
-
header += ` edges=${p.edges.length}`;
|
|
81
|
-
header += ' session=true';
|
|
82
|
-
if (p.packRoot) {
|
|
83
|
-
header += ` pack_root=${p.packRoot}`;
|
|
84
|
-
}
|
|
85
|
-
lines.push(header);
|
|
86
|
-
// Build local ID mapping for this response.
|
|
87
|
-
const localIndex = new Map();
|
|
88
|
-
for (let i = 0; i < p.symbols.length; i++) {
|
|
89
|
-
localIndex.set(p.symbols[i].qualifiedName, i);
|
|
90
|
-
}
|
|
91
|
-
// Track which symbols are new for recording after encode.
|
|
92
|
-
const newSymbols = [];
|
|
93
|
-
// Group by distance.
|
|
94
|
-
const groups = groupByDistance(p.symbols);
|
|
95
|
-
const groupNames = ['targets', 'related', 'extended'];
|
|
96
|
-
for (const g of groups) {
|
|
97
|
-
if (g.symbols.length === 0)
|
|
98
|
-
continue;
|
|
99
|
-
let name;
|
|
100
|
-
if (g.distance < groupNames.length) {
|
|
101
|
-
name = groupNames[g.distance];
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
name = `distance_${g.distance}`;
|
|
105
|
-
}
|
|
106
|
-
lines.push(`## ${name}`);
|
|
107
|
-
for (const s of g.symbols) {
|
|
108
|
-
const idx = localIndex.get(s.qualifiedName);
|
|
109
|
-
if (sess.transmitted(s.qualifiedName)) {
|
|
110
|
-
// Bare reference: symbol was sent in a prior response.
|
|
111
|
-
lines.push(`@${idx} # previously transmitted`);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
// Full declaration.
|
|
115
|
-
const kind = constants_js_1.KIND_ABBREV[s.kind] || s.kind;
|
|
116
|
-
lines.push(`@${idx} ${kind} ${s.qualifiedName} ${s.score.toFixed(2)} ${s.provenance}`);
|
|
117
|
-
newSymbols.push(s);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Edges section.
|
|
122
|
-
if (p.edges.length > 0) {
|
|
123
|
-
lines.push(`## edges [${p.edges.length}]`);
|
|
124
|
-
for (const e of p.edges) {
|
|
125
|
-
const srcIdx = localIndex.get(e.source);
|
|
126
|
-
const tgtIdx = localIndex.get(e.target);
|
|
127
|
-
if (srcIdx === undefined || tgtIdx === undefined)
|
|
128
|
-
continue;
|
|
129
|
-
let line = `@${tgtIdx}<@${srcIdx} ${e.edgeType}`;
|
|
130
|
-
if (e.status && e.status !== 'unchanged') {
|
|
131
|
-
line += ` ${e.status}`;
|
|
132
|
-
}
|
|
133
|
-
lines.push(line);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Record all new symbols in the session.
|
|
137
|
-
sess.record(newSymbols);
|
|
138
|
-
return lines.join('\n') + '\n';
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=session.js.map
|