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