@code-yeongyu/senpi 2026.9.15-2 → 2026.9.16

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 (137) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
  3. package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
  4. package/dist/core/extensions/kernel-tools-context.js +3 -0
  5. package/dist/core/extensions/kernel-tools-context.js.map +1 -0
  6. package/dist/core/extensions/runner.d.ts +19 -0
  7. package/dist/core/extensions/runner.d.ts.map +1 -1
  8. package/dist/core/extensions/runner.js +103 -1
  9. package/dist/core/extensions/runner.js.map +1 -1
  10. package/dist/core/extensions/types.d.ts +21 -0
  11. package/dist/core/extensions/types.d.ts.map +1 -1
  12. package/dist/core/extensions/types.js.map +1 -1
  13. package/dist/core/settings-manager.d.ts +23 -0
  14. package/dist/core/settings-manager.d.ts.map +1 -1
  15. package/dist/core/settings-manager.js +41 -0
  16. package/dist/core/settings-manager.js.map +1 -1
  17. package/dist/core/tools/index.d.ts +1 -1
  18. package/dist/core/tools/index.d.ts.map +1 -1
  19. package/dist/core/tools/index.js +4 -3
  20. package/dist/core/tools/index.js.map +1 -1
  21. package/dist/core/tools/read.d.ts +3 -1
  22. package/dist/core/tools/read.d.ts.map +1 -1
  23. package/dist/core/tools/read.js +16 -2
  24. package/dist/core/tools/read.js.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/docs/extensions.md +3 -0
  30. package/docs/settings.md +12 -0
  31. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +21 -0
  32. package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
  33. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  34. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
  35. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
  36. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
  37. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
  38. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
  39. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
  40. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
  41. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
  42. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +29 -0
  43. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
  44. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
  45. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
  46. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
  47. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
  48. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
  49. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
  50. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
  51. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
  52. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
  53. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
  54. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
  55. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
  56. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
  57. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
  58. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
  59. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
  60. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
  61. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
  62. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
  63. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
  64. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
  65. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
  66. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
  67. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
  68. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
  69. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
  70. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
  71. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +2 -0
  72. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
  73. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +8 -1
  74. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +49 -30
  75. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
  76. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
  78. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
  80. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
  81. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
  82. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
  83. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
  84. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
  85. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
  86. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
  87. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
  88. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
  89. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
  90. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
  91. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
  92. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
  93. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
  94. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
  95. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
  96. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
  97. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
  98. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
  99. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
  100. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
  101. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
  102. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
  103. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
  104. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
  105. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
  106. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
  107. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
  108. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
  109. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
  110. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
  111. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +2 -0
  112. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +2 -0
  114. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  116. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  117. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  118. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  119. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  120. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  121. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  122. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  123. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  125. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts +15 -0
  127. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
  128. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
  129. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
  130. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
  132. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  134. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  135. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  136. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  137. package/package.json +7 -7
@@ -0,0 +1,268 @@
1
+ import { HeaderProtection } from "./header-protection.js";
2
+ import { controls, expressionKeywords, isCallCallee, signatureDeclarations } from "./lexical-context.js";
3
+ import { commentSpan, lineCommentEnd, regexSpan, stringSpan, typeArgumentsSpan } from "./lexical-spans.js";
4
+ /** Measured row-17 brace lexer, restricted to the three selected languages. */
5
+ export function scanBraces(source, language, settings) {
6
+ const ranges = [];
7
+ const stack = [];
8
+ const headers = new HeaderProtection();
9
+ const fail = (reason) => ({ status: "parse_failure", reason });
10
+ let line = 1;
11
+ let i = 0;
12
+ let template = false;
13
+ let templateDepth = 0;
14
+ let previous = "";
15
+ let beforeWord = "";
16
+ let wordLine = 1;
17
+ let valueArrow = false;
18
+ let expressionEnd = false;
19
+ let importClause = false;
20
+ let ambiguousAngleDepth;
21
+ let signatureDeclaration = false;
22
+ if (source.startsWith("#!")) {
23
+ const end = source.indexOf("\n");
24
+ i = end < 0 ? source.length : end;
25
+ }
26
+ while (i < source.length) {
27
+ const char = source[i];
28
+ const next = source[i + 1];
29
+ if (char === "\n")
30
+ line++;
31
+ if (template) {
32
+ if (char === "\\") {
33
+ if (next === "\n")
34
+ line++;
35
+ i += 2;
36
+ continue;
37
+ }
38
+ if (char === "`") {
39
+ template = false;
40
+ templateDepth--;
41
+ expressionEnd = true;
42
+ previous = "literal";
43
+ }
44
+ else if (char === "$" && next === "{") {
45
+ stack.push({
46
+ char: "{",
47
+ line,
48
+ foldable: false,
49
+ protected: true,
50
+ signature: false,
51
+ interpolation: true,
52
+ control: false,
53
+ call: false,
54
+ valueParameters: false,
55
+ declaration: false,
56
+ });
57
+ template = false;
58
+ expressionEnd = false;
59
+ previous = "{";
60
+ i += 2;
61
+ continue;
62
+ }
63
+ i++;
64
+ continue;
65
+ }
66
+ if (/\s/.test(char)) {
67
+ i++;
68
+ continue;
69
+ }
70
+ if (char === "/" && next === "/") {
71
+ i = lineCommentEnd(source, i);
72
+ continue;
73
+ }
74
+ if (char === "/" && next === "*") {
75
+ const span = commentSpan(source, i + 2);
76
+ if (!span)
77
+ return fail("unterminated_comment");
78
+ // Keep declaration docs and every delimiter line with the source signature.
79
+ if (span.newlines + 1 >= settings.minCommentLines &&
80
+ templateDepth === 0 &&
81
+ !stack.some((open) => open.protected) &&
82
+ !source.startsWith("/**", i) &&
83
+ !source.startsWith("/*!", i)) {
84
+ ranges.push({ startLine: line + 1, endLine: line + span.newlines - 1 });
85
+ }
86
+ if (source.startsWith("/**", i) || source.startsWith("/*!", i))
87
+ headers.protect(line, line + span.newlines);
88
+ line += span.newlines;
89
+ i = span.end;
90
+ continue;
91
+ }
92
+ if (char === '"' || char === "'") {
93
+ const span = stringSpan(source, i + 1, char);
94
+ if (!span)
95
+ return fail("unterminated_string");
96
+ line += span.newlines;
97
+ i = span.end;
98
+ previous = "literal";
99
+ expressionEnd = true;
100
+ if (!stack.length)
101
+ importClause = false;
102
+ continue;
103
+ }
104
+ if (char === "`") {
105
+ template = true;
106
+ templateDepth++;
107
+ i++;
108
+ continue;
109
+ }
110
+ if (char === "/") {
111
+ if (expressionEnd === null)
112
+ return fail("ambiguous_regex_literal");
113
+ if (!expressionEnd) {
114
+ const span = regexSpan(source, i + 1);
115
+ if (!span)
116
+ return fail("ambiguous_or_unterminated_regex");
117
+ i = span.end;
118
+ previous = "literal";
119
+ expressionEnd = true;
120
+ continue;
121
+ }
122
+ i += next === "=" ? 2 : 1;
123
+ expressionEnd = false;
124
+ previous = "/";
125
+ continue;
126
+ }
127
+ if (/[A-Za-z_$]/.test(char)) {
128
+ const start = i++;
129
+ while (/[A-Za-z_$0-9]/.test(source[i] ?? ""))
130
+ i++;
131
+ beforeWord = previous;
132
+ previous = source.slice(start, i);
133
+ wordLine = line;
134
+ if (!headers.word(previous, beforeWord, stack.length, line, language === "ts"))
135
+ return fail("unproved_header");
136
+ expressionEnd = !expressionKeywords.has(previous);
137
+ if (language === "ts" && signatureDeclarations.has(previous))
138
+ signatureDeclaration = true;
139
+ if (previous === "import")
140
+ importClause = true;
141
+ if (previous === "from")
142
+ importClause = false;
143
+ continue;
144
+ }
145
+ if (/[0-9]/.test(char)) {
146
+ i++;
147
+ while (/[A-Za-z_0-9.]/.test(source[i] ?? ""))
148
+ i++;
149
+ expressionEnd = true;
150
+ previous = "number";
151
+ continue;
152
+ }
153
+ if (char === "{" || char === "[" || char === "(") {
154
+ if (char === "{" && ambiguousAngleDepth !== undefined)
155
+ return fail("ambiguous_angle_syntax");
156
+ if (language !== "json" &&
157
+ char !== "(" &&
158
+ previous === "," &&
159
+ !stack.some((open) => open.protected) &&
160
+ stack.at(-1)?.char !== "[" &&
161
+ !stack.at(-1)?.call)
162
+ return fail("ambiguous_binding");
163
+ const classBody = headers.open(char, stack.length, previous, line);
164
+ if (!headers.punctuation(char, stack.length, line))
165
+ return fail("unproved_header");
166
+ const call = char === "(" && isCallCallee(previous, beforeWord);
167
+ const declaration = signatureDeclaration && !stack.some((open) => open.declaration);
168
+ const signature = declaration ||
169
+ headers.active ||
170
+ stack.some((open) => open.signature) ||
171
+ (language !== "json" && char === "[" && stack.at(-1)?.char === "{") ||
172
+ importClause ||
173
+ ["const", "let", "var", "export", "type", "#", "!"].includes(previous) ||
174
+ (language !== "json" && [":", "<", "&", "|"].includes(previous)) ||
175
+ (language === "ts" && previous === "=>" && !valueArrow);
176
+ const protectedRange = signature ||
177
+ (char === "(" && !call && !(previous === "=>" && valueArrow)) ||
178
+ stack.some((open) => open.protected);
179
+ const foldable = templateDepth === 0 &&
180
+ char !== "(" &&
181
+ !classBody &&
182
+ !protectedRange &&
183
+ (char === "{" || !expressionEnd || language === "json");
184
+ stack.push({
185
+ char,
186
+ line,
187
+ headerLine: char === "(" ? wordLine : line,
188
+ target: char !== "(" && !expressionEnd,
189
+ foldable,
190
+ protected: protectedRange,
191
+ signature,
192
+ interpolation: false,
193
+ control: char === "(" && controls.has(previous),
194
+ call,
195
+ valueParameters: char === "(" && stack.at(-1)?.call === true && ["(", ","].includes(previous),
196
+ declaration,
197
+ });
198
+ valueArrow = false;
199
+ expressionEnd = false;
200
+ previous = char;
201
+ i++;
202
+ continue;
203
+ }
204
+ if (char === "}" || char === "]" || char === ")") {
205
+ const open = stack.pop();
206
+ if (ambiguousAngleDepth !== undefined && stack.length < ambiguousAngleDepth)
207
+ ambiguousAngleDepth = undefined;
208
+ if (!open || { "{": "}", "[": "]", "(": ")" }[open.char] !== char)
209
+ return fail("unbalanced_delimiters");
210
+ if (open.interpolation) {
211
+ template = true;
212
+ i++;
213
+ continue;
214
+ }
215
+ headers.close(open, stack.length, line);
216
+ if (open.foldable && line - open.line - 1 >= settings.minBodyLines)
217
+ ranges.push({ startLine: open.line + 1, endLine: line - 1 });
218
+ valueArrow = open.valueParameters;
219
+ if (open.declaration)
220
+ signatureDeclaration = false;
221
+ expressionEnd = open.control ? false : char === "}" ? null : true;
222
+ if (char === "}")
223
+ importClause = false;
224
+ previous = char;
225
+ i++;
226
+ continue;
227
+ }
228
+ if ((char === "+" || char === "-") && next === char) {
229
+ previous = char + char;
230
+ i += 2;
231
+ continue;
232
+ }
233
+ // JSX, escaped identifiers and unknown lexical tokens cannot establish safe delimiters.
234
+ if (char === "<" && language === "ts" && expressionEnd) {
235
+ const span = typeArgumentsSpan(source, i + 1);
236
+ if (span) {
237
+ line += span.newlines;
238
+ i = span.end;
239
+ previous = ">";
240
+ continue;
241
+ }
242
+ // A comparison can finish at its enclosing delimiter; an unresolved generic
243
+ // reaching a brace must fail rather than fold constraint/signature members.
244
+ if (!/^\s*\{/.test(source.slice(i + 1)))
245
+ ambiguousAngleDepth = stack.length;
246
+ }
247
+ if (char === "<" && !expressionEnd && /^<\/?[A-Za-z]/.test(source.slice(i)))
248
+ return fail("ambiguous_angle_syntax");
249
+ if (!";:,.?=><!~+-*%&|^".includes(char))
250
+ return fail("unknown_token");
251
+ if (char === ";") {
252
+ importClause = false;
253
+ signatureDeclaration = false;
254
+ if (ambiguousAngleDepth === stack.length)
255
+ ambiguousAngleDepth = undefined;
256
+ }
257
+ if (!headers.punctuation(char === "=" && next === ">" ? "=>" : char, stack.length, line))
258
+ return fail("unproved_header");
259
+ valueArrow = valueArrow && previous === ")" && char === "=" && next === ">";
260
+ previous = char === "=" && next === ">" ? "=>" : char;
261
+ i += previous === "=>" ? 2 : 1;
262
+ expressionEnd = char === "." ? null : false;
263
+ }
264
+ return template || templateDepth || stack.length || headers.unfinished
265
+ ? fail("unbalanced_or_unproved_header")
266
+ : { status: "parsed", ranges: headers.filter(ranges) };
267
+ }
268
+ //# sourceMappingURL=brace-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brace-scanner.js","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/brace-scanner.ts"],"names":[],"mappings":"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","sourcesContent":["import { HeaderProtection } from \"./header-protection.ts\";\nimport { controls, expressionKeywords, isCallCallee, type Open, signatureDeclarations } from \"./lexical-context.ts\";\nimport { commentSpan, lineCommentEnd, regexSpan, stringSpan, typeArgumentsSpan } from \"./lexical-spans.ts\";\nimport type { ReadBraceScan, ReadFoldSettings, ReadLineRange } from \"./types.ts\";\n\n/** Measured row-17 brace lexer, restricted to the three selected languages. */\nexport function scanBraces(source: string, language: \"ts\" | \"js\" | \"json\", settings: ReadFoldSettings): ReadBraceScan {\n\tconst ranges: ReadLineRange[] = [];\n\tconst stack: Open[] = [];\n\tconst headers = new HeaderProtection();\n\tconst fail = (reason: string): ReadBraceScan => ({ status: \"parse_failure\", reason });\n\tlet line = 1;\n\tlet i = 0;\n\tlet template = false;\n\tlet templateDepth = 0;\n\tlet previous = \"\";\n\tlet beforeWord = \"\";\n\tlet wordLine = 1;\n\tlet valueArrow = false;\n\tlet expressionEnd: boolean | null = false;\n\tlet importClause = false;\n\tlet ambiguousAngleDepth: number | undefined;\n\tlet signatureDeclaration = false;\n\tif (source.startsWith(\"#!\")) {\n\t\tconst end = source.indexOf(\"\\n\");\n\t\ti = end < 0 ? source.length : end;\n\t}\n\twhile (i < source.length) {\n\t\tconst char = source[i];\n\t\tconst next = source[i + 1];\n\t\tif (char === \"\\n\") line++;\n\t\tif (template) {\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tif (next === \"\\n\") line++;\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"`\") {\n\t\t\t\ttemplate = false;\n\t\t\t\ttemplateDepth--;\n\t\t\t\texpressionEnd = true;\n\t\t\t\tprevious = \"literal\";\n\t\t\t} else if (char === \"$\" && next === \"{\") {\n\t\t\t\tstack.push({\n\t\t\t\t\tchar: \"{\",\n\t\t\t\t\tline,\n\t\t\t\t\tfoldable: false,\n\t\t\t\t\tprotected: true,\n\t\t\t\t\tsignature: false,\n\t\t\t\t\tinterpolation: true,\n\t\t\t\t\tcontrol: false,\n\t\t\t\t\tcall: false,\n\t\t\t\t\tvalueParameters: false,\n\t\t\t\t\tdeclaration: false,\n\t\t\t\t});\n\t\t\t\ttemplate = false;\n\t\t\t\texpressionEnd = false;\n\t\t\t\tprevious = \"{\";\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(char)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"/\" && next === \"/\") {\n\t\t\ti = lineCommentEnd(source, i);\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"/\" && next === \"*\") {\n\t\t\tconst span = commentSpan(source, i + 2);\n\t\t\tif (!span) return fail(\"unterminated_comment\");\n\t\t\t// Keep declaration docs and every delimiter line with the source signature.\n\t\t\tif (\n\t\t\t\tspan.newlines + 1 >= settings.minCommentLines &&\n\t\t\t\ttemplateDepth === 0 &&\n\t\t\t\t!stack.some((open) => open.protected) &&\n\t\t\t\t!source.startsWith(\"/**\", i) &&\n\t\t\t\t!source.startsWith(\"/*!\", i)\n\t\t\t) {\n\t\t\t\tranges.push({ startLine: line + 1, endLine: line + span.newlines - 1 });\n\t\t\t}\n\t\t\tif (source.startsWith(\"/**\", i) || source.startsWith(\"/*!\", i)) headers.protect(line, line + span.newlines);\n\t\t\tline += span.newlines;\n\t\t\ti = span.end;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tconst span = stringSpan(source, i + 1, char);\n\t\t\tif (!span) return fail(\"unterminated_string\");\n\t\t\tline += span.newlines;\n\t\t\ti = span.end;\n\t\t\tprevious = \"literal\";\n\t\t\texpressionEnd = true;\n\t\t\tif (!stack.length) importClause = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"`\") {\n\t\t\ttemplate = true;\n\t\t\ttemplateDepth++;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"/\") {\n\t\t\tif (expressionEnd === null) return fail(\"ambiguous_regex_literal\");\n\t\t\tif (!expressionEnd) {\n\t\t\t\tconst span = regexSpan(source, i + 1);\n\t\t\t\tif (!span) return fail(\"ambiguous_or_unterminated_regex\");\n\t\t\t\ti = span.end;\n\t\t\t\tprevious = \"literal\";\n\t\t\t\texpressionEnd = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti += next === \"=\" ? 2 : 1;\n\t\t\texpressionEnd = false;\n\t\t\tprevious = \"/\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[A-Za-z_$]/.test(char)) {\n\t\t\tconst start = i++;\n\t\t\twhile (/[A-Za-z_$0-9]/.test(source[i] ?? \"\")) i++;\n\t\t\tbeforeWord = previous;\n\t\t\tprevious = source.slice(start, i);\n\t\t\twordLine = line;\n\t\t\tif (!headers.word(previous, beforeWord, stack.length, line, language === \"ts\")) return fail(\"unproved_header\");\n\t\t\texpressionEnd = !expressionKeywords.has(previous);\n\t\t\tif (language === \"ts\" && signatureDeclarations.has(previous)) signatureDeclaration = true;\n\t\t\tif (previous === \"import\") importClause = true;\n\t\t\tif (previous === \"from\") importClause = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[0-9]/.test(char)) {\n\t\t\ti++;\n\t\t\twhile (/[A-Za-z_0-9.]/.test(source[i] ?? \"\")) i++;\n\t\t\texpressionEnd = true;\n\t\t\tprevious = \"number\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"{\" || char === \"[\" || char === \"(\") {\n\t\t\tif (char === \"{\" && ambiguousAngleDepth !== undefined) return fail(\"ambiguous_angle_syntax\");\n\t\t\tif (\n\t\t\t\tlanguage !== \"json\" &&\n\t\t\t\tchar !== \"(\" &&\n\t\t\t\tprevious === \",\" &&\n\t\t\t\t!stack.some((open) => open.protected) &&\n\t\t\t\tstack.at(-1)?.char !== \"[\" &&\n\t\t\t\t!stack.at(-1)?.call\n\t\t\t)\n\t\t\t\treturn fail(\"ambiguous_binding\");\n\t\t\tconst classBody = headers.open(char, stack.length, previous, line);\n\t\t\tif (!headers.punctuation(char, stack.length, line)) return fail(\"unproved_header\");\n\t\t\tconst call = char === \"(\" && isCallCallee(previous, beforeWord);\n\t\t\tconst declaration = signatureDeclaration && !stack.some((open) => open.declaration);\n\t\t\tconst signature =\n\t\t\t\tdeclaration ||\n\t\t\t\theaders.active ||\n\t\t\t\tstack.some((open) => open.signature) ||\n\t\t\t\t(language !== \"json\" && char === \"[\" && stack.at(-1)?.char === \"{\") ||\n\t\t\t\timportClause ||\n\t\t\t\t[\"const\", \"let\", \"var\", \"export\", \"type\", \"#\", \"!\"].includes(previous) ||\n\t\t\t\t(language !== \"json\" && [\":\", \"<\", \"&\", \"|\"].includes(previous)) ||\n\t\t\t\t(language === \"ts\" && previous === \"=>\" && !valueArrow);\n\t\t\tconst protectedRange =\n\t\t\t\tsignature ||\n\t\t\t\t(char === \"(\" && !call && !(previous === \"=>\" && valueArrow)) ||\n\t\t\t\tstack.some((open) => open.protected);\n\t\t\tconst foldable =\n\t\t\t\ttemplateDepth === 0 &&\n\t\t\t\tchar !== \"(\" &&\n\t\t\t\t!classBody &&\n\t\t\t\t!protectedRange &&\n\t\t\t\t(char === \"{\" || !expressionEnd || language === \"json\");\n\t\t\tstack.push({\n\t\t\t\tchar,\n\t\t\t\tline,\n\t\t\t\theaderLine: char === \"(\" ? wordLine : line,\n\t\t\t\ttarget: char !== \"(\" && !expressionEnd,\n\t\t\t\tfoldable,\n\t\t\t\tprotected: protectedRange,\n\t\t\t\tsignature,\n\t\t\t\tinterpolation: false,\n\t\t\t\tcontrol: char === \"(\" && controls.has(previous),\n\t\t\t\tcall,\n\t\t\t\tvalueParameters: char === \"(\" && stack.at(-1)?.call === true && [\"(\", \",\"].includes(previous),\n\t\t\t\tdeclaration,\n\t\t\t});\n\t\t\tvalueArrow = false;\n\t\t\texpressionEnd = false;\n\t\t\tprevious = char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"}\" || char === \"]\" || char === \")\") {\n\t\t\tconst open = stack.pop();\n\t\t\tif (ambiguousAngleDepth !== undefined && stack.length < ambiguousAngleDepth) ambiguousAngleDepth = undefined;\n\t\t\tif (!open || { \"{\": \"}\", \"[\": \"]\", \"(\": \")\" }[open.char] !== char) return fail(\"unbalanced_delimiters\");\n\t\t\tif (open.interpolation) {\n\t\t\t\ttemplate = true;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\theaders.close(open, stack.length, line);\n\t\t\tif (open.foldable && line - open.line - 1 >= settings.minBodyLines)\n\t\t\t\tranges.push({ startLine: open.line + 1, endLine: line - 1 });\n\t\t\tvalueArrow = open.valueParameters;\n\t\t\tif (open.declaration) signatureDeclaration = false;\n\t\t\texpressionEnd = open.control ? false : char === \"}\" ? null : true;\n\t\t\tif (char === \"}\") importClause = false;\n\t\t\tprevious = char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif ((char === \"+\" || char === \"-\") && next === char) {\n\t\t\tprevious = char + char;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\t// JSX, escaped identifiers and unknown lexical tokens cannot establish safe delimiters.\n\t\tif (char === \"<\" && language === \"ts\" && expressionEnd) {\n\t\t\tconst span = typeArgumentsSpan(source, i + 1);\n\t\t\tif (span) {\n\t\t\t\tline += span.newlines;\n\t\t\t\ti = span.end;\n\t\t\t\tprevious = \">\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// A comparison can finish at its enclosing delimiter; an unresolved generic\n\t\t\t// reaching a brace must fail rather than fold constraint/signature members.\n\t\t\tif (!/^\\s*\\{/.test(source.slice(i + 1))) ambiguousAngleDepth = stack.length;\n\t\t}\n\t\tif (char === \"<\" && !expressionEnd && /^<\\/?[A-Za-z]/.test(source.slice(i)))\n\t\t\treturn fail(\"ambiguous_angle_syntax\");\n\t\tif (!\";:,.?=><!~+-*%&|^\".includes(char)) return fail(\"unknown_token\");\n\t\tif (char === \";\") {\n\t\t\timportClause = false;\n\t\t\tsignatureDeclaration = false;\n\t\t\tif (ambiguousAngleDepth === stack.length) ambiguousAngleDepth = undefined;\n\t\t}\n\t\tif (!headers.punctuation(char === \"=\" && next === \">\" ? \"=>\" : char, stack.length, line))\n\t\t\treturn fail(\"unproved_header\");\n\t\tvalueArrow = valueArrow && previous === \")\" && char === \"=\" && next === \">\";\n\t\tprevious = char === \"=\" && next === \">\" ? \"=>\" : char;\n\t\ti += previous === \"=>\" ? 2 : 1;\n\t\texpressionEnd = char === \".\" ? null : false;\n\t}\n\treturn template || templateDepth || stack.length || headers.unfinished\n\t\t? fail(\"unbalanced_or_unproved_header\")\n\t\t: { status: \"parsed\", ranges: headers.filter(ranges) };\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { Open } from "./lexical-context.ts";
2
+ import type { ReadLineRange } from "./types.ts";
3
+ /** A lexical proof only: ambiguous headers invalidate the whole parse, not just one fold. */
4
+ export declare class HeaderProtection {
5
+ readonly intervals: ReadLineRange[];
6
+ private pending;
7
+ private target;
8
+ private parameters;
9
+ get active(): boolean;
10
+ get unfinished(): boolean;
11
+ word(word: string, previous: string, depth: number, line: number, typescript: boolean): boolean;
12
+ open(char: string, depth: number, previous: string, line: number): boolean;
13
+ close(open: Open, depth: number, line: number): void;
14
+ punctuation(token: string, depth: number, line: number): boolean;
15
+ protect(startLine: number, endLine: number): void;
16
+ filter(ranges: readonly ReadLineRange[]): ReadLineRange[];
17
+ }
18
+ //# sourceMappingURL=header-protection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-protection.d.ts","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/header-protection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,6FAA6F;AAC7F,qBAAa,gBAAgB;IAC5B,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAM;IACzC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAqE;IAEvF,IAAI,MAAM,IAAI,OAAO,CAEpB;IACD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAU9F;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQzE;IAED,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAY/D;IAED,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;IAED,MAAM,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,EAAE,CAKxD;CACD"}
@@ -0,0 +1,69 @@
1
+ /** A lexical proof only: ambiguous headers invalidate the whole parse, not just one fold. */
2
+ export class HeaderProtection {
3
+ constructor() {
4
+ this.intervals = [];
5
+ }
6
+ get active() {
7
+ return this.pending !== undefined;
8
+ }
9
+ get unfinished() {
10
+ return this.pending !== undefined;
11
+ }
12
+ word(word, previous, depth, line, typescript) {
13
+ this.target = undefined;
14
+ // These operators can hide an arbitrarily shaped type before a real body.
15
+ // No TypeScript grammar is installed: do not infer a boundary from the next brace.
16
+ if (typescript && ["keyof", "typeof", "infer", "readonly", "satisfies", "as"].includes(word))
17
+ return false;
18
+ if ((word === "class" || word === "function") && previous !== ".") {
19
+ if (this.pending)
20
+ return false; // e.g. a nested class expression in heritage
21
+ this.pending = { kind: word, depth, startLine: line };
22
+ }
23
+ return true;
24
+ }
25
+ open(char, depth, previous, line) {
26
+ const header = this.pending;
27
+ if (char !== "{" || header?.depth !== depth)
28
+ return false;
29
+ if (header.kind === "function" && previous !== ")")
30
+ return false;
31
+ this.protect(header.startLine, line);
32
+ this.pending = undefined;
33
+ this.parameters = undefined;
34
+ return header.kind === "class";
35
+ }
36
+ close(open, depth, line) {
37
+ this.target = open.target ? open.line : undefined;
38
+ const startLine = open.headerLine ?? open.line;
39
+ // Every protected member context, not only a proven signature, must survive enclosing folds.
40
+ if (open.protected && (open.signature || open.char !== "("))
41
+ this.protect(startLine, line);
42
+ if (open.char === "(" && !open.call && !open.control)
43
+ this.parameters = { depth, startLine };
44
+ }
45
+ punctuation(token, depth, line) {
46
+ // A value-position array/object reaching '=' is a destructuring assignment target.
47
+ // Protecting it retrospectively rejects both its members and any enclosing body.
48
+ const target = this.target;
49
+ this.target = undefined;
50
+ if (token === "=" && target !== undefined)
51
+ this.protect(target, line);
52
+ if (token === ":" && this.parameters?.depth === depth)
53
+ return false;
54
+ if ((token === "{" || token === "=>") && this.parameters?.depth === depth) {
55
+ this.protect(this.parameters.startLine, line);
56
+ this.parameters = undefined;
57
+ }
58
+ else if (token === ";" || token === "=" || token === ",")
59
+ this.parameters = undefined;
60
+ return true;
61
+ }
62
+ protect(startLine, endLine) {
63
+ this.intervals.push({ startLine, endLine });
64
+ }
65
+ filter(ranges) {
66
+ return ranges.filter((range) => !this.intervals.some((header) => range.startLine <= header.endLine && range.endLine >= header.startLine));
67
+ }
68
+ }
69
+ //# sourceMappingURL=header-protection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-protection.js","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/header-protection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Open } from \"./lexical-context.ts\";\nimport type { ReadLineRange } from \"./types.ts\";\n\ntype Header = { readonly kind: \"class\" | \"function\"; readonly depth: number; readonly startLine: number };\n\n/** A lexical proof only: ambiguous headers invalidate the whole parse, not just one fold. */\nexport class HeaderProtection {\n\treadonly intervals: ReadLineRange[] = [];\n\tprivate pending: Header | undefined;\n\tprivate target: number | undefined;\n\tprivate parameters: { readonly depth: number; readonly startLine: number } | undefined;\n\n\tget active(): boolean {\n\t\treturn this.pending !== undefined;\n\t}\n\tget unfinished(): boolean {\n\t\treturn this.pending !== undefined;\n\t}\n\n\tword(word: string, previous: string, depth: number, line: number, typescript: boolean): boolean {\n\t\tthis.target = undefined;\n\t\t// These operators can hide an arbitrarily shaped type before a real body.\n\t\t// No TypeScript grammar is installed: do not infer a boundary from the next brace.\n\t\tif (typescript && [\"keyof\", \"typeof\", \"infer\", \"readonly\", \"satisfies\", \"as\"].includes(word)) return false;\n\t\tif ((word === \"class\" || word === \"function\") && previous !== \".\") {\n\t\t\tif (this.pending) return false; // e.g. a nested class expression in heritage\n\t\t\tthis.pending = { kind: word, depth, startLine: line };\n\t\t}\n\t\treturn true;\n\t}\n\n\topen(char: string, depth: number, previous: string, line: number): boolean {\n\t\tconst header = this.pending;\n\t\tif (char !== \"{\" || header?.depth !== depth) return false;\n\t\tif (header.kind === \"function\" && previous !== \")\") return false;\n\t\tthis.protect(header.startLine, line);\n\t\tthis.pending = undefined;\n\t\tthis.parameters = undefined;\n\t\treturn header.kind === \"class\";\n\t}\n\n\tclose(open: Open, depth: number, line: number): void {\n\t\tthis.target = open.target ? open.line : undefined;\n\t\tconst startLine = open.headerLine ?? open.line;\n\t\t// Every protected member context, not only a proven signature, must survive enclosing folds.\n\t\tif (open.protected && (open.signature || open.char !== \"(\")) this.protect(startLine, line);\n\t\tif (open.char === \"(\" && !open.call && !open.control) this.parameters = { depth, startLine };\n\t}\n\n\tpunctuation(token: string, depth: number, line: number): boolean {\n\t\t// A value-position array/object reaching '=' is a destructuring assignment target.\n\t\t// Protecting it retrospectively rejects both its members and any enclosing body.\n\t\tconst target = this.target;\n\t\tthis.target = undefined;\n\t\tif (token === \"=\" && target !== undefined) this.protect(target, line);\n\t\tif (token === \":\" && this.parameters?.depth === depth) return false;\n\t\tif ((token === \"{\" || token === \"=>\") && this.parameters?.depth === depth) {\n\t\t\tthis.protect(this.parameters.startLine, line);\n\t\t\tthis.parameters = undefined;\n\t\t} else if (token === \";\" || token === \"=\" || token === \",\") this.parameters = undefined;\n\t\treturn true;\n\t}\n\n\tprotect(startLine: number, endLine: number): void {\n\t\tthis.intervals.push({ startLine, endLine });\n\t}\n\n\tfilter(ranges: readonly ReadLineRange[]): ReadLineRange[] {\n\t\treturn ranges.filter(\n\t\t\t(range) =>\n\t\t\t\t!this.intervals.some((header) => range.startLine <= header.endLine && range.endLine >= header.startLine),\n\t\t);\n\t}\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import type { ReadFolder } from "./types.ts";
2
+ export * from "./types.ts";
3
+ /** Frozen row-17 selection, not a runtime registry that can enable unmeasured grammars. */
4
+ export declare const READ_FOLDER_SELECTION: Readonly<{
5
+ readonly head: "0830b8c466e1f0689fa7f6f33cb7cfcd188b5407";
6
+ readonly selectionSha256: "b10b790182c83603cdc66f7e0d3b88464456ad49a45e621aea140d9c033f13a6";
7
+ readonly wasm: false;
8
+ readonly rawReasons: Readonly<{
9
+ readonly ts: "wasm_candidate_pending_owner";
10
+ readonly js: "wasm_candidate_pending_owner";
11
+ }>;
12
+ readonly languages: Readonly<{
13
+ readonly ts: "raw";
14
+ readonly js: "raw";
15
+ readonly json: "heuristic";
16
+ readonly tsx: "unsupported";
17
+ readonly python: "unsupported";
18
+ readonly rust: "unsupported";
19
+ readonly go: "unsupported";
20
+ readonly markdown: "prose_exempt";
21
+ readonly txt: "prose_exempt";
22
+ }>;
23
+ }>;
24
+ /** Reader eligibility stays bound to the frozen selection even with a custom folder. */
25
+ export declare function isReadSummaryPath(path: string): boolean;
26
+ export declare const selectedReadFolder: ReadFolder;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmE,MAAM,YAAY,CAAC;AAE9G,cAAc,YAAY,CAAC;AAE3B,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB;mBAC3B,0CAA0C;8BAC/B,kEAAkE;;;qBAEnD,8BAA8B;qBAAM,8BAA8B;;;qBAE7F,KAAK;qBACL,KAAK;uBACH,WAAW;sBACZ,aAAa;yBACV,aAAa;uBACf,aAAa;qBACf,aAAa;2BACP,cAAc;sBACnB,cAAc;;EAEV,CAAC;AAkCZ,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGvD;AA4DD,eAAO,MAAM,kBAAkB,EAAE,UAAwE,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { scanBraces } from "./brace-scanner.js";
2
+ export * from "./types.js";
3
+ /** Frozen row-17 selection, not a runtime registry that can enable unmeasured grammars. */
4
+ export const READ_FOLDER_SELECTION = Object.freeze({
5
+ head: "0830b8c466e1f0689fa7f6f33cb7cfcd188b5407",
6
+ selectionSha256: "b10b790182c83603cdc66f7e0d3b88464456ad49a45e621aea140d9c033f13a6",
7
+ wasm: false,
8
+ rawReasons: Object.freeze({ ts: "wasm_candidate_pending_owner", js: "wasm_candidate_pending_owner" }),
9
+ languages: Object.freeze({
10
+ ts: "raw",
11
+ js: "raw",
12
+ json: "heuristic",
13
+ tsx: "unsupported",
14
+ python: "unsupported",
15
+ rust: "unsupported",
16
+ go: "unsupported",
17
+ markdown: "prose_exempt",
18
+ txt: "prose_exempt",
19
+ }),
20
+ });
21
+ function languageForPath(path) {
22
+ const name = path.split(/[\\/]/).pop()?.toLowerCase() ?? "";
23
+ if (!name.includes("."))
24
+ return undefined;
25
+ switch (name.slice(name.lastIndexOf(".") + 1)) {
26
+ case "ts":
27
+ return "ts";
28
+ case "js":
29
+ return "js";
30
+ case "json":
31
+ return "json";
32
+ case "tsx":
33
+ return "tsx";
34
+ case "py":
35
+ return "python";
36
+ case "rs":
37
+ return "rust";
38
+ case "go":
39
+ return "go";
40
+ case "md":
41
+ case "markdown":
42
+ case "mdown":
43
+ case "mkd":
44
+ case "mkdn":
45
+ return "markdown";
46
+ case "txt":
47
+ return "txt";
48
+ default:
49
+ return undefined;
50
+ }
51
+ }
52
+ /** Reader eligibility stays bound to the frozen selection even with a custom folder. */
53
+ export function isReadSummaryPath(path) {
54
+ const language = languageForPath(path);
55
+ return language !== undefined && READ_FOLDER_SELECTION.languages[language] === "heuristic";
56
+ }
57
+ function hierarchy(ranges) {
58
+ const roots = [];
59
+ const stack = [];
60
+ for (const range of [...ranges].sort((a, b) => a.startLine - b.startLine || b.endLine - a.endLine)) {
61
+ while (stack.length && range.startLine > stack[stack.length - 1].endLine)
62
+ stack.pop();
63
+ const parent = stack[stack.length - 1];
64
+ if (parent && range.startLine === parent.startLine && range.endLine === parent.endLine)
65
+ continue;
66
+ if (parent && (range.startLine <= parent.startLine || range.endLine >= parent.endLine))
67
+ return undefined;
68
+ const node = { ...range, children: [] };
69
+ (parent ? parent.children : roots).push(node);
70
+ stack.push(node);
71
+ }
72
+ return roots;
73
+ }
74
+ function fold({ path, text, settings }) {
75
+ const language = languageForPath(path);
76
+ if (!language)
77
+ return { status: "unsupported", reason: "unsupported_language" };
78
+ const engine = READ_FOLDER_SELECTION.languages[language];
79
+ switch (engine) {
80
+ case "unsupported":
81
+ return { status: "unsupported", reason: "unsupported_language" };
82
+ case "prose_exempt":
83
+ return { status: "unsupported", reason: "prose_exempt" };
84
+ case "raw": // Retain the pure candidate for safety/quality measurement, never default-read eligibility.
85
+ case "heuristic":
86
+ break;
87
+ default:
88
+ return engine;
89
+ }
90
+ // Narrow the language independently: the manifest is the sole enablement authority.
91
+ if (language !== "ts" && language !== "js" && language !== "json")
92
+ return { status: "unsupported", reason: "unsupported_language" };
93
+ if (language === "json") {
94
+ try {
95
+ JSON.parse(text);
96
+ }
97
+ catch (error) {
98
+ if (error instanceof SyntaxError)
99
+ return { status: "parse_failure", reason: "invalid_json" };
100
+ throw error;
101
+ }
102
+ }
103
+ const scan = scanBraces(text, language, settings);
104
+ switch (scan.status) {
105
+ case "parse_failure":
106
+ return scan;
107
+ case "parsed": {
108
+ const ranges = hierarchy(scan.ranges);
109
+ return ranges
110
+ ? { status: "parsed", text, ranges }
111
+ : { status: "parse_failure", reason: "ambiguous_line_boundaries" };
112
+ }
113
+ default:
114
+ return scan;
115
+ }
116
+ }
117
+ export const selectedReadFolder = Object.freeze({ id: "measured-brace", version: "3", fold });
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { scanBraces } from \"./brace-scanner.ts\";\nimport type { ReadFolder, ReadFolderInput, ReadFolderResult, ReadFoldRange, ReadLineRange } from \"./types.ts\";\n\nexport * from \"./types.ts\";\n\n/** Frozen row-17 selection, not a runtime registry that can enable unmeasured grammars. */\nexport const READ_FOLDER_SELECTION = Object.freeze({\n\thead: \"0830b8c466e1f0689fa7f6f33cb7cfcd188b5407\",\n\tselectionSha256: \"b10b790182c83603cdc66f7e0d3b88464456ad49a45e621aea140d9c033f13a6\",\n\twasm: false,\n\trawReasons: Object.freeze({ ts: \"wasm_candidate_pending_owner\", js: \"wasm_candidate_pending_owner\" } as const),\n\tlanguages: Object.freeze({\n\t\tts: \"raw\",\n\t\tjs: \"raw\",\n\t\tjson: \"heuristic\",\n\t\ttsx: \"unsupported\",\n\t\tpython: \"unsupported\",\n\t\trust: \"unsupported\",\n\t\tgo: \"unsupported\",\n\t\tmarkdown: \"prose_exempt\",\n\t\ttxt: \"prose_exempt\",\n\t} as const),\n} as const);\n\ntype Language = keyof typeof READ_FOLDER_SELECTION.languages;\nfunction languageForPath(path: string): Language | undefined {\n\tconst name = path.split(/[\\\\/]/).pop()?.toLowerCase() ?? \"\";\n\tif (!name.includes(\".\")) return undefined;\n\tswitch (name.slice(name.lastIndexOf(\".\") + 1)) {\n\t\tcase \"ts\":\n\t\t\treturn \"ts\";\n\t\tcase \"js\":\n\t\t\treturn \"js\";\n\t\tcase \"json\":\n\t\t\treturn \"json\";\n\t\tcase \"tsx\":\n\t\t\treturn \"tsx\";\n\t\tcase \"py\":\n\t\t\treturn \"python\";\n\t\tcase \"rs\":\n\t\t\treturn \"rust\";\n\t\tcase \"go\":\n\t\t\treturn \"go\";\n\t\tcase \"md\":\n\t\tcase \"markdown\":\n\t\tcase \"mdown\":\n\t\tcase \"mkd\":\n\t\tcase \"mkdn\":\n\t\t\treturn \"markdown\";\n\t\tcase \"txt\":\n\t\t\treturn \"txt\";\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/** Reader eligibility stays bound to the frozen selection even with a custom folder. */\nexport function isReadSummaryPath(path: string): boolean {\n\tconst language = languageForPath(path);\n\treturn language !== undefined && READ_FOLDER_SELECTION.languages[language] === \"heuristic\";\n}\n\nfunction hierarchy(ranges: readonly ReadLineRange[]): readonly ReadFoldRange[] | undefined {\n\t// Builder-owned arrays; no caller-owned ranges are sorted or mutated.\n\ttype Node = ReadLineRange & { readonly children: Node[] };\n\tconst roots: Node[] = [];\n\tconst stack: Node[] = [];\n\tfor (const range of [...ranges].sort((a, b) => a.startLine - b.startLine || b.endLine - a.endLine)) {\n\t\twhile (stack.length && range.startLine > stack[stack.length - 1].endLine) stack.pop();\n\t\tconst parent = stack[stack.length - 1];\n\t\tif (parent && range.startLine === parent.startLine && range.endLine === parent.endLine) continue;\n\t\tif (parent && (range.startLine <= parent.startLine || range.endLine >= parent.endLine)) return undefined;\n\t\tconst node: Node = { ...range, children: [] };\n\t\t(parent ? parent.children : roots).push(node);\n\t\tstack.push(node);\n\t}\n\treturn roots;\n}\n\nfunction fold({ path, text, settings }: ReadFolderInput): ReadFolderResult {\n\tconst language = languageForPath(path);\n\tif (!language) return { status: \"unsupported\", reason: \"unsupported_language\" };\n\tconst engine = READ_FOLDER_SELECTION.languages[language];\n\tswitch (engine) {\n\t\tcase \"unsupported\":\n\t\t\treturn { status: \"unsupported\", reason: \"unsupported_language\" };\n\t\tcase \"prose_exempt\":\n\t\t\treturn { status: \"unsupported\", reason: \"prose_exempt\" };\n\t\tcase \"raw\": // Retain the pure candidate for safety/quality measurement, never default-read eligibility.\n\t\tcase \"heuristic\":\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn engine satisfies never;\n\t}\n\t// Narrow the language independently: the manifest is the sole enablement authority.\n\tif (language !== \"ts\" && language !== \"js\" && language !== \"json\")\n\t\treturn { status: \"unsupported\", reason: \"unsupported_language\" };\n\tif (language === \"json\") {\n\t\ttry {\n\t\t\tJSON.parse(text);\n\t\t} catch (error) {\n\t\t\tif (error instanceof SyntaxError) return { status: \"parse_failure\", reason: \"invalid_json\" };\n\t\t\tthrow error;\n\t\t}\n\t}\n\tconst scan = scanBraces(text, language, settings);\n\tswitch (scan.status) {\n\t\tcase \"parse_failure\":\n\t\t\treturn scan;\n\t\tcase \"parsed\": {\n\t\t\tconst ranges = hierarchy(scan.ranges);\n\t\t\treturn ranges\n\t\t\t\t? { status: \"parsed\", text, ranges }\n\t\t\t\t: { status: \"parse_failure\", reason: \"ambiguous_line_boundaries\" };\n\t\t}\n\t\tdefault:\n\t\t\treturn scan satisfies never;\n\t}\n}\n\nexport const selectedReadFolder: ReadFolder = Object.freeze({ id: \"measured-brace\", version: \"3\", fold });\n"]}
@@ -0,0 +1,21 @@
1
+ export type Open = {
2
+ readonly char: "{" | "[" | "(";
3
+ readonly line: number;
4
+ readonly headerLine?: number;
5
+ /** Opened where a value may start, so it can still turn out to be an assignment target. */
6
+ readonly target?: boolean;
7
+ readonly foldable: boolean;
8
+ readonly protected: boolean;
9
+ readonly signature: boolean;
10
+ readonly interpolation: boolean;
11
+ readonly control: boolean;
12
+ readonly call: boolean;
13
+ readonly valueParameters: boolean;
14
+ readonly declaration: boolean;
15
+ };
16
+ export declare const expressionKeywords: Set<string>;
17
+ export declare const controls: Set<string>;
18
+ export declare const signatureDeclarations: Set<string>;
19
+ /** Only expression callees release argument values; declarations retain parameter protection. */
20
+ export declare function isCallCallee(previous: string, beforeWord: string): boolean;
21
+ //# sourceMappingURL=lexical-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexical-context.d.ts","sourceRoot":"","sources":["../../../../src/harness/utils/read-folders/lexical-context.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,aAY7B,CAAC;AACH,eAAO,MAAM,QAAQ,aAA6D,CAAC;AACnF,eAAO,MAAM,qBAAqB,aAA2E,CAAC;AAE9G,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ1E"}