@plurnk/plurnk-service 0.44.0 → 0.46.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 (133) hide show
  1. package/.env.example +41 -24
  2. package/README.md +37 -18
  3. package/SPEC.md +34 -10
  4. package/dist/core/ChannelWrite.d.ts +4 -0
  5. package/dist/core/ChannelWrite.d.ts.map +1 -1
  6. package/dist/core/ChannelWrite.js +9 -0
  7. package/dist/core/ChannelWrite.js.map +1 -1
  8. package/dist/core/ChannelWrite.sql +69 -0
  9. package/dist/core/Engine.d.ts.map +1 -1
  10. package/dist/core/Engine.js +146 -103
  11. package/dist/core/Engine.js.map +1 -1
  12. package/dist/core/Engine.sql +307 -0
  13. package/dist/core/ExecutorRegistry.d.ts +4 -2
  14. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  15. package/dist/core/ExecutorRegistry.js +20 -5
  16. package/dist/core/ExecutorRegistry.js.map +1 -1
  17. package/dist/core/SchemeRegistry.d.ts +3 -0
  18. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  19. package/dist/core/SchemeRegistry.js +37 -0
  20. package/dist/core/SchemeRegistry.js.map +1 -1
  21. package/dist/core/fork.d.ts.map +1 -1
  22. package/dist/core/fork.js +8 -1
  23. package/dist/core/fork.js.map +1 -1
  24. package/dist/core/fork.sql +50 -0
  25. package/dist/core/packet-wire.d.ts +1 -0
  26. package/dist/core/packet-wire.d.ts.map +1 -1
  27. package/dist/core/packet-wire.js +11 -0
  28. package/dist/core/packet-wire.js.map +1 -1
  29. package/dist/core/plugin-attribution.d.ts +5 -0
  30. package/dist/core/plugin-attribution.d.ts.map +1 -0
  31. package/dist/core/plugin-attribution.js +39 -0
  32. package/dist/core/plugin-attribution.js.map +1 -0
  33. package/dist/core/run-ops.sql +16 -0
  34. package/dist/core/scheme-types.d.ts +1 -0
  35. package/dist/core/scheme-types.d.ts.map +1 -1
  36. package/dist/core/session-settings.d.ts +1 -0
  37. package/dist/core/session-settings.d.ts.map +1 -1
  38. package/dist/core/session-settings.js +2 -1
  39. package/dist/core/session-settings.js.map +1 -1
  40. package/dist/schemes/Exec.d.ts +2 -1
  41. package/dist/schemes/Exec.d.ts.map +1 -1
  42. package/dist/schemes/Exec.js +39 -22
  43. package/dist/schemes/Exec.js.map +1 -1
  44. package/dist/schemes/File.d.ts.map +1 -1
  45. package/dist/schemes/File.js +27 -3
  46. package/dist/schemes/File.js.map +1 -1
  47. package/dist/schemes/Log.sql +37 -0
  48. package/dist/schemes/_entry-crud.sql +88 -0
  49. package/dist/schemes/_entry-find.sql +31 -0
  50. package/dist/schemes/_entry-graph.sql +60 -0
  51. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  52. package/dist/schemes/_entry-manifest.js +11 -3
  53. package/dist/schemes/_entry-manifest.js.map +1 -1
  54. package/dist/schemes/_entry-ops.sql +20 -0
  55. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  56. package/dist/schemes/_entry-semantic.js +14 -7
  57. package/dist/schemes/_entry-semantic.js.map +1 -1
  58. package/dist/schemes/_entry-semantic.sql +80 -0
  59. package/dist/schemes/exec-abort.d.ts +11 -0
  60. package/dist/schemes/exec-abort.d.ts.map +1 -0
  61. package/dist/schemes/exec-abort.js +23 -0
  62. package/dist/schemes/exec-abort.js.map +1 -0
  63. package/dist/schemes/exec-env.js +1 -1
  64. package/dist/schemes/exec-env.js.map +1 -1
  65. package/dist/server/Daemon.d.ts.map +1 -1
  66. package/dist/server/Daemon.js +162 -76
  67. package/dist/server/Daemon.js.map +1 -1
  68. package/dist/server/clientTurn.sql +10 -0
  69. package/dist/server/drain.sql +92 -0
  70. package/dist/server/dsl.d.ts.map +1 -1
  71. package/dist/server/dsl.js +11 -4
  72. package/dist/server/dsl.js.map +1 -1
  73. package/dist/server/envelope.sql +75 -0
  74. package/dist/server/logEntry.sql +10 -0
  75. package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -1
  76. package/dist/server/methods/_dispatchAsClient.js +11 -6
  77. package/dist/server/methods/_dispatchAsClient.js.map +1 -1
  78. package/dist/server/methods/entry_read.sql +21 -0
  79. package/dist/server/methods/log_read.sql +11 -0
  80. package/dist/server/methods/loop_run.d.ts.map +1 -1
  81. package/dist/server/methods/loop_run.js +31 -11
  82. package/dist/server/methods/loop_run.js.map +1 -1
  83. package/dist/server/methods/loop_run.sql +9 -0
  84. package/dist/server/methods/session_create.d.ts.map +1 -1
  85. package/dist/server/methods/session_create.js +10 -3
  86. package/dist/server/methods/session_create.js.map +1 -1
  87. package/dist/service.d.ts +6 -0
  88. package/dist/service.d.ts.map +1 -0
  89. package/dist/service.js +221 -0
  90. package/dist/service.js.map +1 -0
  91. package/migrations/0000-00-00.01_schema.sql +2 -2
  92. package/package.json +27 -13
  93. package/bin/plurnk-service.ts +0 -176
  94. package/dist/core/ProviderRegistry.d.ts +0 -42
  95. package/dist/core/ProviderRegistry.d.ts.map +0 -1
  96. package/dist/core/ProviderRegistry.js +0 -72
  97. package/dist/core/ProviderRegistry.js.map +0 -1
  98. package/dist/core/line-marker.d.ts +0 -23
  99. package/dist/core/line-marker.d.ts.map +0 -1
  100. package/dist/core/line-marker.js +0 -321
  101. package/dist/core/line-marker.js.map +0 -1
  102. package/dist/core/matcher.d.ts +0 -12
  103. package/dist/core/matcher.d.ts.map +0 -1
  104. package/dist/core/matcher.js +0 -72
  105. package/dist/core/matcher.js.map +0 -1
  106. package/dist/core/mimetype-binary.d.ts +0 -6
  107. package/dist/core/mimetype-binary.d.ts.map +0 -1
  108. package/dist/core/mimetype-binary.js +0 -82
  109. package/dist/core/mimetype-binary.js.map +0 -1
  110. package/dist/core/path-mimetype.d.ts +0 -3
  111. package/dist/core/path-mimetype.d.ts.map +0 -1
  112. package/dist/core/path-mimetype.js +0 -47
  113. package/dist/core/path-mimetype.js.map +0 -1
  114. package/dist/core/plugin-trust.d.ts +0 -4
  115. package/dist/core/plugin-trust.d.ts.map +0 -1
  116. package/dist/core/plugin-trust.js +0 -23
  117. package/dist/core/plugin-trust.js.map +0 -1
  118. package/dist/providers/Mock.d.ts +0 -43
  119. package/dist/providers/Mock.d.ts.map +0 -1
  120. package/dist/providers/Mock.js +0 -36
  121. package/dist/providers/Mock.js.map +0 -1
  122. package/dist/server/methods/op_hide.d.ts +0 -5
  123. package/dist/server/methods/op_hide.d.ts.map +0 -1
  124. package/dist/server/methods/op_hide.js +0 -24
  125. package/dist/server/methods/op_hide.js.map +0 -1
  126. package/dist/server/methods/op_show.d.ts +0 -5
  127. package/dist/server/methods/op_show.d.ts.map +0 -1
  128. package/dist/server/methods/op_show.js +0 -24
  129. package/dist/server/methods/op_show.js.map +0 -1
  130. package/dist/server/methods/session_set_persona.d.ts +0 -5
  131. package/dist/server/methods/session_set_persona.d.ts.map +0 -1
  132. package/dist/server/methods/session_set_persona.js +0 -29
  133. package/dist/server/methods/session_set_persona.js.map +0 -1
@@ -0,0 +1,307 @@
1
+ -- Engine SQL. SPEC §arch (architecture), §scheme (op dispatch + log).
2
+
3
+ -- PREP: engine_loop_status
4
+ SELECT status FROM loops WHERE id = $loop_id;
5
+
6
+ -- PREP: engine_count_active_loops_for_run
7
+ -- Wake-on-completion uses this to decide whether to open a new loop or
8
+ -- let the existing one pick up the channel transition at the next turn
9
+ -- boundary. Status 102 = "in progress" (any non-terminal state).
10
+ SELECT COUNT(*) AS n FROM loops WHERE run_id = $run_id AND status = 102;
11
+
12
+ -- PREP: engine_get_loop_flags
13
+ -- Loads the loop's persisted flags (json). Default '{}'; YOLO listener and
14
+ -- SchemeRegistry.resolveForLoop merge over DEFAULT_LOOP_FLAGS for missing
15
+ -- fields. Migration 014.
16
+ SELECT flags FROM loops WHERE id = $loop_id;
17
+
18
+ -- PREP: engine_set_loop_flags
19
+ -- Updates the loop's persisted flags (json). Called by loop.run RPC handler.
20
+ UPDATE loops SET flags = $flags WHERE id = $loop_id;
21
+
22
+ -- PREP: engine_get_loop_prompt
23
+ -- Loop's prompt + sequence — runTurn reads it on turn 1 to foist a
24
+ -- system-origin EDIT against plurnk:///prompt/<loop_id>/1 (§packet), at the
25
+ -- turn's first action sequence. Prompts are first-class log entries
26
+ -- (no synthetic / shim layer).
27
+ SELECT prompt, sequence FROM loops WHERE id = $loop_id;
28
+
29
+ -- PREP: engine_loop_set_status
30
+ -- The universal terminal setter. terminal_message carries either the loop's deliverable
31
+ -- (the SEND body) or the engine's abandonment reason (max_turns / budget_overflow /
32
+ -- strike_threshold) — rides the §run-scheme delta.
33
+ UPDATE loops SET status = $status, terminal_message = $message WHERE id = $loop_id;
34
+
35
+ -- PREP: session_get_settings
36
+ -- #231 — the session's client-chosen open-context bag ({ manifestItems?, mdDocs? }),
37
+ -- read at turn-0 with precedence over env.
38
+ SELECT settings FROM sessions WHERE id = $session_id;
39
+
40
+ -- PREP: engine_target_diverged_this_turn
41
+ -- #note10 — did this entry diverge on disk THIS turn? A source=file env-delta for the
42
+ -- target, materialized into this run's log at the current turn, means the model's view
43
+ -- predates the ambient change — a YOLO auto-accept of a same-turn EDIT would clobber it.
44
+ SELECT 1 AS hit
45
+ FROM log_entries
46
+ WHERE run_id = $run_id AND turn_id = $turn_id
47
+ AND origin = 'plurnk' AND source = 'file' AND op = 'EDIT'
48
+ AND scheme IS $scheme AND pathname = $pathname
49
+ LIMIT 1;
50
+
51
+ -- PREP: engine_list_session_entry_tags
52
+ -- #note13 — every (entry, tag) in the session, for the manifest catalog's tags field.
53
+ SELECT et.entry_id, et.tag
54
+ FROM entry_tags et
55
+ JOIN entries e ON e.id = et.entry_id
56
+ WHERE e.session_id = $session_id
57
+ ORDER BY et.entry_id, et.tag;
58
+
59
+ -- PREP: engine_next_turn_sequence
60
+ SELECT COALESCE(MAX(sequence), 0) + 1 AS next FROM turns WHERE loop_id = $loop_id;
61
+
62
+ -- PREP: engine_loop_usage
63
+ -- Per-loop usage totals — SUM the loop's turns (§tokenomics stores usage per turn).
64
+ -- Surfaced on loop.run + loop/terminated (#197).
65
+ SELECT COALESCE(SUM(usage_prompt), 0) AS prompt,
66
+ COALESCE(SUM(usage_completion), 0) AS completion,
67
+ COALESCE(SUM(usage_cost_pico), 0) AS cost_pico
68
+ FROM turns WHERE loop_id = $loop_id;
69
+
70
+ -- PREP: engine_loop_turn_seqs
71
+ -- Look up (loop_seq, turn_seq) for a given (loop_id, turn_id). Used by
72
+ -- #writeLog when an op needs to address itself or its output by log
73
+ -- coordinate (e.g. EXEC's stream entry at exec:///<loop_seq>/<turn_seq>/<sequence>/EXEC).
74
+ SELECT l.sequence AS loop_seq, t.sequence AS turn_seq
75
+ FROM loops l, turns t
76
+ WHERE l.id = $loop_id AND t.id = $turn_id;
77
+
78
+ -- PREP: engine_open_turn
79
+ -- Turn-as-container model: insert a turn row at runTurn open with a
80
+ -- placeholder packet and status=102 (in-progress). Pre-model writes
81
+ -- (the user prompt; later, system signals/telemetry events) land into
82
+ -- this row before the provider is called. The turn is then "closed"
83
+ -- via engine_close_turn with the final packet + status + usage stats
84
+ -- after dispatch completes.
85
+ INSERT INTO turns (loop_id, sequence, status, packet)
86
+ VALUES ($loop_id, $sequence, 102, '{}')
87
+ RETURNING id;
88
+
89
+ -- PREP: engine_close_turn
90
+ -- Updates the turn with the response packet, terminal status, and
91
+ -- provider usage stats once dispatch is complete. Paired with
92
+ -- engine_open_turn at runTurn boundaries.
93
+ UPDATE turns SET
94
+ status = $status,
95
+ packet = $packet,
96
+ usage_prompt = $usage_prompt,
97
+ usage_completion = $usage_completion,
98
+ usage_cached = $usage_cached,
99
+ usage_cost_pico = $usage_cost_pico,
100
+ finish_reason = $finish_reason,
101
+ model = $model
102
+ WHERE id = $id;
103
+
104
+ -- PREP: engine_list_session_entries
105
+ -- Every entry of a session — all schemes, all channels — the source for
106
+ -- plurnk:///manifest.json, the flat catalog of everything the session holds.
107
+ -- Session-scoped (persists across runs); FOLD doesn't drop from the catalog.
108
+ -- `seconds` is the live age of an active stream: now − the open subscription's
109
+ -- opened_at (closed_at IS NULL). NULL for static entries. unixepoch parses the
110
+ -- stored '...%fZ' timestamp directly; re-evaluated every render like tokens.
111
+ SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.tokens, e.deep_hash,
112
+ CAST(unixepoch('now') - unixepoch(s.opened_at) AS INTEGER) AS seconds
113
+ FROM entries e
114
+ JOIN entry_channels ec ON ec.entry_id = e.id
115
+ LEFT JOIN subscriptions s ON s.entry_id = e.id AND s.closed_at IS NULL
116
+ -- entries are session-scoped, shared across runs — §machine-processes-one-filesystem
117
+ WHERE e.scope = 'session' AND e.session_id = $session_id
118
+ -- User Note 5 — mtime-ascending: dormant entries hold the stable prompt-cache prefix; churn clusters at the tail.
119
+ ORDER BY e.updated_at ASC, e.id ASC, ec.name;
120
+
121
+ -- PREP: engine_scheme_catalog_summary
122
+ -- Per-scheme tally for the # Plurnk System Catalog section: distinct entry count + summed
123
+ -- stored token weight, so the model sees which schemes hold content (and roughly how much)
124
+ -- without probing e.g. FIND(known://**) every turn. Same session-scope set as the manifest
125
+ -- above; tokens are the write-time snapshot (a size gauge, not the manifest's live recount).
126
+ -- The self-referential manifest entry is excluded — its weight balloons as the catalog grows.
127
+ SELECT e.scheme AS scheme,
128
+ COUNT(DISTINCT e.id) AS entries,
129
+ COALESCE(SUM(ec.tokens), 0) AS tokens
130
+ FROM entries e
131
+ JOIN entry_channels ec ON ec.entry_id = e.id
132
+ WHERE e.scope = 'session' AND e.session_id = $session_id
133
+ AND NOT (e.scheme = 'plurnk' AND e.pathname = '/manifest.json')
134
+ GROUP BY e.scheme
135
+ ORDER BY e.scheme;
136
+
137
+ -- PREP: engine_run_prior_turn_time
138
+ -- §env-delta — timestamp of this run's most recent turn BEFORE the current one
139
+ -- (the "since I last looked" boundary). NULL on the run's first turn → no deltas.
140
+ SELECT MAX(t.timestamp) AS since
141
+ FROM turns t JOIN loops l ON l.id = t.loop_id
142
+ WHERE l.run_id = $run_id AND t.id != $turn_id;
143
+
144
+ -- PREP: engine_pull_env_deltas
145
+ -- §env-delta — other actors' resolved EDITs on shared entries since this run last
146
+ -- looked. Real edits (origin model/client) AND the plurnk run's fs-sync fictions
147
+ -- (origin=plurnk on the reserved 'plurnk' run); excludes this run's own rows and
148
+ -- other runs' already-materialized deltas (origin=plurnk on a real run). plurnk:///
149
+ -- entries (manifest/prompt/doc) never surface. This is the environment door (§actor-boundary-two-doors); the voice door is inject.
150
+ SELECT le.run_id, le.scheme, le.pathname, le.rx, le.source
151
+ FROM log_entries le
152
+ JOIN runs r ON r.id = le.run_id
153
+ WHERE r.session_id = $session_id
154
+ AND le.op = 'EDIT'
155
+ AND le.state = 'resolved'
156
+ AND le.status_rx IN (200, 201)
157
+ AND (le.scheme IS NULL OR le.scheme != 'plurnk')
158
+ AND le.run_id != $run_id
159
+ AND le.at > $since
160
+ AND (le.origin != 'plurnk'
161
+ OR le.run_id = (SELECT id FROM runs WHERE session_id = $session_id AND name = 'plurnk'))
162
+ ORDER BY le.at;
163
+
164
+ -- PREP: engine_insert_env_delta
165
+ -- §env-delta — materialize a pulled cross-actor edit as a FOLDED delta (expanded=0)
166
+ -- in this run's log. origin=plurnk; source carries the cause (sibling run id or
167
+ -- 'file'); rx reuses the originating row's result span (§edit-result-render).
168
+ INSERT INTO log_entries (
169
+ run_id, loop_id, turn_id, sequence, origin, source,
170
+ op, scheme, pathname, tx, mimetype_tx, rx, mimetype_rx, status_rx, expanded
171
+ ) VALUES (
172
+ $run_id, $loop_id, $turn_id, $sequence, 'plurnk', $source,
173
+ 'EDIT', $scheme, $pathname, '', 'text/plain', $rx, 'application/json', 200, 0
174
+ );
175
+
176
+ -- PREP: engine_pull_loop_terminations
177
+ -- §run-scheme — sibling runs' loops that reached a terminal status since this run last
178
+ -- looked (the loop-termination ambient delta). Carries terminal_message — the SEND[200]
179
+ -- deliverable or the abandonment reason. Excludes this run's own loops.
180
+ SELECT l.run_id, r.name AS run_name, l.status, l.prompt, l.terminal_message
181
+ FROM loops l
182
+ JOIN runs r ON r.id = l.run_id
183
+ WHERE r.session_id = $session_id
184
+ AND l.terminated_at IS NOT NULL
185
+ AND l.terminated_at > $since
186
+ AND l.run_id != $run_id
187
+ ORDER BY l.terminated_at;
188
+
189
+ -- PREP: engine_insert_loop_termination_delta
190
+ -- §run-scheme — materialize a sibling's loop-termination as a FOLDED delta: a SEND
191
+ -- from run:///<name> carrying the terminal status + message (the deliverable).
192
+ -- origin=plurnk, source=the terminated run — uniform with the env-delta.
193
+ INSERT INTO log_entries (
194
+ run_id, loop_id, turn_id, sequence, origin, source,
195
+ op, scheme, pathname, tx, mimetype_tx, rx, mimetype_rx, status_rx, expanded
196
+ ) VALUES (
197
+ $run_id, $loop_id, $turn_id, $sequence, 'plurnk', $source,
198
+ 'SEND', 'run', $pathname, '', 'text/plain', $rx, 'text/markdown', $status, 0
199
+ );
200
+
201
+ -- PREP: engine_entry_tags
202
+ SELECT tag FROM entry_tags WHERE entry_id = $entry_id ORDER BY tag;
203
+
204
+ -- PREP: engine_render_telemetry_errors
205
+ -- SPEC §telemetry: action-bound failures from the immediately previous turn
206
+ -- are mirrored into the next packet's telemetry.errors[]. Forces the
207
+ -- model to confront 4xx/5xx outcomes instead of letting them rot in
208
+ -- log:///. "Previous turn" = sequence one below the currently-open one
209
+ -- (turn-as-container model: the current turn exists with status=102
210
+ -- when this query fires, so we explicitly look one back).
211
+ SELECT
212
+ le.op, le.sequence, le.status_rx, le.rx, le.mimetype_rx,
213
+ le.scheme, le.pathname,
214
+ t.sequence AS turn_seq, l.sequence AS loop_seq
215
+ FROM log_entries le
216
+ JOIN turns t ON t.id = le.turn_id
217
+ JOIN loops l ON l.id = le.loop_id
218
+ WHERE le.loop_id = $loop_id
219
+ AND le.status_rx >= 400
220
+ AND t.sequence = $current_turn_seq - 1
221
+ ORDER BY le.sequence;
222
+
223
+ -- PREP: engine_grinder_prior_turn_logs
224
+ -- §grinder pass 1 (prior-turn rollback): the immediately-prior turn's still-open
225
+ -- log entries — the latest emissions that pushed the packet over. Folding them
226
+ -- (collapse to coordinate, not deleting) lightens the render; bodies persist, re-OPENable.
227
+ SELECT le.id, le.scheme
228
+ FROM log_entries le
229
+ WHERE le.loop_id = $loop_id AND le.expanded = 1
230
+ AND le.turn_id = (SELECT MAX(id) FROM turns WHERE loop_id = $loop_id AND id < $turn_id);
231
+
232
+ -- PREP: engine_grinder_fold_prior_turn_logs
233
+ -- §grinder pass 1: fold the prior turn's still-open logs in one set-op (same WHERE
234
+ -- as engine_grinder_prior_turn_logs above). Rows + bodies stay, re-OPENable.
235
+ UPDATE log_entries SET expanded = 0
236
+ WHERE loop_id = $loop_id AND expanded = 1
237
+ AND turn_id = (SELECT MAX(id) FROM turns WHERE loop_id = $loop_id AND id < $turn_id);
238
+
239
+ -- PREP: engine_fold_log_entry
240
+ -- §prompt-fold (User Note 6): fold a single log row by id — collapse to its
241
+ -- coordinate, body elided in the render, re-OPENable. Used for the foisted prompt
242
+ -- EDIT, which duplicates packet.user.prompt: logged for forensics, born folded.
243
+ UPDATE log_entries SET expanded = 0 WHERE id = $id;
244
+
245
+ -- PREP: engine_render_log
246
+ -- Render-time log assembly (SPEC §packet packet.system.log).
247
+ -- Yields log_entries for the whole RUN — the conversation's working
248
+ -- memory carries across loops within a session's run, not just the
249
+ -- current loop. Coordinate is log:///<loop_seq>/<turn_seq>/<sequence>/<op>.
250
+ -- Status 202 entries in state='proposed' are model-invisible until resolved.
251
+ -- `expanded = 0` rows are FOLDED — listed but collapsed to their coordinate
252
+ -- (FOLD); the renderer elides the body. §open-fold: folded rows stay listed, re-OPENable.
253
+ SELECT
254
+ l.sequence AS loop_seq,
255
+ t.sequence AS turn_seq,
256
+ le.sequence,
257
+ -- le.origin is attribution, never a render filter; the run's actor — §actor-boundary-origin-not-filter §machine-processes-run-origin
258
+ le.origin,
259
+ le.op, le.suffix, le.signal,
260
+ le.scheme, le.username, le.password,
261
+ le.hostname, le.port, le.pathname,
262
+ le.params, le.fragment,
263
+ le.status_rx, le.rx, le.mimetype_rx,
264
+ le.tx, le.mimetype_tx,
265
+ le.state, le.outcome, le.expanded, le.source
266
+ FROM log_entries le
267
+ JOIN turns t ON t.id = le.turn_id
268
+ JOIN loops l ON l.id = le.loop_id
269
+ -- WHERE renders exactly one run's log — §actor-boundary-isolation §machine-processes-run-is-its-log
270
+ -- the AND NOT clause keeps proposed (202) rows hidden until resolved — §proposal-proposed-hidden
271
+ WHERE le.run_id = $run_id
272
+ AND NOT (le.status_rx = 202 AND le.state = 'proposed')
273
+ ORDER BY l.sequence, t.sequence, le.sequence;
274
+
275
+ -- PREP: engine_insert_log_entry
276
+ -- Default state='resolved' covers the common path (non-proposing schemes
277
+ -- return their final status immediately). Status 202 + state='proposed'
278
+ -- triggers the proposal lifecycle (engine pauses dispatch; client resolves
279
+ -- via loop/resolve RPC; entry transitions through engine_resolve_log_entry).
280
+ INSERT INTO log_entries (
281
+ run_id, loop_id, turn_id, sequence, origin, source,
282
+ op, suffix, signal,
283
+ scheme, username, password, hostname, port,
284
+ pathname, params, fragment, lineMarker,
285
+ tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens,
286
+ state, outcome, attrs
287
+ ) VALUES (
288
+ $run_id, $loop_id, $turn_id, $sequence, $origin, $source,
289
+ $op, $suffix, $signal,
290
+ $scheme, $username, $password, $hostname, $port,
291
+ $pathname, $params, $fragment, $lineMarker,
292
+ $tx, $mimetype_tx, $rx, $mimetype_rx, $status_rx, $tokens,
293
+ $state, $outcome, $attrs
294
+ )
295
+ RETURNING id;
296
+
297
+ -- PREP: engine_resolve_log_entry
298
+ -- Transitions a proposed log entry to its terminal state. Used by the
299
+ -- proposal lifecycle (loop/resolve RPC, YOLO auto-accept, timeout, abort).
300
+ -- Updates status_rx + rx + state + outcome atomically.
301
+ UPDATE log_entries
302
+ SET state = $state,
303
+ outcome = $outcome,
304
+ status_rx = $status_rx,
305
+ rx = $rx
306
+ WHERE id = $id
307
+ AND state = 'proposed';
@@ -17,10 +17,12 @@ export interface RegistryEntry {
17
17
  }
18
18
  export default class ExecutorRegistry {
19
19
  #private;
20
- constructor(byTag: ReadonlyMap<string, RegistryEntry>);
21
- static build({ defaultRuntime, probeTimeoutMs, discoverFn, load }?: {
20
+ constructor(byTag: ReadonlyMap<string, RegistryEntry>, attributions?: readonly string[]);
21
+ attributions(): string[];
22
+ static build({ defaultRuntime, probeTimeoutMs, cwd, discoverFn, load }?: {
22
23
  defaultRuntime?: string | null;
23
24
  probeTimeoutMs?: number;
25
+ cwd?: string;
24
26
  discoverFn?: () => Promise<{
25
27
  registry: ReadonlyMap<string, {
26
28
  runtime: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutorRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAI7H,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAGvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAWD,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBAGrB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC;WAIxC,KAAK,CAAC,EAAE,cAAqB,EAAE,cAAqB,EAAE,UAAqB,EAAE,IAAuD,EAAE,GAAE;QACjJ,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;YAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACrL,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACxC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiElC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAO7C,iBAAiB,IAAI,SAAS,MAAM,EAAE;CAKzC"}
1
+ {"version":3,"file":"ExecutorRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAK7H,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAGvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAWD,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBAIrB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO;IAO3F,YAAY,IAAI,MAAM,EAAE;WAEX,KAAK,CAAC,EAAE,cAAqB,EAAE,cAAqB,EAAE,GAAG,EAAE,UAAU,EAAE,IAAuD,EAAE,GAAE;QAC3I,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;YAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACrL,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACxC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2ElC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAO7C,iBAAiB,IAAI,SAAS,MAAM,EAAE;CAKzC"}
@@ -7,6 +7,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
7
7
  return path;
8
8
  };
9
9
  import { discover } from "@plurnk/plurnk-execs";
10
+ import PluginAttribution from "./plugin-attribution.js";
10
11
  // Boot-time runtime registry. Discovers installed @plurnk/plurnk-execs-*
11
12
  // siblings (plurnk.kind:"exec") and probes each runtime TAG independently —
12
13
  // one executor instance per tag (this.runtime = the tag), so a multi-tag
@@ -18,21 +19,31 @@ import { discover } from "@plurnk/plurnk-execs";
18
19
  // plurnk-service#181, #185.
19
20
  export default class ExecutorRegistry {
20
21
  #byTag;
21
- constructor(byTag) {
22
+ #attributions; // #249 — declared attribution tags of discovered exec packages
23
+ constructor(byTag, attributions = []) {
22
24
  this.#byTag = byTag;
25
+ this.#attributions = attributions;
23
26
  }
24
- static async build({ defaultRuntime = null, probeTimeoutMs = 3000, discoverFn = discover, load = (name) => import(__rewriteRelativeImportExtension(name)) } = {}) {
25
- const { registry: discovered, skipped = [] } = await discoverFn();
27
+ // #249 declared attribution tags of the discovered exec packages (opaque; the engine
28
+ // unions these across plugin families onto the generate() `attributions` wire).
29
+ attributions() { return [...this.#attributions]; }
30
+ static async build({ defaultRuntime = null, probeTimeoutMs = 3000, cwd, discoverFn, load = (name) => import(__rewriteRelativeImportExtension(name)) } = {}) {
31
+ const { registry: discovered, skipped = [] } = await (discoverFn ?? (() => discover({ cwd })))();
26
32
  // #229 trust gate: discover() skips untrusted third-party packages
27
33
  // (PLURNK_PLUGINS_TRUSTED_ONLY) and reports them here — note each, mirror
28
34
  // of SchemeRegistry's untrusted-scheme warning. Discovered, not loaded.
29
35
  for (const name of skipped) {
30
36
  console.warn(`exec discovery: '${name}' is discovered but untrusted (PLURNK_PLUGINS_TRUSTED_ONLY); not registered`);
31
37
  }
38
+ // #259 — git lockout. PLURNK_GIT_ALLOWED=0 must drop the git/gh executors ENTIRELY (not
39
+ // just membership + telemetry): a denied host neither dispatches EXEC[git]/[gh] nor teaches
40
+ // them (the tools sheet reads the registered set). "No git" then training on git is a break.
41
+ const gitDenied = process.env.PLURNK_GIT_ALLOWED !== "1";
42
+ const infos = [...discovered.values()].filter((info) => !(gitDenied && info.packageName === "@plurnk/plurnk-execs-git"));
32
43
  // Probe per-TAG: one executor instance per tag (this.runtime = the tag),
33
44
  // each probed on its own merits. import() is module-cached, so
34
45
  // re-importing a package once per tag is free.
35
- const probed = await Promise.all([...discovered.values()].map(async (info) => {
46
+ const probed = await Promise.all(infos.map(async (info) => {
36
47
  const mod = await load(info.packageName);
37
48
  const executor = new mod.default({ runtime: info.runtime, glyph: info.glyph });
38
49
  const availability = await ExecutorRegistry.#probe(executor, probeTimeoutMs);
@@ -50,7 +61,11 @@ export default class ExecutorRegistry {
50
61
  });
51
62
  }
52
63
  ExecutorRegistry.#assertDefaultUsable(byTag, defaultRuntime);
53
- return new ExecutorRegistry(byTag);
64
+ // #249 — collect attribution per DISTINCT package (a multi-tag package — -common's
65
+ // sh/perl/ruby — shares one manifest); fail-hard if any claims the reserved @plurnk/.
66
+ const packages = new Set(infos.map((info) => info.packageName));
67
+ const attributions = [...packages].flatMap((pkg) => PluginAttribution.read(pkg));
68
+ return new ExecutorRegistry(byTag, attributions);
54
69
  }
55
70
  // A configured default runtime that can't run is an operator misconfig the
56
71
  // boot must surface, not hide behind a silent fallback.
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutorRegistry.js","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExecutorRegistry.js","sourceRoot":"","sources":["../../src/core/ExecutorRegistry.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,12 @@ export default class SchemeRegistry {
4
4
  #private;
5
5
  constructor();
6
6
  register(name: string, handler: object): void;
7
+ registerRuntimeSchemes(tags: readonly string[]): void;
7
8
  get(name: string): object | undefined;
8
9
  has(name: string): boolean;
9
10
  isExternal(name: string): boolean;
10
11
  list(): string[];
12
+ defaultChannelFor(scheme: string | null): string;
11
13
  teach(): string;
12
14
  docs(): Array<{
13
15
  name: string;
@@ -15,6 +17,7 @@ export default class SchemeRegistry {
15
17
  }>;
16
18
  transformSections(sections: PacketSection[]): Promise<PacketSection[]>;
17
19
  discoverExternal(cwd?: string): Promise<void>;
20
+ attributions(): string[];
18
21
  resolveForLoop(flags: LoopFlags): Set<string>;
19
22
  }
20
23
  //# sourceMappingURL=SchemeRegistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeRegistry.d.ts","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,CAAC,OAAO,OAAO,cAAc;;;IAkB/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAErC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAEjC,IAAI,IAAI,MAAM,EAAE;IAWhB,KAAK,IAAI,MAAM;IAcf,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAc1C,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBtE,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;CAGhD"}
1
+ {"version":3,"file":"SchemeRegistry.d.ts","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,MAAM,CAAC,OAAO,OAAO,cAAc;;;IAuB/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAS7C,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAUrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAErC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAEjC,IAAI,IAAI,MAAM,EAAE;IAIhB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAehD,KAAK,IAAI,MAAM;IAef,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAe1C,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBtE,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlE,YAAY,IAAI,MAAM,EAAE;IAIxB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;CAGhD"}
@@ -16,12 +16,18 @@ import File from "../schemes/File.js";
16
16
  import Run from "../schemes/Run.js";
17
17
  import ResolveForLoop from "./resolveForLoop.js";
18
18
  import { SchemeDiscovery } from "@plurnk/plurnk-schemes";
19
+ import PluginAttribution from "./plugin-attribution.js";
19
20
  export default class SchemeRegistry {
20
21
  // Heterogeneous handler store — in-tree schemes take PlurnkSchemeContext, external
21
22
  // siblings the DB-free SchemeCtx of the imported SchemeHandler; the common supertype
22
23
  // is `object`. Dispatch (Engine.#run) borrows SchemeHandler's op-key set, not its ctx.
23
24
  #handlers = new Map();
24
25
  #external = new Set();
26
+ #attributions = []; // #249 — declared attribution tags of discovered external schemes
27
+ // §exec — runtime-tag schemes (sh/node/…) that ALIAS the exec handler for output-entry
28
+ // addressing (sh:///l/t/s). Routable via get(), but NOT separately taught or doc-materialized
29
+ // (exec is taught once); else the catalog + docs bloat by one redundant line/entry per tag.
30
+ #runtimeSchemes = new Set();
25
31
  constructor() {
26
32
  this.register("plurnk", new Plurnk());
27
33
  this.register("log", new Log());
@@ -37,12 +43,35 @@ export default class SchemeRegistry {
37
43
  throw new Error(`scheme '${name}' is already registered`);
38
44
  this.#handlers.set(name, handler);
39
45
  }
46
+ // §exec — exec OUTPUT entries address by their runtime TAG as authority (sh:///l/t/s).
47
+ // Register each discovered runtime tag as a scheme routing to the one Exec handler
48
+ // (already registered as "exec" for the EXEC op dispatch). Minted from the boot
49
+ // ExecutorRegistry; idempotent; fail-hard if a tag shadows a content scheme.
50
+ registerRuntimeSchemes(tags) {
51
+ const exec = this.#handlers.get("exec");
52
+ if (exec === undefined)
53
+ throw new Error("registerRuntimeSchemes: the exec handler is not registered");
54
+ for (const tag of tags) {
55
+ if (tag === "exec" || this.#handlers.get(tag) === exec)
56
+ continue;
57
+ this.register(tag, exec);
58
+ this.#runtimeSchemes.add(tag);
59
+ }
60
+ }
40
61
  get(name) { return this.#handlers.get(name); }
41
62
  has(name) { return this.#handlers.has(name); }
42
63
  // True for schemes registered via discoverExternal — they receive the
43
64
  // DB-free SchemeCtx (caps), not the in-tree PlurnkSchemeContext.
44
65
  isExternal(name) { return this.#external.has(name); }
45
66
  list() { return [...this.#handlers.keys()].toSorted(); }
67
+ // A scheme's default channel (manifest.defaultChannel) — the channel a fragment-less
68
+ // address targets. Drives the manifest's address-keyed channels (note 4); null → file (body).
69
+ defaultChannelFor(scheme) {
70
+ if (scheme === null)
71
+ return "body";
72
+ const manifest = this.#handlers.get(scheme)?.constructor?.manifest;
73
+ return manifest?.defaultChannel ?? "body";
74
+ }
46
75
  // The scheme directory — the `schemes` packet section (below tools). grammar
47
76
  // 0.49+ teaches grammar/dialects only, not the scheme set (grammar#239), so the
48
77
  // service advertises what schemes exist at packet-time. Each handler that ships a
@@ -55,6 +84,8 @@ export default class SchemeRegistry {
55
84
  teach() {
56
85
  const lines = [];
57
86
  for (const [name, handler] of this.#handlers) {
87
+ if (this.#runtimeSchemes.has(name))
88
+ continue; // §exec — runtime aliases route, but exec is taught once
58
89
  const manifest = handler.constructor.manifest;
59
90
  const example = manifest?.example;
60
91
  if (typeof example !== "string" || example.length === 0)
@@ -69,6 +100,8 @@ export default class SchemeRegistry {
69
100
  docs() {
70
101
  const out = [];
71
102
  for (const [name, handler] of this.#handlers) {
103
+ if (this.#runtimeSchemes.has(name))
104
+ continue; // §exec — runtime aliases share exec's doc, not their own
72
105
  const doc = handler.constructor.manifest?.documentation;
73
106
  if (typeof doc === "string" && doc.length > 0)
74
107
  out.push({ name, content: doc });
@@ -108,8 +141,12 @@ export default class SchemeRegistry {
108
141
  const mod = await import(__rewriteRelativeImportExtension(packageName));
109
142
  this.register(name, new mod.default());
110
143
  this.#external.add(name);
144
+ this.#attributions.push(...PluginAttribution.read(packageName)); // #249 — fail-hard if it claims @plurnk/
111
145
  }
112
146
  }
147
+ // #249 — declared attribution tags of the discovered external schemes (opaque; the
148
+ // engine unions these across plugin families onto the generate() `attributions` wire).
149
+ attributions() { return [...this.#attributions]; }
113
150
  // Active set under the given loop flags (SPEC §engine-rails). Delegates to
114
151
  // the in-tree ResolveForLoop utility.
115
152
  resolveForLoop(flags) {
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeRegistry.js","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAI7E,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,mFAAmF;IACnF,qFAAqF;IACrF,uFAAuF;IACvF,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B;QACI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAG,IAAI,MAAM,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,OAAe;QAClC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,yBAAyB,CAAC,CAAC;QACxF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,IAAY,IAAwB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1E,GAAG,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/D,sEAAsE;IACtE,iEAAiE;IACjE,UAAU,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtE,IAAI,KAAe,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAElE,6EAA6E;IAC7E,gFAAgF;IAChF,kFAAkF;IAClF,+EAA+E;IAC/E,mEAAmE;IACnE,mFAAmF;IACnF,iFAAiF;IACjF,2EAA2E;IAC3E,uFAAuF;IACvF,KAAK;QACD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAI,OAAO,CAAC,WAA2E,CAAC,QAAQ,CAAC;YAC/G,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC;YAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAClE,MAAM,OAAO,GAAG,OAAO,QAAQ,EAAE,aAAa,KAAK,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5I,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,+EAA+E;IAC/E,uFAAuF;IACvF,IAAI;QACA,MAAM,GAAG,GAA6C,EAAE,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAI,OAAO,CAAC,WAAyD,CAAC,QAAQ,EAAE,aAAa,CAAC;YACvG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,0EAA0E;IAC1E,+DAA+D;IAC/D,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,KAAK,CAAC,iBAAiB,CAAC,QAAyB;QAC7C,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAI,OAA6C,CAAC,iBAAiB,CAAC;YACnF,IAAI,OAAO,SAAS,KAAK,UAAU;gBAAE,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,mFAAmF;IACnF,kFAAkF;IAClF,qFAAqF;IACrF,gFAAgF;IAChF,sFAAsF;IACtF,qFAAqF;IACrF,wFAAwF;IACxF,8FAA8F;IAC9F,KAAK,CAAC,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,sBAAsB,IAAI,6EAA6E,CAAC,CAAC;QAC1H,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,0CAA0C;YACxE,MAAM,GAAG,GAAG,MAAM,MAAM,kCAAC,WAAW,EAAyC,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,sCAAsC;IACtC,cAAc,CAAC,KAAgB;QAC3B,OAAO,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;CACJ"}
1
+ {"version":3,"file":"SchemeRegistry.js","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,IAAI;WACR,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCjF"}
1
+ {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,IAAI;WACR,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA6CjF"}
package/dist/core/fork.js CHANGED
@@ -31,7 +31,14 @@ export default class Fork {
31
31
  const turns = await db.fork_get_turns.all({ run_id: parentRunId });
32
32
  const turnMap = new Map();
33
33
  for (const { id, loop_id, ...rest } of turns) {
34
- const nt = await db.fork_insert_turn.get({ ...rest, loop_id: loopMap.get(loop_id) });
34
+ // #254 a fork inherits the parent's log for context but spends no new money:
35
+ // the copied turns are history, not fresh generations. Zero their usage so the
36
+ // cost-rollup triggers add nothing — the session total stays true lifetime spend
37
+ // (no double-count) and the branch's cost_pico accrues only what IT generates.
38
+ const nt = await db.fork_insert_turn.get({
39
+ ...rest, usage_prompt: 0, usage_completion: 0, usage_cached: 0, usage_cost_pico: 0,
40
+ loop_id: loopMap.get(loop_id),
41
+ });
35
42
  if (nt === undefined)
36
43
  throw new Error("fork: turn insert returned no row");
37
44
  turnMap.set(id, nt.id);
@@ -1 +1 @@
1
- {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ -- Fork a run: deep-copy its log into a NEW run in the SAME session (SPEC §machine-processes —
2
+ -- branch the log, share the world). loops → turns → entries are copied with their
3
+ -- fold-state (expanded) and attribution (origin/source) intact; only the run/loop/
4
+ -- turn ids are remapped. Nothing of the world is copied (§machine-processes-fork-shares-the-world) — the session's entries and
5
+ -- overlay are shared. The §env-delta reconciliation snapshot (run_watermarks) is NOT
6
+ -- copied; the branch first-sights its world like any fresh run.
7
+
8
+ -- PREP: fork_get_run
9
+ SELECT session_id, name, origin FROM runs WHERE id = $id;
10
+
11
+ -- PREP: fork_insert_run
12
+ -- A new run in the parent's session; lineage recorded via parent_run_id (§lifecycle-terms).
13
+ INSERT INTO runs (session_id, name, parent_run_id, origin)
14
+ VALUES ($session_id, $name, $parent_run_id, $origin)
15
+ RETURNING id;
16
+
17
+ -- PREP: fork_get_loops
18
+ SELECT id, sequence, status, prompt, flags
19
+ FROM loops WHERE run_id = $run_id ORDER BY id;
20
+
21
+ -- PREP: fork_insert_loop
22
+ INSERT INTO loops (run_id, sequence, status, prompt, flags)
23
+ VALUES ($run_id, $sequence, $status, $prompt, $flags)
24
+ RETURNING id;
25
+
26
+ -- PREP: fork_get_turns
27
+ -- All turns across the run's loops, in order — loop_id is remapped by the caller.
28
+ SELECT t.id, t.loop_id, t.sequence, t.timestamp, t.status,
29
+ t.usage_prompt, t.usage_completion, t.usage_cached, t.usage_cost_pico,
30
+ t.packet, t.finish_reason, t.model
31
+ FROM turns t JOIN loops l ON l.id = t.loop_id
32
+ WHERE l.run_id = $run_id ORDER BY t.id;
33
+
34
+ -- PREP: fork_insert_turn
35
+ INSERT INTO turns (loop_id, sequence, timestamp, status, usage_prompt, usage_completion, usage_cached, usage_cost_pico, packet, finish_reason, model)
36
+ VALUES ($loop_id, $sequence, $timestamp, $status, $usage_prompt, $usage_completion, $usage_cached, $usage_cost_pico, $packet, $finish_reason, $model)
37
+ RETURNING id;
38
+
39
+ -- PREP: fork_get_log_entries
40
+ -- Everything but the row id and run_id (run_id is the branch's; loop_id/turn_id are
41
+ -- remapped by the caller). origin/source (attribution) and expanded (fold-state) ride along. §machine-processes-fork-copies-the-log
42
+ SELECT loop_id, turn_id, sequence, at, origin, source, op, suffix, signal,
43
+ scheme, username, password, hostname, port, pathname, params, fragment,
44
+ lineMarker, tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens,
45
+ state, outcome, attrs, expanded
46
+ FROM log_entries WHERE run_id = $run_id ORDER BY id;
47
+
48
+ -- PREP: fork_insert_log_entry
49
+ INSERT INTO log_entries (run_id, loop_id, turn_id, sequence, at, origin, source, op, suffix, signal, scheme, username, password, hostname, port, pathname, params, fragment, lineMarker, tx, mimetype_tx, rx, mimetype_rx, status_rx, tokens, state, outcome, attrs, expanded)
50
+ VALUES ($run_id, $loop_id, $turn_id, $sequence, $at, $origin, $source, $op, $suffix, $signal, $scheme, $username, $password, $hostname, $port, $pathname, $params, $fragment, $lineMarker, $tx, $mimetype_tx, $rx, $mimetype_rx, $status_rx, $tokens, $state, $outcome, $attrs, $expanded);