@plurnk/plurnk-service 1.0.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 (343) hide show
  1. package/.env.defaults +208 -0
  2. package/INSTALL.md +69 -0
  3. package/LICENSE +21 -0
  4. package/README.md +46 -0
  5. package/SPEC.md +1511 -0
  6. package/dist/Paths.d.ts +13 -0
  7. package/dist/Paths.d.ts.map +1 -0
  8. package/dist/Paths.js +60 -0
  9. package/dist/Paths.js.map +1 -0
  10. package/dist/content/edited-span.d.ts +2 -0
  11. package/dist/content/edited-span.d.ts.map +1 -0
  12. package/dist/content/edited-span.js +33 -0
  13. package/dist/content/edited-span.js.map +1 -0
  14. package/dist/content/index.d.ts +10 -0
  15. package/dist/content/index.d.ts.map +1 -0
  16. package/dist/content/index.js +11 -0
  17. package/dist/content/index.js.map +1 -0
  18. package/dist/content/line-marker.d.ts +15 -0
  19. package/dist/content/line-marker.d.ts.map +1 -0
  20. package/dist/content/line-marker.js +21 -0
  21. package/dist/content/line-marker.js.map +1 -0
  22. package/dist/content/matcher.d.ts +44 -0
  23. package/dist/content/matcher.d.ts.map +1 -0
  24. package/dist/content/matcher.js +126 -0
  25. package/dist/content/matcher.js.map +1 -0
  26. package/dist/content/mimetype-binary.d.ts +8 -0
  27. package/dist/content/mimetype-binary.d.ts.map +1 -0
  28. package/dist/content/mimetype-binary.js +17 -0
  29. package/dist/content/mimetype-binary.js.map +1 -0
  30. package/dist/content/path-mimetype.d.ts +5 -0
  31. package/dist/content/path-mimetype.d.ts.map +1 -0
  32. package/dist/content/path-mimetype.js +15 -0
  33. package/dist/content/path-mimetype.js.map +1 -0
  34. package/dist/content/read-resolve.d.ts +20 -0
  35. package/dist/content/read-resolve.d.ts.map +1 -0
  36. package/dist/content/read-resolve.js +68 -0
  37. package/dist/content/read-resolve.js.map +1 -0
  38. package/dist/core/ChannelWrite.d.ts +100 -0
  39. package/dist/core/ChannelWrite.d.ts.map +1 -0
  40. package/dist/core/ChannelWrite.js +112 -0
  41. package/dist/core/ChannelWrite.js.map +1 -0
  42. package/dist/core/ChannelWrite.sql +84 -0
  43. package/dist/core/Db.d.ts +14 -0
  44. package/dist/core/Db.d.ts.map +1 -0
  45. package/dist/core/Db.js +7 -0
  46. package/dist/core/Db.js.map +1 -0
  47. package/dist/core/Dispatcher.d.ts +67 -0
  48. package/dist/core/Dispatcher.d.ts.map +1 -0
  49. package/dist/core/Dispatcher.js +1021 -0
  50. package/dist/core/Dispatcher.js.map +1 -0
  51. package/dist/core/Engine.d.ts +113 -0
  52. package/dist/core/Engine.d.ts.map +1 -0
  53. package/dist/core/Engine.js +1410 -0
  54. package/dist/core/Engine.js.map +1 -0
  55. package/dist/core/Engine.sql +538 -0
  56. package/dist/core/EnvFlags.d.ts +13 -0
  57. package/dist/core/EnvFlags.d.ts.map +1 -0
  58. package/dist/core/EnvFlags.js +84 -0
  59. package/dist/core/EnvFlags.js.map +1 -0
  60. package/dist/core/ExecutorRegistry.d.ts +45 -0
  61. package/dist/core/ExecutorRegistry.d.ts.map +1 -0
  62. package/dist/core/ExecutorRegistry.js +128 -0
  63. package/dist/core/ExecutorRegistry.js.map +1 -0
  64. package/dist/core/PacketBuilder.d.ts +67 -0
  65. package/dist/core/PacketBuilder.d.ts.map +1 -0
  66. package/dist/core/PacketBuilder.js +524 -0
  67. package/dist/core/PacketBuilder.js.map +1 -0
  68. package/dist/core/PluginLoader.d.ts +17 -0
  69. package/dist/core/PluginLoader.d.ts.map +1 -0
  70. package/dist/core/PluginLoader.js +97 -0
  71. package/dist/core/PluginLoader.js.map +1 -0
  72. package/dist/core/ProposalLifecycle.d.ts +59 -0
  73. package/dist/core/ProposalLifecycle.d.ts.map +1 -0
  74. package/dist/core/ProposalLifecycle.js +215 -0
  75. package/dist/core/ProposalLifecycle.js.map +1 -0
  76. package/dist/core/ProviderInstantiate.d.ts +9 -0
  77. package/dist/core/ProviderInstantiate.d.ts.map +1 -0
  78. package/dist/core/ProviderInstantiate.js +156 -0
  79. package/dist/core/ProviderInstantiate.js.map +1 -0
  80. package/dist/core/SchemeRegistry.d.ts +26 -0
  81. package/dist/core/SchemeRegistry.d.ts.map +1 -0
  82. package/dist/core/SchemeRegistry.js +205 -0
  83. package/dist/core/SchemeRegistry.js.map +1 -0
  84. package/dist/core/StrikeRail.d.ts +28 -0
  85. package/dist/core/StrikeRail.d.ts.map +1 -0
  86. package/dist/core/StrikeRail.js +165 -0
  87. package/dist/core/StrikeRail.js.map +1 -0
  88. package/dist/core/TelemetryChannel.d.ts +37 -0
  89. package/dist/core/TelemetryChannel.d.ts.map +1 -0
  90. package/dist/core/TelemetryChannel.js +77 -0
  91. package/dist/core/TelemetryChannel.js.map +1 -0
  92. package/dist/core/TokenGauge.d.ts +16 -0
  93. package/dist/core/TokenGauge.d.ts.map +1 -0
  94. package/dist/core/TokenGauge.js +58 -0
  95. package/dist/core/TokenGauge.js.map +1 -0
  96. package/dist/core/caps/CapsResolve.d.ts +5 -0
  97. package/dist/core/caps/CapsResolve.d.ts.map +1 -0
  98. package/dist/core/caps/CapsResolve.js +13 -0
  99. package/dist/core/caps/CapsResolve.js.map +1 -0
  100. package/dist/core/caps/DbChannelCaps.d.ts +16 -0
  101. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -0
  102. package/dist/core/caps/DbChannelCaps.js +41 -0
  103. package/dist/core/caps/DbChannelCaps.js.map +1 -0
  104. package/dist/core/caps/DbEntryCaps.d.ts +19 -0
  105. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -0
  106. package/dist/core/caps/DbEntryCaps.js +28 -0
  107. package/dist/core/caps/DbEntryCaps.js.map +1 -0
  108. package/dist/core/caps/DbNotifyCaps.d.ts +8 -0
  109. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -0
  110. package/dist/core/caps/DbNotifyCaps.js +35 -0
  111. package/dist/core/caps/DbNotifyCaps.js.map +1 -0
  112. package/dist/core/caps/DbSubscriptionCaps.d.ts +10 -0
  113. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -0
  114. package/dist/core/caps/DbSubscriptionCaps.js +86 -0
  115. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -0
  116. package/dist/core/caps/DbTagCaps.d.ts +17 -0
  117. package/dist/core/caps/DbTagCaps.d.ts.map +1 -0
  118. package/dist/core/caps/DbTagCaps.js +37 -0
  119. package/dist/core/caps/DbTagCaps.js.map +1 -0
  120. package/dist/core/caps/SchemeCtxImpl.d.ts +18 -0
  121. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -0
  122. package/dist/core/caps/SchemeCtxImpl.js +42 -0
  123. package/dist/core/caps/SchemeCtxImpl.js.map +1 -0
  124. package/dist/core/env-defaults.d.ts +19 -0
  125. package/dist/core/env-defaults.d.ts.map +1 -0
  126. package/dist/core/env-defaults.js +89 -0
  127. package/dist/core/env-defaults.js.map +1 -0
  128. package/dist/core/fork.d.ts +6 -0
  129. package/dist/core/fork.d.ts.map +1 -0
  130. package/dist/core/fork.js +84 -0
  131. package/dist/core/fork.js.map +1 -0
  132. package/dist/core/fork.sql +85 -0
  133. package/dist/core/git-membership.d.ts +23 -0
  134. package/dist/core/git-membership.d.ts.map +1 -0
  135. package/dist/core/git-membership.js +366 -0
  136. package/dist/core/git-membership.js.map +1 -0
  137. package/dist/core/git-state.d.ts +15 -0
  138. package/dist/core/git-state.d.ts.map +1 -0
  139. package/dist/core/git-state.js +67 -0
  140. package/dist/core/git-state.js.map +1 -0
  141. package/dist/core/packet-inject.d.ts +5 -0
  142. package/dist/core/packet-inject.d.ts.map +1 -0
  143. package/dist/core/packet-inject.js +48 -0
  144. package/dist/core/packet-inject.js.map +1 -0
  145. package/dist/core/packet-wire.d.ts +46 -0
  146. package/dist/core/packet-wire.d.ts.map +1 -0
  147. package/dist/core/packet-wire.js +453 -0
  148. package/dist/core/packet-wire.js.map +1 -0
  149. package/dist/core/path-decode.d.ts +2 -0
  150. package/dist/core/path-decode.d.ts.map +1 -0
  151. package/dist/core/path-decode.js +8 -0
  152. package/dist/core/path-decode.js.map +1 -0
  153. package/dist/core/plugin-attribution.d.ts +5 -0
  154. package/dist/core/plugin-attribution.d.ts.map +1 -0
  155. package/dist/core/plugin-attribution.js +39 -0
  156. package/dist/core/plugin-attribution.js.map +1 -0
  157. package/dist/core/plurnk-uri.d.ts +7 -0
  158. package/dist/core/plurnk-uri.d.ts.map +1 -0
  159. package/dist/core/plurnk-uri.js +52 -0
  160. package/dist/core/plurnk-uri.js.map +1 -0
  161. package/dist/core/resolveForLoop.d.ts +5 -0
  162. package/dist/core/resolveForLoop.d.ts.map +1 -0
  163. package/dist/core/resolveForLoop.js +12 -0
  164. package/dist/core/resolveForLoop.js.map +1 -0
  165. package/dist/core/results.d.ts +12 -0
  166. package/dist/core/results.d.ts.map +1 -0
  167. package/dist/core/results.js +27 -0
  168. package/dist/core/results.js.map +1 -0
  169. package/dist/core/run-cap.d.ts +8 -0
  170. package/dist/core/run-cap.d.ts.map +1 -0
  171. package/dist/core/run-cap.js +20 -0
  172. package/dist/core/run-cap.js.map +1 -0
  173. package/dist/core/run-ops.sql +43 -0
  174. package/dist/core/scheme-types.d.ts +45 -0
  175. package/dist/core/scheme-types.d.ts.map +1 -0
  176. package/dist/core/scheme-types.js +6 -0
  177. package/dist/core/scheme-types.js.map +1 -0
  178. package/dist/core/session-settings.d.ts +23 -0
  179. package/dist/core/session-settings.d.ts.map +1 -0
  180. package/dist/core/session-settings.js +55 -0
  181. package/dist/core/session-settings.js.map +1 -0
  182. package/dist/core/teaching.d.ts +3 -0
  183. package/dist/core/teaching.d.ts.map +1 -0
  184. package/dist/core/teaching.js +13 -0
  185. package/dist/core/teaching.js.map +1 -0
  186. package/dist/core/types.d.ts +3 -0
  187. package/dist/core/types.d.ts.map +1 -0
  188. package/dist/core/types.js +2 -0
  189. package/dist/core/types.js.map +1 -0
  190. package/dist/digest/Digest.d.ts +20 -0
  191. package/dist/digest/Digest.d.ts.map +1 -0
  192. package/dist/digest/Digest.js +451 -0
  193. package/dist/digest/Digest.js.map +1 -0
  194. package/dist/digest/Digest.sql +1 -0
  195. package/dist/digest/digest.sql +55 -0
  196. package/dist/index.d.ts +18 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +28 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/schemes/EffectPolicy.d.ts +6 -0
  201. package/dist/schemes/EffectPolicy.d.ts.map +1 -0
  202. package/dist/schemes/EffectPolicy.js +18 -0
  203. package/dist/schemes/EffectPolicy.js.map +1 -0
  204. package/dist/schemes/Exec.d.ts +39 -0
  205. package/dist/schemes/Exec.d.ts.map +1 -0
  206. package/dist/schemes/Exec.js +510 -0
  207. package/dist/schemes/Exec.js.map +1 -0
  208. package/dist/schemes/ExecOutputScheme.d.ts +20 -0
  209. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -0
  210. package/dist/schemes/ExecOutputScheme.js +39 -0
  211. package/dist/schemes/ExecOutputScheme.js.map +1 -0
  212. package/dist/schemes/File.d.ts +42 -0
  213. package/dist/schemes/File.d.ts.map +1 -0
  214. package/dist/schemes/File.js +356 -0
  215. package/dist/schemes/File.js.map +1 -0
  216. package/dist/schemes/Known.d.ts +17 -0
  217. package/dist/schemes/Known.d.ts.map +1 -0
  218. package/dist/schemes/Known.js +40 -0
  219. package/dist/schemes/Known.js.map +1 -0
  220. package/dist/schemes/Log.d.ts +22 -0
  221. package/dist/schemes/Log.d.ts.map +1 -0
  222. package/dist/schemes/Log.js +269 -0
  223. package/dist/schemes/Log.js.map +1 -0
  224. package/dist/schemes/Log.sql +59 -0
  225. package/dist/schemes/Plurnk.d.ts +17 -0
  226. package/dist/schemes/Plurnk.d.ts.map +1 -0
  227. package/dist/schemes/Plurnk.js +46 -0
  228. package/dist/schemes/Plurnk.js.map +1 -0
  229. package/dist/schemes/Run.d.ts +25 -0
  230. package/dist/schemes/Run.d.ts.map +1 -0
  231. package/dist/schemes/Run.js +172 -0
  232. package/dist/schemes/Run.js.map +1 -0
  233. package/dist/schemes/Skill.d.ts +17 -0
  234. package/dist/schemes/Skill.d.ts.map +1 -0
  235. package/dist/schemes/Skill.js +40 -0
  236. package/dist/schemes/Skill.js.map +1 -0
  237. package/dist/schemes/Unknown.d.ts +17 -0
  238. package/dist/schemes/Unknown.d.ts.map +1 -0
  239. package/dist/schemes/Unknown.js +39 -0
  240. package/dist/schemes/Unknown.js.map +1 -0
  241. package/dist/schemes/_entry-chunk.d.ts +11 -0
  242. package/dist/schemes/_entry-chunk.d.ts.map +1 -0
  243. package/dist/schemes/_entry-chunk.js +100 -0
  244. package/dist/schemes/_entry-chunk.js.map +1 -0
  245. package/dist/schemes/_entry-crud.d.ts +31 -0
  246. package/dist/schemes/_entry-crud.d.ts.map +1 -0
  247. package/dist/schemes/_entry-crud.js +77 -0
  248. package/dist/schemes/_entry-crud.js.map +1 -0
  249. package/dist/schemes/_entry-crud.sql +101 -0
  250. package/dist/schemes/_entry-find.d.ts +32 -0
  251. package/dist/schemes/_entry-find.d.ts.map +1 -0
  252. package/dist/schemes/_entry-find.js +226 -0
  253. package/dist/schemes/_entry-find.js.map +1 -0
  254. package/dist/schemes/_entry-find.sql +54 -0
  255. package/dist/schemes/_entry-graph.d.ts +16 -0
  256. package/dist/schemes/_entry-graph.d.ts.map +1 -0
  257. package/dist/schemes/_entry-graph.js +94 -0
  258. package/dist/schemes/_entry-graph.js.map +1 -0
  259. package/dist/schemes/_entry-graph.sql +52 -0
  260. package/dist/schemes/_entry-manifest.d.ts +25 -0
  261. package/dist/schemes/_entry-manifest.d.ts.map +1 -0
  262. package/dist/schemes/_entry-manifest.js +266 -0
  263. package/dist/schemes/_entry-manifest.js.map +1 -0
  264. package/dist/schemes/_entry-ops.d.ts +32 -0
  265. package/dist/schemes/_entry-ops.d.ts.map +1 -0
  266. package/dist/schemes/_entry-ops.js +216 -0
  267. package/dist/schemes/_entry-ops.js.map +1 -0
  268. package/dist/schemes/_entry-ops.sql +31 -0
  269. package/dist/schemes/_entry-semantic.d.ts +38 -0
  270. package/dist/schemes/_entry-semantic.d.ts.map +1 -0
  271. package/dist/schemes/_entry-semantic.js +202 -0
  272. package/dist/schemes/_entry-semantic.js.map +1 -0
  273. package/dist/schemes/_entry-semantic.sql +95 -0
  274. package/dist/schemes/_entry-send.d.ts +11 -0
  275. package/dist/schemes/_entry-send.d.ts.map +1 -0
  276. package/dist/schemes/_entry-send.js +66 -0
  277. package/dist/schemes/_entry-send.js.map +1 -0
  278. package/dist/schemes/cosine.d.ts +4 -0
  279. package/dist/schemes/cosine.d.ts.map +1 -0
  280. package/dist/schemes/cosine.js +9 -0
  281. package/dist/schemes/cosine.js.map +1 -0
  282. package/dist/schemes/exec-abort.d.ts +15 -0
  283. package/dist/schemes/exec-abort.d.ts.map +1 -0
  284. package/dist/schemes/exec-abort.js +29 -0
  285. package/dist/schemes/exec-abort.js.map +1 -0
  286. package/dist/schemes/exec-env.d.ts +5 -0
  287. package/dist/schemes/exec-env.d.ts.map +1 -0
  288. package/dist/schemes/exec-env.js +34 -0
  289. package/dist/schemes/exec-env.js.map +1 -0
  290. package/dist/server/Daemon.d.ts +244 -0
  291. package/dist/server/Daemon.d.ts.map +1 -0
  292. package/dist/server/Daemon.js +1119 -0
  293. package/dist/server/Daemon.js.map +1 -0
  294. package/dist/server/client-input.d.ts +11 -0
  295. package/dist/server/client-input.d.ts.map +1 -0
  296. package/dist/server/client-input.js +145 -0
  297. package/dist/server/client-input.js.map +1 -0
  298. package/dist/server/clientTurn.d.ts +6 -0
  299. package/dist/server/clientTurn.d.ts.map +1 -0
  300. package/dist/server/clientTurn.js +23 -0
  301. package/dist/server/clientTurn.js.map +1 -0
  302. package/dist/server/clientTurn.sql +10 -0
  303. package/dist/server/dispatch-as-plurnk.d.ts +7 -0
  304. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -0
  305. package/dist/server/dispatch-as-plurnk.js +23 -0
  306. package/dist/server/dispatch-as-plurnk.js.map +1 -0
  307. package/dist/server/drain.sql +124 -0
  308. package/dist/server/envelope.d.ts +53 -0
  309. package/dist/server/envelope.d.ts.map +1 -0
  310. package/dist/server/envelope.js +172 -0
  311. package/dist/server/envelope.js.map +1 -0
  312. package/dist/server/envelope.sql +76 -0
  313. package/dist/server/logEntry.d.ts +35 -0
  314. package/dist/server/logEntry.d.ts.map +1 -0
  315. package/dist/server/logEntry.js +49 -0
  316. package/dist/server/logEntry.js.map +1 -0
  317. package/dist/server/logEntry.sql +10 -0
  318. package/dist/server/loopDocs.d.ts +6 -0
  319. package/dist/server/loopDocs.d.ts.map +1 -0
  320. package/dist/server/loopDocs.js +22 -0
  321. package/dist/server/loopDocs.js.map +1 -0
  322. package/dist/server/noProposals.d.ts +6 -0
  323. package/dist/server/noProposals.d.ts.map +1 -0
  324. package/dist/server/noProposals.js +37 -0
  325. package/dist/server/noProposals.js.map +1 -0
  326. package/dist/server/seam-entry-read.sql +21 -0
  327. package/dist/server/seam-log-read.sql +21 -0
  328. package/dist/server/seam-loop.sql +9 -0
  329. package/dist/server/seam-proposal-list.sql +13 -0
  330. package/dist/server/version-info.d.ts +14 -0
  331. package/dist/server/version-info.d.ts.map +1 -0
  332. package/dist/server/version-info.js +69 -0
  333. package/dist/server/version-info.js.map +1 -0
  334. package/dist/server/yolo.d.ts +6 -0
  335. package/dist/server/yolo.d.ts.map +1 -0
  336. package/dist/server/yolo.js +64 -0
  337. package/dist/server/yolo.js.map +1 -0
  338. package/dist/service.d.ts +6 -0
  339. package/dist/service.d.ts.map +1 -0
  340. package/dist/service.js +309 -0
  341. package/dist/service.js.map +1 -0
  342. package/migrations/0000-00-00.01_schema.sql +500 -0
  343. package/package.json +86 -0
@@ -0,0 +1,266 @@
1
+ // The entry catalog (§packet-catalog) — the complete, unranked directory of every
2
+ // entry the session holds, served by FIND(scheme:///**), one per-scheme array (there is no
3
+ // plurnk:///manifest.json entry). catalogRowsFor renders engine_list_session_entries' rows,
4
+ // uniformly READable, in no relevance order; the model ranks/filters it itself by querying it
5
+ // (task-aware) — the catalog never ranks for it, or it would be an index again.
6
+ // Each item: { path, seconds?, tags?, channels: { <uri>: { mimetype, tokens, lines } } } — each
7
+ // channel keyed by its addressable URI (default channel → the bare path, non-default → path#channel).
8
+ // `tokens` is the live provider's count, re-counted at render — the write-time snapshot is NOT
9
+ // trusted, since a model/tokenizer change between loops would make the catalog lie; `lines` is the
10
+ // content's extent from mimetypes' process() totalLines.
11
+ //
12
+ // maintainDerivations (the per-turn pump) refreshes the deep channels the rows report; both live
13
+ // in the schemes/entry layer, not the engine — building a scheme's catalog is the schemes' job.
14
+ import { renderAddress } from "../core/plurnk-uri.js";
15
+ import { createHash } from "node:crypto";
16
+ import { MimetypeBinary } from "../content/index.js";
17
+ import EntryGraph from "./_entry-graph.js";
18
+ import EntrySemantic from "./_entry-semantic.js";
19
+ export default class EntryManifest {
20
+ // Public — the catalog's path-rendering is the single source of truth for the
21
+ // addressable key, shared by FIND (EntryFind aligns matched pathnames to catalog rows).
22
+ static toPath(scheme, pathname) {
23
+ // Bare (file, scheme===null) entries store the namespace-absolute key (`/notes.md`)
24
+ // but the model types the relative path it reads — render the leading slash off so
25
+ // the catalog matches what the model writes back (READ/EDIT resolve either form).
26
+ if (scheme === null)
27
+ return pathname.replace(/^\//, "");
28
+ // §run-scheme — run-scope keys store the owner as the first path segment
29
+ // (`/<owner>/<path>`); render it back as the authority so the model sees the
30
+ // addressable `run://<owner>/<path>` it types, not a bare `run:///<owner>/<path>`.
31
+ if (scheme === "run") {
32
+ const m = pathname.match(/^\/([^/]+)(\/.*)?$/);
33
+ if (m !== null)
34
+ return `run://${m[1]}${m[2] ?? "/"}`;
35
+ }
36
+ return renderAddress(scheme, pathname);
37
+ }
38
+ // Read-only catalog rows for a scheme (or all entries when undefined) — the CatalogEntry[]
39
+ // a per-scheme FIND(scheme:///**) renders as its JSON result, WITHOUT the derivation pump
40
+ // (maintainDerivations runs that once per turn; FIND reads the channels it leaves).
41
+ // §run-scheme — `runOwnerPrefix` (e.g. `/<owner>/*`) sources the building run's OWN run-scope
42
+ // scratch instead of the session filesystem: the run's perspective. Omitted → the session path,
43
+ // byte-identical (Inc-1).
44
+ static async catalogRowsFor(ctx, schemeFilter, runOwnerPrefix) {
45
+ const { db, sessionId, mimetypes, tokenize } = ctx;
46
+ if (mimetypes === undefined)
47
+ throw new Error("catalogRowsFor: ctx.mimetypes is required for the lines (extent) field");
48
+ if (tokenize === undefined)
49
+ throw new Error("catalogRowsFor: ctx.tokenize is required — depth is re-counted through the live provider, not stored");
50
+ const all = runOwnerPrefix === undefined
51
+ ? await db.engine_list_session_entries.all({ session_id: sessionId, tokenizer_id: ctx.gauge?.tokenizerId ?? "" })
52
+ : await db.engine_list_run_entries.all({ session_id: sessionId, owner_prefix: runOwnerPrefix, tokenizer_id: ctx.gauge?.tokenizerId ?? "" });
53
+ const rows = schemeFilter === undefined ? all : all.filter((r) => r.scheme === schemeFilter);
54
+ const tagsById = new Map();
55
+ const tagRows = runOwnerPrefix === undefined
56
+ ? await db.engine_list_session_entry_tags.all({ session_id: sessionId })
57
+ : await db.engine_list_run_entry_tags.all({ session_id: sessionId, owner_prefix: runOwnerPrefix });
58
+ for (const { entry_id, tag } of tagRows) {
59
+ const list = tagsById.get(entry_id);
60
+ if (list === undefined)
61
+ tagsById.set(entry_id, [tag]);
62
+ else
63
+ list.push(tag);
64
+ }
65
+ const byEntry = new Map();
66
+ for (const r of rows) {
67
+ const path = EntryManifest.toPath(r.scheme, r.pathname);
68
+ let entry = byEntry.get(path);
69
+ if (entry === undefined) {
70
+ entry = { path, channels: {} };
71
+ const tags = tagsById.get(r.entry_id);
72
+ if (tags !== undefined && tags.length > 0)
73
+ entry.tags = tags;
74
+ byEntry.set(path, entry);
75
+ }
76
+ if (r.seconds !== null && entry.seconds === undefined)
77
+ entry.seconds = r.seconds;
78
+ // Lines via a read-only process() (no deep channels → no derivation). A malformed
79
+ // entry degrades to a bare line count, parity with buildManifestBody's containment.
80
+ let totalLines;
81
+ try {
82
+ totalLines = (await mimetypes.process({ content: r.content, hint: r.mimetype }, { channels: [] })).totalLines;
83
+ }
84
+ catch {
85
+ totalLines = r.content.length === 0 ? 0 : r.content.split("\n").length;
86
+ }
87
+ const defaultCh = ctx.defaultChannelFor?.(r.scheme) ?? "body";
88
+ const channelKey = r.channel === defaultCh ? entry.path : `${entry.path}#${r.channel}`;
89
+ entry.channels[channelKey] = { mimetype: r.mimetype, tokens: tokenize(r.content), lines: totalLines };
90
+ }
91
+ return [...byEntry.values()];
92
+ }
93
+ // The per-turn derivation pump (§mimetype). For each BODY channel whose content changed
94
+ // since its last derivation (the deep_hash gate, config-signature-folded), re-derive every
95
+ // deep channel from ONE process() — the @graph symbol index (#186) and the ~semantic FTS +
96
+ // embedding — and stamp the new hash. An unchanged entry is skipped; its symbol/FTS/embedding
97
+ // rows persist. This is the engine-side point where the mimetypes handler legitimately fires
98
+ // (never at a scheme write). It DERIVES; it does not render — FIND and the catalog read what
99
+ // it leaves. Per-entry isolation: a malformed/unprocessable entry (e.g. invalid JSON the model
100
+ // wrote) makes process() throw — uncaught, that once crashed the whole turn (the daemon's
101
+ // -32603); contain it here (clear the deep channels, stamp the hash so it doesn't re-attempt)
102
+ // and keep pumping the rest.
103
+ // One entry's full derivation (graph + FTS + embeddings + hash stamp), containment
104
+ // included — shared by the pump and the ~query inline slice (§semantic-cold-query-full-fidelity
105
+ // full-fidelity). Failure clears the deep channels and stamps the hash (no re-attempt).
106
+ // Every derivation write funnels through one chain: the background pump and a ~query's
107
+ // inline slice may target the SAME entry concurrently, and indexFts/indexEmbedding are
108
+ // delete-then-insert — interleaved writers would duplicate chunk rows.
109
+ static #deriveChain = Promise.resolve();
110
+ static async deriveOne(ctx, r, hash, embedActive, maxChunks) {
111
+ const run = EntryManifest.#deriveChain.then(() => EntryManifest.#deriveOneUnlocked(ctx, r, hash, embedActive, maxChunks));
112
+ EntryManifest.#deriveChain = run.catch(() => { }); // the chain survives a failed link; deriveOne's caller sees the rejection
113
+ return run;
114
+ }
115
+ static async #deriveOneUnlocked(ctx, r, hash, embedActive, maxChunks) {
116
+ const { db, sessionId, mimetypes } = ctx;
117
+ if (mimetypes === undefined)
118
+ throw new Error("deriveOne: ctx.mimetypes is required");
119
+ try {
120
+ const wantGraph = r.content.length > 0 && !MimetypeBinary.isBinaryMimetype(r.mimetype);
121
+ let result;
122
+ if (wantGraph) {
123
+ try {
124
+ result = await mimetypes.process({ content: r.content, hint: r.mimetype, path: r.pathname }, { channels: embedActive ? ["symbols", "references", "embedding", "content"] : ["symbols", "references", "content"] }); // §mimetype-methods-process-entry-point — "content" = the readable projection (mimetypes#48): FTS/embeddings consume it when the handler offers one
125
+ await EntryGraph.populateFrom(db, sessionId, r.entry_id, result.symbols ?? [], result.references ?? []);
126
+ }
127
+ catch {
128
+ // A handler predating the references channel throws → metadata-only, clear graph.
129
+ result = await mimetypes.process({ content: r.content, hint: r.mimetype, path: r.pathname }, { channels: [] });
130
+ await EntryGraph.populateFrom(db, sessionId, r.entry_id, [], []);
131
+ }
132
+ }
133
+ else {
134
+ result = await mimetypes.process({ content: r.content, hint: r.mimetype, path: r.pathname }, { channels: [] });
135
+ await EntryGraph.populateFrom(db, sessionId, r.entry_id, [], []);
136
+ }
137
+ // The other two deep channels: re-index the body into entry_fts (~semantic's keyword
138
+ // half) and store the embedding vector(s) + model (the vector half). Empty/binary →
139
+ // cleared, not stored. result.embedding is the fallback whole-entry vector.
140
+ // The SEMANTIC SOURCE: when the handler returns a readable projection
141
+ // (ProcessResult.content — e.g. text/html's Readability→markdown), FTS and the
142
+ // embedder consume THAT, not the raw body. A 424k-token raw page becomes a few-k
143
+ // article; the vectors and keywords index what a reader (and the model, per the
144
+ // epic's READ-slices-of-reading end-state) actually consumes. Handlers that return
145
+ // no projection keep today's raw-body behavior exactly.
146
+ const semanticSource = result.content ?? r.content;
147
+ await EntrySemantic.indexFts(db, r.entry_id, semanticSource);
148
+ // mimetypes SPEC 21 / #47 — the operator's PLURNK_MIMETYPES_NO_EMBED classification: a matched entry
149
+ // (lockfile, minified bundle, sourcemap) is never semantically derived — zero vectors,
150
+ // FTS-only is the honest treatment. The knob IS the decision table; no code heuristics.
151
+ if (result.noEmbed !== undefined) {
152
+ await EntrySemantic.indexEmbedding(db, r.entry_id, [], undefined);
153
+ ctx.pushTelemetry?.({ source: "engine:derivation", kind: "embed_progress", message: `entry ${r.entry_id} (${r.pathname}) matched no-embed pattern '${result.noEmbed}' — FTS-only, no vectors`, level: "info" });
154
+ await db.graph_set_deep_hash.run({ entry_id: r.entry_id, deep_hash: hash });
155
+ return;
156
+ }
157
+ const { chunks, model, capped } = await EntrySemantic.deriveEmbeddings(mimetypes, semanticSource, result.symbols ?? [], result.embedding, result.embeddingModel, ctx.signal, maxChunks);
158
+ await EntrySemantic.indexEmbedding(db, r.entry_id, chunks, model);
159
+ // §semantic-entry-chunk-cap — a CAPPED (inline, latency-staged) pass does NOT stamp:
160
+ // the hash stays stale so the background pump completes the entry to full depth.
161
+ // Head-quality answers now, whole-book coverage at steady state. There is NO pump-side
162
+ // size cap — semantic search must work for legitimately large corpora (owner ruling);
163
+ // junk-content eligibility is classification (mimetypes#47), never a magic number.
164
+ if (capped) {
165
+ ctx.pushTelemetry?.({ source: "engine:derivation", kind: "embed_progress", message: `entry ${r.entry_id} inline-embedded head-first (${chunks.length} chunks) — the background pump completes it`, level: "info" });
166
+ }
167
+ else {
168
+ await db.graph_set_deep_hash.run({ entry_id: r.entry_id, deep_hash: hash });
169
+ }
170
+ }
171
+ catch {
172
+ await EntryGraph.populateFrom(db, sessionId, r.entry_id, [], []);
173
+ await EntrySemantic.indexFts(db, r.entry_id, "");
174
+ await EntrySemantic.indexEmbedding(db, r.entry_id, [], undefined);
175
+ await db.graph_set_deep_hash.run({ entry_id: r.entry_id, deep_hash: hash });
176
+ }
177
+ }
178
+ // §semantic-cold-query-full-fidelity — derive any STALE entries among the ~query's
179
+ // FTS-narrowed candidate slice, inline at dispatch. Ranking only ever scores the
180
+ // narrowed set, so deriving exactly this slice on demand gives bit-identical results
181
+ // to a fully-warm corpus — the first turn never runs on degraded search while the
182
+ // background pump sweeps the rest. Bounded by the caller's cap; returns how many derived.
183
+ static async deriveFtsCandidates(ctx, scheme, ftsQuery, cap) {
184
+ const { db, sessionId, mimetypes } = ctx;
185
+ if (mimetypes === undefined)
186
+ return 0;
187
+ const deepCfgSig = await EntrySemantic.deepConfigSignature(mimetypes);
188
+ if (deepCfgSig === "embed:none")
189
+ return 0; // FTS-only posture — nothing to derive
190
+ const rows = await db.semantic_fts_candidates.all({
191
+ fts_query: ftsQuery, session_id: sessionId, scheme, cap,
192
+ });
193
+ let derived = 0;
194
+ for (const r of rows) {
195
+ const hash = createHash("sha256").update(r.content).update("\0").update(deepCfgSig).digest("hex");
196
+ if (hash === r.deep_hash)
197
+ continue; // already warm for this config
198
+ await EntryManifest.deriveOne(ctx, r, hash, true, 128); // inline latency stage (§semantic-entry-chunk-cap)
199
+ derived++;
200
+ }
201
+ if (rows.length === cap) {
202
+ ctx.pushTelemetry?.({ source: "engine:derivation", kind: "embed_progress", message: `inline slice capped at ${cap} candidates — broader results warm in the background`, level: "info" });
203
+ }
204
+ return derived;
205
+ }
206
+ static async maintainDerivations(ctx) {
207
+ const { db, sessionId, mimetypes } = ctx;
208
+ if (mimetypes === undefined)
209
+ throw new Error("maintainDerivations: ctx.mimetypes is required to derive entry deep channels");
210
+ const rows = await db.engine_list_session_entries.all({ session_id: sessionId });
211
+ // The embedding config signature is identical for every entry this pass — compute it
212
+ // once and fold it into each deep_hash (re-derive on model/knob change).
213
+ const deepCfgSig = await EntrySemantic.deepConfigSignature(mimetypes);
214
+ // No embedder (absent OR PLURNK_SERVICE_EMBED_DISABLE) → don't request the embedding channel: it loads/
215
+ // runs the model independent of the capability probe, and deriveEmbeddings would only discard the
216
+ // vector. The signature already collapses to "embed:none" in that case, so reuse it (no new flag read).
217
+ const embedActive = deepCfgSig !== "embed:none";
218
+ // The changed-entry worklist (body channel, deep_hash stale), computed up front so the
219
+ // corpus total is known — a multi-entry pass (the initial ingest, which otherwise looks
220
+ // frozen) emits a throttled progress signal; a normal turn (0-1 entries) stays silent. #272
221
+ const pending = [];
222
+ for (const r of rows) {
223
+ if (r.channel !== "body")
224
+ continue; // derivation fires on the body channel only
225
+ const hash = createHash("sha256").update(r.content).update("\0").update(deepCfgSig).digest("hex");
226
+ if (hash !== r.deep_hash)
227
+ pending.push({ r, hash }); // unchanged since last derivation → deep rows persist
228
+ }
229
+ // Smallest-first (owner ruling, service#337 follow-up): a fat outlier (a minified bundle,
230
+ // a lockfile that slipped classification) derives LAST, so the corpus is mostly-warm early
231
+ // and the hot path never queues behind the whale. Pure scheduling — nothing is skipped,
232
+ // nothing is lazy; the whale still derives to full depth, just at the back of the line.
233
+ pending.sort((a, b) => a.r.content.length - b.r.content.length);
234
+ const total = pending.length;
235
+ const step = total > 1 ? Math.max(1, Math.floor(total / 10)) : 0; // ~10 milestones, or silent for 0-1
236
+ let completed = 0;
237
+ for (const { r, hash } of pending) {
238
+ await EntryManifest.deriveOne(ctx, r, hash, embedActive);
239
+ completed++;
240
+ if (step > 0 && (completed === total || completed % step === 0)) {
241
+ ctx.pushTelemetry?.({ source: "engine:derivation", kind: "embed_progress", message: `deriving entries ${completed}/${total}`, completed, total, level: "info" });
242
+ }
243
+ }
244
+ // #312 — the token-warm pass: (content_hash, tokenizer_id)-keyed counts for the ACTIVE
245
+ // gauge. A model swap to a NEW tokenizer identity makes every row miss (the bulk recount,
246
+ // reported through the SAME progress channel as embeddings — one 'busy' signal, one cancel);
247
+ // a swap between vocab-sharing models misses nothing. The deep_hash discipline for tokens.
248
+ if (ctx.gauge !== undefined) {
249
+ const stale = await db.token_stale_channels.all({ session_id: sessionId, tokenizer_id: ctx.gauge.tokenizerId });
250
+ const tTotal = stale.length;
251
+ const tStep = tTotal > 1 ? Math.max(1, Math.floor(tTotal / 10)) : 0;
252
+ let counted = 0;
253
+ for (const row of stale) {
254
+ if (ctx.signal?.aborted === true)
255
+ break;
256
+ const tokens = await ctx.gauge.count(row.content);
257
+ await db.token_count_upsert.run({ content_hash: row.content_hash, tokenizer_id: ctx.gauge.tokenizerId, tokens });
258
+ counted++;
259
+ if (tStep > 0 && (counted === tTotal || counted % tStep === 0)) {
260
+ ctx.pushTelemetry?.({ source: "engine:derivation", kind: "embed_progress", message: `recounting tokens ${counted}/${tTotal} (tokenizer ${ctx.gauge.tokenizerId.slice(0, 12)})`, completed: counted, total: tTotal, level: "info" });
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=_entry-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-manifest.js","sourceRoot":"","sources":["../../src/schemes/_entry-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { EditStatement, ReadStatement } from "@plurnk/plurnk-grammar";
2
+ import type { PlurnkSchemeContext, SchemeManifest } from "../core/scheme-types.ts";
3
+ export type EditResult = {
4
+ status: number;
5
+ entryId: number | null;
6
+ channel: string | null;
7
+ span?: string | null;
8
+ };
9
+ export type ReadResult = {
10
+ status: number;
11
+ content: string | null;
12
+ mimetype: string | null;
13
+ channel: string | null;
14
+ startLine?: number | null;
15
+ matches?: number | null;
16
+ reason?: string;
17
+ awaitRun?: string;
18
+ };
19
+ export type OpenFoldResult = {
20
+ status: number;
21
+ };
22
+ export default class EntryOps {
23
+ #private;
24
+ static editSessionEntry(statement: EditStatement, ctx: PlurnkSchemeContext, manifest: SchemeManifest): Promise<EditResult>;
25
+ static deleteSessionEntry(statement: {
26
+ target: EditStatement["target"];
27
+ }, ctx: PlurnkSchemeContext, manifest: SchemeManifest): Promise<{
28
+ status: number;
29
+ }>;
30
+ static readSessionEntry(statement: ReadStatement, ctx: PlurnkSchemeContext, manifest: SchemeManifest): Promise<ReadResult>;
31
+ }
32
+ //# sourceMappingURL=_entry-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-ops.d.ts","sourceRoot":"","sources":["../../src/schemes/_entry-ops.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAI3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAanF,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAUlH,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7M,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,QAAQ;;IAoCzB,OAAa,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA+G/H;IAKD,OAAa,kBAAkB,CAAC,SAAS,EAAE;QAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;KAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAQ/J;IAED,OAAa,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAoD/H;CACJ"}
@@ -0,0 +1,216 @@
1
+ import EntrySemantic from "./_entry-semantic.js";
2
+ import { decodePathParens } from "../core/path-decode.js";
3
+ import { foldAuthorityIntoPath } from "../core/plurnk-uri.js";
4
+ import { LineMarkerOps, MimetypeBinary, PathMimetype, ReadResolve, editedSpan } from "../content/index.js";
5
+ export default class EntryOps {
6
+ static #pathnameOf(statement) {
7
+ const t = statement.target;
8
+ if (t === null)
9
+ throw new Error("unreachable");
10
+ if (t.kind === "regex")
11
+ return t.raw; // regex source — parens are syntax, never encoded
12
+ // Namespace-as-authority: fold a plurnk://docs/x.md authority back into the storage
13
+ // path (/docs/x.md) so it keys identically to the empty-authority form. #239 item 4
14
+ if (t.kind === "url")
15
+ return decodePathParens(foldAuthorityIntoPath(t.hostname, t.pathname));
16
+ return decodePathParens(t.raw);
17
+ }
18
+ static #fragmentOf(statement) {
19
+ const t = statement.target;
20
+ if (t === null || t.kind !== "url")
21
+ return null;
22
+ return t.fragment;
23
+ }
24
+ static #resolveChannel(fragment, channels, defaultChannel) {
25
+ const target = fragment ?? defaultChannel; // fragment selects the named channel; absent → default — §channel-selection-fragment-selects-named-channel §channel-selection-fragmentless-targets-default-channel
26
+ // The default channel is always valid — dynamic-channel schemes (File:
27
+ // channels={}, mimetype derived per-file) declare none, but their body
28
+ // channel still exists. A non-default fragment must be a declared channel.
29
+ if (target === defaultChannel)
30
+ return target;
31
+ if (!(target in channels))
32
+ return null; // unknown channel name → null → 400 at the caller — §channel-selection-unknown-channel-400
33
+ return target;
34
+ }
35
+ // §run-scheme — pick the scope's CRUD/read statement. A run-scope scheme
36
+ // (manifest.scope === "run", today only run://) keys its entries in the run
37
+ // partition; every other scheme resolves the session statement, byte-identical.
38
+ static #stmt(db, scope, base) {
39
+ const run = { crud_find: "crud_find_run_entry", crud_insert: "crud_insert_run_entry", ops_read_channel: "ops_read_channel_run" };
40
+ const session = { crud_find: "crud_find_session_entry", crud_insert: "crud_insert_session_entry", ops_read_channel: "ops_read_channel" };
41
+ return db[(scope === "run" ? run : session)[base]];
42
+ }
43
+ static async editSessionEntry(statement, ctx, manifest) {
44
+ if (statement.target === null)
45
+ return { status: 400, entryId: null, channel: null };
46
+ const { db, sessionId } = ctx;
47
+ const { name: scheme, channels, defaultChannel } = manifest;
48
+ const fragment = EntryOps.#fragmentOf(statement);
49
+ const targetChannel = EntryOps.#resolveChannel(fragment, channels, defaultChannel);
50
+ if (targetChannel === null)
51
+ return { status: 400, entryId: null, channel: null };
52
+ const pathname = EntryOps.#pathnameOf(statement);
53
+ const existing = await EntryOps.#stmt(db, manifest.scope, "crud_find").get({ session_id: sessionId, scheme, pathname });
54
+ // Non-default channel write requires the entry to exist (§channel-selection-fragment-on-nonexistent-404).
55
+ if (existing === undefined && fragment !== null) {
56
+ return { status: 404, entryId: null, channel: targetChannel };
57
+ }
58
+ // Effective mimetype for this entry. Per plurnk-grammar 0.14.0:
59
+ // "Path suffix declares mimetype; absent suffix defers to scheme default."
60
+ // `known:///users.json` → application/json (extension wins).
61
+ // `known:///users` → text/markdown (scheme manifest default).
62
+ const channelManifestDefault = channels[targetChannel];
63
+ const effectiveMimetype = await PathMimetype.resolveEntryMimetype(pathname, channelManifestDefault, ctx.mimetypes);
64
+ // 415 on binary entries (SPEC.md §op-invariants).
65
+ if (existing !== undefined) {
66
+ const channel = await EntryOps.#stmt(db, manifest.scope, "ops_read_channel").get({
67
+ session_id: sessionId, scheme, pathname, channel: targetChannel,
68
+ });
69
+ if (channel !== undefined && MimetypeBinary.isBinaryMimetype(channel.mimetype)) {
70
+ return { status: 415, entryId: existing.id, channel: targetChannel };
71
+ }
72
+ }
73
+ if (MimetypeBinary.isBinaryMimetype(effectiveMimetype)) {
74
+ return { status: 415, entryId: existing?.id ?? null, channel: targetChannel };
75
+ }
76
+ const body = statement.body ?? ""; // null clears — §edit-null-clears
77
+ // Read current content unconditionally for diff generation (M.12 —
78
+ // surface diff in EDIT response so wrong-marker mistakes are visible).
79
+ let originalContent = "";
80
+ if (existing !== undefined) {
81
+ const channel = await EntryOps.#stmt(db, manifest.scope, "ops_read_channel").get({
82
+ session_id: sessionId, scheme, pathname, channel: targetChannel,
83
+ });
84
+ originalContent = channel?.content ?? "";
85
+ }
86
+ // `<L>` line marker EDIT semantics. Dispatch on effective mimetype:
87
+ // JSON → LineMarkerOps.applyJsonItemEdit (structural item edit, plurnk-grammar 0.13.0);
88
+ // otherwise → LineMarkerOps.applyLineMarkerEdit (line edit, original semantics).
89
+ // On a non-existent entry, body becomes the content regardless of marker
90
+ // (per "Resolved ambiguities" §scheme — sentinels/positions only apply to
91
+ // existing content).
92
+ let newContent;
93
+ if (statement.lineMarker !== null && existing !== undefined) {
94
+ const result = MimetypeBinary.isJsonMimetype(effectiveMimetype)
95
+ ? LineMarkerOps.applyJsonItemEdit(originalContent, statement.lineMarker, body)
96
+ : LineMarkerOps.applyLineMarkerEdit(originalContent, statement.lineMarker, body);
97
+ if (result.status !== 200)
98
+ return { status: result.status, entryId: existing.id, channel: targetChannel };
99
+ newContent = result.result ?? "";
100
+ }
101
+ else {
102
+ newContent = body;
103
+ }
104
+ // 304 no-op (SPEC §edit): an existing entry whose write would change nothing —
105
+ // identical content and no new tag. Mirrors OPEN/FOLD's 304 on no-op; hands the
106
+ // model a "you already did this" signal instead of a phantom 200 it can't
107
+ // distinguish from a real update.
108
+ if (existing !== undefined && newContent === originalContent) {
109
+ const signalTags = Array.isArray(statement.signal) ? statement.signal : [];
110
+ let addsTag = false;
111
+ if (signalTags.length > 0) {
112
+ const have = new Set((await db.crud_read_tags.all({ entry_id: existing.id })).map((r) => r.tag));
113
+ addsTag = signalTags.some((t) => !have.has(t));
114
+ }
115
+ if (!addsTag)
116
+ return { status: 304, entryId: existing.id, channel: targetChannel }; // §edit-noop-304
117
+ }
118
+ let entryId;
119
+ let createdNow;
120
+ if (existing === undefined) {
121
+ const row = await EntryOps.#stmt(db, manifest.scope, "crud_insert").get({ session_id: sessionId, scheme, pathname });
122
+ if (row === undefined)
123
+ throw new Error("editSessionEntry: insert returned no row");
124
+ entryId = row.id;
125
+ createdNow = true;
126
+ }
127
+ else {
128
+ entryId = existing.id;
129
+ createdNow = false;
130
+ }
131
+ if (ctx.tokenize === undefined)
132
+ throw new Error("editSessionEntry: ctx.tokenize is required for token accounting");
133
+ await db.ops_upsert_channel.run({ entry_id: entryId, name: targetChannel, content: newContent, mimetype: effectiveMimetype, tokens: ctx.tokenize(newContent) }); // EDIT writes exactly the one resolved channel — §per-entry-channels-edit-writes-only-body
134
+ // §semantic-fts-at-write — the keyword half indexes with the write (body channel only).
135
+ if (targetChannel === "body")
136
+ await EntrySemantic.indexFts(db, entryId, newContent);
137
+ // NB: NO @graph derivation here — a scheme write resolves the mimetype
138
+ // label but never invokes the mimetypes handler (§mimetype). The symbol index is
139
+ // built engine-side at manifest-add (EntryManifest.buildManifestBody).
140
+ // Tags apply additively — each signal tag is written, never replacing existing ones. §edit-tags-additive
141
+ if (Array.isArray(statement.signal)) {
142
+ for (const tag of statement.signal) {
143
+ await db.crud_write_tag.run({ entry_id: entryId, tag });
144
+ }
145
+ }
146
+ return { status: createdNow ? 201 : 200, entryId, channel: targetChannel, span: editedSpan(originalContent, newContent) }; // §edit-status-201-200
147
+ }
148
+ // Scope-aware entry delete — the KILL counterpart of editSessionEntry. Resolves the
149
+ // entry via the scope's crud_find variant (so a run-scope row is found, not just
150
+ // session), then deletes by id (channels/tags CASCADE). 404 when the entry is absent.
151
+ static async deleteSessionEntry(statement, ctx, manifest) {
152
+ if (statement.target === null)
153
+ return { status: 400 };
154
+ const { db, sessionId } = ctx;
155
+ const pathname = EntryOps.#pathnameOf(statement);
156
+ const existing = await EntryOps.#stmt(db, manifest.scope, "crud_find").get({ session_id: sessionId, scheme: manifest.name, pathname });
157
+ if (existing === undefined)
158
+ return { status: 404 };
159
+ await db.crud_delete_entry.run({ entry_id: existing.id });
160
+ return { status: 200 };
161
+ }
162
+ static async readSessionEntry(statement, ctx, manifest) {
163
+ if (statement.target === null)
164
+ return { status: 400, content: null, mimetype: null, channel: null };
165
+ const { db, sessionId } = ctx;
166
+ const { channels, defaultChannel } = manifest;
167
+ // Scope by the manifest's persisted entries.scheme (storedScheme; absent →
168
+ // name). File sets storedScheme=null — its rows persist bare (scheme=NULL).
169
+ const scheme = manifest.storedScheme === undefined ? manifest.name : manifest.storedScheme;
170
+ const fragment = EntryOps.#fragmentOf(statement);
171
+ const targetChannel = EntryOps.#resolveChannel(fragment, channels, defaultChannel);
172
+ if (targetChannel === null)
173
+ return { status: 400, content: null, mimetype: null, channel: null };
174
+ const pathname = EntryOps.#pathnameOf(statement);
175
+ // An xpath is a question about the DOM — a fragmentless xpath READ routes to the raw `html`
176
+ // channel (the archive the decisive markdown body was projected from). A fragment still wins.
177
+ let readChannel = targetChannel;
178
+ if (fragment === null && statement.body !== null && statement.body.dialect === "xpath") {
179
+ const html = await EntryOps.#stmt(db, manifest.scope, "ops_read_channel").get({
180
+ session_id: sessionId, scheme, pathname, channel: "html",
181
+ });
182
+ if (html !== undefined)
183
+ readChannel = "html";
184
+ }
185
+ const row = await EntryOps.#stmt(db, manifest.scope, "ops_read_channel").get({
186
+ session_id: sessionId, scheme, pathname, channel: readChannel,
187
+ });
188
+ if (row === undefined)
189
+ return { status: 404, content: null, mimetype: null, channel: targetChannel }; // §read-read-404
190
+ if (MimetypeBinary.isBinaryMimetype(row.mimetype)) {
191
+ return { status: 415, content: null, mimetype: row.mimetype, channel: targetChannel };
192
+ }
193
+ // `[tag]` filter: entry must have ALL requested tags. Mismatch = 404
194
+ // (entry doesn't match the tag-scoped READ).
195
+ if (Array.isArray(statement.signal) && statement.signal.length > 0) {
196
+ const entry = await EntryOps.#stmt(db, manifest.scope, "crud_find").get({ session_id: sessionId, scheme, pathname });
197
+ if (entry === undefined)
198
+ return { status: 404, content: null, mimetype: null, channel: targetChannel };
199
+ const tagRows = await db.crud_read_tags.all({ entry_id: entry.id });
200
+ const have = new Set(tagRows.map((r) => r.tag));
201
+ for (const want of statement.signal) {
202
+ if (!have.has(want))
203
+ return { status: 404, content: null, mimetype: null, channel: targetChannel };
204
+ }
205
+ }
206
+ const r = await ReadResolve.resolve({
207
+ content: row.content,
208
+ mimetype: row.mimetype,
209
+ lineMarker: statement.lineMarker,
210
+ body: statement.body,
211
+ mimetypes: ctx.mimetypes,
212
+ });
213
+ return { ...r, channel: readChannel }; // READ returns the resolved channel's content + mimetype — §read-read-content
214
+ }
215
+ }
216
+ //# sourceMappingURL=_entry-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-ops.js","sourceRoot":"","sources":["../../src/schemes/_entry-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ -- Session-entry op handlers for entry-bearing schemes (SPEC §scheme, §channel-selection).
2
+ -- Some queries reuse PREPs declared in _entry-crud.sql:
3
+ -- crud_find_session_entry, crud_write_tag
4
+
5
+ -- PREP: ops_upsert_channel
6
+ -- EDIT semantics: replace channel content if it exists.
7
+ INSERT OR REPLACE INTO entry_channels (entry_id, name, content, mimetype, tokens, state)
8
+ VALUES ($entry_id, $name, $content, $mimetype, $tokens, 'static');
9
+
10
+ -- PREP: ops_read_channel
11
+ -- READ targeting a specific channel of a session entry.
12
+ SELECT ec.content, ec.mimetype
13
+ FROM entries e
14
+ JOIN entry_channels ec ON ec.entry_id = e.id
15
+ WHERE e.scope = 'session'
16
+ AND e.session_id = $session_id
17
+ AND e.scheme IS $scheme
18
+ AND e.pathname = $pathname
19
+ AND ec.name = $channel;
20
+
21
+ -- PREP: ops_read_channel_run
22
+ -- Run-scope twin of ops_read_channel (§run-scheme).
23
+ SELECT ec.content, ec.mimetype
24
+ FROM entries e
25
+ JOIN entry_channels ec ON ec.entry_id = e.id
26
+ WHERE e.scope = 'run'
27
+ AND e.session_id = $session_id
28
+ AND e.scheme IS $scheme
29
+ AND e.pathname = $pathname
30
+ AND ec.name = $channel;
31
+