pi-weave 0.1.7 → 0.1.9
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 +123 -37
- package/package.json +17 -5
- package/skills/weave-notepad/SKILL.md +13 -4
- package/src/core/cache/workspace.ts +466 -0
- package/src/core/concurrency.ts +36 -0
- package/src/core/frontmatter.ts +270 -23
- package/src/core/git.ts +19 -0
- package/src/core/graph/build.ts +97 -5
- package/src/core/graph/current.ts +41 -28
- package/src/core/graph/mentions.ts +170 -0
- package/src/core/graph/model.ts +39 -0
- package/src/core/graph/wikilinks.ts +5 -1
- package/src/core/index.ts +14 -0
- package/src/core/openInEditor.ts +69 -0
- package/src/core/paths.ts +7 -0
- package/src/core/sessions.ts +929 -0
- package/src/core/summaries.ts +1 -19
- package/src/core/types.ts +40 -0
- package/src/core/vault.ts +739 -57
- package/src/core/view/cluster.ts +262 -0
- package/src/core/view/detail.ts +118 -0
- package/src/core/view/focus.ts +109 -0
- package/src/core/view/health.ts +156 -0
- package/src/core/view/index.ts +15 -0
- package/src/core/view/links.ts +105 -0
- package/src/core/view/time.ts +47 -0
- package/src/core/view/tree.ts +269 -0
- package/src/core/view/types.ts +39 -0
- package/src/core/workspace.ts +3 -3
- package/src/pi/index.ts +248 -48
- package/src/pi/sessionScan.ts +104 -0
- package/src/pi/summarize.ts +24 -4
- package/src/pi/tools/noteTool.ts +13 -4
- package/src/pi/viewer/tui/branding.ts +8 -7
- package/src/pi/viewer/tui/explorer.ts +5 -3
- package/src/pi/viewer/tui/model.ts +46 -667
- package/src/pi/viewer/tui/openNote.ts +7 -56
- package/src/pi/viewer/tui/surface/explore.ts +4 -2
- package/src/pi/viewer/web/run.ts +331 -0
- package/src/web/client/api.dom.ts +40 -0
- package/src/web/client/api.ts +472 -0
- package/src/web/client/bootstrap.ts +58 -0
- package/src/web/client/context/context.model.ts +313 -0
- package/src/web/client/dist/app.js +764 -0
- package/src/web/client/graph/Graph.tsx +209 -0
- package/src/web/client/graph/column.model.ts +372 -0
- package/src/web/client/graph/dynamics.ts +176 -0
- package/src/web/client/graph/graph.model.ts +546 -0
- package/src/web/client/graph/positions.ts +380 -0
- package/src/web/client/graph/project.ts +153 -0
- package/src/web/client/graph/renderer.dom.ts +52 -0
- package/src/web/client/graph/renderer.ts +339 -0
- package/src/web/client/graph/scheme.ts +44 -0
- package/src/web/client/live.model.ts +275 -0
- package/src/web/client/live.ts +151 -0
- package/src/web/client/main.tsx +27 -0
- package/src/web/client/note/Editor.tsx +102 -0
- package/src/web/client/note/Note.tsx +113 -0
- package/src/web/client/note/editor.controller.ts +151 -0
- package/src/web/client/note/editor.model.ts +636 -0
- package/src/web/client/note/note.model.ts +738 -0
- package/src/web/client/search/SearchPalette.tsx +105 -0
- package/src/web/client/search/search.model.ts +588 -0
- package/src/web/client/search/search.ts +107 -0
- package/src/web/client/selection.storage.ts +69 -0
- package/src/web/client/shell/Columns.tsx +161 -0
- package/src/web/client/shell/ContextRail.tsx +87 -0
- package/src/web/client/shell/Divider.tsx +44 -0
- package/src/web/client/shell/FocusTrap.tsx +56 -0
- package/src/web/client/shell/Header.tsx +64 -0
- package/src/web/client/shell/HelpOverlay.tsx +70 -0
- package/src/web/client/shell/Shell.tsx +210 -0
- package/src/web/client/shell/StatusBar.tsx +28 -0
- package/src/web/client/shell/cssvars.ts +70 -0
- package/src/web/client/shell/drag.model.ts +170 -0
- package/src/web/client/shell/focus.model.ts +100 -0
- package/src/web/client/shell/keys.model.ts +453 -0
- package/src/web/client/shell/keys.ts +59 -0
- package/src/web/client/shell/layout.model.ts +526 -0
- package/src/web/client/shell/shell.model.ts +333 -0
- package/src/web/client/shell/theme.ts +490 -0
- package/src/web/client/shell/viewport.ts +29 -0
- package/src/web/client/state.ts +89 -0
- package/src/web/client/tree/Tree.tsx +141 -0
- package/src/web/client/tree/tree.model.ts +674 -0
- package/src/web/client/workspace.ts +278 -0
- package/src/web/server/page.ts +258 -0
- package/src/web/server/routes.ts +987 -0
- package/src/web/server/security.ts +361 -0
- package/src/web/server/server.ts +275 -0
- package/src/web/server/sse.ts +321 -0
- package/src/web/server/watcher.ts +507 -0
- package/src/web/shared/graph.ts +213 -0
- package/src/web/shared/layout.ts +314 -0
- package/src/web/shared/logo.ts +11 -0
- package/src/web/shared/metrics.ts +136 -0
- package/src/web/shared/view.ts +200 -0
- package/src/web/shared/wire.ts +358 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tree column (weave-workspace §1.2, P2.3).
|
|
3
|
+
*
|
|
4
|
+
* Props in, JSX out. Every string, glyph, branch and key binding comes from
|
|
5
|
+
* `tree.model.ts`; what is left here is a `useState`, a `map` and four
|
|
6
|
+
* handlers that forward into it. §10's rule, and the reason the 95 % gate
|
|
7
|
+
* survives a UI phase with no DOM test environment.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useState } from "preact/hooks";
|
|
11
|
+
import { recentIds } from "../state";
|
|
12
|
+
import type { GraphPayload } from "../../shared/wire";
|
|
13
|
+
import type { TreeRowView, TreeViewState } from "./tree.model";
|
|
14
|
+
import {
|
|
15
|
+
FILTER_HINT,
|
|
16
|
+
FILTER_LABEL,
|
|
17
|
+
FILTER_PLACEHOLDER,
|
|
18
|
+
TREE_LABEL,
|
|
19
|
+
treeActiveDescendant,
|
|
20
|
+
cycleProvenance,
|
|
21
|
+
depthVar,
|
|
22
|
+
initialTreeView,
|
|
23
|
+
internalsHint,
|
|
24
|
+
internalsLabel,
|
|
25
|
+
provenanceHint,
|
|
26
|
+
provenanceLabel,
|
|
27
|
+
rowCountLabel,
|
|
28
|
+
rowViews,
|
|
29
|
+
rowsFor,
|
|
30
|
+
setQuery,
|
|
31
|
+
toggleExpanded,
|
|
32
|
+
toggleInternals,
|
|
33
|
+
treeEmptyMessage,
|
|
34
|
+
treeKey,
|
|
35
|
+
} from "./tree.model";
|
|
36
|
+
|
|
37
|
+
export interface TreeProps {
|
|
38
|
+
graph: GraphPayload | null;
|
|
39
|
+
selectedId: string | null;
|
|
40
|
+
onSelect: (id: string) => void;
|
|
41
|
+
/** Epoch ms for relative times. Injected so the render is deterministic. */
|
|
42
|
+
now: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function Row({ view, onSelect, onToggle }: { view: TreeRowView; onSelect: () => void; onToggle: () => void }) {
|
|
46
|
+
return (
|
|
47
|
+
<li
|
|
48
|
+
id={view.domId}
|
|
49
|
+
class={`weave-row weave-row-${view.kind}${view.selected ? " weave-row-on" : ""}${
|
|
50
|
+
recentIds.value.has(view.id) ? " weave-row-new" : ""
|
|
51
|
+
}`}
|
|
52
|
+
role="treeitem"
|
|
53
|
+
aria-level={view.level}
|
|
54
|
+
aria-posinset={view.posinset}
|
|
55
|
+
aria-setsize={view.setsize}
|
|
56
|
+
aria-selected={view.selected}
|
|
57
|
+
aria-expanded={view.hasKids ? view.expanded : undefined}
|
|
58
|
+
style={depthVar(view.depth)}
|
|
59
|
+
onClick={onSelect}
|
|
60
|
+
>
|
|
61
|
+
{/* The glyphs are decoration: the twisty duplicates `aria-expanded`,
|
|
62
|
+
the kind glyph duplicates nothing a screen reader needs, and the
|
|
63
|
+
provenance shape is announced through its `title` instead. */}
|
|
64
|
+
<span
|
|
65
|
+
class="weave-twisty"
|
|
66
|
+
aria-hidden="true"
|
|
67
|
+
onClick={(event) => {
|
|
68
|
+
event.stopPropagation();
|
|
69
|
+
onToggle();
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
{view.twistyGlyph}
|
|
73
|
+
</span>
|
|
74
|
+
<span class="weave-kind" aria-hidden="true">
|
|
75
|
+
{view.kindGlyph}
|
|
76
|
+
</span>
|
|
77
|
+
<span class={`weave-prov weave-prov-${view.provenance ?? "none"}`} title={view.provenanceTitle}>
|
|
78
|
+
{view.provenanceGlyph}
|
|
79
|
+
</span>
|
|
80
|
+
<span class="weave-label">{view.label}</span>
|
|
81
|
+
<span class="weave-meta">{view.meta}</span>
|
|
82
|
+
</li>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function Tree(props: TreeProps) {
|
|
87
|
+
const [state, setState] = useState<TreeViewState>(initialTreeView);
|
|
88
|
+
const rows = rowsFor(props.graph, state);
|
|
89
|
+
const empty = treeEmptyMessage(props.graph, rows, state);
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<div
|
|
93
|
+
class="weave-tree"
|
|
94
|
+
onKeyDown={(event) => {
|
|
95
|
+
const next = treeKey(rows, state, props.selectedId, event.key);
|
|
96
|
+
if (!next.handled) return;
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
setState(next.state);
|
|
99
|
+
if (next.selectedId !== null) props.onSelect(next.selectedId);
|
|
100
|
+
}}
|
|
101
|
+
>
|
|
102
|
+
<div class="weave-tree-controls">
|
|
103
|
+
<input
|
|
104
|
+
type="search"
|
|
105
|
+
class="weave-filter"
|
|
106
|
+
value={state.query}
|
|
107
|
+
placeholder={FILTER_PLACEHOLDER}
|
|
108
|
+
aria-label={FILTER_LABEL}
|
|
109
|
+
title={FILTER_HINT}
|
|
110
|
+
onInput={(event) => setState(setQuery(state, event.currentTarget.value))}
|
|
111
|
+
/>
|
|
112
|
+
<button type="button" class="weave-chip" title={provenanceHint(state.provFilter)} onClick={() => setState(cycleProvenance(state))}>
|
|
113
|
+
◧ {provenanceLabel(state.provFilter)}
|
|
114
|
+
</button>
|
|
115
|
+
<button type="button" class="weave-chip" title={internalsHint(state.showInternals)} onClick={() => setState(toggleInternals(state))}>
|
|
116
|
+
◧ {internalsLabel(state.showInternals)}
|
|
117
|
+
</button>
|
|
118
|
+
</div>
|
|
119
|
+
{empty === null ? (
|
|
120
|
+
<ul
|
|
121
|
+
class="weave-rows"
|
|
122
|
+
role="tree"
|
|
123
|
+
tabIndex={0}
|
|
124
|
+
aria-label={TREE_LABEL}
|
|
125
|
+
// Focus stays on the `<ul>` and the *active* row is named by
|
|
126
|
+
// reference — the alternative, a roving `tabindex`, would put every
|
|
127
|
+
// row in the Tab order and make Tab a fourth way to walk the tree.
|
|
128
|
+
// `null` when the selection is not visible; see the model.
|
|
129
|
+
aria-activedescendant={treeActiveDescendant(rows, props.selectedId) ?? undefined}
|
|
130
|
+
>
|
|
131
|
+
{rowViews(rows, props.selectedId, props.now).map((view) => (
|
|
132
|
+
<Row key={view.id} view={view} onSelect={() => props.onSelect(view.id)} onToggle={() => setState(toggleExpanded(state, view.id))} />
|
|
133
|
+
))}
|
|
134
|
+
</ul>
|
|
135
|
+
) : (
|
|
136
|
+
<p class="weave-tree-empty">{empty}</p>
|
|
137
|
+
)}
|
|
138
|
+
<p class="weave-tree-count">{rowCountLabel(rows)}</p>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|