@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,89 @@
|
|
|
1
|
+
import { parseEnv } from "node:util";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import Meta from "@plurnk/plurnk-meta";
|
|
5
|
+
export default class EnvDefaults {
|
|
6
|
+
static async #readDefaults(dir, owner) {
|
|
7
|
+
let text;
|
|
8
|
+
try {
|
|
9
|
+
text = await readFile(join(dir, ".env.defaults"), "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
// parseEnv never throws — it silently mints junk keys from malformed lines. Malformed =
|
|
15
|
+
// any parsed key that isn't a valid env name; crash naming the owner — a broken defaults
|
|
16
|
+
// file is a broken package, never a silently-degraded floor.
|
|
17
|
+
const parsed = parseEnv(text);
|
|
18
|
+
const junk = Object.keys(parsed).filter((k) => !/^[A-Za-z_][A-Za-z0-9_]*$/.test(k));
|
|
19
|
+
if (junk.length > 0)
|
|
20
|
+
throw new Error(`${owner}: malformed .env.defaults — invalid key(s): ${junk.map((k) => JSON.stringify(k)).join(", ")}`);
|
|
21
|
+
return { owner, text, parsed };
|
|
22
|
+
}
|
|
23
|
+
// Enumerate installed package dirs via the shared membership primitives
|
|
24
|
+
// (@plurnk/plurnk-meta); keep ecosystem members that ship a .env.defaults.
|
|
25
|
+
static async #memberFiles(nodeModules) {
|
|
26
|
+
const dirs = await Meta.packageDirs(nodeModules);
|
|
27
|
+
const files = [];
|
|
28
|
+
for (const { dir, name } of dirs.toSorted((a, b) => a.name.localeCompare(b.name))) {
|
|
29
|
+
if (!Meta.isTrusted(name))
|
|
30
|
+
continue;
|
|
31
|
+
if (!name.startsWith("@plurnk/")) {
|
|
32
|
+
let pkg;
|
|
33
|
+
try {
|
|
34
|
+
pkg = JSON.parse(await readFile(join(dir, "package.json"), "utf8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (pkg.plurnk === undefined)
|
|
40
|
+
continue; // not an ecosystem member
|
|
41
|
+
}
|
|
42
|
+
const file = await EnvDefaults.#readDefaults(dir, name);
|
|
43
|
+
if (file !== null)
|
|
44
|
+
files.push(file);
|
|
45
|
+
}
|
|
46
|
+
return files;
|
|
47
|
+
}
|
|
48
|
+
// The host's own file first, then every installed member's, name-sorted (deterministic).
|
|
49
|
+
// The host is excluded from the member scan — a workspace checkout symlinks the daemon
|
|
50
|
+
// into node_modules as its own member, and self-vs-self is not a collision.
|
|
51
|
+
static async collect(serviceRoot, nodeModules) {
|
|
52
|
+
const own = await EnvDefaults.#readDefaults(serviceRoot, "@plurnk/plurnk-service");
|
|
53
|
+
if (own === null)
|
|
54
|
+
throw new Error("@plurnk/plurnk-service: .env.defaults missing from the package root — the shipped floor is not optional");
|
|
55
|
+
const members = await EnvDefaults.#memberFiles(nodeModules);
|
|
56
|
+
return [own, ...members.filter((m) => m.owner !== own.owner)];
|
|
57
|
+
}
|
|
58
|
+
// The ONE law: global key uniqueness. A collision names both claimants — it is also the
|
|
59
|
+
// deliberate handoff signal when a sibling adopts a section the host carried for it.
|
|
60
|
+
static merge(files) {
|
|
61
|
+
const merged = new Map();
|
|
62
|
+
for (const { owner, parsed } of files) {
|
|
63
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
64
|
+
const prior = merged.get(key);
|
|
65
|
+
if (prior !== undefined)
|
|
66
|
+
throw new Error(`env-defaults collision: ${key} is claimed by both ${prior.owner} and ${owner} — a knob has exactly one owner`);
|
|
67
|
+
merged.set(key, { value, owner });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return merged;
|
|
71
|
+
}
|
|
72
|
+
// The floor: set-if-unset, under everything the operator already set.
|
|
73
|
+
static apply(merged) {
|
|
74
|
+
for (const [key, { value }] of merged)
|
|
75
|
+
process.env[key] ??= value;
|
|
76
|
+
}
|
|
77
|
+
// ~/.plurnk/.env.defaults — the operator's catalog: every member's raw file (comments are the
|
|
78
|
+
// docs), owner-labelled. Machine-owned, regenerated each boot, never read back as config.
|
|
79
|
+
static renderCatalog(files) {
|
|
80
|
+
const head = [
|
|
81
|
+
"# ⚠ MACHINE-OWNED — regenerated on every daemon boot from the installed packages'",
|
|
82
|
+
"# .env.defaults files. Do NOT edit; your config lives in ~/.plurnk/.env (yours, wins",
|
|
83
|
+
"# over this floor) or the shell env. One section per owning package.",
|
|
84
|
+
"",
|
|
85
|
+
].join("\n");
|
|
86
|
+
return head + files.map(({ owner, text }) => `# ═══ ${owner} ═══\n${text.trimEnd()}\n`).join("\n");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=env-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-defaults.js","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,IAAI;;IAIrB,OAAa,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE7E;CACJ"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Fork a run — branch the log, share the session (SPEC §machine-processes).
|
|
2
|
+
//
|
|
3
|
+
// A fork is a NEW run in the SAME session (`parent_run_id` records the lineage),
|
|
4
|
+
// holding a deep copy of the parent's log: loops → turns → entries, with their
|
|
5
|
+
// fold-state (`expanded`) and attribution (`origin`/`source`) intact. It copies
|
|
6
|
+
// nothing of the shared WORLD — the session's entries and overlay are shared, never
|
|
7
|
+
// copied, because a run never owned them. But it DOES inherit the parent's run-scope
|
|
8
|
+
// SCRATCH (§run-scheme — the run's private workspace, owner-remapped parent → branch):
|
|
9
|
+
// "fork = everything-in-common-but-name, then diverges". The §env-delta reconciliation
|
|
10
|
+
// snapshot is not copied; the branch first-sights its world like any fresh run.
|
|
11
|
+
export default class Fork {
|
|
12
|
+
// Terminal loop statuses (§lifecycle-terms) — inherited loops outside this set are clamped to 200.
|
|
13
|
+
static #TERMINAL_LOOP = new Set([200, 413, 429, 499, 500, 504, 508]);
|
|
14
|
+
static async fork(db, parentRunId, name) {
|
|
15
|
+
const parent = await db.fork_get_run.get({ id: parentRunId });
|
|
16
|
+
if (parent === undefined)
|
|
17
|
+
throw new Error(`fork: run ${parentRunId} not found`);
|
|
18
|
+
// #248 — name the branch at instantiation (immutable after). An explicit name wins; the default
|
|
19
|
+
// is `<parent>-fork-<N>` (N = next free), so N self-forks of one parent are individually
|
|
20
|
+
// addressable instead of all colliding on a single `<parent>-fork` (§run-scheme-fork).
|
|
21
|
+
let branchName = name;
|
|
22
|
+
if (branchName === undefined) {
|
|
23
|
+
const existing = await db.fork_count_branches.get({ parent_run_id: parentRunId, name_prefix: `${parent.name}-fork%` });
|
|
24
|
+
branchName = `${parent.name}-fork-${(existing?.n ?? 0) + 1}`;
|
|
25
|
+
}
|
|
26
|
+
const branch = await db.fork_insert_run.get({
|
|
27
|
+
session_id: parent.session_id, name: branchName, parent_run_id: parentRunId, origin: parent.origin,
|
|
28
|
+
});
|
|
29
|
+
if (branch === undefined)
|
|
30
|
+
throw new Error("fork: branch run insert returned no row");
|
|
31
|
+
const branchRunId = branch.id;
|
|
32
|
+
// loops → new loops, mapping old id → new id. A copied loop is INHERITED HISTORY, never the
|
|
33
|
+
// branch's live work (its own loop is enqueued fresh by injectRun) — so a non-terminal status
|
|
34
|
+
// is clamped to terminal (200). Otherwise a fork taken while the parent's loop is mid-flight (102)
|
|
35
|
+
// would carry a frozen-live loop no drain ever advances, falsely marking the branch forever-live
|
|
36
|
+
// to any liveness check (§run-scheme-fork, the premature-terminate gate §send-premature-terminate).
|
|
37
|
+
const loops = await db.fork_get_loops.all({ run_id: parentRunId });
|
|
38
|
+
const loopMap = new Map();
|
|
39
|
+
for (const l of loops) {
|
|
40
|
+
const status = Fork.#TERMINAL_LOOP.has(l.status) ? l.status : 200;
|
|
41
|
+
const nl = await db.fork_insert_loop.get({ run_id: branchRunId, sequence: l.sequence, status, prompt: l.prompt, flags: l.flags });
|
|
42
|
+
if (nl === undefined)
|
|
43
|
+
throw new Error("fork: loop insert returned no row");
|
|
44
|
+
loopMap.set(l.id, nl.id);
|
|
45
|
+
}
|
|
46
|
+
// turns → new turns, loop_id remapped, mapping old id → new id.
|
|
47
|
+
const turns = await db.fork_get_turns.all({ run_id: parentRunId });
|
|
48
|
+
const turnMap = new Map();
|
|
49
|
+
for (const { id, loop_id, ...rest } of turns) {
|
|
50
|
+
// #254 — a fork inherits the parent's log for context but spends no new money:
|
|
51
|
+
// the copied turns are history, not fresh generations. Zero their usage so the
|
|
52
|
+
// cost-rollup triggers add nothing — the session total stays true lifetime spend
|
|
53
|
+
// (no double-count) and the branch's cost_pico accrues only what IT generates.
|
|
54
|
+
const nt = await db.fork_insert_turn.get({
|
|
55
|
+
...rest, usage_prompt: 0, usage_completion: 0, usage_reasoning: 0, usage_cached: 0, usage_cost_pico: 0,
|
|
56
|
+
loop_id: loopMap.get(loop_id),
|
|
57
|
+
});
|
|
58
|
+
if (nt === undefined)
|
|
59
|
+
throw new Error("fork: turn insert returned no row");
|
|
60
|
+
turnMap.set(id, nt.id);
|
|
61
|
+
}
|
|
62
|
+
// entries → new entries: run/loop/turn ids remapped; fold-state and
|
|
63
|
+
// attribution and content all preserved.
|
|
64
|
+
const entries = await db.fork_get_log_entries.all({ run_id: parentRunId });
|
|
65
|
+
for (const e of entries) {
|
|
66
|
+
await db.fork_insert_log_entry.run({ ...e, run_id: branchRunId, loop_id: loopMap.get(e.loop_id), turn_id: turnMap.get(e.turn_id) });
|
|
67
|
+
}
|
|
68
|
+
// §run-scheme — inherit the parent's run-scope SCRATCH, owner remapped (parent → branch) in
|
|
69
|
+
// the pathname so the branch's private workspace is independent and diverges on its own edits.
|
|
70
|
+
const parentPrefix = `/${parent.name}/`;
|
|
71
|
+
const branchPrefix = `/${branchName}/`;
|
|
72
|
+
const scratch = await db.fork_get_run_scope_entries.all({ session_id: parent.session_id, owner_prefix: `${parentPrefix}*` });
|
|
73
|
+
for (const s of scratch) {
|
|
74
|
+
const newPathname = branchPrefix + s.pathname.slice(parentPrefix.length);
|
|
75
|
+
const ne = await db.fork_insert_run_scope_entry.get({ session_id: parent.session_id, scheme: s.scheme, pathname: newPathname, deep_hash: s.deep_hash, attributes: s.attributes });
|
|
76
|
+
if (ne === undefined)
|
|
77
|
+
throw new Error("fork: run-scope entry copy returned no row");
|
|
78
|
+
await db.fork_copy_entry_channels.run({ old_entry_id: s.id, new_entry_id: ne.id });
|
|
79
|
+
await db.fork_copy_entry_tags.run({ old_entry_id: s.id, new_entry_id: ne.id });
|
|
80
|
+
}
|
|
81
|
+
return branchRunId;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=fork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
-- Fork a run: deep-copy its log into a NEW run in the SAME session (SPEC §machine-processes —
|
|
2
|
+
-- branch the log, share the world). loops → turns → entries are copied with their
|
|
3
|
+
-- fold-state (expanded) and attribution (origin/source) intact; only the run/loop/
|
|
4
|
+
-- turn ids are remapped. Nothing of the world is copied (§machine-processes-fork-shares-the-world) — the session's entries and
|
|
5
|
+
-- overlay are shared. The §env-delta reconciliation snapshot (run_watermarks) is NOT
|
|
6
|
+
-- copied; the branch first-sights its world like any fresh run.
|
|
7
|
+
|
|
8
|
+
-- PREP: fork_get_run
|
|
9
|
+
SELECT session_id, name, origin FROM runs WHERE id = $id;
|
|
10
|
+
|
|
11
|
+
-- PREP: fork_insert_run
|
|
12
|
+
-- A new run in the parent's session; lineage recorded via parent_run_id (§lifecycle-terms).
|
|
13
|
+
INSERT INTO runs (session_id, name, parent_run_id, origin)
|
|
14
|
+
VALUES ($session_id, $name, $parent_run_id, $origin)
|
|
15
|
+
RETURNING id;
|
|
16
|
+
|
|
17
|
+
-- PREP: fork_count_branches
|
|
18
|
+
-- How many fork branches the parent already has — for a UNIQUE `<parent>-fork-<N>` default name, so N
|
|
19
|
+
-- self-forks of one parent are individually addressable (KILL/SEND/READ by name) instead of colliding
|
|
20
|
+
-- on a single `<parent>-fork` that run_resolve_by_name would resolve to the newest only (§run-scheme-fork).
|
|
21
|
+
SELECT COUNT(*) AS n FROM runs WHERE parent_run_id = $parent_run_id AND name LIKE $name_prefix;
|
|
22
|
+
|
|
23
|
+
-- PREP: fork_get_loops
|
|
24
|
+
SELECT id, sequence, status, prompt, flags
|
|
25
|
+
FROM loops WHERE run_id = $run_id ORDER BY id;
|
|
26
|
+
|
|
27
|
+
-- PREP: fork_insert_loop
|
|
28
|
+
INSERT INTO loops (run_id, sequence, status, prompt, flags)
|
|
29
|
+
VALUES ($run_id, $sequence, $status, $prompt, $flags)
|
|
30
|
+
RETURNING id;
|
|
31
|
+
|
|
32
|
+
-- PREP: fork_get_turns
|
|
33
|
+
-- All turns across the run's loops, in order — loop_id is remapped by the caller.
|
|
34
|
+
SELECT t.id, t.loop_id, t.sequence, t.timestamp, t.status,
|
|
35
|
+
t.usage_prompt, t.usage_completion, t.usage_cached, t.usage_cost_pico,
|
|
36
|
+
t.packet, t.finish_reason, t.model
|
|
37
|
+
FROM turns t JOIN loops l ON l.id = t.loop_id
|
|
38
|
+
WHERE l.run_id = $run_id ORDER BY t.id;
|
|
39
|
+
|
|
40
|
+
-- PREP: fork_insert_turn
|
|
41
|
+
INSERT INTO turns (loop_id, sequence, timestamp, status, usage_prompt, usage_completion, usage_reasoning, usage_cached, usage_cost_pico, packet, finish_reason, model)
|
|
42
|
+
VALUES ($loop_id, $sequence, $timestamp, $status, $usage_prompt, $usage_completion, $usage_reasoning, $usage_cached, $usage_cost_pico, $packet, $finish_reason, $model)
|
|
43
|
+
RETURNING id;
|
|
44
|
+
|
|
45
|
+
-- PREP: fork_get_log_entries
|
|
46
|
+
-- Everything but the row id and run_id (run_id is the branch's; loop_id/turn_id are
|
|
47
|
+
-- remapped by the caller). origin/source (attribution) and expanded (fold-state) ride along. §machine-processes-fork-copies-the-log
|
|
48
|
+
SELECT loop_id, turn_id, sequence, at, origin, source, op, suffix, signal,
|
|
49
|
+
scheme, username, password, hostname, port, pathname, params, fragment,
|
|
50
|
+
lineMarker, tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens,
|
|
51
|
+
state, outcome, attrs, expanded
|
|
52
|
+
FROM log_entries WHERE run_id = $run_id ORDER BY id;
|
|
53
|
+
|
|
54
|
+
-- PREP: fork_insert_log_entry
|
|
55
|
+
INSERT INTO log_entries (run_id, loop_id, turn_id, sequence, at, origin, source, op, suffix, signal, scheme, username, password, hostname, port, pathname, params, fragment, lineMarker, tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens, state, outcome, attrs, expanded)
|
|
56
|
+
VALUES ($run_id, $loop_id, $turn_id, $sequence, $at, $origin, $source, $op, $suffix, $signal, $scheme, $username, $password, $hostname, $port, $pathname, $params, $fragment, $lineMarker, $tx, $mimetype_tx, $rx, $mimetype_rx, $status_rx, $tokens, $state, $outcome, $attrs, $expanded);
|
|
57
|
+
|
|
58
|
+
-- §run-scheme — a fork inherits the parent's run-scope SCRATCH (its private workspace), distinct
|
|
59
|
+
-- from the shared session world above: "fork = everything-in-common-but-name, then diverges". The
|
|
60
|
+
-- entries are deep-copied (new ids) with the owner remapped in the pathname (parent → branch), so
|
|
61
|
+
-- the branch's scratch is independent — it edits its own without touching the parent's.
|
|
62
|
+
|
|
63
|
+
-- PREP: fork_get_run_scope_entries
|
|
64
|
+
-- The parent's run-scope entries (owner = the parent's run name, prefix `/<parent>/*`). deep_hash
|
|
65
|
+
-- and attributes ride along; copying the channels with their tokens keeps the deep_hash valid so
|
|
66
|
+
-- the next-turn pump skips re-derivation (the content is byte-identical).
|
|
67
|
+
SELECT id, scheme, pathname, deep_hash, attributes
|
|
68
|
+
FROM entries WHERE scope = 'run' AND session_id = $session_id AND pathname GLOB $owner_prefix ORDER BY id;
|
|
69
|
+
|
|
70
|
+
-- PREP: fork_insert_run_scope_entry
|
|
71
|
+
-- A run-scope entry copy with the owner-remapped pathname. synced_sig/membership_origin are NULL
|
|
72
|
+
-- (scratch is never disk-synced nor a file member); version defaults 0.
|
|
73
|
+
INSERT INTO entries (scope, session_id, scheme, pathname, deep_hash, attributes)
|
|
74
|
+
VALUES ('run', $session_id, $scheme, $pathname, $deep_hash, $attributes)
|
|
75
|
+
RETURNING id;
|
|
76
|
+
|
|
77
|
+
-- PREP: fork_copy_entry_channels
|
|
78
|
+
-- Copy every channel (body + derived graph/fts/embedding) from the source entry to the copy — one
|
|
79
|
+
-- statement, content/tokens/state preserved, so the deep_hash gate holds and nothing re-derives.
|
|
80
|
+
INSERT INTO entry_channels (entry_id, name, content, mimetype, tokens, state)
|
|
81
|
+
SELECT $new_entry_id, name, content, mimetype, tokens, state FROM entry_channels WHERE entry_id = $old_entry_id;
|
|
82
|
+
|
|
83
|
+
-- PREP: fork_copy_entry_tags
|
|
84
|
+
INSERT INTO entry_tags (entry_id, tag)
|
|
85
|
+
SELECT $new_entry_id, tag FROM entry_tags WHERE entry_id = $old_entry_id;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Db } from "./Db.ts";
|
|
2
|
+
import type { PlurnkSchemeContext } from "./scheme-types.ts";
|
|
3
|
+
export interface FsDivergence {
|
|
4
|
+
pathname: string;
|
|
5
|
+
scheme: string | null;
|
|
6
|
+
entryId: number;
|
|
7
|
+
channel: string;
|
|
8
|
+
before: string;
|
|
9
|
+
after: string;
|
|
10
|
+
}
|
|
11
|
+
export default class GitMembership {
|
|
12
|
+
#private;
|
|
13
|
+
static resolveGitMembership(db: Db, sessionId: number, signal: AbortSignal | undefined): Promise<string[]>;
|
|
14
|
+
static resolveMembershipEffects(db: Db, sessionId: number, signal: AbortSignal | undefined): Promise<{
|
|
15
|
+
members: Array<{
|
|
16
|
+
path: string;
|
|
17
|
+
effect: "member" | "view";
|
|
18
|
+
}>;
|
|
19
|
+
hidden: string[];
|
|
20
|
+
}>;
|
|
21
|
+
static indexGitMembership(ctx: PlurnkSchemeContext): Promise<FsDivergence[]>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=git-membership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-membership.d.ts","sourceRoot":"","sources":["../../src/core/git-membership.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,aAAa;;IAmK9B,OAAa,oBAAoB,CAC7B,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAkCnB;IASD,OAAa,wBAAwB,CACjC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAChC,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAkB5F;IAsGD,OAAa,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUjF;CACJ"}
|