@plurnk/plurnk-service 1.4.0 → 1.6.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 (302) hide show
  1. package/.env.defaults +37 -31
  2. package/INSTALL.md +16 -11
  3. package/README.md +1 -0
  4. package/SPEC.md +631 -397
  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/edit-collision.d.ts +5 -0
  10. package/dist/content/edit-collision.d.ts.map +1 -0
  11. package/dist/content/edit-collision.js +14 -0
  12. package/dist/content/edit-collision.js.map +1 -0
  13. package/dist/content/edit-receipt.d.ts +3 -2
  14. package/dist/content/edit-receipt.d.ts.map +1 -1
  15. package/dist/content/edit-receipt.js +58 -13
  16. package/dist/content/edit-receipt.js.map +1 -1
  17. package/dist/content/index.d.ts +5 -1
  18. package/dist/content/index.d.ts.map +1 -1
  19. package/dist/content/index.js +4 -1
  20. package/dist/content/index.js.map +1 -1
  21. package/dist/content/line-anchors.d.ts +41 -0
  22. package/dist/content/line-anchors.d.ts.map +1 -0
  23. package/dist/content/line-anchors.js +191 -0
  24. package/dist/content/line-anchors.js.map +1 -0
  25. package/dist/content/line-marker.d.ts +7 -3
  26. package/dist/content/line-marker.d.ts.map +1 -1
  27. package/dist/content/line-marker.js +2 -1
  28. package/dist/content/line-marker.js.map +1 -1
  29. package/dist/content/matcher.d.ts +1 -1
  30. package/dist/content/matcher.d.ts.map +1 -1
  31. package/dist/content/matcher.js +2 -2
  32. package/dist/content/matcher.js.map +1 -1
  33. package/dist/content/read-projector.d.ts +20 -0
  34. package/dist/content/read-projector.d.ts.map +1 -0
  35. package/dist/content/read-projector.js +122 -0
  36. package/dist/content/read-projector.js.map +1 -0
  37. package/dist/content/read-resolve.d.ts +2 -7
  38. package/dist/content/read-resolve.d.ts.map +1 -1
  39. package/dist/content/read-resolve.js +32 -107
  40. package/dist/content/read-resolve.js.map +1 -1
  41. package/dist/core/BranchReceipt.d.ts +0 -1
  42. package/dist/core/BranchReceipt.d.ts.map +1 -1
  43. package/dist/core/BranchReceipt.js +0 -3
  44. package/dist/core/BranchReceipt.js.map +1 -1
  45. package/dist/core/BudgetReadout.d.ts.map +1 -1
  46. package/dist/core/BudgetReadout.js +9 -2
  47. package/dist/core/BudgetReadout.js.map +1 -1
  48. package/dist/core/ChannelWrite.d.ts +3 -0
  49. package/dist/core/ChannelWrite.d.ts.map +1 -1
  50. package/dist/core/ChannelWrite.js +3 -3
  51. package/dist/core/ChannelWrite.js.map +1 -1
  52. package/dist/core/ChannelWrite.sql +4 -3
  53. package/dist/core/CoreSchemeServices.d.ts +10 -2
  54. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  55. package/dist/core/CoreSchemeServices.js.map +1 -1
  56. package/dist/core/Dispatcher.d.ts +14 -8
  57. package/dist/core/Dispatcher.d.ts.map +1 -1
  58. package/dist/core/Dispatcher.js +656 -312
  59. package/dist/core/Dispatcher.js.map +1 -1
  60. package/dist/core/DurableStatement.d.ts.map +1 -1
  61. package/dist/core/DurableStatement.js +2 -0
  62. package/dist/core/DurableStatement.js.map +1 -1
  63. package/dist/core/Engine.d.ts +24 -18
  64. package/dist/core/Engine.d.ts.map +1 -1
  65. package/dist/core/Engine.js +620 -392
  66. package/dist/core/Engine.js.map +1 -1
  67. package/dist/core/Engine.sql +188 -119
  68. package/dist/core/ExecutableTools.d.ts +10 -0
  69. package/dist/core/ExecutableTools.d.ts.map +1 -0
  70. package/dist/core/ExecutableTools.js +41 -0
  71. package/dist/core/ExecutableTools.js.map +1 -0
  72. package/dist/core/ExecutorRegistry.d.ts +3 -3
  73. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  74. package/dist/core/ExecutorRegistry.js +2 -2
  75. package/dist/core/ExecutorRegistry.js.map +1 -1
  76. package/dist/core/LogBody.d.ts +4 -1
  77. package/dist/core/LogBody.d.ts.map +1 -1
  78. package/dist/core/LogBody.js +46 -2
  79. package/dist/core/LogBody.js.map +1 -1
  80. package/dist/core/LogEntryProjection.d.ts +14 -0
  81. package/dist/core/LogEntryProjection.d.ts.map +1 -0
  82. package/dist/core/LogEntryProjection.js +38 -0
  83. package/dist/core/LogEntryProjection.js.map +1 -0
  84. package/dist/core/LoopLifecycle.d.ts +1 -2
  85. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  86. package/dist/core/LoopLifecycle.js +1 -4
  87. package/dist/core/LoopLifecycle.js.map +1 -1
  88. package/dist/core/LoopLifecycle.sql +1 -4
  89. package/dist/core/ModelCall.d.ts +27 -0
  90. package/dist/core/ModelCall.d.ts.map +1 -0
  91. package/dist/core/ModelCall.js +125 -0
  92. package/dist/core/ModelCall.js.map +1 -0
  93. package/dist/core/PacketBuilder.d.ts +13 -12
  94. package/dist/core/PacketBuilder.d.ts.map +1 -1
  95. package/dist/core/PacketBuilder.js +146 -118
  96. package/dist/core/PacketBuilder.js.map +1 -1
  97. package/dist/core/ProblemLog.d.ts.map +1 -1
  98. package/dist/core/ProblemLog.js +1 -0
  99. package/dist/core/ProblemLog.js.map +1 -1
  100. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  101. package/dist/core/ProposalLifecycle.js +3 -4
  102. package/dist/core/ProposalLifecycle.js.map +1 -1
  103. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  104. package/dist/core/ProviderInstantiate.js +23 -6
  105. package/dist/core/ProviderInstantiate.js.map +1 -1
  106. package/dist/core/SchemeRegistry.js +7 -7
  107. package/dist/core/SchemeRegistry.js.map +1 -1
  108. package/dist/core/StrikeRail.d.ts +5 -2
  109. package/dist/core/StrikeRail.d.ts.map +1 -1
  110. package/dist/core/StrikeRail.js +10 -7
  111. package/dist/core/StrikeRail.js.map +1 -1
  112. package/dist/core/TerminalResult.d.ts +16 -0
  113. package/dist/core/TerminalResult.d.ts.map +1 -0
  114. package/dist/core/TerminalResult.js +49 -0
  115. package/dist/core/TerminalResult.js.map +1 -0
  116. package/dist/core/caps/CapsResolve.d.ts +5 -1
  117. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  118. package/dist/core/caps/CapsResolve.js +9 -5
  119. package/dist/core/caps/CapsResolve.js.map +1 -1
  120. package/dist/core/caps/DbChannelCaps.d.ts +1 -1
  121. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  122. package/dist/core/caps/DbChannelCaps.js +6 -4
  123. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  124. package/dist/core/caps/DbEntryCaps.d.ts +2 -1
  125. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  126. package/dist/core/caps/DbEntryCaps.js +21 -8
  127. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  128. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  129. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  130. package/dist/core/caps/DbNotifyCaps.js +6 -4
  131. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  132. package/dist/core/caps/DbProjectionCaps.d.ts +1 -0
  133. package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
  134. package/dist/core/caps/DbProjectionCaps.js +29 -0
  135. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  136. package/dist/core/caps/DbSubscriptionCaps.d.ts +4 -6
  137. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  138. package/dist/core/caps/DbSubscriptionCaps.js +27 -13
  139. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  140. package/dist/core/caps/SchemeCtxImpl.d.ts +11 -3
  141. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  142. package/dist/core/caps/SchemeCtxImpl.js +10 -8
  143. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  144. package/dist/core/fork.d.ts.map +1 -1
  145. package/dist/core/fork.js +23 -7
  146. package/dist/core/fork.js.map +1 -1
  147. package/dist/core/fork.sql +35 -14
  148. package/dist/core/git-iso.d.ts +3 -2
  149. package/dist/core/git-iso.d.ts.map +1 -1
  150. package/dist/core/git-iso.js +27 -12
  151. package/dist/core/git-iso.js.map +1 -1
  152. package/dist/core/git-membership.d.ts +1 -0
  153. package/dist/core/git-membership.d.ts.map +1 -1
  154. package/dist/core/git-membership.js +87 -26
  155. package/dist/core/git-membership.js.map +1 -1
  156. package/dist/core/git-state.d.ts +8 -1
  157. package/dist/core/git-state.d.ts.map +1 -1
  158. package/dist/core/git-state.js +36 -17
  159. package/dist/core/git-state.js.map +1 -1
  160. package/dist/core/namespace.d.ts +1 -0
  161. package/dist/core/namespace.d.ts.map +1 -1
  162. package/dist/core/namespace.js +20 -0
  163. package/dist/core/namespace.js.map +1 -1
  164. package/dist/core/optimistic-settlement.d.ts +2 -0
  165. package/dist/core/optimistic-settlement.d.ts.map +1 -0
  166. package/dist/core/optimistic-settlement.js +14 -0
  167. package/dist/core/optimistic-settlement.js.map +1 -0
  168. package/dist/core/packet-wire.d.ts +5 -2
  169. package/dist/core/packet-wire.d.ts.map +1 -1
  170. package/dist/core/packet-wire.js +318 -114
  171. package/dist/core/packet-wire.js.map +1 -1
  172. package/dist/core/provider-accounting.d.ts +24 -0
  173. package/dist/core/provider-accounting.d.ts.map +1 -0
  174. package/dist/core/provider-accounting.js +76 -0
  175. package/dist/core/provider-accounting.js.map +1 -0
  176. package/dist/core/results.d.ts +4 -2
  177. package/dist/core/results.d.ts.map +1 -1
  178. package/dist/core/results.js +6 -0
  179. package/dist/core/results.js.map +1 -1
  180. package/dist/core/scheme-types.d.ts +0 -12
  181. package/dist/core/scheme-types.d.ts.map +1 -1
  182. package/dist/core/scheme-types.js.map +1 -1
  183. package/dist/core/search-gate.d.ts +2 -2
  184. package/dist/core/search-gate.d.ts.map +1 -1
  185. package/dist/core/search-gate.js +8 -8
  186. package/dist/core/search-gate.js.map +1 -1
  187. package/dist/core/token-ruler.js +1 -1
  188. package/dist/core/token-ruler.js.map +1 -1
  189. package/dist/core/turn-scheduler.js +1 -1
  190. package/dist/core/turn-scheduler.js.map +1 -1
  191. package/dist/core/worker-ops.sql +4 -4
  192. package/dist/core/workspace-settings.js +1 -1
  193. package/dist/core/workspace-settings.js.map +1 -1
  194. package/dist/digest/Digest.d.ts.map +1 -1
  195. package/dist/digest/Digest.js +349 -76
  196. package/dist/digest/Digest.js.map +1 -1
  197. package/dist/digest/digest.sql +42 -16
  198. package/dist/schemes/Exec.d.ts +4 -4
  199. package/dist/schemes/Exec.d.ts.map +1 -1
  200. package/dist/schemes/Exec.js +167 -134
  201. package/dist/schemes/Exec.js.map +1 -1
  202. package/dist/schemes/ExecOutputScheme.d.ts +4 -5
  203. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  204. package/dist/schemes/ExecOutputScheme.js +12 -20
  205. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  206. package/dist/schemes/File.d.ts +5 -6
  207. package/dist/schemes/File.d.ts.map +1 -1
  208. package/dist/schemes/File.js +35 -41
  209. package/dist/schemes/File.js.map +1 -1
  210. package/dist/schemes/Log.d.ts +16 -5
  211. package/dist/schemes/Log.d.ts.map +1 -1
  212. package/dist/schemes/Log.js +229 -262
  213. package/dist/schemes/Log.js.map +1 -1
  214. package/dist/schemes/Log.sql +50 -27
  215. package/dist/schemes/Prompt.d.ts +3 -4
  216. package/dist/schemes/Prompt.d.ts.map +1 -1
  217. package/dist/schemes/Prompt.js +5 -5
  218. package/dist/schemes/Prompt.js.map +1 -1
  219. package/dist/schemes/Skill.d.ts +4 -5
  220. package/dist/schemes/Skill.d.ts.map +1 -1
  221. package/dist/schemes/Skill.js +3 -3
  222. package/dist/schemes/Skill.js.map +1 -1
  223. package/dist/schemes/Worker.d.ts +7 -7
  224. package/dist/schemes/Worker.d.ts.map +1 -1
  225. package/dist/schemes/Worker.js +99 -84
  226. package/dist/schemes/Worker.js.map +1 -1
  227. package/dist/schemes/_entry-crud.d.ts +2 -2
  228. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  229. package/dist/schemes/_entry-crud.js +29 -10
  230. package/dist/schemes/_entry-crud.js.map +1 -1
  231. package/dist/schemes/_entry-crud.sql +11 -17
  232. package/dist/schemes/_entry-find.d.ts +41 -14
  233. package/dist/schemes/_entry-find.d.ts.map +1 -1
  234. package/dist/schemes/_entry-find.js +159 -166
  235. package/dist/schemes/_entry-find.js.map +1 -1
  236. package/dist/schemes/_entry-find.sql +2 -21
  237. package/dist/schemes/_entry-graph.sql +1 -1
  238. package/dist/schemes/_entry-manifest.d.ts +5 -17
  239. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  240. package/dist/schemes/_entry-manifest.js +28 -24
  241. package/dist/schemes/_entry-manifest.js.map +1 -1
  242. package/dist/schemes/_entry-ops.d.ts +13 -8
  243. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  244. package/dist/schemes/_entry-ops.js +98 -119
  245. package/dist/schemes/_entry-ops.js.map +1 -1
  246. package/dist/schemes/_entry-ops.sql +31 -6
  247. package/dist/schemes/_entry-semantic.d.ts +5 -7
  248. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  249. package/dist/schemes/_entry-semantic.js +10 -31
  250. package/dist/schemes/_entry-semantic.js.map +1 -1
  251. package/dist/schemes/_entry-semantic.sql +2 -2
  252. package/dist/schemes/_entry-send.js +4 -4
  253. package/dist/schemes/_entry-send.js.map +1 -1
  254. package/dist/schemes/_search-index.d.ts.map +1 -1
  255. package/dist/schemes/_search-index.js +16 -6
  256. package/dist/schemes/_search-index.js.map +1 -1
  257. package/dist/schemes/exec-abort.js +2 -2
  258. package/dist/schemes/exec-abort.js.map +1 -1
  259. package/dist/server/BranchBatches.d.ts +1 -0
  260. package/dist/server/BranchBatches.d.ts.map +1 -1
  261. package/dist/server/BranchBatches.js +1 -0
  262. package/dist/server/BranchBatches.js.map +1 -1
  263. package/dist/server/Daemon.d.ts +6 -8
  264. package/dist/server/Daemon.d.ts.map +1 -1
  265. package/dist/server/Daemon.js +238 -68
  266. package/dist/server/Daemon.js.map +1 -1
  267. package/dist/server/DaemonModule.d.ts +3 -3
  268. package/dist/server/DaemonModule.d.ts.map +1 -1
  269. package/dist/server/branch-batch.sql +3 -1
  270. package/dist/server/client-input.d.ts +2 -1
  271. package/dist/server/client-input.d.ts.map +1 -1
  272. package/dist/server/client-input.js +7 -1
  273. package/dist/server/client-input.js.map +1 -1
  274. package/dist/server/drain.sql +8 -7
  275. package/dist/server/envelope.d.ts +0 -2
  276. package/dist/server/envelope.d.ts.map +1 -1
  277. package/dist/server/envelope.js +0 -1
  278. package/dist/server/envelope.js.map +1 -1
  279. package/dist/server/envelope.sql +3 -4
  280. package/dist/server/lifecycle-recovery.sql +44 -1
  281. package/dist/server/logEntry.d.ts +2 -1
  282. package/dist/server/logEntry.d.ts.map +1 -1
  283. package/dist/server/logEntry.js +15 -2
  284. package/dist/server/logEntry.js.map +1 -1
  285. package/dist/server/logEntry.sql +5 -1
  286. package/dist/service.d.ts.map +1 -1
  287. package/dist/service.js +13 -1
  288. package/dist/service.js.map +1 -1
  289. package/migrations/001_schema.sql +730 -221
  290. package/package.json +53 -46
  291. package/dist/core/BudgetOverflow.d.ts +0 -23
  292. package/dist/core/BudgetOverflow.d.ts.map +0 -1
  293. package/dist/core/BudgetOverflow.js +0 -61
  294. package/dist/core/BudgetOverflow.js.map +0 -1
  295. package/dist/core/caps/DbTagCaps.d.ts +0 -10
  296. package/dist/core/caps/DbTagCaps.d.ts.map +0 -1
  297. package/dist/core/caps/DbTagCaps.js +0 -44
  298. package/dist/core/caps/DbTagCaps.js.map +0 -1
  299. package/dist/matrix/live-specimen.d.ts +0 -9
  300. package/dist/matrix/live-specimen.d.ts.map +0 -1
  301. package/dist/matrix/live-specimen.js +0 -37
  302. package/dist/matrix/live-specimen.js.map +0 -1
@@ -5,7 +5,7 @@ SELECT status FROM loops WHERE id = $loop_id;
5
5
 
6
6
  -- PREP: engine_worker_has_live_child
7
7
  -- A non-terminal child worker (worker:// spawn/fork set parent_worker_id) — a "live thing the worker holds",
8
- -- like an open stream. A SEND[200] while one exists is a premature-terminate ({§send-premature-terminate}).
8
+ -- like an open stream. A SEND signal 200 while one exists is a premature-terminate ({§send-premature-terminate}).
9
9
  -- Live = a child whose LATEST loop is still pending/running/parked (100/102/202) — the SAME definition
10
10
  -- engine_child_workers_live uses for the Active Child Workers orientation, so the 409 gate and the section the model
11
11
  -- reads NEVER disagree: a refused termination is always backed by a child the model can SEE and KILL
@@ -67,6 +67,7 @@ LIMIT 1;
67
67
  -- {§entry-owner} — one principal's entries (catalogRowsFor source for an owner-scoped FIND/foist):
68
68
  -- the commons, a worker's own space, or a named space — exactly one owner's rows, its perspective.
69
69
  SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.tokens AS tokens, e.deep_hash,
70
+ d.parse_issues,
70
71
  s.id AS subscription_id,
71
72
  CASE WHEN s.closed_at IS NULL
72
73
  THEN CAST(unixepoch('now') - unixepoch(s.opened_at) AS INTEGER)
@@ -75,6 +76,7 @@ SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, e
75
76
  s.close_status
76
77
  FROM entries e
77
78
  JOIN entry_channels ec ON ec.entry_id = e.id
79
+ LEFT JOIN derivations d ON d.deep_hash = e.deep_hash
78
80
  LEFT JOIN subscriptions s ON s.id = (
79
81
  SELECT latest.id
80
82
  FROM subscriptions latest
@@ -85,44 +87,28 @@ LEFT JOIN subscriptions s ON s.id = (
85
87
  WHERE e.workspace_id = $workspace_id AND e.owner_id = $owner_id
86
88
  ORDER BY e.updated_at ASC, e.id ASC, ec.name;
87
89
 
88
- -- PREP: engine_list_owner_entry_tags
89
- -- {§entry-owner} — (entry, tag) for one principal's entries (the owner-scoped catalog's tags field).
90
- SELECT et.entry_id, et.tag
91
- FROM entry_tags et
92
- JOIN entries e ON e.id = et.entry_id
93
- WHERE e.workspace_id = $workspace_id AND e.owner_id = $owner_id
94
- ORDER BY et.entry_id, et.tag;
95
-
96
90
  -- PREP: engine_next_turn_sequence
97
91
  SELECT COALESCE(MAX(sequence), 0) + 1 AS next FROM turns WHERE loop_id = $loop_id;
98
92
 
99
93
  -- PREP: engine_loop_usage
100
- -- Per-loop usage totals and latest-turn gauge ({§tokenomics-client-gauge}),
101
- -- surfaced on {§notifications-loop-terminated}. `context` is the latest
102
- -- provider attempt on the latest turn, distinct from summed billed `prompt`.
103
- SELECT COALESCE(SUM(usage_prompt), 0) AS prompt,
104
- COALESCE(SUM(usage_completion), 0) AS completion,
105
- CASE
106
- WHEN COUNT(*) = 0 THEN 0
107
- WHEN COUNT(usage_cost_usd) = COUNT(*) THEN SUM(usage_cost_usd)
108
- ELSE NULL
109
- END AS cost_usd,
110
- COALESCE((
111
- SELECT json_group_array(json(cost.value))
112
- FROM turns charged, json_each(charged.usage_cost) AS cost
113
- WHERE charged.loop_id = $loop_id
114
- ), '[]') AS costs,
115
- (
116
- SELECT a.usage_prompt
117
- FROM turn_attempts a
118
- WHERE a.turn_id = (
94
+ -- Latest-turn gauge ({§tokenomics-client-gauge}), surfaced beside the derived
95
+ -- accounting projection on {§notifications-loop-terminated}. `context` is the
96
+ -- latest settled physical request on the latest turn; an absent input count is
97
+ -- unknown and does not fall back to older evidence.
98
+ SELECT (
99
+ SELECT pr.usage_input
100
+ FROM provider_requests pr
101
+ JOIN model_calls mc ON mc.id = pr.model_call_id
102
+ WHERE mc.turn_id = (
119
103
  SELECT latest.id
120
104
  FROM turns latest
121
105
  WHERE latest.loop_id = $loop_id
122
106
  ORDER BY latest.sequence DESC
123
107
  LIMIT 1
124
108
  )
125
- ORDER BY a.sequence DESC
109
+ AND mc.kind = 'emission'
110
+ AND pr.state = 'settled'
111
+ ORDER BY mc.sequence DESC, pr.sequence DESC
126
112
  LIMIT 1
127
113
  ) AS context,
128
114
  -- Latest turn's effective packet allowance; NULL when uncapped or unknown.
@@ -130,7 +116,23 @@ SELECT COALESCE(SUM(usage_prompt), 0) AS prompt,
130
116
  (SELECT usage_prompt_budget FROM turns WHERE loop_id = $loop_id ORDER BY sequence DESC LIMIT 1) AS context_size,
131
117
  -- Latest turn's opaque provider metadata. {§meta-passthrough}
132
118
  (SELECT meta FROM turns WHERE loop_id = $loop_id ORDER BY sequence DESC LIMIT 1) AS meta
133
- FROM turns WHERE loop_id = $loop_id;
119
+ FROM loops
120
+ WHERE id = $loop_id;
121
+
122
+ -- PREP: engine_loop_provider_requests
123
+ -- Ordered cardinal accounting evidence. Aggregation belongs to the shared
124
+ -- provider accounting contract, not SQLite arithmetic or denormalized rows.
125
+ SELECT pr.provider, pr.model, pr.outcome, pr.status,
126
+ pr.usage_input, pr.usage_output, pr.usage_total,
127
+ pr.usage_input_no_cache, pr.usage_input_cache_read, pr.usage_input_cache_write,
128
+ pr.usage_output_text, pr.usage_output_reasoning,
129
+ pr.cost_kind, pr.cost_amount, pr.cost_currency, pr.cost_usd_equivalent,
130
+ pr.cost_source, pr.cost_reason
131
+ FROM provider_requests pr
132
+ JOIN model_calls mc ON mc.id = pr.model_call_id
133
+ JOIN turns t ON t.id = mc.turn_id
134
+ WHERE t.loop_id = $loop_id AND pr.state = 'settled'
135
+ ORDER BY t.sequence, mc.sequence, pr.sequence;
134
136
 
135
137
  -- PREP: engine_loop_attributions
136
138
  -- {§attribution} — derive the loop projection from exact response-attempt
@@ -143,9 +145,9 @@ FROM (
143
145
  WHERE t.loop_id = $loop_id
144
146
  UNION
145
147
  SELECT value AS attribution
146
- FROM turn_attempts a
147
- JOIN turns t ON t.id = a.turn_id,
148
- json_each(a.attributions)
148
+ FROM model_calls mc
149
+ JOIN turns t ON t.id = mc.turn_id,
150
+ json_each(mc.attributions)
149
151
  WHERE t.loop_id = $loop_id
150
152
  )
151
153
  ORDER BY attribution;
@@ -170,59 +172,80 @@ VALUES ($loop_id, $sequence, 102)
170
172
  RETURNING id;
171
173
 
172
174
  -- PREP: engine_close_turn
173
- -- Updates the turn with the response packet, terminal status, and
174
- -- provider usage stats once dispatch is complete. Paired with
175
- -- engine_open_turn at runTurn boundaries.
175
+ -- Updates the turn with the response packet and terminal metadata once dispatch
176
+ -- is complete. Provider attempts own and materialize usage/cost above this path.
176
177
  UPDATE turns SET
177
178
  status = $status,
178
179
  packet = $packet,
179
- usage_prompt = $usage_prompt,
180
- usage_completion = $usage_completion,
181
- usage_reasoning = $usage_reasoning,
182
- usage_cached = $usage_cached,
183
- usage_cost = $usage_cost,
184
- usage_cost_usd = $usage_cost_usd,
185
180
  usage_prompt_budget = $usage_prompt_budget,
186
181
  finish_reason = $finish_reason,
187
182
  model = $model,
188
183
  meta = $meta
189
184
  WHERE id = $id;
190
185
 
191
- -- PREP: engine_record_turn_attempt
192
- -- One provider attempt carrying response evidence beneath a turn. Rejected or
193
- -- interrupted attempts remain forensic evidence but never become packet history.
194
- INSERT INTO turn_attempts (
195
- turn_id,
196
- sequence,
197
- accepted,
198
- response,
199
- parse_errors,
200
- attributions,
201
- usage_prompt,
202
- usage_completion,
203
- usage_reasoning,
204
- usage_cached,
205
- usage_cost,
206
- usage_cost_usd,
207
- finish_reason,
208
- model
209
- )
210
- VALUES (
211
- $turn_id,
212
- $sequence,
213
- $accepted,
214
- $response,
215
- $parse_errors,
216
- $attributions,
217
- $usage_prompt,
218
- $usage_completion,
219
- $usage_reasoning,
220
- $usage_cached,
221
- $usage_cost,
222
- $usage_cost_usd,
223
- $finish_reason,
224
- $model
225
- );
186
+ -- PREP: engine_open_model_call
187
+ -- Logical identity and request attribution become durable before provider I/O.
188
+ INSERT INTO model_calls (turn_id, sequence, kind, attributions, model)
189
+ VALUES ($turn_id, $sequence, $kind, $attributions, $model)
190
+ RETURNING id;
191
+
192
+ -- PREP: engine_observe_model_call_response
193
+ -- Preserve the logical response before call-specific interpretation. Physical
194
+ -- request accounting has already settled through its cardinal observer path.
195
+ UPDATE model_calls SET
196
+ state = 'response',
197
+ response = $response,
198
+ failure = $failure,
199
+ finish_reason = $finish_reason,
200
+ model = $model,
201
+ completed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
202
+ WHERE id = $id AND state = 'pending';
203
+
204
+ -- PREP: engine_fail_model_call
205
+ UPDATE model_calls SET
206
+ state = 'error',
207
+ failure = $failure,
208
+ completed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
209
+ WHERE id = $id AND state = 'pending';
210
+
211
+ -- PREP: engine_open_turn_attempt
212
+ INSERT INTO turn_attempts (model_call_id)
213
+ VALUES ($model_call_id)
214
+ RETURNING id;
215
+
216
+ -- PREP: engine_classify_turn_attempt_response
217
+ UPDATE turn_attempts SET
218
+ accepted = $accepted,
219
+ parse_errors = $parse_errors
220
+ WHERE id = $id AND accepted IS NULL;
221
+
222
+ -- PREP: engine_open_provider_request
223
+ -- The provider calls this immediately before physical I/O.
224
+ INSERT INTO provider_requests (model_call_id, sequence, provider, model)
225
+ VALUES ($model_call_id, $sequence, $provider, $model)
226
+ RETURNING id;
227
+
228
+ -- PREP: engine_settle_provider_request
229
+ UPDATE provider_requests SET
230
+ state = 'settled',
231
+ outcome = $outcome,
232
+ status = $status,
233
+ usage_input = $usage_input,
234
+ usage_output = $usage_output,
235
+ usage_total = $usage_total,
236
+ usage_input_no_cache = $usage_input_no_cache,
237
+ usage_input_cache_read = $usage_input_cache_read,
238
+ usage_input_cache_write = $usage_input_cache_write,
239
+ usage_output_text = $usage_output_text,
240
+ usage_output_reasoning = $usage_output_reasoning,
241
+ cost_kind = $cost_kind,
242
+ cost_amount = $cost_amount,
243
+ cost_currency = $cost_currency,
244
+ cost_usd_equivalent = $cost_usd_equivalent,
245
+ cost_source = $cost_source,
246
+ cost_reason = $cost_reason,
247
+ completed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
248
+ WHERE id = $id AND state = 'pending';
226
249
 
227
250
  -- PREP: engine_list_workspace_entries
228
251
  -- Every owner-held entry of a workspace — all schemes, all channels — for
@@ -298,8 +321,8 @@ WITH observation AS (
298
321
  SELECT o.cursor, o.boundary,
299
322
  ae.id AS event_id, ae.producer_worker_id, producer.name AS producer_worker_name,
300
323
  ae.kind, ae.source,
301
- ae.op, ae.scheme, ae.hostname, ae.pathname, ae.rx, ae.attrs,
302
- ae.status_rx, ae.prompt, ae.terminated_by
324
+ ae.op, ae.scheme, ae.hostname, ae.pathname, ae.rx, ae.attrs, ae.tags,
325
+ ae.status_rx, ae.terminated_by
303
326
  FROM observation o
304
327
  LEFT JOIN ambient_events ae
305
328
  ON ae.workspace_id = $workspace_id
@@ -325,6 +348,11 @@ INSERT INTO log_entries (
325
348
  ON CONFLICT(worker_id, ambient_event_id) WHERE ambient_event_id IS NOT NULL DO NOTHING
326
349
  RETURNING id;
327
350
 
351
+ -- PREP: engine_ambient_delta_id
352
+ -- Crash replay may find the observation row already inserted but its copied
353
+ -- classifications incomplete. Resolve that row so idempotent tag writes can finish.
354
+ SELECT id FROM log_entries WHERE worker_id = $worker_id AND ambient_event_id = $event_id;
355
+
328
356
  -- PREP: engine_advance_ambient_cursor
329
357
  -- Advance only from the snapshot that was actually materialized. A concurrent
330
358
  -- pull winning the CAS is safe; a loser replays idempotently on its next turn.
@@ -338,10 +366,11 @@ RETURNING ambient_event_cursor;
338
366
 
339
367
  -- PREP: engine_worker_stream_channels
340
368
  -- {§exec-stream} — every stream channel the worker owns (an EXEC's stdout/stderr live on the
341
- -- runtime-tag entry), with content + state + coordinate, so the per-turn injector can emit the
342
- -- channel's unshown byte-delta. Stays listed until its last delta is shown (cursor == content len).
369
+ -- runtime-tag entry), with content + mimetype + state + coordinate, so the per-turn injector can
370
+ -- publish the channel's next complete unit. Stays listed until its terminal observation is shown.
343
371
  SELECT s.id AS subscription_id, e.scheme AS runtime, e.pathname AS coord,
344
- ec.name AS channel, ec.content AS content, ec.state AS state, s.close_status AS close_status,
372
+ ec.name AS channel, ec.content AS content, ec.mimetype AS mimetype,
373
+ ec.state AS state, s.close_status AS close_status,
345
374
  s.close_result AS close_result, s.published_channel AS published_channel
346
375
  FROM subscriptions s
347
376
  JOIN entries e ON e.id = s.entry_id
@@ -351,8 +380,8 @@ WHERE s.worker_id = $worker_id
351
380
  ORDER BY s.id, ec.name;
352
381
 
353
382
  -- PREP: engine_stream_cursor
354
- -- {§exec-stream} — bytes of this channel already shown to the worker: the streamEnd recorded on its
355
- -- latest foisted delta (the caller defaults to 0 when none exists yet).
383
+ -- {§exec-stream} — content offset already shown to the worker: the streamEnd recorded on its latest
384
+ -- foisted observation (the caller defaults to 0 when none exists yet).
356
385
  SELECT attrs
357
386
  FROM log_entries
358
387
  WHERE worker_id = $worker_id AND origin = 'plurnk' AND op = 'READ'
@@ -360,21 +389,18 @@ WHERE worker_id = $worker_id AND origin = 'plurnk' AND op = 'READ'
360
389
  ORDER BY id DESC LIMIT 1;
361
390
 
362
391
  -- PREP: engine_insert_stream_delta
363
- -- {§exec-stream} / {§env-delta} — materialize a channel's unshown byte-delta as a
392
+ -- {§exec-stream} / {§env-delta} — materialize a channel's next publishable content as a
364
393
  -- foisted READ row (the model READs the stream it never typed). origin=plurnk; fragment is
365
- -- the channel; attrs.streamEnd is the next turn's cursor; expanded=1 when the channel has CLOSED
366
- -- (the terminal delta auto-OPENs), 0 while it streams (ongoing deltas fold). {§exec-stream}
394
+ -- the channel; attrs.streamEnd is the next turn's cursor; expanded=1 for a terminal
395
+ -- observation, 0 for an ongoing observation. {§exec-stream}
367
396
  INSERT INTO log_entries (
368
- worker_id, loop_id, turn_id, sequence, origin, source,
397
+ worker_id, loop_id, turn_id, sequence, origin, source, model_call_id,
369
398
  op, scheme, pathname, fragment, tx, mimetype_tx, rx, mimetype_rx, status_rx, attrs, expanded
370
399
  ) VALUES (
371
- $worker_id, $loop_id, $turn_id, $sequence, 'plurnk', NULL,
400
+ $worker_id, $loop_id, $turn_id, $sequence, 'plurnk', NULL, NULL,
372
401
  'READ', $scheme, $pathname, $fragment, '', 'text/plain', $rx, 'application/json', $status, $attrs, $expanded
373
402
  );
374
403
 
375
- -- PREP: engine_entry_tags
376
- SELECT tag FROM entry_tags WHERE entry_id = $entry_id ORDER BY tag;
377
-
378
404
  -- PREP: engine_child_workers_live
379
405
  -- The worker's LIVE child workers — latest loop non-terminal (100 pending / 102 processing / 202 parked).
380
406
  -- Powers the Active Child Workers orienting section ({§child-orientation}): terse `* <status> worker://<name>`
@@ -401,11 +427,10 @@ ORDER BY e.pathname;
401
427
  -- LogCoordinate pointers, forcing the model to confront failures instead of letting
402
428
  -- them rot in log:///. Window = the current turn AND the immediately-prior one
403
429
  -- (>= current_turn_seq - 1): prior-turn for action failures the model just caused,
404
- -- current-turn so a same-turn engine error (the grinder's budget-overflow row, minted
405
- -- pre-generate then re-derived) surfaces THIS turn rather than a turn late.
430
+ -- current-turn so a pre-generate engine error surfaces THIS turn rather than a turn late.
406
431
  -- {§operation-result-uniform-error-channel}
407
432
  SELECT
408
- le.op, le.sequence, le.status_rx, le.rx, le.mimetype_rx,
433
+ le.origin, le.op, le.attrs, le.sequence, le.status_rx, le.rx, le.mimetype_rx,
409
434
  le.scheme, le.pathname,
410
435
  t.sequence AS turn_seq, l.sequence AS loop_seq
411
436
  FROM log_entries le
@@ -420,21 +445,39 @@ ORDER BY t.sequence, le.sequence;
420
445
 
421
446
  -- TX: engine_grinder_fold_newest_turn
422
447
  -- {§grinder-layer1-rollback} — THE DOCTRINE: the log is the model's memory and the model ALONE
423
- -- curates it (FOLD/KILL). The grinder never touches history — it only blocks NEW memories from
424
- -- landing when there is no room: one set-op folds the still-open rows of the newest turn
425
- -- boundary — the immediately-prior turn's emissions and the current turn's pre-model rows
426
- -- (foists, wake surfaces). Turn 1 is the same rule (no prior turn; its foists are the newest).
448
+ -- curates it (FOLD/KILL). The grinder rolls back only context introduced by the newest turn
449
+ -- boundary: rows born in the immediately-prior/current turn plus exact older rows that a successful
450
+ -- OPEN in the immediately-prior turn transitioned from folded to open. The durable effect relation
451
+ -- owns that landed set; never re-run an authored glob/tag/matcher against later state. An OPEN no-op
452
+ -- contributes no older row. Turn 1 is the same rule (no prior turn; its foists are the newest).
427
453
  -- Folded, never deleted; THREE exemptions ({§grinder-errors-exempt}): op='error',
428
454
  -- the user prompt, and PLAN. The temporary set captures the
429
455
  -- selection once so folding and additive `overflow` tagging cannot diverge.
430
456
  CREATE TEMP TABLE IF NOT EXISTS engine_grinder_fold_set (id INTEGER PRIMARY KEY);
431
457
  DELETE FROM engine_grinder_fold_set;
458
+ WITH previous_turn AS (
459
+ SELECT MAX(id) AS id FROM turns WHERE loop_id = $loop_id AND id < $turn_id
460
+ )
432
461
  INSERT INTO engine_grinder_fold_set (id)
433
- SELECT id FROM log_entries
434
- WHERE loop_id = $loop_id AND expanded = 1 AND op NOT IN ('error', 'PLAN')
435
- AND COALESCE(scheme, '') != 'prompt' -- the task frame ({§prompt-self-only}); NULL-safe: a model row's scheme is NULL
436
- AND (turn_id = $turn_id
437
- OR turn_id = (SELECT MAX(id) FROM turns WHERE loop_id = $loop_id AND id < $turn_id));
462
+ SELECT boundary.id
463
+ FROM log_entries boundary
464
+ WHERE boundary.loop_id = $loop_id
465
+ AND boundary.expanded = 1
466
+ AND COALESCE(boundary.op, '') NOT IN ('error', 'PLAN')
467
+ AND COALESCE(boundary.scheme, '') != 'prompt' -- the task frame ({§prompt-self-only}); NULL-safe: a model-emission row's scheme is NULL
468
+ AND (boundary.turn_id = $turn_id OR boundary.turn_id = (SELECT id FROM previous_turn))
469
+ UNION
470
+ SELECT target.id
471
+ FROM log_curation_effects effect
472
+ JOIN log_entries operation ON operation.id = effect.operation_log_entry_id
473
+ JOIN log_entries target ON target.id = effect.target_log_entry_id
474
+ WHERE operation.turn_id = (SELECT id FROM previous_turn)
475
+ AND operation.op = 'OPEN'
476
+ AND operation.status_rx < 400
477
+ AND effect.expanded_before = 0
478
+ AND target.expanded = 1
479
+ AND COALESCE(target.op, '') NOT IN ('error', 'PLAN')
480
+ AND COALESCE(target.scheme, '') != 'prompt';
438
481
 
439
482
  UPDATE log_entries SET expanded = 0
440
483
  WHERE id IN (SELECT id FROM engine_grinder_fold_set);
@@ -445,7 +488,7 @@ SELECT id, 'overflow' FROM engine_grinder_fold_set;
445
488
  DELETE FROM engine_grinder_fold_set;
446
489
 
447
490
  -- PREP: engine_fold_log_entry
448
- -- Fold one known log row by id. Model mirror rows use this after insertion so
491
+ -- Fold one known log row by id. Model-emission rows use this after insertion so
449
492
  -- the complete admitted emission remains available without opening by default.
450
493
  UPDATE log_entries SET expanded = 0 WHERE id = $id;
451
494
 
@@ -453,11 +496,12 @@ UPDATE log_entries SET expanded = 0 WHERE id = $id;
453
496
  -- Render-time log-section assembly ({§body-projection}).
454
497
  -- Yields log_entries for the whole worker — the conversation's working
455
498
  -- memory carries across loops within a worker, not just the
456
- -- current loop. Coordinate is log:///<loop_seq>/<turn_seq>/<sequence>/<op>.
499
+ -- current loop. Coordinates append /<op> only for rows that represent an operation.
457
500
  -- Status 202 entries in state='proposed' are model-invisible until resolved.
458
501
  -- `expanded = 0` rows are FOLDED — listed but collapsed to their coordinate
459
502
  -- (FOLD); the renderer elides the body. {§open-fold}: folded rows stay listed, re-OPENable.
460
503
  SELECT
504
+ le.id,
461
505
  l.sequence AS loop_seq,
462
506
  t.sequence AS turn_seq,
463
507
  le.sequence,
@@ -469,7 +513,13 @@ SELECT
469
513
  le.query, le.fragment,
470
514
  le.status_rx, le.rx, le.mimetype_rx,
471
515
  le.tx, le.mimetype_tx,
472
- le.state, le.outcome, le.expanded, le.source, le.attrs
516
+ le.state, le.outcome, le.expanded, le.source, le.attrs,
517
+ COALESCE((
518
+ SELECT json_group_array(ordered.tag)
519
+ FROM (
520
+ SELECT tag FROM log_tags WHERE log_entry_id = le.id ORDER BY tag
521
+ ) ordered
522
+ ), '[]') AS tags
473
523
  FROM log_entries le
474
524
  JOIN turns t ON t.id = le.turn_id
475
525
  JOIN loops l ON l.id = le.loop_id
@@ -481,8 +531,8 @@ JOIN loops l ON l.id = le.loop_id
481
531
  -- {§operation-result-uniform-error-channel}.
482
532
  WHERE le.worker_id = $worker_id
483
533
  AND NOT (le.status_rx = 202 AND le.state = 'proposed')
484
- AND NOT (le.op IN ('OPEN', 'FOLD') AND le.status_rx < 400)
485
- AND NOT (le.op = 'KILL' AND le.scheme = 'log' AND le.status_rx < 400)
534
+ AND NOT (COALESCE(le.op, '') IN ('OPEN', 'FOLD') AND le.status_rx < 400)
535
+ AND NOT (COALESCE(le.op, '') = 'KILL' AND le.scheme = 'log' AND le.status_rx < 400)
486
536
  ORDER BY l.sequence, t.sequence, le.sequence;
487
537
 
488
538
  -- PREP: engine_insert_log_entry
@@ -491,14 +541,14 @@ ORDER BY l.sequence, t.sequence, le.sequence;
491
541
  -- triggers the proposal lifecycle (engine pauses dispatch; client resolves
492
542
  -- via proposal resolution; entry transitions through engine_resolve_log_entry).
493
543
  INSERT INTO log_entries (
494
- worker_id, loop_id, turn_id, sequence, origin, source,
544
+ worker_id, loop_id, turn_id, sequence, origin, source, model_call_id,
495
545
  op, suffix, signal,
496
546
  scheme, username, password, hostname, port,
497
547
  pathname, query, fragment, lineMarker,
498
548
  tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens,
499
549
  state, outcome, attrs
500
550
  ) VALUES (
501
- $worker_id, $loop_id, $turn_id, $sequence, $origin, $source,
551
+ $worker_id, $loop_id, $turn_id, $sequence, $origin, $source, $model_call_id,
502
552
  $op, $suffix, $signal,
503
553
  $scheme, $username, $password, $hostname, $port,
504
554
  $pathname, $query, $fragment, $lineMarker,
@@ -533,12 +583,15 @@ SELECT l.sequence AS loop_seq,
533
583
  JOIN loops l ON l.id = le.loop_id
534
584
  WHERE le.id = $id;
535
585
 
536
- -- PREP: engine_turn_retrievals
537
- -- {§send-premature-terminate} — the pending set's retrieval leg: THIS turn's READ/FIND/OPEN rows,
538
- -- whose results the model cannot have seen (they fold back next packet). A [200] over them is
539
- -- discarding answers it asked for.
540
- SELECT id FROM log_entries
541
- WHERE turn_id = $turn_id AND origin = 'model' AND op IN ('READ', 'FIND', 'OPEN');
586
+ -- PREP: engine_turn_packet_boundaries
587
+ -- {§send-premature-terminate}/{§wait-obligation-matrix} — operations whose useful effect crosses
588
+ -- into the next packet: READ/FIND/OPEN/BARE results, plus successful FOLD context curation. Retrievals
589
+ -- block an explicit [200]; FOLD blocks only the empty-[202] inference because explicit final
590
+ -- housekeeping remains valid.
591
+ SELECT id, op FROM log_entries
592
+ WHERE turn_id = $turn_id
593
+ AND origin = 'model'
594
+ AND (op IN ('READ', 'FIND', 'OPEN', 'BARE') OR (op = 'FOLD' AND status_rx < 400));
542
595
 
543
596
  -- PREP: engine_worker_has_undelivered_stream_term
544
597
  -- A stream may finish between its EXEC and a same-turn SEND. It is then no longer
@@ -568,8 +621,8 @@ LIMIT 1;
568
621
  -- errors the model cannot have seen (they land next packet). A [200] or already-drained [202] over
569
622
  -- them concludes blind past a failure — refused 409; [499] abandons regardless (declaring failure
570
623
  -- IS weighing it).
571
- -- Actionless engine errors are excluded: the grinder's overflow row mints pre-packet, so the
572
- -- recovery turn already saw it ({§grinder-hard-413-recovery}). A model-authored statement that
624
+ -- Actionless engine errors are excluded because only model-authored failures can make
625
+ -- the model's concluding disposition blind. A model-authored statement that
573
626
  -- failed grammar parsing is different: source='grammar' records a bounded operation failure
574
627
  -- from the accepted emission, unseen until the next packet, so it gates completion like every
575
628
  -- other failed model operation.
@@ -603,6 +656,22 @@ WITH RECURSIVE lineage(id, parent_worker_id) AS (
603
656
  )
604
657
  SELECT id FROM lineage WHERE parent_worker_id IS NULL;
605
658
 
659
+ -- PREP: engine_worker_provider_identity
660
+ -- Provider routing uses globally unique opaque identities, while all relational
661
+ -- ownership and client coordinates retain the local integer worker id.
662
+ -- {§worker-provider-identity} {§worker-primary}
663
+ WITH RECURSIVE lineage(id, parent_worker_id, provider_identity) AS (
664
+ SELECT id, parent_worker_id, provider_identity FROM workers WHERE id = $worker_id
665
+ UNION ALL
666
+ SELECT w.id, w.parent_worker_id, w.provider_identity
667
+ FROM workers w JOIN lineage l ON w.id = l.parent_worker_id
668
+ )
669
+ SELECT current.provider_identity AS worker_id,
670
+ root.provider_identity AS primary_worker_id
671
+ FROM workers current
672
+ JOIN lineage root ON root.parent_worker_id IS NULL
673
+ WHERE current.id = $worker_id;
674
+
606
675
  -- PREP: engine_worker_has_undelivered_child_term
607
676
  -- A child conclusion newer than the parent's observation cursor is complete but
608
677
  -- not delivered. This is the same durable boundary the next packet consumes,
@@ -0,0 +1,10 @@
1
+ import type { RuntimeInvocationDecl } from "@plurnk/plurnk-execs";
2
+ interface ExecutableTool {
3
+ readonly runtime: string;
4
+ readonly invocation: RuntimeInvocationDecl;
5
+ }
6
+ export default class ExecutableTools {
7
+ static render(tools: readonly ExecutableTool[]): string;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=ExecutableTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutableTools.d.ts","sourceRoot":"","sources":["../../src/core/ExecutableTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,UAAU,cAAc;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;CAC9C;AAqBD,MAAM,CAAC,OAAO,OAAO,eAAe;IAChC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAyBtD;CACJ"}
@@ -0,0 +1,41 @@
1
+ const escapeCell = (value) => value.replaceAll("|", "\\|");
2
+ const bucket = (role, required, exclusive) => {
3
+ const marker = exclusive ? " ↔" : required ? "" : " ?";
4
+ return `${escapeCell(role)}${marker}`;
5
+ };
6
+ const code = (value) => {
7
+ const longest = Math.max(0, ...[...value.matchAll(/`+/g)].map((match) => match[0].length));
8
+ const fence = "`".repeat(longest + 1);
9
+ const padding = value.startsWith("`") || value.endsWith("`") ? " " : "";
10
+ return `${fence}${padding}${escapeCell(value)}${padding}${fence}`;
11
+ };
12
+ const example = (runtime, invocation) => {
13
+ const heading = `## EXEC0 [${runtime}]${invocation.example.target === undefined ? "" : ` (${invocation.example.target})`}`;
14
+ return [heading, invocation.example.body].filter((line) => line !== undefined).map((line) => code(line)).join("<br>");
15
+ };
16
+ export default class ExecutableTools {
17
+ static render(tools) {
18
+ if (tools.length === 0)
19
+ return "";
20
+ const rows = tools
21
+ .toSorted((left, right) => left.runtime.localeCompare(right.runtime))
22
+ .map(({ runtime, invocation }) => {
23
+ const exclusive = invocation.exclusive === true;
24
+ const target = invocation.target === undefined
25
+ ? "—"
26
+ : bucket(`${invocation.target.role}${invocation.target.directory === "cwd" ? " or local directory with body" : ""}`, invocation.target.required, exclusive);
27
+ const body = bucket(invocation.body.role, invocation.body.required, exclusive);
28
+ return `| \`[${runtime}]\` | ${target} | ${body} | ${example(runtime, invocation)} |`;
29
+ });
30
+ return [
31
+ "YOU SHOULD use purpose-built Plurnk OPs when possible; use EXEC for scripts only when necessary.",
32
+ "",
33
+ "`?` optional · `↔` choose one · `—` unavailable · `<timeout,poll>` optional",
34
+ "",
35
+ "| `[executor]` | `(target)` | body | example |",
36
+ "| --- | --- | --- | --- |",
37
+ ...rows,
38
+ ].join("\n");
39
+ }
40
+ }
41
+ //# sourceMappingURL=ExecutableTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutableTools.js","sourceRoot":"","sources":["../../src/core/ExecutableTools.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ChannelDecl, ExecArgs, ExecResult, Effect, RuntimeAvailability } from "@plurnk/plurnk-execs";
1
+ import type { ChannelDecl, ExecArgs, ExecResult, Effect, RuntimeAvailability, RuntimeInvocationDecl } from "@plurnk/plurnk-execs";
2
2
  import { type PackageAttributions, type PluginAttribution, type PluginAttributionContext } from "@plurnk/plurnk-meta";
3
3
  import type { SchemeManifest } from "./types.ts";
4
4
  export interface Executor {
@@ -22,7 +22,7 @@ export interface RegistryEntry {
22
22
  readonly executor: Executor;
23
23
  readonly namespaceOwner: RuntimeNamespaceOwner;
24
24
  readonly glyph: string;
25
- readonly example: string;
25
+ readonly invocation: RuntimeInvocationDecl;
26
26
  readonly documentation: string;
27
27
  readonly available: boolean;
28
28
  readonly detail: string | undefined;
@@ -41,7 +41,7 @@ export default class ExecutorRegistry {
41
41
  registry: ReadonlyMap<string, {
42
42
  runtime: string;
43
43
  glyph: string;
44
- example?: string;
44
+ invocation: RuntimeInvocationDecl;
45
45
  documentation?: string;
46
46
  packageName: string;
47
47
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutorRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExecutorRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"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"}
@@ -76,7 +76,7 @@ export default class ExecutorRegistry {
76
76
  }
77
77
  // {§operator-config-git-ceiling} PLURNK_SERVICE_GIT_ALLOWED=0 must drop every
78
78
  // Git-capability executor entirely: a denied host neither dispatches
79
- // EXEC[git]/EXEC[isogit] nor teaches them through the tools sheet.
79
+ // the Git/isogit EXEC runtimes nor teaches them through the tools sheet.
80
80
  const gitDenied = process.env.PLURNK_SERVICE_GIT_ALLOWED !== "1";
81
81
  const gitRuntimes = new Set(["git", "isogit"]);
82
82
  const infos = [...discovered.values()].filter((info) => !(gitDenied && gitRuntimes.has(info.runtime)));
@@ -95,7 +95,7 @@ export default class ExecutorRegistry {
95
95
  executor,
96
96
  namespaceOwner: { kind: "package", name: info.packageName },
97
97
  glyph: info.glyph,
98
- example: info.example ?? "",
98
+ invocation: info.invocation,
99
99
  documentation: info.documentation ?? "",
100
100
  available: availability.available,
101
101
  detail: availability.detail,