@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.
- package/dist/agend-home.d.ts +13 -0
- package/dist/agend-home.js +42 -0
- package/dist/agend-home.js.map +1 -1
- package/dist/agent-runtime-api.d.ts +4 -0
- package/dist/agent-runtime-api.js +59 -0
- package/dist/agent-runtime-api.js.map +1 -0
- package/dist/agent-runtime-change.d.ts +74 -0
- package/dist/agent-runtime-change.js +102 -0
- package/dist/agent-runtime-change.js.map +1 -0
- package/dist/auth-api.d.ts +21 -0
- package/dist/auth-api.js +95 -4
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/web-authority.d.ts +12 -2
- package/dist/authority/web-authority.js +25 -4
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/claude-code.js +16 -1
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +4 -0
- package/dist/backend/codex-footer-hints.js +27 -0
- package/dist/backend/codex-footer-hints.js.map +1 -0
- package/dist/backend/codex.js +19 -11
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +2 -0
- package/dist/backend/kiro-identity.js +13 -6
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.js +18 -3
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend-availability.d.ts +6 -0
- package/dist/backend-availability.js +13 -5
- package/dist/backend-availability.js.map +1 -1
- package/dist/channel/mcp-tools.js +1 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +6 -9
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +12 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.js +107 -30
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +146 -8
- package/dist/fleet-manager.js +1030 -166
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +6 -1
- package/dist/fleet-windows-runtime.js +77 -1
- package/dist/fleet-windows-runtime.js.map +1 -1
- package/dist/fleet-yaml-patch.d.ts +3 -0
- package/dist/fleet-yaml-patch.js +103 -0
- package/dist/fleet-yaml-patch.js.map +1 -0
- package/dist/general-binding.d.ts +85 -0
- package/dist/general-binding.js +298 -0
- package/dist/general-binding.js.map +1 -0
- package/dist/general-host-owner.d.ts +8 -0
- package/dist/general-host-owner.js +26 -0
- package/dist/general-host-owner.js.map +1 -0
- package/dist/general-instance.d.ts +7 -0
- package/dist/general-instance.js +20 -3
- package/dist/general-instance.js.map +1 -1
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +2 -0
- package/dist/general-role.d.ts +5 -0
- package/dist/general-role.js +26 -0
- package/dist/general-role.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +1 -0
- package/dist/instance-lifecycle.js +26 -4
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +2 -0
- package/dist/instructions.js +6 -0
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-resume-summary.d.ts +37 -0
- package/dist/kiro-resume-summary.js +85 -0
- package/dist/kiro-resume-summary.js.map +1 -0
- package/dist/locale.js +59 -0
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.js +9 -1
- package/dist/login-controller.js.map +1 -1
- package/dist/native-pane-lifecycle.js +4 -1
- package/dist/native-pane-lifecycle.js.map +1 -1
- package/dist/native-pane-manager.d.ts +1 -0
- package/dist/native-pane-manager.js +23 -2
- package/dist/native-pane-manager.js.map +1 -1
- package/dist/needs-you-hub.js +1 -1
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +8 -1
- package/dist/needs-you.js +5 -2
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +1 -1
- package/dist/office-share-page.js.map +1 -1
- package/dist/package-preimage.js +27 -2
- package/dist/package-preimage.js.map +1 -1
- package/dist/pane-port.d.ts +11 -0
- package/dist/public-web-gateway.js +9 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +11 -0
- package/dist/public-web-link.js +13 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.js +9 -5
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +4 -1
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -0
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/runtime-api.js +84 -9
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.d.ts +9 -0
- package/dist/runtime-build-info.js +57 -0
- package/dist/runtime-build-info.js.map +1 -0
- package/dist/runtime-bundle.d.ts +3 -1
- package/dist/runtime-bundle.js +17 -8
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +6 -1
- package/dist/runtime-cli.js +46 -11
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +20 -1
- package/dist/runtime-client-store.js +56 -4
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +12 -0
- package/dist/runtime-client.js +43 -7
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-connection.d.ts +22 -0
- package/dist/runtime-connection.js +93 -0
- package/dist/runtime-connection.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +9 -0
- package/dist/runtime-coordinator.js +81 -34
- package/dist/runtime-coordinator.js.map +1 -1
- package/dist/runtime-general-protocol.d.ts +22 -0
- package/dist/runtime-general-protocol.js +57 -0
- package/dist/runtime-general-protocol.js.map +1 -0
- package/dist/runtime-general-workspace.d.ts +17 -0
- package/dist/runtime-general-workspace.js +213 -0
- package/dist/runtime-general-workspace.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +1 -1
- package/dist/runtime-pane-assets.js +1 -1
- package/dist/runtime-pane-assets.js.map +1 -1
- package/dist/runtime-pane-boot.d.ts +7 -0
- package/dist/runtime-pane-boot.js +23 -0
- package/dist/runtime-pane-boot.js.map +1 -1
- package/dist/runtime-pane-host.d.ts +1 -0
- package/dist/runtime-pane-host.js +22 -1
- package/dist/runtime-pane-host.js.map +1 -1
- package/dist/runtime-pane-mcp.d.ts +8 -0
- package/dist/runtime-pane-mcp.js +15 -2
- package/dist/runtime-pane-mcp.js.map +1 -1
- package/dist/runtime-pane-port.d.ts +6 -1
- package/dist/runtime-pane-port.js +21 -0
- package/dist/runtime-pane-port.js.map +1 -1
- package/dist/runtime-pane-protocol.d.ts +4 -1
- package/dist/runtime-pane-protocol.js +7 -1
- package/dist/runtime-pane-protocol.js.map +1 -1
- package/dist/runtime-protocol.d.ts +13 -0
- package/dist/runtime-protocol.js +18 -0
- package/dist/runtime-protocol.js.map +1 -1
- package/dist/settings-api.d.ts +5 -0
- package/dist/settings-api.js +37 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +1 -0
- package/dist/settings-baseline.js +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-confirmation.d.ts +1 -0
- package/dist/settings-confirmation.js +1 -0
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.d.ts +4 -0
- package/dist/settings-effect.js +36 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +4 -0
- package/dist/settings-http-confirmation.js +20 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-request-capability.d.ts +2 -0
- package/dist/settings-request-capability.js +4 -0
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-route-lifetime.d.ts +14 -0
- package/dist/settings-route-lifetime.js +48 -0
- package/dist/settings-route-lifetime.js.map +1 -0
- package/dist/settings-transaction.d.ts +4 -0
- package/dist/settings-transaction.js +9 -0
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-form.js +6 -3
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +3 -0
- package/dist/setup-i18n.js.map +1 -1
- package/dist/stall-reporter.d.ts +21 -0
- package/dist/stall-reporter.js +82 -0
- package/dist/stall-reporter.js.map +1 -0
- package/dist/tmux-control.d.ts +2 -2
- package/dist/tmux-control.js +4 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +6 -3
- package/dist/tmux-exec-helper.js +115 -53
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tool-permissions.js +2 -1
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +4 -0
- package/dist/tunnel/cloudflared-install.js +20 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +8 -1
- package/dist/tunnel/cloudflared.js +34 -6
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.d.ts +3 -3
- package/dist/tunnel/lease.js +23 -19
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js +6 -7
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/ui/agent-proposals.js +2 -2
- package/dist/ui/agent-runtime-settings.js +67 -0
- package/dist/ui/agent-runtime.js +20 -2
- package/dist/ui/backend-signin.js +36 -21
- package/dist/ui/general-location.js +71 -0
- package/dist/ui/native-instance-settings.js +5 -8
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/panel-chat.js +5 -2
- package/dist/ui/panel-fleet.js +4 -2
- package/dist/ui/panel-needs.js +2 -0
- package/dist/ui/panel-runtimes.js +136 -33
- package/dist/ui/panel-settings.js +227 -138
- package/dist/ui/panel-windows-cli.js +77 -41
- package/dist/ui/settings-agent-filters.js +94 -0
- package/dist/ui/settings-appearance.js +122 -23
- package/dist/ui/settings-dialogs.js +13 -7
- package/dist/ui/settings-guests.js +25 -11
- package/dist/ui/settings-layout.js +245 -0
- package/dist/ui/settings-model.js +10 -1
- package/dist/ui/settings-outside.js +176 -0
- package/dist/ui/settings-registry.js +6 -3
- package/dist/ui/settings-shortcuts.js +65 -0
- package/dist/ui/settings-strings.js +95 -0
- package/dist/ui/settings-web-authority.js +14 -11
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-shell.js +17 -7
- package/dist/ui/shared/app.css +1038 -13
- package/dist/ui/shared/instance-nav.js +16 -5
- package/dist/ui/shared/machine-name.js +13 -0
- package/dist/ui/shared/panel-view.js +266 -17
- package/dist/ui/shared/qrcode.module.js +2237 -0
- package/dist/ui/shared/settings-width.js +31 -0
- package/dist/ui/shared/signin.js +39 -5
- package/dist/ui/shared/tokens.css +1 -0
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +3 -3
- package/dist/ui/shared/vendor/qrcode-generator.LICENSE +27 -0
- package/dist/ui/shared/vendor/vendor.json +19 -2
- package/dist/ui/shared/view-strings.js +28 -0
- package/dist/ui/windows-cli-catalog.js +41 -12
- package/dist/unattended-install.d.ts +1 -1
- package/dist/unattended-install.js +19 -5
- package/dist/unattended-install.js.map +1 -1
- package/dist/update-check.d.ts +2 -8
- package/dist/update-check.js +2 -5
- package/dist/update-check.js.map +1 -1
- package/dist/view-api.d.ts +15 -0
- package/dist/view-api.js +94 -33
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +13 -0
- package/dist/web-api.js +80 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-login.d.ts +4 -3
- package/dist/web-login.js +23 -14
- package/dist/web-login.js.map +1 -1
- package/dist/web-only-fleet.d.ts +20 -0
- package/dist/web-only-fleet.js +21 -0
- package/dist/web-only-fleet.js.map +1 -1
- package/dist/web-remote-access.d.ts +152 -0
- package/dist/web-remote-access.js +368 -0
- package/dist/web-remote-access.js.map +1 -0
- package/dist/web-session.d.ts +12 -0
- package/dist/web-session.js +22 -8
- package/dist/web-session.js.map +1 -1
- package/dist/windows-agents.d.ts +15 -1
- package/dist/windows-agents.js +37 -10
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.js +2 -1
- package/dist/windows-cli-api.js.map +1 -1
- package/dist/windows-cli-worker.d.ts +1 -0
- package/dist/windows-cli-worker.js +2 -2
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +1 -0
- package/dist/windows-cli.js +7 -2
- package/dist/windows-cli.js.map +1 -1
- package/launcher/agend-install.cjs +16 -2
- 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
|
/**
|
package/dist/general-instance.js
CHANGED
|
@@ -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 ===
|
|
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 (!
|
|
47
|
+
if (!Object.hasOwn(fleet.instances, GENERAL_NAME))
|
|
41
48
|
return false;
|
|
42
49
|
const inst = fleet.instances[GENERAL_NAME];
|
|
43
|
-
|
|
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":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsC,EAAE,IAAY;IACpF,OAAO,IAAI,KAAK,
|
|
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
|
-
|
|
1601
|
-
|
|
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 });
|