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