@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.
- package/.env.defaults +16 -25
- package/SPEC.md +338 -263
- package/dist/build-info.json +1 -1
- package/dist/content/body-preview.d.ts +1 -0
- package/dist/content/body-preview.d.ts.map +1 -1
- package/dist/content/body-preview.js +7 -0
- package/dist/content/body-preview.js.map +1 -1
- package/dist/content/byte-view.d.ts +19 -2
- package/dist/content/byte-view.d.ts.map +1 -1
- package/dist/content/byte-view.js +67 -14
- package/dist/content/byte-view.js.map +1 -1
- package/dist/content/edit-receipt.js +1 -1
- package/dist/content/edit-receipt.js.map +1 -1
- package/dist/content/line-marker.d.ts +1 -0
- package/dist/content/line-marker.d.ts.map +1 -1
- package/dist/content/line-marker.js +6 -1
- package/dist/content/line-marker.js.map +1 -1
- package/dist/content/line-selection.d.ts +3 -1
- package/dist/content/line-selection.d.ts.map +1 -1
- package/dist/content/line-selection.js +27 -3
- package/dist/content/line-selection.js.map +1 -1
- package/dist/content/matcher.d.ts +9 -14
- package/dist/content/matcher.d.ts.map +1 -1
- package/dist/content/matcher.js +51 -45
- package/dist/content/matcher.js.map +1 -1
- package/dist/content/pattern-edits.d.ts +7 -26
- package/dist/content/pattern-edits.d.ts.map +1 -1
- package/dist/content/pattern-edits.js +54 -91
- package/dist/content/pattern-edits.js.map +1 -1
- package/dist/content/read-projector.d.ts +2 -1
- package/dist/content/read-projector.d.ts.map +1 -1
- package/dist/content/read-projector.js +42 -10
- package/dist/content/read-projector.js.map +1 -1
- package/dist/content/read-resolve.d.ts.map +1 -1
- package/dist/content/read-resolve.js +7 -4
- package/dist/content/read-resolve.js.map +1 -1
- package/dist/core/AdmittedTurnExecutor.d.ts +3 -1
- package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
- package/dist/core/AdmittedTurnExecutor.js +22 -7
- package/dist/core/AdmittedTurnExecutor.js.map +1 -1
- package/dist/core/BudgetReadout.d.ts +4 -4
- package/dist/core/BudgetReadout.d.ts.map +1 -1
- package/dist/core/BudgetReadout.js +26 -41
- package/dist/core/BudgetReadout.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts +2 -3
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +21 -22
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +26 -0
- package/dist/core/ContextFit.d.ts +26 -0
- package/dist/core/ContextFit.d.ts.map +1 -0
- package/dist/core/ContextFit.js +56 -0
- package/dist/core/ContextFit.js.map +1 -0
- package/dist/core/DataStatementRunner.d.ts.map +1 -1
- package/dist/core/DataStatementRunner.js +1 -0
- package/dist/core/DataStatementRunner.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +15 -2
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +148 -16
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/EditMutations.d.ts +5 -5
- package/dist/core/EditMutations.d.ts.map +1 -1
- package/dist/core/EditMutations.js +44 -50
- package/dist/core/EditMutations.js.map +1 -1
- package/dist/core/EditSequence.js +2 -2
- package/dist/core/EditSequence.js.map +1 -1
- package/dist/core/EmissionHead.d.ts +8 -0
- package/dist/core/EmissionHead.d.ts.map +1 -0
- package/dist/core/EmissionHead.js +29 -0
- package/dist/core/EmissionHead.js.map +1 -0
- package/dist/core/Engine.d.ts +1 -0
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +3 -0
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/InferenceCall.js +2 -2
- package/dist/core/InferenceCall.js.map +1 -1
- package/dist/core/InferenceCall.sql +1 -0
- package/dist/core/LiveSubscription.d.ts +20 -0
- package/dist/core/LiveSubscription.d.ts.map +1 -0
- package/dist/core/LiveSubscription.js +68 -0
- package/dist/core/LiveSubscription.js.map +1 -0
- package/dist/core/LiveSubscriptions.d.ts +1 -0
- package/dist/core/LiveSubscriptions.d.ts.map +1 -1
- package/dist/core/LiveSubscriptions.js +8 -0
- package/dist/core/LiveSubscriptions.js.map +1 -1
- package/dist/core/LogBody.js +1 -1
- package/dist/core/LogBody.js.map +1 -1
- package/dist/core/LogEntryProjection.d.ts +1 -0
- package/dist/core/LogEntryProjection.d.ts.map +1 -1
- package/dist/core/LogEntryProjection.js +9 -0
- package/dist/core/LogEntryProjection.js.map +1 -1
- package/dist/core/LogWriter.d.ts +42 -0
- package/dist/core/LogWriter.d.ts.map +1 -1
- package/dist/core/LogWriter.js +11 -5
- package/dist/core/LogWriter.js.map +1 -1
- package/dist/core/LoopDriver.js +2 -1
- package/dist/core/LoopDriver.js.map +1 -1
- package/dist/core/LoopLifecycle.d.ts +2 -2
- package/dist/core/LoopLifecycle.d.ts.map +1 -1
- package/dist/core/LoopLifecycle.js +2 -4
- package/dist/core/LoopLifecycle.js.map +1 -1
- package/dist/core/LoopLifecycle.sql +1 -6
- package/dist/core/MutationEffects.d.ts +1 -3
- package/dist/core/MutationEffects.d.ts.map +1 -1
- package/dist/core/MutationEffects.js +2 -1
- package/dist/core/MutationEffects.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +17 -4
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +80 -120
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/PacketBuilder.sql +4 -12
- package/dist/core/PatternSelection.d.ts +5 -10
- package/dist/core/PatternSelection.d.ts.map +1 -1
- package/dist/core/PatternSelection.js +9 -16
- package/dist/core/PatternSelection.js.map +1 -1
- package/dist/core/ResourceMutations.d.ts +2 -4
- package/dist/core/ResourceMutations.d.ts.map +1 -1
- package/dist/core/ResourceMutations.js +2 -5
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/ResourceSelector.d.ts +2 -2
- package/dist/core/ResourceSelector.d.ts.map +1 -1
- package/dist/core/ResourceSelector.js +64 -33
- package/dist/core/ResourceSelector.js.map +1 -1
- package/dist/core/ResourceTransfers.d.ts +2 -4
- package/dist/core/ResourceTransfers.d.ts.map +1 -1
- package/dist/core/ResourceTransfers.js +74 -50
- package/dist/core/ResourceTransfers.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +1 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +11 -9
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ServiceTeardown.d.ts +3 -2
- package/dist/core/ServiceTeardown.d.ts.map +1 -1
- package/dist/core/ServiceTeardown.js +17 -8
- package/dist/core/ServiceTeardown.js.map +1 -1
- package/dist/core/StopDeadline.d.ts +5 -0
- package/dist/core/StopDeadline.d.ts.map +1 -0
- package/dist/core/StopDeadline.js +20 -0
- package/dist/core/StopDeadline.js.map +1 -0
- package/dist/core/StrikeRail.d.ts.map +1 -1
- package/dist/core/StrikeRail.js +5 -1
- package/dist/core/StrikeRail.js.map +1 -1
- package/dist/core/ToolResources.d.ts.map +1 -1
- package/dist/core/ToolResources.js +11 -2
- package/dist/core/ToolResources.js.map +1 -1
- package/dist/core/TurnDispositionHandler.d.ts +4 -2
- package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
- package/dist/core/TurnDispositionHandler.js +24 -6
- package/dist/core/TurnDispositionHandler.js.map +1 -1
- package/dist/core/TurnMaterialization.d.ts +6 -2
- package/dist/core/TurnMaterialization.d.ts.map +1 -1
- package/dist/core/TurnMaterialization.js +64 -16
- package/dist/core/TurnMaterialization.js.map +1 -1
- package/dist/core/TurnOps.js +7 -7
- package/dist/core/TurnOps.js.map +1 -1
- package/dist/core/TurnRunner.d.ts +1 -0
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +155 -160
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/TurnRunner.sql +2 -2
- package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.js +13 -19
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
- package/dist/core/content-hash.d.ts +1 -1
- package/dist/core/content-hash.d.ts.map +1 -1
- package/dist/core/content-hash.js.map +1 -1
- package/dist/core/env-catalog.js +2 -2
- package/dist/core/env-catalog.js.map +1 -1
- package/dist/core/fork.sql +4 -10
- package/dist/core/git-env.d.ts +1 -1
- package/dist/core/git-env.d.ts.map +1 -1
- package/dist/core/git-env.js +19 -12
- package/dist/core/git-env.js.map +1 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +11 -5
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.js +1 -1
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/mutation-types.d.ts +6 -4
- package/dist/core/mutation-types.d.ts.map +1 -1
- package/dist/core/operation-target-groups.d.ts +1 -1
- package/dist/core/operation-target-groups.d.ts.map +1 -1
- package/dist/core/operation-target-groups.js +27 -5
- package/dist/core/operation-target-groups.js.map +1 -1
- package/dist/core/packet-wire.d.ts +80 -10
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +211 -227
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/provider-accounting.d.ts +1 -1
- package/dist/core/provider-accounting.d.ts.map +1 -1
- package/dist/core/provider-accounting.js +2 -1
- package/dist/core/provider-accounting.js.map +1 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +3 -2
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/DigestEvidence.d.ts +1 -0
- package/dist/digest/DigestEvidence.d.ts.map +1 -1
- package/dist/digest/DigestEvidence.js +6 -0
- package/dist/digest/DigestEvidence.js.map +1 -1
- package/dist/digest/DigestRender.d.ts +1 -0
- package/dist/digest/DigestRender.d.ts.map +1 -1
- package/dist/digest/DigestRender.js +107 -48
- package/dist/digest/DigestRender.js.map +1 -1
- package/dist/digest/DigestRequiem.js +4 -4
- package/dist/digest/DigestRequiem.js.map +1 -1
- package/dist/digest/digest-rows.d.ts +8 -0
- package/dist/digest/digest-rows.d.ts.map +1 -1
- package/dist/digest/digest-rows.js.map +1 -1
- package/dist/digest/digest.sql +20 -2
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +28 -27
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +1 -2
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +4 -17
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/TurnSource.js +2 -2
- package/dist/schemes/TurnSource.js.map +1 -1
- package/dist/schemes/_derivation-use.d.ts +7 -0
- package/dist/schemes/_derivation-use.d.ts.map +1 -0
- package/dist/schemes/_derivation-use.js +40 -0
- package/dist/schemes/_derivation-use.js.map +1 -0
- package/dist/schemes/_entry-crud.d.ts +6 -1
- package/dist/schemes/_entry-crud.d.ts.map +1 -1
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +15 -49
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-find.sql +0 -11
- package/dist/schemes/_entry-fts.d.ts.map +1 -1
- package/dist/schemes/_entry-fts.js +9 -3
- package/dist/schemes/_entry-fts.js.map +1 -1
- package/dist/schemes/_entry-fts.sql +14 -8
- package/dist/schemes/_entry-graph.d.ts +5 -8
- package/dist/schemes/_entry-graph.d.ts.map +1 -1
- package/dist/schemes/_entry-graph.js +33 -72
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-graph.sql +30 -48
- package/dist/schemes/_entry-manifest.d.ts +5 -0
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +5 -0
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts +1 -1
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +4 -11
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_search-index.d.ts +10 -0
- package/dist/schemes/_search-index.d.ts.map +1 -1
- package/dist/schemes/_search-index.js +33 -1
- package/dist/schemes/_search-index.js.map +1 -1
- package/dist/schemes/exec-lifetime.d.ts.map +1 -1
- package/dist/schemes/exec-lifetime.js +1 -2
- package/dist/schemes/exec-lifetime.js.map +1 -1
- package/dist/server/Daemon.d.ts +2 -1
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +31 -35
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +2 -1
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +37 -56
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/Functionality.d.ts +1 -1
- package/dist/server/Functionality.d.ts.map +1 -1
- package/dist/server/Functionality.js +24 -11
- package/dist/server/Functionality.js.map +1 -1
- package/dist/server/FunctionalityManager.js +2 -2
- package/dist/server/FunctionalityManager.js.map +1 -1
- package/dist/server/Retention.d.ts.map +1 -1
- package/dist/server/Retention.js +7 -3
- package/dist/server/Retention.js.map +1 -1
- package/dist/server/drain.sql +0 -6
- package/dist/server/seam-loop.sql +1 -1
- package/dist/service.js +1 -1
- package/dist/service.js.map +1 -1
- package/docs/env.md +4 -3
- package/migrations/013_graph_regions.sql +32 -0
- package/migrations/014_stream_timing.sql +4 -0
- package/migrations/015_request_evidence.sql +4 -0
- package/package.json +34 -34
- package/dist/core/KnownToxins.d.ts +0 -4
- package/dist/core/KnownToxins.d.ts.map +0 -1
- package/dist/core/KnownToxins.js +0 -22
- package/dist/core/KnownToxins.js.map +0 -1
- package/dist/core/ReasoningView.d.ts +0 -12
- package/dist/core/ReasoningView.d.ts.map +0 -1
- package/dist/core/ReasoningView.js +0 -40
- package/dist/core/ReasoningView.js.map +0 -1
- package/dist/server/exec-poll-backoff.d.ts +0 -2
- package/dist/server/exec-poll-backoff.d.ts.map +0 -1
- package/dist/server/exec-poll-backoff.js +0 -6
- package/dist/server/exec-poll-backoff.js.map +0 -1
package/dist/content/matcher.js
CHANGED
|
@@ -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}
|
|
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.
|
|
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,
|
|
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
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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;
|
|
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
|
-
//
|
|
5
|
-
|
|
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
|
-
|
|
15
|
+
const region = item.region ?? item.enclosingRegion;
|
|
16
|
+
if (region === undefined)
|
|
30
17
|
continue;
|
|
31
|
-
|
|
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
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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(({
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
//
|
|
99
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
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":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
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,
|
|
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:
|
|
78
|
-
//
|
|
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 =
|
|
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
|
-
|
|
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
|
}
|