@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,226 @@
1
+ // FIND helper for entry-bearing schemes (SPEC §find; plurnk.md FIND row).
2
+ // FIND resolves to the scheme's CATALOG ROWS — the very rows the manifest catalogs —
3
+ // filtered to the statement's matches. A matcher (glob/regex/jsonpath/xpath/~semantic/
4
+ // @graph) decides WHICH entries appear. A CONTENT matcher also stamps each row with
5
+ // `matchLines` — the source line(s) where it hit (plurnk.md:31: FIND returns the matching
6
+ // rows with the match lines in the metadata; the line CONTENT is a READ). The result is a
7
+ // JSON array of catalog rows: the per-scheme slice of the catalog (§find-result-catalog-rows).
8
+ //
9
+ // Slot semantics (plurnk.md §"Body matcher dispatch (FIND, READ, OPEN, FOLD)"):
10
+ // target — required scope (path or glob); selects which entries are candidates
11
+ // body — matcher (glob/regex/jsonpath/xpath/~semantic/@graph). A content matcher
12
+ // runs against the entry's default-channel CONTENT (Matcher.matchAgainstContent
13
+ // → the mimetypes daughter) and INCLUDES/EXCLUDES the entry — e.g.
14
+ // `FIND(log:///**/error):/timeout/i` keeps logs whose content matches.
15
+ // signal — tag filter: candidate entry must have ALL listed tags
16
+ // <L> — results pagination: select results N..M from the matched list
17
+ import { LineMarkerOps } from "../content/index.js";
18
+ import Matcher from "../content/matcher.js";
19
+ import { decodePathParens } from "../core/path-decode.js";
20
+ import EntryGraph from "./_entry-graph.js";
21
+ import EntryManifest from "./_entry-manifest.js";
22
+ import EntrySemantic from "./_entry-semantic.js";
23
+ export default class EntryFind {
24
+ // §run-scheme — the owner-prefix glob (`/<owner>/*`) for a run-scope FIND, from the target
25
+ // pathname Run.find already folded (`/<owner>/<rest>`). Bounds the catalog source to one run's
26
+ // scratch — the building run's own (self) or a named sister's.
27
+ static #runOwnerPrefix(statement) {
28
+ const path = statement.target?.kind === "url" ? statement.target.pathname : "";
29
+ const owner = path.split("/").filter((s) => s.length > 0)[0];
30
+ return owner === undefined ? "/*" : `/${owner}/*`;
31
+ }
32
+ static #scopePathnameOf(statement) {
33
+ const path = statement.target;
34
+ if (path === null)
35
+ return null;
36
+ if (path.kind === "regex")
37
+ return path.raw; // regex source — parens are syntax, never encoded
38
+ return decodePathParens(path.kind === "url" ? path.pathname : path.raw); // #239 item 4
39
+ }
40
+ static #paginate(items, marker) {
41
+ const total = items.length;
42
+ const { first, last } = marker;
43
+ // #209 — a fractional marker is a semantic similarity threshold; on a
44
+ // non-semantic (paginated) result it's nonsense → 416, never floored.
45
+ if (!Number.isInteger(first) || (last !== null && !Number.isInteger(last)))
46
+ return { status: 416 };
47
+ if (last === null) {
48
+ if (first === 0 || first === -1)
49
+ return { status: 200, items: [] };
50
+ if (first > 0 && first <= total)
51
+ return { status: 200, items: [items[first - 1]] };
52
+ return { status: 416 };
53
+ }
54
+ let n = first;
55
+ let m = last;
56
+ if (n === 0)
57
+ n = 1;
58
+ if (m === -1)
59
+ m = total;
60
+ if (n < 1 || n > total)
61
+ return { status: 416 };
62
+ if (m < 1 || m > total)
63
+ return { status: 416 };
64
+ if (n > m)
65
+ return { status: 416 };
66
+ return { status: 200, items: items.slice(n - 1, m) };
67
+ }
68
+ static #unique(xs) {
69
+ const seen = new Set();
70
+ const out = [];
71
+ for (const x of xs)
72
+ if (!seen.has(x)) {
73
+ seen.add(x);
74
+ out.push(x);
75
+ }
76
+ return out;
77
+ }
78
+ // Resolve a FIND to its matched session PATHNAMES — entry-level, unique, in result
79
+ // order (rank for ~semantic, candidate order otherwise). Candidate selection (scope +
80
+ // tags) runs in SQL (find_session_entry_candidates); a content matcher then runs against
81
+ // each candidate's default-channel CONTENT (Matcher.matchAgainstContent → the mimetypes
82
+ // daughter) and INCLUDES/EXCLUDES the entry — 200 keeps it, 204/415/203 drop it, 400
83
+ // (malformed matcher) fails the whole op. Path-scoping stays in the (target). Returns the
84
+ // matched pathnames plus `locations` — each content hit's source line(s), keyed by pathname.
85
+ static async #matchPathnames(statement, ctx, manifest) {
86
+ if (statement.target === null)
87
+ return { status: 400, matches: [] };
88
+ // Scope by the manifest's persisted entries.scheme (storedScheme; absent →
89
+ // name). File sets storedScheme=null — bare rows.
90
+ const scheme = manifest.storedScheme === undefined ? manifest.name : manifest.storedScheme;
91
+ if (statement.body !== null && statement.body.dialect === "semantic") {
92
+ // ~query: embed the query text, FTS-narrow by its terms, cosine-rank the narrowed
93
+ // set, top-K CHUNKS. Each ranked chunk is a (file, span) item — a file may appear
94
+ // more than once (#286, no dedup). 501 when no embeddings handler is installed. <L> carries the rank marker.
95
+ const { mimetypes } = ctx;
96
+ if (mimetypes === undefined)
97
+ return { status: 501, matches: [] };
98
+ if (statement.lineMarker === null)
99
+ return { status: 400, matches: [] }; // ~query needs a rank marker, e.g. ~query<10>
100
+ // §semantic-cold-query-full-fidelity — warm the query's own candidate slice inline
101
+ // (bit-identical to a warm corpus; the background pump owes nothing to THIS query).
102
+ await EntryManifest.deriveFtsCandidates(ctx, scheme, EntrySemantic.ftsQueryFor(statement.body.raw), 128);
103
+ const ranked = await EntrySemantic.rankSemantic(ctx.db, ctx.sessionId, scheme, mimetypes, statement.body.raw, LineMarkerOps.firstLast(statement.lineMarker));
104
+ if (ranked.status !== 200)
105
+ return { status: ranked.status, matches: [] };
106
+ return { status: 200, matches: ranked.results.map((x) => ({ pathname: x.pathname, span: { lineStart: x.lineStart, lineEnd: x.lineEnd } })) };
107
+ }
108
+ const scopePathname = EntryFind.#scopePathnameOf(statement);
109
+ // The target's GLOB scope. A FOLDER (trailing slash, incl. the scheme root `/`) expands to
110
+ // its contents — append `*`; a bare ENTRY path stays exact (one entry); an explicit glob
111
+ // passes through literally. The `*` is folderhood, not a blanket prefix — so FIND(README.md)
112
+ // is the one entry, uniform with READ's target contract (#286). grammar 0.46 regex-in-path:
113
+ // a `#pattern#flags` target filters by regex over the pathname (below), no scope glob.
114
+ // §find-scope-prefix-filter
115
+ const scopeGlob = statement.target.kind === "regex" || scopePathname === null || scopePathname.length === 0
116
+ ? null
117
+ : (scopePathname.endsWith("/") ? `${scopePathname}*` : scopePathname);
118
+ const tags = Array.isArray(statement.signal) ? statement.signal : []; // tag filter, AND semantics — §find-tag-filter-and-semantics
119
+ const tagsParam = tags.length > 0 ? JSON.stringify(tags) : "[]";
120
+ const { db, sessionId } = ctx;
121
+ // Candidates are session-scoped — a FIND never reaches across sessions. §find-scoped-isolation.
122
+ // §run-scheme — a run-scope scheme (manifest.scope==='run', today run://) draws from the run
123
+ // partition instead; the owner narrowing rides scopeGlob (Run.find folds `/<owner>/*` in).
124
+ const candidatesQuery = manifest.scope === "run" ? "find_run_entry_candidates" : "find_session_entry_candidates";
125
+ let candidates = await db[candidatesQuery].all({
126
+ session_id: sessionId,
127
+ scheme,
128
+ channel: manifest.defaultChannel,
129
+ scope_pathname: scopeGlob,
130
+ tags: tagsParam,
131
+ });
132
+ // grammar 0.46 regex-in-path — a `#pattern#flags` target narrows candidates by regex
133
+ // over their pathname (in TS; SQLite has no regex). Malformed pattern → 400, parallel
134
+ // to a malformed body matcher.
135
+ if (statement.target.kind === "regex") {
136
+ let re;
137
+ try {
138
+ re = new RegExp(statement.target.pattern, statement.target.flags || undefined);
139
+ }
140
+ catch {
141
+ return { status: 400, matches: [] };
142
+ }
143
+ candidates = candidates.filter((c) => re.test(c.pathname));
144
+ }
145
+ // Every dialect resolves to (file, span) items — one per match (#286). A body-less FIND
146
+ // selects the whole entry (span: null); a matcher selects spans within it.
147
+ let matches;
148
+ if (statement.body === null) {
149
+ matches = candidates.map((c) => ({ pathname: c.pathname, span: null }));
150
+ }
151
+ else if (statement.body.dialect === "graph") {
152
+ // @graph (plurnk-service#186): body is `@<sym` / `@>sym` / `@sym`. EntryGraph resolves
153
+ // the relation across (session, scheme), each as a (file, span); intersect with the
154
+ // in-scope candidates (target glob + tags) for the final set.
155
+ const inScope = new Set(candidates.map((c) => c.pathname));
156
+ const graph = await EntryGraph.match(ctx.db, ctx.sessionId, scheme, statement.body.raw);
157
+ if (graph.status !== 200)
158
+ return { status: graph.status, matches: [] };
159
+ matches = graph.matches.filter((m) => inScope.has(m.pathname)).map((m) => ({ pathname: m.pathname, span: { lineStart: m.lineStart, lineEnd: m.lineEnd } }));
160
+ }
161
+ else {
162
+ const { mimetypes } = ctx;
163
+ if (mimetypes === undefined)
164
+ throw new Error("EntryFind.#matchPathnames: body matcher requires the mimetypes capability in ctx");
165
+ // §find-source-agnostic — the shared content-matcher primitive (Log.find runs the same
166
+ // one over log rows). Candidates key by pathname; each hit becomes a Match.
167
+ const r = await Matcher.matchCandidates(statement.body, candidates.map((c) => ({ key: c.pathname, content: c.content, mimetype: c.mimetype })), mimetypes);
168
+ if (r.status !== 200)
169
+ return { status: r.status, matches: [] };
170
+ matches = r.matches.map((m) => ({ pathname: m.key, span: m.span, ...(m.path !== undefined ? { path: m.path } : {}) }));
171
+ }
172
+ if (statement.lineMarker !== null) {
173
+ const page = EntryFind.#paginate(matches, LineMarkerOps.firstLast(statement.lineMarker));
174
+ if (page.status !== 200)
175
+ return { status: page.status, matches: [] };
176
+ matches = page.items ?? [];
177
+ }
178
+ return { status: 200, matches };
179
+ }
180
+ // FIND result = the scheme's catalog rows, filtered to the matched entries and kept in
181
+ // match order. A catalog row is exactly what the manifest catalogs (path + per-channel
182
+ // {mimetype, tokens, lines}, tags, seconds) — FIND is the filtered, navigable slice of
183
+ // that catalog, rendered as a JSON array (application/json). §find-result-catalog-rows
184
+ static async findSessionEntries(statement, ctx, manifest) {
185
+ const match = await EntryFind.#matchPathnames(statement, ctx, manifest);
186
+ if (match.status !== 200)
187
+ return { status: match.status, content: null, mimetype: null, results: [], itemsTokenTotal: 0, pathnames: [], matches: [] };
188
+ const scheme = manifest.storedScheme === undefined ? manifest.name : manifest.storedScheme;
189
+ // The catalog row is keyed by its addressable path; align each match to its row through
190
+ // the same EntryManifest.toPath the catalog uses (single source of truth). Match order is
191
+ // preserved (rank for ~semantic); a match whose entry has no row (e.g. the self-excluded
192
+ // manifest) drops out. Each match becomes ONE result item carrying its span (#286).
193
+ // §run-scheme — a run-scope FIND aligns to the building run's OWN run-scope catalog rows
194
+ // (the owner prefix the candidate scope already enforced), never the session filesystem.
195
+ const runOwnerPrefix = manifest.scope === "run" ? EntryFind.#runOwnerPrefix(statement) : undefined;
196
+ const byPath = new Map((await EntryManifest.catalogRowsFor(ctx, scheme, runOwnerPrefix)).map((r) => [r.path, r]));
197
+ const results = [];
198
+ const matches = [];
199
+ const seenPath = new Set();
200
+ let itemsTokenTotal = 0; // content weight summed per UNIQUE entry (items repeat a file across its matches)
201
+ // Two granularities from one hit list (§matcher-selection-signal ÷ #286): `results` (the
202
+ // rx the model reads) keeps EVERY hit — on a single-line document the per-hit matchPath is
203
+ // the only thing distinguishing them; `matches` (the fan-out's delivery list) dedups by
204
+ // (pathname, span) — N hits on one source line deliver that line ONCE, no identical-row noise.
205
+ const seenSpan = new Set();
206
+ for (const m of match.matches) {
207
+ const row = byPath.get(EntryManifest.toPath(scheme, m.pathname));
208
+ if (row === undefined)
209
+ continue;
210
+ results.push(m.span !== null ? { ...row, matchSpan: m.span, ...(m.path !== undefined ? { matchPath: m.path } : {}) } : row);
211
+ const spanKey = `${m.pathname}\0${m.span === null ? "" : `${m.span.lineStart},${m.span.lineEnd}`}`;
212
+ if (!seenSpan.has(spanKey)) {
213
+ seenSpan.add(spanKey);
214
+ matches.push(m);
215
+ }
216
+ if (!seenPath.has(m.pathname)) {
217
+ seenPath.add(m.pathname);
218
+ itemsTokenTotal += Object.values(row.channels).reduce((s, c) => s + c.tokens, 0);
219
+ }
220
+ }
221
+ // Compact JSON — the model parses it natively; the `null, 2` pretty-print was ~36%
222
+ // whitespace of the catalog body, tokens the wire doesn't need.
223
+ return { status: 200, content: JSON.stringify(results), mimetype: "application/json", results, itemsTokenTotal, pathnames: [...seenPath], matches };
224
+ }
225
+ }
226
+ //# sourceMappingURL=_entry-find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-find.js","sourceRoot":"","sources":["../../src/schemes/_entry-find.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ -- FIND / multi-entry OPEN / FOLD candidate selection for entry-bearing
2
+ -- schemes (SPEC §find; plurnk.md FIND row).
3
+ --
4
+ -- Scope (target) + tag filters ONLY. The body matcher does NOT belong here:
5
+ -- per plurnk.md §"Body matcher dispatch" it runs against entry CONTENT, which
6
+ -- needs the mimetypes daughter (xpath/jsonpath/regex/glob over structured
7
+ -- content) — so the body match runs in JS (Matcher.matchAgainstContent) over
8
+ -- the default-channel content this query returns. Static query handles every
9
+ -- filter combination via IS-NULL guards (per SqlRite LLMS.md §channels).
10
+
11
+ -- PREP: find_session_entry_candidates
12
+ -- $channel: default-channel name whose content the body matcher runs against
13
+ -- $scope_pathname: pathname-prefix glob (e.g., "foo/*") or NULL for no prefix
14
+ -- $tags: JSON string of tag list (e.g., '["a","b"]'); '[]' or NULL for no tag filter
15
+ SELECT e.id AS entry_id, e.pathname, ec.content, ec.mimetype
16
+ FROM entries e
17
+ JOIN entry_channels ec ON ec.entry_id = e.id AND ec.name = $channel
18
+ WHERE e.scope = 'session'
19
+ AND e.session_id = $session_id
20
+ AND e.scheme IS $scheme
21
+ AND ($scope_pathname IS NULL OR e.pathname GLOB $scope_pathname)
22
+ AND (
23
+ json_array_length(COALESCE($tags, '[]')) = 0
24
+ OR e.id IN (
25
+ SELECT entry_id FROM entry_tags
26
+ WHERE tag IN (SELECT value FROM json_each(COALESCE($tags, '[]')))
27
+ GROUP BY entry_id
28
+ HAVING COUNT(DISTINCT tag) = json_array_length(COALESCE($tags, '[]'))
29
+ )
30
+ )
31
+ ORDER BY e.pathname;
32
+
33
+ -- PREP: find_run_entry_candidates
34
+ -- §run-scheme — run-scope FIND, byte-identical to find_session_entry_candidates BUT scope='run'.
35
+ -- The owner narrowing rides $scope_pathname (Run.find folds the owner into the prefix glob —
36
+ -- `/<owner>/*`), so a run reaches only its own (self) or a named sister's scratch. Additive: the
37
+ -- session query above is untouched (§run-scheme Inc-1).
38
+ SELECT e.id AS entry_id, e.pathname, ec.content, ec.mimetype
39
+ FROM entries e
40
+ JOIN entry_channels ec ON ec.entry_id = e.id AND ec.name = $channel
41
+ WHERE e.scope = 'run'
42
+ AND e.session_id = $session_id
43
+ AND e.scheme IS $scheme
44
+ AND ($scope_pathname IS NULL OR e.pathname GLOB $scope_pathname)
45
+ AND (
46
+ json_array_length(COALESCE($tags, '[]')) = 0
47
+ OR e.id IN (
48
+ SELECT entry_id FROM entry_tags
49
+ WHERE tag IN (SELECT value FROM json_each(COALESCE($tags, '[]')))
50
+ GROUP BY entry_id
51
+ HAVING COUNT(DISTINCT tag) = json_array_length(COALESCE($tags, '[]'))
52
+ )
53
+ )
54
+ ORDER BY e.pathname;
@@ -0,0 +1,16 @@
1
+ import type { Db } from "../core/Db.ts";
2
+ import type { MimeSymbol, MimeRef } from "@plurnk/plurnk-mimetypes";
3
+ export default class EntryGraph {
4
+ #private;
5
+ static populateFrom(db: Db, sessionId: number, entryId: number, symbols: readonly MimeSymbol[], references: readonly MimeRef[]): Promise<void>;
6
+ static match(db: Db, sessionId: number, scheme: string | null, raw: string): Promise<{
7
+ status: number;
8
+ matches: GraphMatch[];
9
+ }>;
10
+ }
11
+ export interface GraphMatch {
12
+ pathname: string;
13
+ lineStart: number;
14
+ lineEnd: number;
15
+ }
16
+ //# sourceMappingURL=_entry-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-graph.d.ts","sourceRoot":"","sources":["../../src/schemes/_entry-graph.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,CAAC,OAAO,OAAO,UAAU;;IAI3B,OAAa,YAAY,CACrB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC1C,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,OAAO,EAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAef;IAMD,OAAa,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAmBpI;CAoCJ;AAID,MAAM,WAAW,UAAU;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE"}
@@ -0,0 +1,94 @@
1
+ // @graph (plurnk-service#186) — the symbol index behind the FIND `graph` dialect
2
+ // (@<sym referrers / @>sym referents / @sym neighborhood). Files are first-class
3
+ // channel-backed entries, so the index is uniform across known:/// and file:/// with
4
+ // no scheme special-casing. Traversal is kind-agnostic; 1-hop (the grammar's
5
+ // `@<sym` surface). Cross-entry resolution is name-match (ctags-grade-plus per #186).
6
+ //
7
+ // Derivation does NOT happen at write — a scheme write never invokes the mimetypes
8
+ // handler (§mimetype). The engine extracts symbols+references once per entry at manifest-add
9
+ // (EntryManifest.buildManifestBody) and hands them here via populateFrom; this module
10
+ // only owns the relational index (insert + the @</@>/@ resolution).
11
+ export default class EntryGraph {
12
+ // Replace an entry's graph rows with the given extracted symbols/references
13
+ // (delete-then-insert, so empty arrays clear a now-empty/binary/non-code entry
14
+ // to zero rows). Caller has already run the handler; this is pure storage.
15
+ static async populateFrom(db, sessionId, entryId, symbols, references) {
16
+ await db.graph_delete_defs.run({ entry_id: entryId });
17
+ await db.graph_delete_refs.run({ entry_id: entryId });
18
+ for (const s of symbols) {
19
+ await db.graph_insert_def.run({
20
+ session_id: sessionId, entry_id: entryId, name: s.name, kind: s.kind,
21
+ container: s.container ?? null, line: s.line, end_line: s.endLine ?? null,
22
+ });
23
+ }
24
+ for (const r of references) {
25
+ await db.graph_insert_ref.run({
26
+ session_id: sessionId, entry_id: entryId, name: r.name, kind: r.kind,
27
+ container: r.container ?? null, line: r.line, col: r.column ?? null,
28
+ });
29
+ }
30
+ }
31
+ // Resolve a FIND graph-dialect body (`@<sym` / `@>sym` / `@sym`) to matches within
32
+ // (session, scheme). Each match is a (pathname, span) — the reference's line (@<) or
33
+ // the symbol's def span (@> / def side of @) — so a matcher resolves to (file, span)
34
+ // uniformly with every other dialect (#286). Malformed → 400.
35
+ static async match(db, sessionId, scheme, raw) {
36
+ const m = /^@([<>]?)(.+)$/.exec(raw.trim());
37
+ if (m === null)
38
+ return { status: 400, matches: [] };
39
+ const direction = m[1];
40
+ const name = m[2].trim();
41
+ if (name.length === 0)
42
+ return { status: 400, matches: [] };
43
+ if (direction === "<")
44
+ return { status: 200, matches: await EntryGraph.#referrers(db, sessionId, scheme, name) };
45
+ if (direction === ">")
46
+ return { status: 200, matches: await EntryGraph.#referents(db, sessionId, scheme, name) };
47
+ // @sym neighborhood: the def ∪ referrers ∪ referents, deduped by (pathname, span).
48
+ return {
49
+ status: 200,
50
+ matches: EntryGraph.#dedupe([
51
+ ...await EntryGraph.#defs(db, sessionId, scheme, name),
52
+ ...await EntryGraph.#referrers(db, sessionId, scheme, name),
53
+ ...await EntryGraph.#referents(db, sessionId, scheme, name),
54
+ ]),
55
+ };
56
+ }
57
+ static #dedupe(matches) {
58
+ const seen = new Set();
59
+ const out = [];
60
+ for (const m of matches) {
61
+ const key = `${m.pathname}\0${m.lineStart}\0${m.lineEnd}`;
62
+ if (!seen.has(key)) {
63
+ seen.add(key);
64
+ out.push(m);
65
+ }
66
+ }
67
+ return out.sort((a, b) => a.pathname.localeCompare(b.pathname) || a.lineStart - b.lineStart);
68
+ }
69
+ static async #referrers(db, sessionId, scheme, name) {
70
+ const rows = await db.graph_referrers.all({ session_id: sessionId, scheme, name });
71
+ return rows.map((r) => ({ pathname: r.pathname, lineStart: r.line, lineEnd: r.end_line }));
72
+ }
73
+ static async #defs(db, sessionId, scheme, name) {
74
+ const rows = await db.graph_def_pathnames_by_name.all({ session_id: sessionId, scheme, name });
75
+ return rows.map((r) => ({ pathname: r.pathname, lineStart: r.line, lineEnd: r.end_line }));
76
+ }
77
+ // @>sym: sym's def(s) → the target names those defs reference → those targets'
78
+ // defining entries (with their def spans). The def's full qualified path is the @> join key (#186).
79
+ static async #referents(db, sessionId, scheme, name) {
80
+ const defs = await db.graph_resolve_def.all({ session_id: sessionId, name });
81
+ const targets = new Set();
82
+ for (const d of defs) {
83
+ const qualified = d.container === null ? name : `${d.container}.${name}`;
84
+ const refs = await db.graph_refs_from_source.all({ session_id: sessionId, entry_id: d.entry_id, container: qualified });
85
+ for (const r of refs)
86
+ targets.add(r.name);
87
+ }
88
+ const out = [];
89
+ for (const t of targets)
90
+ out.push(...await EntryGraph.#defs(db, sessionId, scheme, t));
91
+ return EntryGraph.#dedupe(out);
92
+ }
93
+ }
94
+ //# sourceMappingURL=_entry-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-graph.js","sourceRoot":"","sources":["../../src/schemes/_entry-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ -- @graph (plurnk-service#186) — symbol_defs/refs population + @< / @> / @
2
+ -- resolution. Populated delete-then-insert per entry at EntryCrud.writeEntry;
3
+ -- queried by the FIND `graph` dialect via EntryGraph. Traversal is kind-agnostic
4
+ -- (every ref is an edge; `kind` is edge metadata, never filtered here). 1-hop —
5
+ -- the grammar's `@<sym` surface is single-hop; WITH RECURSIVE the day it grows one.
6
+
7
+ -- PREP: graph_delete_defs
8
+ DELETE FROM symbol_defs WHERE entry_id = $entry_id;
9
+
10
+ -- PREP: graph_delete_refs
11
+ DELETE FROM symbol_refs WHERE entry_id = $entry_id;
12
+
13
+ -- PREP: graph_insert_def
14
+ INSERT INTO symbol_defs (session_id, entry_id, name, kind, container, line, end_line)
15
+ VALUES ($session_id, $entry_id, $name, $kind, $container, $line, $end_line);
16
+
17
+ -- PREP: graph_insert_ref
18
+ INSERT INTO symbol_refs (session_id, entry_id, name, kind, container, line, col)
19
+ VALUES ($session_id, $entry_id, $name, $kind, $container, $line, $col);
20
+
21
+ -- PREP: graph_referrers
22
+ -- @<sym — entries (scheme-scoped) that reference sym, with each reference's line
23
+ -- (#286: a matcher resolves to (file, span) — one item per reference occurrence).
24
+ SELECT DISTINCT e.pathname, r.line AS line, r.line AS end_line
25
+ FROM symbol_refs r JOIN entries e ON e.id = r.entry_id
26
+ WHERE r.session_id = $session_id AND e.scheme IS $scheme AND r.name = $name
27
+ ORDER BY e.pathname, r.line;
28
+
29
+ -- PREP: graph_def_pathnames_by_name
30
+ -- Resolve a name → the defining entries' pathnames + def span (scheme-scoped). Serves
31
+ -- @>'s target resolution and @'s neighborhood def lookup. end_line falls back to line
32
+ -- when a def has no end (#286: the symbol's line..end_line is its (file, span)).
33
+ SELECT DISTINCT e.pathname, d.line AS line, COALESCE(d.end_line, d.line) AS end_line
34
+ FROM symbol_defs d JOIN entries e ON e.id = d.entry_id
35
+ WHERE d.session_id = $session_id AND e.scheme IS $scheme AND d.name = $name
36
+ ORDER BY e.pathname, d.line;
37
+
38
+ -- PREP: graph_resolve_def
39
+ -- sym → its def(s): (entry_id, container) to compose the qualified path for @>.
40
+ SELECT entry_id, container FROM symbol_defs
41
+ WHERE session_id = $session_id AND name = $name;
42
+
43
+ -- PREP: graph_refs_from_source
44
+ -- @>sym step — the target names sym's def references (its own ref rows, keyed
45
+ -- by the source def's full qualified path = the @> join semantics from #186).
46
+ SELECT DISTINCT name FROM symbol_refs
47
+ WHERE session_id = $session_id AND entry_id = $entry_id AND container IS $container;
48
+
49
+ -- PREP: graph_set_deep_hash
50
+ -- Stamp the body-content hash at the moment an entry's deep channels were
51
+ -- (re)derived. The next manifest-add pass skips the entry while the hash holds.
52
+ UPDATE entries SET deep_hash = $deep_hash WHERE id = $entry_id;
@@ -0,0 +1,25 @@
1
+ import type { PlurnkSchemeContext } from "../core/scheme-types.ts";
2
+ export type CatalogEntry = {
3
+ path: string;
4
+ seconds?: number;
5
+ tags?: string[];
6
+ channels: Record<string, {
7
+ mimetype: string;
8
+ tokens: number;
9
+ lines: number;
10
+ }>;
11
+ };
12
+ export default class EntryManifest {
13
+ #private;
14
+ static toPath(scheme: string | null, pathname: string): string;
15
+ static catalogRowsFor(ctx: PlurnkSchemeContext, schemeFilter?: string | null, runOwnerPrefix?: string): Promise<CatalogEntry[]>;
16
+ static deriveOne(ctx: PlurnkSchemeContext, r: {
17
+ entry_id: number;
18
+ pathname: string;
19
+ content: string;
20
+ mimetype: string;
21
+ }, hash: string, embedActive: boolean, maxChunks?: number): Promise<void>;
22
+ static deriveFtsCandidates(ctx: PlurnkSchemeContext, scheme: string | null, ftsQuery: string, cap: number): Promise<number>;
23
+ static maintainDerivations(ctx: PlurnkSchemeContext): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=_entry-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_entry-manifest.d.ts","sourceRoot":"","sources":["../../src/schemes/_entry-manifest.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAanE,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAE9J,MAAM,CAAC,OAAO,OAAO,aAAa;;IAG9B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa7D;IAQD,OAAa,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCpI;IAoBD,OAAa,SAAS,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpM;IAkED,OAAa,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBhI;IAED,OAAa,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDxE;CAEJ"}