@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,366 @@
1
+ // SPEC §membership D4 — git-ls-files workspace membership. §membership-git-membership
2
+ //
3
+ // When a session's `project_root` is a git working tree, the git-tracked
4
+ // files (`git ls-files`) are workspace MEMBERS without any explicit client
5
+ // `pick`. This module resolves that membership and (when token accounting is
6
+ // available) materializes active members' disk content into a body channel,
7
+ // so they appear in the entry catalog (FIND-served) and are READ-able.
8
+ //
9
+ // Decisions realized here:
10
+ // D1 — workspace identity lives on the session (project_root).
11
+ // D3 — disk co-location: members are channel-less markers until materialized;
12
+ // disk stays the truth.
13
+ // D4 — git present → ls-files membership. git absent → no fs-walk (this
14
+ // module no-ops on a non-git project_root, leaving headless / non-git
15
+ // sessions completely unaffected). The pick/hide/view constraint
16
+ // overlay (session_constraints) layers on top: resolveMembership applies
17
+ // `(ls-files ∪ pick) − hide`; view is enforced at the File edit gate.
18
+ // D5 — coverage is exhaustive, work is change-gated: every member is stat'd each
19
+ // turn, but only one whose mtime:size signature changed is re-read,
20
+ // re-tokenized, and rewritten; an unchanged member is a no-op, and the EMI
21
+ // divergence rides that same pass. {§membership-change-gated-sync}
22
+ //
23
+ // git resolution shells out via node:child_process (the same surface the
24
+ // File scheme's tests and the demo fixture use) and respects AbortSignal.
25
+ import { execFile } from "node:child_process";
26
+ import { promisify } from "node:util";
27
+ import { readFile, glob, stat } from "node:fs/promises";
28
+ import { resolve, relative, join, matchesGlob } from "node:path";
29
+ import { MimetypeBinary } from "../content/index.js";
30
+ import EntryCrud from "../schemes/_entry-crud.js";
31
+ import SessionSettings from "./session-settings.js";
32
+ export default class GitMembership {
33
+ static #execFileP = promisify(execFile);
34
+ // project_root for a session. NULL = headless (no membership). Read once per
35
+ // resolution; the File scheme reads the same column for its own root.
36
+ static async #loadSessionRoot(db, sessionId) {
37
+ const row = await db.envelope_get_session.get({ id: sessionId });
38
+ return row?.project_root ?? null;
39
+ }
40
+ // Tracked files of one repo, workspace-relative, via `git ls-files --stage -z`.
41
+ // NUL-delimited so paths with spaces/newlines survive; gitlinks filtered. Empty → [].
42
+ static async #gitTrackedFiles(root, signal) {
43
+ // --stage exposes the mode so submodule gitlinks (mode 160000 — a commit
44
+ // pointer, a directory on disk, not a file) are filtered: a submodule is a
45
+ // separate declared repo, never a member of its superproject.
46
+ const { stdout } = await GitMembership.#execFileP("git", ["ls-files", "--stage", "-z"], { cwd: root, signal, maxBuffer: 64 * 1024 * 1024 });
47
+ const files = [];
48
+ for (const entry of stdout.split("\0")) {
49
+ if (entry.length === 0)
50
+ continue;
51
+ const tab = entry.indexOf("\t");
52
+ if (tab === -1)
53
+ continue;
54
+ if (entry.slice(0, entry.indexOf(" ")) === "160000")
55
+ continue; // gitlink — a submodule boundary
56
+ files.push(entry.slice(tab + 1));
57
+ }
58
+ return files;
59
+ }
60
+ // Untracked-but-not-ignored files of one repo (SPEC §membership-auto-add): `git
61
+ // ls-files --others --exclude-standard -z`. A model-created file is a repo member the
62
+ // moment it exists — no git-stage required — while `.gitignore` still filters it out
63
+ // (--exclude-standard). NUL-delimited so paths with spaces/newlines survive; untracked
64
+ // rows carry no mode, so (unlike --stage) there's no gitlink to filter.
65
+ static async #gitUntrackedFiles(root, signal) {
66
+ const { stdout } = await GitMembership.#execFileP("git", ["ls-files", "--others", "--exclude-standard", "-z"], { cwd: root, signal, maxBuffer: 64 * 1024 * 1024 });
67
+ return stdout.split("\0").filter((e) => e.length > 0);
68
+ }
69
+ // Resolve a declared repo folder to its git toplevel (the repo root containing
70
+ // it), or null if it isn't inside a git tree. `rev-parse --show-toplevel` handles
71
+ // plain repos, linked worktrees (`.git` is a gitdir: file), and submodules alike.
72
+ static async #repoToplevel(dir, signal) {
73
+ try {
74
+ const { stdout } = await GitMembership.#execFileP("git", ["rev-parse", "--show-toplevel"], { cwd: dir, signal });
75
+ return stdout.trim();
76
+ }
77
+ catch {
78
+ return null; // not a git tree (or the dir is gone) — contributes nothing
79
+ }
80
+ }
81
+ // The forest (SPEC §membership, §membership-forest): union every declared repo's MEMBERS —
82
+ // tracked files PLUS untracked-but-not-ignored ones (§membership-auto-add) — each
83
+ // path-prefixed by the repo's location relative to the session root (empty prefix when
84
+ // the repo IS the root). Repos that don't resolve are skipped.
85
+ static async #forestMembers(root, repoDirs, signal) {
86
+ // Resolve every declared entry to its git toplevel, deduped: a glob (`*`) and an
87
+ // explicit declaration can name the same repo, and resolving one repo twice is
88
+ // wasted git work. {§membership-forest}
89
+ const repoRoots = new Set();
90
+ for (const dir of repoDirs) {
91
+ for (const candidate of await GitMembership.#expandRepoDirs(root, dir, signal)) {
92
+ const repoRoot = await GitMembership.#repoToplevel(resolve(root, candidate), signal);
93
+ if (repoRoot !== null)
94
+ repoRoots.add(repoRoot);
95
+ }
96
+ }
97
+ const members = new Set();
98
+ for (const repoRoot of repoRoots) {
99
+ // project_root is no boundary — only the relative-address base. EVERY member is
100
+ // addressed relative to the root, a repo outside it included (a `..`-prefixed
101
+ // path) — so the universal `join(root, pathname)` disk-resolver works unchanged;
102
+ // an absolute pathname would nest UNDER root and never materialize. {§membership-overlay-repo}
103
+ const prefix = relative(root, repoRoot);
104
+ const tracked = await GitMembership.#gitTrackedFiles(repoRoot, signal);
105
+ const untracked = await GitMembership.#gitUntrackedFiles(repoRoot, signal);
106
+ for (const f of [...tracked, ...untracked]) {
107
+ members.add(join(prefix, f));
108
+ }
109
+ }
110
+ return [...members];
111
+ }
112
+ // A declared repo entry → the candidate directories it names. A literal path (no glob
113
+ // magic) passes through untouched — preserving the "declare a repo ANYWHERE, including
114
+ // OUTSIDE the root via `..` or an absolute path" contract that glob can't address upward.
115
+ // A glob pattern is directory-expanded under the root via node:fs glob — `*` matches each
116
+ // immediate child (one level), `**` recurses — dropping file matches, since only a
117
+ // directory can be a repo; #repoToplevel then filters the non-git matches. {§membership-overlay-repo}
118
+ static async #expandRepoDirs(root, dir, signal) {
119
+ if (!GitMembership.#isGlobPattern(dir))
120
+ return [dir];
121
+ const dirs = [];
122
+ for await (const rel of glob(dir, { cwd: root })) {
123
+ if (signal?.aborted)
124
+ return dirs;
125
+ try {
126
+ if ((await stat(resolve(root, rel))).isDirectory())
127
+ dirs.push(rel);
128
+ }
129
+ catch {
130
+ // raced away between glob and stat — not a candidate
131
+ }
132
+ }
133
+ return dirs;
134
+ }
135
+ // Does this declared repo entry carry glob magic (directory-expand it), or is it a
136
+ // literal path (declared as-is)? The metacharacters node:fs glob honors.
137
+ static #isGlobPattern(s) {
138
+ return /[*?[\]{}]/.test(s);
139
+ }
140
+ // Detect a tracked file's mimetype (mirrors File.detectFileMimetype): route
141
+ // through the Mimetypes service when present, normalizing the auto-text result
142
+ // to the text primitive (plurnk-service never auto-derives text/plain). No
143
+ // service → text primitive.
144
+ static async #detectMimetype(canonical, mimetypes) {
145
+ if (mimetypes !== undefined) {
146
+ const detected = await mimetypes.detect({ path: canonical });
147
+ return MimetypeBinary.normalizeAutoTextMimetype(detected);
148
+ }
149
+ return MimetypeBinary.TEXT_PRIMITIVE_MIMETYPE;
150
+ }
151
+ // Shared overlay inputs — the candidate sets (git tracked+untracked union, pick scan) and
152
+ // the overlay globs, before composition. Single-sources the (git ∪ pick) derivation + the
153
+ // glob sets for resolveGitMembership (compose + reconcile) and resolveMembershipEffects
154
+ // (derive per-file effect for clients, #243). Headless (no project_root) → null.
155
+ static async #resolveOverlayInputs(db, sessionId, signal) {
156
+ const root = await GitMembership.#loadSessionRoot(db, sessionId);
157
+ if (root === null)
158
+ return null; // headless — no disk surface to resolve
159
+ const constraints = await db.crud_list_session_constraints.all({ session_id: sessionId });
160
+ const hideGlobs = constraints.filter((c) => c.effect === "hide").map((c) => c.glob);
161
+ const pickGlobs = constraints.filter((c) => c.effect === "pick").map((c) => c.glob);
162
+ const viewGlobs = constraints.filter((c) => c.effect === "view").map((c) => c.glob);
163
+ // git substrate — the union of the session's DECLARED repos' MEMBERS: tracked files
164
+ // plus untracked-but-not-ignored ones (§membership-auto-add). PLURNK_SERVICE_GIT_ALLOWED=0 is
165
+ // the hard ceiling (deny all git membership); PLURNK_SERVICE_GIT_AUTO=1 declares project_root
166
+ // as an implicit repo. Empty when git is denied or no declared repo resolves, so
167
+ // `pick` is then the sole source. No early-return on non-git.
168
+ const repoDirs = constraints.filter((c) => c.effect === "repo").map((c) => c.glob); // a declared repo's ls-files join membership, path-prefixed — §membership-overlay-repo
169
+ if (process.env.PLURNK_SERVICE_GIT_AUTO === "1")
170
+ repoDirs.push(root); // ALLOWED ceiling gates the AUTO default — §membership-git-flags
171
+ // #232 — git:false is a session-level tighten of the env ALLOWED ceiling (env AND session).
172
+ const sessionGit = (await SessionSettings.read(db, sessionId)).git;
173
+ const gitMembers = process.env.PLURNK_SERVICE_GIT_ALLOWED === "1" && sessionGit !== false
174
+ ? await GitMembership.#forestMembers(root, repoDirs, signal)
175
+ : [];
176
+ // `pick` overlay — a targeted, client-dictated scan for untracked matches
177
+ // (node:fs glob over the client's pattern, never a blind walk).
178
+ const picked = pickGlobs.length === 0 ? [] : await GitMembership.#scanPickMembers(root, pickGlobs, signal); // §membership-overlay-pick
179
+ return { root, gitMembers, picked, hideGlobs, viewGlobs };
180
+ }
181
+ // Resolve a session's file membership: the desired set is (git ls-files ∪ pick
182
+ // globs) − hide globs (SPEC §membership overlay), reconciled against the registered
183
+ // overlay-owned members so entries == members. Channel-less rows — disk is the
184
+ // truth (D3); the row is the membership marker File.read gates on. Returns the
185
+ // desired pathnames so the caller can materialize them through writeEntry.
186
+ //
187
+ // signal-respecting: git shell-outs + the pick scan honor `signal`. Headless
188
+ // (no project_root) yields nothing; a non-git root with pick-globs still resolves.
189
+ static async resolveGitMembership(db, sessionId, signal) {
190
+ const inputs = await GitMembership.#resolveOverlayInputs(db, sessionId, signal);
191
+ if (inputs === null)
192
+ return []; // headless — no disk surface to resolve
193
+ const { gitMembers: members, picked, hideGlobs } = inputs;
194
+ // Compose: (git ∪ pick) − hide (§membership-overlay-hide), tracking origin for reconciliation — a path
195
+ // in `members` is 'git', a pick-only match is 'constraint'.
196
+ const memberSet = new Set(members);
197
+ const passesHide = (p) => hideGlobs.length === 0 || !hideGlobs.some((g) => matchesGlob(p, g));
198
+ const desiredGit = members.filter(passesHide);
199
+ const desiredPick = picked.filter((p) => !memberSet.has(p) && passesHide(p));
200
+ // Glob matching above stays bare (client `pick`/`hide` patterns are bare);
201
+ // storage, reconcile, and the returned set are namespace-absolute (`/src/foo.ts`)
202
+ // so they match the parser's pathname the shared read helper queries by.
203
+ const desired = [...desiredGit, ...desiredPick].map((p) => `/${p}`);
204
+ const desiredSet = new Set(desired);
205
+ // Reconcile so entries == members (the constitutive invariant): register the
206
+ // desired with their origin, then un-register any overlay-owned member ('git'
207
+ // or 'constraint') no longer desired — untracked, unmatched, or newly hidden.
208
+ // Model-created ('client') members are never reclaimed.
209
+ for (const pathname of desiredGit) {
210
+ await db.crud_register_session_member.get({ session_id: sessionId, scheme: null, pathname: `/${pathname}`, membership_origin: "git" });
211
+ }
212
+ for (const pathname of desiredPick) {
213
+ await db.crud_register_session_member.get({ session_id: sessionId, scheme: null, pathname: `/${pathname}`, membership_origin: "constraint" });
214
+ }
215
+ const registered = await db.crud_list_reconcilable_members.all({ session_id: sessionId });
216
+ for (const m of registered) {
217
+ if (!desiredSet.has(m.pathname)) {
218
+ await db.crud_delete_entry.run({ entry_id: m.id });
219
+ }
220
+ }
221
+ return desired;
222
+ }
223
+ // Resolve each candidate's membership EFFECT without mutating — a read for clients (#243,
224
+ // plurnk.nvim gutter signs): the same (git ∪ pick) / hide / view resolution resolveGitMembership
225
+ // composes, surfaced per-file so a client signs member/view/hidden with ZERO glob-matching of
226
+ // its own. `members` are (git ∪ pick) − hide, each tagged `view` (read-only, refused at the
227
+ // File edit gate §membership-overlay-view) or plain `member`; `hidden` are candidates a `hide`
228
+ // glob excludes (project files absent from the manifest). Paths namespace-absolute, matching
229
+ // the manifest + storage. Headless → empty. {§membership-resolved-effects}
230
+ static async resolveMembershipEffects(db, sessionId, signal) {
231
+ const inputs = await GitMembership.#resolveOverlayInputs(db, sessionId, signal);
232
+ if (inputs === null)
233
+ return { members: [], hidden: [] }; // headless
234
+ const { gitMembers, picked, hideGlobs, viewGlobs } = inputs;
235
+ // Match hide/view against the BARE path (client globs are bare, as the edit gate does),
236
+ // then namespace-prefix the output. Composition mirrors resolveGitMembership exactly:
237
+ // members = (git ∪ pick) − hide, hidden = (git ∪ pick) ∩ hide.
238
+ const isHidden = (p) => hideGlobs.some((g) => matchesGlob(p, g));
239
+ const isView = (p) => viewGlobs.some((g) => matchesGlob(p, g));
240
+ const members = [];
241
+ const hidden = [];
242
+ for (const p of new Set([...gitMembers, ...picked])) {
243
+ if (isHidden(p))
244
+ hidden.push(`/${p}`);
245
+ else
246
+ members.push({ path: `/${p}`, effect: isView(p) ? "view" : "member" });
247
+ }
248
+ members.sort((a, b) => a.path.localeCompare(b.path));
249
+ hidden.sort();
250
+ return { members, hidden };
251
+ }
252
+ // Targeted client-dictated scan (SPEC §membership `pick`) — enumerate disk files
253
+ // matching the client's pick-globs via node:fs glob (the pattern bounds the
254
+ // traversal; never a blind fs-walk). Files only — directories aren't members.
255
+ // Workspace-relative paths, the same shape as git ls-files.
256
+ static async #scanPickMembers(root, pickGlobs, signal) {
257
+ const matches = new Set();
258
+ for (const pattern of pickGlobs) {
259
+ for await (const rel of glob(pattern, { cwd: root })) {
260
+ if (signal?.aborted)
261
+ return [...matches];
262
+ try {
263
+ if ((await stat(resolve(root, rel))).isFile())
264
+ matches.add(rel);
265
+ }
266
+ catch {
267
+ // raced away between glob and stat — not a member
268
+ }
269
+ }
270
+ }
271
+ return [...matches];
272
+ }
273
+ // Materialize a member's disk content into a body channel via writeEntry (the
274
+ // entry-write paradigm) — so it appears in the manifest catalog and is READ-able
275
+ // (D4/D5). Change-gated: a member whose mtime:size signature is unchanged since its
276
+ // last sync is a no-op (the stat-gate below) — re-read + rewrite only on change.
277
+ // Binary members materialize as an EMPTY body
278
+ // channel stamped with their binary mimetype (#186 — visible in the manifest
279
+ // and READ-415 via the one isBinaryMimetype gate, not a 404 ghost).
280
+ // Missing-on-disk (tracked but deleted in the working tree) is
281
+ // skipped — membership stands, no channel.
282
+ static async #materializeMember(pathname, root, ctx) {
283
+ const canonical = join(root, pathname); // pathname is namespace-absolute (`/src/foo.ts`); join roots it at the workspace
284
+ // SPEC §membership-change-gated-sync — the cheap detect is a stat (mtime:size),
285
+ // never a content read: a member whose signature matches its last sync is a
286
+ // no-op (not re-read, re-tokenized, or rewritten). Coverage stays exhaustive
287
+ // (every member is stat'd); work is proportional to change.
288
+ let sig;
289
+ try {
290
+ const st = await stat(canonical);
291
+ sig = `${st.mtimeMs}:${st.size}`;
292
+ }
293
+ catch (err) {
294
+ if (err.code === "ENOENT")
295
+ return null;
296
+ throw err;
297
+ }
298
+ const known = await ctx.db.crud_get_member_sig.get({
299
+ session_id: ctx.sessionId, scheme: null, pathname,
300
+ });
301
+ if (known !== undefined && known.synced_sig === sig)
302
+ return null; // unchanged — the change-gate
303
+ const mimetype = await GitMembership.#detectMimetype(canonical, ctx.mimetypes);
304
+ if (MimetypeBinary.isBinaryMimetype(mimetype)) {
305
+ // Empty body channel stamped with the real binary mimetype — a first-
306
+ // class entry that READ-415s through readSessionEntry's isBinaryMimetype
307
+ // gate (#186), not a channel-less row that would read as 404.
308
+ const r = await EntryCrud.writeEntry(pathname, { channels: { body: { content: "", mimetype } }, tags: [] }, ctx, null);
309
+ if (r.entryId !== null)
310
+ await ctx.db.crud_set_synced_sig.run({ entry_id: r.entryId, synced_sig: sig });
311
+ return null; // binary bodies are empty markers — no text divergence to narrate
312
+ }
313
+ let buf;
314
+ try {
315
+ buf = await readFile(canonical);
316
+ }
317
+ catch (err) {
318
+ if (err.code === "ENOENT")
319
+ return null;
320
+ throw err;
321
+ }
322
+ // §membership-binary-sniff (#320) — the extension map can lie (.wasm fell through to
323
+ // the markdown DEFAULT and a 3.3MB blob entered the corpus as prose, three copies,
324
+ // ~10M tokens). NUL bytes in the head are binary truth regardless of the label:
325
+ // re-stamp octet-stream and take the binary arm (empty body, READ-415, never
326
+ // FTS'd/embedded/tokenized as text).
327
+ if (buf.subarray(0, 8192).includes(0)) {
328
+ const r = await EntryCrud.writeEntry(pathname, { channels: { body: { content: "", mimetype: "application/octet-stream" } }, tags: [] }, ctx, null);
329
+ if (r.entryId !== null)
330
+ await ctx.db.crud_set_synced_sig.run({ entry_id: r.entryId, synced_sig: sig });
331
+ return null;
332
+ }
333
+ const content = buf.toString("utf8");
334
+ // §env-delta — capture an out-of-band disk change BEFORE the refresh overwrites
335
+ // the entry: an existing body channel whose content differs from disk is an
336
+ // ambient divergence (D5). writeEntry then refreshes the entry to disk truth.
337
+ const prior = await ctx.db.ops_read_channel.get({
338
+ session_id: ctx.sessionId, scheme: null, pathname, channel: "body",
339
+ });
340
+ const result = await EntryCrud.writeEntry(pathname, { channels: { body: { content, mimetype } }, tags: [] }, ctx, null);
341
+ if (result.entryId !== null)
342
+ await ctx.db.crud_set_synced_sig.run({ entry_id: result.entryId, synced_sig: sig });
343
+ if (prior !== undefined && prior.content !== content && result.entryId !== null) {
344
+ return { pathname, scheme: null, entryId: result.entryId, channel: "body", before: prior.content, after: content };
345
+ }
346
+ return null;
347
+ }
348
+ // Full membership + materialization pass for a run. Registers git members,
349
+ // then materializes each active (on-disk, non-binary) member as an entry
350
+ // through writeEntry. Called at packet-composition time (Engine.runTurn) per
351
+ // D5. No-ops on headless / non-git sessions.
352
+ static async indexGitMembership(ctx) {
353
+ const root = await GitMembership.#loadSessionRoot(ctx.db, ctx.sessionId);
354
+ if (root === null)
355
+ return [];
356
+ const tracked = await GitMembership.resolveGitMembership(ctx.db, ctx.sessionId, ctx.signal);
357
+ const divergences = [];
358
+ for (const pathname of tracked) {
359
+ const divergence = await GitMembership.#materializeMember(pathname, root, ctx);
360
+ if (divergence !== null)
361
+ divergences.push(divergence);
362
+ }
363
+ return divergences;
364
+ }
365
+ }
366
+ //# sourceMappingURL=git-membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-membership.js","sourceRoot":"","sources":["../../src/core/git-membership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Db } from "./Db.ts";
2
+ export interface GitStatus {
3
+ branch: string;
4
+ ahead: number;
5
+ behind: number;
6
+ staged: number;
7
+ unstaged: number;
8
+ untracked: number;
9
+ }
10
+ export default class GitState {
11
+ #private;
12
+ static enabled(): boolean;
13
+ static status(db: Db, sessionId: number, signal: AbortSignal | undefined): Promise<GitStatus | null>;
14
+ }
15
+ //# sourceMappingURL=git-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-state.d.ts","sourceRoot":"","sources":["../../src/core/git-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAG9C,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AASD,MAAM,CAAC,OAAO,OAAO,QAAQ;;IAGzB,MAAM,CAAC,OAAO,IAAI,OAAO,CAIxB;IAED,OAAa,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAazG;CA2BJ"}
@@ -0,0 +1,67 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import SessionSettings from "./session-settings.js";
4
+ // SPEC §telemetry — git working-tree state for the telemetry section: the model's
5
+ // ambient "where am I, what have I touched" without running a command. A
6
+ // service-side shell-out (git is local + cheap, the same surface git membership
7
+ // uses), gated by `PLURNK_SERVICE_GIT_ALLOWED` (the hard service ceiling) + a git
8
+ // worktree. Returns null when git is disabled, headless, or non-git — the
9
+ // telemetry block is then omitted entirely. This is the *state* read; the
10
+ // model's arbitrary git *operations* go through the (daughter) EXEC[git].
11
+ export default class GitState {
12
+ static #execFileP = promisify(execFile);
13
+ static enabled() {
14
+ // Feature-flag convention: `=== "1"` exactly. `.env.defaults` seeds it to 1
15
+ // (default-on); a higher cascade level (shell/params) sets 0 to disable.
16
+ return process.env.PLURNK_SERVICE_GIT_ALLOWED === "1";
17
+ }
18
+ static async status(db, sessionId, signal) {
19
+ // #232 — git:false denies git telemetry for the session (env AND session ceiling).
20
+ if (!GitState.enabled() || (await SessionSettings.read(db, sessionId)).git === false)
21
+ return null;
22
+ const row = await db.envelope_get_session.get({ id: sessionId });
23
+ const root = row?.project_root ?? null;
24
+ if (root === null)
25
+ return null;
26
+ let stdout;
27
+ try {
28
+ ({ stdout } = await GitState.#execFileP("git", ["status", "--porcelain", "--branch"], { cwd: root, signal, maxBuffer: 16 * 1024 * 1024 }));
29
+ }
30
+ catch {
31
+ return null; // not a git worktree, or git absent — fail closed, no telemetry
32
+ }
33
+ return GitState.#parse(stdout);
34
+ }
35
+ // `git status --porcelain --branch`: a `## branch...remote [ahead N, behind M]`
36
+ // header, then one XY-prefixed line per change (X=index/staged, Y=worktree/
37
+ // unstaged; `??` = untracked).
38
+ static #parse(stdout) {
39
+ let branch = "";
40
+ let ahead = 0;
41
+ let behind = 0;
42
+ let staged = 0;
43
+ let unstaged = 0;
44
+ let untracked = 0;
45
+ for (const line of stdout.split("\n")) {
46
+ if (line.length === 0)
47
+ continue;
48
+ if (line.startsWith("## ")) {
49
+ branch = line.slice(3).split(/\.\.\.| /, 1)[0];
50
+ ahead = Number(line.match(/ahead (\d+)/)?.[1] ?? 0);
51
+ behind = Number(line.match(/behind (\d+)/)?.[1] ?? 0);
52
+ continue;
53
+ }
54
+ const xy = line.slice(0, 2);
55
+ if (xy === "??") {
56
+ untracked++;
57
+ continue;
58
+ }
59
+ if (xy[0] !== " ")
60
+ staged++;
61
+ if (xy[1] !== " ")
62
+ unstaged++;
63
+ }
64
+ return { branch, ahead, behind, staged, unstaged, untracked };
65
+ }
66
+ }
67
+ //# sourceMappingURL=git-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-state.js","sourceRoot":"","sources":["../../src/core/git-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const resolveInjectPath: (raw: string) => string;
2
+ export declare const readPacketInject: () => Promise<string | null>;
3
+ export declare const readSystemPolicy: () => Promise<string | null>;
4
+ export declare const readProjectPolicy: (projectRoot: string | null) => Promise<string | null>;
5
+ //# sourceMappingURL=packet-inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-inject.d.ts","sourceRoot":"","sources":["../../src/core/packet-inject.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,iBAAiB,QAAS,MAAM,KAAG,MACc,CAAC;AAE/D,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAI9D,CAAC;AAcF,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAK9D,CAAC;AAGF,eAAO,MAAM,iBAAiB,gBAAuB,MAAM,GAAG,IAAI,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAKzF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ // #240 — PLURNK_SERVICE_PACKET_INJECT: an operator markdown file injected as a system-slot section after
5
+ // the teaching (the cached prefix). The operator-side complement to the plugin `transformSections`
6
+ // hook — a pressure valve so "improve the packet" reshapes operator content, not the core. Read
7
+ // PER-TURN (live edits, least surprise); a set-but-unreadable path FAILS HARD (a deliberate setting
8
+ // with a broken path is a misconfig, surfaced not hidden). Unset/empty → no section.
9
+ export const resolveInjectPath = (raw) => raw.startsWith("~/") ? join(homedir(), raw.slice(2)) : raw;
10
+ export const readPacketInject = async () => {
11
+ const raw = process.env.PLURNK_SERVICE_PACKET_INJECT?.trim();
12
+ if (!raw)
13
+ return null;
14
+ return readFile(resolveInjectPath(raw), "utf8");
15
+ };
16
+ // Policy sections (## Plurnk Service Policy / ## Project Policy) — the client's foot in the privileged
17
+ // system zone, distinct from the freeform PLURNK_SERVICE_PACKET_INJECT. A DEFAULT path that's absent is fine
18
+ // (no section); an EXPLICIT env override that can't be read FAILS HARD (a deliberate-but-broken
19
+ // setting is a misconfig). Read per-turn for live edits.
20
+ const readPolicy = async (path, explicit) => {
21
+ try {
22
+ return (await readFile(path, "utf8")).trim() || null;
23
+ }
24
+ catch (err) {
25
+ if (explicit)
26
+ throw err;
27
+ return null;
28
+ }
29
+ };
30
+ // System Policy: PLURNK_SERVICE_POLICY (~-expanded) or the default ~/.plurnk/AGENTS.md. An EXPLICITLY-empty
31
+ // PLURNK_SERVICE_POLICY disables it (undefined → default; "" → off; a path → that file). The test cascade
32
+ // (.env.test) sets it empty so test/demo/live packets never foist the operator's dogfooding policy.
33
+ export const readSystemPolicy = async () => {
34
+ const raw = process.env.PLURNK_SERVICE_POLICY;
35
+ if (raw !== undefined && raw.trim() === "")
36
+ return null; // explicit empty → off (test isolation)
37
+ const env = raw?.trim();
38
+ return readPolicy(env ? resolveInjectPath(env) : join(homedir(), ".plurnk", "AGENTS.md"), !!env);
39
+ };
40
+ // Project Policy: PLURNK_SERVICE_PROJECT (relative to projectRoot, ~-expanded) or <projectRoot>/AGENTS.md.
41
+ export const readProjectPolicy = async (projectRoot) => {
42
+ const env = process.env.PLURNK_SERVICE_PROJECT?.trim();
43
+ if (!env && projectRoot === null)
44
+ return null; // headless, no workspace + no override
45
+ const base = projectRoot ?? process.cwd();
46
+ return readPolicy(env ? resolve(base, resolveInjectPath(env)) : join(base, "AGENTS.md"), !!env);
47
+ };
48
+ //# sourceMappingURL=packet-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-inject.js","sourceRoot":"","sources":["../../src/core/packet-inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,yGAAyG;AACzG,mGAAmG;AACnG,gGAAgG;AAChG,oGAAoG;AACpG,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE,CACrD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAA4B,EAAE;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,uGAAuG;AACvG,6GAA6G;AAC7G,gGAAgG;AAChG,yDAAyD;AACzD,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,QAAiB,EAA0B,EAAE;IACjF,IAAI,CAAC;QAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAAC,CAAC;IAC7D,OAAO,GAAG,EAAE,CAAC;QAAC,IAAI,QAAQ;YAAE,MAAM,GAAG,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACzD,CAAC,CAAC;AAEF,4GAA4G;AAC5G,0GAA0G;AAC1G,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAA4B,EAAE;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,wCAAwC;IACjG,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IACxB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,WAA0B,EAA0B,EAAE;IAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,GAAG,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtF,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACpG,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ export interface PacketSection {
2
+ name: string;
3
+ slot: "system" | "user";
4
+ header: string | null;
5
+ content: string;
6
+ tokens: number;
7
+ }
8
+ interface SectionView {
9
+ name?: unknown;
10
+ slot?: unknown;
11
+ header?: unknown;
12
+ content?: unknown;
13
+ tokens?: unknown;
14
+ }
15
+ interface Packet {
16
+ sections?: SectionView[];
17
+ }
18
+ type CountTokens = (text: string) => number;
19
+ export default class PacketWire {
20
+ #private;
21
+ static renderSlot(sections: SectionView[], slot: "system" | "user"): string;
22
+ static renderSection(s: SectionView): string;
23
+ static renderErrors(errors: unknown): string;
24
+ static renderChildPointers(rows: unknown): string;
25
+ static renderGit(git: unknown): string;
26
+ static renderLog(entries: unknown, countTokens: CountTokens): string;
27
+ static sectionContent(packet: Packet, name: string): string;
28
+ static packetToWireMessages(packet: Packet): Array<{
29
+ role: string;
30
+ content: string;
31
+ }>;
32
+ static measureLogBudget(entries: unknown, countTokens: CountTokens): {
33
+ entries: number;
34
+ tokens: number;
35
+ byTurn: Array<{
36
+ turn: string;
37
+ tokens: number;
38
+ }>;
39
+ largest: Array<{
40
+ path: string;
41
+ tokens: number;
42
+ }>;
43
+ };
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=packet-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-wire.d.ts","sourceRoot":"","sources":["../../src/core/packet-wire.ts"],"names":[],"mappings":"AAiDA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IAAG,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE;AAC/G,UAAU,MAAM;IAAG,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE;AAC7C,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAU;;IAK3B,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAM1E;IAMD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAI3C;IAOD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAG3C;IAMD,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGhD;IAGD,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAErC;IAID,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAGnE;IAKD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;IAKD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAMpF;IASD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG;QACjE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChD,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,CA+BA;CA2TJ"}