@mrclrchtr/supi-tree-sitter 4.9.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -6
- package/node_modules/@mrclrchtr/supi-code-runtime/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +9 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +53 -13
- package/node_modules/@mrclrchtr/supi-code-runtime/src/request-control.ts +47 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +13 -1
- package/node_modules/@mrclrchtr/supi-core/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-core/package.json +1 -1
- package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +31 -0
- package/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -0
- package/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +19 -3
- package/node_modules/@mrclrchtr/supi-core/src/debug-timing.ts +34 -21
- package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +3 -0
- package/node_modules/jiti/LICENSE +21 -0
- package/node_modules/jiti/README.md +258 -0
- package/node_modules/jiti/dist/babel.cjs +257 -0
- package/node_modules/jiti/dist/jiti.cjs +1 -0
- package/node_modules/jiti/lib/jiti-cli.mjs +34 -0
- package/node_modules/jiti/lib/jiti-hooks.mjs +124 -0
- package/node_modules/jiti/lib/jiti-native.mjs +121 -0
- package/node_modules/jiti/lib/jiti-register.d.mts +1 -0
- package/node_modules/jiti/lib/jiti-register.mjs +4 -0
- package/node_modules/jiti/lib/jiti-static.mjs +23 -0
- package/node_modules/jiti/lib/jiti.cjs +30 -0
- package/node_modules/jiti/lib/jiti.d.cts +8 -0
- package/node_modules/jiti/lib/jiti.d.mts +8 -0
- package/node_modules/jiti/lib/jiti.mjs +29 -0
- package/node_modules/jiti/lib/types.d.ts +420 -0
- package/node_modules/jiti/package.json +146 -0
- package/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm +0 -0
- package/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm.map +4 -4
- package/node_modules/web-tree-sitter/package.json +1 -1
- package/node_modules/web-tree-sitter/web-tree-sitter.wasm +0 -0
- package/node_modules/web-tree-sitter/web-tree-sitter.wasm.map +4 -4
- package/package.json +7 -3
- package/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +1 -1
- package/resources/grammars/sql/tree-sitter-sql.wasm.json +1 -1
- package/src/api.ts +0 -9
- package/src/index.ts +0 -8
- package/src/provider/tree-sitter-provider.ts +16 -12
- package/src/session/runtime-controller.ts +65 -87
- package/src/session/session.ts +47 -95
- package/src/session/structural-timing.ts +147 -0
- package/src/session/structural-worker-client-lifecycle.ts +39 -0
- package/src/session/structural-worker-client.ts +561 -0
- package/src/session/structural-worker-message-size.ts +24 -0
- package/src/session/structural-worker-protocol.ts +452 -0
- package/src/tool/call-sites.ts +4 -2
- package/src/tool/callees.ts +12 -4
- package/src/tool/exports.ts +4 -2
- package/src/tool/imports.ts +4 -2
- package/src/tool/node-at.ts +5 -3
- package/src/types.ts +33 -12
- package/src/worker/blocking-test-bootstrap.mjs +34 -0
- package/src/worker/bootstrap.mjs +8 -0
- package/src/worker/parsed-file-store-helpers.ts +23 -0
- package/src/worker/parsed-file-store.ts +400 -0
- package/src/worker/request-control.ts +48 -0
- package/src/worker/runtime-parser-helpers.ts +24 -0
- package/src/worker/runtime-query-helpers.ts +43 -0
- package/src/worker/runtime.ts +421 -0
- package/src/worker/service.ts +116 -0
- package/src/worker/worker-main.ts +201 -0
- package/src/session/runtime.ts +0 -247
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { performance } from "node:perf_hooks";
|
|
2
|
+
import { recordDebugEvent, startDebugTimer } from "@mrclrchtr/supi-core/debug";
|
|
3
|
+
import type { StructuralCacheObservation } from "../worker/parsed-file-store.ts";
|
|
4
|
+
|
|
5
|
+
/** Plain sanitized event sent from the Structural Worker to the parent. */
|
|
6
|
+
export interface StructuralTimingEvent {
|
|
7
|
+
readonly operationId?: string;
|
|
8
|
+
readonly source: "tree-sitter";
|
|
9
|
+
readonly level: "debug";
|
|
10
|
+
readonly category: "structural.parse.timing" | "structural.query.timing";
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly data: Readonly<Record<string, unknown>> & {
|
|
13
|
+
readonly timing: {
|
|
14
|
+
readonly durationMs: number;
|
|
15
|
+
readonly phasesMs: Readonly<Record<string, number>>;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface StructuralTimer {
|
|
21
|
+
mark(phase: string): void;
|
|
22
|
+
finish(
|
|
23
|
+
event: Omit<StructuralTimingEvent, "data"> & { data: Record<string, unknown> },
|
|
24
|
+
finalPhase: string,
|
|
25
|
+
): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type ParserState = "cold" | "initializing" | "reused";
|
|
29
|
+
export type ParseTimingPhase =
|
|
30
|
+
| "cache-lookup"
|
|
31
|
+
| "content-hash"
|
|
32
|
+
| "file-read"
|
|
33
|
+
| "parse"
|
|
34
|
+
| "parser-setup";
|
|
35
|
+
export type QueryTimingPhase = "query-cache" | "query-compilation" | "query-execution";
|
|
36
|
+
|
|
37
|
+
export type StructuralTimingObservation =
|
|
38
|
+
| {
|
|
39
|
+
readonly operation: "parse";
|
|
40
|
+
readonly grammar: string;
|
|
41
|
+
readonly parserState: ParserState;
|
|
42
|
+
readonly outcome:
|
|
43
|
+
| "cancelled"
|
|
44
|
+
| "completed"
|
|
45
|
+
| "file-access-error"
|
|
46
|
+
| "runtime-error"
|
|
47
|
+
| "timeout";
|
|
48
|
+
readonly cache?: StructuralCacheObservation;
|
|
49
|
+
readonly finalPhase: ParseTimingPhase;
|
|
50
|
+
}
|
|
51
|
+
| {
|
|
52
|
+
readonly operation: "query";
|
|
53
|
+
readonly grammar: string;
|
|
54
|
+
readonly outcome:
|
|
55
|
+
| "cancelled"
|
|
56
|
+
| "completed"
|
|
57
|
+
| "runtime-error"
|
|
58
|
+
| "timeout"
|
|
59
|
+
| "validation-error";
|
|
60
|
+
readonly captureCount: number;
|
|
61
|
+
readonly cache: StructuralCacheObservation;
|
|
62
|
+
readonly finalPhase: QueryTimingPhase;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/** Start one failure-isolated Tree-sitter timing observation. */
|
|
66
|
+
export function startStructuralTiming(
|
|
67
|
+
operationId?: string,
|
|
68
|
+
forward?: (event: StructuralTimingEvent) => void,
|
|
69
|
+
): StructuralTimer {
|
|
70
|
+
if (forward) return createForwardedTimer(operationId, forward);
|
|
71
|
+
const timer = startDebugTimer();
|
|
72
|
+
return {
|
|
73
|
+
mark(phase) {
|
|
74
|
+
timer.mark(phase);
|
|
75
|
+
},
|
|
76
|
+
finish(event, finalPhase) {
|
|
77
|
+
timer.finish({ ...event, operationId }, finalPhase);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Finish one sanitized Tree-sitter timing observation. */
|
|
83
|
+
export function finishStructuralTiming(
|
|
84
|
+
timer: StructuralTimer,
|
|
85
|
+
observation: StructuralTimingObservation,
|
|
86
|
+
): void {
|
|
87
|
+
const { finalPhase, ...data } = observation;
|
|
88
|
+
timer.finish(
|
|
89
|
+
{
|
|
90
|
+
source: "tree-sitter",
|
|
91
|
+
level: "debug",
|
|
92
|
+
category: `structural.${data.operation}.timing`,
|
|
93
|
+
message: `Tree-sitter ${data.operation} ${data.outcome}`,
|
|
94
|
+
data: { ...data },
|
|
95
|
+
},
|
|
96
|
+
finalPhase,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Publish one validated Worker timing event into the parent Debug Registry. */
|
|
101
|
+
export function publishStructuralTimingEvent(event: StructuralTimingEvent): void {
|
|
102
|
+
recordDebugEvent(event);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function createForwardedTimer(
|
|
106
|
+
operationId: string | undefined,
|
|
107
|
+
forward: (event: StructuralTimingEvent) => void,
|
|
108
|
+
): StructuralTimer {
|
|
109
|
+
const startedAt = performance.now();
|
|
110
|
+
let previousAt = startedAt;
|
|
111
|
+
let finished = false;
|
|
112
|
+
const phases = new Map<string, number>();
|
|
113
|
+
|
|
114
|
+
const mark = (phase: string, current: number) => {
|
|
115
|
+
phases.set(phase, (phases.get(phase) ?? 0) + Math.max(0, current - previousAt));
|
|
116
|
+
previousAt = current;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
mark(phase) {
|
|
121
|
+
if (!finished) mark(phase, performance.now());
|
|
122
|
+
},
|
|
123
|
+
finish(event, finalPhase) {
|
|
124
|
+
if (finished) return;
|
|
125
|
+
finished = true;
|
|
126
|
+
const completedAt = performance.now();
|
|
127
|
+
mark(finalPhase, completedAt);
|
|
128
|
+
forward({
|
|
129
|
+
...event,
|
|
130
|
+
...(operationId ? { operationId } : {}),
|
|
131
|
+
data: {
|
|
132
|
+
...event.data,
|
|
133
|
+
timing: {
|
|
134
|
+
durationMs: duration(completedAt - startedAt),
|
|
135
|
+
phasesMs: Object.fromEntries(
|
|
136
|
+
[...phases.entries()].map(([name, value]) => [name, duration(value)]),
|
|
137
|
+
),
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
} as StructuralTimingEvent);
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function duration(value: number): number {
|
|
146
|
+
return Math.round(Math.max(0, value) * 10) / 10;
|
|
147
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
interface OwnedWorkerLike {
|
|
2
|
+
terminate(): Promise<number>;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/** Serialize every Worker start, termination, and restart ownership transition. */
|
|
6
|
+
export class StructuralWorkerLifecycle {
|
|
7
|
+
#transition = Promise.resolve();
|
|
8
|
+
#generation = 0;
|
|
9
|
+
|
|
10
|
+
/** Run one transition after every older transition settles. */
|
|
11
|
+
run<T>(operation: () => Promise<T>): Promise<T> {
|
|
12
|
+
const generation = this.#generation;
|
|
13
|
+
const current = this.#transition.then(
|
|
14
|
+
() => this.#runIfCurrent(generation, operation),
|
|
15
|
+
() => this.#runIfCurrent(generation, operation),
|
|
16
|
+
);
|
|
17
|
+
this.#transition = current.then(
|
|
18
|
+
() => undefined,
|
|
19
|
+
() => undefined,
|
|
20
|
+
);
|
|
21
|
+
return current;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Terminate one Worker as part of the serialized transition fence. */
|
|
25
|
+
async terminate(worker: OwnedWorkerLike | null): Promise<void> {
|
|
26
|
+
this.#generation += 1;
|
|
27
|
+
if (worker) await worker.terminate().catch(() => 0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Await every transition admitted before this call. */
|
|
31
|
+
settled(): Promise<void> {
|
|
32
|
+
return this.#transition;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async #runIfCurrent<T>(generation: number, operation: () => Promise<T>): Promise<T> {
|
|
36
|
+
if (generation !== this.#generation) throw new Error("Structural Worker lifecycle superseded");
|
|
37
|
+
return operation();
|
|
38
|
+
}
|
|
39
|
+
}
|