@plurnk/plurnk-service 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.defaults +208 -0
- package/INSTALL.md +69 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/SPEC.md +1511 -0
- package/dist/Paths.d.ts +13 -0
- package/dist/Paths.d.ts.map +1 -0
- package/dist/Paths.js +60 -0
- package/dist/Paths.js.map +1 -0
- package/dist/content/edited-span.d.ts +2 -0
- package/dist/content/edited-span.d.ts.map +1 -0
- package/dist/content/edited-span.js +33 -0
- package/dist/content/edited-span.js.map +1 -0
- package/dist/content/index.d.ts +10 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +11 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/line-marker.d.ts +15 -0
- package/dist/content/line-marker.d.ts.map +1 -0
- package/dist/content/line-marker.js +21 -0
- package/dist/content/line-marker.js.map +1 -0
- package/dist/content/matcher.d.ts +44 -0
- package/dist/content/matcher.d.ts.map +1 -0
- package/dist/content/matcher.js +126 -0
- package/dist/content/matcher.js.map +1 -0
- package/dist/content/mimetype-binary.d.ts +8 -0
- package/dist/content/mimetype-binary.d.ts.map +1 -0
- package/dist/content/mimetype-binary.js +17 -0
- package/dist/content/mimetype-binary.js.map +1 -0
- package/dist/content/path-mimetype.d.ts +5 -0
- package/dist/content/path-mimetype.d.ts.map +1 -0
- package/dist/content/path-mimetype.js +15 -0
- package/dist/content/path-mimetype.js.map +1 -0
- package/dist/content/read-resolve.d.ts +20 -0
- package/dist/content/read-resolve.d.ts.map +1 -0
- package/dist/content/read-resolve.js +68 -0
- package/dist/content/read-resolve.js.map +1 -0
- package/dist/core/ChannelWrite.d.ts +100 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -0
- package/dist/core/ChannelWrite.js +112 -0
- package/dist/core/ChannelWrite.js.map +1 -0
- package/dist/core/ChannelWrite.sql +84 -0
- package/dist/core/Db.d.ts +14 -0
- package/dist/core/Db.d.ts.map +1 -0
- package/dist/core/Db.js +7 -0
- package/dist/core/Db.js.map +1 -0
- package/dist/core/Dispatcher.d.ts +67 -0
- package/dist/core/Dispatcher.d.ts.map +1 -0
- package/dist/core/Dispatcher.js +1021 -0
- package/dist/core/Dispatcher.js.map +1 -0
- package/dist/core/Engine.d.ts +113 -0
- package/dist/core/Engine.d.ts.map +1 -0
- package/dist/core/Engine.js +1410 -0
- package/dist/core/Engine.js.map +1 -0
- package/dist/core/Engine.sql +538 -0
- package/dist/core/EnvFlags.d.ts +13 -0
- package/dist/core/EnvFlags.d.ts.map +1 -0
- package/dist/core/EnvFlags.js +84 -0
- package/dist/core/EnvFlags.js.map +1 -0
- package/dist/core/ExecutorRegistry.d.ts +45 -0
- package/dist/core/ExecutorRegistry.d.ts.map +1 -0
- package/dist/core/ExecutorRegistry.js +128 -0
- package/dist/core/ExecutorRegistry.js.map +1 -0
- package/dist/core/PacketBuilder.d.ts +67 -0
- package/dist/core/PacketBuilder.d.ts.map +1 -0
- package/dist/core/PacketBuilder.js +524 -0
- package/dist/core/PacketBuilder.js.map +1 -0
- package/dist/core/PluginLoader.d.ts +17 -0
- package/dist/core/PluginLoader.d.ts.map +1 -0
- package/dist/core/PluginLoader.js +97 -0
- package/dist/core/PluginLoader.js.map +1 -0
- package/dist/core/ProposalLifecycle.d.ts +59 -0
- package/dist/core/ProposalLifecycle.d.ts.map +1 -0
- package/dist/core/ProposalLifecycle.js +215 -0
- package/dist/core/ProposalLifecycle.js.map +1 -0
- package/dist/core/ProviderInstantiate.d.ts +9 -0
- package/dist/core/ProviderInstantiate.d.ts.map +1 -0
- package/dist/core/ProviderInstantiate.js +156 -0
- package/dist/core/ProviderInstantiate.js.map +1 -0
- package/dist/core/SchemeRegistry.d.ts +26 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -0
- package/dist/core/SchemeRegistry.js +205 -0
- package/dist/core/SchemeRegistry.js.map +1 -0
- package/dist/core/StrikeRail.d.ts +28 -0
- package/dist/core/StrikeRail.d.ts.map +1 -0
- package/dist/core/StrikeRail.js +165 -0
- package/dist/core/StrikeRail.js.map +1 -0
- package/dist/core/TelemetryChannel.d.ts +37 -0
- package/dist/core/TelemetryChannel.d.ts.map +1 -0
- package/dist/core/TelemetryChannel.js +77 -0
- package/dist/core/TelemetryChannel.js.map +1 -0
- package/dist/core/TokenGauge.d.ts +16 -0
- package/dist/core/TokenGauge.d.ts.map +1 -0
- package/dist/core/TokenGauge.js +58 -0
- package/dist/core/TokenGauge.js.map +1 -0
- package/dist/core/caps/CapsResolve.d.ts +5 -0
- package/dist/core/caps/CapsResolve.d.ts.map +1 -0
- package/dist/core/caps/CapsResolve.js +13 -0
- package/dist/core/caps/CapsResolve.js.map +1 -0
- package/dist/core/caps/DbChannelCaps.d.ts +16 -0
- package/dist/core/caps/DbChannelCaps.d.ts.map +1 -0
- package/dist/core/caps/DbChannelCaps.js +41 -0
- package/dist/core/caps/DbChannelCaps.js.map +1 -0
- package/dist/core/caps/DbEntryCaps.d.ts +19 -0
- package/dist/core/caps/DbEntryCaps.d.ts.map +1 -0
- package/dist/core/caps/DbEntryCaps.js +28 -0
- package/dist/core/caps/DbEntryCaps.js.map +1 -0
- package/dist/core/caps/DbNotifyCaps.d.ts +8 -0
- package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -0
- package/dist/core/caps/DbNotifyCaps.js +35 -0
- package/dist/core/caps/DbNotifyCaps.js.map +1 -0
- package/dist/core/caps/DbSubscriptionCaps.d.ts +10 -0
- package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -0
- package/dist/core/caps/DbSubscriptionCaps.js +86 -0
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -0
- package/dist/core/caps/DbTagCaps.d.ts +17 -0
- package/dist/core/caps/DbTagCaps.d.ts.map +1 -0
- package/dist/core/caps/DbTagCaps.js +37 -0
- package/dist/core/caps/DbTagCaps.js.map +1 -0
- package/dist/core/caps/SchemeCtxImpl.d.ts +18 -0
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -0
- package/dist/core/caps/SchemeCtxImpl.js +42 -0
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -0
- package/dist/core/env-defaults.d.ts +19 -0
- package/dist/core/env-defaults.d.ts.map +1 -0
- package/dist/core/env-defaults.js +89 -0
- package/dist/core/env-defaults.js.map +1 -0
- package/dist/core/fork.d.ts +6 -0
- package/dist/core/fork.d.ts.map +1 -0
- package/dist/core/fork.js +84 -0
- package/dist/core/fork.js.map +1 -0
- package/dist/core/fork.sql +85 -0
- package/dist/core/git-membership.d.ts +23 -0
- package/dist/core/git-membership.d.ts.map +1 -0
- package/dist/core/git-membership.js +366 -0
- package/dist/core/git-membership.js.map +1 -0
- package/dist/core/git-state.d.ts +15 -0
- package/dist/core/git-state.d.ts.map +1 -0
- package/dist/core/git-state.js +67 -0
- package/dist/core/git-state.js.map +1 -0
- package/dist/core/packet-inject.d.ts +5 -0
- package/dist/core/packet-inject.d.ts.map +1 -0
- package/dist/core/packet-inject.js +48 -0
- package/dist/core/packet-inject.js.map +1 -0
- package/dist/core/packet-wire.d.ts +46 -0
- package/dist/core/packet-wire.d.ts.map +1 -0
- package/dist/core/packet-wire.js +453 -0
- package/dist/core/packet-wire.js.map +1 -0
- package/dist/core/path-decode.d.ts +2 -0
- package/dist/core/path-decode.d.ts.map +1 -0
- package/dist/core/path-decode.js +8 -0
- package/dist/core/path-decode.js.map +1 -0
- package/dist/core/plugin-attribution.d.ts +5 -0
- package/dist/core/plugin-attribution.d.ts.map +1 -0
- package/dist/core/plugin-attribution.js +39 -0
- package/dist/core/plugin-attribution.js.map +1 -0
- package/dist/core/plurnk-uri.d.ts +7 -0
- package/dist/core/plurnk-uri.d.ts.map +1 -0
- package/dist/core/plurnk-uri.js +52 -0
- package/dist/core/plurnk-uri.js.map +1 -0
- package/dist/core/resolveForLoop.d.ts +5 -0
- package/dist/core/resolveForLoop.d.ts.map +1 -0
- package/dist/core/resolveForLoop.js +12 -0
- package/dist/core/resolveForLoop.js.map +1 -0
- package/dist/core/results.d.ts +12 -0
- package/dist/core/results.d.ts.map +1 -0
- package/dist/core/results.js +27 -0
- package/dist/core/results.js.map +1 -0
- package/dist/core/run-cap.d.ts +8 -0
- package/dist/core/run-cap.d.ts.map +1 -0
- package/dist/core/run-cap.js +20 -0
- package/dist/core/run-cap.js.map +1 -0
- package/dist/core/run-ops.sql +43 -0
- package/dist/core/scheme-types.d.ts +45 -0
- package/dist/core/scheme-types.d.ts.map +1 -0
- package/dist/core/scheme-types.js +6 -0
- package/dist/core/scheme-types.js.map +1 -0
- package/dist/core/session-settings.d.ts +23 -0
- package/dist/core/session-settings.d.ts.map +1 -0
- package/dist/core/session-settings.js +55 -0
- package/dist/core/session-settings.js.map +1 -0
- package/dist/core/teaching.d.ts +3 -0
- package/dist/core/teaching.d.ts.map +1 -0
- package/dist/core/teaching.js +13 -0
- package/dist/core/teaching.js.map +1 -0
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/digest/Digest.d.ts +20 -0
- package/dist/digest/Digest.d.ts.map +1 -0
- package/dist/digest/Digest.js +451 -0
- package/dist/digest/Digest.js.map +1 -0
- package/dist/digest/Digest.sql +1 -0
- package/dist/digest/digest.sql +55 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/schemes/EffectPolicy.d.ts +6 -0
- package/dist/schemes/EffectPolicy.d.ts.map +1 -0
- package/dist/schemes/EffectPolicy.js +18 -0
- package/dist/schemes/EffectPolicy.js.map +1 -0
- package/dist/schemes/Exec.d.ts +39 -0
- package/dist/schemes/Exec.d.ts.map +1 -0
- package/dist/schemes/Exec.js +510 -0
- package/dist/schemes/Exec.js.map +1 -0
- package/dist/schemes/ExecOutputScheme.d.ts +20 -0
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -0
- package/dist/schemes/ExecOutputScheme.js +39 -0
- package/dist/schemes/ExecOutputScheme.js.map +1 -0
- package/dist/schemes/File.d.ts +42 -0
- package/dist/schemes/File.d.ts.map +1 -0
- package/dist/schemes/File.js +356 -0
- package/dist/schemes/File.js.map +1 -0
- package/dist/schemes/Known.d.ts +17 -0
- package/dist/schemes/Known.d.ts.map +1 -0
- package/dist/schemes/Known.js +40 -0
- package/dist/schemes/Known.js.map +1 -0
- package/dist/schemes/Log.d.ts +22 -0
- package/dist/schemes/Log.d.ts.map +1 -0
- package/dist/schemes/Log.js +269 -0
- package/dist/schemes/Log.js.map +1 -0
- package/dist/schemes/Log.sql +59 -0
- package/dist/schemes/Plurnk.d.ts +17 -0
- package/dist/schemes/Plurnk.d.ts.map +1 -0
- package/dist/schemes/Plurnk.js +46 -0
- package/dist/schemes/Plurnk.js.map +1 -0
- package/dist/schemes/Run.d.ts +25 -0
- package/dist/schemes/Run.d.ts.map +1 -0
- package/dist/schemes/Run.js +172 -0
- package/dist/schemes/Run.js.map +1 -0
- package/dist/schemes/Skill.d.ts +17 -0
- package/dist/schemes/Skill.d.ts.map +1 -0
- package/dist/schemes/Skill.js +40 -0
- package/dist/schemes/Skill.js.map +1 -0
- package/dist/schemes/Unknown.d.ts +17 -0
- package/dist/schemes/Unknown.d.ts.map +1 -0
- package/dist/schemes/Unknown.js +39 -0
- package/dist/schemes/Unknown.js.map +1 -0
- package/dist/schemes/_entry-chunk.d.ts +11 -0
- package/dist/schemes/_entry-chunk.d.ts.map +1 -0
- package/dist/schemes/_entry-chunk.js +100 -0
- package/dist/schemes/_entry-chunk.js.map +1 -0
- package/dist/schemes/_entry-crud.d.ts +31 -0
- package/dist/schemes/_entry-crud.d.ts.map +1 -0
- package/dist/schemes/_entry-crud.js +77 -0
- package/dist/schemes/_entry-crud.js.map +1 -0
- package/dist/schemes/_entry-crud.sql +101 -0
- package/dist/schemes/_entry-find.d.ts +32 -0
- package/dist/schemes/_entry-find.d.ts.map +1 -0
- package/dist/schemes/_entry-find.js +226 -0
- package/dist/schemes/_entry-find.js.map +1 -0
- package/dist/schemes/_entry-find.sql +54 -0
- package/dist/schemes/_entry-graph.d.ts +16 -0
- package/dist/schemes/_entry-graph.d.ts.map +1 -0
- package/dist/schemes/_entry-graph.js +94 -0
- package/dist/schemes/_entry-graph.js.map +1 -0
- package/dist/schemes/_entry-graph.sql +52 -0
- package/dist/schemes/_entry-manifest.d.ts +25 -0
- package/dist/schemes/_entry-manifest.d.ts.map +1 -0
- package/dist/schemes/_entry-manifest.js +266 -0
- package/dist/schemes/_entry-manifest.js.map +1 -0
- package/dist/schemes/_entry-ops.d.ts +32 -0
- package/dist/schemes/_entry-ops.d.ts.map +1 -0
- package/dist/schemes/_entry-ops.js +216 -0
- package/dist/schemes/_entry-ops.js.map +1 -0
- package/dist/schemes/_entry-ops.sql +31 -0
- package/dist/schemes/_entry-semantic.d.ts +38 -0
- package/dist/schemes/_entry-semantic.d.ts.map +1 -0
- package/dist/schemes/_entry-semantic.js +202 -0
- package/dist/schemes/_entry-semantic.js.map +1 -0
- package/dist/schemes/_entry-semantic.sql +95 -0
- package/dist/schemes/_entry-send.d.ts +11 -0
- package/dist/schemes/_entry-send.d.ts.map +1 -0
- package/dist/schemes/_entry-send.js +66 -0
- package/dist/schemes/_entry-send.js.map +1 -0
- package/dist/schemes/cosine.d.ts +4 -0
- package/dist/schemes/cosine.d.ts.map +1 -0
- package/dist/schemes/cosine.js +9 -0
- package/dist/schemes/cosine.js.map +1 -0
- package/dist/schemes/exec-abort.d.ts +15 -0
- package/dist/schemes/exec-abort.d.ts.map +1 -0
- package/dist/schemes/exec-abort.js +29 -0
- package/dist/schemes/exec-abort.js.map +1 -0
- package/dist/schemes/exec-env.d.ts +5 -0
- package/dist/schemes/exec-env.d.ts.map +1 -0
- package/dist/schemes/exec-env.js +34 -0
- package/dist/schemes/exec-env.js.map +1 -0
- package/dist/server/Daemon.d.ts +244 -0
- package/dist/server/Daemon.d.ts.map +1 -0
- package/dist/server/Daemon.js +1119 -0
- package/dist/server/Daemon.js.map +1 -0
- package/dist/server/client-input.d.ts +11 -0
- package/dist/server/client-input.d.ts.map +1 -0
- package/dist/server/client-input.js +145 -0
- package/dist/server/client-input.js.map +1 -0
- package/dist/server/clientTurn.d.ts +6 -0
- package/dist/server/clientTurn.d.ts.map +1 -0
- package/dist/server/clientTurn.js +23 -0
- package/dist/server/clientTurn.js.map +1 -0
- package/dist/server/clientTurn.sql +10 -0
- package/dist/server/dispatch-as-plurnk.d.ts +7 -0
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -0
- package/dist/server/dispatch-as-plurnk.js +23 -0
- package/dist/server/dispatch-as-plurnk.js.map +1 -0
- package/dist/server/drain.sql +124 -0
- package/dist/server/envelope.d.ts +53 -0
- package/dist/server/envelope.d.ts.map +1 -0
- package/dist/server/envelope.js +172 -0
- package/dist/server/envelope.js.map +1 -0
- package/dist/server/envelope.sql +76 -0
- package/dist/server/logEntry.d.ts +35 -0
- package/dist/server/logEntry.d.ts.map +1 -0
- package/dist/server/logEntry.js +49 -0
- package/dist/server/logEntry.js.map +1 -0
- package/dist/server/logEntry.sql +10 -0
- package/dist/server/loopDocs.d.ts +6 -0
- package/dist/server/loopDocs.d.ts.map +1 -0
- package/dist/server/loopDocs.js +22 -0
- package/dist/server/loopDocs.js.map +1 -0
- package/dist/server/noProposals.d.ts +6 -0
- package/dist/server/noProposals.d.ts.map +1 -0
- package/dist/server/noProposals.js +37 -0
- package/dist/server/noProposals.js.map +1 -0
- package/dist/server/seam-entry-read.sql +21 -0
- package/dist/server/seam-log-read.sql +21 -0
- package/dist/server/seam-loop.sql +9 -0
- package/dist/server/seam-proposal-list.sql +13 -0
- package/dist/server/version-info.d.ts +14 -0
- package/dist/server/version-info.d.ts.map +1 -0
- package/dist/server/version-info.js +69 -0
- package/dist/server/version-info.js.map +1 -0
- package/dist/server/yolo.d.ts +6 -0
- package/dist/server/yolo.d.ts.map +1 -0
- package/dist/server/yolo.js +64 -0
- package/dist/server/yolo.js.map +1 -0
- package/dist/service.d.ts +6 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +309 -0
- package/dist/service.js.map +1 -0
- package/migrations/0000-00-00.01_schema.sql +500 -0
- package/package.json +86 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
-- INIT: sessions
|
|
2
|
+
-- project_root: workspace pointer. NULL = headless (no disk side-effects);
|
|
3
|
+
-- non-null = absolute path to the client's source tree, supplied at
|
|
4
|
+
-- session.create or session.set_root.
|
|
5
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
6
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
7
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
8
|
+
name TEXT NOT NULL UNIQUE CHECK (length(name) > 0),
|
|
9
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
10
|
+
cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
|
|
11
|
+
scheme_registry_additions TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(scheme_registry_additions)),
|
|
12
|
+
project_root TEXT,
|
|
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
|
+
) STRICT;
|
|
17
|
+
|
|
18
|
+
CREATE INDEX IF NOT EXISTS sessions_created_at ON sessions (created_at);
|
|
19
|
+
|
|
20
|
+
-- INIT: runs
|
|
21
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
22
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
23
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
24
|
+
session_id INTEGER NOT NULL,
|
|
25
|
+
name TEXT NOT NULL CHECK (length(name) > 0),
|
|
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
|
|
28
|
+
parent_run_id INTEGER CHECK (parent_run_id IS NULL OR parent_run_id != id),
|
|
29
|
+
cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
|
|
30
|
+
origin TEXT NOT NULL DEFAULT 'client' CHECK (origin IN ('model', 'client', 'plurnk')),
|
|
31
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
|
|
32
|
+
FOREIGN KEY (parent_run_id) REFERENCES runs(id) ON DELETE CASCADE
|
|
33
|
+
) STRICT;
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS runs_session_id_created_at ON runs (session_id, created_at);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS runs_parent_run_id ON runs (parent_run_id);
|
|
37
|
+
-- NOT unique: a name is frozen per run (§machine-processes-run-origin) but RECLAIMABLE across
|
|
38
|
+
-- time — a terminated run keeps its name in permanent history while a fresh spawn reuses it;
|
|
39
|
+
-- run_resolve_by_name picks the newest. A LIVE collision is refused at the spawn gate (Run.edit
|
|
40
|
+
-- → run_live_by_name → 409), never by this index. Indexed for the by-name resolve/spawn lookup.
|
|
41
|
+
CREATE INDEX IF NOT EXISTS runs_session_name ON runs (session_id, name);
|
|
42
|
+
|
|
43
|
+
-- INIT: loops
|
|
44
|
+
-- flags: per-loop runtime flags (yolo, noProposals, noWeb, noInteraction,
|
|
45
|
+
-- mode). JSON column, merged over DEFAULT_LOOP_FLAGS in code so missing
|
|
46
|
+
-- keys read as their defaults. SchemeRegistry.resolveForLoop gates schemes
|
|
47
|
+
-- by manifest affinity (proposes / excludedInAsk / requiresWeb / etc).
|
|
48
|
+
CREATE TABLE IF NOT EXISTS loops (
|
|
49
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
50
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
51
|
+
run_id INTEGER NOT NULL,
|
|
52
|
+
sequence INTEGER NOT NULL CHECK (sequence >= 1),
|
|
53
|
+
status INTEGER NOT NULL DEFAULT 102 CHECK (status IN (100, 102, 200, 202, 413, 429, 499, 500, 504, 508)),
|
|
54
|
+
prompt TEXT NOT NULL,
|
|
55
|
+
flags TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(flags)),
|
|
56
|
+
-- #249 — attribution tags of the loop's active plugins (string[] JSON); the activity tagged
|
|
57
|
+
-- with what its plugins offer. Same set the engine rides on each turn's generate() wire.
|
|
58
|
+
attributions TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(attributions)),
|
|
59
|
+
-- #260 — client-passed @file paths foisted as turn-0 READs (string[] JSON). The daemon owns the
|
|
60
|
+
-- workspace, so it READs them in instead of the client inlining bytes (co-location law).
|
|
61
|
+
open_paths TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(open_paths)),
|
|
62
|
+
-- §run-scheme loop-termination delta: terminated_at is stamped by the trigger
|
|
63
|
+
-- below when status crosses into terminal (every death-path, uniformly);
|
|
64
|
+
-- terminal_message is the deliverable — the SEND[200] body or the abandonment
|
|
65
|
+
-- reason — set by the terminating PREP (engine_loop_set_status).
|
|
66
|
+
terminated_at TEXT,
|
|
67
|
+
terminal_message TEXT,
|
|
68
|
+
-- Who ended the loop when it wasn't the model's own deliberate terminal: 'collapse' (the
|
|
69
|
+
-- ∅-wait conclude, #379) or 'cancel' (an external loop.cancel, #380). NULL = the model's own
|
|
70
|
+
-- SEND / the engine's budget-strike terminals, whose status already carries the story. The
|
|
71
|
+
-- COLLECT and the termination delta render it as a marker ALONGSIDE terminal_message — the
|
|
72
|
+
-- model's words are never rewritten; the engine's act is named.
|
|
73
|
+
terminated_by TEXT CHECK (terminated_by IS NULL OR terminated_by IN ('collapse', 'cancel')),
|
|
74
|
+
FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE
|
|
75
|
+
) STRICT;
|
|
76
|
+
|
|
77
|
+
CREATE UNIQUE INDEX IF NOT EXISTS loops_run_id_sequence ON loops (run_id, sequence);
|
|
78
|
+
|
|
79
|
+
-- §run-scheme: a loop crossing into a terminal status stamps terminated_at, so sibling
|
|
80
|
+
-- runs pull the termination as a folded ambient delta — caught uniformly across every
|
|
81
|
+
-- death-path (SEND, grinder, max-turns, strike, KILL). The stamp updates terminated_at,
|
|
82
|
+
-- never status, so it cannot re-fire this trigger. Terminals: 200 done · 413 budget ·
|
|
83
|
+
-- 429 turn-ceiling · 499 cancel · 500 fail · 504 wall-clock timeout · 508 runaway. (202 = parked/sleeping, NOT terminal.)
|
|
84
|
+
CREATE TRIGGER IF NOT EXISTS loops_stamp_terminated_at
|
|
85
|
+
AFTER UPDATE OF status ON loops
|
|
86
|
+
WHEN NEW.status IN (200, 413, 429, 499, 500, 504, 508) AND OLD.status NOT IN (200, 413, 429, 499, 500, 504, 508)
|
|
87
|
+
BEGIN
|
|
88
|
+
UPDATE loops SET terminated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = NEW.id;
|
|
89
|
+
END;
|
|
90
|
+
|
|
91
|
+
-- INIT: turns
|
|
92
|
+
-- finish_reason / model: provider-call metadata (plurnk-grammar Turn.json).
|
|
93
|
+
-- Properties of the call, not of the model's emission payload — kept on
|
|
94
|
+
-- the Turn row alongside usage rather than nested into packet.assistant.
|
|
95
|
+
CREATE TABLE IF NOT EXISTS turns (
|
|
96
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
97
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
98
|
+
loop_id INTEGER NOT NULL,
|
|
99
|
+
sequence INTEGER NOT NULL CHECK (sequence >= 1),
|
|
100
|
+
timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
101
|
+
status INTEGER NOT NULL CHECK (status BETWEEN 100 AND 599),
|
|
102
|
+
usage_prompt INTEGER NOT NULL DEFAULT 0 CHECK (usage_prompt >= 0),
|
|
103
|
+
usage_completion INTEGER NOT NULL DEFAULT 0 CHECK (usage_completion >= 0),
|
|
104
|
+
usage_reasoning INTEGER NOT NULL DEFAULT 0 CHECK (usage_reasoning >= 0),
|
|
105
|
+
usage_cached INTEGER NOT NULL DEFAULT 0 CHECK (usage_cached >= 0),
|
|
106
|
+
usage_cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (usage_cost_pico >= 0),
|
|
107
|
+
-- #274 — the context window of the model that RAN this turn (provider.contextSize), so the
|
|
108
|
+
-- gauge denominator matches the loop's actual model under any /model switch. NULL = the
|
|
109
|
+
-- provider can't report a window (the client omits the gauge).
|
|
110
|
+
usage_context_size INTEGER CHECK (usage_context_size IS NULL OR usage_context_size >= 1),
|
|
111
|
+
packet TEXT NOT NULL CHECK (json_valid(packet)),
|
|
112
|
+
finish_reason TEXT,
|
|
113
|
+
model TEXT NOT NULL DEFAULT 'unknown' CHECK (length(model) >= 1),
|
|
114
|
+
-- #252 — opaque provider→client metadata passthrough (e.g. balancePico). Stored
|
|
115
|
+
-- UNENFORCED (json_valid only, no schema): the canonical-field contract lives between
|
|
116
|
+
-- the provider framework (normalizes) and the client (renders), never the service.
|
|
117
|
+
meta TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(meta)),
|
|
118
|
+
FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE
|
|
119
|
+
) STRICT;
|
|
120
|
+
|
|
121
|
+
CREATE UNIQUE INDEX IF NOT EXISTS turns_loop_id_sequence ON turns (loop_id, sequence);
|
|
122
|
+
CREATE INDEX IF NOT EXISTS turns_timestamp ON turns (timestamp);
|
|
123
|
+
|
|
124
|
+
-- INIT: entries
|
|
125
|
+
-- The canonical addressable store. (scope, scheme, pathname) is the
|
|
126
|
+
-- identity tuple. scheme is nullable: the `file` scheme is a routing
|
|
127
|
+
-- internal only, never stored here; bare/file paths land with scheme=NULL.
|
|
128
|
+
CREATE TABLE IF NOT EXISTS entries (
|
|
129
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
130
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
131
|
+
scope TEXT NOT NULL CHECK (scope IN ('session', 'run')),
|
|
132
|
+
session_id INTEGER,
|
|
133
|
+
scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
|
|
134
|
+
username TEXT,
|
|
135
|
+
password TEXT,
|
|
136
|
+
hostname TEXT,
|
|
137
|
+
port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
|
|
138
|
+
pathname TEXT NOT NULL,
|
|
139
|
+
params TEXT CHECK (params IS NULL OR json_valid(params)),
|
|
140
|
+
attributes TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attributes)),
|
|
141
|
+
-- SPEC §membership — how a file member entered the curated surface. 'git' rows are
|
|
142
|
+
-- reconciled against the repo's members each turn — tracked ls-files PLUS untracked-
|
|
143
|
+
-- but-not-ignored files (§membership-auto-add) — registered + un-registered so entries
|
|
144
|
+
-- == members; 'client'/'constraint' (model-created, add-glob) are not git's to reclaim.
|
|
145
|
+
-- NULL = not a file member (other schemes don't carry origin).
|
|
146
|
+
membership_origin TEXT CHECK (membership_origin IS NULL OR membership_origin IN ('git', 'client', 'constraint')),
|
|
147
|
+
-- @graph / ~semantic change-gate (#186): hash of the body content at the last
|
|
148
|
+
-- deep-channel derivation. The manifest-add pass re-derives symbols/refs (and
|
|
149
|
+
-- embeddings, later) ONLY when this differs from the current body hash — an
|
|
150
|
+
-- unchanged entry is skipped, never re-metadatafied every turn.
|
|
151
|
+
deep_hash TEXT,
|
|
152
|
+
-- SPEC §membership-change-gated-sync — the per-member sync stat-detect:
|
|
153
|
+
-- "<mtimeMs>:<size>" of the disk file at its last materialization. The pre-turn
|
|
154
|
+
-- sync stat()s every member but re-reads/re-tokenizes/rewrites only one whose
|
|
155
|
+
-- signature changed; an unchanged member is a no-op. NULL = never synced.
|
|
156
|
+
synced_sig TEXT,
|
|
157
|
+
-- User Note 5 — manifest cache-friendliness. Last-modified stamp, bumped on every
|
|
158
|
+
-- channel write by entries_touch_on_channel_write; engine_list_session_entries orders
|
|
159
|
+
-- the catalog by it ASC so dormant entries hold the stable prompt-cache prefix.
|
|
160
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
161
|
+
CHECK (session_id IS NOT NULL),
|
|
162
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
|
|
163
|
+
) STRICT;
|
|
164
|
+
|
|
165
|
+
CREATE UNIQUE INDEX IF NOT EXISTS entries_session_identity ON entries (session_id, scheme, pathname) WHERE scope = 'session';
|
|
166
|
+
-- §run-scheme — run-scope entries key (session, scheme='run', pathname='/<owner>/<path>'); the owner rides the pathname (no run_id).
|
|
167
|
+
CREATE UNIQUE INDEX IF NOT EXISTS entries_run_identity ON entries (session_id, scheme, pathname) WHERE scope = 'run';
|
|
168
|
+
|
|
169
|
+
-- The ONE engine-imposed constraint (SPEC §stream-constraints, §stream-constraints-engine-one-cap): 100 MiB char-length cap
|
|
170
|
+
-- per channel content body. All other limits are extrinsic.
|
|
171
|
+
CREATE TABLE IF NOT EXISTS entry_channels (
|
|
172
|
+
entry_id INTEGER NOT NULL,
|
|
173
|
+
name TEXT NOT NULL CHECK (length(name) > 0),
|
|
174
|
+
content TEXT NOT NULL CHECK (length(content) <= 104857600),
|
|
175
|
+
mimetype TEXT NOT NULL CHECK (length(mimetype) > 0),
|
|
176
|
+
tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
|
|
177
|
+
-- #312 — sha256 of content, stamped at static writes (streamed appends leave it NULL and
|
|
178
|
+
-- readers fall back to the write-time `tokens`). The join key into token_counts.
|
|
179
|
+
content_hash TEXT,
|
|
180
|
+
state TEXT NOT NULL DEFAULT 'static' CHECK (state IN ('static', 'active', 'closed', 'errored')),
|
|
181
|
+
PRIMARY KEY (entry_id, name),
|
|
182
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
183
|
+
) STRICT, WITHOUT ROWID;
|
|
184
|
+
|
|
185
|
+
-- User Note 5 — bump the entry's updated_at on any channel write so the catalog
|
|
186
|
+
-- (ordered by updated_at ASC) keeps recently-touched entries at the tail and holds
|
|
187
|
+
-- the prompt-cache prefix stable across turns.
|
|
188
|
+
CREATE TRIGGER IF NOT EXISTS entries_touch_on_channel_write
|
|
189
|
+
AFTER INSERT ON entry_channels
|
|
190
|
+
BEGIN
|
|
191
|
+
UPDATE entries SET updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = NEW.entry_id;
|
|
192
|
+
END;
|
|
193
|
+
|
|
194
|
+
CREATE TABLE IF NOT EXISTS entry_tags (
|
|
195
|
+
entry_id INTEGER NOT NULL,
|
|
196
|
+
tag TEXT NOT NULL CHECK (length(tag) > 0),
|
|
197
|
+
PRIMARY KEY (entry_id, tag),
|
|
198
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
199
|
+
) STRICT, WITHOUT ROWID;
|
|
200
|
+
|
|
201
|
+
CREATE INDEX IF NOT EXISTS entry_tags_tag ON entry_tags (tag);
|
|
202
|
+
|
|
203
|
+
-- INIT: symbol_defs
|
|
204
|
+
-- @graph NODES (plurnk-service#186). Code symbol definitions, populated
|
|
205
|
+
-- delete-then-insert per entry at write (EntryCrud.writeEntry) from mimetypes'
|
|
206
|
+
-- `symbols` channel. Qualified path = container ? container || '.' || name : name.
|
|
207
|
+
CREATE TABLE IF NOT EXISTS symbol_defs (
|
|
208
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
209
|
+
session_id INTEGER NOT NULL,
|
|
210
|
+
entry_id INTEGER NOT NULL,
|
|
211
|
+
name TEXT NOT NULL CHECK (length(name) > 0),
|
|
212
|
+
kind TEXT NOT NULL,
|
|
213
|
+
container TEXT,
|
|
214
|
+
line INTEGER NOT NULL,
|
|
215
|
+
end_line INTEGER,
|
|
216
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
217
|
+
) STRICT;
|
|
218
|
+
|
|
219
|
+
CREATE INDEX IF NOT EXISTS symbol_defs_name ON symbol_defs (session_id, name);
|
|
220
|
+
|
|
221
|
+
-- INIT: symbol_refs
|
|
222
|
+
-- @graph EDGES (plurnk-service#186), from mimetypes' `references` channel.
|
|
223
|
+
-- name = edge TARGET; container = the SOURCE def's full qualified path (the
|
|
224
|
+
-- @> join key; module-level → NULL); kind ∈ import|call|instantiate|inherit|
|
|
225
|
+
-- type|use (frozen, edge metadata only — traversal is kind-agnostic).
|
|
226
|
+
CREATE TABLE IF NOT EXISTS symbol_refs (
|
|
227
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
228
|
+
session_id INTEGER NOT NULL,
|
|
229
|
+
entry_id INTEGER NOT NULL,
|
|
230
|
+
name TEXT NOT NULL CHECK (length(name) > 0),
|
|
231
|
+
kind TEXT NOT NULL,
|
|
232
|
+
container TEXT,
|
|
233
|
+
line INTEGER NOT NULL,
|
|
234
|
+
col INTEGER,
|
|
235
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
236
|
+
) STRICT;
|
|
237
|
+
|
|
238
|
+
CREATE INDEX IF NOT EXISTS symbol_refs_name ON symbol_refs (session_id, name);
|
|
239
|
+
CREATE INDEX IF NOT EXISTS symbol_refs_source ON symbol_refs (session_id, entry_id, container);
|
|
240
|
+
|
|
241
|
+
-- INIT: entry_fts (~semantic FTS half — plurnk-service#186)
|
|
242
|
+
-- Keyword/content index over entry body content; the FTS5 rowid IS entries.id.
|
|
243
|
+
-- The ~semantic dialect narrows candidates here (cheap, indexed) then cosine-ranks
|
|
244
|
+
-- the narrowed set over the embedding vectors — FTS does the scale-cut, cosine the
|
|
245
|
+
-- precise rank, so no ANN/extension is needed. Populated at the gated manifest-add
|
|
246
|
+
-- hook alongside symbol_defs/refs: re-indexed only when body content changes.
|
|
247
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS entry_fts USING fts5(content);
|
|
248
|
+
|
|
249
|
+
-- INIT: token_counts (#312 — derived token counts keyed on (content_hash, tokenizer_id), the
|
|
250
|
+
-- deep_hash discipline applied to the token gauge: content change → new hash → recount that
|
|
251
|
+
-- entry; the run's MODEL change recounts iff the tokenizer identity changed (deepseek pro↔flash
|
|
252
|
+
-- share a vocab → zero recounts; gemma↔deepseek → all). tokenizer_id is the tokenizer.json sha
|
|
253
|
+
-- from the mimetypes seam (mimetypes#44), NEVER the model id. Rows are written only by the
|
|
254
|
+
-- ASYNC paths (the pump warm + build-time stragglers) using the seam's exact counter.
|
|
255
|
+
CREATE TABLE IF NOT EXISTS token_counts (
|
|
256
|
+
content_hash TEXT NOT NULL,
|
|
257
|
+
tokenizer_id TEXT NOT NULL,
|
|
258
|
+
tokens INTEGER NOT NULL CHECK (tokens >= 0),
|
|
259
|
+
PRIMARY KEY (content_hash, tokenizer_id)
|
|
260
|
+
) STRICT, WITHOUT ROWID;
|
|
261
|
+
|
|
262
|
+
-- INIT: entry_embeddings (~semantic vector half — plurnk-service#186; Project
|
|
263
|
+
-- Semantics chunking). One Float32 vector per CHUNK: an entry tiles into N chunks,
|
|
264
|
+
-- each addressed by its <L> line range (line_start..line_end) and embedded
|
|
265
|
+
-- separately, so a large body is fully searchable instead of truncated at the
|
|
266
|
+
-- embedder's window. line_start/line_end are stored for Project Findings to expose;
|
|
267
|
+
-- the rank currently max-pools an entry's chunks to its pathname. Supplied at the
|
|
268
|
+
-- gated manifest-add hook; the fusion (semantic_rank) FTS-narrows then cosine-ranks
|
|
269
|
+
-- these. CASCADE-deleted with the entry.
|
|
270
|
+
CREATE TABLE IF NOT EXISTS entry_embeddings (
|
|
271
|
+
entry_id INTEGER NOT NULL,
|
|
272
|
+
chunk_seq INTEGER NOT NULL,
|
|
273
|
+
line_start INTEGER NOT NULL,
|
|
274
|
+
line_end INTEGER NOT NULL,
|
|
275
|
+
vector BLOB NOT NULL,
|
|
276
|
+
-- The model id that produced this vector (mimetypes' `embeddingModel`). Stored
|
|
277
|
+
-- per row as the dimension/staleness guard: rank filters by the current model so
|
|
278
|
+
-- a swap never cosine-compares mismatched dimensions.
|
|
279
|
+
embedding_model TEXT NOT NULL,
|
|
280
|
+
PRIMARY KEY (entry_id, chunk_seq),
|
|
281
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
282
|
+
) STRICT;
|
|
283
|
+
|
|
284
|
+
-- INIT: log_entries
|
|
285
|
+
-- Chronological event store. sequence is 1-based, scoped to the turn —
|
|
286
|
+
-- resets at each new turn. URI-bit columns are unprefixed (scheme,
|
|
287
|
+
-- pathname, …). state/outcome/attrs carry the proposal lifecycle —
|
|
288
|
+
-- status⊥state: status is the HTTP outcome, state is where in the
|
|
289
|
+
-- lifecycle the entry sits. Most rows write 'resolved' directly;
|
|
290
|
+
-- proposing schemes transition 'proposed' → resolved/failed/cancelled.
|
|
291
|
+
-- expanded: per-row visibility for OPEN/FOLD via the log:/// scheme.
|
|
292
|
+
CREATE TABLE IF NOT EXISTS log_entries (
|
|
293
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
294
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
295
|
+
|
|
296
|
+
run_id INTEGER NOT NULL,
|
|
297
|
+
loop_id INTEGER NOT NULL,
|
|
298
|
+
turn_id INTEGER NOT NULL,
|
|
299
|
+
sequence INTEGER NOT NULL CHECK (sequence >= 1),
|
|
300
|
+
at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
301
|
+
origin TEXT NOT NULL CHECK (origin IN ('model', 'client', 'plurnk', 'plugin')),
|
|
302
|
+
-- §env-delta environment-delta cause: a sibling run-id or a scheme ('file');
|
|
303
|
+
-- NULL = the owning run itself (self), rendered without a run= label.
|
|
304
|
+
source TEXT,
|
|
305
|
+
|
|
306
|
+
-- 'error' is an ACTIONLESS row (§telemetry — errors are log items): a parse failure that
|
|
307
|
+
-- produced no op still records a log entry (op='error', status_rx≥400, no target) so the model
|
|
308
|
+
-- can fold/kill/recall its own mistakes like any other log row — one budget surface, the log.
|
|
309
|
+
-- 'model' is an ACTIONLESS row too (§model-entry): the model's own verbatim emission, mirrored
|
|
310
|
+
-- back as a foldable log item so it can finally SEE its prior output (born folded; the turn-0
|
|
311
|
+
-- exemplar is born open). text/vnd.plurnk-typed; OPEN/FOLD/KILL-able like any row.
|
|
312
|
+
-- No op enum here: the grammar op set is grammar's contract (PlurnkOp), and this column is written
|
|
313
|
+
-- only by the PlurnkOp-typed engine (grammar ops) or with the two service markers ('error','model').
|
|
314
|
+
-- A SQL enum would be a hand-copy of grammar's op list that silently goes stale on every new verb
|
|
315
|
+
-- (it did — FORK/WORK). Validity lives at the parse + type layer, not duplicated in DDL.
|
|
316
|
+
op TEXT NOT NULL,
|
|
317
|
+
suffix TEXT NOT NULL DEFAULT '',
|
|
318
|
+
signal TEXT CHECK (signal IS NULL OR json_valid(signal)),
|
|
319
|
+
|
|
320
|
+
scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
|
|
321
|
+
username TEXT,
|
|
322
|
+
password TEXT,
|
|
323
|
+
hostname TEXT,
|
|
324
|
+
port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
|
|
325
|
+
pathname TEXT,
|
|
326
|
+
params TEXT CHECK (params IS NULL OR json_valid(params)),
|
|
327
|
+
fragment TEXT,
|
|
328
|
+
|
|
329
|
+
lineMarker TEXT CHECK (lineMarker IS NULL OR json_valid(lineMarker)),
|
|
330
|
+
|
|
331
|
+
tx TEXT NOT NULL,
|
|
332
|
+
mimetype_tx TEXT NOT NULL CHECK (length(mimetype_tx) > 0),
|
|
333
|
+
|
|
334
|
+
rx TEXT NOT NULL,
|
|
335
|
+
mimetype_rx TEXT NOT NULL CHECK (length(mimetype_rx) > 0),
|
|
336
|
+
status_rx INTEGER NOT NULL CHECK (status_rx BETWEEN 100 AND 599),
|
|
337
|
+
|
|
338
|
+
tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
|
|
339
|
+
|
|
340
|
+
state TEXT NOT NULL DEFAULT 'resolved'
|
|
341
|
+
CHECK (state IN ('proposed', 'resolved', 'failed', 'cancelled')),
|
|
342
|
+
outcome TEXT,
|
|
343
|
+
attrs TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attrs)),
|
|
344
|
+
|
|
345
|
+
expanded INTEGER NOT NULL DEFAULT 1 CHECK (expanded IN (0, 1)),
|
|
346
|
+
|
|
347
|
+
FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
|
|
348
|
+
FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE,
|
|
349
|
+
FOREIGN KEY (turn_id) REFERENCES turns(id) ON DELETE CASCADE
|
|
350
|
+
) STRICT;
|
|
351
|
+
|
|
352
|
+
CREATE UNIQUE INDEX IF NOT EXISTS log_entries_turn_id_sequence ON log_entries (turn_id, sequence);
|
|
353
|
+
CREATE INDEX IF NOT EXISTS log_entries_run_id ON log_entries (run_id);
|
|
354
|
+
CREATE INDEX IF NOT EXISTS log_entries_loop_id ON log_entries (loop_id);
|
|
355
|
+
CREATE INDEX IF NOT EXISTS log_entries_at ON log_entries (at);
|
|
356
|
+
|
|
357
|
+
-- Column-scoped immutability: the original action's identity and target
|
|
358
|
+
-- never change; the proposal lifecycle is allowed to mutate state,
|
|
359
|
+
-- outcome, status_rx, rx, expanded.
|
|
360
|
+
CREATE TRIGGER IF NOT EXISTS log_entries_immutable_core
|
|
361
|
+
BEFORE UPDATE OF
|
|
362
|
+
run_id, loop_id, turn_id, sequence, at, origin, source,
|
|
363
|
+
op, suffix, signal,
|
|
364
|
+
scheme, username, password, hostname,
|
|
365
|
+
port, pathname, params, fragment,
|
|
366
|
+
lineMarker, tx, mimetype_tx, mimetype_rx, attrs
|
|
367
|
+
ON log_entries
|
|
368
|
+
BEGIN
|
|
369
|
+
SELECT RAISE(ABORT, 'log_entries core fields are immutable; only state/outcome/status_rx/rx/expanded may change');
|
|
370
|
+
END;
|
|
371
|
+
|
|
372
|
+
-- INIT: schemes_providers
|
|
373
|
+
-- Scheme/provider catalog. Schemes are static (registered at boot);
|
|
374
|
+
-- providers carry per-model metadata for cost accounting and selection.
|
|
375
|
+
CREATE TABLE IF NOT EXISTS schemes (
|
|
376
|
+
name TEXT NOT NULL PRIMARY KEY CHECK (length(name) > 0),
|
|
377
|
+
model_visible INTEGER NOT NULL CHECK (model_visible IN (0, 1)),
|
|
378
|
+
category TEXT NOT NULL CHECK (length(category) > 0),
|
|
379
|
+
default_scope TEXT NOT NULL CHECK (default_scope IN ('session')),
|
|
380
|
+
default_channel TEXT NOT NULL CHECK (length(default_channel) > 0),
|
|
381
|
+
channel_orientations TEXT CHECK (channel_orientations IS NULL OR json_valid(channel_orientations)),
|
|
382
|
+
writable_by TEXT NOT NULL CHECK (json_valid(writable_by)),
|
|
383
|
+
volatile INTEGER NOT NULL CHECK (volatile IN (0, 1)),
|
|
384
|
+
handler TEXT
|
|
385
|
+
) STRICT, WITHOUT ROWID;
|
|
386
|
+
|
|
387
|
+
CREATE TABLE IF NOT EXISTS providers (
|
|
388
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
389
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
390
|
+
provider TEXT NOT NULL CHECK (length(provider) > 0),
|
|
391
|
+
family TEXT NOT NULL CHECK (length(family) > 0),
|
|
392
|
+
model TEXT NOT NULL CHECK (length(model) > 0),
|
|
393
|
+
contextSize INTEGER NOT NULL CHECK (contextSize >= 1),
|
|
394
|
+
currency TEXT NOT NULL CHECK (length(currency) = 3),
|
|
395
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
396
|
+
) STRICT;
|
|
397
|
+
|
|
398
|
+
CREATE INDEX IF NOT EXISTS providers_created_at ON providers (created_at);
|
|
399
|
+
|
|
400
|
+
-- INIT: cost_rollups
|
|
401
|
+
-- Triggers maintaining denormalized cost_pico totals on runs and sessions
|
|
402
|
+
-- as turns insert/update. Pure denormalization (textbook trigger use);
|
|
403
|
+
-- no branching state-machine logic lives here.
|
|
404
|
+
CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_insert_run
|
|
405
|
+
AFTER INSERT ON turns
|
|
406
|
+
BEGIN
|
|
407
|
+
UPDATE runs
|
|
408
|
+
SET cost_pico = cost_pico + NEW.usage_cost_pico
|
|
409
|
+
WHERE id = (SELECT run_id FROM loops WHERE id = NEW.loop_id);
|
|
410
|
+
END;
|
|
411
|
+
|
|
412
|
+
CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_insert_session
|
|
413
|
+
AFTER INSERT ON turns
|
|
414
|
+
BEGIN
|
|
415
|
+
UPDATE sessions
|
|
416
|
+
SET cost_pico = cost_pico + NEW.usage_cost_pico
|
|
417
|
+
WHERE id = (
|
|
418
|
+
SELECT r.session_id
|
|
419
|
+
FROM runs r
|
|
420
|
+
JOIN loops l ON l.run_id = r.id
|
|
421
|
+
WHERE l.id = NEW.loop_id
|
|
422
|
+
);
|
|
423
|
+
END;
|
|
424
|
+
|
|
425
|
+
CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_update_run
|
|
426
|
+
AFTER UPDATE OF usage_cost_pico ON turns
|
|
427
|
+
WHEN NEW.usage_cost_pico != OLD.usage_cost_pico
|
|
428
|
+
BEGIN
|
|
429
|
+
UPDATE runs
|
|
430
|
+
SET cost_pico = cost_pico + NEW.usage_cost_pico - OLD.usage_cost_pico
|
|
431
|
+
WHERE id = (SELECT run_id FROM loops WHERE id = NEW.loop_id);
|
|
432
|
+
END;
|
|
433
|
+
|
|
434
|
+
CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_update_session
|
|
435
|
+
AFTER UPDATE OF usage_cost_pico ON turns
|
|
436
|
+
WHEN NEW.usage_cost_pico != OLD.usage_cost_pico
|
|
437
|
+
BEGIN
|
|
438
|
+
UPDATE sessions
|
|
439
|
+
SET cost_pico = cost_pico + NEW.usage_cost_pico - OLD.usage_cost_pico
|
|
440
|
+
WHERE id = (
|
|
441
|
+
SELECT r.session_id
|
|
442
|
+
FROM runs r
|
|
443
|
+
JOIN loops l ON l.run_id = r.id
|
|
444
|
+
WHERE l.id = NEW.loop_id
|
|
445
|
+
);
|
|
446
|
+
END;
|
|
447
|
+
|
|
448
|
+
-- INIT: subscriptions
|
|
449
|
+
-- Subscription registry per SPEC §subscriptions. Exists ONLY for cancellation
|
|
450
|
+
-- routing (SEND[499] → lookup → scheme teardown). Closed rows persist
|
|
451
|
+
-- for forensics; partial unique index enforces one active subscription
|
|
452
|
+
-- per (run, entry).
|
|
453
|
+
CREATE TABLE IF NOT EXISTS subscriptions (
|
|
454
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
455
|
+
version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
|
|
456
|
+
run_id INTEGER NOT NULL,
|
|
457
|
+
entry_id INTEGER NOT NULL,
|
|
458
|
+
scheme TEXT NOT NULL CHECK (length(scheme) > 0),
|
|
459
|
+
handle TEXT NOT NULL CHECK (length(handle) > 0),
|
|
460
|
+
opened_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
461
|
+
-- grammar 0.74.20 EXEC `<T,P>` poll cadence (seconds). NULL = not polled. While the owning
|
|
462
|
+
-- loop hibernates (202), the daemon wakes it every poll_seconds to inspect this stream (§exec-poll).
|
|
463
|
+
poll_seconds INTEGER CHECK (poll_seconds IS NULL OR poll_seconds > 0),
|
|
464
|
+
-- EXEC `<0>` — turn-scoped: the stream is reaped at the run's next pre-turn so it never survives
|
|
465
|
+
-- into the subsequent turn; its terminal output surfaces born-OPEN like any conclusion. §exec-poll
|
|
466
|
+
turn_scoped INTEGER NOT NULL DEFAULT 0 CHECK (turn_scoped IN (0, 1)),
|
|
467
|
+
closed_at TEXT,
|
|
468
|
+
close_status INTEGER CHECK (close_status IS NULL OR (close_status BETWEEN 100 AND 599)),
|
|
469
|
+
CHECK ((closed_at IS NULL AND close_status IS NULL)
|
|
470
|
+
OR (closed_at IS NOT NULL AND close_status IS NOT NULL)),
|
|
471
|
+
FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
|
|
472
|
+
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
|
|
473
|
+
) STRICT;
|
|
474
|
+
|
|
475
|
+
CREATE UNIQUE INDEX IF NOT EXISTS subscriptions_active_one_per_entry
|
|
476
|
+
ON subscriptions (run_id, entry_id)
|
|
477
|
+
WHERE closed_at IS NULL;
|
|
478
|
+
|
|
479
|
+
CREATE INDEX IF NOT EXISTS subscriptions_scheme_active
|
|
480
|
+
ON subscriptions (scheme)
|
|
481
|
+
WHERE closed_at IS NULL;
|
|
482
|
+
|
|
483
|
+
CREATE INDEX IF NOT EXISTS subscriptions_opened_at ON subscriptions (opened_at);
|
|
484
|
+
|
|
485
|
+
-- (run_watermarks removed — §env-delta is now pull-from-log, no per-run snapshot.)
|
|
486
|
+
|
|
487
|
+
-- INIT: session_constraints
|
|
488
|
+
-- SPEC §membership constraint overlay — the client's supersede over git membership.
|
|
489
|
+
-- Per (session, effect, glob/target): `pick` (members git misses, resolved by a
|
|
490
|
+
-- targeted client-dictated scan), `hide` (drop git-tracked matches), `view` (member
|
|
491
|
+
-- for read; File.edit rejects the write), `repo` (declare a git repo whose ls-files
|
|
492
|
+
-- join membership, path-prefixed). git-absent, `pick` rows are the sole substrate
|
|
493
|
+
-- source. Composed at membership resolution; node:path.matchesGlob.
|
|
494
|
+
CREATE TABLE IF NOT EXISTS session_constraints (
|
|
495
|
+
session_id INTEGER NOT NULL,
|
|
496
|
+
effect TEXT NOT NULL CHECK (effect IN ('pick', 'hide', 'view', 'repo')),
|
|
497
|
+
glob TEXT NOT NULL,
|
|
498
|
+
PRIMARY KEY (session_id, effect, glob),
|
|
499
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
|
|
500
|
+
) STRICT, WITHOUT ROWID;
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@plurnk/plurnk-service",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Plurnk agent runtime — the server / engine / core. Implements the @plurnk/plurnk-grammar contract.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=26"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"plurnk-dev": "./src/index.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./digest": {
|
|
17
|
+
"types": "./dist/digest/Digest.d.ts",
|
|
18
|
+
"plurnk-dev": "./src/digest/Digest.ts",
|
|
19
|
+
"default": "./dist/digest/Digest.js"
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"plurnk-service": "dist/service.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
".env.defaults",
|
|
28
|
+
"dist/**/*",
|
|
29
|
+
"migrations/**/*.sql",
|
|
30
|
+
"README.md",
|
|
31
|
+
"INSTALL.md",
|
|
32
|
+
"SPEC.md"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"start": "node --conditions=plurnk-dev src/service.ts",
|
|
39
|
+
"test:lint": "tsc --noEmit",
|
|
40
|
+
"test:unit": "node --conditions=plurnk-dev --import=./test/setup.ts --env-file-if-exists=.env.defaults --test --test-timeout=30000 src/**/*.test.ts",
|
|
41
|
+
"test:intg": "PLURNK_SERVICE_FILES_ITEMS=0 node --conditions=plurnk-dev --import=./test/setup.ts --env-file-if-exists=.env.defaults --test --test-concurrency=1 --test-timeout=30000 test/intg/*.test.ts",
|
|
42
|
+
"test:live": "PLURNK_SERVICE_EMBED_DISABLE=0 PLURNK_SERVICE_POLICY=../plurnk-meta/PLURNK_PERSONALITY.md node --conditions=plurnk-dev --import=./test/floor.ts --env-file-if-exists=.env.defaults --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/live/*.test.ts",
|
|
43
|
+
"test:demo": "PLURNK_SERVICE_EMBED_DISABLE=0 PLURNK_SERVICE_POLICY=../plurnk-meta/PLURNK_PERSONALITY.md node --conditions=plurnk-dev --import=./test/floor.ts --env-file-if-exists=.env.defaults --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/demo/*.test.ts",
|
|
44
|
+
"test:all": "npm run test:lint && npm run test:unit && npm run test:intg && npm run test:demo",
|
|
45
|
+
"test:digest": "node --conditions=plurnk-dev bin/digest.ts",
|
|
46
|
+
"test:clean-tmp": "rm -rf test/intg/.tmp",
|
|
47
|
+
"dev:digest": "node --conditions=plurnk-dev bin/digest.ts",
|
|
48
|
+
"build:clean": "rm -rf dist",
|
|
49
|
+
"build:dist": "tsc -p tsconfig.build.json",
|
|
50
|
+
"build:sql": "node --conditions=plurnk-dev scripts/copy-sql.mjs",
|
|
51
|
+
"build": "npm run build:clean && npm run build:dist && npm run build:sql",
|
|
52
|
+
"build:global:install": "npm run build && npm install -g .",
|
|
53
|
+
"build:global:uninstall": "npm uninstall -g @plurnk/plurnk-service",
|
|
54
|
+
"build:local:install": "node --conditions=plurnk-dev scripts/install-sandbox.mjs install",
|
|
55
|
+
"build:local:uninstall": "node --conditions=plurnk-dev scripts/install-sandbox.mjs uninstall",
|
|
56
|
+
"test:installation": "node --conditions=plurnk-dev scripts/test-installation.mjs",
|
|
57
|
+
"deps:audit": "node --conditions=plurnk-dev scripts/deps-audit.ts",
|
|
58
|
+
"prepublishOnly": "npm run deps:audit",
|
|
59
|
+
"prepack": "npm run build"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@plurnk/plurnk-agui": "1.0.0",
|
|
63
|
+
"@plurnk/plurnk-execs": "1.0.0",
|
|
64
|
+
"@plurnk/plurnk-execs-common": "1.0.0",
|
|
65
|
+
"@plurnk/plurnk-execs-mcp": "1.0.0",
|
|
66
|
+
"@plurnk/plurnk-execs-search": "1.0.0",
|
|
67
|
+
"@plurnk/plurnk-grammar": "1.0.0",
|
|
68
|
+
"@plurnk/plurnk-mimetypes": "1.0.0",
|
|
69
|
+
"@plurnk/plurnk-mimetypes-text-html": "1.0.0",
|
|
70
|
+
"@plurnk/plurnk-providers": "1.0.0",
|
|
71
|
+
"@plurnk/plurnk-schemes": "1.0.0",
|
|
72
|
+
"@plurnk/plurnk-schemes-http": "1.0.0",
|
|
73
|
+
"@possumtech/sqlrite": "5.2.0",
|
|
74
|
+
"diff": "^9.0.0",
|
|
75
|
+
"@plurnk/plurnk-mimetypes-embeddings": "1.0.0",
|
|
76
|
+
"@plurnk/plurnk-meta": "1.0.0"
|
|
77
|
+
},
|
|
78
|
+
"devDependencies": {
|
|
79
|
+
"@types/diff": "^7.0.2"
|
|
80
|
+
},
|
|
81
|
+
"peerDependenciesMeta": {
|
|
82
|
+
"@plurnk/plurnk-mimetypes-embeddings": {
|
|
83
|
+
"optional": true
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|