@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,18 @@
|
|
|
1
|
+
// Service-owned policy: maps an executor-declared `effect` to the proposal
|
|
2
|
+
// lifecycle. The executor declares the FACT (does this invocation mutate the
|
|
3
|
+
// host?); the service decides the POLICY (does it need a human gate?).
|
|
4
|
+
//
|
|
5
|
+
// Default (plurnk-service#182): `host` runs code / mutates the host → propose;
|
|
6
|
+
// `read` (observes external state) and `pure` (no observable effect) are
|
|
7
|
+
// side-effect-free → auto-run, no human in the loop. Conservative by
|
|
8
|
+
// construction — an undeclared/unknown effect classifies as `host` upstream
|
|
9
|
+
// (BaseExecutor.effect defaults to host), so it lands here as propose.
|
|
10
|
+
//
|
|
11
|
+
// Deployment-tunability (a high-security deployment proposing even `read`) is a
|
|
12
|
+
// later env knob; the default map is the contract until one is needed.
|
|
13
|
+
export default class EffectPolicy {
|
|
14
|
+
static decide(effect) {
|
|
15
|
+
return effect === "host" ? "propose" : "auto";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=EffectPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EffectPolicy.js","sourceRoot":"","sources":["../../src/schemes/EffectPolicy.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,6EAA6E;AAC7E,uEAAuE;AACvE,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,qEAAqE;AACrE,4EAA4E;AAC5E,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,MAAM,CAAC,MAAM,CAAC,MAAc;QACxB,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAClD,CAAC;CACJ"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ExecStatement, FindStatement, ReadStatement } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
|
|
3
|
+
import type { ReadResult } from "./_entry-ops.ts";
|
|
4
|
+
import type { EntryData, ReadEntryResult, WriteEntryResult, DeleteEntryResult } from "./_entry-crud.ts";
|
|
5
|
+
import type { FindResult } from "./_entry-find.ts";
|
|
6
|
+
type ExecResult = {
|
|
7
|
+
status: number;
|
|
8
|
+
body?: string;
|
|
9
|
+
attrs?: object;
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
export default class Exec {
|
|
13
|
+
#private;
|
|
14
|
+
static manifest: SchemeManifest;
|
|
15
|
+
idle(): Promise<void>;
|
|
16
|
+
hasActiveSpawns(runId: number): boolean;
|
|
17
|
+
hasActiveHoldSpawns(runId: number, holdSet: ReadonlySet<string>): boolean;
|
|
18
|
+
kill(pathname: string, signal: number | null, ctx: PlurnkSchemeContext): Promise<{
|
|
19
|
+
status: number;
|
|
20
|
+
error?: string;
|
|
21
|
+
}>;
|
|
22
|
+
abortSubscription(subscriptionId: number): void;
|
|
23
|
+
exec(statement: ExecStatement, ctx: PlurnkSchemeContext): Promise<ExecResult>;
|
|
24
|
+
applyResolution(args: {
|
|
25
|
+
attrs: object;
|
|
26
|
+
body?: string;
|
|
27
|
+
}, ctx: PlurnkSchemeContext): Promise<{
|
|
28
|
+
status: number;
|
|
29
|
+
outcome?: string;
|
|
30
|
+
body?: string;
|
|
31
|
+
}>;
|
|
32
|
+
read(statement: ReadStatement, ctx: PlurnkSchemeContext): Promise<ReadResult>;
|
|
33
|
+
find(statement: FindStatement, ctx: PlurnkSchemeContext): Promise<FindResult>;
|
|
34
|
+
readEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<ReadEntryResult>;
|
|
35
|
+
writeEntry(pathname: string, entry: EntryData, ctx: PlurnkSchemeContext): Promise<WriteEntryResult>;
|
|
36
|
+
deleteEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<DeleteEntryResult>;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=Exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Exec.d.ts","sourceRoot":"","sources":["../../src/schemes/Exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAkB,MAAM,wBAAwB,CAAC;AAM1G,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAsDpF,MAAM,CAAC,OAAO,OAAO,IAAI;;IACrB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAc7B;IAKI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAMD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGtC;IAMD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAGxE;IASK,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAYzH;IAQD,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAE9C;IAUK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+ElF;IAEK,eAAe,CACjB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EACtC,GAAG,EAAE,mBAAmB,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAgG9D;IAmLK,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;CACJ"}
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { parsePath } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import { Policy } from "@plurnk/plurnk-execs";
|
|
3
|
+
import SessionSettings from "../core/session-settings.js";
|
|
4
|
+
import EffectPolicy from "./EffectPolicy.js";
|
|
5
|
+
import EntryOps from "./_entry-ops.js";
|
|
6
|
+
import EntryCrud from "./_entry-crud.js";
|
|
7
|
+
import { foldAuthorityIntoPath } from "../core/plurnk-uri.js";
|
|
8
|
+
import EntryFind from "./_entry-find.js";
|
|
9
|
+
import ChannelWrite from "../core/ChannelWrite.js";
|
|
10
|
+
import ExecEnv from "./exec-env.js";
|
|
11
|
+
import ExecAbort from "./exec-abort.js";
|
|
12
|
+
import { writeFile, unlink } from "node:fs/promises";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
// Executors are discovered + probed at boot into ExecutorRegistry and reach
|
|
16
|
+
// the scheme through ctx.executors (plurnk-service#181). Each runtime tag
|
|
17
|
+
// resolves to its sibling executor; the scheme itself stays runtime-agnostic.
|
|
18
|
+
// Per plurnk.md, EXEC's target slot is `cwd`. ParsedPath there means a
|
|
19
|
+
// bare local path or file:/// URL — both decode to a filesystem directory.
|
|
20
|
+
// Anything else is rejected at proposal time.
|
|
21
|
+
const cwdFromTarget = (target) => {
|
|
22
|
+
if (target === null)
|
|
23
|
+
return null;
|
|
24
|
+
if (target.kind === "local")
|
|
25
|
+
return target.raw;
|
|
26
|
+
if (target.kind === "url" && (target.scheme === null || target.scheme === "file")) {
|
|
27
|
+
return target.pathname;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
// #201 — a plurnk-scheme target (known/exec/log/…), distinct from file/local
|
|
32
|
+
// (which cwdFromTarget handles as a path). Its content is resolved at apply-time;
|
|
33
|
+
// executors stay scheme-blind (SPEC §5), so the scheme — not the executor — reads it.
|
|
34
|
+
const schemeTargetOf = (target) => {
|
|
35
|
+
if (target === null || target.kind !== "url")
|
|
36
|
+
return null;
|
|
37
|
+
if (target.scheme === null || target.scheme === "file")
|
|
38
|
+
return null;
|
|
39
|
+
return { scheme: target.scheme, pathname: target.pathname, fragment: target.fragment };
|
|
40
|
+
};
|
|
41
|
+
// EXEC's pathname is <runtime>/<loop_seq>/<turn_seq>/<sequence> (stamped by
|
|
42
|
+
// Dispatcher.#writeLog). Exec owns this convention, so it — not the client — turns
|
|
43
|
+
// the pathname into the entry's coordinate, mirrored onto stream payloads so
|
|
44
|
+
// waterfall clients read fields instead of parsing the URI (#224). The
|
|
45
|
+
// coordinate is the trailing three segments (runtime-agnostic); a pathname that
|
|
46
|
+
// isn't a numeric triple yields undefined (no coordinate on the wire).
|
|
47
|
+
const coordinateFromPathname = (pathname) => {
|
|
48
|
+
const seg = pathname.split("/").filter(Boolean);
|
|
49
|
+
if (seg.length < 3)
|
|
50
|
+
return undefined;
|
|
51
|
+
const [loop_seq, turn_seq, sequence] = seg.slice(-3).map(Number);
|
|
52
|
+
if (![loop_seq, turn_seq, sequence].every(Number.isInteger))
|
|
53
|
+
return undefined;
|
|
54
|
+
return { loop_seq, turn_seq, sequence };
|
|
55
|
+
};
|
|
56
|
+
export default class Exec {
|
|
57
|
+
static manifest = {
|
|
58
|
+
name: "exec",
|
|
59
|
+
channels: { stdout: "text/stream", stderr: "text/stream" },
|
|
60
|
+
defaultChannel: "stdout",
|
|
61
|
+
category: "data",
|
|
62
|
+
scope: "session",
|
|
63
|
+
writableBy: ["model", "client"],
|
|
64
|
+
volatile: true,
|
|
65
|
+
modelVisible: true,
|
|
66
|
+
example: "<<EXEC[sqlite]:SELECT 22.0 / 7.0:EXEC",
|
|
67
|
+
documentation: "Runs a command in a runtime — `<<EXEC[runtime](cwd):command:EXEC` — output streams into the run's `<runtime>:///<loop>/<turn>/<seq>` entry on the runtime's own channels (a subprocess → stdout/stderr; a computational runtime like sqlite/jq → a JSON `results` channel). A host-effecting command proposes for review before it runs; a read-only/pure one runs ungated. Either way you never fetch the output: the engine surfaces each turn's new stream bytes to you automatically — folded while the command runs, opened when it finishes.",
|
|
68
|
+
flags: {
|
|
69
|
+
excludedInAsk: true,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
#activeAborts = new Map();
|
|
73
|
+
#activeSpawns = new Map();
|
|
74
|
+
async idle() {
|
|
75
|
+
await Promise.allSettled([...this.#activeSpawns.values()]);
|
|
76
|
+
}
|
|
77
|
+
// Whether the run has an in-flight spawn (a background exec). The daemon
|
|
78
|
+
// reads this only for loop.cancel's cancelled=true/false answer — the
|
|
79
|
+
// teardown itself rides the run's cancellation scope (the spawn's
|
|
80
|
+
// ctx.signal), so even a spawn registering after the cancel self-aborts.
|
|
81
|
+
hasActiveSpawns(runId) {
|
|
82
|
+
for (const { runId: r } of this.#activeAborts.values())
|
|
83
|
+
if (r === runId)
|
|
84
|
+
return true;
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
// §exec-hold-until-concluded — does the run hold an in-flight spawn whose RUNTIME is in the
|
|
88
|
+
// operator's hold set? The turn-hold exception (owner ruling): for streams we know and
|
|
89
|
+
// control (the search family — one final JSON digest, seconds-bounded), the engine holds
|
|
90
|
+
// the next packet until conclusion instead of giving the model a turn it can only waste.
|
|
91
|
+
hasActiveHoldSpawns(runId, holdSet) {
|
|
92
|
+
for (const { runId: r, runtime } of this.#activeAborts.values())
|
|
93
|
+
if (r === runId && holdSet.has(runtime))
|
|
94
|
+
return true;
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
// Process-KILL (plurnk-service#203). A running (host/background) exec is
|
|
98
|
+
// addressable by its coordinate pathname; KILL aborts that spawn's controller with
|
|
99
|
+
// the model's signal — KILL[code] → exactly that signal once (KILL[9] = SIGKILL), a
|
|
100
|
+
// bare KILL → the executor's SIGHUP default. The model owns escalation, so there
|
|
101
|
+
// is no auto-escalation here. The full #203 status matrix: 200 killed (in-flight) · 410
|
|
102
|
+
// killed-earlier (a prior abort closed the stream 499) · 304 already-exited (closed
|
|
103
|
+
// with any other terminal status) · 404 unknown (no subscription for that coordinate).
|
|
104
|
+
async kill(pathname, signal, ctx) {
|
|
105
|
+
for (const entry of this.#activeAborts.values()) {
|
|
106
|
+
if (entry.pathname === pathname) {
|
|
107
|
+
entry.controller.abort(ExecAbort.killReason(signal));
|
|
108
|
+
return { status: 200 };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Not running — settle the outcome from the closed subscription's status.
|
|
112
|
+
const terminal = await ChannelWrite.execTerminalStatus(ctx.db, { sessionId: ctx.sessionId, pathname });
|
|
113
|
+
if (terminal === null)
|
|
114
|
+
return { status: 404, error: `no exec at exec://${pathname}` };
|
|
115
|
+
if (terminal === 499)
|
|
116
|
+
return { status: 410, error: `exec://${pathname} was killed earlier` };
|
|
117
|
+
return { status: 304 };
|
|
118
|
+
}
|
|
119
|
+
// Registry-routed reap (§run-lifecycle-total-reap): the daemon's cancel iterates
|
|
120
|
+
// the run's open subscriptions and calls this per id, aborting the spawn's
|
|
121
|
+
// controller directly. Idempotent — a no-op if the spawn already finished or this
|
|
122
|
+
// id isn't ours. Distinct from kill (by pathname, the model's KILL op): this is by
|
|
123
|
+
// subscription id, the run-level reap that does not depend on the signal listener.
|
|
124
|
+
// Always a teardown — the bounded housekeeping reap, never the model's bare signal.
|
|
125
|
+
abortSubscription(subscriptionId) {
|
|
126
|
+
this.#activeAborts.get(subscriptionId)?.controller.abort(ExecAbort.teardownReason());
|
|
127
|
+
}
|
|
128
|
+
// EXEC op handler — the actual model-facing entry point per plurnk.md.
|
|
129
|
+
// `<<EXEC[runtime](cwd):command:EXEC` →
|
|
130
|
+
// signal=runtime, target=cwd (ParsedPath local/file or null), body=command.
|
|
131
|
+
//
|
|
132
|
+
// Proposes (status=202) with attrs={runtime, cwd, command, pathname}.
|
|
133
|
+
// applyResolution spawns the subprocess; output streams into the
|
|
134
|
+
// coordinate-stamped <runtime>:///<pathname> entry's stdout/stderr channels
|
|
135
|
+
// (e.g. sh:///1/1/2, §exec/#240). The model READs that entry on a subsequent turn.
|
|
136
|
+
async exec(statement, ctx) {
|
|
137
|
+
let command = statement.body ?? "";
|
|
138
|
+
// #201 — a plurnk-scheme target carries content the scheme resolves at
|
|
139
|
+
// apply-time; an empty body is then legal (the target IS the script).
|
|
140
|
+
const schemeTarget = schemeTargetOf(statement.target);
|
|
141
|
+
if (command.length === 0 && schemeTarget === null) {
|
|
142
|
+
return { status: 400, error: "EXEC requires a command body (or a scheme target to run)" };
|
|
143
|
+
}
|
|
144
|
+
const requested = typeof statement.signal === "string" ? statement.signal : "";
|
|
145
|
+
let runtime = requested === "" ? "sh" : requested; // empty signal = default shell
|
|
146
|
+
if (ctx.executors === undefined)
|
|
147
|
+
throw new Error("exec dispatched without an executor registry");
|
|
148
|
+
// §exec-runtime-fallthrough (#350, the execs architect's resolution to the go-501 saga):
|
|
149
|
+
// an UNREGISTERED tag falls through to the shell with the tag as the command word —
|
|
150
|
+
// EXEC[go]:test ./... runs as sh: `go test ./...`. Per-tool runtimes (go/cargo/make/npm)
|
|
151
|
+
// never earn tags (owner, execs#21); this automates the principle. The output entry lands
|
|
152
|
+
// under sh:// (it ran on sh), telemetry records what models reach FOR (the promotion
|
|
153
|
+
// signal is data, not guesswork), and a typo'd tag becomes the shell's own clear 127.
|
|
154
|
+
// No new surface: anything expressible as EXEC[foo]:bar was expressible as EXEC[sh]:foo bar.
|
|
155
|
+
let fellThroughFrom = null;
|
|
156
|
+
if (requested !== "" && ctx.executors.entry(runtime) === undefined && ctx.executors.entry("sh") !== undefined) {
|
|
157
|
+
fellThroughFrom = runtime;
|
|
158
|
+
command = command.length > 0 ? `${runtime} ${command}` : runtime;
|
|
159
|
+
runtime = "sh";
|
|
160
|
+
}
|
|
161
|
+
// #328 — per-session client policy narrows the boot-registered set (subtractive). A tag the
|
|
162
|
+
// session's client layer disables is ABSENT for this session — refused like an unavailable
|
|
163
|
+
// runtime. Checked on the EFFECTIVE runtime: a fall-through rides sh's gate, so a session
|
|
164
|
+
// that disabled sh gets the refusal, never a side door.
|
|
165
|
+
const sessionExecs = (await SessionSettings.read(ctx.db, ctx.sessionId)).execs;
|
|
166
|
+
if (sessionExecs !== null && !Policy.isEnabled(runtime, sessionExecs)) {
|
|
167
|
+
return { status: 501, error: `\`${runtime}\` is disabled for this session by client policy (PLURNK_EXECS_*)` };
|
|
168
|
+
}
|
|
169
|
+
const resolved = ctx.executors.entry(runtime); // registry resolves the runtime tag; unknown/unavailable → 501 — §exec-registry-resolves
|
|
170
|
+
if (resolved === undefined) {
|
|
171
|
+
return { status: 501, error: `\`${runtime}\` is not a configured runtime. available: ${ctx.executors.availableRuntimes().join(", ")}` };
|
|
172
|
+
}
|
|
173
|
+
if (fellThroughFrom !== null) {
|
|
174
|
+
ctx.pushTelemetry?.({ source: "exec:dispatch", kind: "exec_runtime_fallthrough", message: `EXEC[${fellThroughFrom}] fell through to sh`, requested: fellThroughFrom, level: "info" });
|
|
175
|
+
}
|
|
176
|
+
if (!resolved.available) {
|
|
177
|
+
const why = resolved.detail === undefined ? "" : `: ${resolved.detail}`;
|
|
178
|
+
return { status: 501, error: `\`${runtime}\` is unavailable${why}` };
|
|
179
|
+
}
|
|
180
|
+
// The parsed (target) slot — the executor's DATA SOURCE (jq input file / sqlite db / wasm
|
|
181
|
+
// module; ignored by subprocess). execs 0.4.26 (#15) carries it distinct from cwd.
|
|
182
|
+
const target = cwdFromTarget(statement.target);
|
|
183
|
+
// Effect classifies by the target only, never by parsing the command (#289): host → propose,
|
|
184
|
+
// read/pure → auto-run inline (plurnk-service#182).
|
|
185
|
+
const policy = EffectPolicy.decide(resolved.executor.effect(target, command));
|
|
186
|
+
// cwd is ALWAYS the session WORKSPACE (project_root) — the process working directory a relative
|
|
187
|
+
// target resolves against (execs 0.4.26 §2). The old overload (target-as-cwd) is gone: EXEC runs
|
|
188
|
+
// in the same directory the File scheme writes to, and a data-source runtime resolves its target
|
|
189
|
+
// against it (so EXEC[jq](data/x.json) finds the workspace file, not one at the daemon's cwd).
|
|
190
|
+
const sessionRow = await ctx.db.envelope_get_session.get({ id: ctx.sessionId });
|
|
191
|
+
const cwd = sessionRow?.project_root ?? null;
|
|
192
|
+
// Pathname is assigned by Dispatcher.#writeLog as <runtime>/<loop_seq>/
|
|
193
|
+
// <turn_seq>/<sequence> (executor-domain + coordinate, e.g. sh/1/1/2).
|
|
194
|
+
// `pathname` is stamped into attrs at log-write time; applyResolution
|
|
195
|
+
// reads it back here.
|
|
196
|
+
// EXEC repurposes the `<L>` slot as `<timeout, poll>` (seconds): mark[0] caps the spawn's
|
|
197
|
+
// lifetime, mark[1] sets the hibernation poll-wake cadence (§exec-poll). N>0 → deadline (504);
|
|
198
|
+
// -1 / absent → unbounded (loop-life bounded); 0 → turn-scoped (reaped at the next pre-turn,
|
|
199
|
+
// never surviving into the subsequent turn).
|
|
200
|
+
const marks = statement.lineMarker?.marks;
|
|
201
|
+
const timeoutSec = typeof marks?.[0] === "number" && marks[0] > 0 ? Math.floor(marks[0]) : undefined;
|
|
202
|
+
const turnScoped = typeof marks?.[0] === "number" && marks[0] === 0;
|
|
203
|
+
const pollSec = typeof marks?.[1] === "number" && marks[1] > 0 ? Math.floor(marks[1]) : undefined;
|
|
204
|
+
const attrs = {
|
|
205
|
+
runtime, cwd, command, target, pathname: "", inline: policy === "auto",
|
|
206
|
+
...(schemeTarget !== null ? { schemeTarget } : {}),
|
|
207
|
+
...(timeoutSec !== undefined ? { timeoutSec } : {}),
|
|
208
|
+
...(turnScoped ? { turnScoped: true } : {}),
|
|
209
|
+
...(pollSec !== undefined ? { pollSec } : {}),
|
|
210
|
+
};
|
|
211
|
+
// Body shown to client during proposal review — `$ command` is the
|
|
212
|
+
// most-readable summary regardless of runtime.
|
|
213
|
+
const preview = runtime !== "" ? `[${runtime}] ${command}` : `$ ${command}`;
|
|
214
|
+
return { status: 202, body: preview, attrs }; // host runtime proposes with 202 — §exec-host-proposes
|
|
215
|
+
}
|
|
216
|
+
async applyResolution(args, ctx) {
|
|
217
|
+
const attrs = args.attrs;
|
|
218
|
+
let command = typeof attrs.command === "string" ? attrs.command : "";
|
|
219
|
+
const pathname = attrs.pathname;
|
|
220
|
+
const runtime = (typeof attrs.runtime === "string" && attrs.runtime !== "") ? attrs.runtime : "sh";
|
|
221
|
+
const cwd = (typeof attrs.cwd === "string" && attrs.cwd.length > 0) ? attrs.cwd : null;
|
|
222
|
+
let target = (typeof attrs.target === "string" && attrs.target.length > 0) ? attrs.target : null;
|
|
223
|
+
if (typeof pathname !== "string" || pathname.length === 0) {
|
|
224
|
+
return { status: 500, outcome: "missing_pathname" };
|
|
225
|
+
}
|
|
226
|
+
// #201 — resolve a scheme-URI target to content (executors stay scheme-blind).
|
|
227
|
+
// Empty body → the resolved content IS the command (run a stored script).
|
|
228
|
+
// Non-empty body → materialize the content to a temp file whose path becomes
|
|
229
|
+
// the runtime's data-source TARGET (the input for filters/sqlite/wasm).
|
|
230
|
+
let tempPath = null;
|
|
231
|
+
if (attrs.schemeTarget !== undefined) {
|
|
232
|
+
const { scheme, pathname: tPath, fragment } = attrs.schemeTarget;
|
|
233
|
+
const read = await EntryCrud.readEntry(tPath, ctx, scheme);
|
|
234
|
+
if (read.entry === null)
|
|
235
|
+
return { status: 404, outcome: "scheme_target_not_found" };
|
|
236
|
+
const channels = read.entry.channels;
|
|
237
|
+
const channelName = fragment ?? (channels.body !== undefined ? "body" : Object.keys(channels)[0]);
|
|
238
|
+
const content = channelName === undefined ? undefined : channels[channelName]?.content;
|
|
239
|
+
if (content === undefined)
|
|
240
|
+
return { status: 404, outcome: "scheme_target_channel_not_found" };
|
|
241
|
+
if (command.length === 0) {
|
|
242
|
+
command = content;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
tempPath = join(tmpdir(), `plurnk-exec-${ctx.sessionId}-${pathname.replace(/[^a-zA-Z0-9]/g, "-")}`);
|
|
246
|
+
await writeFile(tempPath, content, "utf8");
|
|
247
|
+
target = tempPath;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (command.length === 0) {
|
|
251
|
+
return { status: 500, outcome: "missing_command" };
|
|
252
|
+
}
|
|
253
|
+
// Resolve the runtime's executor from the boot registry, then seed
|
|
254
|
+
// channels from its declared topology (Q1(b) in plurnk-service#174 —
|
|
255
|
+
// executor declares, scheme honors). Each executor declares its own
|
|
256
|
+
// shape (subprocess → stdout/stderr; search → results; etc.).
|
|
257
|
+
if (ctx.executors === undefined)
|
|
258
|
+
return { status: 500, outcome: "no_executor_registry" };
|
|
259
|
+
const resolved = ctx.executors.entry(runtime);
|
|
260
|
+
if (resolved === undefined)
|
|
261
|
+
return { status: 500, outcome: "no_executor" };
|
|
262
|
+
const seedChannels = {};
|
|
263
|
+
for (const [name, decl] of Object.entries(resolved.executor.channels)) {
|
|
264
|
+
seedChannels[name] = {
|
|
265
|
+
content: "",
|
|
266
|
+
mimetype: decl.mimetype,
|
|
267
|
+
state: decl.defaultState ?? "active",
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const seed = { channels: seedChannels, tags: [] };
|
|
271
|
+
// §exec — the stream entry's scheme IS the runtime tag (sh/node), so it addresses by
|
|
272
|
+
// tag authority (sh:///l/t/s). The engine registers each runtime tag → this handler.
|
|
273
|
+
const { entryId } = await EntryCrud.writeEntry(pathname, seed, ctx, runtime);
|
|
274
|
+
if (entryId === null)
|
|
275
|
+
return { status: 500, outcome: "entry_write_failed" };
|
|
276
|
+
const subscriptionId = await ChannelWrite.openSubscription(ctx.db, {
|
|
277
|
+
runId: ctx.runId, entryId, scheme: runtime,
|
|
278
|
+
handle: runtime !== "" ? `${runtime}: ${command}` : command,
|
|
279
|
+
pollSeconds: typeof attrs.pollSec === "number" ? attrs.pollSec : null, // §exec-poll — hibernation wake cadence
|
|
280
|
+
turnScoped: attrs.turnScoped === true, // §exec-poll — `<0>` reaped at the next pre-turn
|
|
281
|
+
});
|
|
282
|
+
const controller = new AbortController();
|
|
283
|
+
let unlink = () => { };
|
|
284
|
+
if (ctx.signal !== undefined) {
|
|
285
|
+
const parent = ctx.signal;
|
|
286
|
+
// The spawn's kill binds to its loop's cancellation epoch (ctx.signal —
|
|
287
|
+
// captured here, stable for the loop). The parent only aborts on FORCEFUL loop
|
|
288
|
+
// teardown — a 202-graceful loop lets its spawns outlive, never firing this — so
|
|
289
|
+
// the reason is always the bounded housekeeping reap. Attach the listener FIRST,
|
|
290
|
+
// then re-check `aborted`: a listener added to an already-aborted signal never
|
|
291
|
+
// fires, so a check-then-attach order LOSES an abort that lands in the gap (R1's
|
|
292
|
+
// TOCTOU leak). Attach-then-check closes it; controller.abort is idempotent, so a
|
|
293
|
+
// doubled fire is harmless. §exec-timeout
|
|
294
|
+
const onParentAbort = () => controller.abort(ExecAbort.teardownReason());
|
|
295
|
+
parent.addEventListener("abort", onParentAbort, { once: true });
|
|
296
|
+
unlink = () => parent.removeEventListener("abort", onParentAbort);
|
|
297
|
+
if (parent.aborted)
|
|
298
|
+
controller.abort(ExecAbort.teardownReason());
|
|
299
|
+
}
|
|
300
|
+
this.#activeAborts.set(subscriptionId, { runId: ctx.runId, pathname, runtime, controller, unlink });
|
|
301
|
+
const tail = this.#runExecutor({
|
|
302
|
+
executor: resolved.executor,
|
|
303
|
+
runtime, command, cwd, target, ctx, pathname,
|
|
304
|
+
entryId, subscriptionId, signal: controller.signal, controller, tempPath,
|
|
305
|
+
timeoutSec: typeof attrs.timeoutSec === "number" ? attrs.timeoutSec : null,
|
|
306
|
+
});
|
|
307
|
+
// Every exec backgrounds + streams (§exec-stream): no same-turn receipt — the output
|
|
308
|
+
// surfaces as the environment-observation injector's delta on the next turn (folded while
|
|
309
|
+
// it runs, opened when it finishes). Pure/read commands still auto-accept (attrs.inline =
|
|
310
|
+
// no human gate); they just resolve a turn later, uniformly with host streams.
|
|
311
|
+
this.#activeSpawns.set(subscriptionId, tail);
|
|
312
|
+
return { status: 200, outcome: "started" };
|
|
313
|
+
}
|
|
314
|
+
// Bridge the executor's sink-style contract (write/setState/emit)
|
|
315
|
+
// onto plurnk-service's storage primitives (appendToChannel,
|
|
316
|
+
// setChannelState, ctx.pushTelemetry). Per plurnk-service#174 Q3,
|
|
317
|
+
// executor TelemetryEvents flow through the same engine path as
|
|
318
|
+
// grammar parse_errors — emit → buffer → next packet + live notify.
|
|
319
|
+
//
|
|
320
|
+
// write() and setState() callbacks must run in emission order:
|
|
321
|
+
// appendToChannel reads channel state AFTER the append commits, so
|
|
322
|
+
// a setState("closed") that races a prior write() can flip the
|
|
323
|
+
// notify's reported state to "closed" before the chunk event fires
|
|
324
|
+
// as "active." Chain through a single promise queue to serialize.
|
|
325
|
+
async #runExecutor(opts) {
|
|
326
|
+
const { executor, runtime, command, cwd, target, ctx, pathname, entryId, subscriptionId, signal, controller, timeoutSec, tempPath } = opts;
|
|
327
|
+
const db = ctx.db;
|
|
328
|
+
const coordinate = coordinateFromPathname(pathname); // #224 — stamped on stream/event + stream/concluded
|
|
329
|
+
// grammar 0.74.20 EXEC `<T>` — kill the spawn after T seconds. unref'd so a pending timer never
|
|
330
|
+
// holds the process open; cleared in finally so a spawn that finishes first leaves no timer.
|
|
331
|
+
let timedOut = false;
|
|
332
|
+
const timeoutTimer = timeoutSec !== null
|
|
333
|
+
? setTimeout(() => { timedOut = true; controller.abort(ExecAbort.timeoutReason()); }, timeoutSec * 1000)
|
|
334
|
+
: null;
|
|
335
|
+
timeoutTimer?.unref();
|
|
336
|
+
let queue = Promise.resolve();
|
|
337
|
+
const enqueue = (op) => {
|
|
338
|
+
queue = queue.then(op, op);
|
|
339
|
+
};
|
|
340
|
+
let closeStatus = 500;
|
|
341
|
+
let exitLabel = "spawn_failed";
|
|
342
|
+
let stdoutLength = 0;
|
|
343
|
+
let stderrLength = 0;
|
|
344
|
+
// §exec-entry-sink (#340) — the executor's entry() materialization request. The executor
|
|
345
|
+
// owns zero substrate: it hands us (path, content, {tags, mimetype}) and WE create/update
|
|
346
|
+
// the entry (writeEntry upsert; tags UNIONED — writeEntry alone replaces), then narrate ONE
|
|
347
|
+
// EDIT row in the reserved plurnk run's log (the fs-fiction pattern, source = the calling
|
|
348
|
+
// run) — the existing env-delta ambience folds it into every run's next packet. The row is a
|
|
349
|
+
// FULL fiction: tx carries the statement (body = the written content — the journal records
|
|
350
|
+
// the write, replay/fork-complete), rx carries the span (§edit-result-render, the whole
|
|
351
|
+
// content numbered — a wholesale write's span IS the content; no diff, which would be a
|
|
352
|
+
// pathological cost against a rewritten multi-MB page). Rendered folded by default, so no
|
|
353
|
+
// body rides a packet uninvited — the meta line carries the honest OPEN cost.
|
|
354
|
+
// Serialized: parallel entry() calls (allSettled) write in order; a rejection prunes that
|
|
355
|
+
// survivor executor-side without breaking the chain. Lazy narration context: one plurnk-run
|
|
356
|
+
// turn per spawn, not per entry.
|
|
357
|
+
let entryChain = Promise.resolve();
|
|
358
|
+
let narration = null;
|
|
359
|
+
const entrySink = (path, content, opts) => {
|
|
360
|
+
const op = async () => {
|
|
361
|
+
const parsed = parsePath(path);
|
|
362
|
+
if (parsed === null || parsed.kind !== "url" || parsed.scheme === null)
|
|
363
|
+
throw new Error(`entry(): '${path.slice(0, 80)}' is not a URL`);
|
|
364
|
+
const pathname = foldAuthorityIntoPath(parsed.hostname, parsed.pathname);
|
|
365
|
+
const prior = await EntryCrud.readEntry(pathname, ctx, parsed.scheme);
|
|
366
|
+
const tags = [...new Set([...(prior.entry?.tags ?? []), ...opts.tags])];
|
|
367
|
+
// The web-fetch entry point: a fetched html page stores the handler's readable
|
|
368
|
+
// projection as the decisive `body` (text/markdown — what READ serves, FIND matches,
|
|
369
|
+
// FTS indexes, every price reports) with the raw page under `html` (xpath + archive).
|
|
370
|
+
// Scoped HERE, not writeEntry: only auto-fetched web content projects; authored files
|
|
371
|
+
// stay verbatim (a `<user email=…>` roster's attribute data must survive a default READ).
|
|
372
|
+
let channels = { body: { content, mimetype: opts.mimetype } };
|
|
373
|
+
let decisive = content;
|
|
374
|
+
if (opts.mimetype === "text/html" && ctx.mimetypes !== undefined) {
|
|
375
|
+
const projected = (await ctx.mimetypes.process({ content, hint: "text/html" }, { channels: ["content"] })).content;
|
|
376
|
+
if (typeof projected === "string" && projected.length > 0) {
|
|
377
|
+
channels = { body: { content: projected, mimetype: "text/markdown" }, html: { content, mimetype: opts.mimetype } };
|
|
378
|
+
decisive = projected;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
const written = await EntryCrud.writeEntry(pathname, { channels, tags }, ctx, parsed.scheme);
|
|
382
|
+
if (narration === null) {
|
|
383
|
+
const run = await db.envelope_get_run_by_name.get({ session_id: ctx.sessionId, name: "plurnk" })
|
|
384
|
+
?? await db.envelope_insert_run.get({ session_id: ctx.sessionId, name: "plurnk", origin: "plurnk" });
|
|
385
|
+
if (run === undefined)
|
|
386
|
+
throw new Error("entry(): plurnk run resolution returned no row");
|
|
387
|
+
const loop = await db.envelope_insert_client_loop.get({ run_id: run.id });
|
|
388
|
+
if (loop === undefined)
|
|
389
|
+
throw new Error("entry(): loop insert returned no row");
|
|
390
|
+
const seqRow = await db.client_turn_next_sequence.get({ loop_id: loop.id });
|
|
391
|
+
const turn = await db.client_turn_insert.get({ loop_id: loop.id, sequence: seqRow?.next ?? 1, packet: "{}" });
|
|
392
|
+
if (turn === undefined)
|
|
393
|
+
throw new Error("entry(): turn insert returned no row");
|
|
394
|
+
narration = { runId: run.id, loopId: loop.id, turnId: turn.id, seq: 1 };
|
|
395
|
+
}
|
|
396
|
+
await db.engine_insert_log_entry.get({
|
|
397
|
+
run_id: narration.runId, loop_id: narration.loopId, turn_id: narration.turnId, sequence: narration.seq++,
|
|
398
|
+
// signal carries the tags — the SAME slot a model's EDIT[tags] uses, so the
|
|
399
|
+
// ambient row renders its tags natively everywhere (packet meta line, digest).
|
|
400
|
+
origin: "plurnk", source: String(ctx.runId), op: "EDIT", suffix: "", signal: JSON.stringify(tags),
|
|
401
|
+
scheme: parsed.scheme, username: null, password: null, hostname: null, port: null,
|
|
402
|
+
pathname, params: null, fragment: null, lineMarker: null,
|
|
403
|
+
tx: JSON.stringify({ op: "EDIT", body: content }), mimetype_tx: "application/json",
|
|
404
|
+
rx: JSON.stringify({
|
|
405
|
+
status: written.status, entryId: written.entryId, tags,
|
|
406
|
+
span: decisive.split("\n").map((l, n) => `${n + 1}:\t${l}`).join("\n"),
|
|
407
|
+
}), mimetype_rx: "application/json",
|
|
408
|
+
status_rx: written.status, tokens: ctx.tokenize?.(decisive) ?? 0, state: "resolved", outcome: null,
|
|
409
|
+
attrs: JSON.stringify({ tags }),
|
|
410
|
+
});
|
|
411
|
+
};
|
|
412
|
+
const run = entryChain.then(op, op);
|
|
413
|
+
entryChain = run.then(() => undefined, () => undefined);
|
|
414
|
+
return run;
|
|
415
|
+
};
|
|
416
|
+
try {
|
|
417
|
+
let result = null;
|
|
418
|
+
try {
|
|
419
|
+
result = await executor.run({
|
|
420
|
+
runtime, command, cwd, target, signal,
|
|
421
|
+
entry: entrySink,
|
|
422
|
+
env: ExecEnv.scoped(), // SPEC §exec {§exec-env-scoped} — never plurnk's own secrets
|
|
423
|
+
write: (channel, chunk) => enqueue(() => ChannelWrite.appendToChannel(db, {
|
|
424
|
+
entryId, channel, chunk, notify: ctx.streamEventNotify, coordinate,
|
|
425
|
+
})),
|
|
426
|
+
setState: (channel, state) => enqueue(() => ChannelWrite.setChannelState(db, {
|
|
427
|
+
entryId, channel, state, notify: ctx.streamEventNotify, coordinate,
|
|
428
|
+
})),
|
|
429
|
+
emit: (event) => {
|
|
430
|
+
// The executor daughter's TelemetryEvent predates grammar's required `level`;
|
|
431
|
+
// inject a default (forwarding the producer's own severity when it supplies one). #276
|
|
432
|
+
const level = event.level ?? "info";
|
|
433
|
+
ctx.pushTelemetry?.({ ...event, level });
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
// Drain the queue so the subscription doesn't close before
|
|
437
|
+
// final chunk events / state transitions have committed.
|
|
438
|
+
await queue;
|
|
439
|
+
}
|
|
440
|
+
catch (cause) {
|
|
441
|
+
// A rejecting driver must still CONCLUDE its stream — uncaught, the subscription sat
|
|
442
|
+
// open forever and the floating spawn promise was an unhandled rejection.
|
|
443
|
+
exitLabel = `driver_crashed: ${cause instanceof Error ? cause.message : String(cause)}`;
|
|
444
|
+
}
|
|
445
|
+
if (result !== null) {
|
|
446
|
+
const exitCode = result.exitCode ?? -1;
|
|
447
|
+
closeStatus = result.status;
|
|
448
|
+
// A timeout aborts the spawn → the executor reports 499; restamp it 504 so the model
|
|
449
|
+
// sees "ran out of time" distinct from a deliberate kill/cancel (§exec-timeout).
|
|
450
|
+
if (timedOut && closeStatus === 499)
|
|
451
|
+
closeStatus = 504;
|
|
452
|
+
// The service's own abort knowledge outranks a driver's claim: a spawn we reaped
|
|
453
|
+
// (teardown/kill/cancel) did not succeed, whatever status it resolved under abort.
|
|
454
|
+
if (signal.aborted && !timedOut && closeStatus < 400) {
|
|
455
|
+
closeStatus = 499;
|
|
456
|
+
exitLabel = "reaped";
|
|
457
|
+
}
|
|
458
|
+
else
|
|
459
|
+
exitLabel = closeStatus === 504 ? `timed out after ${timeoutSec}s`
|
|
460
|
+
: closeStatus === 499 ? "aborted"
|
|
461
|
+
: closeStatus === 500 && exitCode === -1 ? "spawn_failed"
|
|
462
|
+
: `exit ${exitCode}`;
|
|
463
|
+
}
|
|
464
|
+
await ChannelWrite.closeSubscription(db, { subscriptionId, status: closeStatus });
|
|
465
|
+
const stdoutMeta = await db.channel_meta.get({ entry_id: entryId, channel: "stdout" });
|
|
466
|
+
const stderrMeta = await db.channel_meta.get({ entry_id: entryId, channel: "stderr" });
|
|
467
|
+
stdoutLength = stdoutMeta?.contentLength ?? 0;
|
|
468
|
+
stderrLength = stderrMeta?.contentLength ?? 0;
|
|
469
|
+
}
|
|
470
|
+
finally {
|
|
471
|
+
if (timeoutTimer !== null)
|
|
472
|
+
clearTimeout(timeoutTimer); // a finished spawn leaves no pending timer
|
|
473
|
+
// #201 — a materialized data-source temp file outlives the spawn it fed;
|
|
474
|
+
// unlink it once the run settles (open-unlink is safe on Linux).
|
|
475
|
+
if (tempPath !== null)
|
|
476
|
+
await unlink(tempPath).catch(() => { });
|
|
477
|
+
this.#activeAborts.get(subscriptionId)?.unlink();
|
|
478
|
+
this.#activeAborts.delete(subscriptionId);
|
|
479
|
+
this.#activeSpawns.delete(subscriptionId);
|
|
480
|
+
// Every run backgrounds now (§exec-stream) — wake a parked loop on completion so the
|
|
481
|
+
// run resumes to the turn where the stream's terminal delta surfaces.
|
|
482
|
+
if (ctx.wakeRunNotify !== undefined) {
|
|
483
|
+
ctx.wakeRunNotify({
|
|
484
|
+
sessionId: ctx.sessionId, runId: ctx.runId,
|
|
485
|
+
entryId, target: `${runtime}://${pathname}`, subscriptionId, closeStatus,
|
|
486
|
+
scheme: runtime,
|
|
487
|
+
summary: `${runtime}://${pathname} completed (${exitLabel}); stdout=${stdoutLength} bytes, stderr=${stderrLength} bytes`,
|
|
488
|
+
...coordinate,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return closeStatus;
|
|
493
|
+
}
|
|
494
|
+
async read(statement, ctx) {
|
|
495
|
+
return EntryOps.readSessionEntry(statement, ctx, Exec.manifest);
|
|
496
|
+
}
|
|
497
|
+
async find(statement, ctx) {
|
|
498
|
+
return EntryFind.findSessionEntries(statement, ctx, Exec.manifest);
|
|
499
|
+
}
|
|
500
|
+
async readEntry(pathname, ctx) {
|
|
501
|
+
return EntryCrud.readEntry(pathname, ctx, Exec.manifest.name);
|
|
502
|
+
}
|
|
503
|
+
async writeEntry(pathname, entry, ctx) {
|
|
504
|
+
return EntryCrud.writeEntry(pathname, entry, ctx, Exec.manifest.name);
|
|
505
|
+
}
|
|
506
|
+
async deleteEntry(pathname, ctx) {
|
|
507
|
+
return EntryCrud.deleteEntry(pathname, ctx, Exec.manifest.name);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=Exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Exec.js","sourceRoot":"","sources":["../../src/schemes/Exec.ts"],"names":[],"mappings":"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"}
|