@edeng23/pines 0.1.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/LICENSE +202 -0
- package/README.md +37 -0
- package/dist/cli.js +83 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/ansi.js +37 -0
- package/dist/client/ansi.js.map +1 -0
- package/dist/client/app.js +1868 -0
- package/dist/client/app.js.map +1 -0
- package/dist/client/boot.js +221 -0
- package/dist/client/boot.js.map +1 -0
- package/dist/client/commands.js +133 -0
- package/dist/client/commands.js.map +1 -0
- package/dist/client/daemon-client.js +99 -0
- package/dist/client/daemon-client.js.map +1 -0
- package/dist/client/forest/camera.js +88 -0
- package/dist/client/forest/camera.js.map +1 -0
- package/dist/client/forest/canvas.js +175 -0
- package/dist/client/forest/canvas.js.map +1 -0
- package/dist/client/forest/sidebar.js +182 -0
- package/dist/client/forest/sidebar.js.map +1 -0
- package/dist/client/forest/status.js +39 -0
- package/dist/client/forest/status.js.map +1 -0
- package/dist/client/forest/style.js +70 -0
- package/dist/client/forest/style.js.map +1 -0
- package/dist/client/forest/styles.js +429 -0
- package/dist/client/forest/styles.js.map +1 -0
- package/dist/client/forest/view.js +181 -0
- package/dist/client/forest/view.js.map +1 -0
- package/dist/client/forest/wordmark.js +26 -0
- package/dist/client/forest/wordmark.js.map +1 -0
- package/dist/client/input.js +89 -0
- package/dist/client/input.js.map +1 -0
- package/dist/client/theme.js +27 -0
- package/dist/client/theme.js.map +1 -0
- package/dist/client/tree/asciitree.js +277 -0
- package/dist/client/tree/asciitree.js.map +1 -0
- package/dist/client/tree/convmap.js +260 -0
- package/dist/client/tree/convmap.js.map +1 -0
- package/dist/client/tree/lanegraph.js +260 -0
- package/dist/client/tree/lanegraph.js.map +1 -0
- package/dist/client/tree/merge.js +161 -0
- package/dist/client/tree/merge.js.map +1 -0
- package/dist/client/tree/sessionview.js +163 -0
- package/dist/client/tree/sessionview.js.map +1 -0
- package/dist/client/tree/view.js +238 -0
- package/dist/client/tree/view.js.map +1 -0
- package/dist/client/uistate.js +45 -0
- package/dist/client/uistate.js.map +1 -0
- package/dist/daemon/agents.js +102 -0
- package/dist/daemon/agents.js.map +1 -0
- package/dist/daemon/branch.js +149 -0
- package/dist/daemon/branch.js.map +1 -0
- package/dist/daemon/embed-worker.js +74 -0
- package/dist/daemon/embed-worker.js.map +1 -0
- package/dist/daemon/essence.js +194 -0
- package/dist/daemon/essence.js.map +1 -0
- package/dist/daemon/extbridge.js +138 -0
- package/dist/daemon/extbridge.js.map +1 -0
- package/dist/daemon/lifecycle.js +134 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/pty-compat.js +53 -0
- package/dist/daemon/pty-compat.js.map +1 -0
- package/dist/daemon/semantic.js +337 -0
- package/dist/daemon/semantic.js.map +1 -0
- package/dist/daemon/server.js +808 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/supervisor.js +311 -0
- package/dist/daemon/supervisor.js.map +1 -0
- package/dist/extension/pines-extension.js +191 -0
- package/dist/extension/pines-extension.js.map +1 -0
- package/dist/layout/lexical.js +104 -0
- package/dist/layout/lexical.js.map +1 -0
- package/dist/layout/pca.js +91 -0
- package/dist/layout/pca.js.map +1 -0
- package/dist/layout/relax.js +47 -0
- package/dist/layout/relax.js.map +1 -0
- package/dist/session/ingest.js +95 -0
- package/dist/session/ingest.js.map +1 -0
- package/dist/session/parser.js +254 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/shared/config.js +30 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/paths.js +47 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/shared/protocol.js +9 -0
- package/dist/shared/protocol.js.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/wire.js +51 -0
- package/dist/shared/wire.js.map +1 -0
- package/dist/store/db.js +203 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/watcher.js +69 -0
- package/dist/store/watcher.js.map +1 -0
- package/package.json +80 -0
- package/scripts/fix-node-pty.mjs +34 -0
- package/src/extension/pines-extension.ts +192 -0
- package/src/store/schema.sql +60 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floating miniature of the conversation tree — a METRO MAP of the branches.
|
|
3
|
+
*
|
|
4
|
+
* It draws the merged tree's SKELETON: the root, every branch point, and
|
|
5
|
+
* every agent tip. Chains of ordinary messages collapse into a single route —
|
|
6
|
+
* the mini answers shape, status and where-am-I, not content. Routes are
|
|
7
|
+
* orthogonal box-drawing lines with rounded corners (the jj/serie "curved"
|
|
8
|
+
* lineage), one soft color per top-level branch; agents are the stations,
|
|
9
|
+
* drawn as their status glyph, clickable. The skeleton node nearest the
|
|
10
|
+
* cursor is highlighted so the mini doubles as a you-are-here marker.
|
|
11
|
+
*/
|
|
12
|
+
import { statusGlyph, statusSgr } from "../forest/view.js";
|
|
13
|
+
import { FAINT, MUTED } from "../theme.js";
|
|
14
|
+
import { spliceCustom } from "./lanegraph.js";
|
|
15
|
+
function isUserish(kind) {
|
|
16
|
+
return kind === "user" || kind === "compaction" || kind === "branch_summary";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reduce the merged tree to its skeleton, one vertex per branch SEGMENT —
|
|
20
|
+
* headed by the user message that begins it, exactly like the transcript's
|
|
21
|
+
* exchange fans. The answer chain lives inside its segment; tips anywhere
|
|
22
|
+
* along a segment attach to its vertex. The graph's nodes are the user
|
|
23
|
+
* messages, never the replies.
|
|
24
|
+
*
|
|
25
|
+
* `heads` = branch-head node ids of the agents on this tree. The transcript
|
|
26
|
+
* lets a lone continuation flow on at the margin, but the map's job is WHERE
|
|
27
|
+
* AGENTS SIT: a message that begins another agent's branch always gets its
|
|
28
|
+
* own vertex, competing sibling or not — otherwise a fork of a fork would
|
|
29
|
+
* pin its dot to the parent branch.
|
|
30
|
+
*/
|
|
31
|
+
export function buildSkeleton(detail, tipsAt, heads) {
|
|
32
|
+
const { children, roots } = spliceCustom(detail);
|
|
33
|
+
const out = [];
|
|
34
|
+
const walkSeg = (head, parent, depth) => {
|
|
35
|
+
const idx = out.length;
|
|
36
|
+
const tips = [];
|
|
37
|
+
out.push({ id: head, depth, parent, tips });
|
|
38
|
+
let cur = head;
|
|
39
|
+
const pending = [];
|
|
40
|
+
for (let guard = 0; guard < 100_000; guard++) {
|
|
41
|
+
for (const t of tipsAt.get(cur) ?? [])
|
|
42
|
+
tips.push(t);
|
|
43
|
+
const kids = children.get(cur) ?? [];
|
|
44
|
+
const conts = kids.filter((k) => {
|
|
45
|
+
const n = detail.nodes[k];
|
|
46
|
+
return n && !isUserish(n.kind);
|
|
47
|
+
});
|
|
48
|
+
const next = conts[0];
|
|
49
|
+
for (const k of kids)
|
|
50
|
+
if (k !== next)
|
|
51
|
+
pending.push(k);
|
|
52
|
+
if (next) {
|
|
53
|
+
cur = next;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (pending.length === 1 && !heads?.has(pending[0])) {
|
|
57
|
+
cur = pending.pop();
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
for (const b of pending)
|
|
63
|
+
walkSeg(b, idx, depth + 1);
|
|
64
|
+
};
|
|
65
|
+
for (const r of roots)
|
|
66
|
+
walkSeg(r, -1, 0);
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
/** Tidy layout: leaves take rows, parents centre on children, depth = column. */
|
|
70
|
+
export function layoutMini(skel, w, h) {
|
|
71
|
+
if (skel.length === 0)
|
|
72
|
+
return [];
|
|
73
|
+
const kids = skel.map(() => []);
|
|
74
|
+
skel.forEach((n, i) => {
|
|
75
|
+
if (n.parent >= 0)
|
|
76
|
+
kids[n.parent].push(i);
|
|
77
|
+
});
|
|
78
|
+
const maxDepth = Math.max(...skel.map((n) => n.depth));
|
|
79
|
+
const leaves = skel.filter((_, i) => kids[i].length === 0).length;
|
|
80
|
+
const bodyH = Math.max(1, h - 2);
|
|
81
|
+
const stepY = leaves > 1 ? Math.max(1, Math.min(3, Math.floor((bodyH - 1) / (leaves - 1)))) : 1;
|
|
82
|
+
const colW = maxDepth > 0 ? Math.max(3, Math.min(10, Math.floor((w - 5) / maxDepth))) : 0;
|
|
83
|
+
const ys = new Array(skel.length).fill(0);
|
|
84
|
+
let nextLeafY = 0;
|
|
85
|
+
const assign = (i) => {
|
|
86
|
+
const ch = kids[i];
|
|
87
|
+
if (ch.length === 0) {
|
|
88
|
+
ys[i] = nextLeafY;
|
|
89
|
+
nextLeafY += stepY;
|
|
90
|
+
return ys[i];
|
|
91
|
+
}
|
|
92
|
+
const childYs = ch.map(assign);
|
|
93
|
+
ys[i] = Math.round((Math.min(...childYs) + Math.max(...childYs)) / 2);
|
|
94
|
+
return ys[i];
|
|
95
|
+
};
|
|
96
|
+
skel.forEach((n, i) => {
|
|
97
|
+
if (n.parent === -1)
|
|
98
|
+
assign(i);
|
|
99
|
+
});
|
|
100
|
+
// Centre the constellation in its box.
|
|
101
|
+
const span = Math.max(...ys) - Math.min(...ys);
|
|
102
|
+
const top = 1 + Math.max(0, Math.floor((bodyH - 1 - span) / 2));
|
|
103
|
+
const widest = maxDepth * colW + 3;
|
|
104
|
+
const left = Math.max(1, Math.floor((w - widest) / 2));
|
|
105
|
+
return skel.map((n, i) => ({
|
|
106
|
+
...n,
|
|
107
|
+
x: Math.min(w - 3, left + n.depth * colW),
|
|
108
|
+
y: Math.min(h - 1, top + ys[i]),
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
export function miniHitKey(x, y) {
|
|
112
|
+
return `${x},${y}`;
|
|
113
|
+
}
|
|
114
|
+
/** Soft, distinct route colors — one per top-level branch, cycling. */
|
|
115
|
+
const LANES = ["38;5;73", "38;5;108", "38;5;110", "38;5;139", "38;5;144", "38;5;66"];
|
|
116
|
+
/* Connection bitmask → box char. Pure corners are rounded (metro style). */
|
|
117
|
+
const U = 1, D = 2, L = 4, R = 8;
|
|
118
|
+
const BOX = {
|
|
119
|
+
[U]: "│", [D]: "│", [U | D]: "│",
|
|
120
|
+
[L]: "─", [R]: "─", [L | R]: "─",
|
|
121
|
+
[D | R]: "╭", [D | L]: "╮", [U | R]: "╰", [U | L]: "╯",
|
|
122
|
+
[U | D | R]: "├", [U | D | L]: "┤",
|
|
123
|
+
[L | R | D]: "┬", [L | R | U]: "┴",
|
|
124
|
+
[U | D | L | R]: "┼",
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Render the mini. `cursorSkelId` = the skeleton node whose region the
|
|
128
|
+
* transcript cursor is in (highlighted as you-are-here).
|
|
129
|
+
*/
|
|
130
|
+
export function renderConvMini(skel, opts) {
|
|
131
|
+
const { width: w, height: h } = opts;
|
|
132
|
+
const hits = new Map();
|
|
133
|
+
const nodes = layoutMini(skel, w, h);
|
|
134
|
+
const mask = Array.from({ length: h }, () => new Array(w).fill(0));
|
|
135
|
+
const railSgr = Array.from({ length: h }, () => new Array(w).fill(FAINT));
|
|
136
|
+
const glyph = Array.from({ length: h }, () => new Array(w).fill(null));
|
|
137
|
+
if (nodes.length === 0)
|
|
138
|
+
return { lines: Array.from({ length: h }, () => ""), hits };
|
|
139
|
+
// Route color = the top-level branch a vertex belongs to (metro "line").
|
|
140
|
+
const laneOf = new Array(nodes.length).fill(FAINT);
|
|
141
|
+
{
|
|
142
|
+
let next = 0;
|
|
143
|
+
const paint = (i, sgr) => {
|
|
144
|
+
laneOf[i] = sgr;
|
|
145
|
+
nodes.forEach((n, j) => {
|
|
146
|
+
if (n.parent === i)
|
|
147
|
+
paint(j, sgr);
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
nodes.forEach((n, i) => {
|
|
151
|
+
if (n.parent >= 0 && nodes[n.parent].parent === -1)
|
|
152
|
+
paint(i, LANES[next++ % LANES.length]);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
const put = (x, y, bits, sgr) => {
|
|
156
|
+
if (x < 0 || y < 0 || x >= w || y >= h)
|
|
157
|
+
return;
|
|
158
|
+
mask[y][x] = (mask[y][x] ?? 0) | bits;
|
|
159
|
+
railSgr[y][x] = sgr;
|
|
160
|
+
};
|
|
161
|
+
// Routes, per parent: a short horizontal stub out of the parent into a
|
|
162
|
+
// vertical spine, then rounded elbows fanning to each child's station.
|
|
163
|
+
nodes.forEach((p, pi) => {
|
|
164
|
+
const kids = nodes.filter((n) => n.parent === pi);
|
|
165
|
+
if (kids.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
const cx = Math.min(...kids.map((k) => k.x));
|
|
168
|
+
const sx = Math.max(p.x + 1, Math.min(p.x + 2, cx - 1));
|
|
169
|
+
// Attachment rows on the spine: the parent's and every child's.
|
|
170
|
+
const rows = [
|
|
171
|
+
{ y: p.y, x: p.x, sgr: laneOf[pi], from: "parent" },
|
|
172
|
+
...kids.map((k) => ({
|
|
173
|
+
y: k.y,
|
|
174
|
+
x: k.x,
|
|
175
|
+
sgr: laneOf[nodes.indexOf(k)],
|
|
176
|
+
from: "child",
|
|
177
|
+
})),
|
|
178
|
+
].sort((a, b) => a.y - b.y);
|
|
179
|
+
const topY = rows[0].y;
|
|
180
|
+
const botY = rows[rows.length - 1].y;
|
|
181
|
+
for (const r of rows) {
|
|
182
|
+
if (r.from === "parent") {
|
|
183
|
+
for (let x = p.x + 1; x < sx; x++)
|
|
184
|
+
put(x, r.y, L | R, r.sgr);
|
|
185
|
+
put(sx, r.y, L, r.sgr);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
for (let x = sx + 1; x < r.x; x++)
|
|
189
|
+
put(x, r.y, L | R, r.sgr);
|
|
190
|
+
put(sx, r.y, R, r.sgr);
|
|
191
|
+
}
|
|
192
|
+
// Spine continuation through this attachment.
|
|
193
|
+
if (r.y > topY)
|
|
194
|
+
put(sx, r.y, U, r.sgr);
|
|
195
|
+
if (r.y < botY)
|
|
196
|
+
put(sx, r.y, D, r.sgr);
|
|
197
|
+
}
|
|
198
|
+
// Vertical runs between attachments.
|
|
199
|
+
for (let i = 0; i + 1 < rows.length; i++) {
|
|
200
|
+
for (let y = rows[i].y + 1; y < rows[i + 1].y; y++) {
|
|
201
|
+
put(sx, y, U | D, rows[i + 1].sgr);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
// Stations last: they sit on top of the rails.
|
|
206
|
+
for (const n of nodes) {
|
|
207
|
+
const here = n.id === opts.cursorSkelId;
|
|
208
|
+
const tip = n.tips?.[0];
|
|
209
|
+
if (tip) {
|
|
210
|
+
glyph[n.y][n.x] = {
|
|
211
|
+
ch: statusGlyph(tip, opts.spinnerFrame),
|
|
212
|
+
sgr: here ? "7" : statusSgr(tip),
|
|
213
|
+
};
|
|
214
|
+
hits.set(miniHitKey(n.x, n.y), n.id);
|
|
215
|
+
hits.set(miniHitKey(n.x + 1, n.y), n.id);
|
|
216
|
+
hits.set(miniHitKey(n.x - 1, n.y), n.id);
|
|
217
|
+
}
|
|
218
|
+
else if (n.parent === -1) {
|
|
219
|
+
glyph[n.y][n.x] = { ch: "○", sgr: here ? "7" : "36" };
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
glyph[n.y][n.x] = { ch: "·", sgr: here ? "7" : MUTED };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const lines = [];
|
|
226
|
+
for (let y = 0; y < h; y++) {
|
|
227
|
+
let line = "";
|
|
228
|
+
for (let x = 0; x < w; x++) {
|
|
229
|
+
const g = glyph[y][x];
|
|
230
|
+
if (g) {
|
|
231
|
+
line += `\x1b[${g.sgr}m${g.ch}\x1b[0m`;
|
|
232
|
+
}
|
|
233
|
+
else if (mask[y][x]) {
|
|
234
|
+
line += `\x1b[${railSgr[y][x]}m${BOX[mask[y][x]] ?? "·"}\x1b[0m`;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
line += " ";
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
lines.push(line.replace(/\s+$/, ""));
|
|
241
|
+
}
|
|
242
|
+
return { lines, hits };
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* The skeleton node whose region contains `nodeId`: itself if structural,
|
|
246
|
+
* else its nearest skeleton ancestor. Gives the mini its you-are-here mark.
|
|
247
|
+
*/
|
|
248
|
+
export function skelNodeFor(detail, skel, nodeId) {
|
|
249
|
+
if (!nodeId)
|
|
250
|
+
return null;
|
|
251
|
+
const ids = new Set(skel.map((n) => n.id));
|
|
252
|
+
let cur = nodeId;
|
|
253
|
+
for (let guard = 0; cur && guard < 10_000; guard++) {
|
|
254
|
+
if (ids.has(cur))
|
|
255
|
+
return cur;
|
|
256
|
+
cur = detail.nodes[cur]?.parentId ?? null;
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=convmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convmap.js","sourceRoot":"","sources":["../../../src/client/tree/convmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { FAINT, MUTED } from "../theme.js";
|
|
2
|
+
/** Minimum run length worth collapsing ("⋯ 2 steps" earns its row). */
|
|
3
|
+
const MIN_RUN = 2;
|
|
4
|
+
const DIM = MUTED; // boring-but-content glyphs (elision ⋅, plain nodes)
|
|
5
|
+
const RAIL = FAINT;
|
|
6
|
+
const TRUNK_RAIL = "37";
|
|
7
|
+
/**
|
|
8
|
+
* Splice out pines plumbing (`custom` kind: stamps, branch markers): children
|
|
9
|
+
* reattach to the custom node's parent; a leaf pointing at a custom node
|
|
10
|
+
* resolves to its nearest non-custom ancestor.
|
|
11
|
+
*/
|
|
12
|
+
/** Effective conversation tree: pines plumbing spliced out (shared with asciitree). */
|
|
13
|
+
export function spliceCustom(detail) {
|
|
14
|
+
// A labeled plumbing node was deliberately marked by the user — keep it.
|
|
15
|
+
const isCustom = (id) => {
|
|
16
|
+
const n = detail.nodes[id];
|
|
17
|
+
return n?.kind === "custom" && !n.label;
|
|
18
|
+
};
|
|
19
|
+
const resolveUp = (id) => {
|
|
20
|
+
let cur = id;
|
|
21
|
+
while (cur && isCustom(cur))
|
|
22
|
+
cur = detail.nodes[cur]?.parentId ?? null;
|
|
23
|
+
return cur;
|
|
24
|
+
};
|
|
25
|
+
const children = new Map();
|
|
26
|
+
const roots = [];
|
|
27
|
+
const attach = (parent, id) => {
|
|
28
|
+
if (parent === null)
|
|
29
|
+
roots.push(id);
|
|
30
|
+
else {
|
|
31
|
+
const arr = children.get(parent) ?? [];
|
|
32
|
+
arr.push(id);
|
|
33
|
+
children.set(parent, arr);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const visit = (id, effectiveParent) => {
|
|
37
|
+
const node = detail.nodes[id];
|
|
38
|
+
if (!node)
|
|
39
|
+
return;
|
|
40
|
+
if (isCustom(id)) {
|
|
41
|
+
for (const c of node.children)
|
|
42
|
+
visit(c, effectiveParent);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
attach(effectiveParent, id);
|
|
46
|
+
for (const c of node.children)
|
|
47
|
+
visit(c, id);
|
|
48
|
+
};
|
|
49
|
+
for (const r of detail.rootIds)
|
|
50
|
+
visit(r, null);
|
|
51
|
+
return { children, roots, leafId: resolveUp(detail.leafId) };
|
|
52
|
+
}
|
|
53
|
+
function significant(ctx, id) {
|
|
54
|
+
const node = ctx.detail.nodes[id];
|
|
55
|
+
if (node.kind === "user" || node.kind === "compaction" || node.kind === "branch_summary")
|
|
56
|
+
return true;
|
|
57
|
+
if (node.label)
|
|
58
|
+
return true;
|
|
59
|
+
if ((ctx.children.get(id)?.length ?? 0) > 1)
|
|
60
|
+
return true;
|
|
61
|
+
if (id === ctx.leafId)
|
|
62
|
+
return true;
|
|
63
|
+
if (node.parentId === null || ctx.detail.rootIds.includes(id))
|
|
64
|
+
return true;
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/** Base gutter for one row: rails for open lanes. */
|
|
68
|
+
function railGutter(ctx, activeLane) {
|
|
69
|
+
const cells = [];
|
|
70
|
+
for (let i = 0; i < ctx.lanes.length; i++) {
|
|
71
|
+
cells.push(ctx.lanes[i]
|
|
72
|
+
? { ch: "│", sgr: i === activeLane ? TRUNK_RAIL : RAIL }
|
|
73
|
+
: { ch: " ", sgr: null });
|
|
74
|
+
cells.push({ ch: " ", sgr: null });
|
|
75
|
+
}
|
|
76
|
+
return cells;
|
|
77
|
+
}
|
|
78
|
+
function nodeGlyph(ctx, id, onTrunk) {
|
|
79
|
+
const node = ctx.detail.nodes[id];
|
|
80
|
+
if (id === ctx.leafId)
|
|
81
|
+
return { ch: "●", sgr: "32" }; // where the story continues
|
|
82
|
+
if (node.label)
|
|
83
|
+
return { ch: "◆", sgr: "33" };
|
|
84
|
+
if (node.kind === "compaction")
|
|
85
|
+
return { ch: "⧗", sgr: onTrunk ? "33" : DIM };
|
|
86
|
+
if (node.kind === "branch_summary")
|
|
87
|
+
return { ch: "⑂", sgr: onTrunk ? "33" : DIM };
|
|
88
|
+
if (node.kind === "user")
|
|
89
|
+
return { ch: "○", sgr: "36" }; // dim cyan is unreadable on many themes
|
|
90
|
+
if ((ctx.children.get(id)?.length ?? 0) > 1)
|
|
91
|
+
return { ch: "●", sgr: onTrunk ? "37" : DIM };
|
|
92
|
+
return { ch: "·", sgr: onTrunk ? "37" : DIM };
|
|
93
|
+
}
|
|
94
|
+
function emitNode(ctx, id, lane) {
|
|
95
|
+
const onTrunk = ctx.activePath.has(id);
|
|
96
|
+
const gutter = railGutter(ctx, ctx.activePath.size ? trunkLane(ctx) : -1);
|
|
97
|
+
gutter[lane * 2] = nodeGlyph(ctx, id, onTrunk);
|
|
98
|
+
ctx.rows.push({
|
|
99
|
+
kind: "node",
|
|
100
|
+
gutter,
|
|
101
|
+
nodeId: id,
|
|
102
|
+
node: ctx.detail.nodes[id],
|
|
103
|
+
onTrunk,
|
|
104
|
+
isLeaf: id === ctx.leafId,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function emitElision(ctx, runIds, lane, onTrunk) {
|
|
108
|
+
const gutter = railGutter(ctx, trunkLane(ctx));
|
|
109
|
+
gutter[lane * 2] = { ch: "⋅", sgr: DIM };
|
|
110
|
+
ctx.rows.push({
|
|
111
|
+
kind: "elision",
|
|
112
|
+
gutter,
|
|
113
|
+
runId: runIds[0],
|
|
114
|
+
count: runIds.length,
|
|
115
|
+
ids: [...runIds],
|
|
116
|
+
onTrunk,
|
|
117
|
+
isLeaf: false,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/** The lane currently carrying the active path (lane 0 in practice). */
|
|
121
|
+
function trunkLane(_ctx) {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
/** Flush a pending run of insignificant nodes as elision or plain rows. */
|
|
125
|
+
function flushRun(ctx, run, lane, onTrunk) {
|
|
126
|
+
if (run.length === 0)
|
|
127
|
+
return;
|
|
128
|
+
const runId = run[0];
|
|
129
|
+
if (ctx.collapse && run.length >= MIN_RUN && !ctx.expanded.has(runId)) {
|
|
130
|
+
emitElision(ctx, run, lane, onTrunk);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
for (const id of run)
|
|
134
|
+
emitNode(ctx, id, lane);
|
|
135
|
+
}
|
|
136
|
+
run.length = 0;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Emit the connector row that opens `newLanes` off a fork at `lane`:
|
|
140
|
+
* ├─╮ (one branch) ├─┬─╮ (two branches)
|
|
141
|
+
*/
|
|
142
|
+
function emitForkConnector(ctx, lane, newLanes, onTrunk) {
|
|
143
|
+
const gutter = railGutter(ctx, trunkLane(ctx));
|
|
144
|
+
const maxLane = Math.max(...newLanes);
|
|
145
|
+
const start = lane * 2;
|
|
146
|
+
const end = maxLane * 2;
|
|
147
|
+
gutter[start] = { ch: "├", sgr: onTrunk ? TRUNK_RAIL : RAIL };
|
|
148
|
+
for (let c = start + 1; c < end; c++) {
|
|
149
|
+
const laneIdx = c % 2 === 0 ? c / 2 : -1;
|
|
150
|
+
if (laneIdx >= 0 && newLanes.includes(laneIdx)) {
|
|
151
|
+
gutter[c] = { ch: "┬", sgr: RAIL };
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
gutter[c] = { ch: "─", sgr: RAIL };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
gutter[end] = { ch: "╮", sgr: RAIL };
|
|
158
|
+
ctx.rows.push({ kind: "connector", gutter, onTrunk, isLeaf: false });
|
|
159
|
+
}
|
|
160
|
+
function allocLane(ctx, after) {
|
|
161
|
+
for (let i = after + 1; i < ctx.lanes.length; i++) {
|
|
162
|
+
if (!ctx.lanes[i]) {
|
|
163
|
+
ctx.lanes[i] = true;
|
|
164
|
+
return i;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
ctx.lanes.push(true);
|
|
168
|
+
return ctx.lanes.length - 1;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Walk a chain starting at `id` in `lane`, emitting rows; recurse at forks.
|
|
172
|
+
* Frees the lane when the subtree ends (unless it is lane 0).
|
|
173
|
+
*/
|
|
174
|
+
function walk(ctx, id, lane) {
|
|
175
|
+
const run = [];
|
|
176
|
+
let cur = id;
|
|
177
|
+
while (cur) {
|
|
178
|
+
const kids = ctx.children.get(cur) ?? [];
|
|
179
|
+
const onTrunk = ctx.activePath.has(cur);
|
|
180
|
+
if (significant(ctx, cur)) {
|
|
181
|
+
flushRun(ctx, run, lane, onTrunk);
|
|
182
|
+
emitNode(ctx, cur, lane);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
run.push(cur);
|
|
186
|
+
}
|
|
187
|
+
if (kids.length === 0) {
|
|
188
|
+
flushRun(ctx, run, lane, onTrunk);
|
|
189
|
+
if (lane !== 0)
|
|
190
|
+
ctx.lanes[lane] = false;
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (kids.length === 1) {
|
|
194
|
+
cur = kids[0];
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
// Fork. Active child continues this lane; the rest branch right.
|
|
198
|
+
flushRun(ctx, run, lane, onTrunk);
|
|
199
|
+
const activeChild = kids.find((k) => ctx.activePath.has(k)) ?? kids[0];
|
|
200
|
+
const branchKids = kids.filter((k) => k !== activeChild);
|
|
201
|
+
const newLanes = branchKids.map(() => allocLane(ctx, lane));
|
|
202
|
+
emitForkConnector(ctx, lane, newLanes, onTrunk);
|
|
203
|
+
// Abandoned branches first (older); the active continuation ends at the
|
|
204
|
+
// leaf, so the story reads top-to-bottom into "now".
|
|
205
|
+
branchKids.forEach((k, i) => walk(ctx, k, newLanes[i]));
|
|
206
|
+
cur = activeChild;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export function buildLaneGraph(detail, opts = {}) {
|
|
210
|
+
const { children, roots, leafId } = spliceCustom(detail);
|
|
211
|
+
const activePath = new Set();
|
|
212
|
+
for (let cur = leafId; cur;) {
|
|
213
|
+
activePath.add(cur);
|
|
214
|
+
cur = detail.nodes[cur]?.parentId ?? null;
|
|
215
|
+
// parentId chains may pass through spliced custom nodes — harmless to
|
|
216
|
+
// include them; membership checks only ever use real node ids.
|
|
217
|
+
}
|
|
218
|
+
const ctx = {
|
|
219
|
+
detail,
|
|
220
|
+
children,
|
|
221
|
+
activePath,
|
|
222
|
+
leafId,
|
|
223
|
+
expanded: opts.expanded ?? new Set(),
|
|
224
|
+
collapse: opts.collapseRuns ?? true,
|
|
225
|
+
rows: [],
|
|
226
|
+
lanes: [],
|
|
227
|
+
};
|
|
228
|
+
for (const root of roots) {
|
|
229
|
+
ctx.lanes[0] = true;
|
|
230
|
+
walk(ctx, root, 0);
|
|
231
|
+
ctx.lanes[0] = false;
|
|
232
|
+
}
|
|
233
|
+
// Gutters were built while lanes were being allocated; normalize widths.
|
|
234
|
+
const laneCount = Math.max(1, ...ctx.rows.map((r) => Math.ceil(r.gutter.length / 2)));
|
|
235
|
+
for (const row of ctx.rows) {
|
|
236
|
+
while (row.gutter.length < laneCount * 2)
|
|
237
|
+
row.gutter.push({ ch: " ", sgr: null });
|
|
238
|
+
}
|
|
239
|
+
return { rows: ctx.rows, laneCount, leafId };
|
|
240
|
+
}
|
|
241
|
+
/** Row indices a selection cursor may rest on (nodes + elisions). */
|
|
242
|
+
export function selectableRows(graph) {
|
|
243
|
+
const out = [];
|
|
244
|
+
graph.rows.forEach((row, i) => {
|
|
245
|
+
if (row.kind !== "connector")
|
|
246
|
+
out.push(i);
|
|
247
|
+
});
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
/** Find the row index for a node id (for search jumps / leaf selection). */
|
|
251
|
+
export function rowIndexOf(graph, nodeId) {
|
|
252
|
+
if (!nodeId)
|
|
253
|
+
return -1;
|
|
254
|
+
return graph.rows.findIndex((r) => r.nodeId === nodeId);
|
|
255
|
+
}
|
|
256
|
+
/** The elision run currently hiding `nodeId`, if any (so callers can expand it). */
|
|
257
|
+
export function runContaining(graph, nodeId) {
|
|
258
|
+
return graph.rows.find((r) => r.kind === "elision" && r.ids?.includes(nodeId))?.runId;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=lanegraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lanegraph.js","sourceRoot":"","sources":["../../../src/client/tree/lanegraph.ts"],"names":[],"mappings":"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"}
|