@plurnk/plurnk-service 0.21.0 → 0.22.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 +65 -44
- 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.js +7 -7
- 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 +10 -10
- package/requirements.md +1 -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
|
//
|
|
@@ -739,7 +760,7 @@ class Engine {
|
|
|
739
760
|
// template scaffolding adds bytes, but the subtotal tracks "what
|
|
740
761
|
// the model has to process" closely enough for budget diagnostics.
|
|
741
762
|
const countTokens = (t) => provider.countTokens(t);
|
|
742
|
-
// Budget readout (SPEC.md §
|
|
763
|
+
// Budget readout (SPEC.md §tokenomics). Two-pass: measure the wire-rendered
|
|
743
764
|
// index/log sections (budget-independent), install the readout with a
|
|
744
765
|
// tokensFree placeholder, measure the assembled total, resolve free,
|
|
745
766
|
// substitute. Subtotals come from the real render — meta and fences
|
|
@@ -786,7 +807,7 @@ class Engine {
|
|
|
786
807
|
}
|
|
787
808
|
return lines.join("\n");
|
|
788
809
|
}
|
|
789
|
-
// SPEC §
|
|
810
|
+
// SPEC §grinder — the budget grinder. Runs pre-LLM (in runTurn, after the packet
|
|
790
811
|
// is built, before provider.generate); fires only on actual overflow. Two
|
|
791
812
|
// passes, re-measuring between. Hides (never deletes) — the prior turn's logs,
|
|
792
813
|
// then the catalog except the manifest lifeline. The strike it raises and the
|
|
@@ -817,7 +838,7 @@ class Engine {
|
|
|
817
838
|
this.#emitBudgetOverflow(sessionId, loopId, folded);
|
|
818
839
|
return { packet: current, fit: measure(current) <= ceiling, struck: turnNumber > 1 };
|
|
819
840
|
}
|
|
820
|
-
// The model-facing budget event (SPEC §
|
|
841
|
+
// The model-facing budget event (SPEC §grinder, §telemetry): which entries left the
|
|
821
842
|
// window, by scheme — the model's own terms, no mechanism vocabulary. The
|
|
822
843
|
// strike this overflow triggers stays engine-internal (gamification policy).
|
|
823
844
|
#emitBudgetOverflow(sessionId, loopId, folded) {
|
|
@@ -848,12 +869,12 @@ class Engine {
|
|
|
848
869
|
assistantRaw,
|
|
849
870
|
};
|
|
850
871
|
}
|
|
851
|
-
// Render-time mimetype invocation (SPEC §
|
|
852
|
-
// §
|
|
872
|
+
// Render-time mimetype invocation (SPEC §mimetype {§mimetype-handlers-fire-render-time},
|
|
873
|
+
// §per-entry-channels {§per-entry-channels-preview-is-handler-output}). For each (run, entry, channel)
|
|
853
874
|
// with indexed=1, pass the channel's current content through
|
|
854
875
|
// mimetype.preview(content, budget). State is included verbatim — engine
|
|
855
|
-
// does NOT branch on it (§
|
|
856
|
-
// SPEC §
|
|
876
|
+
// does NOT branch on it (§channel-state {§channel-state-engine-does-not-branch-on-state}).
|
|
877
|
+
// SPEC §telemetry: model-facing alert surface.
|
|
857
878
|
// Two sources, merged on each packet build:
|
|
858
879
|
// 1. Previous-turn action-bound failures (status_rx >= 400 on log_entries).
|
|
859
880
|
// 2. Engine-buffered actionless failures (no_send, parse, watchdog, rails).
|
|
@@ -878,12 +899,12 @@ class Engine {
|
|
|
878
899
|
});
|
|
879
900
|
return [...this.#drainTelemetry(loopId), ...actionFailures];
|
|
880
901
|
}
|
|
881
|
-
// SPEC §
|
|
902
|
+
// SPEC §packet packet.system.log — chronological action-entries for the loop.
|
|
882
903
|
// Snapshot is taken at packet build (pre-dispatch this turn), so it
|
|
883
904
|
// reflects "what has happened before this turn." Each row carries a
|
|
884
905
|
// log://<loop_seq>/<turn_seq>/<sequence> coordinate the model can READ.
|
|
885
906
|
async #buildLog(runId) {
|
|
886
|
-
// SPEC §
|
|
907
|
+
// SPEC §packet-terms: runs own log entries — log is the run's history,
|
|
887
908
|
// not the loop's. Span all loops in the run so the model sees
|
|
888
909
|
// earlier loops' work as conversational memory.
|
|
889
910
|
//
|
|
@@ -915,9 +936,9 @@ class Engine {
|
|
|
915
936
|
source: r.source,
|
|
916
937
|
}));
|
|
917
938
|
}
|
|
918
|
-
// §
|
|
939
|
+
// §env-delta — at pre-turn build, reconcile each session entry against this run's
|
|
919
940
|
// watermark. First sight sets it silently; a content change materializes a
|
|
920
|
-
// delta-EDIT (origin=plurnk, the §
|
|
941
|
+
// delta-EDIT (origin=plurnk, the §edit-result-render result span) at the next sequence and
|
|
921
942
|
// advances the mark. Excludes plurnk:// (manifest/prompt) and bare/file
|
|
922
943
|
// entries (scheme NULL — the EMI's territory). Returns the count so the
|
|
923
944
|
// caller advances nextActionIndex past the pre-seeded deltas.
|
|
@@ -928,7 +949,7 @@ class Engine {
|
|
|
928
949
|
for (const r of rows) {
|
|
929
950
|
// plurnk:// is engine-derived (manifest/prompt) — skip. File entries
|
|
930
951
|
// (scheme=null) ARE included: an out-of-band disk divergence, re-read by
|
|
931
|
-
// git membership, surfaces here as the §
|
|
952
|
+
// git membership, surfaces here as the §membership EMI signal (source="file").
|
|
932
953
|
if (r.scheme === "plurnk")
|
|
933
954
|
continue;
|
|
934
955
|
const wm = await this.#db.engine_get_watermark.get({
|
|
@@ -978,7 +999,7 @@ class Engine {
|
|
|
978
999
|
result = denial;
|
|
979
1000
|
}
|
|
980
1001
|
else {
|
|
981
|
-
// SPEC §
|
|
1002
|
+
// SPEC §scheme-surface + plurnk-schemes#1: action-entry-as-outcome. Scheme-handler
|
|
982
1003
|
// exceptions become the action-entry's outcome (status 500), not a
|
|
983
1004
|
// thrown bubble. The log_entry is the durable record; engine never
|
|
984
1005
|
// skips it. Logging failures (#writeLog throws) are NOT caught —
|
|
@@ -1019,7 +1040,7 @@ class Engine {
|
|
|
1019
1040
|
}
|
|
1020
1041
|
const logEntryId = await this.#writeLog({ statement, result, runId, loopId, turnId, sequence, origin });
|
|
1021
1042
|
onDispatch?.(logEntryId);
|
|
1022
|
-
// Proposal lifecycle (SPEC.md §
|
|
1043
|
+
// Proposal lifecycle (SPEC.md §engine-rails + §methods loop.resolve). When a
|
|
1023
1044
|
// scheme returns status 202, the entry is written as state='proposed';
|
|
1024
1045
|
// dispatch then PAUSES on a per-entry waiter until resolution
|
|
1025
1046
|
// arrives via Engine.resolveProposal (from the loop/resolve RPC,
|
|
@@ -1281,7 +1302,7 @@ class Engine {
|
|
|
1281
1302
|
});
|
|
1282
1303
|
return { status, outcome, body: resolution.body };
|
|
1283
1304
|
}
|
|
1284
|
-
// SPEC §
|
|
1305
|
+
// SPEC §scheme-surface: engine rejects writes whose origin is outside the target
|
|
1285
1306
|
// scheme's manifest.writableBy.
|
|
1286
1307
|
// - Read-side ops (READ, FIND, OPEN, FOLD) are not gated.
|
|
1287
1308
|
// - SEND broadcast (path=null) has no target scheme; not gated.
|
|
@@ -1374,7 +1395,7 @@ class Engine {
|
|
|
1374
1395
|
const dstPath = statement.body;
|
|
1375
1396
|
if (srcPath === null)
|
|
1376
1397
|
return { status: 400, error: "MOVE requires source path" };
|
|
1377
|
-
// MOVE is relocation only — deletion is KILL's job (§
|
|
1398
|
+
// MOVE is relocation only — deletion is KILL's job (§move). The /dev/null
|
|
1378
1399
|
// and null-body delete-by-MOVE back-compat is retired: no silent debt.
|
|
1379
1400
|
if (dstPath === null)
|
|
1380
1401
|
return { status: 400, error: "MOVE requires a destination; use KILL to delete" };
|
|
@@ -1389,7 +1410,7 @@ class Engine {
|
|
|
1389
1410
|
if (copyResult.status >= 400)
|
|
1390
1411
|
return copyResult;
|
|
1391
1412
|
const srcPathname = pathnameFromPath(srcPath);
|
|
1392
|
-
// If the dest write is a pending proposal (file dest → §
|
|
1413
|
+
// If the dest write is a pending proposal (file dest → §membership review), the
|
|
1393
1414
|
// source-delete MUST wait until the dest actually lands — a rejected
|
|
1394
1415
|
// proposal would otherwise lose the source. Thread it into the resolution:
|
|
1395
1416
|
// dispatch deletes the source AFTER the dest applies on accept.
|
|
@@ -1478,7 +1499,7 @@ class Engine {
|
|
|
1478
1499
|
return { status: 415, error: `mimetype mismatch on channel '${channelName}': ${channelData.mimetype} vs ${expectedMimetype}` };
|
|
1479
1500
|
}
|
|
1480
1501
|
}
|
|
1481
|
-
// `<L>` source range slicing per SPEC.md §
|
|
1502
|
+
// `<L>` source range slicing per SPEC.md §op-invariants (symmetric with READ
|
|
1482
1503
|
// `<L>` — source range, no line-number prefix).
|
|
1483
1504
|
// Applied to every channel of the source entry. Binary channels return
|
|
1484
1505
|
// 415 since line semantics don't apply.
|
|
@@ -1501,9 +1522,9 @@ class Engine {
|
|
|
1501
1522
|
const tags = (Array.isArray(statement.signal) && statement.signal.length > 0)
|
|
1502
1523
|
? statement.signal
|
|
1503
1524
|
: entry.tags;
|
|
1504
|
-
// 304/409 on an existing destination (SPEC §
|
|
1525
|
+
// 304/409 on an existing destination (SPEC §copy): a re-copy that would write
|
|
1505
1526
|
// exactly what's already there — same channel contents, same tags — is a no-op
|
|
1506
|
-
// (304), mirroring EDIT's 304-on-noop (§
|
|
1527
|
+
// (304), mirroring EDIT's 304-on-noop (§edit). A divergent destination is a real
|
|
1507
1528
|
// collision (409); COPY/MOVE never clobbers.
|
|
1508
1529
|
if (dstExisting !== null && dstExisting.status === 200 && dstExisting.entry !== null) {
|
|
1509
1530
|
const dstChannels = dstExisting.entry.channels;
|
|
@@ -1517,7 +1538,7 @@ class Engine {
|
|
|
1517
1538
|
return { status: 409, error: `COPY/MOVE destination exists: ${dstSchemeName}://${dstPathname}` };
|
|
1518
1539
|
}
|
|
1519
1540
|
const writeResult = await dstHandler.writeEntry(dstPathname, { channels, tags }, ctx);
|
|
1520
|
-
// A file dest returns 202 (disk write → §
|
|
1541
|
+
// A file dest returns 202 (disk write → §membership review): propagate the
|
|
1521
1542
|
// proposal so dispatch runs the gate + routes applyResolution to the dest.
|
|
1522
1543
|
if (writeResult.status === 202)
|
|
1523
1544
|
return { status: 202, attrs: writeResult.attrs, body: writeResult.body };
|
|
@@ -1545,7 +1566,7 @@ class Engine {
|
|
|
1545
1566
|
if (typeof method !== "function")
|
|
1546
1567
|
return { status: 501 };
|
|
1547
1568
|
// External @plurnk/plurnk-schemes-* siblings receive the DB-free SchemeCtx
|
|
1548
|
-
// (caps), never the raw PlurnkSchemeContext (schemes SPEC §
|
|
1569
|
+
// (caps), never the raw PlurnkSchemeContext (schemes SPEC §channels). The dynamic
|
|
1549
1570
|
// dispatch is typed for in-tree schemes; the cast bridges the ctx shapes —
|
|
1550
1571
|
// the sibling reads caps, the in-tree handler reads db.
|
|
1551
1572
|
if (this.#schemes.isExternal(schemeName)) {
|
|
@@ -1617,7 +1638,7 @@ class Engine {
|
|
|
1617
1638
|
turn_id: turnId,
|
|
1618
1639
|
sequence: sequence,
|
|
1619
1640
|
origin,
|
|
1620
|
-
source: null, // dispatch entries are self-authored; §
|
|
1641
|
+
source: null, // dispatch entries are self-authored; §env-delta deltas set this
|
|
1621
1642
|
op: statement.op,
|
|
1622
1643
|
suffix: statement.suffix,
|
|
1623
1644
|
signal: this.#signalToJson(statement.signal),
|