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.
Files changed (98) hide show
  1. package/README.md +123 -37
  2. package/package.json +17 -5
  3. package/skills/weave-notepad/SKILL.md +13 -4
  4. package/src/core/cache/workspace.ts +466 -0
  5. package/src/core/concurrency.ts +36 -0
  6. package/src/core/frontmatter.ts +270 -23
  7. package/src/core/git.ts +19 -0
  8. package/src/core/graph/build.ts +97 -5
  9. package/src/core/graph/current.ts +41 -28
  10. package/src/core/graph/mentions.ts +170 -0
  11. package/src/core/graph/model.ts +39 -0
  12. package/src/core/graph/wikilinks.ts +5 -1
  13. package/src/core/index.ts +14 -0
  14. package/src/core/openInEditor.ts +69 -0
  15. package/src/core/paths.ts +7 -0
  16. package/src/core/sessions.ts +929 -0
  17. package/src/core/summaries.ts +1 -19
  18. package/src/core/types.ts +40 -0
  19. package/src/core/vault.ts +739 -57
  20. package/src/core/view/cluster.ts +262 -0
  21. package/src/core/view/detail.ts +118 -0
  22. package/src/core/view/focus.ts +109 -0
  23. package/src/core/view/health.ts +156 -0
  24. package/src/core/view/index.ts +15 -0
  25. package/src/core/view/links.ts +105 -0
  26. package/src/core/view/time.ts +47 -0
  27. package/src/core/view/tree.ts +269 -0
  28. package/src/core/view/types.ts +39 -0
  29. package/src/core/workspace.ts +3 -3
  30. package/src/pi/index.ts +248 -48
  31. package/src/pi/sessionScan.ts +104 -0
  32. package/src/pi/summarize.ts +24 -4
  33. package/src/pi/tools/noteTool.ts +13 -4
  34. package/src/pi/viewer/tui/branding.ts +8 -7
  35. package/src/pi/viewer/tui/explorer.ts +5 -3
  36. package/src/pi/viewer/tui/model.ts +46 -667
  37. package/src/pi/viewer/tui/openNote.ts +7 -56
  38. package/src/pi/viewer/tui/surface/explore.ts +4 -2
  39. package/src/pi/viewer/web/run.ts +331 -0
  40. package/src/web/client/api.dom.ts +40 -0
  41. package/src/web/client/api.ts +472 -0
  42. package/src/web/client/bootstrap.ts +58 -0
  43. package/src/web/client/context/context.model.ts +313 -0
  44. package/src/web/client/dist/app.js +764 -0
  45. package/src/web/client/graph/Graph.tsx +209 -0
  46. package/src/web/client/graph/column.model.ts +372 -0
  47. package/src/web/client/graph/dynamics.ts +176 -0
  48. package/src/web/client/graph/graph.model.ts +546 -0
  49. package/src/web/client/graph/positions.ts +380 -0
  50. package/src/web/client/graph/project.ts +153 -0
  51. package/src/web/client/graph/renderer.dom.ts +52 -0
  52. package/src/web/client/graph/renderer.ts +339 -0
  53. package/src/web/client/graph/scheme.ts +44 -0
  54. package/src/web/client/live.model.ts +275 -0
  55. package/src/web/client/live.ts +151 -0
  56. package/src/web/client/main.tsx +27 -0
  57. package/src/web/client/note/Editor.tsx +102 -0
  58. package/src/web/client/note/Note.tsx +113 -0
  59. package/src/web/client/note/editor.controller.ts +151 -0
  60. package/src/web/client/note/editor.model.ts +636 -0
  61. package/src/web/client/note/note.model.ts +738 -0
  62. package/src/web/client/search/SearchPalette.tsx +105 -0
  63. package/src/web/client/search/search.model.ts +588 -0
  64. package/src/web/client/search/search.ts +107 -0
  65. package/src/web/client/selection.storage.ts +69 -0
  66. package/src/web/client/shell/Columns.tsx +161 -0
  67. package/src/web/client/shell/ContextRail.tsx +87 -0
  68. package/src/web/client/shell/Divider.tsx +44 -0
  69. package/src/web/client/shell/FocusTrap.tsx +56 -0
  70. package/src/web/client/shell/Header.tsx +64 -0
  71. package/src/web/client/shell/HelpOverlay.tsx +70 -0
  72. package/src/web/client/shell/Shell.tsx +210 -0
  73. package/src/web/client/shell/StatusBar.tsx +28 -0
  74. package/src/web/client/shell/cssvars.ts +70 -0
  75. package/src/web/client/shell/drag.model.ts +170 -0
  76. package/src/web/client/shell/focus.model.ts +100 -0
  77. package/src/web/client/shell/keys.model.ts +453 -0
  78. package/src/web/client/shell/keys.ts +59 -0
  79. package/src/web/client/shell/layout.model.ts +526 -0
  80. package/src/web/client/shell/shell.model.ts +333 -0
  81. package/src/web/client/shell/theme.ts +490 -0
  82. package/src/web/client/shell/viewport.ts +29 -0
  83. package/src/web/client/state.ts +89 -0
  84. package/src/web/client/tree/Tree.tsx +141 -0
  85. package/src/web/client/tree/tree.model.ts +674 -0
  86. package/src/web/client/workspace.ts +278 -0
  87. package/src/web/server/page.ts +258 -0
  88. package/src/web/server/routes.ts +987 -0
  89. package/src/web/server/security.ts +361 -0
  90. package/src/web/server/server.ts +275 -0
  91. package/src/web/server/sse.ts +321 -0
  92. package/src/web/server/watcher.ts +507 -0
  93. package/src/web/shared/graph.ts +213 -0
  94. package/src/web/shared/layout.ts +314 -0
  95. package/src/web/shared/logo.ts +11 -0
  96. package/src/web/shared/metrics.ts +136 -0
  97. package/src/web/shared/view.ts +200 -0
  98. 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
+ }