@songsid/agend 2.1.12 → 2.2.0-alpha.1
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/README.md +2 -2
- package/README.zh-TW.md +2 -2
- package/dist/auth/one-time-code.d.ts +19 -0
- package/dist/auth/one-time-code.js +49 -0
- package/dist/auth/one-time-code.js.map +1 -0
- package/dist/auth-api.d.ts +52 -0
- package/dist/auth-api.js +346 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/backend/claude-code.d.ts +4 -0
- package/dist/backend/claude-code.js +97 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.js +59 -30
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-agent.d.ts +66 -0
- package/dist/backend/kiro-agent.js +302 -0
- package/dist/backend/kiro-agent.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +80 -0
- package/dist/backend/kiro-identity.js +537 -0
- package/dist/backend/kiro-identity.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
- package/dist/backend/kiro-v2-store-worker.js +87 -0
- package/dist/backend/kiro-v2-store-worker.js.map +1 -0
- package/dist/backend/kiro-v2-store.d.ts +54 -0
- package/dist/backend/kiro-v2-store.js +131 -0
- package/dist/backend/kiro-v2-store.js.map +1 -0
- package/dist/backend/kiro-v3-identity.d.ts +5 -0
- package/dist/backend/kiro-v3-identity.js +22 -0
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +83 -7
- package/dist/backend/kiro.js +418 -91
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +45 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +1 -0
- package/dist/channel/adapters/discord.js +29 -10
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +1 -0
- package/dist/channel/adapters/telegram.js +13 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +9 -1
- package/dist/classic-channel-manager.d.ts +18 -10
- package/dist/classic-channel-manager.js +45 -18
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +225 -127
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +5 -3
- package/dist/command-table.js +29 -27
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +46 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.d.ts +6 -0
- package/dist/connection-secrets.js +4 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/daemon.d.ts +89 -4
- package/dist/daemon.js +661 -77
- package/dist/daemon.js.map +1 -1
- package/dist/darwin-memory.d.ts +6 -1
- package/dist/darwin-memory.js +17 -6
- package/dist/darwin-memory.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +85 -0
- package/dist/delivery-consumed-watch.js +244 -0
- package/dist/delivery-consumed-watch.js.map +1 -0
- package/dist/delivery-outbox.d.ts +61 -0
- package/dist/delivery-outbox.js +120 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +14 -5
- package/dist/delivery-reconciliation.js +27 -4
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/delivery-reconciliation.test.js +35 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/event-loop-watch.d.ts +28 -0
- package/dist/event-loop-watch.js +75 -3
- package/dist/event-loop-watch.js.map +1 -1
- package/dist/fleet-context.d.ts +22 -2
- package/dist/fleet-level-config.d.ts +2 -2
- package/dist/fleet-level-config.js +6 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +293 -12
- package/dist/fleet-manager.js +2364 -449
- package/dist/fleet-manager.js.map +1 -1
- package/dist/host-memory.d.ts +4 -0
- package/dist/host-memory.js.map +1 -1
- package/dist/instance-config-impact.js +5 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -5
- package/dist/instance-lifecycle.js +162 -53
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +150 -16
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.d.ts +2 -0
- package/dist/login-controller.js +17 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/memory-pressure.d.ts +7 -8
- package/dist/memory-pressure.js +76 -15
- package/dist/memory-pressure.js.map +1 -1
- package/dist/monotonic-budget.d.ts +2 -0
- package/dist/monotonic-budget.js +28 -0
- package/dist/monotonic-budget.js.map +1 -0
- package/dist/needs-you-hub.d.ts +114 -0
- package/dist/needs-you-hub.js +370 -0
- package/dist/needs-you-hub.js.map +1 -0
- package/dist/needs-you-live.d.ts +116 -0
- package/dist/needs-you-live.js +228 -0
- package/dist/needs-you-live.js.map +1 -0
- package/dist/needs-you.d.ts +132 -0
- package/dist/needs-you.js +164 -0
- package/dist/needs-you.js.map +1 -0
- package/dist/node-version-guard.d.ts +30 -0
- package/dist/node-version-guard.js +50 -0
- package/dist/node-version-guard.js.map +1 -0
- package/dist/operator-control-paths.d.ts +4 -0
- package/dist/operator-control-paths.js +24 -0
- package/dist/operator-control-paths.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +9 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +5 -5
- package/dist/profile-control.js +4 -20
- package/dist/profile-control.js.map +1 -1
- package/dist/public-web-gateway.d.ts +18 -0
- package/dist/public-web-gateway.js +141 -0
- package/dist/public-web-gateway.js.map +1 -0
- package/dist/public-web-link.d.ts +53 -0
- package/dist/public-web-link.js +175 -0
- package/dist/public-web-link.js.map +1 -0
- package/dist/quickstart-api.d.ts +8 -1
- package/dist/quickstart-api.js +86 -48
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +6 -2
- package/dist/quickstart.js.map +1 -1
- package/dist/scheduler/db.d.ts +7 -1
- package/dist/scheduler/db.js +38 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/retry-label.d.ts +11 -0
- package/dist/scheduler/retry-label.js +24 -0
- package/dist/scheduler/retry-label.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +55 -2
- package/dist/scheduler/scheduler.js +220 -8
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +22 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +5 -0
- package/dist/secret-store.js +20 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-activation.d.ts +110 -0
- package/dist/service-activation.js +302 -0
- package/dist/service-activation.js.map +1 -0
- package/dist/service-installer.d.ts +7 -0
- package/dist/service-installer.js +7 -4
- package/dist/service-installer.js.map +1 -1
- package/dist/service-restart-selection.d.ts +6 -5
- package/dist/service-restart-selection.js +6 -5
- package/dist/service-restart-selection.js.map +1 -1
- package/dist/settings-api.d.ts +10 -2
- package/dist/settings-api.js +175 -72
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +20 -0
- package/dist/settings-baseline.js +104 -0
- package/dist/settings-baseline.js.map +1 -0
- package/dist/settings-change.d.ts +21 -0
- package/dist/settings-change.js +133 -0
- package/dist/settings-change.js.map +1 -0
- package/dist/settings-confirmation.d.ts +105 -0
- package/dist/settings-confirmation.js +232 -0
- package/dist/settings-confirmation.js.map +1 -0
- package/dist/settings-control.d.ts +41 -0
- package/dist/settings-control.js +294 -0
- package/dist/settings-control.js.map +1 -0
- package/dist/settings-effect.d.ts +24 -0
- package/dist/settings-effect.js +169 -0
- package/dist/settings-effect.js.map +1 -0
- package/dist/settings-http-confirmation.d.ts +29 -0
- package/dist/settings-http-confirmation.js +123 -0
- package/dist/settings-http-confirmation.js.map +1 -0
- package/dist/settings-instance-patch.d.ts +4 -0
- package/dist/settings-instance-patch.js +26 -0
- package/dist/settings-instance-patch.js.map +1 -0
- package/dist/settings-request-capability.d.ts +16 -0
- package/dist/settings-request-capability.js +32 -0
- package/dist/settings-request-capability.js.map +1 -0
- package/dist/settings-transaction.d.ts +65 -0
- package/dist/settings-transaction.js +223 -0
- package/dist/settings-transaction.js.map +1 -0
- package/dist/setup-auth.d.ts +10 -18
- package/dist/setup-auth.js +14 -38
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +75 -18
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-guide.d.ts +13 -0
- package/dist/setup-guide.js +25 -0
- package/dist/setup-guide.js.map +1 -0
- package/dist/setup-host.d.ts +16 -0
- package/dist/setup-host.js +197 -32
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +3 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/slash-authz.d.ts +17 -3
- package/dist/slash-authz.js +5 -0
- package/dist/slash-authz.js.map +1 -1
- package/dist/spawn-gate.js +3 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/statusline-watcher.d.ts +5 -0
- package/dist/statusline-watcher.js +2 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/steer-capability.d.ts +6 -0
- package/dist/steer-capability.js +8 -0
- package/dist/steer-capability.js.map +1 -1
- package/dist/sync-work-attribution.d.ts +14 -0
- package/dist/sync-work-attribution.js +43 -8
- package/dist/sync-work-attribution.js.map +1 -1
- package/dist/tips.js +10 -5
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.d.ts +35 -5
- package/dist/tmux-control.js +291 -57
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +20 -6
- package/dist/tmux-manager.js +90 -47
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +59 -0
- package/dist/tmux-read.js +213 -0
- package/dist/tmux-read.js.map +1 -0
- package/dist/topic-commands.d.ts +21 -10
- package/dist/topic-commands.js +191 -58
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.js +2 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +2 -0
- package/dist/tunnel/cloudflared-install.js +1 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +14 -0
- package/dist/tunnel/purpose-lane.js +43 -0
- package/dist/tunnel/purpose-lane.js.map +1 -0
- package/dist/turn-reply-guard.d.ts +2 -0
- package/dist/turn-reply-guard.js +10 -1
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/ui/app.html +18 -0
- package/dist/ui/chat-render.js +478 -0
- package/dist/ui/chat-store.js +289 -0
- package/dist/ui/chat-strings.js +69 -0
- package/dist/ui/chat-thread.js +209 -0
- package/dist/ui/chat-tour.js +116 -0
- package/dist/ui/fleet-org.js +142 -0
- package/dist/ui/panel-chat.js +418 -0
- package/dist/ui/panel-fleet.js +413 -0
- package/dist/ui/panel-needs.js +202 -0
- package/dist/ui/panel-settings.js +750 -0
- package/dist/ui/preview.js +266 -0
- package/dist/ui/settings-apply.js +239 -0
- package/dist/ui/settings-confirm.js +186 -0
- package/dist/ui/settings-dialogs.js +546 -0
- package/dist/ui/settings-model.js +277 -0
- package/dist/ui/settings-strings.js +652 -0
- package/dist/ui/settings-wizard.js +140 -0
- package/dist/ui/shared/agend-auth.js +93 -0
- package/dist/ui/shared/app-ctx.js +80 -0
- package/dist/ui/shared/app-html.js +9 -0
- package/dist/ui/shared/app-i18n.js +95 -0
- package/dist/ui/shared/app-nav.js +73 -0
- package/dist/ui/shared/app-needs.js +114 -0
- package/dist/ui/shared/app-route.js +73 -0
- package/dist/ui/shared/app-session.js +66 -0
- package/dist/ui/shared/app-shell.js +344 -0
- package/dist/ui/shared/app-store.js +51 -0
- package/dist/ui/shared/app-stream.js +201 -0
- package/dist/ui/shared/app.css +676 -0
- package/dist/ui/shared/app.js +88 -0
- package/dist/ui/shared/fonts/OFL.txt +92 -0
- package/dist/ui/shared/fonts/README.md +21 -0
- package/dist/ui/shared/fonts/inter.woff2 +0 -0
- package/dist/ui/shared/htm.module.js +1 -0
- package/dist/ui/shared/panel-view.js +655 -0
- package/dist/ui/shared/preact-hooks.module.js +2 -0
- package/dist/ui/shared/preact.module.js +2 -0
- package/dist/ui/shared/signin.js +130 -0
- package/dist/ui/shared/theme.js +29 -0
- package/dist/ui/shared/tokens.css +153 -0
- package/dist/ui/shared/ui-confirm.js +43 -0
- package/dist/ui/shared/ui-dialog.js +45 -0
- package/dist/ui/shared/ui-icons.js +61 -0
- package/dist/ui/shared/ui-menu.js +39 -0
- package/dist/ui/shared/ui-states.js +20 -0
- package/dist/ui/shared/ui-toast.js +18 -0
- package/dist/ui/shared/vendor/htm.LICENSE +202 -0
- package/dist/ui/shared/vendor/preact.LICENSE +21 -0
- package/dist/ui/shared/vendor/vendor.json +39 -0
- package/dist/ui/shared/view-strings.js +309 -0
- package/dist/ui/signin.html +51 -0
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +12 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-install.d.ts +71 -0
- package/dist/update-install.js +162 -0
- package/dist/update-install.js.map +1 -0
- package/dist/upgrade-notices.d.ts +17 -0
- package/dist/upgrade-notices.js +93 -0
- package/dist/upgrade-notices.js.map +1 -0
- package/dist/usage/statusline-usage.d.ts +2 -0
- package/dist/usage/statusline-usage.js +14 -10
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +6 -1
- package/dist/view-api.js +62 -51
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +71 -14
- package/dist/web-api.js +492 -77
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +71 -27
- package/dist/web-auth.js +169 -69
- package/dist/web-auth.js.map +1 -1
- package/dist/web-body.d.ts +3 -0
- package/dist/web-body.js +55 -0
- package/dist/web-body.js.map +1 -0
- package/dist/web-channel-echo.d.ts +9 -0
- package/dist/web-channel-echo.js +55 -0
- package/dist/web-channel-echo.js.map +1 -0
- package/dist/web-chat-history.d.ts +125 -0
- package/dist/web-chat-history.js +184 -0
- package/dist/web-chat-history.js.map +1 -0
- package/dist/web-continuation.d.ts +7 -0
- package/dist/web-continuation.js +22 -0
- package/dist/web-continuation.js.map +1 -0
- package/dist/web-host-guard.d.ts +34 -0
- package/dist/web-host-guard.js +57 -1
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-login.d.ts +72 -0
- package/dist/web-login.js +132 -0
- package/dist/web-login.js.map +1 -0
- package/dist/web-org.d.ts +55 -0
- package/dist/web-org.js +67 -0
- package/dist/web-org.js.map +1 -0
- package/dist/web-preview.d.ts +77 -0
- package/dist/web-preview.js +240 -0
- package/dist/web-preview.js.map +1 -0
- package/dist/web-request-context.d.ts +10 -0
- package/dist/web-request-context.js +13 -0
- package/dist/web-request-context.js.map +1 -0
- package/dist/web-session.d.ts +167 -0
- package/dist/web-session.js +389 -0
- package/dist/web-session.js.map +1 -0
- package/dist/web-shell-routes.d.ts +59 -0
- package/dist/web-shell-routes.js +96 -0
- package/dist/web-shell-routes.js.map +1 -0
- package/dist/web-upload.d.ts +183 -0
- package/dist/web-upload.js +468 -0
- package/dist/web-upload.js.map +1 -0
- package/dist/website-tips-renderer.d.ts +2 -2
- package/dist/website-tips-renderer.js +3 -3
- package/dist/website-tips-renderer.js.map +1 -1
- package/package.json +8 -5
- package/scripts/preinstall-guard.cjs +36 -0
- package/dist/ui/dashboard.html +0 -774
- package/dist/ui/settings.html +0 -2165
- package/dist/ui/view.html +0 -1139
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One kiro agent per instance, and the shared workspace files it replaces (#906,
|
|
3
|
+
* docs/design/kiro-per-instance-agent.md §1 and §4).
|
|
4
|
+
*
|
|
5
|
+
* Every write and every removal here is decided by evidence that AgEnD — this fleet, this instance — wrote the
|
|
6
|
+
* thing, never by a name's shape: the user's agents, MCP servers and steering files, and another fleet's, are kept.
|
|
7
|
+
* - The agent file is ours only on a positive, canonical match: our name, and `mcpServers` with exactly this
|
|
8
|
+
* instance's keys, each run by this instance's own wrapper script.
|
|
9
|
+
* - A shared `mcp.json` entry is ours only when its command is one of this fleet's wrapper scripts.
|
|
10
|
+
* - A steering file is ours only when it carries this fleet's tag for this instance. Files written before the tag
|
|
11
|
+
* existed name an instance and a working directory but no fleet, so they are ambiguous and are kept.
|
|
12
|
+
*/
|
|
13
|
+
import { createHash } from "node:crypto";
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, unlinkSync } from "node:fs";
|
|
15
|
+
import { basename, dirname, isAbsolute, join, normalize, resolve } from "node:path";
|
|
16
|
+
import { writeFileAtomic } from "./kiro-engine-ledger.js";
|
|
17
|
+
/** An MCP server name AgEnD writes: one plain path component (no separators, no `..`). */
|
|
18
|
+
const SERVER_NAME = /^(?!.*\.\.)[A-Za-z0-9_][A-Za-z0-9_.-]{0,99}$/;
|
|
19
|
+
/** Instance names written as they are; any other name is hashed under a different prefix, so the two never meet. */
|
|
20
|
+
const PLAIN_NAME = /^[A-Za-z0-9._-]{1,100}$/;
|
|
21
|
+
/** This fleet, as 8 hex: two fleets (two AGEND_HOMEs) on one directory get different agents and tags. */
|
|
22
|
+
export function kiroFleetTag(agendHome) {
|
|
23
|
+
let home = resolve(agendHome);
|
|
24
|
+
try {
|
|
25
|
+
home = realpathSync(home);
|
|
26
|
+
}
|
|
27
|
+
catch { /* not created yet: the resolved path */ }
|
|
28
|
+
return createHash("sha256").update(home).digest("hex").slice(0, 8);
|
|
29
|
+
}
|
|
30
|
+
/** `agend-<instance>-<fleet>`, or `agendx-<hash>-<fleet>` for a name outside PLAIN_NAME (they differ at char 6). */
|
|
31
|
+
export function kiroAgentName(instance, fleet) {
|
|
32
|
+
return PLAIN_NAME.test(instance)
|
|
33
|
+
? `agend-${instance}-${fleet}`
|
|
34
|
+
: `agendx-${createHash("sha256").update(instance).digest("hex").slice(0, 16)}-${fleet}`;
|
|
35
|
+
}
|
|
36
|
+
export const kiroAgentPath = (spec) => join(spec.workingDirectory, ".kiro", "agents", `${kiroAgentName(spec.instance, spec.fleet)}.json`);
|
|
37
|
+
/** The shared-file key a server had before #906, and still has in the agent file (kiro keeps one of the two). */
|
|
38
|
+
export const kiroServerKey = (server, instance) => `${server}-${instance}`;
|
|
39
|
+
export const kiroWrapperPath = (instanceDir, server) => join(instanceDir, `mcp-wrapper-${server}.sh`);
|
|
40
|
+
/** This instance's servers, key → wrapper: the only map an agent file of ours can have. */
|
|
41
|
+
export function expectedKiroServers(spec) {
|
|
42
|
+
const map = {};
|
|
43
|
+
for (const server of spec.serverNames)
|
|
44
|
+
map[kiroServerKey(server, spec.instance)] = kiroWrapperPath(spec.instanceDir, server);
|
|
45
|
+
return map;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The same file, compared as written: an absolute path, normalized. A relative command means whatever kiro's own
|
|
49
|
+
* working directory makes of it, which is never evidence that it is one of AgEnD's wrappers (#1416 review).
|
|
50
|
+
*/
|
|
51
|
+
const samePath = (a, b) => typeof a === "string" && isAbsolute(a) && isAbsolute(b) && normalize(a) === normalize(b);
|
|
52
|
+
/** The provenance line every agent file AgEnD writes carries: this fleet and this instance. */
|
|
53
|
+
export const kiroAgentDescription = (spec) => `AgEnD fleet instance ${spec.instance} (agend-fleet:${spec.fleet})`;
|
|
54
|
+
/**
|
|
55
|
+
* Ours only on positive evidence, never on absence: our name, our provenance line, and every MCP server in it one of
|
|
56
|
+
* THIS instance's own wrapper scripts under its own key (`<server>-<instance>` → `<instanceDir>/mcp-wrapper-<server>.sh`,
|
|
57
|
+
* absolute). Which servers, and how many, may differ — an instance in CLI agent mode has none, and a mode switch
|
|
58
|
+
* changes the set — but a sibling's wrapper, a relative command or any other entry is never ours.
|
|
59
|
+
*/
|
|
60
|
+
export function isOwnKiroAgent(value, spec) {
|
|
61
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
62
|
+
return false;
|
|
63
|
+
const v = value;
|
|
64
|
+
if (v.name !== kiroAgentName(spec.instance, spec.fleet) || v.description !== kiroAgentDescription(spec))
|
|
65
|
+
return false;
|
|
66
|
+
const servers = v.mcpServers;
|
|
67
|
+
if (!servers || typeof servers !== "object" || Array.isArray(servers))
|
|
68
|
+
return false;
|
|
69
|
+
const suffix = `-${spec.instance}`;
|
|
70
|
+
return Object.entries(servers).every(([key, entry]) => {
|
|
71
|
+
if (!key.endsWith(suffix) || key.length === suffix.length)
|
|
72
|
+
return false;
|
|
73
|
+
const server = key.slice(0, -suffix.length);
|
|
74
|
+
// A server name is one plain path component — no separator, no `..` — so its wrapper,
|
|
75
|
+
// `<instanceDir>/mcp-wrapper-<server>.sh`, is a direct child of THIS instance's directory. A key like
|
|
76
|
+
// `x/../../sibling/…` would otherwise aim it at another instance's wrapper (#1416 review).
|
|
77
|
+
if (!SERVER_NAME.test(server))
|
|
78
|
+
return false;
|
|
79
|
+
const command = entry?.command;
|
|
80
|
+
return samePath(command, kiroWrapperPath(spec.instanceDir, server));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function readJson(path) {
|
|
84
|
+
let text;
|
|
85
|
+
try {
|
|
86
|
+
text = readFileSync(path, "utf-8");
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return err.code === "ENOENT" ? { kind: "absent" } : { kind: "unreadable" };
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
return { kind: "ok", value: JSON.parse(text) };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { kind: "unreadable" };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** A file at our agent path that is not ours: never overwritten, so the launch is refused. */
|
|
99
|
+
export class KiroAgentConflictError extends Error {
|
|
100
|
+
constructor(path) {
|
|
101
|
+
super(`${path} exists and is not this AgEnD instance's agent; not overwriting it, so this kiro instance is not launched (#906)`);
|
|
102
|
+
this.name = "KiroAgentConflictError";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Write the instance's agent. Throws when it cannot, or when a file that is not ours is in the way. */
|
|
106
|
+
export function writeKiroAgent(spec, instructions) {
|
|
107
|
+
const path = kiroAgentPath(spec);
|
|
108
|
+
const existing = readJson(path);
|
|
109
|
+
if (existing.kind === "unreadable" || (existing.kind === "ok" && !isOwnKiroAgent(existing.value, spec))) {
|
|
110
|
+
throw new KiroAgentConflictError(path);
|
|
111
|
+
}
|
|
112
|
+
const mcpServers = {};
|
|
113
|
+
for (const [key, command] of Object.entries(expectedKiroServers(spec)))
|
|
114
|
+
mcpServers[key] = { command, args: [] };
|
|
115
|
+
const agent = {
|
|
116
|
+
name: kiroAgentName(spec.instance, spec.fleet),
|
|
117
|
+
description: kiroAgentDescription(spec),
|
|
118
|
+
prompt: instructions ?? null,
|
|
119
|
+
mcpServers,
|
|
120
|
+
tools: ["*"],
|
|
121
|
+
allowedTools: [],
|
|
122
|
+
resources: [],
|
|
123
|
+
// The user's own MCP servers stay available; isolation comes from AgEnD's entries living only here (decided).
|
|
124
|
+
includeMcpJson: true,
|
|
125
|
+
// V3's own addition, so an auto-upgrading V3 has nothing to rewrite.
|
|
126
|
+
permissions: { rules: [] },
|
|
127
|
+
};
|
|
128
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
129
|
+
writeFileAtomic(path, JSON.stringify(agent, null, 2) + "\n");
|
|
130
|
+
return path;
|
|
131
|
+
}
|
|
132
|
+
/** Remove the agent file and V3's `.bak` of it, each only when it is ours. What was kept is returned, to be logged. */
|
|
133
|
+
export function removeKiroAgent(spec) {
|
|
134
|
+
const out = { removed: [], kept: [] };
|
|
135
|
+
const path = kiroAgentPath(spec);
|
|
136
|
+
for (const p of [path, `${path}.bak`]) {
|
|
137
|
+
const file = readJson(p);
|
|
138
|
+
if (file.kind === "absent")
|
|
139
|
+
continue;
|
|
140
|
+
if (file.kind === "ok" && isOwnKiroAgent(file.value, spec)) {
|
|
141
|
+
try {
|
|
142
|
+
unlinkSync(p);
|
|
143
|
+
out.removed.push(p);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
out.kept.push(p);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
out.kept.push(p);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
const mcpJsonPath = (cwd) => join(cwd, ".kiro", "settings", "mcp.json");
|
|
156
|
+
/**
|
|
157
|
+
* The transition's old setup (§3): this instance's entries in the shared mcp.json, so a resumed `kiro_default`
|
|
158
|
+
* conversation still has its AgEnD server until the switch to the agent is confirmed. A key is written only when it
|
|
159
|
+
* is free — absent, or already this instance's own wrapper. A key run by anything else is a conflict and is kept.
|
|
160
|
+
*/
|
|
161
|
+
export function writeSharedKiroMcpEntries(spec) {
|
|
162
|
+
const path = mcpJsonPath(spec.workingDirectory);
|
|
163
|
+
const file = readJson(path);
|
|
164
|
+
if (file.kind === "unreadable")
|
|
165
|
+
return "unreadable";
|
|
166
|
+
let config = {};
|
|
167
|
+
if (file.kind === "ok") {
|
|
168
|
+
if (!file.value || typeof file.value !== "object" || Array.isArray(file.value))
|
|
169
|
+
return "unreadable";
|
|
170
|
+
config = file.value;
|
|
171
|
+
}
|
|
172
|
+
const raw = config.mcpServers;
|
|
173
|
+
if (raw !== undefined && (!raw || typeof raw !== "object" || Array.isArray(raw)))
|
|
174
|
+
return "unreadable";
|
|
175
|
+
const servers = { ...raw };
|
|
176
|
+
let changed = false;
|
|
177
|
+
let conflict = false;
|
|
178
|
+
for (const [key, wrapper] of Object.entries(expectedKiroServers(spec))) {
|
|
179
|
+
const current = Object.hasOwn(servers, key) ? servers[key] : undefined;
|
|
180
|
+
if (current === undefined) {
|
|
181
|
+
servers[key] = { command: wrapper, args: [] };
|
|
182
|
+
changed = true;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (!samePath(current?.command, wrapper))
|
|
186
|
+
conflict = true;
|
|
187
|
+
}
|
|
188
|
+
if (changed) {
|
|
189
|
+
try {
|
|
190
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
191
|
+
writeFileAtomic(path, JSON.stringify({ ...config, mcpServers: servers }, null, 2));
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return "failed";
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return conflict ? "conflict" : changed ? "written" : "unchanged";
|
|
198
|
+
}
|
|
199
|
+
/** A wrapper script of this fleet: `<instancesRoot>/<some instance>/mcp-wrapper-<server>.sh`. */
|
|
200
|
+
function fleetWrapperInstanceDir(command, instancesRoot) {
|
|
201
|
+
if (typeof command !== "string" || !isAbsolute(command))
|
|
202
|
+
return null;
|
|
203
|
+
if (!/^mcp-wrapper-[^/]+\.sh$/.test(basename(command)))
|
|
204
|
+
return null;
|
|
205
|
+
const dir = resolve(dirname(command));
|
|
206
|
+
return resolve(dirname(dir)) === resolve(instancesRoot) ? dir : null;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Remove AgEnD from the shared mcp.json, by provenance only:
|
|
210
|
+
* - `own`: this instance's keys whose command is exactly its own wrapper (after a confirmed switch, and on cleanup);
|
|
211
|
+
* - any entry run by a wrapper of this fleet whose instance directory is gone.
|
|
212
|
+
* Everything else — the user's servers, another fleet's — is kept. Written only when something changed.
|
|
213
|
+
*/
|
|
214
|
+
export function removeSharedKiroMcpEntries(spec, instancesRoot, own) {
|
|
215
|
+
const path = mcpJsonPath(spec.workingDirectory);
|
|
216
|
+
const file = readJson(path);
|
|
217
|
+
if (file.kind === "absent")
|
|
218
|
+
return "unchanged";
|
|
219
|
+
if (file.kind === "unreadable" || !file.value || typeof file.value !== "object" || Array.isArray(file.value))
|
|
220
|
+
return "unreadable";
|
|
221
|
+
const config = file.value;
|
|
222
|
+
const raw = config.mcpServers;
|
|
223
|
+
if (raw === undefined)
|
|
224
|
+
return "unchanged";
|
|
225
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
226
|
+
return "unreadable";
|
|
227
|
+
const servers = { ...raw };
|
|
228
|
+
const expected = expectedKiroServers(spec);
|
|
229
|
+
let changed = false;
|
|
230
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
231
|
+
const command = value?.command;
|
|
232
|
+
const mine = own && Object.hasOwn(expected, key) && samePath(command, expected[key]);
|
|
233
|
+
const gone = (() => { const dir = fleetWrapperInstanceDir(command, instancesRoot); return dir !== null && !existsSync(dir); })();
|
|
234
|
+
if (mine || gone) {
|
|
235
|
+
delete servers[key];
|
|
236
|
+
changed = true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!changed)
|
|
240
|
+
return "unchanged";
|
|
241
|
+
try {
|
|
242
|
+
writeFileAtomic(path, JSON.stringify({ ...config, mcpServers: servers }, null, 2));
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return "failed";
|
|
246
|
+
}
|
|
247
|
+
return "written";
|
|
248
|
+
}
|
|
249
|
+
// ── Steering (§4) ──
|
|
250
|
+
export const kiroSteeringPath = (cwd, instance) => join(cwd, ".kiro", "steering", `agend-${instance}.md`);
|
|
251
|
+
/** The first line of every steering file AgEnD writes from #906 on. */
|
|
252
|
+
export const kiroSteeringTag = (spec) => `<!-- agend-agent:${kiroAgentName(spec.instance, spec.fleet)} -->`;
|
|
253
|
+
/**
|
|
254
|
+
* Whose steering file this is. "untagged-legacy": written by AgEnD before the tag existed, for this instance and this
|
|
255
|
+
* directory (its `# AgEnD Fleet Context` header says so) — but by which fleet cannot be told, so it is never ours.
|
|
256
|
+
*/
|
|
257
|
+
export function kiroSteeringOwnership(spec) {
|
|
258
|
+
let text;
|
|
259
|
+
try {
|
|
260
|
+
text = readFileSync(kiroSteeringPath(spec.workingDirectory, spec.instance), "utf-8");
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return err.code === "ENOENT" ? "absent" : "unreadable";
|
|
264
|
+
}
|
|
265
|
+
if (text.split("\n", 1)[0] === kiroSteeringTag(spec))
|
|
266
|
+
return "ours";
|
|
267
|
+
const header = `# AgEnD Fleet Context\nYou are **${spec.instance}**, an instance in an AgEnD fleet.\nYour working directory is \`${spec.workingDirectory}\`.`;
|
|
268
|
+
return text.startsWith(header) ? "untagged-legacy" : "foreign";
|
|
269
|
+
}
|
|
270
|
+
/** The transition's steering (§3): written only when absent or already ours. An untagged one serves as it is. */
|
|
271
|
+
export function writeTaggedKiroSteering(spec, instructions) {
|
|
272
|
+
const ownership = kiroSteeringOwnership(spec);
|
|
273
|
+
if (ownership === "unreadable")
|
|
274
|
+
return "unreadable";
|
|
275
|
+
if (ownership === "foreign")
|
|
276
|
+
return "conflict";
|
|
277
|
+
if (ownership === "untagged-legacy")
|
|
278
|
+
return "untagged-legacy";
|
|
279
|
+
const path = kiroSteeringPath(spec.workingDirectory, spec.instance);
|
|
280
|
+
try {
|
|
281
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
282
|
+
writeFileAtomic(path, `${kiroSteeringTag(spec)}\n${instructions}`);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return "failed";
|
|
286
|
+
}
|
|
287
|
+
return "written";
|
|
288
|
+
}
|
|
289
|
+
/** Remove this instance's steering file only when it carries this fleet's tag. */
|
|
290
|
+
export function removeTaggedKiroSteering(spec) {
|
|
291
|
+
const ownership = kiroSteeringOwnership(spec);
|
|
292
|
+
if (ownership !== "ours")
|
|
293
|
+
return ownership;
|
|
294
|
+
try {
|
|
295
|
+
unlinkSync(kiroSteeringPath(spec.workingDirectory, spec.instance));
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return "failed";
|
|
299
|
+
}
|
|
300
|
+
return "removed";
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=kiro-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro-agent.js","sourceRoot":"","sources":["../../src/backend/kiro-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type KiroClassicEngine = "v1" | "v2";
|
|
2
|
+
/** v3 has its own identity (kiro-v3-identity.ts); its records here only say whether it runs as the agent. */
|
|
3
|
+
type RecordEngine = KiroClassicEngine | "v3";
|
|
4
|
+
export interface KiroStoreSession {
|
|
5
|
+
id: string;
|
|
6
|
+
updatedAt: number;
|
|
7
|
+
}
|
|
8
|
+
export type KiroStoreRead = {
|
|
9
|
+
kind: "ok";
|
|
10
|
+
sessions: KiroStoreSession[];
|
|
11
|
+
/**
|
|
12
|
+
* When `id` was created (epoch ms); null when the store has no such time for it; "unreadable" when the store could
|
|
13
|
+
* not be asked (a lock, an I/O error) — which defers a take-up rather than ruling the conversation out.
|
|
14
|
+
* Asked only of take-up candidates.
|
|
15
|
+
*/
|
|
16
|
+
createdAt(id: string): number | null | "unreadable";
|
|
17
|
+
} | {
|
|
18
|
+
kind: "unreadable";
|
|
19
|
+
detail: string;
|
|
20
|
+
};
|
|
21
|
+
/** The directory as kiro may have keyed it: as configured, resolved, and with symlinks resolved. */
|
|
22
|
+
export declare function kiroDirectoryKeys(workingDirectory: string): string[];
|
|
23
|
+
/** One identity per directory: symlinks resolved, else the absolute path. */
|
|
24
|
+
export declare function kiroCanonicalDirectory(workingDirectory: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* v1: `conversations_v2` in the store the instance launches with, read-only, through the (key, updated_at) index —
|
|
27
|
+
* forced with INDEXED BY, so a missing index is an error (unreadable), never a silent scan of the table. The row
|
|
28
|
+
* itself is touched only for `conversation_id`, which precedes `value`. `created_at` follows `value`, so it is read
|
|
29
|
+
* only for the few take-up candidates. A missing database is an empty store.
|
|
30
|
+
*/
|
|
31
|
+
export declare function listKiroV1Sessions(workingDirectory: string, dbPath: string): KiroStoreRead;
|
|
32
|
+
/** Full v2 files are read/parsed in a bounded worker, never on the fleet loop. */
|
|
33
|
+
export declare function listKiroV2Sessions(workingDirectory: string, sessionsDir: string): Promise<KiroStoreRead>;
|
|
34
|
+
export declare class KiroIdentityError extends Error {
|
|
35
|
+
constructor(detail: string);
|
|
36
|
+
}
|
|
37
|
+
export type KiroIdentityDecision =
|
|
38
|
+
/** Not isolated: the old command, nothing recorded. */
|
|
39
|
+
{
|
|
40
|
+
mode: "legacy";
|
|
41
|
+
reason: string;
|
|
42
|
+
} | {
|
|
43
|
+
mode: "resume";
|
|
44
|
+
id: string;
|
|
45
|
+
agentConfirmed: boolean;
|
|
46
|
+
} | {
|
|
47
|
+
mode: "fresh";
|
|
48
|
+
};
|
|
49
|
+
export interface ResolveKiroIdentityOptions {
|
|
50
|
+
instance: string;
|
|
51
|
+
engine: KiroClassicEngine;
|
|
52
|
+
workingDirectory: string;
|
|
53
|
+
credentialProfile: string | null;
|
|
54
|
+
skipResume?: boolean;
|
|
55
|
+
agendHome: string;
|
|
56
|
+
/** The engine's store, read only when needed (adoption, take-up, a fresh mark's list). */
|
|
57
|
+
readStore: () => KiroStoreRead;
|
|
58
|
+
/** Whether this instance launched in this directory, with this profile and engine, before #906. */
|
|
59
|
+
launchedBefore: () => boolean;
|
|
60
|
+
now?: () => number;
|
|
61
|
+
}
|
|
62
|
+
/** Whether launch preparation needs a store snapshot. Only reads the small
|
|
63
|
+
* identity/claim files; never claims or writes. The final resolver rereads this
|
|
64
|
+
* state synchronously AFTER preparation/admission, so an async result cannot
|
|
65
|
+
* overwrite a newer identity. Pending unclaimed adoption is conservative:
|
|
66
|
+
* claiming may fail, in which case a fresh baseline will need the store.
|
|
67
|
+
*/
|
|
68
|
+
export declare function kiroIdentityNeedsStore(opts: Omit<ResolveKiroIdentityOptions, "readStore" | "launchedBefore">): boolean;
|
|
69
|
+
export declare function resolveKiroIdentity(opts: ResolveKiroIdentityOptions): KiroIdentityDecision;
|
|
70
|
+
/** Whether `id` is recorded as already running as the instance's agent. */
|
|
71
|
+
export declare function kiroAgentConfirmed(agendHome: string, instance: string, engine: RecordEngine, workingDirectory: string, credentialProfile: string | null, id: string): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Record that `id` now runs as the instance's agent (the switch was confirmed on screen). For v1/v2 the record must
|
|
74
|
+
* already own `id`; a v3 conversation (owned per kiro-v3-identity.ts) gets a record here if it has none. An
|
|
75
|
+
* unreadable state file is never overwritten: false.
|
|
76
|
+
*/
|
|
77
|
+
export declare function confirmKiroAgentSwitch(agendHome: string, instance: string, engine: RecordEngine, workingDirectory: string, credentialProfile: string | null, id: string): boolean;
|
|
78
|
+
/** Delete or replace: drop the instance's records and every claim it holds (active or given up). Conversations stay. */
|
|
79
|
+
export declare function forgetKiroIdentity(agendHome: string, instance: string): void;
|
|
80
|
+
export {};
|