@code-yeongyu/senpi 2026.9.15 → 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.
- package/CHANGELOG.md +46 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +25 -8
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +4 -5
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.js +14 -18
- package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js +32 -9
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts +23 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js +48 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts +13 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js +24 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +7 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +2 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +11 -9
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts +18 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js +61 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +4 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +1 -44
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +22 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +2 -13
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.js +25 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.js +33 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts +6 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js +22 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -35
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
- package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
- package/dist/core/extensions/kernel-tools-context.js +3 -0
- package/dist/core/extensions/kernel-tools-context.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +19 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +103 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +9 -17
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +14 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +23 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +41 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +4 -3
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/read.d.ts +3 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +16 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -3
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +5 -24
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -8
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +3 -0
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts +3 -0
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js +17 -6
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/shutdown.d.ts +3 -0
- package/dist/modes/rpc/shutdown.d.ts.map +1 -0
- package/dist/modes/rpc/shutdown.js +17 -0
- package/dist/modes/rpc/shutdown.js.map +1 -0
- package/docs/extensions.md +3 -0
- package/docs/settings.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +36 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +58 -10
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +9 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +8 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +36 -71
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image-resize.ts +52 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +37 -72
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +78 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +30 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +49 -30
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +35 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/tool-result-marshal.ts +23 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js
ADDED
|
@@ -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":"AAKA,6FAA6F;AAC7F,MAAM,OAAO,gBAAgB;IAA7B;QACU,cAAS,GAAoB,EAAE,CAAC;IAkE1C,CAAC;IA7DA,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAa,EAAE,IAAY,EAAE,UAAmB;QACpF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,0EAA0E;QAC1E,mFAAmF;QACnF,IAAI,UAAU,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3G,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC,CAAC,6CAA6C;YAC7E,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB,EAAE,IAAY;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,EAAE,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC1D,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAU,EAAE,KAAa,EAAE,IAAY;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;QAC/C,6FAA6F;QAC7F,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9F,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,IAAY;QACrD,mFAAmF;QACnF,iFAAiF;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACpE,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;YAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QACxF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,OAAe;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,MAAgC;QACtC,OAAO,MAAM,CAAC,MAAM,CACnB,CAAC,KAAK,EAAE,EAAE,CACT,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,CACzG,CAAC;IACH,CAAC;CACD","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
|
package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map
ADDED
|
@@ -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
|
package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map
ADDED
|
@@ -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"}
|