@shivaedev/work-board 0.15.0 → 0.17.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 (303) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +4 -4
  3. package/assets/react.css +1 -1
  4. package/assets/react.js +52 -39
  5. package/dist/browser/views/remaining.d.ts +0 -240
  6. package/dist/browser/views/remaining.d.ts.map +1 -1
  7. package/dist/browser/views/remaining.js +0 -2
  8. package/dist/browser/views/remaining.js.map +1 -1
  9. package/dist/client/document/Mermaid.d.ts.map +1 -1
  10. package/dist/client/document/Mermaid.js +4 -10
  11. package/dist/client/document/Mermaid.js.map +1 -1
  12. package/dist/client/document/View.js +1 -1
  13. package/dist/client/document/View.js.map +1 -1
  14. package/dist/client/react/BoardShell.d.ts.map +1 -1
  15. package/dist/client/react/BoardShell.js +28 -23
  16. package/dist/client/react/BoardShell.js.map +1 -1
  17. package/dist/client/react/DocumentAttention.d.ts.map +1 -1
  18. package/dist/client/react/DocumentAttention.js +2 -3
  19. package/dist/client/react/DocumentAttention.js.map +1 -1
  20. package/dist/client/react/DocumentContext.d.ts.map +1 -1
  21. package/dist/client/react/DocumentContext.js +6 -4
  22. package/dist/client/react/DocumentContext.js.map +1 -1
  23. package/dist/client/react/LiveControls.d.ts.map +1 -1
  24. package/dist/client/react/LiveControls.js +1 -6
  25. package/dist/client/react/LiveControls.js.map +1 -1
  26. package/dist/client/react/PhoneNavigation.d.ts +3 -1
  27. package/dist/client/react/PhoneNavigation.d.ts.map +1 -1
  28. package/dist/client/react/PhoneNavigation.js +8 -13
  29. package/dist/client/react/PhoneNavigation.js.map +1 -1
  30. package/dist/client/react/ProjectionFrame.js +1 -1
  31. package/dist/client/react/ProjectionFrame.js.map +1 -1
  32. package/dist/client/react/ReadingLibrary.d.ts.map +1 -1
  33. package/dist/client/react/ReadingLibrary.js +2 -6
  34. package/dist/client/react/ReadingLibrary.js.map +1 -1
  35. package/dist/client/react/ReadingReadyContext.d.ts +6 -0
  36. package/dist/client/react/ReadingReadyContext.d.ts.map +1 -0
  37. package/dist/client/react/ReadingReadyContext.js +7 -0
  38. package/dist/client/react/ReadingReadyContext.js.map +1 -0
  39. package/dist/client/react/RemainingMain.d.ts.map +1 -1
  40. package/dist/client/react/RemainingMain.js +0 -3
  41. package/dist/client/react/RemainingMain.js.map +1 -1
  42. package/dist/client/react/ResultPage.d.ts.map +1 -1
  43. package/dist/client/react/ResultPage.js +2 -1
  44. package/dist/client/react/ResultPage.js.map +1 -1
  45. package/dist/client/react/SessionContext.d.ts +3 -0
  46. package/dist/client/react/SessionContext.d.ts.map +1 -0
  47. package/dist/client/react/SessionContext.js +3 -0
  48. package/dist/client/react/SessionContext.js.map +1 -0
  49. package/dist/client/react/ShellApi.d.ts +0 -1
  50. package/dist/client/react/ShellApi.d.ts.map +1 -1
  51. package/dist/client/react/SystemMain.d.ts.map +1 -1
  52. package/dist/client/react/SystemMain.js +3 -1
  53. package/dist/client/react/SystemMain.js.map +1 -1
  54. package/dist/client/react/ThemeContext.d.ts +2 -0
  55. package/dist/client/react/ThemeContext.d.ts.map +1 -0
  56. package/dist/client/react/ThemeContext.js +3 -0
  57. package/dist/client/react/ThemeContext.js.map +1 -0
  58. package/dist/client/react/TodayOptions.d.ts.map +1 -1
  59. package/dist/client/react/TodayOptions.js +2 -2
  60. package/dist/client/react/TodayOptions.js.map +1 -1
  61. package/dist/client/react/entry.js +1 -1
  62. package/dist/client/react/entry.js.map +1 -1
  63. package/dist/client/react/loadBoardPage.d.ts.map +1 -1
  64. package/dist/client/react/loadBoardPage.js +5 -13
  65. package/dist/client/react/loadBoardPage.js.map +1 -1
  66. package/dist/client/react/loadRemaining.d.ts +124 -364
  67. package/dist/client/react/loadRemaining.d.ts.map +1 -1
  68. package/dist/client/react/loadRemaining.js +0 -2
  69. package/dist/client/react/loadRemaining.js.map +1 -1
  70. package/dist/client/react/navigationLocation.d.ts +2 -0
  71. package/dist/client/react/navigationLocation.d.ts.map +1 -1
  72. package/dist/client/react/navigationLocation.js +10 -0
  73. package/dist/client/react/navigationLocation.js.map +1 -1
  74. package/dist/client/react/pageQueries.d.ts.map +1 -1
  75. package/dist/client/react/pageQueries.js +0 -3
  76. package/dist/client/react/pageQueries.js.map +1 -1
  77. package/dist/client/react/readerLink.js +1 -1
  78. package/dist/client/react/readerLink.js.map +1 -1
  79. package/dist/client/react/remainingRoute.d.ts +1 -1
  80. package/dist/client/react/remainingRoute.d.ts.map +1 -1
  81. package/dist/client/react/remainingRoute.js +0 -2
  82. package/dist/client/react/remainingRoute.js.map +1 -1
  83. package/dist/client/react/scheduleReading.d.ts.map +1 -1
  84. package/dist/client/react/scheduleReading.js +1 -10
  85. package/dist/client/react/scheduleReading.js.map +1 -1
  86. package/dist/client/react/useAppearance.d.ts +2 -1
  87. package/dist/client/react/useAppearance.d.ts.map +1 -1
  88. package/dist/client/react/useAppearance.js +1 -2
  89. package/dist/client/react/useAppearance.js.map +1 -1
  90. package/dist/client/react/useBoardNavigation.d.ts +1 -1
  91. package/dist/client/react/useBoardNavigation.d.ts.map +1 -1
  92. package/dist/client/react/useBoardNavigation.js +13 -17
  93. package/dist/client/react/useBoardNavigation.js.map +1 -1
  94. package/dist/client/react/useDiagnosticsPolling.d.ts +4 -1
  95. package/dist/client/react/useDiagnosticsPolling.d.ts.map +1 -1
  96. package/dist/client/react/useDiagnosticsPolling.js +9 -7
  97. package/dist/client/react/useDiagnosticsPolling.js.map +1 -1
  98. package/dist/client/react/useSidebar.d.ts.map +1 -1
  99. package/dist/client/react/useSidebar.js +5 -3
  100. package/dist/client/react/useSidebar.js.map +1 -1
  101. package/dist/render/{failed.d.ts → Failed.d.ts} +1 -1
  102. package/dist/render/Failed.d.ts.map +1 -0
  103. package/dist/render/{failed.js → Failed.js} +1 -1
  104. package/dist/render/Failed.js.map +1 -0
  105. package/dist/render/code.d.ts +2 -2
  106. package/dist/render/code.d.ts.map +1 -1
  107. package/dist/render/code.js +15 -13
  108. package/dist/render/code.js.map +1 -1
  109. package/dist/render/footnoteIds.d.ts +3 -0
  110. package/dist/render/footnoteIds.d.ts.map +1 -0
  111. package/dist/render/{footnotes.js → footnoteIds.js} +11 -9
  112. package/dist/render/footnoteIds.js.map +1 -0
  113. package/dist/responses/url.js +1 -1
  114. package/dist/responses/url.js.map +1 -1
  115. package/dist/rpc/PageUrl.d.ts.map +1 -1
  116. package/dist/rpc/PageUrl.js +0 -1
  117. package/dist/rpc/PageUrl.js.map +1 -1
  118. package/dist/rpc/contract.d.ts +25 -748
  119. package/dist/rpc/contract.d.ts.map +1 -1
  120. package/dist/rpc/contract.js +6 -9
  121. package/dist/rpc/contract.js.map +1 -1
  122. package/dist/rpc/handoffContract.d.ts +33 -33
  123. package/dist/server/{responses/service.d.ts → Responses.d.ts} +9 -21
  124. package/dist/server/Responses.d.ts.map +1 -0
  125. package/dist/server/{responses/service.js → Responses.js} +22 -22
  126. package/dist/server/Responses.js.map +1 -0
  127. package/dist/server/attention/inbox.d.ts +2 -0
  128. package/dist/server/attention/inbox.d.ts.map +1 -1
  129. package/dist/server/attention/inbox.js +1 -0
  130. package/dist/server/attention/inbox.js.map +1 -1
  131. package/dist/server/attention/projection.js +1 -1
  132. package/dist/server/attention/projection.js.map +1 -1
  133. package/dist/server/attention/requestInbox.d.ts +3 -0
  134. package/dist/server/attention/requestInbox.d.ts.map +1 -1
  135. package/dist/server/attention/requestInbox.js +1 -0
  136. package/dist/server/attention/requestInbox.js.map +1 -1
  137. package/dist/server/board.d.ts +1 -1
  138. package/dist/server/boardRuntime.d.ts +2 -2
  139. package/dist/server/boardRuntime.d.ts.map +1 -1
  140. package/dist/server/boardRuntime.js +12 -16
  141. package/dist/server/boardRuntime.js.map +1 -1
  142. package/dist/server/boardServices.d.ts +3 -4
  143. package/dist/server/boardServices.d.ts.map +1 -1
  144. package/dist/server/boardServices.js +5 -4
  145. package/dist/server/boardServices.js.map +1 -1
  146. package/dist/server/boardSocket.d.ts +1 -1
  147. package/dist/server/boardSocket.d.ts.map +1 -1
  148. package/dist/server/document/read.d.ts +4 -10
  149. package/dist/server/document/read.d.ts.map +1 -1
  150. package/dist/server/document/read.js +5 -5
  151. package/dist/server/document/read.js.map +1 -1
  152. package/dist/server/document/requests.d.ts.map +1 -1
  153. package/dist/server/document/requests.js +1 -2
  154. package/dist/server/document/requests.js.map +1 -1
  155. package/dist/server/handoffs/Service.d.ts +1 -2
  156. package/dist/server/handoffs/Service.d.ts.map +1 -1
  157. package/dist/server/handoffs/Service.js +14 -13
  158. package/dist/server/handoffs/Service.js.map +1 -1
  159. package/dist/server/http/assets.d.ts +0 -3
  160. package/dist/server/http/assets.d.ts.map +1 -1
  161. package/dist/server/http/assets.js +1 -7
  162. package/dist/server/http/assets.js.map +1 -1
  163. package/dist/server/http/boardRoutes.d.ts.map +1 -1
  164. package/dist/server/http/boardRoutes.js +3 -3
  165. package/dist/server/http/boardRoutes.js.map +1 -1
  166. package/dist/server/integration/responses.d.ts +207 -4
  167. package/dist/server/integration/responses.d.ts.map +1 -1
  168. package/dist/server/integration/responses.js +4 -2
  169. package/dist/server/integration/responses.js.map +1 -1
  170. package/dist/server/mcp/client.d.ts +1060 -1300
  171. package/dist/server/mcp/client.d.ts.map +1 -1
  172. package/dist/server/mcp/queries.d.ts +24 -744
  173. package/dist/server/mcp/queries.d.ts.map +1 -1
  174. package/dist/server/mcp/queries.js +3 -3
  175. package/dist/server/mcp/queries.js.map +1 -1
  176. package/dist/server/packageInfo.d.ts +1 -1
  177. package/dist/server/packageInfo.js +1 -1
  178. package/dist/server/render/Highlighter.d.ts +1 -1
  179. package/dist/server/render/Highlighter.js +1 -1
  180. package/dist/server/render/markdown.d.ts +1 -1
  181. package/dist/server/render/markdown.js +2 -2
  182. package/dist/server/render/markdown.js.map +1 -1
  183. package/dist/server/responses/readingActions.d.ts +10 -1
  184. package/dist/server/responses/readingActions.d.ts.map +1 -1
  185. package/dist/server/responses/readingActions.js +2 -4
  186. package/dist/server/responses/readingActions.js.map +1 -1
  187. package/dist/server/responses/registerQuestion.d.ts +2 -2
  188. package/dist/server/responses/registerQuestion.d.ts.map +1 -1
  189. package/dist/server/responses/registerQuestion.js +3 -3
  190. package/dist/server/responses/registerQuestion.js.map +1 -1
  191. package/dist/server/responses/retry.d.ts +2 -2
  192. package/dist/server/responses/retry.d.ts.map +1 -1
  193. package/dist/server/responses/retry.js +1 -1
  194. package/dist/server/responses/retry.js.map +1 -1
  195. package/dist/server/rpc/HandlerOptions.d.ts +0 -8
  196. package/dist/server/rpc/HandlerOptions.d.ts.map +1 -1
  197. package/dist/server/rpc/handlers.d.ts +1 -1
  198. package/dist/server/rpc/handlers.d.ts.map +1 -1
  199. package/dist/server/rpc/handlers.js +14 -13
  200. package/dist/server/rpc/handlers.js.map +1 -1
  201. package/dist/server/rpc/hints.d.ts +3 -5
  202. package/dist/server/rpc/hints.d.ts.map +1 -1
  203. package/dist/server/rpc/hints.js +5 -1
  204. package/dist/server/rpc/hints.js.map +1 -1
  205. package/dist/server/serve.d.ts +1 -1
  206. package/dist/server/views/fleetItems.d.ts +2 -2
  207. package/dist/server/views/fleetItems.d.ts.map +1 -1
  208. package/dist/server/views/fleetItems.js +8 -3
  209. package/dist/server/views/fleetItems.js.map +1 -1
  210. package/dist/server/views/projectionQueries.d.ts +5 -9
  211. package/dist/server/views/projectionQueries.d.ts.map +1 -1
  212. package/dist/server/views/projectionQueries.js +6 -6
  213. package/dist/server/views/projectionQueries.js.map +1 -1
  214. package/dist/server/views/remainingQueries.d.ts +4 -252
  215. package/dist/server/views/remainingQueries.d.ts.map +1 -1
  216. package/dist/server/views/remainingQueries.js +11 -19
  217. package/dist/server/views/remainingQueries.js.map +1 -1
  218. package/dist/server/workspace.d.ts +222 -0
  219. package/dist/server/workspace.d.ts.map +1 -0
  220. package/dist/server/workspace.js +25 -0
  221. package/dist/server/workspace.js.map +1 -0
  222. package/package.json +6 -37
  223. package/src/browser/views/remaining.ts +0 -3
  224. package/src/client/document/Mermaid.ts +4 -10
  225. package/src/client/document/View.ts +1 -1
  226. package/src/client/react/BoardShell.tsx +37 -24
  227. package/src/client/react/DocumentAttention.tsx +2 -3
  228. package/src/client/react/DocumentContext.tsx +6 -4
  229. package/src/client/react/LiveControls.tsx +1 -14
  230. package/src/client/react/PhoneNavigation.tsx +20 -15
  231. package/src/client/react/ProjectionFrame.tsx +1 -1
  232. package/src/client/react/ReadingLibrary.tsx +2 -6
  233. package/src/client/react/ReadingReadyContext.ts +11 -0
  234. package/src/client/react/RemainingMain.tsx +0 -10
  235. package/src/client/react/ResultPage.tsx +2 -2
  236. package/src/client/react/SessionContext.ts +4 -0
  237. package/src/client/react/ShellApi.ts +0 -1
  238. package/src/client/react/SystemMain.tsx +3 -1
  239. package/src/client/react/ThemeContext.ts +3 -0
  240. package/src/client/react/TodayOptions.tsx +2 -2
  241. package/src/client/react/entry.tsx +1 -1
  242. package/src/client/react/loadBoardPage.ts +5 -14
  243. package/src/client/react/loadRemaining.ts +0 -2
  244. package/src/client/react/navigationLocation.ts +12 -0
  245. package/src/client/react/pageQueries.ts +0 -3
  246. package/src/client/react/readerLink.ts +1 -1
  247. package/src/client/react/remainingRoute.ts +0 -2
  248. package/src/client/react/scheduleReading.ts +1 -10
  249. package/src/client/react/useAppearance.ts +2 -3
  250. package/src/client/react/useBoardNavigation.ts +13 -18
  251. package/src/client/react/useDiagnosticsPolling.ts +14 -7
  252. package/src/client/react/useSidebar.ts +5 -3
  253. package/src/render/code.ts +3 -4
  254. package/src/render/{footnotes.ts → footnoteIds.ts} +12 -10
  255. package/src/responses/url.ts +1 -1
  256. package/src/rpc/PageUrl.ts +0 -1
  257. package/src/rpc/contract.ts +6 -9
  258. package/src/server/{responses/service.ts → Responses.ts} +21 -29
  259. package/src/server/attention/inbox.ts +1 -0
  260. package/src/server/attention/projection.ts +1 -1
  261. package/src/server/attention/requestInbox.ts +1 -0
  262. package/src/server/board.ts +1 -1
  263. package/src/server/boardRuntime.ts +20 -25
  264. package/src/server/boardServices.ts +7 -7
  265. package/src/server/document/read.ts +6 -14
  266. package/src/server/document/requests.ts +1 -2
  267. package/src/server/handoffs/Service.ts +16 -19
  268. package/src/server/http/assets.ts +1 -7
  269. package/src/server/http/boardRoutes.ts +3 -3
  270. package/src/server/integration/responses.ts +5 -3
  271. package/src/server/mcp/queries.ts +3 -3
  272. package/src/server/packageInfo.ts +1 -1
  273. package/src/server/render/Highlighter.ts +1 -1
  274. package/src/server/render/markdown.ts +2 -2
  275. package/src/server/responses/readingActions.ts +3 -3
  276. package/src/server/responses/registerQuestion.ts +5 -5
  277. package/src/server/responses/retry.ts +3 -3
  278. package/src/server/rpc/HandlerOptions.ts +0 -8
  279. package/src/server/rpc/handlers.ts +17 -15
  280. package/src/server/rpc/hints.ts +6 -3
  281. package/src/server/views/fleetItems.ts +8 -4
  282. package/src/server/views/projectionQueries.ts +6 -7
  283. package/src/server/views/remainingQueries.ts +11 -31
  284. package/src/server/workspace.ts +41 -0
  285. package/assets/native.js +0 -37
  286. package/dist/client/entry.d.ts +0 -3
  287. package/dist/client/entry.d.ts.map +0 -1
  288. package/dist/client/entry.js +0 -3
  289. package/dist/client/entry.js.map +0 -1
  290. package/dist/client/react/RespondPage.d.ts +0 -5
  291. package/dist/client/react/RespondPage.d.ts.map +0 -1
  292. package/dist/client/react/RespondPage.js +0 -5
  293. package/dist/client/react/RespondPage.js.map +0 -1
  294. package/dist/render/failed.d.ts.map +0 -1
  295. package/dist/render/failed.js.map +0 -1
  296. package/dist/render/footnotes.d.ts +0 -3
  297. package/dist/render/footnotes.d.ts.map +0 -1
  298. package/dist/render/footnotes.js.map +0 -1
  299. package/dist/server/responses/service.d.ts.map +0 -1
  300. package/dist/server/responses/service.js.map +0 -1
  301. package/src/client/entry.ts +0 -3
  302. package/src/client/react/RespondPage.tsx +0 -8
  303. /package/src/render/{failed.ts → Failed.ts} +0 -0
@@ -1,19 +1,19 @@
1
1
  import { Effect, Layer, Ref, Stream } from "effect";
2
- import { InternalServerError, NotFound, ServiceUnavailable } from "@shivaedev/platform/errors/taxonomy.ts";
2
+ import { InternalServerError, ServiceUnavailable } from "@shivaedev/platform/errors/taxonomy.ts";
3
3
  import { rpcBoundary } from "@shivaedev/platform/rpc-server/boundary.ts";
4
4
  import { requestTracingLayer } from "@shivaedev/platform/rpc-server/tracing.ts";
5
- import { Diagnostics } from "#diagnostics/source.ts";
6
5
  import { workRpcs } from "#rpc/contract.ts";
7
6
  import { DocumentRejection, ResponseRejection } from "#rpc/rejections.ts";
8
7
  import { HandoffsService } from "#server/handoffs/Service.ts";
9
8
  import { libraryData } from "#server/navigation/libraryData.ts";
10
9
  import { navigationData } from "#server/navigation/model.ts";
11
- import { Responses } from "#server/responses/service.ts";
10
+ import { Responses } from "#server/Responses.ts";
12
11
  import { searchMatch } from "#server/search/match.ts";
13
12
  import { fleetItems } from "#server/views/fleetItems.ts";
14
13
  import { goals } from "#server/views/goals.ts";
15
14
  import { projectionQueries } from "#server/views/projectionQueries.ts";
16
15
  import { remainingQueries } from "#server/views/remainingQueries.ts";
16
+ import { Workspace } from "#server/workspace.ts";
17
17
  import type { HandlerOptions } from "./HandlerOptions.ts";
18
18
  import { hints } from "./hints.ts";
19
19
 
@@ -21,25 +21,29 @@ const readBoundary = rpcBoundary(InternalServerError, { unexpected: (message) =>
21
21
  const documentBoundary = rpcBoundary(DocumentRejection, { unexpected: (message) => new InternalServerError({ message }) });
22
22
  const responseBoundary = rpcBoundary(ResponseRejection, { unexpected: (message) => new InternalServerError({ message }) });
23
23
 
24
- export const handlers = Effect.fn("WorkBoard.handlers")(function* (options: HandlerOptions) {
25
- const { changes, document, home, index } = options;
26
- const projections = projectionQueries({ document, index });
24
+ export const handlers = Effect.fn("WorkBoard.handlers")(function* (options: HandlerOptions = {}) {
25
+ const workspace = yield* Workspace;
26
+ const { changes, home } = yield* workspace.settings();
27
+ const index = workspace.index();
28
+ const document = workspace.document;
29
+ const projections = yield* projectionQueries;
27
30
  const handoffs = yield* HandoffsService;
28
31
  const responses = yield* Responses;
29
- const diagnostics = yield* Diagnostics;
30
- const remaining = remainingQueries(options, { diagnostics, handoffs, responses });
32
+ const remaining = yield* remainingQueries;
31
33
  return workRpcs
32
34
  .toLayer({
33
35
  "work-board.awaitResponse": (input) => Effect.suspend(() => responses.awaitResponse(input)).pipe(responseBoundary),
34
36
  "work-board.board": ({ url }) => Effect.suspend(() => projections.board(url)).pipe(documentBoundary),
35
37
  "work-board.diagnostics": () => remaining.diagnostics().pipe(readBoundary),
36
- "work-board.document": ({ url }) =>
37
- Effect.suspend(() => (document ? document(url) : Effect.fail(new NotFound({ message: "The document is missing." })))).pipe(documentBoundary),
38
- "work-board.fleetItems": () => fleetItems(options),
38
+ "work-board.document": ({ url }) => Effect.suspend(() => document(url)).pipe(documentBoundary),
39
+ "work-board.fleetItems": () => fleetItems(options.fleetPort).pipe(readBoundary),
39
40
  "work-board.goals": () =>
40
41
  Effect.gen(function* () {
41
42
  const snapshot = yield* index;
42
- return goals(snapshot, yield* fleetItems({ ...options, index: Effect.succeed(snapshot) }));
43
+ return goals(
44
+ snapshot,
45
+ yield* fleetItems(options.fleetPort).pipe(Effect.provideService(Workspace, { ...workspace, index: () => Effect.succeed(snapshot) })),
46
+ );
43
47
  }).pipe(readBoundary),
44
48
  "work-board.handoff": ({ url }) => remaining.handoff(url).pipe(documentBoundary),
45
49
  "work-board.handoffSource": ({ item }) => Effect.suspend(() => handoffs.locate(item)).pipe(responseBoundary),
@@ -57,7 +61,6 @@ export const handlers = Effect.fn("WorkBoard.handlers")(function* (options: Hand
57
61
  "work-board.question": ({ item, request }) => Effect.suspend(() => responses.locate(item, request)).pipe(responseBoundary),
58
62
  "work-board.recordResponse": (input) => Effect.suspend(() => responses.record(input)).pipe(responseBoundary),
59
63
  "work-board.registerQuestion": (input) => Effect.suspend(() => responses.register(input)).pipe(responseBoundary),
60
- "work-board.respond": ({ url }) => remaining.respond(url).pipe(documentBoundary),
61
64
  "work-board.responses": ({ question }) => Effect.suspend(() => responses.read(question)).pipe(responseBoundary),
62
65
  "work-board.result": ({ url }) => remaining.result(url).pipe(documentBoundary),
63
66
  "work-board.search": ({ query }) =>
@@ -66,8 +69,7 @@ export const handlers = Effect.fn("WorkBoard.handlers")(function* (options: Hand
66
69
  ),
67
70
  "work-board.server": () => options.server ?? Effect.fail(new ServiceUnavailable({ message: "The board server address is unavailable." })),
68
71
  "work-board.start": () => remaining.start().pipe(readBoundary),
69
- "work-board.subscribe": () =>
70
- hints(changes, index).pipe(Stream.catchCause((cause) => Stream.fromEffect(Effect.failCause(cause).pipe(readBoundary)))),
72
+ "work-board.subscribe": () => hints().pipe(Stream.catchCause((cause) => Stream.fromEffect(Effect.failCause(cause).pipe(readBoundary)))),
71
73
  "work-board.watcher": () => Effect.map(Ref.get(changes.watching), (watching) => ({ watching })).pipe(readBoundary),
72
74
  "work-board.work": ({ url }) => Effect.suspend(() => projections.work(url)).pipe(documentBoundary),
73
75
  })
@@ -1,12 +1,15 @@
1
1
  import { Effect, PubSub, Stream } from "effect";
2
2
  import type { LiveHint } from "@shivaedev/effect-contract/live.ts";
3
- import type { Change, Changes } from "#server/files/changes.ts";
4
- import type { Snapshot } from "#server/search/snapshot.ts";
3
+ import type { Change } from "#server/files/changes.ts";
4
+ import { Workspace } from "#server/workspace.ts";
5
5
  import { affected } from "./affected.ts";
6
6
 
7
- export function hints(changes: Changes, index: Effect.Effect<Snapshot, unknown>) {
7
+ export function hints() {
8
8
  return Stream.unwrap(
9
9
  Effect.gen(function* () {
10
+ const workspace = yield* Workspace;
11
+ const { changes } = yield* workspace.settings();
12
+ const index = workspace.index();
10
13
  const subscription = yield* PubSub.subscribe(changes.events);
11
14
  let sequence = changes.sequence ? yield* changes.sequence : undefined;
12
15
  let previous = yield* Effect.option(index);
@@ -2,10 +2,10 @@ import { Effect } from "effect";
2
2
  import type { FleetItemsProjection } from "#browser/views/FleetItemsProjection.ts";
3
3
  import { DAEMON_PORT } from "#diagnostics/daemonContract.ts";
4
4
  import { daemonUnavailableReason, readDaemon } from "#server/diagnostics/daemon.ts";
5
- import type { HandlerOptions } from "#server/rpc/HandlerOptions.ts";
6
5
  import { itemsOf } from "#server/views/items.ts";
6
+ import { Workspace } from "#server/workspace.ts";
7
7
 
8
- export function fleetItems({ index, fleetPort = DAEMON_PORT }: Pick<HandlerOptions, "index" | "fleetPort">): Effect.Effect<FleetItemsProjection> {
8
+ export function fleetItems(fleetPort: number | null = DAEMON_PORT): Effect.Effect<FleetItemsProjection, never, Workspace> {
9
9
  if (fleetPort === null) {
10
10
  return Effect.succeed({ reason: "Fleet daemon is not configured for this Board", state: "unavailable" });
11
11
  }
@@ -15,7 +15,11 @@ export function fleetItems({ index, fleetPort = DAEMON_PORT }: Pick<HandlerOptio
15
15
  return { reason: daemonUnavailableReason(result.failure, fleetPort), state: "unavailable" as const };
16
16
  }
17
17
  const data = result.success;
18
- const snapshot = yield* index;
18
+ const workspace = yield* Workspace;
19
+ const snapshot = yield* workspace.index().pipe(Effect.catch(() => Effect.succeed(undefined)));
20
+ if (!snapshot) {
21
+ return { reason: "Board documents could not be read for Fleet items", state: "unavailable" as const };
22
+ }
19
23
  const documents = new Map(
20
24
  itemsOf(snapshot).map(({ id, document, title }) => [id, { file: document.file, metadata: document.parsed.fields, title }]),
21
25
  );
@@ -24,5 +28,5 @@ export function fleetItems({ index, fleetPort = DAEMON_PORT }: Pick<HandlerOptio
24
28
  items: data.items.map((item) => ({ ...item, document: documents.get(item.workId) ?? null })),
25
29
  state: "ready" as const,
26
30
  };
27
- }).pipe(Effect.catchCause(() => Effect.succeed({ reason: "Board documents could not be read for Fleet items", state: "unavailable" as const })));
31
+ });
28
32
  }
@@ -1,21 +1,20 @@
1
1
  import { Effect } from "effect";
2
- import { NotFound } from "@shivaedev/platform/errors/taxonomy.ts";
3
2
  import type { BoardProjection, WorkProjection } from "#browser/views/schema.ts";
4
3
  import { stateOf } from "#browser/views/state.ts";
5
4
  import { inboxItems } from "#server/attention/inbox.ts";
6
5
  import { attentionProjection } from "#server/attention/projection.ts";
7
6
  import { identityUrl } from "#server/metadata/links.ts";
8
7
  import { boardOf, countsOf } from "#server/render/board.ts";
9
- import type { HandlerOptions } from "#server/rpc/HandlerOptions.ts";
10
8
  import type { Snapshot } from "#server/search/snapshot.ts";
9
+ import { Workspace } from "#server/workspace.ts";
11
10
  import { fleetApproval } from "./fleetApproval.ts";
12
11
  import type { Item } from "./items.ts";
13
12
  import { projectItems } from "./projection.ts";
14
13
 
15
- export function projectionQueries({ index, document }: { readonly index: HandlerOptions["index"]; readonly document: HandlerOptions["document"] }) {
16
- function read(url: string) {
17
- return document ? document(url) : Effect.fail(new NotFound({ message: "The document is missing." }));
18
- }
14
+ export const projectionQueries = Effect.gen(function* () {
15
+ const workspace = yield* Workspace;
16
+ const index = workspace.index();
17
+ const read = workspace.document;
19
18
  return {
20
19
  board: (url: string) => Effect.map(read(url), (data): BoardProjection => ({ counts: countsOf(boardOf(data.source)), document: data })),
21
20
  inbox: () => Effect.map(index, attentionProjection),
@@ -54,7 +53,7 @@ export function projectionQueries({ index, document }: { readonly index: Handler
54
53
  } satisfies WorkProjection;
55
54
  }),
56
55
  };
57
- }
56
+ });
58
57
  function selectionProblem(snapshot: Snapshot, item: string) {
59
58
  return (snapshot.model.ids.get(item)?.length ?? 0) > 1 ? "has a duplicate ID" : "is missing or its identity changed";
60
59
  }
@@ -1,24 +1,18 @@
1
1
  import { Clock, Effect } from "effect";
2
- import { Conflict, NotFound } from "@shivaedev/platform/errors/taxonomy.ts";
3
- import type { Diagnostics } from "#diagnostics/source.ts";
4
- import type { HandoffsService } from "#server/handoffs/Service.ts";
2
+ import { Conflict } from "@shivaedev/platform/errors/taxonomy.ts";
3
+ import { Diagnostics } from "#diagnostics/source.ts";
4
+ import { HandoffsService } from "#server/handoffs/Service.ts";
5
5
  import { identityUrl } from "#server/metadata/links.ts";
6
6
  import { metadataParse } from "#server/metadata/parse.ts";
7
7
  import { startTemplates } from "#server/page/startTemplates.ts";
8
- import type { Responses } from "#server/responses/service.ts";
9
- import type { HandlerOptions } from "#server/rpc/HandlerOptions.ts";
8
+ import { Workspace } from "#server/workspace.ts";
10
9
  import { resultProjection } from "./resultProjection.ts";
11
- export function remainingQueries(
12
- { changes, document, index, writable }: HandlerOptions,
13
- services: {
14
- readonly diagnostics: typeof Diagnostics.Service;
15
- readonly responses: typeof Responses.Service;
16
- readonly handoffs: typeof HandoffsService.Service;
17
- },
18
- ) {
19
- function read(url: string) {
20
- return document ? document(url) : Effect.fail(new NotFound({ message: "The document is missing." }));
21
- }
10
+ export const remainingQueries = Effect.gen(function* () {
11
+ const workspace = yield* Workspace;
12
+ const { changes, writable } = yield* workspace.settings();
13
+ const index = workspace.index();
14
+ const read = workspace.document;
15
+ const services = { diagnostics: yield* Diagnostics, handoffs: yield* HandoffsService };
22
16
  return {
23
17
  diagnostics: () =>
24
18
  Effect.gen(function* () {
@@ -42,20 +36,6 @@ export function remainingQueries(
42
36
  writable: writable === true,
43
37
  };
44
38
  }),
45
- respond: (url: string) =>
46
- Effect.gen(function* () {
47
- const params = new URL(url, "http://127.0.0.1").searchParams;
48
- const service = services.responses;
49
- const preview = yield* service.locate(params.get("item") ?? "", params.get("request") ?? "");
50
- yield* service.read(preview.id).pipe(Effect.catch((error) => (error._tag === "NotFound" ? Effect.void : Effect.fail(error))));
51
- const responses = yield* service.history(preview);
52
- const data = yield* read(identityUrl(preview.item));
53
- const request = data.requests.find((entry) => entry.id === preview.request);
54
- if (!request) {
55
- return yield* Effect.fail(new Conflict({ message: "The response request is unavailable." }));
56
- }
57
- return { document: data, request: { ...request, preview, responses } };
58
- }),
59
39
  result: (url: string) =>
60
40
  Effect.gen(function* () {
61
41
  const item = new URL(url, "http://127.0.0.1").searchParams.get("item") ?? "";
@@ -71,4 +51,4 @@ export function remainingQueries(
71
51
  }),
72
52
  start: () => Effect.map(changes.files, (files) => ({ empty: files.length === 0, templates: startTemplates })),
73
53
  };
74
- }
54
+ });
@@ -0,0 +1,41 @@
1
+ import { Context, Effect, FileSystem, Path, type PlatformError } from "effect";
2
+ import { defineService } from "@shivaedev/effect-service/define-service.ts";
3
+ import type { Document } from "#browser/document/schema.ts";
4
+ import { readDocument } from "#server/document/read.ts";
5
+ import type { Changes } from "#server/files/changes.ts";
6
+ import type { Snapshot } from "#server/search/snapshot.ts";
7
+
8
+ export interface WorkspaceOptions {
9
+ readonly changes: Changes;
10
+ readonly home?: string | undefined;
11
+ readonly index: Effect.Effect<Snapshot, PlatformError.PlatformError>;
12
+ readonly root: string;
13
+ readonly writable: boolean;
14
+ }
15
+
16
+ export interface WorkspaceSettings extends Omit<WorkspaceOptions, "index"> {
17
+ readonly realRoot: string;
18
+ }
19
+
20
+ export class WorkspaceConfig extends Context.Service<WorkspaceConfig, WorkspaceOptions>()("WorkBoard/WorkspaceConfig") {}
21
+
22
+ export const Workspace = defineService({
23
+ id: "WorkBoard/Workspace",
24
+ initialize: Effect.gen(function* () {
25
+ return yield* WorkspaceConfig;
26
+ }),
27
+ methods: ({ index, ...options }) => {
28
+ const settings = { ...options, realRoot: options.changes.realRoot };
29
+ const read = readDocument(settings);
30
+ function document(url: string): Effect.Effect<Document, Effect.Error<ReturnType<typeof read>>, Effect.Services<ReturnType<typeof read>>> {
31
+ return Effect.flatMap(index, (snapshot) => read(url, snapshot));
32
+ }
33
+ return {
34
+ document,
35
+ index: () => index,
36
+ settings: () => Effect.succeed(settings),
37
+ };
38
+ },
39
+ requires: [WorkspaceConfig, FileSystem.FileSystem, Path.Path],
40
+ });
41
+ export type Workspace = typeof Workspace.Identifier;