@shivaedev/work-board 0.2.1 → 0.3.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.
Files changed (316) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +141 -3
  3. package/dist/board.d.ts.map +1 -1
  4. package/dist/board.js +9 -1
  5. package/dist/board.js.map +1 -1
  6. package/dist/cli.js +1 -1
  7. package/dist/files/changes.d.ts +1 -0
  8. package/dist/files/changes.d.ts.map +1 -1
  9. package/dist/files/changes.js +1 -1
  10. package/dist/files/changes.js.map +1 -1
  11. package/dist/files/url.d.ts +2 -0
  12. package/dist/files/url.d.ts.map +1 -0
  13. package/dist/files/url.js +4 -0
  14. package/dist/files/url.js.map +1 -0
  15. package/dist/http/assets.d.ts.map +1 -1
  16. package/dist/http/assets.js +16 -1
  17. package/dist/http/assets.js.map +1 -1
  18. package/dist/http/identity.d.ts +7 -0
  19. package/dist/http/identity.d.ts.map +1 -0
  20. package/dist/http/identity.js +38 -0
  21. package/dist/http/identity.js.map +1 -0
  22. package/dist/http/page.d.ts +2 -1
  23. package/dist/http/page.d.ts.map +1 -1
  24. package/dist/http/page.js +29 -7
  25. package/dist/http/page.js.map +1 -1
  26. package/dist/http/search.d.ts +5 -0
  27. package/dist/http/search.d.ts.map +1 -0
  28. package/dist/http/search.js +11 -0
  29. package/dist/http/search.js.map +1 -0
  30. package/dist/http/work.d.ts +6 -0
  31. package/dist/http/work.d.ts.map +1 -0
  32. package/dist/http/work.js +22 -0
  33. package/dist/http/work.js.map +1 -0
  34. package/dist/metadata/backlinks.d.ts +8 -0
  35. package/dist/metadata/backlinks.d.ts.map +1 -0
  36. package/dist/metadata/backlinks.js +29 -0
  37. package/dist/metadata/backlinks.js.map +1 -0
  38. package/dist/metadata/fields.d.ts +29 -0
  39. package/dist/metadata/fields.d.ts.map +1 -0
  40. package/dist/metadata/fields.js +25 -0
  41. package/dist/metadata/fields.js.map +1 -0
  42. package/dist/metadata/links.d.ts +4 -0
  43. package/dist/metadata/links.d.ts.map +1 -0
  44. package/dist/metadata/links.js +18 -0
  45. package/dist/metadata/links.js.map +1 -0
  46. package/dist/metadata/locations.d.ts +3 -0
  47. package/dist/metadata/locations.d.ts.map +1 -0
  48. package/dist/metadata/locations.js +35 -0
  49. package/dist/metadata/locations.js.map +1 -0
  50. package/dist/metadata/model.d.ts +15 -0
  51. package/dist/metadata/model.d.ts.map +1 -0
  52. package/dist/metadata/model.js +13 -0
  53. package/dist/metadata/model.js.map +1 -0
  54. package/dist/metadata/parse.d.ts +16 -0
  55. package/dist/metadata/parse.d.ts.map +1 -0
  56. package/dist/metadata/parse.js +48 -0
  57. package/dist/metadata/parse.js.map +1 -0
  58. package/dist/metadata/problems.d.ts +4 -0
  59. package/dist/metadata/problems.d.ts.map +1 -0
  60. package/dist/metadata/problems.js +57 -0
  61. package/dist/metadata/problems.js.map +1 -0
  62. package/dist/metadata/relationshipLabel.d.ts +2 -0
  63. package/dist/metadata/relationshipLabel.d.ts.map +1 -0
  64. package/dist/metadata/relationshipLabel.js +13 -0
  65. package/dist/metadata/relationshipLabel.js.map +1 -0
  66. package/dist/metadata/schema.d.ts +34 -0
  67. package/dist/metadata/schema.d.ts.map +1 -0
  68. package/dist/metadata/schema.js +27 -0
  69. package/dist/metadata/schema.js.map +1 -0
  70. package/dist/metadata/sourceLinks.d.ts +5 -0
  71. package/dist/metadata/sourceLinks.d.ts.map +1 -0
  72. package/dist/metadata/sourceLinks.js +44 -0
  73. package/dist/metadata/sourceLinks.js.map +1 -0
  74. package/dist/page/backlinksHtml.d.ts +3 -0
  75. package/dist/page/backlinksHtml.d.ts.map +1 -0
  76. package/dist/page/backlinksHtml.js +16 -0
  77. package/dist/page/backlinksHtml.js.map +1 -0
  78. package/dist/page/board.d.ts +1 -1
  79. package/dist/page/board.d.ts.map +1 -1
  80. package/dist/page/board.js +14 -4
  81. package/dist/page/board.js.map +1 -1
  82. package/dist/page/client.d.ts +2 -1
  83. package/dist/page/client.d.ts.map +1 -1
  84. package/dist/page/client.js +65 -7
  85. package/dist/page/client.js.map +1 -1
  86. package/dist/page/criteriaEvidence.d.ts +4 -0
  87. package/dist/page/criteriaEvidence.d.ts.map +1 -0
  88. package/dist/page/criteriaEvidence.js +27 -0
  89. package/dist/page/criteriaEvidence.js.map +1 -0
  90. package/dist/page/diagrams.d.ts +1 -1
  91. package/dist/page/diagrams.d.ts.map +1 -1
  92. package/dist/page/diagrams.js +12 -4
  93. package/dist/page/diagrams.js.map +1 -1
  94. package/dist/page/document.d.ts +1 -1
  95. package/dist/page/document.d.ts.map +1 -1
  96. package/dist/page/document.js +6 -3
  97. package/dist/page/document.js.map +1 -1
  98. package/dist/page/libraryScript.d.ts +2 -0
  99. package/dist/page/libraryScript.d.ts.map +1 -0
  100. package/dist/page/libraryScript.js +73 -0
  101. package/dist/page/libraryScript.js.map +1 -0
  102. package/dist/page/metadata.d.ts +5 -0
  103. package/dist/page/metadata.d.ts.map +1 -0
  104. package/dist/page/metadata.js +34 -0
  105. package/dist/page/metadata.js.map +1 -0
  106. package/dist/page/metadataDetails.d.ts +4 -0
  107. package/dist/page/metadataDetails.d.ts.map +1 -0
  108. package/dist/page/metadataDetails.js +21 -0
  109. package/dist/page/metadataDetails.js.map +1 -0
  110. package/dist/page/metadataLinks.d.ts +6 -0
  111. package/dist/page/metadataLinks.d.ts.map +1 -0
  112. package/dist/page/metadataLinks.js +31 -0
  113. package/dist/page/metadataLinks.js.map +1 -0
  114. package/dist/page/nav.d.ts.map +1 -1
  115. package/dist/page/nav.js +3 -3
  116. package/dist/page/nav.js.map +1 -1
  117. package/dist/page/navigationScript.d.ts +2 -0
  118. package/dist/page/navigationScript.d.ts.map +1 -0
  119. package/dist/page/navigationScript.js +104 -0
  120. package/dist/page/navigationScript.js.map +1 -0
  121. package/dist/page/readingStateScript.d.ts +2 -0
  122. package/dist/page/readingStateScript.d.ts.map +1 -0
  123. package/dist/page/readingStateScript.js +62 -0
  124. package/dist/page/readingStateScript.js.map +1 -0
  125. package/dist/page/readingStyles.d.ts +2 -0
  126. package/dist/page/readingStyles.d.ts.map +1 -0
  127. package/dist/page/readingStyles.js +29 -0
  128. package/dist/page/readingStyles.js.map +1 -0
  129. package/dist/page/readingTools.d.ts +3 -0
  130. package/dist/page/readingTools.d.ts.map +1 -0
  131. package/dist/page/readingTools.js +10 -0
  132. package/dist/page/readingTools.js.map +1 -0
  133. package/dist/page/recordedEvidence.d.ts +4 -0
  134. package/dist/page/recordedEvidence.d.ts.map +1 -0
  135. package/dist/page/recordedEvidence.js +10 -0
  136. package/dist/page/recordedEvidence.js.map +1 -0
  137. package/dist/page/searchDialog.d.ts +3 -0
  138. package/dist/page/searchDialog.d.ts.map +1 -0
  139. package/dist/page/searchDialog.js +16 -0
  140. package/dist/page/searchDialog.js.map +1 -0
  141. package/dist/page/searchResultsScript.d.ts +2 -0
  142. package/dist/page/searchResultsScript.d.ts.map +1 -0
  143. package/dist/page/searchResultsScript.js +64 -0
  144. package/dist/page/searchResultsScript.js.map +1 -0
  145. package/dist/page/searchScript.d.ts +2 -0
  146. package/dist/page/searchScript.d.ts.map +1 -0
  147. package/dist/page/searchScript.js +73 -0
  148. package/dist/page/searchScript.js.map +1 -0
  149. package/dist/page/shell.d.ts +1 -1
  150. package/dist/page/shell.d.ts.map +1 -1
  151. package/dist/page/shell.js +23 -5
  152. package/dist/page/shell.js.map +1 -1
  153. package/dist/page/stateScript.d.ts +2 -0
  154. package/dist/page/stateScript.d.ts.map +1 -0
  155. package/dist/page/stateScript.js +49 -0
  156. package/dist/page/stateScript.js.map +1 -0
  157. package/dist/page/style.d.ts.map +1 -1
  158. package/dist/page/style.js +14 -34
  159. package/dist/page/style.js.map +1 -1
  160. package/dist/page/swap.d.ts +1 -1
  161. package/dist/page/swap.d.ts.map +1 -1
  162. package/dist/page/swap.js +4 -1
  163. package/dist/page/swap.js.map +1 -1
  164. package/dist/page/workspaceStyles.d.ts +3 -0
  165. package/dist/page/workspaceStyles.d.ts.map +1 -0
  166. package/dist/page/workspaceStyles.js +79 -0
  167. package/dist/page/workspaceStyles.js.map +1 -0
  168. package/dist/render/documentHeadings.d.ts +667 -0
  169. package/dist/render/documentHeadings.d.ts.map +1 -0
  170. package/dist/render/documentHeadings.js +45 -0
  171. package/dist/render/documentHeadings.js.map +1 -0
  172. package/dist/render/documentLinks.d.ts +659 -0
  173. package/dist/render/documentLinks.d.ts.map +1 -0
  174. package/dist/render/documentLinks.js +19 -0
  175. package/dist/render/documentLinks.js.map +1 -0
  176. package/dist/render/markdown.d.ts +7 -1
  177. package/dist/render/markdown.d.ts.map +1 -1
  178. package/dist/render/markdown.js +13 -2
  179. package/dist/render/markdown.js.map +1 -1
  180. package/dist/search/collector.d.ts +13 -0
  181. package/dist/search/collector.d.ts.map +1 -0
  182. package/dist/search/collector.js +40 -0
  183. package/dist/search/collector.js.map +1 -0
  184. package/dist/search/entries.d.ts +10 -0
  185. package/dist/search/entries.d.ts.map +1 -0
  186. package/dist/search/entries.js +37 -0
  187. package/dist/search/entries.js.map +1 -0
  188. package/dist/search/linkCollector.d.ts +8 -0
  189. package/dist/search/linkCollector.d.ts.map +1 -0
  190. package/dist/search/linkCollector.js +16 -0
  191. package/dist/search/linkCollector.js.map +1 -0
  192. package/dist/search/match.d.ts +14 -0
  193. package/dist/search/match.d.ts.map +1 -0
  194. package/dist/search/match.js +26 -0
  195. package/dist/search/match.js.map +1 -0
  196. package/dist/search/metadataEntries.d.ts +4 -0
  197. package/dist/search/metadataEntries.d.ts.map +1 -0
  198. package/dist/search/metadataEntries.js +40 -0
  199. package/dist/search/metadataEntries.js.map +1 -0
  200. package/dist/search/snapshot.d.ts +13 -0
  201. package/dist/search/snapshot.d.ts.map +1 -0
  202. package/dist/search/snapshot.js +50 -0
  203. package/dist/search/snapshot.js.map +1 -0
  204. package/dist/views/items.d.ts +11 -0
  205. package/dist/views/items.d.ts.map +1 -0
  206. package/dist/views/items.js +48 -0
  207. package/dist/views/items.js.map +1 -0
  208. package/dist/views/projection.d.ts +15 -0
  209. package/dist/views/projection.d.ts.map +1 -0
  210. package/dist/views/projection.js +47 -0
  211. package/dist/views/projection.js.map +1 -0
  212. package/dist/views/savedScript.d.ts +2 -0
  213. package/dist/views/savedScript.d.ts.map +1 -0
  214. package/dist/views/savedScript.js +89 -0
  215. package/dist/views/savedScript.js.map +1 -0
  216. package/dist/views/state.d.ts +15 -0
  217. package/dist/views/state.d.ts.map +1 -0
  218. package/dist/views/state.js +45 -0
  219. package/dist/views/state.js.map +1 -0
  220. package/dist/views/tools.d.ts +3 -0
  221. package/dist/views/tools.d.ts.map +1 -0
  222. package/dist/views/tools.js +11 -0
  223. package/dist/views/tools.js.map +1 -0
  224. package/dist/views/workCards.d.ts +4 -0
  225. package/dist/views/workCards.d.ts.map +1 -0
  226. package/dist/views/workCards.js +23 -0
  227. package/dist/views/workCards.js.map +1 -0
  228. package/dist/views/workControls.d.ts +4 -0
  229. package/dist/views/workControls.d.ts.map +1 -0
  230. package/dist/views/workControls.js +32 -0
  231. package/dist/views/workControls.js.map +1 -0
  232. package/dist/views/workDetail.d.ts +13 -0
  233. package/dist/views/workDetail.d.ts.map +1 -0
  234. package/dist/views/workDetail.js +26 -0
  235. package/dist/views/workDetail.js.map +1 -0
  236. package/dist/views/workHtml.d.ts +15 -0
  237. package/dist/views/workHtml.d.ts.map +1 -0
  238. package/dist/views/workHtml.js +35 -0
  239. package/dist/views/workHtml.js.map +1 -0
  240. package/dist/views/workStyle.d.ts +2 -0
  241. package/dist/views/workStyle.d.ts.map +1 -0
  242. package/dist/views/workStyle.js +18 -0
  243. package/dist/views/workStyle.js.map +1 -0
  244. package/dist/views/workTable.d.ts +4 -0
  245. package/dist/views/workTable.d.ts.map +1 -0
  246. package/dist/views/workTable.js +19 -0
  247. package/dist/views/workTable.js.map +1 -0
  248. package/package.json +11 -8
  249. package/src/board.ts +9 -1
  250. package/src/cli.ts +1 -1
  251. package/src/files/changes.ts +2 -1
  252. package/src/files/url.ts +3 -0
  253. package/src/http/assets.ts +16 -1
  254. package/src/http/identity.ts +62 -0
  255. package/src/http/page.ts +46 -9
  256. package/src/http/search.ts +13 -0
  257. package/src/http/work.ts +41 -0
  258. package/src/metadata/backlinks.ts +39 -0
  259. package/src/metadata/fields.ts +26 -0
  260. package/src/metadata/links.ts +19 -0
  261. package/src/metadata/locations.ts +34 -0
  262. package/src/metadata/model.ts +27 -0
  263. package/src/metadata/parse.ts +62 -0
  264. package/src/metadata/problems.ts +62 -0
  265. package/src/metadata/relationshipLabel.ts +13 -0
  266. package/src/metadata/schema.ts +36 -0
  267. package/src/metadata/sourceLinks.ts +46 -0
  268. package/src/page/backlinksHtml.ts +18 -0
  269. package/src/page/board.ts +14 -4
  270. package/src/page/client.ts +65 -7
  271. package/src/page/criteriaEvidence.ts +36 -0
  272. package/src/page/diagrams.ts +12 -4
  273. package/src/page/document.ts +6 -3
  274. package/src/page/libraryScript.ts +72 -0
  275. package/src/page/metadata.ts +40 -0
  276. package/src/page/metadataDetails.ts +24 -0
  277. package/src/page/metadataLinks.ts +35 -0
  278. package/src/page/nav.ts +5 -4
  279. package/src/page/navigationScript.ts +103 -0
  280. package/src/page/readingStateScript.ts +61 -0
  281. package/src/page/readingStyles.ts +28 -0
  282. package/src/page/readingTools.ts +12 -0
  283. package/src/page/recordedEvidence.ts +12 -0
  284. package/src/page/searchDialog.ts +16 -0
  285. package/src/page/searchResultsScript.ts +63 -0
  286. package/src/page/searchScript.ts +72 -0
  287. package/src/page/shell.ts +24 -5
  288. package/src/page/stateScript.ts +48 -0
  289. package/src/page/style.ts +14 -35
  290. package/src/page/swap.ts +4 -1
  291. package/src/page/workspaceStyles.ts +79 -0
  292. package/src/render/documentHeadings.ts +52 -0
  293. package/src/render/documentLinks.ts +19 -0
  294. package/src/render/markdown.ts +21 -4
  295. package/src/search/collector.ts +44 -0
  296. package/src/search/entries.ts +51 -0
  297. package/src/search/linkCollector.ts +16 -0
  298. package/src/search/match.ts +28 -0
  299. package/src/search/metadataEntries.ts +42 -0
  300. package/src/search/snapshot.ts +60 -0
  301. package/src/views/items.ts +55 -0
  302. package/src/views/projection.ts +59 -0
  303. package/src/views/savedScript.ts +88 -0
  304. package/src/views/state.ts +47 -0
  305. package/src/views/tools.ts +11 -0
  306. package/src/views/workCards.ts +26 -0
  307. package/src/views/workControls.ts +38 -0
  308. package/src/views/workDetail.ts +28 -0
  309. package/src/views/workHtml.ts +39 -0
  310. package/src/views/workStyle.ts +17 -0
  311. package/src/views/workTable.ts +21 -0
  312. package/dist/index.d.ts +0 -2
  313. package/dist/index.d.ts.map +0 -1
  314. package/dist/index.js +0 -2
  315. package/dist/index.js.map +0 -1
  316. package/src/index.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,71 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 - 2026-10-04
4
+
5
+ ### Changed
6
+
7
+ - Breaking: no root entry and no module that re-exports another. `exports` maps one `"./*.ts"` pattern to every module (`src` under the `source` condition, `dist` otherwise), so you import the module that defines a name, and a bundler sees only the modules you use. Where each name now lives:
8
+ - `@shivaedev/work-board`: `@shivaedev/work-board/board.ts` (`BoardOptions`, `boardLayer`)
9
+
10
+ ### Added
11
+
12
+ - Add source backlinks for explicit relationships, board membership, criterion
13
+ evidence, local evidence sources, and Markdown hyperlinks, including plain
14
+ files. Reuse the existing parse/index and disclose incomplete references.
15
+ Associate criterion claims across files and link directly to their records;
16
+ show missing claims, origin lines, retained old revisions, and missing local
17
+ Markdown sources without implying verified acceptance. Decision options and
18
+ rationale stay ordinary Markdown; source files remain unchanged.
19
+
20
+ - Add a table layout sharing board projections, filters, sorting, and selected
21
+ source detail. Switch layouts without losing URL context and read/filter tables
22
+ without JavaScript. Save, update, reopen, remove, or clear up to 10 local named
23
+ views per workspace; reject unsafe destinations and disclose unavailable
24
+ storage. Keep saved filters separate from URL item selection and never silently
25
+ evict a saved view at capacity. Source Markdown stays unchanged.
26
+
27
+ - Add Work board selection and explicit shared-item projections, exact status/
28
+ owner filters, text matching, and sorting. URL state restores board/filter/
29
+ selected detail context; source Markdown stays readable in a side pane.
30
+ Disclose missing/ambiguous memberships and selections, retain filters and
31
+ focused unsent search through live updates, and keep native links/GET filters
32
+ usable without JavaScript. Existing heading boards remain unchanged.
33
+
34
+ - Read optional YAML frontmatter for stable item identity, explicit work fields,
35
+ relationships, board membership, criteria, and recorded evidence provenance.
36
+ Keep ordinary Markdown/heading boards valid, retain unknown source metadata,
37
+ and disclose malformed fields, duplicate IDs, and unresolved references.
38
+ Rebuild identities from the existing local index; identity links survive file
39
+ and heading renames, and criterion search opens its source context. Recorded
40
+ outcomes remain distinct from independently verified acceptance.
41
+ - Show source lines in search results and preserve reading state when an item
42
+ moves. Keep passage focus when a search result targets the active document.
43
+
44
+ - Add local workspace search with document, heading, and passage results, snippets,
45
+ keyboard navigation, and a command dialog for existing view controls. Rebuild
46
+ the in-memory index after file changes, disclose unreadable files, and prevent
47
+ older search responses from replacing newer queries.
48
+
49
+ - Add heading passage links and an outline, in-place document navigation with
50
+ back/forward reading-state restoration, workspace-scoped favorites and recents,
51
+ active document titles, and readable missing-document/passage states.
52
+ - Resolve Markdown links relative to the source file, including nested home
53
+ files served at `/`. Ignore stale page responses after navigation and render
54
+ cached diagrams using the current theme.
55
+ - Add the first workspace shell: a collapsible file sidebar, file location,
56
+ responsive board columns, readable documents, and keyboard skip navigation.
57
+ Remember theme, density, and sidebar choices per folder and server origin;
58
+ code highlighting and diagrams follow the selected theme. Controls remain
59
+ usable when browser storage is unavailable.
60
+
61
+ - Add a step-by-step delivery plan for the vision, with 26 bounded implementation
62
+ steps, dependencies, acceptance evidence, and explicit design gates before
63
+ richer source formats, mutations, agent handoffs, and external integrations.
64
+
65
+ - Document the local Work Board north star, three-wave roadmap, experience design,
66
+ and interactive vision mockups with desktop and mobile captures. The package
67
+ README links to the proposed direction separately from its current behavior.
68
+
3
69
  ## 0.2.1 - 2026-10-04
4
70
 
5
71
  ### Changed
package/README.md CHANGED
@@ -10,7 +10,7 @@ work-board ./project-notes --port 4747 --home plan.md
10
10
  ```
11
11
 
12
12
  It listens on `127.0.0.1` only and answers only requests addressed to a
13
- loopback host. Every `.md` file under the folder appears in the top bar with how
13
+ loopback host. Every `.md` file under the folder appears in the collapsible sidebar with how
14
14
  long ago it changed. Below the folder, files and folders starting with a dot and
15
15
  `node_modules` are never entered, and anything that is not markdown is skipped;
16
16
  the folder itself may be a dot folder such as `.notes`. No path outside the
@@ -23,7 +23,15 @@ footnotes, raw HTML (including `<details>` with markdown inside) and fenced code
23
23
  highlighted with Shiki's GitHub light and dark themes. Raw HTML is not
24
24
  sanitized, so serve only folders you trust. Pages send a content security
25
25
  policy that allows only the board's own scripts, and `Cache-Control: no-store`.
26
- The page uses system fonts and follows the light or dark colour scheme.
26
+ The page uses system fonts. Theme can follow the system or stay light or dark.
27
+ Theme, compact/comfortable density, and sidebar visibility are remembered in
28
+ browser storage for this folder and server origin. When storage is unavailable,
29
+ controls still work for the current page and show a notice.
30
+
31
+ The file location appears above the content. Documents use a readable line
32
+ length; boards use a wider grid that stacks on narrow screens. The sidebar has
33
+ its own scroll area and starts collapsed on narrow screens unless a saved
34
+ preference says otherwise. A keyboard skip link moves directly to the content.
27
35
 
28
36
  | Option | Default | Meaning |
29
37
  | --- | --- | --- |
@@ -31,6 +39,125 @@ The page uses system fonts and follows the light or dark colour scheme.
31
39
  | `--port` | `4747` | The port on `127.0.0.1`. `0` picks a free one. |
32
40
  | `--home` | none | The file shown at `/` as a board, relative to the folder. The command stops with an error unless it leads to one of the markdown files listed from the folder. Without it, `/` shows the first file as a document. |
33
41
 
42
+ ## Document navigation
43
+
44
+ Markdown headings have passage links and an **On this page** outline, including separate
45
+ anchors for duplicate headings. Use the heading's `#` link to copy a passage URL.
46
+ Generated anchors use the heading text and duplicate order; changing either can
47
+ change the anchor. Renaming a file changes its document URL. Authored HTML IDs
48
+ and footnote links remain intact. Richer files can declare stable work-item IDs.
49
+
50
+ Markdown links resolve from their source file, including a nested `--home` file
51
+ served at `/`. Links within the workspace open in place; modified clicks and
52
+ links targeting another window keep their normal browser behavior. The browser
53
+ title and active file tooltip follow the document's main heading.
54
+
55
+ Back and forward restore the previous scroll, selected text, and open details.
56
+ The client keeps up to 30 page snapshots and tab-scoped reading records; it
57
+ fetches the current file again on return so changes and deletions are visible.
58
+ A missing document explains what happened, and a missing passage shows a notice.
59
+
60
+ **Save favorite** pins a document to the sidebar. Recent documents are deduplicated
61
+ and limited to the last ten. Favorites and recents use browser storage scoped to
62
+ the folder and server origin. Deleted favorites remain visible with a missing
63
+ label. If storage is unavailable, favorites and recents work on the current page;
64
+ reading navigation still works in the open tab. Content and the outline remain
65
+ readable with JavaScript disabled.
66
+
67
+ ## Workspace search
68
+
69
+ Use **Search** or Ctrl/Cmd+K to find document titles/paths, Markdown headings, and
70
+ passage text. Results identify their type and source file/line where known, include text snippets,
71
+ and open the corresponding heading when available. Matching is case-insensitive
72
+ with Unicode normalization; all query terms must occur in a block. Titles rank
73
+ before headings, then passages, with stable source order within each group.
74
+ Results are limited to 40 and report the full match count. This is deterministic
75
+ text search, without fuzzy matching or semantic inference.
76
+
77
+ Arrow keys choose a result while the search field is focused; Enter opens it.
78
+ Escape closes the dialog and restores focus. With an empty query, commands open
79
+ the workspace or change the existing sidebar, density, and theme controls.
80
+
81
+ The server keeps a rebuildable index in memory and invalidates it when the file
82
+ watcher changes. An open dialog refreshes on edits and reconnects; older requests
83
+ cannot replace a newer query. Hidden files, `node_modules`, and symlinks outside
84
+ the workspace are excluded. Unreadable files produce an incomplete-results notice.
85
+ All indexing and requests stay local. Search needs JavaScript; document reading
86
+ does not. Source-in-editor links await an agreed local editor mechanism.
87
+
88
+ ## Optional work identity
89
+
90
+ A Markdown file can begin with YAML frontmatter declaring an explicit `id`,
91
+ `kind`, `status`, `owner`, `next_action`, relationships, criteria, board membership,
92
+ and evidence. Every field is optional; ordinary Markdown and heading boards need
93
+ no migration. [Source examples and shapes](./docs/vision/delivery/source-examples.md)
94
+ describe the convention. No section name becomes a status or workflow rule.
95
+
96
+ Work details show recorded fields, source locations, and the original header.
97
+ Malformed/unknown fields, duplicate IDs, and unresolved references remain visible
98
+ with diagnostics while prose stays readable. A unique ID has a shareable
99
+ `/_board/item/<id>/` link that survives file/heading renames; criterion links open
100
+ and focus their context. Search also finds explicit work fields and criteria.
101
+ An incomplete index cannot assert unique identity. The index rebuilds from files
102
+ without persistent storage; the UI never writes project content.
103
+
104
+ Evidence records show their source, criterion, checked revision, observed time,
105
+ method, and recorded outcome when provided. They are source claims, not
106
+ independently verified acceptance; missing provenance stays **Not recorded**.
107
+
108
+ ## Work views
109
+
110
+ Open **Work** to read identified items as a board or table. A `kind: board` file with a
111
+ unique ID and an explicit `items` list defines a selectable view; the same item
112
+ can appear in several boards. Board definitions are excluded from All work.
113
+ Missing/ambiguous members and repeated membership are disclosed without choosing
114
+ a duplicate source or counting repeated items twice. Legacy heading cards remain
115
+ on their original pages and do not become inferred identified work.
116
+
117
+ Columns use the exact recorded status, including a **Status not recorded** column.
118
+ Filter by status, owner, or work text and sort by title, owner, or status. Missing
119
+ values differ from literal text and sort last. Cards open a source detail pane;
120
+ its Markdown links resolve relative to its file. The URL records the board,
121
+ filters, sort, and selected ID, so reload and Back/Forward restore that context.
122
+ A selected item outside the filters stays visible with a notice; deletion or
123
+ ambiguous identity is explained. Live changes retain applied filters, including
124
+ filters with no current matches. Compact density applies to these cards too.
125
+ Board and table use the same projection and selection; switching layouts keeps
126
+ that URL context. Table rows show kind, status, owner, and next action, with
127
+ missing fields disclosed and the same source detail pane. Narrow tables scroll
128
+ inside their own container; compact density reduces row/card spacing.
129
+ Native links and GET filters remain usable without JavaScript.
130
+
131
+ Save up to 10 named views in browser storage scoped to the workspace and server
132
+ origin. A view retains the applied board, filters, sort, and layout; item selection
133
+ stays in its shareable URL. Saving the same name updates it. At capacity, remove
134
+ one or update a name; views are never silently evicted. Remove one or clear all
135
+ from the view picker. Unsafe stored destinations are ignored. If storage is
136
+ unavailable, named views work for the current page only; source files are unchanged.
137
+ Saving requires JavaScript; board/table reading does not.
138
+
139
+ ## Reasoning and evidence context
140
+
141
+ Follow explicit relationships from a result to its plan and decision. Decisions
142
+ keep options, comparisons, and rationale in ordinary Markdown; no new decision
143
+ fields are required. **Referenced by** lists incoming relationships, board
144
+ membership, criterion claims, evidence-source links, and local Markdown hyperlinks,
145
+ including plain files without frontmatter. Relative/encoded paths and root home
146
+ links use the source file's location. Repeated prose links from one file count
147
+ once; code examples do not become links. External URLs are not local backlinks.
148
+ Incomplete workspaces disclose partial references and do not select ambiguous IDs.
149
+
150
+ Each uniquely identified criterion lists claims recorded across the readable
151
+ workspace, with links to their source records. Missing claims say that acceptance
152
+ is not established. A record shows origin file/line, checked revision, observed
153
+ time, method, and outcome; missing provenance stays **Not recorded**. Old recorded
154
+ revisions remain visible, and Work Board does not compare them to a current Git
155
+ revision or infer human acceptance. Missing local Markdown evidence sources remain
156
+ linked with a notice. Generated `recorded-evidence-<index>` anchors follow source
157
+ array order and may change after insertion/reordering; item and criterion IDs are
158
+ the explicit stable references. Backlinks/claim associations rebuild on file
159
+ changes and after restart, without writing an event history.
160
+
34
161
  ## Diagrams
35
162
 
36
163
  A ` ```mermaid ` block is drawn in the browser. Mermaid loads from the installed
@@ -139,7 +266,7 @@ non-loopback address when the server knows the address.
139
266
  import { NodeServices } from "@effect/platform-node"
140
267
  import { Layer } from "effect"
141
268
  import { HttpRouter } from "effect/unstable/http"
142
- import { boardLayer } from "@shivaedev/work-board"
269
+ import { boardLayer } from "@shivaedev/work-board/board.ts"
143
270
 
144
271
  const board = HttpRouter.toWebHandler(
145
272
  Layer.provide(boardLayer({ root: "./project-notes", home: "plan.md" }), NodeServices.layer),
@@ -156,3 +283,14 @@ skips the build. `pnpm dlx` and `pnpm add --global` need no setting.
156
283
  allowBuilds:
157
284
  msgpackr-extract: false
158
285
  ```
286
+
287
+ ## Product vision
288
+
289
+ The [north star and visual direction](https://github.com/ShivaeDev/platform/tree/main/packages/work-board/docs/vision#readme)
290
+ describe the proposed local workspace for a person and their agents: stay
291
+ informed, give direction and coordinate, then collaborate. The
292
+ [roadmap](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/roadmap.md)
293
+ sets the waves, acceptance criteria, and open design decisions.
294
+ [Experience designs and mockups](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/experience.md)
295
+ illustrate the target with fictional data. These are future plans; the sections
296
+ above describe the package's current behavior.
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAA4B,MAAM,iBAAiB,CAAC;AAKvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AA6BD,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAA4B,MAAM,iBAAiB,CAAC;AAQvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAiCD,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
package/dist/board.js CHANGED
@@ -4,10 +4,14 @@ import { watchChanges } from "#files/changes.ts";
4
4
  import { homeIn } from "#files/home.ts";
5
5
  import { ASSETS, MERMAID_ROUTE, mermaidFile, mermaidRoot } from "#http/assets.ts";
6
6
  import { events } from "#http/events.ts";
7
+ import { identity } from "#http/identity.ts";
7
8
  import { loopbackOnly } from "#http/loopback.ts";
8
9
  import { page } from "#http/page.ts";
9
10
  import { respond } from "#http/respond.ts";
11
+ import { search } from "#http/search.ts";
12
+ import { work } from "#http/work.ts";
10
13
  import { Highlighter } from "#render/highlighter.ts";
14
+ import { searchSnapshot } from "#search/snapshot.ts";
11
15
  const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
12
16
  const home = yield* homeIn(options.root, options.home);
13
17
  const mermaid = yield* mermaidRoot();
@@ -15,11 +19,15 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
15
19
  const context = yield* Effect.context();
16
20
  const serve = (route, handler) => router.add("GET", route, loopbackOnly((request) => Effect.provideContext(handler(request), context)));
17
21
  yield* serve("/events", events(changes));
22
+ const index = yield* searchSnapshot(options.root, home, changes);
23
+ yield* serve("/_board/search", search(index));
24
+ yield* serve("/_board/work", work(index, changes, home));
18
25
  for (const [route, body, contentType] of ASSETS) {
19
26
  yield* serve(route, () => Effect.succeed(respond(body, contentType)));
20
27
  }
21
28
  yield* serve(MERMAID_ROUTE, mermaidFile(mermaid));
22
- const pages = page({ home, root: options.root }, changes);
29
+ const pages = page({ home, root: options.root }, changes, index);
30
+ yield* serve("/_board/item/*", identity(index, pages, changes, home));
23
31
  yield* serve("/", pages);
24
32
  yield* serve("/*", pages);
25
33
  }));
package/dist/board.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmB,KAAK,EAAiC,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAoB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAuB,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAUrD,MAAM,MAAM,GAAG,CAAC,OAAqB,EAAE,EAAE,CACxC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAY,CAAC;IAClD,MAAM,KAAK,GAAG,CAAI,KAA2B,EAAE,OAAmB,EAAE,EAAE,CACrE,MAAM,CAAC,GAAG,CACT,KAAK,EACL,KAAK,EACL,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC;IACH,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;QACjD,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CACF,CAAC;AAKH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAqB,EAAiD,EAAE,CAClG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
3
3
  import { Effect, Layer, Option, Path } from "effect";
4
4
  import { Argument, Command, Flag } from "effect/unstable/cli";
5
5
  import { HOST, serveBoard } from "./serve.js";
6
- const VERSION = "0.2.1";
6
+ const VERSION = "0.3.0";
7
7
  const serve = Effect.fn("WorkBoard.serve")(function* (input) {
8
8
  const path = yield* Path.Path;
9
9
  return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, root: path.resolve(input.dir) }));
@@ -11,6 +11,7 @@ export interface Changes {
11
11
  readonly events: PubSub.PubSub<Change>;
12
12
  readonly files: Effect.Effect<readonly MarkdownFile[], PlatformError.PlatformError>;
13
13
  readonly realRoot: string;
14
+ readonly revision: Effect.Effect<number>;
14
15
  readonly watching: Ref.Ref<boolean>;
15
16
  }
16
17
  export declare const watchChanges: (root: string) => Effect.Effect<Changes, PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | import("effect/Scope").Scope>;
@@ -1 +1 @@
1
- {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,GAAG,EAAoB,MAAM,QAAQ,CAAC;AAC7H,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAExE,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjJ,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACpC;AAcD,eAAO,MAAM,YAAY,yIA8CvB,CAAC"}
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,GAAG,EAAoB,MAAM,QAAQ,CAAC;AAC7H,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAExE,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjJ,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACpC;AAcD,eAAO,MAAM,YAAY,yIA8CvB,CAAC"}
@@ -32,7 +32,7 @@ export const watchChanges = Effect.fn("WorkBoard.watchChanges")(function* (root)
32
32
  yield* Ref.set(cached, Option.some({ files: listed, generation: now }));
33
33
  return listed;
34
34
  });
35
- const changes = { events, files, realRoot, watching };
35
+ const changes = { events, files, realRoot, revision: Ref.get(generation), watching };
36
36
  return changes;
37
37
  });
38
38
  //# sourceMappingURL=changes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function fileUrl(file: string): string;
2
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/files/url.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,4 @@
1
+ export function fileUrl(file) {
2
+ return `/${file.split("/").map(encodeURIComponent).join("/")}`;
3
+ }
4
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/files/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAY;IACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/http/assets.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAO1E,eAAO,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAKjF,CAAC;;;;AAIF,qBAAa,cAAe,SAAQ,oBAAmC;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;CAAG;AAEtG,eAAO,MAAM,WAAW,wDAItB,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,aAAa,MAAM,2NAS5C,CAAC;AAEJ,eAAO,MAAM,aAAa,EAAE,UAAU,CAAC,SAAyB,CAAC"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/http/assets.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAc1E,eAAO,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAajF,CAAC;;;;AAIF,qBAAa,cAAe,SAAQ,oBAAmC;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;CAAG;AAEtG,eAAO,MAAM,WAAW,wDAItB,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,aAAa,MAAM,2NAS5C,CAAC;AAEJ,eAAO,MAAM,aAAa,EAAE,UAAU,CAAC,SAAyB,CAAC"}
@@ -1,13 +1,28 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { Data, Effect, FileSystem, Path } from "effect";
3
- import { client } from "#page/client.ts";
3
+ import { client, preferences } from "#page/client.ts";
4
4
  import { diagrams } from "#page/diagrams.ts";
5
+ import { libraryScript } from "#page/libraryScript.ts";
6
+ import { navigationScript } from "#page/navigationScript.ts";
7
+ import { readingStateScript } from "#page/readingStateScript.ts";
8
+ import { searchResultsScript } from "#page/searchResultsScript.ts";
9
+ import { searchScript } from "#page/searchScript.ts";
10
+ import { pageStateScript } from "#page/stateScript.ts";
5
11
  import { style } from "#page/style.ts";
6
12
  import { swap } from "#page/swap.ts";
13
+ import { savedScript } from "#views/savedScript.ts";
7
14
  import { respond } from "./respond.js";
8
15
  export const ASSETS = [
9
16
  ["/_board/style.css", style, "text/css"],
17
+ ["/_board/saved-views.js", savedScript(), "text/javascript"],
10
18
  ["/_board/client.js", client, "text/javascript"],
19
+ ["/_board/preferences.js", preferences, "text/javascript"],
20
+ ["/_board/search.js", searchScript(), "text/javascript"],
21
+ ["/_board/search-results.js", searchResultsScript(), "text/javascript"],
22
+ ["/_board/library.js", libraryScript(), "text/javascript"],
23
+ ["/_board/navigation.js", navigationScript(), "text/javascript"],
24
+ ["/_board/page-state.js", pageStateScript(), "text/javascript"],
25
+ ["/_board/reading-state.js", readingStateScript(), "text/javascript"],
11
26
  ["/_board/diagrams.js", diagrams, "text/javascript"],
12
27
  ["/_board/swap.js", swap, "text/javascript"],
13
28
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/http/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,MAAM,GAAmE;IACrF,CAAC,mBAAmB,EAAE,KAAK,EAAE,UAAU,CAAC;IACxC,CAAC,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,CAAC;IAChD,CAAC,qBAAqB,EAAE,QAAQ,EAAE,iBAAiB,CAAC;IACpD,CAAC,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,CAAC;CAC5C,CAAC;AAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAA8B;CAAG;AAEtG,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnJ,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,WAAmB,EAAE,EAAE,CAClD,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA4C;IACzF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAChH,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1G,OAAO,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,aAAa,GAAyB,GAAG,OAAO,GAAG,CAAC"}
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/http/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Effect } from "effect";
2
+ import type { HttpServerRequest } from "effect/unstable/http";
3
+ import type { Changes } from "#files/changes.ts";
4
+ import type { searchSnapshot } from "#search/snapshot.ts";
5
+ import type { page } from "./page.ts";
6
+ export declare function identity(index: Effect.Success<ReturnType<typeof searchSnapshot>>, pages: ReturnType<typeof page>, changes: Changes, home: string | undefined): (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<import("effect/unstable/http/HttpServerResponse").HttpServerResponse, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | import("../render/highlighter.ts").Highlighter | import("effect/Path").Path>;
7
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/http/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWtC,wBAAgB,QAAQ,CACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,EACxD,KAAK,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,EAC9B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,6SAsCxB"}
@@ -0,0 +1,38 @@
1
+ import { Effect } from "effect";
2
+ import { fileUrl } from "#files/url.ts";
3
+ import { escapeHtml } from "#page/escape.ts";
4
+ import { navHtml } from "#page/nav.ts";
5
+ import { shell } from "#page/shell.ts";
6
+ import { respond } from "./respond.js";
7
+ function requestedIdentity(pathname) {
8
+ try {
9
+ return decodeURIComponent(pathname.slice("/_board/item/".length).replace(/\/$/u, ""));
10
+ }
11
+ catch {
12
+ return "";
13
+ }
14
+ }
15
+ export function identity(index, pages, changes, home) {
16
+ return Effect.fn("WorkBoard.identity")(function* (request) {
17
+ const pathname = new URL(request.url, "http://127.0.0.1").pathname;
18
+ const id = requestedIdentity(pathname);
19
+ if (!pathname.endsWith("/") && /\.md$/iu.exec(id) !== null) {
20
+ return yield* pages(request);
21
+ }
22
+ const snapshot = yield* index;
23
+ const matches = snapshot.model.ids.get(id) ?? [];
24
+ if (snapshot.unavailable.length > 0) {
25
+ return respond(shell(`Item ${id}`, "", `<p class="empty">The workspace index is incomplete. Could not read ${escapeHtml(snapshot.unavailable.join(", "))}; item identity could not be validated. Retry when the files are readable.</p>`, changes.realRoot, false), "text/html", 503);
26
+ }
27
+ if (matches.length === 1 && matches[0]) {
28
+ return yield* pages(request, matches[0].file, id);
29
+ }
30
+ const text = matches.length > 0
31
+ ? `The ID ${id} is duplicated. No document was selected.`
32
+ : `No item with ID ${id} is available. It may be missing, renamed, or invalid.`;
33
+ const choices = matches.map((document) => `<li><a href="${escapeHtml(fileUrl(document.file))}">${escapeHtml(document.file)}</a></li>`).join("");
34
+ const nav = navHtml(yield* changes.files, "", home);
35
+ return respond(shell(`Item ${id}`, nav, `<p class="empty">${escapeHtml(text)}</p>${choices ? `<ul>${choices}</ul>` : ""}`, changes.realRoot, false), "text/html", matches.length > 0 ? 409 : 404);
36
+ });
37
+ }
38
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/http/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,SAAS,iBAAiB,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACJ,OAAO,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,KAAwD,EACxD,KAA8B,EAC9B,OAAgB,EAChB,IAAwB;IAExB,OAAO,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA4C;QAC7F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QACnE,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,OAAO,CACb,KAAK,CACJ,QAAQ,EAAE,EAAE,EACZ,EAAE,EACF,sEAAsE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,gFAAgF,EACjM,OAAO,CAAC,QAAQ,EAChB,KAAK,CACL,EACD,WAAW,EACX,GAAG,CACH,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GACT,OAAO,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,CAAC,UAAU,EAAE,2CAA2C;YACzD,CAAC,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;QAClF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChJ,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,OAAO,CACb,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,oBAAoB,UAAU,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EACpI,WAAW,EACX,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { Effect, FileSystem, Path } from "effect";
2
2
  import type { HttpServerRequest } from "effect/unstable/http";
3
3
  import type { Changes } from "#files/changes.ts";
4
+ import type { searchSnapshot } from "#search/snapshot.ts";
4
5
  export interface PageOptions {
5
6
  readonly home: string | undefined;
6
7
  readonly root: string;
7
8
  }
8
- export declare const page: (options: PageOptions, changes: Changes) => (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<import("effect/unstable/http/HttpServerResponse").HttpServerResponse, import("effect/PlatformError").PlatformError, FileSystem.FileSystem | import("../render/highlighter.ts").Highlighter | Path.Path>;
9
+ export declare const page: (options: PageOptions, changes: Changes, index: Effect.Success<ReturnType<typeof searchSnapshot>>) => (request: HttpServerRequest.HttpServerRequest, resolved?: string | undefined, expectedIdentity?: string | undefined) => Effect.Effect<import("effect/unstable/http/HttpServerResponse").HttpServerResponse, import("effect/PlatformError").PlatformError, FileSystem.FileSystem | import("../render/highlighter.ts").Highlighter | Path.Path>;
9
10
  //# sourceMappingURL=page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAUjD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAaD,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,EAAE,SAAS,OAAO,4QAyB1D,CAAC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAWjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAaD,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,EAAE,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,kVA0DpH,CAAC"}
package/dist/http/page.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import { Effect, FileSystem, Option, Path } from "effect";
2
2
  import { within } from "#files/list.ts";
3
+ import { metadataModel } from "#metadata/model.ts";
4
+ import { metadataParse } from "#metadata/parse.ts";
3
5
  import { boardHtml } from "#page/board.ts";
4
6
  import { documentHtml } from "#page/document.ts";
5
7
  import { escapeHtml } from "#page/escape.ts";
8
+ import { metadataHtml } from "#page/metadata.ts";
6
9
  import { navHtml } from "#page/nav.ts";
7
10
  import { shell } from "#page/shell.ts";
8
11
  import { boardOf } from "#render/board.ts";
@@ -17,8 +20,8 @@ const requestedPath = (url) => {
17
20
  }
18
21
  };
19
22
  const message = (text) => `<p class="empty">${escapeHtml(text)}</p>`;
20
- export const page = (options, changes) => {
21
- const body = Effect.fn("WorkBoard.pageBody")(function* (file) {
23
+ export const page = (options, changes, index) => {
24
+ const body = Effect.fn("WorkBoard.pageBody")(function* (file, expectedIdentity) {
22
25
  const fs = yield* FileSystem.FileSystem;
23
26
  const path = yield* Path.Path;
24
27
  const real = yield* Effect.option(fs.realPath(path.join(options.root, file.path)));
@@ -26,18 +29,37 @@ export const page = (options, changes) => {
26
29
  return Option.none();
27
30
  }
28
31
  const source = yield* fs.readFileString(real.value);
29
- return Option.some(file.path === options.home ? yield* boardHtml(boardOf(source), file.path, file.modified) : yield* documentHtml(source, file));
32
+ const parsed = metadataParse(source);
33
+ let identity;
34
+ const snapshot = yield* index;
35
+ const model = metadataModel([...snapshot.documents.filter((document) => document.file !== file.path), { file: file.path, parsed }], snapshot.unavailable, options.home ?? (yield* changes.files)[0]?.path);
36
+ const metadata = metadataHtml(parsed, file.path, model);
37
+ if (snapshot.unavailable.length === 0 && parsed.fields.id && model.ids.get(parsed.fields.id)?.length === 1) {
38
+ identity = parsed.fields.id;
39
+ }
40
+ if (expectedIdentity && identity !== expectedIdentity) {
41
+ return Option.none();
42
+ }
43
+ const html = file.path === options.home
44
+ ? yield* boardHtml(boardOf(parsed.body), file.path, file.modified, metadata)
45
+ : yield* documentHtml(parsed.body, file, metadata);
46
+ return Option.some({ html, identity });
30
47
  });
31
- return Effect.fn("WorkBoard.page")(function* (request) {
48
+ return Effect.fn("WorkBoard.page")(function* (request, resolved, expectedIdentity) {
32
49
  const files = yield* changes.files;
33
- const requested = requestedPath(request.url) || options.home || files[0]?.path || "";
50
+ const requested = resolved ?? (requestedPath(request.url) || options.home || files[0]?.path || "");
34
51
  const file = files.find((candidate) => candidate.path === requested);
35
52
  const nav = navHtml(files, requested, options.home);
36
- const missing = () => respond(shell(requested, nav, message(`No markdown file at ${requested || options.root}.`)), "text/html", 404);
53
+ function layout(content, identity) {
54
+ return shell(requested, nav, content, changes.realRoot, requested === options.home, identity);
55
+ }
56
+ const missing = () => respond(layout(message(expectedIdentity
57
+ ? `No item with ID ${expectedIdentity} at ${requested}; its source identity changed or is invalid.`
58
+ : `No markdown file at ${requested || options.root}.`)), "text/html", 404);
37
59
  if (file === undefined) {
38
60
  return missing();
39
61
  }
40
- return yield* body(file).pipe(Effect.map(Option.match({ onNone: missing, onSome: (main) => respond(shell(file.path, nav, main), "text/html") })), Effect.catch(() => Effect.succeed(respond(shell(file.path, nav, message(`${file.path} could not be read.`)), "text/html", 500))));
62
+ return yield* body(file, expectedIdentity).pipe(Effect.map(Option.match({ onNone: missing, onSome: (main) => respond(layout(main.html, main.identity), "text/html") })), Effect.catch(() => Effect.succeed(respond(layout(message(`${file.path} could not be read.`)), "text/html", 500))));
41
63
  });
42
64
  };
43
65
  //# sourceMappingURL=page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAqB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAOvC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAU,EAAE;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC;QACJ,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,QAAQ,CAAC;IACjB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAErF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAE,OAAgB,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAkB;QACzE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClJ,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA4C;QACzF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,uBAAuB,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACrI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAClH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAChI,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Effect } from "effect";
2
+ import type { HttpServerRequest } from "effect/unstable/http";
3
+ import type { searchSnapshot } from "#search/snapshot.ts";
4
+ export declare function search(index: Effect.Success<ReturnType<typeof searchSnapshot>>): (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<import("effect/unstable/http/HttpServerResponse").HttpServerResponse, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
5
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/http/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,4PAM9E"}