@bendyline/gezel-service 1.0.2 → 1.0.4

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 (88) hide show
  1. package/dist/bin/gezeld.js +17797 -16874
  2. package/dist/handboek-content/whats-new/1.26226.md +89 -0
  3. package/dist/handboek.js +13 -2
  4. package/dist/index-store/static-index-worker.js +8 -5
  5. package/dist/index.d.ts +109 -7
  6. package/dist/index.js +17797 -16874
  7. package/dist/memory/embed-worker.js +22 -3
  8. package/dist/providers/mlx/python/gezel_mlx_server.py +154 -22
  9. package/dist/ui/assets/{TerminalCodeEditor-BpkIEKrW.js → TerminalCodeEditor-BuMcfTS4.js} +2 -2
  10. package/dist/ui/assets/{_.contribution-DESswd3T.js → _.contribution-CZO2XAKt.js} +1 -1
  11. package/dist/ui/assets/{chunk-6N2J7C2B-Du7clJkV.js → chunk-6N2J7C2B-BNHR_rFP.js} +1 -1
  12. package/dist/ui/assets/chunk-ILCJ3WFD-CUnKgI_I.js +4 -0
  13. package/dist/ui/assets/chunk-S5PCVMKU-i2wfHmvU.js +6 -0
  14. package/dist/ui/assets/{chunk-WATAOG4Y-BnCgSncI.js → chunk-WATAOG4Y-BbL-tDgQ.js} +1 -1
  15. package/dist/ui/assets/{cpp.contribution-DazoHQwn.js → cpp.contribution-BJzhk0Zj.js} +1 -1
  16. package/dist/ui/assets/{csharp.contribution-B64MdTmq.js → csharp.contribution-BR9K2qKj.js} +1 -1
  17. package/dist/ui/assets/{css.contribution-u617lXYH.js → css.contribution-CfkVmdah.js} +1 -1
  18. package/dist/ui/assets/{cssMode-Cf_QqRjJ.js → cssMode-MMeGUmV2.js} +1 -1
  19. package/dist/ui/assets/dist-8uH4DcHx.js +2 -0
  20. package/dist/ui/assets/dist-CFOmf7nD.js +222 -0
  21. package/dist/ui/assets/{dockerfile.contribution-P8T1FxHz.js → dockerfile.contribution-IZMl57B5.js} +1 -1
  22. package/dist/ui/assets/docx-BEJpkI6I.js +2 -0
  23. package/dist/ui/assets/extract-UTAOG7LV-BY3SCkzz.js +1 -0
  24. package/dist/ui/assets/{go.contribution-BqqmPpYF.js → go.contribution-BxCBwhZs.js} +1 -1
  25. package/dist/ui/assets/{handlebars-B9qcPqjD.js → handlebars-CreIkams.js} +1 -1
  26. package/dist/ui/assets/handlebars.contribution-BGlyL-dm.js +2 -0
  27. package/dist/ui/assets/{html-Fp2jEZ7j.js → html-BSrz1IKi.js} +1 -1
  28. package/dist/ui/assets/html.contribution-CucOMFQ_.js +2 -0
  29. package/dist/ui/assets/{htmlMode-B5cPhGim.js → htmlMode-DRG7XY5Z.js} +1 -1
  30. package/dist/ui/assets/{index-CQSh1NUQ.js → index-Bqu-32S3.js} +197 -191
  31. package/dist/ui/assets/index-DTicLc4o.css +1 -0
  32. package/dist/ui/assets/infer-D6e75m-s.js +2 -0
  33. package/dist/ui/assets/{ini.contribution-XkZYQphY.js → ini.contribution-CGX5OdXM.js} +1 -1
  34. package/dist/ui/assets/{java.contribution-CUQitE0a.js → java.contribution-CVhfJ_us.js} +1 -1
  35. package/dist/ui/assets/{javascript-CcBUpTjJ.js → javascript-QelFp9t5.js} +1 -1
  36. package/dist/ui/assets/javascript.contribution--no0ijCu.js +2 -0
  37. package/dist/ui/assets/{jsonMode-D9SbmDW6.js → jsonMode-T4Ss3lDu.js} +1 -1
  38. package/dist/ui/assets/{kotlin.contribution-B9AYd3Yp.js → kotlin.contribution-DxFbGDYA.js} +1 -1
  39. package/dist/ui/assets/layouts-2A7QNF6Y-CWQp8HDd.js +1 -0
  40. package/dist/ui/assets/{less.contribution-DtKQK3HF.js → less.contribution-g9R8XRZf.js} +1 -1
  41. package/dist/ui/assets/{lua.contribution-DxFFDcBW.js → lua.contribution-YqDsEy8Z.js} +1 -1
  42. package/dist/ui/assets/{markdown.contribution-B7aCxle-.js → markdown.contribution-DboXnPnx.js} +1 -1
  43. package/dist/ui/assets/{monaco-BBFILBn6.js → monaco-BdFw56DI.js} +3 -3
  44. package/dist/ui/assets/{monaco-base-CvsKN-Z-.js → monaco-base-DrP3D13F.js} +1 -1
  45. package/dist/ui/assets/{monaco-setup-BeHgXlpG.js → monaco-setup-QyF22y9h.js} +1 -1
  46. package/dist/ui/assets/{monaco.contribution-BBrbIBfd.js → monaco.contribution-BkqIxESv.js} +2 -2
  47. package/dist/ui/assets/{monaco.contribution-B-c9k_-7.js → monaco.contribution-CMzPFHtO.js} +2 -2
  48. package/dist/ui/assets/{monaco.contribution-Baa3Cv83.js → monaco.contribution-FA_ESP-W.js} +2 -2
  49. package/dist/ui/assets/{monaco.contribution-DRZnYNPl.js → monaco.contribution-XEpc63ty.js} +2 -2
  50. package/dist/ui/assets/{php.contribution-vC08ovbS.js → php.contribution-rnpik0Kk.js} +1 -1
  51. package/dist/ui/assets/pptx-DZdEoDP9.js +6 -0
  52. package/dist/ui/assets/{python-CevkXHVb.js → python-CF7X5t9Q.js} +1 -1
  53. package/dist/ui/assets/python.contribution-CyJGCfSq.js +2 -0
  54. package/dist/ui/assets/{ruby.contribution-BMZvE4z1.js → ruby.contribution-4ZyPGu2E.js} +1 -1
  55. package/dist/ui/assets/{rust.contribution-DOWKjtrn.js → rust.contribution-Cl_B3X2G.js} +1 -1
  56. package/dist/ui/assets/{scss.contribution-BXLJWEv0.js → scss.contribution-BO02gVLZ.js} +1 -1
  57. package/dist/ui/assets/{shell.contribution-gbqcscnj.js → shell.contribution-Dn9Y0uHs.js} +1 -1
  58. package/dist/ui/assets/{sql.contribution-DO39C_-u.js → sql.contribution-Bog_5Rc8.js} +1 -1
  59. package/dist/ui/assets/{swift.contribution-D4Vjb2VA.js → swift.contribution-CfiAr7AX.js} +1 -1
  60. package/dist/ui/assets/{terminal-monaco-setup-Bb4lnoOq.js → terminal-monaco-setup-B-EnkGiy.js} +1 -1
  61. package/dist/ui/assets/{tsMode-BAHQHAnm.js → tsMode-B2WuLuPL.js} +1 -1
  62. package/dist/ui/assets/{typescript-15FhCrR2.js → typescript-Bv_J1tKT.js} +1 -1
  63. package/dist/ui/assets/typescript.contribution-CM0XQCYi.js +2 -0
  64. package/dist/ui/assets/xlsx-DDBRN-IU.js +4 -0
  65. package/dist/ui/assets/{xml-BA1mrkDo.js → xml-DMV-f4tm.js} +1 -1
  66. package/dist/ui/assets/xml.contribution-QqmOB9gT.js +2 -0
  67. package/dist/ui/assets/{yaml-CIqCv-ro.js → yaml-Bb6mZXY5.js} +1 -1
  68. package/dist/ui/assets/yaml.contribution-DCDnWhHR.js +2 -0
  69. package/dist/ui/index.html +11 -11
  70. package/package.json +13 -13
  71. package/dist/ui/assets/chunk-ILCJ3WFD-fHFoZ9wm.js +0 -4
  72. package/dist/ui/assets/chunk-S5PCVMKU-DopU3Q9j.js +0 -6
  73. package/dist/ui/assets/dist-DB6xxrlD.js +0 -2
  74. package/dist/ui/assets/dist-DucbO86I.js +0 -222
  75. package/dist/ui/assets/docx-IZY6hX8A.js +0 -2
  76. package/dist/ui/assets/extract-UTAOG7LV-BZ_L7lLL.js +0 -1
  77. package/dist/ui/assets/handlebars.contribution-vZslMuRE.js +0 -2
  78. package/dist/ui/assets/html.contribution-B1GzaEV-.js +0 -2
  79. package/dist/ui/assets/index-Ch0qGtVJ.css +0 -1
  80. package/dist/ui/assets/infer-v-bCXeT9.js +0 -2
  81. package/dist/ui/assets/javascript.contribution-D6DhUpPP.js +0 -2
  82. package/dist/ui/assets/layouts-2A7QNF6Y-D94iKLLQ.js +0 -1
  83. package/dist/ui/assets/pptx-CsdVR0xn.js +0 -6
  84. package/dist/ui/assets/python.contribution-C6TUOYNZ.js +0 -2
  85. package/dist/ui/assets/typescript.contribution-D30L44Mw.js +0 -2
  86. package/dist/ui/assets/xlsx-CdLmEC42.js +0 -4
  87. package/dist/ui/assets/xml.contribution-CN9NFcUA.js +0 -2
  88. package/dist/ui/assets/yaml.contribution-BsLB8vrs.js +0 -2
@@ -0,0 +1,89 @@
1
+ ---
2
+ id: whats-new/1.26226
3
+ title: 1.26226 — 14 August 2026
4
+ order: -26226
5
+ summary: Five more models on the scorecard, file problems you can hand straight to a gezel, a much fuller terminal app, and memory that keeps working when its index breaks.
6
+ ---
7
+
8
+ # 1.26226 — 14 August 2026
9
+
10
+ Two days of work since **1.26224**, and a dense two days.
11
+
12
+ If you read only one thing: the problems gezel finds in your files stopped being a list you read and became work you can hand to someone, the terminal version of gezel caught up with the app, and the model scoreboard more than doubled.
13
+
14
+ Also: a new model - Qwen 3.8 27B Q4 - is now available. We're doing more testing and additional tuning over the next couple days, but if Qwen 3.6 is any indication, it should be really good!
15
+
16
+ ## Problems in your files became work you can hand off
17
+
18
+ Gezel's *boekwachter* — the keeper of the books, the crew member who reads through a project and notes what looks wrong — used to produce a list. You read it, and then it was on you.
19
+
20
+ Now each finding is a tracked issue with its own reference (`BW-1`, `BW-2`, and so on) that survives restarts and re-scans. Each one is **open**, **in progress**, **resolved** or **dismissed**, and you move it between those yourself. Closed ones fold away until you ask to see them.
21
+
22
+ The part that matters: there is now a **Fix this** button. Press it and gezel opens a dialog that has already worked out what kind of gezel this file needs — a writer for a document, a designer for an image, a developer for code, a researcher for a spreadsheet — and offers you the ones on your crew who fit. Choose one and it becomes a task, linked back to the issue, so the file, the finding and the work are the same thread rather than three things you hold in your head. Each file also shows a plain health score out of ten and the reason behind it.
23
+
24
+ ## The terminal app caught up
25
+
26
+ If you use `gezel` from a terminal, this release is mostly for you.
27
+
28
+ - Many stability fixes for the npm '@bendyline/gezel-cli' package and command line
29
+ - `/open` — type it in a chat and gezel offers you the files that conversation just touched, plus the project's artifacts and workspace folders, and opens the one you pick. This works in the desktop app's message box too.
30
+ - `gezel mode <read-only|reactive|reactive+tasks|full-play>`, or `/mode` inside a session — the same four settings for how much gezel is allowed to do on its own that the app has, now in one word from the command line.
31
+ - `gezel do <craftbook>` and `/do` — start a piece of standard work (a *craftbook* is gezel's word for a written-down procedure) without leaving the terminal.
32
+ - `/allow` and `/disallow` — turn a project's write permissions on and off in place.
33
+ - `/model download` — pick and fetch a new on-device model from inside a session.
34
+ - First-run setup in the terminal now shows the same model information the app does, and pressing Ctrl+C actually shuts down the background service it started instead of leaving it running.
35
+
36
+ The rest of the commands are in the [command-line reference](../technical/cli-reference.md).
37
+
38
+ ## Memory that does not give up
39
+
40
+ Your gezels' memories are ordinary Markdown files, and a search index sits on top of them to make recall fast. Previously, trouble with the index could take memory down with it — a first-time download of the search model failing because you were offline was enough to turn memory off for the rest of the session.
41
+
42
+ That is fixed in three places. Saving a memory now always writes the Markdown first, and reports the indexing as deferred rather than failing; the index catches up on its own afterwards. Searching falls back to plain text search when the fast path is unavailable, and tells you it did. And a failed model download is now treated as something that might clear — gezel waits a minute and tries again, instead of concluding that memory is broken.
43
+
44
+ ## Connectors are now an explicit preview
45
+
46
+ Connectors — the things that pull a calendar, a repository or a social account into a project — have moved behind a switch in **Settings → Advanced → Show very early work-in-progress features**, and it is off. So are the project types and craftbooks that depend on them.
47
+
48
+ This is a step back in visibility and a step forward in honesty. They are not finished, they change shape between releases, and having them sitting in every project's settings implied a stability they do not have yet.
49
+
50
+ Behind that switch, they got considerably better. Bluesky, X, LinkedIn and Instagram joined the connectors gezel can talk to, with a deliberate three-step path to publishing anything: a gezel **drafts** a post, **queues** it, and only then can **publish** it — and publishing is denied unless you have said otherwise, one time at a time. Overnight work never publishes; it leaves things in the outbox for you. Gezel ships no social-media app credentials of its own, so connecting an account means registering your own developer app, which the connection panel now walks you through and stores the secret in your operating system's keychain. Posts and mentions that come back land in the project's artifacts and are searchable alongside everything else.
51
+
52
+ ## Five more models measured
53
+
54
+ The [Model scorecard](../technical/model-scorecard.md) went from four models to nine.
55
+
56
+ The new entries are **gemma4-26b**, **qwen3.6-27b**, **qwen3.6-35b-a3b**, **muse-glimmer-30b** and **nemotron3.5-lightning-30b**, all measured the same way as the first four: every job run three times on a real machine and checked by a program. The picture that emerges is more interesting than "bigger is better". On general capability, gemma4-26b and qwen3.6-27b both finished every job. On the office and knowledge set, the small ornith-9b still beats several models three times its size. And qwen3.6-27b and qwen3.6-35b-a3b earn the highest marks from the separate quality read, at a fraction of the memory gemma4-26b needs.
57
+
58
+ [How we test models](../technical/how-we-test-models.md) explains what the numbers do and do not tell you. It is worth five minutes before you pick.
59
+
60
+ While you are on the models screen, every catalog model now says **who made it and who prepared the version you download**. Those are often different organizations — a company trains the model, someone else converts and compresses it so it runs on your machine — and until now gezel showed you only one name. The terminal app shows the same line when it offers you a model.
61
+
62
+
63
+ ## Smaller things
64
+
65
+ - **A job's single gezel is now called the Builder** rather than the Ambachtsman. Same gezel, a more simple word.
66
+ - **Codex and Claude sessions have their own permission setting per project**, separate from what gezel's own tools may do — so you can let one edit and keep the other reading.
67
+ - **Settings → About lists your running local engines** and, for each, the context window it actually got at launch. A model that suddenly seems to have lost the plot is very often one whose window came out smaller than the instructions it carries; this turns that from a log hunt into a glance.
68
+ - **The "stop everything" button now also unloads local engines** and drops gezel to Reactive, and it is reachable from Settings as well as the engine pill.
69
+ - **Model files gezel cannot read appear under "Models needing attention"** with their size and an Update or Remove button, instead of vanishing while still using your disk.
70
+ - **App updates show a real download progress bar** rather than an unmoving "downloading".
71
+ - **If gezel itself crashes, you get a plain dialog** offering to open a pre-filled report in your browser. Nothing is sent anywhere unless you press it.
72
+ - **Your graphics setup is re-checked at every launch**, so installing or removing a driver is noticed instead of remembered wrongly from the first run.
73
+ - **The prompt cache display no longer counts shared groundwork as conversations**, so the number matches what you have open.
74
+ - **Craftbooks now say what each step is supposed to produce**, and the finished result is checked against that rather than against the attempt.
75
+ - **Asking for the same piece of work twice in one turn returns the task already running** instead of starting a duplicate.
76
+ - Refreshed underlying editor and catalog content packages (squisq 2.7.2, gilde 0.1.28).
77
+
78
+ ## For developers
79
+
80
+ - **The Output Pane API (**`window.gezel`**) is documented and at version 1.** Interactive pages pinned into a project's Output pane get a frozen `gezel` object with `page`, `tools`, `data` and `ui` — reads are declared in the project type's manifest and enforced per request on the server, so a page can never read past its declaration. The earlier hand-rolled postMessage pattern keeps working.
81
+ - **Pull request files and diffs are properly paginated** for tools that read them, so a large PR no longer silently loses its later files.
82
+ - **Dependency operations in the repository are leased.** `pnpm deps:status` diagnoses, `pnpm deps:install` adds only what is genuinely missing, and `pnpm deps:repair` is the one explicit reconciliation path; builds and tests hold a shared read lease and can run alongside each other.
83
+ - `node-pty`** is now an optional dependency**, so an npm install of gezel no longer fails on machines without a build toolchain.
84
+
85
+ ## Anything to do?
86
+
87
+ No. Update when you are offered it.
88
+
89
+ Two settings are worth a visit. If connectors disappeared from your projects, they are behind **Settings → Advanced → Show very early work-in-progress features** — turn it on and they come back exactly as they were. And if you run models on your own machine, the new scorecard entries may change which one you want: start at the [Model scorecard](../technical/model-scorecard.md).
package/dist/handboek.js CHANGED
@@ -344,11 +344,16 @@ var DELEGATION_ORCHESTRATOR_ROLES = /* @__PURE__ */ new Set([
344
344
  "voorman",
345
345
  "planner"
346
346
  ]);
347
- function roleDelegationGroups(role) {
347
+ function roleDelegationGroups(role, isProjectVoorman) {
348
348
  const canonical = canonicalRoleKey(role);
349
+ if (isProjectVoorman) return ["role-delegation-escalation"];
349
350
  if (canonical && DELEGATION_ORCHESTRATOR_ROLES.has(canonical)) return ["role-delegation"];
350
351
  return ["role-delegation-escalation"];
351
352
  }
353
+ var PROJECT_VOORMAN_SELF_ESCALATION_TOOLS = /* @__PURE__ */ new Set([
354
+ "delegate_voorman",
355
+ "consult_voorman"
356
+ ]);
352
357
  var CONSULTATION_STRIPPED_TOOLS = /* @__PURE__ */ new Set(["ask_specialist", "ask_gezel"]);
353
358
  var VOORMAN_STRIPPED_MEESTER_TOOLS = /* @__PURE__ */ new Set([
354
359
  "create_gezel",
@@ -423,6 +428,7 @@ var GITHUB_REMOTE_TOOLS = /* @__PURE__ */ new Set([
423
428
  "github_pr_list",
424
429
  "github_pr_view",
425
430
  "github_pr_files",
431
+ "github_pr_file",
426
432
  "github_pr_diff",
427
433
  "github_pr_comments",
428
434
  "github_pr_comment",
@@ -462,7 +468,7 @@ function computeToolAllowlist(opts) {
462
468
  }
463
469
  const hasToolsetOverride = !!opts.toolsetsGroupOverride && opts.toolsetsGroupOverride.length > 0;
464
470
  const roleBaseGroups = hasToolsetOverride ? opts.toolsetsGroupOverride : roleToolsetGroups(opts.role);
465
- const baseGroups = opts.rolesAsTools ? [...roleBaseGroups, ...roleDelegationGroups(opts.role)] : roleBaseGroups;
471
+ const baseGroups = opts.rolesAsTools ? [...roleBaseGroups, ...roleDelegationGroups(opts.role, opts.isProjectVoorman === true)] : roleBaseGroups;
466
472
  const needsTeamStrip = opts.projectMode === "solo" || opts.consultationMode === true;
467
473
  const groups = needsTeamStrip ? stripTeamManagement(baseGroups) : baseGroups;
468
474
  let resolved = applyGates(expandToolsetGroups(groups));
@@ -482,6 +488,11 @@ function computeToolAllowlist(opts) {
482
488
  for (const name of VOORMAN_STRIPPED_DELEGATION_TOOLS) next.delete(name);
483
489
  resolved = next;
484
490
  }
491
+ if (opts.isProjectVoorman === true) {
492
+ const next = new Set(resolved);
493
+ for (const name of PROJECT_VOORMAN_SELF_ESCALATION_TOOLS) next.delete(name);
494
+ resolved = next;
495
+ }
485
496
  if (resolved.has("replace_in_file") && !resolved.has("replace_lines")) {
486
497
  const next = new Set(resolved);
487
498
  next.add("replace_lines");
@@ -253,6 +253,7 @@ import { join, relative } from "path";
253
253
  // src/git/git.ts
254
254
  import { spawn } from "child_process";
255
255
  import { realpath } from "fs/promises";
256
+ import { windowsHeadlessSpawnOptions } from "@bendyline/gezel/native";
256
257
  var GitError = class extends Error {
257
258
  constructor(message, code, stderr) {
258
259
  super(message);
@@ -313,11 +314,13 @@ async function runGit(args, opts = {}) {
313
314
  const child = hasStdinPayload ? spawn("git", gitArgs, {
314
315
  cwd: opts.cwd,
315
316
  env,
316
- stdio: ["pipe", "pipe", "pipe"]
317
+ stdio: ["pipe", "pipe", "pipe"],
318
+ ...windowsHeadlessSpawnOptions()
317
319
  }) : spawn("git", gitArgs, {
318
320
  cwd: opts.cwd,
319
321
  env,
320
- stdio: ["ignore", "pipe", "pipe"]
322
+ stdio: ["ignore", "pipe", "pipe"],
323
+ ...windowsHeadlessSpawnOptions()
321
324
  });
322
325
  const stdinState = {};
323
326
  if (hasStdinPayload) {
@@ -1012,7 +1015,7 @@ import { mkdtemp, realpath as realpath3, rm as rm2, writeFile as writeFile2 } fr
1012
1015
  import { tmpdir } from "os";
1013
1016
  import { isAbsolute as isAbsolute2, join as join3 } from "path";
1014
1017
  import { pathToFileURL } from "url";
1015
- import { windowsHeadlessSpawnOptions } from "@bendyline/gezel/native";
1018
+ import { windowsHeadlessSpawnOptions as windowsHeadlessSpawnOptions2 } from "@bendyline/gezel/native";
1016
1019
 
1017
1020
  // src/sandbox/macos.ts
1018
1021
  function runUnderMacSandbox(command, args, ctx, opts = {}) {
@@ -1163,7 +1166,7 @@ async function readNodeHelp(nodeBin) {
1163
1166
  env: sandboxEnv(process.env),
1164
1167
  // The capability probe is owned and awaited. Hide its Windows console
1165
1168
  // rather than giving the short-lived process a detached one.
1166
- ...windowsHeadlessSpawnOptions()
1169
+ ...windowsHeadlessSpawnOptions2()
1167
1170
  });
1168
1171
  let stdout = "";
1169
1172
  let stderr = "";
@@ -1189,7 +1192,7 @@ async function runSandboxChild(command, args, opts) {
1189
1192
  // Windows tree cleanup follows parent PIDs instead, so detaching there
1190
1193
  // only creates a new console window; keep it owned and hidden.
1191
1194
  detached: process.platform !== "win32",
1192
- ...windowsHeadlessSpawnOptions(),
1195
+ ...windowsHeadlessSpawnOptions2(),
1193
1196
  // Allowlist-scrub the env — inheriting everything leaked tokens
1194
1197
  // (GEZEL_TOKEN, OPENAI_API_KEY, GITHUB_PERSONAL_ACCESS_TOKEN,
1195
1198
  // etc.) into the sandboxed script, letting it `fetch` them
package/dist/index.d.ts CHANGED
@@ -2293,6 +2293,17 @@ interface PromptCtx extends ModelCtx {
2293
2293
  interface TurnCtx extends ModelCtx {
2294
2294
  sessionId: string;
2295
2295
  isMeester: boolean;
2296
+ /** Project receiving this turn. `default` is the unscoped front-door context. */
2297
+ projectId: string;
2298
+ /**
2299
+ * Provenance of the user-role message. Provider schemas use `user` for
2300
+ * human composer turns, question answers, gezel handoffs, and service
2301
+ * nudges alike; behaviors need this stronger signal before applying
2302
+ * user-intent routing such as the Meester new-project prelude.
2303
+ */
2304
+ messageOrigin: 'direct-user' | 'question-answer' | 'cross-gezel' | 'background-nudge' | 'system';
2305
+ /** Canonical/unqualified plus provider-advertised live tool names. */
2306
+ availableToolNames: ReadonlyArray<string>;
2296
2307
  /** Verbatim user-message text for this turn. */
2297
2308
  userText: string;
2298
2309
  /** Tool calls that drained from the per-turn accumulator. */
@@ -5287,6 +5298,12 @@ interface SearchResult {
5287
5298
 
5288
5299
  interface SaveOutcome {
5289
5300
  status: 'saved' | 'duplicate';
5301
+ /** False means Markdown is durable and the derived vector cache needs repair. */
5302
+ indexed?: boolean;
5303
+ degraded?: {
5304
+ code: 'semantic_index_unavailable';
5305
+ message: string;
5306
+ };
5290
5307
  /** Populated on 'duplicate': what it matched and how. */
5291
5308
  match?: {
5292
5309
  text: string;
@@ -5294,6 +5311,16 @@ interface SaveOutcome {
5294
5311
  via: 'exact' | 'vector';
5295
5312
  };
5296
5313
  }
5314
+ type MemorySearchMode = 'semantic' | 'hybrid' | 'lexical';
5315
+ interface MemorySearchOutcome {
5316
+ results: SearchResult[];
5317
+ mode: MemorySearchMode;
5318
+ /** Present when a semantic-search failure forced the source-text fallback. */
5319
+ degraded?: {
5320
+ code: 'semantic_search_unavailable';
5321
+ message: string;
5322
+ };
5323
+ }
5297
5324
  interface MemoryManagerOptions {
5298
5325
  /** Override {@link MEMORY_DEDUP_THRESHOLD} (tests). */
5299
5326
  dedupThreshold?: number;
@@ -5315,8 +5342,8 @@ declare class MemoryManager {
5315
5342
  * that text dedups, so we accept the race rather than lock.
5316
5343
  *
5317
5344
  * Degraded mode (embeddings disabled): markdown is still appended (it is
5318
- * the source of truth and the index self-heals on rebuild) and the
5319
- * EmbeddingsDisabledError propagates, preserving the pre-dedup contract.
5345
+ * the source of truth) and the outcome reports deferred indexing. The health
5346
+ * monitor self-heals the derived index once embeddings recover.
5320
5347
  */
5321
5348
  save(scope: 'gezel' | 'project', id: string, text: string, kind?: MemoryKind): Promise<SaveOutcome>;
5322
5349
  /**
@@ -5347,6 +5374,15 @@ declare class MemoryManager {
5347
5374
  */
5348
5375
  hasIndex(scope: 'gezel' | 'project', id: string): boolean;
5349
5376
  searchAll(gezelId: string, projectId: string, query: string, topK?: number): Promise<SearchResult[]>;
5377
+ /**
5378
+ * Search both scopes with one query embedding. Missing indexes fall back to
5379
+ * the daily Markdown source; an unavailable/corrupt semantic cache does the
5380
+ * same and reports a degraded mode instead of turning an optional feature
5381
+ * into an HTTP 500.
5382
+ */
5383
+ searchAllDetailed(gezelId: string, projectId: string, query: string, topK?: number): Promise<MemorySearchOutcome>;
5384
+ private searchAllLexical;
5385
+ private searchLexical;
5350
5386
  listDays(scope: 'gezel' | 'project', id: string): Promise<string[]>;
5351
5387
  readDay(scope: 'gezel' | 'project', id: string, day: string): Promise<string>;
5352
5388
  /**
@@ -6095,9 +6131,17 @@ declare class TaskManager {
6095
6131
  private onTaskSettled?;
6096
6132
  private onTaskNeedsHelp?;
6097
6133
  private onConnectorPrep?;
6134
+ private readonly autoPreparedConnectorTypes;
6098
6135
  private scriptRunner?;
6099
6136
  private craftbookResolver?;
6100
6137
  private roleResolver?;
6138
+ /**
6139
+ * Join concurrent replays of the same step transition. Local models can
6140
+ * retry an MCP call when its response is slow; without single-flight both
6141
+ * requests read the same active step and independently run gates, scripts,
6142
+ * recruitment, and handoff hooks before either write becomes visible.
6143
+ */
6144
+ private readonly inFlightStepCompletions;
6101
6145
  constructor(store: Store, history?: HistoryManager | undefined);
6102
6146
  /**
6103
6147
  * Wake a project that was resting in `stable` because live work just
@@ -6167,7 +6211,9 @@ declare class TaskManager {
6167
6211
  * still enforced (a required, unbound connector fails the launch), but
6168
6212
  * nothing syncs.
6169
6213
  */
6170
- setConnectorPrepHook(fn: ConnectorPrepHook): void;
6214
+ setConnectorPrepHook(fn: ConnectorPrepHook, opts?: {
6215
+ autoPreparedTypes?: readonly string[];
6216
+ }): void;
6171
6217
  /**
6172
6218
  * Fire the needs-help hook (fire-and-forget, errors logged). Public so
6173
6219
  * the scheduler's stalled-step escalation can report through the same
@@ -6247,7 +6293,7 @@ declare class TaskManager {
6247
6293
  addStep(projectId: string, num: number, input: NewCraftbookStep, pos?: StepPosition): Promise<Task>;
6248
6294
  /**
6249
6295
  * Patch a single step's mutable fields (`description`, `prompt`,
6250
- * `assignee`, `suggestedGezelId`). `undefined` means "leave alone";
6296
+ * `consumes`, `assignee`, `suggestedGezelId`). `undefined` means "leave alone";
6251
6297
  * explicit `null` on the optional fields means "clear it." Returns
6252
6298
  * the updated task. Returns `null` when the step id doesn't exist.
6253
6299
  */
@@ -6875,6 +6921,7 @@ interface ProviderCacheStats {
6875
6921
  providerName: string;
6876
6922
  totalBytes: number;
6877
6923
  budgetBytes: number;
6924
+ /** All entries, including reusable `prefix-*` entries; legacy field name. */
6878
6925
  warmSessionCount: number;
6879
6926
  hits: number;
6880
6927
  misses: number;
@@ -8477,6 +8524,7 @@ interface TaskBudgetSnapshot {
8477
8524
  inputTokens: number;
8478
8525
  }
8479
8526
 
8527
+ type TurnMessageOrigin = 'direct-user' | 'question-answer' | 'cross-gezel' | 'background-nudge' | 'system';
8480
8528
  interface GateScriptDiagnostic {
8481
8529
  scriptName: string;
8482
8530
  runId?: string;
@@ -9368,9 +9416,10 @@ declare class ChatManager {
9368
9416
  cancelled: boolean;
9369
9417
  }>;
9370
9418
  /**
9371
- * Install-wide panic stop for chat work. The engagement-mode cache flips
9372
- * synchronously before any teardown awaits, so task runners and autonomous
9373
- * follow-ups cannot admit replacement turns while the current ones unwind.
9419
+ * Install-wide panic stop for chat work and resident providers. The
9420
+ * engagement-mode cache flips synchronously before any teardown awaits, so
9421
+ * task runners and autonomous follow-ups cannot admit replacement turns
9422
+ * while the current ones unwind.
9374
9423
  * Pending user messages and after-idle handoffs are deliberately discarded:
9375
9424
  * leaving either queue intact would make an "emergency stop" immediately
9376
9425
  * restart work as soon as the cancelled provider call releases its slot.
@@ -9480,6 +9529,14 @@ declare class ChatManager {
9480
9529
  * prompt. See ChatSession.consultationMode for the full contract.
9481
9530
  */
9482
9531
  consultationMode?: boolean;
9532
+ /**
9533
+ * Pin the session's name-rendering mode ("boring mode") instead of
9534
+ * following the live config flag. Passed by clients with a fixed
9535
+ * presentation mode (the TUI) so the prompt's gezel references match
9536
+ * the labels that client renders. See
9537
+ * `ChatSessionSchema.roleBasedNameOnlyMode`.
9538
+ */
9539
+ roleBasedNameOnlyMode?: boolean;
9483
9540
  /**
9484
9541
  * Shape-of-deliverable hint persisted on the session. When
9485
9542
  * `kind: "file"` is set, the consultation-mode addendum swaps
@@ -9577,6 +9634,8 @@ declare class ChatManager {
9577
9634
  * advanced, carry on" instead of naming the recipient as the sender.
9578
9635
  */
9579
9636
  fromGezelId?: string;
9637
+ /** Naming presentation inherited from the task's launching session. */
9638
+ roleBasedNameOnlyMode?: boolean;
9580
9639
  /**
9581
9640
  * `'entry'` is a fresh launch (e.g. the command launcher created the
9582
9641
  * task and is starting its entry step) — there is no prior step, so
@@ -10044,6 +10103,8 @@ declare class ChatManager {
10044
10103
  * the message never queued, so it renders as a normal send.
10045
10104
  */
10046
10105
  nudge?: boolean;
10106
+ /** Strong provenance used by per-turn behavior hooks. */
10107
+ messageOrigin?: TurnMessageOrigin;
10047
10108
  }): Promise<ChatMessage>;
10048
10109
  /**
10049
10110
  * Wrap {@link runSend} so its completion — success or error — triggers
@@ -11393,6 +11454,7 @@ declare class ConnectorManager {
11393
11454
  */
11394
11455
  syncBinding(project: ProjectDetail, bindingId: string, opts?: {
11395
11456
  scopes?: readonly string[];
11457
+ backfillLimit?: number;
11396
11458
  }): Promise<BindingSyncResult>;
11397
11459
  /** Sync every enabled binding on a project (drives the sync manager). */
11398
11460
  syncProject(project: ProjectDetail): Promise<BindingSyncResult[]>;
@@ -12120,6 +12182,8 @@ interface TaskRunnerDispatcher {
12120
12182
  fromGezelName?: string;
12121
12183
  fromGezelId?: string;
12122
12184
  kind?: 'handoff' | 'entry';
12185
+ /** Naming presentation pinned by the task that owns this handoff. */
12186
+ roleBasedNameOnlyMode?: boolean;
12123
12187
  /**
12124
12188
  * Queue lane for the dispatched turn. Task handoffs travel
12125
12189
  * `'background'` so a typed chat always drains first; Night Shift also
@@ -12491,6 +12555,25 @@ declare class CodeReviewManager {
12491
12555
  private mutate;
12492
12556
  }
12493
12557
 
12558
+ interface GitHubPullFilesPage {
12559
+ files: GitHubPullFile[];
12560
+ allFiles: number;
12561
+ totalFiles: number;
12562
+ offset: number;
12563
+ limit: number;
12564
+ hasMore: boolean;
12565
+ nextOffset?: number;
12566
+ includesPatch: boolean;
12567
+ }
12568
+ interface GitHubPullDiffPage {
12569
+ diff: string;
12570
+ path?: string;
12571
+ offset: number;
12572
+ returnedChars: number;
12573
+ totalChars: number;
12574
+ truncated: boolean;
12575
+ nextOffset?: number;
12576
+ }
12494
12577
  declare class GitHubPrs {
12495
12578
  private readonly manager;
12496
12579
  constructor(manager: GitManager);
@@ -12505,7 +12588,20 @@ declare class GitHubPrs {
12505
12588
  */
12506
12589
  listFiles(project: ProjectDetail, num: number, opts?: {
12507
12590
  patchLimit?: number;
12591
+ includePatch?: boolean;
12508
12592
  }): Promise<GitHubPullFile[]>;
12593
+ /**
12594
+ * A bounded, explicitly paginated view for API/tool consumers. Metadata is
12595
+ * complete for the selected page before any optional patch bodies appear,
12596
+ * so a bridge cap can no longer erase the existence of later files.
12597
+ */
12598
+ listFilesPage(project: ProjectDetail, num: number, opts?: {
12599
+ offset?: number;
12600
+ limit?: number;
12601
+ paths?: readonly string[];
12602
+ includePatch?: boolean;
12603
+ patchLimit?: number;
12604
+ }): Promise<GitHubPullFilesPage>;
12509
12605
  listComments(project: ProjectDetail, num: number): Promise<GitHubPullComment[]>;
12510
12606
  /**
12511
12607
  * Fetch the unified diff for a PR via the `application/vnd.github.v3.diff`
@@ -12517,6 +12613,12 @@ declare class GitHubPrs {
12517
12613
  getPullRequestDiff(project: ProjectDetail, num: number, opts?: {
12518
12614
  limit?: number;
12519
12615
  }): Promise<string>;
12616
+ /** Bounded diff page with machine-readable continuation metadata. */
12617
+ getPullRequestDiffPage(project: ProjectDetail, num: number, opts?: {
12618
+ offset?: number;
12619
+ limit?: number;
12620
+ path?: string;
12621
+ }): Promise<GitHubPullDiffPage>;
12520
12622
  /**
12521
12623
  * Post a top-level (issue-style) comment to a PR. Returns the new
12522
12624
  * comment id + URL so callers can link the user/model to it.