@plurnk/plurnk-service 1.0.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 (343) hide show
  1. package/.env.defaults +208 -0
  2. package/INSTALL.md +69 -0
  3. package/LICENSE +21 -0
  4. package/README.md +46 -0
  5. package/SPEC.md +1511 -0
  6. package/dist/Paths.d.ts +13 -0
  7. package/dist/Paths.d.ts.map +1 -0
  8. package/dist/Paths.js +60 -0
  9. package/dist/Paths.js.map +1 -0
  10. package/dist/content/edited-span.d.ts +2 -0
  11. package/dist/content/edited-span.d.ts.map +1 -0
  12. package/dist/content/edited-span.js +33 -0
  13. package/dist/content/edited-span.js.map +1 -0
  14. package/dist/content/index.d.ts +10 -0
  15. package/dist/content/index.d.ts.map +1 -0
  16. package/dist/content/index.js +11 -0
  17. package/dist/content/index.js.map +1 -0
  18. package/dist/content/line-marker.d.ts +15 -0
  19. package/dist/content/line-marker.d.ts.map +1 -0
  20. package/dist/content/line-marker.js +21 -0
  21. package/dist/content/line-marker.js.map +1 -0
  22. package/dist/content/matcher.d.ts +44 -0
  23. package/dist/content/matcher.d.ts.map +1 -0
  24. package/dist/content/matcher.js +126 -0
  25. package/dist/content/matcher.js.map +1 -0
  26. package/dist/content/mimetype-binary.d.ts +8 -0
  27. package/dist/content/mimetype-binary.d.ts.map +1 -0
  28. package/dist/content/mimetype-binary.js +17 -0
  29. package/dist/content/mimetype-binary.js.map +1 -0
  30. package/dist/content/path-mimetype.d.ts +5 -0
  31. package/dist/content/path-mimetype.d.ts.map +1 -0
  32. package/dist/content/path-mimetype.js +15 -0
  33. package/dist/content/path-mimetype.js.map +1 -0
  34. package/dist/content/read-resolve.d.ts +20 -0
  35. package/dist/content/read-resolve.d.ts.map +1 -0
  36. package/dist/content/read-resolve.js +68 -0
  37. package/dist/content/read-resolve.js.map +1 -0
  38. package/dist/core/ChannelWrite.d.ts +100 -0
  39. package/dist/core/ChannelWrite.d.ts.map +1 -0
  40. package/dist/core/ChannelWrite.js +112 -0
  41. package/dist/core/ChannelWrite.js.map +1 -0
  42. package/dist/core/ChannelWrite.sql +84 -0
  43. package/dist/core/Db.d.ts +14 -0
  44. package/dist/core/Db.d.ts.map +1 -0
  45. package/dist/core/Db.js +7 -0
  46. package/dist/core/Db.js.map +1 -0
  47. package/dist/core/Dispatcher.d.ts +67 -0
  48. package/dist/core/Dispatcher.d.ts.map +1 -0
  49. package/dist/core/Dispatcher.js +1021 -0
  50. package/dist/core/Dispatcher.js.map +1 -0
  51. package/dist/core/Engine.d.ts +113 -0
  52. package/dist/core/Engine.d.ts.map +1 -0
  53. package/dist/core/Engine.js +1410 -0
  54. package/dist/core/Engine.js.map +1 -0
  55. package/dist/core/Engine.sql +538 -0
  56. package/dist/core/EnvFlags.d.ts +13 -0
  57. package/dist/core/EnvFlags.d.ts.map +1 -0
  58. package/dist/core/EnvFlags.js +84 -0
  59. package/dist/core/EnvFlags.js.map +1 -0
  60. package/dist/core/ExecutorRegistry.d.ts +45 -0
  61. package/dist/core/ExecutorRegistry.d.ts.map +1 -0
  62. package/dist/core/ExecutorRegistry.js +128 -0
  63. package/dist/core/ExecutorRegistry.js.map +1 -0
  64. package/dist/core/PacketBuilder.d.ts +67 -0
  65. package/dist/core/PacketBuilder.d.ts.map +1 -0
  66. package/dist/core/PacketBuilder.js +524 -0
  67. package/dist/core/PacketBuilder.js.map +1 -0
  68. package/dist/core/PluginLoader.d.ts +17 -0
  69. package/dist/core/PluginLoader.d.ts.map +1 -0
  70. package/dist/core/PluginLoader.js +97 -0
  71. package/dist/core/PluginLoader.js.map +1 -0
  72. package/dist/core/ProposalLifecycle.d.ts +59 -0
  73. package/dist/core/ProposalLifecycle.d.ts.map +1 -0
  74. package/dist/core/ProposalLifecycle.js +215 -0
  75. package/dist/core/ProposalLifecycle.js.map +1 -0
  76. package/dist/core/ProviderInstantiate.d.ts +9 -0
  77. package/dist/core/ProviderInstantiate.d.ts.map +1 -0
  78. package/dist/core/ProviderInstantiate.js +156 -0
  79. package/dist/core/ProviderInstantiate.js.map +1 -0
  80. package/dist/core/SchemeRegistry.d.ts +26 -0
  81. package/dist/core/SchemeRegistry.d.ts.map +1 -0
  82. package/dist/core/SchemeRegistry.js +205 -0
  83. package/dist/core/SchemeRegistry.js.map +1 -0
  84. package/dist/core/StrikeRail.d.ts +28 -0
  85. package/dist/core/StrikeRail.d.ts.map +1 -0
  86. package/dist/core/StrikeRail.js +165 -0
  87. package/dist/core/StrikeRail.js.map +1 -0
  88. package/dist/core/TelemetryChannel.d.ts +37 -0
  89. package/dist/core/TelemetryChannel.d.ts.map +1 -0
  90. package/dist/core/TelemetryChannel.js +77 -0
  91. package/dist/core/TelemetryChannel.js.map +1 -0
  92. package/dist/core/TokenGauge.d.ts +16 -0
  93. package/dist/core/TokenGauge.d.ts.map +1 -0
  94. package/dist/core/TokenGauge.js +58 -0
  95. package/dist/core/TokenGauge.js.map +1 -0
  96. package/dist/core/caps/CapsResolve.d.ts +5 -0
  97. package/dist/core/caps/CapsResolve.d.ts.map +1 -0
  98. package/dist/core/caps/CapsResolve.js +13 -0
  99. package/dist/core/caps/CapsResolve.js.map +1 -0
  100. package/dist/core/caps/DbChannelCaps.d.ts +16 -0
  101. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -0
  102. package/dist/core/caps/DbChannelCaps.js +41 -0
  103. package/dist/core/caps/DbChannelCaps.js.map +1 -0
  104. package/dist/core/caps/DbEntryCaps.d.ts +19 -0
  105. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -0
  106. package/dist/core/caps/DbEntryCaps.js +28 -0
  107. package/dist/core/caps/DbEntryCaps.js.map +1 -0
  108. package/dist/core/caps/DbNotifyCaps.d.ts +8 -0
  109. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -0
  110. package/dist/core/caps/DbNotifyCaps.js +35 -0
  111. package/dist/core/caps/DbNotifyCaps.js.map +1 -0
  112. package/dist/core/caps/DbSubscriptionCaps.d.ts +10 -0
  113. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -0
  114. package/dist/core/caps/DbSubscriptionCaps.js +86 -0
  115. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -0
  116. package/dist/core/caps/DbTagCaps.d.ts +17 -0
  117. package/dist/core/caps/DbTagCaps.d.ts.map +1 -0
  118. package/dist/core/caps/DbTagCaps.js +37 -0
  119. package/dist/core/caps/DbTagCaps.js.map +1 -0
  120. package/dist/core/caps/SchemeCtxImpl.d.ts +18 -0
  121. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -0
  122. package/dist/core/caps/SchemeCtxImpl.js +42 -0
  123. package/dist/core/caps/SchemeCtxImpl.js.map +1 -0
  124. package/dist/core/env-defaults.d.ts +19 -0
  125. package/dist/core/env-defaults.d.ts.map +1 -0
  126. package/dist/core/env-defaults.js +89 -0
  127. package/dist/core/env-defaults.js.map +1 -0
  128. package/dist/core/fork.d.ts +6 -0
  129. package/dist/core/fork.d.ts.map +1 -0
  130. package/dist/core/fork.js +84 -0
  131. package/dist/core/fork.js.map +1 -0
  132. package/dist/core/fork.sql +85 -0
  133. package/dist/core/git-membership.d.ts +23 -0
  134. package/dist/core/git-membership.d.ts.map +1 -0
  135. package/dist/core/git-membership.js +366 -0
  136. package/dist/core/git-membership.js.map +1 -0
  137. package/dist/core/git-state.d.ts +15 -0
  138. package/dist/core/git-state.d.ts.map +1 -0
  139. package/dist/core/git-state.js +67 -0
  140. package/dist/core/git-state.js.map +1 -0
  141. package/dist/core/packet-inject.d.ts +5 -0
  142. package/dist/core/packet-inject.d.ts.map +1 -0
  143. package/dist/core/packet-inject.js +48 -0
  144. package/dist/core/packet-inject.js.map +1 -0
  145. package/dist/core/packet-wire.d.ts +46 -0
  146. package/dist/core/packet-wire.d.ts.map +1 -0
  147. package/dist/core/packet-wire.js +453 -0
  148. package/dist/core/packet-wire.js.map +1 -0
  149. package/dist/core/path-decode.d.ts +2 -0
  150. package/dist/core/path-decode.d.ts.map +1 -0
  151. package/dist/core/path-decode.js +8 -0
  152. package/dist/core/path-decode.js.map +1 -0
  153. package/dist/core/plugin-attribution.d.ts +5 -0
  154. package/dist/core/plugin-attribution.d.ts.map +1 -0
  155. package/dist/core/plugin-attribution.js +39 -0
  156. package/dist/core/plugin-attribution.js.map +1 -0
  157. package/dist/core/plurnk-uri.d.ts +7 -0
  158. package/dist/core/plurnk-uri.d.ts.map +1 -0
  159. package/dist/core/plurnk-uri.js +52 -0
  160. package/dist/core/plurnk-uri.js.map +1 -0
  161. package/dist/core/resolveForLoop.d.ts +5 -0
  162. package/dist/core/resolveForLoop.d.ts.map +1 -0
  163. package/dist/core/resolveForLoop.js +12 -0
  164. package/dist/core/resolveForLoop.js.map +1 -0
  165. package/dist/core/results.d.ts +12 -0
  166. package/dist/core/results.d.ts.map +1 -0
  167. package/dist/core/results.js +27 -0
  168. package/dist/core/results.js.map +1 -0
  169. package/dist/core/run-cap.d.ts +8 -0
  170. package/dist/core/run-cap.d.ts.map +1 -0
  171. package/dist/core/run-cap.js +20 -0
  172. package/dist/core/run-cap.js.map +1 -0
  173. package/dist/core/run-ops.sql +43 -0
  174. package/dist/core/scheme-types.d.ts +45 -0
  175. package/dist/core/scheme-types.d.ts.map +1 -0
  176. package/dist/core/scheme-types.js +6 -0
  177. package/dist/core/scheme-types.js.map +1 -0
  178. package/dist/core/session-settings.d.ts +23 -0
  179. package/dist/core/session-settings.d.ts.map +1 -0
  180. package/dist/core/session-settings.js +55 -0
  181. package/dist/core/session-settings.js.map +1 -0
  182. package/dist/core/teaching.d.ts +3 -0
  183. package/dist/core/teaching.d.ts.map +1 -0
  184. package/dist/core/teaching.js +13 -0
  185. package/dist/core/teaching.js.map +1 -0
  186. package/dist/core/types.d.ts +3 -0
  187. package/dist/core/types.d.ts.map +1 -0
  188. package/dist/core/types.js +2 -0
  189. package/dist/core/types.js.map +1 -0
  190. package/dist/digest/Digest.d.ts +20 -0
  191. package/dist/digest/Digest.d.ts.map +1 -0
  192. package/dist/digest/Digest.js +451 -0
  193. package/dist/digest/Digest.js.map +1 -0
  194. package/dist/digest/Digest.sql +1 -0
  195. package/dist/digest/digest.sql +55 -0
  196. package/dist/index.d.ts +18 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +28 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/schemes/EffectPolicy.d.ts +6 -0
  201. package/dist/schemes/EffectPolicy.d.ts.map +1 -0
  202. package/dist/schemes/EffectPolicy.js +18 -0
  203. package/dist/schemes/EffectPolicy.js.map +1 -0
  204. package/dist/schemes/Exec.d.ts +39 -0
  205. package/dist/schemes/Exec.d.ts.map +1 -0
  206. package/dist/schemes/Exec.js +510 -0
  207. package/dist/schemes/Exec.js.map +1 -0
  208. package/dist/schemes/ExecOutputScheme.d.ts +20 -0
  209. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -0
  210. package/dist/schemes/ExecOutputScheme.js +39 -0
  211. package/dist/schemes/ExecOutputScheme.js.map +1 -0
  212. package/dist/schemes/File.d.ts +42 -0
  213. package/dist/schemes/File.d.ts.map +1 -0
  214. package/dist/schemes/File.js +356 -0
  215. package/dist/schemes/File.js.map +1 -0
  216. package/dist/schemes/Known.d.ts +17 -0
  217. package/dist/schemes/Known.d.ts.map +1 -0
  218. package/dist/schemes/Known.js +40 -0
  219. package/dist/schemes/Known.js.map +1 -0
  220. package/dist/schemes/Log.d.ts +22 -0
  221. package/dist/schemes/Log.d.ts.map +1 -0
  222. package/dist/schemes/Log.js +269 -0
  223. package/dist/schemes/Log.js.map +1 -0
  224. package/dist/schemes/Log.sql +59 -0
  225. package/dist/schemes/Plurnk.d.ts +17 -0
  226. package/dist/schemes/Plurnk.d.ts.map +1 -0
  227. package/dist/schemes/Plurnk.js +46 -0
  228. package/dist/schemes/Plurnk.js.map +1 -0
  229. package/dist/schemes/Run.d.ts +25 -0
  230. package/dist/schemes/Run.d.ts.map +1 -0
  231. package/dist/schemes/Run.js +172 -0
  232. package/dist/schemes/Run.js.map +1 -0
  233. package/dist/schemes/Skill.d.ts +17 -0
  234. package/dist/schemes/Skill.d.ts.map +1 -0
  235. package/dist/schemes/Skill.js +40 -0
  236. package/dist/schemes/Skill.js.map +1 -0
  237. package/dist/schemes/Unknown.d.ts +17 -0
  238. package/dist/schemes/Unknown.d.ts.map +1 -0
  239. package/dist/schemes/Unknown.js +39 -0
  240. package/dist/schemes/Unknown.js.map +1 -0
  241. package/dist/schemes/_entry-chunk.d.ts +11 -0
  242. package/dist/schemes/_entry-chunk.d.ts.map +1 -0
  243. package/dist/schemes/_entry-chunk.js +100 -0
  244. package/dist/schemes/_entry-chunk.js.map +1 -0
  245. package/dist/schemes/_entry-crud.d.ts +31 -0
  246. package/dist/schemes/_entry-crud.d.ts.map +1 -0
  247. package/dist/schemes/_entry-crud.js +77 -0
  248. package/dist/schemes/_entry-crud.js.map +1 -0
  249. package/dist/schemes/_entry-crud.sql +101 -0
  250. package/dist/schemes/_entry-find.d.ts +32 -0
  251. package/dist/schemes/_entry-find.d.ts.map +1 -0
  252. package/dist/schemes/_entry-find.js +226 -0
  253. package/dist/schemes/_entry-find.js.map +1 -0
  254. package/dist/schemes/_entry-find.sql +54 -0
  255. package/dist/schemes/_entry-graph.d.ts +16 -0
  256. package/dist/schemes/_entry-graph.d.ts.map +1 -0
  257. package/dist/schemes/_entry-graph.js +94 -0
  258. package/dist/schemes/_entry-graph.js.map +1 -0
  259. package/dist/schemes/_entry-graph.sql +52 -0
  260. package/dist/schemes/_entry-manifest.d.ts +25 -0
  261. package/dist/schemes/_entry-manifest.d.ts.map +1 -0
  262. package/dist/schemes/_entry-manifest.js +266 -0
  263. package/dist/schemes/_entry-manifest.js.map +1 -0
  264. package/dist/schemes/_entry-ops.d.ts +32 -0
  265. package/dist/schemes/_entry-ops.d.ts.map +1 -0
  266. package/dist/schemes/_entry-ops.js +216 -0
  267. package/dist/schemes/_entry-ops.js.map +1 -0
  268. package/dist/schemes/_entry-ops.sql +31 -0
  269. package/dist/schemes/_entry-semantic.d.ts +38 -0
  270. package/dist/schemes/_entry-semantic.d.ts.map +1 -0
  271. package/dist/schemes/_entry-semantic.js +202 -0
  272. package/dist/schemes/_entry-semantic.js.map +1 -0
  273. package/dist/schemes/_entry-semantic.sql +95 -0
  274. package/dist/schemes/_entry-send.d.ts +11 -0
  275. package/dist/schemes/_entry-send.d.ts.map +1 -0
  276. package/dist/schemes/_entry-send.js +66 -0
  277. package/dist/schemes/_entry-send.js.map +1 -0
  278. package/dist/schemes/cosine.d.ts +4 -0
  279. package/dist/schemes/cosine.d.ts.map +1 -0
  280. package/dist/schemes/cosine.js +9 -0
  281. package/dist/schemes/cosine.js.map +1 -0
  282. package/dist/schemes/exec-abort.d.ts +15 -0
  283. package/dist/schemes/exec-abort.d.ts.map +1 -0
  284. package/dist/schemes/exec-abort.js +29 -0
  285. package/dist/schemes/exec-abort.js.map +1 -0
  286. package/dist/schemes/exec-env.d.ts +5 -0
  287. package/dist/schemes/exec-env.d.ts.map +1 -0
  288. package/dist/schemes/exec-env.js +34 -0
  289. package/dist/schemes/exec-env.js.map +1 -0
  290. package/dist/server/Daemon.d.ts +244 -0
  291. package/dist/server/Daemon.d.ts.map +1 -0
  292. package/dist/server/Daemon.js +1119 -0
  293. package/dist/server/Daemon.js.map +1 -0
  294. package/dist/server/client-input.d.ts +11 -0
  295. package/dist/server/client-input.d.ts.map +1 -0
  296. package/dist/server/client-input.js +145 -0
  297. package/dist/server/client-input.js.map +1 -0
  298. package/dist/server/clientTurn.d.ts +6 -0
  299. package/dist/server/clientTurn.d.ts.map +1 -0
  300. package/dist/server/clientTurn.js +23 -0
  301. package/dist/server/clientTurn.js.map +1 -0
  302. package/dist/server/clientTurn.sql +10 -0
  303. package/dist/server/dispatch-as-plurnk.d.ts +7 -0
  304. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -0
  305. package/dist/server/dispatch-as-plurnk.js +23 -0
  306. package/dist/server/dispatch-as-plurnk.js.map +1 -0
  307. package/dist/server/drain.sql +124 -0
  308. package/dist/server/envelope.d.ts +53 -0
  309. package/dist/server/envelope.d.ts.map +1 -0
  310. package/dist/server/envelope.js +172 -0
  311. package/dist/server/envelope.js.map +1 -0
  312. package/dist/server/envelope.sql +76 -0
  313. package/dist/server/logEntry.d.ts +35 -0
  314. package/dist/server/logEntry.d.ts.map +1 -0
  315. package/dist/server/logEntry.js +49 -0
  316. package/dist/server/logEntry.js.map +1 -0
  317. package/dist/server/logEntry.sql +10 -0
  318. package/dist/server/loopDocs.d.ts +6 -0
  319. package/dist/server/loopDocs.d.ts.map +1 -0
  320. package/dist/server/loopDocs.js +22 -0
  321. package/dist/server/loopDocs.js.map +1 -0
  322. package/dist/server/noProposals.d.ts +6 -0
  323. package/dist/server/noProposals.d.ts.map +1 -0
  324. package/dist/server/noProposals.js +37 -0
  325. package/dist/server/noProposals.js.map +1 -0
  326. package/dist/server/seam-entry-read.sql +21 -0
  327. package/dist/server/seam-log-read.sql +21 -0
  328. package/dist/server/seam-loop.sql +9 -0
  329. package/dist/server/seam-proposal-list.sql +13 -0
  330. package/dist/server/version-info.d.ts +14 -0
  331. package/dist/server/version-info.d.ts.map +1 -0
  332. package/dist/server/version-info.js +69 -0
  333. package/dist/server/version-info.js.map +1 -0
  334. package/dist/server/yolo.d.ts +6 -0
  335. package/dist/server/yolo.d.ts.map +1 -0
  336. package/dist/server/yolo.js +64 -0
  337. package/dist/server/yolo.js.map +1 -0
  338. package/dist/service.d.ts +6 -0
  339. package/dist/service.d.ts.map +1 -0
  340. package/dist/service.js +309 -0
  341. package/dist/service.js.map +1 -0
  342. package/migrations/0000-00-00.01_schema.sql +500 -0
  343. package/package.json +86 -0
@@ -0,0 +1,453 @@
1
+ // Packet → wire markdown projection. Single source of truth for how the
2
+ // Packet's ordered list of sections renders to ChatMessage.content
3
+ // strings the LLM receives. Engine imports this for the wire payload; the
4
+ // digest tool imports it to write byte-identical packetNNN.{system,user}.md
5
+ // files. No second implementation, no drift.
6
+ //
7
+ // Format: markdown. user picked it over rummy's XML and JSON alternatives
8
+ // 2026-05-22. Standard markdown idioms only — headers as section delimiters,
9
+ // fenced code blocks for entry bodies, lists for arrays. No invented
10
+ // separators. Models parse markdown natively.
11
+ //
12
+ // Section headers follow the `## Plurnk Service X` convention so the model
13
+ // sees consistent framing across every section it might receive. Sections
14
+ // with no content are omitted entirely (no empty headers in the wire).
15
+ import { MimetypeBinary } from "../content/index.js";
16
+ import { renderAddress } from "./plurnk-uri.js";
17
+ export default class PacketWire {
18
+ // Render the sections in `slot` to one ChatMessage.content string. Sections
19
+ // render in list order; empties are omitted (no empty headers on the wire);
20
+ // each is `## {header}\n\n{content}` (or bare content when header is null),
21
+ // trailing newlines stripped, joined with a blank line.
22
+ static renderSlot(sections, slot) {
23
+ return sections
24
+ .filter((s) => s.slot === slot)
25
+ .map((s) => PacketWire.renderSection(s))
26
+ .filter((p) => p.length > 0)
27
+ .join("\n\n");
28
+ }
29
+ // One section → its markdown block (`## {header}\n\n{content}`, or bare
30
+ // content when header is null/empty), trailing newlines stripped. Empty
31
+ // content renders to "" so renderSlot drops it. This is the unit the
32
+ // per-section `tokens` weight is measured over.
33
+ static renderSection(s) {
34
+ if (typeof s.content !== "string" || s.content.length === 0)
35
+ return "";
36
+ const header = typeof s.header === "string" && s.header.length > 0 ? s.header : null;
37
+ return (header ? `## ${header}\n\n${s.content}` : s.content).replace(/\n+$/, "");
38
+ }
39
+ // The errors section content: the structured telemetry events rendered to
40
+ // meta lines (+ snippet blocks). "" when empty (the section is omitted). The
41
+ // events are ALSO kept structured on the packet (packet.telemetryErrors) —
42
+ // ephemeral (the buffer drains on read), so the packet is their only home.
43
+ static renderErrors(errors) {
44
+ const events = Array.isArray(errors) ? errors : [];
45
+ return events.length > 0 ? PacketWire.#renderTelemetryErrors(events) : "";
46
+ }
47
+ // The Child Streams / Child Runs sections (§child-orientation) — the OPPOSITE of advice: terse
48
+ // `* <status> <path>` pointers (same shape as the errors section) to the live things the run holds,
49
+ // so the model SEES its open streams + unconcluded workers each turn and reasons for itself (READ /
50
+ // OPEN / KILL via the path). Orienting state, never an instruction. "" when none → section omitted.
51
+ static renderChildPointers(rows) {
52
+ const items = Array.isArray(rows) ? rows : [];
53
+ return items.map((r) => `* ${String(r.status)} ${String(r.path)}`).join("\n");
54
+ }
55
+ // The git section content: the working-tree summary. "" when absent.
56
+ static renderGit(git) {
57
+ return git === null || git === undefined ? "" : PacketWire.#renderGitState(git);
58
+ }
59
+ // The log section's content: the model's curated rows rendered to markdown
60
+ // (the same #renderLogEntries the wire ships). Empty log → "" (omitted).
61
+ static renderLog(entries, countTokens) {
62
+ const log = Array.isArray(entries) ? entries : [];
63
+ return log.length > 0 ? PacketWire.#renderLogEntries(log, countTokens) : "";
64
+ }
65
+ // Read one section's content by name off a packet (Engine's or re-parsed).
66
+ // The legible accessor — consumers name the section they want instead of
67
+ // indexing a fixed shape. Missing section / non-string content → "".
68
+ static sectionContent(packet, name) {
69
+ const s = packet.sections?.find((x) => x.name === name);
70
+ return typeof s?.content === "string" ? s.content : "";
71
+ }
72
+ // Project a packet to the request ChatMessage[] for the wire: one message
73
+ // per slot. Engine calls this directly; the result is what provider.generate
74
+ // receives. The digest calls renderSlot for byte-identical packetNNN files.
75
+ static packetToWireMessages(packet) {
76
+ const sections = packet.sections ?? [];
77
+ return [
78
+ { role: "system", content: PacketWire.renderSlot(sections, "system") },
79
+ { role: "user", content: PacketWire.renderSlot(sections, "user") },
80
+ ];
81
+ }
82
+ // Measure the curatable log section's budget subtotals from the STRUCTURED
83
+ // log (the foldable unit), using the provider's tokenizer — meta lines and
84
+ // fences included, matching what ships. Feeds the per-turn rollup (chronological;
85
+ // the grinder folds the newest turn) and the FOLD unit (heaviest entries) — the
86
+ // two budget levers the model can pull (§tokenomics {§tokenomics-turn-totals},
87
+ // {§tokenomics-largest-entries}). Build-time only; the stored log section is
88
+ // the rendered result. §tokenomics-render-weight-budget
89
+ static measureLogBudget(entries, countTokens) {
90
+ const logEntries = Array.isArray(entries) ? entries : [];
91
+ const logBody = logEntries.length > 0 ? PacketWire.#renderLogEntries(logEntries, countTokens) : "";
92
+ const HEAVIEST_COUNT = 5;
93
+ const byTurn = new Map();
94
+ const perEntry = [];
95
+ for (const e of logEntries) {
96
+ const weight = countTokens(PacketWire.#renderLogEntries([e], countTokens));
97
+ const coordinate = typeof e.coordinate === "string" ? e.coordinate : null;
98
+ const op = typeof e.op === "string" && e.op.length > 0 ? e.op : null;
99
+ // Turn = the loop_seq/turn_seq prefix of the coordinate
100
+ // (log:///<loop_seq>/<turn_seq>/<sequence>); the sequence drops off.
101
+ if (coordinate !== null) {
102
+ const turn = coordinate.split("/").slice(0, 2).join("/");
103
+ byTurn.set(turn, (byTurn.get(turn) ?? 0) + weight);
104
+ }
105
+ const path = PacketWire.#entryPath(coordinate, op);
106
+ if (path !== null)
107
+ perEntry.push({ path, tokens: weight });
108
+ }
109
+ return {
110
+ entries: logEntries.length,
111
+ tokens: logBody ? countTokens(`## Plurnk Service Log\n\n${logBody}`) : 0,
112
+ byTurn: [...byTurn.entries()]
113
+ .map(([turn, tokens]) => ({ turn, tokens }))
114
+ .toSorted((a, b) => {
115
+ const [al, at] = a.turn.split("/").map(Number);
116
+ const [bl, bt] = b.turn.split("/").map(Number);
117
+ return al - bl || at - bt;
118
+ }),
119
+ largest: perEntry.toSorted((a, b) => b.tokens - a.tokens).slice(0, HEAVIEST_COUNT),
120
+ };
121
+ }
122
+ // Number each line of body as `<N>:\t<line>` — mirrors rummy
123
+ // plugins/helpers.js numberLines. The leading digit prevents column-zero
124
+ // fence collisions and gives the model line refs for free (`READ<42-46>`).
125
+ // Used for READ@200 content; index-preview numbering is the framework's
126
+ // job now (baked into the preview string — see renderHeredoc).
127
+ static #numberLines(body, start = 1) {
128
+ if (!body)
129
+ return "";
130
+ const trailingNewline = body.endsWith("\n");
131
+ const source = trailingNewline ? body.slice(0, -1) : body;
132
+ const numbered = source.split("\n").map((line, i) => `${start + i}:\t${line}`).join("\n");
133
+ return trailingNewline ? `${numbered}\n` : numbered;
134
+ }
135
+ // The single content-body renderer EVERY output-emitting op routes through, so the line-number
136
+ // convention the model orients on can't drift: line-navigable mimetypes (text/*) get the `N:\t`
137
+ // prefix from `startLine`; tree-navigable (JSON/XML/HTML) render verbatim so jsonpath/xpath
138
+ // isn't shifted. Empty content ⇒ "" (the meta line stands alone). §render-rule-line-navigable-prefix
139
+ static #renderContentBody(fence, content, mimetype, startLine = 1) {
140
+ if (content.length === 0)
141
+ return "";
142
+ // Line-navigable text gets the `N:\t` source-line prefix from startLine. `startLine === null`
143
+ // means the content is ALREADY source-numbered — a matcher result whose lines carry their own
144
+ // (non-contiguous) source numbers like `143:\t…`; re-numbering would double it to `1:\t143:\t…`
145
+ // (plurnk.md:32 — one source-line prefix). Render verbatim. §render-rule-line-navigable-prefix
146
+ const rendered = MimetypeBinary.isLineNavigableMimetype(mimetype) && startLine !== null
147
+ ? PacketWire.#numberLines(content, startLine)
148
+ : content;
149
+ return PacketWire.#wrapHeredocBody(fence, rendered);
150
+ }
151
+ // Tolerant JSON parser for log entries' rx/tx fields. The engine
152
+ // pre-parses application/json mimetypes, but render may also receive
153
+ // strings (legacy paths, manual tests). Returns null on parse failure.
154
+ static #safeParse(s) {
155
+ try {
156
+ return JSON.parse(s);
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ // Stable JSON: keys sorted alphabetically so the same meta produces the
163
+ // same string across turns — prefix-cache friendly. Mirrors rummy
164
+ // plugins/helpers.js canonicalJson.
165
+ static #canonicalJson(obj) {
166
+ const keys = Object.keys(obj).sort();
167
+ const sorted = {};
168
+ for (const k of keys)
169
+ sorted[k] = obj[k];
170
+ return JSON.stringify(sorted);
171
+ }
172
+ // Wrap a body in heredoc fences. Leading `\n` always (separates the
173
+ // opening fence from the first body character — necessary because
174
+ // numbered bodies start with `1:\t…` which would otherwise collide
175
+ // visually with the `:::FENCE` markers). Trailing `\n` only when the
176
+ // body doesn't already end with one — otherwise you get a doubled
177
+ // newline that renders as a blank line before the closing fence, which
178
+ // reads as "the content has a trailing blank line" when actually it
179
+ // doesn't. The body's own whitespace decides the shape.
180
+ static #wrapHeredocBody(fence, body) {
181
+ const sep = body.endsWith("\n") ? "" : "\n";
182
+ return `<<:::${fence}\n${body}${sep}:::${fence}`;
183
+ }
184
+ // Heredoc block for one channel of one entry. Fence is `URI#channel`
185
+ // (the `<<:::FENCE` packet-rendering marker per wrapHeredocBody — a
186
+ // projection is read-only context, NOT an emittable op, so it must not
187
+ // wear the DSL op-fence; that conflation was the demo.sh corruption bug).
188
+ // When `channel` is null/empty the fence is path-only —
189
+ // this is the default-channel convention: the absence of `#channel` is
190
+ // the addressing of the scheme's default channel, not a missing field.
191
+ // Body is a mimetypes preview, rendered VERBATIM — the framework owns its
192
+ // formatting (N:\t line numbers for text, source-annotated outline for
193
+ // symbols, correct start-line for tail slices) and bakes it into the
194
+ // preview string as of mimetypes 0.7.3, so the service must not re-number
195
+ // it (re-numbering would double-prefix text and mis-number symbol
196
+ // outlines — plurnk-mimetypes#8).
197
+ static #renderHeredoc(uri, channel, body) {
198
+ const fence = channel ? `${uri}#${channel}` : uri;
199
+ return PacketWire.#wrapHeredocBody(fence, body);
200
+ }
201
+ // Render a (scheme, pathname) tuple as the URI the model should SEE.
202
+ // Null scheme → bare pathname. The `file` scheme never reaches this
203
+ // function because Dispatcher.#extractTarget normalizes it to null at the
204
+ // storage boundary; storage and wire output are uniform on this.
205
+ static #renderModelUri(scheme, pathname) {
206
+ const path = pathname ?? "";
207
+ // #370 — a null scheme is a workspace file, whose member key is /rel but whose MODEL-FACING
208
+ // form is the bare relative path (the catalog lists data/users.json; FIND returns it; the
209
+ // model types it). Rendering /data/users.json minted a second spelling of the same file.
210
+ if (scheme === null || scheme === undefined)
211
+ return path.replace(/^\//, "");
212
+ return renderAddress(scheme, path);
213
+ }
214
+ // Render one Log entry → a single bullet line carrying the meta JSON.
215
+ // No body, no fence — every meaningful field is in the JSON. Naming
216
+ // follows the uniform principle: `path` is identity (this log row's
217
+ // own URI), `target` is the URI the action acted on. COPY/MOVE add
218
+ // `source`; currently the engine emits target only (source plumbing
219
+ // pending the COPY/MOVE-specific log shape pass).
220
+ //
221
+ // On error, status >= 400 signals the failure; the message lives in
222
+ // the next packet's user.telemetry.errors[] per SPEC §telemetry. (Forward:
223
+ // meta will gain tokensBefore/After + linesBefore/After to convey
224
+ // change scope without carrying the body content.)
225
+ //
226
+ // Per-entry render: one meta JSON line plus a body block that the model
227
+ // can read to know what it did. Two body cases:
228
+ // 1. READ@200 with content → render rx.content under the target fence.
229
+ // The model asked for content; show it the content. (Matcher is in
230
+ // meta.matcher, count is in meta.matches.)
231
+ // 2. Every other op → re-emit tx as a heredoc in the model's native
232
+ // syntax. The model wrote this; mirror it back so the log is a true
233
+ // record of its actions instead of a row of opaque status codes.
234
+ // The log:/// handle the model sees for an entry — its FOLD target
235
+ // (§open-fold) and the label the budget's heaviest-entries readout reuses,
236
+ // so the readout names an entry exactly as the log does.
237
+ static #entryPath(coordinate, op) {
238
+ if (coordinate === null)
239
+ return null;
240
+ return op !== null ? `log:///${coordinate}/${op}` : `log:///${coordinate}`;
241
+ }
242
+ static #renderLogEntries(entries, countTokens) {
243
+ return entries.map((e) => {
244
+ const meta = {};
245
+ const coordinate = typeof e.coordinate === "string" ? e.coordinate : null;
246
+ const op = typeof e.op === "string" && e.op.length > 0 ? e.op : null;
247
+ const path = PacketWire.#entryPath(coordinate, op);
248
+ if (path !== null)
249
+ meta.path = path;
250
+ if (typeof e.origin === "string")
251
+ meta.origin = e.origin;
252
+ // §env-delta: the environment-delta cause (a sibling run or a scheme),
253
+ // rendered when present; absent ⇒ the owning run itself (self).
254
+ if (typeof e.source === "string" && e.source.length > 0)
255
+ meta.run = e.source;
256
+ if (op !== null)
257
+ meta.op = op;
258
+ if (typeof e.status === "number")
259
+ meta.status = e.status;
260
+ const target = PacketWire.#renderActionTarget(e.target);
261
+ if (target !== null)
262
+ meta.target = target;
263
+ // EXEC's output is a separate stream entry (§exec-stream); its address rides in a
264
+ // `stream` link, distinct from `target` (the cwd / executable path it ran in).
265
+ if (op === "EXEC" && e.attrs !== null && typeof e.attrs === "object" && typeof e.attrs.stream === "string") {
266
+ meta.stream = e.attrs.stream;
267
+ }
268
+ // Parse rx once — reused for the matcher/items enrichment and the body.
269
+ const rx = (typeof e.rx === "string" ? PacketWire.#safeParse(e.rx) : e.rx);
270
+ // §log-row-self-explains — a FAILED op row carries its failure message ON THE META LINE,
271
+ // so the record explains itself in every packet, folded or open. The old shape (a bare
272
+ // status; the message buried in an rx no render shows) is what sent the wildcard model
273
+ // theorizing "SEND[409] probably means bad request?" for 201s, and the jumbo model
274
+ // chasing a phantom "engine error" off a message-less item. The row IS the model's op
275
+ // result — it states its own why; the errors section stays a terse pointer at it.
276
+ if (typeof e.status === "number" && e.status >= 400 && rx !== null && typeof rx === "object") {
277
+ const why = rx;
278
+ const text = typeof why.error === "string" ? why.error : typeof why.reason === "string" ? why.reason : typeof why.message === "string" ? why.message : null;
279
+ if (text !== null && text.length > 0)
280
+ meta.error = text;
281
+ }
282
+ // READ + FIND enrichment: the matcher body (from tx) + `items`, the count
283
+ // of rows the op returned — a matcher's hits, or a bare catalog FIND's entry
284
+ // count. Without it the model can't tell "0 results" from "empty content",
285
+ // nor weigh a re-FIND. `matches` when the dispatch tallied it; else a FIND
286
+ // body is a JSON array whose length IS the count.
287
+ let items = null;
288
+ if (op === "READ" || op === "FIND") {
289
+ const tx = e.tx;
290
+ if (tx !== null && tx !== undefined && typeof tx === "object" && tx.body !== null && typeof tx.body === "object") {
291
+ if (typeof tx.body.raw === "string")
292
+ meta.matcher = tx.body.raw;
293
+ }
294
+ if (rx !== null && typeof rx === "object" && typeof rx.matches === "number") {
295
+ items = rx.matches;
296
+ }
297
+ else if (op === "FIND" && rx !== null && typeof rx === "object" && typeof rx.content === "string") {
298
+ const parsed = PacketWire.#safeParse(rx.content);
299
+ if (Array.isArray(parsed))
300
+ items = parsed.length;
301
+ }
302
+ // The matched set's content weight (sum of the entries' live channel tokens) — the
303
+ // FIND self-describes its hits' READ-cost; carries the per-scheme roll-up in the foist.
304
+ if (op === "FIND" && rx !== null && typeof rx === "object" && typeof rx.itemsTokenTotal === "number") {
305
+ meta.itemsTokenTotal = rx.itemsTokenTotal;
306
+ }
307
+ }
308
+ // The foldable body — computed ALWAYS (folded too), because `tokens` measures it: for
309
+ // an open row that's what a FOLD would save, for a folded row what an OPEN would cost.
310
+ // "" ⇒ genuinely no body (an empty FIND, an empty EDIT span, a @204).
311
+ let body = "";
312
+ if (op === "FIND" && e.status === 200 && items === 0) {
313
+ // Empty FIND result → no body. items:0 already says "empty"; rendering [] under a
314
+ // fence is redundant noise. (The always-foisted empty known:///** / unknown:///**
315
+ // workspace rows are the common case.)
316
+ body = "";
317
+ }
318
+ else if ((op === "READ" || op === "FIND") && e.status === 200 &&
319
+ rx !== null && typeof rx === "object" && typeof rx.content === "string" && rx.content.length > 0) {
320
+ // READ@200 / FIND@200: the content READ pulled, or the catalog rows / matched
321
+ // entries FIND returned (§render-rule-find-renders-result) — the turn-0 foisted
322
+ // FIND(scheme:///**) reaches the packet here, as does the exec-stream injector's
323
+ // foisted READ of the channel. #renderContentBody applies the line-number convention
324
+ // (§render-rule-line-navigable-prefix / §render-rule-tree-navigable-verbatim).
325
+ const mimetype = typeof rx.mimetype === "string" ? rx.mimetype : "text/plain";
326
+ // startLine === null is the matcher-result signal (already source-numbered → verbatim);
327
+ // a number numbers from it; absent → 1 (whole-content default).
328
+ const start = rx.startLine === null ? null : (typeof rx.startLine === "number" ? rx.startLine : 1);
329
+ body = PacketWire.#renderContentBody(target ?? `log:///${coordinate}`, rx.content, mimetype, start);
330
+ }
331
+ else if ((op === "EDIT" || op === "COPY" || op === "MOVE") && rx !== null && typeof rx === "object" && (typeof rx.span === "string" || typeof rx.body === "string")) {
332
+ // EDIT (§edit-result-render): the resulting span as it looks now. editedSpan already
333
+ // line-numbered it with the changed region's REAL offsets (e.g. 50:\t…), so wrap
334
+ // verbatim — re-numbering here would double it (1:\t50:\t…) and lose the true line
335
+ // position. Empty span (content emptied) ⇒ no body — the meta line stands alone.
336
+ // The inline entry-scheme EDIT delivers the span under `span`; a PROPOSED file EDIT's
337
+ // accept delivers the same span under `body` (the generic accept-rx key) — render either.
338
+ const r = rx;
339
+ const span = typeof r.span === "string" ? r.span : (r.body ?? "");
340
+ if (span.length > 0)
341
+ body = PacketWire.#wrapHeredocBody(target ?? `log:///${coordinate}`, span);
342
+ }
343
+ else if (op === "EXEC" && e.tx !== null && e.tx !== undefined && typeof e.tx.body === "string") {
344
+ // EXEC: the literal command body, :::-fenced + line-numbered at the op's log address —
345
+ // the model sees what it ran and can reference lines of its own code. The OUTPUT is a
346
+ // SEPARATE stream (meta.stream), surfaced by the injector, never re-emitted here. §exec-stream
347
+ body = PacketWire.#renderContentBody(path ?? `log:///${coordinate}`, e.tx.body, "text/plain");
348
+ }
349
+ else if ((op === "PLAN" || op === "SEND" || op === "WORK" || op === "FORK") && e.tx !== null && e.tx !== undefined) {
350
+ // PLAN's plan / SEND's message / WORK's & FORK's seed task ride into the log as N:\t
351
+ // content at the op's log address — a dispatch's record IS the task it dispatched, so
352
+ // the next turn reads what each worker is doing (the spawn-then-retask confusion was
353
+ // this body missing: the log showed "spawned worker-db" with no task). The log
354
+ // mirrors the model's WORK, NEVER a repeated <<OP:…:OP tag (tags are emission
355
+ // syntax, not the log paradigm). Bodyless ops (COPY/MOVE/OPEN/FOLD, a non-200 READ/FIND
356
+ // whose matcher already rides in meta, a span-less EDIT) fall through to their meta line.
357
+ const b = e.tx.body;
358
+ const opBody = typeof b === "string" ? b
359
+ : b !== null && typeof b === "object" && typeof b.raw === "string" ? b.raw : "";
360
+ if (opBody.length > 0)
361
+ body = PacketWire.#renderContentBody(path ?? `log:///${coordinate}`, opBody, "text/plain");
362
+ // §run-scheme-collect: an injected SEND (a child run's concluded deliverable surfaced in
363
+ // the parent) has no authored tx body — its payload is the deliverable in rx (a raw string,
364
+ // not the {status} envelope a model SEND gets). Surface it so a child's 2xx reaches the
365
+ // parent OPEN (born-open at the insert), never a bodyless `*` row.
366
+ else if (op === "SEND" && opBody.length === 0 && typeof e.rx === "string" && e.rx.length > 0) {
367
+ body = PacketWire.#renderContentBody(path ?? `log:///${coordinate}`, e.rx, "text/plain");
368
+ }
369
+ }
370
+ else if (op === "error") {
371
+ // §telemetry — a parse-error row is a LOG ITEM; its body is the parser message, which
372
+ // carries the content-offset `line:col`. The model resolves that line against its own
373
+ // emission — READ the folded `model` mirror row (§model-entry) — so no snippet is embedded.
374
+ // Foldable like any body; the errors section keeps only a pointer (status + coordinate).
375
+ const detail = (rx !== null && typeof rx === "object" ? rx : {});
376
+ if (typeof detail.message === "string" && detail.message.length > 0) {
377
+ body = PacketWire.#wrapHeredocBody(path ?? `log:///${coordinate}`, detail.message);
378
+ }
379
+ }
380
+ else if (op === "model") {
381
+ // §model-entry — the model's own verbatim emission, mirrored back so it sees exactly
382
+ // what it produced. Line-numbered like all content (the parser reports errors by line,
383
+ // so the model can reason about its own syntax error). Folded by default → just the
384
+ // meta line until OPENed; the turn-0 exemplar is born open (the worked example).
385
+ if (rx !== null && typeof rx === "object" && typeof rx.content === "string" && rx.content.length > 0) {
386
+ const mimetype = typeof rx.mimetype === "string" ? rx.mimetype : "text/vnd.plurnk";
387
+ body = PacketWire.#renderContentBody(path ?? `log:///${coordinate}`, rx.content, mimetype);
388
+ }
389
+ }
390
+ // tokens on EVERY row (0 when there's genuinely no body) so the model can always weigh
391
+ // it; for a folded row this is the cost an OPEN would add. items present even at 0.
392
+ if (items !== null)
393
+ meta.items = items;
394
+ // 0 for a genuinely empty body — never call countTokens("") (some providers return
395
+ // undefined for it, which JSON.stringify would drop, leaving the row with no tokens).
396
+ meta.tokens = body.length > 0 ? countTokens(body) : 0;
397
+ // lines beside tokens on any row with a navigable body — the count of `N:\t`-numbered
398
+ // lines (fences and unnumbered prose don't count), so the model can plan a <start,end>
399
+ // slice before paying for an OPEN. Omitted when the body isn't line-addressable.
400
+ if (body.length > 0) {
401
+ const navigable = body.split("\n").filter((l) => /^\d+:\t/.test(l)).length;
402
+ if (navigable > 0)
403
+ meta.lines = navigable;
404
+ }
405
+ // Body-state marker — body-aware so `-` never sits on a bodyless row:
406
+ // `*` no body (nothing to OPEN) · `+` open (body shown) · `-` folded (OPEN to expand).
407
+ const marker = body.length === 0 ? "*" : e.folded === true ? "-" : "+";
408
+ const metaLine = `${marker} ${PacketWire.#canonicalJson(meta)}`;
409
+ // Render the body only when OPEN; a folded row is its meta line alone (body hidden).
410
+ return (e.folded !== true && body.length > 0) ? `${metaLine}\n${body}` : metaLine;
411
+ }).join("\n");
412
+ }
413
+ static #renderActionTarget(target) {
414
+ if (target === null || target === undefined)
415
+ return null;
416
+ // An authority-bearing target (run://<name> — the run IS the authority, §run-scheme;
417
+ // a web host http://host/path) keeps its name in `hostname`. Without it a spawn renders
418
+ // as a bare `run://`, indistinguishable across workers — the model goes blind to what it
419
+ // spawned and re-spawns. Reconstruct the authority form when a hostname is present;
420
+ // namespace schemes (plurnk/known) fold their authority into the path and fall through.
421
+ const host = typeof target.hostname === "string" && target.hostname.length > 0 ? target.hostname : null;
422
+ const rendered = host !== null && typeof target.scheme === "string" && target.scheme.length > 0
423
+ ? `${target.scheme}://${host}${target.port ? `:${target.port}` : ""}${target.pathname ?? ""}`
424
+ : PacketWire.#renderModelUri(target.scheme, target.pathname);
425
+ if (rendered.length === 0)
426
+ return null;
427
+ // The channel fragment (#stdout/#stderr) is part of the address — a stream delta has to
428
+ // say WHICH channel it is, not just the entry. §exec-stream
429
+ const fragment = typeof target.fragment === "string" && target.fragment.length > 0 ? `#${target.fragment}` : "";
430
+ return rendered + fragment;
431
+ }
432
+ static #renderGitState(git) {
433
+ const sync = git.ahead > 0 || git.behind > 0 ? ` (↑${git.ahead} ↓${git.behind})` : "";
434
+ return `branch \`${git.branch}\`${sync} — ${git.staged} staged, ${git.unstaged} unstaged, ${git.untracked} untracked`;
435
+ }
436
+ static #renderTelemetryErrors(errors) {
437
+ // Uniform projection off the formal TelemetryEvent envelope (grammar TelemetryEvent.json):
438
+ // render each error by its typed `position`, never by sniffing `kind`. A LogCoordinate is a
439
+ // terse `<status> log:///<coord>` link to the row (the row holds the term + detail); a
440
+ // ContentOffset points the model at the line in its own born-OPEN emission (§model-entry).
441
+ // No JSON dump — the packet teaches, the row carries the body.
442
+ return errors.map((e) => {
443
+ const ev = e;
444
+ const pos = ev.position;
445
+ if (pos?.type === "log-coordinate")
446
+ return `* ${ev.status ?? ""} log:///${pos.coordinate}`.replace(/ +/g, " ");
447
+ if (pos?.type === "content-offset")
448
+ return `* ${ev.kind ?? "error"} ${pos.line}:${pos.column}`;
449
+ return `* ${ev.kind ?? "error"}`;
450
+ }).join("\n");
451
+ }
452
+ }
453
+ //# sourceMappingURL=packet-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-wire.js","sourceRoot":"","sources":["../../src/core/packet-wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const decodePathParens: (s: string) => string;
2
+ //# sourceMappingURL=path-decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-decode.d.ts","sourceRoot":"","sources":["../../src/core/path-decode.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,MAAO,MAAM,KAAG,MAAuD,CAAC"}
@@ -0,0 +1,8 @@
1
+ // #239 item 4 — the grammar's target slot is opaque: a literal `)` closes the op slot, so
2
+ // parens inside a path are percent-encoded (`%28`/`%29`) and the service decodes them at
3
+ // resolve time. ONLY parens are encoded — `:`, spaces, and drive letters pass through
4
+ // literally — so a targeted %28/%29 replacement is exact and safe: it never touches a
5
+ // literal `%` in a path (which decodeURIComponent would mangle). A regex target's source
6
+ // is NOT a path (its parens are groups/alternation), so callers skip it.
7
+ export const decodePathParens = (s) => s.replace(/%28/gi, "(").replace(/%29/gi, ")");
8
+ //# sourceMappingURL=path-decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-decode.js","sourceRoot":"","sources":["../../src/core/path-decode.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,yFAAyF;AACzF,sFAAsF;AACtF,sFAAsF;AACtF,yFAAyF;AACzF,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export default class PluginAttribution {
2
+ static normalize(raw: unknown, packageName: string): string[];
3
+ static read(packageName: string): string[];
4
+ }
5
+ //# sourceMappingURL=plugin-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-attribution.d.ts","sourceRoot":"","sources":["../../src/core/plugin-attribution.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAIlC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAe5D;IAGD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAQzC;CACJ"}
@@ -0,0 +1,39 @@
1
+ // #249 — plugin attribution. A plugin declares an opaque tag in its package.json
2
+ // (plurnk.attribution: string | string[]) that rides the generate() attributions wire.
3
+ // @plurnk/ is reserved: only a @plurnk/-scoped package may declare a @plurnk/ tag.
4
+ import { createRequire } from "node:module";
5
+ const RESERVED_PREFIX = "@plurnk/";
6
+ export default class PluginAttribution {
7
+ // Normalize a raw `plurnk.attribution` value to a tag list AND enforce the reservation.
8
+ // Pure (no I/O) so the contract is unit-testable. A plugin claiming the reserved
9
+ // namespace is a fail-hard contract violation, not a silently-dropped tag.
10
+ static normalize(raw, packageName) {
11
+ if (raw === undefined || raw === null)
12
+ return [];
13
+ const tags = Array.isArray(raw) ? raw : [raw];
14
+ const firstParty = packageName.startsWith(RESERVED_PREFIX);
15
+ const out = [];
16
+ for (const tag of tags) {
17
+ if (typeof tag !== "string" || tag.length === 0) {
18
+ throw new Error(`plugin '${packageName}': plurnk.attribution must be a non-empty string or string[]`);
19
+ }
20
+ if (tag.startsWith(RESERVED_PREFIX) && !firstParty) {
21
+ throw new Error(`plugin '${packageName}': '${RESERVED_PREFIX}' is reserved for ${RESERVED_PREFIX}-scoped packages — '${packageName}' cannot claim '${tag}'`);
22
+ }
23
+ out.push(tag);
24
+ }
25
+ return out;
26
+ }
27
+ // [] when the manifest can't be resolved (strict `exports` with no `./package.json`).
28
+ static read(packageName) {
29
+ let manifest;
30
+ try {
31
+ manifest = createRequire(import.meta.url)(`${packageName}/package.json`);
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ return PluginAttribution.normalize(manifest?.plurnk?.attribution, packageName);
37
+ }
38
+ }
39
+ //# sourceMappingURL=plugin-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-attribution.js","sourceRoot":"","sources":["../../src/core/plugin-attribution.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uFAAuF;AACvF,mFAAmF;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAClC,wFAAwF;IACxF,iFAAiF;IACjF,2EAA2E;IAC3E,MAAM,CAAC,SAAS,CAAC,GAAY,EAAE,WAAmB;QAC9C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,8DAA8D,CAAC,CAAC;YAC1G,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjD,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,OAAO,eAAe,qBAAqB,eAAe,uBAAuB,WAAW,mBAAmB,GAAG,GAAG,CAAC,CAAC;YACjK,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,sFAAsF;IACtF,MAAM,CAAC,IAAI,CAAC,WAAmB;QAC3B,IAAI,QAAgD,CAAC;QACrD,IAAI,CAAC;YACD,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,eAAe,CAAoB,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnF,CAAC;CACJ"}
@@ -0,0 +1,7 @@
1
+ import type { ParsedPath } from "@plurnk/plurnk-grammar";
2
+ export declare function schemeNameOf(path: ParsedPath | null): string | null;
3
+ export declare function foldAuthorityIntoPath(hostname: string | null, pathname: string): string;
4
+ export declare function promptPathname(runId: number, loopSeq: number, turnSeq: number): string;
5
+ export declare function promptLoopPrefix(runId: number, loopSeq: number): string;
6
+ export declare function renderAddress(scheme: string, pathname: string): string;
7
+ //# sourceMappingURL=plurnk-uri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plurnk-uri.d.ts","sourceRoot":"","sources":["../../src/core/plurnk-uri.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvF;AAOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWtE"}