@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,269 @@
|
|
|
1
|
+
import { LineMarkerOps } from "../content/index.js";
|
|
2
|
+
import { ReadResolve } from "../content/index.js";
|
|
3
|
+
import Matcher from "../content/matcher.js";
|
|
4
|
+
// log:///<loop_seq>/<turn_seq>/<sequence>[/<op>] — the trailing /op segment
|
|
5
|
+
// is wire-rendering self-documentation derived from the row's `op` field;
|
|
6
|
+
// parsing accepts it (or omits it) and identifies the row by coordinate. The op
|
|
7
|
+
// suffix is case-INSENSITIVE: model ops render UPPERCASE (READ/EDIT/FIND) but the
|
|
8
|
+
// engine-minted rows are lowercase (`error`, `model`), and those are curatable too —
|
|
9
|
+
// a `[A-Z]+`-only suffix silently rejected FOLD(log:///1/6/2/error), so the model
|
|
10
|
+
// could not reclaim budget by folding its own error rows and spiralled to 413 (jumbo).
|
|
11
|
+
const COORDINATE = /^(\d+)\/(\d+)\/(\d+)(?:\/([A-Za-z]+))?$/;
|
|
12
|
+
// §log-coordinate-hierarchy — a log coordinate is a HIERARCHICAL PREFIX: `1` selects loop 1's rows,
|
|
13
|
+
// `1/2` turn 1/2's rows, `1/2/3` the one row. A full coordinate is always 3 parts, so a 1- or 2-part
|
|
14
|
+
// path is unambiguously a prefix — the trailing slash is OPTIONAL (`log:///1/2` ≡ `log:///1/2/`).
|
|
15
|
+
const PARTIAL_COORDINATE = /^\d+(?:\/\d+)?\/?$/;
|
|
16
|
+
// The ONE content projection of a stored rx — what READ shows and therefore what FIND matches
|
|
17
|
+
// (§find-source-agnostic: the matcher must see exactly the content the model can retrieve).
|
|
18
|
+
// rx.content (with its own mimetype) when the op produced a body; the rx itself as compact JSON
|
|
19
|
+
// otherwise (EDIT/SEND acks — inspectable, matchable); the raw string if the rx isn't JSON.
|
|
20
|
+
const rxProjection = (rawRx) => {
|
|
21
|
+
try {
|
|
22
|
+
const rx = JSON.parse(rawRx);
|
|
23
|
+
if (typeof rx.content === "string") {
|
|
24
|
+
return { content: rx.content, mimetype: typeof rx.mimetype === "string" ? rx.mimetype : "text/plain" };
|
|
25
|
+
}
|
|
26
|
+
return { content: JSON.stringify(rx), mimetype: "application/json" };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { content: rawRx, mimetype: "text/plain" };
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
// A log target pathname → the coordinate GLOB it scopes (§log-coordinate-hierarchy): a partial
|
|
33
|
+
// coordinate (`1`, `1/2`, with or without slash) is a prefix over its descendants; a trailing
|
|
34
|
+
// slash is the folder idiom; a full coordinate/glob passes through. null = malformed.
|
|
35
|
+
const coordinateGlob = (pathname) => {
|
|
36
|
+
if (pathname === "")
|
|
37
|
+
return "*";
|
|
38
|
+
if (pathname.endsWith("/"))
|
|
39
|
+
return `${pathname}*`;
|
|
40
|
+
if (PARTIAL_COORDINATE.test(pathname))
|
|
41
|
+
return `${pathname}/*`;
|
|
42
|
+
if (parseCoordinate(pathname) !== null || pathname.includes("*"))
|
|
43
|
+
return pathname;
|
|
44
|
+
return null;
|
|
45
|
+
};
|
|
46
|
+
const parseCoordinate = (pathname) => {
|
|
47
|
+
const match = COORDINATE.exec(pathname);
|
|
48
|
+
if (match === null)
|
|
49
|
+
return null;
|
|
50
|
+
return {
|
|
51
|
+
loopSeq: Number(match[1]),
|
|
52
|
+
turnSeq: Number(match[2]),
|
|
53
|
+
sequence: Number(match[3]),
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
// <L> over a matched row set (mirrors EntryFind.#paginate): <N> picks the Nth,
|
|
57
|
+
// <N,M> the range; 0→1, -1→last; out-of-range → 416.
|
|
58
|
+
const paginate = (items, marker) => {
|
|
59
|
+
const total = items.length;
|
|
60
|
+
const { first, last } = marker;
|
|
61
|
+
if (last === null) {
|
|
62
|
+
if (first === 0 || first === -1)
|
|
63
|
+
return { status: 200, items: [] };
|
|
64
|
+
if (first > 0 && first <= total)
|
|
65
|
+
return { status: 200, items: [items[first - 1]] };
|
|
66
|
+
return { status: 416 };
|
|
67
|
+
}
|
|
68
|
+
const n = first === 0 ? 1 : first;
|
|
69
|
+
const m = last === -1 ? total : last;
|
|
70
|
+
if (n < 1 || n > total || m < 1 || m > total || n > m)
|
|
71
|
+
return { status: 416 };
|
|
72
|
+
return { status: 200, items: items.slice(n - 1, m) };
|
|
73
|
+
};
|
|
74
|
+
export default class Log {
|
|
75
|
+
static manifest = {
|
|
76
|
+
name: "log",
|
|
77
|
+
channels: {}, // logs render through read(), not channel storage
|
|
78
|
+
defaultChannel: "",
|
|
79
|
+
category: "logging",
|
|
80
|
+
scope: "session",
|
|
81
|
+
// Engine-only WRITES — but KILL ∈ MUTATING_OPS rides this same gate, and log-KILL is the
|
|
82
|
+
// model's DB-storage curation lever (plurnk.md:10/:47 + the OP×resource matrix; §model-entry-log-curation).
|
|
83
|
+
// The model clears the gate; Log's handler surface (kill only — no edit/writeEntry) is the
|
|
84
|
+
// op-level truth, so every other mutating op still 501s.
|
|
85
|
+
writableBy: ["plurnk", "model"],
|
|
86
|
+
volatile: false,
|
|
87
|
+
modelVisible: true,
|
|
88
|
+
example: "<<READ(log:///1/2/3)::READ",
|
|
89
|
+
};
|
|
90
|
+
async read(statement, ctx) {
|
|
91
|
+
const { db, runId } = ctx;
|
|
92
|
+
if (statement.target === null)
|
|
93
|
+
return { status: 400, content: null, mimetype: null };
|
|
94
|
+
// log:/// entries have no tag concept (engine-written events).
|
|
95
|
+
if (Array.isArray(statement.signal) && statement.signal.length > 0) {
|
|
96
|
+
return { status: 404, content: null, mimetype: null };
|
|
97
|
+
}
|
|
98
|
+
const pathname = (statement.target.kind === "url" ? statement.target.pathname : statement.target.raw).replace(/^\//, "");
|
|
99
|
+
const coord = parseCoordinate(pathname);
|
|
100
|
+
if (coord === null)
|
|
101
|
+
return { status: 400, content: null, mimetype: null };
|
|
102
|
+
const row = await db.log_read_by_coordinate.get({ run_id: runId, loop_seq: coord.loopSeq, turn_seq: coord.turnSeq, sequence: coord.sequence });
|
|
103
|
+
if (row === undefined)
|
|
104
|
+
return { status: 404, content: null, mimetype: null };
|
|
105
|
+
const { content: underlyingContent, mimetype: underlyingMimetype } = rxProjection(row.rx);
|
|
106
|
+
return ReadResolve.resolve({
|
|
107
|
+
content: underlyingContent,
|
|
108
|
+
mimetype: underlyingMimetype,
|
|
109
|
+
lineMarker: statement.lineMarker,
|
|
110
|
+
body: statement.body,
|
|
111
|
+
mimetypes: ctx.mimetypes,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// §log-uniform-query — FIND over the run's log rows, on the SAME source-agnostic primitive
|
|
115
|
+
// every entry scheme runs (Matcher.matchCandidates, §find-source-agnostic): candidates are the
|
|
116
|
+
// coordinate-scoped rows projected exactly as READ shows them (rxProjection), so every content
|
|
117
|
+
// dialect works on log BY CONSTRUCTION and FIND(log)→READ(coordinate) composes like any scheme.
|
|
118
|
+
// ~semantic stays 501 until the pump embeds log rows (epic S5); @graph is 501 (log rows carry
|
|
119
|
+
// no symbol channels — an honest absence, not an exception).
|
|
120
|
+
async find(statement, ctx) {
|
|
121
|
+
const { db, runId, mimetypes } = ctx;
|
|
122
|
+
const empty = (status) => ({ status, content: null, mimetype: null, results: [], itemsTokenTotal: 0, pathnames: [], matches: [] });
|
|
123
|
+
if (statement.target === null)
|
|
124
|
+
return empty(400);
|
|
125
|
+
// log rows have no tag concept (engine-written events) — a tag filter matches nothing.
|
|
126
|
+
if (Array.isArray(statement.signal) && statement.signal.length > 0)
|
|
127
|
+
return empty(204);
|
|
128
|
+
if (statement.body !== null && (statement.body.dialect === "semantic" || statement.body.dialect === "graph"))
|
|
129
|
+
return empty(501);
|
|
130
|
+
const pathname = (statement.target.kind === "url" ? statement.target.pathname : statement.target.raw).replace(/^\//, "");
|
|
131
|
+
const glob = coordinateGlob(pathname);
|
|
132
|
+
if (glob === null)
|
|
133
|
+
return empty(400);
|
|
134
|
+
const rows = await db.log_find_candidates.all({ run_id: runId, glob });
|
|
135
|
+
const byCoord = new Map(rows.map((r) => [r.coordinate, r]));
|
|
136
|
+
const projected = rows.map((r) => ({ key: r.coordinate, ...rxProjection(r.rx) }));
|
|
137
|
+
let matches;
|
|
138
|
+
if (statement.body === null) {
|
|
139
|
+
matches = projected.map((c) => ({ pathname: c.key, span: null }));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (mimetypes === undefined)
|
|
143
|
+
return empty(501);
|
|
144
|
+
const r = await Matcher.matchCandidates(statement.body, projected, mimetypes);
|
|
145
|
+
if (r.status !== 200)
|
|
146
|
+
return empty(r.status);
|
|
147
|
+
matches = r.matches.map((m) => ({ pathname: m.key, span: m.span, ...(m.path !== undefined ? { path: m.path } : {}) }));
|
|
148
|
+
}
|
|
149
|
+
if (statement.lineMarker !== null) {
|
|
150
|
+
const page = paginate(matches, LineMarkerOps.firstLast(statement.lineMarker));
|
|
151
|
+
if (page.status !== 200)
|
|
152
|
+
return empty(page.status);
|
|
153
|
+
matches = page.items ?? [];
|
|
154
|
+
}
|
|
155
|
+
if (matches.length === 0)
|
|
156
|
+
return empty(204);
|
|
157
|
+
// The result rows mirror the catalog-row shape (§find-result-catalog-rows): one item per
|
|
158
|
+
// match, keyed by the row's self-documenting path, carrying {mimetype, tokens, lines} so
|
|
159
|
+
// the model budgets its READs — uniform with every scheme's FIND.
|
|
160
|
+
const results = [];
|
|
161
|
+
const seenPath = [];
|
|
162
|
+
const seen = new Set();
|
|
163
|
+
let itemsTokenTotal = 0;
|
|
164
|
+
for (const m of matches) {
|
|
165
|
+
const row = byCoord.get(m.pathname);
|
|
166
|
+
if (row === undefined)
|
|
167
|
+
continue;
|
|
168
|
+
const path = `log:///${m.pathname}`;
|
|
169
|
+
const proj = rxProjection(row.rx);
|
|
170
|
+
const item = {
|
|
171
|
+
path,
|
|
172
|
+
channels: { [path]: { mimetype: proj.mimetype, tokens: row.tokens, lines: proj.content.length === 0 ? 0 : proj.content.split("\n").length } },
|
|
173
|
+
};
|
|
174
|
+
results.push(m.span !== null ? { ...item, matchSpan: m.span, ...(m.path !== undefined ? { matchPath: m.path } : {}) } : item);
|
|
175
|
+
if (!seen.has(m.pathname)) {
|
|
176
|
+
seen.add(m.pathname);
|
|
177
|
+
seenPath.push(m.pathname);
|
|
178
|
+
itemsTokenTotal += row.tokens;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// matches[].pathname is the fan-out's retarget key — `/loop/turn/seq/OP` re-parses as a
|
|
182
|
+
// coordinate (the /OP suffix is accepted), so READ(log://)<matcher> fan-out delivers rows.
|
|
183
|
+
const fanMatches = matches.map((m) => ({ ...m, pathname: `/${m.pathname}` }));
|
|
184
|
+
return { status: 200, content: JSON.stringify(results), mimetype: "application/json", results, itemsTokenTotal, pathnames: seenPath.map((p) => `/${p}`), matches: fanMatches };
|
|
185
|
+
}
|
|
186
|
+
async open(statement, ctx) {
|
|
187
|
+
return this.#setExpanded(statement, ctx, 1);
|
|
188
|
+
}
|
|
189
|
+
// FOLD toggles the expanded bit only — an active subscription stays alive. §subscriptions-fold-keeps-subscription
|
|
190
|
+
async fold(statement, ctx) {
|
|
191
|
+
return this.#setExpanded(statement, ctx, 0);
|
|
192
|
+
}
|
|
193
|
+
// Resolve a log:/// target — a concrete coordinate, or a path-glob optionally paginated
|
|
194
|
+
// by <L> (OPEN/FOLD only) — to the matched row ids. The ONE resolution OPEN/FOLD and
|
|
195
|
+
// KILL share: fold flips `expanded` on the ids, kill deletes them.
|
|
196
|
+
async #resolveIds(pathname, lineMarker, ctx) {
|
|
197
|
+
const { db, runId } = ctx;
|
|
198
|
+
const coord = parseCoordinate(pathname);
|
|
199
|
+
if (coord !== null && lineMarker === null) {
|
|
200
|
+
const row = await db.log_id_by_coordinate.get({ run_id: runId, loop_seq: coord.loopSeq, turn_seq: coord.turnSeq, sequence: coord.sequence });
|
|
201
|
+
return row === undefined ? { status: 404, ids: [] } : { status: 200, ids: [row.id] };
|
|
202
|
+
}
|
|
203
|
+
// §log-coordinate-hierarchy — one resolution for every consumer (curation here, find below).
|
|
204
|
+
const glob = coordinateGlob(pathname);
|
|
205
|
+
if (glob === null)
|
|
206
|
+
return { status: 400, ids: [], error: `malformed log target '${pathname}' — a coordinate (1/2/3), a prefix (1 or 1/2), or a glob (**/READ)` };
|
|
207
|
+
const matched = await db.log_match_coordinates.all({ run_id: runId, glob });
|
|
208
|
+
// Zero matches on a well-formed glob is a NO-OP SUCCESS, not an error (owner ruling): a
|
|
209
|
+
// curation sweep that found nothing to curate steers nothing — 204 keeps it out of the
|
|
210
|
+
// errors surface (>= 400), and the rx carries matched: 0, clearly shown.
|
|
211
|
+
if (matched.length === 0)
|
|
212
|
+
return { status: 204, ids: [] };
|
|
213
|
+
let selected = matched;
|
|
214
|
+
if (lineMarker !== null) {
|
|
215
|
+
const page = paginate(matched, LineMarkerOps.firstLast(lineMarker));
|
|
216
|
+
if (page.status !== 200)
|
|
217
|
+
return { status: page.status, ids: [] };
|
|
218
|
+
selected = page.items ?? [];
|
|
219
|
+
}
|
|
220
|
+
if (selected.length === 0)
|
|
221
|
+
return { status: 404, ids: [] };
|
|
222
|
+
return { status: 200, ids: selected.map((s) => s.id) };
|
|
223
|
+
}
|
|
224
|
+
async #setExpanded(statement, ctx, expanded) {
|
|
225
|
+
if (statement.target === null)
|
|
226
|
+
return { status: 400 };
|
|
227
|
+
const pathname = (statement.target.kind === "url" ? statement.target.pathname : statement.target.raw).replace(/^\//, "");
|
|
228
|
+
const r = await this.#resolveIds(pathname, statement.lineMarker, ctx);
|
|
229
|
+
if (r.status === 204)
|
|
230
|
+
return { status: 204, matched: 0 };
|
|
231
|
+
if (r.status !== 200)
|
|
232
|
+
return { status: r.status, ...(r.error !== undefined ? { error: r.error } : {}) };
|
|
233
|
+
let ids = r.ids;
|
|
234
|
+
// §prompt-fold-illegal (#382, owner) — the user prompt is the task frame, not curatable
|
|
235
|
+
// memory: a FOLD that would HIDE it is refused (run43: a weak model folded its own task in
|
|
236
|
+
// a housekeeping turn and lost the plot). KILL still DELETES it deliberately — curation
|
|
237
|
+
// preserved, accident prevented. A glob sweep silently spares the prompt and folds the
|
|
238
|
+
// rest; an explicit fold whose whole target IS the prompt gets the steer.
|
|
239
|
+
if (expanded === 0) {
|
|
240
|
+
const promptIds = new Set();
|
|
241
|
+
for (const id of r.ids) {
|
|
242
|
+
const row = await ctx.db.log_row_target.get({ id });
|
|
243
|
+
if (row?.scheme === "plurnk" && (row.pathname ?? "").startsWith("/prompt/"))
|
|
244
|
+
promptIds.add(id);
|
|
245
|
+
}
|
|
246
|
+
if (promptIds.size > 0) {
|
|
247
|
+
ids = r.ids.filter((id) => !promptIds.has(id));
|
|
248
|
+
if (ids.length === 0)
|
|
249
|
+
return { status: 403, error: "Illegal attempt to FOLD a user prompt. Use KILL if you want it removed." };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
for (const id of ids)
|
|
253
|
+
await ctx.db.log_set_expanded_by_id.run({ id, expanded });
|
|
254
|
+
return { status: 200, matched: ids.length };
|
|
255
|
+
}
|
|
256
|
+
// KILL erases log items (plurnk.md:36, :98) — the model's DB-storage curation lever and
|
|
257
|
+
// the only way to shed accumulated log rows in a long session (FOLD only collapses the
|
|
258
|
+
// render; the row persists). Same resolution as OPEN/FOLD, DELETE instead of flip. KILL
|
|
259
|
+
// carries no <L> result slot, so no pagination — a concrete coordinate or a path-glob.
|
|
260
|
+
async kill(pathname, _signal, ctx) {
|
|
261
|
+
const r = await this.#resolveIds(pathname.replace(/^\//, ""), null, ctx);
|
|
262
|
+
if (r.status !== 200)
|
|
263
|
+
return { status: r.status };
|
|
264
|
+
for (const id of r.ids)
|
|
265
|
+
await ctx.db.log_delete_by_id.run({ id });
|
|
266
|
+
return { status: 200 };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=Log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
-- log:/// scheme — read by (loop_sequence, turn_sequence, sequence)
|
|
2
|
+
-- coordinate; open/fold toggle the `expanded` flag on the addressed row.
|
|
3
|
+
|
|
4
|
+
-- PREP: log_read_by_coordinate
|
|
5
|
+
SELECT le.op, le.scheme, le.pathname, le.status_rx, le.rx, le.mimetype_rx
|
|
6
|
+
FROM log_entries le
|
|
7
|
+
JOIN turns t ON t.id = le.turn_id
|
|
8
|
+
JOIN loops l ON l.id = t.loop_id
|
|
9
|
+
WHERE l.run_id = $run_id AND l.sequence = $loop_seq AND t.sequence = $turn_seq AND le.sequence = $sequence;
|
|
10
|
+
|
|
11
|
+
-- PREP: log_id_by_coordinate
|
|
12
|
+
-- Resolve a concrete log:/// coordinate to its row id within the run (shared by
|
|
13
|
+
-- OPEN/FOLD's flip and KILL's erase — one resolution, two actions).
|
|
14
|
+
SELECT le.id FROM log_entries le
|
|
15
|
+
JOIN turns t ON t.id = le.turn_id
|
|
16
|
+
JOIN loops l ON l.id = t.loop_id
|
|
17
|
+
WHERE l.run_id = $run_id AND l.sequence = $loop_seq AND t.sequence = $turn_seq AND le.sequence = $sequence;
|
|
18
|
+
|
|
19
|
+
-- PREP: log_match_coordinates
|
|
20
|
+
-- Resolve a log:/// path-glob to the matching rows within the run, coordinate-ordered.
|
|
21
|
+
-- The rendered `loop/turn/seq/op` is GLOB-matched against the target (SQLite GLOB:
|
|
22
|
+
-- `*` spans any chars incl '/', so `**/READ` ≈ `*/READ`). Drives glob/paginated
|
|
23
|
+
-- OPEN/FOLD — the model's primary log-curation move, e.g. FOLD(log:///**/READ)<1>.
|
|
24
|
+
SELECT le.id
|
|
25
|
+
FROM log_entries le
|
|
26
|
+
JOIN turns t ON t.id = le.turn_id
|
|
27
|
+
JOIN loops l ON l.id = t.loop_id
|
|
28
|
+
WHERE l.run_id = $run_id
|
|
29
|
+
AND (l.sequence || '/' || t.sequence || '/' || le.sequence || '/' || le.op) GLOB $glob
|
|
30
|
+
ORDER BY l.sequence, t.sequence, le.sequence;
|
|
31
|
+
|
|
32
|
+
-- PREP: log_set_expanded_by_id
|
|
33
|
+
UPDATE log_entries SET expanded = $expanded WHERE id = $id;
|
|
34
|
+
|
|
35
|
+
-- PREP: log_delete_by_id
|
|
36
|
+
-- KILL erases a log item (plurnk.md:36, :98) — the model's DB-storage curation lever,
|
|
37
|
+
-- the only way to shed accumulated log rows in a long session (FOLD only collapses the
|
|
38
|
+
-- render). A hard delete: the row is gone, freeing storage; the derived errors pointer
|
|
39
|
+
-- for an `op='error'` row vanishes with it.
|
|
40
|
+
DELETE FROM log_entries WHERE id = $id;
|
|
41
|
+
|
|
42
|
+
-- PREP: log_find_candidates
|
|
43
|
+
-- §find-source-agnostic ÷ §log-coordinate-hierarchy — the run's log rows as FIND candidates,
|
|
44
|
+
-- coordinate-glob-scoped (the same GLOB semantics log_match_coordinates curates by), each with the
|
|
45
|
+
-- fields Log's rx projection renders (FIND must match exactly what READ shows). Coordinate-ordered.
|
|
46
|
+
SELECT
|
|
47
|
+
(l.sequence || '/' || t.sequence || '/' || le.sequence || '/' || le.op) AS coordinate,
|
|
48
|
+
le.op, le.rx, le.mimetype_rx, le.tokens
|
|
49
|
+
FROM log_entries le
|
|
50
|
+
JOIN turns t ON t.id = le.turn_id
|
|
51
|
+
JOIN loops l ON l.id = t.loop_id
|
|
52
|
+
WHERE l.run_id = $run_id
|
|
53
|
+
AND (l.sequence || '/' || t.sequence || '/' || le.sequence || '/' || le.op) GLOB $glob
|
|
54
|
+
ORDER BY l.sequence, t.sequence, le.sequence;
|
|
55
|
+
|
|
56
|
+
-- PREP: log_row_target
|
|
57
|
+
-- #382 §prompt-fold-illegal — a log row's acted-on target (scheme+pathname), to spot the user
|
|
58
|
+
-- prompt frame rows (scheme='plurnk', pathname '/prompt/%') a FOLD must never hide.
|
|
59
|
+
SELECT scheme, pathname FROM log_entries WHERE id = $id;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
|
|
2
|
+
import type { EditStatement, FindStatement, ReadStatement, SendStatement } from "@plurnk/plurnk-grammar";
|
|
3
|
+
import type { EditResult, ReadResult } from "./_entry-ops.ts";
|
|
4
|
+
import type { EntryData, ReadEntryResult, WriteEntryResult, DeleteEntryResult } from "./_entry-crud.ts";
|
|
5
|
+
import type { SendResult } from "./_entry-send.ts";
|
|
6
|
+
import type { FindResult } from "./_entry-find.ts";
|
|
7
|
+
export default class Plurnk {
|
|
8
|
+
static manifest: SchemeManifest;
|
|
9
|
+
edit(statement: EditStatement, ctx: PlurnkSchemeContext): Promise<EditResult>;
|
|
10
|
+
read(statement: ReadStatement, ctx: PlurnkSchemeContext): Promise<ReadResult>;
|
|
11
|
+
readEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<ReadEntryResult>;
|
|
12
|
+
writeEntry(pathname: string, entry: EntryData, ctx: PlurnkSchemeContext): Promise<WriteEntryResult>;
|
|
13
|
+
deleteEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<DeleteEntryResult>;
|
|
14
|
+
send(statement: SendStatement, ctx: PlurnkSchemeContext): Promise<SendResult>;
|
|
15
|
+
find(statement: FindStatement, ctx: PlurnkSchemeContext): Promise<FindResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=Plurnk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plurnk.d.ts","sourceRoot":"","sources":["../../src/schemes/Plurnk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKzG,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,MAAM,CAAC,OAAO,OAAO,MAAM;IACvB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAW7B;IAEI,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;IAEK,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpF;IAEK,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAExG;IAEK,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAExF;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;CACJ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import EntryOps from "./_entry-ops.js";
|
|
2
|
+
import EntryCrud from "./_entry-crud.js";
|
|
3
|
+
import EntrySend from "./_entry-send.js";
|
|
4
|
+
import EntryFind from "./_entry-find.js";
|
|
5
|
+
// Engine-authored reference scheme — the prompt (`plurnk://prompt/<run>/<loop>/<N>`), the scheme
|
|
6
|
+
// docs (`plurnk:///docs/*`), the catalog. All of it the engine writes FOR the model to READ;
|
|
7
|
+
// none of it is the model's to write. writableBy excludes "model", so the manifest gate
|
|
8
|
+
// (§scheme-surface-writableby-403) rejects every model-origin write uniformly — no path special-
|
|
9
|
+
// case. The model's scratch surface is `known://`; editing plurnk:// reference used to "succeed"
|
|
10
|
+
// and became a scratch-behavior sink for weak models (#310).
|
|
11
|
+
export default class Plurnk {
|
|
12
|
+
static manifest = {
|
|
13
|
+
name: "plurnk",
|
|
14
|
+
channels: { body: "text/markdown" },
|
|
15
|
+
defaultChannel: "body",
|
|
16
|
+
category: "data",
|
|
17
|
+
scope: "session",
|
|
18
|
+
writableBy: ["client", "plurnk"],
|
|
19
|
+
volatile: false,
|
|
20
|
+
modelVisible: true,
|
|
21
|
+
example: "<<FIND(plurnk:///**)::FIND",
|
|
22
|
+
documentation: "Engine-authored reference surfaced to you — your active prompt at `plurnk://prompt/<run>/<loop>/<N>` (READ the address the User Prompts section lists), the scheme docs at `plurnk://docs/*`. READ-ONLY: READ these, never EDIT them (use `known://` for your own scratch).",
|
|
23
|
+
};
|
|
24
|
+
async edit(statement, ctx) {
|
|
25
|
+
return EntryOps.editSessionEntry(statement, ctx, Plurnk.manifest);
|
|
26
|
+
}
|
|
27
|
+
async read(statement, ctx) {
|
|
28
|
+
return EntryOps.readSessionEntry(statement, ctx, Plurnk.manifest);
|
|
29
|
+
}
|
|
30
|
+
async readEntry(pathname, ctx) {
|
|
31
|
+
return EntryCrud.readEntry(pathname, ctx, Plurnk.manifest.name);
|
|
32
|
+
}
|
|
33
|
+
async writeEntry(pathname, entry, ctx) {
|
|
34
|
+
return EntryCrud.writeEntry(pathname, entry, ctx, Plurnk.manifest.name);
|
|
35
|
+
}
|
|
36
|
+
async deleteEntry(pathname, ctx) {
|
|
37
|
+
return EntryCrud.deleteEntry(pathname, ctx, Plurnk.manifest.name);
|
|
38
|
+
}
|
|
39
|
+
async send(statement, ctx) {
|
|
40
|
+
return EntrySend.sendToSessionEntry(statement, ctx, Plurnk.manifest.name);
|
|
41
|
+
}
|
|
42
|
+
async find(statement, ctx) {
|
|
43
|
+
return EntryFind.findSessionEntries(statement, ctx, Plurnk.manifest);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=Plurnk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plurnk.js","sourceRoot":"","sources":["../../src/schemes/Plurnk.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAMzC,iGAAiG;AACjG,6FAA6F;AAC7F,wFAAwF;AACxF,iGAAiG;AACjG,iGAAiG;AACjG,6DAA6D;AAC7D,MAAM,CAAC,OAAO,OAAO,MAAM;IACvB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;QACnC,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAChC,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,4BAA4B;QACrC,aAAa,EAAE,6QAA6Q;KAC/R,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,GAAwB;QACtD,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAgB,EAAE,GAAwB;QACzE,OAAO,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,GAAwB;QACxD,OAAO,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;CACJ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
|
|
2
|
+
import type { EditResult, ReadResult } from "./_entry-ops.ts";
|
|
3
|
+
import type { FindResult } from "./_entry-find.ts";
|
|
4
|
+
import type { EditStatement, ReadStatement, SendStatement, FindStatement, KillStatement } from "@plurnk/plurnk-grammar";
|
|
5
|
+
export declare const markTerminal: (terminatedBy: string | null, message: string | null) => string | null;
|
|
6
|
+
export default class Run {
|
|
7
|
+
#private;
|
|
8
|
+
static manifest: SchemeManifest;
|
|
9
|
+
edit(statement: EditStatement, ctx: PlurnkSchemeContext): Promise<EditResult | {
|
|
10
|
+
status: number;
|
|
11
|
+
error?: string;
|
|
12
|
+
body?: string;
|
|
13
|
+
}>;
|
|
14
|
+
deleteEntry(statement: KillStatement, ctx: PlurnkSchemeContext): Promise<{
|
|
15
|
+
status: number;
|
|
16
|
+
error?: string;
|
|
17
|
+
}>;
|
|
18
|
+
read(statement: ReadStatement, ctx: PlurnkSchemeContext): Promise<ReadResult>;
|
|
19
|
+
find(statement: FindStatement, ctx: PlurnkSchemeContext): Promise<FindResult>;
|
|
20
|
+
send(statement: SendStatement, ctx: PlurnkSchemeContext): Promise<{
|
|
21
|
+
status: number;
|
|
22
|
+
error?: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Run.d.ts","sourceRoot":"","sources":["../../src/schemes/Run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAa,MAAM,yBAAyB,CAAC;AAI9F,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAc,MAAM,wBAAwB,CAAC;AAOpI,eAAO,MAAM,YAAY,iBAAkB,MAAM,GAAG,IAAI,WAAW,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAI3F,CAAC;AAWF,MAAM,CAAC,OAAO,OAAO,GAAG;;IACpB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAU7B;IAgCI,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAetI;IAKK,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAQjH;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsBlF;IAQK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAUlF;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAoB1G;CACJ"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { DEFAULT_LOOP_FLAGS } from "../core/scheme-types.js";
|
|
2
|
+
import EntryOps from "./_entry-ops.js";
|
|
3
|
+
import EntryFind from "./_entry-find.js";
|
|
4
|
+
import { foldAuthorityIntoPath } from "../core/plurnk-uri.js";
|
|
5
|
+
// #379 (owner ruling) — a loop the ENGINE concluded (∅-collapse) or the CLIENT killed (cancel)
|
|
6
|
+
// must not present its last words as a deliverable: run42's workers parked on nothing, the
|
|
7
|
+
// collapse concluded them, and the parent COLLECTed 'Standing by for user input' as a status-200
|
|
8
|
+
// stage result — nine blind re-spawns. The marker names the act as STATE; the model's words
|
|
9
|
+
// follow unrewritten. NULL terminated_by = the model's own terminal — the message IS the result.
|
|
10
|
+
export const markTerminal = (terminatedBy, message) => {
|
|
11
|
+
if (terminatedBy === "collapse")
|
|
12
|
+
return `[ concluded on ∅-collapse — waited on nothing; no result was produced ]${message === null ? "" : ` ${message}`}`;
|
|
13
|
+
if (terminatedBy === "cancel")
|
|
14
|
+
return `[ cancelled from outside the run ]${message === null ? "" : ` ${message}`}`;
|
|
15
|
+
return message;
|
|
16
|
+
};
|
|
17
|
+
// run:// — the run scheme: inter-run CONTROL (irc=SEND; WORK=spawn, FORK=fork is Dispatcher.#handleRunControl)
|
|
18
|
+
// AND run-scoped STORAGE (§run-scheme). The run is always the AUTHORITY: run://<name>/<path> is
|
|
19
|
+
// entry <path> owned by run <name>; `run://self` is the current run, empty authority is invalid.
|
|
20
|
+
// Run is excluded from #extractTarget's authority-fold (Engine) so the authority stays the run
|
|
21
|
+
// name, never folded.
|
|
22
|
+
// - path present → storage: READ any run's entry by address (cross-run read ok); EDIT self
|
|
23
|
+
// only (cross-run write → 403 — a run reads a sister's notes, never writes them).
|
|
24
|
+
// - path absent → control on the run-as-actor: WORK spawns / FORK forks (Engine), SEND ircs, READ
|
|
25
|
+
// collects the deliverable; EDIT on the bare entity is rejected (the entity is not an entry).
|
|
26
|
+
export default class Run {
|
|
27
|
+
static manifest = {
|
|
28
|
+
name: "run",
|
|
29
|
+
channels: { body: "text/markdown" },
|
|
30
|
+
defaultChannel: "body",
|
|
31
|
+
category: "data",
|
|
32
|
+
scope: "run",
|
|
33
|
+
writableBy: ["model", "client"],
|
|
34
|
+
volatile: false,
|
|
35
|
+
modelVisible: true,
|
|
36
|
+
example: "<<EDIT(run://self/todo.md):- [ ] investigate the timeout:EDIT",
|
|
37
|
+
};
|
|
38
|
+
// The run name from a run:// target's authority (hostname). "self" = the current run;
|
|
39
|
+
// "" (empty authority) is invalid; null when the target isn't a run:// url.
|
|
40
|
+
static #authority(target) {
|
|
41
|
+
if (target === null || target.kind !== "url" || target.scheme !== "run")
|
|
42
|
+
return null;
|
|
43
|
+
return target.hostname ?? "";
|
|
44
|
+
}
|
|
45
|
+
// The entry path within the run — the target's pathname; "" / "/" mean no entry (the
|
|
46
|
+
// run-as-actor / control form).
|
|
47
|
+
static #entryPath(target) {
|
|
48
|
+
if (target === null || target.kind !== "url")
|
|
49
|
+
return "";
|
|
50
|
+
const p = target.pathname ?? "";
|
|
51
|
+
return p === "/" ? "" : p;
|
|
52
|
+
}
|
|
53
|
+
// The acting run's own name — for self-resolution and the cross-run-write gate.
|
|
54
|
+
static async #selfName(ctx) {
|
|
55
|
+
const row = await ctx.db.run_name_by_id.get({ run_id: ctx.runId });
|
|
56
|
+
if (row === undefined)
|
|
57
|
+
throw new Error("run: acting run has no name");
|
|
58
|
+
return row.name;
|
|
59
|
+
}
|
|
60
|
+
// Clone a statement with its target's authority (hostname) set to the resolved owner, so
|
|
61
|
+
// the shared entry helper folds it into the storage path (/<owner>/<entry>).
|
|
62
|
+
static #withOwner(statement, owner) {
|
|
63
|
+
const t = statement.target;
|
|
64
|
+
if (t === null || t.kind !== "url")
|
|
65
|
+
return statement;
|
|
66
|
+
return { ...statement, target: { ...t, hostname: owner } };
|
|
67
|
+
}
|
|
68
|
+
async edit(statement, ctx) {
|
|
69
|
+
const authority = Run.#authority(statement.target);
|
|
70
|
+
if (authority === null)
|
|
71
|
+
return { status: 400, error: "run:// requires a run target" };
|
|
72
|
+
const entryPath = Run.#entryPath(statement.target);
|
|
73
|
+
// The run ENTITY (path-absent run://<name>) is not EDITable — EDIT is file/entry only
|
|
74
|
+
// (grammar 0.74.55): WORK(run://<name>) spawns a worker; FORK(run://<name>) forks a named branch.
|
|
75
|
+
if (entryPath === "")
|
|
76
|
+
return { status: 400, error: "run:// entity is not editable — WORK(run://<name>) to spawn a worker, FORK(run://<name>) to fork a branch" };
|
|
77
|
+
// Storage: write a run-scope entry. Self only — cross-run write is denied (§run-scheme).
|
|
78
|
+
if (authority === "")
|
|
79
|
+
return { status: 400, error: "run:// requires a run name or 'self' (run://self/<path>)" };
|
|
80
|
+
const self = await Run.#selfName(ctx);
|
|
81
|
+
const owner = authority === "self" ? self : authority;
|
|
82
|
+
if (owner !== self)
|
|
83
|
+
return { status: 403, error: "run:// write is self-only — read a sister's notes, never write them" };
|
|
84
|
+
return EntryOps.editSessionEntry(Run.#withOwner(statement, owner), ctx, Run.manifest);
|
|
85
|
+
}
|
|
86
|
+
// KILL a run-scope scratch ENTRY (path present). Self-only — deleting a sister's notes
|
|
87
|
+
// is a cross-run write, denied like EDIT (§run-scheme). The path-ABSENT KILL form is run
|
|
88
|
+
// cancellation, handled in Dispatcher.#handleKill (it routes only entry-path KILLs here).
|
|
89
|
+
async deleteEntry(statement, ctx) {
|
|
90
|
+
const authority = Run.#authority(statement.target);
|
|
91
|
+
if (authority === null)
|
|
92
|
+
return { status: 400, error: "run:// requires a run target" };
|
|
93
|
+
if (authority === "")
|
|
94
|
+
return { status: 400, error: "run:// requires a run name or 'self' (run://self/<path>)" };
|
|
95
|
+
const self = await Run.#selfName(ctx);
|
|
96
|
+
const owner = authority === "self" ? self : authority;
|
|
97
|
+
if (owner !== self)
|
|
98
|
+
return { status: 403, error: "run:// kill is self-only — read a sister's notes, never delete them" };
|
|
99
|
+
return EntryOps.deleteSessionEntry(Run.#withOwner(statement, owner), ctx, Run.manifest);
|
|
100
|
+
}
|
|
101
|
+
async read(statement, ctx) {
|
|
102
|
+
const authority = Run.#authority(statement.target);
|
|
103
|
+
if (authority === null)
|
|
104
|
+
return { status: 400, content: null, mimetype: null, channel: null };
|
|
105
|
+
if (authority === "")
|
|
106
|
+
return { status: 400, content: null, mimetype: null, channel: null }; // empty-authority run:/// is invalid
|
|
107
|
+
const entryPath = Run.#entryPath(statement.target);
|
|
108
|
+
// Path-absent READ(run://<name>) COLLECTS the run's deliverable (§run-scheme-collect, pull side):
|
|
109
|
+
// its latest loop's terminal message — the SEND[200] result, or an abandonment reason. A worker
|
|
110
|
+
// still running hasn't delivered yet → 425 steers the model to park until it does (the
|
|
111
|
+
// same deliverable the wake/collect-delta will push). The pull complements the push; neither is lost.
|
|
112
|
+
if (entryPath === "") {
|
|
113
|
+
const owner = authority === "self" ? await Run.#selfName(ctx) : authority;
|
|
114
|
+
const row = await ctx.db.run_deliverable_by_name.get({ session_id: ctx.sessionId, name: owner });
|
|
115
|
+
if (row === undefined)
|
|
116
|
+
return { status: 404, content: `run://${owner} not found in this session`, mimetype: "text/markdown", channel: null };
|
|
117
|
+
// §join-blocking-collect (#354) — a still-running worker is a BLOCKING JOIN: the READ
|
|
118
|
+
// arms the join (awaitRun), and the turn's bare SEND[102] parks until the worker delivers.
|
|
119
|
+
// The model doesn't drive the park — the engine does (a blocking read() hiding the scheduler).
|
|
120
|
+
if (!Run.#TERMINAL_LOOP.has(row.status))
|
|
121
|
+
return { status: 425, content: `[ worker '${owner}' is still running — parking this turn until it delivers its result ]`, mimetype: "text/markdown", channel: null, awaitRun: owner };
|
|
122
|
+
return { status: 200, content: markTerminal(row.terminated_by, row.terminal_message) ?? `[ worker '${owner}' concluded with no deliverable (status ${row.status}) ]`, mimetype: "text/markdown", channel: null };
|
|
123
|
+
}
|
|
124
|
+
// Path-present: cross-run scratch READ — resolve self, fold the owner into the storage path.
|
|
125
|
+
const owner = authority === "self" ? await Run.#selfName(ctx) : authority;
|
|
126
|
+
return EntryOps.readSessionEntry(Run.#withOwner(statement, owner), ctx, Run.manifest);
|
|
127
|
+
}
|
|
128
|
+
// Terminal loop statuses (§lifecycle-terms) — a loop here has DELIVERED; anything else is still running.
|
|
129
|
+
static #TERMINAL_LOOP = new Set([200, 413, 429, 499, 500, 504, 508]);
|
|
130
|
+
// §run-scheme — FIND a run's scratch. `run://self/**` is self; `run://<name>/**` a sister
|
|
131
|
+
// (cross-run READ is allowed, so cross-run FIND is too). Resolve the owner and fold it into
|
|
132
|
+
// the scope pathname (`/<owner>/<rest>`) so EntryFind draws from that run's partition alone.
|
|
133
|
+
async find(statement, ctx) {
|
|
134
|
+
const authority = Run.#authority(statement.target);
|
|
135
|
+
if (authority === null)
|
|
136
|
+
return { status: 400, content: null, mimetype: null, results: [], itemsTokenTotal: 0, pathnames: [], matches: [] };
|
|
137
|
+
if (authority === "")
|
|
138
|
+
return { status: 400, content: null, mimetype: null, results: [], itemsTokenTotal: 0, pathnames: [], matches: [] };
|
|
139
|
+
const owner = authority === "self" ? await Run.#selfName(ctx) : authority;
|
|
140
|
+
const t = statement.target;
|
|
141
|
+
const folded = t !== null && t.kind === "url"
|
|
142
|
+
? { ...statement, target: { ...t, hostname: null, pathname: foldAuthorityIntoPath(owner, t.pathname) } }
|
|
143
|
+
: statement;
|
|
144
|
+
return EntryFind.findSessionEntries(folded, ctx, Run.manifest);
|
|
145
|
+
}
|
|
146
|
+
async send(statement, ctx) {
|
|
147
|
+
const authority = Run.#authority(statement.target);
|
|
148
|
+
if (authority === null)
|
|
149
|
+
return { status: 400, error: "run:// irc requires a run (run://<name>)" };
|
|
150
|
+
if (authority === "")
|
|
151
|
+
return { status: 400, error: "run:// irc requires a run name or 'self' (run://<name>)" };
|
|
152
|
+
if (ctx.injectRun === undefined)
|
|
153
|
+
throw new Error("run.send: injectRun capability absent");
|
|
154
|
+
let runId = ctx.runId;
|
|
155
|
+
if (authority !== "self") {
|
|
156
|
+
const row = await ctx.db.run_resolve_by_name.get({ session_id: ctx.sessionId, name: authority });
|
|
157
|
+
if (row === undefined)
|
|
158
|
+
return { status: 404, error: `run://${authority} not found in this session` };
|
|
159
|
+
runId = row.id;
|
|
160
|
+
}
|
|
161
|
+
const body = statement.body;
|
|
162
|
+
const prompt = body === null ? "" : typeof body === "string" ? body : body.raw;
|
|
163
|
+
// §run-delegation-inherits-flags — an irc that RESUMES a parked loop keeps that loop's
|
|
164
|
+
// own flags (inject ignores these there); a fresh loop raised by the message acts on
|
|
165
|
+
// the sender's behalf and carries the sender's authority.
|
|
166
|
+
const row = await ctx.db.engine_get_loop_flags.get({ loop_id: ctx.loopId });
|
|
167
|
+
const flags = row === undefined ? undefined : { ...DEFAULT_LOOP_FLAGS, ...JSON.parse(row.flags) };
|
|
168
|
+
await ctx.injectRun({ sessionId: ctx.sessionId, runId, prompt, flags });
|
|
169
|
+
return { status: 200 };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=Run.js.map
|