@nyte-ai/core 0.0.18 → 0.0.21

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 (186) hide show
  1. package/README.md +1 -1
  2. package/THIRD-PARTY-NOTICES.md +66 -0
  3. package/dist/chunks/{compose-yk3y0jap.js → compose-0m65m83c.js} +7 -7
  4. package/dist/chunks/{compose-r12cnkpc.js → compose-12jnd50a.js} +11 -11
  5. package/dist/chunks/{compose-q1n2dgrs.js → compose-1knxqqm1.js} +4 -4
  6. package/dist/chunks/{compose-xtkavyrw.js → compose-1r0wr5dc.js} +17 -9
  7. package/dist/chunks/{compose-9tqm6g18.js → compose-2rha31fc.js} +4 -4
  8. package/dist/chunks/{compose-0bpspysf.js → compose-4ppmas7g.js} +5 -5
  9. package/dist/chunks/compose-5rg7askh.js +52 -0
  10. package/dist/chunks/{compose-mryw0674.js → compose-5z835ej2.js} +6 -1
  11. package/dist/chunks/{compose-7k6nsmtq.js → compose-6gt28900.js} +11 -14
  12. package/dist/chunks/{compose-2eg8w67t.js → compose-6r5ymwyr.js} +15 -4
  13. package/dist/chunks/{compose-xd0kdp3t.js → compose-753gc057.js} +8 -8
  14. package/dist/chunks/{compose-q1ts0v6k.js → compose-767bb340.js} +1 -1
  15. package/dist/chunks/{compose-rpq9n0nz.js → compose-8mkfr84d.js} +89 -32
  16. package/dist/chunks/{compose-5w5bbakh.js → compose-8pp3vtv0.js} +5 -5
  17. package/dist/chunks/{compose-gaps3heh.js → compose-9hy3p236.js} +9 -9
  18. package/dist/chunks/{compose-pgeemk2b.js → compose-a7k9h27z.js} +6 -5
  19. package/dist/chunks/{compose-dc2ns6gd.js → compose-a8ddt55n.js} +10 -10
  20. package/dist/chunks/{compose-7b8ajk7a.js → compose-ad80nkkn.js} +8 -8
  21. package/dist/chunks/{compose-064y3n82.js → compose-ae5t6v5b.js} +5 -5
  22. package/dist/chunks/{compose-amr0k1m1.js → compose-b2bf1jvy.js} +122 -41
  23. package/dist/chunks/{compose-xpfr4wt3.js → compose-bbhk8vnr.js} +7 -4
  24. package/dist/chunks/compose-bd8c5n7k.js +32 -0
  25. package/dist/chunks/{compose-rehp8epe.js → compose-byse0eqj.js} +7 -7
  26. package/dist/chunks/{compose-ef936rsa.js → compose-bz70g01d.js} +27 -11
  27. package/dist/chunks/compose-c4238qkb.js +105 -0
  28. package/dist/chunks/{compose-q1b0tppc.js → compose-c9wxgbjp.js} +4 -4
  29. package/dist/chunks/{compose-h272znxk.js → compose-cdj05t7x.js} +7 -7
  30. package/dist/chunks/{compose-kb22bkpt.js → compose-cqpjcx2t.js} +12 -1
  31. package/dist/chunks/{compose-dbx6ftbm.js → compose-csh5vv2t.js} +42 -4
  32. package/dist/chunks/{compose-eqr5qwp1.js → compose-d1m94kzq.js} +62 -22
  33. package/dist/chunks/{compose-drdej9yt.js → compose-d95fwwvw.js} +4 -4
  34. package/dist/chunks/{compose-jc22rsz4.js → compose-dbsn3bsy.js} +2 -2
  35. package/dist/chunks/{compose-s2aew2c9.js → compose-e2fyz3xc.js} +5 -5
  36. package/dist/chunks/{compose-gg8b9b21.js → compose-e9f6nrwp.js} +23 -18
  37. package/dist/chunks/{compose-52afaf3v.js → compose-fnncnk81.js} +7 -7
  38. package/dist/chunks/{compose-bjx8s01m.js → compose-fqsqjbrf.js} +1 -1
  39. package/dist/chunks/{compose-1gd9vkye.js → compose-gj2ypr7q.js} +3 -3
  40. package/dist/chunks/compose-gvm49f4b.js +155 -0
  41. package/dist/chunks/{compose-1jz2j92f.js → compose-gxjc6vz9.js} +30 -2
  42. package/dist/chunks/{compose-cq1zx4gp.js → compose-h14pmqv3.js} +1 -1
  43. package/dist/chunks/{compose-d2s80zg2.js → compose-hfrjm4a1.js} +5 -5
  44. package/dist/chunks/{compose-kmzr06mw.js → compose-hfsn6pnt.js} +8 -5
  45. package/dist/chunks/{compose-jjchxce6.js → compose-j42p9wfs.js} +1 -1
  46. package/dist/chunks/{compose-4b1zf3p0.js → compose-jd4bsnqh.js} +63 -47
  47. package/dist/chunks/{compose-2g3enfv5.js → compose-jeemzja1.js} +4 -4
  48. package/dist/chunks/{compose-y478gv6x.js → compose-jmmyw9hd.js} +4 -4
  49. package/dist/chunks/{compose-5tkyrzr0.js → compose-jwy1gba9.js} +4 -4
  50. package/dist/chunks/{compose-k35b75k9.js → compose-kwkna3cg.js} +2 -4
  51. package/dist/chunks/{compose-t53j8yxv.js → compose-m01wspwf.js} +1 -1
  52. package/dist/chunks/{compose-n93897b0.js → compose-m91ffwss.js} +1 -1
  53. package/dist/chunks/{compose-madtxnp1.js → compose-matk94se.js} +7 -7
  54. package/dist/chunks/{compose-aa73dbe8.js → compose-mcz93154.js} +117 -58
  55. package/dist/chunks/{compose-r7dx7rpz.js → compose-mdwr0er9.js} +72 -15
  56. package/dist/chunks/{compose-j12n448k.js → compose-nj4nj5n9.js} +36 -3
  57. package/dist/chunks/{compose-yn2et568.js → compose-nkxwrphm.js} +141 -15
  58. package/dist/chunks/{compose-k8aghhv2.js → compose-pkprmn5b.js} +16 -16
  59. package/dist/chunks/{compose-1z7q169s.js → compose-q2zxbg41.js} +69 -41
  60. package/dist/chunks/{compose-b5xz0dj7.js → compose-qwbe95qs.js} +2 -2
  61. package/dist/chunks/{compose-vmhv4e00.js → compose-qxfq6dn9.js} +13 -12
  62. package/dist/chunks/{compose-wgphshsn.js → compose-r8tz1xfj.js} +8 -8
  63. package/dist/chunks/{compose-ffk8dnbh.js → compose-smsafpqe.js} +3 -3
  64. package/dist/chunks/{compose-djq2bt61.js → compose-sprfv38c.js} +6 -6
  65. package/dist/chunks/{compose-cdy4q5mv.js → compose-t9fcqtby.js} +17 -16
  66. package/dist/chunks/{compose-p3q14yt1.js → compose-tppkp915.js} +5 -5
  67. package/dist/chunks/{compose-dckpgtks.js → compose-ts08bth2.js} +3 -3
  68. package/dist/chunks/{compose-n10w4nkk.js → compose-vn7b7fdj.js} +12 -3
  69. package/dist/chunks/{compose-9m19b27b.js → compose-w6zb11k1.js} +7 -7
  70. package/dist/chunks/{compose-j3tkz0tb.js → compose-wvzzf8n2.js} +6 -6
  71. package/dist/chunks/{compose-6vf6dkk2.js → compose-xhtgytrh.js} +2 -2
  72. package/dist/chunks/{compose-4tb2vn84.js → compose-y6xgbg2h.js} +1 -1
  73. package/dist/chunks/compose-yfcb6w2h.js +58 -0
  74. package/dist/chunks/{compose-0rx7ygxq.js → compose-zaanjpb7.js} +1 -1
  75. package/dist/chunks/{compose-7pc3p5ex.js → compose-zjj072km.js} +8 -8
  76. package/dist/src/agent/compaction.js +41 -39
  77. package/dist/src/agent/images.d.ts +7 -0
  78. package/dist/src/agent/images.js +8 -0
  79. package/dist/src/agent/request.js +30 -30
  80. package/dist/src/agent/tool-runner.d.ts +3 -7
  81. package/dist/src/agent/tool-runner.js +34 -30
  82. package/dist/src/agent/transcript.d.ts +0 -1
  83. package/dist/src/agent/transcript.js +37 -35
  84. package/dist/src/agent/turn.js +46 -43
  85. package/dist/src/api/connection.js +60 -56
  86. package/dist/src/api/head.js +42 -41
  87. package/dist/src/api/part.js +22 -22
  88. package/dist/src/api/server.js +48 -44
  89. package/dist/src/api/session.js +48 -47
  90. package/dist/src/builtins/delegation.js +2 -2
  91. package/dist/src/builtins/environment.js +1 -2
  92. package/dist/src/compose.d.ts +6 -7
  93. package/dist/src/compose.js +72 -67
  94. package/dist/src/contract/fold.d.ts +1 -3
  95. package/dist/src/contract/host.d.ts +30 -1
  96. package/dist/src/contract/host.js +4 -2
  97. package/dist/src/contract/kernel.d.ts +6 -35
  98. package/dist/src/contract/parts.d.ts +4 -0
  99. package/dist/src/contract/parts.js +1 -1
  100. package/dist/src/contract/records.d.ts +69 -3
  101. package/dist/src/contract/records.js +5 -1
  102. package/dist/src/contract/session.d.ts +2 -1
  103. package/dist/src/contract/tools.d.ts +10 -1
  104. package/dist/src/contract/workspace.d.ts +7 -3
  105. package/dist/src/drive/execution.js +46 -42
  106. package/dist/src/drive/interruptions.d.ts +7 -0
  107. package/dist/src/drive/interruptions.js +17 -0
  108. package/dist/src/engine/admission.js +24 -24
  109. package/dist/src/engine/batches.js +22 -22
  110. package/dist/src/engine/branch-summary.js +21 -21
  111. package/dist/src/engine/durable.d.ts +0 -2
  112. package/dist/src/engine/durable.js +20 -20
  113. package/dist/src/engine/fence.js +20 -20
  114. package/dist/src/engine/jobs.d.ts +2 -0
  115. package/dist/src/engine/jobs.js +31 -27
  116. package/dist/src/engine/move.js +23 -23
  117. package/dist/src/engine/part-definitions.js +2 -2
  118. package/dist/src/engine/presence.d.ts +39 -0
  119. package/dist/src/engine/presence.js +16 -0
  120. package/dist/src/engine/principals.js +17 -17
  121. package/dist/src/engine/receipts.js +21 -21
  122. package/dist/src/engine/runs.d.ts +1 -1
  123. package/dist/src/engine/runs.js +25 -25
  124. package/dist/src/engine/start.js +36 -35
  125. package/dist/src/engine/surface.d.ts +4 -0
  126. package/dist/src/engine/surface.js +13 -0
  127. package/dist/src/engine/waits.d.ts +5 -15
  128. package/dist/src/engine/waits.js +23 -19
  129. package/dist/src/env/browser.js +27 -27
  130. package/dist/src/env/environment.js +29 -29
  131. package/dist/src/env/mcp.js +31 -31
  132. package/dist/src/env/session-changes.d.ts +10 -0
  133. package/dist/src/env/session-changes.js +15 -0
  134. package/dist/src/env/trust.js +30 -30
  135. package/dist/src/env/workspaces.js +34 -33
  136. package/dist/src/env/worktrees.js +35 -34
  137. package/dist/src/extend/activation.js +35 -34
  138. package/dist/src/extend/hooks.js +22 -22
  139. package/dist/src/extend/models.d.ts +2 -1
  140. package/dist/src/extend/models.js +32 -30
  141. package/dist/src/extend/plugin-api.js +18 -18
  142. package/dist/src/extend/plugin-runtime.js +42 -41
  143. package/dist/src/extend/registry.js +27 -27
  144. package/dist/src/extend/resources.js +31 -31
  145. package/dist/src/extend/setting-layers.js +4 -4
  146. package/dist/src/extend/settings.js +38 -37
  147. package/dist/src/extend/workspace-commands.js +43 -42
  148. package/dist/src/fold/calls.js +5 -5
  149. package/dist/src/fold/checkpoint.js +11 -11
  150. package/dist/src/fold/code.d.ts +1 -2
  151. package/dist/src/fold/code.js +1 -1
  152. package/dist/src/fold/commit.d.ts +0 -4
  153. package/dist/src/fold/commit.js +16 -16
  154. package/dist/src/fold/draft.js +4 -4
  155. package/dist/src/fold/fold.js +7 -7
  156. package/dist/src/fold/paths.js +5 -5
  157. package/dist/src/fold/project.d.ts +3 -1
  158. package/dist/src/fold/project.js +8 -6
  159. package/dist/src/fold/reads.js +5 -5
  160. package/dist/src/fold/seen.js +19 -19
  161. package/dist/src/fold/view.d.ts +1 -1
  162. package/dist/src/fold/view.js +20 -20
  163. package/dist/src/fold/watch.js +15 -15
  164. package/dist/src/harness.d.ts +3 -1
  165. package/dist/src/harness.js +75 -70
  166. package/dist/src/index.d.ts +3 -3
  167. package/dist/src/index.js +5 -3
  168. package/dist/src/server.js +70 -65
  169. package/dist/src/store/inspect.js +4 -4
  170. package/dist/src/store/log.d.ts +0 -2
  171. package/dist/src/store/log.js +2 -2
  172. package/dist/src/store/memory-store.js +5 -5
  173. package/dist/src/store/migrations.js +3 -3
  174. package/dist/src/store/model-state.d.ts +6 -1
  175. package/dist/src/store/model-state.js +14 -4
  176. package/dist/src/store/parts.js +5 -5
  177. package/dist/src/store/refs.d.ts +6 -5
  178. package/dist/src/store/refs.js +11 -1
  179. package/dist/src/store/session-index.js +2 -2
  180. package/dist/src/store/session.d.ts +3 -1
  181. package/dist/src/store/session.js +5 -3
  182. package/dist/src/store.d.ts +1 -1
  183. package/dist/src/store.js +11 -7
  184. package/dist/src/testing.d.ts +2 -0
  185. package/dist/src/testing.js +83 -70
  186. package/package.json +4 -4
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  PARTICIPANT_AUTHORITY2
3
- } from "./compose-mryw0674.js";
3
+ } from "./compose-5z835ej2.js";
4
4
  import {
5
5
  check2
6
6
  } from "./compose-bj54tkph.js";
7
7
  import {
8
8
  definePart2,
9
9
  tool2
10
- } from "./compose-bjx8s01m.js";
10
+ } from "./compose-fqsqjbrf.js";
11
11
  import {
12
12
  decodeRunRecord2,
13
13
  decodePartRecord2
14
- } from "./compose-1jz2j92f.js";
15
- import {
16
- runRef2,
17
- partRef2
18
- } from "./compose-kb22bkpt.js";
14
+ } from "./compose-gxjc6vz9.js";
19
15
  import {
20
16
  dev2
21
17
  } from "./compose-n116fnmp.js";
18
+ import {
19
+ runRef2,
20
+ partRef2
21
+ } from "./compose-cqpjcx2t.js";
22
22
  import {
23
23
  STALE2,
24
24
  load2,
@@ -29,24 +29,36 @@ import {
29
29
  attempt2,
30
30
  readCall2,
31
31
  readCalls2
32
- } from "./compose-n10w4nkk.js";
32
+ } from "./compose-vn7b7fdj.js";
33
+ import {
34
+ readAttributedPaths2,
35
+ ownedChanges2,
36
+ anotherChatLive2
37
+ } from "./compose-yfcb6w2h.js";
33
38
  import {
34
39
  settling2
35
- } from "./compose-drdej9yt.js";
40
+ } from "./compose-d95fwwvw.js";
36
41
  import {
37
42
  commit2
38
- } from "./compose-xpfr4wt3.js";
43
+ } from "./compose-bbhk8vnr.js";
39
44
  import {
40
45
  signalsPark2,
41
46
  parkStep2,
42
47
  runStep2
43
- } from "./compose-rehp8epe.js";
48
+ } from "./compose-byse0eqj.js";
49
+ import {
50
+ startJob2
51
+ } from "./compose-nkxwrphm.js";
44
52
  import {
45
53
  publishPatch2
46
- } from "./compose-vmhv4e00.js";
54
+ } from "./compose-qxfq6dn9.js";
55
+ import {
56
+ hiddenOwners2,
57
+ missingCapabilities2
58
+ } from "./compose-bd8c5n7k.js";
47
59
  import {
48
60
  toolSource2
49
- } from "./compose-064y3n82.js";
61
+ } from "./compose-ae5t6v5b.js";
50
62
 
51
63
  // src/agent/tool-runner.ts
52
64
  import { Type } from "typebox";
@@ -90,9 +102,10 @@ function runningCalls(kernel) {
90
102
  async function executeCall2(kernel, input) {
91
103
  const { session, call } = input;
92
104
  const controller = new AbortController;
105
+ const running = { stop: controller, move: new AbortController };
93
106
  const live = runningCalls(kernel);
94
107
  const controllers = live.get(call) ?? new Set;
95
- controllers.add(controller);
108
+ controllers.add(running);
96
109
  live.set(call, controllers);
97
110
  const steps = await Promise.all([
98
111
  readCall2(kernel.store, session, call),
@@ -103,10 +116,11 @@ async function executeCall2(kernel, input) {
103
116
  try {
104
117
  return await perform(kernel, {
105
118
  ...input,
106
- signal: AbortSignal.any([input.signal, controller.signal])
119
+ signal: AbortSignal.any([input.signal, controller.signal]),
120
+ released: running.move.signal
107
121
  });
108
122
  } finally {
109
- controllers.delete(controller);
123
+ controllers.delete(running);
110
124
  if (controllers.size === 0 && live.get(call) === controllers)
111
125
  live.delete(call);
112
126
  }
@@ -150,13 +164,20 @@ function stoppableTool2(kernel) {
150
164
  async stop(_input, context) {
151
165
  const running = runningCalls(kernel).get(context.part.id);
152
166
  if (running !== undefined && running.size > 0) {
153
- for (const controller of running)
154
- controller.abort();
167
+ for (const live of running)
168
+ live.stop.abort();
155
169
  return;
156
170
  }
157
171
  for (const call of [context.part.id, `${HOOK}${context.part.id}`])
158
172
  await kernel.waits.callStopped(context.session, asId(call));
159
173
  return;
174
+ },
175
+ background(_input, context) {
176
+ if (!kernel.jobs.release(context.session, asId(context.part.id)))
177
+ return;
178
+ for (const live of runningCalls(kernel).get(context.part.id) ?? [])
179
+ live.move.abort();
180
+ return;
160
181
  }
161
182
  };
162
183
  return definePart2({
@@ -175,6 +196,7 @@ async function perform(kernel, where) {
175
196
  if (planned.kind === "parked")
176
197
  return PARKED;
177
198
  let concluded;
199
+ let before = null;
178
200
  const snapshotted = planned.kind === "execute" && where.covered !== true && planned.definition.effects !== "none";
179
201
  const step = await runStep2(kernel, {
180
202
  session,
@@ -187,13 +209,17 @@ async function perform(kernel, where) {
187
209
  opening: { updates: () => partOpening(kernel.store, where, planned), fenced: STOPPED },
188
210
  part: asId(call),
189
211
  signal,
190
- body: planned.kind === "execute" ? (durable) => execute(kernel, where, planned, durable, snapshotted) : async () => planned.outcome,
212
+ body: planned.kind === "execute" ? async (durable) => {
213
+ const executed = await execute(kernel, where, planned, durable, snapshotted);
214
+ before = executed.before;
215
+ return executed.outcome;
216
+ } : async () => planned.outcome,
191
217
  async settle(ended) {
192
- concluded ??= conclude(kernel, where, ended, snapshotted);
218
+ concluded ??= conclude(kernel, where, ended, before, planned.class);
193
219
  const settled = await concluded;
194
220
  return {
195
221
  result: settled.outcome,
196
- updates: await settlement(kernel.store, where, planned, settled)
222
+ updates: await settlement(kernel.store, where, planned, settled, before)
197
223
  };
198
224
  },
199
225
  decode: (value) => outcomes.Check(value) ? outcomes.Decode(value) : null
@@ -206,14 +232,18 @@ async function perform(kernel, where) {
206
232
  async function plan(kernel, where, intent) {
207
233
  const { session, head, run, call, name } = where;
208
234
  const custom = { kind: "custom", label: name };
209
- const definition = toolSource2(where.runtime).get(name)?.definition;
210
- if (definition === undefined)
235
+ const found = toolSource2(where.runtime).get(name);
236
+ const hidden = await hiddenOwners2(kernel, session, run);
237
+ const definition = found === undefined || hidden.has(found.owner) ? undefined : found.definition;
238
+ if (definition === undefined) {
239
+ const missing = found === undefined ? await missingCapabilities2(kernel, session, run) : [];
211
240
  return {
212
241
  kind: "settle",
213
- outcome: failed(`No tool is named ${name}.`),
242
+ outcome: failed(missing.length === 0 ? `No tool is named ${name}.` : `${name} isn't available here: this chat uses ${missing.join(", ")}, which only Nyte.app has. Open Nyte.app to continue.`),
214
243
  args: where.args,
215
244
  class: custom
216
245
  };
246
+ }
217
247
  if (where.argumentsError !== undefined)
218
248
  return {
219
249
  kind: "settle",
@@ -314,20 +344,24 @@ async function partOpening(store, where, planned) {
314
344
  }
315
345
  async function execute(kernel, where, planned, durable, snapshotted) {
316
346
  const { session, run, signal } = where;
347
+ let before = null;
317
348
  try {
318
349
  if (snapshotted)
319
- await baseline(kernel, session, run);
320
- const [env, found] = await Promise.all([
350
+ before = await durable.memo("nyte:snapshot", () => baseline(kernel, session, run));
351
+ const [env, found, hidden] = await Promise.all([
321
352
  kernel.environments.attach(session),
322
- requireSession2(kernel.store, session)
353
+ requireSession2(kernel.store, session),
354
+ hiddenOwners2(kernel, session, run)
323
355
  ]);
324
356
  const invocation = createInvocation2(kernel, {
357
+ hidden,
325
358
  session,
326
359
  head: where.head,
327
360
  run,
328
361
  call: where.call,
329
362
  context: where.context,
330
363
  signal,
364
+ released: where.released,
331
365
  workspace: found.record.workspace,
332
366
  env,
333
367
  durable,
@@ -335,11 +369,17 @@ async function execute(kernel, where, planned, durable, snapshotted) {
335
369
  covered: where.covered === true || snapshotted
336
370
  });
337
371
  const result = await planned.definition.execute(planned.input, invocation);
338
- return signal.aborted ? STOPPED : await validateToolResult(planned.definition, result);
372
+ return {
373
+ outcome: signal.aborted ? STOPPED : await validateToolResult(planned.definition, result),
374
+ before
375
+ };
339
376
  } catch (error) {
340
377
  if (signalsPark2(error))
341
378
  throw error;
342
- return signal.aborted ? STOPPED : failed(error instanceof Error ? error.message : String(error));
379
+ return {
380
+ outcome: signal.aborted ? STOPPED : failed(error instanceof Error ? error.message : String(error)),
381
+ before
382
+ };
343
383
  }
344
384
  }
345
385
  async function validateToolResult(definition, result) {
@@ -361,15 +401,32 @@ async function validateToolResult(definition, result) {
361
401
  parts
362
402
  };
363
403
  }
364
- async function conclude(kernel, where, ended, snapshotted) {
404
+ async function conclude(kernel, where, ended, before, toolClass) {
365
405
  const { session, head, run } = where;
366
406
  const outcome = await where.runtime.hooks.transform("after_tool", ended.kind === "done" ? ended.value : INTERRUPTED, { session, head, run, principal: where.context.principal });
367
- const snapshots = snapshotted && ended.kind === "done" ? await kernel.environments.snapshots(session) : null;
368
- if (snapshots === null)
369
- return { outcome, changes: null, files: [], snapshot: null };
370
- const from = await diffBase(kernel.store, session, run) ?? await snapshots.before(run);
407
+ const snapshots = before !== null && ended.kind === "done" ? await kernel.environments.snapshots(session) : null;
408
+ if (snapshots === null || before === null)
409
+ return { outcome, files: null, thread: null, snapshot: null, path: null, unattributed: false };
371
410
  const to = await snapshots.after(run);
372
- const files = (await snapshots.diff(from, to)).files.map((file) => {
411
+ const [changed, path] = await Promise.all([
412
+ snapshots.diff(before.snapshot, to).then(fileChanges),
413
+ editedPath(kernel, session, toolClass)
414
+ ]);
415
+ const unattributed = path === null && changed.length > 0 && (before.contended || await anotherChatLive2(kernel, session));
416
+ const files = unattributed ? [] : changed.filter((file) => path === null || file.path === path || file.from === path);
417
+ const thread = files.length === 0 && !unattributed ? null : fileChanges(await ownedChanges2(kernel.store, snapshots, session, to, files.map((file) => file.path)));
418
+ return { outcome, files, thread, snapshot: to, path, unattributed };
419
+ }
420
+ async function editedPath(kernel, session, toolClass) {
421
+ if (toolClass.kind !== "edit")
422
+ return null;
423
+ if (!/^(?:[\\/]|[A-Za-z]:)/.test(toolClass.path))
424
+ return toolClass.path.replace(/^\.\//, "");
425
+ const root = (await kernel.environments.attach(session)).cwd.replace(/[\\/]+$/, "");
426
+ return toolClass.path.startsWith(`${root}/`) || toolClass.path.startsWith(`${root}\\`) ? toolClass.path.slice(root.length + 1).replaceAll("\\", "/") : null;
427
+ }
428
+ function fileChanges(set) {
429
+ return set.files.map((file) => {
373
430
  const change = {
374
431
  path: file.path,
375
432
  status: file.status,
@@ -378,18 +435,8 @@ async function conclude(kernel, where, ended, snapshotted) {
378
435
  };
379
436
  return file.from === undefined ? change : { ...change, from: file.from };
380
437
  });
381
- return {
382
- outcome,
383
- changes: {
384
- added: files.reduce((sum, file) => sum + file.added, 0),
385
- removed: files.reduce((sum, file) => sum + file.removed, 0),
386
- paths: files.map((file) => file.path)
387
- },
388
- files,
389
- snapshot: to
390
- };
391
438
  }
392
- async function settlement(store, where, planned, settled) {
439
+ async function settlement(store, where, planned, settled, before) {
393
440
  const { session, head, run, call } = where;
394
441
  const part = asId(call);
395
442
  const name = partRef2(session, part);
@@ -399,6 +446,14 @@ async function settlement(store, where, planned, settled) {
399
446
  ]);
400
447
  if (found === null)
401
448
  return [];
449
+ const counted = before === null || settled.path !== null ? new Set : await readAttributedPaths2(store, session, before.seq, (event) => event.head === head && event.call !== call);
450
+ const files = settled.files?.filter((file) => !counted.has(file.path));
451
+ const changes = files === undefined ? null : {
452
+ added: files.reduce((sum, file) => sum + file.added, 0),
453
+ removed: files.reduce((sum, file) => sum + file.removed, 0),
454
+ paths: files.map((file) => file.path),
455
+ ...settled.unattributed && { unattributed: true }
456
+ };
402
457
  const at = Date.now();
403
458
  const state = {
404
459
  call,
@@ -407,7 +462,7 @@ async function settlement(store, where, planned, settled) {
407
462
  class: planned.class,
408
463
  phase: "settled",
409
464
  outcome: settled.outcome,
410
- changes: settled.changes
465
+ changes
411
466
  };
412
467
  const based = settled.snapshot === null ? [] : await nextBase(store, session, run, settled.snapshot);
413
468
  const record = { ...found.record, state, version: found.record.version + 1 };
@@ -419,9 +474,9 @@ async function settlement(store, where, planned, settled) {
419
474
  part,
420
475
  change: "settled",
421
476
  outcome: settled.outcome,
422
- changes: settled.changes
477
+ changes
423
478
  },
424
- ...settled.files.length === 0 ? [] : [{ head: null, kind: "changes", files: settled.files }]
479
+ ...settled.thread === null ? [] : [{ head: null, kind: "changes", files: settled.thread }]
425
480
  ];
426
481
  if (found.record.status.kind === "failed" || found.record.status.kind === "settled")
427
482
  return [
@@ -448,12 +503,14 @@ async function settlement(store, where, planned, settled) {
448
503
  return [...landed.updates, ...based];
449
504
  }
450
505
  async function baseline(kernel, session, run) {
451
- if (await diffBase(kernel.store, session, run) !== null)
452
- return;
453
506
  const snapshots = await kernel.environments.snapshots(session);
454
507
  if (snapshots === null)
455
- return;
456
- const before = await snapshots.before(run);
508
+ return null;
509
+ const seq = await kernel.store.refs.tail(session);
510
+ const [before, contended] = await Promise.all([
511
+ snapshots.after(run),
512
+ anotherChatLive2(kernel, session)
513
+ ]);
457
514
  await attempt2(`Recording run ${run}'s snapshot`, async () => {
458
515
  const found = await load2(kernel.store, await kernel.store.refs.get(runRef2(session, run)), decodeRunRecord2);
459
516
  if (found === null || found.record.snapshot !== null)
@@ -467,10 +524,7 @@ async function baseline(kernel, session, run) {
467
524
  ]);
468
525
  return outcome.kind === "set" ? undefined : STALE2;
469
526
  });
470
- }
471
- async function diffBase(store, session, run) {
472
- const found = await load2(store, await store.refs.get(runRef2(session, run)), decodeRunRecord2);
473
- return found?.record.lastSnapshot ?? found?.record.snapshot ?? null;
527
+ return { snapshot: before, seq, contended };
474
528
  }
475
529
  async function nextBase(store, session, run, to) {
476
530
  const found = await load2(store, await store.refs.get(runRef2(session, run)), decodeRunRecord2);
@@ -536,6 +590,11 @@ function createInvocation2(kernel, input) {
536
590
  progress: update
537
591
  });
538
592
  },
593
+ foreground: {
594
+ start: (job) => startJob2(kernel, context.origin, input.workspace, { ...job, session }, true),
595
+ release: () => kernel.jobs.release(session, call),
596
+ released: input.released ?? new AbortController().signal
597
+ },
539
598
  tools: {
540
599
  async execute(name, args, options) {
541
600
  const key = options?.key ?? `${calls}`;
@@ -554,7 +613,7 @@ function createInvocation2(kernel, input) {
554
613
  });
555
614
  return outcome.kind === "parked" ? parkStep2(durable) : outcome;
556
615
  },
557
- list: () => source.list()
616
+ list: () => source.list().filter((info) => input.hidden?.has(info.owner) !== true)
558
617
  },
559
618
  wait: (target) => durable.wait(target),
560
619
  memo: (name, compute) => durable.memo(name, compute),
@@ -3,24 +3,29 @@ import {
3
3
  } from "./compose-q6c7wswc.js";
4
4
  import {
5
5
  put2
6
- } from "./compose-n10w4nkk.js";
6
+ } from "./compose-vn7b7fdj.js";
7
7
  import {
8
8
  convertJsonSchema2,
9
9
  check2
10
10
  } from "./compose-bj54tkph.js";
11
11
  import {
12
12
  commit2
13
- } from "./compose-xpfr4wt3.js";
13
+ } from "./compose-bbhk8vnr.js";
14
14
  import {
15
15
  MODEL_PREFERENCE2,
16
+ modelListingRef2,
17
+ readModelListings2,
18
+ thinkingPreferenceRef2,
19
+ readThinkingPreference2,
20
+ readThinkingPreferences2,
16
21
  readModelSelection2
17
- } from "./compose-dbx6ftbm.js";
22
+ } from "./compose-csh5vv2t.js";
18
23
  import {
19
24
  closable2
20
25
  } from "./compose-zfjxkavf.js";
21
26
  import {
22
27
  bumpGeneration2
23
- } from "./compose-064y3n82.js";
28
+ } from "./compose-ae5t6v5b.js";
24
29
 
25
30
  // src/extend/models.ts
26
31
  import { SdkError } from "@nyte-ai/schema";
@@ -81,6 +86,14 @@ function createModelsApi2(kernel, models) {
81
86
  bumpGeneration2(kernel);
82
87
  return { kind: "set" };
83
88
  },
89
+ async setListing(refs, listing) {
90
+ if (refs.some((ref) => models.getModel(ref.provider, ref.id) === undefined))
91
+ return { kind: "unknown-model" };
92
+ const target = listing === "shown" ? null : await put2(kernel.store, "kv", listing);
93
+ await commit2(kernel, refs.map((ref) => ({ name: modelListingRef2(ref), target })));
94
+ bumpGeneration2(kernel);
95
+ return { kind: "set" };
96
+ },
84
97
  async verify(provider) {
85
98
  let verification;
86
99
  try {
@@ -109,8 +122,10 @@ function createModelsApi2(kernel, models) {
109
122
  async function modelCatalog(kernel, models) {
110
123
  const generation = kernel.host.current().catalog;
111
124
  const policies = staticPolicies(kernel);
112
- const [preferred, credentials] = await Promise.all([
125
+ const [preferred, remembered, listed, credentials] = await Promise.all([
113
126
  readModelSelection2(kernel.store),
127
+ readThinkingPreferences2(kernel.store),
128
+ readModelListings2(kernel.store),
114
129
  kernel.modelState.read(models)
115
130
  ]);
116
131
  const providers = models.getProviders().map((provider) => {
@@ -119,13 +134,19 @@ async function modelCatalog(kernel, models) {
119
134
  for (const model of catalog)
120
135
  if (model.variant?.mode === "fast" && !fast.has(model.variant.base))
121
136
  fast.set(model.variant.base, { provider: model.provider, id: model.id });
137
+ const base = catalog.filter((model) => model.variant === undefined);
138
+ const listings = Object.fromEntries(base.flatMap((model) => {
139
+ const listing = listed.get(formatModelKey(model));
140
+ return listing === undefined ? [] : [[model.id, listing]];
141
+ }));
122
142
  return {
123
143
  id: provider.id,
124
144
  name: provider.name,
125
145
  credential: credentials.get(provider.id) ?? "unknown",
126
146
  methods: listLoginMethods(provider),
127
147
  limits: readProviderLimits(models, provider.id),
128
- models: catalog.filter((model) => model.variant === undefined).map((model) => projectModel(model, fast.get(model.id) ?? null, policies.get(formatModelKey(model)), provider.capabilities))
148
+ listings,
149
+ models: base.map((model) => projectModel(model, fast.get(model.id) ?? null, policies.get(formatModelKey(model)), provider.capabilities, remembered.get(formatModelKey(model))))
129
150
  };
130
151
  });
131
152
  const fallback = providers.find((provider) => models.getProvider(provider.id)?.explicitOnly !== true && (provider.credential === "configured" || provider.credential === "verified") && provider.models.length > 0)?.models[0]?.ref ?? null;
@@ -138,7 +159,7 @@ function modelInfo2(models, ref, runtime) {
138
159
  return null;
139
160
  const policy = runtime.registries.modelContext.list().findLast((entry) => formatModelKey(entry.model) === formatModelKey(ref));
140
161
  const fast = catalog.find((entry) => entry.variant?.mode === "fast" && entry.variant.base === model.id);
141
- return projectModel(model, fast === undefined ? null : { provider: fast.provider, id: fast.id }, policy, models.getProvider(model.provider)?.capabilities);
162
+ return projectModel(model, fast === undefined ? null : { provider: fast.provider, id: fast.id }, policy, models.getProvider(model.provider)?.capabilities, undefined);
142
163
  }
143
164
  function createLogin2(kernel, models, input) {
144
165
  let pending = null;
@@ -264,13 +285,13 @@ async function defaultModel(kernel, models) {
264
285
  return null;
265
286
  }
266
287
  var NYTE_LOOP = { steer: true };
267
- function projectModel(model, fast, policy, capabilities) {
288
+ function projectModel(model, fast, policy, capabilities, remembered) {
268
289
  return {
269
290
  ref: { provider: model.provider, id: model.id },
270
291
  name: model.name,
271
292
  reasoning: model.reasoning,
272
293
  thinking: acceptedThinkingLevels(model),
273
- defaultThinking: defaultThinkingLevel(model),
294
+ defaultThinking: defaultThinkingLevel(model, remembered),
274
295
  fast,
275
296
  contextWindow: policy?.contextWindow ?? model.contextWindow,
276
297
  compactAt: policy?.compactAt ?? Math.floor(model.contextWindow * 0.8),
@@ -416,7 +437,9 @@ async function resolvePatch(kernel, models, input) {
416
437
  if (model === undefined)
417
438
  return { kind: "unknown-model", model: ref };
418
439
  const issues = [];
419
- const thinking = selectThinkingLevel(model, patch.thinking, selected?.thinking);
440
+ const previous = selected === null ? undefined : models.getModel(selected.model.provider, selected.model.id);
441
+ const kept = previous !== undefined && formatModelKey(baseRef(previous)) === formatModelKey(baseRef(model)) ? selected?.thinking : undefined;
442
+ const thinking = await selectThinkingLevel(kernel, model, patch.thinking, kept);
420
443
  if (thinking === null)
421
444
  issues.push(issue(["thinking"], `${ref.id} does not accept that level.`));
422
445
  const settings = { ...selected?.settings, ...patch.settings };
@@ -442,19 +465,53 @@ async function resolvePatch(kernel, models, input) {
442
465
  settingsVersion: input.version
443
466
  };
444
467
  }
445
- function selectThinkingLevel(model, given, kept) {
468
+ async function selectThinkingLevel(kernel, model, given, kept) {
446
469
  const accepted = acceptedThinkingLevels(model);
447
470
  if (given !== undefined && given !== null)
448
471
  return accepted.includes(given) ? given : null;
449
472
  if (given === undefined && kept !== undefined)
450
473
  return accepted.includes(kept) ? kept : clampThinkingLevel(model, kept);
451
- return defaultThinkingLevel(model);
474
+ return defaultThinkingLevel(model, await readThinkingPreference2(kernel.store, baseRef(model)));
475
+ }
476
+ function baseRef(model) {
477
+ return { provider: model.provider, id: model.variant?.base ?? model.id };
452
478
  }
453
479
  function acceptedThinkingLevels(model) {
454
480
  return ["off", ...getSupportedThinkingLevels(model).filter((level) => level !== "off")];
455
481
  }
456
- function defaultThinkingLevel(model) {
457
- return model.reasoning ? acceptedThinkingLevels(model).find((level) => level !== "off") ?? "off" : "off";
482
+ function defaultThinkingLevel(model, remembered) {
483
+ const accepted = acceptedThinkingLevels(model);
484
+ if (remembered !== undefined && accepted.includes(remembered))
485
+ return remembered;
486
+ return model.reasoning ? accepted.find((level) => level !== "off") ?? "off" : "off";
487
+ }
488
+ async function rememberChoice2(kernel, models, choice, scope) {
489
+ const model = models.getModel(choice.model.provider, choice.model.id);
490
+ if (model === undefined)
491
+ return;
492
+ const base = baseRef(model);
493
+ const preferred = scope === "model" ? await readModelSelection2(kernel.store) : null;
494
+ const updates = [
495
+ ...scope === "model" && (preferred === null || formatModelKey(preferred) !== formatModelKey(choice.model)) ? [
496
+ {
497
+ name: MODEL_PREFERENCE2,
498
+ target: await put2(kernel.store, "kv", {
499
+ provider: choice.model.provider,
500
+ id: choice.model.id
501
+ })
502
+ }
503
+ ] : [],
504
+ ...await readThinkingPreference2(kernel.store, base) === choice.thinking ? [] : [
505
+ {
506
+ name: thinkingPreferenceRef2(base),
507
+ target: await put2(kernel.store, "kv", choice.thinking)
508
+ }
509
+ ]
510
+ ];
511
+ if (updates.length === 0)
512
+ return;
513
+ await commit2(kernel, updates);
514
+ bumpGeneration2(kernel);
458
515
  }
459
516
  function sessionScoped(settings) {
460
517
  return settings.filter((definition) => definition.scope === "session");
@@ -466,4 +523,4 @@ function issue(path, message) {
466
523
  return { severity: "error", path, message };
467
524
  }
468
525
 
469
- export { createModelsApi2, modelInfo2, createLogin2, withLimits2, createConfigurationResolver2, settingsVersion2 };
526
+ export { createModelsApi2, modelInfo2, createLogin2, withLimits2, createConfigurationResolver2, settingsVersion2, rememberChoice2 };
@@ -2,7 +2,7 @@ import {
2
2
  envelope2,
3
3
  decodeRunRecord2,
4
4
  decodeCallRecord2
5
- } from "./compose-1jz2j92f.js";
5
+ } from "./compose-gxjc6vz9.js";
6
6
  import {
7
7
  objectId2
8
8
  } from "./compose-q6c7wswc.js";
@@ -15,7 +15,7 @@ import {
15
15
  callRef2,
16
16
  trustRef2,
17
17
  trustTarget2
18
- } from "./compose-kb22bkpt.js";
18
+ } from "./compose-cqpjcx2t.js";
19
19
  import {
20
20
  waitIndex2,
21
21
  wokenIndex2
@@ -410,6 +410,36 @@ var workspaceTrustMoved = {
410
410
  });
411
411
  }
412
412
  };
413
+ var sessionSnapshotDropped = {
414
+ kind: "schema",
415
+ name: "2026-10-18-session-snapshot-dropped",
416
+ sql: { sqlite: [], postgres: [] }
417
+ };
418
+ var changesAsWholeList = {
419
+ kind: "rewrite",
420
+ name: "2026-10-20-changes-as-whole-list",
421
+ rewriteLog(events) {
422
+ let listed = new Map;
423
+ return events.map((event) => {
424
+ if (!isJsonObject(event) || event.kind !== "changes")
425
+ return null;
426
+ const logged = event.files;
427
+ if (!Array.isArray(logged))
428
+ return null;
429
+ listed = new Map(listed);
430
+ for (const file of logged)
431
+ if (isJsonObject(file) && typeof file.path === "string")
432
+ listed.set(file.path, file);
433
+ const files = [...listed.values()];
434
+ return files.length === logged.length && files.every((file, index) => file === logged[index]) ? null : { ...event, files };
435
+ });
436
+ }
437
+ };
438
+ var foldCheckpointsCleared = {
439
+ kind: "schema",
440
+ name: "2026-10-20-fold-checkpoints-cleared",
441
+ sql: { sqlite: ["DELETE FROM fold_checkpoints"], postgres: [] }
442
+ };
413
443
  var STORE_STEPS = [
414
444
  baseline,
415
445
  recordFields,
@@ -429,7 +459,10 @@ var STORE_STEPS = [
429
459
  workspaceIsolation,
430
460
  foldCheckpoints,
431
461
  folderTrust,
432
- workspaceTrustMoved
462
+ workspaceTrustMoved,
463
+ sessionSnapshotDropped,
464
+ changesAsWholeList,
465
+ foldCheckpointsCleared
433
466
  ];
434
467
  var STORE_VERSION2 = STORE_STEPS.length;
435
468
  function assertStoreVersion2(version) {