@songsid/agend 2.2.0-alpha.1 → 2.2.0-alpha.3
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 +6 -4
- package/README.zh-TW.md +6 -4
- package/dist/agent-cli.js +6 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +4 -1
- package/dist/agent-endpoint.js +82 -14
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-token-header.d.ts +13 -0
- package/dist/agent-token-header.js +16 -0
- package/dist/agent-token-header.js.map +1 -0
- package/dist/atomic-write.d.ts +21 -0
- package/dist/atomic-write.js +65 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/auth-api.js +2 -0
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.js +4 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/codex.d.ts +7 -0
- package/dist/backend/codex.js +7 -0
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +1 -1
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +7 -0
- package/dist/backend/kiro.js +82 -33
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.d.ts +7 -0
- package/dist/backend/muse.js +8 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +12 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/binary-probe.d.ts +80 -0
- package/dist/binary-probe.js +182 -0
- package/dist/binary-probe.js.map +1 -0
- package/dist/cache-analysis.d.ts +92 -0
- package/dist/cache-analysis.js +147 -0
- package/dist/cache-analysis.js.map +1 -0
- package/dist/cache-ledger.d.ts +108 -0
- package/dist/cache-ledger.js +230 -0
- package/dist/cache-ledger.js.map +1 -0
- package/dist/cache-prices.d.ts +32 -0
- package/dist/cache-prices.js +73 -0
- package/dist/cache-prices.js.map +1 -0
- package/dist/cache-scan.d.ts +39 -0
- package/dist/cache-scan.js +115 -0
- package/dist/cache-scan.js.map +1 -0
- package/dist/cache-service.d.ts +131 -0
- package/dist/cache-service.js +452 -0
- package/dist/cache-service.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +5 -1
- package/dist/channel/adapters/discord.js +56 -11
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +38 -1
- package/dist/channel/adapters/telegram.js +82 -0
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +1 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.d.ts +8 -1
- package/dist/channel/tool-router.js +4 -2
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +21 -0
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.js +36 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.js +376 -54
- package/dist/cli.js.map +1 -1
- package/dist/connection-secrets.d.ts +5 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/cpu-profile.js +50 -0
- package/dist/cpu-profile.js.map +1 -1
- package/dist/daemon.d.ts +18 -0
- package/dist/daemon.js +256 -63
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +1 -0
- package/dist/delivery-outbox.js +12 -0
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/discord-permissions.d.ts +33 -0
- package/dist/discord-permissions.js +42 -0
- package/dist/discord-permissions.js.map +1 -0
- package/dist/env-file.d.ts +11 -0
- package/dist/env-file.js +27 -0
- package/dist/env-file.js.map +1 -0
- package/dist/event-log.d.ts +4 -1
- package/dist/event-log.js +6 -3
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-context.d.ts +5 -0
- package/dist/fleet-context.js.map +1 -1
- package/dist/fleet-control-audit.d.ts +5 -0
- package/dist/fleet-control-audit.js +7 -0
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-level-config.d.ts +8 -1
- package/dist/fleet-level-config.js +53 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +122 -7
- package/dist/fleet-manager.js +871 -152
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-stop-budget.d.ts +22 -0
- package/dist/fleet-stop-budget.js +95 -0
- package/dist/fleet-stop-budget.js.map +1 -0
- package/dist/full-restart.js +2 -3
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
- package/dist/install-lock.d.ts +49 -0
- package/dist/install-lock.js +200 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/instance-config-impact.js +3 -2
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/kiro-transcript-lane.d.ts +8 -4
- package/dist/kiro-transcript-lane.js +66 -44
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/locale.js +96 -0
- package/dist/locale.js.map +1 -1
- package/dist/next-steps.d.ts +5 -0
- package/dist/next-steps.js +26 -0
- package/dist/next-steps.js.map +1 -0
- package/dist/outbound-handlers.js +8 -0
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +4 -0
- package/dist/outbound-schemas.js +7 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/outbox-open-error.d.ts +7 -0
- package/dist/outbox-open-error.js +15 -0
- package/dist/outbox-open-error.js.map +1 -0
- package/dist/package-preimage.d.ts +26 -0
- package/dist/package-preimage.js +96 -0
- package/dist/package-preimage.js.map +1 -0
- package/dist/pane-context-cache.d.ts +25 -0
- package/dist/pane-context-cache.js +73 -0
- package/dist/pane-context-cache.js.map +1 -0
- package/dist/paths.d.ts +0 -7
- package/dist/paths.js +8 -2
- package/dist/paths.js.map +1 -1
- package/dist/provider-probe.d.ts +15 -0
- package/dist/provider-probe.js +20 -0
- package/dist/provider-probe.js.map +1 -1
- package/dist/public-link-progress.d.ts +73 -0
- package/dist/public-link-progress.js +190 -0
- package/dist/public-link-progress.js.map +1 -0
- package/dist/public-web-gateway.js +2 -2
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +6 -1
- package/dist/public-web-link.js +87 -15
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +93 -20
- package/dist/quickstart-api.js +194 -62
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +15 -0
- package/dist/quickstart.js +110 -33
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +98 -0
- package/dist/reply-buttons-controller.js +174 -0
- package/dist/reply-buttons-controller.js.map +1 -0
- package/dist/reply-buttons.d.ts +113 -0
- package/dist/reply-buttons.js +208 -0
- package/dist/reply-buttons.js.map +1 -0
- package/dist/reply-dedup.js +3 -1
- package/dist/reply-dedup.js.map +1 -1
- package/dist/restart-guard.d.ts +53 -0
- package/dist/restart-guard.js +114 -0
- package/dist/restart-guard.js.map +1 -0
- package/dist/scheduler/db.js +6 -2
- package/dist/scheduler/db.js.map +1 -1
- package/dist/service-activation.d.ts +62 -7
- package/dist/service-activation.js +237 -55
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +56 -1
- package/dist/service-installer.js +152 -12
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +65 -0
- package/dist/service-plan.js +108 -0
- package/dist/service-plan.js.map +1 -0
- package/dist/settings-api.js +92 -10
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-authority.d.ts +11 -0
- package/dist/settings-authority.js +128 -0
- package/dist/settings-authority.js.map +1 -0
- package/dist/settings-change.d.ts +5 -0
- package/dist/settings-change.js +37 -8
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +3 -0
- package/dist/settings-confirmation.js +7 -1
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +19 -7
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +1 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-redaction.d.ts +18 -0
- package/dist/settings-redaction.js +58 -0
- package/dist/settings-redaction.js.map +1 -0
- package/dist/setup-form.d.ts +9 -1
- package/dist/setup-form.js +25 -1
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-host.js +15 -6
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +27 -19
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sqlite-open-errors.d.ts +12 -0
- package/dist/sqlite-open-errors.js +13 -0
- package/dist/sqlite-open-errors.js.map +1 -0
- package/dist/systemd-runtime.d.ts +15 -0
- package/dist/systemd-runtime.js +41 -0
- package/dist/systemd-runtime.js.map +1 -0
- package/dist/tmux-control.d.ts +44 -0
- package/dist/tmux-control.js +170 -21
- package/dist/tmux-control.js.map +1 -1
- package/dist/token-env-name.d.ts +37 -0
- package/dist/token-env-name.js +93 -0
- package/dist/token-env-name.js.map +1 -0
- package/dist/tool-permissions.js +5 -3
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +7 -16
- package/dist/topic-commands.js +56 -85
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.js +3 -0
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +68 -0
- package/dist/transcript-sources.js +336 -29
- package/dist/transcript-sources.js.map +1 -1
- package/dist/transcript-turns.d.ts +39 -0
- package/dist/transcript-turns.js +58 -0
- package/dist/transcript-turns.js.map +1 -0
- package/dist/tunnel/cloudflared-install.d.ts +18 -0
- package/dist/tunnel/cloudflared-install.js +15 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/turn-reply-guard.d.ts +3 -0
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/ui/chat-commands.js +43 -0
- package/dist/ui/chat-render.js +34 -8
- package/dist/ui/chat-store.js +51 -2
- package/dist/ui/chat-strings.js +30 -2
- package/dist/ui/chat-thread.js +141 -47
- package/dist/ui/first-run.js +64 -0
- package/dist/ui/fleet-cache.js +168 -0
- package/dist/ui/html-attachment.js +26 -0
- package/dist/ui/panel-chat.js +117 -23
- package/dist/ui/panel-fleet.js +31 -17
- package/dist/ui/panel-settings.js +29 -15
- package/dist/ui/preview-panel.js +237 -0
- package/dist/ui/preview.js +7 -3
- package/dist/ui/settings-apply.js +3 -1
- package/dist/ui/settings-dialogs.js +95 -25
- package/dist/ui/settings-discord.js +130 -0
- package/dist/ui/settings-model.js +21 -0
- package/dist/ui/settings-strings.js +50 -8
- package/dist/ui/settings-token.js +54 -0
- package/dist/ui/settings-wizard.js +63 -29
- package/dist/ui/shared/app-route.js +1 -1
- package/dist/ui/shared/app-shell.js +25 -37
- package/dist/ui/shared/app-store.js +5 -3
- package/dist/ui/shared/app-stream.js +2 -1
- package/dist/ui/shared/app.css +181 -5
- package/dist/ui/shared/app.js +2 -1
- package/dist/ui/shared/instance-nav.js +310 -0
- package/dist/ui/shared/panel-view.js +12 -190
- package/dist/ui/shared/signin.js +13 -1
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/view-roster-store.js +5 -0
- package/dist/ui/shared/view-strings.js +12 -0
- package/dist/ui/signin.html +2 -1
- package/dist/update-dispatch.d.ts +28 -0
- package/dist/update-dispatch.js +73 -0
- package/dist/update-dispatch.js.map +1 -0
- package/dist/update-install.d.ts +78 -8
- package/dist/update-install.js +158 -30
- package/dist/update-install.js.map +1 -1
- package/dist/update-launch.d.ts +22 -0
- package/dist/update-launch.js +106 -0
- package/dist/update-launch.js.map +1 -0
- package/dist/update-marker.js +3 -8
- package/dist/update-marker.js.map +1 -1
- package/dist/usage/format-rich.js +7 -1
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +1 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/providers.d.ts +4 -0
- package/dist/usage/providers.js +2 -1
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.js +48 -2
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/view-api.d.ts +40 -0
- package/dist/view-api.js +28 -10
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +22 -0
- package/dist/web-api.js +115 -16
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +8 -0
- package/dist/web-auth.js +34 -8
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +21 -0
- package/dist/web-chat-history.js +44 -0
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +77 -0
- package/dist/web-commands.js +81 -0
- package/dist/web-commands.js.map +1 -0
- package/dist/web-host-guard.d.ts +18 -2
- package/dist/web-host-guard.js +30 -5
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-session.d.ts +7 -1
- package/dist/web-session.js +23 -2
- package/dist/web-session.js.map +1 -1
- package/dist/web-shell-routes.d.ts +1 -1
- package/dist/web-shell-routes.js +1 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/launcher/agend +110 -0
- package/launcher/agend-agent +110 -0
- package/launcher/agend-agent.cjs +4 -0
- package/launcher/agend.cjs +4 -0
- package/launcher/install-admission.cjs +105 -0
- package/launcher/launch.cjs +64 -0
- package/launcher/postinstall.cjs +118 -0
- package/launcher/run-in-process.cjs +13 -0
- package/launcher/runtime-platform.cjs +86 -0
- package/launcher/runtime-select.cjs +217 -0
- package/package.json +12 -4
- package/scripts/preinstall-guard.cjs +40 -21
- package/templates/launchd.plist.ejs +2 -2
- package/templates/systemd.service.ejs +4 -4
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Shared outer grace for service-managed and detached fleets (#1071).
|
|
2
|
+
* This covers multiple 15/5/2-second Kiro batches; it is not an unlimited
|
|
3
|
+
* guarantee for arbitrarily large fleets or stuck transport operations. */
|
|
4
|
+
export declare const FLEET_STOP_TIMEOUT_MS: number;
|
|
5
|
+
export type DetachedOwnerState = "fleet" | "gone" | "other" | "unknown" | "waiting";
|
|
6
|
+
export interface DetachedStopDeps {
|
|
7
|
+
/** No signal is authorized by an unreadable identity. */
|
|
8
|
+
inspect(): DetachedOwnerState;
|
|
9
|
+
signal(signal: "SIGTERM" | "SIGKILL"): void;
|
|
10
|
+
now(): number;
|
|
11
|
+
sleep(ms: number): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Stop the proven owner, and do not admit a replacement until it is gone.
|
|
14
|
+
* No sleep subprocesses, no wall-clock budgets, and no kill(0) error treated
|
|
15
|
+
* as exit proof except ESRCH (the caller's inspect contract). */
|
|
16
|
+
export declare function stopDetachedOwner(deps: DetachedStopDeps): Promise<void>;
|
|
17
|
+
/** systemctl show's human-readable TimeoutStopUSec, not a permissive parseInt. */
|
|
18
|
+
export declare function systemdStopTimeoutMs(raw: string): number | null;
|
|
19
|
+
/** Cached at claim and re-read before signals: a recycled PID is not our owner. */
|
|
20
|
+
export declare function detachedProcessStart(pid: number): string | null;
|
|
21
|
+
/** A Linux zombie has exited even while its parent has not reaped the PID. */
|
|
22
|
+
export declare function detachedProcessExited(pid: number): boolean;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
/** Shared outer grace for service-managed and detached fleets (#1071).
|
|
4
|
+
* This covers multiple 15/5/2-second Kiro batches; it is not an unlimited
|
|
5
|
+
* guarantee for arbitrarily large fleets or stuck transport operations. */
|
|
6
|
+
export const FLEET_STOP_TIMEOUT_MS = 5 * 60_000;
|
|
7
|
+
const EXIT_CONFIRM_MS = 5_000;
|
|
8
|
+
const POLL_MS = 500;
|
|
9
|
+
/** Stop the proven owner, and do not admit a replacement until it is gone.
|
|
10
|
+
* No sleep subprocesses, no wall-clock budgets, and no kill(0) error treated
|
|
11
|
+
* as exit proof except ESRCH (the caller's inspect contract). */
|
|
12
|
+
export async function stopDetachedOwner(deps) {
|
|
13
|
+
const inspect = () => {
|
|
14
|
+
const state = deps.inspect();
|
|
15
|
+
if (state === "unknown")
|
|
16
|
+
throw new Error("Cannot confirm the detached fleet owner; nothing else was signalled or started");
|
|
17
|
+
return state;
|
|
18
|
+
};
|
|
19
|
+
const alive = (state) => state === "fleet" || state === "waiting";
|
|
20
|
+
const first = inspect();
|
|
21
|
+
if (first === "waiting")
|
|
22
|
+
throw new Error("Cannot confirm the detached fleet command; nothing was signalled or started");
|
|
23
|
+
if (!alive(first))
|
|
24
|
+
return;
|
|
25
|
+
const deadline = deps.now() + FLEET_STOP_TIMEOUT_MS;
|
|
26
|
+
deps.signal("SIGTERM");
|
|
27
|
+
while (alive(inspect())) {
|
|
28
|
+
const remaining = deadline - deps.now();
|
|
29
|
+
if (remaining <= 0)
|
|
30
|
+
break;
|
|
31
|
+
await deps.sleep(Math.min(POLL_MS, remaining));
|
|
32
|
+
}
|
|
33
|
+
// Re-read identity at the effect boundary, including after the last wait.
|
|
34
|
+
// An empty command on the captured birth can be a transient exit transition.
|
|
35
|
+
// It only admits passive waiting: never a KILL or replacement.
|
|
36
|
+
const beforeKill = inspect();
|
|
37
|
+
if (beforeKill === "waiting")
|
|
38
|
+
throw new Error("Cannot confirm the detached fleet command after its grace; refusing to signal or start a duplicate");
|
|
39
|
+
if (!alive(beforeKill))
|
|
40
|
+
return;
|
|
41
|
+
deps.signal("SIGKILL");
|
|
42
|
+
const exitDeadline = deps.now() + EXIT_CONFIRM_MS;
|
|
43
|
+
while (alive(inspect())) {
|
|
44
|
+
const remaining = exitDeadline - deps.now();
|
|
45
|
+
if (remaining <= 0)
|
|
46
|
+
throw new Error("Detached fleet has not exited after SIGKILL; refusing to start a duplicate");
|
|
47
|
+
await deps.sleep(Math.min(POLL_MS, remaining));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** systemctl show's human-readable TimeoutStopUSec, not a permissive parseInt. */
|
|
51
|
+
export function systemdStopTimeoutMs(raw) {
|
|
52
|
+
const text = raw.trim();
|
|
53
|
+
if (text === "infinity")
|
|
54
|
+
return Infinity;
|
|
55
|
+
const units = { us: 0.001, ms: 1, s: 1_000, min: 60_000, h: 3_600_000, d: 86_400_000 };
|
|
56
|
+
if (!/^(?:\d+(?:\.\d+)?(?:us|ms|s|min|h|d))(?:\s+\d+(?:\.\d+)?(?:us|ms|s|min|h|d))*$/.test(text))
|
|
57
|
+
return null;
|
|
58
|
+
let total = 0;
|
|
59
|
+
for (const part of text.split(/\s+/)) {
|
|
60
|
+
const match = /^(\d+(?:\.\d+)?)(us|ms|s|min|h|d)$/.exec(part);
|
|
61
|
+
total += Number(match[1]) * units[match[2]];
|
|
62
|
+
}
|
|
63
|
+
return Number.isFinite(total) ? total : null;
|
|
64
|
+
}
|
|
65
|
+
/** Cached at claim and re-read before signals: a recycled PID is not our owner. */
|
|
66
|
+
export function detachedProcessStart(pid) {
|
|
67
|
+
try {
|
|
68
|
+
if (process.platform === "linux") {
|
|
69
|
+
const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
70
|
+
// comm can contain spaces and ')': fields after its LAST ')' start at #3.
|
|
71
|
+
const tail = stat.slice(stat.lastIndexOf(")") + 2).trim().split(/\s+/);
|
|
72
|
+
return stat.lastIndexOf(")") > 0 && /^\d+$/.test(tail[19] ?? "") ? tail[19] : null;
|
|
73
|
+
}
|
|
74
|
+
return execFileSync("ps", ["-p", String(pid), "-o", "lstart="], { encoding: "utf8", timeout: 1_000, stdio: ["ignore", "pipe", "ignore"] }).trim() || null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** A Linux zombie has exited even while its parent has not reaped the PID. */
|
|
81
|
+
export function detachedProcessExited(pid) {
|
|
82
|
+
if (process.platform !== "linux")
|
|
83
|
+
return false;
|
|
84
|
+
try {
|
|
85
|
+
const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
86
|
+
const end = stat.lastIndexOf(")");
|
|
87
|
+
const tail = stat.slice(end + 2).trim().split(/\s+/);
|
|
88
|
+
return end > 0 && stat.startsWith(`${pid} (`) && /^\d+$/.test(tail[19] ?? "")
|
|
89
|
+
&& (tail[0] === "Z" || tail[0] === "X");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
} // No readable exit evidence: still unknown, never exit.
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=fleet-stop-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-stop-budget.js","sourceRoot":"","sources":["../src/fleet-stop-budget.ts"],"names":[],"mappings":"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"}
|
package/dist/full-restart.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
2
|
import { withOrigin } from "./fleet-control-audit.js";
|
|
3
|
+
import { canonicalCliEntry } from "./cli-entry.js";
|
|
5
4
|
/**
|
|
6
5
|
* Start the canonical environment-aware service restart and wait until the OS
|
|
7
6
|
* has actually spawned it. The top-level `agend restart` command selects
|
|
@@ -10,7 +9,7 @@ import { withOrigin } from "./fleet-control-audit.js";
|
|
|
10
9
|
* systemd unit with Restart=on-failure would stay down and kill this helper as
|
|
11
10
|
* part of the old service cgroup.
|
|
12
11
|
*/
|
|
13
|
-
export function launchFullRestartHelper(spawnProcess = spawn, cliEntry =
|
|
12
|
+
export function launchFullRestartHelper(spawnProcess = spawn, cliEntry = canonicalCliEntry()) {
|
|
14
13
|
return new Promise((resolve, reject) => {
|
|
15
14
|
let child;
|
|
16
15
|
try {
|
package/dist/full-restart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"full-restart.js","sourceRoot":"","sources":["../src/full-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"full-restart.js","sourceRoot":"","sources":["../src/full-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwC,MAAM,oBAAoB,CAAC;AAGjF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAcnD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,eAA6B,KAAK,EAClC,QAAQ,GAAG,iBAAiB,EAAE;IAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,KAAmB,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAClB,OAAO,CAAC,QAAQ,EAChB,CAAC,QAAQ,EAAE,SAAS,CAAC,EACrB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAC5E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,OAAO,CAA8B,QAAQ,CAAC,EAAE;YACrE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACjE,yEAAyE;YACzE,0EAA0E;YAC1E,wEAAwE;YACxE,oBAAoB;YACpB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACzC,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -15,7 +15,9 @@ persona emoji replaces your `delivered` stamp with one of your own, the way
|
|
|
15
15
|
## Tools
|
|
16
16
|
|
|
17
17
|
- `list_emojis` — your current stamps (`statuses`, with `source`: instance =
|
|
18
|
-
yours, platform = the connection's, builtin = AgEnD's
|
|
18
|
+
yours, platform = the connection's, builtin = AgEnD's; `kind`: `reaction`,
|
|
19
|
+
or `text_prefix` for `progress_prefix`), a `platform_note` saying what your
|
|
20
|
+
platform allows, the standard emojis
|
|
19
21
|
your platform accepts (`standard`), and on Discord the server emojis your
|
|
20
22
|
bot can react with (`server_emojis`, grouped by server; each has a `value`
|
|
21
23
|
ready to pass on, e.g. `<:fox:123456789012345678>`). No image URLs by
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare const INSTALL_LOCK_FILE = ".agend-install.lock";
|
|
2
|
+
export declare const INSTALL_TOKEN_ENV = "AGEND_INSTALL_TOKEN";
|
|
3
|
+
export interface InstallLockRecord {
|
|
4
|
+
pid: number;
|
|
5
|
+
/** The holder's start time as `ps -o lstart=` prints it: with the pid, the process's identity. */
|
|
6
|
+
processStart: string;
|
|
7
|
+
prefix: string;
|
|
8
|
+
targetSpec: string;
|
|
9
|
+
agendHome: string;
|
|
10
|
+
token: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InstallLockDeps {
|
|
14
|
+
pid: number;
|
|
15
|
+
/** `ps -o lstart= -p <pid>`, trimmed; null when the process does not exist or cannot be read. */
|
|
16
|
+
processStart(pid: number): string | null;
|
|
17
|
+
/** Does the pid exist (false only for a definite "no such process")? Default: process.kill(pid, 0). */
|
|
18
|
+
exists?(pid: number): boolean;
|
|
19
|
+
/** Test seams (another updater's turn): after a lock was judged stale; after it was moved aside. */
|
|
20
|
+
afterStaleJudged?(): void;
|
|
21
|
+
afterStaleMoved?(): void;
|
|
22
|
+
newToken(): string;
|
|
23
|
+
now(): Date;
|
|
24
|
+
log(message: string): void;
|
|
25
|
+
}
|
|
26
|
+
export type InstallLock = {
|
|
27
|
+
ok: true;
|
|
28
|
+
path: string;
|
|
29
|
+
token: string;
|
|
30
|
+
release(): void;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
path: string;
|
|
34
|
+
reason: string;
|
|
35
|
+
};
|
|
36
|
+
/** The record, or why it is not one (unreadable, unparsable, wrong shape). */
|
|
37
|
+
export declare function parseInstallLock(text: string): InstallLockRecord | null;
|
|
38
|
+
/**
|
|
39
|
+
* The recorded holder: "live" (that very process), "stale" (PROVEN gone: no such pid, or the pid now belongs to a
|
|
40
|
+
* process that started at another time), or "unknown" (it exists, but its start time cannot be read) — which blocks.
|
|
41
|
+
*/
|
|
42
|
+
export declare function holderState(record: {
|
|
43
|
+
pid: number;
|
|
44
|
+
processStart: string;
|
|
45
|
+
}, deps: Pick<InstallLockDeps, "processStart" | "exists">): "live" | "stale" | "unknown";
|
|
46
|
+
export declare function acquireInstallLock(prefix: string, target: {
|
|
47
|
+
spec: string;
|
|
48
|
+
agendHome: string;
|
|
49
|
+
}, deps: InstallLockDeps): InstallLock;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1450 C1: one owner per npm global prefix. npm has no mutex between installs into one prefix (the #1455 gate
|
|
3
|
+
* characterises what a collision does), so `agend update` takes `<realpath(prefix)>/.agend-install.lock` BEFORE npm
|
|
4
|
+
* runs and holds it until the transition settles. Its own npm child is admitted by a single-use token
|
|
5
|
+
* (AGEND_INSTALL_TOKEN), which the package's postinstall checks against this file (launcher/postinstall.cjs). Keyed to
|
|
6
|
+
* the prefix — what npm changes — so two fleets with different AGEND_HOMEs on one prefix exclude each other, and two
|
|
7
|
+
* prefixes (two nvm Nodes, a user prefix and /usr/local) never do.
|
|
8
|
+
*
|
|
9
|
+
* Ownership is evidence: a lock is replaced only when its holder is PROVEN gone — no such pid, or the pid is now a
|
|
10
|
+
* process with another start time — and an unreadable file or an unreadable holder never counts as stale: it blocks,
|
|
11
|
+
* naming itself. Replacing a stale lock is itself owned: only the holder of `<lock>.reclaim` (claimed with wx) may move
|
|
12
|
+
* the lock file, so no updater can ever move a lock another one just claimed (#1472 review). Release removes a file only
|
|
13
|
+
* while it is still exactly ours.
|
|
14
|
+
*/
|
|
15
|
+
import { linkSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
export const INSTALL_LOCK_FILE = ".agend-install.lock";
|
|
18
|
+
export const INSTALL_TOKEN_ENV = "AGEND_INSTALL_TOKEN";
|
|
19
|
+
/** The record, or why it is not one (unreadable, unparsable, wrong shape). */
|
|
20
|
+
export function parseInstallLock(text) {
|
|
21
|
+
let value;
|
|
22
|
+
try {
|
|
23
|
+
value = JSON.parse(text);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const r = value;
|
|
29
|
+
return r && Number.isSafeInteger(r.pid) && r.pid > 0 && typeof r.processStart === "string" && r.processStart
|
|
30
|
+
&& typeof r.prefix === "string" && typeof r.token === "string" && /^[0-9a-f]{32,}$/.test(r.token)
|
|
31
|
+
&& typeof r.targetSpec === "string" && typeof r.agendHome === "string" && typeof r.createdAt === "string"
|
|
32
|
+
? r : null;
|
|
33
|
+
}
|
|
34
|
+
const pidExists = (pid) => {
|
|
35
|
+
try {
|
|
36
|
+
process.kill(pid, 0);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return err.code !== "ESRCH";
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* The recorded holder: "live" (that very process), "stale" (PROVEN gone: no such pid, or the pid now belongs to a
|
|
45
|
+
* process that started at another time), or "unknown" (it exists, but its start time cannot be read) — which blocks.
|
|
46
|
+
*/
|
|
47
|
+
export function holderState(record, deps) {
|
|
48
|
+
if (!(deps.exists ?? pidExists)(record.pid))
|
|
49
|
+
return "stale";
|
|
50
|
+
const seen = deps.processStart(record.pid);
|
|
51
|
+
if (seen === null)
|
|
52
|
+
return "unknown";
|
|
53
|
+
return seen === record.processStart ? "live" : "stale";
|
|
54
|
+
}
|
|
55
|
+
const readOrNull = (path) => { try {
|
|
56
|
+
return readFileSync(path, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
} };
|
|
61
|
+
export function acquireInstallLock(prefix, target, deps) {
|
|
62
|
+
let canonical;
|
|
63
|
+
try {
|
|
64
|
+
canonical = realpathSync(prefix);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { ok: false, path: join(prefix, INSTALL_LOCK_FILE), reason: `the npm prefix ${prefix} does not exist` };
|
|
68
|
+
}
|
|
69
|
+
const path = join(canonical, INSTALL_LOCK_FILE);
|
|
70
|
+
const ownStart = deps.processStart(deps.pid);
|
|
71
|
+
if (!ownStart)
|
|
72
|
+
return { ok: false, path, reason: "this process's own start time cannot be read, so its lock could not be told from a stale one" };
|
|
73
|
+
const record = {
|
|
74
|
+
pid: deps.pid, processStart: ownStart, prefix: canonical, targetSpec: target.spec, agendHome: target.agendHome,
|
|
75
|
+
token: deps.newToken(), createdAt: deps.now().toISOString(),
|
|
76
|
+
};
|
|
77
|
+
const serialized = JSON.stringify(record) + "\n";
|
|
78
|
+
const claim = () => {
|
|
79
|
+
try {
|
|
80
|
+
writeFileSync(path, serialized, { flag: "wx", mode: 0o600 });
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (err.code === "EEXIST")
|
|
85
|
+
return false;
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const ours = { ok: true, path, token: record.token, release: () => releaseIfOurs(path, serialized, deps) };
|
|
90
|
+
try {
|
|
91
|
+
if (claim())
|
|
92
|
+
return ours;
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return { ok: false, path, reason: `the install lock ${path} could not be created (${err.message})` };
|
|
96
|
+
}
|
|
97
|
+
const seen = readOrNull(path);
|
|
98
|
+
if (seen === null)
|
|
99
|
+
return { ok: false, path, reason: `another install is starting on ${canonical} (its lock ${path} appeared and went); retry` };
|
|
100
|
+
const holder = parseInstallLock(seen);
|
|
101
|
+
if (!holder)
|
|
102
|
+
return { ok: false, path, reason: `the install lock ${path} cannot be read as a lock; if no other \`agend update\` is running, remove it and retry` };
|
|
103
|
+
const state = holderState(holder, deps);
|
|
104
|
+
if (state === "live") {
|
|
105
|
+
return { ok: false, path, reason: `another AgEnD install is running on ${canonical} (pid ${holder.pid}, installing ${holder.targetSpec} for ${holder.agendHome}); wait for it to finish` };
|
|
106
|
+
}
|
|
107
|
+
if (state === "unknown") {
|
|
108
|
+
return { ok: false, path, reason: `whether the install that holds ${path} (pid ${holder.pid}) is still running cannot be told; retry, or remove the lock once no \`agend update\` runs` };
|
|
109
|
+
}
|
|
110
|
+
// Stale. Moving the lock file is owned too: only the holder of the reclaim marker may do it. Without that, an updater
|
|
111
|
+
// that judged an old stale lock could move a lock another updater has just claimed in its place (#1472 review).
|
|
112
|
+
const marker = `${path}.reclaim`;
|
|
113
|
+
deps.afterStaleJudged?.();
|
|
114
|
+
try {
|
|
115
|
+
writeFileSync(marker, serialized, { flag: "wx", mode: 0o600 });
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
if (err.code !== "EEXIST")
|
|
119
|
+
return { ok: false, path, reason: `the reclaim marker ${marker} could not be created (${err.message})` };
|
|
120
|
+
const other = parseInstallLock(readOrNull(marker) ?? "");
|
|
121
|
+
const otherState = other ? holderState(other, deps) : "unknown";
|
|
122
|
+
// A marker is held for a few file operations; one left by a crash in that window is never taken automatically.
|
|
123
|
+
return otherState === "live"
|
|
124
|
+
? { ok: false, path, reason: `another install is replacing the stale lock on ${canonical}; retry` }
|
|
125
|
+
: { ok: false, path, reason: `a reclaim marker ${marker} was left behind (pid ${other?.pid ?? "unknown"}); if no \`agend update\` runs, remove it and retry` };
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
// Under the marker the lock can change only by its live owner's release — and its holder is proven gone — so the
|
|
129
|
+
// file judged above is still the one to move; re-read anyway and refuse on any difference.
|
|
130
|
+
if (readOrNull(path) !== seen)
|
|
131
|
+
return { ok: false, path, reason: `another install is starting on ${canonical}; retry` };
|
|
132
|
+
const aside = `${path}.stale-${deps.pid}-${record.token.slice(0, 8)}`;
|
|
133
|
+
try {
|
|
134
|
+
renameSync(path, aside);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { ok: false, path, reason: `another install is starting on ${canonical}; retry` };
|
|
138
|
+
}
|
|
139
|
+
deps.afterStaleMoved?.();
|
|
140
|
+
if (readOrNull(aside) !== seen) {
|
|
141
|
+
// Cannot happen under the marker; if it ever does, theirs goes back (link never overwrites) and nothing is deleted.
|
|
142
|
+
try {
|
|
143
|
+
linkSync(aside, path);
|
|
144
|
+
unlinkSync(aside);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
deps.log(` ⚠ An install lock changed while it was being replaced; left at ${aside}.`);
|
|
148
|
+
}
|
|
149
|
+
return { ok: false, path, reason: `another install is starting on ${canonical}; retry` };
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
unlinkSync(aside);
|
|
153
|
+
}
|
|
154
|
+
catch { /* best effort */ }
|
|
155
|
+
deps.log(` Replaced a stale install lock (pid ${holder.pid} is gone, was installing ${holder.targetSpec}).`);
|
|
156
|
+
try {
|
|
157
|
+
if (claim())
|
|
158
|
+
return ours;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return { ok: false, path, reason: `the install lock ${path} could not be created (${err.message})` };
|
|
162
|
+
}
|
|
163
|
+
return { ok: false, path, reason: `another install is starting on ${canonical}; retry` };
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
releaseIfOurs(marker, serialized, deps);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Remove the lock only while it is still exactly the one this process wrote; never another owner's. */
|
|
170
|
+
function releaseIfOurs(path, serialized, deps) {
|
|
171
|
+
if (readOrNull(path) !== serialized)
|
|
172
|
+
return;
|
|
173
|
+
const aside = `${path}.release-${deps.pid}`;
|
|
174
|
+
try {
|
|
175
|
+
renameSync(path, aside);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (readOrNull(aside) === serialized) {
|
|
181
|
+
try {
|
|
182
|
+
unlinkSync(aside);
|
|
183
|
+
}
|
|
184
|
+
catch { /* best effort */ }
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Someone replaced it between the check and the rename: put theirs back.
|
|
188
|
+
try {
|
|
189
|
+
linkSync(aside, path);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
deps.log(` ⚠ The install lock changed while being released; left at ${aside}.`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
unlinkSync(aside);
|
|
197
|
+
}
|
|
198
|
+
catch { /* best effort */ }
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=install-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-lock.js","sourceRoot":"","sources":["../src/install-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,8 +86,9 @@ const FLEET_FIELD_IMPACTS = {
|
|
|
86
86
|
"fleet.channels": "fleet",
|
|
87
87
|
"fleet.channel.access.mode": "fleet",
|
|
88
88
|
"fleet.channel.access.allowed_users": "fleet",
|
|
89
|
-
//
|
|
90
|
-
|
|
89
|
+
// #1056: each stamp resolves the connection's status emojis from the live config (an agent's "avoid these" list
|
|
90
|
+
// follows at its next start), so this applies now; the rest of a connection still needs the fleet restart.
|
|
91
|
+
"fleet.channel.options.status_emojis": "now",
|
|
91
92
|
"fleet.spawn_concurrency": "fleet",
|
|
92
93
|
"fleet.spawn_stagger_ms": "fleet",
|
|
93
94
|
"classic.admin_users": "fleet",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAM9C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,YAAY,GAA4B,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsC,IAAI,GAAG,CAAuB;IACvG,eAAe;IACf,wBAAwB;IACxB,iBAAiB;IACjB,kBAAkB;IAClB,UAAU;IACV,cAAc;IACd,aAAa;IACb,MAAM;IACN,WAAW;IACX,sFAAsF;IACtF,2BAA2B;CAC5B,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAChE,CAAC,eAAe,EAAE,wBAAwB,CAAW;KACnD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACpD,CAAC;AAEF;;;GAGG;AACH,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IAC9D,UAAU;IACV,YAAY;IACZ,eAAe;CAChB,CAAC,CAAC;AAEH,wDAAwD;AACxD,MAAM,eAAe,GAAG;IACtB,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB;IACtE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe;IACzE,eAAe,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,WAAW;IACzE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU;IACjE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB;IAC7D,0EAA0E;IAC1E,kEAAkE;IAClE,eAAe;IACf,2BAA2B;CACnB,CAAC;AAEX,2DAA2D;AAC3D,MAAM,cAAc,GAAG;IACrB,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe;IACvD,wBAAwB,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB;IACvE,UAAU;CACF,CAAC;AAEX;;;GAGG;AACH,MAAM,mBAAmB,GAA2C;IAClE,qBAAqB,EAAE,KAAK;IAC5B,8BAA8B,EAAE,KAAK;IACrC,6BAA6B,EAAE,KAAK;IACpC,0BAA0B,EAAE,KAAK;IACjC,iBAAiB,EAAE,KAAK;IACxB,gBAAgB,EAAE,OAAO;IACzB,2BAA2B,EAAE,OAAO;IACpC,oCAAoC,EAAE,OAAO;IAC7C,
|
|
1
|
+
{"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { KiroDbCursor } from "./kiro-db-reader.js";
|
|
2
2
|
import type { TranscriptEvents } from "./transcript-sources.js";
|
|
3
3
|
export declare const KIRO_TRANSCRIPT_BUDGET_MS = 15000;
|
|
4
|
+
/** One replacement can read while one retired native call is still held. */
|
|
5
|
+
export declare const KIRO_TRANSCRIPT_MAX_WORKERS = 2;
|
|
4
6
|
export interface KiroDbInput {
|
|
5
7
|
dbPath: string;
|
|
6
8
|
workingDirectory: string;
|
|
@@ -32,15 +34,16 @@ interface Isolate {
|
|
|
32
34
|
ref(): unknown;
|
|
33
35
|
unref(): unknown;
|
|
34
36
|
}
|
|
35
|
-
/** One
|
|
36
|
-
*
|
|
37
|
-
*
|
|
37
|
+
/** One active isolate, one queued/in-flight request per source, warm RO handles.
|
|
38
|
+
* A retired isolate stops owning reads immediately, but keeps its physical slot
|
|
39
|
+
* until exit. One spare slot allows recovery from a stuck native call without a
|
|
40
|
+
* worker herd. If both slots are stuck, requests keep their original deadlines.
|
|
38
41
|
*/
|
|
39
42
|
export declare class KiroTranscriptLane implements KiroDbLane {
|
|
40
43
|
private factory;
|
|
41
44
|
private now;
|
|
42
45
|
private worker;
|
|
43
|
-
private
|
|
46
|
+
private physical;
|
|
44
47
|
private owners;
|
|
45
48
|
private pending;
|
|
46
49
|
private nextId;
|
|
@@ -50,6 +53,7 @@ export declare class KiroTranscriptLane implements KiroDbLane {
|
|
|
50
53
|
private settle;
|
|
51
54
|
private recycle;
|
|
52
55
|
private ensureWorker;
|
|
56
|
+
private dispatch;
|
|
53
57
|
private read;
|
|
54
58
|
}
|
|
55
59
|
export declare const sharedKiroTranscriptLane: KiroTranscriptLane;
|