@plurnk/plurnk-service 1.7.0 → 1.8.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 (280) hide show
  1. package/.env.defaults +29 -42
  2. package/INSTALL.md +49 -10
  3. package/README.md +11 -1
  4. package/SPEC.md +631 -279
  5. package/digest-sql/channel-dispositions/dispositions.sql +15 -0
  6. package/digest-sql/channel-state/state.sql +6 -0
  7. package/digest-sql/curation/curation.sql +5 -0
  8. package/digest-sql/derivations/derivations.sql +4 -0
  9. package/digest-sql/embeddings/embeddings.sql +4 -0
  10. package/digest-sql/entry-dispositions/dispositions.sql +15 -0
  11. package/digest-sql/entry-state/state.sql +6 -0
  12. package/digest-sql/token-counts/token-counts.sql +2 -0
  13. package/dist/Paths.d.ts +2 -5
  14. package/dist/Paths.d.ts.map +1 -1
  15. package/dist/Paths.js +9 -21
  16. package/dist/Paths.js.map +1 -1
  17. package/dist/build-info.json +1 -1
  18. package/dist/content/read-projector.d.ts.map +1 -1
  19. package/dist/content/read-projector.js +4 -3
  20. package/dist/content/read-projector.js.map +1 -1
  21. package/dist/core/BudgetReadout.d.ts.map +1 -1
  22. package/dist/core/BudgetReadout.js +12 -22
  23. package/dist/core/BudgetReadout.js.map +1 -1
  24. package/dist/core/ChannelWrite.d.ts.map +1 -1
  25. package/dist/core/ChannelWrite.js.map +1 -1
  26. package/dist/core/ChannelWrite.sql +2 -1
  27. package/dist/core/Dispatcher.d.ts +7 -6
  28. package/dist/core/Dispatcher.d.ts.map +1 -1
  29. package/dist/core/Dispatcher.js +34 -88
  30. package/dist/core/Dispatcher.js.map +1 -1
  31. package/dist/core/Engine.d.ts +11 -8
  32. package/dist/core/Engine.d.ts.map +1 -1
  33. package/dist/core/Engine.js +45 -27
  34. package/dist/core/Engine.js.map +1 -1
  35. package/dist/core/Engine.sql +112 -107
  36. package/dist/core/ExecutorRegistry.d.ts +8 -2
  37. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  38. package/dist/core/ExecutorRegistry.js +6 -3
  39. package/dist/core/ExecutorRegistry.js.map +1 -1
  40. package/dist/core/HostPaths.d.ts +29 -0
  41. package/dist/core/HostPaths.d.ts.map +1 -0
  42. package/dist/core/HostPaths.js +74 -0
  43. package/dist/core/HostPaths.js.map +1 -0
  44. package/dist/core/LegacyHome.d.ts +10 -0
  45. package/dist/core/LegacyHome.d.ts.map +1 -0
  46. package/dist/core/LegacyHome.js +170 -0
  47. package/dist/core/LegacyHome.js.map +1 -0
  48. package/dist/core/LogBody.d.ts +1 -1
  49. package/dist/core/LogBody.d.ts.map +1 -1
  50. package/dist/core/LogBody.js +2 -2
  51. package/dist/core/LogBody.js.map +1 -1
  52. package/dist/core/LogEntryProjection.js +1 -1
  53. package/dist/core/LogEntryProjection.js.map +1 -1
  54. package/dist/core/LogVisibility.d.ts +28 -0
  55. package/dist/core/LogVisibility.d.ts.map +1 -0
  56. package/dist/core/LogVisibility.js +215 -0
  57. package/dist/core/LogVisibility.js.map +1 -0
  58. package/dist/core/LoopLifecycle.d.ts +1 -0
  59. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  60. package/dist/core/LoopLifecycle.js +8 -0
  61. package/dist/core/LoopLifecycle.js.map +1 -1
  62. package/dist/core/LoopLifecycle.sql +10 -0
  63. package/dist/core/OperatorConfig.d.ts +6 -0
  64. package/dist/core/OperatorConfig.d.ts.map +1 -0
  65. package/dist/core/OperatorConfig.js +92 -0
  66. package/dist/core/OperatorConfig.js.map +1 -0
  67. package/dist/core/OverflowTurn.d.ts +11 -0
  68. package/dist/core/OverflowTurn.d.ts.map +1 -0
  69. package/dist/core/OverflowTurn.js +77 -0
  70. package/dist/core/OverflowTurn.js.map +1 -0
  71. package/dist/core/Owner.js +2 -2
  72. package/dist/core/Owner.js.map +1 -1
  73. package/dist/core/PacketBuilder.d.ts +3 -15
  74. package/dist/core/PacketBuilder.d.ts.map +1 -1
  75. package/dist/core/PacketBuilder.js +48 -121
  76. package/dist/core/PacketBuilder.js.map +1 -1
  77. package/dist/core/ProblemLog.js +1 -1
  78. package/dist/core/ProblemLog.js.map +1 -1
  79. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  80. package/dist/core/ProposalLifecycle.js +3 -23
  81. package/dist/core/ProposalLifecycle.js.map +1 -1
  82. package/dist/core/ProviderInstantiate.d.ts +9 -5
  83. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  84. package/dist/core/ProviderInstantiate.js +99 -104
  85. package/dist/core/ProviderInstantiate.js.map +1 -1
  86. package/dist/core/ResourceMutations.d.ts.map +1 -1
  87. package/dist/core/ResourceMutations.js +5 -3
  88. package/dist/core/ResourceMutations.js.map +1 -1
  89. package/dist/core/SchemeRegistry.d.ts +0 -1
  90. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  91. package/dist/core/SchemeRegistry.js +7 -11
  92. package/dist/core/SchemeRegistry.js.map +1 -1
  93. package/dist/core/ToolResources.d.ts +19 -0
  94. package/dist/core/ToolResources.d.ts.map +1 -0
  95. package/dist/core/ToolResources.js +122 -0
  96. package/dist/core/ToolResources.js.map +1 -0
  97. package/dist/core/Turn.d.ts +27 -0
  98. package/dist/core/Turn.d.ts.map +1 -0
  99. package/dist/core/Turn.js +43 -0
  100. package/dist/core/Turn.js.map +1 -0
  101. package/dist/core/Turn.sql +72 -0
  102. package/dist/core/TurnOps.d.ts +7 -0
  103. package/dist/core/TurnOps.d.ts.map +1 -0
  104. package/dist/core/TurnOps.js +63 -0
  105. package/dist/core/TurnOps.js.map +1 -0
  106. package/dist/core/TurnRunner.d.ts +12 -4
  107. package/dist/core/TurnRunner.d.ts.map +1 -1
  108. package/dist/core/TurnRunner.js +1045 -898
  109. package/dist/core/TurnRunner.js.map +1 -1
  110. package/dist/core/WorkerName.d.ts +1 -1
  111. package/dist/core/WorkerName.d.ts.map +1 -1
  112. package/dist/core/env-defaults.d.ts.map +1 -1
  113. package/dist/core/env-defaults.js +7 -5
  114. package/dist/core/env-defaults.js.map +1 -1
  115. package/dist/core/fork.d.ts.map +1 -1
  116. package/dist/core/fork.js +15 -4
  117. package/dist/core/fork.js.map +1 -1
  118. package/dist/core/fork.sql +57 -27
  119. package/dist/core/git-env.d.ts +0 -1
  120. package/dist/core/git-env.d.ts.map +1 -1
  121. package/dist/core/git-env.js +0 -3
  122. package/dist/core/git-env.js.map +1 -1
  123. package/dist/core/git-membership.d.ts.map +1 -1
  124. package/dist/core/git-membership.js +10 -26
  125. package/dist/core/git-membership.js.map +1 -1
  126. package/dist/core/git-state.d.ts.map +1 -1
  127. package/dist/core/git-state.js +13 -14
  128. package/dist/core/git-state.js.map +1 -1
  129. package/dist/core/operation-target-groups.d.ts +3 -0
  130. package/dist/core/operation-target-groups.d.ts.map +1 -0
  131. package/dist/core/operation-target-groups.js +53 -0
  132. package/dist/core/operation-target-groups.js.map +1 -0
  133. package/dist/core/packet-inject.d.ts +0 -1
  134. package/dist/core/packet-inject.d.ts.map +1 -1
  135. package/dist/core/packet-inject.js +6 -13
  136. package/dist/core/packet-inject.js.map +1 -1
  137. package/dist/core/packet-wire.d.ts +4 -0
  138. package/dist/core/packet-wire.d.ts.map +1 -1
  139. package/dist/core/packet-wire.js +208 -44
  140. package/dist/core/packet-wire.js.map +1 -1
  141. package/dist/core/plurnk-uri.d.ts +1 -1
  142. package/dist/core/plurnk-uri.d.ts.map +1 -1
  143. package/dist/core/plurnk-uri.js +3 -3
  144. package/dist/core/plurnk-uri.js.map +1 -1
  145. package/dist/core/teaching.d.ts.map +1 -1
  146. package/dist/core/teaching.js +4 -5
  147. package/dist/core/teaching.js.map +1 -1
  148. package/dist/core/worker-settings.d.ts +9 -0
  149. package/dist/core/worker-settings.d.ts.map +1 -0
  150. package/dist/core/worker-settings.js +25 -0
  151. package/dist/core/worker-settings.js.map +1 -0
  152. package/dist/core/workspace-settings.d.ts +0 -11
  153. package/dist/core/workspace-settings.d.ts.map +1 -1
  154. package/dist/core/workspace-settings.js +3 -47
  155. package/dist/core/workspace-settings.js.map +1 -1
  156. package/dist/digest/Digest.d.ts.map +1 -1
  157. package/dist/digest/Digest.js +164 -92
  158. package/dist/digest/Digest.js.map +1 -1
  159. package/dist/digest/digest.sql +8 -2
  160. package/dist/observe/genai.d.ts +9 -0
  161. package/dist/observe/genai.d.ts.map +1 -0
  162. package/dist/observe/genai.js +31 -0
  163. package/dist/observe/genai.js.map +1 -0
  164. package/dist/observe/spans.d.ts +3 -3
  165. package/dist/observe/spans.d.ts.map +1 -1
  166. package/dist/observe/spans.js +20 -5
  167. package/dist/observe/spans.js.map +1 -1
  168. package/dist/schemes/EffectPolicy.d.ts +3 -0
  169. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  170. package/dist/schemes/EffectPolicy.js +38 -6
  171. package/dist/schemes/EffectPolicy.js.map +1 -1
  172. package/dist/schemes/Exec.d.ts.map +1 -1
  173. package/dist/schemes/Exec.js +55 -13
  174. package/dist/schemes/Exec.js.map +1 -1
  175. package/dist/schemes/Log.d.ts +6 -2
  176. package/dist/schemes/Log.d.ts.map +1 -1
  177. package/dist/schemes/Log.js +73 -22
  178. package/dist/schemes/Log.js.map +1 -1
  179. package/dist/schemes/Log.sql +25 -7
  180. package/dist/schemes/Prompt.d.ts.map +1 -1
  181. package/dist/schemes/Prompt.js +1 -2
  182. package/dist/schemes/Prompt.js.map +1 -1
  183. package/dist/schemes/QuestionTool.d.ts +10 -0
  184. package/dist/schemes/QuestionTool.d.ts.map +1 -0
  185. package/dist/schemes/QuestionTool.js +81 -0
  186. package/dist/schemes/QuestionTool.js.map +1 -0
  187. package/dist/schemes/Skill.d.ts.map +1 -1
  188. package/dist/schemes/Skill.js +4 -1
  189. package/dist/schemes/Skill.js.map +1 -1
  190. package/dist/schemes/Worker.d.ts.map +1 -1
  191. package/dist/schemes/Worker.js +20 -3
  192. package/dist/schemes/Worker.js.map +1 -1
  193. package/dist/schemes/_entry-crud.sql +19 -1
  194. package/dist/schemes/_entry-find.d.ts +5 -3
  195. package/dist/schemes/_entry-find.d.ts.map +1 -1
  196. package/dist/schemes/_entry-find.js +102 -22
  197. package/dist/schemes/_entry-find.js.map +1 -1
  198. package/dist/schemes/_entry-find.sql +8 -6
  199. package/dist/schemes/_entry-graph.sql +2 -6
  200. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  201. package/dist/schemes/_entry-manifest.js +12 -1
  202. package/dist/schemes/_entry-manifest.js.map +1 -1
  203. package/dist/schemes/_search-index.d.ts.map +1 -1
  204. package/dist/schemes/_search-index.js +37 -25
  205. package/dist/schemes/_search-index.js.map +1 -1
  206. package/dist/server/Daemon.d.ts +58 -7
  207. package/dist/server/Daemon.d.ts.map +1 -1
  208. package/dist/server/Daemon.js +551 -113
  209. package/dist/server/Daemon.js.map +1 -1
  210. package/dist/server/DrainSupervisor.d.ts +12 -9
  211. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  212. package/dist/server/DrainSupervisor.js +59 -10
  213. package/dist/server/DrainSupervisor.js.map +1 -1
  214. package/dist/server/client-input.d.ts +5 -2
  215. package/dist/server/client-input.d.ts.map +1 -1
  216. package/dist/server/client-input.js +53 -34
  217. package/dist/server/client-input.js.map +1 -1
  218. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  219. package/dist/server/dispatch-as-plurnk.js +28 -6
  220. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  221. package/dist/server/drain.sql +26 -11
  222. package/dist/server/envelope.d.ts +1 -1
  223. package/dist/server/envelope.d.ts.map +1 -1
  224. package/dist/server/envelope.js +4 -4
  225. package/dist/server/envelope.js.map +1 -1
  226. package/dist/server/envelope.sql +25 -1
  227. package/dist/server/lifecycle-recovery.sql +11 -1
  228. package/dist/server/logEntry.d.ts +2 -1
  229. package/dist/server/logEntry.d.ts.map +1 -1
  230. package/dist/server/logEntry.js +3 -2
  231. package/dist/server/logEntry.js.map +1 -1
  232. package/dist/server/logEntry.sql +7 -0
  233. package/dist/server/loop-model.d.ts +2 -2
  234. package/dist/server/loop-model.d.ts.map +1 -1
  235. package/dist/server/loop-model.js +23 -33
  236. package/dist/server/loop-model.js.map +1 -1
  237. package/dist/server/loopDocs.d.ts.map +1 -1
  238. package/dist/server/loopDocs.js +61 -10
  239. package/dist/server/loopDocs.js.map +1 -1
  240. package/dist/server/loopDocs.sql +4 -2
  241. package/dist/server/model-catalog.d.ts +3 -0
  242. package/dist/server/model-catalog.d.ts.map +1 -0
  243. package/dist/server/model-catalog.js +83 -0
  244. package/dist/server/model-catalog.js.map +1 -0
  245. package/dist/server/model-route.d.ts +7 -0
  246. package/dist/server/model-route.d.ts.map +1 -0
  247. package/dist/server/model-route.js +47 -0
  248. package/dist/server/model-route.js.map +1 -0
  249. package/dist/server/module-discovery.d.ts +13 -0
  250. package/dist/server/module-discovery.d.ts.map +1 -0
  251. package/dist/server/module-discovery.js +78 -0
  252. package/dist/server/module-discovery.js.map +1 -0
  253. package/dist/server/skillDocs.d.ts +9 -0
  254. package/dist/server/skillDocs.d.ts.map +1 -0
  255. package/dist/server/skillDocs.js +212 -0
  256. package/dist/server/skillDocs.js.map +1 -0
  257. package/dist/server/skillDocs.sql +14 -0
  258. package/dist/service.d.ts.map +1 -1
  259. package/dist/service.js +182 -123
  260. package/dist/service.js.map +1 -1
  261. package/migrations/001_schema.sql +424 -65
  262. package/package.json +37 -37
  263. package/dist/core/ExecutableTools.d.ts +0 -11
  264. package/dist/core/ExecutableTools.d.ts.map +0 -1
  265. package/dist/core/ExecutableTools.js +0 -49
  266. package/dist/core/ExecutableTools.js.map +0 -1
  267. package/dist/core/JournalTurn.d.ts +0 -9
  268. package/dist/core/JournalTurn.d.ts.map +0 -1
  269. package/dist/core/JournalTurn.js +0 -14
  270. package/dist/core/JournalTurn.js.map +0 -1
  271. package/dist/core/JournalTurn.sql +0 -10
  272. package/dist/core/git-iso.d.ts +0 -13
  273. package/dist/core/git-iso.d.ts.map +0 -1
  274. package/dist/core/git-iso.js +0 -267
  275. package/dist/core/git-iso.js.map +0 -1
  276. package/dist/core/search-gate.d.ts +0 -17
  277. package/dist/core/search-gate.d.ts.map +0 -1
  278. package/dist/core/search-gate.js +0 -77
  279. package/dist/core/search-gate.js.map +0 -1
  280. package/dist/digest/Digest.sql +0 -1
@@ -0,0 +1,92 @@
1
+ import { constants } from "node:fs";
2
+ import { access, mkdir, readFile, rmdir, unlink, writeFile } from "node:fs/promises";
3
+ const exists = async (path) => access(path, constants.F_OK)
4
+ .then(() => true)
5
+ .catch(() => false);
6
+ // {§operator-config-discovery} — the user owns this one ordinary dotenv file.
7
+ // Package defaults remain package-owned and are projected on demand.
8
+ export default class OperatorConfig {
9
+ static renderSeed() {
10
+ return [
11
+ "# Plurnk user configuration. This file is yours and is never overwritten.",
12
+ "# Full installed options: plurnk-service config defaults",
13
+ "# Validate this cascade: plurnk-service config check",
14
+ "#",
15
+ "# Choose one model profile by uncommenting its complete block.",
16
+ "",
17
+ "# PLURNK.AI — the proprietary Plurnk endpoint.",
18
+ "# PLURNK_MODEL_plurnk=\"plurnk/plurnk\"",
19
+ "# PLURNK_API_KEY=\"...\"",
20
+ "# PLURNK_MODEL=plurnk",
21
+ "",
22
+ "# OPENROUTER — bring any supported OpenRouter model.",
23
+ "# PLURNK_MODEL_openrouter=\"openrouter/qwen/qwen3-coder\"",
24
+ "# OPENROUTER_API_KEY=\"...\"",
25
+ "# PLURNK_MODEL=openrouter",
26
+ "",
27
+ "# LOCAL QWEN — an OpenAI-compatible llama-server with the Qwen GBNF rail.",
28
+ "# PLURNK_MODEL_local=\"openai/qwen\"",
29
+ "# PLURNK_BASEURL_local=http://127.0.0.1:8080/v1",
30
+ "# PLURNK_PROVIDERS_GBNF_local=plurnk.qwen.gbnf",
31
+ "# PLURNK_MODEL=local",
32
+ "",
33
+ "# FIND-SKILLS ships enabled inside Plurnk. Project skills live in",
34
+ "# .agents/skills; user-global skills live in ~/.agents/skills.",
35
+ "",
36
+ "# OPTIONAL BRAVE SEARCH MCP — uncomment the complete block and provide the key.",
37
+ "# BRAVE_API_KEY=\"...\"",
38
+ "# PLURNK_MCP_BRAVE=npx",
39
+ "# PLURNK_MCP_BRAVE_ARGS=[\"-y\",\"@brave/brave-search-mcp-server@2.1.0\"]",
40
+ "# PLURNK_MCP_BRAVE_ENV={\"BRAVE_API_KEY\":\"${BRAVE_API_KEY}\"}",
41
+ "# PLURNK_MCP_BRAVE_TOOLS=[\"brave_web_search\",\"brave_news_search\"]",
42
+ "# PLURNK_MCP_BRAVE_READ=[\"brave_web_search\",\"brave_news_search\"]",
43
+ "# PLURNK_MCP_ENABLED=[\"brave\"]",
44
+ "",
45
+ "# OPTIONAL TAVILY HTML MATERIALIZATION — install",
46
+ "# @plurnk/plurnk-schemes-http-tavily, then uncomment both lines.",
47
+ "# TAVILY_API_KEY=\"...\"",
48
+ "# PLURNK_SCHEMES_HTTP_MATERIALIZER=tavily-extract",
49
+ "",
50
+ ].join("\n");
51
+ }
52
+ static async ensure(paths, policySource) {
53
+ if (await exists(paths.configDir))
54
+ return false;
55
+ const policy = await readFile(policySource, "utf8");
56
+ const firstCreated = await mkdir(paths.configDir, { recursive: true, mode: 0o700 });
57
+ const createdFiles = [];
58
+ try {
59
+ await writeFile(paths.configFile, OperatorConfig.renderSeed(), { encoding: "utf8", flag: "wx", mode: 0o600 });
60
+ createdFiles.push(paths.configFile);
61
+ await writeFile(paths.policyFile, policy, { encoding: "utf8", flag: "wx", mode: 0o600 });
62
+ createdFiles.push(paths.policyFile);
63
+ return true;
64
+ }
65
+ catch (cause) {
66
+ const rollbackErrors = [];
67
+ for (const file of createdFiles.toReversed()) {
68
+ try {
69
+ await unlink(file);
70
+ }
71
+ catch (rollbackCause) {
72
+ if (rollbackCause.code !== "ENOENT")
73
+ rollbackErrors.push(rollbackCause);
74
+ }
75
+ }
76
+ if (firstCreated !== undefined) {
77
+ try {
78
+ await rmdir(paths.configDir);
79
+ }
80
+ catch (rollbackCause) {
81
+ if (rollbackCause.code !== "ENOENT")
82
+ rollbackErrors.push(rollbackCause);
83
+ }
84
+ }
85
+ if (rollbackErrors.length > 0) {
86
+ throw new AggregateError([cause, ...rollbackErrors], "operator config bootstrap failed and rollback was incomplete");
87
+ }
88
+ throw cause;
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=OperatorConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorConfig.js","sourceRoot":"","sources":["../../src/core/OperatorConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGrF,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;KAChF,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAExB,8EAA8E;AAC9E,qEAAqE;AACrE,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,MAAM,CAAC,UAAU;QACb,OAAO;YACH,2EAA2E;YAC3E,0DAA0D;YAC1D,sDAAsD;YACtD,GAAG;YACH,gEAAgE;YAChE,EAAE;YACF,gDAAgD;YAChD,yCAAyC;YACzC,0BAA0B;YAC1B,uBAAuB;YACvB,EAAE;YACF,sDAAsD;YACtD,2DAA2D;YAC3D,8BAA8B;YAC9B,2BAA2B;YAC3B,EAAE;YACF,2EAA2E;YAC3E,sCAAsC;YACtC,iDAAiD;YACjD,gDAAgD;YAChD,sBAAsB;YACtB,EAAE;YACF,mEAAmE;YACnE,gEAAgE;YAChE,EAAE;YACF,iFAAiF;YACjF,yBAAyB;YACzB,wBAAwB;YACxB,2EAA2E;YAC3E,iEAAiE;YACjE,uEAAuE;YACvE,sEAAsE;YACtE,kCAAkC;YAClC,EAAE;YACF,kDAAkD;YAClD,kEAAkE;YAClE,0BAA0B;YAC1B,mDAAmD;YACnD,EAAE;SACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAgB,EAAE,YAAoB;QACtD,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9G,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzF,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,cAAc,GAAc,EAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAC3B,OAAO,aAAa,EAAE,CAAC;oBACnB,IAAK,aAAuC,CAAC,IAAI,KAAK,QAAQ;wBAAE,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACvG,CAAC;YACL,CAAC;YACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBAAC,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAAC,CAAC;gBACrC,OAAO,aAAa,EAAE,CAAC;oBACnB,IAAK,aAAuC,CAAC,IAAI,KAAK,QAAQ;wBAAE,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACvG,CAAC;YACL,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,EAAE,8DAA8D,CAAC,CAAC;YACzH,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,11 @@
1
+ import { type FoldStatement, type PlanStatement, type SendStatement } from "@plurnk/plurnk-contracts";
2
+ import type { Db } from "./Db.ts";
3
+ export type OverflowFold = {
4
+ readonly statement: FoldStatement;
5
+ };
6
+ export default class OverflowTurn {
7
+ static plan(db: Db, loopId: number, turnId: number): Promise<OverflowFold[]>;
8
+ static planStatement(): PlanStatement;
9
+ static sendStatement(): SendStatement;
10
+ }
11
+ //# sourceMappingURL=OverflowTurn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowTurn.d.ts","sourceRoot":"","sources":["../../src/core/OverflowTurn.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAkBlC,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;CACrC,CAAC;AAoCF,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,OAAa,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBjF;IAED,MAAM,CAAC,aAAa,IAAI,aAAa,CAOpC;IAED,MAAM,CAAC,aAAa,IAAI,aAAa,CAUpC;CACJ"}
@@ -0,0 +1,77 @@
1
+ import { UNKNOWN_POSITION, } from "@plurnk/plurnk-contracts";
2
+ import LogBody from "./LogBody.js";
3
+ import LogEntryProjection from "./LogEntryProjection.js";
4
+ import LogVisibility from "./LogVisibility.js";
5
+ const OVERFLOW_PLAN = "Automatically FOLD log bodies newly active at token-budget overflow.";
6
+ const OVERFLOW_SEND = "Next: YOU MUST ONLY FOLD, KILL, or trim ALL superseded, stale, or irrelevant log content in bulk in the next turn.";
7
+ const targetFor = (coordinate) => ({
8
+ kind: "url",
9
+ raw: `log:///${coordinate}`,
10
+ scheme: "log",
11
+ username: null,
12
+ password: null,
13
+ hostname: null,
14
+ port: null,
15
+ pathname: `/${coordinate}`,
16
+ query: null,
17
+ fragment: null,
18
+ });
19
+ const foldFor = (row) => {
20
+ const coordinate = LogEntryProjection.coordinate(row.coordinate, row);
21
+ const statement = {
22
+ op: "FOLD",
23
+ annotation: null,
24
+ delimiter: "",
25
+ signal: ["+_plurnk", "+overflow"],
26
+ target: targetFor(coordinate),
27
+ lineMarker: { marks: [1, -1] },
28
+ body: null,
29
+ position: UNKNOWN_POSITION,
30
+ };
31
+ return { statement };
32
+ };
33
+ // {§overflow-turn-curation} — deterministic selection only. Execution remains
34
+ // ordinary Dispatcher FOLD, so Log owns the visibility transaction and effect
35
+ // evidence exactly as it does for model-authored curation.
36
+ export default class OverflowTurn {
37
+ static async plan(db, loopId, turnId) {
38
+ const causalRows = await db.overflow_turn_causal_rows.all({
39
+ loop_id: loopId,
40
+ turn_id: turnId,
41
+ });
42
+ return causalRows.flatMap((row) => {
43
+ const body = LogBody.resolve({
44
+ op: row.op,
45
+ attrs: row.attrs,
46
+ tx: row.tx,
47
+ rx: row.rx,
48
+ mimetypeTx: row.mimetype_tx,
49
+ mimetypeRx: row.mimetype_rx,
50
+ });
51
+ const lines = LogVisibility.lineCount(body.content);
52
+ return lines === 0 || LogVisibility.fullyFolded(LogVisibility.parse(row.folded), lines)
53
+ ? []
54
+ : [foldFor(row)];
55
+ });
56
+ }
57
+ static planStatement() {
58
+ return {
59
+ op: "PLAN", delimiter: "", annotation: null,
60
+ signal: null, target: null, lineMarker: null,
61
+ body: OVERFLOW_PLAN,
62
+ position: UNKNOWN_POSITION,
63
+ };
64
+ }
65
+ static sendStatement() {
66
+ return {
67
+ op: "SEND", delimiter: "", annotation: null,
68
+ signal: 102, target: null, lineMarker: null,
69
+ body: {
70
+ raw: OVERFLOW_SEND,
71
+ json: null,
72
+ },
73
+ position: UNKNOWN_POSITION,
74
+ };
75
+ }
76
+ }
77
+ //# sourceMappingURL=OverflowTurn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowTurn.js","sourceRoot":"","sources":["../../src/core/OverflowTurn.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,GAKnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AACzD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAmB/C,MAAM,aAAa,GAAG,sEAAsE,CAAC;AAC7F,MAAM,aAAa,GAAG,oHAAoH,CAAC;AAE3I,MAAM,SAAS,GAAG,CAAC,UAAkB,EAAW,EAAE,CAAC,CAAC;IAChD,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,UAAU,UAAU,EAAE;IAC3B,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI,UAAU,EAAE;IAC1B,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACjB,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAgB,EAAE;IAC/C,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,SAAS,GAAkB;QAC7B,EAAE,EAAE,MAAM;QACV,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACjC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC;QAC7B,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9B,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,gBAAgB;KAC7B,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,8EAA8E;AAC9E,8EAA8E;AAC9E,2DAA2D;AAC3D,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAM,EAAE,MAAc,EAAE,MAAc;QACpD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAc;YACnE,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAClB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;gBACzB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,UAAU,EAAE,GAAG,CAAC,WAAW;gBAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;aAC9B,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,KAAK,KAAK,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;gBACnF,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,aAAa;QAChB,OAAO;YACH,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI;YAC3C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI;YAC5C,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;IAED,MAAM,CAAC,aAAa;QAChB,OAAO;YACH,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI;YAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI;YAC3C,IAAI,EAAE;gBACF,GAAG,EAAE,aAAa;gBAClB,IAAI,EAAE,IAAI;aACb;YACD,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;CACJ"}
@@ -11,7 +11,7 @@ export default class Owner {
11
11
  const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: "commons" });
12
12
  if (existing !== undefined)
13
13
  return existing.id;
14
- const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "commons", origin: "plurnk" });
14
+ const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "commons", origin: "_plurnk" });
15
15
  if (created === undefined)
16
16
  throw new Error("Owner.commonsId: commons worker insert returned no row");
17
17
  return created.id;
@@ -21,7 +21,7 @@ export default class Owner {
21
21
  const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: "plurnk" });
22
22
  if (existing !== undefined)
23
23
  return existing.id;
24
- const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "plurnk", origin: "plurnk" });
24
+ const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "plurnk", origin: "_plurnk" });
25
25
  if (created === undefined)
26
26
  throw new Error("Owner.kernelId: kernel worker insert returned no row");
27
27
  return created.id;
@@ -1 +1 @@
1
- {"version":3,"file":"Owner.js","sourceRoot":"","sources":["../../src/core/Owner.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,0FAA0F;AAC1F,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,0FAA0F;IAC1F,yFAAyF;IACzF,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAM,EAAE,WAAmB;QAC9C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1H,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACrG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,2FAA2F;IAC3F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAM,EAAE,WAAmB;QAC7C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,yFAAyF;IACzF,2FAA2F;IAC3F,wFAAwF;IACxF,yFAAyF;IACzF,kCAAkC;IAClC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAmC,EAAE,GAAwB;QACzF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAwB,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrI,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;CACJ"}
1
+ {"version":3,"file":"Owner.js","sourceRoot":"","sources":["../../src/core/Owner.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,0FAA0F;AAC1F,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,0FAA0F;IAC1F,yFAAyF;IACzF,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAM,EAAE,WAAmB;QAC9C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1H,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACrG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,2FAA2F;IAC3F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAM,EAAE,WAAmB;QAC7C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACtI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,yFAAyF;IACzF,2FAA2F;IAC3F,wFAAwF;IACxF,yFAAyF;IACzF,kCAAkC;IAClC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAmC,EAAE,GAAwB;QACzF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAwB,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrI,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;CACJ"}
@@ -32,23 +32,11 @@ export default class PacketBuilder {
32
32
  transientOpenLogEntryId?: number | null;
33
33
  promptProjection?: "automatic" | "withheld";
34
34
  }): Promise<RequestPacket>;
35
- docEntries(workspaceId: number): Promise<Array<{
36
- name: string;
35
+ referenceEntries(workspaceId: number): Promise<Array<{
36
+ pathname: string;
37
37
  content: string;
38
38
  }>>;
39
- enforceBudget({ packet, provider, loopId, turnId, recordOverflow, rebuild }: {
40
- packet: RequestPacket;
41
- provider: Provider;
42
- loopId: number;
43
- turnId: number;
44
- recordOverflow: (overflow: CurationOverflow) => Promise<void>;
45
- rebuild: () => Promise<RequestPacket>;
46
- }): Promise<{
47
- packet: RequestPacket;
48
- fit: boolean;
49
- boundaryRolledBack: boolean;
50
- }>;
51
- rollbackNewestBoundary(loopId: number, turnId: number): Promise<void>;
39
+ curationOverflow(packet: RequestPacket, provider: Provider): CurationOverflow | null;
52
40
  buildFailurePointers(loopId: number, currentTurnSeq: number): Promise<Array<{
53
41
  status: number;
54
42
  coordinate: string;
@@ -1 +1 @@
1
- {"version":3,"file":"PacketBuilder.d.ts","sourceRoot":"","sources":["../../src/core/PacketBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PacketBuilder.d.ts","sourceRoot":"","sources":["../../src/core/PacketBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgBhD,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,mBAAmB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AA0FtE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,CAAC,OAAO,OAAO,aAAa;;IAU9B,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;QACpC,EAAE,EAAE,EAAE,CAAC;QACP,OAAO,EAAE,cAAc,CAAC;QACxB,SAAS,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAC;KACjD,EAQA;IAiCD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAEnD;IAIK,kBAAkB,CAAC,EACrB,eAAe,EAAE,YAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAY,EACpH,uBAA8B,EAC9B,gBAA8B,GACjC,EAAE;QACC,eAAe,EAAE,WAAW,EAAE,CAAC;QAE/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAEtD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QAInB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAG5B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAGxC,gBAAgB,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;KAC/C,GAAG,OAAO,CAAC,aAAa,CAAC,CA2HzB;IAYK,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAuBjG;IAKD,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAInF;IAKK,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9E,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC,CASF;CAqFJ"}
@@ -1,11 +1,10 @@
1
1
  var _a;
2
2
  import { renderAddress, promptLoopPrefix } from "./plurnk-uri.js";
3
3
  import { contentWeight } from "./content-weight.js";
4
- import { docsExcludeSet } from "./teaching.js";
5
4
  import { Policy } from "@plurnk/plurnk-execs";
6
5
  import WorkspaceSettings from "./workspace-settings.js";
7
6
  import LoopFlagsReader from "./LoopFlagsReader.js";
8
- import { readPacketInject, readSystemPolicy, readProjectPolicy } from "./packet-inject.js";
7
+ import { readPacketInject, readSystemPolicy } from "./packet-inject.js";
9
8
  import { readFile } from "node:fs/promises";
10
9
  import Paths from "../Paths.js";
11
10
  import { readTeachingSource } from "./teaching-corpus.js";
@@ -14,11 +13,12 @@ import { readTeachingSource } from "./teaching-corpus.js";
14
13
  // drift between wire and digest possible.
15
14
  import PacketWire from "./packet-wire.js";
16
15
  import LogEntryProjection from "./LogEntryProjection.js";
17
- import { scopeEnvToAlias, resolveActiveAlias } from "@plurnk/plurnk-providers";
16
+ import { scopeEnvToAlias, resolveActiveRoute } from "@plurnk/plurnk-providers";
18
17
  import ProviderInstantiate from "./ProviderInstantiate.js";
19
18
  import BudgetReadout from "./BudgetReadout.js";
20
- import ExecutableTools from "./ExecutableTools.js";
21
19
  import LineAnchors from "../content/line-anchors.js";
20
+ import ToolResources from "./ToolResources.js";
21
+ import LogVisibility from "./LogVisibility.js";
22
22
  const trimHorizontal = (value) => value.replace(/^[\t ]+|[\t ]+$/gu, "");
23
23
  const tableCells = (line) => {
24
24
  if (!line.startsWith("|") || !line.endsWith("|"))
@@ -99,8 +99,8 @@ const readRequiredPercentFrom = (env, name) => {
99
99
  }
100
100
  return percent / 100;
101
101
  };
102
- // Packet assembly (SPEC {§packet-assembly}) + the budget grinder ({§grinder}):
103
- // builds the spec'd request packet, measures it, and reclaims window on overflow.
102
+ // Packet assembly ({§packet-assembly}) and model-facing budget admission
103
+ // ({§overflow-turn}). Visibility changes stay in the ordinary FOLD owner.
104
104
  class PacketBuilder {
105
105
  #db;
106
106
  #schemes;
@@ -114,7 +114,7 @@ class PacketBuilder {
114
114
  this.#schemes = schemes;
115
115
  this.#executors = executors;
116
116
  // Retired capacity knobs fail at boot rather than silently becoming inert.
117
- const bootAlias = resolveActiveAlias(process.env)?.alias ?? "";
117
+ const bootAlias = resolveActiveRoute(process.env)?.alias ?? "";
118
118
  this.#shedRetiredCapacityKnobs();
119
119
  this.#promptProjectionFor(bootAlias);
120
120
  }
@@ -154,9 +154,12 @@ class PacketBuilder {
154
154
  // {§packet-stored-shape} — assemble the system/user request before the
155
155
  // provider call; complete the same record with the provider response.
156
156
  async buildRequestPacket({ initialMessages, requirements = "", workspaceId, workerId, loopId, currentTurnSeq, provider, gitStatus, notices = [], transientOpenLogEntryId = null, promptProjection = "automatic", }) {
157
+ // {§loop-flags-effective-read} Validate active-loop policy before any
158
+ // packet assembly or provider spend, independently of its presentation.
159
+ await LoopFlagsReader.read(this.#db, loopId);
157
160
  const byRole = (role) => initialMessages.filter((m) => m.role === role).map((m) => m.content).join("\n\n");
158
161
  // plurnk.md (grammar/dialects) ONLY — the definition is the hot-path grammar.
159
- // The resource catalogue is its own `schemes` section below tools ({§schemes-directory}),
162
+ // The resource catalogue is its own `schemes` section ({§schemes-directory}),
160
163
  // NOT appended here: the language teaching is scheme-agnostic, so the service advertises
161
164
  // the installed scheme set at packet-time via SchemeRegistry.teach().
162
165
  const system_definition = compactDefinitionTables(byRole("system"));
@@ -189,11 +192,8 @@ class PacketBuilder {
189
192
  const log = await this.#buildLog(workerId, transientOpenLogEntryId);
190
193
  const failures = await this.buildFailurePointers(loopId, currentTurnSeq);
191
194
  const weighContent = contentWeight;
192
- // {§tools-loop-affinity}: teaching and dispatch resolve the same loop flags.
193
- const activeSchemes = this.#schemes.resolveForLoop(await LoopFlagsReader.read(this.#db, loopId), workspaceId);
194
- const tools = this.#collectTools(workspaceId, await this.#workspaceEnabled(workspaceId), await WorkspaceSettings.questionsEnabled(this.#db, workspaceId), activeSchemes);
195
195
  const curationBudget = this.curationBudgetFor(provider);
196
- const alias = ProviderInstantiate.aliasOf(provider) ?? resolveActiveAlias(process.env)?.alias ?? "";
196
+ const alias = ProviderInstantiate.configurationAliasOf(provider) ?? "";
197
197
  const promptProjectionWeight = promptProjection === "withheld"
198
198
  ? 0
199
199
  : curationBudget === null
@@ -204,9 +204,9 @@ class PacketBuilder {
204
204
  // specified at {§packet-cache-monotone}. Budget placeholders resolve only
205
205
  // after trusted whole-list transforms establish the packet being measured.
206
206
  const inject = await readPacketInject(); // {§packet-inject} — per-turn; a broken configured path fails hard
207
- const workspaceRoot = (await this.#db.envelope_get_workspace.get({ id: workspaceId }))?.project_root ?? null;
208
- const systemPolicy = await readSystemPolicy(); // ~/.plurnk/AGENTS.md (or PLURNK_SERVICE_POLICY)
209
- const projectPolicy = await readProjectPolicy(workspaceRoot); // <projectRoot>/AGENTS.md (or PLURNK_SERVICE_PROJECT)
207
+ const systemPolicy = await readSystemPolicy(); // XDG config AGENTS.md (or PLURNK_SERVICE_POLICY)
208
+ // {§turn0-agents-stunt} — the PROJECT AGENTS.md rides turn 0 as a foisted
209
+ // READ (LoopDocs → worker://plurnk/agents.md), not the system prompt.
210
210
  // {§packet-git-status}/{§worker-branch-batch-return} — only the direct,
211
211
  // currently running branch-batch child receives the transaction's
212
212
  // commit-and-clean return condition. Ordinary Git state remains purely
@@ -222,14 +222,9 @@ class PacketBuilder {
222
222
  .map((r) => ({ status: r.status, path: `worker://${r.name}` }));
223
223
  const defaults = [
224
224
  { name: "definition", slot: "system", header: null, content: system_definition },
225
- // Stable privileged policy leads loop-dependent capabilities for
225
+ // Stable privileged policy leads capability teaching for
226
226
  // prefix-cache locality. Empty policy sections simply disappear.
227
227
  { name: "system-policy", slot: "system", header: "Policy", content: systemPolicy ?? "" },
228
- { name: "project-policy", slot: "system", header: "Project Policy", content: projectPolicy ?? "" },
229
- { name: "tools", slot: "system", header: "Registered Tools", content: tools.executors },
230
- ...(tools.optionalOperations.length > 0
231
- ? [{ name: "optional-operations", slot: "system", header: "Enabled Optional Operations", content: tools.optionalOperations }]
232
- : []),
233
228
  { name: "schemes", slot: "system", header: "Resources", content: this.#schemes.teach(workspaceId) },
234
229
  ...(inject !== null ? [{ name: "inject", slot: "system", header: "Operator Notes", content: inject }] : []),
235
230
  // The append-mostly log leads volatile user status ({§packet-cache-monotone}).
@@ -249,7 +244,7 @@ class PacketBuilder {
249
244
  { name: "git", slot: "user", header: "Git Status", content: PacketWire.renderGit(gitStatus, branchAssignment?.branch ?? null) },
250
245
  // Familiar token language is a deliberate final model projection;
251
246
  // internally this is curation weight, never provider admission.
252
- { name: "budget", slot: "user", header: "Budget", content: budgetReadout },
247
+ { name: "budget", slot: "user", header: "Context Token Budget", content: budgetReadout },
253
248
  // The prompts section closes the status clump as a paths-only list;
254
249
  // bodies arrive through first-class prompt rows.
255
250
  { name: "prompt", slot: "user", header: "Active User Prompts", content: prompt },
@@ -275,120 +270,50 @@ class PacketBuilder {
275
270
  const renderWeight = weighContent(PacketWire.renderSlot(sections, "system")) + weighContent(PacketWire.renderSlot(sections, "user"));
276
271
  return { weight: renderWeight, sections, attributions: [] };
277
272
  }
278
- // {§operator-config-workspace-execs} — the capability sheet and executor
279
- // documents share one workspace predicate with dispatch.
273
+ // {§operator-config-workspace-execs} — tool resources and dispatch share one
274
+ // workspace predicate.
280
275
  async #workspaceEnabled(workspaceId) {
281
276
  const { execs } = await WorkspaceSettings.read(this.#db, workspaceId);
282
277
  if (execs === null)
283
278
  return () => true;
284
279
  return (tag) => Policy.isEnabled(tag, execs);
285
280
  }
286
- // The complete ## Registered Tools contract table. {§tools-capability-sheet}
287
- #collectTools(workspaceId, workspaceEnabled, questionsOn = false, activeSchemes) {
288
- // Registered executors and optional operations remain distinct sheets.
289
- // The former is a contract table; only the latter is an operation example fence.
290
- // {§tools-capability-sheet} {§packet-operation-fences}
291
- const executorTools = [];
292
- const notices = [];
293
- // {§send-300-choices} — the one-liner rides ONLY where questions are enabled (allowed +
294
- // client-requested); the fuller questions.md doc injects through docEntries the same way.
295
- const optionalOperations = questionsOn
296
- ? "```plurnk\n## SEND0 [300]\nDeploy where?;staging;production\n```"
297
- : "";
298
- const executors = this.#executors();
299
- if (executors !== undefined) {
300
- const excluded = docsExcludeSet();
301
- const runtimes = executors.availableRuntimes(workspaceId);
302
- // {§tools-capability-sheet} The table is keyed on the exec scheme (the op face,
303
- // excludedInAsk). When inactive, say so positively: plurnk.md
304
- // still teaches EXEC as language, and silent absence measurably invites confabulated runtimes.
305
- const execActive = activeSchemes === undefined || activeSchemes.has("exec");
306
- if (runtimes.length > 0 && !execActive) {
307
- notices.push("EXEC operations are disabled for this loop — do not run commands; answer or advise directly");
308
- }
309
- else {
310
- for (const tag of runtimes) {
311
- if (excluded.has(tag))
312
- continue; // {§tools-capability-sheet} — exclude drops the row and doc
313
- if (!workspaceEnabled(tag))
314
- continue; // {§operator-config-workspace-execs}
315
- const entry = executors.entry(tag, workspaceId);
316
- if (entry !== undefined) {
317
- const registry = executors.toolRegistry(tag, workspaceId);
318
- if (registry === null) {
319
- executorTools.push({ runtime: tag, invocation: entry.invocation });
320
- }
321
- else {
322
- executorTools.push(...registry.tools.map((tool) => ({
323
- runtime: tag,
324
- invocation: tool.invocation,
325
- exactTarget: tool.target,
326
- })));
327
- }
328
- }
329
- }
330
- }
331
- }
332
- const parts = [...notices];
333
- const directory = ExecutableTools.render(executorTools);
334
- if (directory !== "")
335
- parts.push(directory);
336
- return { executors: parts.join("\n\n"), optionalOperations };
337
- }
338
- // #note12 — the plugin-provided reference docs (schemes' + execs' `documentation`),
339
- // materialized at worker://plurnk/docs/<name>.md by LoopDocs (like operator
340
- // docs) so the catalog can expose each doc's curation weight.
341
- async docEntries(workspaceId) {
342
- const out = await this.#schemes.docs(workspaceId); // scheme docs already drop PLURNK_SERVICE_DOCS_EXCLUDE names
343
- // {§send-300-choices} {§teaching-corpus} — the conditional teaching: questions.md
344
- // materializes ONLY for enabled workspaces — the same conditional-doc mechanism as the EXEC
345
- // plugin docs below. An un-enabled workspace is never taught the op it can't use.
346
- if (await WorkspaceSettings.questionsEnabled(this.#db, workspaceId)) {
347
- const q = await this.#schemes.questionsDoc();
348
- if (q.length > 0)
349
- out.push({ name: "questions", content: q });
350
- }
281
+ // {§schemes-self-doc-materialization} {§tools-resource-materialization} —
282
+ // one reserved reference set, materialized by LoopDocs.
283
+ async referenceEntries(workspaceId) {
284
+ const out = (await this.#schemes.docs(workspaceId)).map(({ name, content }) => ({
285
+ pathname: `/skills/plurnk/${name}.md`,
286
+ content,
287
+ }));
351
288
  const executors = this.#executors();
352
289
  if (executors !== undefined) {
353
- const excluded = docsExcludeSet();
354
290
  const workspaceEnabled = await this.#workspaceEnabled(workspaceId); // {§operator-config-workspace-execs}
355
291
  for (const tag of executors.availableRuntimes(workspaceId)) {
356
- if (excluded.has(tag))
357
- continue; // {§tools-capability-sheet} — exec docs honor the same exclude
358
292
  if (!workspaceEnabled(tag))
359
293
  continue;
360
294
  const entry = executors.entry(tag, workspaceId);
361
- const doc = executors.toolRegistry(tag, workspaceId)?.documentation ?? entry?.documentation;
362
- if (doc !== undefined && doc.length > 0)
363
- out.push({ name: tag, content: doc });
295
+ if (entry === undefined)
296
+ continue;
297
+ out.push(...ToolResources.render({
298
+ runtime: tag,
299
+ summary: entry.summary,
300
+ invocation: entry.invocation,
301
+ details: entry.details,
302
+ registry: executors.toolRegistry(tag, workspaceId),
303
+ ...(entry.resourcesPath === undefined ? {} : { resourcesPath: entry.resourcesPath }),
304
+ }));
364
305
  }
365
306
  }
366
- return out;
307
+ return out.toSorted((left, right) => left.pathname.localeCompare(right.pathname));
367
308
  }
368
- // SPEC {§grinder} — the budget grinder. Runs pre-LLM (in runTurn, after the packet
369
- // is built, before provider.generate); fires only when curation weight exceeds
370
- // the provider-derived curation budget. One
371
- // reversible rule: roll back context introduced by the NEWEST turn boundary —
372
- // rows born there plus exact older rows it transitioned folded→open — then
373
- // rebuild and re-measure.
374
- // {§grinder-overflow-only} — fires only on actual overflow, never speculatively
375
- async enforceBudget({ packet, provider, loopId, turnId, recordOverflow, rebuild }) {
309
+ // {§overflow-turn-only} — a pure admission fact. TurnRunner owns the
310
+ // producer-neutral recovery transition; PacketBuilder never mutates log
311
+ // visibility while measuring a candidate request.
312
+ curationOverflow(packet, provider) {
376
313
  const budget = this.curationBudgetFor(provider);
377
- const measure = (p) => p.weight;
378
- if (budget === null || measure(packet) <= budget) {
379
- return { packet, fit: true, boundaryRolledBack: false };
380
- }
381
- const weight = measure(packet);
382
- await recordOverflow({ weight, budget, excess: weight - budget });
383
- // ONE rule, every turn ({§grinder-layer1-rollback}): atomically fold/tag
384
- // context introduced by the newest boundary. Other older history remains
385
- // model-owned; remaining curation debt is neither failure nor strike.
386
- await this.#db.engine_grinder_fold_newest_turn({ loop_id: loopId, turn_id: turnId });
387
- const current = await rebuild();
388
- return { packet: current, fit: measure(current) <= budget, boundaryRolledBack: true };
389
- }
390
- async rollbackNewestBoundary(loopId, turnId) {
391
- await this.#db.engine_grinder_fold_newest_turn({ loop_id: loopId, turn_id: turnId });
314
+ if (budget === null || packet.weight <= budget)
315
+ return null;
316
+ return { weight: packet.weight, budget, excess: packet.weight - budget };
392
317
  }
393
318
  // Every prior-turn operation failure is durable before packet assembly.
394
319
  // The model-facing Errors section is only a terse projection of those rows;
@@ -446,7 +371,7 @@ class PacketBuilder {
446
371
  coordinate: `${r.loop_seq}/${r.turn_seq}/${r.sequence}`,
447
372
  origin: r.origin,
448
373
  op: r.op,
449
- suffix: r.suffix,
374
+ delimiter: r.delimiter,
450
375
  signal: r.signal === null ? null : JSON.parse(r.signal),
451
376
  target: {
452
377
  scheme: r.scheme,
@@ -461,7 +386,9 @@ class PacketBuilder {
461
386
  mimetype_rx: r.mimetype_rx,
462
387
  tx,
463
388
  mimetype_tx: r.mimetype_tx,
464
- folded: r.expanded === 0 && r.id !== transientOpenLogEntryId,
389
+ folded: r.id === transientOpenLogEntryId
390
+ ? LogVisibility.OPEN
391
+ : LogVisibility.parse(r.folded),
465
392
  source: r.source,
466
393
  attrs: r.attrs === null ? null : JSON.parse(r.attrs),
467
394
  tags: JSON.parse(r.tags),