@songsid/agend 2.3.5-alpha.2 → 2.3.5-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/agend-home.d.ts +13 -0
  2. package/dist/agend-home.js +42 -0
  3. package/dist/agend-home.js.map +1 -1
  4. package/dist/agent-runtime-api.d.ts +4 -0
  5. package/dist/agent-runtime-api.js +59 -0
  6. package/dist/agent-runtime-api.js.map +1 -0
  7. package/dist/agent-runtime-change.d.ts +74 -0
  8. package/dist/agent-runtime-change.js +102 -0
  9. package/dist/agent-runtime-change.js.map +1 -0
  10. package/dist/auth-api.d.ts +21 -0
  11. package/dist/auth-api.js +95 -4
  12. package/dist/auth-api.js.map +1 -1
  13. package/dist/authority/web-authority.d.ts +12 -2
  14. package/dist/authority/web-authority.js +25 -4
  15. package/dist/authority/web-authority.js.map +1 -1
  16. package/dist/backend/claude-code.js +16 -1
  17. package/dist/backend/claude-code.js.map +1 -1
  18. package/dist/backend/codex-footer-hints.d.ts +4 -0
  19. package/dist/backend/codex-footer-hints.js +27 -0
  20. package/dist/backend/codex-footer-hints.js.map +1 -0
  21. package/dist/backend/codex.js +19 -11
  22. package/dist/backend/codex.js.map +1 -1
  23. package/dist/backend/kiro-identity.d.ts +2 -0
  24. package/dist/backend/kiro-identity.js +13 -6
  25. package/dist/backend/kiro-identity.js.map +1 -1
  26. package/dist/backend/kiro.js +18 -3
  27. package/dist/backend/kiro.js.map +1 -1
  28. package/dist/backend-availability.d.ts +6 -0
  29. package/dist/backend-availability.js +13 -5
  30. package/dist/backend-availability.js.map +1 -1
  31. package/dist/channel/mcp-tools.js +1 -1
  32. package/dist/channel/mcp-tools.js.map +1 -1
  33. package/dist/cli.js +6 -9
  34. package/dist/cli.js.map +1 -1
  35. package/dist/config-validator.js +12 -1
  36. package/dist/config-validator.js.map +1 -1
  37. package/dist/daemon.d.ts +5 -0
  38. package/dist/daemon.js +107 -30
  39. package/dist/daemon.js.map +1 -1
  40. package/dist/fleet-manager.d.ts +146 -8
  41. package/dist/fleet-manager.js +1030 -166
  42. package/dist/fleet-manager.js.map +1 -1
  43. package/dist/fleet-windows-runtime.d.ts +6 -1
  44. package/dist/fleet-windows-runtime.js +77 -1
  45. package/dist/fleet-windows-runtime.js.map +1 -1
  46. package/dist/fleet-yaml-patch.d.ts +3 -0
  47. package/dist/fleet-yaml-patch.js +103 -0
  48. package/dist/fleet-yaml-patch.js.map +1 -0
  49. package/dist/general-binding.d.ts +85 -0
  50. package/dist/general-binding.js +298 -0
  51. package/dist/general-binding.js.map +1 -0
  52. package/dist/general-host-owner.d.ts +8 -0
  53. package/dist/general-host-owner.js +26 -0
  54. package/dist/general-host-owner.js.map +1 -0
  55. package/dist/general-instance.d.ts +7 -0
  56. package/dist/general-instance.js +20 -3
  57. package/dist/general-instance.js.map +1 -1
  58. package/dist/general-knowledge/skills/model-discovery/SKILL.md +2 -0
  59. package/dist/general-role.d.ts +5 -0
  60. package/dist/general-role.js +26 -0
  61. package/dist/general-role.js.map +1 -0
  62. package/dist/instance-lifecycle.d.ts +1 -0
  63. package/dist/instance-lifecycle.js +26 -4
  64. package/dist/instance-lifecycle.js.map +1 -1
  65. package/dist/instructions.d.ts +2 -0
  66. package/dist/instructions.js +6 -0
  67. package/dist/instructions.js.map +1 -1
  68. package/dist/kiro-resume-summary.d.ts +37 -0
  69. package/dist/kiro-resume-summary.js +85 -0
  70. package/dist/kiro-resume-summary.js.map +1 -0
  71. package/dist/locale.js +59 -0
  72. package/dist/locale.js.map +1 -1
  73. package/dist/login-controller.js +9 -1
  74. package/dist/login-controller.js.map +1 -1
  75. package/dist/native-pane-lifecycle.js +4 -1
  76. package/dist/native-pane-lifecycle.js.map +1 -1
  77. package/dist/native-pane-manager.d.ts +1 -0
  78. package/dist/native-pane-manager.js +23 -2
  79. package/dist/native-pane-manager.js.map +1 -1
  80. package/dist/needs-you-hub.js +1 -1
  81. package/dist/needs-you-hub.js.map +1 -1
  82. package/dist/needs-you.d.ts +8 -1
  83. package/dist/needs-you.js +5 -2
  84. package/dist/needs-you.js.map +1 -1
  85. package/dist/office-share-page.js +1 -1
  86. package/dist/office-share-page.js.map +1 -1
  87. package/dist/package-preimage.js +27 -2
  88. package/dist/package-preimage.js.map +1 -1
  89. package/dist/pane-port.d.ts +11 -0
  90. package/dist/public-web-gateway.js +9 -0
  91. package/dist/public-web-gateway.js.map +1 -1
  92. package/dist/public-web-link.d.ts +11 -0
  93. package/dist/public-web-link.js +13 -0
  94. package/dist/public-web-link.js.map +1 -1
  95. package/dist/quickstart-api.js +9 -5
  96. package/dist/quickstart-api.js.map +1 -1
  97. package/dist/quickstart.d.ts +1 -0
  98. package/dist/quickstart.js +4 -1
  99. package/dist/quickstart.js.map +1 -1
  100. package/dist/reply-buttons-controller.js +10 -0
  101. package/dist/reply-buttons-controller.js.map +1 -1
  102. package/dist/runtime-api.js +84 -9
  103. package/dist/runtime-api.js.map +1 -1
  104. package/dist/runtime-build-info.d.ts +9 -0
  105. package/dist/runtime-build-info.js +57 -0
  106. package/dist/runtime-build-info.js.map +1 -0
  107. package/dist/runtime-bundle.d.ts +3 -1
  108. package/dist/runtime-bundle.js +17 -8
  109. package/dist/runtime-bundle.js.map +1 -1
  110. package/dist/runtime-cli.d.ts +6 -1
  111. package/dist/runtime-cli.js +46 -11
  112. package/dist/runtime-cli.js.map +1 -1
  113. package/dist/runtime-client-store.d.ts +20 -1
  114. package/dist/runtime-client-store.js +56 -4
  115. package/dist/runtime-client-store.js.map +1 -1
  116. package/dist/runtime-client.d.ts +12 -0
  117. package/dist/runtime-client.js +43 -7
  118. package/dist/runtime-client.js.map +1 -1
  119. package/dist/runtime-connection.d.ts +22 -0
  120. package/dist/runtime-connection.js +93 -0
  121. package/dist/runtime-connection.js.map +1 -0
  122. package/dist/runtime-coordinator.d.ts +9 -0
  123. package/dist/runtime-coordinator.js +81 -34
  124. package/dist/runtime-coordinator.js.map +1 -1
  125. package/dist/runtime-general-protocol.d.ts +22 -0
  126. package/dist/runtime-general-protocol.js +57 -0
  127. package/dist/runtime-general-protocol.js.map +1 -0
  128. package/dist/runtime-general-workspace.d.ts +17 -0
  129. package/dist/runtime-general-workspace.js +213 -0
  130. package/dist/runtime-general-workspace.js.map +1 -0
  131. package/dist/runtime-pane-assets.d.ts +1 -1
  132. package/dist/runtime-pane-assets.js +1 -1
  133. package/dist/runtime-pane-assets.js.map +1 -1
  134. package/dist/runtime-pane-boot.d.ts +7 -0
  135. package/dist/runtime-pane-boot.js +23 -0
  136. package/dist/runtime-pane-boot.js.map +1 -1
  137. package/dist/runtime-pane-host.d.ts +1 -0
  138. package/dist/runtime-pane-host.js +22 -1
  139. package/dist/runtime-pane-host.js.map +1 -1
  140. package/dist/runtime-pane-mcp.d.ts +8 -0
  141. package/dist/runtime-pane-mcp.js +15 -2
  142. package/dist/runtime-pane-mcp.js.map +1 -1
  143. package/dist/runtime-pane-port.d.ts +6 -1
  144. package/dist/runtime-pane-port.js +21 -0
  145. package/dist/runtime-pane-port.js.map +1 -1
  146. package/dist/runtime-pane-protocol.d.ts +4 -1
  147. package/dist/runtime-pane-protocol.js +7 -1
  148. package/dist/runtime-pane-protocol.js.map +1 -1
  149. package/dist/runtime-protocol.d.ts +13 -0
  150. package/dist/runtime-protocol.js +18 -0
  151. package/dist/runtime-protocol.js.map +1 -1
  152. package/dist/settings-api.d.ts +5 -0
  153. package/dist/settings-api.js +37 -1
  154. package/dist/settings-api.js.map +1 -1
  155. package/dist/settings-baseline.d.ts +1 -0
  156. package/dist/settings-baseline.js +1 -1
  157. package/dist/settings-baseline.js.map +1 -1
  158. package/dist/settings-confirmation.d.ts +1 -0
  159. package/dist/settings-confirmation.js +1 -0
  160. package/dist/settings-confirmation.js.map +1 -1
  161. package/dist/settings-effect.d.ts +4 -0
  162. package/dist/settings-effect.js +36 -1
  163. package/dist/settings-effect.js.map +1 -1
  164. package/dist/settings-http-confirmation.d.ts +4 -0
  165. package/dist/settings-http-confirmation.js +20 -1
  166. package/dist/settings-http-confirmation.js.map +1 -1
  167. package/dist/settings-request-capability.d.ts +2 -0
  168. package/dist/settings-request-capability.js +4 -0
  169. package/dist/settings-request-capability.js.map +1 -1
  170. package/dist/settings-route-lifetime.d.ts +14 -0
  171. package/dist/settings-route-lifetime.js +48 -0
  172. package/dist/settings-route-lifetime.js.map +1 -0
  173. package/dist/settings-transaction.d.ts +4 -0
  174. package/dist/settings-transaction.js +9 -0
  175. package/dist/settings-transaction.js.map +1 -1
  176. package/dist/setup-form.js +6 -3
  177. package/dist/setup-form.js.map +1 -1
  178. package/dist/setup-i18n.js +3 -0
  179. package/dist/setup-i18n.js.map +1 -1
  180. package/dist/stall-reporter.d.ts +21 -0
  181. package/dist/stall-reporter.js +82 -0
  182. package/dist/stall-reporter.js.map +1 -0
  183. package/dist/tmux-control.d.ts +2 -2
  184. package/dist/tmux-control.js +4 -2
  185. package/dist/tmux-control.js.map +1 -1
  186. package/dist/tmux-exec-helper.d.ts +6 -3
  187. package/dist/tmux-exec-helper.js +115 -53
  188. package/dist/tmux-exec-helper.js.map +1 -1
  189. package/dist/tool-permissions.js +2 -1
  190. package/dist/tool-permissions.js.map +1 -1
  191. package/dist/tunnel/cloudflared-install.d.ts +4 -0
  192. package/dist/tunnel/cloudflared-install.js +20 -1
  193. package/dist/tunnel/cloudflared-install.js.map +1 -1
  194. package/dist/tunnel/cloudflared.d.ts +8 -1
  195. package/dist/tunnel/cloudflared.js +34 -6
  196. package/dist/tunnel/cloudflared.js.map +1 -1
  197. package/dist/tunnel/lease.d.ts +3 -3
  198. package/dist/tunnel/lease.js +23 -19
  199. package/dist/tunnel/lease.js.map +1 -1
  200. package/dist/tunnel/manager.js +6 -7
  201. package/dist/tunnel/manager.js.map +1 -1
  202. package/dist/types.d.ts +2 -0
  203. package/dist/ui/agent-proposals.js +2 -2
  204. package/dist/ui/agent-runtime-settings.js +67 -0
  205. package/dist/ui/agent-runtime.js +20 -2
  206. package/dist/ui/backend-signin.js +36 -21
  207. package/dist/ui/general-location.js +71 -0
  208. package/dist/ui/native-instance-settings.js +5 -8
  209. package/dist/ui/native-pane-recovery.js +1 -1
  210. package/dist/ui/panel-chat.js +5 -2
  211. package/dist/ui/panel-fleet.js +4 -2
  212. package/dist/ui/panel-needs.js +2 -0
  213. package/dist/ui/panel-runtimes.js +136 -33
  214. package/dist/ui/panel-settings.js +227 -138
  215. package/dist/ui/panel-windows-cli.js +77 -41
  216. package/dist/ui/settings-agent-filters.js +94 -0
  217. package/dist/ui/settings-appearance.js +122 -23
  218. package/dist/ui/settings-dialogs.js +13 -7
  219. package/dist/ui/settings-guests.js +25 -11
  220. package/dist/ui/settings-layout.js +245 -0
  221. package/dist/ui/settings-model.js +10 -1
  222. package/dist/ui/settings-outside.js +176 -0
  223. package/dist/ui/settings-registry.js +6 -3
  224. package/dist/ui/settings-shortcuts.js +65 -0
  225. package/dist/ui/settings-strings.js +95 -0
  226. package/dist/ui/settings-web-authority.js +14 -11
  227. package/dist/ui/shared/app-i18n.js +2 -2
  228. package/dist/ui/shared/app-shell.js +17 -7
  229. package/dist/ui/shared/app.css +1038 -13
  230. package/dist/ui/shared/instance-nav.js +16 -5
  231. package/dist/ui/shared/machine-name.js +13 -0
  232. package/dist/ui/shared/panel-view.js +266 -17
  233. package/dist/ui/shared/qrcode.module.js +2237 -0
  234. package/dist/ui/shared/settings-width.js +31 -0
  235. package/dist/ui/shared/signin.js +39 -5
  236. package/dist/ui/shared/tokens.css +1 -0
  237. package/dist/ui/shared/ui-dialog.js +2 -2
  238. package/dist/ui/shared/ui-menu.js +3 -3
  239. package/dist/ui/shared/vendor/qrcode-generator.LICENSE +27 -0
  240. package/dist/ui/shared/vendor/vendor.json +19 -2
  241. package/dist/ui/shared/view-strings.js +28 -0
  242. package/dist/ui/windows-cli-catalog.js +41 -12
  243. package/dist/unattended-install.d.ts +1 -1
  244. package/dist/unattended-install.js +19 -5
  245. package/dist/unattended-install.js.map +1 -1
  246. package/dist/update-check.d.ts +2 -8
  247. package/dist/update-check.js +2 -5
  248. package/dist/update-check.js.map +1 -1
  249. package/dist/view-api.d.ts +15 -0
  250. package/dist/view-api.js +94 -33
  251. package/dist/view-api.js.map +1 -1
  252. package/dist/web-api.d.ts +13 -0
  253. package/dist/web-api.js +80 -0
  254. package/dist/web-api.js.map +1 -1
  255. package/dist/web-login.d.ts +4 -3
  256. package/dist/web-login.js +23 -14
  257. package/dist/web-login.js.map +1 -1
  258. package/dist/web-only-fleet.d.ts +20 -0
  259. package/dist/web-only-fleet.js +21 -0
  260. package/dist/web-only-fleet.js.map +1 -1
  261. package/dist/web-remote-access.d.ts +152 -0
  262. package/dist/web-remote-access.js +368 -0
  263. package/dist/web-remote-access.js.map +1 -0
  264. package/dist/web-session.d.ts +12 -0
  265. package/dist/web-session.js +22 -8
  266. package/dist/web-session.js.map +1 -1
  267. package/dist/windows-agents.d.ts +15 -1
  268. package/dist/windows-agents.js +37 -10
  269. package/dist/windows-agents.js.map +1 -1
  270. package/dist/windows-cli-api.js +2 -1
  271. package/dist/windows-cli-api.js.map +1 -1
  272. package/dist/windows-cli-worker.d.ts +1 -0
  273. package/dist/windows-cli-worker.js +2 -2
  274. package/dist/windows-cli-worker.js.map +1 -1
  275. package/dist/windows-cli.d.ts +1 -0
  276. package/dist/windows-cli.js +7 -2
  277. package/dist/windows-cli.js.map +1 -1
  278. package/launcher/agend-install.cjs +16 -2
  279. package/package.json +1 -1
@@ -0,0 +1,298 @@
1
+ /** Metadata-only General location journal. Provider homes and conversations never move. */
2
+ import { constants, closeSync, fstatSync, mkdirSync, openSync, readFileSync } from "node:fs";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { createHash, randomUUID } from "node:crypto";
5
+ import { atomicWriteFileSync } from "./atomic-write.js";
6
+ import { settingsFingerprint } from "./settings-transaction.js";
7
+ const uuid = (v) => typeof v === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);
8
+ const object = (v) => !!v && typeof v === "object" && !Array.isArray(v);
9
+ const text = (v, n) => typeof v === "string" && v.length <= n && !/[\p{Cc}\p{Cf}]/u.test(v);
10
+ const closed = (v, keys) => Object.keys(v).every(k => keys.includes(k));
11
+ const config = (v) => object(v) && typeof v.working_directory === "string" && v.general_topic === true;
12
+ export function parseGeneralSwitchInput(v) {
13
+ if (!object(v) || !closed(v, ["name", "revision", "target"]) || !text(v.name, 256) || !v.name
14
+ || !/^[0-9a-f]{64}$/.test(typeof v.revision === "string" ? v.revision : "") || !object(v.target))
15
+ throw Error("Invalid General location request");
16
+ const target = v.target;
17
+ if (target.location === "host" && closed(target, ["location"]))
18
+ return structuredClone(v);
19
+ if (target.location !== "windows" || !closed(target, ["location", "machineId", "cli", "model"]) || !uuid(target.machineId)
20
+ || target.cli !== "claude-code" && target.cli !== "codex" || !text(target.model, 256))
21
+ throw Error("Invalid General location target");
22
+ return structuredClone(v);
23
+ }
24
+ export function generalBindingRevision(value, current) {
25
+ return settingsFingerprint([value, current]);
26
+ }
27
+ function validate(raw, name) {
28
+ if (!object(raw) || raw.version !== 1 || raw.name !== name || !uuid(raw.revision) || !object(raw.host) || !config(raw.host.config)
29
+ || raw.host.config.runtime === "windows" || !Array.isArray(raw.windows) || raw.windows.length > 32
30
+ || !closed(raw, ["version", "name", "revision", "host", "active", "windows", "pending", "hold"]))
31
+ throw Error("General binding journal scope differs");
32
+ const ids = new Set(), agents = new Set();
33
+ for (const row of raw.windows) {
34
+ if (!object(row) || !uuid(row.id) || !uuid(row.agentId) || !uuid(row.machineId) || row.cli !== "claude-code" && row.cli !== "codex"
35
+ || !config(row.config) || row.config.runtime !== "windows" || row.config.native_adapter !== "pane"
36
+ || row.config.native_general_binding !== row.id || row.config.native_agent_id !== row.agentId
37
+ || row.config.machine_id !== row.machineId || row.config.backend !== row.cli || ids.has(row.id) || agents.has(row.agentId))
38
+ throw Error("General Windows binding scope differs");
39
+ ids.add(row.id);
40
+ agents.add(row.agentId);
41
+ }
42
+ if (raw.active !== "host" && (!uuid(raw.active) || !ids.has(raw.active)))
43
+ throw Error("General active binding differs");
44
+ if (raw.host.pin !== undefined && (!object(raw.host.pin) || !text(raw.host.pin.backend, 64) || !text(raw.host.pin.sessionId, 256) || !raw.host.pin.sessionId))
45
+ throw Error("General host pin differs");
46
+ if (raw.hold !== undefined && raw.hold !== "exit" && raw.hold !== "start")
47
+ throw Error("General binding hold differs");
48
+ if (raw.pending !== undefined) {
49
+ const p = raw.pending;
50
+ if (!object(p) || !uuid(p.id) || p.phase !== "prepared" && p.phase !== "stopped" && p.phase !== "selected" || !config(p.source) || !config(p.target)
51
+ || p.from !== "host" && (!uuid(p.from) || !ids.has(p.from)) || p.to !== "host" && (!uuid(p.to) || !ids.has(p.to))
52
+ || p.from === p.to || !Number.isSafeInteger(p.at) || p.at < 0)
53
+ throw Error("General switch intent differs");
54
+ const target = p.to === "host" ? raw.host.config : raw.windows.find(row => row.id === p.to).config;
55
+ if (settingsFingerprint(target) !== settingsFingerprint(p.target) || p.phase === "selected" && raw.active !== p.to
56
+ || p.phase !== "selected" && raw.active !== p.from)
57
+ throw Error("General switch configuration differs");
58
+ if (p.hostOwner !== undefined) {
59
+ const o = p.hostOwner;
60
+ if (!object(o) || o.kind !== "tmux" || typeof o.windowId !== "string" || !/^@\d+$/.test(o.windowId)
61
+ || !Number.isSafeInteger(o.pid) || o.pid <= 1
62
+ || o.pin !== undefined && (!object(o.pin) || !text(o.pin.backend, 64) || !text(o.pin.sessionId, 256) || !o.pin.sessionId))
63
+ throw Error("General old host owner differs");
64
+ }
65
+ }
66
+ return structuredClone(raw);
67
+ }
68
+ export class GeneralBindings {
69
+ home;
70
+ constructor(home) {
71
+ this.home = home;
72
+ }
73
+ path(name) { return join(this.home, "general-bindings", `${createHash("sha256").update(name).digest("hex")}.json`); }
74
+ read(name) {
75
+ let fd;
76
+ try {
77
+ fd = openSync(this.path(name), constants.O_RDONLY | constants.O_NOFOLLOW);
78
+ }
79
+ catch (err) {
80
+ if (err.code === "ENOENT")
81
+ return null;
82
+ throw err;
83
+ }
84
+ try {
85
+ const st = fstatSync(fd);
86
+ if (!st.isFile() || st.size > 1024 * 1024 || typeof process.getuid === "function" && st.uid !== process.getuid())
87
+ throw Error("General binding journal is not an owned regular file");
88
+ const bytes = readFileSync(fd);
89
+ if (bytes.length > 1024 * 1024)
90
+ throw Error("General binding journal is too large");
91
+ const value = JSON.parse(bytes.toString("utf8"));
92
+ if (!object(value) || value.checksum !== settingsFingerprint(value.record))
93
+ throw Error("General binding journal checksum differs");
94
+ return validate(value.record, name);
95
+ }
96
+ finally {
97
+ closeSync(fd);
98
+ }
99
+ }
100
+ write(value) {
101
+ const record = validate(value, value.name), bytes = JSON.stringify({ record, checksum: settingsFingerprint(record) });
102
+ if (Buffer.byteLength(bytes) > 1024 * 1024)
103
+ throw Error("General binding journal is too large");
104
+ mkdirSync(join(this.home, "general-bindings"), { recursive: true, mode: 0o700 });
105
+ atomicWriteFileSync(this.path(record.name), bytes, { mode: 0o600 });
106
+ }
107
+ /** A selected intent already owns this exact config. Publication settles its receipt after a coordinator restart. */
108
+ completeSelected(name, current) {
109
+ const record = this.read(name);
110
+ if (!record)
111
+ return false;
112
+ const selected = record.active === "host" ? record.host.config : record.windows.find(row => row.id === record.active).config;
113
+ if (record.pending ? record.pending.phase !== "selected" || settingsFingerprint(record.pending.target) !== settingsFingerprint(current)
114
+ : record.hold !== "start" || settingsFingerprint(selected) !== settingsFingerprint(current))
115
+ return false;
116
+ delete record.pending;
117
+ delete record.hold;
118
+ this.write(record);
119
+ return true;
120
+ }
121
+ /** Called on every start, including boot and automatic recovery. Never guess through an unfinished switch. */
122
+ assertStart(name, current) {
123
+ const record = this.read(name);
124
+ if (!record)
125
+ return;
126
+ if (record.pending && (record.pending.phase !== "selected" || settingsFingerprint(record.pending.target) !== settingsFingerprint(current)))
127
+ throw Error("General switch is waiting for a confirmed old process exit");
128
+ const selected = record.active === "host" ? record.host.config : record.windows.find(row => row.id === record.active).config;
129
+ const sameBinding = record.active === "host" ? current.runtime !== "windows" :
130
+ ["runtime", "machine_id", "native_agent_id", "native_adapter", "native_general_binding", "backend", "working_directory"].every(key => selected[key] === current[key]);
131
+ if (!sameBinding || !current.general_topic)
132
+ throw Error("General binding differs from the saved location");
133
+ // Ordinary approved settings edits keep their existing policy. They must not turn a later restart into a binding hold.
134
+ if (!record.pending && settingsFingerprint(selected) !== settingsFingerprint(current)) {
135
+ if (record.active === "host") {
136
+ if (selected.backend !== current.backend || selected.working_directory !== current.working_directory)
137
+ delete record.host.pin;
138
+ record.host.config = structuredClone(current);
139
+ }
140
+ else
141
+ record.windows.find(row => row.id === record.active).config = structuredClone(current);
142
+ record.revision = randomUUID();
143
+ this.write(record);
144
+ }
145
+ }
146
+ }
147
+ /** Only an unfinished, selected switch-back can override the host backend's ordinary resume policy. */
148
+ export function selectedGeneralHostSession(instanceDir, name, backend, cwd) {
149
+ if (basename(instanceDir) !== name || basename(dirname(instanceDir)) !== "instances")
150
+ return null;
151
+ const record = new GeneralBindings(dirname(dirname(instanceDir))).read(name);
152
+ if (record?.pending?.phase !== "selected" || record.pending.to !== "host" || record.active !== "host" || !record.host.pin)
153
+ return null;
154
+ if (record.host.pin.backend !== backend || record.host.config.working_directory !== cwd || !uuid(record.host.pin.sessionId))
155
+ throw Error("General's saved host conversation scope differs");
156
+ return record.host.pin.sessionId;
157
+ }
158
+ /** One lifecycle-serialized switch. The injected stop must positively prove its exact old owner exited. */
159
+ export async function switchGeneralLocation(deps, input, execution) {
160
+ deps.assert();
161
+ execution.assert();
162
+ let source = structuredClone(deps.current());
163
+ const before = deps.store.read(input.name);
164
+ if (!source.general_topic || input.revision !== generalBindingRevision(before, source))
165
+ throw Error("General location changed; read its settings again");
166
+ const record = before ?? { version: 1, name: input.name, revision: randomUUID(), active: "host", host: { config: source }, windows: [] };
167
+ if (!before && source.runtime === "windows")
168
+ throw Error("The original host General binding is not available");
169
+ if (!record.pending && record.active !== "host")
170
+ record.windows.find(row => row.id === record.active).config = source;
171
+ const matches = (target, id) => target.location === "host" ? id === "host"
172
+ : record.windows.some(row => row.id === id && row.machineId === target.machineId && row.cli === target.cli && (row.config.model ?? "") === target.model);
173
+ // Finish only the already-committed config write before reversing a selected intent. This never starts it.
174
+ // The ordinary stop below must still prove that selected Windows owner exited (or was never launched).
175
+ if (record.pending?.phase === "selected" && matches(input.target, record.pending.from)
176
+ && settingsFingerprint(source) === settingsFingerprint(record.pending.source)) {
177
+ execution.mutate(() => deps.save(structuredClone(record.pending.target)));
178
+ source = structuredClone(deps.current());
179
+ }
180
+ if (!record.pending && record.hold === "start" && matches(input.target, record.active)) {
181
+ execution.commit(() => deps.save(source));
182
+ try {
183
+ await deps.start();
184
+ }
185
+ catch (err) {
186
+ deps.notify("start", err);
187
+ return { started: false };
188
+ }
189
+ delete record.hold;
190
+ deps.store.write(record);
191
+ deps.notify("complete");
192
+ return { started: true };
193
+ }
194
+ const activeWindows = record.windows.find(row => row.id === record.active);
195
+ if (!record.pending && input.target.location === "windows" && activeWindows?.machineId === input.target.machineId && activeWindows.cli === input.target.cli)
196
+ throw Error("General already runs at this location");
197
+ if (record.pending && matches(input.target, record.pending.to)) {
198
+ if (record.pending.phase === "selected") {
199
+ if (![record.pending.source, record.pending.target].some(row => settingsFingerprint(row) === settingsFingerprint(source)))
200
+ throw Error("General switch configuration was changed");
201
+ execution.commit(() => deps.save(structuredClone(record.pending.target)));
202
+ try {
203
+ await deps.start();
204
+ }
205
+ catch (err) {
206
+ record.hold = "start";
207
+ deps.store.write(record);
208
+ deps.notify("start", err);
209
+ return { started: false };
210
+ }
211
+ delete record.pending;
212
+ delete record.hold;
213
+ deps.store.write(record);
214
+ deps.notify("complete");
215
+ return { started: true };
216
+ }
217
+ if (settingsFingerprint(source) !== settingsFingerprint(record.pending.source))
218
+ throw Error("General switch configuration was changed");
219
+ }
220
+ else if (record.pending && record.pending.phase !== "selected")
221
+ throw Error("General has an unfinished switch to another location");
222
+ const replay = record.pending && record.pending.phase !== "selected" ? record.pending : undefined;
223
+ const windows = replay ? record.windows.find(row => row.id === replay.to) ?? null
224
+ : input.target.location === "windows" ? await deps.prepare(input.target, record) : null;
225
+ deps.assert();
226
+ execution.assert();
227
+ const to = windows?.id ?? "host";
228
+ if (to === record.active)
229
+ throw Error("General already runs at this location");
230
+ if (windows) {
231
+ const old = record.windows.findIndex(row => row.id === windows.id);
232
+ if (old < 0)
233
+ record.windows.push(windows);
234
+ else
235
+ record.windows[old] = windows;
236
+ }
237
+ if (!await deps.idle())
238
+ throw Error("Wait for General to be idle before switching its location");
239
+ deps.assert();
240
+ execution.assert();
241
+ const hostOwner = replay?.hostOwner ?? await deps.capture?.();
242
+ deps.assert();
243
+ execution.assert();
244
+ const target = structuredClone(windows?.config ?? record.host.config);
245
+ // The logical route always stays on the coordinator, including a retained host's older config.
246
+ for (const key of ["general_topic", "channel_id", "topic_id"]) {
247
+ if (source[key] === undefined)
248
+ delete target[key];
249
+ else
250
+ target[key] = source[key];
251
+ }
252
+ if (to === "host")
253
+ record.host.config = target;
254
+ else
255
+ record.windows.find(row => row.id === to).config = target;
256
+ record.pending = replay ?? { id: randomUUID(), phase: "prepared", from: record.active, to, source, target, at: Date.now(), ...(hostOwner ? { hostOwner } : {}) };
257
+ execution.mutate(() => deps.store.write(record));
258
+ let pin;
259
+ try {
260
+ await execution.stopTarget(input.name, async () => { pin = await deps.stop(record.pending.hostOwner); });
261
+ }
262
+ catch (err) {
263
+ record.hold = "exit";
264
+ deps.store.write(record);
265
+ deps.notify("exit", err);
266
+ throw err;
267
+ }
268
+ deps.assert();
269
+ execution.assert();
270
+ if (record.active === "host") {
271
+ record.host.config = structuredClone(deps.hostSnapshot?.() ?? source);
272
+ if (pin)
273
+ record.host.pin = pin;
274
+ }
275
+ record.pending.phase = "stopped";
276
+ execution.mutate(() => deps.store.write(record));
277
+ // Keep the stopped intent until both configuration and selected receipt are durable. Any crash in this gap holds.
278
+ record.active = to;
279
+ record.pending.phase = "selected";
280
+ record.revision = randomUUID();
281
+ delete record.hold;
282
+ execution.commit(() => { deps.store.write(record); deps.save(target); });
283
+ // The committed receipt permits only starting its selected config, never another settings mutation.
284
+ try {
285
+ await deps.start();
286
+ }
287
+ catch (err) {
288
+ record.hold = "start";
289
+ deps.store.write(record);
290
+ deps.notify("start", err);
291
+ return { started: false };
292
+ }
293
+ delete record.pending;
294
+ deps.store.write(record);
295
+ deps.notify("complete");
296
+ return { started: true };
297
+ }
298
+ //# sourceMappingURL=general-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general-binding.js","sourceRoot":"","sources":["../src/general-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { GeneralHostOwner } from "./general-binding.js";
2
+ /** Read-only exit barrier after the existing owned stop. Missing/unreadable evidence is never exit. */
3
+ export declare function confirmGeneralHostExit(owner: GeneralHostOwner, session: string, deps?: {
4
+ windows(): Promise<Array<{
5
+ id: string;
6
+ }>>;
7
+ probe(pid: number): unknown;
8
+ }): Promise<boolean>;
@@ -0,0 +1,26 @@
1
+ import { TmuxManager } from "./tmux-manager.js";
2
+ /** Read-only exit barrier after the existing owned stop. Missing/unreadable evidence is never exit. */
3
+ export async function confirmGeneralHostExit(owner, session, deps = { windows: () => TmuxManager.listWindows(session), probe: (pid) => process.kill(-pid, 0) }) {
4
+ if (!/^@\d+$/.test(owner.windowId) || !Number.isSafeInteger(owner.pid) || owner.pid <= 1)
5
+ return false;
6
+ let windows;
7
+ try {
8
+ windows = await deps.windows();
9
+ }
10
+ catch (err) {
11
+ const detail = String(err?.stderr ?? err.message ?? "");
12
+ if (!/can't find session|no server running/.test(detail))
13
+ return false;
14
+ windows = [];
15
+ }
16
+ if (windows.some(row => row.id === owner.windowId))
17
+ return false;
18
+ try {
19
+ deps.probe(owner.pid);
20
+ return false;
21
+ }
22
+ catch (err) {
23
+ return err.code === "ESRCH";
24
+ }
25
+ }
26
+ //# sourceMappingURL=general-host-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general-host-owner.js","sourceRoot":"","sources":["../src/general-host-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAe,EACnF,IAAI,GACA,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;IACtG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvG,IAAI,OAA8B,CAAC;IACnC,IAAI,CAAC;QAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACvC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,CAAE,GAA4B,EAAE,MAAM,IAAK,GAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACvE,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IAC5C,OAAO,GAAG,EAAE,CAAC;QAAC,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC;IAAC,CAAC;AACzE,CAAC"}
@@ -7,6 +7,13 @@ export declare const GENERAL_PAUSE_ERROR = "General cannot be paused";
7
7
  * general_topic covers renamed and per-world General instances.
8
8
  */
9
9
  export declare function isGeneralInstance(config: FleetConfig | null | undefined, name: string): boolean;
10
+ /**
11
+ * The literal-name fallback: an agent called `general` is the General — unless its General box was unticked
12
+ * (`general_topic: false`, alpha.3: the owner of a web-only fleet may untick it and tick another — never half a General).
13
+ */
14
+ export declare function generalByName(name: string, config: {
15
+ general_topic?: unknown;
16
+ } | null | undefined): boolean;
10
17
  /** M-2069: the name a fleet's General has by default (the auto-created one, and the setup's first agent). */
11
18
  export declare const GENERAL_NAME = "general";
12
19
  /**
@@ -7,7 +7,14 @@ export const GENERAL_PAUSE_ERROR = "General cannot be paused";
7
7
  * general_topic covers renamed and per-world General instances.
8
8
  */
9
9
  export function isGeneralInstance(config, name) {
10
- return name === "general" || config?.instances[name]?.general_topic === true;
10
+ return config?.instances[name]?.general_topic === true || generalByName(name, config?.instances[name]);
11
+ }
12
+ /**
13
+ * The literal-name fallback: an agent called `general` is the General — unless its General box was unticked
14
+ * (`general_topic: false`, alpha.3: the owner of a web-only fleet may untick it and tick another — never half a General).
15
+ */
16
+ export function generalByName(name, config) {
17
+ return name === "general" && config?.general_topic !== false;
11
18
  }
12
19
  /** M-2069: the name a fleet's General has by default (the auto-created one, and the setup's first agent). */
13
20
  export const GENERAL_NAME = "general";
@@ -37,11 +44,21 @@ export function generalTopicFor(channel) {
37
44
  */
38
45
  export function adoptGeneralByName(fleet, logger, ownFolder) {
39
46
  const channels = (fleet.channels ?? (fleet.channel ? [fleet.channel] : []));
40
- if (!channels.length || !Object.hasOwn(fleet.instances, GENERAL_NAME))
47
+ if (!Object.hasOwn(fleet.instances, GENERAL_NAME))
41
48
  return false;
42
49
  const inst = fleet.instances[GENERAL_NAME];
43
- if (inst.general_topic === true || Object.values(fleet.instances).some(cfg => cfg.general_topic === true))
50
+ // Unticked on purpose (general_topic: false): a worker by that name, left alone.
51
+ if (inst.general_topic === true || inst.general_topic === false || Object.values(fleet.instances).some(cfg => cfg.general_topic === true))
44
52
  return false;
53
+ if (!channels.length) {
54
+ // alpha.3 (the user, hmsg-7c8fd0e5): a web-only fleet's `general` — the setup's first agent — is its ticked General
55
+ // (no chat to bind: no topic), when it works in AgEnD's own folder (#2744: never a project of the user's).
56
+ if (!ownFolder(inst.working_directory))
57
+ return false;
58
+ inst.general_topic = true;
59
+ logger.warn({ name: GENERAL_NAME }, "An agent named general had no general_topic on a fleet with no chat connection — made it the General");
60
+ return true;
61
+ }
45
62
  const primary = channels[0], primaryId = String(primary.id ?? primary.type);
46
63
  if (inst.channel_id != null && inst.channel_id !== primaryId)
47
64
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"general-instance.js","sourceRoot":"","sources":["../src/general-instance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"general-instance.js","sourceRoot":"","sources":["../src/general-instance.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ capability (cheap/fast vs deep reasoning), or the backend needs one to behave
25
25
  | codex | account default | |
26
26
  | grok | account default | |
27
27
  | antigravity | account default | |
28
+ | muse | account default | `list_models` reads the provider catalog muse caches on disk (no models subcommand) |
28
29
  | opencode | provider default | ids are **`provider/model`**, as `opencode models` prints them |
29
30
 
30
31
  ## Discover real names
@@ -53,6 +54,7 @@ Underlying commands, if you need them by hand:
53
54
  | antigravity | `agy models` |
54
55
  | codex | `codex debug models` (with its CODEX_HOME set) — refreshes `models_cache.json` when it is older than a few minutes |
55
56
  | claude-code | fixed alias set (no command) |
57
+ | muse | none (no models subcommand) — use `list_models`; it reads muse's on-disk `model-catalog/<provider>__<profile>.json` |
56
58
 
57
59
  ## Setting one on create_instance
58
60
 
@@ -0,0 +1,5 @@
1
+ /** Shared General role text; native publication never loads a coordinator workspace or login. */
2
+ export declare const GENERAL_ROLE_INSTRUCTIONS = "# Fleet Coordinator\n\nYou are the fleet coordinator \u2014 the central entry point for this AgEnD fleet.\nYou route tasks, manage instances, enforce policies, and synthesize results.\nDo NOT modify project files directly \u2014 delegate file changes to the project's instance.\nYou CAN write code snippets, explain code, and answer technical questions directly.\n\n## Task Routing\n\n- **Handle directly**: no file/exec access needed, answerable from knowledge, \u22642 reasoning steps (Q&A, translation, status queries, code snippets).\n- **Delegate to 1 instance**: scoped to one project/repo, needs file access or execution.\n- **Coordinate multiple**: spans repos, outputs feed each other, or parallel helps (max 3 per task).\n\nInstance discovery: start with list_instances(); follow the guidance in its response. Prefer reuse; never duplicate a running instance.\n\n## Reply Contract\n\nEvery final response to the user contains: the result (the actual answer or deliverable) and gaps (anything incomplete \u2014 omit if none). Summarize instance reports; omit internal coordination noise.\n\n## After Restart\n\nBEFORE processing any new messages: 1. list_instances() 2. list_teams() 3. list_decisions(). Only then handle requests.\n\n## Playbooks (on-demand skills)\n\nDetailed procedures live in your skills \u2014 consult them when the situation comes up rather than from memory:\n- **delegation-playbook** \u2014 delegation protocol, loop prevention, parallel vs sequential, result/failure handling, team management, instance configuration tips.\n- **development-workflow** \u2014 the fleet-wide code-change policy you enforce when delegating code tasks.\nPlus the operational skills (fleet-health, instance-lifecycle, scheduling, session-management, \u2026).\n";
3
+ /** Fixed installed program assets, never an enumeration of a runtime profile. */
4
+ export declare const GENERAL_SKILL_NAMES: readonly ["backend-providers", "bug-report", "credential-profiles", "cross-instance-messaging", "delegation-playbook", "development-workflow", "docker-install", "fleet-config", "fleet-health", "fleet-restart", "instance-lifecycle", "kiro-engine-migration", "model-discovery", "multi-channel", "scheduling", "session-management", "tui-effort", "web-appearance", "web-dashboard"];
5
+ export declare const GENERAL_KNOWLEDGE_FILES: readonly ["steering/core-rules.md", ...string[]];
@@ -0,0 +1,26 @@
1
+ /** Shared General role text; native publication never loads a coordinator workspace or login. */
2
+ export const GENERAL_ROLE_INSTRUCTIONS = "# Fleet Coordinator\n\nYou are the fleet coordinator — the central entry point for this AgEnD fleet.\nYou route tasks, manage instances, enforce policies, and synthesize results.\nDo NOT modify project files directly — delegate file changes to the project's instance.\nYou CAN write code snippets, explain code, and answer technical questions directly.\n\n## Task Routing\n\n- **Handle directly**: no file/exec access needed, answerable from knowledge, ≤2 reasoning steps (Q&A, translation, status queries, code snippets).\n- **Delegate to 1 instance**: scoped to one project/repo, needs file access or execution.\n- **Coordinate multiple**: spans repos, outputs feed each other, or parallel helps (max 3 per task).\n\nInstance discovery: start with list_instances(); follow the guidance in its response. Prefer reuse; never duplicate a running instance.\n\n## Reply Contract\n\nEvery final response to the user contains: the result (the actual answer or deliverable) and gaps (anything incomplete — omit if none). Summarize instance reports; omit internal coordination noise.\n\n## After Restart\n\nBEFORE processing any new messages: 1. list_instances() 2. list_teams() 3. list_decisions(). Only then handle requests.\n\n## Playbooks (on-demand skills)\n\nDetailed procedures live in your skills — consult them when the situation comes up rather than from memory:\n- **delegation-playbook** — delegation protocol, loop prevention, parallel vs sequential, result/failure handling, team management, instance configuration tips.\n- **development-workflow** — the fleet-wide code-change policy you enforce when delegating code tasks.\nPlus the operational skills (fleet-health, instance-lifecycle, scheduling, session-management, …).\n";
3
+ /** Fixed installed program assets, never an enumeration of a runtime profile. */
4
+ export const GENERAL_SKILL_NAMES = [
5
+ "backend-providers",
6
+ "bug-report",
7
+ "credential-profiles",
8
+ "cross-instance-messaging",
9
+ "delegation-playbook",
10
+ "development-workflow",
11
+ "docker-install",
12
+ "fleet-config",
13
+ "fleet-health",
14
+ "fleet-restart",
15
+ "instance-lifecycle",
16
+ "kiro-engine-migration",
17
+ "model-discovery",
18
+ "multi-channel",
19
+ "scheduling",
20
+ "session-management",
21
+ "tui-effort",
22
+ "web-appearance",
23
+ "web-dashboard"
24
+ ];
25
+ export const GENERAL_KNOWLEDGE_FILES = ["steering/core-rules.md", ...GENERAL_SKILL_NAMES.map(name => `skills/${name}/SKILL.md`)];
26
+ //# sourceMappingURL=general-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general-role.js","sourceRoot":"","sources":["../src/general-role.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,usDAAusD,CAAC;AAEjvD,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,mBAAmB;IACnB,YAAY;IACZ,qBAAqB;IACrB,0BAA0B;IAC1B,qBAAqB;IACrB,sBAAsB;IACtB,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,uBAAuB;IACvB,iBAAiB;IACjB,eAAe;IACf,YAAY;IACZ,oBAAoB;IACpB,YAAY;IACZ,gBAAgB;IAChB,eAAe;CACP,CAAC;AACX,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,wBAAwB,EAAE,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,WAAW,CAAC,CAAU,CAAC"}
@@ -57,6 +57,7 @@ export declare function getUnsafeInstanceDaemonPidReason(pid: number, dataDir: s
57
57
  * FleetManager implements this.
58
58
  */
59
59
  export interface LifecycleContext {
60
+ assertGeneralBindingStart?(name: string, config: InstanceConfig): void;
60
61
  /** Prepared native ownership replaces local launch files/configuration, never a failed-local fallback. */
61
62
  nativePaneFor?(name: string, config: InstanceConfig, assertCurrent: () => void): Promise<import("./native-pane-lifecycle.js").NativePaneLifecycle>;
62
63
  reconcileNativePaneBeforeStart?(name: string, daemon: Daemon): Promise<boolean>;
@@ -1,4 +1,5 @@
1
1
  import { NativePaneRecoveryError } from "./native-pane-recovery.js";
2
+ import { addsSecondGeneral } from "./web-only-fleet.js";
2
3
  import { NativePaneCrashBudget } from "./native-pane-crash-budget.js";
3
4
  import { localWindowsCliEnabled, remoteRuntimeEnabled } from "./runtime-switches.js";
4
5
  import { settingsUndo, undoSettingsPaths } from "./settings-transaction.js";
@@ -15,7 +16,7 @@ import { getAgendHome, ensureWorkspaceGit } from "./paths.js";
15
16
  import { DEFAULT_INSTANCE_CONFIG, getEffectiveInstanceDefaults, getTmuxSession, newInstanceKiroUi } from "./config.js";
16
17
  import { readStatuslineModel, uniqueInstanceName } from "./topic-commands.js";
17
18
  import { sanitizeInstanceName } from "./instance-names.js";
18
- import { isModelCompatible } from "./backend/types.js";
19
+ import { isModelCompatible, noteResolvedBinary } from "./backend/types.js";
19
20
  import { safeHandler } from "./safe-async.js";
20
21
  import { t } from "./locale.js";
21
22
  import { interactionCategory } from "./interaction-observation.js";
@@ -1561,6 +1562,7 @@ export class InstanceLifecycle {
1561
1562
  const check = () => { execution?.assert(); if (this.epochOf(name) !== epoch)
1562
1563
  throw new SupersededStartError(name); };
1563
1564
  check();
1565
+ this.ctx.assertGeneralBindingStart?.(name, config);
1564
1566
  assertNoSessionOomStop(this.ctx.getInstanceDir(name));
1565
1567
  const seedNow = this.activitySeedNow.delete(name);
1566
1568
  if (this.daemons.has(name)) {
@@ -1595,10 +1597,19 @@ export class InstanceLifecycle {
1595
1597
  this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
1596
1598
  return;
1597
1599
  }
1598
- // Verify backend binary is in PATH before spawning
1600
+ // Verify backend binary is in PATH before spawning. Off-loop resolve pins a
1601
+ // hint so createBackend's resolveBinary does not run synchronous `which`
1602
+ // (#1490 row 67). Missing still only logs; start continues.
1599
1603
  const installation = BACKEND_INSTALLATION_INFO[backendName];
1600
- if (!native && installation && !checkBinaryInstalled(installation.binary)) {
1601
- this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1604
+ // alpha: a native Windows pane's CLI is on that PC — nothing to look for on this one.
1605
+ if (!native && installation) {
1606
+ const { resolveBackendBinary } = await import("./backend-availability.js");
1607
+ const path = await resolveBackendBinary(backendName);
1608
+ noteResolvedBinary(installation.binary, path ?? installation.binary);
1609
+ check();
1610
+ if (!path) {
1611
+ this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1612
+ }
1602
1613
  }
1603
1614
  // claude-code refuses --dangerously-skip-permissions as root — fail fast
1604
1615
  // Unless IS_SANDBOX=1 is set (recognized sandbox environment)
@@ -2173,6 +2184,12 @@ export class InstanceLifecycle {
2173
2184
  respond(null, WINDOWS_CREATE_REFUSED);
2174
2185
  return;
2175
2186
  }
2187
+ // #3021 review: on a fleet with no chat connection a new agent never becomes a second General (it would inherit
2188
+ // defaults.general_topic: true while the fleet has one).
2189
+ if (this.ctx.fleetConfig && addsSecondGeneral(this.ctx.fleetConfig)) {
2190
+ respond(null, "one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
2191
+ return;
2192
+ }
2176
2193
  if (args.sandbox !== undefined) {
2177
2194
  respond(null, "sandbox is supported only by the Windows runtime");
2178
2195
  return;
@@ -2467,6 +2484,11 @@ export class InstanceLifecycle {
2467
2484
  createdConfig = instanceConfig;
2468
2485
  const beforeCreate = structuredClone(this.ctx.fleetConfig);
2469
2486
  const persist = () => {
2487
+ // #3021 review r2: asked again at the commit, after every await — two creates that both saw no General at entry
2488
+ // (defaults.general_topic: true) must not both become one.
2489
+ if (addsSecondGeneral(this.ctx.fleetConfig, { general_topic: instanceConfig.general_topic })) {
2490
+ throw new Error("one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
2491
+ }
2470
2492
  this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
2471
2493
  if (createdTopicId != null)
2472
2494
  this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });