@flyingrobots/graft 0.8.0 → 0.10.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.
Files changed (186) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/GUIDE.md +8 -3
  3. package/README.md +134 -100
  4. package/dist/adapters/colorful-cli-prose-projector.d.ts +13 -0
  5. package/dist/adapters/colorful-cli-prose-projector.d.ts.map +1 -0
  6. package/dist/adapters/colorful-cli-prose-projector.js +89 -0
  7. package/dist/adapters/colorful-cli-prose-projector.js.map +1 -0
  8. package/dist/adapters/fake-echo-kernel-transport.d.ts +33 -0
  9. package/dist/adapters/fake-echo-kernel-transport.d.ts.map +1 -0
  10. package/dist/adapters/fake-echo-kernel-transport.js +208 -0
  11. package/dist/adapters/fake-echo-kernel-transport.js.map +1 -0
  12. package/dist/adapters/node-process-runner.d.ts.map +1 -1
  13. package/dist/adapters/node-process-runner.js +1 -0
  14. package/dist/adapters/node-process-runner.js.map +1 -1
  15. package/dist/api/index.d.ts +7 -2
  16. package/dist/api/index.d.ts.map +1 -1
  17. package/dist/api/index.js +14 -3
  18. package/dist/api/index.js.map +1 -1
  19. package/dist/cli/structural-blame-render.d.ts.map +1 -1
  20. package/dist/cli/structural-blame-render.js +4 -1
  21. package/dist/cli/structural-blame-render.js.map +1 -1
  22. package/dist/contracts/capabilities.d.ts +2 -2
  23. package/dist/contracts/capabilities.d.ts.map +1 -1
  24. package/dist/contracts/capabilities.js +14 -0
  25. package/dist/contracts/capabilities.js.map +1 -1
  26. package/dist/contracts/output-schema-cli.d.ts +3 -0
  27. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  28. package/dist/contracts/output-schema-fragments.d.ts +183 -0
  29. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  30. package/dist/contracts/output-schema-fragments.js +38 -0
  31. package/dist/contracts/output-schema-fragments.js.map +1 -1
  32. package/dist/contracts/output-schema-mcp.d.ts +91 -0
  33. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  34. package/dist/contracts/output-schema-mcp.js +6 -1
  35. package/dist/contracts/output-schema-mcp.js.map +1 -1
  36. package/dist/contracts/output-schema-meta.d.ts +1 -1
  37. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  38. package/dist/contracts/output-schemas.d.ts.map +1 -1
  39. package/dist/contracts/output-schemas.js +43 -0
  40. package/dist/contracts/output-schemas.js.map +1 -1
  41. package/dist/echo/canonical-cbor.d.ts +10 -0
  42. package/dist/echo/canonical-cbor.d.ts.map +1 -0
  43. package/dist/echo/canonical-cbor.js +213 -0
  44. package/dist/echo/canonical-cbor.js.map +1 -0
  45. package/dist/echo/codec-runtime.d.ts +72 -0
  46. package/dist/echo/codec-runtime.d.ts.map +1 -0
  47. package/dist/echo/codec-runtime.js +259 -0
  48. package/dist/echo/codec-runtime.js.map +1 -0
  49. package/dist/echo/structural-history-client.d.ts +68 -0
  50. package/dist/echo/structural-history-client.d.ts.map +1 -0
  51. package/dist/echo/structural-history-client.js +149 -0
  52. package/dist/echo/structural-history-client.js.map +1 -0
  53. package/dist/echo/structural-history-envelope-codec.d.ts +46 -0
  54. package/dist/echo/structural-history-envelope-codec.d.ts.map +1 -0
  55. package/dist/echo/structural-history-envelope-codec.js +121 -0
  56. package/dist/echo/structural-history-envelope-codec.js.map +1 -0
  57. package/dist/echo/structural-reading-adapter.d.ts +13 -0
  58. package/dist/echo/structural-reading-adapter.d.ts.map +1 -0
  59. package/dist/echo/structural-reading-adapter.js +120 -0
  60. package/dist/echo/structural-reading-adapter.js.map +1 -0
  61. package/dist/echo/structural-reading-generated-model.d.ts +18 -0
  62. package/dist/echo/structural-reading-generated-model.d.ts.map +1 -0
  63. package/dist/echo/structural-reading-generated-model.js +324 -0
  64. package/dist/echo/structural-reading-generated-model.js.map +1 -0
  65. package/dist/generated/graft-structural-history.codec.generated.d.ts +135 -0
  66. package/dist/generated/graft-structural-history.codec.generated.d.ts.map +1 -0
  67. package/dist/generated/graft-structural-history.codec.generated.js +549 -0
  68. package/dist/generated/graft-structural-history.codec.generated.js.map +1 -0
  69. package/dist/generated/graft-structural-history.d.ts +331 -0
  70. package/dist/generated/graft-structural-history.d.ts.map +1 -0
  71. package/dist/generated/graft-structural-history.js +47 -0
  72. package/dist/generated/graft-structural-history.js.map +1 -0
  73. package/dist/mcp/burden.d.ts.map +1 -1
  74. package/dist/mcp/burden.js +2 -0
  75. package/dist/mcp/burden.js.map +1 -1
  76. package/dist/mcp/context.d.ts +5 -1
  77. package/dist/mcp/context.d.ts.map +1 -1
  78. package/dist/mcp/context.js +11 -1
  79. package/dist/mcp/context.js.map +1 -1
  80. package/dist/mcp/control-plane/types.d.ts +8 -0
  81. package/dist/mcp/control-plane/types.d.ts.map +1 -1
  82. package/dist/mcp/daemon-control-plane.d.ts +2 -1
  83. package/dist/mcp/daemon-control-plane.d.ts.map +1 -1
  84. package/dist/mcp/daemon-control-plane.js +49 -0
  85. package/dist/mcp/daemon-control-plane.js.map +1 -1
  86. package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
  87. package/dist/mcp/repo-tool-worker-context.js +19 -0
  88. package/dist/mcp/repo-tool-worker-context.js.map +1 -1
  89. package/dist/mcp/repo-workspace.d.ts +1 -1
  90. package/dist/mcp/repo-workspace.d.ts.map +1 -1
  91. package/dist/mcp/repo-workspace.js +5 -0
  92. package/dist/mcp/repo-workspace.js.map +1 -1
  93. package/dist/mcp/server-context.d.ts.map +1 -1
  94. package/dist/mcp/server-context.js +17 -0
  95. package/dist/mcp/server-context.js.map +1 -1
  96. package/dist/mcp/server-tool-access.d.ts.map +1 -1
  97. package/dist/mcp/server-tool-access.js +4 -0
  98. package/dist/mcp/server-tool-access.js.map +1 -1
  99. package/dist/mcp/tool-registry.d.ts.map +1 -1
  100. package/dist/mcp/tool-registry.js +5 -1
  101. package/dist/mcp/tool-registry.js.map +1 -1
  102. package/dist/mcp/tools/changed-since.d.ts.map +1 -1
  103. package/dist/mcp/tools/changed-since.js +24 -10
  104. package/dist/mcp/tools/changed-since.js.map +1 -1
  105. package/dist/mcp/tools/dead-symbols.d.ts.map +1 -1
  106. package/dist/mcp/tools/dead-symbols.js +2 -3
  107. package/dist/mcp/tools/dead-symbols.js.map +1 -1
  108. package/dist/mcp/tools/file-outline.d.ts.map +1 -1
  109. package/dist/mcp/tools/file-outline.js +10 -5
  110. package/dist/mcp/tools/file-outline.js.map +1 -1
  111. package/dist/mcp/tools/structural-blame.d.ts.map +1 -1
  112. package/dist/mcp/tools/structural-blame.js +3 -0
  113. package/dist/mcp/tools/structural-blame.js.map +1 -1
  114. package/dist/mcp/tools/structural-review.d.ts.map +1 -1
  115. package/dist/mcp/tools/structural-review.js +9 -22
  116. package/dist/mcp/tools/structural-review.js.map +1 -1
  117. package/dist/mcp/tools/workspace-list-opened.d.ts +3 -0
  118. package/dist/mcp/tools/workspace-list-opened.d.ts.map +1 -0
  119. package/dist/mcp/tools/workspace-list-opened.js +10 -0
  120. package/dist/mcp/tools/workspace-list-opened.js.map +1 -0
  121. package/dist/mcp/tools/workspace-open.d.ts +3 -0
  122. package/dist/mcp/tools/workspace-open.d.ts.map +1 -0
  123. package/dist/mcp/tools/workspace-open.js +34 -0
  124. package/dist/mcp/tools/workspace-open.js.map +1 -0
  125. package/dist/mcp/workspace-registry.d.ts +83 -0
  126. package/dist/mcp/workspace-registry.d.ts.map +1 -0
  127. package/dist/mcp/workspace-registry.js +542 -0
  128. package/dist/mcp/workspace-registry.js.map +1 -0
  129. package/dist/mcp/workspace-router-model.d.ts +27 -0
  130. package/dist/mcp/workspace-router-model.d.ts.map +1 -1
  131. package/dist/mcp/workspace-router-model.js.map +1 -1
  132. package/dist/mcp/workspace-router.d.ts +9 -2
  133. package/dist/mcp/workspace-router.d.ts.map +1 -1
  134. package/dist/mcp/workspace-router.js +145 -1
  135. package/dist/mcp/workspace-router.js.map +1 -1
  136. package/dist/operations/colorful-prose-projection.d.ts +32 -0
  137. package/dist/operations/colorful-prose-projection.d.ts.map +1 -0
  138. package/dist/operations/colorful-prose-projection.js +344 -0
  139. package/dist/operations/colorful-prose-projection.js.map +1 -0
  140. package/dist/operations/file-outline.d.ts +10 -0
  141. package/dist/operations/file-outline.d.ts.map +1 -1
  142. package/dist/operations/file-outline.js +29 -3
  143. package/dist/operations/file-outline.js.map +1 -1
  144. package/dist/operations/repo-workspace.d.ts +4 -0
  145. package/dist/operations/repo-workspace.d.ts.map +1 -1
  146. package/dist/operations/repo-workspace.js +57 -21
  147. package/dist/operations/repo-workspace.js.map +1 -1
  148. package/dist/operations/safe-read.d.ts +2 -0
  149. package/dist/operations/safe-read.d.ts.map +1 -1
  150. package/dist/operations/safe-read.js +20 -0
  151. package/dist/operations/safe-read.js.map +1 -1
  152. package/dist/operations/structured-buffer-model.d.ts +19 -15
  153. package/dist/operations/structured-buffer-model.d.ts.map +1 -1
  154. package/dist/operations/structured-buffer-model.js +6 -4
  155. package/dist/operations/structured-buffer-model.js.map +1 -1
  156. package/dist/operations/structured-buffer-query.d.ts.map +1 -1
  157. package/dist/operations/structured-buffer-query.js +64 -1
  158. package/dist/operations/structured-buffer-query.js.map +1 -1
  159. package/dist/operations/structured-buffer.d.ts +3 -1
  160. package/dist/operations/structured-buffer.d.ts.map +1 -1
  161. package/dist/operations/structured-buffer.js.map +1 -1
  162. package/dist/parser/types.d.ts +1 -1
  163. package/dist/parser/types.d.ts.map +1 -1
  164. package/dist/parser/types.js.map +1 -1
  165. package/dist/ports/echo-kernel-transport.d.ts +12 -0
  166. package/dist/ports/echo-kernel-transport.d.ts.map +1 -0
  167. package/dist/ports/echo-kernel-transport.js +13 -0
  168. package/dist/ports/echo-kernel-transport.js.map +1 -0
  169. package/dist/ports/process-runner.d.ts +1 -0
  170. package/dist/ports/process-runner.d.ts.map +1 -1
  171. package/dist/ports/structural-history.d.ts +23 -0
  172. package/dist/ports/structural-history.d.ts.map +1 -0
  173. package/dist/ports/structural-history.js +22 -0
  174. package/dist/ports/structural-history.js.map +1 -0
  175. package/dist/ports/structural-reading.d.ts +100 -0
  176. package/dist/ports/structural-reading.d.ts.map +1 -0
  177. package/dist/ports/structural-reading.js +41 -0
  178. package/dist/ports/structural-reading.js.map +1 -0
  179. package/dist/warp/structural-reading-adapter.d.ts +28 -0
  180. package/dist/warp/structural-reading-adapter.d.ts.map +1 -0
  181. package/dist/warp/structural-reading-adapter.js +98 -0
  182. package/dist/warp/structural-reading-adapter.js.map +1 -0
  183. package/docs/CLI.md +4 -4
  184. package/docs/MCP.md +10 -5
  185. package/docs/SETUP.md +12 -6
  186. package/package.json +13 -6
@@ -0,0 +1,10 @@
1
+ export declare class CborCodecError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export type CborValue = null | boolean | number | string | readonly CborValue[] | {
5
+ readonly [key: string]: CborValue;
6
+ };
7
+ export declare function isCborArray(value: CborValue): value is readonly CborValue[];
8
+ export declare function encodeCanonicalCbor(value: CborValue): Uint8Array;
9
+ export declare function decodeCanonicalCbor(bytes: Uint8Array): CborValue;
10
+ //# sourceMappingURL=canonical-cbor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-cbor.d.ts","sourceRoot":"","sources":["../../src/echo/canonical-cbor.ts"],"names":[],"mappings":"AAOA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,SAAS,EAAE,GACpB;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE1C,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,SAAS,SAAS,EAAE,CAE3E;AA2FD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAIhE;AA+FD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAgBhE"}
@@ -0,0 +1,213 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Minimal canonical CBOR (RFC 8949 core deterministic encoding) for the Echo
3
+ // wire envelope. Supports the JSON-shaped subset the witness needs: null,
4
+ // boolean, safe integers, text strings, arrays, and string-keyed maps with
5
+ // keys sorted by their encoded bytes. Floats and tags are out of scope.
6
+ // ---------------------------------------------------------------------------
7
+ export class CborCodecError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "CborCodecError";
11
+ }
12
+ }
13
+ export function isCborArray(value) {
14
+ return Array.isArray(value);
15
+ }
16
+ const UTF8_ENCODER = new TextEncoder();
17
+ const UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
18
+ const MAJOR_UNSIGNED = 0;
19
+ const MAJOR_NEGATIVE = 1;
20
+ const MAJOR_TEXT = 3;
21
+ const MAJOR_ARRAY = 4;
22
+ const MAJOR_MAP = 5;
23
+ const MAJOR_SIMPLE = 7;
24
+ const SIMPLE_FALSE = 20;
25
+ const SIMPLE_TRUE = 21;
26
+ const SIMPLE_NULL = 22;
27
+ function encodeHead(major, value) {
28
+ if (value < 24) {
29
+ return [(major << 5) | value];
30
+ }
31
+ if (value < 0x100) {
32
+ return [(major << 5) | 24, value];
33
+ }
34
+ if (value < 0x10000) {
35
+ return [(major << 5) | 25, value >>> 8, value & 0xff];
36
+ }
37
+ if (value <= 0xffffffff) {
38
+ return [
39
+ (major << 5) | 26,
40
+ (value >>> 24) & 0xff,
41
+ (value >>> 16) & 0xff,
42
+ (value >>> 8) & 0xff,
43
+ value & 0xff,
44
+ ];
45
+ }
46
+ throw new CborCodecError(`length ${String(value)} exceeds supported range`);
47
+ }
48
+ function encodeValue(value, out) {
49
+ if (value === null) {
50
+ out.push((MAJOR_SIMPLE << 5) | SIMPLE_NULL);
51
+ return;
52
+ }
53
+ if (typeof value === "boolean") {
54
+ out.push((MAJOR_SIMPLE << 5) | (value ? SIMPLE_TRUE : SIMPLE_FALSE));
55
+ return;
56
+ }
57
+ if (typeof value === "number") {
58
+ if (!Number.isSafeInteger(value)) {
59
+ throw new CborCodecError(`unsupported non-integer number: ${String(value)}`);
60
+ }
61
+ if (value >= 0) {
62
+ out.push(...encodeHead(MAJOR_UNSIGNED, value));
63
+ }
64
+ else {
65
+ out.push(...encodeHead(MAJOR_NEGATIVE, -value - 1));
66
+ }
67
+ return;
68
+ }
69
+ if (typeof value === "string") {
70
+ const bytes = UTF8_ENCODER.encode(value);
71
+ out.push(...encodeHead(MAJOR_TEXT, bytes.length), ...bytes);
72
+ return;
73
+ }
74
+ if (isCborArray(value)) {
75
+ out.push(...encodeHead(MAJOR_ARRAY, value.length));
76
+ for (const item of value) {
77
+ encodeValue(item, out);
78
+ }
79
+ return;
80
+ }
81
+ const entries = Object.entries(value).map(([key, item]) => {
82
+ const keyBytes = [];
83
+ encodeValue(key, keyBytes);
84
+ return { keyBytes, item };
85
+ });
86
+ entries.sort((a, b) => {
87
+ const min = Math.min(a.keyBytes.length, b.keyBytes.length);
88
+ for (let i = 0; i < min; i += 1) {
89
+ const delta = (a.keyBytes[i] ?? 0) - (b.keyBytes[i] ?? 0);
90
+ if (delta !== 0) {
91
+ return delta;
92
+ }
93
+ }
94
+ return a.keyBytes.length - b.keyBytes.length;
95
+ });
96
+ out.push(...encodeHead(MAJOR_MAP, entries.length));
97
+ for (const entry of entries) {
98
+ out.push(...entry.keyBytes);
99
+ encodeValue(entry.item, out);
100
+ }
101
+ }
102
+ export function encodeCanonicalCbor(value) {
103
+ const out = [];
104
+ encodeValue(value, out);
105
+ return Uint8Array.from(out);
106
+ }
107
+ class CborReader {
108
+ bytes;
109
+ offset = 0;
110
+ constructor(bytes) {
111
+ this.bytes = bytes;
112
+ }
113
+ take(count) {
114
+ if (this.offset + count > this.bytes.length) {
115
+ throw new CborCodecError("unexpected end of CBOR input");
116
+ }
117
+ const slice = this.bytes.subarray(this.offset, this.offset + count);
118
+ this.offset += count;
119
+ return slice;
120
+ }
121
+ readLength(additional) {
122
+ if (additional < 24) {
123
+ return additional;
124
+ }
125
+ if (additional === 24) {
126
+ return this.take(1)[0] ?? 0;
127
+ }
128
+ if (additional === 25) {
129
+ const b = this.take(2);
130
+ return ((b[0] ?? 0) << 8) | (b[1] ?? 0);
131
+ }
132
+ if (additional === 26) {
133
+ const b = this.take(4);
134
+ // Pure arithmetic: bitwise OR would coerce to signed 32-bit and turn
135
+ // any length with the high bit set negative.
136
+ return ((b[0] ?? 0) * 0x1000000 +
137
+ (b[1] ?? 0) * 0x10000 +
138
+ (b[2] ?? 0) * 0x100 +
139
+ (b[3] ?? 0));
140
+ }
141
+ throw new CborCodecError(`unsupported CBOR length encoding: ${String(additional)}`);
142
+ }
143
+ readValue() {
144
+ const initial = this.take(1)[0] ?? 0;
145
+ const major = initial >> 5;
146
+ const additional = initial & 0x1f;
147
+ switch (major) {
148
+ case MAJOR_UNSIGNED:
149
+ return this.readLength(additional);
150
+ case MAJOR_NEGATIVE:
151
+ return -this.readLength(additional) - 1;
152
+ case MAJOR_TEXT: {
153
+ const length = this.readLength(additional);
154
+ return UTF8_DECODER.decode(this.take(length));
155
+ }
156
+ case MAJOR_ARRAY: {
157
+ const length = this.readLength(additional);
158
+ const items = [];
159
+ for (let i = 0; i < length; i += 1) {
160
+ items.push(this.readValue());
161
+ }
162
+ return items;
163
+ }
164
+ case MAJOR_MAP: {
165
+ const length = this.readLength(additional);
166
+ const result = {};
167
+ for (let i = 0; i < length; i += 1) {
168
+ const key = this.readValue();
169
+ if (typeof key !== "string") {
170
+ throw new CborCodecError("only text map keys are supported");
171
+ }
172
+ result[key] = this.readValue();
173
+ }
174
+ return result;
175
+ }
176
+ case MAJOR_SIMPLE:
177
+ if (additional === SIMPLE_FALSE) {
178
+ return false;
179
+ }
180
+ if (additional === SIMPLE_TRUE) {
181
+ return true;
182
+ }
183
+ if (additional === SIMPLE_NULL) {
184
+ return null;
185
+ }
186
+ throw new CborCodecError(`unsupported CBOR simple value: ${String(additional)}`);
187
+ default:
188
+ throw new CborCodecError(`unsupported CBOR major type: ${String(major)}`);
189
+ }
190
+ }
191
+ finished() {
192
+ return this.offset === this.bytes.length;
193
+ }
194
+ }
195
+ export function decodeCanonicalCbor(bytes) {
196
+ let reader;
197
+ let value;
198
+ try {
199
+ reader = new CborReader(bytes);
200
+ value = reader.readValue();
201
+ }
202
+ catch (error) {
203
+ if (error instanceof CborCodecError) {
204
+ throw error;
205
+ }
206
+ throw new CborCodecError(String(error));
207
+ }
208
+ if (!reader.finished()) {
209
+ throw new CborCodecError("trailing bytes after CBOR value");
210
+ }
211
+ return value;
212
+ }
213
+ //# sourceMappingURL=canonical-cbor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-cbor.js","sourceRoot":"","sources":["../../src/echo/canonical-cbor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export declare class Writer {
2
+ private buf;
3
+ private view;
4
+ private pos;
5
+ constructor();
6
+ private reserve;
7
+ writeBytes(bytes: Uint8Array): void;
8
+ writeU8(v: number): void;
9
+ writeU16Le(v: number): void;
10
+ writeU32Le(v: number): void;
11
+ writeI32Le(v: number): void;
12
+ /**
13
+ * Canonicalize `v` identically to `F32Scalar::new()` / `canonicalize_f32()`
14
+ * in Rust, then write 4 bytes LE.
15
+ *
16
+ * Caller contract: `v` must already be an exact f32-representable value.
17
+ * Do not feed f64 intermediate results into this method.
18
+ */
19
+ writeF32Le(v: number): void;
20
+ /**
21
+ * 1 byte: 0x00 = false, 0x01 = true. Takes the literal byte value
22
+ * directly rather than a `boolean` because the quality gate forbids
23
+ * boolean parameters (no flag-shaped function signatures). Callers
24
+ * with a runtime `boolean` should write `w.writeBool(v ? 1 : 0)`.
25
+ */
26
+ writeBool(v: 0 | 1): void;
27
+ /**
28
+ * Write a length-prefixed UTF-8 string (u32 LE length + bytes, no null
29
+ * terminator). Caller must ensure the string is NFC-normalized before
30
+ * encoding if cross-platform digest stability is required.
31
+ */
32
+ writeString(v: string): void;
33
+ /** Presence tag (0x00 = null) + encoded payload when present. */
34
+ writeOption<T>(v: T | null, encode: (w: Writer, v: T) => void): void;
35
+ /** u32 LE element count + each element encoded inline. */
36
+ writeList<T>(vs: readonly T[], encode: (w: Writer, v: T) => void): void;
37
+ finish(): Uint8Array;
38
+ }
39
+ export declare class CodecError extends Error {
40
+ constructor(message: string);
41
+ }
42
+ export declare class Reader {
43
+ private readonly view;
44
+ private pos;
45
+ constructor(bytes: Uint8Array);
46
+ /** Number of bytes left to consume from the underlying buffer. */
47
+ remaining(): number;
48
+ private take;
49
+ readU8(): number;
50
+ readU16Le(): number;
51
+ readU32Le(): number;
52
+ readI32Le(): number;
53
+ readF32Le(): number;
54
+ readBool(): boolean;
55
+ readString(): string;
56
+ readOption<T>(decode: (r: Reader) => T): T | null;
57
+ readList<T>(decode: (r: Reader) => T): T[];
58
+ }
59
+ /**
60
+ * Canonicalize a number as an f32, matching `canonicalize_f32()` in Rust.
61
+ *
62
+ * - NaN (any) → 0x7fc00000 (positive quiet NaN)
63
+ * - subnormal → +0.0
64
+ * - -0.0 → +0.0
65
+ * - all other values pass through unchanged
66
+ *
67
+ * JavaScript has no f32 type. This function reads the float32 bit pattern
68
+ * written by `DataView.setFloat32` (which narrows the f64 to the nearest f32),
69
+ * then applies the canonicalization rules above.
70
+ */
71
+ export declare function canonicalizeF32(v: number): number;
72
+ //# sourceMappingURL=codec-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-runtime.d.ts","sourceRoot":"","sources":["../../src/echo/codec-runtime.ts"],"names":[],"mappings":"AAmCA,qBAAa,MAAM;IACf,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,GAAG,CAAS;;IAQpB,OAAO,CAAC,OAAO;IAWf,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMnC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAOxB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAO3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAO3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAO3B;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3B;;;;;OAKG;IACH,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI;IAIzB;;;;OAIG;IACH,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAM5B,iEAAiE;IACjE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IASpE,0DAA0D;IAC1D,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAOvE,MAAM,IAAI,UAAU;CAGvB;AAMD,qBAAa,UAAW,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,MAAM;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,GAAG,CAAS;gBAER,KAAK,EAAE,UAAU;IAK7B,kEAAkE;IAClE,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,IAAI;IASZ,MAAM,IAAI,MAAM;IAKhB,SAAS,IAAI,MAAM;IAKnB,SAAS,IAAI,MAAM;IAKnB,SAAS,IAAI,MAAM;IAKnB,SAAS,IAAI,MAAM;IAKnB,QAAQ,IAAI,OAAO;IAOnB,UAAU,IAAI,MAAM;IAepB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI;IAOjD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;CAQ7C;AAaD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BjD"}
@@ -0,0 +1,259 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Minimal deterministic codec helpers — little-endian binary encoding.
3
+ //
4
+ // This is a method-for-method TypeScript mirror of echo-wasm-abi::codec (Rust).
5
+ // Wire layout is identical: same field order, same type widths, same endianness.
6
+ //
7
+ // Canonicalization contract for f32 (matches F32Scalar::new in warp-math):
8
+ // NaN (any variant) → 0x7fc00000 (positive quiet NaN)
9
+ // subnormal → +0.0 (0x00000000)
10
+ // -0.0 → +0.0
11
+ // all other values pass through unchanged
12
+ // ---------------------------------------------------------------------------
13
+ // Writer
14
+ // ---------------------------------------------------------------------------
15
+ const INITIAL_CAPACITY = 256;
16
+ const U8_MAX = 0xff;
17
+ const U16_MAX = 0xffff;
18
+ const U32_MAX = 0xffffffff;
19
+ const I32_MIN = -0x80000000;
20
+ const I32_MAX = 0x7fffffff;
21
+ function assertUint(name, v, max) {
22
+ if (!Number.isInteger(v) || v < 0 || v > max) {
23
+ throw new CodecError(`${name} ${String(v)} is out of range`);
24
+ }
25
+ }
26
+ function assertInt32(v) {
27
+ if (!Number.isInteger(v) || v < I32_MIN || v > I32_MAX) {
28
+ throw new CodecError(`i32 ${String(v)} is out of range`);
29
+ }
30
+ }
31
+ export class Writer {
32
+ buf;
33
+ view;
34
+ pos;
35
+ constructor() {
36
+ this.buf = new Uint8Array(INITIAL_CAPACITY);
37
+ this.view = new DataView(this.buf.buffer);
38
+ this.pos = 0;
39
+ }
40
+ reserve(n) {
41
+ const needed = this.pos + n;
42
+ if (needed <= this.buf.length)
43
+ return;
44
+ let next = this.buf.length * 2;
45
+ while (next < needed)
46
+ next *= 2;
47
+ const grown = new Uint8Array(next);
48
+ grown.set(this.buf);
49
+ this.buf = grown;
50
+ this.view = new DataView(this.buf.buffer);
51
+ }
52
+ writeBytes(bytes) {
53
+ this.reserve(bytes.length);
54
+ this.buf.set(bytes, this.pos);
55
+ this.pos += bytes.length;
56
+ }
57
+ writeU8(v) {
58
+ assertUint('u8', v, U8_MAX);
59
+ this.reserve(1);
60
+ this.buf[this.pos] = v;
61
+ this.pos += 1;
62
+ }
63
+ writeU16Le(v) {
64
+ assertUint('u16', v, U16_MAX);
65
+ this.reserve(2);
66
+ this.view.setUint16(this.pos, v, /* littleEndian */ true);
67
+ this.pos += 2;
68
+ }
69
+ writeU32Le(v) {
70
+ assertUint('u32', v, U32_MAX);
71
+ this.reserve(4);
72
+ this.view.setUint32(this.pos, v, /* littleEndian */ true);
73
+ this.pos += 4;
74
+ }
75
+ writeI32Le(v) {
76
+ assertInt32(v);
77
+ this.reserve(4);
78
+ this.view.setInt32(this.pos, v, /* littleEndian */ true);
79
+ this.pos += 4;
80
+ }
81
+ /**
82
+ * Canonicalize `v` identically to `F32Scalar::new()` / `canonicalize_f32()`
83
+ * in Rust, then write 4 bytes LE.
84
+ *
85
+ * Caller contract: `v` must already be an exact f32-representable value.
86
+ * Do not feed f64 intermediate results into this method.
87
+ */
88
+ writeF32Le(v) {
89
+ this.reserve(4);
90
+ this.view.setFloat32(this.pos, canonicalizeF32(v), /* littleEndian */ true);
91
+ this.pos += 4;
92
+ }
93
+ /**
94
+ * 1 byte: 0x00 = false, 0x01 = true. Takes the literal byte value
95
+ * directly rather than a `boolean` because the quality gate forbids
96
+ * boolean parameters (no flag-shaped function signatures). Callers
97
+ * with a runtime `boolean` should write `w.writeBool(v ? 1 : 0)`.
98
+ */
99
+ writeBool(v) {
100
+ this.writeU8(v);
101
+ }
102
+ /**
103
+ * Write a length-prefixed UTF-8 string (u32 LE length + bytes, no null
104
+ * terminator). Caller must ensure the string is NFC-normalized before
105
+ * encoding if cross-platform digest stability is required.
106
+ */
107
+ writeString(v) {
108
+ const bytes = new TextEncoder().encode(v);
109
+ this.writeU32Le(bytes.length);
110
+ this.writeBytes(bytes);
111
+ }
112
+ /** Presence tag (0x00 = null) + encoded payload when present. */
113
+ writeOption(v, encode) {
114
+ if (v === null) {
115
+ this.writeU8(0x00);
116
+ }
117
+ else {
118
+ this.writeU8(0x01);
119
+ encode(this, v);
120
+ }
121
+ }
122
+ /** u32 LE element count + each element encoded inline. */
123
+ writeList(vs, encode) {
124
+ this.writeU32Le(vs.length);
125
+ for (const v of vs) {
126
+ encode(this, v);
127
+ }
128
+ }
129
+ finish() {
130
+ return this.buf.slice(0, this.pos);
131
+ }
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Reader
135
+ // ---------------------------------------------------------------------------
136
+ export class CodecError extends Error {
137
+ constructor(message) {
138
+ super(message);
139
+ this.name = 'CodecError';
140
+ }
141
+ }
142
+ export class Reader {
143
+ view;
144
+ pos;
145
+ constructor(bytes) {
146
+ this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
147
+ this.pos = 0;
148
+ }
149
+ /** Number of bytes left to consume from the underlying buffer. */
150
+ remaining() {
151
+ return this.view.byteLength - this.pos;
152
+ }
153
+ take(n) {
154
+ const start = this.pos;
155
+ if (start + n > this.view.byteLength) {
156
+ throw new CodecError('buffer too short');
157
+ }
158
+ this.pos += n;
159
+ return start;
160
+ }
161
+ readU8() {
162
+ const at = this.take(1);
163
+ return this.view.getUint8(at);
164
+ }
165
+ readU16Le() {
166
+ const at = this.take(2);
167
+ return this.view.getUint16(at, /* littleEndian */ true);
168
+ }
169
+ readU32Le() {
170
+ const at = this.take(4);
171
+ return this.view.getUint32(at, /* littleEndian */ true);
172
+ }
173
+ readI32Le() {
174
+ const at = this.take(4);
175
+ return this.view.getInt32(at, /* littleEndian */ true);
176
+ }
177
+ readF32Le() {
178
+ const at = this.take(4);
179
+ return this.view.getFloat32(at, /* littleEndian */ true);
180
+ }
181
+ readBool() {
182
+ const tag = this.readU8();
183
+ if (tag === 0x00)
184
+ return false;
185
+ if (tag === 0x01)
186
+ return true;
187
+ throw new CodecError(`invalid bool tag: 0x${tag.toString(16).padStart(2, '0')}`);
188
+ }
189
+ readString() {
190
+ const len = this.readU32Le();
191
+ const at = this.take(len);
192
+ const slice = new Uint8Array(this.view.buffer, this.view.byteOffset + at, len);
193
+ try {
194
+ return new TextDecoder('utf-8', { fatal: true }).decode(slice);
195
+ }
196
+ catch {
197
+ throw new CodecError('invalid utf-8');
198
+ }
199
+ }
200
+ readOption(decode) {
201
+ const tag = this.readU8();
202
+ if (tag === 0x00)
203
+ return null;
204
+ if (tag === 0x01)
205
+ return decode(this);
206
+ throw new CodecError(`invalid option tag: 0x${tag.toString(16).padStart(2, '0')}`);
207
+ }
208
+ readList(decode) {
209
+ const count = this.readU32Le();
210
+ const out = [];
211
+ for (let i = 0; i < count; i++) {
212
+ out.push(decode(this));
213
+ }
214
+ return out;
215
+ }
216
+ }
217
+ // ---------------------------------------------------------------------------
218
+ // F32 canonicalization
219
+ // ---------------------------------------------------------------------------
220
+ // Shared DataView for bit-manipulation of f32 values.
221
+ const _f32Buf = new ArrayBuffer(4);
222
+ const _f32View = new DataView(_f32Buf);
223
+ /** Canonical quiet-NaN bit pattern (matches `F32Scalar` in warp-math). */
224
+ const F32_CANONICAL_NAN_BITS = 0x7fc0_0000;
225
+ /**
226
+ * Canonicalize a number as an f32, matching `canonicalize_f32()` in Rust.
227
+ *
228
+ * - NaN (any) → 0x7fc00000 (positive quiet NaN)
229
+ * - subnormal → +0.0
230
+ * - -0.0 → +0.0
231
+ * - all other values pass through unchanged
232
+ *
233
+ * JavaScript has no f32 type. This function reads the float32 bit pattern
234
+ * written by `DataView.setFloat32` (which narrows the f64 to the nearest f32),
235
+ * then applies the canonicalization rules above.
236
+ */
237
+ export function canonicalizeF32(v) {
238
+ // Write as f32 to capture the narrowed bit pattern.
239
+ _f32View.setFloat32(0, v, /* littleEndian */ false);
240
+ const bits = _f32View.getUint32(0, /* littleEndian */ false);
241
+ const exponent = (bits >>> 23) & 0xff;
242
+ const mantissa = bits & 0x007f_ffff;
243
+ // NaN: exponent all-1s, mantissa non-zero.
244
+ if (exponent === 0xff && mantissa !== 0) {
245
+ _f32View.setUint32(0, F32_CANONICAL_NAN_BITS, /* littleEndian */ false);
246
+ return _f32View.getFloat32(0, /* littleEndian */ false);
247
+ }
248
+ // Subnormal: exponent zero, mantissa non-zero. → +0.0
249
+ if (exponent === 0 && mantissa !== 0) {
250
+ return 0;
251
+ }
252
+ // -0.0: sign bit set, exponent zero, mantissa zero. → +0.0
253
+ if (bits === 0x8000_0000) {
254
+ return 0;
255
+ }
256
+ // All other values (normal, ±Infinity, +0.0) pass through.
257
+ return _f32View.getFloat32(0, /* littleEndian */ false);
258
+ }
259
+ //# sourceMappingURL=codec-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-runtime.js","sourceRoot":"","sources":["../../src/echo/codec-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { EchoKernelTransport } from "../ports/echo-kernel-transport.js";
2
+ import { type CborValue } from "./canonical-cbor.js";
3
+ import { type RecordGitWarpImportBatchVars } from "../generated/graft-structural-history.codec.generated.js";
4
+ export interface EchoContractObstruction {
5
+ readonly code: string;
6
+ readonly message: string;
7
+ readonly recovery?: string;
8
+ }
9
+ export declare class EchoSubstrateObstructionError extends Error {
10
+ readonly code: string;
11
+ readonly recovery: string | undefined;
12
+ constructor(obstruction: EchoContractObstruction);
13
+ }
14
+ export interface EchoIntentReceipt {
15
+ readonly submissionId: string;
16
+ readonly operationName: string;
17
+ }
18
+ export type EchoIntentOutcome = {
19
+ readonly kind: "applied";
20
+ readonly receipt: EchoIntentReceipt;
21
+ } | {
22
+ readonly kind: "rejected";
23
+ readonly reason: string;
24
+ readonly receipt: EchoIntentReceipt;
25
+ } | {
26
+ readonly kind: "pending";
27
+ } | {
28
+ readonly kind: "unknown";
29
+ } | {
30
+ readonly kind: "obstructed";
31
+ readonly obstruction: EchoContractObstruction;
32
+ };
33
+ export interface EchoIntentSubmissionHandle {
34
+ readonly submissionId: string;
35
+ }
36
+ export interface EchoStructuralReadingRecord {
37
+ readonly readingId: string;
38
+ readonly readingKind: string;
39
+ readonly basisId: string;
40
+ readonly payloadJson: CborValue;
41
+ readonly evidence: {
42
+ readonly family: string;
43
+ readonly readingId: string;
44
+ readonly basis: Readonly<Record<string, CborValue>>;
45
+ };
46
+ }
47
+ export interface EchoStructuralReadingsObservation {
48
+ readonly readings: readonly EchoStructuralReadingRecord[];
49
+ readonly obstruction?: EchoContractObstruction;
50
+ }
51
+ export interface EchoStructuralReadingsRequest {
52
+ readonly basisId: string;
53
+ readonly readingKind?: string;
54
+ }
55
+ export interface EchoRetainedEvidenceRequest {
56
+ readonly basisId: string;
57
+ }
58
+ export interface EchoRetainedEvidenceResult {
59
+ readonly posture: "retained" | "missing" | "obstructed";
60
+ }
61
+ export interface EchoStructuralHistoryClient {
62
+ recordGitWarpImportBatch(vars: RecordGitWarpImportBatchVars): Promise<EchoIntentSubmissionHandle>;
63
+ observeIntentOutcome(submissionId: string): Promise<EchoIntentOutcome>;
64
+ observeStructuralReadings(request: EchoStructuralReadingsRequest): Promise<EchoStructuralReadingsObservation>;
65
+ inspectRetainedEvidence(request: EchoRetainedEvidenceRequest): Promise<EchoRetainedEvidenceResult>;
66
+ }
67
+ export declare function createEchoStructuralHistoryClient(transport: EchoKernelTransport): EchoStructuralHistoryClient;
68
+ //# sourceMappingURL=structural-history-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-history-client.d.ts","sourceRoot":"","sources":["../../src/echo/structural-history-client.ts"],"names":[],"mappings":"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"}