@plurnk/plurnk-service 3.3.0 → 4.1.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 +4 -4
- package/INSTALL.md +6 -0
- package/README.md +2 -2
- package/SPEC.md +408 -179
- package/dist/build-info.json +1 -1
- package/dist/completions/_plurnk-service +1 -1
- package/dist/completions/plurnk-service.bash +1 -1
- package/dist/completions/plurnk-service.fish +2 -0
- package/dist/content/read-projector.js +1 -1
- package/dist/content/read-projector.js.map +1 -1
- package/dist/core/AdministrativeLoop.d.ts +1 -1
- package/dist/core/AdministrativeLoop.d.ts.map +1 -1
- package/dist/core/AdministrativeLoop.js +4 -1
- package/dist/core/AdministrativeLoop.js.map +1 -1
- package/dist/core/AdmittedTurnExecutor.d.ts +3 -1
- package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
- package/dist/core/AdmittedTurnExecutor.js +12 -0
- package/dist/core/AdmittedTurnExecutor.js.map +1 -1
- package/dist/core/BareBatchRunner.js +2 -1
- package/dist/core/BareBatchRunner.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts +10 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +10 -0
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +14 -2
- package/dist/core/ClientInteractions.d.ts.map +1 -1
- package/dist/core/ClientInteractions.js +2 -1
- package/dist/core/ClientInteractions.js.map +1 -1
- package/dist/core/CoreSchemeServices.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.js +5 -0
- package/dist/core/CoreSchemeServices.js.map +1 -1
- package/dist/core/DataStatementRunner.js +4 -6
- package/dist/core/DataStatementRunner.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +4 -7
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +48 -68
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Dispatcher.sql +2 -2
- package/dist/core/EditMutations.js +1 -0
- package/dist/core/EditMutations.js.map +1 -1
- package/dist/core/Engine.d.ts +8 -14
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +22 -24
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +6 -6
- package/dist/core/ExecutorRegistry.d.ts +0 -5
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +10 -18
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/FileAddress.js +1 -1
- package/dist/core/FileAddress.js.map +1 -1
- package/dist/core/FilePublication.js +10 -74
- package/dist/core/FilePublication.js.map +1 -1
- package/dist/core/FileSnapshot.js +36 -100
- package/dist/core/FileSnapshot.js.map +1 -1
- package/dist/core/HostPaths.d.ts +1 -0
- package/dist/core/HostPaths.d.ts.map +1 -1
- package/dist/core/HostPaths.js +11 -1
- package/dist/core/HostPaths.js.map +1 -1
- package/dist/core/KillHandler.js +3 -1
- package/dist/core/KillHandler.js.map +1 -1
- package/dist/core/LiveSubscription.js +1 -1
- package/dist/core/LiveSubscription.js.map +1 -1
- package/dist/core/LogBody.js +1 -1
- package/dist/core/LogBody.js.map +1 -1
- package/dist/core/LogWriter.d.ts +4 -2
- package/dist/core/LogWriter.d.ts.map +1 -1
- package/dist/core/LogWriter.js +8 -4
- package/dist/core/LogWriter.js.map +1 -1
- package/dist/core/LoopDriver.d.ts +3 -3
- package/dist/core/LoopDriver.d.ts.map +1 -1
- package/dist/core/LoopDriver.js +15 -13
- package/dist/core/LoopDriver.js.map +1 -1
- package/dist/core/LoopLifecycle.d.ts +5 -0
- package/dist/core/LoopLifecycle.d.ts.map +1 -1
- package/dist/core/LoopLifecycle.js +14 -1
- package/dist/core/LoopLifecycle.js.map +1 -1
- package/dist/core/LoopLifecycle.sql +8 -0
- package/dist/core/MembershipMaterialization.js +2 -2
- package/dist/core/MembershipMaterialization.js.map +1 -1
- package/dist/core/MessageResources.d.ts +3 -0
- package/dist/core/MessageResources.d.ts.map +1 -1
- package/dist/core/MessageResources.js +15 -1
- package/dist/core/MessageResources.js.map +1 -1
- package/dist/core/OperationHistory.d.ts +18 -0
- package/dist/core/OperationHistory.d.ts.map +1 -0
- package/dist/core/OperationHistory.js +55 -0
- package/dist/core/OperationHistory.js.map +1 -0
- package/dist/core/OperatorConfig.d.ts +1 -2
- package/dist/core/OperatorConfig.d.ts.map +1 -1
- package/dist/core/OperatorConfig.js +26 -92
- package/dist/core/OperatorConfig.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +22 -56
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/PacketBuilder.sql +7 -8
- package/dist/core/ProblemLog.d.ts +1 -0
- package/dist/core/ProblemLog.d.ts.map +1 -1
- package/dist/core/ProblemLog.js +2 -2
- package/dist/core/ProblemLog.js.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +13 -8
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ProposalPolicies.d.ts +4 -1
- package/dist/core/ProposalPolicies.d.ts.map +1 -1
- package/dist/core/ProposalPolicies.js +5 -2
- package/dist/core/ProposalPolicies.js.map +1 -1
- package/dist/core/ResourceMutations.js +2 -0
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/ResourceSelector.js +1 -1
- package/dist/core/ResourceSelector.js.map +1 -1
- package/dist/core/SchemeRegistry.js +1 -1
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ServiceHelp.js +1 -1
- package/dist/core/ServiceHelp.js.map +1 -1
- package/dist/core/ServiceTeardown.js +9 -12
- package/dist/core/ServiceTeardown.js.map +1 -1
- package/dist/core/StrikeRail.d.ts +2 -1
- package/dist/core/StrikeRail.d.ts.map +1 -1
- package/dist/core/StrikeRail.js +11 -6
- package/dist/core/StrikeRail.js.map +1 -1
- package/dist/core/TerminalResult.js +1 -1
- package/dist/core/TerminalResult.js.map +1 -1
- package/dist/core/TurnDispositionHandler.js +3 -2
- package/dist/core/TurnDispositionHandler.js.map +1 -1
- package/dist/core/TurnMaterialization.js +6 -4
- package/dist/core/TurnMaterialization.js.map +1 -1
- package/dist/core/TurnMaterialization.sql +1 -1
- package/dist/core/TurnOps.d.ts +0 -3
- package/dist/core/TurnOps.d.ts.map +1 -1
- package/dist/core/TurnOps.js +1 -27
- package/dist/core/TurnOps.js.map +1 -1
- package/dist/core/TurnRunner.d.ts +4 -2
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +61 -61
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/WorkerControlHandler.d.ts +2 -0
- package/dist/core/WorkerControlHandler.d.ts.map +1 -1
- package/dist/core/WorkerControlHandler.js +48 -16
- package/dist/core/WorkerControlHandler.js.map +1 -1
- package/dist/core/WorkerName.d.ts +0 -4
- package/dist/core/WorkerName.d.ts.map +1 -1
- package/dist/core/WorkerName.js +5 -30
- package/dist/core/WorkerName.js.map +1 -1
- package/dist/core/WorkerName.sql +4 -20
- package/dist/core/WorkerOwners.d.ts +1 -0
- package/dist/core/WorkerOwners.d.ts.map +1 -1
- package/dist/core/WorkerOwners.js +6 -0
- package/dist/core/WorkerOwners.js.map +1 -1
- package/dist/core/WorkerOwners.sql +7 -0
- package/dist/core/WorkspaceGate.d.ts +3 -1
- package/dist/core/WorkspaceGate.d.ts.map +1 -1
- package/dist/core/WorkspaceGate.js +59 -10
- package/dist/core/WorkspaceGate.js.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.d.ts +2 -0
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.js +12 -0
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
- package/dist/core/env-catalog.js +1 -1
- package/dist/core/env-catalog.js.map +1 -1
- package/dist/core/fork.js +1 -1
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +5 -4
- package/dist/core/mutation-types.js +4 -1
- package/dist/core/mutation-types.js.map +1 -1
- package/dist/core/namespace.js +1 -1
- package/dist/core/namespace.js.map +1 -1
- package/dist/core/packet-wire.d.ts +7 -5
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +38 -20
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/scheme-types.d.ts +4 -0
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/turn-signals.d.ts +4 -0
- package/dist/core/turn-signals.d.ts.map +1 -1
- package/dist/core/turn-signals.js +1 -0
- package/dist/core/turn-signals.js.map +1 -1
- package/dist/core/workspace-settings.js +1 -1
- package/dist/core/workspace-settings.js.map +1 -1
- package/dist/evidence/EvidenceReader.js +5 -5
- package/dist/evidence/EvidenceReader.js.map +1 -1
- package/dist/man/plurnk-service.1 +27 -6
- package/dist/schemes/Env.d.ts +7 -3
- package/dist/schemes/Env.d.ts.map +1 -1
- package/dist/schemes/Env.js +12 -6
- package/dist/schemes/Env.js.map +1 -1
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +33 -25
- 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/ExecutionInput.js +1 -1
- package/dist/schemes/ExecutionInput.js.map +1 -1
- package/dist/schemes/File.js +15 -18
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +21 -36
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Log.sql +0 -9
- package/dist/schemes/ResourceTreeScheme.js +2 -5
- package/dist/schemes/ResourceTreeScheme.js.map +1 -1
- package/dist/schemes/TurnSource.js +1 -1
- package/dist/schemes/TurnSource.js.map +1 -1
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +10 -3
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-crud.d.ts.map +1 -1
- package/dist/schemes/_entry-crud.js +2 -4
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +5 -3
- package/dist/schemes/_entry-find.js +3 -3
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +3 -3
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-manifest.sql +2 -0
- package/dist/schemes/_entry-ops.js +1 -1
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-send.js +1 -1
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/server/ClientReads.d.ts +1 -0
- package/dist/server/ClientReads.d.ts.map +1 -1
- package/dist/server/ClientReads.js +7 -2
- package/dist/server/ClientReads.js.map +1 -1
- package/dist/server/Credentials.d.ts +48 -0
- package/dist/server/Credentials.d.ts.map +1 -0
- package/dist/server/Credentials.js +203 -0
- package/dist/server/Credentials.js.map +1 -0
- package/dist/server/Daemon.d.ts +40 -41
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +272 -206
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +5 -2
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +27 -31
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/EnvFunctionality.d.ts.map +1 -1
- package/dist/server/EnvFunctionality.js +2 -1
- package/dist/server/EnvFunctionality.js.map +1 -1
- package/dist/server/Functionality.d.ts +4 -2
- package/dist/server/Functionality.d.ts.map +1 -1
- package/dist/server/Functionality.js +110 -51
- package/dist/server/Functionality.js.map +1 -1
- package/dist/server/FunctionalityManager.js +1 -1
- package/dist/server/FunctionalityManager.js.map +1 -1
- package/dist/server/HttpListener.d.ts +1 -1
- package/dist/server/HttpListener.d.ts.map +1 -1
- package/dist/server/HttpListener.js.map +1 -1
- package/dist/server/MembersFunctionality.d.ts.map +1 -1
- package/dist/server/MembersFunctionality.js +4 -2
- package/dist/server/MembersFunctionality.js.map +1 -1
- package/dist/server/ModuleHost.d.ts +2 -1
- package/dist/server/ModuleHost.d.ts.map +1 -1
- package/dist/server/PlurnkSkill.js +4 -7
- package/dist/server/PlurnkSkill.js.map +1 -1
- package/dist/server/Rollback.js +1 -1
- package/dist/server/Rollback.js.map +1 -1
- package/dist/server/WorkerModelResolver.js +1 -0
- package/dist/server/WorkerModelResolver.js.map +1 -1
- package/dist/server/WorkerReferences.d.ts +14 -0
- package/dist/server/WorkerReferences.d.ts.map +1 -0
- package/dist/server/WorkerReferences.js +24 -0
- package/dist/server/WorkerReferences.js.map +1 -0
- package/dist/server/WorkerReferences.sql +31 -0
- package/dist/server/WorkspaceCapabilities.d.ts +2 -0
- package/dist/server/WorkspaceCapabilities.d.ts.map +1 -1
- package/dist/server/WorkspaceCapabilities.js +35 -18
- package/dist/server/WorkspaceCapabilities.js.map +1 -1
- package/dist/server/WorkspacePlugins.js +1 -0
- package/dist/server/WorkspacePlugins.js.map +1 -1
- package/dist/server/WorkspaceResidency.d.ts +3 -1
- package/dist/server/WorkspaceResidency.d.ts.map +1 -1
- package/dist/server/WorkspaceResidency.js +12 -5
- package/dist/server/WorkspaceResidency.js.map +1 -1
- package/dist/server/client-input.d.ts +2 -0
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +28 -0
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/drain.sql +37 -40
- package/dist/server/envelope.d.ts +5 -9
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +21 -84
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +17 -17
- package/dist/server/lifecycle-recovery.sql +5 -15
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +6 -0
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/logEntry.sql +94 -6
- package/dist/server/module-discovery.d.ts +1 -1
- package/dist/server/module-discovery.d.ts.map +1 -1
- package/dist/server/module-discovery.js +1 -0
- package/dist/server/module-discovery.js.map +1 -1
- package/dist/server/seam-loop.sql +15 -7
- package/dist/server/seam-proposal-list.sql +10 -4
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +7 -1
- package/dist/service.js.map +1 -1
- package/docs/members.md +6 -4
- package/migrations/002_workers.sql +2 -2
- package/migrations/006_log.sql +1 -1
- package/migrations/018_worker_owners.sql +1 -1
- package/migrations/029_default_worker.sql +9 -0
- package/migrations/030_client_workers.sql +105 -0
- package/migrations/031_message_openers.sql +83 -0
- package/migrations/032_worker_references.sql +29 -0
- package/package.json +23 -22
- package/plurnk.nginx.conf +71 -0
- package/plurnk.service +2 -0
package/dist/server/envelope.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Envelope lifecycle helpers for module clients. SPEC {§connection-lifecycle}.
|
|
2
2
|
//
|
|
3
3
|
// A client-interface module receives this value from an explicit workspace create
|
|
4
|
-
// or attach call.
|
|
5
|
-
//
|
|
4
|
+
// or attach call. Binding a workspace mints nothing and retains no transport binding;
|
|
5
|
+
// each client operation allocates and settles its own administrative loop in the runtime worker.
|
|
6
6
|
import AdministrativeLoop from "../core/AdministrativeLoop.js";
|
|
7
|
-
import
|
|
7
|
+
import crypto from "node:crypto";
|
|
8
8
|
import GitMembership from "../core/git-membership.js";
|
|
9
9
|
import Results, { OperationFailureError } from "../core/results.js";
|
|
10
10
|
import LoopLifecycle from "../core/LoopLifecycle.js";
|
|
@@ -21,7 +21,11 @@ export default class Envelope {
|
|
|
21
21
|
// a name says nothing about where the workspace came from.
|
|
22
22
|
static AUTO_NAME_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
23
23
|
static generateWorkspaceName() {
|
|
24
|
-
|
|
24
|
+
let name;
|
|
25
|
+
do {
|
|
26
|
+
name = Array.from({ length: 5 }, () => Envelope.AUTO_NAME_ALPHABET[crypto.randomInt(Envelope.AUTO_NAME_ALPHABET.length)]).join("");
|
|
27
|
+
} while (!/[A-Za-z]/u.test(name));
|
|
28
|
+
return name;
|
|
25
29
|
}
|
|
26
30
|
static async createClientEnvelope(db, opts = {}) {
|
|
27
31
|
const projectRoot = opts.projectRoot ?? null;
|
|
@@ -42,98 +46,31 @@ export default class Envelope {
|
|
|
42
46
|
// tracked files are members before the first op. No-op when projectRoot is
|
|
43
47
|
// null (headless) or not a git working tree.
|
|
44
48
|
await GitMembership.resolveGitMembership(db, workspace.id, undefined);
|
|
45
|
-
|
|
46
|
-
workspaceId: workspace.id,
|
|
47
|
-
origin: "client",
|
|
48
|
-
});
|
|
49
|
-
return {
|
|
50
|
-
workspaceId: workspace.id, workspaceName: workspace.name,
|
|
51
|
-
projectRoot: workspace.project_root,
|
|
52
|
-
workerId: worker.id, workerName: worker.name,
|
|
53
|
-
};
|
|
49
|
+
return { workspaceId: workspace.id, workspaceName: workspace.name, projectRoot: workspace.project_root };
|
|
54
50
|
}
|
|
55
|
-
|
|
56
|
-
// - opts.workerId given: lookup by id, verify workspace ownership (else throw).
|
|
57
|
-
// - opts.workerName given: lookup by (workspaceId, name); reuse if found, create otherwise.
|
|
58
|
-
// - neither: create a new worker with an auto-generated name (current behavior).
|
|
59
|
-
// `workerId` and `workerName` are alternatives — passing both throws (use one).
|
|
60
|
-
static async #resolveWorker(db, workspaceId, opts) {
|
|
61
|
-
if (opts.workerId !== undefined && opts.workerName !== undefined) {
|
|
62
|
-
throw envelopeFailure("daemon:worker", "worker-selector-conflict", 400, "Workspace attachment received both a worker ID and worker name.", {
|
|
63
|
-
workerId: opts.workerId,
|
|
64
|
-
workerName: opts.workerName,
|
|
65
|
-
recovery: "Select the worker by either ID or name.",
|
|
66
|
-
retryable: false,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
if (opts.workerId !== undefined) {
|
|
70
|
-
const existing = await db.envelope_get_worker_by_id.get({ id: opts.workerId });
|
|
71
|
-
if (existing === undefined) {
|
|
72
|
-
throw envelopeFailure("daemon:worker", "worker-not-found", 404, `Worker ${opts.workerId} does not exist.`, { workerId: opts.workerId });
|
|
73
|
-
}
|
|
74
|
-
if (existing.workspace_id !== workspaceId) {
|
|
75
|
-
throw envelopeFailure("daemon:worker", "workspace-mismatch", 409, `Worker ${opts.workerId} does not belong to workspace ${workspaceId}.`, {
|
|
76
|
-
workerId: opts.workerId,
|
|
77
|
-
workspaceId,
|
|
78
|
-
actualWorkspaceId: existing.workspace_id,
|
|
79
|
-
retryable: false,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
return { id: existing.id, name: existing.name };
|
|
83
|
-
}
|
|
84
|
-
if (opts.workerName !== undefined) {
|
|
85
|
-
const workerName = WorkerName.assert(opts.workerName); // {§worker-name-minting}
|
|
86
|
-
const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: workerName });
|
|
87
|
-
if (existing !== undefined)
|
|
88
|
-
return existing;
|
|
89
|
-
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: workerName, origin: "client" });
|
|
90
|
-
if (created === undefined)
|
|
91
|
-
throw new Error("resolveWorker: worker insert returned no row");
|
|
92
|
-
return created;
|
|
93
|
-
}
|
|
94
|
-
return await WorkerName.claimAuto(db, {
|
|
95
|
-
workspaceId,
|
|
96
|
-
origin: "client",
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
static async attachToWorkspace(db, workspaceId, opts = {}) {
|
|
51
|
+
static async attachToWorkspace(db, workspaceId) {
|
|
100
52
|
const workspace = await db.envelope_get_workspace.get({ id: workspaceId });
|
|
101
53
|
if (workspace === undefined) {
|
|
102
54
|
throw envelopeFailure("daemon:workspace", "workspace-not-found", 404, `Workspace ${workspaceId} does not exist.`, { workspaceId });
|
|
103
55
|
}
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
workspaceId: workspace.id, workspaceName: workspace.name,
|
|
107
|
-
projectRoot: workspace.project_root,
|
|
108
|
-
workerId: worker.id, workerName: worker.name,
|
|
109
|
-
};
|
|
56
|
+
return { workspaceId: workspace.id, workspaceName: workspace.name, projectRoot: workspace.project_root };
|
|
110
57
|
}
|
|
111
|
-
// Client
|
|
112
|
-
//
|
|
113
|
-
static async ensureClientLoop(db, workerId) {
|
|
114
|
-
return (await AdministrativeLoop.open(db, workerId)).id;
|
|
58
|
+
// Client operation loop allocator. One operation allocates one administrative loop, opened by its
|
|
59
|
+
// actor ({§actor-boundary-client-operations}); its statements become ordered turns and settlement closes it.
|
|
60
|
+
static async ensureClientLoop(db, workerId, actor) {
|
|
61
|
+
return (await AdministrativeLoop.open(db, workerId, actor)).id;
|
|
115
62
|
}
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
// model-origin worker, distinct from the stable default and from a history-copying fork.
|
|
63
|
+
// Model-worker allocator ({§machine-processes}). A person's client operations journal in the runtime
|
|
64
|
+
// worker, never here, so the packet, rendered from the model worker, never carries them
|
|
65
|
+
// ({§connection-lifecycle}). The module resolves and retains the binding.
|
|
66
|
+
// {§methods-worker-create}: a fresh worker is a named, empty-log, model-origin worker,
|
|
67
|
+
// distinct from a history-copying fork.
|
|
122
68
|
static async createModelWorker(db, workspaceId, name, parentWorkerId, owner) {
|
|
123
69
|
const options = { workspaceId, parentWorkerId, owner, origin: "model" };
|
|
124
70
|
return name === undefined
|
|
125
71
|
? WorkerName.claimAuto(db, options)
|
|
126
72
|
: WorkerName.claimNamed(db, name, options);
|
|
127
73
|
}
|
|
128
|
-
static async ensureModelWorker(db, workspaceId) {
|
|
129
|
-
// {§methods-model-worker}: idempotence lives at the seam, not in a client's
|
|
130
|
-
// connection cache. The durable role, not root ordering or a name parse,
|
|
131
|
-
// distinguishes this default from arbitrary fresh conversations.
|
|
132
|
-
const worker = await WorkerName.ensureDefaultConversation(db, {
|
|
133
|
-
workspaceId,
|
|
134
|
-
});
|
|
135
|
-
return worker.id;
|
|
136
|
-
}
|
|
137
74
|
static async listWorkersForWorkspace(db, workspaceId, query = {}) {
|
|
138
75
|
const filterParent = Object.hasOwn(query, "parentWorkerId");
|
|
139
76
|
const rows = await db.envelope_list_workers_for_workspace.all({
|
|
@@ -144,7 +81,7 @@ export default class Envelope {
|
|
|
144
81
|
});
|
|
145
82
|
return rows.map(projectWorkerRow);
|
|
146
83
|
}
|
|
147
|
-
// {§methods-workspace-prompts}: expose root-
|
|
84
|
+
// {§methods-workspace-prompts}: expose root-worker loop seeds directly,
|
|
148
85
|
// without forcing clients to reconstruct prompt history from log rows.
|
|
149
86
|
static async listPromptsForWorkspace(db, workspaceId, limit, workerId) {
|
|
150
87
|
const rows = await db.envelope_list_workspace_prompts.all({ workspace_id: workspaceId, limit, worker_id: workerId });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,kFAAkF;AAClF,
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/server/envelope.sql
CHANGED
|
@@ -26,21 +26,14 @@ WHERE id = $id
|
|
|
26
26
|
)
|
|
27
27
|
RETURNING id, name;
|
|
28
28
|
|
|
29
|
-
-- PREP: envelope_insert_worker
|
|
30
|
-
-- origin is the worker's actor ({§machine-processes}): 'model' (the conversation),
|
|
31
|
-
-- 'client' (a connection's own worker), or '_plurnk' (the runtime self-hosting worker).
|
|
32
|
-
INSERT INTO workers (workspace_id, name, origin)
|
|
33
|
-
VALUES ($workspace_id, $name, $origin)
|
|
34
|
-
RETURNING id, name, origin;
|
|
35
|
-
|
|
36
29
|
-- {§application-worker-observation}: kind is minted lineage (fork boundary → fork, other child →
|
|
37
|
-
-- work,
|
|
30
|
+
-- work, no parent → root); loop observations feed the shared lifecycle selector in TS.
|
|
38
31
|
-- PREP: envelope_get_worker_by_id
|
|
39
32
|
SELECT id, name, workspace_id, created_at, origin, owner,
|
|
40
33
|
parent_worker_id AS parentWorkerId,
|
|
41
34
|
CASE WHEN fork_event_boundary IS NOT NULL THEN 'fork'
|
|
42
35
|
WHEN parent_worker_id IS NOT NULL THEN 'work'
|
|
43
|
-
ELSE '
|
|
36
|
+
ELSE 'root' END AS kind,
|
|
44
37
|
(SELECT json_group_array(json_object('status', l.status, 'sequence', l.sequence, 'terminatedAt', l.terminated_at))
|
|
45
38
|
FROM work_loops l WHERE l.worker_id = workers.id) AS loopObservations
|
|
46
39
|
FROM workers
|
|
@@ -51,7 +44,7 @@ SELECT id, name, workspace_id, created_at, origin, owner,
|
|
|
51
44
|
parent_worker_id AS parentWorkerId,
|
|
52
45
|
CASE WHEN fork_event_boundary IS NOT NULL THEN 'fork'
|
|
53
46
|
WHEN parent_worker_id IS NOT NULL THEN 'work'
|
|
54
|
-
ELSE '
|
|
47
|
+
ELSE 'root' END AS kind,
|
|
55
48
|
(SELECT json_group_array(json_object('status', l.status, 'sequence', l.sequence, 'terminatedAt', l.terminated_at))
|
|
56
49
|
FROM work_loops l WHERE l.worker_id = workers.id) AS loopObservations
|
|
57
50
|
FROM workers
|
|
@@ -61,7 +54,7 @@ WHERE workspace_id = $workspace_id AND name = $name;
|
|
|
61
54
|
SELECT id, name, created_at, origin, owner, parent_worker_id AS parentWorkerId,
|
|
62
55
|
CASE WHEN fork_event_boundary IS NOT NULL THEN 'fork'
|
|
63
56
|
WHEN parent_worker_id IS NOT NULL THEN 'work'
|
|
64
|
-
ELSE '
|
|
57
|
+
ELSE 'root' END AS kind,
|
|
65
58
|
(SELECT json_group_array(json_object('status', l.status, 'sequence', l.sequence, 'terminatedAt', l.terminated_at))
|
|
66
59
|
FROM work_loops l WHERE l.worker_id = workers.id) AS loopObservations
|
|
67
60
|
FROM workers
|
|
@@ -120,7 +113,7 @@ WHERE id = $id
|
|
|
120
113
|
-- {§methods-workspace-prompts}: nonempty loop seeds a client addressed to a model worker,
|
|
121
114
|
-- newest-first, optionally one worker's. Authorship is the seed message's address: a worker-issued
|
|
122
115
|
-- seed (WORK, FORK, SEND to a worker) carries none, so the model's own task prompts are not history
|
|
123
|
-
-- whichever worker they seeded, and a human prompt at a forked
|
|
116
|
+
-- whichever worker they seeded, and a human prompt at a forked worker is.
|
|
124
117
|
SELECT l.prompt
|
|
125
118
|
FROM loops l
|
|
126
119
|
JOIN workers r ON r.id = l.worker_id
|
|
@@ -133,13 +126,20 @@ ORDER BY l.id DESC
|
|
|
133
126
|
LIMIT $limit;
|
|
134
127
|
|
|
135
128
|
-- PREP: envelope_insert_client_loop
|
|
136
|
-
-- sequence is auto-computed: 1 + max(existing sequence in this worker) so
|
|
137
|
-
--
|
|
138
|
-
--
|
|
139
|
-
INSERT INTO loops (worker_id, sequence, status, prompt, max_turns)
|
|
140
|
-
VALUES ($worker_id, COALESCE((SELECT MAX(sequence) FROM loops WHERE worker_id = $worker_id), 0) + 1, 102, '', -1)
|
|
129
|
+
-- sequence is auto-computed: 1 + max(existing sequence in this worker) so concurrent
|
|
130
|
+
-- operations in one worker get distinct loops. An administrative loop runs no model turns,
|
|
131
|
+
-- so no turn ceiling governs it (-1); its prompt source is the actor that opened it, if any.
|
|
132
|
+
INSERT INTO loops (worker_id, sequence, status, prompt, prompt_source, max_turns)
|
|
133
|
+
VALUES ($worker_id, COALESCE((SELECT MAX(sequence) FROM loops WHERE worker_id = $worker_id), 0) + 1, 102, '', $prompt_source, -1)
|
|
141
134
|
RETURNING id, sequence;
|
|
142
135
|
|
|
136
|
+
-- PREP: envelope_client_operation_person
|
|
137
|
+
-- {§actor-boundary-client-operations} The person a client operation speaks for: the prompt source of a
|
|
138
|
+
-- runtime-worker loop. The daemon's own loops there name none.
|
|
139
|
+
SELECT l.prompt_source AS person
|
|
140
|
+
FROM loops l JOIN workers w ON w.id = l.worker_id
|
|
141
|
+
WHERE l.id = $loop_id AND w.origin = '_plurnk' AND l.prompt_source IS NOT NULL;
|
|
142
|
+
|
|
143
143
|
-- PREP: envelope_close_client_loop
|
|
144
144
|
UPDATE loops
|
|
145
145
|
SET status = $status,
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
-- Process-bound lifecycle recovery
|
|
2
|
-
--
|
|
3
|
-
-- can be followed by the same sequence.
|
|
1
|
+
-- Process-bound lifecycle recovery, before client transports open or drains resume.
|
|
2
|
+
-- {§worker-lifecycle-restart-recovery}: database settlement is one idempotent transaction.
|
|
4
3
|
|
|
5
|
-
--
|
|
4
|
+
-- TX: recovery_settle_process_owners
|
|
6
5
|
-- 102 is a claim held by a process-local drain. After restart that owner is gone;
|
|
7
6
|
-- replaying its provider turn could duplicate effects whose commit boundary is unknown.
|
|
8
7
|
UPDATE loops
|
|
@@ -19,7 +18,6 @@ SET status = 500,
|
|
|
19
18
|
)
|
|
20
19
|
WHERE status = 102;
|
|
21
20
|
|
|
22
|
-
-- PREP: recovery_settle_open_provider_requests
|
|
23
21
|
-- A physical request identity was opened immediately before I/O, so a crash can
|
|
24
22
|
-- leave its outcome and provider evidence unknowable. Preserve the occurrence
|
|
25
23
|
-- and settle that uncertainty explicitly before closing its logical attempt.
|
|
@@ -32,7 +30,6 @@ SET state = 'settled',
|
|
|
32
30
|
WHERE state = 'pending'
|
|
33
31
|
;
|
|
34
32
|
|
|
35
|
-
-- PREP: recovery_fail_open_model_calls
|
|
36
33
|
-- The process-local model-call owner vanished. Physical requests have already
|
|
37
34
|
-- been settled above, preserving unknown evidence without fabricating zero use.
|
|
38
35
|
INSERT INTO model_call_observation (id, failure)
|
|
@@ -48,7 +45,6 @@ SELECT mc.id, json_object(
|
|
|
48
45
|
FROM model_calls mc
|
|
49
46
|
WHERE (SELECT state FROM inference_calls WHERE id = mc.id) = 'pending';
|
|
50
47
|
|
|
51
|
-
-- PREP: recovery_fail_open_turns
|
|
52
48
|
-- Every open turn has lost its process-local producer, including a narrow crash
|
|
53
49
|
-- window after its loop parked or queued. Provider evidence settles first; then
|
|
54
50
|
-- the producer-neutral lifecycle closes every unfinished container without
|
|
@@ -58,7 +54,6 @@ SET status = 500,
|
|
|
58
54
|
completed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
59
55
|
WHERE completed_at IS NULL;
|
|
60
56
|
|
|
61
|
-
-- PREP: recovery_fail_ownerless_proposals
|
|
62
57
|
-- {§worker-lifecycle-restart-recovery} Every proposed row depended on a
|
|
63
58
|
-- process-local resolution waiter. At boot that owner is necessarily gone, so
|
|
64
59
|
-- terminalize the occurrence before {§proposal-list} can open to clients.
|
|
@@ -91,16 +86,13 @@ SET state = 'failed',
|
|
|
91
86
|
deep_hash = NULL
|
|
92
87
|
WHERE state = 'proposed';
|
|
93
88
|
|
|
94
|
-
-- PREP: recovery_remove_ownerless_client_interactions
|
|
95
89
|
-- The durable request can be re-presented only while its exact process-local
|
|
96
90
|
-- awaiting owner exists. No response was recorded, so recovery removes the
|
|
97
91
|
-- orphan instead of fabricating a cancellation or replaying its operation.
|
|
98
92
|
DELETE FROM client_interactions;
|
|
99
93
|
|
|
100
|
-
-- PREP: recovery_error_orphan_subscription_channels
|
|
101
94
|
-- Every open subscription belonged to a callable in the prior process. Mark its
|
|
102
|
-
-- active content terminal before closing the durable row
|
|
103
|
-
-- between these statements remains recoverable on the next boot.
|
|
95
|
+
-- active content terminal before closing the durable row.
|
|
104
96
|
UPDATE entry_channels
|
|
105
97
|
SET state = 'errored'
|
|
106
98
|
WHERE state = 'active'
|
|
@@ -108,7 +100,6 @@ WHERE state = 'active'
|
|
|
108
100
|
SELECT entry_id FROM subscriptions WHERE closed_at IS NULL
|
|
109
101
|
);
|
|
110
102
|
|
|
111
|
-
-- PREP: recovery_fail_orphan_subscriptions
|
|
112
103
|
UPDATE subscriptions
|
|
113
104
|
SET closed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now'),
|
|
114
105
|
close_status = 500,
|
|
@@ -124,7 +115,6 @@ SET closed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now'),
|
|
|
124
115
|
channel_results = '{}'
|
|
125
116
|
WHERE closed_at IS NULL;
|
|
126
117
|
|
|
127
|
-
-- PREP: recovery_resume_unblocked_parks
|
|
128
118
|
-- {§loop-wake-identity}: a persisted completion beats a future observation. Otherwise
|
|
129
119
|
-- only a now-empty join wakes here; observation ownership is restored below
|
|
130
120
|
-- through the same scheduler used after a live park.
|
|
@@ -134,7 +124,7 @@ SET status = 100,
|
|
|
134
124
|
WHERE status = 202
|
|
135
125
|
AND (observed_wake_revision < (SELECT wake_revision FROM workers WHERE id = loops.worker_id)
|
|
136
126
|
OR EXISTS (SELECT 1 FROM loop_obligations held WHERE held.loop_id = loops.id
|
|
137
|
-
AND held.streams = 0 AND held.workers = 0));
|
|
127
|
+
AND held.streams = 0 AND held.workers = 0 AND held.messages = 0));
|
|
138
128
|
|
|
139
129
|
-- PREP: recovery_orphan_message_sources
|
|
140
130
|
-- {§message-loop-containment}: finish an absent or partially staged orphan
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logEntry.d.ts","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,CAAC,OAAO,OAAO,QAAQ;;IAWzB,OAAa,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAIpE;IAGD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"logEntry.d.ts","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,CAAC,OAAO,OAAO,QAAQ;;IAWzB,OAAa,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAIpE;IAGD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAsCtD;CACJ"}
|
package/dist/server/logEntry.js
CHANGED
|
@@ -49,7 +49,13 @@ export default class LogEntry {
|
|
|
49
49
|
status_rx: row.status_rx,
|
|
50
50
|
weight: row.weight,
|
|
51
51
|
attrs: LogEntry.#parseJsonOrNull(row.attrs),
|
|
52
|
+
state: row.state,
|
|
52
53
|
...(typeof row.reasoning === "string" ? { reasoning: row.reasoning } : {}),
|
|
54
|
+
...(typeof row.reasoning === "string" && typeof row.reasoning_model_call_id === "number"
|
|
55
|
+
? { reasoning_model_call_id: row.reasoning_model_call_id, reasoning_request_sequence: row.reasoning_request_sequence }
|
|
56
|
+
: {}),
|
|
57
|
+
...(typeof row.invocation === "string" ? { invocation: row.invocation } : {}),
|
|
58
|
+
...(typeof row.answering === "string" ? { answering: row.answering } : {}),
|
|
53
59
|
};
|
|
54
60
|
}
|
|
55
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logEntry.js","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6DAA6D;AAC7D,yCAAyC;AAMzC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,gBAAgB,CAAC,CAAU;QAC9B,kEAAkE;QAClE,uCAAuC;QACvC,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;IAGD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,EAAU;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,GAAG,CAA0B,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,IAAI,CAAC,GAA4B;QACpC,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,MAAM,EAAE,GAAG,CAAC,MAAuB;YACnC,EAAE,EAAE,GAAG,CAAC,EAAmB;YAC3B,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,KAAK,EAAE,GAAG,CAAC,KAAsB;YACjC,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;YAC5B,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3C,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACN,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"logEntry.js","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6DAA6D;AAC7D,yCAAyC;AAMzC,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,gBAAgB,CAAC,CAAU;QAC9B,kEAAkE;QAClE,uCAAuC;QACvC,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;IAGD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,EAAU;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,GAAG,CAA0B,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,IAAI,CAAC,GAA4B;QACpC,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,MAAM,EAAE,GAAG,CAAC,MAAuB;YACnC,EAAE,EAAE,GAAG,CAAC,EAAmB;YAC3B,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,KAAK,EAAE,GAAG,CAAC,KAAsB;YACjC,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;YAC5B,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3C,KAAK,EAAE,GAAG,CAAC,KAA8B;YACzC,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,uBAAuB,KAAK,QAAQ;gBACpF,CAAC,CAAC,EAAE,uBAAuB,EAAE,GAAG,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,GAAG,CAAC,0BAAoC,EAAE;gBAChI,CAAC,CAAC,EAAE,CAAC;YACT,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACN,CAAC;CACJ"}
|
package/dist/server/logEntry.sql
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
-- Log-entry hydration for wire surfacing.
|
|
1
|
+
-- Log-entry hydration for wire surfacing. {§methods-readable-reasoning}: a turn's admitted readable
|
|
2
|
+
-- reasoning rides its first model operation row, derived from the packet, never stored on a row.
|
|
2
3
|
|
|
3
4
|
-- PREP: log_entry_by_id
|
|
4
5
|
-- loop_seq / turn_seq are the loop+turn ordinals (the logical coordinate clients
|
|
@@ -6,11 +7,54 @@
|
|
|
6
7
|
SELECT le.*, l.sequence AS loop_seq, t.sequence AS turn_seq,
|
|
7
8
|
CASE
|
|
8
9
|
WHEN le.origin = 'model'
|
|
9
|
-
AND le.op
|
|
10
|
+
AND le.op IS NOT NULL
|
|
11
|
+
AND le.sequence = (SELECT MIN(f.sequence) FROM log_entries f
|
|
12
|
+
WHERE f.turn_id = le.turn_id AND f.origin = 'model' AND f.op IS NOT NULL)
|
|
10
13
|
AND json_type(t.packet, '$.assistant.reasoning') = 'text'
|
|
11
14
|
AND length(json_extract(t.packet, '$.assistant.reasoning')) > 0
|
|
12
15
|
THEN json_extract(t.packet, '$.assistant.reasoning')
|
|
13
|
-
END AS reasoning
|
|
16
|
+
END AS reasoning,
|
|
17
|
+
-- {§methods-readable-reasoning} The request that streamed it: the turn's accepted model call and that
|
|
18
|
+
-- call's response request. History a FORK inherited names none.
|
|
19
|
+
CASE WHEN le.origin = 'model' AND le.op IS NOT NULL THEN
|
|
20
|
+
(SELECT s.model_call_id FROM turn_sources s WHERE s.turn_id = le.turn_id AND s.kind = 'ops' AND s.sequence = 0)
|
|
21
|
+
END AS reasoning_model_call_id,
|
|
22
|
+
CASE WHEN le.origin = 'model' AND le.op IS NOT NULL THEN
|
|
23
|
+
(SELECT MAX(pr.sequence) FROM turn_sources s
|
|
24
|
+
JOIN provider_requests pr ON pr.inference_call_id = s.model_call_id
|
|
25
|
+
WHERE s.turn_id = le.turn_id AND s.kind = 'ops' AND s.sequence = 0 AND pr.outcome = 'response')
|
|
26
|
+
END AS reasoning_request_sequence,
|
|
27
|
+
-- {§methods-invocation} The operation whose obligation this row discharges: a stream observation's execution,
|
|
28
|
+
-- as its subscription recorded it; or the operation that sent the message a child's conclusion or a completion
|
|
29
|
+
-- reply answers, when that operation is this log's.
|
|
30
|
+
COALESCE(
|
|
31
|
+
(SELECT s.source FROM subscription_publications sp JOIN subscriptions s ON s.id = sp.subscription_id
|
|
32
|
+
WHERE sp.id = le.subscription_publication_id),
|
|
33
|
+
(SELECT printf('log:///%d/%d/%d/%s', sender.sequence, opened.sequence, o.sequence, o.op)
|
|
34
|
+
FROM ambient_events ae
|
|
35
|
+
JOIN loop_messages m
|
|
36
|
+
ON (ae.kind = 'loop_termination' AND m.loop_id = ae.source_record_id AND m.ordinal = 1)
|
|
37
|
+
OR (ae.kind = 'reply' AND m.id IN (SELECT c.message_id FROM message_completions c WHERE c.response_id = ae.source_record_id))
|
|
38
|
+
JOIN turns opened ON opened.id = m.opened_turn_id
|
|
39
|
+
JOIN loops sender ON sender.id = opened.loop_id
|
|
40
|
+
JOIN log_entries o ON o.turn_id = m.opened_turn_id AND o.sequence = m.opened_sequence
|
|
41
|
+
WHERE ae.id = le.ambient_event_id AND (sender.worker_id = le.worker_id OR le.inherited_history = 1)
|
|
42
|
+
LIMIT 1)
|
|
43
|
+
) AS invocation,
|
|
44
|
+
-- {§methods-answering} The operation of this log that sent the message a reply answers, whether the reply
|
|
45
|
+
-- completes the message or reports progress.
|
|
46
|
+
(SELECT printf('log:///%d/%d/%d/%s', sender.sequence, opened.sequence, o.sequence, o.op)
|
|
47
|
+
FROM ambient_events ae
|
|
48
|
+
JOIN log_responses r ON r.id = ae.source_record_id
|
|
49
|
+
JOIN json_each(r.rx, '$.answers') answer
|
|
50
|
+
JOIN message_sources ms ON ms.path = answer.value AND ms.workspace_id = (SELECT w.workspace_id FROM workers w WHERE w.id = le.worker_id)
|
|
51
|
+
JOIN loop_messages m ON m.id = ms.id
|
|
52
|
+
JOIN turns opened ON opened.id = m.opened_turn_id
|
|
53
|
+
JOIN loops sender ON sender.id = opened.loop_id
|
|
54
|
+
JOIN log_entries o ON o.turn_id = m.opened_turn_id AND o.sequence = m.opened_sequence
|
|
55
|
+
WHERE ae.id = le.ambient_event_id AND ae.kind = 'reply'
|
|
56
|
+
AND (sender.worker_id = le.worker_id OR le.inherited_history = 1)
|
|
57
|
+
LIMIT 1) AS answering
|
|
14
58
|
FROM log_entries le
|
|
15
59
|
JOIN loops l ON l.id = le.loop_id
|
|
16
60
|
JOIN turns t ON t.id = le.turn_id
|
|
@@ -22,11 +66,54 @@ WHERE le.id = $id;
|
|
|
22
66
|
SELECT le.*, l.sequence AS loop_seq, t.sequence AS turn_seq,
|
|
23
67
|
CASE
|
|
24
68
|
WHEN le.origin = 'model'
|
|
25
|
-
AND le.op
|
|
69
|
+
AND le.op IS NOT NULL
|
|
70
|
+
AND le.sequence = (SELECT MIN(f.sequence) FROM log_entries f
|
|
71
|
+
WHERE f.turn_id = le.turn_id AND f.origin = 'model' AND f.op IS NOT NULL)
|
|
26
72
|
AND json_type(t.packet, '$.assistant.reasoning') = 'text'
|
|
27
73
|
AND length(json_extract(t.packet, '$.assistant.reasoning')) > 0
|
|
28
74
|
THEN json_extract(t.packet, '$.assistant.reasoning')
|
|
29
|
-
END AS reasoning
|
|
75
|
+
END AS reasoning,
|
|
76
|
+
-- {§methods-readable-reasoning} The request that streamed it: the turn's accepted model call and that
|
|
77
|
+
-- call's response request. History a FORK inherited names none.
|
|
78
|
+
CASE WHEN le.origin = 'model' AND le.op IS NOT NULL THEN
|
|
79
|
+
(SELECT s.model_call_id FROM turn_sources s WHERE s.turn_id = le.turn_id AND s.kind = 'ops' AND s.sequence = 0)
|
|
80
|
+
END AS reasoning_model_call_id,
|
|
81
|
+
CASE WHEN le.origin = 'model' AND le.op IS NOT NULL THEN
|
|
82
|
+
(SELECT MAX(pr.sequence) FROM turn_sources s
|
|
83
|
+
JOIN provider_requests pr ON pr.inference_call_id = s.model_call_id
|
|
84
|
+
WHERE s.turn_id = le.turn_id AND s.kind = 'ops' AND s.sequence = 0 AND pr.outcome = 'response')
|
|
85
|
+
END AS reasoning_request_sequence,
|
|
86
|
+
-- {§methods-invocation} The operation whose obligation this row discharges: a stream observation's execution,
|
|
87
|
+
-- as its subscription recorded it; or the operation that sent the message a child's conclusion or a completion
|
|
88
|
+
-- reply answers, when that operation is this log's.
|
|
89
|
+
COALESCE(
|
|
90
|
+
(SELECT s.source FROM subscription_publications sp JOIN subscriptions s ON s.id = sp.subscription_id
|
|
91
|
+
WHERE sp.id = le.subscription_publication_id),
|
|
92
|
+
(SELECT printf('log:///%d/%d/%d/%s', sender.sequence, opened.sequence, o.sequence, o.op)
|
|
93
|
+
FROM ambient_events ae
|
|
94
|
+
JOIN loop_messages m
|
|
95
|
+
ON (ae.kind = 'loop_termination' AND m.loop_id = ae.source_record_id AND m.ordinal = 1)
|
|
96
|
+
OR (ae.kind = 'reply' AND m.id IN (SELECT c.message_id FROM message_completions c WHERE c.response_id = ae.source_record_id))
|
|
97
|
+
JOIN turns opened ON opened.id = m.opened_turn_id
|
|
98
|
+
JOIN loops sender ON sender.id = opened.loop_id
|
|
99
|
+
JOIN log_entries o ON o.turn_id = m.opened_turn_id AND o.sequence = m.opened_sequence
|
|
100
|
+
WHERE ae.id = le.ambient_event_id AND (sender.worker_id = le.worker_id OR le.inherited_history = 1)
|
|
101
|
+
LIMIT 1)
|
|
102
|
+
) AS invocation,
|
|
103
|
+
-- {§methods-answering} The operation of this log that sent the message a reply answers, whether the reply
|
|
104
|
+
-- completes the message or reports progress.
|
|
105
|
+
(SELECT printf('log:///%d/%d/%d/%s', sender.sequence, opened.sequence, o.sequence, o.op)
|
|
106
|
+
FROM ambient_events ae
|
|
107
|
+
JOIN log_responses r ON r.id = ae.source_record_id
|
|
108
|
+
JOIN json_each(r.rx, '$.answers') answer
|
|
109
|
+
JOIN message_sources ms ON ms.path = answer.value AND ms.workspace_id = (SELECT w.workspace_id FROM workers w WHERE w.id = le.worker_id)
|
|
110
|
+
JOIN loop_messages m ON m.id = ms.id
|
|
111
|
+
JOIN turns opened ON opened.id = m.opened_turn_id
|
|
112
|
+
JOIN loops sender ON sender.id = opened.loop_id
|
|
113
|
+
JOIN log_entries o ON o.turn_id = m.opened_turn_id AND o.sequence = m.opened_sequence
|
|
114
|
+
WHERE ae.id = le.ambient_event_id AND ae.kind = 'reply'
|
|
115
|
+
AND (sender.worker_id = le.worker_id OR le.inherited_history = 1)
|
|
116
|
+
LIMIT 1) AS answering
|
|
30
117
|
FROM log_entries le
|
|
31
118
|
JOIN loops l ON l.id = le.loop_id
|
|
32
119
|
JOIN turns t ON t.id = le.turn_id
|
|
@@ -34,8 +121,9 @@ WHERE le.worker_id = $worker_id
|
|
|
34
121
|
AND ($loop_id IS NULL OR le.loop_id = $loop_id)
|
|
35
122
|
AND ($turn_id IS NULL OR le.turn_id = $turn_id)
|
|
36
123
|
AND ($since_id IS NULL OR le.id > $since_id)
|
|
124
|
+
AND ($before_id IS NULL OR le.id < $before_id)
|
|
37
125
|
AND ($loop_seq IS NULL OR l.sequence = $loop_seq)
|
|
38
126
|
AND ($turn_seq IS NULL OR t.sequence = $turn_seq)
|
|
39
127
|
AND ($sequence IS NULL OR le.sequence = $sequence)
|
|
40
|
-
ORDER BY le.
|
|
128
|
+
ORDER BY le.id DESC
|
|
41
129
|
LIMIT $limit;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ConfigurationError } from "@plurnk/plurnk-meta";
|
|
2
2
|
import type { PluginReport } from "@plurnk/plurnk-agent-plugins";
|
|
3
|
-
import type { ApplicationPort } from "@plurnk/plurnk-contracts";
|
|
4
3
|
import type { DaemonModule } from "@plurnk/plurnk-modules";
|
|
5
4
|
import type { HostSetupSeam } from "./ModuleHost.ts";
|
|
6
5
|
import HostPaths from "../core/HostPaths.ts";
|
|
6
|
+
import type { ApplicationPort } from "@plurnk/plurnk-contracts/port";
|
|
7
7
|
export declare const discoverDaemonModules: (options?: {
|
|
8
8
|
cwd?: string;
|
|
9
9
|
hostPaths?: HostPaths;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-discovery.d.ts","sourceRoot":"","sources":["../../src/server/module-discovery.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"module-discovery.d.ts","sourceRoot":"","sources":["../../src/server/module-discovery.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AA0DrE,eAAO,MAAM,qBAAqB,aACrB;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,KACvI,OAAO,CAAC;IAEP,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3H,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAG1C,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC,CAAC;CAC/G,CA8DA,CAAC"}
|
|
@@ -10,6 +10,7 @@ import { createRequire } from "node:module";
|
|
|
10
10
|
import { basename, join } from "node:path";
|
|
11
11
|
import { pathToFileURL } from "node:url";
|
|
12
12
|
import Meta, { ConfigurationError } from "@plurnk/plurnk-meta";
|
|
13
|
+
import HostPaths from "../core/HostPaths.js";
|
|
13
14
|
import PluginSources from "./PluginSources.js";
|
|
14
15
|
import EnvDefaults from "../core/env-defaults.js";
|
|
15
16
|
const assertDaemonModule = (value, packageName, source) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-discovery.js","sourceRoot":"","sources":["../../src/server/module-discovery.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"module-discovery.js","sourceRoot":"","sources":["../../src/server/module-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
-- ApplicationPort runLoop queries. SPEC {§methods-loop-run}.
|
|
2
2
|
|
|
3
3
|
-- PREP: application_list_worker_loops
|
|
4
|
-
-- {§methods-worker-loops}: durable lifecycle projection for exterior adapters.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
-- {§methods-worker-loops}: durable lifecycle projection for exterior adapters. {§worker-obligations}: a loop is
|
|
5
|
+
-- opened by its first message's operation, named in the sender's own log.
|
|
6
|
+
SELECT loops.id, loops.worker_id AS workerId, loops.sequence, loops.status, loops.prompt,
|
|
7
|
+
loops.prompt_source AS promptSource, loops.claimed_at AS claimedAt, loops.terminated_at AS terminatedAt,
|
|
8
|
+
loops.terminal_result AS terminalResult, loops.wait_poll_at AS waitUntil,
|
|
8
9
|
(SELECT COUNT(*)
|
|
9
10
|
FROM turns
|
|
10
11
|
WHERE turns.loop_id = loops.id
|
|
11
|
-
AND turns.packet IS NOT NULL) AS packetCount
|
|
12
|
+
AND turns.packet IS NOT NULL) AS packetCount,
|
|
13
|
+
sender.worker_id AS invocationWorkerId,
|
|
14
|
+
CASE WHEN o.id IS NULL THEN NULL
|
|
15
|
+
ELSE printf('log:///%d/%d/%d/%s', sender.sequence, opened.sequence, o.sequence, o.op) END AS invocation
|
|
12
16
|
FROM work_loops AS loops
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
LEFT JOIN loop_messages first ON first.loop_id = loops.id AND first.ordinal = 1
|
|
18
|
+
LEFT JOIN turns opened ON opened.id = first.opened_turn_id
|
|
19
|
+
LEFT JOIN loops sender ON sender.id = opened.loop_id
|
|
20
|
+
LEFT JOIN log_entries o ON o.turn_id = first.opened_turn_id AND o.sequence = first.opened_sequence
|
|
21
|
+
WHERE loops.worker_id = $worker_id
|
|
22
|
+
ORDER BY loops.sequence;
|