@plurnk/plurnk-service 1.23.0 → 1.25.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 (215) hide show
  1. package/.env.defaults +17 -15
  2. package/INSTALL.md +96 -20
  3. package/README.md +2 -2
  4. package/SPEC.md +519 -206
  5. package/dist/Paths.d.ts +1 -0
  6. package/dist/Paths.d.ts.map +1 -1
  7. package/dist/Paths.js +1 -0
  8. package/dist/Paths.js.map +1 -1
  9. package/dist/build-info.json +1 -1
  10. package/dist/core/AdministrativeLoop.d.ts +1 -1
  11. package/dist/core/AdministrativeLoop.d.ts.map +1 -1
  12. package/dist/core/AdministrativeLoop.js +5 -5
  13. package/dist/core/AdministrativeLoop.js.map +1 -1
  14. package/dist/core/AdmittedTurnExecutor.d.ts +3 -2
  15. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  16. package/dist/core/AdmittedTurnExecutor.js +14 -1
  17. package/dist/core/AdmittedTurnExecutor.js.map +1 -1
  18. package/dist/core/CapabilityResolver.js +1 -1
  19. package/dist/core/CapabilityResolver.js.map +1 -1
  20. package/dist/core/DataStatementRunner.d.ts.map +1 -1
  21. package/dist/core/DataStatementRunner.js +1 -3
  22. package/dist/core/DataStatementRunner.js.map +1 -1
  23. package/dist/core/Dispatcher.d.ts +10 -0
  24. package/dist/core/Dispatcher.d.ts.map +1 -1
  25. package/dist/core/Dispatcher.js +71 -18
  26. package/dist/core/Dispatcher.js.map +1 -1
  27. package/dist/core/Dispatcher.sql +0 -7
  28. package/dist/core/Engine.d.ts +2 -2
  29. package/dist/core/Engine.d.ts.map +1 -1
  30. package/dist/core/ExecutorRegistry.d.ts +16 -4
  31. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  32. package/dist/core/ExecutorRegistry.js +31 -31
  33. package/dist/core/ExecutorRegistry.js.map +1 -1
  34. package/dist/core/FabricatedLog.d.ts +2 -0
  35. package/dist/core/FabricatedLog.d.ts.map +1 -1
  36. package/dist/core/FabricatedLog.js +18 -7
  37. package/dist/core/FabricatedLog.js.map +1 -1
  38. package/dist/core/HostPaths.d.ts +7 -1
  39. package/dist/core/HostPaths.d.ts.map +1 -1
  40. package/dist/core/HostPaths.js +25 -12
  41. package/dist/core/HostPaths.js.map +1 -1
  42. package/dist/core/LogEntryProjection.d.ts +1 -0
  43. package/dist/core/LogEntryProjection.d.ts.map +1 -1
  44. package/dist/core/LogEntryProjection.js +10 -0
  45. package/dist/core/LogEntryProjection.js.map +1 -1
  46. package/dist/core/LoopDriver.d.ts.map +1 -1
  47. package/dist/core/LoopDriver.js +8 -1
  48. package/dist/core/LoopDriver.js.map +1 -1
  49. package/dist/core/LoopLifecycle.d.ts +1 -1
  50. package/dist/core/LoopLifecycle.js +1 -1
  51. package/dist/core/LoopLifecycle.sql +2 -2
  52. package/dist/core/LoopPolicies.d.ts.map +1 -1
  53. package/dist/core/LoopPolicies.js +12 -7
  54. package/dist/core/LoopPolicies.js.map +1 -1
  55. package/dist/core/OperatorConfig.d.ts.map +1 -1
  56. package/dist/core/OperatorConfig.js +97 -51
  57. package/dist/core/OperatorConfig.js.map +1 -1
  58. package/dist/core/PacketBuilder.d.ts +2 -0
  59. package/dist/core/PacketBuilder.d.ts.map +1 -1
  60. package/dist/core/PacketBuilder.js +44 -32
  61. package/dist/core/PacketBuilder.js.map +1 -1
  62. package/dist/core/PacketBuilder.sql +3 -1
  63. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  64. package/dist/core/SchemeRegistry.js +3 -2
  65. package/dist/core/SchemeRegistry.js.map +1 -1
  66. package/dist/core/TurnDispositionHandler.d.ts +1 -1
  67. package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
  68. package/dist/core/TurnDispositionHandler.js +6 -15
  69. package/dist/core/TurnDispositionHandler.js.map +1 -1
  70. package/dist/core/TurnMaterialization.js +1 -1
  71. package/dist/core/TurnMaterialization.js.map +1 -1
  72. package/dist/core/TurnOps.d.ts +1 -0
  73. package/dist/core/TurnOps.d.ts.map +1 -1
  74. package/dist/core/TurnOps.js +18 -0
  75. package/dist/core/TurnOps.js.map +1 -1
  76. package/dist/core/TurnRunner.d.ts +6 -0
  77. package/dist/core/TurnRunner.d.ts.map +1 -1
  78. package/dist/core/TurnRunner.js +18 -8
  79. package/dist/core/TurnRunner.js.map +1 -1
  80. package/dist/core/TurnSources.sql +0 -15
  81. package/dist/core/env-defaults.d.ts +12 -1
  82. package/dist/core/env-defaults.d.ts.map +1 -1
  83. package/dist/core/env-defaults.js +46 -7
  84. package/dist/core/env-defaults.js.map +1 -1
  85. package/dist/core/file-creation-policy.d.ts.map +1 -1
  86. package/dist/core/file-creation-policy.js +2 -1
  87. package/dist/core/file-creation-policy.js.map +1 -1
  88. package/dist/core/packet-wire.d.ts +10 -2
  89. package/dist/core/packet-wire.d.ts.map +1 -1
  90. package/dist/core/packet-wire.js +87 -69
  91. package/dist/core/packet-wire.js.map +1 -1
  92. package/dist/core/results.d.ts +2 -0
  93. package/dist/core/results.d.ts.map +1 -1
  94. package/dist/core/results.js +7 -0
  95. package/dist/core/results.js.map +1 -1
  96. package/dist/digest/Digest.d.ts.map +1 -1
  97. package/dist/digest/Digest.js +10 -4
  98. package/dist/digest/Digest.js.map +1 -1
  99. package/dist/digest/DigestRender.d.ts.map +1 -1
  100. package/dist/digest/DigestRender.js +51 -22
  101. package/dist/digest/DigestRender.js.map +1 -1
  102. package/dist/digest/DigestRequiem.d.ts.map +1 -1
  103. package/dist/digest/DigestRequiem.js +10 -4
  104. package/dist/digest/DigestRequiem.js.map +1 -1
  105. package/dist/digest/digest-rows.d.ts +9 -1
  106. package/dist/digest/digest-rows.d.ts.map +1 -1
  107. package/dist/digest/digest-rows.js.map +1 -1
  108. package/dist/digest/digest.sql +16 -0
  109. package/dist/observe/init.d.ts +1 -0
  110. package/dist/observe/init.d.ts.map +1 -1
  111. package/dist/observe/init.js +5 -1
  112. package/dist/observe/init.js.map +1 -1
  113. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  114. package/dist/schemes/EffectPolicy.js +4 -4
  115. package/dist/schemes/EffectPolicy.js.map +1 -1
  116. package/dist/schemes/Exec.d.ts +1 -0
  117. package/dist/schemes/Exec.d.ts.map +1 -1
  118. package/dist/schemes/Exec.js +30 -14
  119. package/dist/schemes/Exec.js.map +1 -1
  120. package/dist/schemes/ExecScheduler.d.ts.map +1 -1
  121. package/dist/schemes/ExecScheduler.js +4 -3
  122. package/dist/schemes/ExecScheduler.js.map +1 -1
  123. package/dist/schemes/ExecScratch.d.ts.map +1 -1
  124. package/dist/schemes/ExecScratch.js +2 -1
  125. package/dist/schemes/ExecScratch.js.map +1 -1
  126. package/dist/schemes/File.d.ts.map +1 -1
  127. package/dist/schemes/File.js +15 -10
  128. package/dist/schemes/File.js.map +1 -1
  129. package/dist/schemes/Log.d.ts.map +1 -1
  130. package/dist/schemes/Log.js +25 -3
  131. package/dist/schemes/Log.js.map +1 -1
  132. package/dist/server/AgentRoots.d.ts +6 -0
  133. package/dist/server/AgentRoots.d.ts.map +1 -0
  134. package/dist/server/AgentRoots.js +25 -0
  135. package/dist/server/AgentRoots.js.map +1 -0
  136. package/dist/server/ConfigurationDiagnostics.d.ts +12 -0
  137. package/dist/server/ConfigurationDiagnostics.d.ts.map +1 -0
  138. package/dist/server/ConfigurationDiagnostics.js +40 -0
  139. package/dist/server/ConfigurationDiagnostics.js.map +1 -0
  140. package/dist/server/Daemon.d.ts +11 -5
  141. package/dist/server/Daemon.d.ts.map +1 -1
  142. package/dist/server/Daemon.js +124 -48
  143. package/dist/server/Daemon.js.map +1 -1
  144. package/dist/server/DaemonModule.d.ts +11 -4
  145. package/dist/server/DaemonModule.d.ts.map +1 -1
  146. package/dist/server/EnvFunctionality.d.ts.map +1 -1
  147. package/dist/server/EnvFunctionality.js +5 -2
  148. package/dist/server/EnvFunctionality.js.map +1 -1
  149. package/dist/server/Functionality.d.ts +6 -0
  150. package/dist/server/Functionality.d.ts.map +1 -1
  151. package/dist/server/Functionality.js +173 -37
  152. package/dist/server/Functionality.js.map +1 -1
  153. package/dist/server/FunctionalityManager.js +6 -6
  154. package/dist/server/FunctionalityManager.js.map +1 -1
  155. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  156. package/dist/server/MembersFunctionality.js +13 -41
  157. package/dist/server/MembersFunctionality.js.map +1 -1
  158. package/dist/server/PluginSources.d.ts +20 -0
  159. package/dist/server/PluginSources.d.ts.map +1 -0
  160. package/dist/server/PluginSources.js +52 -0
  161. package/dist/server/PluginSources.js.map +1 -0
  162. package/dist/server/PlurnkSkill.js +1 -1
  163. package/dist/server/PlurnkSkill.js.map +1 -1
  164. package/dist/server/Retention.d.ts.map +1 -1
  165. package/dist/server/Retention.js +11 -30
  166. package/dist/server/Retention.js.map +1 -1
  167. package/dist/server/ServiceModules.d.ts +1 -0
  168. package/dist/server/ServiceModules.d.ts.map +1 -1
  169. package/dist/server/ServiceModules.js +9 -3
  170. package/dist/server/ServiceModules.js.map +1 -1
  171. package/dist/server/SkillSource.d.ts +37 -0
  172. package/dist/server/SkillSource.d.ts.map +1 -0
  173. package/dist/server/SkillSource.js +267 -0
  174. package/dist/server/SkillSource.js.map +1 -0
  175. package/dist/server/SkillsFunctionality.d.ts +8 -27
  176. package/dist/server/SkillsFunctionality.d.ts.map +1 -1
  177. package/dist/server/SkillsFunctionality.js +218 -270
  178. package/dist/server/SkillsFunctionality.js.map +1 -1
  179. package/dist/server/WorkerModelResolver.d.ts +1 -2
  180. package/dist/server/WorkerModelResolver.d.ts.map +1 -1
  181. package/dist/server/WorkerModelResolver.js +18 -19
  182. package/dist/server/WorkerModelResolver.js.map +1 -1
  183. package/dist/server/WorkspacePlugins.d.ts +25 -0
  184. package/dist/server/WorkspacePlugins.d.ts.map +1 -0
  185. package/dist/server/WorkspacePlugins.js +43 -0
  186. package/dist/server/WorkspacePlugins.js.map +1 -0
  187. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  188. package/dist/server/dispatch-as-plurnk.js +3 -1
  189. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  190. package/dist/server/envelope.js +1 -1
  191. package/dist/server/envelope.js.map +1 -1
  192. package/dist/server/loop-model.d.ts.map +1 -1
  193. package/dist/server/loop-model.js +1 -2
  194. package/dist/server/loop-model.js.map +1 -1
  195. package/dist/server/module-discovery.d.ts +6 -0
  196. package/dist/server/module-discovery.d.ts.map +1 -1
  197. package/dist/server/module-discovery.js +46 -24
  198. package/dist/server/module-discovery.js.map +1 -1
  199. package/dist/server/skills-problems.d.ts +8 -0
  200. package/dist/server/skills-problems.d.ts.map +1 -0
  201. package/dist/server/skills-problems.js +18 -0
  202. package/dist/server/skills-problems.js.map +1 -0
  203. package/dist/service.d.ts.map +1 -1
  204. package/dist/service.js +55 -45
  205. package/dist/service.js.map +1 -1
  206. package/docs/env.md +7 -8
  207. package/docs/members.md +4 -3
  208. package/docs/skills.md +45 -22
  209. package/migrations/012_emission.sql +77 -0
  210. package/package.json +38 -36
  211. package/plurnk.service +29 -0
  212. package/dist/core/PreviousEmission.d.ts +0 -14
  213. package/dist/core/PreviousEmission.d.ts.map +0 -1
  214. package/dist/core/PreviousEmission.js +0 -24
  215. package/dist/core/PreviousEmission.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"env-defaults.d.ts","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,WAAW;;IAwC5B,OAAa,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAKzF;IAID,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAU7F;IAGD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAEhF;IAID,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAU9D;CACJ"}
1
+ {"version":3,"file":"env-defaults.d.ts","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,kBAAkB,EAAyB,MAAM,qBAAqB,CAAC;AAEtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAYvC,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED,MAAM,CAAC,OAAO,OAAO,WAAW;;IAuC5B,OAAa,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,SAA2B,EAAE,GAAE;QAC5F,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;KAC7B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuBtC;IAGD,OAAa,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAUpF;IAID,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAU7F;IAGD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAEhF;IAID,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAW9D;CACJ"}
@@ -1,7 +1,10 @@
1
1
  import { parseEnv } from "node:util";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
- import Meta from "@plurnk/plurnk-meta";
4
+ import Meta, { ConfigurationError } from "@plurnk/plurnk-meta";
5
+ import { AgentPluginFiles } from "@plurnk/plurnk-meta/agent-plugin";
6
+ import HostPaths from "./HostPaths.js";
7
+ import PluginSources from "../server/PluginSources.js";
5
8
  export default class EnvDefaults {
6
9
  static async #readDefaults(dir, owner) {
7
10
  let text;
@@ -24,8 +27,7 @@ export default class EnvDefaults {
24
27
  }
25
28
  // Enumerate installed package dirs via the shared membership primitives
26
29
  // (@plurnk/plurnk-meta); keep ecosystem members that ship a .env.defaults.
27
- static async #memberFiles(nodeModules) {
28
- const dirs = await Meta.packageDirs(nodeModules);
30
+ static async #memberFiles(dirs) {
29
31
  const files = [];
30
32
  for (const { dir, name } of dirs.toSorted((a, b) => a.name.localeCompare(b.name))) {
31
33
  if (!Meta.isTrusted(name))
@@ -50,12 +52,48 @@ export default class EnvDefaults {
50
52
  // The host's own file first, then every installed member's, name-sorted (deterministic).
51
53
  // The host is excluded from the member scan — a workspace checkout symlinks the daemon
52
54
  // into node_modules as its own member, and self-vs-self is not a collision.
53
- static async collect(serviceRoot, nodeModules) {
55
+ static async collect(serviceRoot, nodeModules, { hostPaths = new HostPaths() } = {}) {
54
56
  const own = await EnvDefaults.#readDefaults(serviceRoot, "@plurnk/plurnk-service");
55
57
  if (own === null)
56
58
  throw new Error("@plurnk/plurnk-service: .env.defaults missing from the package root — the shipped floor is not optional");
57
- const members = await EnvDefaults.#memberFiles(nodeModules);
58
- return [own, ...members.filter((m) => m.owner !== own.owner)];
59
+ const environment = { ...own.parsed, ...process.env };
60
+ const sources = await PluginSources.read({ hostPaths, nodeModules, environment });
61
+ const configurationErrors = [...sources.configurationErrors];
62
+ const members = await EnvDefaults.#memberFiles(sources.packages.filter(({ dir }) => !sources.pluginPackages.has(dir)));
63
+ const files = [own, ...members.filter((m) => m.owner !== own.owner)];
64
+ const selected = new Set(sources.plugins.map(({ root }) => root));
65
+ const nativeDirs = new Set([...selected, ...sources.pluginPackages]);
66
+ for (const dir of nativeDirs) {
67
+ try {
68
+ const native = await Meta.readManifest(dir);
69
+ if (native === null || native.packageName === null || !Meta.isTrusted(native.packageName))
70
+ continue;
71
+ if (native.plurnk.kind === "module" ? !selected.has(dir) : !sources.pluginPackages.has(dir))
72
+ continue;
73
+ const file = await EnvDefaults.nativeFile(dir, native.packageName);
74
+ if (file !== null)
75
+ files.push(file);
76
+ }
77
+ catch (cause) {
78
+ if (!(cause instanceof ConfigurationError))
79
+ throw cause;
80
+ configurationErrors.push(cause);
81
+ }
82
+ }
83
+ return { files, configurationErrors, reports: sources.reports };
84
+ }
85
+ // {§operator-config-env-defaults} A standard bundle's panel is native extension data, not a portable component.
86
+ static async nativeFile(root, owner) {
87
+ const location = join(root, "ai.plurnk", ".env.defaults");
88
+ try {
89
+ if (!await AgentPluginFiles.contained(root, location)) {
90
+ throw new Error("native defaults resolve outside the plugin root");
91
+ }
92
+ return await EnvDefaults.#readDefaults(join(root, "ai.plurnk"), owner);
93
+ }
94
+ catch (cause) {
95
+ throw new ConfigurationError(location, `${owner}: native .env.defaults is unavailable: ${cause.message}`, { cause });
96
+ }
59
97
  }
60
98
  // The ONE law: global key uniqueness. A collision names both claimants — it is also the
61
99
  // deliberate handoff signal when a sibling adopts a section the host carried for it.
@@ -83,7 +121,8 @@ export default class EnvDefaults {
83
121
  "# Plurnk installed configuration defaults",
84
122
  "# Generated on demand from each installed package's .env.defaults.",
85
123
  "# This output is documentation, not an input file. Put user overrides in",
86
- "# $XDG_CONFIG_HOME/plurnk/.env, a project .env, or the shell environment.",
124
+ "# $XDG_CONFIG_HOME/plurnk/.env, a file selected with --config or --env-file,",
125
+ "# or the shell environment. A working directory's .env is not read.",
87
126
  "# Effective secret values are never projected here.",
88
127
  "",
89
128
  ].join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"env-defaults.js","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-defaults.js","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-creation-policy.d.ts","sourceRoot":"","sources":["../../src/core/file-creation-policy.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,YAAI,MAAM,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AACzE,MAAM,MAAM,eAAe,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAK1D;IAED,MAAM,CAAC,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,CAEzE;IAED,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,GAAG,eAAe,CAG7F;IAED,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAEnE;CACJ"}
1
+ {"version":3,"file":"file-creation-policy.d.ts","sourceRoot":"","sources":["../../src/core/file-creation-policy.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,YAAI,MAAM,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AACzE,MAAM,MAAM,eAAe,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAK1D;IAED,MAAM,CAAC,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,CAEzE;IAED,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,GAAG,eAAe,CAG7F;IAED,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAEnE;CACJ"}
@@ -1,6 +1,7 @@
1
1
  // {§operator-config-file-create-scope}: one ordered service/workspace ceiling for
2
2
  // filesystem creation. Admission itself remains owned by file membership; this module
3
3
  // only parses and composes the configuration contract.
4
+ import { Knob } from "@plurnk/plurnk-meta";
4
5
  export const FILE_CREATE_SCOPES = ["none", "root", "namespace"];
5
6
  const rank = new Map(FILE_CREATE_SCOPES.map((scope, index) => [scope, index]));
6
7
  export default class FileCreationPolicy {
@@ -11,7 +12,7 @@ export default class FileCreationPolicy {
11
12
  return value;
12
13
  }
13
14
  static serviceScope(env = process.env) {
14
- return FileCreationPolicy.parse(env.PLURNK_SERVICE_FILE_CREATE_SCOPE, "PLURNK_SERVICE_FILE_CREATE_SCOPE");
15
+ return Knob.choice("PLURNK_SERVICE_FILE_CREATE_SCOPE", FILE_CREATE_SCOPES, env);
15
16
  }
16
17
  static effective(service, workspace) {
17
18
  if (workspace === null)
@@ -1 +1 @@
1
- {"version":3,"file":"file-creation-policy.js","sourceRoot":"","sources":["../../src/core/file-creation-policy.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,sFAAsF;AACtF,uDAAuD;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AAGzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAA0B,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAExG,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACnC,MAAM,CAAC,KAAK,CAAC,KAAc,EAAE,IAAY;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAwB,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,KAAwB,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;QACpD,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,EAAE,kCAAkC,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,OAAwB,EAAE,SAAiC;QACxE,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAsB,EAAE,WAAoB;QACtD,OAAO,KAAK,KAAK,WAAW,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IACvE,CAAC;CACJ"}
1
+ {"version":3,"file":"file-creation-policy.js","sourceRoot":"","sources":["../../src/core/file-creation-policy.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,sFAAsF;AACtF,uDAAuD;AAEvD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AAGzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAA0B,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAExG,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACnC,MAAM,CAAC,KAAK,CAAC,KAAc,EAAE,IAAY;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAwB,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,KAAwB,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,kCAAkC,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,OAAwB,EAAE,SAAiC;QACxE,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAsB,EAAE,WAAoB;QACtD,OAAO,KAAK,KAAK,WAAW,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IACvE,CAAC;CACJ"}
@@ -25,9 +25,15 @@ export interface RenderedLog {
25
25
  readonly records: readonly string[];
26
26
  readonly curationTargets: readonly ReclaimableLogItem[];
27
27
  readonly attachments: readonly PacketAttachment[];
28
+ readonly emissions: readonly RenderedEmission[];
28
29
  readonly unadmittedOutput: readonly number[];
29
30
  readonly newOverflow: boolean;
30
31
  }
32
+ export interface RenderedEmission {
33
+ readonly coordinate: string;
34
+ readonly content: string;
35
+ readonly weight: number;
36
+ }
31
37
  export default class PacketWire {
32
38
  #private;
33
39
  static renderSlot(sections: SectionView[], slot: "system" | "user"): string;
@@ -39,10 +45,12 @@ export default class PacketWire {
39
45
  static renderLog(entries: unknown, weighContent: WeighContent, options?: RenderLogOptions): string;
40
46
  static renderLogWithAccounting(entries: unknown, weighContent: WeighContent, options?: RenderLogOptions): RenderedLog;
41
47
  static sectionContent(packet: Packet, name: string): string;
42
- static packetToWireMessages(packet: Packet, previousEmission?: string | null): Array<{
48
+ static packetToWireMessages(packet: Packet, emissions: ReadonlyMap<string, string>): Array<{
43
49
  role: string;
44
50
  content: string;
45
51
  }>;
52
+ static deliveredEmission(frozen: string): string;
53
+ static placedEmissions(sections: readonly SectionView[], emissions: ReadonlyMap<string, string>): string[];
46
54
  static isArrival(e: {
47
55
  readonly op?: unknown;
48
56
  readonly origin?: unknown;
@@ -54,7 +62,7 @@ export default class PacketWire {
54
62
  readonly attrs?: unknown;
55
63
  readonly source?: unknown;
56
64
  }): boolean;
57
- static wireMessages(packet: RequestPacket, bytesOf: (attachment: PacketAttachment) => Promise<Uint8Array>, accepts?: (kind: PacketAttachment["kind"]) => boolean, previousEmission?: string | null): Promise<ChatMessage[]>;
65
+ static wireMessages(packet: RequestPacket, emissions: ReadonlyMap<string, string>, bytesOf: (attachment: PacketAttachment) => Promise<Uint8Array>, accepts?: (kind: PacketAttachment["kind"]) => boolean): Promise<ChatMessage[]>;
58
66
  static attachmentCaption(attachment: PacketAttachment): string;
59
67
  }
60
68
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"packet-wire.d.ts","sourceRoot":"","sources":["../../src/core/packet-wire.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packet-wire.d.ts","sourceRoot":"","sources":["../../src/core/packet-wire.ts"],"names":[],"mappings":"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"}
@@ -96,7 +96,7 @@ export default class PacketWire {
96
96
  static renderLogWithAccounting(entries, weighContent, options = {}) {
97
97
  const log = Array.isArray(entries) ? entries : [];
98
98
  if (log.length === 0)
99
- return { content: "", records: [], curationTargets: [], attachments: [], unadmittedOutput: [], newOverflow: false };
99
+ return { content: "", records: [], curationTargets: [], attachments: [], emissions: [], unadmittedOutput: [], newOverflow: false };
100
100
  const rows = PacketWire.#renderLogEntries(log, weighContent, options);
101
101
  const records = rows.map(({ content }) => content);
102
102
  return {
@@ -104,6 +104,7 @@ export default class PacketWire {
104
104
  records,
105
105
  curationTargets: rows.flatMap(({ curationTarget }) => curationTarget === null ? [] : [curationTarget]),
106
106
  attachments: rows.flatMap(({ attachment }) => attachment === null ? [] : [attachment]),
107
+ emissions: rows.flatMap(({ emission }) => emission === null ? [] : [emission]),
107
108
  unadmittedOutput: rows.flatMap(({ unadmittedOutput }) => unadmittedOutput === null ? [] : [unadmittedOutput]),
108
109
  newOverflow: rows.some(({ newOverflow }) => newOverflow),
109
110
  };
@@ -115,78 +116,88 @@ export default class PacketWire {
115
116
  const s = packet.sections?.find((x) => x.name === name);
116
117
  return typeof s?.content === "string" ? s.content : "";
117
118
  }
118
- // Project a packet to the request ChatMessage[] for the wire: one message
119
- // per slot. Engine calls this directly; the result is what provider.generate
120
- // receives. The digest calls renderSlot for byte-identical packet files.
121
- // {§packet-wire-envelope} — the packet's bytes under the roles the model was tuned on: the system
122
- // slot; the log's records one user message per completed turn; the worker's previous submitted
123
- // program, verbatim and alone, as the one assistant message; then the current turn's records
124
- // and the remaining user sections as the closing user message. Nothing but grammar sits under
125
- // the assistant marker: whatever does becomes the model's output vocabulary (#903).
126
- static packetToWireMessages(packet, previousEmission = null) {
119
+ // {§packet-wire-envelope} — the packet as a transcript: the system slot, then the user sections in
120
+ // order, split after each placed emission row so that row's emission follows as the worker's own
121
+ // assistant message. The user contents joined by one blank line equal renderSlot(user) byte for
122
+ // byte; the request always closes on a user message.
123
+ static packetToWireMessages(packet, emissions) {
127
124
  const sections = packet.sections ?? [];
128
125
  const messages = [{ role: "system", content: PacketWire.renderSlot(sections, "system") }];
129
- const log = sections.find((s) => s.slot === "user" && s.name === "log");
130
- const rest = sections.filter((s) => s.slot === "user" && s.name !== "log");
131
- const worker = sections.find((s) => s.name === "worker");
132
- const current = PacketWire.#currentCoordinate(worker);
133
- const groups = log === undefined ? [] : PacketWire.#turnGroups(PacketWire.renderSection(log));
134
- const closing = [];
135
- groups.forEach((group, index) => {
136
- const last = index === groups.length - 1;
137
- if (last && current !== null && group.turn === current)
138
- closing.push(group.content);
139
- else
140
- messages.push({ role: "user", content: group.content });
141
- });
142
- if (previousEmission !== null && previousEmission.length > 0)
143
- messages.push({ role: "assistant", content: previousEmission });
144
- const tail = rest.map((s) => PacketWire.renderSection(s)).filter((p) => p.length > 0);
145
- const closingContent = [...closing, ...tail].join("\n\n");
146
- if (closingContent.length > 0 || messages.at(-1)?.role !== "user")
147
- messages.push({ role: "user", content: closingContent });
126
+ let pending = [];
127
+ for (const section of sections) {
128
+ if (section.slot !== "user")
129
+ continue;
130
+ const rendered = PacketWire.renderSection(section);
131
+ if (rendered.length === 0)
132
+ continue;
133
+ if (section.name !== "log") {
134
+ pending.push(rendered);
135
+ continue;
136
+ }
137
+ for (const { content, coordinate } of PacketWire.#logRecords(rendered)) {
138
+ pending.push(content);
139
+ const frozen = coordinate === null ? undefined : emissions.get(coordinate);
140
+ const emission = frozen === undefined ? "" : PacketWire.deliveredEmission(frozen);
141
+ // {§emission-row}: an emission of only NOTE and WAIT delivers nothing; its row stands.
142
+ if (emission.length === 0)
143
+ continue;
144
+ messages.push({ role: "user", content: pending.join("\n\n") });
145
+ messages.push({ role: "assistant", content: emission });
146
+ pending = [];
147
+ }
148
+ }
149
+ const closing = pending.join("\n\n");
150
+ if (closing.length === 0 && messages.at(-1)?.role === "assistant")
151
+ throw new Error("a request never ends on an emission: nothing follows the last one");
152
+ messages.push({ role: "user", content: closing });
148
153
  return messages;
149
154
  }
150
- // The coordinate the Worker block names, `loop/turn`, or null when the packet carries none.
151
- static #currentCoordinate(worker) {
152
- if (worker === undefined || typeof worker.content !== "string")
153
- return null;
154
- try {
155
- const { loop, turn } = JSON.parse(worker.content);
156
- return typeof loop === "number" && typeof turn === "number" ? `${loop}/${turn}` : null;
157
- }
158
- catch {
159
- return null;
155
+ // {§emission-row} — the wire omits NOTE and WAIT blocks, whose rows show them whole; the frozen
156
+ // projection keeps every statement. Deliberately a text filter: the projection is TurnOps' own
157
+ // rendering, whose fences are longer than any backtick run inside them, so a block is read back by
158
+ // its fences alone, whatever era froze it.
159
+ static deliveredEmission(frozen) {
160
+ const lines = frozen.split("\n");
161
+ const kept = [];
162
+ for (let index = 0; index < lines.length;) {
163
+ const fence = /^`{3,}/u.exec(lines[index])?.[0];
164
+ if (fence === undefined)
165
+ throw new Error(`an emission block opens with a fence, not ${JSON.stringify(lines[index])}`);
166
+ const end = lines.findIndex((line, at) => at > index && (line === fence || line.startsWith(`${fence} <!-- `)));
167
+ if (end === -1)
168
+ throw new Error("an emission block closes with its own fence");
169
+ if (!new RegExp(`^${fence}(?:NOTE|WAIT)\\b`, "u").test(lines[index]))
170
+ kept.push(lines.slice(index, end + 1).join("\n"));
171
+ index = end + 2;
160
172
  }
173
+ return kept.join("\n\n");
161
174
  }
162
- // The rendered log section split by the turn that wrote each record; a record without a
163
- // coordinate stays with the group before it. The section heading opens the first group.
164
- static #turnGroups(rendered) {
165
- if (rendered.length === 0)
175
+ // {§emission-row} — the coordinates of the emission rows present in the final log section, in order.
176
+ // Every emission row must be announced by the render pass that built the map.
177
+ static placedEmissions(sections, emissions) {
178
+ const log = sections.find((section) => section.slot === "user" && section.name === "log");
179
+ if (log === undefined)
166
180
  return [];
167
- const groups = [];
168
- let heading = [];
169
- for (const record of rendered.split(/\n\n(?=### log:\/\/\/)/u)) {
170
- const coordinate = /(?:^|\n)### log:\/\/\/(\d+)\/(\d+)\//u.exec(record);
171
- const group = groups.at(-1);
172
- if (coordinate === null) {
173
- if (group === undefined)
174
- heading.push(record);
175
- else
176
- group.records.push(record);
181
+ const placed = [];
182
+ for (const { coordinate, leaf } of PacketWire.#logRecords(PacketWire.renderSection(log))) {
183
+ if (coordinate === null)
177
184
  continue;
185
+ if (emissions.has(coordinate)) {
186
+ if (placed.includes(coordinate))
187
+ throw new Error(`log:///${coordinate}/emission appears twice in one log section`);
188
+ placed.push(coordinate);
178
189
  }
179
- const turn = `${coordinate[1]}/${coordinate[2]}`;
180
- if (group !== undefined && group.turn === turn)
181
- group.records.push(record);
182
- else {
183
- groups.push({ turn, records: [...heading, record] });
184
- heading = [];
190
+ else if (leaf === "emission") {
191
+ throw new Error(`log:///${coordinate}/emission reached the log section without its emission`);
185
192
  }
186
193
  }
187
- if (heading.length > 0)
188
- groups.push({ turn: null, records: heading });
189
- return groups.map(({ turn, records }) => ({ turn, content: records.join("\n\n") }));
194
+ return placed;
195
+ }
196
+ static #logRecords(rendered) {
197
+ return rendered.split(/\n\n(?=### log:\/\/\/)/u).map((content) => {
198
+ const match = /^### log:\/\/\/(\d+\/\d+\/\d+)(?:\/(\S*))?(?=\s|$)/mu.exec(content);
199
+ return { content, coordinate: match?.[1] ?? null, leaf: match?.[2] ?? null };
200
+ });
190
201
  }
191
202
  // Number a non-READ body line as `<N>:<line>` — `N:` followed by NO separator whitespace
192
203
  // ({§render-rule-line-navigable-prefix}): the leading digit prevents column-zero fence collisions and gives
@@ -561,8 +572,10 @@ export default class PacketWire {
561
572
  // Absence = "model" — the worker's own authorship is the default (#338). An arrival is an
562
573
  // inbound SEND row the harness published ({§message-causal-source}): its stored origin says
563
574
  // nothing, so the row names its sender instead (#706).
564
- if (typeof e.origin === "string" && e.origin !== "model" && !PacketWire.isArrival(e))
565
- meta.origin = e.origin;
575
+ // {§emission-row}: an emission row is stored as the harness's, but names its author.
576
+ const author = LogEntryProjection.isEmission(e) ? e.producer : e.origin;
577
+ if (typeof author === "string" && author !== "model" && !PacketWire.isArrival(e))
578
+ meta.origin = author;
566
579
  // {§env-delta-attribution}: render the causal worker address or
567
580
  // subsystem token when present; absence means the owning worker.
568
581
  // {§message-short-identity} an arrival whose source is the transport's own name for it adds
@@ -794,7 +807,7 @@ export default class PacketWire {
794
807
  // complete, and exterior arrivals share their packet allowance. Structured mutation receipts own
795
808
  // their join bound; every remaining body uses the ordinary fixed preview.
796
809
  static #rowBody(identity, e, fullBody, bodyVisibility, facts, promptProjectionWeight, weighContent) {
797
- const { meta, op, renderedLeaf } = identity;
810
+ const { meta, op } = identity;
798
811
  const projectedBody = {
799
812
  ...fullBody,
800
813
  content: bodyVisibility.fullyFolded ? bodyVisibility.readableContent : bodyVisibility.content,
@@ -803,7 +816,6 @@ export default class PacketWire {
803
816
  const previewExempt = op === "READ"
804
817
  || op === "FIND"
805
818
  || op === "NOTE" || typeof op === "string" && TurnDisposition.isOp(op)
806
- || (op === null && renderedLeaf === "ops")
807
819
  || facts.structuredMutationReceipt;
808
820
  const lineAnchors = op === "READ" ? e.lineAnchors ?? null : null;
809
821
  const lineNumberWidth = op === "READ" ? e.lineNumberWidth ?? null : null;
@@ -894,13 +906,19 @@ export default class PacketWire {
894
906
  : null;
895
907
  if (attachment !== null)
896
908
  meta.tokensAttachment = attachment.weight;
909
+ // {§emission-row}: an emission row carries its frozen emission outside its record, and charges what
910
+ // the wire delivers of it, as the worker's own message, exactly as a native part is charged.
911
+ const emission = LogEntryProjection.isEmission(e) && coordinate !== null
912
+ ? { coordinate, content: fullBody.content, weight: weighContent(PacketWire.deliveredEmission(fullBody.content)) }
913
+ : null;
897
914
  for (let pass = 0; pass < 8; pass += 1) {
898
- const next = weighContent(renderRow()) + (attachment?.weight ?? 0);
915
+ const next = weighContent(renderRow()) + (attachment?.weight ?? 0) + (emission?.weight ?? 0);
899
916
  if (next === logTokens) {
900
917
  return {
901
918
  content: renderRow(),
902
919
  curationTarget: { path, logTokens },
903
920
  attachment,
921
+ emission,
904
922
  unadmittedOutput: (display === "open" || attachment !== null)
905
923
  && fullBody.provenance === "returned"
906
924
  && e.output_admission_turn_id == null
@@ -952,8 +970,8 @@ export default class PacketWire {
952
970
  }
953
971
  // {§packet-attachment-parts} — the wire form with native parts: user text first, then each accepted
954
972
  // retained native part in observation order.
955
- static async wireMessages(packet, bytesOf, accepts = () => true, previousEmission = null) {
956
- const messages = PacketWire.packetToWireMessages(packet, previousEmission);
973
+ static async wireMessages(packet, emissions, bytesOf, accepts = () => true) {
974
+ const messages = PacketWire.packetToWireMessages(packet, emissions);
957
975
  // {§packet-attachment-parts} — native parts ride the closing user message.
958
976
  const closing = messages.at(-1);
959
977
  const parts = [{ type: "text", text: closing.content }];