@bendyline/gezel-service 1.1.1 → 1.1.2

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 (185) hide show
  1. package/dist/NOTICE.md +3 -3
  2. package/dist/bin/gezeld.js +8471 -5311
  3. package/dist/handboek-content/technical/building-connected-apps-with-gezel-app-sdk.md +78 -0
  4. package/dist/handboek-content/whats-new/{1.26250.md → 1.26251.md} +5 -5
  5. package/dist/index-store/static-index-worker.js +160 -51
  6. package/dist/index.d.ts +416 -71
  7. package/dist/index.js +8465 -5305
  8. package/dist/memory/embed-worker.js +132 -4
  9. package/dist/memory/image-embed-worker.js +14 -5
  10. package/dist/providers/mlx/python/cache_persist.py +52 -8
  11. package/dist/providers/mlx/python/gezel_mlx_server.py +44 -1
  12. package/dist/providers/mlx/python/qwen4_ple.py +159 -0
  13. package/dist/providers/mlx/python/spec_decode.py +73 -31
  14. package/dist/providers/mlx/python/tool_call_stream.py +10 -2
  15. package/dist/providers/mlx/python/tool_grammar.py +16 -0
  16. package/dist/ui/assets/{AmbientDashboardCard-DcVHxEdC.js → AmbientDashboardCard-_xnAQGnk.js} +1 -1
  17. package/dist/ui/assets/{AudioEngineSettings-BFM2S1mm.js → AudioEngineSettings-CgXgbX0i.js} +1 -1
  18. package/dist/ui/assets/{BenchmarksView-84-YeULA.js → BenchmarksView-BlExZpYA.js} +1 -1
  19. package/dist/ui/assets/CatalogBrowser-DYXUZQ_t.js +1 -0
  20. package/dist/ui/assets/{ChannelsSettings-7NAVUk4k.js → ChannelsSettings-EH27HcqZ.js} +1 -1
  21. package/dist/ui/assets/ChatTimelineView-Dn1TNyVn.js +7 -0
  22. package/dist/ui/assets/{ConnectedAppsPanel-CIgF4Q3R.js → ConnectedAppsPanel-BROry-Y0.js} +1 -1
  23. package/dist/ui/assets/CraftbookEditor-B2RNJnFf.js +1 -0
  24. package/dist/ui/assets/{CraftbookScriptEditorView-Ck5tzj3Y.js → CraftbookScriptEditorView-B-vySmHP.js} +1 -1
  25. package/dist/ui/assets/{CraftbookTabContent-BWg7FhK_.js → CraftbookTabContent-BW_2KC89.js} +1 -1
  26. package/dist/ui/assets/{CraftbookToolsetSetup-EuFOiUzR.js → CraftbookToolsetSetup-J7rEa835.js} +1 -1
  27. package/dist/ui/assets/{CraftbooksView-BIzQ1VVn.js → CraftbooksView-BjBUWPGF.js} +1 -1
  28. package/dist/ui/assets/DiffpackReviewView-CD4qJmgT.js +1 -0
  29. package/dist/ui/assets/DocumentDetail-SYozruTJ.js +1 -0
  30. package/dist/ui/assets/DocumentsView-DE7eL49Z.js +1 -0
  31. package/dist/ui/assets/{Ds4Settings-9soZCSeO.js → Ds4Settings-DGzc7JcD.js} +1 -1
  32. package/dist/ui/assets/{EmbeddedChat-Cce7nxXT.js → EmbeddedChat-D92TaJQ8.js} +1 -1
  33. package/dist/ui/assets/{FaceRecognitionCard-BVZyOwB8.js → FaceRecognitionCard-CB1Dt9X4.js} +1 -1
  34. package/dist/ui/assets/FileMapView-kVBG22FU.js +1 -0
  35. package/dist/ui/assets/FoldersSettings-BWFQU5B4.js +1 -0
  36. package/dist/ui/assets/GezelDetail-Br4v42Nv.js +1 -0
  37. package/dist/ui/assets/{GezelJsonEditor-DXXt165-.js → GezelJsonEditor-B9XEiW5Y.js} +1 -1
  38. package/dist/ui/assets/GezellenView-DheEBAy4.js +1 -0
  39. package/dist/ui/assets/{GildeUpdatesCard-CtY8mUTA.js → GildeUpdatesCard-BeIYv09f.js} +1 -1
  40. package/dist/ui/assets/{GithubSignInChip-DT3l6E0Q.js → GithubSignInChip-eEGCe9ar.js} +1 -1
  41. package/dist/ui/assets/{HandboekMediaProvider-ByJ4NAzz.js → HandboekMediaProvider-D0zcbbpf.js} +1 -1
  42. package/dist/ui/assets/HandboekView-p0BZT1rH.js +1 -0
  43. package/dist/ui/assets/{HistoryView-CkinzFEC.js → HistoryView-CKWcWW-Y.js} +1 -1
  44. package/dist/ui/assets/{HomeView-DNBrQnwy.js → HomeView-b_TT5oV3.js} +1 -1
  45. package/dist/ui/assets/{ImageEngineSettings-BfM9HSd_.js → ImageEngineSettings-CJfk4OJ4.js} +1 -1
  46. package/dist/ui/assets/{ImageRecognitionSettings-CaSQu5Br.js → ImageRecognitionSettings-DzbvZk5S.js} +1 -1
  47. package/dist/ui/assets/{IncompleteDownloads-C36lTCMG.js → IncompleteDownloads-C8_XyP8O.js} +1 -1
  48. package/dist/ui/assets/{KnowledgeCatalogsCard-CK9bqdf6.js → KnowledgeCatalogsCard-CHopG_j-.js} +1 -1
  49. package/dist/ui/assets/KnowledgeView-CXNKZUJq.js +1 -0
  50. package/dist/ui/assets/{LlamaCppSettings-CdNMHBbp.js → LlamaCppSettings-ohcM7kes.js} +1 -1
  51. package/dist/ui/assets/{MarkdownField-Dugmfr_e.js → MarkdownField-BX0qsaFq.js} +1 -1
  52. package/dist/ui/assets/{MemoriesTree-CgFqUNEr.js → MemoriesTree-BPj5Rod8.js} +1 -1
  53. package/dist/ui/assets/{MicrophoneSettings-DzDe9y1q.js → MicrophoneSettings-CWjeYnfI.js} +1 -1
  54. package/dist/ui/assets/MlxSettings-Dq6dRpcl.js +1 -0
  55. package/dist/ui/assets/{ModelPicker-BVkJhNAH.js → ModelPicker-0Ue-eEKj.js} +1 -1
  56. package/dist/ui/assets/NewPathDialog-BhAZm9dp.js +1 -0
  57. package/dist/ui/assets/{NewScriptDialog-TEAd0KLl.js → NewScriptDialog-DuryIe50.js} +1 -1
  58. package/dist/ui/assets/NewTaskDialog-BX24flMY.js +2 -0
  59. package/dist/ui/assets/{OllamaSettings-CPy2vxyZ.js → OllamaSettings-Boj8Nd1G.js} +1 -1
  60. package/dist/ui/assets/ProjectChat-Dhw_M5bq.js +5 -0
  61. package/dist/ui/assets/ProjectConnectionsTab-BwpMQNrg.js +1 -0
  62. package/dist/ui/assets/{ProjectGitStatusBar-BgHZ2ijN.js → ProjectGitStatusBar-BORGYx5l.js} +1 -1
  63. package/dist/ui/assets/{ProjectGithubView-BV2uTNU0.js → ProjectGithubView-CTP1BOMv.js} +1 -1
  64. package/dist/ui/assets/{ProjectMailTab-DLtJdXSL.js → ProjectMailTab-qFmAeV3M.js} +1 -1
  65. package/dist/ui/assets/{ProjectOverviewView-ZMs9nL5N.js → ProjectOverviewView-Cq1FsoaT.js} +1 -1
  66. package/dist/ui/assets/{ProjectTimeline-CTPcn4Kc.js → ProjectTimeline-Cqae2Z92.js} +1 -1
  67. package/dist/ui/assets/ProjectsView-D0uJjUB-.js +7 -0
  68. package/dist/ui/assets/{RecommendedBadge-iUoisQBi.js → RecommendedBadge-CN1jEmSn.js} +1 -1
  69. package/dist/ui/assets/{RemoteServersPanel-CTVJ0IRh.js → RemoteServersPanel-CMakvCCM.js} +1 -1
  70. package/dist/ui/assets/{ScriptEditorTabs-CCDFZjdC.js → ScriptEditorTabs-st6dJePd.js} +2 -2
  71. package/dist/ui/assets/{ScriptEditorView-CergLqKj.js → ScriptEditorView-BkySh57_.js} +2 -2
  72. package/dist/ui/assets/{ScriptsView-v7ckdhDi.js → ScriptsView-7uPKwjDB.js} +1 -1
  73. package/dist/ui/assets/{SecurityComplianceSettings-Bd0-66Gs.js → SecurityComplianceSettings-Tsv_pXfy.js} +1 -1
  74. package/dist/ui/assets/SessionSwitcher-D0fSeeHO.js +1 -0
  75. package/dist/ui/assets/SettingsView-cli_z8ZW.js +3 -0
  76. package/dist/ui/assets/{SquisqIntegration-C5l_OPvD.js → SquisqIntegration-BTZ1kBlg.js} +1 -1
  77. package/dist/ui/assets/{StorageCleanupDialog-3kv9-2mT.js → StorageCleanupDialog-CDBjl8JQ.js} +1 -1
  78. package/dist/ui/assets/{StorageUsageCard-7sWTrZFa.js → StorageUsageCard-DXY1j0dZ.js} +1 -1
  79. package/dist/ui/assets/TaskTabContent-C0P681SL.js +1 -0
  80. package/dist/ui/assets/TasksView-Ddwz10ri.js +1 -0
  81. package/dist/ui/assets/{TerminalCodeEditor-ChmdzmCz.js → TerminalCodeEditor-BkNQ6QoQ.js} +2 -2
  82. package/dist/ui/assets/ToolsetsEditor-KVigemfL.js +8 -0
  83. package/dist/ui/assets/{TransformToolbarButton-gzIxUBH7.js → TransformToolbarButton-8wfJR1bO.js} +2 -2
  84. package/dist/ui/assets/{UnrecognizedModels-0hptopv6.js → UnrecognizedModels-BzdU1clO.js} +1 -1
  85. package/dist/ui/assets/{VideoEngineSettings-BdNzCEdR.js → VideoEngineSettings-f79ff57u.js} +1 -1
  86. package/dist/ui/assets/{WorkspaceIndexPane-DnsOO916.js → WorkspaceIndexPane-fu5V6o1W.js} +1 -1
  87. package/dist/ui/assets/{api-C0I7spBl.js → api-CmrgM5Rf.js} +1 -1
  88. package/dist/ui/assets/chat-thread-memory-8MCtb17Q.js +1 -0
  89. package/dist/ui/assets/{chunk-6ECMNUIP-BvCy0HUI.js → chunk-6ECMNUIP-D5AA6ozp.js} +1 -1
  90. package/dist/ui/assets/{chunk-A6N6IN3I-ofeM4l8g.js → chunk-A6N6IN3I-BpxihS5H.js} +1 -1
  91. package/dist/ui/assets/{chunk-ATWVNF7D-CYuW1Yc6.js → chunk-ATWVNF7D-CKIWh7bN.js} +1 -1
  92. package/dist/ui/assets/{chunk-UBFT2CDQ-FexGDigd.js → chunk-CW24CH7I-BD0FIooX.js} +1 -1
  93. package/dist/ui/assets/{chunk-DXYWKZ52-zxe8pjH4.js → chunk-DXYWKZ52-DMKPZnpo.js} +1 -1
  94. package/dist/ui/assets/chunk-IIQYS2YH-BtDJt4Xr.js +1 -0
  95. package/dist/ui/assets/{chunk-KGWT454C-v5-l6U5m.js → chunk-KGWT454C-DsQOBuLg.js} +1 -1
  96. package/dist/ui/assets/{chunk-Q77KNJIN-BLuPdsQF.js → chunk-Q77KNJIN-BdWizq9s.js} +1 -1
  97. package/dist/ui/assets/{chunk-USU6HTKB-B_p-YcDp.js → chunk-USU6HTKB-DyGZplh4.js} +1 -1
  98. package/dist/ui/assets/{chunk-UXEANVBI-Bt0kX-0Z.js → chunk-UXEANVBI-BUBXvqyE.js} +1 -1
  99. package/dist/ui/assets/{chunk-O7JILDEF-CqcO1qaI.js → chunk-X7BNDUNI-D14WIvlD.js} +2 -2
  100. package/dist/ui/assets/{chunk-AE3IUKMM-mZjzzO8Z.js → chunk-ZSU5DJLX-CrjQf-vs.js} +1 -1
  101. package/dist/ui/assets/{container-BI8hxN1N.js → container-iFj1r6Hk.js} +1 -1
  102. package/dist/ui/assets/csv-Di411Mv-.js +1 -0
  103. package/dist/ui/assets/data-Q05qqAp4.js +1 -0
  104. package/dist/ui/assets/{dist-APSIK7H3.js → dist-1FNFiksd.js} +3 -3
  105. package/dist/ui/assets/dist-BMZhqfv7.js +2 -0
  106. package/dist/ui/assets/dist-CE5CbmDb.js +225 -0
  107. package/dist/ui/assets/doc-BHcGsJZd.js +587 -0
  108. package/dist/ui/assets/{document-import-DPK4r8Am.js → document-import-B2Ya6sbf.js} +1 -1
  109. package/dist/ui/assets/{docx-DRLuCTaC.js → docx-B8Pwz5Ih.js} +1 -1
  110. package/dist/ui/assets/{epub-a0p2Xb1b.js → epub-BQ4g8Q9j.js} +1 -1
  111. package/dist/ui/assets/{export-options-BqYFyzWx.js → export-options-Dylv69b3.js} +1 -1
  112. package/dist/ui/assets/file-browser-BLOPfnS0.js +5 -0
  113. package/dist/ui/assets/{html-BbQNmJ5X.js → html-BnA7qFwq.js} +1 -1
  114. package/dist/ui/assets/icons-CyM7Cg4E.js +1 -0
  115. package/dist/ui/assets/index-DW6qHqhU.css +1 -0
  116. package/dist/ui/assets/index-DivKnJyx.js +36 -0
  117. package/dist/ui/assets/{mail-link-CWfsP5Aq.js → mail-link-NtlcX5OE.js} +1 -1
  118. package/dist/ui/assets/{markdown-ryKA_OmY.js → markdown-CLKH_zzl.js} +1 -1
  119. package/dist/ui/assets/markdown-baseline-0dqv9qbV.js +1 -0
  120. package/dist/ui/assets/materialize-G4WC5UG3-xq2dcwS8.js +1 -0
  121. package/dist/ui/assets/{monaco-base-C0VTMpv-.js → monaco-base-BSvdAweA.js} +1 -1
  122. package/dist/ui/assets/{monaco-setup-CX8q88c5.js → monaco-setup-CT7LZ0o_.js} +1 -1
  123. package/dist/ui/assets/{new-project-meta-ZmDPGYzC.js → new-project-meta-5Y9Blozr.js} +1 -1
  124. package/dist/ui/assets/outside-in-Msmhxf_U.js +3 -0
  125. package/dist/ui/assets/{pdf-BHrygJa5.js → pdf-C4BhW3zg.js} +1 -1
  126. package/dist/ui/assets/{pending-drafts-27ujtQxX.js → pending-drafts-BD227X9H.js} +1 -1
  127. package/dist/ui/assets/{poppetje-CfaAvFkE.js → poppetje-DvCJO36y.js} +3 -3
  128. package/dist/ui/assets/{pptx-nDW64jAN.js → pptx-B6uaM2s7.js} +3 -3
  129. package/dist/ui/assets/{run-export-86KzLZ7R.js → run-export-TscWwR6y.js} +2 -2
  130. package/dist/ui/assets/{standalone-source-7QdiNsDW.js → standalone-source-Cw9SF7Zk.js} +1 -1
  131. package/dist/ui/assets/storage-Cmhlwx70.js +1 -0
  132. package/dist/ui/assets/styles-BjDaWeMA.css +1 -0
  133. package/dist/ui/assets/styles-CqO-rmOt.js +554 -0
  134. package/dist/ui/assets/{terminal-monaco-setup-Bar-sYKd.js → terminal-monaco-setup-me523-j-.js} +1 -1
  135. package/dist/ui/assets/{transform-CmAXy0Ck.js → transform-DxJCwK68.js} +1 -1
  136. package/dist/ui/assets/{use-local-model-manager-D1yiurrC.js → use-local-model-manager-8wvk-I-y.js} +1 -1
  137. package/dist/ui/assets/{useCompactLayout-BDtPQcDh.js → useCompactLayout-cm4E9Vja.js} +0 -0
  138. package/dist/ui/assets/{useCopilotAvailability-BHOfHrfT.js → useCopilotAvailability-D9hglSH_.js} +1 -1
  139. package/dist/ui/assets/{useDiffpacks-B0kYhlWQ.js → useDiffpacks-1BN2XJWg.js} +1 -1
  140. package/dist/ui/assets/{useGitSync-DOt-ODiw.js → useGitSync-7m9YA7h5.js} +1 -1
  141. package/dist/ui/assets/{useShowWorkInProgressFeatures-BtpredG7.js → useShowWorkInProgressFeatures-D6QOaTUT.js} +1 -1
  142. package/dist/ui/assets/{useTotalRamBytes-B8NFM27w.js → useTotalRamBytes-Durk383U.js} +1 -1
  143. package/dist/ui/assets/{xlsx-B_pu1ZvY.js → xlsx-BbHA9bxA.js} +1 -1
  144. package/dist/ui/index.html +15 -15
  145. package/package.json +12 -11
  146. package/dist/ui/assets/CatalogBrowser-7_jHy5Q3.js +0 -1
  147. package/dist/ui/assets/ChatTimelineView-Cg_kLK_U.js +0 -7
  148. package/dist/ui/assets/CraftbookEditor-BKAIsnXv.js +0 -1
  149. package/dist/ui/assets/DiffpackReviewView-B2a3zgE-.js +0 -1
  150. package/dist/ui/assets/DocumentDetail-GCYhwQqV.js +0 -1
  151. package/dist/ui/assets/DocumentsView-Cm3RaQ5N.js +0 -1
  152. package/dist/ui/assets/FileMapView-BKJovLcL.js +0 -1
  153. package/dist/ui/assets/FoldersSettings-CuJd2JdE.js +0 -1
  154. package/dist/ui/assets/GezelDetail-D_KIPDhQ.js +0 -1
  155. package/dist/ui/assets/GezellenView-BOOW1QQU.js +0 -1
  156. package/dist/ui/assets/HandboekView-gRzJcIbJ.js +0 -1
  157. package/dist/ui/assets/KnowledgeView-DJ3cJVHA.js +0 -1
  158. package/dist/ui/assets/MlxSettings-45mBFHbA.js +0 -1
  159. package/dist/ui/assets/NewTaskDialog-CIXVunZn.js +0 -2
  160. package/dist/ui/assets/ProjectChat-BiJRweob.js +0 -5
  161. package/dist/ui/assets/ProjectConnectionsTab-CQgaIzuv.js +0 -1
  162. package/dist/ui/assets/ProjectsView-BUdR76n6.js +0 -7
  163. package/dist/ui/assets/SessionSwitcher-BgZqyiRn.js +0 -1
  164. package/dist/ui/assets/SettingsView-DLhOYiR5.js +0 -3
  165. package/dist/ui/assets/TaskTabContent-CG2KmfwV.js +0 -1
  166. package/dist/ui/assets/TasksView-Dy5Ue4zS.js +0 -1
  167. package/dist/ui/assets/ToolsetsEditor-J9XxQ5Ms.js +0 -8
  168. package/dist/ui/assets/chat-thread-memory-CI2-giEq.js +0 -1
  169. package/dist/ui/assets/chunk-IIQYS2YH-DEkyBlHg.js +0 -1
  170. package/dist/ui/assets/csv-B0D9jJG2.js +0 -1
  171. package/dist/ui/assets/data-BIL84EaT.js +0 -1
  172. package/dist/ui/assets/dist-CJqyWK6E.js +0 -2
  173. package/dist/ui/assets/dist-DOqbRmFj.js +0 -225
  174. package/dist/ui/assets/doc-C2Ph2FWI.js +0 -584
  175. package/dist/ui/assets/document-companion-aDThLOwl.js +0 -1
  176. package/dist/ui/assets/file-browser-DVyWN0LD.js +0 -5
  177. package/dist/ui/assets/icons-DWaUNQbT.js +0 -1
  178. package/dist/ui/assets/index-DDu8nyO6.js +0 -34
  179. package/dist/ui/assets/index-DEDUSiCx.css +0 -1
  180. package/dist/ui/assets/markdown-baseline-9B52XlX2.js +0 -1
  181. package/dist/ui/assets/materialize-G4WC5UG3-BlZQe-88.js +0 -1
  182. package/dist/ui/assets/outside-in-BmIIeMid.js +0 -3
  183. package/dist/ui/assets/storage-B-vhjyV2.js +0 -1
  184. package/dist/ui/assets/styles-BvkZd-EV.js +0 -550
  185. package/dist/ui/assets/styles-IQ4adxWr.css +0 -1
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import * as _bendyline_gezel from '@bendyline/gezel';
2
- import { NativeEngineResolveEvent, NativeEngineName, HistoryEvent, HistoryFilter, HistoryEntry, ProjectFileEntry, GezelConfig, GezelGender, Poppetje, GezelDetail, PendingGezelMessage, GezelSummary, ProviderName, RetrievalPolicy, ChatModelTuning, GezelTrait, ProjectLocalConfig, ImportProvenance, PendingImports, ProjectTypeOverlay, GezelFrontmatter, Project, ProjectIconId, ProjectDetail, FileReviewIssue, BoekwachterIssueStatus, BoekwachterIssueDismissalReason, ProjectManagedWorkspaceWritePolicy, ProjectNudgeConfig, ProjectTabVisibility, ProjectActivity, MeesterStatusReport, MeesterStatusState, ProjectGitHub, ChatSession, ChatSessionSummary, TimelineMessage, TerminalTimelineEntry, TerminalThread, TerminalThreadSummary, TerminalMessage, GezelGrowthState, Task, Question, TaskNote, ToolsetsScope, InstalledToolset, ToolsetConfig, CraftbookSummary, Craftbook, ProjectCraftbookProvenance, HookSpec, HookPhase, HookResult, ModelTier, ModelStyle, BehaviorId, ModelFamily, ChatMessageToolCall, SamplingBlock, CodexPermissionModeCompat, ModelFitnessTrigger, ModelFitnessRecord, ImageRecognition, RecognitionMode, RecognitionHealth, ImageModelPullEvent as ImageModelPullEvent$1, ModelInfo as ModelInfo$1, VideoAccelerator, ServiceRole, ResolvedDistributionPolicy, SessionParent, SessionLink, ChatSessionSource, ChatEvent, ChatEventEnvelope, AmbientDashboardResolution, AmbientDashboardTheme, AmbientDashboardDisplayTarget, AmbientDashboardStyle, AmbientDashboardState, PromptDraftStatus, PromptDraftSummary, PromptDraft, CreatePromptDraftRequest, PatchPromptDraftRequest, DuplicatePromptDraftRequest, OutlineFileResponse, FileContextResponse, FindSymbolResponse, ReadSymbolResponse, MapRepoResponse, SecurityScanResponse, ScanFindingsRequest, ScanFindingsResponse, SecurityFindingWire, MapAttackSurfaceResponse, ListDependenciesResponse, SecurityOverviewResponse, TraceTaintResponse, FileMapRequest, FileMapResponse, SearchCodeResponse, FileReviewResponse, ListFileIssuesRequest, ListFileIssuesResponse, BoekwachterIssue, SearchDocsResponse, SearchDocumentsResponse, ReadDocAsMarkdownResponse, SearchImagesResponse, FindSimilarImagesResponse, DescribeFolderResponse, FindEntityResponse, ListPeopleResponse, ListEntityMentionsResponse, KeurmeesterCaseRecord, TaskStatus, KeurmeesterTriggerKind, KeurmeesterAction, KeurmeesterCaseOutcome, GateCheck, TaskCraftbookStep, TaskCraftbookSource, CraftbookConnectorNeed, CreateTaskRequest, UpdateTaskRequest, TaskAssignee, NewCraftbookStep, StepPosition, UpdateTaskStepRequest, TaskNoteAuthor, TaskVariation, ScriptCapability, WorkspaceIndexStatus, IndexReadinessReport, ScriptScope, ScriptRunTrigger, ScriptRun, PreviewLogEntry, WorkspaceCommandIndex, WorkspaceSkillIndex, WorkspaceInstructionIndex, UnifiedSearchResult, RetrievalSource, SessionTurnPhase, SessionGpuTask, SessionTelemetry, AIEngagementMode, TurnCancelReason, ChatMessage, SessionDebugSnapshot, ExpectedDeliverable, FileTurnIntent, AppServeSiteStatus, AppServeStartRequest, AppServeStartResponse, ChannelStatus, ChannelName, CodexSetupStatusResponse, ConfigureCodexRequest, KeyedLock, ProjectConnectorBinding, DiffpackOrigin, DiffpackRecord, Diffpack, GildeUpdateStatusResponse, GitWorkingChange, GitFileDiffResponse, CodeReviewKind, GitLogEntry, GitCommitDetailResponse, GitSyncResponse, GitConflictFile, GitConflictVersionsResponse, TaskWaitState, CodeReviewRecord, CodeReview, GitHubPullSummary, GitHubPullDetail, GitHubPullFile, GitHubPullComment, KnowledgeUserRegistry, KnowledgeCatalogRef, KnowledgeInstallSourceKind, TrustedKnowledgeCoordinate, KnowledgeInstallEvent, ProjectKnowledgeCatalogs, KnowledgeEmbeddingProfile, KnowledgeInstallRequest, KnowledgeCatalogStatus, KnowledgeUpdateCandidate, KnowledgeAvailableCatalog, KnowledgeSemanticSearchMode, KnowledgeInstallJob, KnowledgeActiveInstall, IncompleteKnowledgeDownload, OpenCodeSetupStatusResponse, ConfigureOpenCodeRequest, InstallOpenCodePluginRequest, PiSetupStatusResponse, ConfigurePiRequest, InstallPiExtensionRequest, RenderImageRequest, ReportActionsResponse, FireReportActionResponse, ReportActionRecord, StorageJobKind, StorageJob, StorageJobPhase, SystemToolsetInstallEvent, SystemToolsetInstallSnapshot, NightShiftWindow, TerminalEventEnvelope, DiscoveredCommand, VSCodeSetupStatusResponse, ConfigureVSCodeRequest, ScriptMeta } from '@bendyline/gezel';
2
+ import { NativeEngineResolveEvent, NativeEngineName, HistoryEvent, HistoryFilter, HistoryEntry, ProjectFileEntry, GezelConfig, GezelGender, Poppetje, GezelDetail, PendingGezelMessage, GezelSummary, ProviderName, RetrievalPolicy, ChatModelTuning, GezelTrait, ProjectLocalConfig, ImportProvenance, PendingImports, ProjectTypeOverlay, GezelFrontmatter, Project, ProjectIconId, ProjectDetail, FileReviewIssue, BoekwachterIssueStatus, BoekwachterIssueDismissalReason, ProjectManagedWorkspaceWritePolicy, ProjectNudgeConfig, ProjectTabVisibility, ProjectActivity, MeesterStatusReport, MeesterStatusState, ProjectGitHub, ChatSession, ChatSessionSummary, TimelineMessage, TerminalTimelineEntry, TerminalThread, TerminalThreadSummary, TerminalMessage, GezelGrowthState, Task, Question, TaskNote, ToolsetsScope, InstalledToolset, ToolsetConfig, CraftbookSummary, Craftbook, ProjectCraftbookProvenance, HookSpec, HookPhase, HookResult, ModelTier, ModelStyle, BehaviorId, ModelFamily, ChatMessageToolCall, SamplingBlock, CodexPermissionModeCompat, ModelFitnessTrigger, ModelFitnessRecord, ImageRecognition, RecognitionMode, RecognitionHealth, ImageModelPullEvent as ImageModelPullEvent$1, ModelInfo as ModelInfo$1, VideoAccelerator, ServiceRole, ResolvedDistributionPolicy, AppToolRelayEvent, RegisterAppToolsRequest, AppToolRelayCloseReason, AppToolDefinition, AppToolRelaySummary, AppToolCallResultRequest, SessionParent, SessionLink, ChatSessionSource, ChatEvent, ChatEventEnvelope, AmbientDashboardResolution, AmbientDashboardTheme, AmbientDashboardDisplayTarget, AmbientDashboardStyle, AmbientDashboardState, PromptDraftStatus, PromptDraftSummary, PromptDraft, CreatePromptDraftRequest, PatchPromptDraftRequest, DuplicatePromptDraftRequest, OutlineFileResponse, FileContextResponse, FindSymbolResponse, ReadSymbolResponse, MapRepoResponse, SecurityScanResponse, ScanFindingsRequest, ScanFindingsResponse, SecurityFindingWire, MapAttackSurfaceResponse, ListDependenciesResponse, SecurityOverviewResponse, TraceTaintResponse, FileMapRequest, FileMapResponse, SearchCodeResponse, FileReviewResponse, ListFileIssuesRequest, ListFileIssuesResponse, BoekwachterIssue, SearchDocsResponse, SearchDocumentsResponse, ReadDocAsMarkdownResponse, SearchImagesResponse, FindSimilarImagesResponse, DescribeFolderResponse, FindEntityResponse, ListPeopleResponse, ListEntityMentionsResponse, KeurmeesterCaseRecord, TaskStatus, KeurmeesterTriggerKind, KeurmeesterAction, KeurmeesterCaseOutcome, GateCheck, TaskCraftbookStep, TaskCraftbookSource, CraftbookConnectorNeed, CreateTaskRequest, UpdateTaskRequest, TaskAssignee, NewCraftbookStep, StepPosition, UpdateTaskStepRequest, TaskNoteAuthor, TaskVariation, ScriptCapability, WorkspaceIndexStatus, IndexReadinessReport, ScriptScope, ScriptRunTrigger, ScriptRun, PreviewLogEntry, WorkspaceCommandIndex, WorkspaceSkillIndex, WorkspaceInstructionIndex, UnifiedSearchResult, RetrievalSource, SessionTurnPhase, SessionGpuTask, SessionTelemetry, AIEngagementMode, TurnCancelReason, ChatMessage, SessionDebugSnapshot, ExpectedDeliverable, FileTurnIntent, TurnIntentPreviewRequest, TurnIntentPlan, AppServeSiteStatus, AppServeStartRequest, AppServeStartResponse, ChannelStatus, ChannelName, CodexSetupStatusResponse, ConfigureCodexRequest, KeyedLock, ProjectConnectorBinding, DiffpackOrigin, DiffpackRecord, Diffpack, GildeUpdateStatusResponse, GitWorkingChange, GitFileDiffResponse, CodeReviewKind, GitLogEntry, GitCommitDetailResponse, GitSyncResponse, GitConflictFile, GitConflictVersionsResponse, TaskWaitState, CodeReviewRecord, CodeReview, GitHubPullSummary, GitHubPullDetail, GitHubPullFile, GitHubPullComment, KnowledgeUserRegistry, KnowledgeCatalogRef, KnowledgeInstallSourceKind, TrustedKnowledgeCoordinate, KnowledgeInstallEvent, ProjectKnowledgeCatalogs, KnowledgeEmbeddingProfile, KnowledgeInstallRequest, KnowledgeCatalogStatus, KnowledgeUpdateCandidate, KnowledgeAvailableCatalog, KnowledgeSemanticSearchMode, KnowledgeInstallJob, KnowledgeActiveInstall, IncompleteKnowledgeDownload, OpenCodeSetupStatusResponse, ConfigureOpenCodeRequest, InstallOpenCodePluginRequest, PiSetupStatusResponse, ConfigurePiRequest, InstallPiExtensionRequest, RenderImageRequest, ReportActionsResponse, FireReportActionResponse, ReportActionRecord, StorageJobKind, StorageJob, StorageJobPhase, SystemToolsetInstallEvent, SystemToolsetInstallSnapshot, NightShiftWindow, TerminalEventEnvelope, DiscoveredCommand, VSCodeSetupStatusResponse, ConfigureVSCodeRequest, ScriptMeta } from '@bendyline/gezel';
3
3
  import { CatalogService } from '@bendyline/gezel-catalog';
4
4
  import { NativeBinaryName, GpuPanicRecord, DeviceHealthGate, DeviceSafetyPolicyInput, DeviceHealthStatusSnapshot } from '@bendyline/gezel/native';
5
5
  import { z } from 'zod';
6
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
6
7
  import { spawn, exec } from 'node:child_process';
7
8
  import { ServerType } from '@hono/node-server';
8
9
  import { ExternalFolders } from '@bendyline/gezel/paths';
@@ -58,7 +59,9 @@ type RunResult = {
58
59
  stdout: string;
59
60
  stderr: string;
60
61
  };
61
- type Runner = (cmd: string, args: string[]) => Promise<RunResult>;
62
+ type Runner = (cmd: string, args: string[], options?: {
63
+ env: NodeJS.ProcessEnv;
64
+ }) => Promise<RunResult>;
62
65
  interface VerifyOptions {
63
66
  policy: SignaturePolicy;
64
67
  /** Test seam — defaults to `process.platform`. */
@@ -197,6 +200,91 @@ declare class EngineBinaryRegistry {
197
200
  private broadcast;
198
201
  }
199
202
 
203
+ /**
204
+ * The MCP server spec: what `McpBridge.start()` needs to bring up a session,
205
+ * plus the `kind` predicates. A leaf module on purpose — wrappers under
206
+ * `mcp-wrappers/` select on the spec, and the bridge imports the wrapper
207
+ * registry, so a wrapper that reached back into `mcp-bridge.ts` for these
208
+ * helpers formed an import cycle (`playwright-arg-validator` →
209
+ * `playwright-snapshot` → `mcp-bridge` → `mcp-wrappers/index` → the
210
+ * validator again, still initializing). Import spec helpers from here;
211
+ * `mcp-bridge.ts` re-exports them for its existing callers.
212
+ *
213
+ * Three flavors:
214
+ *
215
+ * - **stdio** (default when `kind` is omitted) — spawn a local
216
+ * subprocess and speak MCP over its pipes. The historical shape
217
+ * and what every existing call site uses.
218
+ * - **http** — connect to a hosted MCP server over HTTP (Streamable
219
+ * HTTP for new servers, SSE for older ones). Headers (auth tokens,
220
+ * custom keys) come from resolved toolset config the same way
221
+ * subprocess env vars do for stdio.
222
+ * - **in-memory** — an MCP server this daemon serves itself, over a
223
+ * linked transport pair with no process and no socket. Used for tools a
224
+ * connected app registered through the app-tool relay: the server half
225
+ * forwards each call up that app's event stream. A bridge is still the
226
+ * right shape for these because everything a tool surface needs —
227
+ * timeouts, output caps, redaction, argument coercion, the unresolved
228
+ * failure ledger, the `tool` chat event — already lives in the bridge
229
+ * and pool rather than in any one transport.
230
+ *
231
+ * The discriminator is `kind`; a missing `kind` is treated as
232
+ * `'stdio'` so legacy `{command, args, env}` callers keep working.
233
+ */
234
+
235
+ type McpServerSpec = StdioMcpServerSpec | HttpMcpServerSpec | InMemoryMcpServerSpec;
236
+ interface StdioMcpServerSpec {
237
+ kind?: 'stdio';
238
+ /**
239
+ * Catalog toolset id this bridge speaks to, when it was spawned for an
240
+ * installed toolset. Wrappers select on this rather than sniffing the
241
+ * command line, because a managed system install spawns
242
+ * `node <home>/system-toolsets/@playwright__mcp@0.0.78/package/cli.js` —
243
+ * `installDirName` has slugified the `/` away, so the package name never
244
+ * appears in `command`/`args`. Sniffing there left every Playwright
245
+ * wrapper inert against the exact copy Gezel manages: the `file:`-URL
246
+ * rewrite never fired, and the local-preview posture advertised a browser
247
+ * surface nothing had pruned.
248
+ */
249
+ toolsetId?: string;
250
+ command: string;
251
+ args: string[];
252
+ env: Record<string, string>;
253
+ /** Working directory for project-local/custom MCP servers. */
254
+ cwd?: string;
255
+ }
256
+ interface HttpMcpServerSpec {
257
+ kind: 'http';
258
+ /** Catalog toolset id — see {@link StdioMcpServerSpec.toolsetId}. */
259
+ toolsetId?: string;
260
+ /**
261
+ * `streamable-http` is the current MCP HTTP transport (one URL,
262
+ * POST for messages, optional GET for SSE stream + auto-reconnect).
263
+ * `sse` is the older two-endpoint variant — kept for back-compat
264
+ * with registry entries that still declare it.
265
+ */
266
+ transport: 'streamable-http' | 'sse';
267
+ url: string;
268
+ /**
269
+ * Headers attached to every request. Bearer tokens, API keys, etc.
270
+ * Resolved from toolset config + secrets at session-build time.
271
+ */
272
+ headers: Record<string, string>;
273
+ }
274
+ interface InMemoryMcpServerSpec {
275
+ kind: 'in-memory';
276
+ /** Catalog toolset id — see {@link StdioMcpServerSpec.toolsetId}. */
277
+ toolsetId?: string;
278
+ /** Short label for logs; never a secret. */
279
+ label: string;
280
+ /**
281
+ * Build the client half of a linked transport pair, with the server half
282
+ * already connected. Called once per bridge start, so a retry gets a fresh
283
+ * pair rather than a closed one.
284
+ */
285
+ connect: () => Transport;
286
+ }
287
+
200
288
  /**
201
289
  * Append-only audit log. Explicit events live in per-scope JSONL files;
202
290
  * chat session entries are derived at query time from the existing
@@ -1134,8 +1222,14 @@ declare class Store {
1134
1222
  * deprecated field spread through newly written project files.
1135
1223
  */
1136
1224
  private writeProjectMeta;
1137
- /** Per-project lock serializing {@link touchProject}'s metadata bumps. */
1138
- private readonly touchChains;
1225
+ /**
1226
+ * Per-project lock shared by every project.json read-modify-write path.
1227
+ * Settings, classification, roster bookkeeping, scheduler nudge state, and
1228
+ * Git sync metadata can all land concurrently. Atomic file replacement
1229
+ * prevents torn JSON, but only this full-cycle lock prevents a later writer
1230
+ * from silently restoring the stale fields it read before another write.
1231
+ */
1232
+ private readonly projectUpdateLocks;
1139
1233
  touchProject(id: string): Promise<void>;
1140
1234
  /**
1141
1235
  * A project `workingDir` is settable by the model (via `update_project`)
@@ -1223,6 +1317,7 @@ declare class Store {
1223
1317
  */
1224
1318
  properties?: Record<string, string>;
1225
1319
  }): Promise<ProjectDetail>;
1320
+ private updateProjectUnlocked;
1226
1321
  /**
1227
1322
  * Delete a project. Two tiers, because the user's own files must never be
1228
1323
  * destroyed silently:
@@ -1250,6 +1345,7 @@ declare class Store {
1250
1345
  removedWorkspace: boolean;
1251
1346
  workspaceSource: 'workingDir' | 'githubCheckout' | 'internal';
1252
1347
  }>;
1348
+ private deleteProjectUnlocked;
1253
1349
  /**
1254
1350
  * Update the service-managed fields of `project.github`. When `patch.url`
1255
1351
  * is supplied, this may also create the link after an explicit clone path
@@ -1278,6 +1374,7 @@ declare class Store {
1278
1374
  }): Promise<{
1279
1375
  added: boolean;
1280
1376
  }>;
1377
+ private addGezelToProjectUnlocked;
1281
1378
  /**
1282
1379
  * Remove a gezel from a project's `gezelIds` roster. Idempotent —
1283
1380
  * returns `{ removed: false }` when the gezel wasn't a member. Does
@@ -2023,7 +2120,9 @@ declare class Store {
2023
2120
  */
2024
2121
  listProjectCraftbooks(projectId: string): Promise<CraftbookSummary[]>;
2025
2122
  /** Resolve a project-local craftbook into the runtime `Craftbook` shape. */
2026
- getProjectCraftbook(projectId: string, id: string, version?: string): Promise<Craftbook | null>;
2123
+ getProjectCraftbook(projectId: string, id: string, version?: string, options?: {
2124
+ throwOnInvalid?: boolean;
2125
+ }): Promise<Craftbook | null>;
2027
2126
  /** Persist a project-local craftbook (flat `.gezel/craftbooks/<id>/` layout). */
2028
2127
  writeProjectCraftbook(projectId: string, book: Craftbook): Promise<void>;
2029
2128
  /** Remove a project-local craftbook from the workspace. */
@@ -2131,59 +2230,7 @@ type HookRunner = (hook: ActiveHook, ctx: {
2131
2230
  isError: boolean;
2132
2231
  };
2133
2232
  }) => Promise<HookResult>;
2134
- /**
2135
- * What `McpBridge.start()` needs to bring up a session. Two flavors:
2136
- *
2137
- * - **stdio** (default when `kind` is omitted) — spawn a local
2138
- * subprocess and speak MCP over its pipes. The historical shape
2139
- * and what every existing call site uses.
2140
- * - **http** — connect to a hosted MCP server over HTTP (Streamable
2141
- * HTTP for new servers, SSE for older ones). Headers (auth tokens,
2142
- * custom keys) come from resolved toolset config the same way
2143
- * subprocess env vars do for stdio.
2144
- *
2145
- * The discriminator is `kind`; a missing `kind` is treated as
2146
- * `'stdio'` so legacy `{command, args, env}` callers keep working.
2147
- */
2148
- type McpServerSpec = StdioMcpServerSpec | HttpMcpServerSpec;
2149
- interface StdioMcpServerSpec {
2150
- kind?: 'stdio';
2151
- /**
2152
- * Catalog toolset id this bridge speaks to, when it was spawned for an
2153
- * installed toolset. Wrappers select on this rather than sniffing the
2154
- * command line, because a managed system install spawns
2155
- * `node <home>/system-toolsets/@playwright__mcp@0.0.78/package/cli.js` —
2156
- * `installDirName` has slugified the `/` away, so the package name never
2157
- * appears in `command`/`args`. Sniffing there left every Playwright
2158
- * wrapper inert against the exact copy Gezel manages: the `file:`-URL
2159
- * rewrite never fired, and the local-preview posture advertised a browser
2160
- * surface nothing had pruned.
2161
- */
2162
- toolsetId?: string;
2163
- command: string;
2164
- args: string[];
2165
- env: Record<string, string>;
2166
- /** Working directory for project-local/custom MCP servers. */
2167
- cwd?: string;
2168
- }
2169
- interface HttpMcpServerSpec {
2170
- kind: 'http';
2171
- /** Catalog toolset id — see {@link StdioMcpServerSpec.toolsetId}. */
2172
- toolsetId?: string;
2173
- /**
2174
- * `streamable-http` is the current MCP HTTP transport (one URL,
2175
- * POST for messages, optional GET for SSE stream + auto-reconnect).
2176
- * `sse` is the older two-endpoint variant — kept for back-compat
2177
- * with registry entries that still declare it.
2178
- */
2179
- transport: 'streamable-http' | 'sse';
2180
- url: string;
2181
- /**
2182
- * Headers attached to every request. Bearer tokens, API keys, etc.
2183
- * Resolved from toolset config + secrets at session-build time.
2184
- */
2185
- headers: Record<string, string>;
2186
- }
2233
+
2187
2234
  /** Shape of an OpenAI function tool (Responses API format). */
2188
2235
  interface OpenAIFunctionTool {
2189
2236
  type: 'function';
@@ -2503,6 +2550,12 @@ interface TurnCtx extends ModelCtx {
2503
2550
  userText: string;
2504
2551
  /** Tool calls that drained from the per-turn accumulator. */
2505
2552
  drained: ChatMessageToolCall[];
2553
+ /**
2554
+ * A preceding turn in this task-scoped session successfully read artifact
2555
+ * evidence and persisted its complete result. Adjacent craftbook steps can
2556
+ * deliberately review that replayed evidence without issuing the read again.
2557
+ */
2558
+ verifiedPriorArtifactRead?: boolean;
2506
2559
  /** Final assistant content for the just-completed turn. */
2507
2560
  assistantContent: string;
2508
2561
  /** How many continuation nudges have already fired in this user-initiated send. */
@@ -3588,15 +3641,18 @@ interface SessionOpts {
3588
3641
  error: unknown;
3589
3642
  }) => void;
3590
3643
  /**
3591
- * When present, the bridge pool filters its advertised tools to
3592
- * names in this set. Tools not in the set are hidden from the model
3593
- * (their JSON schemas are never serialized into requests) but the
3594
- * bridge can still call them if invoked by id. Driven by the
3595
- * `toolFilterMode` config + gezel role — see
3596
- * `chat/role-tool-filter.ts`. Unset means "advertise every tool"
3597
- * (pre-filter behavior).
3644
+ * Role-derived ceiling on advertised and callable built-in tools.
3645
+ * Third-party tools are unaffected by this set; an authored step's
3646
+ * toolNamePolicy can constrain those too. The bridge pool retains a
3647
+ * narrow append recovery exception for truncated write_file calls.
3648
+ * See chat/role-tool-filter.ts. Unset adds no role-based restriction.
3598
3649
  */
3599
3650
  toolAllowlist?: Set<string>;
3651
+ /** Authored step ceiling for all bridge tools, including third-party MCP tools. */
3652
+ toolNamePolicy?: {
3653
+ allow?: ReadonlySet<string>;
3654
+ deny?: ReadonlySet<string>;
3655
+ };
3600
3656
  /**
3601
3657
  * The chat manager classified this session's current turn as direct
3602
3658
  * file work and narrowed its tool surface accordingly. Local providers
@@ -3835,6 +3891,8 @@ interface ToolCallEvent {
3835
3891
  * into a short full response or a deterministic summary before persistence.
3836
3892
  */
3837
3893
  resultText?: string;
3894
+ /** True when the bridge clipped the provider-visible text after the MCP tool returned. */
3895
+ deliveredResultTruncated?: boolean;
3838
3896
  /**
3839
3897
  * Image artifacts the tool returned (Playwright `browser_*` screenshots,
3840
3898
  * etc.) — already written to disk by the bridge's image persister, paths
@@ -4828,6 +4886,15 @@ interface NativeEngineLifecycleSnapshot {
4828
4886
  unloadAt: number | null;
4829
4887
  idleTimeoutMs: number;
4830
4888
  releaseReason: 'idle' | 'memory-pressure' | null;
4889
+ /**
4890
+ * When the last start attempt failed, and why. Cleared by the next start
4891
+ * that reaches ready. An engine that never started still holds its pool
4892
+ * reservation, and no idle timer is armed for it (the timer is only ever
4893
+ * reset by a RUNNING engine), so nothing would ever give that memory back
4894
+ * — see `ProviderPool.sweepFailedStarts`.
4895
+ */
4896
+ startFailedAt?: number;
4897
+ startFailure?: string;
4831
4898
  }
4832
4899
 
4833
4900
  interface ProviderBuilderArgs {
@@ -5023,6 +5090,31 @@ declare class ProviderPool {
5023
5090
  touch(key: string): void;
5024
5091
  /** Returns true if the pool currently holds an entry for `key`. */
5025
5092
  has(key: string): boolean;
5093
+ /**
5094
+ * Drop entries whose engine failed to start, releasing the budget they hold.
5095
+ *
5096
+ * The reservation is taken when the builder returns — before the engine
5097
+ * process exists, because the engine starts lazily on the first turn. A
5098
+ * start that then fails (memory admission refused, spawn error, panic
5099
+ * guard) leaves an entry that owns its whole `residentBytes` while running
5100
+ * nothing, and it is never reclaimed on its own: the idle timer that would
5101
+ * eventually release it is only ever armed by an engine that reached
5102
+ * `running`. Observed as a 9.7 GB reservation on a machine whose engine
5103
+ * process count was zero, against an 11.2 GB budget.
5104
+ *
5105
+ * Eviction is the whole repair. The next `ensure` rebuilds, which re-plans
5106
+ * the context window against memory as it stands then rather than handing
5107
+ * back a provider that will fail the same way.
5108
+ */
5109
+ private sweepFailedStarts;
5110
+ /**
5111
+ * Evict pool entries whose supervised native child has already stopped.
5112
+ * Their bytes are capacity guarantees, not physical residency. Keeping the
5113
+ * wrapper cached is useful until another model actually needs that promise;
5114
+ * a capacity denial is the pressure signal that makes the released entries
5115
+ * expendable.
5116
+ */
5117
+ private reclaimReleasedReservations;
5026
5118
  /**
5027
5119
  * Immediately unload one resident engine, but only while it is idle.
5028
5120
  *
@@ -6184,6 +6276,8 @@ interface InstalledMlxModel {
6184
6276
  id: string;
6185
6277
  name: string;
6186
6278
  approxSizeBytes: number;
6279
+ /** Cataloged fixed working set with KV excluded; measured values beat the fallback formula. */
6280
+ residentBytes?: number;
6187
6281
  installedAt: string;
6188
6282
  /** Absolute path to the model directory the supervisor passes to `mlx_lm.server --model`. */
6189
6283
  modelDir: string;
@@ -6322,6 +6416,7 @@ interface MlxModelManagerOptions {
6322
6416
  }
6323
6417
  declare class MlxModelManager {
6324
6418
  private readonly modelsRoot;
6419
+ private readonly viewsRoot;
6325
6420
  private readonly storageRoots;
6326
6421
  private readonly catalog;
6327
6422
  private readonly fetchImpl;
@@ -6792,6 +6887,13 @@ interface PairedRemote {
6792
6887
  tlsCertPem?: string;
6793
6888
  /** Scopes the server granted (currently `['remote-inference']`). */
6794
6889
  scopes: string[];
6890
+ /**
6891
+ * `gezelVersion` from the peer's `/v1/identity`, when it reported one.
6892
+ * Absent for a peer too old to publish it. Read by the native-capacity
6893
+ * authority check, which must know whether the broker deciding this
6894
+ * machine's memory is the same build as the one asking.
6895
+ */
6896
+ gezelVersion?: string;
6795
6897
  pairedAt: number;
6796
6898
  /** Last time A successfully reached this server (in-memory unless flushed). */
6797
6899
  lastSeenAt?: number;
@@ -8918,6 +9020,144 @@ interface EngineContext {
8918
9020
  childProcessSpawn?: SpawnCapability;
8919
9021
  }
8920
9022
 
9023
+ /**
9024
+ * One app's tools for one project, as a chat session sees them.
9025
+ *
9026
+ * Captured when a session builds its bridges, so a turn already in flight
9027
+ * keeps the surface it was told about. `invoke` re-checks liveness against the
9028
+ * registry, which is what keeps a captured binding from becoming a promise
9029
+ * nobody can keep.
9030
+ */
9031
+ interface AppToolBinding {
9032
+ relayId: string;
9033
+ appId: string;
9034
+ appName?: string;
9035
+ projectId: string;
9036
+ gezelIds?: ReadonlySet<string>;
9037
+ tools: readonly AppToolDefinition[];
9038
+ }
9039
+ /** Where relay events are written — an SSE response in production. */
9040
+ interface AppToolRelayStreamSink {
9041
+ write(event: AppToolRelayEvent): void | Promise<void>;
9042
+ }
9043
+ type AppToolInvokeResult = Extract<AppToolCallResultRequest, {
9044
+ ok: true;
9045
+ }> | {
9046
+ ok: false;
9047
+ error: string;
9048
+ };
9049
+ interface AppToolInvocation {
9050
+ tool: string;
9051
+ args: Record<string, unknown>;
9052
+ sessionId: string;
9053
+ gezelId: string;
9054
+ projectId: string;
9055
+ timeoutMs?: number;
9056
+ signal?: AbortSignal;
9057
+ }
9058
+ interface AppToolRelayRegistryOptions {
9059
+ graceMs?: number;
9060
+ heartbeatMs?: number;
9061
+ maxRelaysPerApp?: number;
9062
+ maxPendingPerRelay?: number;
9063
+ now?: () => number;
9064
+ /** Called whenever a project's tool surface changed. */
9065
+ onChange?: (projectId: string) => void;
9066
+ }
9067
+ /**
9068
+ * Live registry of app-registered tools.
9069
+ *
9070
+ * Everything here is in-memory on purpose. A registration is a claim that the
9071
+ * app is standing by to answer calls, and that claim cannot survive a restart
9072
+ * of either side — a persisted one would advertise tools whose handler no
9073
+ * longer exists, which the model experiences as a tool that accepts the call
9074
+ * and then never returns.
9075
+ */
9076
+ declare class AppToolRelayRegistry {
9077
+ private readonly relays;
9078
+ private readonly graceMs;
9079
+ private readonly heartbeatMs;
9080
+ private readonly maxRelaysPerApp;
9081
+ private readonly maxPendingPerRelay;
9082
+ private readonly now;
9083
+ private readonly onChange?;
9084
+ constructor(opts?: AppToolRelayRegistryOptions);
9085
+ get limits(): {
9086
+ graceMs: number;
9087
+ heartbeatMs: number;
9088
+ maxPendingCalls: number;
9089
+ };
9090
+ open(input: {
9091
+ appId: string;
9092
+ appName?: string;
9093
+ label?: string;
9094
+ }): {
9095
+ relayId: string;
9096
+ };
9097
+ /** The relay's owning app, for route-level ownership checks. */
9098
+ ownerOf(relayId: string): string | undefined;
9099
+ has(relayId: string): boolean;
9100
+ /**
9101
+ * Attach an event stream. A second stream for the same relay supersedes the
9102
+ * first: a half-open socket that the OS has not yet torn down must never be
9103
+ * able to lock an app out of its own relay.
9104
+ */
9105
+ attachStream(relayId: string, sink: AppToolRelayStreamSink): {
9106
+ detach: () => void;
9107
+ };
9108
+ detachStream(relayId: string): void;
9109
+ register(relayId: string, request: RegisterAppToolsRequest): {
9110
+ toolsetId: string;
9111
+ registered: string[];
9112
+ };
9113
+ unregister(relayId: string, projectId?: string): void;
9114
+ close(relayId: string, reason: AppToolRelayCloseReason): void;
9115
+ closeAll(reason?: AppToolRelayCloseReason): void;
9116
+ /**
9117
+ * Bindings that apply to one session. A relay inside its grace window still
9118
+ * counts: the tools are about to come back, and dropping them would rebuild
9119
+ * the session's whole tool surface for a two-second socket blip.
9120
+ */
9121
+ listForSession(query: {
9122
+ projectId: string;
9123
+ gezelId: string;
9124
+ }): AppToolBinding[];
9125
+ /**
9126
+ * Stable identity of a project's app-tool surface. The chat manager stores
9127
+ * it on the live session and rebuilds when it moves, so tools registered
9128
+ * after a session opened appear on the next turn.
9129
+ */
9130
+ fingerprint(projectId: string): string;
9131
+ listRelays(filter?: {
9132
+ appId?: string;
9133
+ }): AppToolRelaySummary[];
9134
+ /**
9135
+ * Run one tool in the app and wait for its answer.
9136
+ *
9137
+ * Never queues against a disconnected app: the model is blocked on this
9138
+ * call, so "the app is not connected" is a far better answer than a wait
9139
+ * that ends in a timeout with the same information.
9140
+ */
9141
+ invoke(binding: AppToolBinding, call: AppToolInvocation): Promise<AppToolInvokeResult>;
9142
+ /**
9143
+ * Deliver an app's answer. A late answer for a call that already timed out
9144
+ * reports `unknown` rather than being applied — the model has moved on, and
9145
+ * silently accepting it would leave the app believing it was used.
9146
+ */
9147
+ resolveCall(relayId: string, callId: string, result: AppToolCallResultRequest): 'resolved' | 'unknown';
9148
+ private require;
9149
+ private findConflict;
9150
+ private failPending;
9151
+ /**
9152
+ * Best-effort notification. A relay inside its grace window has no stream to
9153
+ * write to, and that is not an error: the app is between connections, and
9154
+ * its registration is deliberately still live. Only {@link invoke} needs a
9155
+ * connected app, and it checks for one itself before emitting.
9156
+ */
9157
+ private emit;
9158
+ private emitTo;
9159
+ }
9160
+
8921
9161
  type SessionListener = (event: ChatEvent) => void;
8922
9162
  type EnvelopeListener = (envelope: ChatEventEnvelope) => void;
8923
9163
  interface PublishScope {
@@ -10688,6 +10928,16 @@ interface GateEvalDeps {
10688
10928
  at?: string;
10689
10929
  }>;
10690
10930
  }>;
10931
+ /** Service-written successful artifact read ranges for the current task step. */
10932
+ corpusReadEvidence?: () => Promise<{
10933
+ observable: boolean;
10934
+ slices: Array<{
10935
+ path: string;
10936
+ startLine: number;
10937
+ endLine: number;
10938
+ totalLines: number;
10939
+ }>;
10940
+ }>;
10691
10941
  /**
10692
10942
  * Run receipts for `commandEvidence`. The task manager scopes this to
10693
10943
  * the current task, step, and activation timestamp, reading the
@@ -10909,6 +11159,8 @@ type StepActivatedHook = (ctx: {
10909
11159
  newStep: TaskCraftbookStep;
10910
11160
  /** The step that was just completed (may equal newStep on loopback). */
10911
11161
  completedStep: TaskCraftbookStep;
11162
+ /** A spawned task's first step is an entry, not a self-handoff. */
11163
+ kind?: 'entry' | 'transition' | 'redispatch';
10912
11164
  }) => Promise<void> | void;
10913
11165
  /**
10914
11166
  * Fired when a completion gate re-activates a step but the model turn that
@@ -10948,6 +11200,12 @@ type TaskSettledHook = (ctx: {
10948
11200
  task: Task;
10949
11201
  outcome: 'complete' | 'canceled';
10950
11202
  }) => Promise<void> | void;
11203
+ /** Fired after the durable status changes, including draft activation. */
11204
+ type TaskStatusChangedHook = (ctx: {
11205
+ projectId: string;
11206
+ task: Task;
11207
+ previousStatus: TaskStatus;
11208
+ }) => Promise<void> | void;
10951
11209
  type TaskNeedsHelpReason = 'gate_exhausted' | 'gate_plateau' | 'gate_unsatisfiable' | 'gate_infrastructure' | 'step_exit_infrastructure' | 'step_stalled' | 'budget_exhausted';
10952
11210
  /**
10953
11211
  * Fired when a task PAUSES FOR HELP — a gate budget spent, a plateau, an
@@ -11043,6 +11301,7 @@ declare class TaskManager {
11043
11301
  private onCurrentTurnStepReactivated?;
11044
11302
  private onTaskCreated?;
11045
11303
  private onTaskSettled?;
11304
+ private onTaskStatusChanged?;
11046
11305
  private onTaskNeedsHelp?;
11047
11306
  private onConnectorPrep?;
11048
11307
  private readonly autoPreparedConnectorTypes;
@@ -11140,6 +11399,7 @@ declare class TaskManager {
11140
11399
  /** Register the task-created hook (script install lives here). */
11141
11400
  setTaskCreatedHook(fn: TaskCreatedHook): void;
11142
11401
  setTaskSettledHook(fn: TaskSettledHook): void;
11402
+ setTaskStatusChangedHook(fn: TaskStatusChangedHook): void;
11143
11403
  setTaskNeedsHelpHook(fn: TaskNeedsHelpHook): void;
11144
11404
  /**
11145
11405
  * Wire the connector-prep hook — pulls a craftbook's declared connector
@@ -11163,6 +11423,7 @@ declare class TaskManager {
11163
11423
  detail: string;
11164
11424
  }): Promise<void>;
11165
11425
  private notifyTaskSettled;
11426
+ private notifyTaskStatusChanged;
11166
11427
  /**
11167
11428
  * Wire the role resolver — turns a step's `suggestedRole` into a
11168
11429
  * concrete gezel id at step-activation time. When unset, role-based
@@ -11565,6 +11826,8 @@ declare class TaskManager {
11565
11826
  recordNightShiftSpawn(ref: string, dayKey: string): Promise<void>;
11566
11827
  describeAssignee: typeof describeAssignee;
11567
11828
  private requireTask;
11829
+ private withEffectiveStatus;
11830
+ private effectiveStatusFor;
11568
11831
  }
11569
11832
 
11570
11833
  /**
@@ -11779,6 +12042,8 @@ declare class ScriptRunner {
11779
12042
  * path, as does a version the catalog no longer serves.
11780
12043
  */
11781
12044
  private isProvenanceTrusted;
12045
+ /** A model cannot grant trust by editing a script or supplying an invocation argument. */
12046
+ private isCliTrustedSource;
11782
12047
  private vendorSdk;
11783
12048
  private runSandbox;
11784
12049
  private persistRun;
@@ -12381,6 +12646,12 @@ interface ChatManagerOptions {
12381
12646
  store: Store;
12382
12647
  events: ChatEventBus;
12383
12648
  memory: MemoryManager;
12649
+ /**
12650
+ * Live tools registered by connected apps (see app-tools/relay-registry).
12651
+ * Optional so tests and headless embedders can omit it; absent simply
12652
+ * means no app tools reach any session.
12653
+ */
12654
+ appToolRelays?: AppToolRelayRegistry;
12384
12655
  getPort: () => number;
12385
12656
  getToken: () => string;
12386
12657
  /**
@@ -12874,6 +13145,7 @@ declare class ChatManager extends LocalEngineRuntime {
12874
13145
  readonly usageTracker: UsageTracker;
12875
13146
  readonly telemetry: SessionTelemetryTracker;
12876
13147
  private telemetryGpuUnsub;
13148
+ private readonly appToolRelays;
12877
13149
  constructor(opts: ChatManagerOptions);
12878
13150
  /** PUT /api/config calls this to keep the in-memory cache in sync. */
12879
13151
  setEngagementMode(mode: AIEngagementMode): void;
@@ -13169,8 +13441,13 @@ declare class ChatManager extends LocalEngineRuntime {
13169
13441
  * background work (the boekwachter enrichment loop) that should never
13170
13442
  * compete with live chat. */
13171
13443
  isAnyActive(): boolean;
13172
- /** True while a specific session is running or has an unstarted send. */
13173
- private isSessionTurnPending;
13444
+ /**
13445
+ * True while a specific session is running or has an unstarted send,
13446
+ * including cold setup before its live state exists. Lifecycle callers
13447
+ * must use this rather than listInflight(), whose display records require
13448
+ * that state and can omit a turn while ensureState is still initializing.
13449
+ */
13450
+ isSessionTurnPending(sessionId: string): boolean;
13174
13451
  /**
13175
13452
  * Returns true when any session owned by `gezelId` has a turn in
13176
13453
  * flight right now, regardless of project. A gezel can only think
@@ -13378,6 +13655,8 @@ declare class ChatManager extends LocalEngineRuntime {
13378
13655
  * toolsets.
13379
13656
  */
13380
13657
  autoAllowedToolsForSession(sessionId: string): Promise<Set<string>>;
13658
+ /** Runtime task read whose lifecycle includes recursive parent inheritance. */
13659
+ private readEffectiveTask;
13381
13660
  /**
13382
13661
  * Snapshot what the model would receive on the next turn for this
13383
13662
  * session — exact system prompt + recent message thread + the
@@ -13541,8 +13820,15 @@ declare class ChatManager extends LocalEngineRuntime {
13541
13820
  */
13542
13821
  private resolveRoutedModelForHandoff;
13543
13822
  /**
13544
- * Spin up a fresh session for the next gezel in a task step handoff
13545
- * and kick off the first turn in the background. Used by
13823
+ * Start the next gezel in a task step handoff and kick off its first turn
13824
+ * in the background. A handoff to a different gezel opens a fresh session.
13825
+ * Adjacent steps owned by the same gezel keep one task-scoped session so a
13826
+ * deterministic evidence step (for example, opening an assigned patch)
13827
+ * remains in context for the reasoning step that consumes it. The session
13828
+ * is re-pinned and rebuilt only after the prior turn is idle, because each
13829
+ * step may expose a different exact tool surface.
13830
+ *
13831
+ * Used by
13546
13832
  * `TaskManager.completeStep`'s auto-handoff hook so advancing a step
13547
13833
  * doesn't just flip state — it actually puts the assignee to work.
13548
13834
  *
@@ -13609,7 +13895,8 @@ declare class ChatManager extends LocalEngineRuntime {
13609
13895
  }>;
13610
13896
  /**
13611
13897
  * Lightweight "ping another gezel" path. Unlike `startHandoffSession`
13612
- * (which is anchored to a task + phase and always opens a fresh session),
13898
+ * (which is anchored to a task + phase and opens a fresh session when the
13899
+ * assignee changes),
13613
13900
  * `messageGezel` drops a message into the target gezel's *active* project
13614
13901
  * session via `ensureOrCreateSession`, so the continuity of their thread
13615
13902
  * is preserved. Internal task re-drives may also pass `taskRef` + `stepId`
@@ -14554,6 +14841,12 @@ declare class ChatManager extends LocalEngineRuntime {
14554
14841
  providerForGezel(gezelId: string, opts?: {
14555
14842
  nightShift?: boolean;
14556
14843
  }): Promise<ProviderName>;
14844
+ /**
14845
+ * Cheap, side-effect-free route preview for the composer. The send path
14846
+ * recomputes the same plan authoritatively; this endpoint exists so users
14847
+ * can see and tune the heuristic before committing the turn.
14848
+ */
14849
+ previewTurnIntent(input: TurnIntentPreviewRequest): Promise<TurnIntentPlan>;
14557
14850
  /**
14558
14851
  * Concurrent one-shot width for a provider: its queue's configured
14559
14852
  * concurrency once initialized (singleton or pooled local engine), else 1.
@@ -14850,6 +15143,18 @@ declare class ChatManager extends LocalEngineRuntime {
14850
15143
  */
14851
15144
  private resolveTurnLibraryRecall;
14852
15145
  private resolveTurnProjectRetrieval;
15146
+ /** Identity of the app-tool surface for a project; '' when no app offers any. */
15147
+ private appToolsFingerprint;
15148
+ /**
15149
+ * App-registered tools that apply to this session.
15150
+ *
15151
+ * Withheld from two kinds of session. A **visitor** session (app-serve) is
15152
+ * an untrusted guest of the project and never sees any extra toolset. A
15153
+ * provider that runs its own tool loop outside our bridge (Copilot, the CLI
15154
+ * providers) cannot reach an in-process server at all, so offering the tools
15155
+ * in its prompt would advertise names it could never call.
15156
+ */
15157
+ private appToolBindingsFor;
14853
15158
  private resolveUserPromptPrelude;
14854
15159
  /**
14855
15160
  * Get or build the live state for a session. On first use after process
@@ -14873,6 +15178,7 @@ declare class ChatManager extends LocalEngineRuntime {
14873
15178
  private scenarioFileRepairConstraintActive;
14874
15179
  private directFileWorkConstraintActive;
14875
15180
  private projectOrchestrationConstraintActive;
15181
+ private exactCraftbookConstraintActive;
14876
15182
  private staleWorkspaceFileRequest;
14877
15183
  /**
14878
15184
  * After bridges spawn, re-render the system prompt's tools block
@@ -15420,12 +15726,13 @@ type FolderScope = 'documents' | 'gezels' | 'projects';
15420
15726
 
15421
15727
  type MoveJobStatus = 'queued' | 'running' | 'done' | 'error' | 'cancelled';
15422
15728
  type MoveJobPhase = 'scan' | 'backup' | 'copy' | 'verify' | 'swap' | 'cleanup' | 'prune';
15729
+ type FolderMovePolicy = 'overwrite-all' | 'skip-all' | 'use-destination';
15423
15730
  interface MoveJob {
15424
15731
  id: string;
15425
15732
  scope: FolderScope;
15426
15733
  sourcePath: string;
15427
15734
  destPath: string;
15428
- conflictPolicy: 'overwrite-all' | 'skip-all';
15735
+ conflictPolicy: FolderMovePolicy;
15429
15736
  status: MoveJobStatus;
15430
15737
  phase?: MoveJobPhase;
15431
15738
  filesDone: number;
@@ -15446,6 +15753,9 @@ declare class JobManager {
15446
15753
  private readonly jobs;
15447
15754
  create(input: Pick<MoveJob, 'scope' | 'sourcePath' | 'destPath' | 'conflictPolicy'>): MoveJob;
15448
15755
  get(id: string): MoveJob | undefined;
15756
+ /** Most recently created job, including its terminal state. The folders
15757
+ * settings view uses this to recover progress after it is remounted. */
15758
+ latest(): MoveJob | undefined;
15449
15759
  /** True when at least one job is in `queued` or `running` state. The
15450
15760
  * HTTP layer rejects new moves while a job is active to keep semantics
15451
15761
  * simple — only one externalization in flight at a time. */
@@ -16209,6 +16519,25 @@ interface TaskRunnerDispatcher {
16209
16519
  * conservative one-wide admission fallback. Optional for test dispatchers.
16210
16520
  */
16211
16521
  ensureProvider?(name: ProviderName): Promise<LLMProvider | null>;
16522
+ /**
16523
+ * Read-only capacity for pool-routed local providers. Their model-specific
16524
+ * provider queues are not addressable through `getProvider(name)`, but the
16525
+ * resident pool can fold those queues into one provider-level summary.
16526
+ */
16527
+ getPooledProviderQueueSummary?(name: ProviderName): {
16528
+ running: number;
16529
+ runningBackground: number;
16530
+ queuedInteractive: number;
16531
+ queuedBackground: number;
16532
+ backgroundConcurrency: number;
16533
+ maxConcurrency: number;
16534
+ active: Array<{
16535
+ sessionId?: string;
16536
+ }>;
16537
+ pending: Array<{
16538
+ sessionId?: string;
16539
+ }>;
16540
+ } | null;
16212
16541
  }
16213
16542
  interface TaskRunnerOptions {
16214
16543
  store: Store;
@@ -16281,6 +16610,14 @@ declare class TaskRunner {
16281
16610
  private readonly nightQuotaHold;
16282
16611
  private readonly pending;
16283
16612
  private readonly activeDispatches;
16613
+ /**
16614
+ * Child tasks admitted into one declarative-fanout cohort. Admission lasts
16615
+ * for the child's whole task, not one step, so a two-step shard completes
16616
+ * read → review before the scheduler opens another sibling and displaces
16617
+ * its local-model prefix cache. Keyed by parent + provider because those
16618
+ * are the resources whose live background width defines the window.
16619
+ */
16620
+ private readonly fanoutAdmissions;
16284
16621
  private nextId;
16285
16622
  /** Why `dispatchable` work isn't moving, as of the last tick. */
16286
16623
  private holdReason;
@@ -17317,6 +17654,8 @@ declare class KnowledgeManager {
17317
17654
  maxResults: number;
17318
17655
  projectId?: string;
17319
17656
  }): Promise<UnifiedSearchResult[]>;
17657
+ /** A document the lexical arms named but no chunk carries: cite it with its lead paragraph. */
17658
+ private toDocumentResult;
17320
17659
  /** A profile's query vector, or undefined when its model is unavailable (that group searches FTS). */
17321
17660
  private embedForProfile;
17322
17661
  private toResult;
@@ -18586,6 +18925,12 @@ interface OllamaEmulationController {
18586
18925
  interface ServiceContext extends EngineContext {
18587
18926
  store: Store;
18588
18927
  chatEvents: ChatEventBus;
18928
+ /**
18929
+ * Tools connected apps register at runtime and answer themselves. Lives in
18930
+ * memory only: a registration is a claim the app is standing by, which no
18931
+ * restart can carry across.
18932
+ */
18933
+ appToolRelays: AppToolRelayRegistry;
18589
18934
  chat: ChatManager;
18590
18935
  /** Iframe-shim runtime errors, looped back into chat preludes. */
18591
18936
  previewLog: PreviewLogBuffer;