@songsid/agend 2.2.0-beta.1 → 2.2.0-beta.10
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 +21 -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 +2 -2
- package/dist/auth-api.js +4 -2
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +3 -0
- package/dist/backend/antigravity.js +9 -0
- 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 +1 -1
- package/dist/backend/effort-metadata.js +3 -2
- 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 +33 -0
- package/dist/backend/launch-effort.js +123 -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 +33 -4
- package/dist/backend/types.js +2 -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 +24 -1
- package/dist/channel/adapters/discord.js +87 -2
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +24 -2
- package/dist/channel/adapters/telegram.js +118 -20
- 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 +24 -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.js +9 -3
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +39 -3
- package/dist/cli.js +133 -28
- 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 +764 -89
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +62 -7
- package/dist/delivery-outbox.js +309 -22
- 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 +345 -10
- package/dist/fleet-manager.js +1868 -174
- 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 +9 -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 +200 -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 +263 -96
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +26 -15
- package/dist/outbound-schemas.js +24 -7
- 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 +11 -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 +3 -0
- package/dist/reply-buttons-controller.js +3 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- 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-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 +92 -7
- 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 +42 -2
- package/dist/ui/chat-store.js +2 -2
- package/dist/ui/chat-strings.js +38 -20
- package/dist/ui/chat-thread.js +69 -12
- package/dist/ui/chat-time.js +80 -0
- package/dist/ui/panel-chat.js +39 -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 +137 -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 +46 -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 +23 -5
- package/dist/ui/shared/app.css +155 -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-install.d.ts +28 -2
- package/dist/update-install.js +22 -4
- package/dist/update-install.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 +49 -2
- package/dist/web-api.js +421 -31
- 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-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-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 +63 -0
- package/dist/web-prefs.js +265 -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-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 +36 -1
- package/dist/web-session.js +53 -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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export interface RuntimeHost {
|
|
2
|
+
platform: string;
|
|
3
|
+
arch: string;
|
|
4
|
+
id: string;
|
|
5
|
+
glibc: string | null;
|
|
6
|
+
darwinRelease: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface RuntimePlatform {
|
|
9
|
+
hostPlatform(probe?: Partial<RuntimeHost>): RuntimeHost;
|
|
10
|
+
runtimeSupport(host: RuntimeHost): {
|
|
11
|
+
supported: boolean;
|
|
12
|
+
reason: string | null;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** The one answer to "can this host run AgEnD's bundled Node?", shared with preinstall, postinstall and the launcher. */
|
|
16
|
+
export declare const runtimePlatform: RuntimePlatform;
|
|
17
|
+
/** What the release about to be installed asks for: its Node range, and the runtime it pins per host id. */
|
|
18
|
+
export interface TargetManifest {
|
|
19
|
+
version: string;
|
|
20
|
+
engines: string | null;
|
|
21
|
+
runtimePins: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
/** The npm arguments that read a release's requirements; the caller runs them with the npm that installs it. */
|
|
24
|
+
export declare function manifestQuery(spec: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* The target's own requirements, read by `read` — which runs `npm <manifestQuery(spec)>` with the npm, environment and
|
|
27
|
+
* registry the install uses and returns its stdout, or null when it fails. The spec must be the one npm installs, and
|
|
28
|
+
* it must name the exact version (`@songsid/agend@<version>`); the answer must be that version. Otherwise: null.
|
|
29
|
+
*/
|
|
30
|
+
export declare function lookupTargetManifest(spec: string, version: string, read: (args: string[]) => string | null): TargetManifest | null;
|
|
31
|
+
/** The Node the release would run on when its bundled runtime does not apply. */
|
|
32
|
+
export type SystemNode = {
|
|
33
|
+
kind: "version";
|
|
34
|
+
version: string;
|
|
35
|
+
path?: string | null;
|
|
36
|
+
label: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: "none";
|
|
39
|
+
} | {
|
|
40
|
+
kind: "unknown";
|
|
41
|
+
note: string;
|
|
42
|
+
};
|
|
43
|
+
export type UpdateTargetVerdict = {
|
|
44
|
+
kind: "runtime";
|
|
45
|
+
host: string;
|
|
46
|
+
pin: string;
|
|
47
|
+
} | {
|
|
48
|
+
kind: "system";
|
|
49
|
+
node: string;
|
|
50
|
+
label: string;
|
|
51
|
+
} | {
|
|
52
|
+
kind: "refuse";
|
|
53
|
+
message: string;
|
|
54
|
+
summary: string;
|
|
55
|
+
} | {
|
|
56
|
+
kind: "unknown";
|
|
57
|
+
note: string;
|
|
58
|
+
};
|
|
59
|
+
/** Which Node the target will run on here, and whether that Node satisfies the target's engines. */
|
|
60
|
+
export declare function evaluateUpdateTarget(input: {
|
|
61
|
+
manifest: TargetManifest | null;
|
|
62
|
+
host: RuntimeHost;
|
|
63
|
+
platform?: RuntimePlatform;
|
|
64
|
+
system: SystemNode;
|
|
65
|
+
}): UpdateTargetVerdict;
|
|
66
|
+
/** Where the update runs its commands: the install environment (`run`) and the npm binary the install invokes. */
|
|
67
|
+
export interface PreflightEnv {
|
|
68
|
+
run(argv: string[], timeoutMs: number): {
|
|
69
|
+
status: number | null;
|
|
70
|
+
stdout: string;
|
|
71
|
+
};
|
|
72
|
+
npm: string;
|
|
73
|
+
}
|
|
74
|
+
/** The version and path of the `node` the environment resolves; exit 127 when there is none. */
|
|
75
|
+
export declare const NODE_PROBE_SCRIPT = "command -v node >/dev/null 2>&1 || exit 127; exec node -p \"process.versions.node + ' ' + process.execPath\"";
|
|
76
|
+
/** The Node the release's `#!/usr/bin/env node` resolves to in `env` (`label` names it in messages). */
|
|
77
|
+
export declare function probeSystemNode(env: PreflightEnv, label: string): SystemNode;
|
|
78
|
+
/**
|
|
79
|
+
* The whole check, run where the install runs: the requirements of `spec` (which must be `@songsid/agend@<version>`)
|
|
80
|
+
* from `env.npm`, and the Node `env` resolves — both read the way the install that follows reads them.
|
|
81
|
+
*/
|
|
82
|
+
export declare function preflightUpdate(env: PreflightEnv, spec: string, version: string, label: string, host?: RuntimeHost): UpdateTargetVerdict;
|
|
83
|
+
/**
|
|
84
|
+
* The check an nvm install runs once nvm has selected its Node 22 (UpdateInstallPlan.preflight): on that Node, with that
|
|
85
|
+
* Node's npm. A refusal is printed in full and returned as the update's outcome; unknown is a note and the install goes on.
|
|
86
|
+
*/
|
|
87
|
+
export declare function installPreflight(spec: string, version: string, label: string, out: {
|
|
88
|
+
log(message: string): void;
|
|
89
|
+
error(message: string): void;
|
|
90
|
+
}, host?: RuntimeHost): (env: PreflightEnv) => {
|
|
91
|
+
ok: true;
|
|
92
|
+
} | {
|
|
93
|
+
ok: false;
|
|
94
|
+
message: string;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Does Node `version` (stable x.y.z) satisfy npm range `range`? true/false as semver would answer, or null when the
|
|
98
|
+
* version or the range is outside what this parser reads exactly.
|
|
99
|
+
*/
|
|
100
|
+
export declare function satisfiesNodeRange(version: string, range: string): boolean | null;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1441 part B: before `agend update` installs a release, decide whether that release can run on this host — on the
|
|
3
|
+
* Node it will actually run on. That is the target's bundled runtime where the target pins one for this host and the
|
|
4
|
+
* host can run it (#1450: then the system Node does not matter), and otherwise the system Node: the `node` on PATH for a
|
|
5
|
+
* direct install, or the exact Node 22 nvm selected for an nvm install. Which host can run the bundled runtime comes from
|
|
6
|
+
* the helper the preinstall guard, the postinstall and the launcher share (launcher/runtime-platform.cjs).
|
|
7
|
+
*
|
|
8
|
+
* Design baseline: #1441 issuecomment-6108441160. Every input to a definite verdict is read from what the install will
|
|
9
|
+
* actually run (#1623 review): the release's requirements from the npm that installs it, for the exact spec it
|
|
10
|
+
* installs, and the Node version from the interpreter the release will start on. Anything that cannot be read or
|
|
11
|
+
* proven — an unreadable requirement, a range this parser does not understand, a Node not chosen yet — is "unknown":
|
|
12
|
+
* never "compatible" and never invented into a refusal. The update then goes on, and the target's own preinstall guard
|
|
13
|
+
* still refuses inside npm (the previous package stays).
|
|
14
|
+
*/
|
|
15
|
+
import { createRequire } from "node:module";
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
/** The one answer to "can this host run AgEnD's bundled Node?", shared with preinstall, postinstall and the launcher. */
|
|
18
|
+
export const runtimePlatform = require("../launcher/runtime-platform.cjs");
|
|
19
|
+
/** A published package version (semver 2.0, no leading zeros). */
|
|
20
|
+
const PACKAGE_VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/;
|
|
21
|
+
/** A runtime pin as the launcher and postinstall accept it (launcher/runtime-select.cjs): Node x.y.z, optionally -agend.N. */
|
|
22
|
+
const RUNTIME_PIN = /^(\d+\.\d+\.\d+)(-agend\.\d+)?$/;
|
|
23
|
+
/** The npm arguments that read a release's requirements; the caller runs them with the npm that installs it. */
|
|
24
|
+
export function manifestQuery(spec) {
|
|
25
|
+
return ["view", spec, "version", "engines", "optionalDependencies", "--json"];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The target's own requirements, read by `read` — which runs `npm <manifestQuery(spec)>` with the npm, environment and
|
|
29
|
+
* registry the install uses and returns its stdout, or null when it fails. The spec must be the one npm installs, and
|
|
30
|
+
* it must name the exact version (`@songsid/agend@<version>`); the answer must be that version. Otherwise: null.
|
|
31
|
+
*/
|
|
32
|
+
export function lookupTargetManifest(spec, version, read) {
|
|
33
|
+
if (!PACKAGE_VERSION.test(version) || spec !== `@songsid/agend@${version}`)
|
|
34
|
+
return null;
|
|
35
|
+
const raw = read(manifestQuery(spec));
|
|
36
|
+
if (raw === null)
|
|
37
|
+
return null;
|
|
38
|
+
let parsed;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
46
|
+
return null;
|
|
47
|
+
const m = parsed;
|
|
48
|
+
// The registry answered for another version (or with something that is not one): it says nothing about this one.
|
|
49
|
+
if (typeof m.version !== "string" || m.version !== version)
|
|
50
|
+
return null;
|
|
51
|
+
const engines = m.engines && typeof m.engines === "object" && typeof m.engines.node === "string"
|
|
52
|
+
? m.engines.node : null;
|
|
53
|
+
const runtimePins = Object.create(null);
|
|
54
|
+
if (m.optionalDependencies && typeof m.optionalDependencies === "object") {
|
|
55
|
+
for (const [name, pin] of Object.entries(m.optionalDependencies)) {
|
|
56
|
+
const id = /^@songsid\/agend-node-(.+)$/.exec(name)?.[1];
|
|
57
|
+
if (id && typeof pin === "string")
|
|
58
|
+
runtimePins[id] = pin;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { version: m.version, engines, runtimePins };
|
|
62
|
+
}
|
|
63
|
+
const UNREADABLE = " Note: the release's Node requirements could not be read; its own install check still applies (a refusal there keeps this version installed).";
|
|
64
|
+
const unparsed = (range) => ` Note: the release asks for Node ${range}, which this check cannot evaluate; its own install check still applies (a refusal there keeps this version installed).`;
|
|
65
|
+
/** Which Node the target will run on here, and whether that Node satisfies the target's engines. */
|
|
66
|
+
export function evaluateUpdateTarget(input) {
|
|
67
|
+
const p = input.platform ?? runtimePlatform;
|
|
68
|
+
const m = input.manifest;
|
|
69
|
+
if (!m || !m.engines)
|
|
70
|
+
return { kind: "unknown", note: UNREADABLE };
|
|
71
|
+
const pin = Object.prototype.hasOwnProperty.call(m.runtimePins, input.host.id) ? m.runtimePins[input.host.id] : null;
|
|
72
|
+
const support = p.runtimeSupport(input.host);
|
|
73
|
+
if (pin && support.supported) {
|
|
74
|
+
// The pin keeps its identity (22.23.3-agend.1); the Node it installs is the one judged (postinstall: 22.23.3).
|
|
75
|
+
const node = RUNTIME_PIN.exec(pin)?.[1];
|
|
76
|
+
if (!node)
|
|
77
|
+
return { kind: "unknown", note: ` Note: the release pins its bundled Node as ${JSON.stringify(pin)}, which this check cannot read; its own install check still applies.` };
|
|
78
|
+
const fits = satisfiesNodeRange(node, m.engines);
|
|
79
|
+
if (fits === null)
|
|
80
|
+
return { kind: "unknown", note: unparsed(m.engines) };
|
|
81
|
+
if (fits)
|
|
82
|
+
return { kind: "runtime", host: input.host.id, pin };
|
|
83
|
+
const summary = `v${m.version} pins Node ${pin} for ${input.host.id}, which is outside its own range ${m.engines}`;
|
|
84
|
+
return { kind: "refuse", summary, message: refusal(m, `${summary}.`, false) };
|
|
85
|
+
}
|
|
86
|
+
const why = !pin ? `v${m.version} ships no bundled Node for ${input.host.id}` : `this host cannot use AgEnD's bundled Node: ${support.reason}`;
|
|
87
|
+
const s = input.system;
|
|
88
|
+
if (s.kind === "unknown")
|
|
89
|
+
return { kind: "unknown", note: s.note };
|
|
90
|
+
if (s.kind === "version") {
|
|
91
|
+
const fits = satisfiesNodeRange(s.version, m.engines);
|
|
92
|
+
if (fits === null)
|
|
93
|
+
return { kind: "unknown", note: unparsed(m.engines) };
|
|
94
|
+
if (fits)
|
|
95
|
+
return { kind: "system", node: s.version, label: s.label };
|
|
96
|
+
}
|
|
97
|
+
const runsOn = s.kind === "none" ? "there is no usable `node` on PATH" : `it would run on ${s.label} (Node ${s.version}${s.path ? `, ${s.path}` : ""})`;
|
|
98
|
+
const summary = `v${m.version} needs Node ${m.engines}; ${why}, and ${runsOn}`;
|
|
99
|
+
return { kind: "refuse", summary, message: refusal(m, `${why}, and ${runsOn}.`, true) };
|
|
100
|
+
}
|
|
101
|
+
/** The version and path of the `node` the environment resolves; exit 127 when there is none. */
|
|
102
|
+
export const NODE_PROBE_SCRIPT = `command -v node >/dev/null 2>&1 || exit 127; exec node -p "process.versions.node + ' ' + process.execPath"`;
|
|
103
|
+
/** The Node the release's `#!/usr/bin/env node` resolves to in `env` (`label` names it in messages). */
|
|
104
|
+
export function probeSystemNode(env, label) {
|
|
105
|
+
const r = env.run(["sh", "-c", NODE_PROBE_SCRIPT], 10_000);
|
|
106
|
+
if (r.status === 127)
|
|
107
|
+
return { kind: "none" };
|
|
108
|
+
const m = r.status === 0 ? /^(\d+\.\d+\.\d+) (\/.*)$/.exec(r.stdout.trim().split("\n").pop()?.trim() ?? "") : null;
|
|
109
|
+
if (!m)
|
|
110
|
+
return { kind: "unknown", note: ` Note: could not read the version of ${label}; the release's own install check still applies (a refusal there keeps this version installed).` };
|
|
111
|
+
return { kind: "version", version: m[1], path: m[2], label };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The whole check, run where the install runs: the requirements of `spec` (which must be `@songsid/agend@<version>`)
|
|
115
|
+
* from `env.npm`, and the Node `env` resolves — both read the way the install that follows reads them.
|
|
116
|
+
*/
|
|
117
|
+
export function preflightUpdate(env, spec, version, label, host = runtimePlatform.hostPlatform()) {
|
|
118
|
+
const manifest = lookupTargetManifest(spec, version, args => {
|
|
119
|
+
const r = env.run([env.npm, ...args], 15_000);
|
|
120
|
+
return r.status === 0 ? r.stdout : null;
|
|
121
|
+
});
|
|
122
|
+
if (!manifest)
|
|
123
|
+
return { kind: "unknown", note: UNREADABLE };
|
|
124
|
+
return evaluateUpdateTarget({ manifest, host, system: probeSystemNode(env, label) });
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The check an nvm install runs once nvm has selected its Node 22 (UpdateInstallPlan.preflight): on that Node, with that
|
|
128
|
+
* Node's npm. A refusal is printed in full and returned as the update's outcome; unknown is a note and the install goes on.
|
|
129
|
+
*/
|
|
130
|
+
export function installPreflight(spec, version, label, out, host) {
|
|
131
|
+
return (env) => {
|
|
132
|
+
const verdict = preflightUpdate(env, spec, version, label, host);
|
|
133
|
+
if (verdict.kind === "unknown")
|
|
134
|
+
out.log(verdict.note);
|
|
135
|
+
if (verdict.kind !== "refuse")
|
|
136
|
+
return { ok: true };
|
|
137
|
+
out.error(`\n${verdict.message}\n`);
|
|
138
|
+
return { ok: false, message: ` Not updated: ${verdict.summary}. The installed AgEnD was not changed.` };
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function refusal(m, why, installable) {
|
|
142
|
+
return [
|
|
143
|
+
` ✗ AgEnD v${m.version} cannot run on this host's Node — AgEnD was not changed.`,
|
|
144
|
+
"",
|
|
145
|
+
` v${m.version} needs Node ${m.engines}.`,
|
|
146
|
+
` ${why}`,
|
|
147
|
+
"",
|
|
148
|
+
installable
|
|
149
|
+
? ` Install a Node that satisfies ${m.engines} and put it first on PATH, then run: agend update`
|
|
150
|
+
: " This release cannot be installed here; wait for the next one.",
|
|
151
|
+
].join("\n");
|
|
152
|
+
}
|
|
153
|
+
const NUM = "(?:0|[1-9]\\d*)";
|
|
154
|
+
const PART = `(?:${NUM}|[xX*])`;
|
|
155
|
+
const PARTIAL = new RegExp(`^v?(${PART})(?:\\.(${PART})(?:\\.(${PART}))?)?$`);
|
|
156
|
+
/** Matches nothing: no stable version is below 0.0.0. */
|
|
157
|
+
const NEVER = [{ op: "<", v: [0, 0, 0] }];
|
|
158
|
+
/** `[major, minor, patch]` with null for a wildcard or missing part; null when it is not a partial version. */
|
|
159
|
+
function partial(text) {
|
|
160
|
+
const m = PARTIAL.exec(text);
|
|
161
|
+
if (!m)
|
|
162
|
+
return null;
|
|
163
|
+
const parts = [m[1], m[2], m[3]].map(x => (x === undefined || /^[xX*]$/.test(x) ? null : Number(x)));
|
|
164
|
+
// `1.x.3`: a number after a wildcard is not something this check guesses at.
|
|
165
|
+
for (let i = 1; i < 3; i++)
|
|
166
|
+
if (parts[i] !== null && parts[i - 1] === null)
|
|
167
|
+
return null;
|
|
168
|
+
return parts;
|
|
169
|
+
}
|
|
170
|
+
function comparators(op, text) {
|
|
171
|
+
const pv = partial(text);
|
|
172
|
+
if (!pv)
|
|
173
|
+
return null;
|
|
174
|
+
const [M, m, pt] = pv;
|
|
175
|
+
if (M === null)
|
|
176
|
+
return op === "<" || op === ">" ? NEVER : [];
|
|
177
|
+
const lo = [M, m ?? 0, pt ?? 0];
|
|
178
|
+
const nextMajor = [M + 1, 0, 0];
|
|
179
|
+
const next = m === null ? nextMajor : pt === null ? [M, m + 1, 0] : [M, m, pt];
|
|
180
|
+
switch (op) {
|
|
181
|
+
case "":
|
|
182
|
+
case "=":
|
|
183
|
+
return m === null || pt === null ? [{ op: ">=", v: lo }, { op: "<", v: next }] : [{ op: ">=", v: lo }, { op: "<=", v: lo }];
|
|
184
|
+
case ">": return m === null || pt === null ? [{ op: ">=", v: next }] : [{ op: ">", v: lo }];
|
|
185
|
+
case ">=": return [{ op: ">=", v: lo }];
|
|
186
|
+
case "<": return [{ op: "<", v: lo }];
|
|
187
|
+
case "<=": return m === null || pt === null ? [{ op: "<", v: next }] : [{ op: "<=", v: lo }];
|
|
188
|
+
case "~": return [{ op: ">=", v: lo }, { op: "<", v: m === null ? nextMajor : [M, m + 1, 0] }];
|
|
189
|
+
case "^": {
|
|
190
|
+
if (m === null)
|
|
191
|
+
return [{ op: ">=", v: lo }, { op: "<", v: nextMajor }];
|
|
192
|
+
const upper = M > 0 ? nextMajor : pt === null || m > 0 ? [0, m + 1, 0] : [0, 0, pt + 1];
|
|
193
|
+
return [{ op: ">=", v: lo }, { op: "<", v: upper }];
|
|
194
|
+
}
|
|
195
|
+
default: return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function hyphen(from, to) {
|
|
199
|
+
const a = partial(from), b = partial(to);
|
|
200
|
+
if (!a || !b)
|
|
201
|
+
return null;
|
|
202
|
+
const out = [];
|
|
203
|
+
if (a[0] !== null)
|
|
204
|
+
out.push({ op: ">=", v: [a[0], a[1] ?? 0, a[2] ?? 0] });
|
|
205
|
+
if (b[0] !== null) {
|
|
206
|
+
if (b[1] === null)
|
|
207
|
+
out.push({ op: "<", v: [b[0] + 1, 0, 0] });
|
|
208
|
+
else if (b[2] === null)
|
|
209
|
+
out.push({ op: "<", v: [b[0], b[1] + 1, 0] });
|
|
210
|
+
else
|
|
211
|
+
out.push({ op: "<=", v: [b[0], b[1], b[2]] });
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
function compare(a, b) {
|
|
216
|
+
return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Does Node `version` (stable x.y.z) satisfy npm range `range`? true/false as semver would answer, or null when the
|
|
220
|
+
* version or the range is outside what this parser reads exactly.
|
|
221
|
+
*/
|
|
222
|
+
export function satisfiesNodeRange(version, range) {
|
|
223
|
+
const vm = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(version.trim());
|
|
224
|
+
if (!vm)
|
|
225
|
+
return null;
|
|
226
|
+
const v = [Number(vm[1]), Number(vm[2]), Number(vm[3])];
|
|
227
|
+
if (v.some(n => !Number.isSafeInteger(n)))
|
|
228
|
+
return null;
|
|
229
|
+
const alternatives = range.trim().split("||").map(a => a.trim());
|
|
230
|
+
if (alternatives.length === 1 && alternatives[0] === "")
|
|
231
|
+
return true;
|
|
232
|
+
let any = false;
|
|
233
|
+
for (const alt of alternatives) {
|
|
234
|
+
if (alt === "")
|
|
235
|
+
return null;
|
|
236
|
+
let set;
|
|
237
|
+
const h = /^(\S+)\s+-\s+(\S+)$/.exec(alt);
|
|
238
|
+
if (h)
|
|
239
|
+
set = hyphen(h[1], h[2]);
|
|
240
|
+
else {
|
|
241
|
+
set = [];
|
|
242
|
+
for (const token of alt.replace(/(<=|>=|<|>|=|~|\^)\s+/g, "$1").split(/\s+/)) {
|
|
243
|
+
const t = /^(<=|>=|<|>|=|~|\^)?(.*)$/.exec(token);
|
|
244
|
+
const c = comparators(t[1] ?? "", t[2]);
|
|
245
|
+
if (!c) {
|
|
246
|
+
set = null;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
set.push(...c);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// semver refuses any version part above Number.MAX_SAFE_INTEGER — written, or produced by expanding x/~/^/hyphen
|
|
253
|
+
// upper bounds (`^9007199254740991` → <9007199254740992.0.0) — so such a range has no npm meaning: cannot tell.
|
|
254
|
+
if (!set || set.some(c => c.v.some(n => !Number.isSafeInteger(n))))
|
|
255
|
+
return null;
|
|
256
|
+
if (set.every(c => {
|
|
257
|
+
const d = compare(v, c.v);
|
|
258
|
+
return c.op === "<" ? d < 0 : c.op === "<=" ? d <= 0 : c.op === ">" ? d > 0 : d >= 0;
|
|
259
|
+
}))
|
|
260
|
+
any = true;
|
|
261
|
+
}
|
|
262
|
+
return any;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=update-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-preflight.js","sourceRoot":"","sources":["../src/update-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** How far up the process tree the updater may be: updater → (bash for nvm) → launcher sh/exec → this process. */
|
|
2
|
+
export declare const UPDATER_ANCESTOR_DEPTH = 3;
|
|
3
|
+
export interface UpdaterCallerProbe {
|
|
4
|
+
now(): number;
|
|
5
|
+
/** mtime of update-in-progress.json, or null when it is absent or unreadable. */
|
|
6
|
+
markerMtimeMs(): number | null;
|
|
7
|
+
/** Its parsed content, or null. */
|
|
8
|
+
marker(): {
|
|
9
|
+
pid?: unknown;
|
|
10
|
+
progress?: {
|
|
11
|
+
version?: unknown;
|
|
12
|
+
};
|
|
13
|
+
[field: string]: unknown;
|
|
14
|
+
} | null;
|
|
15
|
+
/** The parent pid of `pid`, or null when it cannot be read. */
|
|
16
|
+
parentOf(pid: number): number | null;
|
|
17
|
+
alive(pid: number): boolean;
|
|
18
|
+
/** When `pid` started (ms since the epoch), or null. */
|
|
19
|
+
startMs(pid: number): number | null;
|
|
20
|
+
selfPid: number;
|
|
21
|
+
selfVersion: string;
|
|
22
|
+
}
|
|
23
|
+
export type UpdaterCallerVerdict = {
|
|
24
|
+
updater: true;
|
|
25
|
+
pid: number;
|
|
26
|
+
} | {
|
|
27
|
+
updater: false;
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
export declare function startedByUpdater(p: UpdaterCallerProbe): UpdaterCallerVerdict;
|
|
31
|
+
export declare function systemUpdaterCallerProbe(dataDir: string, selfVersion: string): UpdaterCallerProbe;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1631 part B: is this `agend install --no-activate` the activation refresh of an `agend update` in flight — the
|
|
3
|
+
* updater of an OLDER version (2.2.0-beta.1 and before), which still refreshes a hand-started fleet's service and so
|
|
4
|
+
* would create a unit or plist where none existed? Then the install writes nothing (see the install command).
|
|
5
|
+
*
|
|
6
|
+
* The answer is "yes" only when it is certain; any doubt or failed probe is "no", and a manual install creates the
|
|
7
|
+
* service as always. Certain means all of:
|
|
8
|
+
* - update-in-progress.json is readable and fresh: its mtime is within the update marker's own budget
|
|
9
|
+
* (UPDATE_MARKER_MAX_AGE_MS), never in the future — a marker left by a crashed update does not count;
|
|
10
|
+
* - its pid (markUpdateInProgress writes the updater's own pid) is alive, is this process's parent, grandparent or
|
|
11
|
+
* great-grandparent (an nvm install adds a `bash` layer), and started no later than the marker was written — a
|
|
12
|
+
* reused pid started after it;
|
|
13
|
+
* - if the marker records a target version, it is the version doing the install.
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from "node:child_process";
|
|
16
|
+
import { readFileSync, statSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { UPDATE_MARKER_MAX_AGE_MS } from "./update-marker.js";
|
|
19
|
+
import { processStartMs } from "./update-check.js";
|
|
20
|
+
/** How far up the process tree the updater may be: updater → (bash for nvm) → launcher sh/exec → this process. */
|
|
21
|
+
export const UPDATER_ANCESTOR_DEPTH = 3;
|
|
22
|
+
/** `ps -o lstart=` has one-second resolution. */
|
|
23
|
+
const START_SLACK_MS = 1_000;
|
|
24
|
+
export function startedByUpdater(p) {
|
|
25
|
+
const no = (reason) => ({ updater: false, reason });
|
|
26
|
+
const mtime = p.markerMtimeMs();
|
|
27
|
+
if (mtime === null)
|
|
28
|
+
return no("no update marker");
|
|
29
|
+
const age = p.now() - mtime;
|
|
30
|
+
if (!(age >= 0 && age < UPDATE_MARKER_MAX_AGE_MS))
|
|
31
|
+
return no("the update marker is not fresh");
|
|
32
|
+
const marker = p.marker();
|
|
33
|
+
const pid = marker?.pid;
|
|
34
|
+
if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 1)
|
|
35
|
+
return no("the update marker names no updater pid");
|
|
36
|
+
const version = marker?.progress?.version;
|
|
37
|
+
if (version !== undefined && version !== p.selfVersion)
|
|
38
|
+
return no("the update marker names another version");
|
|
39
|
+
if (!p.alive(pid))
|
|
40
|
+
return no("the marker's updater is not running");
|
|
41
|
+
let at = p.selfPid;
|
|
42
|
+
let found = false;
|
|
43
|
+
for (let depth = 0; depth < UPDATER_ANCESTOR_DEPTH; depth++) {
|
|
44
|
+
const parent = p.parentOf(at);
|
|
45
|
+
if (parent === null || parent <= 1 || parent === at)
|
|
46
|
+
break;
|
|
47
|
+
if (parent === pid) {
|
|
48
|
+
found = true;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
at = parent;
|
|
52
|
+
}
|
|
53
|
+
if (!found)
|
|
54
|
+
return no("the marker's updater is not an ancestor of this process");
|
|
55
|
+
const started = p.startMs(pid);
|
|
56
|
+
if (started === null || started > mtime + START_SLACK_MS)
|
|
57
|
+
return no("the marker's pid started after the marker was written (reused)");
|
|
58
|
+
return { updater: true, pid };
|
|
59
|
+
}
|
|
60
|
+
/** Parent pid: /proc on Linux, `ps -o ppid=` elsewhere (macOS). */
|
|
61
|
+
function parentOf(pid) {
|
|
62
|
+
try {
|
|
63
|
+
if (process.platform === "linux") {
|
|
64
|
+
const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
65
|
+
const rest = stat.slice(stat.lastIndexOf(")") + 2).split(" ");
|
|
66
|
+
const ppid = Number.parseInt(rest[1] ?? "", 10);
|
|
67
|
+
return Number.isInteger(ppid) ? ppid : null;
|
|
68
|
+
}
|
|
69
|
+
const out = execFileSync("ps", ["-o", "ppid=", "-p", String(pid)], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 5_000 }).trim();
|
|
70
|
+
const ppid = Number.parseInt(out, 10);
|
|
71
|
+
return Number.isInteger(ppid) ? ppid : null;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function alive(pid) {
|
|
78
|
+
try {
|
|
79
|
+
process.kill(pid, 0);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return error.code === "EPERM";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function systemUpdaterCallerProbe(dataDir, selfVersion) {
|
|
87
|
+
const path = join(dataDir, "update-in-progress.json");
|
|
88
|
+
return {
|
|
89
|
+
now: () => Date.now(),
|
|
90
|
+
markerMtimeMs: () => { try {
|
|
91
|
+
return statSync(path).mtimeMs;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
} },
|
|
96
|
+
marker: () => { try {
|
|
97
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
} },
|
|
102
|
+
parentOf,
|
|
103
|
+
alive,
|
|
104
|
+
startMs: pid => processStartMs(pid),
|
|
105
|
+
selfPid: process.pid,
|
|
106
|
+
selfVersion,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=updater-caller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater-caller.js","sourceRoot":"","sources":["../src/updater-caller.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* Keep this list explicit: the parity test rejects a key missing from either
|
|
4
4
|
* locale surface before a mixed-language release can ship.
|
|
5
5
|
*/
|
|
6
|
-
export declare const USAGE_I18N_KEYS: readonly ["usage.title", "usage.title_plain", "usage.empty_active", "usage.not_logged_in", "usage.error_fallback", "usage.no_data", "usage.reset.in", "usage.reset.soon", "usage.duration.days_hours", "usage.duration.hours_minutes", "usage.duration.minutes", "usage.metric.session", "usage.metric.weekly", "usage.metric.monthly", "usage.metric.days_window", "usage.metric.named", "usage.metric.named_session", "usage.metric.named_weekly", "usage.metric.named_monthly", "usage.metric.named_days", "usage.metric.extra_usage", "usage.metric.rate_limit_resets", "usage.ticket_expiry", "usage.metric.credits", "usage.metric.weekly_limit", "usage.metric.pay_as_you_go", "usage.metric.bonus_credits", "usage.metric.overage_charges", "usage.metric.pay_per_use", "usage.unit.available", "usage.unit.credits", "usage.metric.usage_monthly", "usage.note.used_limit_unit", "usage.note.bonus_codes", "usage.value.disabled", "usage.value.cap", "usage.value.unlimited", "usage.note.binding", "usage.note.binding_severity", "usage.note.busiest_model", "usage.note.busiest_models", "usage.metric.agy_claude_others", "usage.metric.agy_claude_others_session", "usage.metric.agy_claude_others_weekly", "usage.hint.statusline_now", "usage.hint.statusline_minutes", "usage.hint.claude_api_key", "usage.hint.login_claude", "usage.hint.login_agy", "usage.hint.no_quota", "usage.hint.login_codex", "usage.hint.codex_no_oauth", "usage.hint.login_grok", "usage.hint.grok_no_login", "usage.hint.login_kiro", "usage.hint.kiro_signed_out", "usage.hint.token_refreshing", "usage.hint.subscription_no_credit", "usage.hint.no_quota_account", "usage.error.unreachable", "usage.error.token_rejected", "usage.error.rate_limited", "usage.error.rate_limited_transient", "usage.stale_rate_limited", "usage.error.http", "usage.error.billing_http", "usage.error.invalid_response", "usage.error.invalid_billing_response", "usage.error.invalid_kiro_response", "usage.error.claude_token_expired", "usage.error.codex_token_expired", "usage.error.grok_expired", "usage.error.grok_response_changed", "usage.error.agy_cap", "usage.error.agy_no_refresh", "usage.error.agy_token_expired", "usage.error.agy_login_expired", "usage.error.agy_refresh_empty", "usage.error.grok_auth_readonly", "usage.error.grok_no_refresh", "usage.error.grok_refresh_unreachable", "usage.error.grok_invalid_refresh", "usage.error.grok_persist"];
|
|
6
|
+
export declare const USAGE_I18N_KEYS: readonly ["usage.title", "usage.title_plain", "usage.empty_active", "usage.not_logged_in", "usage.error_fallback", "usage.no_data", "usage.reset.in", "usage.reset.soon", "usage.duration.days_hours", "usage.duration.hours_minutes", "usage.duration.minutes", "usage.metric.session", "usage.metric.weekly", "usage.metric.monthly", "usage.metric.days_window", "usage.metric.named", "usage.metric.named_session", "usage.metric.named_weekly", "usage.metric.named_monthly", "usage.metric.named_days", "usage.metric.extra_usage", "usage.metric.rate_limit_resets", "usage.ticket_expiry", "usage.metric.credits", "usage.metric.weekly_limit", "usage.metric.pay_as_you_go", "usage.metric.bonus_credits", "usage.metric.overage_charges", "usage.metric.pay_per_use", "usage.unit.available", "usage.unit.credits", "usage.metric.usage_monthly", "usage.note.used_limit_unit", "usage.note.bonus_codes", "usage.value.disabled", "usage.value.cap", "usage.value.unlimited", "usage.note.binding", "usage.note.binding_severity", "usage.note.busiest_model", "usage.note.busiest_models", "usage.metric.agy_claude_others", "usage.metric.agy_claude_others_session", "usage.metric.agy_claude_others_weekly", "usage.hint.statusline_now", "usage.hint.statusline_minutes", "usage.hint.claude_api_key", "usage.hint.login_claude", "usage.hint.login_agy", "usage.hint.no_quota", "usage.hint.login_codex", "usage.hint.codex_no_oauth", "usage.hint.login_grok", "usage.hint.grok_no_login", "usage.hint.login_kiro", "usage.hint.kiro_signed_out", "usage.hint.claude_profile_signed_out", "usage.hint.claude_profile_signed_out_chat", "usage.hint.token_refreshing", "usage.hint.subscription_no_credit", "usage.hint.no_quota_account", "usage.error.unreachable", "usage.error.token_rejected", "usage.error.rate_limited", "usage.error.rate_limited_transient", "usage.stale_rate_limited", "usage.error.http", "usage.error.billing_http", "usage.error.invalid_response", "usage.error.invalid_billing_response", "usage.error.invalid_kiro_response", "usage.error.claude_token_expired", "usage.error.codex_token_expired", "usage.error.grok_expired", "usage.error.grok_response_changed", "usage.error.agy_cap", "usage.error.agy_no_refresh", "usage.error.agy_token_expired", "usage.error.agy_login_expired", "usage.error.agy_refresh_empty", "usage.error.grok_auth_readonly", "usage.error.grok_no_refresh", "usage.error.grok_refresh_unreachable", "usage.error.grok_invalid_refresh", "usage.error.grok_persist"];
|
|
7
7
|
export type UsageI18nKey = typeof USAGE_I18N_KEYS[number];
|
package/dist/usage/i18n-keys.js
CHANGED
|
@@ -20,7 +20,7 @@ export const USAGE_I18N_KEYS = [
|
|
|
20
20
|
"usage.hint.statusline_now", "usage.hint.statusline_minutes", "usage.hint.claude_api_key",
|
|
21
21
|
"usage.hint.login_claude", "usage.hint.login_agy", "usage.hint.no_quota",
|
|
22
22
|
"usage.hint.login_codex", "usage.hint.codex_no_oauth", "usage.hint.login_grok",
|
|
23
|
-
"usage.hint.grok_no_login", "usage.hint.login_kiro", "usage.hint.kiro_signed_out",
|
|
23
|
+
"usage.hint.grok_no_login", "usage.hint.login_kiro", "usage.hint.kiro_signed_out", "usage.hint.claude_profile_signed_out", "usage.hint.claude_profile_signed_out_chat",
|
|
24
24
|
"usage.hint.token_refreshing", "usage.hint.subscription_no_credit", "usage.hint.no_quota_account",
|
|
25
25
|
"usage.error.unreachable", "usage.error.token_rejected", "usage.error.rate_limited", "usage.error.rate_limited_transient", "usage.stale_rate_limited",
|
|
26
26
|
"usage.error.http", "usage.error.billing_http", "usage.error.invalid_response",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-keys.js","sourceRoot":"","sources":["../../src/usage/i18n-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB;IAC/E,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB;IAC7E,2BAA2B,EAAE,8BAA8B,EAAE,wBAAwB;IACrF,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B;IACjG,oBAAoB,EAAE,4BAA4B,EAAE,2BAA2B;IAC/E,4BAA4B,EAAE,yBAAyB,EAAE,0BAA0B;IACnF,gCAAgC,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,2BAA2B;IAC5G,4BAA4B,EAAE,4BAA4B,EAAE,8BAA8B;IAC1F,0BAA0B,EAAE,sBAAsB,EAAE,oBAAoB;IACxE,4BAA4B,EAAE,4BAA4B,EAAE,wBAAwB;IACpF,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,oBAAoB;IACxF,6BAA6B,EAAE,0BAA0B,EAAE,2BAA2B;IACtF,gCAAgC,EAAE,wCAAwC,EAAE,uCAAuC;IACnH,2BAA2B,EAAE,+BAA+B,EAAE,2BAA2B;IACzF,yBAAyB,EAAE,sBAAsB,EAAE,qBAAqB;IACxE,wBAAwB,EAAE,2BAA2B,EAAE,uBAAuB;IAC9E,0BAA0B,EAAE,uBAAuB,EAAE,4BAA4B;
|
|
1
|
+
{"version":3,"file":"i18n-keys.js","sourceRoot":"","sources":["../../src/usage/i18n-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB;IAC/E,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB;IAC7E,2BAA2B,EAAE,8BAA8B,EAAE,wBAAwB;IACrF,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B;IACjG,oBAAoB,EAAE,4BAA4B,EAAE,2BAA2B;IAC/E,4BAA4B,EAAE,yBAAyB,EAAE,0BAA0B;IACnF,gCAAgC,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,2BAA2B;IAC5G,4BAA4B,EAAE,4BAA4B,EAAE,8BAA8B;IAC1F,0BAA0B,EAAE,sBAAsB,EAAE,oBAAoB;IACxE,4BAA4B,EAAE,4BAA4B,EAAE,wBAAwB;IACpF,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,oBAAoB;IACxF,6BAA6B,EAAE,0BAA0B,EAAE,2BAA2B;IACtF,gCAAgC,EAAE,wCAAwC,EAAE,uCAAuC;IACnH,2BAA2B,EAAE,+BAA+B,EAAE,2BAA2B;IACzF,yBAAyB,EAAE,sBAAsB,EAAE,qBAAqB;IACxE,wBAAwB,EAAE,2BAA2B,EAAE,uBAAuB;IAC9E,0BAA0B,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,sCAAsC,EAAE,2CAA2C;IACtK,6BAA6B,EAAE,mCAAmC,EAAE,6BAA6B;IACjG,yBAAyB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,oCAAoC,EAAE,0BAA0B;IACrJ,kBAAkB,EAAE,0BAA0B,EAAE,8BAA8B;IAC9E,sCAAsC,EAAE,mCAAmC;IAC3E,kCAAkC,EAAE,iCAAiC;IACrE,0BAA0B,EAAE,mCAAmC,EAAE,qBAAqB;IACtF,4BAA4B,EAAE,+BAA+B,EAAE,+BAA+B;IAC9F,+BAA+B,EAAE,gCAAgC,EAAE,6BAA6B;IAChG,sCAAsC,EAAE,kCAAkC,EAAE,0BAA0B;CAC9F,CAAC"}
|
|
@@ -106,14 +106,43 @@ export declare function resolveClaudeAuth(file: {
|
|
|
106
106
|
* even live?".
|
|
107
107
|
*/
|
|
108
108
|
export declare function statuslineUsage(reading: StatuslineRateLimits, plan: string | null, now?: number): Omit<ProviderUsage, "id" | "name">;
|
|
109
|
+
/** `security find-generic-password -w`: the item's secret, or null (no such item, locked, not macOS). */
|
|
110
|
+
type KeychainRead = (service: string, account: string) => Promise<string | null>;
|
|
111
|
+
declare let claudeKeychain: {
|
|
112
|
+
platform: NodeJS.Platform;
|
|
113
|
+
read: KeychainRead;
|
|
114
|
+
username: () => string;
|
|
115
|
+
};
|
|
116
|
+
/** Test seam (#1699): the platform, the Keychain read and the OS user name; null restores all three. */
|
|
117
|
+
export declare function setClaudeKeychainForTests(seam: Partial<typeof claudeKeychain> | null): void;
|
|
118
|
+
/**
|
|
119
|
+
* Whether a shell rc sets `CLAUDE_CODE_OAUTH_TOKEN` at all — any assignment, export or declaration that is not a
|
|
120
|
+
* comment, whatever its value: `"$OTHER"` or `${OTHER}` is a token once the pane's shell expands it, so unlike
|
|
121
|
+
* tokenFromShellRc (which must hand the API a literal bearer) this never discounts one it cannot read (#1713 review).
|
|
122
|
+
* Files those rcs `source` are not followed.
|
|
123
|
+
*/
|
|
124
|
+
export declare function shellRcSetsClaudeToken(read: (path: string) => string, home?: string, files?: readonly string[]): boolean;
|
|
109
125
|
/**
|
|
110
126
|
* Best-effort OAuth access token for direct Anthropic API calls (the /model
|
|
111
127
|
* catalog probe). Same resolution order as the usage panel: credentials file →
|
|
112
|
-
* CLAUDE_CODE_OAUTH_TOKEN → shell rc. Null when nothing usable exists.
|
|
128
|
+
* CLAUDE_CODE_OAUTH_TOKEN → shell rc. Null when nothing usable exists. With
|
|
129
|
+
* `storeHome` (a credential profile's config dir, #1699): that profile's login only.
|
|
130
|
+
*/
|
|
131
|
+
export declare function getClaudeOAuthToken(storeHome?: string): Promise<string | null>;
|
|
132
|
+
/** Which subscription a Claude row is (#1699): a profile's (with its name), or the shared one beside profiles. */
|
|
133
|
+
export interface ClaudeUsageScope {
|
|
134
|
+
profile?: string;
|
|
135
|
+
besideProfiles?: boolean;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Exported for tests — the statusline/API preference order is the subject.
|
|
139
|
+
*
|
|
140
|
+
* `storeHome` (#1699): a credential profile's config dir — the row reads that profile's login and only the rate
|
|
141
|
+
* limits its own instances wrote (their conversations are under its `projects/`); a profile with no login says so,
|
|
142
|
+
* with the line that signs it in, and never shows the shared account's numbers. Without it: the shared login as
|
|
143
|
+
* always; beside profiles (`besideProfiles`), its statusline fallback leaves the profiles' instances out.
|
|
113
144
|
*/
|
|
114
|
-
export declare function
|
|
115
|
-
/** Exported for tests — the statusline/API preference order is the subject. */
|
|
116
|
-
export declare function fetchClaudeUsage(): Promise<Omit<ProviderUsage, "id" | "name">>;
|
|
145
|
+
export declare function fetchClaudeUsage(storeHome?: string, scope?: ClaudeUsageScope): Promise<Omit<ProviderUsage, "id" | "name">>;
|
|
117
146
|
interface AgyBucket {
|
|
118
147
|
bucketId?: string;
|
|
119
148
|
displayName?: string;
|
|
@@ -172,7 +201,7 @@ export declare function fetchKiroUsage(storeHome?: string): Promise<Omit<Provide
|
|
|
172
201
|
type UsageProvider = {
|
|
173
202
|
id: string;
|
|
174
203
|
name: string;
|
|
175
|
-
fetch: (storeHome?: string) => Promise<Omit<ProviderUsage, "id" | "name">>;
|
|
204
|
+
fetch: (storeHome?: string, scope?: ClaudeUsageScope) => Promise<Omit<ProviderUsage, "id" | "name">>;
|
|
176
205
|
};
|
|
177
206
|
type UsageFleetConfig = Parameters<typeof listConfiguredProfiles>[0];
|
|
178
207
|
/** Read the daemon-written, token-free Muse relay snapshot for active Muse instances. */
|