@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,97 @@
|
|
|
1
|
+
// Plugin discovery + loading for the daemon. SPEC §plugin-discovery.
|
|
2
|
+
//
|
|
3
|
+
// Boot-time scope-agnostic scan of node_modules — every scoped and unscoped
|
|
4
|
+
// package with a `plurnk` manifest field is a candidate, gated by the shared
|
|
5
|
+
// ecosystem trust rule (PLURNK_PLUGINS_TRUSTED_ONLY); dynamic-import them,
|
|
6
|
+
// register with the matching registry by kind. Alphabetical load order;
|
|
7
|
+
// collisions on (kind, name) fail-hard at registration time.
|
|
8
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
9
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
10
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
11
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return path;
|
|
15
|
+
};
|
|
16
|
+
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { resolve } from "node:path";
|
|
18
|
+
import Meta from "@plurnk/plurnk-meta";
|
|
19
|
+
export default class PluginLoader {
|
|
20
|
+
static #isValidKind(kind) {
|
|
21
|
+
return kind === "provider" || kind === "scheme" || kind === "mimetype";
|
|
22
|
+
}
|
|
23
|
+
static async discoverPlugins(nodeModulesDir) {
|
|
24
|
+
const candidates = await Meta.packageDirs(nodeModulesDir);
|
|
25
|
+
const discovered = [];
|
|
26
|
+
for (const { dir: packagePath, name } of candidates) {
|
|
27
|
+
if (!Meta.isTrusted(name))
|
|
28
|
+
continue;
|
|
29
|
+
let pkg;
|
|
30
|
+
try {
|
|
31
|
+
const content = await readFile(resolve(packagePath, "package.json"), "utf8");
|
|
32
|
+
pkg = JSON.parse(content);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (typeof pkg.name !== "string")
|
|
38
|
+
continue;
|
|
39
|
+
if (pkg.plurnk === undefined || pkg.plurnk === null || typeof pkg.plurnk !== "object")
|
|
40
|
+
continue;
|
|
41
|
+
const candidate = pkg.plurnk;
|
|
42
|
+
if (!PluginLoader.#isValidKind(candidate.kind))
|
|
43
|
+
continue;
|
|
44
|
+
if (typeof candidate.name !== "string" || candidate.name.length === 0)
|
|
45
|
+
continue;
|
|
46
|
+
discovered.push({
|
|
47
|
+
packageName: pkg.name,
|
|
48
|
+
packagePath,
|
|
49
|
+
manifest: { kind: candidate.kind, name: candidate.name },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return discovered.toSorted((a, b) => a.packageName.localeCompare(b.packageName));
|
|
53
|
+
}
|
|
54
|
+
// Dynamic-import a discovered plugin's default export and instantiate it.
|
|
55
|
+
// Default export MUST be a constructable class with a zero-arg constructor.
|
|
56
|
+
// Identity-match enforcement per plurnk-mimetypes / plurnk-schemes manifests:
|
|
57
|
+
// the instance's claimed identity MUST match the package manifest's `plurnk.name`.
|
|
58
|
+
// Providers skip this check — manifest.name is a vendor identifier; the
|
|
59
|
+
// instance's `model` is per-config (plurnk-providers#1, identity getters).
|
|
60
|
+
static async loadPlugin(plugin) {
|
|
61
|
+
const mod = await import(__rewriteRelativeImportExtension(plugin.packageName));
|
|
62
|
+
const PluginClass = mod.default;
|
|
63
|
+
if (typeof PluginClass !== "function") {
|
|
64
|
+
throw new Error(`${plugin.packageName}: default export is not a constructor`);
|
|
65
|
+
}
|
|
66
|
+
const instance = new PluginClass();
|
|
67
|
+
PluginLoader.assertIdentityMatch(plugin, instance);
|
|
68
|
+
return instance;
|
|
69
|
+
}
|
|
70
|
+
static assertIdentityMatch(plugin, instance) {
|
|
71
|
+
if (plugin.manifest.kind === "mimetype") {
|
|
72
|
+
const declared = instance.mimetype;
|
|
73
|
+
if (typeof declared !== "string") {
|
|
74
|
+
throw new Error(`${plugin.packageName}: mimetype handler instance must declare a string \`mimetype\` field`);
|
|
75
|
+
}
|
|
76
|
+
if (declared !== plugin.manifest.name) {
|
|
77
|
+
throw new Error(`${plugin.packageName}: identity mismatch — package manifest declares mimetype '${plugin.manifest.name}', instance declares '${declared}'`);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (plugin.manifest.kind === "scheme") {
|
|
82
|
+
// Schemes carry a static `manifest` on the class (plurnk-schemes contract).
|
|
83
|
+
// Transitional: bundled schemes don't yet have it (task #32 wires
|
|
84
|
+
// manifest registration). When the static manifest is absent, accept
|
|
85
|
+
// the package manifest name as the source of truth and trust the caller.
|
|
86
|
+
const classManifest = instance.constructor;
|
|
87
|
+
const declared = classManifest?.manifest?.name;
|
|
88
|
+
if (declared !== undefined && declared !== plugin.manifest.name) {
|
|
89
|
+
throw new Error(`${plugin.packageName}: identity mismatch — package manifest declares scheme '${plugin.manifest.name}', class manifest declares '${String(declared)}'`);
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Providers: no identity-match at this layer. Package manifest `name` is
|
|
94
|
+
// the vendor family; instance `model` is per-config (plurnk-providers#1).
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=PluginLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginLoader.js","sourceRoot":"","sources":["../../src/core/PluginLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type { Db } from "./Db.ts";
|
|
3
|
+
import type SchemeRegistry from "./SchemeRegistry.ts";
|
|
4
|
+
import type ExecutorRegistry from "./ExecutorRegistry.ts";
|
|
5
|
+
import type TelemetryChannel from "./TelemetryChannel.ts";
|
|
6
|
+
import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
7
|
+
import type { StreamEventNotify, WakeRunNotify } from "./ChannelWrite.ts";
|
|
8
|
+
import type { LoopFlags } from "./scheme-types.ts";
|
|
9
|
+
import type { DispatchResult } from "./Dispatcher.ts";
|
|
10
|
+
export type ProposalDecision = "accept" | "reject" | "cancel";
|
|
11
|
+
export interface ProposalResolution {
|
|
12
|
+
decision: ProposalDecision;
|
|
13
|
+
body?: string;
|
|
14
|
+
outcome?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ProposalPendingEvent {
|
|
17
|
+
logEntryId: number;
|
|
18
|
+
sessionId: number;
|
|
19
|
+
runId: number;
|
|
20
|
+
loopId: number;
|
|
21
|
+
turnId: number;
|
|
22
|
+
op: string;
|
|
23
|
+
target: {
|
|
24
|
+
scheme: string | null;
|
|
25
|
+
pathname: string | null;
|
|
26
|
+
};
|
|
27
|
+
body: string;
|
|
28
|
+
attrs: object;
|
|
29
|
+
flags: LoopFlags;
|
|
30
|
+
staleClobberRisk: boolean;
|
|
31
|
+
}
|
|
32
|
+
export default class ProposalLifecycle {
|
|
33
|
+
#private;
|
|
34
|
+
constructor({ db, schemes, telemetry, streamEventNotify, wakeRunNotify, tokenize, mimetypes, executors, loopSignal }: {
|
|
35
|
+
db: Db;
|
|
36
|
+
schemes: SchemeRegistry;
|
|
37
|
+
telemetry: TelemetryChannel;
|
|
38
|
+
streamEventNotify?: StreamEventNotify;
|
|
39
|
+
wakeRunNotify?: WakeRunNotify;
|
|
40
|
+
tokenize: (text: string) => number;
|
|
41
|
+
mimetypes?: Mimetypes;
|
|
42
|
+
executors: () => ExecutorRegistry | undefined;
|
|
43
|
+
loopSignal: (loopId: number) => AbortSignal | undefined;
|
|
44
|
+
});
|
|
45
|
+
resolve(logEntryId: number, resolution: ProposalResolution): void;
|
|
46
|
+
pendingIds(): number[];
|
|
47
|
+
cancelAll(outcome: string): void;
|
|
48
|
+
onPending(listener: (event: ProposalPendingEvent) => void): void;
|
|
49
|
+
notifyPending(event: ProposalPendingEvent): void;
|
|
50
|
+
awaitResolution(logEntryId: number): Promise<ProposalResolution>;
|
|
51
|
+
runApply(statement: PlurnkStatement, originalResult: DispatchResult, resolution: ProposalResolution, ids: {
|
|
52
|
+
sessionId: number;
|
|
53
|
+
runId: number;
|
|
54
|
+
loopId: number;
|
|
55
|
+
turnId: number;
|
|
56
|
+
}): Promise<ProposalResolution>;
|
|
57
|
+
applyResolution(logEntryId: number, resolution: ProposalResolution): Promise<DispatchResult>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ProposalLifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProposalLifecycle.d.ts","sourceRoot":"","sources":["../../src/core/ProposalLifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { schemeNameOf } from "./plurnk-uri.js";
|
|
2
|
+
// Resolution timeout — OFF by default (owner ruling, the AG-UI migration's first surfaced
|
|
3
|
+
// decision): a stopped world awaiting a human WAITS — the human's absence is not an answer,
|
|
4
|
+
// and a silent five-minute cancel is the machine deciding it was. The [102]<-1> doctrine's
|
|
5
|
+
// sibling: waiting is a mode of continuing. An operator whose deployment needs a bound sets
|
|
6
|
+
// PLURNK_SERVICE_PROPOSAL_TIMEOUT_MS explicitly (the decision table); empty = indefinite.
|
|
7
|
+
const readProposalTimeoutMs = () => {
|
|
8
|
+
const raw = process.env.PLURNK_SERVICE_PROPOSAL_TIMEOUT_MS;
|
|
9
|
+
if (raw === undefined || raw.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
const n = Number(raw);
|
|
12
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
13
|
+
return null;
|
|
14
|
+
return n;
|
|
15
|
+
};
|
|
16
|
+
// The proposal lifecycle (SPEC.md §engine-rails + §methods loop.resolve): a
|
|
17
|
+
// side-effecting op that returns 202 pauses in dispatch until a resolution
|
|
18
|
+
// arrives — from the loop/resolve RPC, the in-tree YOLO listener, or the
|
|
19
|
+
// timeout — then the scheme's applyResolution hook applies the accept.
|
|
20
|
+
export default class ProposalLifecycle {
|
|
21
|
+
#db;
|
|
22
|
+
#schemes;
|
|
23
|
+
#telemetry;
|
|
24
|
+
#streamEventNotify;
|
|
25
|
+
#wakeRunNotify;
|
|
26
|
+
#tokenize;
|
|
27
|
+
#mimetypes;
|
|
28
|
+
// Boot-discovered runtime executors, late-injected on Engine — thunked.
|
|
29
|
+
#executors;
|
|
30
|
+
// Per-loop abort signal, owned by Engine.runLoop — thunked.
|
|
31
|
+
#loopSignal;
|
|
32
|
+
// Proposal lifecycle: pending dispatch pauses waiting for resolution.
|
|
33
|
+
// Dispatch awaits the promise when a scheme returns status 202;
|
|
34
|
+
// Engine.resolveProposal feeds the resolution back in. Map is per-log-
|
|
35
|
+
// entry-id; entries clear on resolution. SPEC.md §engine-rails + §methods (loop.resolve).
|
|
36
|
+
#pending = new Map();
|
|
37
|
+
// External observers of proposal lifecycle events. Daemon subscribes
|
|
38
|
+
// here to push `loop/proposal` notifications when an entry enters
|
|
39
|
+
// pending state. YOLO listener (Phase E.3) subscribes here too. Lean
|
|
40
|
+
// event emitter — no priority, no veto chain at this layer; filter
|
|
41
|
+
// chains come later if a real consumer needs them.
|
|
42
|
+
#listeners = [];
|
|
43
|
+
constructor({ db, schemes, telemetry, streamEventNotify, wakeRunNotify, tokenize, mimetypes, executors, loopSignal }) {
|
|
44
|
+
this.#db = db;
|
|
45
|
+
this.#schemes = schemes;
|
|
46
|
+
this.#telemetry = telemetry;
|
|
47
|
+
this.#streamEventNotify = streamEventNotify;
|
|
48
|
+
this.#wakeRunNotify = wakeRunNotify;
|
|
49
|
+
this.#tokenize = tokenize;
|
|
50
|
+
this.#mimetypes = mimetypes;
|
|
51
|
+
this.#executors = executors;
|
|
52
|
+
this.#loopSignal = loopSignal;
|
|
53
|
+
}
|
|
54
|
+
// External API to feed a resolution into a pending proposal. Called by
|
|
55
|
+
// the loop/resolve RPC handler (Phase E.2), the in-tree YOLO listener
|
|
56
|
+
// (Phase E.3), or the timeout watcher. Throws when the logEntryId has no
|
|
57
|
+
// pending waiter — duplicate resolutions, IDs for non-proposed entries,
|
|
58
|
+
// or entries already-resolved are caller errors.
|
|
59
|
+
resolve(logEntryId, resolution) {
|
|
60
|
+
const waiter = this.#pending.get(logEntryId);
|
|
61
|
+
if (waiter === undefined) {
|
|
62
|
+
throw new Error(`Engine.resolveProposal: no pending proposal for log_entry ${logEntryId}`);
|
|
63
|
+
}
|
|
64
|
+
if (waiter.timeoutHandle !== null)
|
|
65
|
+
clearTimeout(waiter.timeoutHandle);
|
|
66
|
+
this.#pending.delete(logEntryId);
|
|
67
|
+
waiter.resolve(resolution);
|
|
68
|
+
}
|
|
69
|
+
// Snapshot of pending proposals (for diagnostic / RPC listings). Returns
|
|
70
|
+
// the log entry IDs currently awaiting resolution.
|
|
71
|
+
pendingIds() {
|
|
72
|
+
return [...this.#pending.keys()];
|
|
73
|
+
}
|
|
74
|
+
// Daemon shutdown: settle EVERY pending waiter with a cancel so the stopped world can't
|
|
75
|
+
// deadlock the stop — a drain paused inside dispatch awaiting a resolution that will never
|
|
76
|
+
// come held Promise.allSettled(drains) open forever (a daemon with a pending HITL proposal
|
|
77
|
+
// could not shut down; the #344 wedge class). §proposal-cancel-aborts — same cancel lane as
|
|
78
|
+
// a timeout, outcome names the cause.
|
|
79
|
+
cancelAll(outcome) {
|
|
80
|
+
for (const [logEntryId, waiter] of [...this.#pending.entries()]) {
|
|
81
|
+
if (waiter.timeoutHandle !== null)
|
|
82
|
+
clearTimeout(waiter.timeoutHandle);
|
|
83
|
+
this.#pending.delete(logEntryId);
|
|
84
|
+
waiter.resolve({ decision: "cancel", outcome });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Subscribe to proposal-pending events. Daemon registers a listener
|
|
88
|
+
// that broadcasts the loop/proposal WS notification; YOLO listener
|
|
89
|
+
// (Phase E.3) registers one that auto-resolves. Listeners fire BEFORE
|
|
90
|
+
// dispatch awaits resolution, so synchronous (or fast-async) handlers
|
|
91
|
+
// can resolve inline.
|
|
92
|
+
onPending(listener) {
|
|
93
|
+
this.#listeners.push(listener);
|
|
94
|
+
}
|
|
95
|
+
notifyPending(event) {
|
|
96
|
+
for (const listener of this.#listeners) {
|
|
97
|
+
try {
|
|
98
|
+
listener(event);
|
|
99
|
+
}
|
|
100
|
+
catch (_) { /* listener errors don't break dispatch */ }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
awaitResolution(logEntryId) {
|
|
104
|
+
const timeoutMs = readProposalTimeoutMs();
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
const timeoutHandle = timeoutMs === null ? null : setTimeout(() => {
|
|
107
|
+
// Operator-bounded lane only: synthesize a cancel resolution through the same
|
|
108
|
+
// path as any other. State transitions to cancelled with outcome='timeout'.
|
|
109
|
+
if (this.#pending.has(logEntryId)) {
|
|
110
|
+
this.#pending.delete(logEntryId);
|
|
111
|
+
resolve({ decision: "cancel", outcome: "timeout" }); // §proposal-timeout-cancels
|
|
112
|
+
}
|
|
113
|
+
}, timeoutMs);
|
|
114
|
+
this.#pending.set(logEntryId, { resolve, timeoutHandle });
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// On accept, run the scheme's applyResolution — File writes disk, Exec spawns. §proposal-accept-applies
|
|
118
|
+
async runApply(statement, originalResult, resolution, ids) {
|
|
119
|
+
const { sessionId, runId, loopId, turnId } = ids;
|
|
120
|
+
if (resolution.decision !== "accept")
|
|
121
|
+
return resolution;
|
|
122
|
+
// EXEC routes to the exec scheme regardless of target (cwd, not
|
|
123
|
+
// a scheme address). All other ops resolve their handler from
|
|
124
|
+
// statement.target's scheme.
|
|
125
|
+
// COPY/MOVE write the DEST (statement.body), not the source (target): the
|
|
126
|
+
// accept must reach the dest scheme's applyResolution (File writes disk).
|
|
127
|
+
const schemeName = statement.op === "EXEC" ? "exec"
|
|
128
|
+
: (statement.op === "COPY" || statement.op === "MOVE") ? schemeNameOf(statement.body)
|
|
129
|
+
: schemeNameOf(statement.target);
|
|
130
|
+
if (schemeName === null)
|
|
131
|
+
return resolution;
|
|
132
|
+
const handler = this.#schemes.get(schemeName);
|
|
133
|
+
if (handler === undefined || typeof handler.applyResolution !== "function")
|
|
134
|
+
return resolution;
|
|
135
|
+
try {
|
|
136
|
+
// Build a ctx for the scheme's applyResolution. The proposal
|
|
137
|
+
// was raised inside a specific (session, run, loop, turn);
|
|
138
|
+
// the scheme uses ctx to write the entry that makes the
|
|
139
|
+
// operation's artifact visible in the next packet's index.
|
|
140
|
+
const applyCtx = {
|
|
141
|
+
db: this.#db, sessionId, runId, loopId, turnId,
|
|
142
|
+
writer: "model", signal: this.#loopSignal(loopId),
|
|
143
|
+
streamEventNotify: this.#streamEventNotify,
|
|
144
|
+
wakeRunNotify: this.#wakeRunNotify,
|
|
145
|
+
tokenize: this.#tokenize,
|
|
146
|
+
mimetypes: this.#mimetypes,
|
|
147
|
+
pushTelemetry: (event) => this.#telemetry.push(sessionId, loopId, event),
|
|
148
|
+
executors: this.#executors(),
|
|
149
|
+
};
|
|
150
|
+
const applyResult = await handler.applyResolution({
|
|
151
|
+
attrs: (originalResult.attrs ?? {}),
|
|
152
|
+
body: resolution.body,
|
|
153
|
+
}, applyCtx);
|
|
154
|
+
if (applyResult.status >= 400) {
|
|
155
|
+
return {
|
|
156
|
+
decision: "reject",
|
|
157
|
+
outcome: applyResult.outcome ?? "apply_failed",
|
|
158
|
+
body: applyResult.body,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// Propagate applyResolution.outcome onto the accepted resolution
|
|
162
|
+
// (operational metadata, e.g. exec's "started") AND its body — the applied result the
|
|
163
|
+
// model must see THIS turn: a file EDIT's line-numbered diff, a [300] answer. EXEC
|
|
164
|
+
// never uses the body rail — its output streams uniformly (§exec-stream, NO same-turn
|
|
165
|
+
// in-body exception; inline only skips the review pause) and is READ next turn.
|
|
166
|
+
const withOutcome = applyResult.outcome !== undefined && resolution.outcome === undefined
|
|
167
|
+
? { ...resolution, outcome: applyResult.outcome }
|
|
168
|
+
: resolution;
|
|
169
|
+
return applyResult.body === undefined ? withOutcome : { ...withOutcome, body: applyResult.body };
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return {
|
|
173
|
+
decision: "reject",
|
|
174
|
+
outcome: "apply_threw",
|
|
175
|
+
body: err instanceof Error ? err.message : String(err),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async applyResolution(logEntryId, resolution) {
|
|
180
|
+
// Map decision → terminal state + HTTP-aligned status:
|
|
181
|
+
// accept → state='resolved', status=200
|
|
182
|
+
// reject → state='failed', status=400, outcome='rejected' (default) §proposal-reject-fails
|
|
183
|
+
// cancel → state='cancelled',status=499, outcome='loop_aborted' (default) §proposal-cancel-aborts
|
|
184
|
+
// resolution.outcome wins over the default when supplied; this is how
|
|
185
|
+
// veto filters (Phase E.2 proposal.accepting) can specify a more
|
|
186
|
+
// precise outcome string like 'policy_veto' or 'timeout'.
|
|
187
|
+
const decision = resolution.decision;
|
|
188
|
+
const state = decision === "accept" ? "resolved"
|
|
189
|
+
: decision === "reject" ? "failed"
|
|
190
|
+
: "cancelled";
|
|
191
|
+
const status = decision === "accept" ? 200
|
|
192
|
+
: decision === "reject" ? 400
|
|
193
|
+
: 499;
|
|
194
|
+
const defaultOutcome = decision === "accept" ? null
|
|
195
|
+
: decision === "reject" ? "rejected"
|
|
196
|
+
: "loop_aborted";
|
|
197
|
+
const outcome = resolution.outcome ?? defaultOutcome;
|
|
198
|
+
// rx is the model-facing operation result. Status always. Body is normally dropped —
|
|
199
|
+
// the propose preview was an input echo — EXCEPT an inline auto-run (read/pure) carries
|
|
200
|
+
// its run output AS the body, the "what happened" the model needs this turn. A non-accept
|
|
201
|
+
// carries the outcome TOKEN as its terse error (write_failed / rejected / timeout — one
|
|
202
|
+
// word, never prose): a bare {"status":400} left the model blind to a mechanically failed
|
|
203
|
+
// apply and parking on a phantom worker (the fan-out digest).
|
|
204
|
+
const rx = (decision === "accept" && resolution.body !== undefined)
|
|
205
|
+
? JSON.stringify({ status, body: resolution.body })
|
|
206
|
+
: decision === "accept"
|
|
207
|
+
? JSON.stringify({ status })
|
|
208
|
+
: JSON.stringify({ status, error: outcome });
|
|
209
|
+
await this.#db.engine_resolve_log_entry.run({
|
|
210
|
+
id: logEntryId, state, outcome, status_rx: status, rx,
|
|
211
|
+
});
|
|
212
|
+
return { status, outcome, body: resolution.body };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=ProposalLifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProposalLifecycle.js","sourceRoot":"","sources":["../../src/core/ProposalLifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Provider, ProviderAlias } from "@plurnk/plurnk-providers";
|
|
2
|
+
export default class ProviderInstantiate {
|
|
3
|
+
#private;
|
|
4
|
+
static aliasOf(provider: Provider): string | undefined;
|
|
5
|
+
static instantiateProvider(alias: ProviderAlias, env?: NodeJS.ProcessEnv): Promise<Provider>;
|
|
6
|
+
static loadActiveProvider(env?: NodeJS.ProcessEnv): Promise<Provider | null>;
|
|
7
|
+
static verifyGrammarEnforcement(provider: Provider, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ProviderInstantiate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderInstantiate.d.ts","sourceRoot":"","sources":["../../src/core/ProviderInstantiate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAEzF,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAcpC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAErD;IAED,OAAa,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAY9G;IA2CD,OAAa,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAM9F;IAWD,OAAa,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD7G;CACJ"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Dynamic provider instantiation. Lives in plurnk-service (the consumer)
|
|
2
|
+
// because Node's `import()` resolves package specifiers relative to the
|
|
3
|
+
// calling module's location; this is the package that actually has the
|
|
4
|
+
// `@plurnk/plurnk-providers-*` siblings installed in its node_modules.
|
|
5
|
+
//
|
|
6
|
+
// The pure helpers (parseAliasesFromEnv, resolveActiveAlias) live in
|
|
7
|
+
// @plurnk/plurnk-providers as framework-grade env parsing.
|
|
8
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
9
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
10
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
11
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return path;
|
|
15
|
+
};
|
|
16
|
+
import { resolveActiveAlias, scopeEnvToAlias, isStandardProvider, standardProviderFromEnv } from "@plurnk/plurnk-providers";
|
|
17
|
+
export default class ProviderInstantiate {
|
|
18
|
+
// One provider per (provider, model, baseUrl) for the process lifetime: a provider is
|
|
19
|
+
// stateless per the contract, and loop.run instantiating fresh per aliased call re-probed
|
|
20
|
+
// the backend (latency) and re-fired providers' construction warnings on every loop (the
|
|
21
|
+
// owner's boot log: one heuristic warning per loop.run). Cache keyed on the wire identity;
|
|
22
|
+
// env is process-stable for these fields.
|
|
23
|
+
static #instances = new Map();
|
|
24
|
+
// #352 — provider handle → the alias name that produced it, so the service scopes its OWN
|
|
25
|
+
// per-alias partition knobs (PLURNK_SERVICE_*_<alias>) by the provider it's building a packet
|
|
26
|
+
// for. Service-owned metadata about handles WE created; never a provider-contract field.
|
|
27
|
+
static #aliasByProvider = new WeakMap();
|
|
28
|
+
// The alias name a provider was built under, or undefined (a test Mock, a hand-built handle).
|
|
29
|
+
// PacketBuilder falls back to resolveActiveAlias for the boot-global case.
|
|
30
|
+
static aliasOf(provider) {
|
|
31
|
+
return ProviderInstantiate.#aliasByProvider.get(provider);
|
|
32
|
+
}
|
|
33
|
+
static async instantiateProvider(alias, env = process.env) {
|
|
34
|
+
if (env === process.env) {
|
|
35
|
+
const key = `${alias.provider}|${alias.model}|${alias.baseUrl ?? ""}`;
|
|
36
|
+
let cached = ProviderInstantiate.#instances.get(key);
|
|
37
|
+
if (cached === undefined) {
|
|
38
|
+
cached = ProviderInstantiate.#instantiate(alias, env);
|
|
39
|
+
ProviderInstantiate.#instances.set(key, cached);
|
|
40
|
+
cached.catch(() => ProviderInstantiate.#instances.delete(key)); // a failed construct never poisons the cache
|
|
41
|
+
}
|
|
42
|
+
return cached;
|
|
43
|
+
}
|
|
44
|
+
return ProviderInstantiate.#instantiate(alias, env); // custom env (tests) — never cached
|
|
45
|
+
}
|
|
46
|
+
static async #instantiate(alias, env) {
|
|
47
|
+
const provider = await ProviderInstantiate.#construct(alias, env);
|
|
48
|
+
ProviderInstantiate.#aliasByProvider.set(provider, alias.alias);
|
|
49
|
+
return provider;
|
|
50
|
+
}
|
|
51
|
+
static async #construct(alias, env) {
|
|
52
|
+
// Standard providers (openai-compat + groq/deepinfra/...) construct via
|
|
53
|
+
// the framework's factory — it carries probeNctx (auto-detect the
|
|
54
|
+
// endpoint's n_ctx, so a local llama-server isn't a no-window black box
|
|
55
|
+
// that disables the budget grinder + tokensFree) and the shared
|
|
56
|
+
// OpenAICompat transport. `openai` here replaces the former
|
|
57
|
+
// @plurnk/plurnk-providers-openai sibling verbatim.
|
|
58
|
+
if (isStandardProvider(alias.provider)) {
|
|
59
|
+
// alias.baseUrl MUST thread through — it's the per-alias PLURNK_BASEURL_<alias>
|
|
60
|
+
// override. Drop it and every openai-compat alias silently collapses to a shared
|
|
61
|
+
// OPENAI_BASE_URL (or fails hard), so a multi-endpoint setup runs the wrong box.
|
|
62
|
+
const provider = await standardProviderFromEnv(alias.provider, env, alias.model, alias.baseUrl);
|
|
63
|
+
if (provider === null)
|
|
64
|
+
throw new Error(`standard provider '${alias.provider}' returned null for model '${alias.model}'`);
|
|
65
|
+
return provider;
|
|
66
|
+
}
|
|
67
|
+
// Bespoke siblings (ollama/openrouter/google/xai/cloudflare): dynamic-
|
|
68
|
+
// import the package's own fromEnv factory.
|
|
69
|
+
const packageName = `@plurnk/plurnk-providers-${alias.provider}`;
|
|
70
|
+
let mod;
|
|
71
|
+
try {
|
|
72
|
+
mod = await import(__rewriteRelativeImportExtension(packageName));
|
|
73
|
+
}
|
|
74
|
+
catch (cause) {
|
|
75
|
+
throw new Error(`provider package ${packageName} not installed (alias '${alias.alias}' requires it)`, { cause });
|
|
76
|
+
}
|
|
77
|
+
const factory = mod.default;
|
|
78
|
+
if (typeof factory?.fromEnv !== "function") {
|
|
79
|
+
throw new Error(`${packageName}: default export must have a static \`fromEnv(env, model)\` factory`);
|
|
80
|
+
}
|
|
81
|
+
return await factory.fromEnv(env, alias.model, alias.baseUrl !== undefined ? { baseUrl: alias.baseUrl } : undefined);
|
|
82
|
+
}
|
|
83
|
+
// Convenience: resolve + instantiate in one call. Returns null when no
|
|
84
|
+
// PLURNK_MODEL is set (caller decides what 'no provider' means).
|
|
85
|
+
static async loadActiveProvider(env = process.env) {
|
|
86
|
+
const alias = resolveActiveAlias(env); // the active provider alias resolves from PLURNK_MODEL — §provider-instantiation-alias-resolution
|
|
87
|
+
if (alias === null)
|
|
88
|
+
return null;
|
|
89
|
+
const provider = await ProviderInstantiate.instantiateProvider(alias, env);
|
|
90
|
+
await ProviderInstantiate.verifyGrammarEnforcement(provider, env);
|
|
91
|
+
return provider;
|
|
92
|
+
}
|
|
93
|
+
// §grammar-enforcement-verified-at-boot — the rails are useless if silently OFF. The openai
|
|
94
|
+
// provider only transports the grammar when its boot probe DETECTS llama-server (grammarStyle
|
|
95
|
+
// 'llamacpp'); any probe hiccup silently falls back to 'none' — unconstrained generation, no
|
|
96
|
+
// signal, and the whole grammar contract dark (weeks of "gemma strokes" were unconstrained
|
|
97
|
+
// gemma). The Provider interface exposes no capability to introspect this, so we VERIFY the
|
|
98
|
+
// contract end to end: when the operator requested a grammar, force a trivial one and confirm
|
|
99
|
+
// the backend actually constrained the output. Anything else FAILS HARD at boot — a legible
|
|
100
|
+
// refusal to run beats silent garbage that reads as model failure. No-op when GBNF is off.
|
|
101
|
+
static #VERIFY_TOKEN = "PLURNK-RAILS-LIVE";
|
|
102
|
+
static async verifyGrammarEnforcement(provider, env = process.env) {
|
|
103
|
+
// #353 — resolve GBNF PER ALIAS, exactly as Engine.#grammarConstraint does. The per-alias
|
|
104
|
+
// move (#352) left this reading the BARE knob (now empty by default), so the boot verify
|
|
105
|
+
// was SILENTLY SKIPPED for every alias whose grammar rides a suffix (turboderp) — the rails
|
|
106
|
+
// ran UNVERIFIED, the #34 hole this method exists to close reopened. The alias is the one
|
|
107
|
+
// that built this provider (the side-table), falling back to the active alias.
|
|
108
|
+
const alias = ProviderInstantiate.aliasOf(provider) ?? resolveActiveAlias(env)?.alias ?? "";
|
|
109
|
+
const gbnf = scopeEnvToAlias(env, alias, ["PLURNK_PROVIDERS_GBNF"]).PLURNK_PROVIDERS_GBNF;
|
|
110
|
+
if (gbnf === undefined || gbnf === "" || gbnf === "0")
|
|
111
|
+
return; // rails not requested — nothing to verify
|
|
112
|
+
// #336 — gate on the provider's own claim: a grammarStyle-'none' provider DROPS the grammar
|
|
113
|
+
// cleanly (never on the wire, constrainsOutput:false), so a global GBNF default must not
|
|
114
|
+
// refuse boot against it — the rails are simply not in play for this backend. The #34 hole
|
|
115
|
+
// stays closed: wherever the provider CLAIMS constrainsOutput, the end-to-end verify below
|
|
116
|
+
// still fails hard; and a llama-server whose /v1/models probe raced to 'none' is cured
|
|
117
|
+
// deterministically by PLURNK_PROVIDERS_LLAMA_SERVER_<alias>=1, which the notice names.
|
|
118
|
+
if (provider.constrainsOutput === false) {
|
|
119
|
+
process.stderr.write(`plurnk-service: PLURNK_PROVIDERS_GBNF=${gbnf} is configured, but '${provider.model}' does not enforce grammars — running UNCONSTRAINED on this alias. `
|
|
120
|
+
+ `If this backend is a llama-server, pin PLURNK_PROVIDERS_LLAMA_SERVER_<alias>=1 so detection never races.\n`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const forcing = `root ::= "${ProviderInstantiate.#VERIFY_TOKEN}"`;
|
|
124
|
+
let content;
|
|
125
|
+
try {
|
|
126
|
+
const res = await provider.generate({
|
|
127
|
+
messages: [{ role: "user", content: "ok" }],
|
|
128
|
+
runId: "gbnf-enforcement-verify", grammar: forcing, maxTokens: 16,
|
|
129
|
+
});
|
|
130
|
+
// llama-server sometimes renders the end-of-sequence token as literal text after the
|
|
131
|
+
// forced string ("PLURNK-RAILS-LIVE<eos>") — that IS proof of enforcement (the grammar
|
|
132
|
+
// matched exactly, then the sampler stopped); strip one trailing eos-ish marker.
|
|
133
|
+
content = res.assistant.content.trim().replace(/(<eos>|<\/s>|<\|eot_id\|>|<\|endoftext\|>|<end_of_turn>)\s*$/, "").trim();
|
|
134
|
+
}
|
|
135
|
+
catch (cause) {
|
|
136
|
+
// The probe REQUEST was rejected (not "rails came back unconstrained"). This is loud, not
|
|
137
|
+
// the silent-off failure the verify guards against — and it will recur on every real turn,
|
|
138
|
+
// so refuse legibly and name the likely cause. The classic one: the provider sends a
|
|
139
|
+
// reasoning parameter the model rejects (a non-reasoning model + PLURNK_PROVIDERS_THINKING
|
|
140
|
+
// defaulting on → OpenAI 400 "does not support parameter reasoningEffort").
|
|
141
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
142
|
+
throw new Error(`grammar enforcement verification could not COMPLETE its probe against '${provider.model}' (PLURNK_PROVIDERS_GBNF=${gbnf}) — the model REJECTED the probe request. `
|
|
143
|
+
+ `This is a request/config incompatibility, NOT proof the rails are dark (and it would fail every real turn too). `
|
|
144
|
+
+ `Most common cause: the model does not accept a parameter the provider sends — e.g. a reasoning param on a non-reasoning model; set PLURNK_PROVIDERS_THINKING=off (or the model-appropriate posture). `
|
|
145
|
+
+ `Refusing to boot until the request the daemon sends is one the model accepts. Probe error: ${detail}`, { cause });
|
|
146
|
+
}
|
|
147
|
+
if (content !== ProviderInstantiate.#VERIFY_TOKEN) {
|
|
148
|
+
throw new Error(`grammar enforcement is OFF: PLURNK_PROVIDERS_GBNF=${gbnf} requests constrained sampling, but '${provider.model}' returned UNCONSTRAINED output to a forcing grammar `
|
|
149
|
+
+ `(expected ${JSON.stringify(ProviderInstantiate.#VERIFY_TOKEN)}, got ${JSON.stringify(content.slice(0, 40))}). `
|
|
150
|
+
+ `The provider likely failed to detect the llama-server backend (grammarStyle 'none') — the grammar was never transported. `
|
|
151
|
+
+ `Refusing to boot: unconstrained generation reads as model failure and hides that the rails are dark. `
|
|
152
|
+
+ `Check the backend is a live llama-server (/v1/models must carry a per-model 'meta'), or unset PLURNK_PROVIDERS_GBNF to run unconstrained deliberately.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=ProviderInstantiate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderInstantiate.js","sourceRoot":"","sources":["../../src/core/ProviderInstantiate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { LoopFlags } from "./types.ts";
|
|
2
|
+
import type { PacketSection } from "./packet-wire.ts";
|
|
3
|
+
import type ExecutorRegistry from "./ExecutorRegistry.ts";
|
|
4
|
+
import type { Executor } from "./ExecutorRegistry.ts";
|
|
5
|
+
export default class SchemeRegistry {
|
|
6
|
+
#private;
|
|
7
|
+
constructor();
|
|
8
|
+
register(name: string, handler: object): void;
|
|
9
|
+
registerRuntimeSchemes(executors: ExecutorRegistry): void;
|
|
10
|
+
registerRuntimeScheme(tag: string, executor: Executor): void;
|
|
11
|
+
get(name: string): object | undefined;
|
|
12
|
+
has(name: string): boolean;
|
|
13
|
+
isExternal(name: string): boolean;
|
|
14
|
+
list(): string[];
|
|
15
|
+
defaultChannelFor(scheme: string | null): string;
|
|
16
|
+
teach(): string;
|
|
17
|
+
docs(): Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}>;
|
|
21
|
+
transformSections(sections: PacketSection[]): Promise<PacketSection[]>;
|
|
22
|
+
discoverExternal(cwd?: string): Promise<void>;
|
|
23
|
+
attributions(): string[];
|
|
24
|
+
resolveForLoop(flags: LoopFlags): Set<string>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=SchemeRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemeRegistry.d.ts","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkBtD,MAAM,CAAC,OAAO,OAAO,cAAc;;IAc/B,cAaC;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5C;IAOD,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAMxD;IAOD,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ3D;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAqC;IAE1E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAqC;IAI/D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAqC;IAEtE,IAAI,IAAI,MAAM,EAAE,CAAkD;IAIlE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI/C;IAWD,KAAK,IAAI,MAAM,CAYd;IAID,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAW/C;IAOK,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAO3E;IAUK,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAajE;IAID,YAAY,IAAI,MAAM,EAAE,CAAoC;IAI5D,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAE5C;CACJ"}
|