@plurnk/plurnk-service 1.10.1 → 1.12.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 +41 -17
- package/INSTALL.md +4 -4
- package/README.md +2 -2
- package/SPEC.md +573 -273
- package/digest-sql/curation/curation.sql +1 -0
- package/dist/Paths.d.ts +3 -3
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +9 -9
- package/dist/Paths.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/content/edit-collision.d.ts +1 -1
- package/dist/content/edit-collision.d.ts.map +1 -1
- package/dist/content/edit-collision.js +5 -4
- package/dist/content/edit-collision.js.map +1 -1
- package/dist/content/edit-receipt.d.ts +6 -5
- package/dist/content/edit-receipt.d.ts.map +1 -1
- package/dist/content/edit-receipt.js +28 -8
- package/dist/content/edit-receipt.js.map +1 -1
- package/dist/content/index.d.ts +2 -2
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -1
- package/dist/content/index.js.map +1 -1
- package/dist/content/line-anchors.d.ts +2 -0
- package/dist/content/line-anchors.d.ts.map +1 -1
- package/dist/content/line-anchors.js +15 -6
- package/dist/content/line-anchors.js.map +1 -1
- package/dist/content/line-marker.d.ts +0 -1
- package/dist/content/line-marker.d.ts.map +1 -1
- package/dist/content/line-marker.js.map +1 -1
- package/dist/content/matcher.d.ts.map +1 -1
- package/dist/content/matcher.js +3 -2
- package/dist/content/matcher.js.map +1 -1
- package/dist/content/read-projector.js +3 -3
- package/dist/content/read-projector.js.map +1 -1
- package/dist/core/BudgetReadout.d.ts +6 -1
- package/dist/core/BudgetReadout.d.ts.map +1 -1
- package/dist/core/BudgetReadout.js +38 -2
- package/dist/core/BudgetReadout.js.map +1 -1
- package/dist/core/CapabilityPolicies.d.ts +15 -0
- package/dist/core/CapabilityPolicies.d.ts.map +1 -0
- package/dist/core/CapabilityPolicies.js +60 -0
- package/dist/core/CapabilityPolicies.js.map +1 -0
- package/dist/core/CapabilityResolver.d.ts +24 -0
- package/dist/core/CapabilityResolver.d.ts.map +1 -0
- package/dist/core/CapabilityResolver.js +180 -0
- package/dist/core/CapabilityResolver.js.map +1 -0
- package/dist/core/ChannelWrite.d.ts +4 -3
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.d.ts +2 -2
- package/dist/core/CoreSchemeServices.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.js +2 -2
- package/dist/core/CoreSchemeServices.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +5 -2
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +157 -165
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/DurableStatement.d.ts.map +1 -1
- package/dist/core/DurableStatement.js +19 -15
- package/dist/core/DurableStatement.js.map +1 -1
- package/dist/core/EmbeddingCall.d.ts +23 -0
- package/dist/core/EmbeddingCall.d.ts.map +1 -0
- package/dist/core/EmbeddingCall.js +149 -0
- package/dist/core/EmbeddingCall.js.map +1 -0
- package/dist/core/Engine.d.ts +6 -4
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +20 -9
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +119 -56
- package/dist/core/ExecutorRegistry.d.ts +3 -3
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +10 -6
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/GitBranch.d.ts +4 -1
- package/dist/core/GitBranch.d.ts.map +1 -1
- package/dist/core/GitBranch.js +12 -2
- package/dist/core/GitBranch.js.map +1 -1
- package/dist/core/InferenceCall.d.ts +18 -0
- package/dist/core/InferenceCall.d.ts.map +1 -0
- package/dist/core/InferenceCall.js +86 -0
- package/dist/core/InferenceCall.js.map +1 -0
- package/dist/core/LogEntryProjection.d.ts +1 -0
- package/dist/core/LogEntryProjection.d.ts.map +1 -1
- package/dist/core/LogEntryProjection.js +12 -4
- package/dist/core/LogEntryProjection.js.map +1 -1
- package/dist/core/LoopPolicyReader.d.ts +7 -0
- package/dist/core/LoopPolicyReader.d.ts.map +1 -0
- package/dist/core/LoopPolicyReader.js +33 -0
- package/dist/core/LoopPolicyReader.js.map +1 -0
- package/dist/core/ModelCall.d.ts +4 -12
- package/dist/core/ModelCall.d.ts.map +1 -1
- package/dist/core/ModelCall.js +10 -74
- package/dist/core/ModelCall.js.map +1 -1
- package/dist/core/NoticeChannel.d.ts +2 -2
- package/dist/core/NoticeChannel.d.ts.map +1 -1
- package/dist/core/NoticeChannel.js +18 -9
- package/dist/core/NoticeChannel.js.map +1 -1
- package/dist/core/OperatorConfig.d.ts.map +1 -1
- package/dist/core/OperatorConfig.js +4 -0
- package/dist/core/OperatorConfig.js.map +1 -1
- package/dist/core/OverflowTurn.d.ts.map +1 -1
- package/dist/core/OverflowTurn.js +4 -3
- package/dist/core/OverflowTurn.js.map +1 -1
- package/dist/core/Owner.js +5 -5
- package/dist/core/Owner.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +2 -2
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +55 -35
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ProblemLog.d.ts.map +1 -1
- package/dist/core/ProblemLog.js +1 -0
- package/dist/core/ProblemLog.js.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +16 -13
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ReasoningEvent.d.ts +1 -0
- package/dist/core/ReasoningEvent.d.ts.map +1 -1
- package/dist/core/ResourceMutations.d.ts +6 -4
- package/dist/core/ResourceMutations.d.ts.map +1 -1
- package/dist/core/ResourceMutations.js +209 -63
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +6 -3
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +14 -17
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ServiceTeardown.d.ts +1 -1
- package/dist/core/ServiceTeardown.d.ts.map +1 -1
- package/dist/core/ServiceTeardown.js +4 -8
- package/dist/core/ServiceTeardown.js.map +1 -1
- package/dist/core/StrikeRail.d.ts +1 -0
- package/dist/core/StrikeRail.d.ts.map +1 -1
- package/dist/core/StrikeRail.js +12 -3
- package/dist/core/StrikeRail.js.map +1 -1
- package/dist/core/ToolResources.d.ts +2 -2
- package/dist/core/ToolResources.d.ts.map +1 -1
- package/dist/core/ToolResources.js +18 -8
- package/dist/core/ToolResources.js.map +1 -1
- package/dist/core/Turn.sql +6 -3
- package/dist/core/TurnOps.d.ts.map +1 -1
- package/dist/core/TurnOps.js +22 -8
- package/dist/core/TurnOps.js.map +1 -1
- package/dist/core/TurnRunner.d.ts +7 -4
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +345 -83
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/WorkerControlAddress.d.ts.map +1 -1
- package/dist/core/WorkerControlAddress.js +1 -2
- package/dist/core/WorkerControlAddress.js.map +1 -1
- package/dist/core/WorkerName.d.ts +2 -0
- package/dist/core/WorkerName.d.ts.map +1 -1
- package/dist/core/WorkerName.js +3 -2
- package/dist/core/WorkerName.js.map +1 -1
- package/dist/core/WorkerName.sql +2 -1
- package/dist/core/caps/DbProjectionCaps.d.ts +2 -1
- package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbProjectionCaps.js +12 -1
- package/dist/core/caps/DbProjectionCaps.js.map +1 -1
- package/dist/core/file-materialization.d.ts +22 -0
- package/dist/core/file-materialization.d.ts.map +1 -0
- package/dist/core/file-materialization.js +77 -0
- package/dist/core/file-materialization.js.map +1 -0
- package/dist/core/fork.d.ts +2 -1
- package/dist/core/fork.d.ts.map +1 -1
- package/dist/core/fork.js +13 -4
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +27 -11
- package/dist/core/git-membership.d.ts +25 -14
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +260 -164
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.d.ts +2 -0
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +27 -1
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/operation-target-groups.d.ts.map +1 -1
- package/dist/core/operation-target-groups.js +8 -7
- package/dist/core/operation-target-groups.js.map +1 -1
- package/dist/core/owner.sql +7 -10
- package/dist/core/packet-wire.d.ts +11 -0
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +98 -34
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/scheme-types.d.ts +2 -2
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/scheme-types.js +1 -1
- package/dist/core/scheme-types.js.map +1 -1
- package/dist/core/types.d.ts +3 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-settings.d.ts +4 -3
- package/dist/core/worker-settings.d.ts.map +1 -1
- package/dist/core/worker-settings.js +40 -19
- package/dist/core/worker-settings.js.map +1 -1
- package/dist/core/workspace-settings.d.ts +3 -1
- package/dist/core/workspace-settings.d.ts.map +1 -1
- package/dist/core/workspace-settings.js +6 -2
- package/dist/core/workspace-settings.js.map +1 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +151 -42
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/digest.sql +48 -20
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/schemes/Exec.d.ts +4 -5
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +111 -94
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
- package/dist/schemes/ExecOutputScheme.js +24 -6
- package/dist/schemes/ExecOutputScheme.js.map +1 -1
- package/dist/schemes/ExecScheduler.d.ts +15 -0
- package/dist/schemes/ExecScheduler.d.ts.map +1 -0
- package/dist/schemes/ExecScheduler.js +95 -0
- package/dist/schemes/ExecScheduler.js.map +1 -0
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +26 -19
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Log.d.ts +6 -4
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +132 -39
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Log.sql +23 -18
- package/dist/schemes/QuestionTool.d.ts +17 -4
- package/dist/schemes/QuestionTool.d.ts.map +1 -1
- package/dist/schemes/QuestionTool.js +2 -4
- package/dist/schemes/QuestionTool.js.map +1 -1
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +20 -20
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-chunk.d.ts.map +1 -1
- package/dist/schemes/_entry-chunk.js +6 -2
- package/dist/schemes/_entry-chunk.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +18 -17
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +9 -14
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-graph.js +12 -12
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-graph.sql +5 -5
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +15 -5
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-semantic.d.ts +5 -3
- package/dist/schemes/_entry-semantic.d.ts.map +1 -1
- package/dist/schemes/_entry-semantic.js +21 -9
- package/dist/schemes/_entry-semantic.js.map +1 -1
- package/dist/schemes/_path-scope.d.ts.map +1 -1
- package/dist/schemes/_path-scope.js +6 -1
- package/dist/schemes/_path-scope.js.map +1 -1
- package/dist/schemes/_search-index.d.ts.map +1 -1
- package/dist/schemes/_search-index.js +14 -2
- package/dist/schemes/_search-index.js.map +1 -1
- package/dist/server/BranchBatches.d.ts +3 -3
- package/dist/server/BranchBatches.d.ts.map +1 -1
- package/dist/server/BranchBatches.js +9 -2
- package/dist/server/BranchBatches.js.map +1 -1
- package/dist/server/Daemon.d.ts +12 -41
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +60 -93
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DaemonModule.d.ts +10 -1
- package/dist/server/DaemonModule.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +6 -5
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +14 -11
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/Functionality.d.ts +2 -2
- package/dist/server/Functionality.d.ts.map +1 -1
- package/dist/server/Functionality.js +8 -5
- package/dist/server/Functionality.js.map +1 -1
- package/dist/server/FunctionalityManager.d.ts +13 -1
- package/dist/server/FunctionalityManager.d.ts.map +1 -1
- package/dist/server/FunctionalityManager.js +82 -17
- package/dist/server/FunctionalityManager.js.map +1 -1
- package/dist/server/MembersFunctionality.d.ts +56 -0
- package/dist/server/MembersFunctionality.d.ts.map +1 -0
- package/dist/server/MembersFunctionality.js +350 -0
- package/dist/server/MembersFunctionality.js.map +1 -0
- package/dist/server/SkillsFunctionality.d.ts +12 -1
- package/dist/server/SkillsFunctionality.d.ts.map +1 -1
- package/dist/server/SkillsFunctionality.js +6 -1
- package/dist/server/SkillsFunctionality.js.map +1 -1
- package/dist/server/client-input.d.ts +5 -8
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +49 -108
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +3 -0
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +4 -4
- package/dist/server/envelope.d.ts +1 -1
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +11 -10
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +1 -1
- package/dist/server/lifecycle-recovery.sql +14 -20
- package/dist/server/loopDocs.d.ts.map +1 -1
- package/dist/server/loopDocs.js +12 -5
- package/dist/server/loopDocs.js.map +1 -1
- package/dist/server/seam-proposal-list.sql +2 -2
- package/dist/server/worker-capabilities.sql +9 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +18 -23
- package/dist/service.js.map +1 -1
- package/migrations/001_schema.sql +477 -131
- package/package.json +31 -33
- package/dist/core/LoopFlagsReader.d.ts +0 -7
- package/dist/core/LoopFlagsReader.d.ts.map +0 -1
- package/dist/core/LoopFlagsReader.js +0 -33
- package/dist/core/LoopFlagsReader.js.map +0 -1
- package/dist/core/resolveForLoop.d.ts +0 -5
- package/dist/core/resolveForLoop.d.ts.map +0 -1
- package/dist/core/resolveForLoop.js +0 -12
- package/dist/core/resolveForLoop.js.map +0 -1
package/dist/server/Daemon.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// the transport-free plugin-module seam ({§rpc}).
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { resolve, dirname } from "node:path";
|
|
5
|
+
import { isDeepStrictEqual } from "node:util";
|
|
5
6
|
import Paths from "../Paths.js";
|
|
6
7
|
import Engine from "../core/Engine.js";
|
|
7
8
|
import ExecutorRegistry from "../core/ExecutorRegistry.js";
|
|
@@ -14,13 +15,13 @@ import WorkerSettingsReader from "../core/worker-settings.js";
|
|
|
14
15
|
import EffectPolicy from "../schemes/EffectPolicy.js";
|
|
15
16
|
import QuestionTool, { questionRuntimeDecl } from "../schemes/QuestionTool.js";
|
|
16
17
|
import DrainSupervisor from "./DrainSupervisor.js";
|
|
17
|
-
import { parsePath, Validator, } from "@plurnk/plurnk-contracts";
|
|
18
|
+
import { parsePath, CapabilityAdmission, Validator, } from "@plurnk/plurnk-contracts";
|
|
18
19
|
import LogEntry from "./logEntry.js";
|
|
19
20
|
import Envelope from "./envelope.js";
|
|
20
21
|
import ClientInput from "./client-input.js";
|
|
21
22
|
import Turn from "../core/Turn.js";
|
|
22
23
|
import SkillsFunctionality from "./SkillsFunctionality.js";
|
|
23
|
-
import
|
|
24
|
+
import MembersFunctionality from "./MembersFunctionality.js";
|
|
24
25
|
import Fork from "../core/fork.js";
|
|
25
26
|
import WorkerName from "../core/WorkerName.js";
|
|
26
27
|
import WorkerControlAddress from "../core/WorkerControlAddress.js";
|
|
@@ -30,7 +31,8 @@ import { contentWeight } from "../core/content-weight.js";
|
|
|
30
31
|
import { parseAliasesFromEnv, resolveActiveRoute, UnsupportedReasoningPolicyError, } from "@plurnk/plurnk-providers";
|
|
31
32
|
import ProviderInstantiate from "../core/ProviderInstantiate.js";
|
|
32
33
|
import { resolveLoopRoute } from "./loop-model.js";
|
|
33
|
-
import
|
|
34
|
+
import LoopPolicyReader from "../core/LoopPolicyReader.js";
|
|
35
|
+
import CapabilityPolicies from "../core/CapabilityPolicies.js";
|
|
34
36
|
import Results, { OperationFailureError } from "../core/results.js";
|
|
35
37
|
import WorkspaceGate from "../core/WorkspaceGate.js";
|
|
36
38
|
import WorkerResidency from "./WorkerResidency.js";
|
|
@@ -72,6 +74,7 @@ export default class Daemon {
|
|
|
72
74
|
#residency;
|
|
73
75
|
#functionality;
|
|
74
76
|
#skills;
|
|
77
|
+
#members;
|
|
75
78
|
// {§methods-event-subscribe} — the broadcast's in-process event source. A transport
|
|
76
79
|
// module (plurnk-agui) subscribes and fans out to its OWN clients; core emits, never owns
|
|
77
80
|
// client transport or connection state.
|
|
@@ -127,20 +130,25 @@ export default class Daemon {
|
|
|
127
130
|
// {§skills-functionality} — Core's own family: standard Agent Skills.
|
|
128
131
|
this.#skills = new SkillsFunctionality({ db, ...skills });
|
|
129
132
|
this.#skills.attach(this.#functionality.register(this.#skills));
|
|
133
|
+
// {§members-functionality} — Core's own family: file membership on the same surface.
|
|
134
|
+
this.#members = new MembersFunctionality({ db, engine: () => this.#engine });
|
|
135
|
+
this.#functionality.register(this.#members);
|
|
130
136
|
this.#branchBatches = new BranchBatches(db, this.#workspaceGate, {
|
|
131
137
|
settleWorkspace: async (workspaceId) => this.#engine.drainWorkspaceDerivations(workspaceId),
|
|
132
|
-
createChild: async ({ workspaceId, parentWorkerId, parentLoopId, op, name, prompt,
|
|
138
|
+
createChild: async ({ workspaceId, parentWorkerId, parentLoopId, op, name, prompt, policy, origin }) => {
|
|
133
139
|
const parentPolicy = await this.#providerPolicyForLoop(parentLoopId);
|
|
134
140
|
const providerSpec = parentPolicy.childProviderSpec ?? parentPolicy.providerSpec;
|
|
135
141
|
const workerName = WorkerName.assert(name);
|
|
142
|
+
const capabilityBound = await CapabilityPolicies.delegationBound(this.#db, workspaceId, parentWorkerId, policy);
|
|
136
143
|
const workerId = op === "FORK"
|
|
137
|
-
? await Fork.fork(this.#db, parentWorkerId, workerName, (scheme) => this.#schemes.entryInheritanceForStoredScheme(scheme, parentWorkerId))
|
|
144
|
+
? await Fork.fork(this.#db, parentWorkerId, workerName, capabilityBound, (scheme) => this.#schemes.entryInheritanceForStoredScheme(scheme, parentWorkerId))
|
|
138
145
|
: (await this.#db.fork_insert_worker.get({
|
|
139
146
|
workspace_id: workspaceId,
|
|
140
147
|
name: workerName,
|
|
141
148
|
parent_worker_id: parentWorkerId,
|
|
142
149
|
origin,
|
|
143
150
|
fork_snapshot: 0,
|
|
151
|
+
capability_bound: JSON.stringify(capabilityBound),
|
|
144
152
|
}))?.id;
|
|
145
153
|
if (workerId === undefined)
|
|
146
154
|
throw new Error("Branch worker insert returned no row");
|
|
@@ -160,7 +168,7 @@ export default class Daemon {
|
|
|
160
168
|
providerSpec,
|
|
161
169
|
reasoningPolicy: parentPolicy.reasoningPolicy,
|
|
162
170
|
childProviderSpec: parentPolicy.childProviderSpec,
|
|
163
|
-
|
|
171
|
+
policy,
|
|
164
172
|
});
|
|
165
173
|
return { workerId, loopId };
|
|
166
174
|
},
|
|
@@ -197,7 +205,7 @@ export default class Daemon {
|
|
|
197
205
|
// daemon owns provider + the law-file system prompt; the worker scheme
|
|
198
206
|
// handler carries neither. Fire-and-forget: the returned drain runs
|
|
199
207
|
// independently (the sister is its own worker). {§machine-processes}
|
|
200
|
-
injectWorker: async ({ workspaceId, workerId, sourceWorkerId, prompt,
|
|
208
|
+
injectWorker: async ({ workspaceId, workerId, sourceWorkerId, prompt, freshLoopPolicy, parentLoopId }) => {
|
|
201
209
|
await this.#assertModelWorker(workspaceId, workerId);
|
|
202
210
|
const source = await this.#workerPromptSource(workspaceId, sourceWorkerId, workerId);
|
|
203
211
|
const systemPrompt = await readFile(Paths.instructionsSystem, "utf8");
|
|
@@ -241,7 +249,7 @@ export default class Daemon {
|
|
|
241
249
|
reasoningPolicy,
|
|
242
250
|
childProviderSpec,
|
|
243
251
|
systemPrompt,
|
|
244
|
-
...(
|
|
252
|
+
...(freshLoopPolicy === undefined ? {} : { freshLoopPolicy }),
|
|
245
253
|
});
|
|
246
254
|
return { action, loopId };
|
|
247
255
|
},
|
|
@@ -270,8 +278,8 @@ export default class Daemon {
|
|
|
270
278
|
db,
|
|
271
279
|
lifecycle: this.#lifecycle,
|
|
272
280
|
injectPrompt: (workerId, prompt, openPaths, source) => this.#engine.inject(workerId, prompt, openPaths, source),
|
|
273
|
-
assertInjectionCompatibility: async ({ workerId, loopId, providerSpec, providerSpecExplicit, reasoningPolicy, childProviderSpec, turnCeiling,
|
|
274
|
-
await this.#assertFoldPosture(workerId,
|
|
281
|
+
assertInjectionCompatibility: async ({ workerId, loopId, providerSpec, providerSpecExplicit, reasoningPolicy, childProviderSpec, turnCeiling, policy, }) => {
|
|
282
|
+
await this.#assertFoldPosture(workerId, policy, loopId);
|
|
275
283
|
// An omitted selector keeps the loop's durable provider; only an
|
|
276
284
|
// explicit selection is checked against it (a deliberate switch).
|
|
277
285
|
if (providerSpecExplicit !== false) {
|
|
@@ -284,7 +292,7 @@ export default class Daemon {
|
|
|
284
292
|
await this.#assertLoopMaxTurns(loopId, turnCeiling?.source === "explicit" ? turnCeiling.effective : undefined);
|
|
285
293
|
},
|
|
286
294
|
reconcilePrompts: (workerId, endedLoopId) => this.#reconcileOrphanedPrompts(workerId, endedLoopId),
|
|
287
|
-
runLoop: async ({ workspaceId, workerId, loopId, maxTurns, prompt, systemPrompt, signal,
|
|
295
|
+
runLoop: async ({ workspaceId, workerId, loopId, maxTurns, prompt, systemPrompt, signal, onSettled, }) => {
|
|
288
296
|
// The drain callback is the final provider/model boundary. Every
|
|
289
297
|
// admission path, including boot recovery, terminates here.
|
|
290
298
|
await this.#assertModelWorker(workspaceId, workerId);
|
|
@@ -307,7 +315,7 @@ export default class Daemon {
|
|
|
307
315
|
{ role: "user", content: prompt },
|
|
308
316
|
],
|
|
309
317
|
signal,
|
|
310
|
-
|
|
318
|
+
onSettled,
|
|
311
319
|
});
|
|
312
320
|
}
|
|
313
321
|
finally {
|
|
@@ -386,7 +394,9 @@ export default class Daemon {
|
|
|
386
394
|
const openPaths = ClientInput.assertOpenPaths("runLoop", args.openPaths);
|
|
387
395
|
const selector = ClientInput.assertOptionalSelector("runLoop", "selector", args.selector);
|
|
388
396
|
const childSelector = ClientInput.assertOptionalChildSelector("runLoop", args.childSelector);
|
|
389
|
-
const
|
|
397
|
+
const policy = args.policy === undefined
|
|
398
|
+
? undefined
|
|
399
|
+
: ClientInput.normalizeLoopPolicy("runLoop", args.policy);
|
|
390
400
|
// {§worker-model-selection} — the worker owns the model. An explicit selector
|
|
391
401
|
// persists onto the worker; an omitted selector resolves the worker's durable model
|
|
392
402
|
// (seeded once from the daemon default). The loop then snapshots the resolved route.
|
|
@@ -418,7 +428,7 @@ export default class Daemon {
|
|
|
418
428
|
workerId,
|
|
419
429
|
prompt,
|
|
420
430
|
...(source === undefined ? {} : { source }),
|
|
421
|
-
...(
|
|
431
|
+
...(policy !== undefined ? { policy } : {}),
|
|
422
432
|
...(openPaths !== undefined ? { openPaths } : {}),
|
|
423
433
|
turnCeiling,
|
|
424
434
|
providerSpec: selection,
|
|
@@ -685,30 +695,31 @@ export default class Daemon {
|
|
|
685
695
|
// {§worker-settings} — merge known keys into the worker's behavioral-rules bag.
|
|
686
696
|
// Validated at the boundary; unprovided keys keep their durable value.
|
|
687
697
|
async #mergeWorkerSettings(workerId, settings) {
|
|
698
|
+
const normalized = ClientInput.normalizeWorkerSettings(settings);
|
|
688
699
|
const current = await WorkerSettingsReader.read(this.#db, workerId);
|
|
689
700
|
const merged = {
|
|
690
|
-
|
|
701
|
+
capabilities: normalized.capabilities ?? current.capabilities,
|
|
691
702
|
};
|
|
692
703
|
await this.#db.worker_settings_update.run({ id: workerId, settings: JSON.stringify(merged) });
|
|
693
704
|
}
|
|
694
|
-
// {§
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
705
|
+
// {§capability-policy-projection} — clients inspect the same complete cascade
|
|
706
|
+
// that dispatch and packet projection consume; the mutable Worker layer is
|
|
707
|
+
// never presented as if it were effective authority.
|
|
708
|
+
async readWorkerCapabilities(args) {
|
|
709
|
+
const workspaceId = ClientInput.assertId("worker.capabilities.get", "workspaceId", args.workspaceId);
|
|
710
|
+
const workerId = ClientInput.assertId("worker.capabilities.get", "workerId", args.workerId);
|
|
698
711
|
await this.#assertWorkerOwned(workspaceId, workerId);
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
}
|
|
702
|
-
//
|
|
703
|
-
//
|
|
704
|
-
async
|
|
705
|
-
const workspaceId = ClientInput.assertId("worker.
|
|
706
|
-
const workerId = ClientInput.assertId("worker.
|
|
712
|
+
return this.#engine.capabilityProjection(workspaceId, workerId);
|
|
713
|
+
}
|
|
714
|
+
// {§worker-settings} — replace the Worker's mutable policy, then return the
|
|
715
|
+
// resolver-owned projection so a narrowing ceiling cannot be mistaken for
|
|
716
|
+
// newly effective authority.
|
|
717
|
+
async setWorkerCapabilities(args) {
|
|
718
|
+
const workspaceId = ClientInput.assertId("worker.capabilities.set", "workspaceId", args.workspaceId);
|
|
719
|
+
const workerId = ClientInput.assertId("worker.capabilities.set", "workerId", args.workerId);
|
|
707
720
|
await this.#assertWorkerOwned(workspaceId, workerId);
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
const settings = await WorkerSettingsReader.read(this.#db, workerId);
|
|
711
|
-
return { requestUserInput: settings.requestUserInput };
|
|
721
|
+
await this.#mergeWorkerSettings(workerId, { capabilities: args.policy });
|
|
722
|
+
return this.#engine.capabilityProjection(workspaceId, workerId);
|
|
712
723
|
}
|
|
713
724
|
// {§worker-model-selection} — project a worker's durable model and spawn override
|
|
714
725
|
// for a client-interface get/set surface. Ownership is checked at this boundary.
|
|
@@ -1186,20 +1197,6 @@ export default class Daemon {
|
|
|
1186
1197
|
const checkedLimit = ClientInput.assertLimit("workspace.prompts", limit);
|
|
1187
1198
|
return Envelope.listPromptsForWorkspace(this.#db, checkedWorkspaceId, checkedLimit ?? 100);
|
|
1188
1199
|
}
|
|
1189
|
-
async listMembers(workspaceId) {
|
|
1190
|
-
const checkedWorkspaceId = ClientInput.assertId("workspace.members", "workspaceId", workspaceId);
|
|
1191
|
-
const release = await this.#workspaceGate.acquireTurn(checkedWorkspaceId, 0);
|
|
1192
|
-
try {
|
|
1193
|
-
return await GitMembership.resolveMembershipEffects(this.#db, checkedWorkspaceId, undefined);
|
|
1194
|
-
}
|
|
1195
|
-
finally {
|
|
1196
|
-
release();
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
listConstraints(workspaceId) {
|
|
1200
|
-
const checkedWorkspaceId = ClientInput.assertId("workspace.constraints", "workspaceId", workspaceId);
|
|
1201
|
-
return this.#db.crud_list_workspace_constraints.all({ workspace_id: checkedWorkspaceId });
|
|
1202
|
-
}
|
|
1203
1200
|
workspaceDerivationStatus(workspaceId) {
|
|
1204
1201
|
return this.#engine.workspaceDerivationStatus(ClientInput.assertId("workspace.derivation", "workspaceId", workspaceId));
|
|
1205
1202
|
}
|
|
@@ -1209,22 +1206,14 @@ export default class Daemon {
|
|
|
1209
1206
|
// (which client is on which workspace) lives here — that's the module's.
|
|
1210
1207
|
async createWorkspace(args) {
|
|
1211
1208
|
// The seam fails hard on malformed semantic input so every module inherits one wall:
|
|
1212
|
-
// the settings bag
|
|
1213
|
-
// ({§operator-config-workspace-settings}),
|
|
1214
|
-
// constraints, and absolute projectRoot.
|
|
1209
|
+
// the settings bag ({§operator-config-workspace-settings}) and absolute projectRoot.
|
|
1215
1210
|
const name = ClientInput.assertOptionalName("workspace.create", "name", args.name);
|
|
1216
1211
|
const projectRoot = ClientInput.assertProjectRoot("workspace.create", args.projectRoot);
|
|
1217
1212
|
const settings = ClientInput.parseSettings(args.settings);
|
|
1218
|
-
const constraints = ClientInput.parseConstraints(args.constraints);
|
|
1219
1213
|
return observed(// {§observability-boundary}
|
|
1220
1214
|
"workspace.create", {}, async (span) => {
|
|
1221
1215
|
const envelope = await Envelope.createClientEnvelope(this.#db, { name, projectRoot, settings });
|
|
1222
1216
|
span.setAttribute("workspace.id", envelope.workspaceId);
|
|
1223
|
-
for (const { effect, glob } of constraints) {
|
|
1224
|
-
await this.#db.crud_insert_workspace_constraint.run({ workspace_id: envelope.workspaceId, effect, glob });
|
|
1225
|
-
}
|
|
1226
|
-
if (constraints.length > 0)
|
|
1227
|
-
await GitMembership.resolveGitMembership(this.#db, envelope.workspaceId, undefined);
|
|
1228
1217
|
this.#broadcast("all", "workspace/created", { id: envelope.workspaceId, name: envelope.workspaceName, projectRoot: envelope.projectRoot });
|
|
1229
1218
|
return envelope;
|
|
1230
1219
|
});
|
|
@@ -1245,36 +1234,6 @@ export default class Daemon {
|
|
|
1245
1234
|
throw new Error("ClientInput.assertOptionalName accepted a required name as undefined");
|
|
1246
1235
|
return { id: checkedWorkspaceId, name: await Envelope.updateWorkspaceName(this.#db, checkedWorkspaceId, checkedName) };
|
|
1247
1236
|
}
|
|
1248
|
-
async constrain(workspaceId, effect, glob) {
|
|
1249
|
-
const checkedWorkspaceId = ClientInput.assertId("workspace.constrain", "workspaceId", workspaceId);
|
|
1250
|
-
const release = await this.#workspaceGate.acquireTurn(checkedWorkspaceId, 0);
|
|
1251
|
-
try {
|
|
1252
|
-
ClientInput.assertConstraint("workspace.constrain", effect, glob);
|
|
1253
|
-
await this.#db.crud_insert_workspace_constraint.run({ workspace_id: checkedWorkspaceId, effect, glob });
|
|
1254
|
-
await GitMembership.resolveGitMembership(this.#db, checkedWorkspaceId, undefined);
|
|
1255
|
-
// Members may have just landed — begin warming now, but return the constraint response
|
|
1256
|
-
// immediately so prompts do not wait for the complete derivation corpus.
|
|
1257
|
-
void this.#engine.warmWorkspaceDerivations(checkedWorkspaceId).catch(() => { });
|
|
1258
|
-
return { effect, glob, source: "explicit" };
|
|
1259
|
-
}
|
|
1260
|
-
finally {
|
|
1261
|
-
release();
|
|
1262
|
-
}
|
|
1263
|
-
}
|
|
1264
|
-
async unconstrain(workspaceId, effect, glob) {
|
|
1265
|
-
const checkedWorkspaceId = ClientInput.assertId("workspace.unconstrain", "workspaceId", workspaceId);
|
|
1266
|
-
const release = await this.#workspaceGate.acquireTurn(checkedWorkspaceId, 0);
|
|
1267
|
-
try {
|
|
1268
|
-
ClientInput.assertConstraint("workspace.unconstrain", effect, glob);
|
|
1269
|
-
await this.#db.crud_delete_workspace_constraint.run({ workspace_id: checkedWorkspaceId, effect, glob });
|
|
1270
|
-
await GitMembership.resolveGitMembership(this.#db, checkedWorkspaceId, undefined);
|
|
1271
|
-
void this.#engine.warmWorkspaceDerivations(checkedWorkspaceId).catch(() => { });
|
|
1272
|
-
return { effect, glob };
|
|
1273
|
-
}
|
|
1274
|
-
finally {
|
|
1275
|
-
release();
|
|
1276
|
-
}
|
|
1277
|
-
}
|
|
1278
1237
|
// Contracts {§entry-read-result}: resolve through the scheme's address law,
|
|
1279
1238
|
// then project one owner-scoped entry without exposing persistence columns.
|
|
1280
1239
|
async readEntry(args) {
|
|
@@ -1453,7 +1412,7 @@ export default class Daemon {
|
|
|
1453
1412
|
throw daemonFailure("daemon:worker", "name-conflict", 409, `Worker name '${name}' is already in use in workspace ${workspaceId}.`, { workspaceId, name, recovery: "Choose another worker name.", retryable: false });
|
|
1454
1413
|
}
|
|
1455
1414
|
}
|
|
1456
|
-
const branchWorkerId = await Fork.fork(this.#db, workerId, name, (scheme) => this.#schemes.entryInheritanceForStoredScheme(scheme, workerId));
|
|
1415
|
+
const branchWorkerId = await Fork.fork(this.#db, workerId, name, await CapabilityPolicies.delegationBound(this.#db, workspaceId, workerId), (scheme) => this.#schemes.entryInheritanceForStoredScheme(scheme, workerId));
|
|
1457
1416
|
const branch = await this.#db.envelope_get_worker_by_id.get({ id: branchWorkerId });
|
|
1458
1417
|
return { workerId: branchWorkerId, workerName: branch?.name ?? null, parentWorkerId: workerId };
|
|
1459
1418
|
}
|
|
@@ -1651,6 +1610,7 @@ export default class Daemon {
|
|
|
1651
1610
|
await this.#db.recovery_fail_active_loops.run({});
|
|
1652
1611
|
await this.#db.recovery_settle_open_provider_requests.run({});
|
|
1653
1612
|
await this.#db.recovery_fail_open_model_calls.run({});
|
|
1613
|
+
await this.#db.recovery_fail_open_embedding_calls.run({});
|
|
1654
1614
|
await this.#db.recovery_fail_open_turns.run({});
|
|
1655
1615
|
await this.#db.recovery_fail_ownerless_proposals.run({});
|
|
1656
1616
|
await this.#db.recovery_remove_ownerless_client_interactions.run({});
|
|
@@ -1818,21 +1778,28 @@ export default class Daemon {
|
|
|
1818
1778
|
this.#broadcast({ workspaceId }, "notice/event", payload);
|
|
1819
1779
|
}
|
|
1820
1780
|
// {§methods-loop-run-fold-consistency} — a folded prompt cannot reconfigure its loop.
|
|
1821
|
-
async #assertFoldPosture(workerId,
|
|
1822
|
-
if (
|
|
1781
|
+
async #assertFoldPosture(workerId, policy, loopId) {
|
|
1782
|
+
if (policy === undefined || Object.keys(policy).length === 0)
|
|
1823
1783
|
return;
|
|
1824
|
-
const effective = await
|
|
1825
|
-
const requested = Object.entries(
|
|
1784
|
+
const effective = await LoopPolicyReader.read(this.#db, loopId);
|
|
1785
|
+
const requested = Object.entries(policy);
|
|
1826
1786
|
const conflicts = requested
|
|
1827
|
-
.filter(([key, value]) =>
|
|
1787
|
+
.filter(([key, value]) => {
|
|
1788
|
+
if (value === undefined)
|
|
1789
|
+
return false;
|
|
1790
|
+
if (key === "capabilities") {
|
|
1791
|
+
return !isDeepStrictEqual(CapabilityAdmission.intersect([effective.capabilities]), CapabilityAdmission.intersect([value]));
|
|
1792
|
+
}
|
|
1793
|
+
return effective[key] !== value;
|
|
1794
|
+
})
|
|
1828
1795
|
.map(([key, value]) => `${key}: ${JSON.stringify(effective[key])} -> ${JSON.stringify(value)}`);
|
|
1829
1796
|
if (conflicts.length > 0) {
|
|
1830
|
-
throw daemonFailure("daemon:loop", "loop-
|
|
1797
|
+
throw daemonFailure("daemon:loop", "loop-policy-conflict", 409, "The requested loop policy differs from the active loop policy.", {
|
|
1831
1798
|
workerId,
|
|
1832
1799
|
loopId,
|
|
1833
1800
|
conflicts,
|
|
1834
1801
|
stage: "loop-injection",
|
|
1835
|
-
recovery: "Cancel the active loop before changing
|
|
1802
|
+
recovery: "Cancel the active loop before changing policy, or omit policy to keep its current posture.",
|
|
1836
1803
|
retryable: false,
|
|
1837
1804
|
});
|
|
1838
1805
|
}
|
|
@@ -1857,7 +1824,7 @@ export default class Daemon {
|
|
|
1857
1824
|
sequence: seqRow.next,
|
|
1858
1825
|
prompt: first.body,
|
|
1859
1826
|
prompt_source: first.prompt_source,
|
|
1860
|
-
|
|
1827
|
+
policy: first.policy,
|
|
1861
1828
|
model_route_id: first.model_route_id,
|
|
1862
1829
|
spawn_model_route_id: first.spawn_model_route_id,
|
|
1863
1830
|
reasoning_policy: first.reasoning_policy,
|