@blackwell-systems/gcf 2.1.0 → 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.
Files changed (49) hide show
  1. package/README.md +20 -20
  2. package/dist/cjs/browser.d.ts +9 -0
  3. package/dist/cjs/browser.js +25 -0
  4. package/dist/cjs/browser.js.map +1 -0
  5. package/dist/cjs/cli.d.ts +5 -0
  6. package/dist/cjs/cli.js +136 -0
  7. package/dist/cjs/cli.js.map +1 -0
  8. package/dist/cjs/constants.d.ts +8 -0
  9. package/dist/cjs/constants.js +46 -0
  10. package/dist/cjs/constants.js.map +1 -0
  11. package/dist/cjs/decode.d.ts +5 -0
  12. package/dist/cjs/decode.js +197 -0
  13. package/dist/cjs/decode.js.map +1 -0
  14. package/dist/cjs/decode_generic.d.ts +4 -0
  15. package/dist/cjs/decode_generic.js +678 -0
  16. package/dist/cjs/decode_generic.js.map +1 -0
  17. package/dist/cjs/delta.d.ts +15 -0
  18. package/dist/cjs/delta.js +73 -0
  19. package/dist/cjs/delta.js.map +1 -0
  20. package/dist/cjs/encode.d.ts +5 -0
  21. package/dist/cjs/encode.js +89 -0
  22. package/dist/cjs/encode.js.map +1 -0
  23. package/dist/cjs/generic.d.ts +1 -0
  24. package/dist/cjs/generic.js +332 -0
  25. package/dist/cjs/generic.js.map +1 -0
  26. package/dist/cjs/index.cjs +1841 -0
  27. package/dist/cjs/index.d.ts +11 -0
  28. package/dist/cjs/index.js +32 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/packroot.d.ts +13 -0
  31. package/dist/cjs/packroot.js +50 -0
  32. package/dist/cjs/packroot.js.map +1 -0
  33. package/dist/cjs/scalar.d.ts +26 -0
  34. package/dist/cjs/scalar.js +339 -0
  35. package/dist/cjs/scalar.js.map +1 -0
  36. package/dist/cjs/session.d.ts +30 -0
  37. package/dist/cjs/session.js +140 -0
  38. package/dist/cjs/session.js.map +1 -0
  39. package/dist/cjs/stream.d.ts +66 -0
  40. package/dist/cjs/stream.js +127 -0
  41. package/dist/cjs/stream.js.map +1 -0
  42. package/dist/cjs/stream_generic.d.ts +37 -0
  43. package/dist/cjs/stream_generic.js +87 -0
  44. package/dist/cjs/stream_generic.js.map +1 -0
  45. package/dist/cjs/types.d.ts +75 -0
  46. package/dist/cjs/types.js +3 -0
  47. package/dist/cjs/types.js.map +1 -0
  48. package/dist/cli.js +0 -0
  49. package/package.json +5 -4
@@ -0,0 +1,140 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":";;;AA0EA,8CA6EC;AAtJD,iDAA6C;AAC7C,2CAAqC;AAErC;;;;GAIG;AACH,MAAa,OAAO;IACV,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,MAAM,GAAW,CAAC,CAAC;IAE3B,uEAAuE;IACvE,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,6FAA6F;IAC7F,KAAK,CAAC,KAAa;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAiB;QACtB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,gCAAgC;IAChC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;CACF;AAtCD,0BAsCC;AAOD,SAAS,eAAe,CAAC,OAAiB;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxD,OAAO,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,CAAU,EAAE,IAAoB;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAA,kBAAM,EAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,mCAAmC;IACnC,IAAI,MAAM,GAAG,0BAA0B,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,CAAC,WAAW;QAAE,MAAM,IAAI,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,CAAC,UAAU;QAAE,MAAM,IAAI,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;IACtD,MAAM,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7D,MAAM,IAAI,eAAe,CAAC;IAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,4CAA4C;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,qBAAqB;IACrB,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAEtD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAErC,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAEzB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;gBACtC,uDAAuD;gBACvD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,MAAM,IAAI,GAAG,0BAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;gBACvF,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;gBAAE,SAAS;YAE3D,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACjD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACzC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import type { Symbol, Edge } from './types.js';
2
+ /**
3
+ * Options for the streaming encoder.
4
+ */
5
+ export interface StreamOptions {
6
+ tokenBudget?: number;
7
+ tokensUsed?: number;
8
+ packRoot?: string;
9
+ session?: boolean;
10
+ }
11
+ /**
12
+ * A writable sink for streaming output. Accepts string chunks.
13
+ * Compatible with Node.js streams, web WritableStreams, or simple callbacks.
14
+ */
15
+ export interface StreamWriter {
16
+ write(chunk: string): void;
17
+ }
18
+ /**
19
+ * StreamEncoder writes GCF output incrementally as symbols and edges arrive.
20
+ * Zero buffering: each symbol/edge is written immediately. A trailer summary
21
+ * is emitted on close() with the final counts.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const chunks: string[] = [];
26
+ * const enc = new StreamEncoder({ write: (s) => chunks.push(s) }, 'context_for_task', { tokenBudget: 5000 });
27
+ * enc.writeSymbol({ qualifiedName: 'pkg.Auth', kind: 'function', score: 0.95, provenance: 'lsp', distance: 0 });
28
+ * enc.writeEdge({ source: 'pkg.Server', target: 'pkg.Auth', edgeType: 'calls' });
29
+ * enc.close();
30
+ * ```
31
+ */
32
+ export declare class StreamEncoder {
33
+ private w;
34
+ private symIndex;
35
+ private nextID;
36
+ private currentGroup;
37
+ private groupCounts;
38
+ private edgeCount;
39
+ private edgesStarted;
40
+ constructor(w: StreamWriter, tool: string, opts?: StreamOptions);
41
+ private writeHeader;
42
+ /**
43
+ * Emit a symbol line immediately. Group headers are emitted automatically
44
+ * when the distance changes.
45
+ */
46
+ writeSymbol(s: Symbol): void;
47
+ /**
48
+ * Emit an edge line immediately. The edges section header is emitted
49
+ * automatically on the first edge (with [?] deferred count).
50
+ * Source and target must reference previously-written symbols.
51
+ */
52
+ writeEdge(e: Edge): void;
53
+ /**
54
+ * Emit a bare reference for a previously-transmitted symbol (session mode).
55
+ */
56
+ writeBareRef(qname: string, distance: number): void;
57
+ /**
58
+ * Emit the ##! summary trailer with final counts. Must be called after all
59
+ * symbols and edges have been written.
60
+ */
61
+ close(): void;
62
+ /** Number of symbols written so far. */
63
+ get symbolCount(): number;
64
+ /** Number of edges written so far. */
65
+ get edgeCount_(): number;
66
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamEncoder = void 0;
4
+ const constants_js_1 = require("./constants.js");
5
+ /**
6
+ * StreamEncoder writes GCF output incrementally as symbols and edges arrive.
7
+ * Zero buffering: each symbol/edge is written immediately. A trailer summary
8
+ * is emitted on close() with the final counts.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const chunks: string[] = [];
13
+ * const enc = new StreamEncoder({ write: (s) => chunks.push(s) }, 'context_for_task', { tokenBudget: 5000 });
14
+ * enc.writeSymbol({ qualifiedName: 'pkg.Auth', kind: 'function', score: 0.95, provenance: 'lsp', distance: 0 });
15
+ * enc.writeEdge({ source: 'pkg.Server', target: 'pkg.Auth', edgeType: 'calls' });
16
+ * enc.close();
17
+ * ```
18
+ */
19
+ class StreamEncoder {
20
+ w;
21
+ symIndex = new Map();
22
+ nextID = 0;
23
+ currentGroup = '';
24
+ groupCounts = new Map();
25
+ edgeCount = 0;
26
+ edgesStarted = false;
27
+ constructor(w, tool, opts = {}) {
28
+ this.w = w;
29
+ this.writeHeader(tool, opts);
30
+ }
31
+ writeHeader(tool, opts) {
32
+ const parts = [`GCF profile=graph tool=${tool}`];
33
+ if (opts.tokenBudget)
34
+ parts.push(`budget=${opts.tokenBudget}`);
35
+ if (opts.tokensUsed)
36
+ parts.push(`tokens=${opts.tokensUsed}`);
37
+ if (opts.packRoot)
38
+ parts.push(`pack_root=${opts.packRoot}`);
39
+ if (opts.session)
40
+ parts.push('session=true');
41
+ this.w.write(parts.join(' ') + '\n');
42
+ }
43
+ /**
44
+ * Emit a symbol line immediately. Group headers are emitted automatically
45
+ * when the distance changes.
46
+ */
47
+ writeSymbol(s) {
48
+ const groupNames = ['targets', 'related', 'extended'];
49
+ const groupName = s.distance < groupNames.length
50
+ ? groupNames[s.distance]
51
+ : `distance_${s.distance}`;
52
+ if (groupName !== this.currentGroup) {
53
+ this.w.write(`## ${groupName}\n`);
54
+ this.currentGroup = groupName;
55
+ }
56
+ const id = this.nextID++;
57
+ this.symIndex.set(s.qualifiedName, id);
58
+ const kind = constants_js_1.KIND_ABBREV[s.kind] || s.kind;
59
+ this.w.write(`@${id} ${kind} ${s.qualifiedName} ${s.score.toFixed(2)} ${s.provenance}\n`);
60
+ this.groupCounts.set(groupName, (this.groupCounts.get(groupName) || 0) + 1);
61
+ }
62
+ /**
63
+ * Emit an edge line immediately. The edges section header is emitted
64
+ * automatically on the first edge (with [?] deferred count).
65
+ * Source and target must reference previously-written symbols.
66
+ */
67
+ writeEdge(e) {
68
+ const srcIdx = this.symIndex.get(e.source);
69
+ const tgtIdx = this.symIndex.get(e.target);
70
+ if (srcIdx === undefined || tgtIdx === undefined)
71
+ return;
72
+ if (!this.edgesStarted) {
73
+ this.w.write('## edges [?]\n');
74
+ this.edgesStarted = true;
75
+ }
76
+ let line = `@${tgtIdx}<@${srcIdx} ${e.edgeType}`;
77
+ if (e.status && e.status !== 'unchanged') {
78
+ line += ` ${e.status}`;
79
+ }
80
+ this.w.write(line + '\n');
81
+ this.edgeCount++;
82
+ }
83
+ /**
84
+ * Emit a bare reference for a previously-transmitted symbol (session mode).
85
+ */
86
+ writeBareRef(qname, distance) {
87
+ const groupNames = ['targets', 'related', 'extended'];
88
+ const groupName = distance < groupNames.length
89
+ ? groupNames[distance]
90
+ : `distance_${distance}`;
91
+ if (groupName !== this.currentGroup) {
92
+ this.w.write(`## ${groupName}\n`);
93
+ this.currentGroup = groupName;
94
+ }
95
+ const id = this.nextID++;
96
+ this.symIndex.set(qname, id);
97
+ this.w.write(`@${id} # previously transmitted\n`);
98
+ this.groupCounts.set(groupName, (this.groupCounts.get(groupName) || 0) + 1);
99
+ }
100
+ /**
101
+ * Emit the ##! summary trailer with final counts. Must be called after all
102
+ * symbols and edges have been written.
103
+ */
104
+ close() {
105
+ const deferredCounts = [];
106
+ const groupOrder = ['targets', 'related', 'extended'];
107
+ for (const g of groupOrder) {
108
+ const c = this.groupCounts.get(g);
109
+ if (c && c > 0)
110
+ deferredCounts.push(c);
111
+ }
112
+ for (const [g, c] of this.groupCounts) {
113
+ if (!groupOrder.includes(g) && c > 0)
114
+ deferredCounts.push(c);
115
+ }
116
+ if (this.edgeCount > 0) {
117
+ deferredCounts.push(this.edgeCount);
118
+ }
119
+ this.w.write(`##! summary symbols=${this.nextID} edges=${this.edgeCount} counts=${deferredCounts.join(',')}\n`);
120
+ }
121
+ /** Number of symbols written so far. */
122
+ get symbolCount() { return this.nextID; }
123
+ /** Number of edges written so far. */
124
+ get edgeCount_() { return this.edgeCount; }
125
+ }
126
+ exports.StreamEncoder = StreamEncoder;
127
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { StreamWriter } from './stream.js';
2
+ /**
3
+ * GenericStreamEncoder writes GCF tabular output incrementally as rows arrive.
4
+ * Zero buffering: each row is written immediately. A trailer summary is
5
+ * emitted on close() with the final counts.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const enc = new GenericStreamEncoder({ write: (s) => process.stdout.write(s) });
10
+ * enc.beginArray('employees', ['id', 'name', 'department', 'salary']);
11
+ * enc.writeRow([1, 'Alice', 'Engineering', 95000]);
12
+ * enc.writeRow([2, 'Bob', 'Sales', 72000]);
13
+ * enc.endArray();
14
+ * enc.close();
15
+ * ```
16
+ */
17
+ export declare class GenericStreamEncoder {
18
+ private readonly writer;
19
+ private sections;
20
+ private current;
21
+ constructor(writer: StreamWriter);
22
+ /** Start a tabular array section with deferred count [?]. */
23
+ beginArray(name: string, fields: string[]): void;
24
+ /** Emit a single pipe-separated row immediately. */
25
+ writeRow(values: unknown[]): void;
26
+ /** Close the current array section and record its count. */
27
+ endArray(): void;
28
+ /** Emit a key=value line immediately. */
29
+ writeKV(key: string, value: unknown): void;
30
+ /** Start a nested object section (## key). */
31
+ writeSection(name: string): void;
32
+ /** Emit a primitive array inline: name[N]: val1,val2,val3 */
33
+ writeInlineArray(name: string, values: unknown[]): void;
34
+ /** Emit the ##! summary trailer with final counts. Must be called after all data. */
35
+ close(): void;
36
+ private endArrayInternal;
37
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericStreamEncoder = void 0;
4
+ const scalar_js_1 = require("./scalar.js");
5
+ /**
6
+ * GenericStreamEncoder writes GCF tabular output incrementally as rows arrive.
7
+ * Zero buffering: each row is written immediately. A trailer summary is
8
+ * emitted on close() with the final counts.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const enc = new GenericStreamEncoder({ write: (s) => process.stdout.write(s) });
13
+ * enc.beginArray('employees', ['id', 'name', 'department', 'salary']);
14
+ * enc.writeRow([1, 'Alice', 'Engineering', 95000]);
15
+ * enc.writeRow([2, 'Bob', 'Sales', 72000]);
16
+ * enc.endArray();
17
+ * enc.close();
18
+ * ```
19
+ */
20
+ class GenericStreamEncoder {
21
+ writer;
22
+ sections = [];
23
+ current = null;
24
+ constructor(writer) {
25
+ this.writer = writer;
26
+ }
27
+ /** Start a tabular array section with deferred count [?]. */
28
+ beginArray(name, fields) {
29
+ if (this.current !== null) {
30
+ this.endArrayInternal();
31
+ }
32
+ this.writer.write(`## ${name} [?]{${fields.join(',')}}\n`);
33
+ this.current = { name, fields, count: 0 };
34
+ }
35
+ /** Emit a single pipe-separated row immediately. */
36
+ writeRow(values) {
37
+ if (this.current === null) {
38
+ return;
39
+ }
40
+ const parts = values.map(formatValue);
41
+ this.writer.write(`${parts.join('|')}\n`);
42
+ this.current.count++;
43
+ }
44
+ /** Close the current array section and record its count. */
45
+ endArray() {
46
+ this.endArrayInternal();
47
+ }
48
+ /** Emit a key=value line immediately. */
49
+ writeKV(key, value) {
50
+ this.writer.write(`${key}=${formatValue(value)}\n`);
51
+ }
52
+ /** Start a nested object section (## key). */
53
+ writeSection(name) {
54
+ if (this.current !== null) {
55
+ this.endArrayInternal();
56
+ }
57
+ this.writer.write(`## ${name}\n`);
58
+ }
59
+ /** Emit a primitive array inline: name[N]: val1,val2,val3 */
60
+ writeInlineArray(name, values) {
61
+ const parts = values.map(formatValue);
62
+ this.writer.write(`${name}[${values.length}]: ${parts.join(',')}\n`);
63
+ }
64
+ /** Emit the ##! summary trailer with final counts. Must be called after all data. */
65
+ close() {
66
+ if (this.current !== null) {
67
+ this.endArrayInternal();
68
+ }
69
+ if (this.sections.length === 0) {
70
+ return;
71
+ }
72
+ const counts = this.sections.map(s => String(s.count));
73
+ this.writer.write(`##! summary counts=${counts.join(',')}\n`);
74
+ }
75
+ endArrayInternal() {
76
+ if (this.current === null) {
77
+ return;
78
+ }
79
+ this.sections.push({ name: this.current.name, count: this.current.count });
80
+ this.current = null;
81
+ }
82
+ }
83
+ exports.GenericStreamEncoder = GenericStreamEncoder;
84
+ function formatValue(v) {
85
+ return (0, scalar_js_1.formatScalar)(v, 0x7c); // '|' context
86
+ }
87
+ //# sourceMappingURL=stream_generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream_generic.js","sourceRoot":"","sources":["../../src/stream_generic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Symbol represents a node in a GCF payload.
3
+ */
4
+ export interface Symbol {
5
+ /** Fully qualified identifier (e.g., "pkg/auth.Middleware") */
6
+ qualifiedName: string;
7
+ /** Node type: "function", "type", "method", etc. */
8
+ kind: string;
9
+ /** Relevance score (0.0 to 1.0) */
10
+ score: number;
11
+ /** Discovery method: "lsp_resolved", "ast_inferred", etc. */
12
+ provenance: string;
13
+ /** Hops from query center (0=target, 1=related, 2+=extended) */
14
+ distance: number;
15
+ /** Optional: function/method signature */
16
+ signature?: string;
17
+ /** Optional: score breakdown */
18
+ components?: Components;
19
+ }
20
+ /**
21
+ * Components holds the score breakdown for a symbol.
22
+ */
23
+ export interface Components {
24
+ blastRadius: number;
25
+ confidence: number;
26
+ recency: number;
27
+ distance: number;
28
+ }
29
+ /**
30
+ * Edge represents a directed relationship in a GCF payload.
31
+ */
32
+ export interface Edge {
33
+ /** Qualified name of source symbol */
34
+ source: string;
35
+ /** Qualified name of target symbol */
36
+ target: string;
37
+ /** Relationship type (e.g., "calls", "imports", "implements") */
38
+ edgeType: string;
39
+ /** Optional: "added", "removed", "unchanged" (for diff responses) */
40
+ status?: string;
41
+ }
42
+ /**
43
+ * Payload is the input/output structure for GCF encoding/decoding.
44
+ */
45
+ export interface Payload {
46
+ /** Producing tool name (e.g., "context_for_task") */
47
+ tool: string;
48
+ /** Token budget requested by the consumer */
49
+ tokenBudget: number;
50
+ /** Actual tokens consumed by this payload */
51
+ tokensUsed: number;
52
+ /** Content-addressed identity (hex SHA-256), enables delta encoding */
53
+ packRoot?: string;
54
+ /** Ordered by score descending within each distance group */
55
+ symbols: Symbol[];
56
+ /** Directed relationships between symbols */
57
+ edges: Edge[];
58
+ }
59
+ /**
60
+ * DeltaPayload represents the diff between a prior context pack and the
61
+ * current result. Used for incremental context delivery.
62
+ */
63
+ export interface DeltaPayload {
64
+ tool: string;
65
+ /** pack_root the consumer has */
66
+ baseRoot: string;
67
+ /** pack_root of the current result */
68
+ newRoot: string;
69
+ removed: Symbol[];
70
+ added: Symbol[];
71
+ removedEdges: Edge[];
72
+ addedEdges: Edge[];
73
+ deltaTokens: number;
74
+ fullTokens: number;
75
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/dist/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blackwell-systems/gcf",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "Drop-in JSON replacement for AI pipelines. 79% fewer tokens. 90.7% comprehension across 10 models. Zero dependencies.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -9,7 +9,8 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "browser": "./dist/browser.js",
12
- "import": "./dist/index.js"
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/cjs/index.cjs"
13
14
  },
14
15
  "./browser": {
15
16
  "types": "./dist/browser.d.ts",
@@ -27,10 +28,10 @@
27
28
  "README.md"
28
29
  ],
29
30
  "scripts": {
30
- "build": "tsc",
31
+ "build": "tsc && npx esbuild src/index.ts --bundle --platform=node --format=cjs --outfile=dist/cjs/index.cjs",
31
32
  "test": "vitest run",
32
33
  "test:watch": "vitest",
33
- "prepublishOnly": "tsc"
34
+ "prepublishOnly": "npm run build"
34
35
  },
35
36
  "keywords": [
36
37
  "gcf",