@songsid/agend 2.2.0-beta.1 → 2.2.0-beta.11
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 +1 -1
- package/README.zh-TW.md +1 -1
- package/dist/agent-cli-instructions.md +16 -9
- package/dist/agent-cli.js +15 -7
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +24 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +47 -0
- package/dist/agent-whats-new.js +147 -0
- package/dist/agent-whats-new.js.map +1 -0
- package/dist/auth-api.d.ts +5 -3
- package/dist/auth-api.js +19 -3
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +8 -0
- package/dist/backend/antigravity.js +32 -9
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-carry.d.ts +22 -0
- package/dist/backend/claude-carry.js +170 -0
- package/dist/backend/claude-carry.js.map +1 -0
- package/dist/backend/claude-code.d.ts +65 -2
- package/dist/backend/claude-code.js +226 -33
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +33 -0
- package/dist/backend/codex-metadata.js +122 -18
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.d.ts +3 -0
- package/dist/backend/codex.js +17 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +40 -3
- package/dist/backend/credential-profile.js +113 -5
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +37 -1
- package/dist/backend/effort-metadata.js +86 -15
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.d.ts +4 -0
- package/dist/backend/grok.js +14 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.d.ts +5 -0
- package/dist/backend/kiro-engine-ledger.js +20 -0
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +6 -0
- package/dist/backend/kiro-identity.js +19 -5
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +39 -3
- package/dist/backend/kiro.js +143 -19
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +61 -0
- package/dist/backend/launch-effort.js +170 -0
- package/dist/backend/launch-effort.js.map +1 -0
- package/dist/backend/muse.d.ts +84 -0
- package/dist/backend/muse.js +449 -53
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +47 -4
- package/dist/backend/types.js +12 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-command.d.ts +91 -0
- package/dist/backend-command.js +122 -0
- package/dist/backend-command.js.map +1 -0
- package/dist/background-work-ended.d.ts +18 -0
- package/dist/background-work-ended.js +30 -0
- package/dist/background-work-ended.js.map +1 -0
- package/dist/cache-service.d.ts +2 -0
- package/dist/cache-service.js +2 -1
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +36 -1
- package/dist/channel/adapters/discord.js +126 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +42 -2
- package/dist/channel/adapters/telegram.js +142 -23
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +9 -1
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +11 -0
- package/dist/channel/mcp-tools.js +26 -13
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-edit-errors.d.ts +5 -0
- package/dist/channel/message-edit-errors.js +24 -0
- package/dist/channel/message-edit-errors.js.map +1 -0
- package/dist/channel/telegram-markdown.d.ts +6 -0
- package/dist/channel/telegram-markdown.js +104 -0
- package/dist/channel/telegram-markdown.js.map +1 -0
- package/dist/channel/tool-router.d.ts +2 -0
- package/dist/channel/tool-router.js +10 -4
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +55 -3
- package/dist/cli.js +167 -39
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +2 -2
- package/dist/command-table.js +6 -3
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +59 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +15 -2
- package/dist/cross-instance-envelope.js +29 -5
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/daemon.d.ts +156 -1
- package/dist/daemon.js +773 -89
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +70 -8
- package/dist/delivery-outbox.js +315 -24
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +18 -1
- package/dist/delivery-reconciliation.js +67 -2
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/fleet-context.d.ts +10 -1
- package/dist/fleet-manager.d.ts +404 -13
- package/dist/fleet-manager.js +2039 -210
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/backend-providers/SKILL.md +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +92 -21
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +27 -3
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +8 -8
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -5
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +4 -4
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +13 -13
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +6 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +12 -9
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +8 -2
- package/dist/general-knowledge/skills/scheduling/SKILL.md +5 -3
- package/dist/general-knowledge/skills/session-management/SKILL.md +6 -5
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +2 -2
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +8 -3
- package/dist/general-knowledge/steering/core-rules.md +8 -7
- package/dist/host-memory.d.ts +10 -0
- package/dist/host-memory.js +33 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/human-delivery-receipts.d.ts +83 -0
- package/dist/human-delivery-receipts.js +194 -0
- package/dist/human-delivery-receipts.js.map +1 -0
- package/dist/instance-avatar.d.ts +36 -0
- package/dist/instance-avatar.js +57 -0
- package/dist/instance-avatar.js.map +1 -0
- package/dist/instance-config-impact.js +6 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +29 -6
- package/dist/instance-lifecycle.js +79 -28
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +3 -1
- package/dist/instructions.js +11 -8
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-log-gate.d.ts +42 -0
- package/dist/kiro-log-gate.js +39 -0
- package/dist/kiro-log-gate.js.map +1 -0
- package/dist/locale.js +226 -44
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +99 -0
- package/dist/log-service.js +243 -0
- package/dist/log-service.js.map +1 -0
- package/dist/log-steps.d.ts +169 -0
- package/dist/log-steps.js +858 -0
- package/dist/log-steps.js.map +1 -0
- package/dist/login-controller.d.ts +20 -3
- package/dist/login-controller.js +71 -19
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.d.ts +5 -2
- package/dist/login-flows.js +5 -4
- package/dist/login-flows.js.map +1 -1
- package/dist/memory-pressure.d.ts +13 -1
- package/dist/memory-pressure.js +50 -10
- package/dist/memory-pressure.js.map +1 -1
- package/dist/needs-you-hub.js +2 -0
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +6 -0
- package/dist/needs-you-live.js +23 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/next-steps.js +1 -1
- package/dist/next-steps.js.map +1 -1
- package/dist/outbound-handlers.d.ts +100 -0
- package/dist/outbound-handlers.js +284 -97
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +38 -15
- package/dist/outbound-schemas.js +36 -8
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-link-progress.d.ts +1 -1
- package/dist/public-link-progress.js +8 -2
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.d.ts +101 -0
- package/dist/public-preview.js +236 -0
- package/dist/public-preview.js.map +1 -0
- package/dist/public-web-gateway.js +14 -4
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +24 -1
- package/dist/public-web-link.js +63 -9
- package/dist/public-web-link.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +89 -5
- package/dist/reply-buttons-controller.js +273 -8
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-buttons.d.ts +48 -3
- package/dist/reply-buttons.js +105 -10
- package/dist/reply-buttons.js.map +1 -1
- package/dist/reply-polls.d.ts +85 -0
- package/dist/reply-polls.js +154 -0
- package/dist/reply-polls.js.map +1 -0
- package/dist/restart-guard.d.ts +6 -3
- package/dist/restart-guard.js +6 -3
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +33 -0
- package/dist/restart-progress.js +30 -0
- package/dist/restart-progress.js.map +1 -1
- package/dist/service-activation.d.ts +15 -7
- package/dist/service-activation.js +46 -29
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +31 -0
- package/dist/service-installer.js +41 -2
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.js +85 -25
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +72 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +28 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +7 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +1 -1
- package/dist/spawn-gate.js +5 -1
- package/dist/spawn-gate.js.map +1 -1
- package/dist/spawn-hold-reply.d.ts +12 -0
- package/dist/spawn-hold-reply.js +39 -0
- package/dist/spawn-hold-reply.js.map +1 -0
- package/dist/status-emojis.d.ts +10 -3
- package/dist/status-emojis.js +11 -2
- package/dist/status-emojis.js.map +1 -1
- package/dist/systemd-peer-bus.d.ts +95 -0
- package/dist/systemd-peer-bus.js +430 -0
- package/dist/systemd-peer-bus.js.map +1 -0
- package/dist/systemd-runtime.d.ts +27 -1
- package/dist/systemd-runtime.js +69 -7
- package/dist/systemd-runtime.js.map +1 -1
- package/dist/tips.js +4 -4
- package/dist/tips.js.map +1 -1
- package/dist/tool-permissions.js +3 -3
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.js +3 -2
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.d.ts +42 -2
- package/dist/topic-commands.js +101 -11
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +3 -3
- package/dist/transcript-delta-reader.js +8 -8
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.d.ts +80 -3
- package/dist/transcript-jsonl.js +147 -10
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.d.ts +19 -0
- package/dist/transcript-monitor.js +87 -15
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +78 -0
- package/dist/transcript-sources.js +375 -64
- package/dist/transcript-sources.js.map +1 -1
- package/dist/transcript-turns.d.ts +15 -2
- package/dist/transcript-turns.js +15 -2
- package/dist/transcript-turns.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -15
- package/dist/tunnel/cloudflared.js +36 -1
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +5 -1
- package/dist/tunnel/purpose-lane.js +14 -7
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +5 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/turn-resume.d.ts +2 -0
- package/dist/turn-resume.js +1 -1
- package/dist/turn-resume.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/ui/chat-commands.js +1 -0
- package/dist/ui/chat-emojis.js +33 -0
- package/dist/ui/chat-mentions.js +63 -0
- package/dist/ui/chat-render.js +61 -4
- package/dist/ui/chat-store.js +37 -3
- package/dist/ui/chat-strings.js +40 -20
- package/dist/ui/chat-thread.js +111 -12
- package/dist/ui/chat-time.js +80 -0
- package/dist/ui/panel-chat.js +41 -10
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +199 -57
- package/dist/ui/panel-log.js +428 -0
- package/dist/ui/panel-needs.js +6 -2
- package/dist/ui/panel-settings.js +184 -32
- package/dist/ui/preview-panel.js +55 -15
- package/dist/ui/preview-status.js +28 -0
- package/dist/ui/preview.js +44 -3
- package/dist/ui/settings-dialogs.js +7 -2
- package/dist/ui/settings-model.js +2 -1
- package/dist/ui/settings-strings.js +56 -4
- package/dist/ui/settings-token.js +1 -1
- package/dist/ui/shared/app-i18n.js +43 -17
- package/dist/ui/shared/app-prefs.js +250 -0
- package/dist/ui/shared/app-route.js +7 -2
- package/dist/ui/shared/app-shell.js +165 -8
- package/dist/ui/shared/app-store.js +5 -1
- package/dist/ui/shared/app-stream.js +26 -5
- package/dist/ui/shared/app.css +163 -22
- package/dist/ui/shared/app.js +11 -1
- package/dist/ui/shared/fonts/README.md +1 -1
- package/dist/ui/shared/header-tools.js +55 -5
- package/dist/ui/shared/instance-nav.js +241 -45
- package/dist/ui/shared/instance-switch.js +4 -4
- package/dist/ui/shared/panel-view.js +6 -0
- package/dist/ui/shared/signin.js +7 -7
- package/dist/ui/shared/theme.js +39 -7
- package/dist/ui/shared/tokens.css +1 -1
- package/dist/ui/shared/ui-icons.js +1 -0
- package/dist/ui/shared/usage-dialog.js +23 -5
- package/dist/ui/shared/view-strings.js +32 -4
- package/dist/ui/signin.html +1 -1
- package/dist/unrecognised-prompt.d.ts +23 -0
- package/dist/unrecognised-prompt.js +74 -0
- package/dist/unrecognised-prompt.js.map +1 -0
- package/dist/update-check.d.ts +31 -0
- package/dist/update-check.js +47 -0
- package/dist/update-check.js.map +1 -1
- package/dist/update-install.d.ts +28 -2
- package/dist/update-install.js +22 -4
- package/dist/update-install.js.map +1 -1
- package/dist/update-launch.d.ts +46 -1
- package/dist/update-launch.js +146 -3
- package/dist/update-launch.js.map +1 -1
- package/dist/update-marker.d.ts +51 -0
- package/dist/update-marker.js +61 -0
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.d.ts +100 -0
- package/dist/update-preflight.js +264 -0
- package/dist/update-preflight.js.map +1 -0
- package/dist/updater-caller.d.ts +31 -0
- package/dist/updater-caller.js +109 -0
- package/dist/updater-caller.js.map +1 -0
- 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 +34 -5
- package/dist/usage/providers.js +160 -27
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.d.ts +6 -2
- package/dist/usage/statusline-usage.js +10 -4
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +1 -1
- package/dist/view-api.js +38 -8
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.d.ts +11 -0
- package/dist/wake-coordinator.js +38 -4
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-api.d.ts +89 -4
- package/dist/web-api.js +551 -45
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +2 -2
- package/dist/web-auth.js +9 -4
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +12 -1
- package/dist/web-chat-history.js +29 -7
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +27 -4
- package/dist/web-commands.js +19 -4
- package/dist/web-commands.js.map +1 -1
- package/dist/web-host-guard.d.ts +3 -11
- package/dist/web-host-guard.js +3 -12
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-images.d.ts +47 -0
- package/dist/web-images.js +169 -0
- package/dist/web-images.js.map +1 -0
- package/dist/web-login.d.ts +14 -0
- package/dist/web-login.js +4 -2
- package/dist/web-login.js.map +1 -1
- package/dist/web-mentions.d.ts +44 -0
- package/dist/web-mentions.js +75 -0
- package/dist/web-mentions.js.map +1 -0
- package/dist/web-prefs.d.ts +81 -0
- package/dist/web-prefs.js +297 -0
- package/dist/web-prefs.js.map +1 -0
- package/dist/web-preview.d.ts +14 -1
- package/dist/web-preview.js +35 -13
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.d.ts +32 -0
- package/dist/web-profile.js +132 -0
- package/dist/web-profile.js.map +1 -0
- package/dist/web-reply-files.d.ts +45 -0
- package/dist/web-reply-files.js +223 -0
- package/dist/web-reply-files.js.map +1 -0
- package/dist/web-schedules.d.ts +12 -0
- package/dist/web-schedules.js +34 -0
- package/dist/web-schedules.js.map +1 -0
- package/dist/web-server-drain.d.ts +10 -0
- package/dist/web-server-drain.js +50 -0
- package/dist/web-server-drain.js.map +1 -0
- package/dist/web-session.d.ts +50 -1
- package/dist/web-session.js +63 -6
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +23 -0
- package/dist/web-settings-patch.js +77 -0
- package/dist/web-settings-patch.js.map +1 -0
- package/dist/web-shell-routes.d.ts +5 -1
- package/dist/web-shell-routes.js +10 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-upload.d.ts +17 -4
- package/dist/web-upload.js +64 -13
- package/dist/web-upload.js.map +1 -1
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/launchd.plist.ejs +3 -1
- package/templates/systemd.service.ejs +2 -1
package/dist/cli.js
CHANGED
|
@@ -20,10 +20,10 @@ import { existsSync, readFileSync, writeFileSync, appendFileSync, unlinkSync, mk
|
|
|
20
20
|
import { homedir, totalmem, freemem, userInfo } from "node:os";
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
import { spawn, spawnSync, execSync, execFileSync } from "node:child_process";
|
|
23
|
-
import { getAgendHome, getTmuxSocketName } from "./paths.js";
|
|
23
|
+
import { getAgendHome, getTmuxSocketName, isDefaultAgendHome } from "./paths.js";
|
|
24
24
|
import { hasPausedMarker } from "./pause-marker.js";
|
|
25
25
|
import { COMPLETION_SHELLS, completionScript } from "./completion.js";
|
|
26
|
-
import { getUpdateSelector, isExactVersion, isUnrequestedDowngrade, lookupTargetVersion, reportUpdateRestart, shouldSkipUpdate, runningFleetPredatesInstall, processStartMs, } from "./update-check.js";
|
|
26
|
+
import { getUpdateSelector, isExactVersion, isUnrequestedDowngrade, lookupTargetVersion, reportUpdateRestart, shouldSkipUpdate, runningFleetPredatesInstall, fleetProvenStopped, readFleetPidEvidence, pidAlive, processStartMs, } from "./update-check.js";
|
|
27
27
|
import { clearUpdateMarker, markUpdateInProgress, setUpdateProgressStage } from "./update-marker.js";
|
|
28
28
|
import { describeSignalSource, forceAllowed, gateFleetControl, recordInstanceControl, withOrigin } from "./fleet-control-audit.js";
|
|
29
29
|
import { FLEET_STOP_TIMEOUT_MS, stopDetachedOwner, systemdStopTimeoutMs, detachedProcessStart, detachedProcessExited } from "./fleet-stop-budget.js";
|
|
@@ -1495,7 +1495,7 @@ program
|
|
|
1495
1495
|
const { newAgendInvocation, retireSystemCopy, activationSettled } = await import("./update-install.js");
|
|
1496
1496
|
// What the restart came to — carried, never inferred from the exit code (pending ≠ restarted).
|
|
1497
1497
|
let restartResult = null;
|
|
1498
|
-
const { activateService } = await import("./service-activation.js");
|
|
1498
|
+
const { activateService, systemdPeerBus } = await import("./service-activation.js");
|
|
1499
1499
|
const { getServicePath, getSystemServicePath, detectPlatform } = await import("./service-installer.js");
|
|
1500
1500
|
const { accessSync, constants } = await import("node:fs");
|
|
1501
1501
|
const newAgend = newAgendInvocation({ viaNvm, nvmSh }, verified.agendPath);
|
|
@@ -1518,6 +1518,18 @@ program
|
|
|
1518
1518
|
const result = spawnSync(command, args, { encoding: "utf-8", timeout: 15_000, stdio: ["ignore", "pipe", "pipe"] });
|
|
1519
1519
|
return { status: result.status, signal: result.signal, stdout: result.stdout ?? "", stderr: result.stderr ?? "" };
|
|
1520
1520
|
};
|
|
1521
|
+
// #1660: the retire outcome lands after this process's restart returns —
|
|
1522
|
+
// after the new fleet may have consumed this receipt. Capture it now so
|
|
1523
|
+
// the cleanup write later can prove it still owns the marker (checklist
|
|
1524
|
+
// 3/5). A missed capture only skips the marker write; retire still runs.
|
|
1525
|
+
let cleanupReceipt = null;
|
|
1526
|
+
if (verified.retireSystemCopy) {
|
|
1527
|
+
try {
|
|
1528
|
+
const { markCleanupPending } = await import("./update-marker.js");
|
|
1529
|
+
cleanupReceipt = markCleanupPending(DATA_DIR);
|
|
1530
|
+
}
|
|
1531
|
+
catch { /* no receipt: retire still runs, the marker write is skipped */ }
|
|
1532
|
+
}
|
|
1521
1533
|
const outcome = activateService(manager, verified, {
|
|
1522
1534
|
run: capture,
|
|
1523
1535
|
readFile: path => { try {
|
|
@@ -1546,7 +1558,8 @@ program
|
|
|
1546
1558
|
catch {
|
|
1547
1559
|
return false;
|
|
1548
1560
|
} },
|
|
1549
|
-
// `agend install` activates by default; the update owns stop/start, so only the file is refreshed here.
|
|
1561
|
+
// `agend install` activates by default; the update owns stop/start, so only the file is refreshed here. Only
|
|
1562
|
+
// an existing service is refreshed: a detached fleet's update never calls this (#1631).
|
|
1550
1563
|
refresh: () => {
|
|
1551
1564
|
const result = capture(newAgend.command, [...newAgend.args, "install", "--no-activate"]);
|
|
1552
1565
|
if (result.status === 0)
|
|
@@ -1566,6 +1579,7 @@ program
|
|
|
1566
1579
|
log: message => console.log(message),
|
|
1567
1580
|
restorePackage,
|
|
1568
1581
|
systemdRecovery: restoreChecked ? { restorePackage: restoreChecked } : undefined,
|
|
1582
|
+
peerBus: systemdPeerBus,
|
|
1569
1583
|
});
|
|
1570
1584
|
// Settled: after a success only this transition's preimage is kept (for a repair); a failure consumed it.
|
|
1571
1585
|
if (activationSettled(outcome, restartResult) && rollback)
|
|
@@ -1574,10 +1588,41 @@ program
|
|
|
1574
1588
|
// new install (activationSettled) is it removed; pending, failed or refused, it stays, so the old unit still starts.
|
|
1575
1589
|
if (verified.retireSystemCopy) {
|
|
1576
1590
|
if (activationSettled(outcome, restartResult)) {
|
|
1577
|
-
|
|
1591
|
+
// #1735: the old copy is the package this updater runs from (the nvm route is taken because its prefix is not
|
|
1592
|
+
// writable); the warning names it.
|
|
1593
|
+
const oldCopyDir = (() => { try {
|
|
1594
|
+
return realpathSync(dirname(__dirname));
|
|
1595
|
+
}
|
|
1596
|
+
catch {
|
|
1597
|
+
return undefined;
|
|
1598
|
+
} })();
|
|
1599
|
+
const retireResult = retireSystemCopy({ run: (command, args) => capture(command, args), log: message => console.log(message) }, verified.npmPath, oldCopyDir);
|
|
1600
|
+
// The marker write proves the pre-restart receipt still owns the
|
|
1601
|
+
// marker: refused when it is gone or belongs to another operation.
|
|
1602
|
+
const recordCleanup = async (result) => {
|
|
1603
|
+
if (!cleanupReceipt)
|
|
1604
|
+
return;
|
|
1605
|
+
try {
|
|
1606
|
+
const { writeCleanupOutcome } = await import("./update-marker.js");
|
|
1607
|
+
writeCleanupOutcome(DATA_DIR, cleanupReceipt, result);
|
|
1608
|
+
}
|
|
1609
|
+
catch { /* receipt unverifiable: retire already ran; stdout stands */ }
|
|
1610
|
+
};
|
|
1578
1611
|
if (!retireResult.ok) {
|
|
1579
1612
|
console.error(` ✗ Old system install was not removed: ${retireResult.reason}`);
|
|
1580
1613
|
process.exitCode = 1;
|
|
1614
|
+
// Resolve the pending flag so no watch waits out the max age.
|
|
1615
|
+
await recordCleanup(null);
|
|
1616
|
+
}
|
|
1617
|
+
else if (retireResult.warning) {
|
|
1618
|
+
// #1660: cleanup only — the new version runs. Exit 0; the single
|
|
1619
|
+
// print lives here (retireSystemCopy stays silent, P3-1).
|
|
1620
|
+
console.log(` ⚠️ ${retireResult.warning}`
|
|
1621
|
+
+ (retireResult.cleanupCommand ? `\n $ ${retireResult.cleanupCommand}` : ""));
|
|
1622
|
+
await recordCleanup({ warning: retireResult.warning, cleanupCommand: retireResult.cleanupCommand });
|
|
1623
|
+
}
|
|
1624
|
+
else {
|
|
1625
|
+
await recordCleanup(null);
|
|
1581
1626
|
}
|
|
1582
1627
|
}
|
|
1583
1628
|
else {
|
|
@@ -1622,15 +1667,9 @@ program
|
|
|
1622
1667
|
installedAtMs = statSync(fileURLToPath(import.meta.url)).mtimeMs;
|
|
1623
1668
|
}
|
|
1624
1669
|
catch { /* unknown */ }
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
processStartMs: pid => processStartMs(pid),
|
|
1629
|
-
isFleetProcess: pid => isFleetStartCommandLine(readProcessCommandLine(pid)),
|
|
1630
|
-
})) {
|
|
1631
|
-
console.log(`\n v${pkgVersion} is installed, but the running fleet started before it was — verifying it before restarting onto it.`);
|
|
1632
|
-
// The earlier update may have stopped exactly because this install failed verification (#1449 review): a
|
|
1633
|
-
// second `agend update` must not restart onto it unchecked.
|
|
1670
|
+
// The earlier update may have stopped exactly because this install failed verification (#1449 review): a
|
|
1671
|
+
// second `agend update` must not restart onto it — nor call it up to date — unchecked.
|
|
1672
|
+
const verifyInstalled = async () => {
|
|
1634
1673
|
const { verifyInstalledPackage } = await import("./update-install.js");
|
|
1635
1674
|
const verified = verifyInstalledPackage({ pkg: `@songsid/agend@${pkgVersion}`, targetVersion: pkgVersion, viaNvm: false, nvmSh }, {
|
|
1636
1675
|
run: (command, args, options = {}) => {
|
|
@@ -1644,13 +1683,42 @@ program
|
|
|
1644
1683
|
console.error(message);
|
|
1645
1684
|
setUpdateProgressStage(DATA_DIR, "failed", { error: message.trim() });
|
|
1646
1685
|
process.exitCode = 1;
|
|
1647
|
-
return;
|
|
1648
1686
|
}
|
|
1687
|
+
return verified;
|
|
1688
|
+
};
|
|
1689
|
+
if (runningFleetPredatesInstall({
|
|
1690
|
+
pid: fleetPid,
|
|
1691
|
+
installedAtMs,
|
|
1692
|
+
processStartMs: pid => processStartMs(pid),
|
|
1693
|
+
isFleetProcess: pid => isFleetStartCommandLine(readProcessCommandLine(pid)),
|
|
1694
|
+
})) {
|
|
1695
|
+
console.log(`\n v${pkgVersion} is installed, but the running fleet started before it was — verifying it before restarting onto it.`);
|
|
1696
|
+
const verified = await verifyInstalled();
|
|
1697
|
+
if (!verified.ok)
|
|
1698
|
+
return;
|
|
1649
1699
|
console.log(` ✓ v${pkgVersion} verified — restarting the fleet onto it.\n`);
|
|
1650
1700
|
markUpdateInProgress(DATA_DIR);
|
|
1651
1701
|
await activateVerified(verified, false);
|
|
1652
1702
|
return;
|
|
1653
1703
|
}
|
|
1704
|
+
// #1829 ⑥: installed, but no fleet runs (a restart that never finished, a stopped service): not "up to date".
|
|
1705
|
+
// Verified first, then the exact next step — never started from here, so nothing bypasses `agend start`'s checks.
|
|
1706
|
+
// Only a fleet.pid that is missing, or names a pid proven gone / not a fleet, says so (review: unreadable,
|
|
1707
|
+
// empty or malformed is unknown, and keeps the old answer).
|
|
1708
|
+
const pidEvidence = readFleetPidEvidence(join(DATA_DIR, "fleet.pid"));
|
|
1709
|
+
if (pidEvidence.kind !== "unknown" && fleetProvenStopped({
|
|
1710
|
+
pid: pidEvidence.kind === "valid" ? pidEvidence.pid : null,
|
|
1711
|
+
alive: pid => pidAlive(pid),
|
|
1712
|
+
commandLine: pid => readProcessCommandLine(pid),
|
|
1713
|
+
isFleetProcess: line => isFleetStartCommandLine(line),
|
|
1714
|
+
})) {
|
|
1715
|
+
const verified = await verifyInstalled();
|
|
1716
|
+
if (!verified.ok)
|
|
1717
|
+
return;
|
|
1718
|
+
console.error(`\n ✗ AgEnD v${pkgVersion} is installed but the fleet is not running — run: agend start\n`);
|
|
1719
|
+
process.exitCode = 1;
|
|
1720
|
+
return;
|
|
1721
|
+
}
|
|
1654
1722
|
console.log(`\n ✓ Already up to date (v${pkgVersion})\n`);
|
|
1655
1723
|
setUpdateProgressStage(DATA_DIR, "complete", { version: pkgVersion });
|
|
1656
1724
|
return;
|
|
@@ -1663,6 +1731,42 @@ program
|
|
|
1663
1731
|
process.exitCode = 1;
|
|
1664
1732
|
return;
|
|
1665
1733
|
}
|
|
1734
|
+
// ── Check if npm global needs sudo (read-only; decides the nvm path the preflight judges) ──
|
|
1735
|
+
let needsSudo = false;
|
|
1736
|
+
try {
|
|
1737
|
+
const prefix = execSync("npm config get prefix", { encoding: "utf-8" }).trim();
|
|
1738
|
+
const { accessSync, constants } = await import("node:fs");
|
|
1739
|
+
try {
|
|
1740
|
+
accessSync(prefix, constants.W_OK);
|
|
1741
|
+
}
|
|
1742
|
+
catch {
|
|
1743
|
+
needsSudo = true;
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
catch { /* assume no sudo needed */ }
|
|
1747
|
+
// ── #1441 B: can the target run here, on the Node it will actually run on? ──
|
|
1748
|
+
// Read where the install runs (#1623 review): a direct install runs `npm` and the release's `node` from this
|
|
1749
|
+
// environment, so it is decided now, before anything is touched. An nvm install runs nvm's npm and Node 22, which
|
|
1750
|
+
// exist only once nvm has selected them: runUpdateInstall decides it there, before the lock and npm.
|
|
1751
|
+
const preflight = targetVersion ? await import("./update-preflight.js") : null;
|
|
1752
|
+
if (preflight && targetVersion && !needsSudo) {
|
|
1753
|
+
const verdict = preflight.preflightUpdate({
|
|
1754
|
+
run: (argv, timeoutMs) => {
|
|
1755
|
+
const r = spawnSync(argv[0], argv.slice(1), { encoding: "utf-8", timeout: timeoutMs, stdio: ["ignore", "pipe", "ignore"] });
|
|
1756
|
+
return { status: r.status, stdout: r.stdout ?? "" };
|
|
1757
|
+
},
|
|
1758
|
+
npm: "npm",
|
|
1759
|
+
}, pkg, targetVersion, "the `node` on PATH");
|
|
1760
|
+
if (verdict.kind === "refuse") {
|
|
1761
|
+
console.error(`\n${verdict.message}\n`);
|
|
1762
|
+
// A chat-started /update (Discord, Telegram, an agent) is waiting on this: the reason is its outcome.
|
|
1763
|
+
setUpdateProgressStage(DATA_DIR, "failed", { error: `Not updated: ${verdict.summary}. Nothing was changed.` });
|
|
1764
|
+
process.exitCode = 1;
|
|
1765
|
+
return;
|
|
1766
|
+
}
|
|
1767
|
+
if (verdict.kind === "unknown")
|
|
1768
|
+
console.log(verdict.note);
|
|
1769
|
+
}
|
|
1666
1770
|
if (targetVersion) {
|
|
1667
1771
|
console.log(`\n Updating AgEnD v${pkgVersion} → v${targetVersion}...\n`);
|
|
1668
1772
|
}
|
|
@@ -1684,19 +1788,6 @@ program
|
|
|
1684
1788
|
process.exit(1);
|
|
1685
1789
|
};
|
|
1686
1790
|
setUpdateProgressStage(DATA_DIR, "downloading");
|
|
1687
|
-
// ── Check if npm global needs sudo ──
|
|
1688
|
-
let needsSudo = false;
|
|
1689
|
-
try {
|
|
1690
|
-
const prefix = execSync("npm config get prefix", { encoding: "utf-8" }).trim();
|
|
1691
|
-
const { accessSync, constants } = await import("node:fs");
|
|
1692
|
-
try {
|
|
1693
|
-
accessSync(prefix, constants.W_OK);
|
|
1694
|
-
}
|
|
1695
|
-
catch {
|
|
1696
|
-
needsSudo = true;
|
|
1697
|
-
}
|
|
1698
|
-
}
|
|
1699
|
-
catch { /* assume no sudo needed */ }
|
|
1700
1791
|
if (needsSudo) {
|
|
1701
1792
|
// ── nvm path: install without sudo ──
|
|
1702
1793
|
if (!existsSync(nvmSh)) {
|
|
@@ -1728,6 +1819,9 @@ program
|
|
|
1728
1819
|
process.once("exit", () => releaseLock());
|
|
1729
1820
|
const installed = runUpdateInstall({
|
|
1730
1821
|
pkg, targetVersion, viaNvm: needsSudo, nvmSh, rollback: true,
|
|
1822
|
+
...(preflight && targetVersion && needsSudo
|
|
1823
|
+
? { preflight: preflight.installPreflight(pkg, targetVersion, "the Node 22 nvm selected", { log: m => console.log(m), error: m => console.error(m) }) }
|
|
1824
|
+
: {}),
|
|
1731
1825
|
lock: prefix => {
|
|
1732
1826
|
const lock = acquireInstallLock(prefix, { spec: pkg, agendHome: DATA_DIR }, {
|
|
1733
1827
|
pid: process.pid, processStart: admission.processStart, newToken: () => randomBytes(16).toString("hex"),
|
|
@@ -1786,15 +1880,34 @@ program
|
|
|
1786
1880
|
.option("--activate", "Deprecated; service activation is now the default")
|
|
1787
1881
|
.option("--no-activate", "Write the service file without activating it")
|
|
1788
1882
|
.action(async (opts) => {
|
|
1789
|
-
const { installService, activateService, detectPlatform, renderLaunchdPlist, launchdPlistPath } = await import("./service-installer.js");
|
|
1883
|
+
const { installService, activateService, detectPlatform, renderLaunchdPlist, launchdPlistPath, getServicePath, getSystemServicePath, serviceHomeFor } = await import("./service-installer.js");
|
|
1884
|
+
// #1631 B: an older updater (2.2.0-beta.1 and before) refreshes a hand-started fleet's service too, through this
|
|
1885
|
+
// command — which would CREATE a unit or plist, and every later update would then take a manager it may not reach
|
|
1886
|
+
// as the authority. When no service exists and it is certain this is that updater's refresh, write nothing. A
|
|
1887
|
+
// manual `agend install` (with or without --no-activate) creates the service as always.
|
|
1888
|
+
if (opts.activate === false && getServicePath() === null && getSystemServicePath() === null) {
|
|
1889
|
+
const { startedByUpdater, systemUpdaterCallerProbe } = await import("./updater-caller.js");
|
|
1890
|
+
const caller = startedByUpdater(systemUpdaterCallerProbe(DATA_DIR, pkgVersion));
|
|
1891
|
+
if (caller.updater) {
|
|
1892
|
+
console.log(" No service to refresh: this update runs a hand-started fleet, so none was created (`agend install` creates one).");
|
|
1893
|
+
return;
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1790
1896
|
const execPath = canonicalCliEntry();
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1897
|
+
// A fleet on a custom AGEND_HOME must come back on it after a service restart or an update: the definition names
|
|
1898
|
+
// it (the default home adds nothing). A refresh from the default home keeps an existing definition's home.
|
|
1899
|
+
const existingPath = getServicePath();
|
|
1900
|
+
const service = serviceHomeFor(DATA_DIR, {
|
|
1901
|
+
refresh: opts.activate === false,
|
|
1902
|
+
existingDefinition: existingPath ? (() => { try {
|
|
1903
|
+
return readFileSync(existingPath, "utf-8");
|
|
1904
|
+
}
|
|
1905
|
+
catch {
|
|
1906
|
+
return null;
|
|
1907
|
+
} })() : null,
|
|
1908
|
+
isDefault: isDefaultAgendHome,
|
|
1909
|
+
});
|
|
1910
|
+
const serviceVars = { label: "com.agend.fleet", execPath, path: process.env.PATH, ...service };
|
|
1798
1911
|
// #1450 C6: on launchd, writing a new plist without activating is a PLANNED activation — proven, recorded, and
|
|
1799
1912
|
// left for `agend restart` (a reload there would itself start the job). See service-plan.ts.
|
|
1800
1913
|
if (opts.activate === false && detectPlatform() === "macos") {
|
|
@@ -2194,7 +2307,8 @@ program
|
|
|
2194
2307
|
}
|
|
2195
2308
|
if (filterCustom)
|
|
2196
2309
|
console.log(` ⚠ ${unitPath} sets its own CoredumpFilter; left as is. CoredumpFilter=0 keeps crash dumps to a few KB (#1113).`);
|
|
2197
|
-
|
|
2310
|
+
const { systemdPeerBus } = await import("./service-activation.js");
|
|
2311
|
+
if (expectation.ok && refuses(guard.guardSystemd(captureRun, systemdTarget.user, systemdTarget.unit, expectation.expected, guardDeps, systemdPeerBus)))
|
|
2198
2312
|
return;
|
|
2199
2313
|
// Clears the failed state AND the start-limit counter (#1113:
|
|
2200
2314
|
// StartLimitBurst=4 in 30min) for whichever unit this restart targets,
|
|
@@ -2578,7 +2692,7 @@ program
|
|
|
2578
2692
|
console.log("Web token rotated.");
|
|
2579
2693
|
console.log("Every previously issued dashboard link and browser session is now rejected.");
|
|
2580
2694
|
console.log("A running fleet picks this up immediately — no restart needed.");
|
|
2581
|
-
console.log("Sign in again with `agend web` (prints a one-time code), or /
|
|
2695
|
+
console.log("Sign in again with `agend web` (prints a one-time code), or /web in your chat channel.");
|
|
2582
2696
|
});
|
|
2583
2697
|
program
|
|
2584
2698
|
.command("view")
|
|
@@ -2901,7 +3015,21 @@ async function fuzzyMatch(query, names) {
|
|
|
2901
3015
|
return null;
|
|
2902
3016
|
}
|
|
2903
3017
|
async function resolveInstance(query, config) {
|
|
2904
|
-
const
|
|
3018
|
+
const namesRaw = await listInstanceNames(config);
|
|
3019
|
+
const names = [...new Set(namesRaw)]; // P3-3: deduplicate (a classicBot instanceName can equal a fleet name)
|
|
3020
|
+
const { resolveName } = await import("./topic-commands.js");
|
|
3021
|
+
const entries = names.map((name) => ({
|
|
3022
|
+
name,
|
|
3023
|
+
displayName: config.instances[name]?.display_name,
|
|
3024
|
+
}));
|
|
3025
|
+
const result = resolveName(query, entries);
|
|
3026
|
+
if (result.kind === "name")
|
|
3027
|
+
return result.realName;
|
|
3028
|
+
if (result.kind === "ambiguous") {
|
|
3029
|
+
console.error(`"${query}" matches multiple instances: ${result.realNames.join(", ")}. Use the real name.`);
|
|
3030
|
+
process.exit(1);
|
|
3031
|
+
}
|
|
3032
|
+
// Fall through to the original fuzzy match on real names.
|
|
2905
3033
|
const match = await fuzzyMatch(query, names);
|
|
2906
3034
|
if (!match) {
|
|
2907
3035
|
console.error(`No instance matching "${query}". Available: ${names.join(", ")}`);
|