@plurnk/plurnk-service 1.0.4 → 1.0.6
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 +55 -31
- package/INSTALL.md +3 -3
- package/README.md +4 -4
- package/SPEC.md +205 -193
- package/dist/Paths.js +1 -1
- package/dist/Paths.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts +18 -18
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +17 -17
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +11 -11
- package/dist/core/Dispatcher.d.ts +11 -16
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +122 -125
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Engine.d.ts +20 -23
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +213 -210
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +108 -130
- package/dist/core/PacketBuilder.d.ts +10 -11
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +204 -128
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts +8 -8
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +10 -10
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ProviderInstantiate.d.ts +1 -0
- package/dist/core/ProviderInstantiate.d.ts.map +1 -1
- package/dist/core/ProviderInstantiate.js +9 -3
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +4 -1
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +18 -9
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/TelemetryChannel.d.ts +5 -5
- package/dist/core/TelemetryChannel.d.ts.map +1 -1
- package/dist/core/TelemetryChannel.js +9 -9
- package/dist/core/TelemetryChannel.js.map +1 -1
- package/dist/core/caps/CapsResolve.js +2 -2
- package/dist/core/caps/CapsResolve.js.map +1 -1
- package/dist/core/caps/DbNotifyCaps.js +2 -2
- package/dist/core/caps/DbNotifyCaps.js.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.js +7 -7
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.d.ts +2 -2
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.js +4 -4
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
- package/dist/core/content-hash.d.ts +2 -0
- package/dist/core/content-hash.d.ts.map +1 -0
- package/dist/core/content-hash.js +6 -0
- package/dist/core/content-hash.js.map +1 -0
- package/dist/core/fork.d.ts +1 -1
- package/dist/core/fork.d.ts.map +1 -1
- package/dist/core/fork.js +31 -26
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +41 -32
- package/dist/core/git-env.d.ts.map +1 -1
- package/dist/core/git-env.js +23 -7
- package/dist/core/git-env.js.map +1 -1
- package/dist/core/git-iso.d.ts +9 -0
- package/dist/core/git-iso.d.ts.map +1 -0
- package/dist/core/git-iso.js +227 -0
- package/dist/core/git-iso.js.map +1 -0
- package/dist/core/git-membership.d.ts +2 -2
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +70 -50
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.d.ts +1 -1
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +21 -11
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +81 -22
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/plurnk-uri.d.ts +2 -2
- package/dist/core/plurnk-uri.d.ts.map +1 -1
- package/dist/core/plurnk-uri.js +19 -12
- package/dist/core/plurnk-uri.js.map +1 -1
- package/dist/core/run-ops.sql +26 -26
- package/dist/core/scheme-types.d.ts +6 -11
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/search-gate.js +0 -0
- package/dist/core/search-gate.js.map +1 -1
- package/dist/core/token-ruler.d.ts +2 -0
- package/dist/core/token-ruler.d.ts.map +1 -0
- package/dist/core/token-ruler.js +18 -0
- package/dist/core/token-ruler.js.map +1 -0
- package/dist/core/worker-cap.d.ts +8 -0
- package/dist/core/worker-cap.d.ts.map +1 -0
- package/dist/core/worker-cap.js +20 -0
- package/dist/core/worker-cap.js.map +1 -0
- package/dist/core/{session-settings.d.ts → workspace-settings.d.ts} +5 -5
- package/dist/core/workspace-settings.d.ts.map +1 -0
- package/dist/core/{session-settings.js → workspace-settings.js} +13 -13
- package/dist/core/workspace-settings.js.map +1 -0
- package/dist/digest/Digest.d.ts +3 -3
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +79 -73
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/digest.sql +18 -18
- package/dist/schemes/Exec.d.ts +9 -2
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +121 -68
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecOutputScheme.js +3 -3
- package/dist/schemes/ExecOutputScheme.js.map +1 -1
- package/dist/schemes/File.js +23 -23
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Known.js +5 -5
- package/dist/schemes/Known.js.map +1 -1
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +63 -14
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Log.sql +49 -8
- package/dist/schemes/Plurnk.js +5 -5
- package/dist/schemes/Plurnk.js.map +1 -1
- package/dist/schemes/Skill.js +5 -5
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Unknown.js +5 -5
- package/dist/schemes/Unknown.js.map +1 -1
- package/dist/schemes/{Run.d.ts → Worker.d.ts} +2 -2
- package/dist/schemes/Worker.d.ts.map +1 -0
- package/dist/schemes/{Run.js → Worker.js} +67 -67
- package/dist/schemes/Worker.js.map +1 -0
- package/dist/schemes/_entry-crud.js +11 -11
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +29 -29
- package/dist/schemes/_entry-find.d.ts +2 -1
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +31 -19
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-find.sql +9 -9
- package/dist/schemes/_entry-graph.d.ts +2 -2
- package/dist/schemes/_entry-graph.d.ts.map +1 -1
- package/dist/schemes/_entry-graph.js +18 -18
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-graph.sql +8 -8
- package/dist/schemes/_entry-manifest.d.ts +1 -1
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +74 -50
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts +4 -4
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +25 -25
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-ops.sql +9 -9
- package/dist/schemes/_entry-semantic.d.ts +2 -1
- package/dist/schemes/_entry-semantic.d.ts.map +1 -1
- package/dist/schemes/_entry-semantic.js +23 -4
- package/dist/schemes/_entry-semantic.js.map +1 -1
- package/dist/schemes/_entry-semantic.sql +18 -4
- package/dist/schemes/_entry-send.d.ts +1 -1
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +6 -6
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/schemes/exec-abort.js +1 -1
- package/dist/schemes/exec-abort.js.map +1 -1
- package/dist/server/Daemon.d.ts +50 -48
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +307 -297
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/client-input.js +20 -20
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +7 -7
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +27 -27
- package/dist/server/envelope.d.ts +20 -20
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +86 -86
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +39 -39
- package/dist/server/logEntry.d.ts +1 -1
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +1 -1
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/loop-model.d.ts +3 -0
- package/dist/server/loop-model.d.ts.map +1 -0
- package/dist/server/loop-model.js +26 -0
- package/dist/server/loop-model.js.map +1 -0
- package/dist/server/loopDocs.d.ts +1 -1
- package/dist/server/loopDocs.d.ts.map +1 -1
- package/dist/server/loopDocs.js +6 -6
- package/dist/server/loopDocs.js.map +1 -1
- package/dist/server/seam-entry-read.sql +2 -2
- package/dist/server/seam-log-read.sql +3 -3
- package/dist/server/seam-loop.sql +3 -3
- package/dist/server/seam-proposal-list.sql +4 -4
- package/dist/server/yolo.js +2 -2
- package/dist/server/yolo.js.map +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +21 -6
- package/dist/service.js.map +1 -1
- package/migrations/0000-00-00.01_schema.sql +84 -85
- package/package.json +17 -14
- package/dist/core/TokenGauge.d.ts +0 -16
- package/dist/core/TokenGauge.d.ts.map +0 -1
- package/dist/core/TokenGauge.js +0 -58
- package/dist/core/TokenGauge.js.map +0 -1
- package/dist/core/run-cap.d.ts +0 -8
- package/dist/core/run-cap.d.ts.map +0 -1
- package/dist/core/run-cap.js +0 -20
- package/dist/core/run-cap.js.map +0 -1
- package/dist/core/search-prefetch.d.ts +0 -17
- package/dist/core/search-prefetch.d.ts.map +0 -1
- package/dist/core/search-prefetch.js +0 -164
- package/dist/core/search-prefetch.js.map +0 -1
- package/dist/core/session-settings.d.ts.map +0 -1
- package/dist/core/session-settings.js.map +0 -1
- package/dist/schemes/Run.d.ts.map +0 -1
- package/dist/schemes/Run.js.map +0 -1
package/dist/server/envelope.js
CHANGED
|
@@ -1,171 +1,171 @@
|
|
|
1
1
|
// Envelope lifecycle helpers for client connections. SPEC §connection-lifecycle.
|
|
2
2
|
//
|
|
3
|
-
// Every connected client gets a (
|
|
4
|
-
// the client picks the
|
|
3
|
+
// Every connected client gets a (workspace, run, client-loop) envelope. Either
|
|
4
|
+
// the client picks the workspace explicitly (workspace.create / workspace.attach)
|
|
5
5
|
// or the daemon auto-creates one on first requiresInit RPC. In both cases
|
|
6
|
-
// the daemon opens a NEW run within the
|
|
7
|
-
// that
|
|
6
|
+
// the daemon opens a NEW run within the workspace and a NEW client loop within
|
|
7
|
+
// that worker; the client loop closes on disconnect.
|
|
8
8
|
import GitMembership from "../core/git-membership.js";
|
|
9
9
|
export default class Envelope {
|
|
10
10
|
// Run names reserved for non-client actors: a client must not create OR
|
|
11
|
-
// attach to a
|
|
11
|
+
// attach to a worker under a reserved name (origin-impersonation — `plurnk`
|
|
12
12
|
// is the runtime actor, §authority-terms/§actor-boundary). Checked case-insensitively, before
|
|
13
13
|
// lookup, so a client can neither forge nor hijack one (SPEC §methods).
|
|
14
|
-
static RESERVED_RUN_NAMES = new Set(["plurnk"]); // §methods-
|
|
15
|
-
// Grammar 0.5.0 (#10):
|
|
16
|
-
// Defaults are `
|
|
14
|
+
static RESERVED_RUN_NAMES = new Set(["plurnk"]); // §methods-worker-name-reserved
|
|
15
|
+
// Grammar 0.5.0 (#10): Workspace and Run carry user-renameable string names.
|
|
16
|
+
// Defaults are `workspace-{unixtime}` and `run-{unixtime}`; random suffix avoids
|
|
17
17
|
// collisions when two creations land in the same second.
|
|
18
18
|
static #tsName(prefix) {
|
|
19
19
|
const ts = Math.floor(Date.now() / 1000);
|
|
20
20
|
const rand = Math.floor(Math.random() * 0xFFFFFF).toString(36).padStart(4, "0");
|
|
21
21
|
return `${prefix}-${ts}-${rand}`;
|
|
22
22
|
}
|
|
23
|
-
static
|
|
24
|
-
return Envelope.#tsName("
|
|
23
|
+
static generateWorkspaceName() {
|
|
24
|
+
return Envelope.#tsName("workspace");
|
|
25
25
|
}
|
|
26
|
-
static
|
|
27
|
-
return Envelope.#tsName("
|
|
26
|
+
static generateWorkerName() {
|
|
27
|
+
return Envelope.#tsName("worker");
|
|
28
28
|
}
|
|
29
29
|
static async createClientEnvelope(db, opts = {}) {
|
|
30
|
-
const name = opts.name ?? Envelope.#tsName(opts.prefix ?? "
|
|
30
|
+
const name = opts.name ?? Envelope.#tsName(opts.prefix ?? "workspace");
|
|
31
31
|
const projectRoot = opts.projectRoot ?? null;
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
throw new Error("createClientEnvelope:
|
|
32
|
+
const workspace = await db.envelope_insert_workspace.get({ name, project_root: projectRoot, settings: opts.settings ?? "{}" });
|
|
33
|
+
if (workspace === undefined)
|
|
34
|
+
throw new Error("createClientEnvelope: workspace insert returned no row");
|
|
35
35
|
// SPEC §membership D4 — establish git-ls-files membership at workspace setup so
|
|
36
36
|
// tracked files are members before the first op. No-op when projectRoot is
|
|
37
37
|
// null (headless) or not a git working tree.
|
|
38
|
-
await GitMembership.resolveGitMembership(db,
|
|
39
|
-
const
|
|
40
|
-
const run = await db.
|
|
38
|
+
await GitMembership.resolveGitMembership(db, workspace.id, undefined);
|
|
39
|
+
const workerName = Envelope.generateWorkerName();
|
|
40
|
+
const run = await db.envelope_insert_worker.get({ workspace_id: workspace.id, name: workerName, origin: "client" });
|
|
41
41
|
if (run === undefined)
|
|
42
42
|
throw new Error("createClientEnvelope: run insert returned no row");
|
|
43
43
|
return {
|
|
44
|
-
|
|
45
|
-
projectRoot:
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
workspaceId: workspace.id, workspaceName: workspace.name,
|
|
45
|
+
projectRoot: workspace.project_root,
|
|
46
|
+
workerId: run.id, workerName: run.name,
|
|
47
|
+
modelWorkerId: null,
|
|
48
48
|
clientLoopId: null,
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
// Resolve the
|
|
52
|
-
// - opts.
|
|
53
|
-
// - opts.
|
|
51
|
+
// Resolve the worker inside a workspace. Three modes:
|
|
52
|
+
// - opts.workerId given: lookup by id, verify workspace ownership (else throw).
|
|
53
|
+
// - opts.workerName given: lookup by (workspaceId, name); reuse if found, create otherwise.
|
|
54
54
|
// - neither: create a new run with an auto-generated name (current behavior).
|
|
55
|
-
// `
|
|
56
|
-
static async #
|
|
57
|
-
if (opts.
|
|
58
|
-
throw new Error("
|
|
55
|
+
// `workerId` and `workerName` are alternatives — passing both throws (use one).
|
|
56
|
+
static async #resolveWorker(db, workspaceId, opts) {
|
|
57
|
+
if (opts.workerId !== undefined && opts.workerName !== undefined) {
|
|
58
|
+
throw new Error("attachToWorkspace: pass workerId OR workerName, not both");
|
|
59
59
|
}
|
|
60
|
-
if (opts.
|
|
61
|
-
const existing = await db.
|
|
60
|
+
if (opts.workerId !== undefined) {
|
|
61
|
+
const existing = await db.envelope_get_worker_by_id.get({ id: opts.workerId });
|
|
62
62
|
if (existing === undefined)
|
|
63
|
-
throw new Error(`run ${opts.
|
|
64
|
-
if (existing.
|
|
65
|
-
throw new Error(`run ${opts.
|
|
63
|
+
throw new Error(`run ${opts.workerId} not found`);
|
|
64
|
+
if (existing.workspace_id !== workspaceId)
|
|
65
|
+
throw new Error(`run ${opts.workerId} belongs to workspace ${existing.workspace_id}, not ${workspaceId}`);
|
|
66
66
|
return { id: existing.id, name: existing.name };
|
|
67
67
|
}
|
|
68
|
-
if (opts.
|
|
69
|
-
if (Envelope.RESERVED_RUN_NAMES.has(opts.
|
|
70
|
-
throw new Error(`
|
|
68
|
+
if (opts.workerName !== undefined) {
|
|
69
|
+
if (Envelope.RESERVED_RUN_NAMES.has(opts.workerName.toLowerCase())) {
|
|
70
|
+
throw new Error(`worker name "${opts.workerName}" is reserved for a non-client actor`);
|
|
71
71
|
}
|
|
72
|
-
const existing = await db.
|
|
72
|
+
const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: opts.workerName });
|
|
73
73
|
if (existing !== undefined)
|
|
74
74
|
return existing;
|
|
75
|
-
const created = await db.
|
|
75
|
+
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: opts.workerName, origin: "client" });
|
|
76
76
|
if (created === undefined)
|
|
77
|
-
throw new Error("
|
|
77
|
+
throw new Error("resolveWorker: run insert returned no row");
|
|
78
78
|
return created;
|
|
79
79
|
}
|
|
80
|
-
const created = await db.
|
|
80
|
+
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: Envelope.generateWorkerName(), origin: "client" });
|
|
81
81
|
if (created === undefined)
|
|
82
|
-
throw new Error("
|
|
82
|
+
throw new Error("resolveWorker: run insert returned no row");
|
|
83
83
|
return created;
|
|
84
84
|
}
|
|
85
|
-
static async
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
throw new Error(`
|
|
89
|
-
const run = await Envelope.#
|
|
85
|
+
static async attachToWorkspace(db, workspaceId, opts = {}) {
|
|
86
|
+
const workspace = await db.envelope_get_workspace.get({ id: workspaceId });
|
|
87
|
+
if (workspace === undefined)
|
|
88
|
+
throw new Error(`workspace ${workspaceId} not found`);
|
|
89
|
+
const run = await Envelope.#resolveWorker(db, workspace.id, opts);
|
|
90
90
|
return {
|
|
91
|
-
|
|
92
|
-
projectRoot:
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
workspaceId: workspace.id, workspaceName: workspace.name,
|
|
92
|
+
projectRoot: workspace.project_root,
|
|
93
|
+
workerId: run.id, workerName: run.name,
|
|
94
|
+
modelWorkerId: null,
|
|
95
95
|
clientLoopId: null,
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
98
|
// Lazy client-loop allocator. Called from dispatchAsClient on the first
|
|
99
99
|
// client-origin op for this connection; subsequent ops reuse the same
|
|
100
100
|
// loop until the connection closes.
|
|
101
|
-
static async ensureClientLoop(db,
|
|
102
|
-
const loop = await db.envelope_insert_client_loop.get({
|
|
101
|
+
static async ensureClientLoop(db, workerId) {
|
|
102
|
+
const loop = await db.envelope_insert_client_loop.get({ worker_id: workerId });
|
|
103
103
|
if (loop === undefined)
|
|
104
104
|
throw new Error("ensureClientLoop: loop insert returned no row");
|
|
105
105
|
return loop.id;
|
|
106
106
|
}
|
|
107
|
-
// Lazy model-run allocator (§connection-lifecycle, §machine-processes — the client writes to its own
|
|
107
|
+
// Lazy model-run allocator (§connection-lifecycle, §machine-processes — the client writes to its own worker).
|
|
108
108
|
// The model's conversation lives in its OWN run, distinct from the connection's
|
|
109
109
|
// (client) run, so the packet — rendered from the model's run — never carries
|
|
110
110
|
// the client's op.*. Created on the first loop.run; reused for the connection.
|
|
111
|
-
// #366 — a FRESH conversation over the same world (§machine-processes: two
|
|
111
|
+
// #366 — a FRESH conversation over the same world (§machine-processes: two workers are two
|
|
112
112
|
// conversations about one curated workspace): a named, empty-log, model-origin ROOT run.
|
|
113
|
-
// Distinct from
|
|
114
|
-
static async
|
|
115
|
-
const run = await db.
|
|
113
|
+
// Distinct from ensureModelWorker (the stable default conversation) and forkWorker (copies history).
|
|
114
|
+
static async createModelWorker(db, workspaceId, name) {
|
|
115
|
+
const run = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: name ?? Envelope.#tsName("model"), origin: "model" });
|
|
116
116
|
if (run === undefined)
|
|
117
|
-
throw new Error("
|
|
117
|
+
throw new Error("createModelWorker: run insert returned no row");
|
|
118
118
|
return run;
|
|
119
119
|
}
|
|
120
|
-
static async
|
|
121
|
-
// #371 — ensure means FIND-FIRST (the WS connection's per-
|
|
120
|
+
static async ensureModelWorker(db, workspaceId) {
|
|
121
|
+
// #371 — ensure means FIND-FIRST (the WS connection's per-workspace cache used to hide the
|
|
122
122
|
// insert-only bug; the seam has no connection state, so idempotence lives HERE): reuse the
|
|
123
|
-
//
|
|
124
|
-
// inherit origin and are excluded by
|
|
125
|
-
const existing = await db.
|
|
123
|
+
// workspace's canonical conversation worker — the earliest model-origin root (forks/workers
|
|
124
|
+
// inherit origin and are excluded by parent_worker_id). #366 is the explicit fresh-run door.
|
|
125
|
+
const existing = await db.envelope_get_model_worker.get({ workspace_id: workspaceId });
|
|
126
126
|
if (existing !== undefined)
|
|
127
127
|
return existing.id;
|
|
128
|
-
const run = await db.
|
|
128
|
+
const run = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: Envelope.#tsName("model"), origin: "model" });
|
|
129
129
|
if (run === undefined)
|
|
130
|
-
throw new Error("
|
|
130
|
+
throw new Error("ensureModelWorker: run insert returned no row");
|
|
131
131
|
return run.id;
|
|
132
132
|
}
|
|
133
|
-
// Self-hosting keystone (§actor-boundary): the
|
|
133
|
+
// Self-hosting keystone (§actor-boundary): the workspace's reserved `plurnk` run, where the
|
|
134
134
|
// runtime acts as an ordinary actor (doc materialization today; fs/git work
|
|
135
|
-
// later). One per
|
|
136
|
-
// to other
|
|
137
|
-
static async
|
|
138
|
-
const existing = await db.
|
|
135
|
+
// later). One per workspace, reused; its log is the runtime's own — invisible
|
|
136
|
+
// to other workers except through the shared workspace filesystem.
|
|
137
|
+
static async ensurePlurnkWorker(db, workspaceId) {
|
|
138
|
+
const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: "plurnk" });
|
|
139
139
|
if (existing !== undefined)
|
|
140
140
|
return existing.id;
|
|
141
|
-
const run = await db.
|
|
141
|
+
const run = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "plurnk", origin: "plurnk" });
|
|
142
142
|
if (run === undefined)
|
|
143
|
-
throw new Error("
|
|
143
|
+
throw new Error("ensurePlurnkWorker: run insert returned no row");
|
|
144
144
|
return run.id;
|
|
145
145
|
}
|
|
146
|
-
static async
|
|
147
|
-
return await db.
|
|
146
|
+
static async listWorkersForWorkspace(db, workspaceId) {
|
|
147
|
+
return await db.envelope_list_workers_for_workspace.all({ workspace_id: workspaceId });
|
|
148
148
|
}
|
|
149
|
-
// #238 — a
|
|
149
|
+
// #238 — a workspace's prior user prompts, newest-first, capped. The conversation worker's
|
|
150
150
|
// loop seeds (engine_get_loop_prompt is the per-loop read); exposed directly so a
|
|
151
151
|
// client seeds up/down history without log archaeology.
|
|
152
|
-
static async
|
|
153
|
-
const rows = await db.
|
|
152
|
+
static async listPromptsForWorkspace(db, workspaceId, limit) {
|
|
153
|
+
const rows = await db.envelope_list_workspace_prompts.all({ workspace_id: workspaceId, limit });
|
|
154
154
|
return rows.map((r) => r.prompt);
|
|
155
155
|
}
|
|
156
156
|
static async closeClientLoop(db, loopId, status) {
|
|
157
157
|
await db.envelope_close_client_loop.run({ status, loop_id: loopId });
|
|
158
158
|
}
|
|
159
|
-
static async
|
|
160
|
-
return await db.
|
|
159
|
+
static async listWorkspaces(db) {
|
|
160
|
+
return await db.envelope_list_workspaces.all();
|
|
161
161
|
}
|
|
162
|
-
//
|
|
163
|
-
// name, §machine-processes). Mutates
|
|
162
|
+
// workspace.rename — the workspace name is a mutable handle (vs a worker's immutable
|
|
163
|
+
// name, §machine-processes). Mutates workspaces.name only; the UNIQUE constraint is
|
|
164
164
|
// the real guard against collision (the handler pre-checks for a clean error).
|
|
165
|
-
static async
|
|
166
|
-
const row = await db.
|
|
165
|
+
static async updateWorkspaceName(db, workspaceId, name) {
|
|
166
|
+
const row = await db.envelope_set_workspace_name.get({ id: workspaceId, name });
|
|
167
167
|
if (row === undefined)
|
|
168
|
-
throw new Error(`
|
|
168
|
+
throw new Error(`workspace ${workspaceId} not found`);
|
|
169
169
|
return row.name;
|
|
170
170
|
}
|
|
171
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/server/envelope.sql
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
1
|
-- Envelope lifecycle queries. SPEC §connection-lifecycle.
|
|
2
2
|
|
|
3
|
-
-- PREP:
|
|
4
|
-
INSERT INTO
|
|
3
|
+
-- PREP: envelope_insert_workspace
|
|
4
|
+
INSERT INTO workspaces (name, project_root, settings)
|
|
5
5
|
VALUES ($name, $project_root, $settings)
|
|
6
6
|
RETURNING id, name, project_root;
|
|
7
7
|
|
|
8
|
-
-- PREP:
|
|
9
|
-
SELECT id, name, project_root FROM
|
|
8
|
+
-- PREP: envelope_get_workspace
|
|
9
|
+
SELECT id, name, project_root FROM workspaces WHERE id = $id;
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
-- PREP:
|
|
13
|
-
--
|
|
14
|
-
SELECT id FROM
|
|
12
|
+
-- PREP: envelope_get_workspace_by_name
|
|
13
|
+
-- workspace.rename collision check — workspaces.name is UNIQUE.
|
|
14
|
+
SELECT id FROM workspaces WHERE name = $name;
|
|
15
15
|
|
|
16
|
-
-- PREP:
|
|
17
|
-
-- Used by
|
|
16
|
+
-- PREP: envelope_set_workspace_name
|
|
17
|
+
-- Used by workspace.rename. The workspace name is a MUTABLE handle (vs a worker's
|
|
18
18
|
-- immutable name, §machine-processes). Returns the updated row to refresh the
|
|
19
19
|
-- caller's ClientEnvelope copy.
|
|
20
|
-
UPDATE
|
|
20
|
+
UPDATE workspaces SET name = $name WHERE id = $id
|
|
21
21
|
RETURNING id, name;
|
|
22
22
|
|
|
23
|
-
-- PREP:
|
|
24
|
-
-- origin is the
|
|
25
|
-
-- 'client' (a connection's own
|
|
26
|
-
INSERT INTO
|
|
27
|
-
VALUES ($
|
|
23
|
+
-- PREP: envelope_insert_worker
|
|
24
|
+
-- origin is the worker's actor (§machine-processes): 'model' (the conversation),
|
|
25
|
+
-- 'client' (a connection's own worker), or 'plurnk' (the runtime self-hosting worker).
|
|
26
|
+
INSERT INTO workers (workspace_id, name, origin)
|
|
27
|
+
VALUES ($workspace_id, $name, $origin)
|
|
28
28
|
RETURNING id, name, origin;
|
|
29
29
|
|
|
30
|
-
-- PREP:
|
|
31
|
-
SELECT id, name,
|
|
30
|
+
-- PREP: envelope_get_worker_by_id
|
|
31
|
+
SELECT id, name, workspace_id, origin FROM workers WHERE id = $id;
|
|
32
32
|
|
|
33
|
-
-- PREP:
|
|
34
|
-
SELECT id, name FROM
|
|
33
|
+
-- PREP: envelope_get_worker_by_name
|
|
34
|
+
SELECT id, name FROM workers WHERE workspace_id = $workspace_id AND name = $name;
|
|
35
35
|
|
|
36
|
-
-- PREP:
|
|
36
|
+
-- PREP: envelope_list_workers_for_workspace
|
|
37
37
|
SELECT id, name, created_at, cost_pico, origin
|
|
38
|
-
FROM
|
|
39
|
-
WHERE
|
|
38
|
+
FROM workers
|
|
39
|
+
WHERE workspace_id = $workspace_id
|
|
40
40
|
ORDER BY created_at DESC;
|
|
41
41
|
|
|
42
|
-
-- PREP:
|
|
43
|
-
-- #238 — a
|
|
44
|
-
-- non-empty loop seeds, newest-first, capped. The conversation
|
|
45
|
-
-- parentless; spawned/forked
|
|
42
|
+
-- PREP: envelope_list_workspace_prompts
|
|
43
|
+
-- #238 — a workspace's user prompts for client up/down history: the conversation worker's
|
|
44
|
+
-- non-empty loop seeds, newest-first, capped. The conversation worker is origin='model' +
|
|
45
|
+
-- parentless; spawned/forked worker:// sub-runs (parent_worker_id set) are excluded — their
|
|
46
46
|
-- seed prompts are not user input.
|
|
47
47
|
SELECT l.prompt
|
|
48
48
|
FROM loops l
|
|
49
|
-
JOIN
|
|
50
|
-
WHERE r.
|
|
49
|
+
JOIN workers r ON r.id = l.worker_id
|
|
50
|
+
WHERE r.workspace_id = $workspace_id
|
|
51
51
|
AND r.origin = 'model'
|
|
52
|
-
AND r.
|
|
52
|
+
AND r.parent_worker_id IS NULL
|
|
53
53
|
AND length(l.prompt) > 0
|
|
54
54
|
ORDER BY l.id DESC
|
|
55
55
|
LIMIT $limit;
|
|
56
56
|
|
|
57
57
|
-- PREP: envelope_insert_client_loop
|
|
58
|
-
-- sequence is auto-computed: 1 + max(existing sequence in this
|
|
58
|
+
-- sequence is auto-computed: 1 + max(existing sequence in this worker) so
|
|
59
59
|
-- multiple client connections attaching to the same run get distinct loops.
|
|
60
|
-
INSERT INTO loops (
|
|
61
|
-
VALUES ($
|
|
60
|
+
INSERT INTO loops (worker_id, sequence, status, prompt)
|
|
61
|
+
VALUES ($worker_id, COALESCE((SELECT MAX(sequence) FROM loops WHERE worker_id = $worker_id), 0) + 1, 102, '')
|
|
62
62
|
RETURNING id;
|
|
63
63
|
|
|
64
64
|
-- PREP: envelope_close_client_loop
|
|
65
65
|
UPDATE loops SET status = $status WHERE id = $loop_id AND status = 102;
|
|
66
66
|
|
|
67
|
-
-- PREP:
|
|
67
|
+
-- PREP: envelope_list_workspaces
|
|
68
68
|
SELECT id, name, project_root, created_at, cost_pico
|
|
69
|
-
FROM
|
|
69
|
+
FROM workspaces
|
|
70
70
|
ORDER BY created_at DESC;
|
|
71
71
|
|
|
72
|
-
-- PREP:
|
|
73
|
-
-- #371 — the
|
|
74
|
-
-- (
|
|
75
|
-
--
|
|
76
|
-
SELECT id FROM
|
|
72
|
+
-- PREP: envelope_get_model_worker
|
|
73
|
+
-- #371 — the workspace's canonical model CONVERSATION run: the earliest model-origin ROOT run
|
|
74
|
+
-- (parent_worker_id NULL excludes forks and spawned workers, which inherit origin='model').
|
|
75
|
+
-- ensureModelWorker finds this first; only a workspace with none mints one.
|
|
76
|
+
SELECT id FROM workers WHERE workspace_id = $workspace_id AND origin = 'model' AND parent_worker_id IS NULL ORDER BY id LIMIT 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logEntry.d.ts","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,eAAe,CAAC;AAMpD,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,
|
|
1
|
+
{"version":3,"file":"logEntry.d.ts","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,eAAe,CAAC;AAMpD,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,QAAQ;;IASzB,OAAa,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAgCpE;CACJ"}
|
package/dist/server/logEntry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logEntry.js","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8DAA8D;AAC9D,yCAAyC;AAsCzC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,gBAAgB,CAAC,CAAU;QAC9B,uFAAuF;QACvF,kFAAkF;QAClF,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC3D,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,EAAU;QACzC,MAAM,GAAG,GAAG,MAAO,EAAE,CAAC,eAA8B,CAAC,GAAG,CAA0B,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAC1E,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,
|
|
1
|
+
{"version":3,"file":"logEntry.js","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8DAA8D;AAC9D,yCAAyC;AAsCzC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,gBAAgB,CAAC,CAAU;QAC9B,uFAAuF;QACvF,kFAAkF;QAClF,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC3D,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,EAAU;QACzC,MAAM,GAAG,GAAG,MAAO,EAAE,CAAC,eAA8B,CAAC,GAAG,CAA0B,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAC1E,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,OAAO,EAAE,GAAG,CAAC,OAAiB;YAC9B,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,OAAO,EAAE,GAAG,CAAC,OAAiB;YAC9B,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,MAAM,EAAE,GAAG,CAAC,MAAgB;YAC5B,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,MAAM,EAAE,GAAG,CAAC,MAAgB;YAC5B,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7C,MAAM,EAAE,GAAG,CAAC,MAAuB;YACnC,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,IAAI,EAAE,GAAG,CAAC,IAAqB;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7C,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;YACrD,EAAE,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,WAAW,EAAE,GAAG,CAAC,WAAqB;YACtC,EAAE,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,WAAW,EAAE,GAAG,CAAC,WAAqB;YACtC,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,MAAM,EAAE,GAAG,CAAC,MAAgB;SAC/B,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-model.d.ts","sourceRoot":"","sources":["../../src/server/loop-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAU9D,eAAO,MAAM,gBAAgB,UAClB,MAAM,GAAG,SAAS,SAClB,MAAM,GAAG,SAAS,YACf,SAAS,aAAa,EAAE,KACnC,aAAa,GAAG,IAclB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// #414 — per-loop model selection: resolve a runLoop call's optional (alias, model) to the
|
|
2
|
+
// ProviderAlias to instantiate, or null for "use the boot default". PURE (no env read, no
|
|
3
|
+
// construction) so the precedence + parse contract is hermetically testable; the Daemon wraps it
|
|
4
|
+
// with ProviderInstantiate + the #provider fallback.
|
|
5
|
+
//
|
|
6
|
+
// Precedence: `model` (client-resolved `<provider>/<model>`, #90) wins over a named `alias`,
|
|
7
|
+
// matching how the legacy WS loop.run treated the pair. A malformed model spec or an undeclared
|
|
8
|
+
// alias throws legibly — the daemon must never silently run the wrong model.
|
|
9
|
+
export const resolveLoopAlias = (alias, model, declared) => {
|
|
10
|
+
if (typeof model === "string" && model.length > 0) {
|
|
11
|
+
const slash = model.indexOf("/");
|
|
12
|
+
if (slash <= 0)
|
|
13
|
+
throw new Error(`runLoop: model must be '<provider>/<model>' (got '${model}')`);
|
|
14
|
+
// A client-resolved spec is alias-independent (#90): the provider's own env carries the
|
|
15
|
+
// base URL, so the synthetic alias name is cosmetic (reuse the given alias if present).
|
|
16
|
+
return { alias: alias ?? model, provider: model.slice(0, slash), model: model.slice(slash + 1) };
|
|
17
|
+
}
|
|
18
|
+
if (typeof alias === "string" && alias.length > 0) {
|
|
19
|
+
const resolved = declared.find((a) => a.alias === alias.toLowerCase());
|
|
20
|
+
if (resolved === undefined)
|
|
21
|
+
throw new Error(`runLoop: alias '${alias}' is not declared (set PLURNK_MODEL_${alias}=<provider>/<model>)`);
|
|
22
|
+
return resolved;
|
|
23
|
+
}
|
|
24
|
+
return null; // neither → the daemon's boot default
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=loop-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-model.js","sourceRoot":"","sources":["../../src/server/loop-model.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,0FAA0F;AAC1F,iGAAiG;AACjG,qDAAqD;AACrD,EAAE;AACF,6FAA6F;AAC7F,gGAAgG;AAChG,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC5B,KAAyB,EACzB,KAAyB,EACzB,QAAkC,EACd,EAAE;IACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,IAAI,CAAC,CAAC;QAChG,wFAAwF;QACxF,wFAAwF;QACxF,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;IACrG,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACvE,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,uCAAuC,KAAK,sBAAsB,CAAC,CAAC;QACxI,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,CAAE,sCAAsC;AACxD,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type Engine from "../core/Engine.ts";
|
|
2
2
|
import type { Db } from "../core/Db.ts";
|
|
3
3
|
export default class LoopDocs {
|
|
4
|
-
static materialize(engine: Engine, db: Db,
|
|
4
|
+
static materialize(engine: Engine, db: Db, workspaceId: number): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=loopDocs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopDocs.d.ts","sourceRoot":"","sources":["../../src/server/loopDocs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKxC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,OAAa,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"loopDocs.d.ts","sourceRoot":"","sources":["../../src/server/loopDocs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKxC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,OAAa,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAenF;CACJ"}
|
package/dist/server/loopDocs.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import WorkspaceSettings from "../core/workspace-settings.js";
|
|
2
2
|
import DispatchAsPlurnk from "./dispatch-as-plurnk.js";
|
|
3
3
|
export default class LoopDocs {
|
|
4
|
-
static async materialize(engine, db,
|
|
5
|
-
const { mdDocs } = await
|
|
6
|
-
const docStmts = (await
|
|
4
|
+
static async materialize(engine, db, workspaceId) {
|
|
5
|
+
const { mdDocs } = await WorkspaceSettings.read(db, workspaceId);
|
|
6
|
+
const docStmts = (await WorkspaceSettings.resolveDocs(mdDocs)).map((doc) => ({
|
|
7
7
|
op: "EDIT", suffix: "", signal: null,
|
|
8
8
|
target: { kind: "url", raw: `plurnk:///${doc.entryName}`, scheme: "plurnk", username: null, password: null, hostname: null, port: null, pathname: `/${doc.entryName}`, params: {}, fragment: null },
|
|
9
9
|
lineMarker: null, body: doc.content, position: { line: 1, column: 1 },
|
|
10
10
|
}));
|
|
11
|
-
for (const { name, content } of await engine.docEntries(
|
|
11
|
+
for (const { name, content } of await engine.docEntries(workspaceId)) {
|
|
12
12
|
docStmts.push({
|
|
13
13
|
op: "EDIT", suffix: "", signal: null,
|
|
14
14
|
target: { kind: "url", raw: `plurnk://docs/${name}.md`, scheme: "plurnk", username: null, password: null, hostname: "docs", port: null, pathname: `/${name}.md`, params: {}, fragment: null },
|
|
@@ -16,7 +16,7 @@ export default class LoopDocs {
|
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
if (docStmts.length > 0)
|
|
19
|
-
await DispatchAsPlurnk.dispatch(engine, db,
|
|
19
|
+
await DispatchAsPlurnk.dispatch(engine, db, workspaceId, docStmts);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=loopDocs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopDocs.js","sourceRoot":"","sources":["../../src/server/loopDocs.ts"],"names":[],"mappings":"AASA,OAAO,
|
|
1
|
+
{"version":3,"file":"loopDocs.js","sourceRoot":"","sources":["../../src/server/loopDocs.ts"],"names":[],"mappings":"AASA,OAAO,iBAAiB,MAAM,+BAA+B,CAAC;AAC9D,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,EAAM,EAAE,WAAmB;QAChE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAoB,CAAC,MAAM,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1F,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI;YACpC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnM,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACxE,CAAC,CAAC,CAAC;QACJ,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI;gBACpC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,iBAAiB,IAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7L,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;aACpE,CAAC,CAAC;QACP,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,QAA6B,CAAC,CAAC;IACrH,CAAC;CACJ"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
-- entry.read RPC queries. SPEC §methods.
|
|
2
2
|
|
|
3
3
|
-- PREP: entry_read_lookup
|
|
4
|
-
SELECT id, scope,
|
|
4
|
+
SELECT id, scope, workspace_id, scheme, pathname
|
|
5
5
|
FROM entries
|
|
6
|
-
WHERE
|
|
6
|
+
WHERE workspace_id = $workspace_id AND scheme = $scheme AND pathname = $pathname;
|
|
7
7
|
|
|
8
8
|
-- PREP: entry_read_channels
|
|
9
9
|
SELECT name, content, length(content) AS contentLength, mimetype, tokens, state
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
-- Static query with IS-NULL guards on optional filters. The loops/turns joins
|
|
3
3
|
-- resolve the DISPLAY coordinate (loop_seq/turn_seq/op-sequence) so a client can
|
|
4
4
|
-- target one entry by its `L/T/S` coordinate (plurnk-service#271) instead of
|
|
5
|
-
-- fetching a
|
|
6
|
-
-- carries
|
|
5
|
+
-- fetching a worker and matching client-side. INNER JOINs are safe: log_entries
|
|
6
|
+
-- carries worker_id/loop_id/turn_id NOT NULL, so no row is dropped; the coordinate
|
|
7
7
|
-- guards are inert when their param is NULL (identical to the id-only filters).
|
|
8
8
|
|
|
9
9
|
-- PREP: log_read_recent_ids
|
|
10
10
|
SELECT le.id FROM log_entries le
|
|
11
11
|
JOIN turns t ON t.id = le.turn_id
|
|
12
12
|
JOIN loops l ON l.id = t.loop_id
|
|
13
|
-
WHERE le.
|
|
13
|
+
WHERE le.worker_id = $worker_id
|
|
14
14
|
AND ($loop_id IS NULL OR le.loop_id = $loop_id)
|
|
15
15
|
AND ($turn_id IS NULL OR le.turn_id = $turn_id)
|
|
16
16
|
AND ($since_id IS NULL OR le.id > $since_id)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
-- loop.run RPC queries. SPEC §rpc.
|
|
2
2
|
|
|
3
3
|
-- PREP: loop_run_next_sequence
|
|
4
|
-
SELECT COALESCE(MAX(sequence), 0) + 1 AS next FROM loops WHERE
|
|
4
|
+
SELECT COALESCE(MAX(sequence), 0) + 1 AS next FROM loops WHERE worker_id = $worker_id;
|
|
5
5
|
|
|
6
6
|
-- PREP: loop_run_insert_loop
|
|
7
|
-
INSERT INTO loops (
|
|
8
|
-
VALUES ($
|
|
7
|
+
INSERT INTO loops (worker_id, sequence, status, prompt)
|
|
8
|
+
VALUES ($worker_id, $sequence, 102, $prompt)
|
|
9
9
|
RETURNING id;
|