@plurnk/plurnk-service 0.21.0 → 0.23.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/README.md +6 -6
- package/SPEC.md +347 -291
- package/dist/Paths.d.ts +4 -0
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +20 -0
- package/dist/Paths.js.map +1 -1
- package/dist/content/edited-span.js +2 -2
- package/dist/content/edited-span.js.map +1 -1
- package/dist/content/matcher.js +1 -1
- package/dist/content/matcher.js.map +1 -1
- package/dist/content/mimetype-binary.js +1 -1
- package/dist/content/mimetype-binary.js.map +1 -1
- package/dist/core/ChannelWrite.js +2 -2
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +72 -46
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/ExecutorRegistry.js +1 -1
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/PluginLoader.js +1 -1
- package/dist/core/PluginLoader.js.map +1 -1
- package/dist/core/SchemeRegistry.js +1 -1
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/caps/DbChannelCaps.js +1 -1
- package/dist/core/caps/DbChannelCaps.js.map +1 -1
- package/dist/core/caps/DbEntryCaps.js +1 -1
- package/dist/core/caps/DbEntryCaps.js.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.js +1 -1
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
- package/dist/core/fork.d.ts +5 -0
- package/dist/core/fork.d.ts.map +1 -0
- package/dist/core/fork.js +47 -0
- package/dist/core/fork.js.map +1 -0
- package/dist/core/git-membership.js +4 -4
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.js +1 -1
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +18 -13
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/schemes/File.js +6 -6
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/_entry-crud.js +2 -2
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-find.js +1 -1
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-graph.js +1 -1
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-manifest.js +1 -1
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.js +6 -6
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-semantic.js +1 -1
- package/dist/schemes/_entry-semantic.js.map +1 -1
- package/dist/schemes/_entry-send.js +3 -3
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/server/ClientConnection.js +3 -3
- package/dist/server/ClientConnection.js.map +1 -1
- package/dist/server/Daemon.d.ts +2 -2
- package/dist/server/Daemon.js +4 -4
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/MethodRegistry.js +1 -1
- package/dist/server/MethodRegistry.js.map +1 -1
- package/dist/server/envelope.d.ts +1 -0
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +19 -6
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/methods/_dispatchAsPlurnk.d.ts +7 -0
- package/dist/server/methods/_dispatchAsPlurnk.d.ts.map +1 -0
- package/dist/server/methods/_dispatchAsPlurnk.js +23 -0
- package/dist/server/methods/_dispatchAsPlurnk.js.map +1 -0
- package/dist/server/methods/entry_read.js +1 -1
- package/dist/server/methods/entry_read.js.map +1 -1
- package/dist/server/methods/log_read.js +1 -1
- package/dist/server/methods/log_read.js.map +1 -1
- package/dist/server/methods/loop_cancel.js +1 -1
- package/dist/server/methods/loop_cancel.js.map +1 -1
- package/dist/server/methods/loop_resolve.js +1 -1
- package/dist/server/methods/loop_resolve.js.map +1 -1
- package/dist/server/methods/loop_run.d.ts.map +1 -1
- package/dist/server/methods/loop_run.js +31 -4
- package/dist/server/methods/loop_run.js.map +1 -1
- package/dist/server/methods/session_constraints.js +2 -2
- package/dist/server/methods/session_constraints.js.map +1 -1
- package/dist/server/yolo.js +1 -1
- package/dist/server/yolo.js.map +1 -1
- package/migrations/0000-00-00.01_schema.sql +7 -7
- package/package.json +11 -11
- package/requirements.md +2 -1
package/dist/Paths.d.ts
CHANGED
package/dist/Paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paths.d.ts","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Paths.d.ts","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,OAAO,OAAO,KAAK;;IAItB,MAAM,CAAC,UAAU,SAA8C;IAC/D,MAAM,CAAC,kBAAkB,SAA6C;IAKtE,MAAM,CAAC,WAAW,SAAoD;IAKtE,MAAM,CAAC,cAAc,SAAkC;IAIvD,MAAM,CAAC,mBAAmB,SAAuC;IA8BjE,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAW5D"}
|
package/dist/Paths.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// re-exports it) so `..` resolves to PACKAGE_ROOT.
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
11
|
import { dirname, resolve } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
12
13
|
export default class Paths {
|
|
13
14
|
static #PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
14
15
|
static #GRAMMAR_ROOT = dirname(fileURLToPath(import.meta.resolve("@plurnk/plurnk-grammar/package.json")));
|
|
@@ -48,5 +49,24 @@ export default class Paths {
|
|
|
48
49
|
}
|
|
49
50
|
return resolve(Paths.#PACKAGE_ROOT, "requirements.md");
|
|
50
51
|
}
|
|
52
|
+
// Operator reference docs auto-READ into every model run at turn 0.
|
|
53
|
+
// `PLURNK_MD_<ALIAS>=<path>` materializes <path>'s markdown as a
|
|
54
|
+
// `plurnk://<ALIAS>.md` entry the model READs — an idiomatic, userland way
|
|
55
|
+
// to inject standing context (an ordinary entry + READ op, not a bespoke
|
|
56
|
+
// packet section like persona). `~` expands to home; relative paths resolve
|
|
57
|
+
// against the package root. Resolved fresh each call so it tracks the env.
|
|
58
|
+
static docs() {
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
61
|
+
if (!key.startsWith("PLURNK_MD_") || typeof value !== "string" || value.length === 0)
|
|
62
|
+
continue;
|
|
63
|
+
const alias = key.slice("PLURNK_MD_".length);
|
|
64
|
+
if (alias.length === 0)
|
|
65
|
+
continue;
|
|
66
|
+
const expanded = value.startsWith("~/") ? resolve(homedir(), value.slice(2)) : value === "~" ? homedir() : value;
|
|
67
|
+
out.push({ entryName: `${alias}.md`, path: resolve(Paths.#PACKAGE_ROOT, expanded) });
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
51
71
|
}
|
|
52
72
|
//# sourceMappingURL=Paths.js.map
|
package/dist/Paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paths.js","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,gDAAgD;AAChD,+EAA+E;AAC/E,6EAA6E;AAC7E,oCAAoC;AACpC,EAAE;AACF,8EAA8E;AAC9E,mDAAmD;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Paths.js","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { diffLines } from "diff";
|
|
2
|
-
// §
|
|
2
|
+
// §edit-result-render — the resulting span: the changed region of `updated` (relative to
|
|
3
3
|
// `original`), line-numbered (1-indexed), with `context` lines of padding above
|
|
4
4
|
// and below. Diff to find the changed lines, render their post-edit state.
|
|
5
5
|
// Shared by EDIT result rendering (`_entry-ops`) and the environment-delta
|
|
6
|
-
// materialization (`Engine`, §
|
|
6
|
+
// materialization (`Engine`, §env-delta) — both show "the edited area as it is now."
|
|
7
7
|
export const editedSpan = (original, updated, context = 2) => {
|
|
8
8
|
const rows = [];
|
|
9
9
|
for (const part of diffLines(original, updated)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edited-span.js","sourceRoot":"","sources":["../../src/content/edited-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,
|
|
1
|
+
{"version":3,"file":"edited-span.js","sourceRoot":"","sources":["../../src/content/edited-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,yFAAyF;AACzF,gFAAgF;AAChF,2EAA2E;AAC3E,2EAA2E;AAC3E,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAO,GAAG,CAAC,EAAU,EAAE;IACjF,MAAM,IAAI,GAAyC,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS,CAAE,0CAA0C;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;YAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAE,iCAAiC;QAC3F,KAAK,MAAM,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,EAAE,GAAG,CAAC;gBAAE,EAAE,GAAG,CAAC,CAAC;YAAC,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;IAC1F,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAAC,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAAC,CAAC,CAAE,oCAAoC;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/F,CAAC,CAAC"}
|
package/dist/content/matcher.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
//
|
|
15
15
|
// Status: 200 = matches; 204 = matcher applied, zero results; 400 = malformed
|
|
16
16
|
// matcher expression; 203 = source unparseable for its mimetype → raw bytes as
|
|
17
|
-
// text so the model can fall back to regex/visual parsing (SPEC §
|
|
17
|
+
// text so the model can fall back to regex/visual parsing (SPEC §matcher-dispatch).
|
|
18
18
|
import { queryGlob, queryRegex, queryJsonpathObject, queryXpathString } from "@plurnk/plurnk-mimetypes";
|
|
19
19
|
import MimetypeBinary from "./mimetype-binary.js";
|
|
20
20
|
export default class Matcher {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;AAChF,2EAA2E;AAC3E,WAAW;AACX,EAAE;AACF,+EAA+E;AAC/E,+DAA+D;AAC/D,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,gFAAgF;AAChF,wEAAwE;AACxE,yEAAyE;AACzE,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// daughter's functions (mandate: static-method class); call sites stay
|
|
4
4
|
// `MimetypeBinary.isBinaryMimetype(...)`.
|
|
5
5
|
//
|
|
6
|
-
// isBinaryMimetype — enforces 415 on binary entries (SPEC §
|
|
6
|
+
// isBinaryMimetype — enforces 415 on binary entries (SPEC §op-invariants)
|
|
7
7
|
// isLineNavigableMimetype — decides the render layer's `N:\t` line prefixes
|
|
8
8
|
// TEXT_PRIMITIVE_MIMETYPE — text/markdown, the auto-derived text default
|
|
9
9
|
import { MimetypeClassifier, TEXT_PRIMITIVE_MIMETYPE as _TEXT_PRIMITIVE_MIMETYPE } from "@plurnk/plurnk-schemes";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mimetype-binary.js","sourceRoot":"","sources":["../../src/content/mimetype-binary.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sEAAsE;AACtE,uEAAuE;AACvE,0CAA0C;AAC1C,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"mimetype-binary.js","sourceRoot":"","sources":["../../src/content/mimetype-binary.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sEAAsE;AACtE,uEAAuE;AACvE,0CAA0C;AAC1C,EAAE;AACF,kFAAkF;AAClF,8EAA8E;AAC9E,2EAA2E;AAC3E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,IAAI,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEjH,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,MAAM,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;IAC1D,MAAM,CAAC,gBAAgB,CAAC,QAAgB,IAAa,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,CAAC,cAAc,CAAC,QAAgB,IAAa,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,CAAC,uBAAuB,CAAC,QAAgB,IAAa,OAAO,kBAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,CAAC,yBAAyB,CAAC,QAAmC,IAAY,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Channel-write helpers for streaming schemes. SPEC §
|
|
2
|
-
// §
|
|
1
|
+
// Channel-write helpers for streaming schemes. SPEC §channel-state (channel state),
|
|
2
|
+
// §subscriptions (subscription registry), §notifications (stream/event notification).
|
|
3
3
|
//
|
|
4
4
|
// Schemes import these and call them as their connection lifecycle progresses.
|
|
5
5
|
// Helpers update entry_channels (content / state) and subscriptions, and emit
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../src/core/Engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../src/core/Engine.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Engine.js
CHANGED
|
@@ -14,7 +14,7 @@ import SchemeCtxImpl from "./caps/SchemeCtxImpl.js";
|
|
|
14
14
|
// projection and digest projection are structurally one function — no
|
|
15
15
|
// drift between wire and digest possible.
|
|
16
16
|
import PacketWire from "./packet-wire.js";
|
|
17
|
-
// SPEC §
|
|
17
|
+
// SPEC §scheme-surface: writer must be in target scheme's manifest.writableBy.
|
|
18
18
|
// OPEN/FOLD/READ/FIND are not gated — they curate the log or read, never mutating an entry.
|
|
19
19
|
const MUTATING_OPS = new Set(["EDIT", "SEND", "COPY", "MOVE", "EXEC", "KILL"]);
|
|
20
20
|
const DEFAULT_MAX_STRIKES = 3;
|
|
@@ -56,7 +56,7 @@ const readMaxCommands = () => {
|
|
|
56
56
|
return n;
|
|
57
57
|
};
|
|
58
58
|
// Resolution timeout — proposed entries auto-cancel if nothing arrives
|
|
59
|
-
// within this window. SPEC.md §
|
|
59
|
+
// within this window. SPEC.md §engine-rails (proposal lifecycle) + §methods (loop.resolve).
|
|
60
60
|
const PROPOSAL_TIMEOUT_DEFAULT_MS = 300000;
|
|
61
61
|
const readProposalTimeoutMs = () => {
|
|
62
62
|
const raw = process.env.PLURNK_PROPOSAL_TIMEOUT_MS;
|
|
@@ -77,7 +77,7 @@ const pathnameFromPath = (path) => {
|
|
|
77
77
|
// loop terminal). No strike, no telemetry.
|
|
78
78
|
const TURN_STATUS_IMPLICIT_CONTINUE = 102;
|
|
79
79
|
// Status assigned to a turn that emitted NO ops at all. Strike-worthy; the
|
|
80
|
-
// action routes through telemetry.errors[] (§
|
|
80
|
+
// action routes through telemetry.errors[] (§telemetry).
|
|
81
81
|
const TURN_STATUS_NO_OPS = 422;
|
|
82
82
|
// Rail #38: action-entry statuses that DON'T accumulate strikes. Model adapted
|
|
83
83
|
// to a finding (not_found, op_not_supported); no penalty. Rummy parallel:
|
|
@@ -189,18 +189,18 @@ class Engine {
|
|
|
189
189
|
#schemes;
|
|
190
190
|
#mimetypes;
|
|
191
191
|
#budgetCeiling;
|
|
192
|
-
// Write-time tokenizer (SPEC §
|
|
193
|
-
// contract (§
|
|
192
|
+
// Write-time tokenizer (SPEC §tokenomics). Synchronous per the provider
|
|
193
|
+
// contract (§provider-surface). Populated from the active provider's countTokens via
|
|
194
194
|
// the Daemon; a divisor tripwire stands in only for bare/standalone
|
|
195
195
|
// construction before a provider is wired (same boot affordance as
|
|
196
|
-
// Mimetypes, §
|
|
196
|
+
// Mimetypes, §mimetype-surface). Real counts come from provider.countTokens.
|
|
197
197
|
#tokenize;
|
|
198
198
|
// Boot-discovered runtime executors. Daemon builds + sets via
|
|
199
199
|
// setExecutors at start(); undefined until then (and in bare tests).
|
|
200
200
|
#executors;
|
|
201
201
|
// Per-loop transient buffer of actionless failures pending surface in the
|
|
202
202
|
// NEXT packet's user.telemetry.errors[]. Drained by #buildTelemetryErrors.
|
|
203
|
-
// Map<loopId, TelemetryError[]>. SPEC §
|
|
203
|
+
// Map<loopId, TelemetryError[]>. SPEC §telemetry.
|
|
204
204
|
#telemetryBuffer = new Map();
|
|
205
205
|
// Rail #38 strike state per loop. `streak` = consecutive struck turns;
|
|
206
206
|
// resets on a clean turn. `turnErrors` is bumped externally by per-turn
|
|
@@ -210,7 +210,7 @@ class Engine {
|
|
|
210
210
|
// Proposal lifecycle: pending dispatch pauses waiting for resolution.
|
|
211
211
|
// Engine.runTurn awaits the promise when a scheme returns status 202;
|
|
212
212
|
// Engine.resolveProposal feeds the resolution back in. Map is per-log-
|
|
213
|
-
// entry-id; entries clear on resolution. SPEC.md §
|
|
213
|
+
// entry-id; entries clear on resolution. SPEC.md §engine-rails + §methods (loop.resolve).
|
|
214
214
|
#pendingProposals = new Map();
|
|
215
215
|
// External observers of proposal lifecycle events. Daemon subscribes
|
|
216
216
|
// here to push `loop/proposal` notifications when an entry enters
|
|
@@ -230,7 +230,7 @@ class Engine {
|
|
|
230
230
|
// buffer is also broadcast live to the connected client(s) on the
|
|
231
231
|
// session. Without this, the client sees `loop/terminated` with a
|
|
232
232
|
// status code but has no way to surface why the loop degraded.
|
|
233
|
-
// Per-grammar 0.17.0 protocol — see SPEC §
|
|
233
|
+
// Per-grammar 0.17.0 protocol — see SPEC §telemetry.
|
|
234
234
|
#telemetryEventNotify;
|
|
235
235
|
// Cached plurnk GBNF — read once on the first constrained generate (#189).
|
|
236
236
|
#gbnfCache = null;
|
|
@@ -248,7 +248,7 @@ class Engine {
|
|
|
248
248
|
discovery: { registry: emptyRegistry(), handlers: new Map() },
|
|
249
249
|
});
|
|
250
250
|
this.#budgetCeiling = readCeiling();
|
|
251
|
-
// Tripwire default matches the Mimetypes boot affordance (SPEC §
|
|
251
|
+
// Tripwire default matches the Mimetypes boot affordance (SPEC §mimetype-surface):
|
|
252
252
|
// the divisor stands in only until the provider-backed tokenizer is
|
|
253
253
|
// wired by the Daemon. Real counts come from provider.countTokens.
|
|
254
254
|
this.#tokenize = tokenize ?? ((text) => Math.ceil(text.length / 4));
|
|
@@ -270,7 +270,7 @@ class Engine {
|
|
|
270
270
|
return this.#gbnfCache;
|
|
271
271
|
}
|
|
272
272
|
// Per-loop usage totals (#197): SUM the loop's turns (usage is stored per
|
|
273
|
-
// turn, §
|
|
273
|
+
// turn, §tokenomics). Surfaced on loop.run + loop/terminated so clients render real
|
|
274
274
|
// token/cost numbers. costPico is the stored pico-dollar unit.
|
|
275
275
|
async loopUsage(loopId) {
|
|
276
276
|
const row = await this.#db.engine_loop_usage.get({ loop_id: loopId });
|
|
@@ -360,7 +360,7 @@ class Engine {
|
|
|
360
360
|
cleanup(row.status < 400 ? "graceful" : "forceful", `loop_terminal_${row.status}`);
|
|
361
361
|
return { turnIds, finalStatus: row.status, hitMaxTurns: false, reason: "external" };
|
|
362
362
|
}
|
|
363
|
-
if (turnIds.length >= maxTurns) {
|
|
363
|
+
if (maxTurns >= 0 && turnIds.length >= maxTurns) {
|
|
364
364
|
await this.#db.engine_loop_cancel.run({ loop_id: loopId });
|
|
365
365
|
cleanup("forceful", "max_turns");
|
|
366
366
|
return { turnIds, finalStatus: 499, hitMaxTurns: true, reason: "max_turns" };
|
|
@@ -370,7 +370,7 @@ class Engine {
|
|
|
370
370
|
turnNumber: turnIds.length + 1, maxTurns,
|
|
371
371
|
});
|
|
372
372
|
turnIds.push(turn.turnId);
|
|
373
|
-
// SPEC §
|
|
373
|
+
// SPEC §grinder: budget hard-stop — packet won't fit even collapsed → abandon.
|
|
374
374
|
if (turn.budgetHardStop) {
|
|
375
375
|
await this.#db.engine_loop_cancel.run({ loop_id: loopId });
|
|
376
376
|
cleanup("forceful", "budget_overflow");
|
|
@@ -389,7 +389,7 @@ class Engine {
|
|
|
389
389
|
const cycle = _a.detectCycle(state.history, minCycles, maxCyclePeriod);
|
|
390
390
|
if (cycle.detected)
|
|
391
391
|
state.turnErrors++;
|
|
392
|
-
// SPEC §
|
|
392
|
+
// SPEC §grinder: a non-soft grinder fire counts toward the strike streak.
|
|
393
393
|
if (turn.budgetStruck)
|
|
394
394
|
state.turnErrors++;
|
|
395
395
|
this.#strikeState.set(loopId, state);
|
|
@@ -400,7 +400,7 @@ class Engine {
|
|
|
400
400
|
// 3. turnErrors — externally bumped by per-turn rails (#39 cycle).
|
|
401
401
|
// Struck → streak++; clean → streak = 0. Threshold → abandon.
|
|
402
402
|
// Strike accounting is engine-internal bookkeeping. Per rummy
|
|
403
|
-
// precedent (plugins/error/error.js#verdict) and SPEC §
|
|
403
|
+
// precedent (plugins/error/error.js#verdict) and SPEC §telemetry
|
|
404
404
|
// policy: model sees errors that happened (parse_error,
|
|
405
405
|
// action_failure), never the engine's accounting about them
|
|
406
406
|
// (strike counts, cycle detection, sudden-death threshold).
|
|
@@ -463,6 +463,27 @@ class Engine {
|
|
|
463
463
|
// otherwise.
|
|
464
464
|
let nextActionIndex = 1;
|
|
465
465
|
if (seq === 1) {
|
|
466
|
+
// Operator doc READs (PLURNK_MD_<ALIAS>). The docs were materialized
|
|
467
|
+
// as plurnk://<entry> entries by the plurnk run (loop_run, via the
|
|
468
|
+
// §actor-boundary keystone); foist a READ of each into THIS turn-0 so the model
|
|
469
|
+
// reads them inline. It sees only the READ — the materializing EDIT
|
|
470
|
+
// lives in the plurnk run's log, never the model's.
|
|
471
|
+
for (const doc of Paths.docs()) {
|
|
472
|
+
const docTarget = {
|
|
473
|
+
kind: "url", raw: `plurnk://${doc.entryName}`, scheme: "plurnk",
|
|
474
|
+
username: null, password: null, hostname: null, port: null,
|
|
475
|
+
pathname: doc.entryName, params: {}, fragment: null,
|
|
476
|
+
};
|
|
477
|
+
const docRead = {
|
|
478
|
+
op: "READ", suffix: "", signal: null, target: docTarget,
|
|
479
|
+
lineMarker: null, body: null, position: { line: 1, column: 1 },
|
|
480
|
+
};
|
|
481
|
+
await this.dispatch({
|
|
482
|
+
statement: docRead, sessionId, runId, loopId, turnId,
|
|
483
|
+
sequence: nextActionIndex, origin: "plurnk", onDispatch,
|
|
484
|
+
});
|
|
485
|
+
nextActionIndex++;
|
|
486
|
+
}
|
|
466
487
|
const promptRow = await this.#db.engine_get_loop_prompt.get({ loop_id: loopId });
|
|
467
488
|
if (promptRow !== undefined && typeof promptRow.prompt === "string" && promptRow.prompt.length > 0) {
|
|
468
489
|
const promptPath = {
|
|
@@ -499,7 +520,7 @@ class Engine {
|
|
|
499
520
|
mimetypes: this.#mimetypes,
|
|
500
521
|
pushTelemetry: (event) => this.#pushTelemetry(sessionId, loopId, event),
|
|
501
522
|
};
|
|
502
|
-
// SPEC §
|
|
523
|
+
// SPEC §membership D4/D5 — git-ls-files workspace membership, resolved at
|
|
503
524
|
// prompt-composition (EMI is eager + exhaustive — git is the only bound). When the
|
|
504
525
|
// session's project_root is a git working tree, tracked files are
|
|
505
526
|
// members without a client `add`; active members are materialized
|
|
@@ -511,11 +532,11 @@ class Engine {
|
|
|
511
532
|
channels: { body: { content: await EntryManifest.buildManifestBody(systemCtx), mimetype: "application/json" } },
|
|
512
533
|
tags: [],
|
|
513
534
|
}, systemCtx, "plurnk");
|
|
514
|
-
// §
|
|
535
|
+
// §env-delta — pre-seed environment deltas (changes since this run last
|
|
515
536
|
// reconciled) as system EDIT rows, before the packet composes; advance
|
|
516
537
|
// the action index past them so model ops continue after.
|
|
517
538
|
nextActionIndex += await this.#materializeEnvironmentDeltas({ sessionId, runId, loopId, turnId, fromSequence: nextActionIndex });
|
|
518
|
-
// SPEC §
|
|
539
|
+
// SPEC §telemetry — git working-tree state for the telemetry section, read once
|
|
519
540
|
// (a service-side `git status` shell-out) and threaded into the budget
|
|
520
541
|
// rebuild too so it isn't re-shelled on overflow.
|
|
521
542
|
const gitStatus = await GitState.status(this.#db, sessionId, this.#loopAborts.get(loopId)?.signal);
|
|
@@ -526,7 +547,7 @@ class Engine {
|
|
|
526
547
|
initialMessages: messages, persona, requirements, runId, loopId,
|
|
527
548
|
currentTurnSeq: seq, provider, gitStatus,
|
|
528
549
|
});
|
|
529
|
-
// SPEC §
|
|
550
|
+
// SPEC §grinder — budget grinder, pre-LLM: reclaim window on actual overflow.
|
|
530
551
|
const enforced = await this.#enforceBudget({
|
|
531
552
|
packet: requestPacket, provider, runId, loopId, turnId, sessionId, turnNumber,
|
|
532
553
|
rebuild: (telemetryErrors) => this.#buildRequestPacket({
|
|
@@ -641,13 +662,13 @@ class Engine {
|
|
|
641
662
|
// Zero ops is NOT an error to report — the model knows it emitted
|
|
642
663
|
// nothing. Strike accounting (engine-internal) treats it as a
|
|
643
664
|
// struck turn; the model just sees an empty packet next turn.
|
|
644
|
-
// Per SPEC §
|
|
665
|
+
// Per SPEC §telemetry gamification policy.
|
|
645
666
|
return { turnId, status: turnStatus, statuses, fingerprint: _a.fingerprintTurn(packetAssistant.ops), budgetStruck: enforced.struck, budgetHardStop: false };
|
|
646
667
|
}
|
|
647
668
|
// Split the wire-level ProviderResponse into the two destinations:
|
|
648
669
|
// packet.assistant gets the model's emission (content, ops, reasoning);
|
|
649
670
|
// Turn columns get the call-metadata (usage, finishReason, model).
|
|
650
|
-
// SPEC §
|
|
671
|
+
// SPEC §provider-surface / plurnk-providers#1: text-fragment scraping policy lives
|
|
651
672
|
// here — engine owns the parse and the scraping rule, providers stay
|
|
652
673
|
// grammar-unaware.
|
|
653
674
|
//
|
|
@@ -731,6 +752,11 @@ class Engine {
|
|
|
731
752
|
// query; null result means no DB override exists, use the default.
|
|
732
753
|
const row = await this.#db.engine_resolve_persona.get({ loop_id: loopId });
|
|
733
754
|
const persona = (row?.persona !== undefined && row?.persona !== null) ? row.persona : defaultPersona;
|
|
755
|
+
// Requirements is engine-sourced, NOT threaded from callers — that threading is
|
|
756
|
+
// exactly how it went missing (loop_run/Daemon read sysprompt + persona but never
|
|
757
|
+
// requirements). Read Paths.defaultRequirements (PLURNK_REQUIREMENTS env →
|
|
758
|
+
// requirements.md) fresh each build so edits take effect; a non-empty param wins.
|
|
759
|
+
const requirementsText = requirements.length > 0 ? requirements : await readFile(Paths.defaultRequirements, "utf8");
|
|
734
760
|
const log = await this.#buildLog(runId);
|
|
735
761
|
const telemetryErrors = presetTelemetry ?? await this.#buildTelemetryErrors(loopId, currentTurnSeq);
|
|
736
762
|
// Per-section render-cost subtotals via provider's tokenizer.
|
|
@@ -739,7 +765,7 @@ class Engine {
|
|
|
739
765
|
// template scaffolding adds bytes, but the subtotal tracks "what
|
|
740
766
|
// the model has to process" closely enough for budget diagnostics.
|
|
741
767
|
const countTokens = (t) => provider.countTokens(t);
|
|
742
|
-
// Budget readout (SPEC.md §
|
|
768
|
+
// Budget readout (SPEC.md §tokenomics). Two-pass: measure the wire-rendered
|
|
743
769
|
// index/log sections (budget-independent), install the readout with a
|
|
744
770
|
// tokensFree placeholder, measure the assembled total, resolve free,
|
|
745
771
|
// substitute. Subtotals come from the real render — meta and fences
|
|
@@ -749,7 +775,7 @@ class Engine {
|
|
|
749
775
|
const ceiling = _a.computeCeiling(provider.contextSize, this.#budgetCeiling);
|
|
750
776
|
const scratch = {
|
|
751
777
|
system: { system_definition, persona, log },
|
|
752
|
-
user: { prompt, telemetry: { budget: "", errors: telemetryErrors, git: gitStatus }, system_requirements:
|
|
778
|
+
user: { prompt, telemetry: { budget: "", errors: telemetryErrors, git: gitStatus }, system_requirements: requirementsText },
|
|
753
779
|
};
|
|
754
780
|
const sections = PacketWire.measureBudgetSections(scratch, countTokens);
|
|
755
781
|
scratch.user.telemetry.budget = this.#renderBudget(sections, ceiling);
|
|
@@ -763,7 +789,7 @@ class Engine {
|
|
|
763
789
|
.replace(TOKEN_PERCENT_PLACEHOLDER, String(percent))
|
|
764
790
|
.replace(TOKENS_FREE_PLACEHOLDER, String(tokensFree));
|
|
765
791
|
const system = { tokens: 0, system_definition, persona, log };
|
|
766
|
-
const user = { tokens: 0, prompt, telemetry: { budget, errors: telemetryErrors, git: gitStatus }, system_requirements:
|
|
792
|
+
const user = { tokens: 0, prompt, telemetry: { budget, errors: telemetryErrors, git: gitStatus }, system_requirements: requirementsText };
|
|
767
793
|
system.tokens = countTokens(PacketWire.renderSystemContent(system));
|
|
768
794
|
user.tokens = countTokens(PacketWire.renderUserContent(user));
|
|
769
795
|
return { system, user };
|
|
@@ -786,7 +812,7 @@ class Engine {
|
|
|
786
812
|
}
|
|
787
813
|
return lines.join("\n");
|
|
788
814
|
}
|
|
789
|
-
// SPEC §
|
|
815
|
+
// SPEC §grinder — the budget grinder. Runs pre-LLM (in runTurn, after the packet
|
|
790
816
|
// is built, before provider.generate); fires only on actual overflow. Two
|
|
791
817
|
// passes, re-measuring between. Hides (never deletes) — the prior turn's logs,
|
|
792
818
|
// then the catalog except the manifest lifeline. The strike it raises and the
|
|
@@ -817,7 +843,7 @@ class Engine {
|
|
|
817
843
|
this.#emitBudgetOverflow(sessionId, loopId, folded);
|
|
818
844
|
return { packet: current, fit: measure(current) <= ceiling, struck: turnNumber > 1 };
|
|
819
845
|
}
|
|
820
|
-
// The model-facing budget event (SPEC §
|
|
846
|
+
// The model-facing budget event (SPEC §grinder, §telemetry): which entries left the
|
|
821
847
|
// window, by scheme — the model's own terms, no mechanism vocabulary. The
|
|
822
848
|
// strike this overflow triggers stays engine-internal (gamification policy).
|
|
823
849
|
#emitBudgetOverflow(sessionId, loopId, folded) {
|
|
@@ -848,12 +874,12 @@ class Engine {
|
|
|
848
874
|
assistantRaw,
|
|
849
875
|
};
|
|
850
876
|
}
|
|
851
|
-
// Render-time mimetype invocation (SPEC §
|
|
852
|
-
// §
|
|
877
|
+
// Render-time mimetype invocation (SPEC §mimetype {§mimetype-handlers-fire-render-time},
|
|
878
|
+
// §per-entry-channels {§per-entry-channels-preview-is-handler-output}). For each (run, entry, channel)
|
|
853
879
|
// with indexed=1, pass the channel's current content through
|
|
854
880
|
// mimetype.preview(content, budget). State is included verbatim — engine
|
|
855
|
-
// does NOT branch on it (§
|
|
856
|
-
// SPEC §
|
|
881
|
+
// does NOT branch on it (§channel-state {§channel-state-engine-does-not-branch-on-state}).
|
|
882
|
+
// SPEC §telemetry: model-facing alert surface.
|
|
857
883
|
// Two sources, merged on each packet build:
|
|
858
884
|
// 1. Previous-turn action-bound failures (status_rx >= 400 on log_entries).
|
|
859
885
|
// 2. Engine-buffered actionless failures (no_send, parse, watchdog, rails).
|
|
@@ -878,12 +904,12 @@ class Engine {
|
|
|
878
904
|
});
|
|
879
905
|
return [...this.#drainTelemetry(loopId), ...actionFailures];
|
|
880
906
|
}
|
|
881
|
-
// SPEC §
|
|
907
|
+
// SPEC §packet packet.system.log — chronological action-entries for the loop.
|
|
882
908
|
// Snapshot is taken at packet build (pre-dispatch this turn), so it
|
|
883
909
|
// reflects "what has happened before this turn." Each row carries a
|
|
884
910
|
// log://<loop_seq>/<turn_seq>/<sequence> coordinate the model can READ.
|
|
885
911
|
async #buildLog(runId) {
|
|
886
|
-
// SPEC §
|
|
912
|
+
// SPEC §packet-terms: runs own log entries — log is the run's history,
|
|
887
913
|
// not the loop's. Span all loops in the run so the model sees
|
|
888
914
|
// earlier loops' work as conversational memory.
|
|
889
915
|
//
|
|
@@ -915,9 +941,9 @@ class Engine {
|
|
|
915
941
|
source: r.source,
|
|
916
942
|
}));
|
|
917
943
|
}
|
|
918
|
-
// §
|
|
944
|
+
// §env-delta — at pre-turn build, reconcile each session entry against this run's
|
|
919
945
|
// watermark. First sight sets it silently; a content change materializes a
|
|
920
|
-
// delta-EDIT (origin=plurnk, the §
|
|
946
|
+
// delta-EDIT (origin=plurnk, the §edit-result-render result span) at the next sequence and
|
|
921
947
|
// advances the mark. Excludes plurnk:// (manifest/prompt) and bare/file
|
|
922
948
|
// entries (scheme NULL — the EMI's territory). Returns the count so the
|
|
923
949
|
// caller advances nextActionIndex past the pre-seeded deltas.
|
|
@@ -928,7 +954,7 @@ class Engine {
|
|
|
928
954
|
for (const r of rows) {
|
|
929
955
|
// plurnk:// is engine-derived (manifest/prompt) — skip. File entries
|
|
930
956
|
// (scheme=null) ARE included: an out-of-band disk divergence, re-read by
|
|
931
|
-
// git membership, surfaces here as the §
|
|
957
|
+
// git membership, surfaces here as the §membership EMI signal (source="file").
|
|
932
958
|
if (r.scheme === "plurnk")
|
|
933
959
|
continue;
|
|
934
960
|
const wm = await this.#db.engine_get_watermark.get({
|
|
@@ -978,7 +1004,7 @@ class Engine {
|
|
|
978
1004
|
result = denial;
|
|
979
1005
|
}
|
|
980
1006
|
else {
|
|
981
|
-
// SPEC §
|
|
1007
|
+
// SPEC §scheme-surface + plurnk-schemes#1: action-entry-as-outcome. Scheme-handler
|
|
982
1008
|
// exceptions become the action-entry's outcome (status 500), not a
|
|
983
1009
|
// thrown bubble. The log_entry is the durable record; engine never
|
|
984
1010
|
// skips it. Logging failures (#writeLog throws) are NOT caught —
|
|
@@ -1019,7 +1045,7 @@ class Engine {
|
|
|
1019
1045
|
}
|
|
1020
1046
|
const logEntryId = await this.#writeLog({ statement, result, runId, loopId, turnId, sequence, origin });
|
|
1021
1047
|
onDispatch?.(logEntryId);
|
|
1022
|
-
// Proposal lifecycle (SPEC.md §
|
|
1048
|
+
// Proposal lifecycle (SPEC.md §engine-rails + §methods loop.resolve). When a
|
|
1023
1049
|
// scheme returns status 202, the entry is written as state='proposed';
|
|
1024
1050
|
// dispatch then PAUSES on a per-entry waiter until resolution
|
|
1025
1051
|
// arrives via Engine.resolveProposal (from the loop/resolve RPC,
|
|
@@ -1281,7 +1307,7 @@ class Engine {
|
|
|
1281
1307
|
});
|
|
1282
1308
|
return { status, outcome, body: resolution.body };
|
|
1283
1309
|
}
|
|
1284
|
-
// SPEC §
|
|
1310
|
+
// SPEC §scheme-surface: engine rejects writes whose origin is outside the target
|
|
1285
1311
|
// scheme's manifest.writableBy.
|
|
1286
1312
|
// - Read-side ops (READ, FIND, OPEN, FOLD) are not gated.
|
|
1287
1313
|
// - SEND broadcast (path=null) has no target scheme; not gated.
|
|
@@ -1374,7 +1400,7 @@ class Engine {
|
|
|
1374
1400
|
const dstPath = statement.body;
|
|
1375
1401
|
if (srcPath === null)
|
|
1376
1402
|
return { status: 400, error: "MOVE requires source path" };
|
|
1377
|
-
// MOVE is relocation only — deletion is KILL's job (§
|
|
1403
|
+
// MOVE is relocation only — deletion is KILL's job (§move). The /dev/null
|
|
1378
1404
|
// and null-body delete-by-MOVE back-compat is retired: no silent debt.
|
|
1379
1405
|
if (dstPath === null)
|
|
1380
1406
|
return { status: 400, error: "MOVE requires a destination; use KILL to delete" };
|
|
@@ -1389,7 +1415,7 @@ class Engine {
|
|
|
1389
1415
|
if (copyResult.status >= 400)
|
|
1390
1416
|
return copyResult;
|
|
1391
1417
|
const srcPathname = pathnameFromPath(srcPath);
|
|
1392
|
-
// If the dest write is a pending proposal (file dest → §
|
|
1418
|
+
// If the dest write is a pending proposal (file dest → §membership review), the
|
|
1393
1419
|
// source-delete MUST wait until the dest actually lands — a rejected
|
|
1394
1420
|
// proposal would otherwise lose the source. Thread it into the resolution:
|
|
1395
1421
|
// dispatch deletes the source AFTER the dest applies on accept.
|
|
@@ -1478,7 +1504,7 @@ class Engine {
|
|
|
1478
1504
|
return { status: 415, error: `mimetype mismatch on channel '${channelName}': ${channelData.mimetype} vs ${expectedMimetype}` };
|
|
1479
1505
|
}
|
|
1480
1506
|
}
|
|
1481
|
-
// `<L>` source range slicing per SPEC.md §
|
|
1507
|
+
// `<L>` source range slicing per SPEC.md §op-invariants (symmetric with READ
|
|
1482
1508
|
// `<L>` — source range, no line-number prefix).
|
|
1483
1509
|
// Applied to every channel of the source entry. Binary channels return
|
|
1484
1510
|
// 415 since line semantics don't apply.
|
|
@@ -1501,9 +1527,9 @@ class Engine {
|
|
|
1501
1527
|
const tags = (Array.isArray(statement.signal) && statement.signal.length > 0)
|
|
1502
1528
|
? statement.signal
|
|
1503
1529
|
: entry.tags;
|
|
1504
|
-
// 304/409 on an existing destination (SPEC §
|
|
1530
|
+
// 304/409 on an existing destination (SPEC §copy): a re-copy that would write
|
|
1505
1531
|
// exactly what's already there — same channel contents, same tags — is a no-op
|
|
1506
|
-
// (304), mirroring EDIT's 304-on-noop (§
|
|
1532
|
+
// (304), mirroring EDIT's 304-on-noop (§edit). A divergent destination is a real
|
|
1507
1533
|
// collision (409); COPY/MOVE never clobbers.
|
|
1508
1534
|
if (dstExisting !== null && dstExisting.status === 200 && dstExisting.entry !== null) {
|
|
1509
1535
|
const dstChannels = dstExisting.entry.channels;
|
|
@@ -1517,7 +1543,7 @@ class Engine {
|
|
|
1517
1543
|
return { status: 409, error: `COPY/MOVE destination exists: ${dstSchemeName}://${dstPathname}` };
|
|
1518
1544
|
}
|
|
1519
1545
|
const writeResult = await dstHandler.writeEntry(dstPathname, { channels, tags }, ctx);
|
|
1520
|
-
// A file dest returns 202 (disk write → §
|
|
1546
|
+
// A file dest returns 202 (disk write → §membership review): propagate the
|
|
1521
1547
|
// proposal so dispatch runs the gate + routes applyResolution to the dest.
|
|
1522
1548
|
if (writeResult.status === 202)
|
|
1523
1549
|
return { status: 202, attrs: writeResult.attrs, body: writeResult.body };
|
|
@@ -1545,7 +1571,7 @@ class Engine {
|
|
|
1545
1571
|
if (typeof method !== "function")
|
|
1546
1572
|
return { status: 501 };
|
|
1547
1573
|
// External @plurnk/plurnk-schemes-* siblings receive the DB-free SchemeCtx
|
|
1548
|
-
// (caps), never the raw PlurnkSchemeContext (schemes SPEC §
|
|
1574
|
+
// (caps), never the raw PlurnkSchemeContext (schemes SPEC §channels). The dynamic
|
|
1549
1575
|
// dispatch is typed for in-tree schemes; the cast bridges the ctx shapes —
|
|
1550
1576
|
// the sibling reads caps, the in-tree handler reads db.
|
|
1551
1577
|
if (this.#schemes.isExternal(schemeName)) {
|
|
@@ -1617,7 +1643,7 @@ class Engine {
|
|
|
1617
1643
|
turn_id: turnId,
|
|
1618
1644
|
sequence: sequence,
|
|
1619
1645
|
origin,
|
|
1620
|
-
source: null, // dispatch entries are self-authored; §
|
|
1646
|
+
source: null, // dispatch entries are self-authored; §env-delta deltas set this
|
|
1621
1647
|
op: statement.op,
|
|
1622
1648
|
suffix: statement.suffix,
|
|
1623
1649
|
signal: this.#signalToJson(statement.signal),
|