@plurnk/plurnk-service 1.26.0 → 1.28.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 (293) hide show
  1. package/.env.defaults +16 -25
  2. package/SPEC.md +338 -263
  3. package/dist/build-info.json +1 -1
  4. package/dist/content/body-preview.d.ts +1 -0
  5. package/dist/content/body-preview.d.ts.map +1 -1
  6. package/dist/content/body-preview.js +7 -0
  7. package/dist/content/body-preview.js.map +1 -1
  8. package/dist/content/byte-view.d.ts +19 -2
  9. package/dist/content/byte-view.d.ts.map +1 -1
  10. package/dist/content/byte-view.js +67 -14
  11. package/dist/content/byte-view.js.map +1 -1
  12. package/dist/content/edit-receipt.js +1 -1
  13. package/dist/content/edit-receipt.js.map +1 -1
  14. package/dist/content/line-marker.d.ts +1 -0
  15. package/dist/content/line-marker.d.ts.map +1 -1
  16. package/dist/content/line-marker.js +6 -1
  17. package/dist/content/line-marker.js.map +1 -1
  18. package/dist/content/line-selection.d.ts +3 -1
  19. package/dist/content/line-selection.d.ts.map +1 -1
  20. package/dist/content/line-selection.js +27 -3
  21. package/dist/content/line-selection.js.map +1 -1
  22. package/dist/content/matcher.d.ts +9 -14
  23. package/dist/content/matcher.d.ts.map +1 -1
  24. package/dist/content/matcher.js +51 -45
  25. package/dist/content/matcher.js.map +1 -1
  26. package/dist/content/pattern-edits.d.ts +7 -26
  27. package/dist/content/pattern-edits.d.ts.map +1 -1
  28. package/dist/content/pattern-edits.js +54 -91
  29. package/dist/content/pattern-edits.js.map +1 -1
  30. package/dist/content/read-projector.d.ts +2 -1
  31. package/dist/content/read-projector.d.ts.map +1 -1
  32. package/dist/content/read-projector.js +42 -10
  33. package/dist/content/read-projector.js.map +1 -1
  34. package/dist/content/read-resolve.d.ts.map +1 -1
  35. package/dist/content/read-resolve.js +7 -4
  36. package/dist/content/read-resolve.js.map +1 -1
  37. package/dist/core/AdmittedTurnExecutor.d.ts +3 -1
  38. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  39. package/dist/core/AdmittedTurnExecutor.js +22 -7
  40. package/dist/core/AdmittedTurnExecutor.js.map +1 -1
  41. package/dist/core/BudgetReadout.d.ts +4 -4
  42. package/dist/core/BudgetReadout.d.ts.map +1 -1
  43. package/dist/core/BudgetReadout.js +26 -41
  44. package/dist/core/BudgetReadout.js.map +1 -1
  45. package/dist/core/ChannelWrite.d.ts +2 -3
  46. package/dist/core/ChannelWrite.d.ts.map +1 -1
  47. package/dist/core/ChannelWrite.js +21 -22
  48. package/dist/core/ChannelWrite.js.map +1 -1
  49. package/dist/core/ChannelWrite.sql +26 -0
  50. package/dist/core/ContextFit.d.ts +26 -0
  51. package/dist/core/ContextFit.d.ts.map +1 -0
  52. package/dist/core/ContextFit.js +56 -0
  53. package/dist/core/ContextFit.js.map +1 -0
  54. package/dist/core/DataStatementRunner.d.ts.map +1 -1
  55. package/dist/core/DataStatementRunner.js +1 -0
  56. package/dist/core/DataStatementRunner.js.map +1 -1
  57. package/dist/core/Dispatcher.d.ts +15 -2
  58. package/dist/core/Dispatcher.d.ts.map +1 -1
  59. package/dist/core/Dispatcher.js +148 -16
  60. package/dist/core/Dispatcher.js.map +1 -1
  61. package/dist/core/EditMutations.d.ts +5 -5
  62. package/dist/core/EditMutations.d.ts.map +1 -1
  63. package/dist/core/EditMutations.js +44 -50
  64. package/dist/core/EditMutations.js.map +1 -1
  65. package/dist/core/EditSequence.js +2 -2
  66. package/dist/core/EditSequence.js.map +1 -1
  67. package/dist/core/EmissionHead.d.ts +8 -0
  68. package/dist/core/EmissionHead.d.ts.map +1 -0
  69. package/dist/core/EmissionHead.js +29 -0
  70. package/dist/core/EmissionHead.js.map +1 -0
  71. package/dist/core/Engine.d.ts +1 -0
  72. package/dist/core/Engine.d.ts.map +1 -1
  73. package/dist/core/Engine.js +3 -0
  74. package/dist/core/Engine.js.map +1 -1
  75. package/dist/core/InferenceCall.js +2 -2
  76. package/dist/core/InferenceCall.js.map +1 -1
  77. package/dist/core/InferenceCall.sql +1 -0
  78. package/dist/core/LiveSubscription.d.ts +20 -0
  79. package/dist/core/LiveSubscription.d.ts.map +1 -0
  80. package/dist/core/LiveSubscription.js +68 -0
  81. package/dist/core/LiveSubscription.js.map +1 -0
  82. package/dist/core/LiveSubscriptions.d.ts +1 -0
  83. package/dist/core/LiveSubscriptions.d.ts.map +1 -1
  84. package/dist/core/LiveSubscriptions.js +8 -0
  85. package/dist/core/LiveSubscriptions.js.map +1 -1
  86. package/dist/core/LogBody.js +1 -1
  87. package/dist/core/LogBody.js.map +1 -1
  88. package/dist/core/LogEntryProjection.d.ts +1 -0
  89. package/dist/core/LogEntryProjection.d.ts.map +1 -1
  90. package/dist/core/LogEntryProjection.js +9 -0
  91. package/dist/core/LogEntryProjection.js.map +1 -1
  92. package/dist/core/LogWriter.d.ts +42 -0
  93. package/dist/core/LogWriter.d.ts.map +1 -1
  94. package/dist/core/LogWriter.js +11 -5
  95. package/dist/core/LogWriter.js.map +1 -1
  96. package/dist/core/LoopDriver.js +2 -1
  97. package/dist/core/LoopDriver.js.map +1 -1
  98. package/dist/core/LoopLifecycle.d.ts +2 -2
  99. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  100. package/dist/core/LoopLifecycle.js +2 -4
  101. package/dist/core/LoopLifecycle.js.map +1 -1
  102. package/dist/core/LoopLifecycle.sql +1 -6
  103. package/dist/core/MutationEffects.d.ts +1 -3
  104. package/dist/core/MutationEffects.d.ts.map +1 -1
  105. package/dist/core/MutationEffects.js +2 -1
  106. package/dist/core/MutationEffects.js.map +1 -1
  107. package/dist/core/PacketBuilder.d.ts +17 -4
  108. package/dist/core/PacketBuilder.d.ts.map +1 -1
  109. package/dist/core/PacketBuilder.js +80 -120
  110. package/dist/core/PacketBuilder.js.map +1 -1
  111. package/dist/core/PacketBuilder.sql +4 -12
  112. package/dist/core/PatternSelection.d.ts +5 -10
  113. package/dist/core/PatternSelection.d.ts.map +1 -1
  114. package/dist/core/PatternSelection.js +9 -16
  115. package/dist/core/PatternSelection.js.map +1 -1
  116. package/dist/core/ResourceMutations.d.ts +2 -4
  117. package/dist/core/ResourceMutations.d.ts.map +1 -1
  118. package/dist/core/ResourceMutations.js +2 -5
  119. package/dist/core/ResourceMutations.js.map +1 -1
  120. package/dist/core/ResourceSelector.d.ts +2 -2
  121. package/dist/core/ResourceSelector.d.ts.map +1 -1
  122. package/dist/core/ResourceSelector.js +64 -33
  123. package/dist/core/ResourceSelector.js.map +1 -1
  124. package/dist/core/ResourceTransfers.d.ts +2 -4
  125. package/dist/core/ResourceTransfers.d.ts.map +1 -1
  126. package/dist/core/ResourceTransfers.js +74 -50
  127. package/dist/core/ResourceTransfers.js.map +1 -1
  128. package/dist/core/SchemeRegistry.d.ts +1 -0
  129. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  130. package/dist/core/SchemeRegistry.js +11 -9
  131. package/dist/core/SchemeRegistry.js.map +1 -1
  132. package/dist/core/ServiceTeardown.d.ts +3 -2
  133. package/dist/core/ServiceTeardown.d.ts.map +1 -1
  134. package/dist/core/ServiceTeardown.js +17 -8
  135. package/dist/core/ServiceTeardown.js.map +1 -1
  136. package/dist/core/StopDeadline.d.ts +5 -0
  137. package/dist/core/StopDeadline.d.ts.map +1 -0
  138. package/dist/core/StopDeadline.js +20 -0
  139. package/dist/core/StopDeadline.js.map +1 -0
  140. package/dist/core/StrikeRail.d.ts.map +1 -1
  141. package/dist/core/StrikeRail.js +5 -1
  142. package/dist/core/StrikeRail.js.map +1 -1
  143. package/dist/core/ToolResources.d.ts.map +1 -1
  144. package/dist/core/ToolResources.js +11 -2
  145. package/dist/core/ToolResources.js.map +1 -1
  146. package/dist/core/TurnDispositionHandler.d.ts +4 -2
  147. package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
  148. package/dist/core/TurnDispositionHandler.js +24 -6
  149. package/dist/core/TurnDispositionHandler.js.map +1 -1
  150. package/dist/core/TurnMaterialization.d.ts +6 -2
  151. package/dist/core/TurnMaterialization.d.ts.map +1 -1
  152. package/dist/core/TurnMaterialization.js +64 -16
  153. package/dist/core/TurnMaterialization.js.map +1 -1
  154. package/dist/core/TurnOps.js +7 -7
  155. package/dist/core/TurnOps.js.map +1 -1
  156. package/dist/core/TurnRunner.d.ts +1 -0
  157. package/dist/core/TurnRunner.d.ts.map +1 -1
  158. package/dist/core/TurnRunner.js +155 -160
  159. package/dist/core/TurnRunner.js.map +1 -1
  160. package/dist/core/TurnRunner.sql +2 -2
  161. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  162. package/dist/core/caps/DbSubscriptionCaps.js +13 -19
  163. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  164. package/dist/core/content-hash.d.ts +1 -1
  165. package/dist/core/content-hash.d.ts.map +1 -1
  166. package/dist/core/content-hash.js.map +1 -1
  167. package/dist/core/env-catalog.js +2 -2
  168. package/dist/core/env-catalog.js.map +1 -1
  169. package/dist/core/fork.sql +4 -10
  170. package/dist/core/git-env.d.ts +1 -1
  171. package/dist/core/git-env.d.ts.map +1 -1
  172. package/dist/core/git-env.js +19 -12
  173. package/dist/core/git-env.js.map +1 -1
  174. package/dist/core/git-membership.d.ts.map +1 -1
  175. package/dist/core/git-membership.js +11 -5
  176. package/dist/core/git-membership.js.map +1 -1
  177. package/dist/core/git-state.js +1 -1
  178. package/dist/core/git-state.js.map +1 -1
  179. package/dist/core/mutation-types.d.ts +6 -4
  180. package/dist/core/mutation-types.d.ts.map +1 -1
  181. package/dist/core/operation-target-groups.d.ts +1 -1
  182. package/dist/core/operation-target-groups.d.ts.map +1 -1
  183. package/dist/core/operation-target-groups.js +27 -5
  184. package/dist/core/operation-target-groups.js.map +1 -1
  185. package/dist/core/packet-wire.d.ts +80 -10
  186. package/dist/core/packet-wire.d.ts.map +1 -1
  187. package/dist/core/packet-wire.js +211 -227
  188. package/dist/core/packet-wire.js.map +1 -1
  189. package/dist/core/provider-accounting.d.ts +1 -1
  190. package/dist/core/provider-accounting.d.ts.map +1 -1
  191. package/dist/core/provider-accounting.js +2 -1
  192. package/dist/core/provider-accounting.js.map +1 -1
  193. package/dist/digest/Digest.d.ts.map +1 -1
  194. package/dist/digest/Digest.js +3 -2
  195. package/dist/digest/Digest.js.map +1 -1
  196. package/dist/digest/DigestEvidence.d.ts +1 -0
  197. package/dist/digest/DigestEvidence.d.ts.map +1 -1
  198. package/dist/digest/DigestEvidence.js +6 -0
  199. package/dist/digest/DigestEvidence.js.map +1 -1
  200. package/dist/digest/DigestRender.d.ts +1 -0
  201. package/dist/digest/DigestRender.d.ts.map +1 -1
  202. package/dist/digest/DigestRender.js +107 -48
  203. package/dist/digest/DigestRender.js.map +1 -1
  204. package/dist/digest/DigestRequiem.js +4 -4
  205. package/dist/digest/DigestRequiem.js.map +1 -1
  206. package/dist/digest/digest-rows.d.ts +8 -0
  207. package/dist/digest/digest-rows.d.ts.map +1 -1
  208. package/dist/digest/digest-rows.js.map +1 -1
  209. package/dist/digest/digest.sql +20 -2
  210. package/dist/schemes/Exec.d.ts.map +1 -1
  211. package/dist/schemes/Exec.js +28 -27
  212. package/dist/schemes/Exec.js.map +1 -1
  213. package/dist/schemes/File.d.ts.map +1 -1
  214. package/dist/schemes/File.js +1 -2
  215. package/dist/schemes/File.js.map +1 -1
  216. package/dist/schemes/Log.d.ts.map +1 -1
  217. package/dist/schemes/Log.js +4 -17
  218. package/dist/schemes/Log.js.map +1 -1
  219. package/dist/schemes/TurnSource.js +2 -2
  220. package/dist/schemes/TurnSource.js.map +1 -1
  221. package/dist/schemes/_derivation-use.d.ts +7 -0
  222. package/dist/schemes/_derivation-use.d.ts.map +1 -0
  223. package/dist/schemes/_derivation-use.js +40 -0
  224. package/dist/schemes/_derivation-use.js.map +1 -0
  225. package/dist/schemes/_entry-crud.d.ts +6 -1
  226. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  227. package/dist/schemes/_entry-crud.js.map +1 -1
  228. package/dist/schemes/_entry-find.d.ts.map +1 -1
  229. package/dist/schemes/_entry-find.js +15 -49
  230. package/dist/schemes/_entry-find.js.map +1 -1
  231. package/dist/schemes/_entry-find.sql +0 -11
  232. package/dist/schemes/_entry-fts.d.ts.map +1 -1
  233. package/dist/schemes/_entry-fts.js +9 -3
  234. package/dist/schemes/_entry-fts.js.map +1 -1
  235. package/dist/schemes/_entry-fts.sql +14 -8
  236. package/dist/schemes/_entry-graph.d.ts +5 -8
  237. package/dist/schemes/_entry-graph.d.ts.map +1 -1
  238. package/dist/schemes/_entry-graph.js +33 -72
  239. package/dist/schemes/_entry-graph.js.map +1 -1
  240. package/dist/schemes/_entry-graph.sql +30 -48
  241. package/dist/schemes/_entry-manifest.d.ts +5 -0
  242. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  243. package/dist/schemes/_entry-manifest.js +5 -0
  244. package/dist/schemes/_entry-manifest.js.map +1 -1
  245. package/dist/schemes/_entry-ops.d.ts +1 -1
  246. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  247. package/dist/schemes/_entry-ops.js +4 -11
  248. package/dist/schemes/_entry-ops.js.map +1 -1
  249. package/dist/schemes/_search-index.d.ts +10 -0
  250. package/dist/schemes/_search-index.d.ts.map +1 -1
  251. package/dist/schemes/_search-index.js +33 -1
  252. package/dist/schemes/_search-index.js.map +1 -1
  253. package/dist/schemes/exec-lifetime.d.ts.map +1 -1
  254. package/dist/schemes/exec-lifetime.js +1 -2
  255. package/dist/schemes/exec-lifetime.js.map +1 -1
  256. package/dist/server/Daemon.d.ts +2 -1
  257. package/dist/server/Daemon.d.ts.map +1 -1
  258. package/dist/server/Daemon.js +31 -35
  259. package/dist/server/Daemon.js.map +1 -1
  260. package/dist/server/DrainSupervisor.d.ts +2 -1
  261. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  262. package/dist/server/DrainSupervisor.js +37 -56
  263. package/dist/server/DrainSupervisor.js.map +1 -1
  264. package/dist/server/Functionality.d.ts +1 -1
  265. package/dist/server/Functionality.d.ts.map +1 -1
  266. package/dist/server/Functionality.js +24 -11
  267. package/dist/server/Functionality.js.map +1 -1
  268. package/dist/server/FunctionalityManager.js +2 -2
  269. package/dist/server/FunctionalityManager.js.map +1 -1
  270. package/dist/server/Retention.d.ts.map +1 -1
  271. package/dist/server/Retention.js +7 -3
  272. package/dist/server/Retention.js.map +1 -1
  273. package/dist/server/drain.sql +0 -6
  274. package/dist/server/seam-loop.sql +1 -1
  275. package/dist/service.js +1 -1
  276. package/dist/service.js.map +1 -1
  277. package/docs/env.md +4 -3
  278. package/migrations/013_graph_regions.sql +32 -0
  279. package/migrations/014_stream_timing.sql +4 -0
  280. package/migrations/015_request_evidence.sql +4 -0
  281. package/package.json +34 -34
  282. package/dist/core/KnownToxins.d.ts +0 -4
  283. package/dist/core/KnownToxins.d.ts.map +0 -1
  284. package/dist/core/KnownToxins.js +0 -22
  285. package/dist/core/KnownToxins.js.map +0 -1
  286. package/dist/core/ReasoningView.d.ts +0 -12
  287. package/dist/core/ReasoningView.d.ts.map +0 -1
  288. package/dist/core/ReasoningView.js +0 -40
  289. package/dist/core/ReasoningView.js.map +0 -1
  290. package/dist/server/exec-poll-backoff.d.ts +0 -2
  291. package/dist/server/exec-poll-backoff.d.ts.map +0 -1
  292. package/dist/server/exec-poll-backoff.js +0 -6
  293. package/dist/server/exec-poll-backoff.js.map +0 -1
@@ -1,4 +1,4 @@
1
- // {§matcher-dispatch} Core candidate-set composition over the public schemes
1
+ // {§matcher-dispatch} {§matcher-selection-signal} {§matcher-index-readiness} Core candidate-set composition over the public schemes
2
2
  // matcher adapter. Mimetypes owns content-dialect execution and evidence; the
3
3
  // adapter owns operation-result mapping; this layer preserves caller identity
4
4
  // across heterogeneous entry/log candidate sets.
@@ -7,17 +7,61 @@
7
7
  // expression; 203 = source unparseable for its mimetype → raw bytes as text so the model
8
8
  // can fall back to regex/visual parsing (SPEC {§matcher-dispatch}).
9
9
  import { Problems } from "@plurnk/plurnk-contracts";
10
- import { TextCoordinates } from "@plurnk/plurnk-mimetypes";
11
10
  import { Matcher as SchemeMatcher, } from "@plurnk/plurnk-schemes";
12
11
  import ErrorDetail from "../core/ErrorDetail.js";
13
12
  import PatternEdits from "./pattern-edits.js";
13
+ import SearchIndex from "../schemes/_search-index.js";
14
+ import EntryFts from "../schemes/_entry-fts.js";
15
+ import EntryGraph from "../schemes/_entry-graph.js";
16
+ import { resolveSearchCandidates } from "../schemes/_search-candidate.js";
17
+ import LineSelection from "./line-selection.js";
14
18
  export default class Matcher {
19
+ static async matchResource(body, source, ctx) {
20
+ if (ctx.mimetypes === undefined)
21
+ throw new Error("Resource matching requires mimetypes");
22
+ const { target, mimetype, visibleLines } = source;
23
+ const content = visibleLines === undefined ? source.content : LineSelection.retain(source.content, visibleLines).content;
24
+ let result;
25
+ if (body.dialect !== "fts" && body.dialect !== "graph") {
26
+ result = await Matcher.matchAgainstContent(PatternEdits.lineAnchored(body), content, mimetype, ctx.mimetypes);
27
+ }
28
+ else {
29
+ const scheme = target.kind === "url" ? target.scheme : "file";
30
+ result = await SearchIndex.snapshot(ctx, {
31
+ content, mimetype, scheme, pathname: target.kind === "url" ? target.pathname : target.raw,
32
+ }, async (snapshot) => {
33
+ if (snapshot.disposition === "excluded" || snapshot.disposition === "failed") {
34
+ return { status: 422, problem: Problems.create("schemes:matcher", "search-unavailable", 422, `The selected representation is not indexed: ${snapshot.reason ?? snapshot.disposition}.`) };
35
+ }
36
+ const candidates = [{ key: target.raw, deepHash: snapshot.deepHash }];
37
+ if (body.dialect === "fts") {
38
+ const ranked = await EntryFts.rankCandidates(ctx.db, candidates, body.raw.slice(1), ctx.signal);
39
+ return { ...ranked, matches: ranked.matches.flatMap(({ matches }) => matches) };
40
+ }
41
+ else {
42
+ await ctx.settleDerivations?.();
43
+ const rows = scheme === "log"
44
+ ? await ctx.db.log_find_candidates.all({ worker_id: ctx.workerId, scope_prefix: null, max_id: null })
45
+ : scheme === "ops" || scheme === "reasoning" || scheme === "note"
46
+ ? await ctx.db.turn_source_candidates.all({ workspace_id: ctx.workspaceId, worker_name: target.kind === "url" ? target.hostname : null, kind: scheme })
47
+ .then((sources) => sources.filter(({ pathname }) => !/^\/\d+$/.test(pathname)))
48
+ : await ctx.db.find_workspace_derivation_candidates.all({ workspace_id: ctx.workspaceId });
49
+ const universe = resolveSearchCandidates(rows.map(({ deep_hash }, index) => ({ key: String(index), deepHash: deep_hash })));
50
+ if (universe.state !== "ready")
51
+ return { status: 503, problem: Problems.create("schemes:matcher", "search-index-incomplete", 503, "The relationship index is incomplete.", { retryable: true }) };
52
+ const graph = await EntryGraph.matchCandidates(ctx.db, [...universe.candidates, ...candidates], candidates, body.raw);
53
+ return { ...graph, matches: graph.matches.flatMap(({ matches }) => matches) };
54
+ }
55
+ });
56
+ }
57
+ if (result.status >= 300 || result.status === 203)
58
+ return result;
59
+ const matches = visibleLines === undefined ? result.matches : LineSelection.evidence(result.matches ?? [], visibleLines);
60
+ return { ...result, status: matches?.length ? 200 : 204, matches };
61
+ }
15
62
  static async matchAgainstContent(body, content, mimetype, mimetypes) {
16
- // ~full-text and &graph resolve to resource selections with coordinate
17
- // evidence through FIND's persistent index, never through this content
18
- // matcher. Reaching here with a relation dialect is a routing bug.
19
63
  if (body.dialect === "fts" || body.dialect === "graph")
20
- throw new Error(`matchAgainstContent is content-only; ${body.dialect} must resolve through FIND`);
64
+ throw new Error(`matchAgainstContent is content-only; ${body.dialect} requires the indexed matcher`);
21
65
  return SchemeMatcher.matchAgainstContent(body, content, mimetype, mimetypes, (value) => ErrorDetail.preview(value));
22
66
  }
23
67
  // {§find-source-agnostic} — apply a content matcher to a list of candidates from ANY source
@@ -29,7 +73,7 @@ export default class Matcher {
29
73
  // failure ends the whole operation; 204 no-match and 203 unlocated-match
30
74
  // candidates simply drop out. A regex anchors each line ({§find-line-anchors}).
31
75
  static async matchCandidates(body, candidates, mimetypes) {
32
- const lineBody = PatternEdits.lineLimited(body);
76
+ const lineBody = PatternEdits.lineAnchored(body);
33
77
  const matches = [];
34
78
  let queryable = 0;
35
79
  let unsupported;
@@ -73,43 +117,5 @@ export default class Matcher {
73
117
  }
74
118
  return { status: 200, matches };
75
119
  }
76
- // Project relation findings into honest text regions a scoped READ accepts,
77
- // then group every finding on its resource.
78
- static addTextRegions(matches, candidates) {
79
- const byKey = new Map(candidates.map((candidate) => [candidate.key, candidate]));
80
- const grouped = new Map();
81
- const order = [];
82
- for (const match of matches) {
83
- if (!grouped.has(match.key))
84
- order.push(match.key);
85
- const findings = grouped.get(match.key) ?? [];
86
- findings.push(match);
87
- grouped.set(match.key, findings);
88
- }
89
- const resolved = [];
90
- for (const key of order) {
91
- const findings = grouped.get(key) ?? [];
92
- const candidate = byKey.get(key);
93
- if (candidate === undefined)
94
- throw new Error(`Matcher.addTextRegions: matched candidate ${key} has no readable projection`);
95
- resolved.push({
96
- key,
97
- matches: findings.flatMap((match) => {
98
- if (match.span === null) {
99
- return match.locator === undefined ? [] : [{ locator: match.locator }];
100
- }
101
- const region = TextCoordinates.lineRegion(candidate.content, match.span.lineStart, match.span.lineEnd);
102
- if (region === null) {
103
- throw new Error(`Matcher.addTextRegions: ${key} span ${match.span.lineStart}-${match.span.lineEnd} is outside the readable text`);
104
- }
105
- return [{
106
- ...(match.locator === undefined ? {} : { locator: match.locator }),
107
- region,
108
- }];
109
- }),
110
- });
111
- }
112
- return resolved;
113
- }
114
120
  }
115
121
  //# sourceMappingURL=matcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,sFAAsF;AACtF,yFAAyF;AACzF,oEAAoE;AAEpE,OAAO,EAAE,QAAQ,EAAoB,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAkB,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EACH,OAAO,IAAI,aAAa,GAI3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAI9C,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAC5B,IAAiB,EACjB,OAAe,EACf,QAAgB,EAChB,SAAoB;QAEpB,uEAAuE;QACvE,uEAAuE;QACvE,mEAAmE;QACnE,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,OAAO,4BAA4B,CAAC,CAAC;QAC1J,OAAO,aAAa,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACxH,CAAC;IAED,4FAA4F;IAC5F,8EAA8E;IAC9E,0EAA0E;IAC1E,4DAA4D;IAC5D,4FAA4F;IAC5F,0EAA0E;IAC1E,yEAAyE;IACzE,gFAAgF;IAChF,MAAM,CAAC,KAAK,CAAC,eAAe,CACxB,IAAiB,EACjB,UAA6E,EAC7E,SAAoB;QAEpB,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAuC,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5B,8EAA8E;YAC9E,wEAAwE;YACxE,6EAA6E;YAC7E,uEAAuE;YACvE,uEAAuE;YACvE,mBAAmB;YACnB,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACD,KAAK,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAChG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,4BAA4B,EAAE,KAAK,CAAC,CAAC;gBAC/F,WAAW,KAAK,QAAQ,CAAC,MAAM,CAC3B,WAAW,EACX,iBAAiB,EACjB,GAAG,EACH,OAAO,IAAI,CAAC,QAAQ,8BAA8B,IAAI,CAAC,GAAG,IAAI;sBACxD,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAC9D,EAAE,EACF,EAAE,KAAK,EAAE,yBAAyB,EAAE,CACvC,CAAC;gBACF,SAAS;YACb,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAClF,CAAC;gBACD,WAAW,KAAK,KAAK,CAAC,OAAO,CAAC;gBAC9B,SAAS;YACb,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;gBAC9F,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YACzE,CAAC;YACD,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;gBAAE,SAAS;YACnC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,SAAS,KAAK,CAAC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAED,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,CAAC,cAAc,CACjB,OAAwC,EACxC,UAA2D;QAE3D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAU,CAAC,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;QAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,6BAA6B,CAAC,CAAC;YAC5H,QAAQ,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAmB,EAAE;oBACjD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;wBACtB,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3E,CAAC;oBACD,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CACrC,SAAS,CAAC,OAAO,EACjB,KAAK,CAAC,IAAI,CAAC,SAAS,EACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CACrB,CAAC;oBACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAClB,MAAM,IAAI,KAAK,CACX,2BAA2B,GAAG,SAAS,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,+BAA+B,CACnH,CAAC;oBACN,CAAC;oBACD,OAAO,CAAC;4BACJ,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;4BAClE,MAAM;yBACT,CAAC,CAAC;gBACP,CAAC,CAAC;aACL,CAAC,CAAC;QACP,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { MatcherBody } from "@plurnk/plurnk-contracts";
1
+ import type { MatcherBody, TextRegion } from "@plurnk/plurnk-contracts";
2
2
  import type { MatchEvidence } from "@plurnk/plurnk-schemes";
3
3
  import type { DispatchResult } from "../core/mutation-types.ts";
4
4
  export type PatternEdit = {
@@ -7,37 +7,18 @@ export type PatternEdit = {
7
7
  };
8
8
  readonly body: string;
9
9
  };
10
- export type PatternSpan = {
11
- readonly line: number;
12
- readonly startColumn: number;
13
- readonly endLine: number;
14
- readonly endColumn: number;
15
- };
16
10
  export default class PatternEdits {
17
- static lineLimited(matcher: MatcherBody): MatcherBody;
18
- static findOnly(matcher: MatcherBody & {
19
- dialect: "fts" | "graph";
20
- }, operation: string, target: string): {
21
- detail: string;
22
- recovery: string;
23
- };
11
+ static lineAnchored(matcher: MatcherBody): MatcherBody;
24
12
  static lines(evidence: ReadonlyArray<MatchEvidence>, bounds: {
25
13
  from: number;
26
14
  to: number;
27
15
  } | null): number[];
28
- static spans(matcher: MatcherBody, content: string, evidence: ReadonlyArray<MatchEvidence>, bounds: {
29
- from: number;
30
- to: number;
31
- } | null): PatternSpan[] | {
32
- readonly error: string;
33
- };
34
- static replacements(spans: readonly PatternSpan[], body: string): PatternEdit[];
16
+ static visible(evidence: readonly MatchEvidence[], lines: readonly number[], window?: TextRegion): MatchEvidence[];
17
+ static spans(evidence: readonly MatchEvidence[], bounds: TextRegion | null): TextRegion[];
18
+ static replacements(spans: readonly TextRegion[], body: string): PatternEdit[];
19
+ static text(content: string, spans: readonly TextRegion[]): string;
35
20
  static touchedLines(edits: readonly PatternEdit[]): number[];
36
- static deletions(lines: readonly number[]): PatternEdit[];
37
- static bounds(marks: readonly number[] | undefined, lineCount: number): {
38
- from: number;
39
- to: number;
40
- } | null | {
21
+ static bounds(marks: readonly number[] | undefined, content: string): TextRegion | null | {
41
22
  readonly error: string;
42
23
  };
43
24
  static compactReceipt(result: DispatchResult, matched: number): DispatchResult;
@@ -1 +1 @@
1
- {"version":3,"file":"pattern-edits.d.ts","sourceRoot":"","sources":["../../src/content/pattern-edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAOhE,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtI,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExI,MAAM,CAAC,OAAO,OAAO,YAAY;IAG7B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAGpD;IAKD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAA;KAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAU5I;IAGD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,MAAM,EAAE,CAU1G;IAMD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,WAAW,EAAE,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAiCnL;IAED,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAE9E;IAGD,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAO3D;IAED,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,EAAE,CAExD;IAID,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAcvI;IAID,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAS7E;CACJ"}
1
+ {"version":3,"file":"pattern-edits.d.ts","sourceRoot":"","sources":["../../src/content/pattern-edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAMhE,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtI,MAAM,CAAC,OAAO,OAAO,YAAY;IAE7B,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAGrD;IAGD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,MAAM,EAAE,CAY1G;IAGD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,EAAE,CAejH;IAGD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,UAAU,EAAE,CASxF;IAED,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAE7E;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAMjE;IAGD,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAK3D;IAGD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAQnH;IAID,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAS7E;CACJ"}
@@ -1,34 +1,22 @@
1
1
  import { TextCoordinates } from "@plurnk/plurnk-mimetypes";
2
2
  import { assertEditBatchReceipt, projectEditReceipt } from "./edit-receipt.js";
3
+ import LineMarkerOps from "./line-marker.js";
3
4
  export default class PatternEdits {
4
- // A pattern operation works line by line, so a regex anchors each line: `^` and `$` mean the
5
- // line's ends, as they do in a FIND over one line.
6
- static lineLimited(matcher) {
5
+ // {§read-pattern} Anchors refer to source lines; matches may still span lines.
6
+ static lineAnchored(matcher) {
7
7
  if (matcher.dialect !== "regex" || matcher.flags.includes("m"))
8
8
  return matcher;
9
9
  return { ...matcher, flags: `${matcher.flags}m` };
10
10
  }
11
- // {§pattern-dialect-find-only} — `~` and `&` locate across resources and only FIND takes them; the
12
- // refusal says so and gives both working forms: the FIND with the model's own matcher, and the
13
- // same operation with a text pattern for the words or symbol it named.
14
- static findOnly(matcher, operation, target) {
15
- const words = matcher.dialect === "graph"
16
- ? [matcher.raw.replace(/^&[<>]?/u, "").trim()]
17
- : matcher.raw.slice(1).trim().split(/\s+/u).filter((word) => word !== "");
18
- const text = `/${words.map((word) => word.replace(/[.*+?^${}()|[\]\\/]/gu, "\\$&")).join("|")}/`;
19
- const kind = matcher.dialect === "graph" ? "&graph" : "~full-text";
20
- return {
21
- detail: `\`${matcher.raw}\` is a ${kind} matcher, and only FIND takes one: it locates across resources, not lines within one.`,
22
- recovery: `Locate it with \`FIND (${target}) ${matcher.raw}\`, or select lines with a text pattern: \`${operation} (${target}) ${text}\`.`,
23
- };
24
- }
25
11
  // The whole lines a matcher's evidence touches, in source order, within an inclusive line bound.
26
12
  static lines(evidence, bounds) {
27
13
  const lines = new Set();
28
14
  for (const item of evidence) {
29
- if (item.region === undefined)
15
+ const region = item.region ?? item.enclosingRegion;
16
+ if (region === undefined)
30
17
  continue;
31
- for (let line = item.region.startLine; line <= item.region.endLine; line += 1) {
18
+ const last = region.endLine - (region.endLine > region.startLine && region.endColumn === 1 ? 1 : 0);
19
+ for (let line = region.startLine; line <= last; line += 1) {
32
20
  if (bounds !== null && (line < bounds.from || line > bounds.to))
33
21
  continue;
34
22
  lines.add(line);
@@ -36,86 +24,61 @@ export default class PatternEdits {
36
24
  }
37
25
  return [...lines].sort((a, b) => a - b);
38
26
  }
39
- // Column-exact spans for a replacement. A regex's evidence already carries its span, limited
40
- // to one line; a node dialect's evidence is the node's whole region, however many lines it
41
- // spans; a glob with no metacharacters is a literal whose occurrences on each matched line are
42
- // the spans; a glob with metacharacters selects whole lines, so its span is the whole line.
43
- static spans(matcher, content, evidence, bounds) {
44
- const spans = [];
45
- const within = (line) => bounds === null || (line >= bounds.from && line <= bounds.to);
46
- if (matcher.dialect === "regex" || matcher.dialect === "xpath" || matcher.dialect === "jsonpath") {
47
- for (const item of evidence) {
48
- const region = item.region;
49
- if (region === undefined)
50
- continue;
51
- if (matcher.dialect === "regex" && region.startLine !== region.endLine)
52
- return { error: "EDIT spans are line-limited; the pattern matched across a line break." };
53
- if (!within(region.startLine) || !within(region.endLine))
54
- continue;
55
- spans.push({ line: region.startLine, startColumn: region.startColumn, endLine: region.endLine, endColumn: region.endColumn });
56
- }
57
- }
58
- else if (matcher.dialect === "glob") {
59
- const literal = !/[*?[]/u.test(matcher.raw);
60
- const lines = TextCoordinates.logicalLines(content);
61
- for (const line of PatternEdits.lines(evidence, bounds)) {
62
- const text = lines[line - 1] === undefined ? "" : content.slice(lines[line - 1].start, lines[line - 1].contentEnd);
63
- const points = [...text];
64
- if (!literal) {
65
- spans.push({ line, startColumn: 1, endLine: line, endColumn: points.length + 1 });
66
- continue;
67
- }
68
- const needle = [...matcher.raw];
69
- for (let at = 0; at + needle.length <= points.length; at += 1) {
70
- if (needle.every((point, index) => points[at + index] === point)) {
71
- spans.push({ line, startColumn: at + 1, endLine: line, endColumn: at + needle.length + 1 });
72
- at += needle.length - 1;
73
- }
74
- }
75
- }
76
- }
77
- else {
78
- return { error: `EDIT replaces text spans; a ${matcher.dialect} pattern selects resources, not spans.` };
79
- }
80
- return spans.sort((a, b) => a.line - b.line || a.startColumn - b.startColumn);
27
+ // {§read-pattern-evidence} — presentation may clip a match, but cannot redefine it.
28
+ static visible(evidence, lines, window) {
29
+ const shown = new Set(lines);
30
+ const compare = (line, column, otherLine, otherColumn) => line - otherLine || column - otherColumn;
31
+ return evidence.filter((item) => {
32
+ const region = item.region ?? item.enclosingRegion;
33
+ if (region === undefined || !PatternEdits.lines([item], null).some((line) => shown.has(line)))
34
+ return false;
35
+ if (window === undefined)
36
+ return true;
37
+ const startsBeforeEnd = compare(region.startLine, region.startColumn, window.endLine, window.endColumn) < 0;
38
+ const endsAfterStart = compare(region.endLine, region.endColumn, window.startLine, window.startColumn) > 0;
39
+ const point = region.startLine === region.endLine && region.startColumn === region.endColumn;
40
+ return point
41
+ ? compare(region.startLine, region.startColumn, window.startLine, window.startColumn) >= 0
42
+ && compare(region.startLine, region.startColumn, window.endLine, window.endColumn) <= 0
43
+ : startsBeforeEnd && endsAfterStart;
44
+ });
45
+ }
46
+ // {§slice-semantics-compose-pattern} Selection consumes evidence; it never matches again.
47
+ static spans(evidence, bounds) {
48
+ const compare = (line, column, otherLine, otherColumn) => line - otherLine || column - otherColumn;
49
+ return evidence.flatMap(({ region }) => region === undefined ? [] : [region])
50
+ .filter((region) => bounds === null || (compare(region.startLine, region.startColumn, bounds.startLine, bounds.startColumn) >= 0
51
+ && compare(region.endLine, region.endColumn, bounds.endLine, bounds.endColumn) <= 0))
52
+ .toSorted((left, right) => compare(left.startLine, left.startColumn, right.startLine, right.startColumn)
53
+ || compare(left.endLine, left.endColumn, right.endLine, right.endColumn));
81
54
  }
82
55
  static replacements(spans, body) {
83
- return spans.map(({ line, startColumn, endLine, endColumn }) => ({ marker: { marks: [line, startColumn, endLine, endColumn] }, body }));
56
+ return spans.map(({ startLine, startColumn, endLine, endColumn }) => ({ marker: { marks: [startLine, startColumn, endLine, endColumn] }, body }));
57
+ }
58
+ static text(content, spans) {
59
+ const coordinates = new TextCoordinates(content);
60
+ return spans.map(({ startLine, startColumn, endLine, endColumn }) => content.slice(coordinates.offsetAtPosition(startLine, startColumn), coordinates.offsetAtPosition(endLine, endColumn))).join("");
84
61
  }
85
62
  // Every line an edit's marker covers: the one line of a line deletion, or a region's span.
86
63
  static touchedLines(edits) {
87
- const lines = new Set();
88
- for (const { marker } of edits) {
89
- const [start, , end] = marker.marks;
90
- for (let line = start; line <= (end ?? start); line += 1)
91
- lines.add(line);
92
- }
93
- return [...lines].sort((a, b) => a - b);
94
- }
95
- static deletions(lines) {
96
- return lines.map((line) => ({ marker: { marks: [line] }, body: "" }));
64
+ return PatternEdits.lines(edits.map(({ marker: { marks } }) => ({ region: {
65
+ startLine: marks[0], startColumn: marks[1] ?? 1,
66
+ endLine: marks[2] ?? marks[0], endColumn: marks[3] ?? 1,
67
+ } })), null);
97
68
  }
98
- // A numeric scope on a pattern operation bounds the lines it may touch. Sentinels that mean
99
- // prepend or append have no lines to match.
100
- static bounds(marks, lineCount) {
69
+ // {§slice-semantics-compose-pattern} Resolve scopes through the existing text algebra.
70
+ static bounds(marks, content) {
101
71
  if (marks === undefined || marks.length === 0)
102
72
  return null;
103
- const clamp = (mark) => mark === -1 ? lineCount : mark;
104
- if (marks.length === 1) {
105
- if (marks[0] <= 0)
106
- return { error: "A pattern needs a line to match; <0> and <-1> name a position, not a line." };
107
- return { from: marks[0], to: marks[0] };
108
- }
109
- if (marks.length === 2) {
110
- const from = marks[0];
111
- const to = clamp(marks[1]);
112
- if (from <= 0 || to < from)
113
- return { error: "A pattern needs an inclusive line range; <0> and <-1> name a position, not a line." };
114
- return { from, to };
115
- }
116
- if (marks.length === 4)
117
- return { from: marks[0], to: marks[2] };
118
- return { error: "A pattern scope is one line, an inclusive line range, or a four-coordinate region." };
73
+ if (marks.length === 1 && marks[0] <= 0)
74
+ return { error: "A pattern scope selects source text, not a prepend or append position." };
75
+ const selected = LineMarkerOps.textReplacement(content, { marks: [marks[0], ...marks.slice(1)] }, "");
76
+ if ("error" in selected)
77
+ return selected;
78
+ const region = TextCoordinates.regionFromOffsets(content, selected.start, selected.end);
79
+ if (region === null)
80
+ throw new Error("A resolved text scope has no source coordinates.");
81
+ return region;
119
82
  }
120
83
  // The landed batch as one operation result: `matched` spans, the first span's receipt, and
121
84
  // the last span's effect as `last` when there is more than one.
@@ -1 +1 @@
1
- {"version":3,"file":"pattern-edits.js","sourceRoot":"","sources":["../../src/content/pattern-edits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pattern-edits.js","sourceRoot":"","sources":["../../src/content/pattern-edits.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { ReadStatement } from "@plurnk/plurnk-contracts";
2
2
  import { type Mimetypes } from "@plurnk/plurnk-mimetypes";
3
3
  import type { EntryReadResult, StoredEntryData } from "@plurnk/plurnk-schemes";
4
- import type { SchemeManifest } from "../core/scheme-types.ts";
4
+ import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
5
5
  import { type ByteSource } from "./byte-view.ts";
6
6
  export interface AnchoredReadResult extends EntryReadResult {
7
7
  readonly sourceMimetype?: string;
@@ -19,6 +19,7 @@ interface ReadProjectionOptions {
19
19
  readonly identity: string;
20
20
  readonly representation: StoredEntryData;
21
21
  readonly mimetypes: Mimetypes | undefined;
22
+ readonly context?: PlurnkSchemeContext;
22
23
  readonly bytes?: ByteSource;
23
24
  readonly visibleLines?: Readonly<Record<string, readonly number[]>>;
24
25
  readonly retainNative?: (bytes: Uint8Array) => Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"read-projector.d.ts","sourceRoot":"","sources":["../../src/content/read-projector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAA+C,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,KAAK,EACR,eAAe,EACf,eAAe,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0C3D,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAGvD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,UAAU,qBAAqB;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAG/D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAMD,MAAM,CAAC,OAAO,OAAO,aAAa;;IA0E9B,OAAa,OAAO,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2C7E;CAoSJ"}
1
+ {"version":3,"file":"read-projector.d.ts","sourceRoot":"","sources":["../../src/content/read-projector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAA+C,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,KAAK,EACR,eAAe,EAEf,eAAe,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnF,OAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0C3D,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAGvD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,UAAU,qBAAqB;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAG/D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAMD,MAAM,CAAC,OAAO,OAAO,aAAa;;IAgG9B,OAAa,OAAO,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2C7E;CA2SJ"}
@@ -1,9 +1,9 @@
1
1
  import { binaryInputMaximum, MimetypeInputLimitError } from "@plurnk/plurnk-mimetypes";
2
2
  import { Slicer } from "@plurnk/plurnk-schemes";
3
3
  import Results from "../core/results.js";
4
- import BodyPreview from "./body-preview.js";
5
4
  import LineAnchors from "./line-anchors.js";
6
5
  import LineMarkerOps from "./line-marker.js";
6
+ import BodyPreview from "./body-preview.js";
7
7
  import ByteView from "./byte-view.js";
8
8
  import MimetypeBinary from "./mimetype-binary.js";
9
9
  import ReadResolve from "./read-resolve.js";
@@ -74,8 +74,8 @@ export default class ReadProjector {
74
74
  yield await source.read(start, Math.min(size, start + chunkSize - 1));
75
75
  }
76
76
  }
77
- // {§read-bytes} — one hexadecimal octet per line under the text coordinate algebra: the
78
- // markerless default is the same `<1,16>`, `<a,b>` selects bytes, `<1,-1>` is everything.
77
+ // {§read-bytes} — one hexadecimal octet per line under the text coordinate algebra: without a
78
+ // scope the first page of bytes ({§markerless-first-page}), `<a,b>` selects bytes, `<1,-1>` is everything.
79
79
  // The source is sized, then only the window is read; the source mimetype is never relabelled.
80
80
  static async #projectBytes(statement, target, source, sourceMimetype, channel, failure) {
81
81
  if (LineAnchors.hasAnchor(statement.lineMarker)) {
@@ -84,6 +84,31 @@ export default class ReadProjector {
84
84
  const total = await source.size();
85
85
  if (total === null)
86
86
  return failure("entry-not-found", 404, `No bytes exist at ${target}.`);
87
+ if (statement.matcher !== null) {
88
+ if (statement.lineMarker !== null) {
89
+ const bounds = LineMarkerOps.window(statement.lineMarker, total, "byte");
90
+ if (bounds.status !== 200)
91
+ return { ...bounds, content: null, mimetype: sourceMimetype, channel };
92
+ }
93
+ const loaded = await ByteView.load(source, target);
94
+ if (!("bytes" in loaded))
95
+ return { ...loaded, content: null, mimetype: sourceMimetype, channel };
96
+ const match = await ByteView.match(statement.matcher, loaded.bytes);
97
+ if (match.status >= 400)
98
+ return { status: match.status, problem: match.problem, content: null, mimetype: sourceMimetype, channel };
99
+ const matches = match.matches ?? [];
100
+ const visibleLines = PatternEdits.lines(matches, { from: 1, to: total });
101
+ const projected = await ReadResolve.resolve({
102
+ content: ByteView.hexLines(loaded.bytes), mimetype: "text/plain",
103
+ lineMarker: statement.lineMarker, visibleLines,
104
+ });
105
+ return {
106
+ ...projected, mimetype: sourceMimetype, channel, projection: ByteView.PROJECTION,
107
+ ...(projected.range === undefined ? {} : { range: { ...projected.range, unit: "byte" } }),
108
+ matched: statement.lineMarker === null ? visibleLines.length : (projected.lineOrdinals?.length ?? 0),
109
+ matches: PatternEdits.visible(matches, projected.lineOrdinals ?? []),
110
+ };
111
+ }
87
112
  const marker = statement.lineMarker ?? BodyPreview.firstPage();
88
113
  const window = LineMarkerOps.window(marker, total, "byte");
89
114
  if (window.status !== 200) {
@@ -257,14 +282,16 @@ export default class ReadProjector {
257
282
  // touches, in source order, inside the scope, with its ordinary anchors. Zero matches is
258
283
  // an empty read, never a failure; `matched` counts the selected lines inside the scope.
259
284
  let visibleLines = opts.visibleLines?.[selected];
285
+ let matches;
260
286
  if (statement.matcher !== null) {
261
- if (statement.matcher.dialect === "fts" || statement.matcher.dialect === "graph") {
262
- const { detail, recovery } = PatternEdits.findOnly({ ...statement.matcher, dialect: statement.matcher.dialect }, "READ", target);
263
- return failure("pattern-dialect-unsupported", 400, detail, {}, { target, recovery, retryable: false });
264
- }
265
287
  if (mimetypes === undefined)
266
288
  throw new Error("ReadProjector: a READ pattern requires the mimetypes capability");
267
- const match = await Matcher.matchAgainstContent(PatternEdits.lineLimited(statement.matcher), selectedRepresentation.content, selectedRepresentation.mimetype, mimetypes);
289
+ const match = opts.context === undefined || statement.target === null
290
+ ? await Matcher.matchAgainstContent(PatternEdits.lineAnchored(statement.matcher), selectedRepresentation.content, selectedRepresentation.mimetype, mimetypes)
291
+ : await Matcher.matchResource(statement.matcher, {
292
+ content: selectedRepresentation.content, mimetype: selectedRepresentation.mimetype,
293
+ target: statement.target, ...(visibleLines === undefined ? {} : { visibleLines }),
294
+ }, opts.context);
268
295
  if (match.status >= 400 || match.status === 203) {
269
296
  return Results.assertReadResult({
270
297
  ...(match.problem === undefined
@@ -275,7 +302,11 @@ export default class ReadProjector {
275
302
  channel,
276
303
  });
277
304
  }
278
- const ordered = PatternEdits.lines(match.matches ?? [], null);
305
+ matches = match.matches ?? [];
306
+ if (matches.some(({ region, enclosingRegion }) => region === undefined && enclosingRegion === undefined)) {
307
+ return failure("pattern-source-unlocated", 422, "The pattern selected a value without source coordinates.");
308
+ }
309
+ const ordered = PatternEdits.lines(matches, null);
279
310
  visibleLines = visibleLines === undefined ? ordered : ordered.filter((line) => visibleLines.includes(line));
280
311
  }
281
312
  let resolved = await ReadResolve.resolve({
@@ -343,9 +374,10 @@ export default class ReadProjector {
343
374
  channel,
344
375
  ...(resolved.mimetype === selectedRepresentation.mimetype ? {} : { sourceMimetype: selectedRepresentation.mimetype }),
345
376
  ...(matched === undefined ? {} : { matched }),
377
+ ...(matches === undefined ? {} : { matches: PatternEdits.visible(matches, resolved.lineOrdinals ?? [], resolved.region) }),
346
378
  });
347
379
  const result = ReadProjector.#producerResult(projected, selectedRepresentation, channel !== null && manifest.channels[channel] === "text/stream");
348
- if (result.status !== 200
380
+ if ((result.status !== 200 && result.status !== 204)
349
381
  || typeof result.content !== "string") {
350
382
  return result;
351
383
  }