@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.
- package/dist/bin/gezeld.js +17797 -16874
- package/dist/handboek-content/whats-new/1.26226.md +89 -0
- package/dist/handboek.js +13 -2
- package/dist/index-store/static-index-worker.js +8 -5
- package/dist/index.d.ts +109 -7
- package/dist/index.js +17797 -16874
- package/dist/memory/embed-worker.js +22 -3
- package/dist/providers/mlx/python/gezel_mlx_server.py +154 -22
- package/dist/ui/assets/{TerminalCodeEditor-BpkIEKrW.js → TerminalCodeEditor-BuMcfTS4.js} +2 -2
- package/dist/ui/assets/{_.contribution-DESswd3T.js → _.contribution-CZO2XAKt.js} +1 -1
- package/dist/ui/assets/{chunk-6N2J7C2B-Du7clJkV.js → chunk-6N2J7C2B-BNHR_rFP.js} +1 -1
- package/dist/ui/assets/chunk-ILCJ3WFD-CUnKgI_I.js +4 -0
- package/dist/ui/assets/chunk-S5PCVMKU-i2wfHmvU.js +6 -0
- package/dist/ui/assets/{chunk-WATAOG4Y-BnCgSncI.js → chunk-WATAOG4Y-BbL-tDgQ.js} +1 -1
- package/dist/ui/assets/{cpp.contribution-DazoHQwn.js → cpp.contribution-BJzhk0Zj.js} +1 -1
- package/dist/ui/assets/{csharp.contribution-B64MdTmq.js → csharp.contribution-BR9K2qKj.js} +1 -1
- package/dist/ui/assets/{css.contribution-u617lXYH.js → css.contribution-CfkVmdah.js} +1 -1
- package/dist/ui/assets/{cssMode-Cf_QqRjJ.js → cssMode-MMeGUmV2.js} +1 -1
- package/dist/ui/assets/dist-8uH4DcHx.js +2 -0
- package/dist/ui/assets/dist-CFOmf7nD.js +222 -0
- package/dist/ui/assets/{dockerfile.contribution-P8T1FxHz.js → dockerfile.contribution-IZMl57B5.js} +1 -1
- package/dist/ui/assets/docx-BEJpkI6I.js +2 -0
- package/dist/ui/assets/extract-UTAOG7LV-BY3SCkzz.js +1 -0
- package/dist/ui/assets/{go.contribution-BqqmPpYF.js → go.contribution-BxCBwhZs.js} +1 -1
- package/dist/ui/assets/{handlebars-B9qcPqjD.js → handlebars-CreIkams.js} +1 -1
- package/dist/ui/assets/handlebars.contribution-BGlyL-dm.js +2 -0
- package/dist/ui/assets/{html-Fp2jEZ7j.js → html-BSrz1IKi.js} +1 -1
- package/dist/ui/assets/html.contribution-CucOMFQ_.js +2 -0
- package/dist/ui/assets/{htmlMode-B5cPhGim.js → htmlMode-DRG7XY5Z.js} +1 -1
- package/dist/ui/assets/{index-CQSh1NUQ.js → index-Bqu-32S3.js} +197 -191
- package/dist/ui/assets/index-DTicLc4o.css +1 -0
- package/dist/ui/assets/infer-D6e75m-s.js +2 -0
- package/dist/ui/assets/{ini.contribution-XkZYQphY.js → ini.contribution-CGX5OdXM.js} +1 -1
- package/dist/ui/assets/{java.contribution-CUQitE0a.js → java.contribution-CVhfJ_us.js} +1 -1
- package/dist/ui/assets/{javascript-CcBUpTjJ.js → javascript-QelFp9t5.js} +1 -1
- package/dist/ui/assets/javascript.contribution--no0ijCu.js +2 -0
- package/dist/ui/assets/{jsonMode-D9SbmDW6.js → jsonMode-T4Ss3lDu.js} +1 -1
- package/dist/ui/assets/{kotlin.contribution-B9AYd3Yp.js → kotlin.contribution-DxFbGDYA.js} +1 -1
- package/dist/ui/assets/layouts-2A7QNF6Y-CWQp8HDd.js +1 -0
- package/dist/ui/assets/{less.contribution-DtKQK3HF.js → less.contribution-g9R8XRZf.js} +1 -1
- package/dist/ui/assets/{lua.contribution-DxFFDcBW.js → lua.contribution-YqDsEy8Z.js} +1 -1
- package/dist/ui/assets/{markdown.contribution-B7aCxle-.js → markdown.contribution-DboXnPnx.js} +1 -1
- package/dist/ui/assets/{monaco-BBFILBn6.js → monaco-BdFw56DI.js} +3 -3
- package/dist/ui/assets/{monaco-base-CvsKN-Z-.js → monaco-base-DrP3D13F.js} +1 -1
- package/dist/ui/assets/{monaco-setup-BeHgXlpG.js → monaco-setup-QyF22y9h.js} +1 -1
- package/dist/ui/assets/{monaco.contribution-BBrbIBfd.js → monaco.contribution-BkqIxESv.js} +2 -2
- package/dist/ui/assets/{monaco.contribution-B-c9k_-7.js → monaco.contribution-CMzPFHtO.js} +2 -2
- package/dist/ui/assets/{monaco.contribution-Baa3Cv83.js → monaco.contribution-FA_ESP-W.js} +2 -2
- package/dist/ui/assets/{monaco.contribution-DRZnYNPl.js → monaco.contribution-XEpc63ty.js} +2 -2
- package/dist/ui/assets/{php.contribution-vC08ovbS.js → php.contribution-rnpik0Kk.js} +1 -1
- package/dist/ui/assets/pptx-DZdEoDP9.js +6 -0
- package/dist/ui/assets/{python-CevkXHVb.js → python-CF7X5t9Q.js} +1 -1
- package/dist/ui/assets/python.contribution-CyJGCfSq.js +2 -0
- package/dist/ui/assets/{ruby.contribution-BMZvE4z1.js → ruby.contribution-4ZyPGu2E.js} +1 -1
- package/dist/ui/assets/{rust.contribution-DOWKjtrn.js → rust.contribution-Cl_B3X2G.js} +1 -1
- package/dist/ui/assets/{scss.contribution-BXLJWEv0.js → scss.contribution-BO02gVLZ.js} +1 -1
- package/dist/ui/assets/{shell.contribution-gbqcscnj.js → shell.contribution-Dn9Y0uHs.js} +1 -1
- package/dist/ui/assets/{sql.contribution-DO39C_-u.js → sql.contribution-Bog_5Rc8.js} +1 -1
- package/dist/ui/assets/{swift.contribution-D4Vjb2VA.js → swift.contribution-CfiAr7AX.js} +1 -1
- package/dist/ui/assets/{terminal-monaco-setup-Bb4lnoOq.js → terminal-monaco-setup-B-EnkGiy.js} +1 -1
- package/dist/ui/assets/{tsMode-BAHQHAnm.js → tsMode-B2WuLuPL.js} +1 -1
- package/dist/ui/assets/{typescript-15FhCrR2.js → typescript-Bv_J1tKT.js} +1 -1
- package/dist/ui/assets/typescript.contribution-CM0XQCYi.js +2 -0
- package/dist/ui/assets/xlsx-DDBRN-IU.js +4 -0
- package/dist/ui/assets/{xml-BA1mrkDo.js → xml-DMV-f4tm.js} +1 -1
- package/dist/ui/assets/xml.contribution-QqmOB9gT.js +2 -0
- package/dist/ui/assets/{yaml-CIqCv-ro.js → yaml-Bb6mZXY5.js} +1 -1
- package/dist/ui/assets/yaml.contribution-DCDnWhHR.js +2 -0
- package/dist/ui/index.html +11 -11
- package/package.json +13 -13
- package/dist/ui/assets/chunk-ILCJ3WFD-fHFoZ9wm.js +0 -4
- package/dist/ui/assets/chunk-S5PCVMKU-DopU3Q9j.js +0 -6
- package/dist/ui/assets/dist-DB6xxrlD.js +0 -2
- package/dist/ui/assets/dist-DucbO86I.js +0 -222
- package/dist/ui/assets/docx-IZY6hX8A.js +0 -2
- package/dist/ui/assets/extract-UTAOG7LV-BZ_L7lLL.js +0 -1
- package/dist/ui/assets/handlebars.contribution-vZslMuRE.js +0 -2
- package/dist/ui/assets/html.contribution-B1GzaEV-.js +0 -2
- package/dist/ui/assets/index-Ch0qGtVJ.css +0 -1
- package/dist/ui/assets/infer-v-bCXeT9.js +0 -2
- package/dist/ui/assets/javascript.contribution-D6DhUpPP.js +0 -2
- package/dist/ui/assets/layouts-2A7QNF6Y-D94iKLLQ.js +0 -1
- package/dist/ui/assets/pptx-CsdVR0xn.js +0 -6
- package/dist/ui/assets/python.contribution-C6TUOYNZ.js +0 -2
- package/dist/ui/assets/typescript.contribution-D30L44Mw.js +0 -2
- package/dist/ui/assets/xlsx-CdLmEC42.js +0 -4
- package/dist/ui/assets/xml.contribution-CN9NFcUA.js +0 -2
- 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
|
-
...
|
|
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
|
-
...
|
|
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
|
|
5319
|
-
*
|
|
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
|
|
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
|
|
9372
|
-
* synchronously before any teardown awaits, so
|
|
9373
|
-
* follow-ups cannot admit replacement turns
|
|
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.
|