agentlas 1.0.42 → 1.0.43
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 +15 -0
- package/engine/agentlas-workforce.cjs +1 -1
- package/engine/hephaestus/runtime.cjs +1 -1
- package/engine/storm/storm.cjs +1 -1
- package/engine/storm/swarm.cjs +1 -1
- package/engine/ui/shell.cjs +9 -3
- package/engine/vendor/mermaid/LICENSE +205 -0
- package/engine/vendor/mermaid/ansi.js +23 -0
- package/engine/vendor/mermaid/canvas.js +366 -0
- package/engine/vendor/mermaid/graph.js +91 -0
- package/engine/vendor/mermaid/index.js +100 -0
- package/engine/vendor/mermaid/labels.js +324 -0
- package/engine/vendor/mermaid/layout-seq.js +194 -0
- package/engine/vendor/mermaid/layout.js +881 -0
- package/engine/vendor/mermaid/package.json +1 -0
- package/engine/vendor/mermaid/parse.js +1108 -0
- package/engine/vendor/mermaid/source-box.js +78 -0
- package/engine/vendor/mermaid/types.js +1 -0
- package/engine/vendor/mermaid/width-data.js +994 -0
- package/engine/vendor/mermaid/width.js +76 -0
- package/engine/vendor/tui/LICENSE +20 -0
- package/engine/vendor/tui/autocomplete.js +632 -0
- package/engine/vendor/tui/components/alt-screen-flash.js +37 -0
- package/engine/vendor/tui/components/box.js +104 -0
- package/engine/vendor/tui/components/cancellable-loader.js +35 -0
- package/engine/vendor/tui/components/editor.js +1961 -0
- package/engine/vendor/tui/components/h-stack.js +43 -0
- package/engine/vendor/tui/components/image.js +90 -0
- package/engine/vendor/tui/components/input.js +378 -0
- package/engine/vendor/tui/components/loader.js +69 -0
- package/engine/vendor/tui/components/markdown.js +806 -0
- package/engine/vendor/tui/components/scroll-view.js +173 -0
- package/engine/vendor/tui/components/select-list.js +159 -0
- package/engine/vendor/tui/components/settings-list.js +182 -0
- package/engine/vendor/tui/components/spacer.js +23 -0
- package/engine/vendor/tui/components/stack.js +111 -0
- package/engine/vendor/tui/components/text.js +89 -0
- package/engine/vendor/tui/components/truncated-text.js +51 -0
- package/engine/vendor/tui/components/v-stack.js +26 -0
- package/engine/vendor/tui/deps/east-asian-width/LICENSE +9 -0
- package/engine/vendor/tui/deps/east-asian-width/index.js +30 -0
- package/engine/vendor/tui/deps/east-asian-width/lookup-data.js +21 -0
- package/engine/vendor/tui/deps/east-asian-width/lookup.js +138 -0
- package/engine/vendor/tui/deps/east-asian-width/utilities.js +24 -0
- package/engine/vendor/tui/deps/marked/LICENSE +44 -0
- package/engine/vendor/tui/deps/marked/index.js +77 -0
- package/engine/vendor/tui/editor-component.js +2 -0
- package/engine/vendor/tui/fuzzy.js +110 -0
- package/engine/vendor/tui/index.js +42 -0
- package/engine/vendor/tui/keybindings.js +209 -0
- package/engine/vendor/tui/keys.js +1174 -0
- package/engine/vendor/tui/kill-ring.js +44 -0
- package/engine/vendor/tui/latex.js +1264 -0
- package/engine/vendor/tui/layout-node.js +6 -0
- package/engine/vendor/tui/layout.js +314 -0
- package/engine/vendor/tui/native-modifiers.js +60 -0
- package/engine/vendor/tui/package.json +1 -0
- package/engine/vendor/tui/stdin-buffer.js +361 -0
- package/engine/vendor/tui/terminal-colors.js +59 -0
- package/engine/vendor/tui/terminal-image.js +518 -0
- package/engine/vendor/tui/terminal.js +436 -0
- package/engine/vendor/tui/tui-alt-screen.js +902 -0
- package/engine/vendor/tui/tui-main-screen.js +533 -0
- package/engine/vendor/tui/tui.js +937 -0
- package/engine/vendor/tui/undo-stack.js +25 -0
- package/engine/vendor/tui/utils.js +1191 -0
- package/engine/vendor/tui/word-navigation.js +96 -0
- package/package.json +2 -6
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequence diagram layout.
|
|
3
|
+
*
|
|
4
|
+
* Participants get one column each, with lifelines running the full height and
|
|
5
|
+
* a box repeated at top and bottom. Column gaps are solved from the widest
|
|
6
|
+
* thing that has to fit between any two columns — a message label, a note, a
|
|
7
|
+
* self-message stub — then items stack down the canvas in source order.
|
|
8
|
+
*/
|
|
9
|
+
import { Canvas, D, drawTextOverEdges, L, R, U } from './canvas.js';
|
|
10
|
+
import { fitLabel, WRAP_WIDTH } from './labels.js';
|
|
11
|
+
import { drawBox } from './layout.js';
|
|
12
|
+
import { stringWidth } from './width.js';
|
|
13
|
+
const PAD = 1;
|
|
14
|
+
/** Minimum columns between adjacent lifelines. */
|
|
15
|
+
const SEQ_GAP = 5;
|
|
16
|
+
const MAX_CANVAS_CELLS = 1 << 21;
|
|
17
|
+
const sat = (a, b) => Math.max(0, a - b);
|
|
18
|
+
const half = (n) => Math.floor(n / 2);
|
|
19
|
+
/** Where a note box sits, given the lifeline positions. */
|
|
20
|
+
function noteGeometry(xs, anchor, textW) {
|
|
21
|
+
if (anchor.kind === 'over') {
|
|
22
|
+
const center = half(xs[anchor.from] + xs[anchor.to]);
|
|
23
|
+
const w = Math.max(xs[anchor.to] - xs[anchor.from] + 5, textW + 2 * PAD + 2);
|
|
24
|
+
return { x: sat(center, half(w)), w };
|
|
25
|
+
}
|
|
26
|
+
const w = textW + 2 * PAD + 2;
|
|
27
|
+
if (anchor.kind === 'left')
|
|
28
|
+
return { x: sat(xs[anchor.at], 2 + w - 1), w };
|
|
29
|
+
return { x: xs[anchor.at] + 2, w };
|
|
30
|
+
}
|
|
31
|
+
const itemTextW = (text) => (text === null ? 0 : stringWidth(text));
|
|
32
|
+
export function layoutSequence(seq) {
|
|
33
|
+
const n = seq.labels.length;
|
|
34
|
+
const labels = seq.labels.map((l) => fitLabel(l, WRAP_WIDTH));
|
|
35
|
+
const boxW = labels.map((l) => Math.max(1, stringWidth(l)) + 2 * PAD + 2);
|
|
36
|
+
const boxH = 3;
|
|
37
|
+
const gaps = Array.from({ length: sat(n, 1) }, (_, i) => Math.max(SEQ_GAP, Math.ceil(boxW[i] / 2) + Math.ceil(boxW[i + 1] / 2) + 1));
|
|
38
|
+
// Each requirement is "columns l..r together need at least `need` cells".
|
|
39
|
+
const reqs = [];
|
|
40
|
+
for (const item of seq.items) {
|
|
41
|
+
if (item.kind === 'message') {
|
|
42
|
+
const tw = itemTextW(item.text);
|
|
43
|
+
if (item.from !== item.to) {
|
|
44
|
+
reqs.push([Math.min(item.from, item.to), Math.max(item.from, item.to), Math.max(tw + 2, 4)]);
|
|
45
|
+
}
|
|
46
|
+
else if (item.from + 1 < n) {
|
|
47
|
+
reqs.push([item.from, item.from + 1, 5 + tw + 2]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (item.kind === 'note') {
|
|
51
|
+
const tw = stringWidth(item.text);
|
|
52
|
+
const a = item.anchor;
|
|
53
|
+
if (a.kind === 'over' && a.from < a.to) {
|
|
54
|
+
reqs.push([a.from, a.to, sat(tw, 1)]);
|
|
55
|
+
}
|
|
56
|
+
else if (a.kind === 'over') {
|
|
57
|
+
const need = Math.ceil((tw + 4) / 2) + 2;
|
|
58
|
+
if (a.from > 0)
|
|
59
|
+
reqs.push([a.from - 1, a.from, need]);
|
|
60
|
+
if (a.from + 1 < n)
|
|
61
|
+
reqs.push([a.from, a.from + 1, need]);
|
|
62
|
+
}
|
|
63
|
+
else if (a.kind === 'left' && a.at > 0) {
|
|
64
|
+
reqs.push([a.at - 1, a.at, tw + 7]);
|
|
65
|
+
}
|
|
66
|
+
else if (a.kind === 'right' && a.at + 1 < n) {
|
|
67
|
+
reqs.push([a.at, a.at + 1, tw + 7]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Narrowest spans first, so a wide requirement absorbs what they already gave.
|
|
72
|
+
reqs.sort((a, b) => a[1] - a[0] - (b[1] - b[0]));
|
|
73
|
+
for (const [l, r, need] of reqs) {
|
|
74
|
+
let cur = 0;
|
|
75
|
+
for (let i = l; i < r; i++)
|
|
76
|
+
cur += gaps[i];
|
|
77
|
+
if (cur < need)
|
|
78
|
+
gaps[r - 1] += need - cur;
|
|
79
|
+
}
|
|
80
|
+
const xs = new Array(n);
|
|
81
|
+
xs[0] = half(boxW[0]);
|
|
82
|
+
for (let i = 1; i < n; i++)
|
|
83
|
+
xs[i] = xs[i - 1] + gaps[i - 1];
|
|
84
|
+
let canvasW = xs[n - 1] + Math.ceil(boxW[n - 1] / 2) + 1;
|
|
85
|
+
for (const item of seq.items) {
|
|
86
|
+
if (item.kind === 'message' && item.from === item.to) {
|
|
87
|
+
canvasW = Math.max(canvasW, xs[item.from] + 5 + itemTextW(item.text) + 1);
|
|
88
|
+
}
|
|
89
|
+
else if (item.kind === 'note') {
|
|
90
|
+
const g = noteGeometry(xs, item.anchor, stringWidth(item.text));
|
|
91
|
+
canvasW = Math.max(canvasW, g.x + g.w + 1);
|
|
92
|
+
}
|
|
93
|
+
else if (item.kind === 'divider') {
|
|
94
|
+
canvasW = Math.max(canvasW, stringWidth(item.text) + 4);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const rows = [];
|
|
98
|
+
let y = boxH + 1;
|
|
99
|
+
for (const item of seq.items) {
|
|
100
|
+
rows.push(y);
|
|
101
|
+
y += rowHeight(item);
|
|
102
|
+
}
|
|
103
|
+
const bottomTop = y;
|
|
104
|
+
const canvasH = bottomTop + boxH;
|
|
105
|
+
if (canvasW * canvasH > MAX_CANVAS_CELLS)
|
|
106
|
+
return null;
|
|
107
|
+
const canvas = new Canvas(canvasW, canvasH);
|
|
108
|
+
for (let i = 0; i < n; i++) {
|
|
109
|
+
for (const by of [0, bottomTop]) {
|
|
110
|
+
drawBox(canvas, box(sat(xs[i], half(boxW[i])), by, boxW[i], boxH), [labels[i]], 'rect');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
seq.items.forEach((item, k) => {
|
|
114
|
+
if (item.kind !== 'note')
|
|
115
|
+
return;
|
|
116
|
+
const g = noteGeometry(xs, item.anchor, stringWidth(item.text));
|
|
117
|
+
drawBox(canvas, box(g.x, rows[k], g.w, 3), [item.text], 'rect');
|
|
118
|
+
});
|
|
119
|
+
for (const x of xs) {
|
|
120
|
+
canvas.junction(x, boxH - 1, D);
|
|
121
|
+
canvas.segV(x, boxH, bottomTop - 1);
|
|
122
|
+
canvas.junction(x, bottomTop, U);
|
|
123
|
+
}
|
|
124
|
+
seq.items.forEach((item, k) => {
|
|
125
|
+
const r = rows[k];
|
|
126
|
+
if (item.kind === 'message')
|
|
127
|
+
drawMessage(canvas, item, xs, r);
|
|
128
|
+
else if (item.kind === 'divider')
|
|
129
|
+
drawDivider(canvas, item.text, r, canvasW);
|
|
130
|
+
});
|
|
131
|
+
canvas.finalizeMask();
|
|
132
|
+
return canvas;
|
|
133
|
+
}
|
|
134
|
+
function rowHeight(item) {
|
|
135
|
+
if (item.kind === 'note')
|
|
136
|
+
return 4;
|
|
137
|
+
if (item.kind === 'divider')
|
|
138
|
+
return 2;
|
|
139
|
+
if (item.from === item.to)
|
|
140
|
+
return 4;
|
|
141
|
+
return item.text !== null ? 3 : 2;
|
|
142
|
+
}
|
|
143
|
+
/** Geometry for a box drawn by position and size; ranks are irrelevant here. */
|
|
144
|
+
const box = (x, y, w, h) => ({
|
|
145
|
+
x,
|
|
146
|
+
y,
|
|
147
|
+
w,
|
|
148
|
+
h,
|
|
149
|
+
cx: x + half(w),
|
|
150
|
+
cy: y + 1,
|
|
151
|
+
rank: 0,
|
|
152
|
+
});
|
|
153
|
+
function drawMessage(canvas, item, xs, r) {
|
|
154
|
+
const lineCh = item.dashed ? '╌' : '─';
|
|
155
|
+
if (item.from === item.to) {
|
|
156
|
+
// A stub that leaves the lifeline and returns two rows down.
|
|
157
|
+
const x = xs[item.from];
|
|
158
|
+
canvas.junction(x, r, R);
|
|
159
|
+
canvas.set(x + 1, r, lineCh, 'edge');
|
|
160
|
+
canvas.set(x + 2, r, lineCh, 'edge');
|
|
161
|
+
canvas.set(x + 3, r, '╮', 'edge');
|
|
162
|
+
canvas.set(x + 3, r + 1, '│', 'edge');
|
|
163
|
+
canvas.set(x + 1, r + 2, item.head === 'cross' ? '×' : '◄', 'edge');
|
|
164
|
+
canvas.set(x + 2, r + 2, lineCh, 'edge');
|
|
165
|
+
canvas.set(x + 3, r + 2, '╯', 'edge');
|
|
166
|
+
if (item.text !== null)
|
|
167
|
+
drawTextOverEdges(canvas, item.text, x + 5, r + 1, 'text');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const x0 = xs[item.from];
|
|
171
|
+
const x1 = xs[item.to];
|
|
172
|
+
const rightward = x1 > x0;
|
|
173
|
+
// A labelled message writes its text on `r` and draws the arrow below it.
|
|
174
|
+
const arrowRow = item.text !== null ? r + 1 : r;
|
|
175
|
+
const lo = Math.min(x0, x1);
|
|
176
|
+
const hi = Math.max(x0, x1);
|
|
177
|
+
canvas.junction(x0, arrowRow, rightward ? R : L);
|
|
178
|
+
for (let x = lo + 1; x < hi; x++)
|
|
179
|
+
canvas.set(x, arrowRow, lineCh, 'edge');
|
|
180
|
+
const headCh = item.head === 'cross' ? '×' : rightward ? '▶' : '◄';
|
|
181
|
+
canvas.set(rightward ? x1 - 1 : x1 + 1, arrowRow, headCh, 'edge');
|
|
182
|
+
if (item.text !== null) {
|
|
183
|
+
const span = hi - lo - 1;
|
|
184
|
+
const t = fitLabel(item.text, Math.max(1, span));
|
|
185
|
+
drawTextOverEdges(canvas, t, lo + 1 + half(sat(span, stringWidth(t))), r, 'text');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** A full-width rule labelling a `loop` / `alt` / `opt` block boundary. */
|
|
189
|
+
function drawDivider(canvas, text, r, canvasW) {
|
|
190
|
+
for (let x = 0; x < canvasW; x++)
|
|
191
|
+
canvas.set(x, r, '─', 'edge');
|
|
192
|
+
drawTextOverEdges(canvas, ` ${fitLabel(text, sat(canvasW, 4))} `, 2, r, 'edgeLabel');
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=layout-seq.js.map
|