@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,6 @@
1
+ import type Engine from "../core/Engine.ts";
2
+ import type { Db } from "../core/Db.ts";
3
+ export default class Yolo {
4
+ static attachYolo(engine: Engine, _db: Db): void;
5
+ }
6
+ //# sourceMappingURL=yolo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yolo.d.ts","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAuB/C;CACJ"}
@@ -0,0 +1,64 @@
1
+ // Server-side YOLO listener — in-tree subscriber to Engine.onProposalPending
2
+ // that auto-accepts proposals when the loop's persisted flags.yolo === true.
3
+ // No client roundtrip; no human approval; no RPC involvement.
4
+ //
5
+ // === Server-side vs client-side YOLO ===
6
+ //
7
+ // These are distinct features. Both have legitimate use cases. Neither
8
+ // replaces the other.
9
+ //
10
+ // Server-side YOLO (this file)
11
+ // - Enabled via loops.flags.yolo = true. RPC opt-in:
12
+ // loop.run({ prompt, flags: { yolo: true } }).
13
+ // - Engine auto-accepts in-process; the client need not be connected.
14
+ // - Use cases: benchmarks (pure model+grammar timing, no RPC roundtrip
15
+ // in the hot loop), CI runs, ad-hoc internal automation, test
16
+ // fixtures. Anywhere "just run and tell me the final state" is the
17
+ // right contract.
18
+ // - Client apps (@plurnk/plurnk CLI / TUI) intentionally do NOT expose
19
+ // this flag — server YOLO is not standard end-user ergonomics.
20
+ //
21
+ // Client-side YOLO (@plurnk/plurnk --yolo / PLURNK_YOLO)
22
+ // - Client receives the loop/proposal notification and immediately
23
+ // sends loop.resolve({decision:"accept", outcome:"client_yolo"}).
24
+ // - The wire roundtrip still happens; the daemon stays unaware that
25
+ // no human reviewed.
26
+ // - Use cases: real users who want "stop bothering me" ergonomics
27
+ // across an interactive session. Documented in client SPEC §open-fold.
28
+ //
29
+ // Listener fires BEFORE ProposalLifecycle.awaitResolution awaits the waiter, so a
30
+ // synchronous resolveProposal here is delivered to the awaiting dispatch
31
+ // without yielding. The loop/proposal broadcast still goes out (listeners
32
+ // fan out independently) — clients in server-YOLO runs may see a brief
33
+ // proposed-then-resolved blink in their UI. The carried event.flags.yolo
34
+ // lets clients suppress review-UI rendering for those entries.
35
+ export default class Yolo {
36
+ static attachYolo(engine, _db) {
37
+ // §dual-yolo-server-yolo-auto-accept
38
+ engine.onProposalPending((event) => {
39
+ if (!event.flags.yolo)
40
+ return;
41
+ // A [300] question is NOT yolo-able (#346): it exists precisely to stop the world
42
+ // for a human — auto-accepting answers nothing. The session opted into questions
43
+ // (settings.questions), so the stop is wanted even under yolo.
44
+ if (event.op === "SEND" && event.attrs.question !== undefined)
45
+ return;
46
+ try {
47
+ if (event.staleClobberRisk) {
48
+ // #note10 — the target diverged on disk this turn; the model's EDIT is
49
+ // based on a stale read. Reject rather than silently clobber the ambient
50
+ // change. The model sees an ordinary reject (outcome is forensics-only)
51
+ // and can re-READ the entry + retry against the current content.
52
+ engine.resolveProposal(event.logEntryId, { decision: "reject", outcome: "stale_read_clobber" });
53
+ return;
54
+ }
55
+ engine.resolveProposal(event.logEntryId, { decision: "accept" });
56
+ }
57
+ catch {
58
+ // Errors here don't abort dispatch — the proposal stays
59
+ // pending and falls through to the RPC / timeout path.
60
+ }
61
+ });
62
+ }
63
+ }
64
+ //# sourceMappingURL=yolo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yolo.js","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,iCAAiC;AACjC,yDAAyD;AACzD,qDAAqD;AACrD,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,wBAAwB;AACxB,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,wEAAwE;AACxE,wEAAwE;AACxE,2BAA2B;AAC3B,sEAAsE;AACtE,6EAA6E;AAC7E,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AACzE,0EAA0E;AAC1E,uEAAuE;AACvE,yEAAyE;AACzE,+DAA+D;AAM/D,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,UAAU,CAAC,MAAc,EAAE,GAAO;QACrC,qCAAqC;QACrC,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAA2B,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO;YAC9B,kFAAkF;YAClF,iFAAiF;YACjF,+DAA+D;YAC/D,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,IAAK,KAAK,CAAC,KAA+B,CAAC,QAAQ,KAAK,SAAS;gBAAE,OAAO;YACjG,IAAI,CAAC;gBACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBACzB,uEAAuE;oBACvE,yEAAyE;oBACzE,wEAAwE;oBACxE,iEAAiE;oBACjE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBAChG,OAAO;gBACX,CAAC;gBACD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACL,wDAAwD;gBACxD,uDAAuD;YAC3D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ export default class Service {
3
+ #private;
4
+ static main(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AAoBA,MAAM,CAAC,OAAO,OAAO,OAAO;;IA4MxB,OAAa,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqEjC;CACJ"}
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+ import Paths from "./Paths.js";
3
+ import { parseArgs } from "node:util";
4
+ import { existsSync, mkdirSync, copyFileSync, writeFileSync, rmSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
6
+ import { dirname, resolve } from "node:path";
7
+ import { homedir } from "node:os";
8
+ import SqlRite from "@possumtech/sqlrite";
9
+ import Daemon from "./server/Daemon.js";
10
+ import EnvFlags from "./core/EnvFlags.js";
11
+ import EnvDefaults from "./core/env-defaults.js";
12
+ import ProviderInstantiate from "./core/ProviderInstantiate.js";
13
+ import Meta from "@plurnk/plurnk-meta";
14
+ import { resolveActiveAlias } from "@plurnk/plurnk-providers";
15
+ import { Module as AguiModule } from "@plurnk/plurnk-agui";
16
+ // The `plurnk-service` executable: launches the daemon (start) or runs migrations.
17
+ // Not the user-facing client — that is the separate `plurnk` project.
18
+ export default class Service {
19
+ // This file's own directory holds the runtime code + its .sql (src/ in dev, dist/ in a
20
+ // published install); its parent is the package root (migrations/, requirements.md, .env.defaults).
21
+ static #codeDir = dirname(fileURLToPath(import.meta.url));
22
+ static #projectRoot = resolve(Service.#codeDir, "..");
23
+ static #ext = import.meta.url.endsWith(".ts") ? ".ts" : ".js";
24
+ static #homeDir = resolve(homedir(), ".plurnk");
25
+ // First-run bootstrap — run-time, NOT an install script: seed ~/.plurnk so a global
26
+ // install has a stable home for config + the DB. Idempotent (only acts when absent).
27
+ static #ensureHome() {
28
+ // Seed ONCE, on first run (the home is absent). After that the user owns ~/.plurnk —
29
+ // edits and deletions stick, no silent re-seed. The assembled floor is in-memory
30
+ // (§operator-config-env-defaults); `~/.plurnk/.env.defaults` is its rendered catalog,
31
+ // machine-owned and regenerated each boot. Wiping the whole dir is a deliberate reset.
32
+ if (existsSync(Service.#homeDir))
33
+ return;
34
+ mkdirSync(Service.#homeDir, { recursive: true });
35
+ // The first-run model selection lives HERE, as commented peers — an honest surfaced
36
+ // choice (no active default ships; #307). One uncomment per option; agents read this
37
+ // file as naturally as humans do.
38
+ writeFileSync(resolve(Service.#homeDir, ".env"), [
39
+ "# plurnk config — overrides the shipped defaults (~/.plurnk/.env.defaults is the assembled legend).",
40
+ "#",
41
+ "# Pick a model — uncomment ONE block:",
42
+ "#",
43
+ "# LOCAL — your own llama-server / any OpenAI-compatible endpoint:",
44
+ "# PLURNK_MODEL_local=\"openai/gemma\"",
45
+ "# OPENAI_BASE_URL=http://127.0.0.1:11434",
46
+ "# PLURNK_MODEL=local",
47
+ "#",
48
+ "# CLOUD — bring your own key, any openrouter model:",
49
+ "# PLURNK_MODEL_cloud=\"openrouter/qwen/qwen3-coder\"",
50
+ "# OPENROUTER_API_KEY=\"...\"",
51
+ "# PLURNK_MODEL=cloud",
52
+ "#",
53
+ "# PLURNK.AI - Plurnk-optimized endpoint service - https://plurnk.ai/",
54
+ "# PLURNK_MODEL_plurnk=\"plurnk/plurnk\"",
55
+ "# PLURNK_API_KEY=\"...\"",
56
+ "# PLURNK_MODEL=plurnk",
57
+ "",
58
+ ].join("\n"));
59
+ // Seed the default operating policy → ~/.plurnk/AGENTS.md, foisted as ## Plurnk Service Policy
60
+ // (readSystemPolicy). A new install opens with a sane disposition, not a blank policy; the user
61
+ // owns + edits it after — a deleted policy stays deleted, like the .env floor.
62
+ const shippedPolicy = Paths.personality; // the docs corpus ships the default policy
63
+ if (existsSync(shippedPolicy))
64
+ copyFileSync(shippedPolicy, resolve(Service.#homeDir, "AGENTS.md"));
65
+ process.stderr.write(`plurnk-service: created ${Service.#homeDir} — config in ${resolve(Service.#homeDir, ".env")}\n`);
66
+ }
67
+ // Package-owned reference files are REFRESHED from the installed package on every boot —
68
+ // they carry the installed version's prose, so a seed-once snapshot would silently drift.
69
+ // Safe to clobber because they are package-owned, NOT user config: ~/.plurnk/.env (the
70
+ // user's, seeded once above) is never touched here. The knob legend is the assembled
71
+ // ~/.plurnk/.env.defaults, written by main() after assembly; .env.example is that legend's
72
+ // retired name — a machine-owned stale copy is removed so it can't mislead readers.
73
+ static #syncReferenceFiles() {
74
+ if (!existsSync(Service.#homeDir))
75
+ return;
76
+ for (const name of ["INSTALL.md"]) {
77
+ const src = resolve(Service.#projectRoot, name);
78
+ if (existsSync(src))
79
+ copyFileSync(src, resolve(Service.#homeDir, name));
80
+ }
81
+ rmSync(resolve(Service.#homeDir, ".env.example"), { force: true });
82
+ }
83
+ static #expandHome(p) {
84
+ if (p === "~")
85
+ return homedir();
86
+ return p.startsWith("~/") ? resolve(homedir(), p.slice(2)) : p;
87
+ }
88
+ // The node_modules holding the service's plugin deps (exec/scheme/mimetype), resolved
89
+ // from this file's REAL location by the shared membership walk. Falls back to CWD.
90
+ static #pluginsNodeModules() {
91
+ return Meta.nearestNodeModules(Service.#codeDir) ?? resolve(process.cwd(), "node_modules");
92
+ }
93
+ static #die(code, message) {
94
+ process.stderr.write(`${message}\n`);
95
+ process.exit(code);
96
+ }
97
+ static #loadEnv(path, required) {
98
+ if (existsSync(path)) {
99
+ try {
100
+ process.loadEnvFile(path);
101
+ }
102
+ catch (cause) {
103
+ Service.#die(64, `failed to load ${path}: ${cause instanceof Error ? cause.message : String(cause)}`);
104
+ }
105
+ }
106
+ else if (required) {
107
+ Service.#die(64, `${path} does not exist`);
108
+ }
109
+ }
110
+ // node-style env-file flags: --env-file=<path> (required) / --env-file-if-exists=<path>
111
+ // (skip if missing), repeatable, in command-line order. node only loads pre-script files;
112
+ // a published `plurnk-service --env-file=…` needs this post-script loader.
113
+ static #envFileArgs() {
114
+ return process.argv.flatMap((a) => {
115
+ if (a.startsWith("--env-file-if-exists="))
116
+ return [{ path: a.slice(a.indexOf("=") + 1), required: false }];
117
+ if (a.startsWith("--env-file="))
118
+ return [{ path: a.slice(a.indexOf("=") + 1), required: true }];
119
+ return [];
120
+ });
121
+ }
122
+ static #requireEnv(name) {
123
+ const value = process.env[name];
124
+ if (value === undefined || value.length === 0)
125
+ Service.#die(78, `missing required env ${name} (declare it in .env.defaults)`);
126
+ return value;
127
+ }
128
+ static #sqliteKnob(name) {
129
+ const raw = process.env[name];
130
+ if (raw === undefined || raw.trim() === "")
131
+ return undefined;
132
+ const n = Number(raw);
133
+ if (!Number.isInteger(n))
134
+ Service.#die(78, `${name} must be an integer, got ${JSON.stringify(raw)}`);
135
+ return n;
136
+ }
137
+ static async #openDb(dbPath) {
138
+ const tuning = {};
139
+ for (const [env, opt] of [
140
+ ["PLURNK_SERVICE_SQLITE_TIMEOUT", "timeout"],
141
+ ["PLURNK_SERVICE_SQLITE_CACHE_SIZE", "cacheSize"],
142
+ ["PLURNK_SERVICE_SQLITE_MMAP_SIZE", "mmapSize"],
143
+ ["PLURNK_SERVICE_SQLITE_MAX_PAGE_COUNT", "maxPageCount"],
144
+ ]) {
145
+ const v = Service.#sqliteKnob(env);
146
+ if (v !== undefined)
147
+ tuning[opt] = v;
148
+ }
149
+ mkdirSync(dirname(dbPath), { recursive: true });
150
+ try {
151
+ const db = await SqlRite.open({
152
+ path: dbPath,
153
+ dir: [resolve(Service.#projectRoot, "migrations"), Service.#codeDir],
154
+ functions: [resolve(Service.#codeDir, `schemes/cosine${Service.#ext}`)],
155
+ ...tuning,
156
+ });
157
+ return db;
158
+ }
159
+ catch (cause) {
160
+ // SQLite's bare "disk I/O error" names neither file nor culprit. The classic footgun fails
161
+ // exactly this way: the main DB was deleted while -wal/-shm sidecars survived (often still
162
+ // held by a running daemon). Fail hard, legibly — name the path and the stale sidecars.
163
+ const sidecars = [`${dbPath}-wal`, `${dbPath}-shm`].filter((p) => existsSync(p));
164
+ const hint = sidecars.length > 0
165
+ ? ` — stale sidecar(s) present (${sidecars.join(", ")}): a prior daemon may still hold the old database; stop it and delete the sidecars`
166
+ : "";
167
+ throw new Error(`open ${dbPath} failed${hint}`, { cause });
168
+ }
169
+ }
170
+ static async #migrate() {
171
+ const dbPath = Service.#expandHome(Service.#requireEnv("PLURNK_SERVICE_DB_PATH"));
172
+ const db = await Service.#openDb(dbPath);
173
+ try {
174
+ process.stdout.write(`migrated: ${dbPath}\n`);
175
+ }
176
+ finally {
177
+ await db.close();
178
+ }
179
+ }
180
+ static async #start() {
181
+ const dbPath = Service.#expandHome(Service.#requireEnv("PLURNK_SERVICE_DB_PATH"));
182
+ const host = Service.#requireEnv("PLURNK_HOST");
183
+ // PLURNK_PORT is THE client surface — the AG-UI+ listener (the agui daughter module binds
184
+ // it at boot via the seam). Production is single-listener (#357): no daemon WS port.
185
+ const port = Number(Service.#requireEnv("PLURNK_PORT"));
186
+ const db = await Service.#openDb(dbPath);
187
+ const alias = resolveActiveAlias();
188
+ const provider = alias === null ? null : await ProviderInstantiate.loadActiveProvider();
189
+ const daemon = new Daemon({ db, provider, nodeModulesPath: Service.#pluginsNodeModules() });
190
+ // AG-UI daughter module (#355) — THE client surface, always on: its init runs at boot with the
191
+ // seam handle and binds PLURNK_HOST:PLURNK_PORT. The module owns its knobs' semantics.
192
+ const aguiInit = AguiModule.init({
193
+ host, port,
194
+ ...(process.env.PLURNK_AGUI_TOKEN !== undefined && process.env.PLURNK_AGUI_TOKEN.length > 0 ? { token: process.env.PLURNK_AGUI_TOKEN } : {}),
195
+ ...(process.env.PLURNK_AGUI_MAX_TURNS !== undefined && process.env.PLURNK_AGUI_MAX_TURNS.length > 0 ? { maxTurns: Number(process.env.PLURNK_AGUI_MAX_TURNS) } : {}),
196
+ });
197
+ // Capture the module so the banner reports the BOUND address, not the configured one —
198
+ // with PLURNK_PORT=0 the configured value is 0 and banner parsers get garbage.
199
+ let agui = null;
200
+ daemon.registerModule(async (seam) => { agui = await aguiInit(seam); });
201
+ await daemon.start(); // the daemon owns no transport (#364) — the agui module opens the one listener
202
+ const aguiAddr = agui?.address() ?? { host, port };
203
+ // mimetypes#50 recontract: null ⇔ NO embedder (a remote embedder with an incomplete
204
+ // self-report returns info with the unknowns explicitly null — say which case this is).
205
+ const embedInfo = await daemon.mimetypes.embedderInfo();
206
+ if (embedInfo === null) {
207
+ process.stderr.write("plurnk-service: embedder inactive — semantic ~query falls back to FTS keyword ranking. Install @plurnk/plurnk-mimetypes-embeddings for vector search, or see README.md#semantic-search\n");
208
+ }
209
+ else if (embedInfo.maxTokens === null) {
210
+ process.stderr.write("plurnk-service: remote embedder active but reports no token window — set PLURNK_MIMETYPES_EMBED_MAX_TOKENS to the endpoint's limit or embedding derivations will refuse\n");
211
+ }
212
+ // §tokenomics-window-partition coupling (F7): per-request numeric reasoning budgets are
213
+ // IGNORED by llama-server — when thinking is on, only the box's --reasoning-budget launch
214
+ // flag clamps it, and it must equal PLURNK_SERVICE_REASONING. Unverifiable from here, so
215
+ // say it loudly rather than let the reserve be fiction.
216
+ const thinking = process.env.PLURNK_PROVIDERS_THINKING ?? "off";
217
+ if (thinking !== "off") {
218
+ process.stderr.write(`plurnk-service: native thinking is ${thinking} — llama-server ignores per-request numeric budgets; ensure the serving box launches with --reasoning-budget ${process.env.PLURNK_PROVIDERS_THINKING_CAPACITY ?? "?"} or the capacity is not enforced.\n`);
219
+ }
220
+ if (alias === null) {
221
+ process.stderr.write(`plurnk-service: no model configured — uncomment one of the three options (local / cloud / plurnk.ai) in ${resolve(Service.#homeDir, ".env")}. Loops fail legibly until then.\n`);
222
+ }
223
+ const aliasStr = alias === null ? "no model" : `${alias.alias}=${alias.provider}/${alias.model}`;
224
+ process.stdout.write(`plurnk-service agui=http://${aguiAddr.host}:${aguiAddr.port} db=${dbPath} ${aliasStr}\n`);
225
+ const shutdown = async () => { await daemon.stop(); await db.close(); process.exit(0); };
226
+ process.on("SIGINT", shutdown);
227
+ process.on("SIGTERM", shutdown);
228
+ }
229
+ static async main() {
230
+ if (!process.argv.includes("--help") && !process.argv.includes("-h")) {
231
+ Service.#ensureHome();
232
+ Service.#syncReferenceFiles();
233
+ }
234
+ // Env cascade — first write wins (loadEnvFile is set-if-unset), so load highest first.
235
+ // Precedence high→low: CLI --flags > shell env > --env-file/--config > ./.env >
236
+ // ~/.plurnk/.env > the assembled .env.defaults floor (§operator-config-env-defaults:
237
+ // this package's file + every installed member's, uniqueness-checked).
238
+ for (const { path: envFile, required } of Service.#envFileArgs())
239
+ Service.#loadEnv(envFile, required);
240
+ const configFlagIndex = process.argv.findIndex((a) => a === "--config" || a.startsWith("--config="));
241
+ const configFile = (() => {
242
+ if (configFlagIndex === -1)
243
+ return null;
244
+ const arg = process.argv[configFlagIndex];
245
+ if (arg.includes("="))
246
+ return arg.slice(arg.indexOf("=") + 1);
247
+ return process.argv[configFlagIndex + 1] ?? null;
248
+ })();
249
+ if (configFile !== null)
250
+ Service.#loadEnv(configFile, true);
251
+ Service.#loadEnv(".env", false);
252
+ Service.#loadEnv(resolve(Service.#homeDir, ".env"), false);
253
+ // The assembled floor sits under everything the operator set: this package's
254
+ // .env.defaults + every installed member's, one owner per key (collision = boot crash),
255
+ // applied set-if-unset. The catalog renders to ~/.plurnk/.env.defaults — the operator's
256
+ // legend, machine-owned, never read back as config.
257
+ const defaultsFiles = await EnvDefaults.collect(Service.#projectRoot, Service.#pluginsNodeModules());
258
+ EnvDefaults.apply(EnvDefaults.merge(defaultsFiles));
259
+ if (existsSync(Service.#homeDir))
260
+ writeFileSync(resolve(Service.#homeDir, ".env.defaults"), EnvDefaults.renderCatalog(defaultsFiles));
261
+ const flagDescriptors = await EnvFlags.parseEnvDefaults(resolve(Service.#projectRoot, ".env.defaults"));
262
+ const flagOptions = {};
263
+ for (const f of flagDescriptors) {
264
+ flagOptions[f.flagName.replace(/^--/, "")] = { type: "string" };
265
+ }
266
+ const usage = `usage: plurnk-service [options] [migrate]
267
+
268
+ ${EnvFlags.formatFlagsHelp(flagDescriptors)}
269
+
270
+ --env-file=<path> layer env from <path> (repeatable; errors if missing)
271
+ --env-file-if-exists=<path> layer env from <path> if present (repeatable)
272
+ --config=<path> layer additional env from <path>
273
+ -h, --help show this help
274
+ `;
275
+ const { positionals, values } = parseArgs({
276
+ allowPositionals: true,
277
+ strict: false,
278
+ options: { help: { type: "boolean", short: "h" }, config: { type: "string" }, ...flagOptions },
279
+ });
280
+ for (const f of flagDescriptors) {
281
+ const key = f.flagName.replace(/^--/, "");
282
+ const v = values[key];
283
+ if (typeof v === "string")
284
+ process.env[f.envName] = v;
285
+ }
286
+ if (values.help) {
287
+ process.stdout.write(usage);
288
+ process.exit(0);
289
+ }
290
+ const dispatch = { migrate: Service.#migrate, start: Service.#start };
291
+ const subcommand = typeof positionals[0] === "string" ? positionals[0] : "start";
292
+ const handler = dispatch[subcommand];
293
+ if (handler === undefined)
294
+ Service.#die(64, `unknown subcommand: ${subcommand}\n\n${usage}`);
295
+ if (positionals.length > 1)
296
+ Service.#die(64, `unexpected arguments: ${positionals.slice(1).join(" ")}`);
297
+ try {
298
+ await handler();
299
+ }
300
+ catch (cause) {
301
+ process.stderr.write(`${subcommand}: ${cause instanceof Error ? cause.message : String(cause)}\n`);
302
+ if (cause instanceof Error && cause.cause)
303
+ process.stderr.write(` cause: ${cause.cause instanceof Error ? cause.cause.message : String(cause.cause)}\n`);
304
+ process.exit(1);
305
+ }
306
+ }
307
+ }
308
+ await Service.main();
309
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}