@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.
Files changed (314) hide show
  1. package/.env.defaults +41 -17
  2. package/INSTALL.md +4 -4
  3. package/README.md +2 -2
  4. package/SPEC.md +573 -273
  5. package/digest-sql/curation/curation.sql +1 -0
  6. package/dist/Paths.d.ts +3 -3
  7. package/dist/Paths.d.ts.map +1 -1
  8. package/dist/Paths.js +9 -9
  9. package/dist/Paths.js.map +1 -1
  10. package/dist/build-info.json +1 -1
  11. package/dist/content/edit-collision.d.ts +1 -1
  12. package/dist/content/edit-collision.d.ts.map +1 -1
  13. package/dist/content/edit-collision.js +5 -4
  14. package/dist/content/edit-collision.js.map +1 -1
  15. package/dist/content/edit-receipt.d.ts +6 -5
  16. package/dist/content/edit-receipt.d.ts.map +1 -1
  17. package/dist/content/edit-receipt.js +28 -8
  18. package/dist/content/edit-receipt.js.map +1 -1
  19. package/dist/content/index.d.ts +2 -2
  20. package/dist/content/index.d.ts.map +1 -1
  21. package/dist/content/index.js +1 -1
  22. package/dist/content/index.js.map +1 -1
  23. package/dist/content/line-anchors.d.ts +2 -0
  24. package/dist/content/line-anchors.d.ts.map +1 -1
  25. package/dist/content/line-anchors.js +15 -6
  26. package/dist/content/line-anchors.js.map +1 -1
  27. package/dist/content/line-marker.d.ts +0 -1
  28. package/dist/content/line-marker.d.ts.map +1 -1
  29. package/dist/content/line-marker.js.map +1 -1
  30. package/dist/content/matcher.d.ts.map +1 -1
  31. package/dist/content/matcher.js +3 -2
  32. package/dist/content/matcher.js.map +1 -1
  33. package/dist/content/read-projector.js +3 -3
  34. package/dist/content/read-projector.js.map +1 -1
  35. package/dist/core/BudgetReadout.d.ts +6 -1
  36. package/dist/core/BudgetReadout.d.ts.map +1 -1
  37. package/dist/core/BudgetReadout.js +38 -2
  38. package/dist/core/BudgetReadout.js.map +1 -1
  39. package/dist/core/CapabilityPolicies.d.ts +15 -0
  40. package/dist/core/CapabilityPolicies.d.ts.map +1 -0
  41. package/dist/core/CapabilityPolicies.js +60 -0
  42. package/dist/core/CapabilityPolicies.js.map +1 -0
  43. package/dist/core/CapabilityResolver.d.ts +24 -0
  44. package/dist/core/CapabilityResolver.d.ts.map +1 -0
  45. package/dist/core/CapabilityResolver.js +180 -0
  46. package/dist/core/CapabilityResolver.js.map +1 -0
  47. package/dist/core/ChannelWrite.d.ts +4 -3
  48. package/dist/core/ChannelWrite.d.ts.map +1 -1
  49. package/dist/core/CoreSchemeServices.d.ts +2 -2
  50. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  51. package/dist/core/CoreSchemeServices.js +2 -2
  52. package/dist/core/CoreSchemeServices.js.map +1 -1
  53. package/dist/core/Dispatcher.d.ts +5 -2
  54. package/dist/core/Dispatcher.d.ts.map +1 -1
  55. package/dist/core/Dispatcher.js +157 -165
  56. package/dist/core/Dispatcher.js.map +1 -1
  57. package/dist/core/DurableStatement.d.ts.map +1 -1
  58. package/dist/core/DurableStatement.js +19 -15
  59. package/dist/core/DurableStatement.js.map +1 -1
  60. package/dist/core/EmbeddingCall.d.ts +23 -0
  61. package/dist/core/EmbeddingCall.d.ts.map +1 -0
  62. package/dist/core/EmbeddingCall.js +149 -0
  63. package/dist/core/EmbeddingCall.js.map +1 -0
  64. package/dist/core/Engine.d.ts +6 -4
  65. package/dist/core/Engine.d.ts.map +1 -1
  66. package/dist/core/Engine.js +20 -9
  67. package/dist/core/Engine.js.map +1 -1
  68. package/dist/core/Engine.sql +119 -56
  69. package/dist/core/ExecutorRegistry.d.ts +3 -3
  70. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  71. package/dist/core/ExecutorRegistry.js +10 -6
  72. package/dist/core/ExecutorRegistry.js.map +1 -1
  73. package/dist/core/GitBranch.d.ts +4 -1
  74. package/dist/core/GitBranch.d.ts.map +1 -1
  75. package/dist/core/GitBranch.js +12 -2
  76. package/dist/core/GitBranch.js.map +1 -1
  77. package/dist/core/InferenceCall.d.ts +18 -0
  78. package/dist/core/InferenceCall.d.ts.map +1 -0
  79. package/dist/core/InferenceCall.js +86 -0
  80. package/dist/core/InferenceCall.js.map +1 -0
  81. package/dist/core/LogEntryProjection.d.ts +1 -0
  82. package/dist/core/LogEntryProjection.d.ts.map +1 -1
  83. package/dist/core/LogEntryProjection.js +12 -4
  84. package/dist/core/LogEntryProjection.js.map +1 -1
  85. package/dist/core/LoopPolicyReader.d.ts +7 -0
  86. package/dist/core/LoopPolicyReader.d.ts.map +1 -0
  87. package/dist/core/LoopPolicyReader.js +33 -0
  88. package/dist/core/LoopPolicyReader.js.map +1 -0
  89. package/dist/core/ModelCall.d.ts +4 -12
  90. package/dist/core/ModelCall.d.ts.map +1 -1
  91. package/dist/core/ModelCall.js +10 -74
  92. package/dist/core/ModelCall.js.map +1 -1
  93. package/dist/core/NoticeChannel.d.ts +2 -2
  94. package/dist/core/NoticeChannel.d.ts.map +1 -1
  95. package/dist/core/NoticeChannel.js +18 -9
  96. package/dist/core/NoticeChannel.js.map +1 -1
  97. package/dist/core/OperatorConfig.d.ts.map +1 -1
  98. package/dist/core/OperatorConfig.js +4 -0
  99. package/dist/core/OperatorConfig.js.map +1 -1
  100. package/dist/core/OverflowTurn.d.ts.map +1 -1
  101. package/dist/core/OverflowTurn.js +4 -3
  102. package/dist/core/OverflowTurn.js.map +1 -1
  103. package/dist/core/Owner.js +5 -5
  104. package/dist/core/Owner.js.map +1 -1
  105. package/dist/core/PacketBuilder.d.ts +2 -2
  106. package/dist/core/PacketBuilder.d.ts.map +1 -1
  107. package/dist/core/PacketBuilder.js +55 -35
  108. package/dist/core/PacketBuilder.js.map +1 -1
  109. package/dist/core/ProblemLog.d.ts.map +1 -1
  110. package/dist/core/ProblemLog.js +1 -0
  111. package/dist/core/ProblemLog.js.map +1 -1
  112. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  113. package/dist/core/ProposalLifecycle.js +16 -13
  114. package/dist/core/ProposalLifecycle.js.map +1 -1
  115. package/dist/core/ReasoningEvent.d.ts +1 -0
  116. package/dist/core/ReasoningEvent.d.ts.map +1 -1
  117. package/dist/core/ResourceMutations.d.ts +6 -4
  118. package/dist/core/ResourceMutations.d.ts.map +1 -1
  119. package/dist/core/ResourceMutations.js +209 -63
  120. package/dist/core/ResourceMutations.js.map +1 -1
  121. package/dist/core/SchemeRegistry.d.ts +6 -3
  122. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  123. package/dist/core/SchemeRegistry.js +14 -17
  124. package/dist/core/SchemeRegistry.js.map +1 -1
  125. package/dist/core/ServiceTeardown.d.ts +1 -1
  126. package/dist/core/ServiceTeardown.d.ts.map +1 -1
  127. package/dist/core/ServiceTeardown.js +4 -8
  128. package/dist/core/ServiceTeardown.js.map +1 -1
  129. package/dist/core/StrikeRail.d.ts +1 -0
  130. package/dist/core/StrikeRail.d.ts.map +1 -1
  131. package/dist/core/StrikeRail.js +12 -3
  132. package/dist/core/StrikeRail.js.map +1 -1
  133. package/dist/core/ToolResources.d.ts +2 -2
  134. package/dist/core/ToolResources.d.ts.map +1 -1
  135. package/dist/core/ToolResources.js +18 -8
  136. package/dist/core/ToolResources.js.map +1 -1
  137. package/dist/core/Turn.sql +6 -3
  138. package/dist/core/TurnOps.d.ts.map +1 -1
  139. package/dist/core/TurnOps.js +22 -8
  140. package/dist/core/TurnOps.js.map +1 -1
  141. package/dist/core/TurnRunner.d.ts +7 -4
  142. package/dist/core/TurnRunner.d.ts.map +1 -1
  143. package/dist/core/TurnRunner.js +345 -83
  144. package/dist/core/TurnRunner.js.map +1 -1
  145. package/dist/core/WorkerControlAddress.d.ts.map +1 -1
  146. package/dist/core/WorkerControlAddress.js +1 -2
  147. package/dist/core/WorkerControlAddress.js.map +1 -1
  148. package/dist/core/WorkerName.d.ts +2 -0
  149. package/dist/core/WorkerName.d.ts.map +1 -1
  150. package/dist/core/WorkerName.js +3 -2
  151. package/dist/core/WorkerName.js.map +1 -1
  152. package/dist/core/WorkerName.sql +2 -1
  153. package/dist/core/caps/DbProjectionCaps.d.ts +2 -1
  154. package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
  155. package/dist/core/caps/DbProjectionCaps.js +12 -1
  156. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  157. package/dist/core/file-materialization.d.ts +22 -0
  158. package/dist/core/file-materialization.d.ts.map +1 -0
  159. package/dist/core/file-materialization.js +77 -0
  160. package/dist/core/file-materialization.js.map +1 -0
  161. package/dist/core/fork.d.ts +2 -1
  162. package/dist/core/fork.d.ts.map +1 -1
  163. package/dist/core/fork.js +13 -4
  164. package/dist/core/fork.js.map +1 -1
  165. package/dist/core/fork.sql +27 -11
  166. package/dist/core/git-membership.d.ts +25 -14
  167. package/dist/core/git-membership.d.ts.map +1 -1
  168. package/dist/core/git-membership.js +260 -164
  169. package/dist/core/git-membership.js.map +1 -1
  170. package/dist/core/git-state.d.ts +2 -0
  171. package/dist/core/git-state.d.ts.map +1 -1
  172. package/dist/core/git-state.js +27 -1
  173. package/dist/core/git-state.js.map +1 -1
  174. package/dist/core/operation-target-groups.d.ts.map +1 -1
  175. package/dist/core/operation-target-groups.js +8 -7
  176. package/dist/core/operation-target-groups.js.map +1 -1
  177. package/dist/core/owner.sql +7 -10
  178. package/dist/core/packet-wire.d.ts +11 -0
  179. package/dist/core/packet-wire.d.ts.map +1 -1
  180. package/dist/core/packet-wire.js +98 -34
  181. package/dist/core/packet-wire.js.map +1 -1
  182. package/dist/core/scheme-types.d.ts +2 -2
  183. package/dist/core/scheme-types.d.ts.map +1 -1
  184. package/dist/core/scheme-types.js +1 -1
  185. package/dist/core/scheme-types.js.map +1 -1
  186. package/dist/core/types.d.ts +3 -2
  187. package/dist/core/types.d.ts.map +1 -1
  188. package/dist/core/types.js +1 -1
  189. package/dist/core/types.js.map +1 -1
  190. package/dist/core/worker-settings.d.ts +4 -3
  191. package/dist/core/worker-settings.d.ts.map +1 -1
  192. package/dist/core/worker-settings.js +40 -19
  193. package/dist/core/worker-settings.js.map +1 -1
  194. package/dist/core/workspace-settings.d.ts +3 -1
  195. package/dist/core/workspace-settings.d.ts.map +1 -1
  196. package/dist/core/workspace-settings.js +6 -2
  197. package/dist/core/workspace-settings.js.map +1 -1
  198. package/dist/digest/Digest.d.ts.map +1 -1
  199. package/dist/digest/Digest.js +151 -42
  200. package/dist/digest/Digest.js.map +1 -1
  201. package/dist/digest/digest.sql +48 -20
  202. package/dist/index.js +1 -1
  203. package/dist/index.js.map +1 -1
  204. package/dist/schemes/Exec.d.ts +4 -5
  205. package/dist/schemes/Exec.d.ts.map +1 -1
  206. package/dist/schemes/Exec.js +111 -94
  207. package/dist/schemes/Exec.js.map +1 -1
  208. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  209. package/dist/schemes/ExecOutputScheme.js +24 -6
  210. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  211. package/dist/schemes/ExecScheduler.d.ts +15 -0
  212. package/dist/schemes/ExecScheduler.d.ts.map +1 -0
  213. package/dist/schemes/ExecScheduler.js +95 -0
  214. package/dist/schemes/ExecScheduler.js.map +1 -0
  215. package/dist/schemes/File.d.ts.map +1 -1
  216. package/dist/schemes/File.js +26 -19
  217. package/dist/schemes/File.js.map +1 -1
  218. package/dist/schemes/Log.d.ts +6 -4
  219. package/dist/schemes/Log.d.ts.map +1 -1
  220. package/dist/schemes/Log.js +132 -39
  221. package/dist/schemes/Log.js.map +1 -1
  222. package/dist/schemes/Log.sql +23 -18
  223. package/dist/schemes/QuestionTool.d.ts +17 -4
  224. package/dist/schemes/QuestionTool.d.ts.map +1 -1
  225. package/dist/schemes/QuestionTool.js +2 -4
  226. package/dist/schemes/QuestionTool.js.map +1 -1
  227. package/dist/schemes/Worker.d.ts.map +1 -1
  228. package/dist/schemes/Worker.js +20 -20
  229. package/dist/schemes/Worker.js.map +1 -1
  230. package/dist/schemes/_entry-chunk.d.ts.map +1 -1
  231. package/dist/schemes/_entry-chunk.js +6 -2
  232. package/dist/schemes/_entry-chunk.js.map +1 -1
  233. package/dist/schemes/_entry-crud.sql +18 -17
  234. package/dist/schemes/_entry-find.d.ts.map +1 -1
  235. package/dist/schemes/_entry-find.js +9 -14
  236. package/dist/schemes/_entry-find.js.map +1 -1
  237. package/dist/schemes/_entry-graph.js +12 -12
  238. package/dist/schemes/_entry-graph.js.map +1 -1
  239. package/dist/schemes/_entry-graph.sql +5 -5
  240. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  241. package/dist/schemes/_entry-ops.js +15 -5
  242. package/dist/schemes/_entry-ops.js.map +1 -1
  243. package/dist/schemes/_entry-semantic.d.ts +5 -3
  244. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  245. package/dist/schemes/_entry-semantic.js +21 -9
  246. package/dist/schemes/_entry-semantic.js.map +1 -1
  247. package/dist/schemes/_path-scope.d.ts.map +1 -1
  248. package/dist/schemes/_path-scope.js +6 -1
  249. package/dist/schemes/_path-scope.js.map +1 -1
  250. package/dist/schemes/_search-index.d.ts.map +1 -1
  251. package/dist/schemes/_search-index.js +14 -2
  252. package/dist/schemes/_search-index.js.map +1 -1
  253. package/dist/server/BranchBatches.d.ts +3 -3
  254. package/dist/server/BranchBatches.d.ts.map +1 -1
  255. package/dist/server/BranchBatches.js +9 -2
  256. package/dist/server/BranchBatches.js.map +1 -1
  257. package/dist/server/Daemon.d.ts +12 -41
  258. package/dist/server/Daemon.d.ts.map +1 -1
  259. package/dist/server/Daemon.js +60 -93
  260. package/dist/server/Daemon.js.map +1 -1
  261. package/dist/server/DaemonModule.d.ts +10 -1
  262. package/dist/server/DaemonModule.d.ts.map +1 -1
  263. package/dist/server/DrainSupervisor.d.ts +6 -5
  264. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  265. package/dist/server/DrainSupervisor.js +14 -11
  266. package/dist/server/DrainSupervisor.js.map +1 -1
  267. package/dist/server/Functionality.d.ts +2 -2
  268. package/dist/server/Functionality.d.ts.map +1 -1
  269. package/dist/server/Functionality.js +8 -5
  270. package/dist/server/Functionality.js.map +1 -1
  271. package/dist/server/FunctionalityManager.d.ts +13 -1
  272. package/dist/server/FunctionalityManager.d.ts.map +1 -1
  273. package/dist/server/FunctionalityManager.js +82 -17
  274. package/dist/server/FunctionalityManager.js.map +1 -1
  275. package/dist/server/MembersFunctionality.d.ts +56 -0
  276. package/dist/server/MembersFunctionality.d.ts.map +1 -0
  277. package/dist/server/MembersFunctionality.js +350 -0
  278. package/dist/server/MembersFunctionality.js.map +1 -0
  279. package/dist/server/SkillsFunctionality.d.ts +12 -1
  280. package/dist/server/SkillsFunctionality.d.ts.map +1 -1
  281. package/dist/server/SkillsFunctionality.js +6 -1
  282. package/dist/server/SkillsFunctionality.js.map +1 -1
  283. package/dist/server/client-input.d.ts +5 -8
  284. package/dist/server/client-input.d.ts.map +1 -1
  285. package/dist/server/client-input.js +49 -108
  286. package/dist/server/client-input.js.map +1 -1
  287. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  288. package/dist/server/dispatch-as-plurnk.js +3 -0
  289. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  290. package/dist/server/drain.sql +4 -4
  291. package/dist/server/envelope.d.ts +1 -1
  292. package/dist/server/envelope.d.ts.map +1 -1
  293. package/dist/server/envelope.js +11 -10
  294. package/dist/server/envelope.js.map +1 -1
  295. package/dist/server/envelope.sql +1 -1
  296. package/dist/server/lifecycle-recovery.sql +14 -20
  297. package/dist/server/loopDocs.d.ts.map +1 -1
  298. package/dist/server/loopDocs.js +12 -5
  299. package/dist/server/loopDocs.js.map +1 -1
  300. package/dist/server/seam-proposal-list.sql +2 -2
  301. package/dist/server/worker-capabilities.sql +9 -0
  302. package/dist/service.d.ts.map +1 -1
  303. package/dist/service.js +18 -23
  304. package/dist/service.js.map +1 -1
  305. package/migrations/001_schema.sql +477 -131
  306. package/package.json +31 -33
  307. package/dist/core/LoopFlagsReader.d.ts +0 -7
  308. package/dist/core/LoopFlagsReader.d.ts.map +0 -1
  309. package/dist/core/LoopFlagsReader.js +0 -33
  310. package/dist/core/LoopFlagsReader.js.map +0 -1
  311. package/dist/core/resolveForLoop.d.ts +0 -5
  312. package/dist/core/resolveForLoop.d.ts.map +0 -1
  313. package/dist/core/resolveForLoop.js +0 -12
  314. package/dist/core/resolveForLoop.js.map +0 -1
@@ -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 GitMembership from "../core/git-membership.js";
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 LoopFlagsReader from "../core/LoopFlagsReader.js";
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, flags, origin }) => {
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
- flags,
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, flags, parentLoopId }) => {
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
- ...(flags === undefined ? {} : { flags }),
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, flags, }) => {
274
- await this.#assertFoldPosture(workerId, flags, loopId);
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, onDispatch, }) => {
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
- onDispatch,
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 flags = ClientInput.normalizeLoopFlags("runLoop", args.flags);
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
- ...(flags !== undefined ? { flags } : {}),
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
- requestUserInput: settings.requestUserInput ?? current.requestUserInput,
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
- // {§worker-settings} — project the worker's behavioral rules for a client-interface surface.
695
- async readWorkerSettings(args) {
696
- const workspaceId = ClientInput.assertId("worker.settings.get", "workspaceId", args.workspaceId);
697
- const workerId = ClientInput.assertId("worker.settings.get", "workerId", args.workerId);
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
- const settings = await WorkerSettingsReader.read(this.#db, workerId);
700
- return { requestUserInput: settings.requestUserInput };
701
- }
702
- // {§worker-settings} — persist known behavioral-rule keys; unknown keys are
703
- // rejected at the input boundary, never persisted.
704
- async setWorkerSettings(args) {
705
- const workspaceId = ClientInput.assertId("worker.settings.set", "workspaceId", args.workspaceId);
706
- const workerId = ClientInput.assertId("worker.settings.set", "workerId", args.workerId);
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
- ClientInput.parseWorkerSettings(args.settings);
709
- await this.#mergeWorkerSettings(workerId, args.settings);
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, flags, loopId) {
1822
- if (flags === undefined || Object.keys(flags).length === 0)
1781
+ async #assertFoldPosture(workerId, policy, loopId) {
1782
+ if (policy === undefined || Object.keys(policy).length === 0)
1823
1783
  return;
1824
- const effective = await LoopFlagsReader.read(this.#db, loopId);
1825
- const requested = Object.entries(flags);
1784
+ const effective = await LoopPolicyReader.read(this.#db, loopId);
1785
+ const requested = Object.entries(policy);
1826
1786
  const conflicts = requested
1827
- .filter(([key, value]) => value !== undefined && effective[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-flags-conflict", 409, "The requested loop flags differ from the active loop flags.", {
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 flags, or omit flags to keep its current posture.",
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
- flags: first.flags,
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,