@plurnk/plurnk-service 1.4.0 → 1.5.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 (227) hide show
  1. package/.env.defaults +20 -23
  2. package/INSTALL.md +6 -5
  3. package/README.md +1 -0
  4. package/SPEC.md +250 -149
  5. package/dist/Paths.d.ts.map +1 -1
  6. package/dist/Paths.js +2 -3
  7. package/dist/Paths.js.map +1 -1
  8. package/dist/build-info.json +1 -1
  9. package/dist/content/index.d.ts +1 -0
  10. package/dist/content/index.d.ts.map +1 -1
  11. package/dist/content/index.js +1 -0
  12. package/dist/content/index.js.map +1 -1
  13. package/dist/content/line-marker.d.ts +7 -3
  14. package/dist/content/line-marker.d.ts.map +1 -1
  15. package/dist/content/line-marker.js +2 -1
  16. package/dist/content/line-marker.js.map +1 -1
  17. package/dist/content/matcher.d.ts +1 -1
  18. package/dist/content/matcher.d.ts.map +1 -1
  19. package/dist/content/matcher.js +2 -2
  20. package/dist/content/matcher.js.map +1 -1
  21. package/dist/content/read-projector.d.ts +14 -0
  22. package/dist/content/read-projector.d.ts.map +1 -0
  23. package/dist/content/read-projector.js +86 -0
  24. package/dist/content/read-projector.js.map +1 -0
  25. package/dist/content/read-resolve.d.ts +2 -7
  26. package/dist/content/read-resolve.d.ts.map +1 -1
  27. package/dist/content/read-resolve.js +32 -107
  28. package/dist/content/read-resolve.js.map +1 -1
  29. package/dist/core/BranchReceipt.d.ts +0 -1
  30. package/dist/core/BranchReceipt.d.ts.map +1 -1
  31. package/dist/core/BranchReceipt.js +0 -3
  32. package/dist/core/BranchReceipt.js.map +1 -1
  33. package/dist/core/BudgetOverflow.d.ts +0 -3
  34. package/dist/core/BudgetOverflow.d.ts.map +1 -1
  35. package/dist/core/BudgetOverflow.js +3 -15
  36. package/dist/core/BudgetOverflow.js.map +1 -1
  37. package/dist/core/ChannelWrite.d.ts +3 -0
  38. package/dist/core/ChannelWrite.d.ts.map +1 -1
  39. package/dist/core/ChannelWrite.js +2 -2
  40. package/dist/core/ChannelWrite.js.map +1 -1
  41. package/dist/core/ChannelWrite.sql +4 -3
  42. package/dist/core/CoreSchemeServices.d.ts +10 -2
  43. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  44. package/dist/core/CoreSchemeServices.js.map +1 -1
  45. package/dist/core/Dispatcher.d.ts +3 -7
  46. package/dist/core/Dispatcher.d.ts.map +1 -1
  47. package/dist/core/Dispatcher.js +283 -217
  48. package/dist/core/Dispatcher.js.map +1 -1
  49. package/dist/core/Engine.d.ts +19 -12
  50. package/dist/core/Engine.d.ts.map +1 -1
  51. package/dist/core/Engine.js +261 -167
  52. package/dist/core/Engine.js.map +1 -1
  53. package/dist/core/Engine.sql +66 -63
  54. package/dist/core/LogBody.d.ts +2 -1
  55. package/dist/core/LogBody.d.ts.map +1 -1
  56. package/dist/core/LogBody.js +33 -1
  57. package/dist/core/LogBody.js.map +1 -1
  58. package/dist/core/LoopLifecycle.d.ts +1 -2
  59. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  60. package/dist/core/LoopLifecycle.js +1 -4
  61. package/dist/core/LoopLifecycle.js.map +1 -1
  62. package/dist/core/LoopLifecycle.sql +1 -4
  63. package/dist/core/PacketBuilder.d.ts +3 -2
  64. package/dist/core/PacketBuilder.d.ts.map +1 -1
  65. package/dist/core/PacketBuilder.js +16 -16
  66. package/dist/core/PacketBuilder.js.map +1 -1
  67. package/dist/core/StrikeRail.d.ts +5 -1
  68. package/dist/core/StrikeRail.d.ts.map +1 -1
  69. package/dist/core/StrikeRail.js +4 -3
  70. package/dist/core/StrikeRail.js.map +1 -1
  71. package/dist/core/TerminalResult.d.ts +16 -0
  72. package/dist/core/TerminalResult.d.ts.map +1 -0
  73. package/dist/core/TerminalResult.js +49 -0
  74. package/dist/core/TerminalResult.js.map +1 -0
  75. package/dist/core/caps/CapsResolve.d.ts +5 -1
  76. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  77. package/dist/core/caps/CapsResolve.js +8 -4
  78. package/dist/core/caps/CapsResolve.js.map +1 -1
  79. package/dist/core/caps/DbChannelCaps.d.ts +1 -1
  80. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  81. package/dist/core/caps/DbChannelCaps.js +6 -4
  82. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  83. package/dist/core/caps/DbEntryCaps.d.ts +1 -1
  84. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  85. package/dist/core/caps/DbEntryCaps.js +14 -4
  86. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  87. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  88. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  89. package/dist/core/caps/DbNotifyCaps.js +6 -4
  90. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  91. package/dist/core/caps/DbSubscriptionCaps.d.ts +4 -6
  92. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  93. package/dist/core/caps/DbSubscriptionCaps.js +27 -13
  94. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  95. package/dist/core/caps/DbTagCaps.d.ts +1 -1
  96. package/dist/core/caps/DbTagCaps.d.ts.map +1 -1
  97. package/dist/core/caps/DbTagCaps.js +6 -4
  98. package/dist/core/caps/DbTagCaps.js.map +1 -1
  99. package/dist/core/caps/SchemeCtxImpl.d.ts +6 -1
  100. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  101. package/dist/core/caps/SchemeCtxImpl.js +6 -6
  102. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  103. package/dist/core/fork.sql +2 -2
  104. package/dist/core/git-iso.d.ts +3 -2
  105. package/dist/core/git-iso.d.ts.map +1 -1
  106. package/dist/core/git-iso.js +27 -12
  107. package/dist/core/git-iso.js.map +1 -1
  108. package/dist/core/git-membership.d.ts +1 -0
  109. package/dist/core/git-membership.d.ts.map +1 -1
  110. package/dist/core/git-membership.js +86 -24
  111. package/dist/core/git-membership.js.map +1 -1
  112. package/dist/core/git-state.d.ts +8 -1
  113. package/dist/core/git-state.d.ts.map +1 -1
  114. package/dist/core/git-state.js +35 -16
  115. package/dist/core/git-state.js.map +1 -1
  116. package/dist/core/namespace.d.ts +1 -0
  117. package/dist/core/namespace.d.ts.map +1 -1
  118. package/dist/core/namespace.js +20 -0
  119. package/dist/core/namespace.js.map +1 -1
  120. package/dist/core/optimistic-settlement.d.ts +2 -0
  121. package/dist/core/optimistic-settlement.d.ts.map +1 -0
  122. package/dist/core/optimistic-settlement.js +14 -0
  123. package/dist/core/optimistic-settlement.js.map +1 -0
  124. package/dist/core/packet-wire.d.ts +1 -1
  125. package/dist/core/packet-wire.d.ts.map +1 -1
  126. package/dist/core/packet-wire.js +81 -35
  127. package/dist/core/packet-wire.js.map +1 -1
  128. package/dist/core/results.d.ts +4 -2
  129. package/dist/core/results.d.ts.map +1 -1
  130. package/dist/core/results.js +6 -0
  131. package/dist/core/results.js.map +1 -1
  132. package/dist/core/scheme-types.d.ts +0 -12
  133. package/dist/core/scheme-types.d.ts.map +1 -1
  134. package/dist/core/scheme-types.js.map +1 -1
  135. package/dist/core/worker-ops.sql +4 -4
  136. package/dist/core/workspace-settings.js +1 -1
  137. package/dist/core/workspace-settings.js.map +1 -1
  138. package/dist/digest/Digest.d.ts.map +1 -1
  139. package/dist/digest/Digest.js +236 -74
  140. package/dist/digest/Digest.js.map +1 -1
  141. package/dist/digest/digest.sql +9 -5
  142. package/dist/schemes/Exec.d.ts +4 -4
  143. package/dist/schemes/Exec.d.ts.map +1 -1
  144. package/dist/schemes/Exec.js +56 -33
  145. package/dist/schemes/Exec.js.map +1 -1
  146. package/dist/schemes/ExecOutputScheme.d.ts +4 -5
  147. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  148. package/dist/schemes/ExecOutputScheme.js +12 -20
  149. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  150. package/dist/schemes/File.d.ts +1 -3
  151. package/dist/schemes/File.d.ts.map +1 -1
  152. package/dist/schemes/File.js +11 -19
  153. package/dist/schemes/File.js.map +1 -1
  154. package/dist/schemes/Log.d.ts +5 -5
  155. package/dist/schemes/Log.d.ts.map +1 -1
  156. package/dist/schemes/Log.js +74 -172
  157. package/dist/schemes/Log.js.map +1 -1
  158. package/dist/schemes/Log.sql +20 -13
  159. package/dist/schemes/Prompt.d.ts +2 -3
  160. package/dist/schemes/Prompt.d.ts.map +1 -1
  161. package/dist/schemes/Prompt.js +1 -4
  162. package/dist/schemes/Prompt.js.map +1 -1
  163. package/dist/schemes/Skill.d.ts +2 -3
  164. package/dist/schemes/Skill.d.ts.map +1 -1
  165. package/dist/schemes/Skill.js +0 -3
  166. package/dist/schemes/Skill.js.map +1 -1
  167. package/dist/schemes/Worker.d.ts +5 -5
  168. package/dist/schemes/Worker.d.ts.map +1 -1
  169. package/dist/schemes/Worker.js +92 -81
  170. package/dist/schemes/Worker.js.map +1 -1
  171. package/dist/schemes/_entry-crud.d.ts +2 -1
  172. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  173. package/dist/schemes/_entry-crud.js +14 -1
  174. package/dist/schemes/_entry-crud.js.map +1 -1
  175. package/dist/schemes/_entry-crud.sql +9 -3
  176. package/dist/schemes/_entry-find.d.ts +37 -11
  177. package/dist/schemes/_entry-find.d.ts.map +1 -1
  178. package/dist/schemes/_entry-find.js +141 -153
  179. package/dist/schemes/_entry-find.js.map +1 -1
  180. package/dist/schemes/_entry-ops.d.ts +9 -5
  181. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  182. package/dist/schemes/_entry-ops.js +12 -73
  183. package/dist/schemes/_entry-ops.js.map +1 -1
  184. package/dist/schemes/_entry-ops.sql +1 -2
  185. package/dist/schemes/_entry-semantic.d.ts +5 -7
  186. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  187. package/dist/schemes/_entry-semantic.js +10 -31
  188. package/dist/schemes/_entry-semantic.js.map +1 -1
  189. package/dist/schemes/_entry-semantic.sql +2 -2
  190. package/dist/schemes/_search-index.d.ts.map +1 -1
  191. package/dist/schemes/_search-index.js +6 -4
  192. package/dist/schemes/_search-index.js.map +1 -1
  193. package/dist/server/BranchBatches.d.ts +1 -0
  194. package/dist/server/BranchBatches.d.ts.map +1 -1
  195. package/dist/server/BranchBatches.js +1 -0
  196. package/dist/server/BranchBatches.js.map +1 -1
  197. package/dist/server/Daemon.d.ts +5 -7
  198. package/dist/server/Daemon.d.ts.map +1 -1
  199. package/dist/server/Daemon.js +222 -54
  200. package/dist/server/Daemon.js.map +1 -1
  201. package/dist/server/DaemonModule.d.ts +3 -3
  202. package/dist/server/DaemonModule.d.ts.map +1 -1
  203. package/dist/server/branch-batch.sql +3 -1
  204. package/dist/server/client-input.d.ts +2 -1
  205. package/dist/server/client-input.d.ts.map +1 -1
  206. package/dist/server/client-input.js +7 -1
  207. package/dist/server/client-input.js.map +1 -1
  208. package/dist/server/drain.sql +6 -5
  209. package/dist/server/envelope.d.ts +2 -2
  210. package/dist/server/envelope.d.ts.map +1 -1
  211. package/dist/server/envelope.js +0 -1
  212. package/dist/server/envelope.js.map +1 -1
  213. package/dist/server/envelope.sql +1 -2
  214. package/dist/server/lifecycle-recovery.sql +34 -1
  215. package/dist/server/logEntry.d.ts +1 -1
  216. package/dist/server/logEntry.d.ts.map +1 -1
  217. package/dist/server/logEntry.js +2 -1
  218. package/dist/server/logEntry.js.map +1 -1
  219. package/dist/service.d.ts.map +1 -1
  220. package/dist/service.js +13 -1
  221. package/dist/service.js.map +1 -1
  222. package/migrations/001_schema.sql +238 -125
  223. package/package.json +48 -46
  224. package/dist/matrix/live-specimen.d.ts +0 -9
  225. package/dist/matrix/live-specimen.d.ts.map +0 -1
  226. package/dist/matrix/live-specimen.js +0 -37
  227. package/dist/matrix/live-specimen.js.map +0 -1
package/.env.defaults CHANGED
@@ -42,6 +42,9 @@ PLURNK_HOST=127.0.0.1
42
42
  PLURNK_PORT=3044
43
43
 
44
44
  # --- Loop control ---
45
+ # Optional default child-provider alias. Unset = each WORK/FORK child inherits
46
+ # its spawning loop's provider. Clients may override this per top-level loop.
47
+ # PLURNK_MODEL_CHILD=fast
45
48
  # Operator turn ceiling. -1 (default) = no cap (loops end via SEND, budget,
46
49
  # strikes, or cycle detection). A positive value is an inviolable hard cap a
47
50
  # CoreSeam runLoop({maxTurns}) request cannot exceed (min wins).
@@ -51,6 +54,8 @@ PLURNK_SERVICE_MAX_TURNS=-1
51
54
  # is an operator ceiling a client may tighten per workspace via workspace.create settings.maxCommands
52
55
  # (min wins), never raise past (#232).
53
56
  PLURNK_SERVICE_MAX_COMMANDS=-1
57
+ # Live & demo test harness story timeout (ms) — 10 minutes (600000ms).
58
+ PLURNK_SERVICE_LIVE_TIMEOUT=600000
54
59
  # Proposal resolution bound (ms). Empty = a stopped world waits for its human indefinitely;
55
60
  # a finite positive value auto-cancels unattended (outcome=timeout). Every other explicit
56
61
  # value is invalid and fails at the proposal lifecycle owner.
@@ -61,12 +66,11 @@ PLURNK_SERVICE_PROPOSAL_TIMEOUT_MS=
61
66
  # that effect class.
62
67
  PLURNK_SERVICE_EXEC_HOLD=search,images,videos,news,map,music,it,science,social,downloadable
63
68
  PLURNK_SERVICE_EXEC_HOLD_MS=300000
64
- # Post-EXEC breath: after a turn fires a non-inline EXEC whose spawn is still in
65
- # flight at the turn boundary, wait this many ms before assembling the next packet
66
- # so a fast exec's output can land in it instead of a turn later. A fixed grace
67
- # beat, NOT a wait-for-completion (slow execs proceed + surface via the wake path).
68
- # 0 = off (the model sees fast-exec output a turn late, as today).
69
- PLURNK_SERVICE_EXEC_WAIT_MS=1000
69
+ # Optimistic worker settlement: before model dispatch, allow newly started
70
+ # streams or a completion wake with live siblings this many ms to quiesce.
71
+ # Settlement ends immediately at quiescence and never extends its first
72
+ # deadline; survivors follow the monitored lifecycle. 0 = off.
73
+ PLURNK_SERVICE_OPTIMISTIC_WAIT_MS=5000
70
74
  # Exec poll backoff (#521, {§exec-poll}): a parked exec with NO explicit `<,P>` cadence is no longer
71
75
  # park-blind-forever — the loop wakes on an exponential backoff so the model regains a turn to read
72
76
  # partial output and re-park a slow long-runner or KILL a stuck one. Wake N fires at BASE·2^min(N,TURNS-1)
@@ -127,12 +131,12 @@ PLURNK_SERVICE_GIT_ISO=0
127
131
  # optional in-process reader does not use this bound.
128
132
  PLURNK_SERVICE_GIT_OUTPUT_MAX_BYTES=67108864
129
133
 
130
- # Universal OPEN-body preview bounds. Only model-origin READ/FIND results render
131
- # complete; every other log body renders at most this many lines and characters.
132
- # A truncated body carries the log URI for a deliberate full READ. Separate
133
- # bounds prevent both multiline floods and single-line bombs.
134
+ # Ordinary bounded OPEN-body projection. READ/FIND results render their selected
135
+ # operation result complete; every other log body renders at most these
136
+ # independent line and character bounds. A truncated body carries its canonical
137
+ # log URI.
134
138
  PLURNK_SERVICE_PREVIEW_LINES=16
135
- PLURNK_SERVICE_PREVIEW_CHARS=1280
139
+ PLURNK_SERVICE_PREVIEW_CHARS=2560
136
140
 
137
141
  # --- Reference docs (auto-READ at turn 0) ---
138
142
  # PLURNK_SERVICE_MD_<ALIAS>=<path> materializes <path>'s markdown as a
@@ -148,9 +152,9 @@ PLURNK_SERVICE_PREVIEW_CHARS=1280
148
152
  # Turn-0 catalog preview so a run opens oriented, not blank. Folder-capable schemes use
149
153
  # FIND(<scheme>:///*): direct entries plus exact dir/** summaries carrying each subtree's
150
154
  # recursive item and token counts. Curated kernel docs remain recursive, demonstrating both
151
- # navigation forms. -1 = complete shallow maps; N = first N file-map rows (other schemes remain
152
- # complete); 0 = preview off. Service-wide default; a client overrides per workspace through
153
- # workspace.create settings.filesItems (#231).
155
+ # navigation forms. -1 = each ordinary FIND's markerless first page; N = an explicit first-N
156
+ # project-file page (other schemes remain markerless); 0 = preview off. Service-wide default;
157
+ # a client overrides per workspace through workspace.create settings.filesItems (#231).
154
158
  PLURNK_SERVICE_FILES_ITEMS=-1
155
159
 
156
160
  # Number of full SHA-256 revision characters rendered on each model-facing
@@ -212,8 +216,8 @@ PLURNK_SERVICE_DOCS_EXCLUDE="plurnk,file,exec"
212
216
  # PLURNK_SERVICE_POLICY=
213
217
  # PLURNK_SERVICE_PROJECT — a per-project policy markdown (relative to projectRoot). Unset = <root>/AGENTS.md.
214
218
  # PLURNK_SERVICE_PROJECT=
215
- # PLURNK_SERVICE_REQUIREMENTS — override the requirements.md recency-footer path (relative to the package
216
- # root). Unset = the packaged requirements.md.
219
+ # PLURNK_SERVICE_REQUIREMENTS — Recap source override (relative to the package root).
220
+ # Unset = the packaged requirements.md.
217
221
  # PLURNK_SERVICE_REQUIREMENTS=
218
222
 
219
223
  # --- Semantic search (~query chunking) ---
@@ -221,9 +225,6 @@ PLURNK_SERVICE_DOCS_EXCLUDE="plurnk,file,exec"
221
225
  # body is fully searchable, not truncated. Chunking requires the embedder's exact
222
226
  # counter or an exact fallback tokenizer; an estimate refuses semantic derivation.
223
227
  # The chunk knobs are read only when an embedder declares its input window.
224
- # Ranked results returned by a markerless `FIND(...):~query:FIND`. A positive
225
- # integer `<K>` overrides this count; a decimal marker selects by similarity.
226
- PLURNK_SERVICE_SEMANTIC_TOP_K=10
227
228
  # Chunk budget in TOKENS. EMPTY (the default) = the installed embedder's reported
228
229
  # window — NO model-specific number is assumed, so it scales to whatever embedder you
229
230
  # install. Set a positive value ONLY to cap below the window (e.g. to sweep
@@ -246,10 +247,6 @@ PLURNK_SERVICE_SEARCH_RUNTIMES=search
246
247
  # Per-turn search flood cap: the (N+1)th search EXEC in one turn is refused 429 (dedup of
247
248
  # identical queries is unconditional and separate — it strikes and serves the prior results).
248
249
  PLURNK_SERVICE_SEARCH_MAX_PER_TURN=3
249
- # FIND match-render budget: a FIND whose match set exceeds this returns a COUNT + narrow-your-query
250
- # steer instead of enumerating every match ({§find-count-not-contents}) — a repo-scale FIND(**) over
251
- # a 19k-entry workspace grinds clean instead of overflowing the window. 0/unset = no gate.
252
- PLURNK_SERVICE_FIND_MAX_MATCHES=500
253
250
  # Comma-separated file pathname patterns omitted from search derivations. Content remains directly
254
251
  # readable. Patterns without `/` match the basename; patterns with `/` match the full pathname.
255
252
  # Uses body-matcher glob syntax; the first match is the observable exclusion reason. Empty = none.
package/INSTALL.md CHANGED
@@ -74,10 +74,10 @@ Each mirrors a `# --- section ---` in the floor; consult the floor for exact def
74
74
 
75
75
  - **Storage** — `PLURNK_SERVICE_DB_PATH`, and the optional `PLURNK_SERVICE_SQLITE_*` passthroughs (sqlrite already sets a safe WAL posture; tune only for a hot/large DB).
76
76
  - **Daemon transport** — bare `PLURNK_HOST`/`PLURNK_PORT`: THE client surface (the AG-UI+ listener, bound by the plurnk-agui module at boot). Production is single-listener; every first-party client rides it.
77
- - **Model aliases** — bare `PLURNK_MODEL` selects the active provider; `PLURNK_MODEL_<alias>` defines one; `PLURNK_BASEURL_<alias>` overrides its endpoint. The front door — keep these bare and short.
78
- - **Loop control / engine rails** — `PLURNK_SERVICE_MAX_TURNS` (−1 = uncapped), `_MAX_COMMANDS`, `_MAX_STRIKES`, `_EMISSION_ATTEMPTS`, `_MIN_CYCLES`, `_MAX_CYCLE_PERIOD`, `_LOOP_TIMEOUT`, `_PROPOSAL_TIMEOUT_MS`, `_EXEC_HOLD`, `_EXEC_WAIT_MS`, `_EXEC_POLL_SEC`/`_TURNS`, `_EXEC_KILL_GRACE_MS`, `_WORKSPACE_WORKERS_MAX_ACTIVE`.
77
+ - **Model aliases** — bare `PLURNK_MODEL` selects the active provider; `PLURNK_MODEL_<alias>` defines one; `PLURNK_BASEURL_<alias>` overrides its endpoint. Optional `PLURNK_MODEL_CHILD=<alias>` selects WORK/FORK descendants; unset inherits the spawning loop's provider. The front door — keep these bare and short.
78
+ - **Loop control / engine rails** — `PLURNK_SERVICE_MAX_TURNS` (−1 = uncapped), `_MAX_COMMANDS`, `_MAX_STRIKES`, `_EMISSION_ATTEMPTS`, `_MIN_CYCLES`, `_MAX_CYCLE_PERIOD`, `_LOOP_TIMEOUT`, `_PROPOSAL_TIMEOUT_MS`, `_EXEC_HOLD`, `_OPTIMISTIC_WAIT_MS`, `_EXEC_POLL_SEC`/`_TURNS`, `_EXEC_KILL_GRACE_MS`, `_WORKSPACE_WORKERS_MAX_ACTIVE`.
79
79
  - **Git** — `PLURNK_SERVICE_GIT_ALLOWED` (0 = hard sandbox lockout), `_GIT_AUTO`.
80
- - **Packet / reference docs** — `PLURNK_SERVICE_FILES_ITEMS` (turn-0 shallow file-map cap), `_PREVIEW_LINES`/`_PREVIEW_CHARS`, `_EDIT_RECEIPT_REVISION_CHARS`/`_CONTEXT_LINES`, `_BRANCH_RECEIPT_REVISION_CHARS`, `_DOCS_EXCLUDE`, `_PACKET_INJECT` (operator markdown section), `_POLICY`/`_PROJECT`/`_REQUIREMENTS` (policy + footer overrides), `_MD_<alias>` (materialized reference entry).
80
+ - **Packet / reference docs** — `PLURNK_SERVICE_FILES_ITEMS` (turn-0 shallow file-map cap), `_PREVIEW_LINES`/`_PREVIEW_CHARS`, `_EDIT_RECEIPT_REVISION_CHARS`/`_CONTEXT_LINES`, `_BRANCH_RECEIPT_REVISION_CHARS`, `_DOCS_EXCLUDE`, `_PACKET_INJECT` (operator markdown section), `_POLICY`/`_PROJECT` (policy overrides), `_REQUIREMENTS` (Recap-source override), `_MD_<alias>` (materialized reference entry).
81
81
  - **Providers** — the portable provider knobs and defaults are defined by
82
82
  `@plurnk/plurnk-providers/.env.defaults`; any provider knob may take an alias
83
83
  suffix that wins over the bare fallback.
@@ -86,9 +86,10 @@ Each mirrors a `# --- section ---` in the floor; consult the floor for exact def
86
86
  describe provider capacity. `PLURNK_SERVICE_PROMPT_BUDGET` applies optional
87
87
  virtual pressure; `PLURNK_SERVICE_SAFETY` is the packing margin.
88
88
  - **Plugins** — bare `PLURNK_PLUGINS_TRUSTED_ONLY` (0/unset = load all installed; a value = `@plurnk/*` plus an allowlist).
89
- - **Semantic search** — `PLURNK_SERVICE_SEMANTIC_TOP_K` (markerless result count), `_SEMANTIC_CHUNK_TOKENS`/`_CHUNK_OVERLAP` (service-side chunking), `PLURNK_SERVICE_EMBED_DISABLE` (FTS-only), `PLURNK_MIMETYPES_EMBED_WORKERS` (the embedder's pool — mimetypes-owned).
90
- - **Schemes: http** — `PLURNK_SCHEMES_HTTP_FETCH_TIMEOUT`/`_SALVAGE_MIN_BODY_CHARS`/`_IDLE_TIMEOUT` (required on the HTML render path), optional Playwright/Chromium knobs.
89
+ - **Semantic search** — `PLURNK_SERVICE_SEMANTIC_CHUNK_TOKENS`/`_CHUNK_OVERLAP` (service-side chunking), `PLURNK_SERVICE_EMBED_DISABLE` (FTS-only), `PLURNK_MIMETYPES_EMBED_WORKERS` (the embedder's pool — mimetypes-owned).
90
+ - **Schemes: http** — `PLURNK_SCHEMES_HTTP_FETCH_TIMEOUT`, `_TTL_MS`, optional `# TAVILY_API_KEY=`, and `PLURNK_SCHEMES_HTTP_TAVILY_DEPTH`/`_TAVILY_TIMEOUT_MS`.
91
91
  - **Execs** - `PLURNK_EXECS_<runtime>=0` disables a runtime; `PLURNK_EXECS_SEARCH_SEARXNG_URL` enables web search (unset = search off).
92
+ - **Hooks** — `PLURNK_HOOKS_COMMAND` plus JSON `PLURNK_HOOKS_ARGS` invokes one exact no-shell command for the core events selected by `PLURNK_HOOKS_EVENTS`; see `@plurnk/plurnk-hooks/README.md`.
92
93
  - **Observability** — standard `OTEL_*` env ({§observability-boundary}):
93
94
  `OTEL_TRACES_EXPORTER`/`OTEL_METRICS_EXPORTER` (`otlp` or `console`; unset
94
95
  keeps the signal off), `OTEL_SERVICE_NAME` (default `plurnk-service`),
package/README.md CHANGED
@@ -47,6 +47,7 @@ imports `@plurnk/plurnk-service/digest`.
47
47
  - `@plurnk/plurnk-schemes` — addressable resource contract.
48
48
  - `@plurnk/plurnk-mimetypes` — content handling contract.
49
49
  - `@plurnk/plurnk-execs` — executable capability contract.
50
+ - `@plurnk/plurnk-hooks` — selected lifecycle events delivered to exact commands.
50
51
 
51
52
  ## Observability
52
53