dialog-ide 0.5.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/CHANGELOG.md +69 -0
- package/LICENSE +201 -0
- package/README.md +211 -0
- package/THIRD_PARTY_LICENSES.md +157 -0
- package/bin/darwin-arm64/aambundle +0 -0
- package/bin/darwin-arm64/dgdebug +0 -0
- package/bin/darwin-arm64/dialogc +0 -0
- package/bin/dialog-lib/stddebug.dg +112 -0
- package/bin/dialog-lib/stdlib.dg +6730 -0
- package/bin/dialog-lib/unit.dg +187 -0
- package/dist/cli/commands/run-skein.d.ts +17 -0
- package/dist/cli/commands/run-skein.d.ts.map +1 -0
- package/dist/cli/commands/run-skein.js +105 -0
- package/dist/cli/commands/run-skein.js.map +1 -0
- package/dist/cli/commands/sources.d.ts +12 -0
- package/dist/cli/commands/sources.d.ts.map +1 -0
- package/dist/cli/commands/sources.js +42 -0
- package/dist/cli/commands/sources.js.map +1 -0
- package/dist/cli/commands/test.d.ts +9 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +41 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/context.d.ts +9 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +78 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/dialog-cover-resize.d.ts +2 -0
- package/dist/dialog-cover-resize.d.ts.map +1 -0
- package/dist/dialog-cover-resize.js +46 -0
- package/dist/dialog-cover-resize.js.map +1 -0
- package/dist/dialog-export.d.ts +23 -0
- package/dist/dialog-export.d.ts.map +1 -0
- package/dist/dialog-export.js +133 -0
- package/dist/dialog-export.js.map +1 -0
- package/dist/dialog-feelies.d.ts +4 -0
- package/dist/dialog-feelies.d.ts.map +1 -0
- package/dist/dialog-feelies.js +62 -0
- package/dist/dialog-feelies.js.map +1 -0
- package/dist/dialog-outline.d.ts +19 -0
- package/dist/dialog-outline.d.ts.map +1 -0
- package/dist/dialog-outline.js +122 -0
- package/dist/dialog-outline.js.map +1 -0
- package/dist/dialog-project-init.d.ts +5 -0
- package/dist/dialog-project-init.d.ts.map +1 -0
- package/dist/dialog-project-init.js +107 -0
- package/dist/dialog-project-init.js.map +1 -0
- package/dist/dialog-source-coverage.d.ts +9 -0
- package/dist/dialog-source-coverage.d.ts.map +1 -0
- package/dist/dialog-source-coverage.js +61 -0
- package/dist/dialog-source-coverage.js.map +1 -0
- package/dist/dialog-source-decoration-provider.d.ts +11 -0
- package/dist/dialog-source-decoration-provider.d.ts.map +1 -0
- package/dist/dialog-source-decoration-provider.js +79 -0
- package/dist/dialog-source-decoration-provider.js.map +1 -0
- package/dist/dialog-symbol-index.d.ts +19 -0
- package/dist/dialog-symbol-index.d.ts.map +1 -0
- package/dist/dialog-symbol-index.js +107 -0
- package/dist/dialog-symbol-index.js.map +1 -0
- package/dist/dialog-symbol-provider.d.ts +5 -0
- package/dist/dialog-symbol-provider.d.ts.map +1 -0
- package/dist/dialog-symbol-provider.js +56 -0
- package/dist/dialog-symbol-provider.js.map +1 -0
- package/dist/dialog-web-export.d.ts +25 -0
- package/dist/dialog-web-export.d.ts.map +1 -0
- package/dist/dialog-web-export.js +283 -0
- package/dist/dialog-web-export.js.map +1 -0
- package/dist/dialog-workspace-symbol-provider.d.ts +16 -0
- package/dist/dialog-workspace-symbol-provider.d.ts.map +1 -0
- package/dist/dialog-workspace-symbol-provider.js +107 -0
- package/dist/dialog-workspace-symbol-provider.js.map +1 -0
- package/dist/dialog-workspace-watcher.d.ts +22 -0
- package/dist/dialog-workspace-watcher.d.ts.map +1 -0
- package/dist/dialog-workspace-watcher.js +102 -0
- package/dist/dialog-workspace-watcher.js.map +1 -0
- package/dist/dialoged/skein/compile-error.d.ts +10 -0
- package/dist/dialoged/skein/compile-error.d.ts.map +1 -0
- package/dist/dialoged/skein/compile-error.js +28 -0
- package/dist/dialoged/skein/compile-error.js.map +1 -0
- package/dist/dialoged/skein/dynamic.d.ts +14 -0
- package/dist/dialoged/skein/dynamic.d.ts.map +1 -0
- package/dist/dialoged/skein/dynamic.js +176 -0
- package/dist/dialoged/skein/dynamic.js.map +1 -0
- package/dist/dialoged/skein/frotz-build.d.ts +10 -0
- package/dist/dialoged/skein/frotz-build.d.ts.map +1 -0
- package/dist/dialoged/skein/frotz-build.js +70 -0
- package/dist/dialoged/skein/frotz-build.js.map +1 -0
- package/dist/dialoged/skein/index.d.ts +15 -0
- package/dist/dialoged/skein/index.d.ts.map +1 -0
- package/dist/dialoged/skein/index.js +31 -0
- package/dist/dialoged/skein/index.js.map +1 -0
- package/dist/dialoged/skein/io.d.ts +15 -0
- package/dist/dialoged/skein/io.d.ts.map +1 -0
- package/dist/dialoged/skein/io.js +53 -0
- package/dist/dialoged/skein/io.js.map +1 -0
- package/dist/dialoged/skein/persistence.d.ts +13 -0
- package/dist/dialoged/skein/persistence.d.ts.map +1 -0
- package/dist/dialoged/skein/persistence.js +228 -0
- package/dist/dialoged/skein/persistence.js.map +1 -0
- package/dist/dialoged/skein/process.d.ts +38 -0
- package/dist/dialoged/skein/process.d.ts.map +1 -0
- package/dist/dialoged/skein/process.js +189 -0
- package/dist/dialoged/skein/process.js.map +1 -0
- package/dist/dialoged/skein/progress.d.ts +17 -0
- package/dist/dialoged/skein/progress.d.ts.map +1 -0
- package/dist/dialoged/skein/progress.js +9 -0
- package/dist/dialoged/skein/progress.js.map +1 -0
- package/dist/dialoged/skein/project.d.ts +44 -0
- package/dist/dialoged/skein/project.d.ts.map +1 -0
- package/dist/dialoged/skein/project.js +223 -0
- package/dist/dialoged/skein/project.js.map +1 -0
- package/dist/dialoged/skein/search.d.ts +15 -0
- package/dist/dialoged/skein/search.d.ts.map +1 -0
- package/dist/dialoged/skein/search.js +99 -0
- package/dist/dialoged/skein/search.js.map +1 -0
- package/dist/dialoged/skein/service.d.ts +91 -0
- package/dist/dialoged/skein/service.d.ts.map +1 -0
- package/dist/dialoged/skein/service.js +1097 -0
- package/dist/dialoged/skein/service.js.map +1 -0
- package/dist/dialoged/skein/session.d.ts +96 -0
- package/dist/dialoged/skein/session.d.ts.map +1 -0
- package/dist/dialoged/skein/session.js +690 -0
- package/dist/dialoged/skein/session.js.map +1 -0
- package/dist/dialoged/skein/syntax.d.ts +5 -0
- package/dist/dialoged/skein/syntax.d.ts.map +1 -0
- package/dist/dialoged/skein/syntax.js +150 -0
- package/dist/dialoged/skein/syntax.js.map +1 -0
- package/dist/dialoged/skein/trace.d.ts +31 -0
- package/dist/dialoged/skein/trace.d.ts.map +1 -0
- package/dist/dialoged/skein/trace.js +172 -0
- package/dist/dialoged/skein/trace.js.map +1 -0
- package/dist/dialoged/skein/tree.d.ts +114 -0
- package/dist/dialoged/skein/tree.d.ts.map +1 -0
- package/dist/dialoged/skein/tree.js +701 -0
- package/dist/dialoged/skein/tree.js.map +1 -0
- package/dist/dialoged/skein/ui/ansi.d.ts +4 -0
- package/dist/dialoged/skein/ui/ansi.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/ansi.js +215 -0
- package/dist/dialoged/skein/ui/ansi.js.map +1 -0
- package/dist/dialoged/skein/ui/diff.d.ts +7 -0
- package/dist/dialoged/skein/ui/diff.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/diff.js +17 -0
- package/dist/dialoged/skein/ui/diff.js.map +1 -0
- package/dist/dialoged/skein/ui/knot-menu.d.ts +5 -0
- package/dist/dialoged/skein/ui/knot-menu.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/knot-menu.js +89 -0
- package/dist/dialoged/skein/ui/knot-menu.js.map +1 -0
- package/dist/dialoged/skein/ui/marker-colors.d.ts +5 -0
- package/dist/dialoged/skein/ui/marker-colors.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/marker-colors.js +18 -0
- package/dist/dialoged/skein/ui/marker-colors.js.map +1 -0
- package/dist/dialoged/skein/ui/render.d.ts +13 -0
- package/dist/dialoged/skein/ui/render.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/render.js +332 -0
- package/dist/dialoged/skein/ui/render.js.map +1 -0
- package/dist/dialoged/skein/ui/traceRender.d.ts +11 -0
- package/dist/dialoged/skein/ui/traceRender.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/traceRender.js +139 -0
- package/dist/dialoged/skein/ui/traceRender.js.map +1 -0
- package/dist/dialoged/skein/ui/tree-pane.d.ts +3 -0
- package/dist/dialoged/skein/ui/tree-pane.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/tree-pane.js +135 -0
- package/dist/dialoged/skein/ui/tree-pane.js.map +1 -0
- package/dist/dialoged/skein/ui/webExportPage.d.ts +29 -0
- package/dist/dialoged/skein/ui/webExportPage.d.ts.map +1 -0
- package/dist/dialoged/skein/ui/webExportPage.js +72 -0
- package/dist/dialoged/skein/ui/webExportPage.js.map +1 -0
- package/dist/extension.d.ts +4 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +885 -0
- package/dist/extension.js.map +1 -0
- package/dist/session-runner.d.ts +23 -0
- package/dist/session-runner.d.ts.map +1 -0
- package/dist/session-runner.js +92 -0
- package/dist/session-runner.js.map +1 -0
- package/language-configuration.json +43 -0
- package/media/icon.png +0 -0
- package/media/icons/arrow-down-circle-solid.svg +3 -0
- package/media/icons/arrow-down-solid.svg +3 -0
- package/media/icons/arrow-path-solid.svg +3 -0
- package/media/icons/arrow-right-solid.svg +3 -0
- package/media/icons/arrow-up-on-square-stack-solid.svg +5 -0
- package/media/icons/arrow-up-solid.svg +3 -0
- package/media/icons/arrow-uturn-left.svg +3 -0
- package/media/icons/arrow-uturn-right.svg +3 -0
- package/media/icons/bookmark-solid.svg +3 -0
- package/media/icons/bug-ant-solid.svg +3 -0
- package/media/icons/check-badge-solid.svg +3 -0
- package/media/icons/check-circle-solid.svg +3 -0
- package/media/icons/chevron-double-down-solid.svg +4 -0
- package/media/icons/chevron-double-up-solid.svg +4 -0
- package/media/icons/command-line-solid.svg +3 -0
- package/media/icons/cpu-chip-solid.svg +4 -0
- package/media/icons/dg-file-dark.svg +6 -0
- package/media/icons/dg-file-light.svg +6 -0
- package/media/icons/ellipsis-vertical-solid.svg +3 -0
- package/media/icons/exclamation-triangle.svg +3 -0
- package/media/icons/folder-arrow-down-solid.svg +3 -0
- package/media/icons/globe-alt.svg +3 -0
- package/media/icons/lock-closed-solid.svg +3 -0
- package/media/icons/magnifying-glass-solid.svg +3 -0
- package/media/icons/pencil-solid.svg +4 -0
- package/media/icons/play-solid.svg +3 -0
- package/media/icons/plus-circle-solid.svg +3 -0
- package/media/icons/scissors-solid.svg +5 -0
- package/media/icons/tag-solid.svg +3 -0
- package/media/icons/trash-solid.svg +3 -0
- package/media/icons/x-circle-solid.svg +3 -0
- package/media/js/datastar.js +9 -0
- package/media/js/main.js +1109 -0
- package/media/js/skein-loader.js +10 -0
- package/media/js/trace-loader.js +4 -0
- package/media/js/trace.js +147 -0
- package/media/style.css +5783 -0
- package/package.json +231 -0
- package/resources/bundle/default-cover.png +0 -0
- package/resources/bundle/introduction-to-if.pdf +0 -0
- package/resources/bundle/play-if-card.pdf +1990 -1
- package/resources/bundle/play.css +432 -0
- package/resources/bundle/style.css +450 -0
- package/resources/dfrotz-skein-patch.dg +4 -0
- package/syntaxes/dialog.tmLanguage.json +490 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderNavbar = renderNavbar;
|
|
4
|
+
exports.renderKnotList = renderKnotList;
|
|
5
|
+
exports.renderApp = renderApp;
|
|
6
|
+
exports.renderPage = renderPage;
|
|
7
|
+
const dynamic_1 = require("../dynamic");
|
|
8
|
+
const ansi_1 = require("./ansi");
|
|
9
|
+
const diff_1 = require("./diff");
|
|
10
|
+
const knot_menu_1 = require("./knot-menu");
|
|
11
|
+
const marker_colors_1 = require("./marker-colors");
|
|
12
|
+
const tree_pane_1 = require("./tree-pane");
|
|
13
|
+
const STATUS_BORDER_CLASS = {
|
|
14
|
+
valid: 'border-base-300',
|
|
15
|
+
new: 'border-warning',
|
|
16
|
+
error: 'border-error'
|
|
17
|
+
};
|
|
18
|
+
function escapeHtml(text) {
|
|
19
|
+
return text
|
|
20
|
+
.replace(/&/g, '&')
|
|
21
|
+
.replace(/</g, '<')
|
|
22
|
+
.replace(/>/g, '>')
|
|
23
|
+
.replace(/"/g, '"')
|
|
24
|
+
.replace(/'/g, ''');
|
|
25
|
+
}
|
|
26
|
+
function visibleWhitespace(text) {
|
|
27
|
+
return text.replace(/ /g, '·').replace(/\n/g, '↵\n');
|
|
28
|
+
}
|
|
29
|
+
const DIFF_SEGMENT_CLASS = {
|
|
30
|
+
added: 'text-info font-bold',
|
|
31
|
+
removed: 'text-error font-bold line-through'
|
|
32
|
+
};
|
|
33
|
+
function renderDiff(response, unblessedResponse) {
|
|
34
|
+
if (unblessedResponse === null) {
|
|
35
|
+
return response !== null ? (0, ansi_1.ansiToHtml)(response) : '';
|
|
36
|
+
}
|
|
37
|
+
const segments = (0, diff_1.diffText)(response !== null ? (0, ansi_1.ansiToMarkers)(response) : null, (0, ansi_1.ansiToMarkers)(unblessedResponse));
|
|
38
|
+
return segments
|
|
39
|
+
.map((segment) => {
|
|
40
|
+
const escaped = escapeHtml(segment.value);
|
|
41
|
+
if (segment.type === 'unchanged') {
|
|
42
|
+
return escaped;
|
|
43
|
+
}
|
|
44
|
+
return `<span class="${DIFF_SEGMENT_CLASS[segment.type]}">${visibleWhitespace(escaped)}</span>`;
|
|
45
|
+
})
|
|
46
|
+
.join('');
|
|
47
|
+
}
|
|
48
|
+
function selectedKnots(tree) {
|
|
49
|
+
const chain = [];
|
|
50
|
+
let currentId = 0;
|
|
51
|
+
while (currentId !== null) {
|
|
52
|
+
const knot = tree.getDerivedKnot(currentId);
|
|
53
|
+
if (!knot) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
chain.push(knot);
|
|
57
|
+
currentId = knot.selectedChild;
|
|
58
|
+
}
|
|
59
|
+
return chain;
|
|
60
|
+
}
|
|
61
|
+
function totals(tree) {
|
|
62
|
+
const counts = { valid: 0, new: 0, error: 0 };
|
|
63
|
+
for (const wireKnot of tree.getAllKnots()) {
|
|
64
|
+
const derived = tree.getDerivedKnot(wireKnot.id);
|
|
65
|
+
if (derived) {
|
|
66
|
+
counts[derived.state]++;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return counts;
|
|
70
|
+
}
|
|
71
|
+
function reachedViaKeystroke(tree, knot) {
|
|
72
|
+
return tree.promptTypeAt(knot.parentId) === 'key';
|
|
73
|
+
}
|
|
74
|
+
const dynamicProcessor = new dynamic_1.DynamicProcessor();
|
|
75
|
+
const EMPTY_DYNAMIC_STATE = { flags: new Set(), vars: {} };
|
|
76
|
+
function findDynamicState(tree, knotId) {
|
|
77
|
+
let currentId = knotId;
|
|
78
|
+
while (currentId !== null) {
|
|
79
|
+
const state = tree.getDynamicState(currentId);
|
|
80
|
+
if (state) {
|
|
81
|
+
return state;
|
|
82
|
+
}
|
|
83
|
+
currentId = tree.getKnot(currentId)?.parentId ?? null;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
function comparePred(a, b) {
|
|
88
|
+
return a.replace(/#/g, '').localeCompare(b.replace(/#/g, ''));
|
|
89
|
+
}
|
|
90
|
+
const DYNAMIC_CHIP_CLASS = {
|
|
91
|
+
added: 'border-success bg-success/20 text-success-content',
|
|
92
|
+
removed: 'border-warning bg-warning/20 text-warning-content',
|
|
93
|
+
changed: 'border-info bg-info/10'
|
|
94
|
+
};
|
|
95
|
+
function renderDynamicChanges(tree, knot) {
|
|
96
|
+
if (knot.parentId === null) {
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
const after = tree.getDynamicState(knot.id);
|
|
100
|
+
if (!after) {
|
|
101
|
+
return '';
|
|
102
|
+
}
|
|
103
|
+
const before = findDynamicState(tree, knot.parentId) ?? EMPTY_DYNAMIC_STATE;
|
|
104
|
+
const { added, removed, changed } = dynamicProcessor.diff(before, after);
|
|
105
|
+
const tuples = [
|
|
106
|
+
...Array.from(added, (predicate) => ['added', predicate]),
|
|
107
|
+
...Array.from(removed, (predicate) => ['removed', predicate]),
|
|
108
|
+
...Array.from(changed, ([, afterValue]) => ['changed', afterValue])
|
|
109
|
+
].sort((a, b) => comparePred(a[1], b[1]));
|
|
110
|
+
if (tuples.length === 0) {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
const chips = tuples
|
|
114
|
+
.map(([kind, predicate]) => {
|
|
115
|
+
const prefix = kind === 'added' ? '<span class="font-bold mr-1">+</span>' : kind === 'removed' ? '<span class="font-bold mr-1">−</span>' : '';
|
|
116
|
+
return `<span class="rounded-box border ${DYNAMIC_CHIP_CLASS[kind]} px-2 py-1">${prefix}${escapeHtml(predicate)}</span>`;
|
|
117
|
+
})
|
|
118
|
+
.join('');
|
|
119
|
+
return `<div class="font-sans flex flex-wrap gap-1 mt-4 text-xs">${chips}</div>`;
|
|
120
|
+
}
|
|
121
|
+
function renderKnot(tree, knot, activeKnotId, transcriptMenuId, showDynamicState) {
|
|
122
|
+
const active = knot.id === activeKnotId;
|
|
123
|
+
const activeBorderClass = active ? ' border-l-primary' : '';
|
|
124
|
+
const activeMarker = active
|
|
125
|
+
? '<div class="icon icon-arrow-right" role="img" aria-label="Selected"></div>'
|
|
126
|
+
: '';
|
|
127
|
+
const statusIcon = knot.state === 'new'
|
|
128
|
+
? '<div class="icon icon-warning w-4 h-4" role="img" aria-label="New knot"></div>'
|
|
129
|
+
: knot.state === 'error'
|
|
130
|
+
? '<div class="icon icon-error w-4 h-4" role="img" aria-label="Error knot"></div>'
|
|
131
|
+
: '';
|
|
132
|
+
const floatCluster = `<div class="float-right flex flex-row items-center gap-1 pl-2 pb-1">${knot.locked ? '<div class="icon icon-lock" role="img" aria-label="Locked"></div>' : ''}${knot.marker
|
|
133
|
+
? `<span class="w-3 h-3 rounded-full shrink-0 ${marker_colors_1.MARKER_SWATCH_CLASS[knot.marker]}" aria-hidden="true"></span>`
|
|
134
|
+
: ''}${knot.label
|
|
135
|
+
? `<span class="font-bold bg-neutral text-neutral-content px-1 py-0.5 rounded text-sm">${escapeHtml(knot.label)}</span>`
|
|
136
|
+
: ''}${(0, knot_menu_1.renderKnotMenu)(knot.id, knot.unblessedResponse !== null, knot.id === transcriptMenuId, '/actions/open-transcript-menu', active, knot.label, knot.command, 'prominent', tree.promptTypeAt(knot.parentId) === 'key', tree.getEngine(), knot.marker)}</div>`;
|
|
137
|
+
const keystrokeChip = reachedViaKeystroke(tree, knot)
|
|
138
|
+
? `<div class="w-fit bg-neutral-content rounded-md border border-neutral px-2 py-1 text-sm">${escapeHtml(knot.command)}</div>`
|
|
139
|
+
: '';
|
|
140
|
+
const responseText = renderDiff(knot.response || null, knot.unblessedResponse);
|
|
141
|
+
const monoClass = knot.state !== 'valid' ? ' font-mono' : '';
|
|
142
|
+
const dynamicChanges = showDynamicState ? renderDynamicChanges(tree, knot) : '';
|
|
143
|
+
const responseContainerContent = [floatCluster, keystrokeChip, responseText, dynamicChanges].filter(Boolean).join('');
|
|
144
|
+
return `<div class="flex flex-row" id="knot-${knot.id}"
|
|
145
|
+
data-knot-id="${knot.id}"
|
|
146
|
+
data-on:click="if (!evt.target.closest('details')) { $knotId = ${knot.id}; @post('/actions/select-knot') }">
|
|
147
|
+
<div class="w-5 shrink-0 flex flex-col items-center justify-start pt-2 gap-1 pr-1">
|
|
148
|
+
${activeMarker}
|
|
149
|
+
${statusIcon}
|
|
150
|
+
</div>
|
|
151
|
+
<div class="border-x-8 grow ${activeBorderClass} ${STATUS_BORDER_CLASS[knot.state]}">
|
|
152
|
+
<div class="w-full flow-root whitespace-pre-wrap break-words p-2 bg-base-100${monoClass}">${responseContainerContent}</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>`;
|
|
155
|
+
}
|
|
156
|
+
function activeInputType(tree) {
|
|
157
|
+
return tree.promptTypeAt(tree.getActiveKnotId());
|
|
158
|
+
}
|
|
159
|
+
const SPECIAL_KEYSTROKE_BUTTONS = [
|
|
160
|
+
{ key: 'enter', label: 'Enter' },
|
|
161
|
+
{ key: 'space', label: 'Space' },
|
|
162
|
+
{ key: 'backspace', label: 'Backspace' }
|
|
163
|
+
];
|
|
164
|
+
function renderKeystrokeInput() {
|
|
165
|
+
const buttons = SPECIAL_KEYSTROKE_BUTTONS.map(({ key, label }) => `<button type="button" class="btn btn-sm" data-on:click="$newKeystroke = '${key}'; @post('/actions/send-keystroke')">${label}</button>`).join('\n ');
|
|
166
|
+
return `<div class="flex items-center gap-2 mt-4 mb-8">
|
|
167
|
+
<span class="text-gray-400" aria-hidden="true">Key:</span>
|
|
168
|
+
<input id="new-command-input" type="text" aria-label="Enter keystroke" maxlength="1" size="2"
|
|
169
|
+
class="w-12 text-center rounded-md border-base-300 shadow-sm focus:border-primary focus:ring-primary sm:text-sm p-2 border"
|
|
170
|
+
data-init="el.focus(); el.scrollIntoView({block: 'nearest', behavior: 'smooth'})"
|
|
171
|
+
data-on:keydown="if (evt.key === 'Enter') { evt.preventDefault(); $newKeystroke = 'enter'; @post('/actions/send-keystroke') }
|
|
172
|
+
else if (evt.key === 'Backspace') { evt.preventDefault(); $newKeystroke = 'backspace'; @post('/actions/send-keystroke') }
|
|
173
|
+
else if (evt.key.length === 1) { evt.preventDefault(); $newKeystroke = evt.key; @post('/actions/send-keystroke') }" />
|
|
174
|
+
<span class="text-sm text-base-content/60">or</span>
|
|
175
|
+
${buttons}
|
|
176
|
+
</div>`;
|
|
177
|
+
}
|
|
178
|
+
function renderCommandInput(tree) {
|
|
179
|
+
if (activeInputType(tree) === 'key') {
|
|
180
|
+
return renderKeystrokeInput();
|
|
181
|
+
}
|
|
182
|
+
return `<div class="flex items-center gap-2 mt-4 mb-8">
|
|
183
|
+
<span class="text-gray-400" aria-hidden="true">></span>
|
|
184
|
+
<input id="new-command-input" type="text" name="command" aria-label="Enter command"
|
|
185
|
+
placeholder="Enter command..."
|
|
186
|
+
class="flex-1 rounded-md border-base-300 shadow-sm focus:border-primary focus:ring-primary sm:text-sm p-2 border"
|
|
187
|
+
data-bind="newCommand" data-init="el.focus(); el.scrollIntoView({block: 'nearest', behavior: 'smooth'})"
|
|
188
|
+
data-on:change="@post('/actions/send-command')" />
|
|
189
|
+
</div>`;
|
|
190
|
+
}
|
|
191
|
+
const EMPTY_SEARCH_RESULTS = { results: [], totalMatches: 0 };
|
|
192
|
+
const SEARCH_RESULT_KEYDOWN = "if (evt.key === 'ArrowDown') { evt.preventDefault(); sk.navigateSearchResults(el, 1) }" +
|
|
193
|
+
" else if (evt.key === 'ArrowUp') { evt.preventDefault(); sk.navigateSearchResults(el, -1) }" +
|
|
194
|
+
" else if (evt.key === 'Escape') { $searchQuery = ''; @post('/actions/search') }";
|
|
195
|
+
function renderSearchResults(searchResults) {
|
|
196
|
+
const { results, totalMatches } = searchResults;
|
|
197
|
+
if (results.length === 0) {
|
|
198
|
+
return `<div class="absolute top-full left-0 mt-1 w-96 max-w-[90vw] bg-base-100 border border-base-300 rounded-md shadow-xl z-20 p-3 text-sm text-base-content/60">No matches.</div>`;
|
|
199
|
+
}
|
|
200
|
+
const rows = results
|
|
201
|
+
.map((result) => {
|
|
202
|
+
const promptLine = result.knotId !== 0 ? `<span class="text-sm">> ${result.command}</span>` : '';
|
|
203
|
+
const labelChip = result.label
|
|
204
|
+
? `<span class="font-bold bg-neutral text-neutral-content px-1 py-0.5 rounded text-sm ml-auto shrink-0">${result.label}</span>`
|
|
205
|
+
: '';
|
|
206
|
+
return `<li>
|
|
207
|
+
<button type="button" data-search-result class="w-full text-left px-3 py-2 hover:bg-base-200 focus:bg-base-200 focus:outline-none flex flex-col gap-1"
|
|
208
|
+
data-on:click="$knotId = ${result.knotId}; $searchQuery = ''; @post('/actions/select-knot'); @post('/actions/search')"
|
|
209
|
+
data-on:keydown="${SEARCH_RESULT_KEYDOWN}">
|
|
210
|
+
<div class="flex items-center gap-2">${promptLine}${labelChip}</div>
|
|
211
|
+
<span class="text-sm break-words">${result.snippet}</span>
|
|
212
|
+
</button>
|
|
213
|
+
</li>`;
|
|
214
|
+
})
|
|
215
|
+
.join('');
|
|
216
|
+
const truncatedNote = totalMatches > results.length
|
|
217
|
+
? `<div class="px-3 py-1.5 text-xs text-base-content/60 border-t border-base-300">Showing ${results.length} of ${totalMatches} matches - add more search text to narrow it down.</div>`
|
|
218
|
+
: '';
|
|
219
|
+
return `<div class="absolute top-full left-0 mt-1 w-96 max-w-[90vw] bg-base-100 border border-base-300 rounded-md shadow-xl z-20 max-h-96 overflow-y-auto">
|
|
220
|
+
<ul class="p-0" role="listbox">${rows}</ul>
|
|
221
|
+
${truncatedNote}
|
|
222
|
+
</div>`;
|
|
223
|
+
}
|
|
224
|
+
function renderSearchBox(searchQuery, searchResults) {
|
|
225
|
+
const showResults = searchQuery.trim() !== '';
|
|
226
|
+
return `<div class="relative" id="skein-search-box">
|
|
227
|
+
<label class="input input-sm flex items-center gap-2">
|
|
228
|
+
<div class="icon icon-search w-4 h-4 opacity-60" aria-hidden="true"></div>
|
|
229
|
+
<input type="search" id="skein-search-input" aria-label="Search knots" placeholder="Search" value="${escapeHtml(searchQuery)}"
|
|
230
|
+
data-bind="searchQuery" data-on:input__debounce.300ms="@post('/actions/search')"
|
|
231
|
+
data-on:keydown="if (evt.key === 'Escape') { $searchQuery = ''; @post('/actions/search') }
|
|
232
|
+
else if (evt.key === 'ArrowDown') { evt.preventDefault(); sk.navigateSearchResults(el, 1) }
|
|
233
|
+
else if ((evt.metaKey || evt.ctrlKey) && evt.key.toLowerCase() === 'a') { evt.preventDefault(); el.select() }" />
|
|
234
|
+
</label>
|
|
235
|
+
${showResults ? renderSearchResults(searchResults) : ''}
|
|
236
|
+
</div>`;
|
|
237
|
+
}
|
|
238
|
+
function renderNavbar(info, tree, showDynamicState = false, searchQuery = '', searchResults = EMPTY_SEARCH_RESULTS, markerFilter = null) {
|
|
239
|
+
const t = totals(tree);
|
|
240
|
+
const spineLeafId = tree.getSelectedLeafId();
|
|
241
|
+
const dgdebug = info.engine === 'dgdebug';
|
|
242
|
+
return `<nav class="bg-base-100 text-base-content border-base-200 divide-base-200 px-2 sm:px-4 py-2.5 w-full border-b shrink-0"
|
|
243
|
+
data-spine-leaf-id="${spineLeafId}">
|
|
244
|
+
<div class="w-full flex items-center gap-2">
|
|
245
|
+
<div class="join shrink-0">
|
|
246
|
+
<div class="bg-success text-success-content p-2 font-semibold rounded-l-lg" aria-label="${t.valid} ok knots">${t.valid}</div>
|
|
247
|
+
<button type="button" class="bg-warning text-warning-content p-2 font-semibold disabled:opacity-100" aria-label="${t.new} new knots"
|
|
248
|
+
${t.new === 0 ? 'disabled' : ''} data-on:click="$seekStatus = 'new'; @post('/actions/seek-status')"
|
|
249
|
+
title="${t.new === 0 ? 'No new knots' : 'Jump to the next new knot, cycling through all of them'}">${t.new}</button>
|
|
250
|
+
<button type="button" class="bg-error text-error-content p-2 font-semibold rounded-r-lg disabled:opacity-100" aria-label="${t.error} error knots"
|
|
251
|
+
${t.error === 0 ? 'disabled' : ''} data-on:click="$seekStatus = 'error'; @post('/actions/seek-status')"
|
|
252
|
+
title="${t.error === 0 ? 'No error knots' : 'Jump to the next error knot, cycling through all of them'}">${t.error}</button>
|
|
253
|
+
</div>
|
|
254
|
+
${renderSearchBox(searchQuery, searchResults)}
|
|
255
|
+
<button type="button" class="btn btn-sm ${showDynamicState ? 'btn-primary' : 'btn-ghost'}" ${dgdebug ? '' : 'disabled'}
|
|
256
|
+
aria-pressed="${showDynamicState}"
|
|
257
|
+
data-on:click="@post('/actions/toggle-dynamic-state')"
|
|
258
|
+
title="${dgdebug ? 'Show which dynamic properties (flags/variables) changed after each knot' : 'Dynamic state requires the dgdebug engine'}">
|
|
259
|
+
<div class="icon icon-dynamic" aria-hidden="true"></div><span class="hidden lg:inline">Dynamic State</span>
|
|
260
|
+
</button>
|
|
261
|
+
<div class="join shrink-0" role="group" aria-label="Filter by marker">
|
|
262
|
+
${marker_colors_1.ALL_MARKERS.map((marker) => `
|
|
263
|
+
<button type="button" class="btn btn-sm btn-square join-item ${markerFilter === marker ? 'btn-primary' : 'btn-ghost'}"
|
|
264
|
+
aria-pressed="${markerFilter === marker}" aria-label="Filter to knots marked ${marker_colors_1.MARKER_LABEL[marker]}"
|
|
265
|
+
data-on:click="$marker = ${marker}; @post('/actions/set-marker-filter')"
|
|
266
|
+
title="Show only knots marked ${marker_colors_1.MARKER_LABEL[marker]} (or with a descendant marked ${marker_colors_1.MARKER_LABEL[marker]}) - click again to clear">
|
|
267
|
+
<span class="w-3 h-3 rounded-full ${marker_colors_1.MARKER_SWATCH_CLASS[marker]}" aria-hidden="true"></span>
|
|
268
|
+
</button>`).join('')}
|
|
269
|
+
</div>
|
|
270
|
+
<div class="flex items-center gap-1 shrink-0 ml-auto">
|
|
271
|
+
<button type="button" class="btn btn-primary" data-on:click="@post('/actions/save')" title="Save this skein to its file - the only thing that ever writes to disk (⌘S)">
|
|
272
|
+
<div class="icon icon-save" aria-hidden="true"></div><span class="hidden lg:inline">Save</span>
|
|
273
|
+
</button>
|
|
274
|
+
<button type="button" class="btn btn-primary" data-on:click="@post('/actions/replay-all')" title="Re-run every command on every path in the tree against a fresh process (⌥⇧R)">
|
|
275
|
+
<div class="icon icon-play" aria-hidden="true"></div><span class="hidden lg:inline">Replay All</span>
|
|
276
|
+
</button>
|
|
277
|
+
<button type="button" class="btn btn-primary" data-on:click="$knotId = ${spineLeafId}; @post('/actions/bless-changes')" title="Bless every changed knot visible in the transcript (the active spine) (⌥⇧B)">
|
|
278
|
+
<div class="icon icon-bless" aria-hidden="true"></div><span class="hidden lg:inline">Bless Transcript</span>
|
|
279
|
+
</button>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
</nav>`;
|
|
283
|
+
}
|
|
284
|
+
function renderKnotList(tree, transcriptMenuId = null, showDynamicState = false) {
|
|
285
|
+
const activeId = tree.getActiveKnotId();
|
|
286
|
+
return selectedKnots(tree)
|
|
287
|
+
.map((knot) => renderKnot(tree, knot, activeId, transcriptMenuId, showDynamicState))
|
|
288
|
+
.join('\n');
|
|
289
|
+
}
|
|
290
|
+
function renderApp(info, tree, graphMenuId = null, transcriptMenuId = null, showDynamicState = false, searchQuery = '', searchResults = EMPTY_SEARCH_RESULTS, markerFilter = null) {
|
|
291
|
+
return `<div id="skein-app" class="flex flex-col h-screen">
|
|
292
|
+
${renderNavbar(info, tree, showDynamicState, searchQuery, searchResults, markerFilter)}
|
|
293
|
+
<div class="flex-1 min-h-0 flex flex-row w-full">
|
|
294
|
+
<div id="tree-pane-outer"
|
|
295
|
+
class="shrink-0 h-full flex flex-row"
|
|
296
|
+
style="width: 21rem"
|
|
297
|
+
data-preserve-attr="style"
|
|
298
|
+
data-init="sk.initTreePaneResize()">
|
|
299
|
+
<div class="flex-1 min-w-0 bg-base-200 border-r border-base-300 relative">
|
|
300
|
+
${(0, tree_pane_1.renderTreePane)(tree, graphMenuId, markerFilter)}
|
|
301
|
+
<div class="absolute bottom-6 right-4 join join-vertical shadow-md">
|
|
302
|
+
<button type="button" class="btn btn-sm btn-square join-item" aria-label="Zoom in" title="Zoom in (scroll up also zooms, centered on the cursor)" data-on:click="sk.zoomTreeGraphIn()">+</button>
|
|
303
|
+
<button type="button" class="btn btn-sm btn-square join-item" aria-label="Zoom out" title="Zoom out (scroll down also zooms, centered on the cursor)" data-on:click="sk.zoomTreeGraphOut()">−</button>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
<div id="tree-pane-handle" class="w-1 shrink-0 cursor-col-resize bg-base-300 hover:bg-primary transition-colors"></div>
|
|
307
|
+
</div>
|
|
308
|
+
<div class="flex-1 min-w-0 overflow-y-auto px-2">
|
|
309
|
+
${renderKnotList(tree, transcriptMenuId, showDynamicState)}
|
|
310
|
+
${renderCommandInput(tree)}
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
</div>`;
|
|
314
|
+
}
|
|
315
|
+
function renderPage(info, tree, graphMenuId = null, transcriptMenuId = null, showDynamicState = false, searchQuery = '', searchResults = EMPTY_SEARCH_RESULTS, markerFilter = null) {
|
|
316
|
+
const body = info && tree
|
|
317
|
+
? renderApp(info, tree, graphMenuId, transcriptMenuId, showDynamicState, searchQuery, searchResults, markerFilter)
|
|
318
|
+
: '<div id="skein-app" class="p-4">No skein session running.</div>';
|
|
319
|
+
return `<!doctype html>
|
|
320
|
+
<html lang="en">
|
|
321
|
+
<head>
|
|
322
|
+
<meta charset="UTF-8" />
|
|
323
|
+
<title>Dialog Skein</title>
|
|
324
|
+
<link rel="stylesheet" href="/style.css" />
|
|
325
|
+
<script type="module" src="/js/skein-loader.js"></script>
|
|
326
|
+
</head>
|
|
327
|
+
<body data-init="@get('/events', {openWhenHidden: true})">
|
|
328
|
+
${body}
|
|
329
|
+
</body>
|
|
330
|
+
</html>`;
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/dialoged/skein/ui/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TraceTree } from '../trace';
|
|
2
|
+
export interface CurrentTraceState {
|
|
3
|
+
tree: TraceTree;
|
|
4
|
+
commandLabel: string;
|
|
5
|
+
sourceKnotId: number | null;
|
|
6
|
+
searchTerm: string;
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderTraceApp(state: CurrentTraceState | null, loading?: boolean): string;
|
|
10
|
+
export declare function renderTracePage(state: CurrentTraceState | null, loading?: boolean): string;
|
|
11
|
+
//# sourceMappingURL=traceRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRender.d.ts","sourceRoot":"","sources":["../../../../src/dialoged/skein/ui/traceRender.ts"],"names":[],"mappings":"AASA,OAAO,EAAsB,SAAS,EAAE,MAAM,UAAU,CAAC;AAGzD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IAKnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoFD,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,CAiChG;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,CAajG"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.renderTraceApp = renderTraceApp;
|
|
37
|
+
exports.renderTracePage = renderTracePage;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const trace_1 = require("../trace");
|
|
40
|
+
const TYPE_BADGE_CLASS = {
|
|
41
|
+
enter: 'badge-info',
|
|
42
|
+
query: 'badge-neutral',
|
|
43
|
+
found: 'badge-success',
|
|
44
|
+
now: 'badge-warning'
|
|
45
|
+
};
|
|
46
|
+
function escapeHtml(text) {
|
|
47
|
+
return text
|
|
48
|
+
.replace(/&/g, '&')
|
|
49
|
+
.replace(/</g, '<')
|
|
50
|
+
.replace(/>/g, '>')
|
|
51
|
+
.replace(/"/g, '"')
|
|
52
|
+
.replace(/'/g, ''');
|
|
53
|
+
}
|
|
54
|
+
function splitSource(source) {
|
|
55
|
+
const idx = source.lastIndexOf(':');
|
|
56
|
+
if (idx <= 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const line = parseInt(source.slice(idx + 1), 10);
|
|
60
|
+
return Number.isNaN(line) ? null : { file: source.slice(0, idx), line };
|
|
61
|
+
}
|
|
62
|
+
function relativizeSource(source, projectRoot) {
|
|
63
|
+
const parsed = splitSource(source);
|
|
64
|
+
if (!parsed) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const resolved = path.resolve(projectRoot, parsed.file);
|
|
68
|
+
return { file: path.relative(projectRoot, resolved), line: parsed.line };
|
|
69
|
+
}
|
|
70
|
+
function renderRow(tree, node, projectRoot) {
|
|
71
|
+
const hasChildren = node.children.length > 0;
|
|
72
|
+
const chevron = hasChildren ? (node.expanded ? '▾' : '▸') : '';
|
|
73
|
+
const badgeClass = node.type ? TYPE_BADGE_CLASS[node.type] : '';
|
|
74
|
+
const displaySource = node.source ? relativizeSource(node.source, projectRoot) : null;
|
|
75
|
+
const sourceAttrs = displaySource
|
|
76
|
+
? ` data-node-id="${node.id}" data-file="${escapeHtml(displaySource.file)}" data-line="${displaySource.line}"`
|
|
77
|
+
: '';
|
|
78
|
+
const rowClass = ['trace-row', node.match ? 'trace-row-match' : ''].filter(Boolean).join(' ');
|
|
79
|
+
const childrenHtml = hasChildren && node.expanded
|
|
80
|
+
? `<div class="trace-children">${node.children.map((id) => renderRow(tree, (0, trace_1.getNode)(tree, id), projectRoot)).join('')}</div>`
|
|
81
|
+
: '';
|
|
82
|
+
return `<div class="trace-node" style="margin-left: ${node.depth * 1.25}rem;">
|
|
83
|
+
<div class="${rowClass}"${sourceAttrs}>
|
|
84
|
+
${hasChildren
|
|
85
|
+
? `<button type="button" class="trace-chevron" data-on:click="$nodeId = ${node.id}; @post('/actions/trace-toggle-node')" aria-label="${node.expanded ? 'Collapse' : 'Expand'}">${chevron}</button>`
|
|
86
|
+
: `<span class="trace-chevron"></span>`}
|
|
87
|
+
${node.type ? `<span class="badge badge-xs ${badgeClass}">${node.type.toUpperCase()}</span>` : ''}
|
|
88
|
+
<span class="trace-text font-mono">${escapeHtml(node.text ?? '')}</span>
|
|
89
|
+
${displaySource ? `<span class="trace-source font-mono">${escapeHtml(`${displaySource.file}:${displaySource.line}`)}</span>` : ''}
|
|
90
|
+
</div>
|
|
91
|
+
${childrenHtml}
|
|
92
|
+
</div>`;
|
|
93
|
+
}
|
|
94
|
+
function renderTraceApp(state, loading = false) {
|
|
95
|
+
if (loading) {
|
|
96
|
+
return `<div id="trace-app" class="p-4 flex items-center gap-3 text-base-content/60">
|
|
97
|
+
<span class="loading loading-spinner loading-md"></span>
|
|
98
|
+
<span>Tracing…</span>
|
|
99
|
+
</div>`;
|
|
100
|
+
}
|
|
101
|
+
if (!state) {
|
|
102
|
+
return '<div id="trace-app" class="p-4 text-base-content/60">No trace yet - open a knot\'s "..." menu and choose Trace (root traces startup).</div>';
|
|
103
|
+
}
|
|
104
|
+
const root = (0, trace_1.getNode)(state.tree, 0);
|
|
105
|
+
const rows = root
|
|
106
|
+
? root.children.map((id) => renderRow(state.tree, (0, trace_1.getNode)(state.tree, id), state.projectRoot)).join('')
|
|
107
|
+
: '';
|
|
108
|
+
return `<div id="trace-app" class="h-full flex flex-col">
|
|
109
|
+
<div class="flex items-center gap-2 p-2 border-b border-base-200 shrink-0">
|
|
110
|
+
<label class="input input-sm flex items-center gap-2 flex-1">
|
|
111
|
+
<div class="icon icon-search w-3 h-3 opacity-60" aria-hidden="true"></div>
|
|
112
|
+
<input type="search" placeholder="Filter trace…" value="${escapeHtml(state.searchTerm)}"
|
|
113
|
+
data-bind="searchTerm" data-on:input__debounce.300ms="@post('/actions/trace-search')" />
|
|
114
|
+
</label>
|
|
115
|
+
<button type="button" class="btn btn-sm btn-ghost" data-on:click="@post('/actions/trace-expand-all')">Expand All</button>
|
|
116
|
+
<button type="button" class="btn btn-sm btn-ghost" data-on:click="@post('/actions/trace-collapse-all')">Collapse All</button>
|
|
117
|
+
<span class="text-sm text-base-content/60 font-mono truncate">${escapeHtml(state.commandLabel)}</span>
|
|
118
|
+
</div>
|
|
119
|
+
<div id="trace-tree" class="flex-1 overflow-auto p-2 text-sm">
|
|
120
|
+
${rows}
|
|
121
|
+
</div>
|
|
122
|
+
<div id="trace-source-popover" popover="manual" class="trace-source-popover"></div>
|
|
123
|
+
</div>`;
|
|
124
|
+
}
|
|
125
|
+
function renderTracePage(state, loading = false) {
|
|
126
|
+
return `<!doctype html>
|
|
127
|
+
<html lang="en">
|
|
128
|
+
<head>
|
|
129
|
+
<meta charset="UTF-8" />
|
|
130
|
+
<title>Trace</title>
|
|
131
|
+
<link rel="stylesheet" href="/style.css" />
|
|
132
|
+
<script type="module" src="/js/trace-loader.js"></script>
|
|
133
|
+
</head>
|
|
134
|
+
<body data-init="@get('/trace/events', {openWhenHidden: true})" class="h-screen">
|
|
135
|
+
${renderTraceApp(state, loading)}
|
|
136
|
+
</body>
|
|
137
|
+
</html>`;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=traceRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRender.js","sourceRoot":"","sources":["../../../../src/dialoged/skein/ui/traceRender.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GA,wCAiCC;AAED,0CAaC;AAlJD,2CAA6B;AAC7B,oCAAyD;AAezD,MAAM,gBAAgB,GAA2B;IAC/C,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,eAAe;IACtB,KAAK,EAAE,eAAe;IACtB,GAAG,EAAE,eAAe;CACrB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAGD,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAUD,SAAS,gBAAgB,CAAC,MAAc,EAAE,WAAmB;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,IAAe,EAAE,IAAe,EAAE,WAAmB;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,WAAW,GAAG,aAAa;QAC/B,CAAC,CAAC,kBAAkB,IAAI,CAAC,EAAE,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,IAAI,GAAG;QAC9G,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9F,MAAM,YAAY,GAChB,WAAW,IAAI,IAAI,CAAC,QAAQ;QAC1B,CAAC,CAAC,+BAA+B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAA,eAAO,EAAC,IAAI,EAAE,EAAE,CAAE,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ;QAC7H,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,+CAA+C,IAAI,CAAC,KAAK,GAAG,IAAI;gBACzD,QAAQ,IAAI,WAAW;MAEjC,WAAW;QACT,CAAC,CAAC,wEAAwE,IAAI,CAAC,EAAE,sDAAsD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,WAAW;QACnM,CAAC,CAAC,qCACN;MACE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,+BAA+B,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;yCAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;MAC9D,aAAa,CAAC,CAAC,CAAC,wCAAwC,UAAU,CAAC,GAAG,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;IAEjI,YAAY;OACT,CAAC;AACR,CAAC;AAWD,SAAgB,cAAc,CAAC,KAA+B,EAAE,UAAmB,KAAK;IACtF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;;;OAGJ,CAAC;IACN,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,6IAA6I,CAAC;IACvJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,eAAO,EAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAA,eAAO,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;gEAIuD,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;;;;;oEAKxB,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;;;MAG5F,IAAI;;;OAGH,CAAC;AACR,CAAC;AAED,SAAgB,eAAe,CAAC,KAA+B,EAAE,UAAmB,KAAK;IACvF,OAAO;;;;;;;;;EASP,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;;QAExB,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-pane.d.ts","sourceRoot":"","sources":["../../../../src/dialoged/skein/ui/tree-pane.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA2B,MAAM,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAiPrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,GAAE,MAAM,GAAG,IAAW,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAY7H"}
|