@plurnk/plurnk-service 0.29.0 → 0.35.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/SPEC.md +47 -23
- package/dist/Paths.d.ts +0 -1
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +2 -18
- package/dist/Paths.js.map +1 -1
- package/dist/content/line-marker.d.ts +4 -0
- package/dist/content/line-marker.d.ts.map +1 -1
- package/dist/content/line-marker.js +7 -1
- package/dist/content/line-marker.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/content/path-mimetype.js +1 -1
- package/dist/content/path-mimetype.js.map +1 -1
- package/dist/content/read-resolve.js +1 -1
- package/dist/content/read-resolve.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts +9 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +9 -1
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/Engine.d.ts +11 -6
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +199 -73
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/ExecutorRegistry.d.ts +2 -0
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +1 -0
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/ProviderInstantiate.js +1 -1
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +5 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +39 -0
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/fork.js +2 -2
- package/dist/core/fork.js.map +1 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +10 -7
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +3 -1
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/packet-wire.d.ts +0 -1
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +6 -9
- package/dist/core/packet-wire.js.map +1 -1
- 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/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/scheme-types.d.ts +2 -1
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/session-settings.d.ts +19 -0
- package/dist/core/session-settings.d.ts.map +1 -0
- package/dist/core/session-settings.js +44 -0
- package/dist/core/session-settings.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/schemes/Exec.d.ts +1 -0
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +4 -3
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/File.d.ts +1 -0
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +6 -2
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Known.d.ts +1 -0
- package/dist/schemes/Known.d.ts.map +1 -1
- package/dist/schemes/Known.js +2 -0
- package/dist/schemes/Known.js.map +1 -1
- package/dist/schemes/Log.d.ts +1 -0
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +4 -1
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Plurnk.d.ts +1 -0
- package/dist/schemes/Plurnk.d.ts.map +1 -1
- package/dist/schemes/Plurnk.js +1 -0
- package/dist/schemes/Plurnk.js.map +1 -1
- package/dist/schemes/Run.d.ts +17 -0
- package/dist/schemes/Run.d.ts.map +1 -0
- package/dist/schemes/Run.js +76 -0
- package/dist/schemes/Run.js.map +1 -0
- package/dist/schemes/Unknown.d.ts +1 -0
- package/dist/schemes/Unknown.d.ts.map +1 -1
- package/dist/schemes/Unknown.js +1 -0
- package/dist/schemes/Unknown.js.map +1 -1
- package/dist/schemes/_entry-crud.d.ts.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.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +26 -9
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-graph.d.ts +6 -0
- package/dist/schemes/_entry-graph.d.ts.map +1 -1
- package/dist/schemes/_entry-graph.js +8 -0
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +60 -30
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +14 -12
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-semantic.d.ts +1 -1
- package/dist/schemes/_entry-semantic.d.ts.map +1 -1
- package/dist/schemes/_entry-semantic.js +5 -2
- package/dist/schemes/_entry-semantic.js.map +1 -1
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +5 -4
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/server/ClientConnection.d.ts.map +1 -1
- package/dist/server/ClientConnection.js +2 -3
- package/dist/server/ClientConnection.js.map +1 -1
- package/dist/server/Daemon.d.ts +1 -3
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +31 -14
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/MethodRegistry.d.ts +0 -2
- package/dist/server/MethodRegistry.d.ts.map +1 -1
- package/dist/server/clientTurn.js +1 -1
- package/dist/server/clientTurn.js.map +1 -1
- package/dist/server/dsl.d.ts.map +1 -1
- package/dist/server/dsl.js +6 -4
- package/dist/server/dsl.js.map +1 -1
- package/dist/server/envelope.d.ts +2 -6
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +19 -24
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/methods/_dispatchAsPlurnk.js +1 -1
- package/dist/server/methods/_dispatchAsPlurnk.js.map +1 -1
- package/dist/server/methods/discover.d.ts.map +1 -1
- package/dist/server/methods/discover.js +6 -2
- package/dist/server/methods/discover.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_inject.d.ts.map +1 -1
- package/dist/server/methods/loop_inject.js +1 -2
- package/dist/server/methods/loop_inject.js.map +1 -1
- package/dist/server/methods/loop_run.d.ts.map +1 -1
- package/dist/server/methods/loop_run.js +18 -20
- package/dist/server/methods/loop_run.js.map +1 -1
- package/dist/server/methods/session_attach.d.ts.map +1 -1
- package/dist/server/methods/session_attach.js +3 -9
- package/dist/server/methods/session_attach.js.map +1 -1
- package/dist/server/methods/session_constraints.js +1 -1
- package/dist/server/methods/session_constraints.js.map +1 -1
- package/dist/server/methods/session_create.d.ts.map +1 -1
- package/dist/server/methods/session_create.js +55 -10
- package/dist/server/methods/session_create.js.map +1 -1
- package/dist/server/methods/session_prompts.d.ts +5 -0
- package/dist/server/methods/session_prompts.d.ts.map +1 -0
- package/dist/server/methods/session_prompts.js +29 -0
- package/dist/server/methods/session_prompts.js.map +1 -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.map +1 -1
- package/dist/server/yolo.js +9 -0
- package/dist/server/yolo.js.map +1 -1
- package/migrations/0000-00-00.01_schema.sql +35 -9
- package/package.json +9 -10
- package/requirements.md +2 -2
- package/persona.md +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// #235 — version advertising for the client's update notifier. The daemon is the
|
|
2
|
+
// long-lived, already-network-capable process, so it owns the registry poll: a one-shot
|
|
3
|
+
// CLI does zero registry IO and just renders what `discover` hands it. We self-report the
|
|
4
|
+
// installed version and poll npm for `latest` of the service + client packages — CACHED
|
|
5
|
+
// (TTL) and BEST-EFFORT (offline / registry-down omits `latest`; never blocks `discover`).
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { dirname, resolve, join } from "node:path";
|
|
9
|
+
const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
10
|
+
const SERVICE_PKG = "@plurnk/plurnk-service";
|
|
11
|
+
const CLIENT_PKG = "@plurnk/plurnk";
|
|
12
|
+
export default class VersionInfo {
|
|
13
|
+
static #installed;
|
|
14
|
+
static #cache = { service: undefined, client: undefined, at: 0 };
|
|
15
|
+
static #inflight = false;
|
|
16
|
+
// `discover` rides this. Returns immediately with whatever is cached; a stale/cold
|
|
17
|
+
// cache triggers a background refresh (never awaited), so the call never blocks on the
|
|
18
|
+
// network. `installed` is the daemon's honest self-report; `latest` is best-effort.
|
|
19
|
+
static async get() {
|
|
20
|
+
const installed = await VersionInfo.#installedVersion();
|
|
21
|
+
VersionInfo.#maybeRefresh();
|
|
22
|
+
const { service, client } = VersionInfo.#cache;
|
|
23
|
+
return {
|
|
24
|
+
service: service === undefined ? { installed } : { installed, latest: service },
|
|
25
|
+
client: client === undefined ? {} : { latest: client },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
static async #installedVersion() {
|
|
29
|
+
if (VersionInfo.#installed === undefined) {
|
|
30
|
+
const raw = await readFile(join(PACKAGE_ROOT, "package.json"), "utf8");
|
|
31
|
+
VersionInfo.#installed = JSON.parse(raw).version;
|
|
32
|
+
}
|
|
33
|
+
return VersionInfo.#installed;
|
|
34
|
+
}
|
|
35
|
+
static #maybeRefresh() {
|
|
36
|
+
const ttl = VersionInfo.#envMs("PLURNK_VERSION_POLL_TTL", 0);
|
|
37
|
+
const timeout = VersionInfo.#envMs("PLURNK_FETCH_TIMEOUT", 1);
|
|
38
|
+
if (VersionInfo.#inflight || Date.now() - VersionInfo.#cache.at < ttl)
|
|
39
|
+
return;
|
|
40
|
+
VersionInfo.#inflight = true;
|
|
41
|
+
void VersionInfo.#refresh(timeout).finally(() => { VersionInfo.#inflight = false; });
|
|
42
|
+
}
|
|
43
|
+
// No code fallback hides a magic number — the law-file (.env.example) carries it.
|
|
44
|
+
static #envMs(name, min) {
|
|
45
|
+
const raw = process.env[name];
|
|
46
|
+
const n = raw === undefined ? Number.NaN : Number.parseInt(raw, 10);
|
|
47
|
+
if (!Number.isFinite(n) || n < min)
|
|
48
|
+
throw new Error(`${name} must be an integer >= ${min} (ms), got ${JSON.stringify(raw)}`);
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
static async #refresh(timeout) {
|
|
52
|
+
const [service, client] = await Promise.all([VersionInfo.#poll(SERVICE_PKG, timeout), VersionInfo.#poll(CLIENT_PKG, timeout)]);
|
|
53
|
+
// Keep the prior cached value on a failed poll (don't clobber a good `latest` with undefined).
|
|
54
|
+
VersionInfo.#cache = { service: service ?? VersionInfo.#cache.service, client: client ?? VersionInfo.#cache.client, at: Date.now() };
|
|
55
|
+
}
|
|
56
|
+
static async #poll(pkg, timeout) {
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch(`https://registry.npmjs.org/${pkg.replace("/", "%2F")}/latest`, { signal: AbortSignal.timeout(timeout) });
|
|
59
|
+
if (!res.ok)
|
|
60
|
+
return undefined;
|
|
61
|
+
const body = (await res.json());
|
|
62
|
+
return typeof body.version === "string" ? body.version : undefined;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return undefined; // best-effort: offline / registry-down / abort → omit `latest`
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=version-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-info.js","sourceRoot":"","sources":["../../src/server/version-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yolo.d.ts","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"yolo.d.ts","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI;CAoBnD"}
|
package/dist/server/yolo.js
CHANGED
|
@@ -34,10 +34,19 @@
|
|
|
34
34
|
// lets clients suppress review-UI rendering for those entries.
|
|
35
35
|
export default class Yolo {
|
|
36
36
|
static attachYolo(engine, _db) {
|
|
37
|
+
// §dual-yolo-server-yolo-auto-accept
|
|
37
38
|
engine.onProposalPending((event) => {
|
|
38
39
|
if (!event.flags.yolo)
|
|
39
40
|
return;
|
|
40
41
|
try {
|
|
42
|
+
if (event.staleClobberRisk) {
|
|
43
|
+
// #note10 — the target diverged on disk this turn; the model's EDIT is
|
|
44
|
+
// based on a stale read. Reject rather than silently clobber the ambient
|
|
45
|
+
// change. The model sees an ordinary reject (outcome is forensics-only)
|
|
46
|
+
// and can re-READ the entry + retry against the current content.
|
|
47
|
+
engine.resolveProposal(event.logEntryId, { decision: "reject", outcome: "stale_read_clobber" });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
41
50
|
engine.resolveProposal(event.logEntryId, { decision: "accept" });
|
|
42
51
|
}
|
|
43
52
|
catch {
|
package/dist/server/yolo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yolo.js","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,iCAAiC;AACjC,yDAAyD;AACzD,qDAAqD;AACrD,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,wBAAwB;AACxB,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,wEAAwE;AACxE,wEAAwE;AACxE,2BAA2B;AAC3B,sEAAsE;AACtE,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,0EAA0E;AAC1E,uEAAuE;AACvE,yEAAyE;AACzE,+DAA+D;AAM/D,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAc,EAAE,GAAO;QACrC,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAA2B,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO;YAC9B,IAAI,CAAC;gBACD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACL,wDAAwD;gBACxD,uDAAuD;YAC3D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"yolo.js","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,iCAAiC;AACjC,yDAAyD;AACzD,qDAAqD;AACrD,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,wBAAwB;AACxB,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,wEAAwE;AACxE,wEAAwE;AACxE,2BAA2B;AAC3B,sEAAsE;AACtE,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,0EAA0E;AAC1E,uEAAuE;AACvE,yEAAyE;AACzE,+DAA+D;AAM/D,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAc,EAAE,GAAO;QACrC,qCAAqC;QACrC,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAA2B,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO;YAC9B,IAAI,CAAC;gBACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBACzB,uEAAuE;oBACvE,yEAAyE;oBACzE,wEAAwE;oBACxE,iEAAiE;oBACjE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBAChG,OAAO;gBACX,CAAC;gBACD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACL,wDAAwD;gBACxD,uDAAuD;YAC3D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
-- project_root: workspace pointer. NULL = headless (no disk side-effects);
|
|
3
3
|
-- non-null = absolute path to the client's source tree, supplied at
|
|
4
4
|
-- session.create or session.set_root.
|
|
5
|
-
-- persona: head of the persona cascade (loops.persona > runs.persona >
|
|
6
|
-
-- sessions.persona > PATHS.defaultPersona). Nullable; null falls through.
|
|
7
5
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
8
6
|
id INTEGER NOT NULL PRIMARY KEY,
|
|
9
7
|
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
@@ -12,23 +10,23 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
12
10
|
cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
|
|
13
11
|
scheme_registry_additions TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(scheme_registry_additions)),
|
|
14
12
|
project_root TEXT,
|
|
15
|
-
|
|
13
|
+
-- #231 client-chosen session-open context: { manifestItems?, mdDocs? }, read at turn-0
|
|
14
|
+
-- with precedence over env (manifestItems replaces PLURNK_MANIFEST_ITEMS; mdDocs unions PLURNK_MD_*).
|
|
15
|
+
settings TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(settings))
|
|
16
16
|
) STRICT;
|
|
17
17
|
|
|
18
18
|
CREATE INDEX IF NOT EXISTS sessions_created_at ON sessions (created_at);
|
|
19
19
|
|
|
20
20
|
-- INIT: runs
|
|
21
|
-
-- persona: middle of the persona cascade (loops > runs > sessions > default).
|
|
22
|
-
-- Nullable; null falls through to the session level.
|
|
23
21
|
CREATE TABLE IF NOT EXISTS runs (
|
|
24
22
|
id INTEGER NOT NULL PRIMARY KEY,
|
|
25
23
|
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
26
24
|
session_id INTEGER NOT NULL,
|
|
27
25
|
name TEXT NOT NULL CHECK (length(name) > 0),
|
|
28
26
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
27
|
+
-- runs fork via parent_run_id; sessions carry no parent — §machine-processes-no-fork-session
|
|
29
28
|
parent_run_id INTEGER CHECK (parent_run_id IS NULL OR parent_run_id != id),
|
|
30
29
|
cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
|
|
31
|
-
persona TEXT,
|
|
32
30
|
origin TEXT NOT NULL DEFAULT 'client' CHECK (origin IN ('model', 'client', 'plurnk')),
|
|
33
31
|
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
|
|
34
32
|
FOREIGN KEY (parent_run_id) REFERENCES runs(id) ON DELETE CASCADE
|
|
@@ -43,7 +41,6 @@ CREATE UNIQUE INDEX IF NOT EXISTS runs_session_name ON runs (session_id
|
|
|
43
41
|
-- mode). JSON column, merged over DEFAULT_LOOP_FLAGS in code so missing
|
|
44
42
|
-- keys read as their defaults. SchemeRegistry.resolveForLoop gates schemes
|
|
45
43
|
-- by manifest affinity (proposes / excludedInAsk / requiresWeb / etc).
|
|
46
|
-
-- persona: head of the cascade (loops > runs > sessions > default).
|
|
47
44
|
CREATE TABLE IF NOT EXISTS loops (
|
|
48
45
|
id INTEGER NOT NULL PRIMARY KEY,
|
|
49
46
|
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
@@ -52,12 +49,28 @@ CREATE TABLE IF NOT EXISTS loops (
|
|
|
52
49
|
status INTEGER NOT NULL DEFAULT 102 CHECK (status IN (100, 102, 200, 499)),
|
|
53
50
|
prompt TEXT NOT NULL,
|
|
54
51
|
flags TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(flags)),
|
|
55
|
-
|
|
52
|
+
-- §run-scheme loop-termination delta: terminated_at is stamped by the trigger
|
|
53
|
+
-- below when status crosses into terminal (every death-path, uniformly);
|
|
54
|
+
-- terminal_message is the deliverable — the SEND[200] body or the abandonment
|
|
55
|
+
-- reason — set by the terminating PREP (engine_loop_set_status / _cancel).
|
|
56
|
+
terminated_at TEXT,
|
|
57
|
+
terminal_message TEXT,
|
|
56
58
|
FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE
|
|
57
59
|
) STRICT;
|
|
58
60
|
|
|
59
61
|
CREATE UNIQUE INDEX IF NOT EXISTS loops_run_id_sequence ON loops (run_id, sequence);
|
|
60
62
|
|
|
63
|
+
-- §run-scheme: a loop crossing into a terminal status (200/499) stamps terminated_at,
|
|
64
|
+
-- so sibling runs pull the termination as a folded ambient delta — the time is caught
|
|
65
|
+
-- uniformly across every death-path (SEND, grinder, KILL). The stamp updates
|
|
66
|
+
-- terminated_at, never status, so it cannot re-fire this trigger.
|
|
67
|
+
CREATE TRIGGER IF NOT EXISTS loops_stamp_terminated_at
|
|
68
|
+
AFTER UPDATE OF status ON loops
|
|
69
|
+
WHEN NEW.status IN (200, 499) AND OLD.status NOT IN (200, 499)
|
|
70
|
+
BEGIN
|
|
71
|
+
UPDATE loops SET terminated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = NEW.id;
|
|
72
|
+
END;
|
|
73
|
+
|
|
61
74
|
-- INIT: turns
|
|
62
75
|
-- finish_reason / model: provider-call metadata (plurnk-grammar Turn.json).
|
|
63
76
|
-- Properties of the call, not of the model's emission payload — kept on
|
|
@@ -114,6 +127,10 @@ CREATE TABLE IF NOT EXISTS entries (
|
|
|
114
127
|
-- sync stat()s every member but re-reads/re-tokenizes/rewrites only one whose
|
|
115
128
|
-- signature changed; an unchanged member is a no-op. NULL = never synced.
|
|
116
129
|
synced_sig TEXT,
|
|
130
|
+
-- User Note 5 — manifest cache-friendliness. Last-modified stamp, bumped on every
|
|
131
|
+
-- channel write by entries_touch_on_channel_write; engine_list_session_entries orders
|
|
132
|
+
-- the catalog by it ASC so dormant entries hold the stable prompt-cache prefix.
|
|
133
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
117
134
|
CHECK ((scope = 'agent' AND session_id IS NULL)
|
|
118
135
|
OR (scope = 'session' AND session_id IS NOT NULL)),
|
|
119
136
|
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
|
|
@@ -122,7 +139,7 @@ CREATE TABLE IF NOT EXISTS entries (
|
|
|
122
139
|
CREATE UNIQUE INDEX IF NOT EXISTS entries_agent_identity ON entries (scheme, pathname) WHERE scope = 'agent';
|
|
123
140
|
CREATE UNIQUE INDEX IF NOT EXISTS entries_session_identity ON entries (session_id, scheme, pathname) WHERE scope = 'session';
|
|
124
141
|
|
|
125
|
-
-- The ONE engine-imposed constraint (SPEC §stream-constraints): 100 MiB char-length cap
|
|
142
|
+
-- The ONE engine-imposed constraint (SPEC §stream-constraints, §stream-constraints-engine-one-cap): 100 MiB char-length cap
|
|
126
143
|
-- per channel content body. All other limits are extrinsic.
|
|
127
144
|
CREATE TABLE IF NOT EXISTS entry_channels (
|
|
128
145
|
entry_id INTEGER NOT NULL,
|
|
@@ -135,6 +152,15 @@ CREATE TABLE IF NOT EXISTS entry_channels (
|
|
|
135
152
|
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
136
153
|
) STRICT, WITHOUT ROWID;
|
|
137
154
|
|
|
155
|
+
-- User Note 5 — bump the entry's updated_at on any channel write so the catalog
|
|
156
|
+
-- (ordered by updated_at ASC) keeps recently-touched entries at the tail and holds
|
|
157
|
+
-- the prompt-cache prefix stable across turns.
|
|
158
|
+
CREATE TRIGGER IF NOT EXISTS entries_touch_on_channel_write
|
|
159
|
+
AFTER INSERT ON entry_channels
|
|
160
|
+
BEGIN
|
|
161
|
+
UPDATE entries SET updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = NEW.entry_id;
|
|
162
|
+
END;
|
|
163
|
+
|
|
138
164
|
CREATE TABLE IF NOT EXISTS entry_tags (
|
|
139
165
|
entry_id INTEGER NOT NULL,
|
|
140
166
|
tag TEXT NOT NULL CHECK (length(tag) > 0),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-service",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Plurnk agent runtime — the server / engine / core. Implements the @plurnk/plurnk-grammar contract.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"bin/plurnk-service.ts",
|
|
22
22
|
"dist/**/*",
|
|
23
23
|
"migrations/**/*.sql",
|
|
24
|
-
"persona.md",
|
|
25
24
|
"requirements.md",
|
|
26
25
|
"README.md",
|
|
27
26
|
"SPEC.md"
|
|
@@ -33,7 +32,7 @@
|
|
|
33
32
|
"start": "node bin/plurnk-service.ts",
|
|
34
33
|
"test:lint": "tsc --noEmit",
|
|
35
34
|
"test:unit": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-timeout=30000 src/**/*.test.ts",
|
|
36
|
-
"test:intg": "npm run test:clean-tmp && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-timeout=30000 test/intg/*.test.ts",
|
|
35
|
+
"test:intg": "npm run test:clean-tmp && PLURNK_MANIFEST_ITEMS=0 node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-timeout=30000 test/intg/*.test.ts",
|
|
37
36
|
"test:live": "npm run test:clean-tmp && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/live/*.test.ts",
|
|
38
37
|
"test:demo": "npm run test:clean-tmp && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/demo/*.test.ts",
|
|
39
38
|
"test:all": "npm run test:lint && npm run test:unit && npm run test:intg && npm run test:demo",
|
|
@@ -45,15 +44,15 @@
|
|
|
45
44
|
"prepare": "npm run build"
|
|
46
45
|
},
|
|
47
46
|
"dependencies": {
|
|
48
|
-
"@plurnk/plurnk-execs": "0.4.
|
|
47
|
+
"@plurnk/plurnk-execs": "0.4.8",
|
|
49
48
|
"@plurnk/plurnk-execs-all": "0.1.5",
|
|
50
|
-
"@plurnk/plurnk-grammar": "0.
|
|
51
|
-
"@plurnk/plurnk-mimetypes": "0.15.
|
|
49
|
+
"@plurnk/plurnk-grammar": "0.54.0",
|
|
50
|
+
"@plurnk/plurnk-mimetypes": "0.15.17",
|
|
52
51
|
"@plurnk/plurnk-mimetypes-embeddings": "0.2.0",
|
|
53
|
-
"@plurnk/plurnk-providers": "0.
|
|
54
|
-
"@plurnk/plurnk-providers-all": "
|
|
55
|
-
"@plurnk/plurnk-schemes": "0.
|
|
56
|
-
"@plurnk/plurnk-schemes-http": "0.
|
|
52
|
+
"@plurnk/plurnk-providers": "0.7.0",
|
|
53
|
+
"@plurnk/plurnk-providers-all": "0.5.0",
|
|
54
|
+
"@plurnk/plurnk-schemes": "0.11.0",
|
|
55
|
+
"@plurnk/plurnk-schemes-http": "0.3.0",
|
|
57
56
|
"@possumtech/sqlrite": "5.1.1",
|
|
58
57
|
"diff": "^9.0.0",
|
|
59
58
|
"ws": "^8.20.1"
|
package/requirements.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Syntax: <<OPsuffix[signal]?(target)?<Line/Result>?:body?:OPsuffix
|
|
2
2
|
|
|
3
|
-
YOU MUST
|
|
3
|
+
YOU MUST ONLY use EXEC commands for actions that can't be performed with Extended HEREDOC Plurnk Operations.
|
|
4
4
|
YOU MUST ONLY communicate with SEND, not with free text between operations.
|
|
5
5
|
YOU MUST document all relevant questions and uncertainties into taxonomized, tagged, and topical unknown entries.
|
|
6
6
|
YOU MUST ONLY populate known entries with source entry information, never with model training.
|
|
7
7
|
YOU SHOULD manage your own context to maximize signal, as irrelevant tokens degrade reasoning.
|
|
8
8
|
YOU SHOULD leverage folksonomic path names, tags, and bulk pattern operations to optimize for context relevance.
|
|
9
9
|
YOU MUST use OPEN and FOLD to keep your context budget healthy, optimized, and topical, below the `tokensFree` limit.
|
|
10
|
-
YOU MUST terminate the turn with either a continuing (102) or loop terminating (200) `<<SEND[
|
|
10
|
+
YOU MUST terminate the turn with either a loop continuing (102) or loop terminating (200) user message or brief status update `<<SEND[N]:...:SEND`
|
package/persona.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
You are an assistant. Resolve the most recent user prompt.
|