clay-server 5.2.0-beta.4 → 5.2.0-beta.6

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 (301) hide show
  1. package/lib/account-auth-socket.js +1 -0
  2. package/lib/builtin-mates.js +17 -14
  3. package/lib/canonical-clay-record-authority.js +15 -0
  4. package/lib/canonical-clay-scheduling-authority.js +19 -0
  5. package/lib/claude-hook-installer.js +1 -239
  6. package/lib/claude-jsonl-watcher.js +1 -204
  7. package/lib/clay-mate-chat-receipts.js +26 -0
  8. package/lib/clay-mate-chat.js +87 -0
  9. package/lib/clay-mate-knowledge-input.js +26 -0
  10. package/lib/clay-mate-knowledge.js +95 -0
  11. package/lib/clay-mate-lifecycle.js +95 -0
  12. package/lib/clay-product-control-input.js +33 -0
  13. package/lib/clay-product-control-tools.js +51 -0
  14. package/lib/clay-product-control.js +237 -0
  15. package/lib/clay-project-lifecycle.js +154 -0
  16. package/lib/clay-project-record-input.js +44 -0
  17. package/lib/clay-project-records.js +83 -0
  18. package/lib/clay-scheduling-input.js +21 -0
  19. package/lib/clay-scheduling-receipts.js +26 -0
  20. package/lib/clay-scheduling.js +119 -0
  21. package/lib/clay-screen-controls.js +96 -0
  22. package/lib/clay-skill-install.js +1 -33
  23. package/lib/clay-workspace-controls.js +83 -0
  24. package/lib/clay-workspace-input.js +17 -0
  25. package/lib/clay-workspace-receipts.js +26 -0
  26. package/lib/cli-sessions.js +1 -300
  27. package/lib/codex-defaults.js +1 -28
  28. package/lib/context-usage.js +3 -2
  29. package/lib/daemon-project-access.js +11 -0
  30. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  31. package/lib/daemon-project-lifecycle.js +262 -0
  32. package/lib/daemon-projects.js +1 -1
  33. package/lib/daemon.js +78 -276
  34. package/lib/default-ai-runtime.js +4 -8
  35. package/lib/email-mcp-server.js +1 -1
  36. package/lib/issues-service.js +29 -15
  37. package/lib/kiro-defaults.js +1 -22
  38. package/lib/knowledge-db-import.js +5 -4
  39. package/lib/knowledge-db-service.js +9 -6
  40. package/lib/knowledge-document-index.js +2 -1
  41. package/lib/knowledge-product-operations.js +46 -0
  42. package/lib/mate-creation-mcp-server.js +2 -0
  43. package/lib/mate-knowledge-canonical-access.js +10 -0
  44. package/lib/mate-knowledge-service.js +7 -4
  45. package/lib/mate-lifecycle-service.js +94 -0
  46. package/lib/mate-message-delivery.js +43 -0
  47. package/lib/mate-ready-creation.js +9 -1
  48. package/lib/mate-schedule-input.js +29 -0
  49. package/lib/mate-schedule-lifecycle.js +151 -0
  50. package/lib/mate-scheduling.js +103 -0
  51. package/lib/mates.js +4 -3
  52. package/lib/mcp-proxy.js +2 -32
  53. package/lib/mcp-query-bridge.js +1 -1
  54. package/lib/mcp-source-adapters.js +1 -91
  55. package/lib/mcp-source-context.js +1 -42
  56. package/lib/mcp-source-discovery.js +1 -169
  57. package/lib/mcp-source-plugins.js +1 -68
  58. package/lib/mcp-source-restrictions.js +1 -47
  59. package/lib/mcp-tool-policy.js +1 -26
  60. package/lib/notes-checklist.js +50 -0
  61. package/lib/notes.js +49 -3
  62. package/lib/os-user-diagnostics.js +2 -4
  63. package/lib/os-users.js +24 -70
  64. package/lib/project-admin-overview.js +51 -0
  65. package/lib/project-ask-user.js +4 -2
  66. package/lib/project-connection.js +8 -7
  67. package/lib/project-delegated-follow-up.js +2 -1
  68. package/lib/project-directory-claim.js +65 -0
  69. package/lib/project-file-operations.js +61 -0
  70. package/lib/project-filesystem.js +13 -87
  71. package/lib/project-full-access.js +23 -2
  72. package/lib/project-http.js +4 -4
  73. package/lib/project-knowledge.js +32 -18
  74. package/lib/project-lifecycle-operations.js +98 -0
  75. package/lib/project-lifecycle-process-witness.js +32 -0
  76. package/lib/project-lifecycle-runtime.js +50 -0
  77. package/lib/project-linux-access.js +22 -0
  78. package/lib/project-logs-canonical-clay.js +27 -0
  79. package/lib/project-logs-clay-query.js +16 -0
  80. package/lib/project-logs-schema.js +4 -2
  81. package/lib/project-logs-service.js +8 -7
  82. package/lib/project-logs.js +1 -0
  83. package/lib/project-loop.js +1 -0
  84. package/lib/project-mate-chat-control.js +55 -0
  85. package/lib/project-mate-creation-proposal.js +18 -3
  86. package/lib/project-mcp.js +2 -2
  87. package/lib/project-models.js +14 -31
  88. package/lib/project-notifications.js +74 -16
  89. package/lib/project-ownership.js +77 -0
  90. package/lib/project-pair-result-delivery.js +14 -3
  91. package/lib/project-pair-usage.js +12 -13
  92. package/lib/project-pending-message-queue.js +4 -1
  93. package/lib/project-product-control.js +87 -0
  94. package/lib/project-product-session-queue.js +46 -0
  95. package/lib/project-push-access.js +28 -0
  96. package/lib/project-scheduled-message-queue.js +30 -0
  97. package/lib/project-scheduled-messages.js +63 -64
  98. package/lib/project-scheduled-task-control.js +83 -0
  99. package/lib/project-scheduled-tasks.js +13 -2
  100. package/lib/project-scheduling-access.js +10 -0
  101. package/lib/project-session-actions.js +65 -0
  102. package/lib/project-session-delete.js +8 -1
  103. package/lib/project-session-github.js +47 -12
  104. package/lib/project-session-history-actions.js +167 -0
  105. package/lib/project-session-pair.js +1 -1
  106. package/lib/project-session-runtime-actions.js +64 -0
  107. package/lib/project-session-spawn.js +2 -3
  108. package/lib/project-session-vendor.js +55 -0
  109. package/lib/project-sessions.js +82 -267
  110. package/lib/project-user-message.js +31 -1
  111. package/lib/project-vendor-login.js +6 -36
  112. package/lib/project-workspace-operations.js +126 -0
  113. package/lib/project-workspace-query.js +9 -2
  114. package/lib/project.js +95 -3
  115. package/lib/public/app.js +1 -0
  116. package/lib/public/css/clay-tool-activity.css +51 -0
  117. package/lib/public/css/home-mate-creation.css +5 -0
  118. package/lib/public/css/messages.css +6 -2
  119. package/lib/public/css/overlays.css +4 -2
  120. package/lib/public/css/project-admin-overview.css +13 -0
  121. package/lib/public/css/session-folders.css +11 -0
  122. package/lib/public/css/session-github.css +3 -0
  123. package/lib/public/css/sticky-notes.css +61 -1
  124. package/lib/public/index.html +1 -1
  125. package/lib/public/modules/admin-settings-projects.js +6 -2
  126. package/lib/public/modules/app-connection.js +8 -1
  127. package/lib/public/modules/app-favicon.js +11 -2
  128. package/lib/public/modules/app-header.js +4 -2
  129. package/lib/public/modules/app-loop-ui.js +2 -0
  130. package/lib/public/modules/app-message-router.js +1 -1
  131. package/lib/public/modules/app-messages.js +54 -8
  132. package/lib/public/modules/app-notifications.js +1 -2
  133. package/lib/public/modules/app-panels.js +61 -123
  134. package/lib/public/modules/app-projects.js +5 -0
  135. package/lib/public/modules/app-rate-limit.js +7 -27
  136. package/lib/public/modules/chat-render-runtime.js +3 -0
  137. package/lib/public/modules/clay-owner-navigation.js +27 -0
  138. package/lib/public/modules/clay-tool-activity.js +140 -0
  139. package/lib/public/modules/clay-tool-presentation.js +338 -0
  140. package/lib/public/modules/command-palette.js +1 -1
  141. package/lib/public/modules/default-ai.js +11 -3
  142. package/lib/public/modules/home-debate-planning.js +5 -5
  143. package/lib/public/modules/home-mate-chat.js +8 -6
  144. package/lib/public/modules/home-mate-creation.js +73 -1
  145. package/lib/public/modules/mcp-connection-view.js +1 -1
  146. package/lib/public/modules/permission-control.js +5 -4
  147. package/lib/public/modules/personal-settings-dialog.js +7 -1
  148. package/lib/public/modules/project-access-recovery.js +17 -0
  149. package/lib/public/modules/project-admin-overview.js +21 -0
  150. package/lib/public/modules/scheduler.js +2 -0
  151. package/lib/public/modules/session-create-form.js +10 -10
  152. package/lib/public/modules/session-folder-layout.js +1 -1
  153. package/lib/public/modules/session-folder-view-menu.js +9 -0
  154. package/lib/public/modules/session-github.js +65 -8
  155. package/lib/public/modules/settings-defaults.js +27 -28
  156. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  157. package/lib/public/modules/sticky-note-markdown.js +72 -6
  158. package/lib/public/modules/sticky-notes-actions.js +30 -0
  159. package/lib/public/modules/sticky-notes-browser.js +9 -2
  160. package/lib/public/modules/sticky-notes-card.js +23 -7
  161. package/lib/public/modules/sticky-notes-checklist.js +71 -0
  162. package/lib/public/modules/sticky-notes-editor.js +108 -44
  163. package/lib/public/modules/sticky-notes-shared.js +50 -2
  164. package/lib/public/modules/sticky-notes-state.js +66 -0
  165. package/lib/public/modules/sticky-notes.js +34 -51
  166. package/lib/public/modules/thinking-lifecycle.js +33 -3
  167. package/lib/public/modules/thinking-view.js +23 -1
  168. package/lib/public/modules/tools.js +36 -7
  169. package/lib/public/modules/tui-grab.js +1 -2
  170. package/lib/public/modules/user-settings-appearance.js +10 -3
  171. package/lib/public/modules/user-settings-editors.js +1 -1
  172. package/lib/public/modules/user-settings-layout.js +11 -2
  173. package/lib/public/modules/user-settings-preferences.js +6 -2
  174. package/lib/public/modules/user-settings-profile.js +12 -2
  175. package/lib/public/modules/user-settings.js +3 -2
  176. package/lib/public/modules/vendor-login-browser.js +5 -3
  177. package/lib/public/modules/vendor-login.js +2 -2
  178. package/lib/public/modules/vendor-priority.js +15 -1
  179. package/lib/public/muse-avatar.svg +4 -0
  180. package/lib/public/style.css +2 -0
  181. package/lib/safe-bash-commands.js +3 -45
  182. package/lib/scheduled-task-records.js +3 -1
  183. package/lib/scheduler.js +2 -0
  184. package/lib/sdk-bridge.js +334 -403
  185. package/lib/sdk-foreground-admission.js +16 -0
  186. package/lib/sdk-mcp-descriptors.js +2 -37
  187. package/lib/sdk-message-processor.js +52 -17
  188. package/lib/sdk-quota-snapshot.js +1 -1
  189. package/lib/sdk-response-recovery.js +1 -0
  190. package/lib/sdk-worker.js +2 -677
  191. package/lib/server-admin.js +63 -16
  192. package/lib/server-dm.js +1 -1
  193. package/lib/server-global-ws.js +10 -20
  194. package/lib/server-home-chat-events.js +7 -3
  195. package/lib/server-home-chat.js +4 -16
  196. package/lib/server-home-mate-creation.js +1 -0
  197. package/lib/server-home-mcp-consent.js +3 -3
  198. package/lib/server-mates.js +25 -67
  199. package/lib/server-owner-ui.js +77 -0
  200. package/lib/server-path-access.js +38 -0
  201. package/lib/server-project-removal.js +22 -0
  202. package/lib/server.js +100 -30
  203. package/lib/session-config-transition.js +45 -0
  204. package/lib/session-folders.js +7 -2
  205. package/lib/session-fork-history.js +21 -0
  206. package/lib/session-github.js +9 -2
  207. package/lib/session-hygiene.js +3 -35
  208. package/lib/session-permission-mode.js +4 -3
  209. package/lib/session-skill-scope.js +11 -0
  210. package/lib/session-visibility.js +5 -2
  211. package/lib/sessions.js +27 -89
  212. package/lib/terminal-manager.js +52 -0
  213. package/lib/tool-llm.js +1 -1
  214. package/lib/tui-transcript-index.js +1 -132
  215. package/lib/users-permissions.js +2 -8
  216. package/lib/users.js +4 -0
  217. package/lib/vendor-login-browser.js +1 -11
  218. package/lib/workspace-query-access.js +4 -1
  219. package/lib/ws-schema.js +8 -2
  220. package/lib/yoke/acp-agent-profiles.js +5 -3
  221. package/lib/yoke/adapters/antigravity.js +3 -14
  222. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  223. package/lib/yoke/adapters/claude.js +54 -50
  224. package/lib/yoke/adapters/codex-query-contract.js +24 -0
  225. package/lib/yoke/adapters/codex.js +53 -111
  226. package/lib/yoke/adapters/kiro.js +3 -1
  227. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  228. package/lib/yoke/adapters/muse.js +122 -0
  229. package/lib/yoke/auth-events.js +17 -0
  230. package/lib/yoke/claude-hook-installer.js +267 -0
  231. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  232. package/lib/yoke/claude-maintenance.js +55 -0
  233. package/lib/yoke/claude-permission-patterns.js +53 -0
  234. package/lib/yoke/claude-response-recovery.js +155 -0
  235. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  236. package/lib/yoke/claude-worker-startup.js +28 -0
  237. package/lib/yoke/clay-skill-install.js +33 -0
  238. package/lib/yoke/cli-sessions.js +300 -0
  239. package/lib/yoke/codex-app-server.js +7 -12
  240. package/lib/yoke/codex-idle-recovery.js +81 -1
  241. package/lib/yoke/codex-recovery-admission.js +164 -0
  242. package/lib/yoke/configuration.js +13 -0
  243. package/lib/yoke/discovery.js +70 -0
  244. package/lib/yoke/errors.js +8 -0
  245. package/lib/yoke/host-environment.js +7 -0
  246. package/lib/yoke/index.js +9 -51
  247. package/lib/yoke/interface.js +116 -0
  248. package/lib/yoke/kiro-acp-server.js +5 -5
  249. package/lib/yoke/legacy-sessions.js +89 -0
  250. package/lib/yoke/login-protocol.js +25 -0
  251. package/lib/yoke/maintenance.js +12 -0
  252. package/lib/yoke/mcp-proxy.js +32 -0
  253. package/lib/yoke/mcp-source-adapters.js +91 -0
  254. package/lib/yoke/mcp-source-context.js +42 -0
  255. package/lib/yoke/mcp-source-discovery.js +169 -0
  256. package/lib/yoke/mcp-source-plugins.js +68 -0
  257. package/lib/yoke/mcp-source-restrictions.js +47 -0
  258. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  259. package/lib/yoke/model-preferences.js +6 -0
  260. package/lib/yoke/muse-artifacts.js +36 -0
  261. package/lib/yoke/muse-controls.js +50 -0
  262. package/lib/yoke/muse-input.js +64 -0
  263. package/lib/yoke/muse-items.js +157 -0
  264. package/lib/yoke/muse-policy.js +52 -0
  265. package/lib/yoke/muse-query.js +428 -0
  266. package/lib/yoke/muse-runtime.js +211 -0
  267. package/lib/yoke/muse-services.js +79 -0
  268. package/lib/yoke/muse-skills.js +79 -0
  269. package/lib/yoke/muse-turns.js +71 -0
  270. package/lib/yoke/options/acp.js +2 -0
  271. package/lib/yoke/options/antigravity.js +2 -0
  272. package/lib/yoke/options/claude.js +21 -0
  273. package/lib/yoke/options/codex-defaults.js +29 -0
  274. package/lib/yoke/options/codex-settings.js +21 -0
  275. package/lib/yoke/options/codex.js +6 -0
  276. package/lib/yoke/options/kiro-defaults.js +22 -0
  277. package/lib/yoke/options/kiro.js +5 -0
  278. package/lib/yoke/options/muse.js +5 -0
  279. package/lib/yoke/provider-contract.js +5 -0
  280. package/lib/yoke/providers/antigravity-executable.js +8 -0
  281. package/lib/yoke/providers/claude-executable.js +40 -0
  282. package/lib/yoke/providers/claude-model-descriptions.js +14 -0
  283. package/lib/yoke/providers/claude-process.js +97 -0
  284. package/lib/yoke/providers/claude-provision.js +75 -0
  285. package/lib/yoke/providers/codex-errors.js +8 -0
  286. package/lib/yoke/providers/muse-executable.js +17 -0
  287. package/lib/yoke/provisioning.js +6 -0
  288. package/lib/yoke/query-options.js +10 -0
  289. package/lib/yoke/response-recovery.js +41 -0
  290. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  291. package/lib/yoke/sdk-server-factory.js +7 -0
  292. package/lib/yoke/session-history.js +8 -0
  293. package/lib/yoke/session-tool-transport.js +34 -13
  294. package/lib/yoke/settings.js +23 -0
  295. package/lib/yoke/source-locations.js +4 -0
  296. package/lib/yoke/title-query.js +18 -7
  297. package/lib/yoke/tui-transcript-index.js +132 -0
  298. package/lib/yoke/usage.js +48 -0
  299. package/lib/yoke/user-input.js +13 -0
  300. package/lib/yoke/vendor-registry.js +81 -1
  301. package/package.json +3 -2
@@ -4,6 +4,7 @@
4
4
  // This is the ONLY file (besides claude-worker.js) that imports the SDK.
5
5
  // Also manages worker processes for OS-level user isolation.
6
6
 
7
+ var attachWorkerStartup = require("../claude-worker-startup").attachWorkerStartup;
7
8
  var bindQueryAbort = require("../query-abort").bindAbort;
8
9
  var path = require("path");
9
10
  var fs = require("fs");
@@ -527,7 +528,7 @@ function flattenEvent(raw) {
527
528
  // --- rate_limit_event ---
528
529
  if (raw.type === "rate_limit_event" && raw.rate_limit_info) {
529
530
  base.yokeType = "rate_limit";
530
- base.rateLimitInfo = raw.rate_limit_info;
531
+ base.rateLimitInfo = Object.assign({}, raw.rate_limit_info, { isUsingOverage: raw.rate_limit_info.isUsingOverage === true || raw.rate_limit_info.overageInUse === true });
531
532
  return base;
532
533
  }
533
534
 
@@ -600,6 +601,8 @@ function createQueryHandle(rawQuery, messageQueue, abortController) {
600
601
  var correlation = claudeCorrelation.createCorrelation();
601
602
  var closed = false;
602
603
  var removeAbort = function () {};
604
+ var resolveStopped;
605
+ var stopped = new Promise(function(resolve) { resolveStopped = resolve; });
603
606
  var handle = {
604
607
  // Opaque adapter state (null for in-process queries)
605
608
  _adapterState: null,
@@ -610,12 +613,13 @@ function createQueryHandle(rawQuery, messageQueue, abortController) {
610
613
  return {
611
614
  next: function() {
612
615
  return rawIter.next().then(function(result) {
613
- if (result.done) { closed = true; removeAbort(); }
616
+ if (result.done) { closed = true; removeAbort(); resolveStopped(); }
614
617
  if (result.done) return result;
615
618
  return { value: correlation.result(result.value, flattenEvent(result.value)), done: false };
616
619
  }, function(err) {
617
620
  closed = true;
618
621
  removeAbort();
622
+ resolveStopped();
619
623
  throw err;
620
624
  });
621
625
  },
@@ -715,6 +719,11 @@ function createQueryHandle(rawQuery, messageQueue, abortController) {
715
719
  }
716
720
  },
717
721
 
722
+ stopAndWait: function() {
723
+ handle.abort();
724
+ return stopped;
725
+ },
726
+
718
727
  close: function() {
719
728
  closed = true;
720
729
  removeAbort();
@@ -818,9 +827,7 @@ function spawnWorker(linuxUser, workerScriptPath, cwd) {
818
827
  buffer: "",
819
828
  };
820
829
 
821
- worker.readyPromise = new Promise(function(resolve) {
822
- worker._readyResolve = resolve;
823
- });
830
+ attachWorkerStartup(worker);
824
831
 
825
832
  // Resolves when the worker process actually exits.
826
833
  // Used to prevent spawning a new worker before the old one finishes
@@ -860,7 +867,15 @@ function spawnWorker(linuxUser, workerScriptPath, cwd) {
860
867
  });
861
868
  connection.on("error", function(err) {
862
869
  console.error("[yoke/claude] Worker connection error:", err.message);
870
+ if (worker._readyReject) worker._readyReject(err);
863
871
  });
872
+ connection.on("close", function() {
873
+ if (worker._readyReject) worker._readyReject(new Error("Claude worker connection closed before ready."));
874
+ });
875
+ });
876
+ worker.server.on("error", function(error) {
877
+ if (worker._readyReject) worker._readyReject(error);
878
+ cleanupWorker(worker);
864
879
  });
865
880
 
866
881
  worker.server.listen(socketPath, function() {
@@ -892,6 +907,14 @@ function spawnWorker(linuxUser, workerScriptPath, cwd) {
892
907
  });
893
908
  worker.process = spawn(workerSpawn.command, workerSpawn.args, workerSpawn.options);
894
909
 
910
+ worker.process.on("error", function(error) {
911
+ if (worker._readyReject) worker._readyReject(error);
912
+ worker.messageHandlers.forEach(function(handler) { handler({ type: "query_error", error: error.message, _fallback: true }); });
913
+ cleanupWorker(worker);
914
+ // Only a spawn failure proves that no child execution exists. Other
915
+ // ChildProcess errors (for example a failed signal) are not exit evidence.
916
+ if (!worker.process.pid && worker._exitResolve) { worker._exitResolve(); worker._exitResolve = null; }
917
+ });
895
918
  worker.process.stdout.on("data", function(data) {
896
919
  console.log("[sdk-worker:" + linuxUser + "] " + data.toString().trim());
897
920
  });
@@ -905,9 +928,8 @@ function spawnWorker(linuxUser, workerScriptPath, cwd) {
905
928
  worker.process.on("exit", function(code, signal) {
906
929
  console.log("[yoke/claude] Worker for " + linuxUser + " exited (code=" + code + ", signal=" + signal + ")" + (worker._stderrBuf ? " stderr: " + worker._stderrBuf.trim() : ""));
907
930
  // Reject readyPromise if worker dies before becoming ready
908
- if (!worker.ready && worker._readyResolve) {
909
- worker._readyResolve = null;
910
- // Let the readyPromise hang; the query_error handler will clean up
931
+ if (!worker.ready && worker._readyReject) {
932
+ worker._readyReject(new Error("Claude worker exited before ready (code=" + code + ")."));
911
933
  }
912
934
  // Notify message handlers about unexpected exit so sessions don't hang.
913
935
  // Always dispatch a fallback query_error. The handler is idempotent:
@@ -1082,6 +1104,9 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
1082
1104
  var iterWaiting = null;
1083
1105
  var iterEnded = false;
1084
1106
  var iterError = null;
1107
+ var resolveStopped;
1108
+ var stopped = new Promise(function(resolve) { resolveStopped = resolve; });
1109
+ if (worker.exitPromise) worker.exitPromise.then(resolveStopped);
1085
1110
 
1086
1111
  // Pending request/response correlation for handle methods that need a
1087
1112
  // result from the worker (e.g. rewindFiles). Each entry is keyed by a
@@ -1299,6 +1324,8 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
1299
1324
  }
1300
1325
 
1301
1326
  case "query_done":
1327
+ if (worker._abortTimeout) { clearTimeout(worker._abortTimeout); worker._abortTimeout = null; }
1328
+ resolveStopped();
1302
1329
  rejectPendingPermissionModes(new Error("Worker query ended while changing permission mode"));
1303
1330
  console.log("[yoke/claude] IPC query_done received, pid=" + (worker.process ? worker.process.pid : "?"));
1304
1331
  worker._queryEnded = true;
@@ -1306,6 +1333,10 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
1306
1333
  break;
1307
1334
 
1308
1335
  case "query_error": {
1336
+ if (!msg._fallback) {
1337
+ if (worker._abortTimeout) { clearTimeout(worker._abortTimeout); worker._abortTimeout = null; }
1338
+ resolveStopped();
1339
+ }
1309
1340
  rejectPendingPermissionModes(new Error(msg.error || "Worker exited while changing permission mode"));
1310
1341
  console.log("[yoke/claude] IPC query_error received, pid=" + (worker.process ? worker.process.pid : "?") + " _fallback=" + !!msg._fallback + " _queryEnded=" + worker._queryEnded + " error=" + (msg.error || "").substring(0, 100));
1311
1342
  // Skip fallback errors from exit handler if we already handled the real one
@@ -1472,6 +1503,11 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
1472
1503
  }, 5000);
1473
1504
  },
1474
1505
 
1506
+ stopAndWait: function() {
1507
+ handle.abort();
1508
+ return stopped;
1509
+ },
1510
+
1475
1511
  close: function() {
1476
1512
  rejectPendingPermissionModes(new Error("Worker query closed while changing permission mode"));
1477
1513
  // End the iterator
@@ -1507,43 +1543,7 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
1507
1543
 
1508
1544
  // --- Adapter factory ---
1509
1545
 
1510
- function resolveClaudeBinaryPath() {
1511
- // 1. Explicit env var override
1512
- if (process.env.CLAUDE_CODE_PATH && fs.existsSync(process.env.CLAUDE_CODE_PATH)) {
1513
- return process.env.CLAUDE_CODE_PATH;
1514
- }
1515
-
1516
- // 2. `which claude` in the daemon's PATH
1517
- try {
1518
- var result = require("child_process").execSync("which claude", { encoding: "utf8", timeout: 5000 }).trim();
1519
- if (result && fs.existsSync(result)) return result;
1520
- } catch (e) {}
1521
-
1522
- // 3. Common per-user and system locations (best-effort fallback for the daemon user)
1523
- var home = process.env.HOME || "";
1524
- var candidates = [];
1525
- if (home) {
1526
- candidates.push(home + "/.npm-global/bin/claude");
1527
- candidates.push(home + "/.local/bin/claude");
1528
- candidates.push(home + "/.volta/bin/claude");
1529
- candidates.push(home + "/.bun/bin/claude");
1530
- candidates.push(home + "/bin/claude");
1531
- }
1532
- candidates.push("/usr/local/bin/claude");
1533
- candidates.push("/usr/bin/claude");
1534
- candidates.push("/opt/homebrew/bin/claude");
1535
- for (var i = 0; i < candidates.length; i++) {
1536
- try { if (fs.existsSync(candidates[i])) return candidates[i]; } catch (e) {}
1537
- }
1538
-
1539
- // 4. Bundled CLI entry from the SDK's peer
1540
- try {
1541
- var resolved = require.resolve("@anthropic-ai/claude-code/cli.js");
1542
- if (resolved && fs.existsSync(resolved)) return resolved;
1543
- } catch (e) {}
1544
-
1545
- return null;
1546
- }
1546
+ var resolveClaudeBinaryPath = require("../providers/claude-executable").resolve;
1547
1547
 
1548
1548
  function createClaudeAdapter(opts) {
1549
1549
  var _cwd = (opts && opts.cwd) || process.cwd();
@@ -1556,6 +1556,7 @@ function createClaudeAdapter(opts) {
1556
1556
 
1557
1557
  var adapter = {
1558
1558
  vendor: "claude",
1559
+ queryContract: require("./claude-query-contract"),
1559
1560
  userInputCapability: { mode: "native", native: true, transport: "AskUserQuestion/onElicitation" },
1560
1561
 
1561
1562
  // Path to worker script (sdk-bridge uses this to spawn worker processes)
@@ -1642,7 +1643,7 @@ function createClaudeAdapter(opts) {
1642
1643
 
1643
1644
  try {
1644
1645
  var models = await stream.supportedModels();
1645
- result.models = models || [];
1646
+ result.models = require("../providers/claude-model-descriptions").list(models);
1646
1647
  _cachedModels = result.models;
1647
1648
  } catch (e) {
1648
1649
  // supportedModels may fail, models list will be empty
@@ -1909,7 +1910,10 @@ function createClaudeAdapter(opts) {
1909
1910
 
1910
1911
  // Wait for worker to be ready before sending query_start
1911
1912
  if (!reusingWorker) {
1912
- await worker.readyPromise;
1913
+ try { await worker.readyPromise; } catch (error) {
1914
+ worker.kill();
1915
+ throw error;
1916
+ }
1913
1917
  }
1914
1918
 
1915
1919
  // Build serializable query options (no callbacks, no AbortController).
@@ -1954,7 +1958,7 @@ function createClaudeAdapter(opts) {
1954
1958
  warmupDone = true;
1955
1959
  var r = msg.result || {};
1956
1960
  resolve({
1957
- models: r.models || [],
1961
+ models: require("../providers/claude-model-descriptions").list(r.models),
1958
1962
  defaultModel: r.model || "",
1959
1963
  skills: r.skills || [],
1960
1964
  slashCommands: r.slashCommands || [],
@@ -2071,7 +2075,7 @@ function createClaudeAdapter(opts) {
2071
2075
 
2072
2076
  try {
2073
2077
  var models = await stream.supportedModels();
2074
- result.models = models || [];
2078
+ result.models = require("../providers/claude-model-descriptions").list(models);
2075
2079
  _cachedModels = result.models;
2076
2080
  } catch (e) {
2077
2081
  // supportedModels may fail, models list will be empty
@@ -2122,7 +2126,7 @@ function createClaudeAdapter(opts) {
2122
2126
  warmupDone = true;
2123
2127
  var r = msg.result || {};
2124
2128
  resolve({
2125
- models: r.models || [],
2129
+ models: require("../providers/claude-model-descriptions").list(r.models),
2126
2130
  defaultModel: r.model || "",
2127
2131
  skills: r.skills || [],
2128
2132
  slashCommands: r.slashCommands || [],
@@ -0,0 +1,24 @@
1
+ // Codex restores dynamic definitions from the original thread catalog.
2
+ // Keep persisted legacy field names here so old conversations remain readable.
3
+ var fields = {
4
+ schedules: "codexDynamicToolCatalogVersion",
5
+ questions: "codexUserInputToolCatalogVersion",
6
+ browser: "codexSharedBrowserToolCatalogVersion",
7
+ issues: "codexIssuesToolCatalogVersion",
8
+ knowledge: "codexYouToolCatalogVersion",
9
+ linear: "codexLinearToolCatalogVersion",
10
+ };
11
+ module.exports = {
12
+ toolTransport: "dynamic",
13
+ catalogLifetime: "conversation",
14
+ externalToolTransport: "dynamic",
15
+ defaultUserInputMode: "fallback",
16
+ questionGuidance: require("../user-input-guidance").codexQuestionGuidance,
17
+ catalogVersion: function (session, family) { return Number(session[fields[family]] || 0); },
18
+ recordCatalog: function (session, versions) {
19
+ Object.keys(versions).forEach(function (family) {
20
+ if (fields[family]) session[fields[family]] = versions[family];
21
+ });
22
+ },
23
+ staleCatalogReason: "This Codex conversation predates Clay's scheduled-task tool catalog. Start a new conversation to use the assisted interview; manual task creation remains available here.",
24
+ };
@@ -1343,6 +1343,8 @@ function createCodexQueryHandle(appServer, queryOpts) {
1343
1343
  return { threadId: state.threadId, revision: inputRevision };
1344
1344
  },
1345
1345
 
1346
+ getRecoveryThreadId: function() { return state.threadId || queryOpts.resumeSessionId || null; },
1347
+
1346
1348
  retireIdleForRecovery: function() {
1347
1349
  handle.endInput();
1348
1350
  return loopFinished;
@@ -1461,11 +1463,23 @@ function createCodexAdapter(opts) {
1461
1463
  var _refCount = 0;
1462
1464
  var _lastActiveAt = Date.now();
1463
1465
  var _shuttingDown = false;
1466
+ var _recoveryIdleShutdown = null;
1464
1467
  var _activeQueries = [];
1465
- var _recoveryHandoff = null;
1466
- var _recoveryRuntimes = [];
1467
- var _recoveryCleanup = Promise.resolve();
1468
- var _recoveryCleanupTasks = [];
1468
+ var recoveryAdmission = require("../codex-recovery-admission").attachRecoveryAdmission({
1469
+ state: function() { return { epoch: _shutdownEpoch, shuttingDown: _shuttingDown, retiring: _recoveryIdleShutdown === _shutdownEpoch,
1470
+ initializing: _initializing, refCount: _refCount, server: _appServer, entries: _activeQueries.slice() }; },
1471
+ shutdownError: createShutdownError,
1472
+ stopIdle: async function() {
1473
+ _recoveryIdleShutdown = _shutdownEpoch;
1474
+ try { return await adapter.shutdownIfIdle(0); }
1475
+ finally { _recoveryIdleShutdown = null; }
1476
+ },
1477
+ createRuntime: function(queryOpts) {
1478
+ return createCodexAdapter(Object.assign({}, _defaultInitOpts, {
1479
+ recoveryRuntime: true, recoverySessionMcpServer: queryOpts.sessionMcpServer,
1480
+ }));
1481
+ },
1482
+ });
1469
1483
 
1470
1484
  function scopedSkillOptions(env) {
1471
1485
  if (!_runtimeLinuxUser) return { env: env };
@@ -1541,102 +1555,6 @@ function createCodexAdapter(opts) {
1541
1555
  updateLastActiveAt();
1542
1556
  }
1543
1557
 
1544
- function retainRecoveryRuntime(runtime) {
1545
- _recoveryRuntimes.push(runtime);
1546
- }
1547
-
1548
- function removeRecoveryRuntime(runtime) {
1549
- var next = [];
1550
- for (var i = 0; i < _recoveryRuntimes.length; i++) {
1551
- if (_recoveryRuntimes[i] !== runtime) next.push(_recoveryRuntimes[i]);
1552
- }
1553
- _recoveryRuntimes = next;
1554
- }
1555
-
1556
- function cleanupRecoveryRuntime(runtime) {
1557
- for (var i = 0; i < _recoveryCleanupTasks.length; i++) {
1558
- if (_recoveryCleanupTasks[i].runtime === runtime) return _recoveryCleanupTasks[i].promise;
1559
- }
1560
- var task = { runtime: runtime, promise: null };
1561
- _recoveryCleanupTasks.push(task);
1562
- var priorCleanup = _recoveryCleanup;
1563
- task.promise = Promise.resolve(priorCleanup).catch(function() {
1564
- return null;
1565
- }).then(function() {
1566
- return runtime.shutdown();
1567
- }).catch(function(error) {
1568
- console.error("[yoke/codex] Isolated recovery runtime shutdown failed:", error.message || error);
1569
- }).then(function() {
1570
- removeRecoveryRuntime(runtime);
1571
- var remainingTasks = [];
1572
- for (var ti = 0; ti < _recoveryCleanupTasks.length; ti++) {
1573
- if (_recoveryCleanupTasks[ti] !== task) remainingTasks.push(_recoveryCleanupTasks[ti]);
1574
- }
1575
- _recoveryCleanupTasks = remainingTasks;
1576
- });
1577
- _recoveryCleanup = task.promise;
1578
- return task.promise;
1579
- }
1580
-
1581
- function shutdownRecoveryRuntimes() {
1582
- var runtimes = _recoveryRuntimes.slice();
1583
- if (!runtimes.length) return _recoveryCleanup;
1584
- return Promise.all(runtimes.map(function(runtime) {
1585
- return cleanupRecoveryRuntime(runtime);
1586
- })).then(function() {
1587
- _recoveryRuntimes = [];
1588
- });
1589
- }
1590
-
1591
- async function createIsolatedRecoveryQuery(queryOpts) {
1592
- var shutdownEpoch = _shutdownEpoch;
1593
- function checkCurrent() {
1594
- idleRecovery.checkAbort(queryOpts);
1595
- if (_shuttingDown || shutdownEpoch !== _shutdownEpoch) throw createShutdownError();
1596
- }
1597
- var releaseHandoff;
1598
- var priorHandoff = _recoveryHandoff;
1599
- var myHandoff = new Promise(function(resolve) { releaseHandoff = resolve; });
1600
- _recoveryHandoff = myHandoff;
1601
- await (priorHandoff || Promise.resolve());
1602
- try {
1603
- await _recoveryCleanup;
1604
- checkCurrent();
1605
- if (!_initializing && _refCount > 0) {
1606
- await idleRecovery.retireIdleQueries(_activeQueries.slice(), _appServer, checkCurrent);
1607
- }
1608
- checkCurrent();
1609
- if (_refCount > 0 || _initializing) {
1610
- throw new Error("Codex resumed-tool recovery is waiting for an active shared runtime; retry after its current queries finish.");
1611
- }
1612
- if (_appServer) {
1613
- var stopped = await adapter.shutdownIfIdle(0);
1614
- if (!stopped) throw new Error("Codex resumed-tool recovery could not safely release the shared runtime; retry after its current queries finish.");
1615
- }
1616
- checkCurrent();
1617
- var recoveryRuntime = createCodexAdapter(Object.assign({}, _defaultInitOpts, {
1618
- recoveryRuntime: true,
1619
- recoverySessionMcpServer: queryOpts.sessionMcpServer,
1620
- }));
1621
- retainRecoveryRuntime(recoveryRuntime);
1622
- var recoveryOpts = Object.assign({}, queryOpts, {
1623
- isolatedRecovery: true,
1624
- onRuntimeFinished: function() {
1625
- return cleanupRecoveryRuntime(recoveryRuntime);
1626
- },
1627
- });
1628
- try {
1629
- return await recoveryRuntime.createQuery(recoveryOpts);
1630
- } catch (error) {
1631
- await cleanupRecoveryRuntime(recoveryRuntime);
1632
- throw error;
1633
- }
1634
- } finally {
1635
- releaseHandoff();
1636
- if (_recoveryHandoff === myHandoff) _recoveryHandoff = null;
1637
- }
1638
- }
1639
-
1640
1558
  function buildReadyResponse(skillNames) {
1641
1559
  return {
1642
1560
  models: _cachedModels,
@@ -1764,6 +1682,7 @@ function createCodexAdapter(opts) {
1764
1682
  var adapter = {
1765
1683
  vendor: "codex",
1766
1684
  queryBoundToolCapability: CODEX_QUERY_BOUND_TOOL_CAPABILITY,
1685
+ queryContract: require("./codex-query-contract"),
1767
1686
  userInputCapability: { mode: "native", native: true, transport: "item/tool/requestUserInput" },
1768
1687
 
1769
1688
  init: function(initOpts) {
@@ -1777,12 +1696,14 @@ function createCodexAdapter(opts) {
1777
1696
  if (_runtimeLinuxUser && requestedLinuxUser && requestedLinuxUser !== _runtimeLinuxUser) {
1778
1697
  return Promise.reject(new Error("Codex runtime user mismatch"));
1779
1698
  }
1780
- if (_shuttingDown) {
1699
+ if (_shuttingDown && _recoveryIdleShutdown !== _shutdownEpoch) {
1781
1700
  return Promise.reject(createShutdownError());
1782
1701
  }
1783
- if (_recoveryHandoff) {
1702
+ try { recoveryAdmission.checkSharedExit(); }
1703
+ catch (error) { return Promise.reject(error); }
1704
+ if (recoveryAdmission.pending()) {
1784
1705
  var initEpoch = _shutdownEpoch;
1785
- return _recoveryHandoff.then(function() {
1706
+ return recoveryAdmission.pending().then(function() {
1786
1707
  if (initEpoch !== _shutdownEpoch) throw createShutdownError();
1787
1708
  return adapter.init(initOpts);
1788
1709
  });
@@ -1963,6 +1884,10 @@ function createCodexAdapter(opts) {
1963
1884
  return null;
1964
1885
  },
1965
1886
 
1887
+ retireIdleForRecovery: function(checkCurrent) {
1888
+ return idleRecovery.retireIdleQueries(_activeQueries.slice(), _appServer, checkCurrent);
1889
+ },
1890
+
1966
1891
  createQuery: async function(queryOpts) {
1967
1892
  var requestedLinuxUser = queryOpts && queryOpts.linuxUser;
1968
1893
  if (!_runtimeLinuxUser && requestedLinuxUser) {
@@ -1974,28 +1899,37 @@ function createCodexAdapter(opts) {
1974
1899
  if (_runtimeLinuxUser && requestedLinuxUser && requestedLinuxUser !== _runtimeLinuxUser) {
1975
1900
  throw new Error("Codex runtime user mismatch");
1976
1901
  }
1977
- if (_shuttingDown) {
1902
+ if (_shuttingDown && _recoveryIdleShutdown !== _shutdownEpoch) {
1978
1903
  throw createShutdownError();
1979
1904
  }
1980
1905
  if (queryOpts && queryOpts.sessionMcpServer && queryOpts.resumeSessionId && !queryOpts.isolatedRecovery) {
1981
- return createIsolatedRecoveryQuery(queryOpts);
1906
+ return recoveryAdmission.createQuery(queryOpts);
1982
1907
  }
1983
1908
  var queryEpoch = _shutdownEpoch;
1909
+ function checkAdmission() {
1910
+ idleRecovery.checkAbort(queryOpts || {});
1911
+ if ((_shuttingDown && _recoveryIdleShutdown !== _shutdownEpoch) || queryEpoch !== _shutdownEpoch) throw createShutdownError();
1912
+ }
1984
1913
  // Recheck after every await: recovery may replace the runtime while an
1985
1914
  // ordinary start is waiting for initialization or an earlier handoff.
1986
1915
  while (true) {
1987
1916
  idleRecovery.checkAbort(queryOpts || {});
1988
- if (_shuttingDown || queryEpoch !== _shutdownEpoch) throw createShutdownError();
1989
- if (_recoveryHandoff) {
1990
- await _recoveryHandoff;
1917
+ if ((_shuttingDown && _recoveryIdleShutdown !== _shutdownEpoch) || queryEpoch !== _shutdownEpoch) throw createShutdownError();
1918
+ recoveryAdmission.checkSharedExit();
1919
+ if (recoveryAdmission.pending()) {
1920
+ await idleRecovery.wait(recoveryAdmission.pending(), checkAdmission);
1921
+ continue;
1922
+ }
1923
+ if (queryOpts.resumeSessionId && recoveryAdmission.hasTarget(queryOpts.resumeSessionId)) {
1924
+ await recoveryAdmission.waitForTarget(queryOpts);
1991
1925
  continue;
1992
1926
  }
1993
1927
  if (_initializing && _initPromise) {
1994
- await _initPromise;
1928
+ await idleRecovery.wait(_initPromise, checkAdmission);
1995
1929
  continue;
1996
1930
  }
1997
1931
  if (!_appServer || !_appServer.started) {
1998
- await adapter.init(queryOpts || {});
1932
+ await idleRecovery.wait(adapter.init(queryOpts || {}), checkAdmission);
1999
1933
  continue;
2000
1934
  }
2001
1935
  break;
@@ -2174,12 +2108,20 @@ function createCodexAdapter(opts) {
2174
2108
  },
2175
2109
 
2176
2110
  // Shutdown the app-server process
2111
+ shutdownForRecovery: async function() {
2112
+ var proc = _appServer && _appServer.proc;
2113
+ await adapter.shutdown();
2114
+ if (proc && proc.exitCode === null && proc.signalCode === null) {
2115
+ throw new Error('Codex recovery runtime exit could not be confirmed; its thread remains reserved.');
2116
+ }
2117
+ },
2118
+
2177
2119
  shutdown: function() {
2178
2120
  _shutdownEpoch++;
2179
2121
  return Promise.all([
2180
2122
  beginShutdown(true),
2181
2123
  shutdownUserRuntimes("shutdown"),
2182
- shutdownRecoveryRuntimes(),
2124
+ recoveryAdmission.shutdown(),
2183
2125
  ]).then(function() { return true; });
2184
2126
  },
2185
2127
 
@@ -279,7 +279,7 @@ function flattenUpdate(update, state) {
279
279
 
280
280
  // Token usage
281
281
  if (type === "usage_update") {
282
- if (typeof update.used === "number") state.lastInputTokens = update.used;
282
+ if (typeof update.used === "number") { state.lastInputTokens = update.used; state.contextMeasurement = "observed"; }
283
283
  if (typeof update.size === "number") state.contextWindow = update.size;
284
284
  return events;
285
285
  }
@@ -294,6 +294,7 @@ function flattenUpdate(update, state) {
294
294
  if (typeof percentage !== "number") percentage = kiroMeta.usagePercentage;
295
295
  if (typeof percentage === "number" && state.contextWindow) {
296
296
  state.lastInputTokens = Math.round(state.contextWindow * percentage / 100);
297
+ state.contextMeasurement = "estimated";
297
298
  }
298
299
  }
299
300
  return events;
@@ -782,6 +783,7 @@ function createKiroQueryHandle(acp, queryOpts) {
782
783
  getContextUsage: function() {
783
784
  return Promise.resolve(state.lastInputTokens != null ? {
784
785
  input_tokens: state.lastInputTokens,
786
+ measurement: state.contextMeasurement || "observed",
785
787
  contextWindow: state.contextWindow || null,
786
788
  } : null);
787
789
  },
@@ -0,0 +1,7 @@
1
+ // Muse's sessionMcp configuration is supplied on both start and resume.
2
+ module.exports = {
3
+ toolTransport: "stdio-mcp",
4
+ catalogLifetime: "query",
5
+ permissionModes: ["auto"],
6
+ interruptionMessage: "Interrupted · What should Muse do instead?",
7
+ };
@@ -0,0 +1,122 @@
1
+ var museQuery = require("../muse-query");
2
+ var runtimeTools = require("../muse-runtime");
3
+ var findMusePath = require("../providers/muse-executable").resolve;
4
+
5
+ function createMuseAdapter(opts) {
6
+ opts = opts || {};
7
+ var adapter = {
8
+ vendor: "muse",
9
+ userInputCapability: { mode: "native", native: true },
10
+ providerContract: require("../vendor-registry").getVendorInfo("muse"),
11
+ queryContract: require("./muse-query-contract"),
12
+ cwd: opts.cwd || process.cwd(),
13
+ binaryPath: opts._binaryPath || null,
14
+ sdkPromise: null,
15
+ catalog: [],
16
+ clients: new Set(),
17
+ handles: new Set(),
18
+ shuttingDown: false,
19
+ requestTimeoutMs: opts._requestTimeoutMs || 9e4,
20
+ titleTimeoutMs: opts._titleTimeoutMs || 15e3,
21
+ shutdownTimeoutMs: opts._shutdownTimeoutMs == null ? 1e3 : opts._shutdownTimeoutMs
22
+ };
23
+ adapter.loadSdk = function() {
24
+ if (opts._sdk) return Promise.resolve(opts._sdk);
25
+ if (!adapter.sdkPromise) adapter.sdkPromise = import("@muse-code/sdk");
26
+ return adapter.sdkPromise;
27
+ };
28
+ adapter.init = async function(initOpts) {
29
+ if (opts.osUsers || opts.linuxUser || initOpts && (initOpts.linuxUser || initOpts.osUsers)) throw new Error("Muse Code does not support OS-owner isolation");
30
+ if (!adapter.binaryPath) adapter.binaryPath = findMusePath();
31
+ if (!adapter.binaryPath) throw new Error("Muse Code binary not found: muse. Install Muse Code or set MUSE_CODE_PATH.");
32
+ await adapter.loadSdk();
33
+ return {
34
+ models: [],
35
+ defaultModel: null,
36
+ skills: [],
37
+ slashCommands: [],
38
+ fastModeState: null,
39
+ capabilities: {
40
+ effort: true,
41
+ midSessionModelSwitch: true,
42
+ fork: true,
43
+ rollback: false,
44
+ sessionListing: true,
45
+ sessionRename: true,
46
+ thinking: true,
47
+ betas: false,
48
+ rewind: false,
49
+ sessionResume: true,
50
+ promptSuggestions: false,
51
+ elicitation: false,
52
+ fileCheckpointing: false,
53
+ contextCompacting: true,
54
+ queryBoundTools: {
55
+ mode: "stdio-mcp",
56
+ source: "@muse-code/sdk SessionConfig.mcpServers"
57
+ },
58
+ skillSharing: true,
59
+ toolPolicy: [ "ask", "allow-all" ]
60
+ }
61
+ };
62
+ };
63
+ adapter.supportedModels = async function() {
64
+ if (adapter.shuttingDown) throw new Error("Muse Code adapter is shutting down");
65
+ if (!adapter.binaryPath) await adapter.init();
66
+ var sdk = await adapter.loadSdk();
67
+ if (adapter.shuttingDown) throw new Error("Muse Code adapter is shutting down");
68
+ var runtime = runtimeTools.createRuntime(adapter, sdk, {
69
+ command: adapter.binaryPath,
70
+ args: [ "serve" ],
71
+ cwd: adapter.cwd,
72
+ env: Object.assign({}, process.env)
73
+ });
74
+ runtime.fail = function(error) {
75
+ runtime.close().catch(function(closeError) {
76
+ adapter.lastCloseError = closeError;
77
+ });
78
+ };
79
+ try {
80
+ var spawned = await runtime.initialize();
81
+ adapter.catalog = runtimeTools.normalizeCatalog(await runtime.waitRequest(spawned.connection.request("model/list", {})));
82
+ return adapter.catalog.slice();
83
+ } finally {
84
+ await runtime.close();
85
+ }
86
+ };
87
+ adapter.createToolServer = function() {
88
+ return null;
89
+ };
90
+ adapter.createQuery = async function(queryOpts) {
91
+ if (opts.osUsers || opts.linuxUser || queryOpts && queryOpts.linuxUser) throw new Error("Muse Code does not support OS-owner isolation");
92
+ if (!adapter.binaryPath) await adapter.init(queryOpts || {});
93
+ if (adapter.shuttingDown) throw new Error("Muse Code adapter is shutting down");
94
+ return museQuery.createMuseQueryHandle(adapter, queryOpts || {});
95
+ };
96
+ adapter.generateTitle = function(messages, titleOpts) {
97
+ return require("../title-query").generateTitle(adapter, messages, Object.assign({}, titleOpts, { timeoutMs: adapter.titleTimeoutMs }),
98
+ { skipProjectInstructions: true, skipSkills: true, adapterOptions: { MUSE: { readOnly: true, mcpServers: [] } } });
99
+ };
100
+ adapter.shutdown = async function() {
101
+ adapter.shuttingDown = true;
102
+ var results = await Promise.allSettled(Array.from(adapter.handles).map(function(handle) {
103
+ return handle.close();
104
+ }).concat(Array.from(adapter.clients).map(function(runtime) {
105
+ return runtime.close();
106
+ })));
107
+ var failed = results.find(function(result) {
108
+ return result.status === "rejected";
109
+ });
110
+ if (failed) throw failed.reason;
111
+ return true;
112
+ };
113
+ require("../muse-services").attach(adapter);
114
+ return adapter;
115
+ }
116
+
117
+ module.exports = {
118
+ createMuseAdapter: createMuseAdapter,
119
+ findMusePath: findMusePath,
120
+ isAuthError: runtimeTools.isAuthError,
121
+ chooseApprovalDecision: require("../muse-policy").chooseApprovalDecision
122
+ };