@songsid/agend 2.1.12 → 2.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/README.zh-TW.md +2 -2
- package/dist/auth/one-time-code.d.ts +19 -0
- package/dist/auth/one-time-code.js +49 -0
- package/dist/auth/one-time-code.js.map +1 -0
- package/dist/auth-api.d.ts +52 -0
- package/dist/auth-api.js +346 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/backend/claude-code.d.ts +4 -0
- package/dist/backend/claude-code.js +97 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.js +59 -30
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-agent.d.ts +66 -0
- package/dist/backend/kiro-agent.js +302 -0
- package/dist/backend/kiro-agent.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +80 -0
- package/dist/backend/kiro-identity.js +537 -0
- package/dist/backend/kiro-identity.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
- package/dist/backend/kiro-v2-store-worker.js +87 -0
- package/dist/backend/kiro-v2-store-worker.js.map +1 -0
- package/dist/backend/kiro-v2-store.d.ts +54 -0
- package/dist/backend/kiro-v2-store.js +131 -0
- package/dist/backend/kiro-v2-store.js.map +1 -0
- package/dist/backend/kiro-v3-identity.d.ts +5 -0
- package/dist/backend/kiro-v3-identity.js +22 -0
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +83 -7
- package/dist/backend/kiro.js +418 -91
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +45 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +1 -0
- package/dist/channel/adapters/discord.js +29 -10
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +1 -0
- package/dist/channel/adapters/telegram.js +13 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +9 -1
- package/dist/classic-channel-manager.d.ts +18 -10
- package/dist/classic-channel-manager.js +45 -18
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +225 -127
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +5 -3
- package/dist/command-table.js +29 -27
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +46 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.d.ts +6 -0
- package/dist/connection-secrets.js +4 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/daemon.d.ts +89 -4
- package/dist/daemon.js +661 -77
- package/dist/daemon.js.map +1 -1
- package/dist/darwin-memory.d.ts +6 -1
- package/dist/darwin-memory.js +17 -6
- package/dist/darwin-memory.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +85 -0
- package/dist/delivery-consumed-watch.js +244 -0
- package/dist/delivery-consumed-watch.js.map +1 -0
- package/dist/delivery-outbox.d.ts +61 -0
- package/dist/delivery-outbox.js +120 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +14 -5
- package/dist/delivery-reconciliation.js +27 -4
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/delivery-reconciliation.test.js +35 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/event-loop-watch.d.ts +28 -0
- package/dist/event-loop-watch.js +75 -3
- package/dist/event-loop-watch.js.map +1 -1
- package/dist/fleet-context.d.ts +22 -2
- package/dist/fleet-level-config.d.ts +2 -2
- package/dist/fleet-level-config.js +6 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +293 -12
- package/dist/fleet-manager.js +2364 -449
- package/dist/fleet-manager.js.map +1 -1
- package/dist/host-memory.d.ts +4 -0
- package/dist/host-memory.js.map +1 -1
- package/dist/instance-config-impact.js +5 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -5
- package/dist/instance-lifecycle.js +162 -53
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +150 -16
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.d.ts +2 -0
- package/dist/login-controller.js +17 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/memory-pressure.d.ts +7 -8
- package/dist/memory-pressure.js +76 -15
- package/dist/memory-pressure.js.map +1 -1
- package/dist/monotonic-budget.d.ts +2 -0
- package/dist/monotonic-budget.js +28 -0
- package/dist/monotonic-budget.js.map +1 -0
- package/dist/needs-you-hub.d.ts +114 -0
- package/dist/needs-you-hub.js +370 -0
- package/dist/needs-you-hub.js.map +1 -0
- package/dist/needs-you-live.d.ts +116 -0
- package/dist/needs-you-live.js +228 -0
- package/dist/needs-you-live.js.map +1 -0
- package/dist/needs-you.d.ts +132 -0
- package/dist/needs-you.js +164 -0
- package/dist/needs-you.js.map +1 -0
- package/dist/node-version-guard.d.ts +30 -0
- package/dist/node-version-guard.js +50 -0
- package/dist/node-version-guard.js.map +1 -0
- package/dist/operator-control-paths.d.ts +4 -0
- package/dist/operator-control-paths.js +24 -0
- package/dist/operator-control-paths.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +9 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +5 -5
- package/dist/profile-control.js +4 -20
- package/dist/profile-control.js.map +1 -1
- package/dist/public-web-gateway.d.ts +18 -0
- package/dist/public-web-gateway.js +141 -0
- package/dist/public-web-gateway.js.map +1 -0
- package/dist/public-web-link.d.ts +53 -0
- package/dist/public-web-link.js +175 -0
- package/dist/public-web-link.js.map +1 -0
- package/dist/quickstart-api.d.ts +8 -1
- package/dist/quickstart-api.js +86 -48
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +6 -2
- package/dist/quickstart.js.map +1 -1
- package/dist/scheduler/db.d.ts +7 -1
- package/dist/scheduler/db.js +38 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/retry-label.d.ts +11 -0
- package/dist/scheduler/retry-label.js +24 -0
- package/dist/scheduler/retry-label.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +55 -2
- package/dist/scheduler/scheduler.js +220 -8
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +22 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +5 -0
- package/dist/secret-store.js +20 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-activation.d.ts +110 -0
- package/dist/service-activation.js +302 -0
- package/dist/service-activation.js.map +1 -0
- package/dist/service-installer.d.ts +7 -0
- package/dist/service-installer.js +7 -4
- package/dist/service-installer.js.map +1 -1
- package/dist/service-restart-selection.d.ts +6 -5
- package/dist/service-restart-selection.js +6 -5
- package/dist/service-restart-selection.js.map +1 -1
- package/dist/settings-api.d.ts +10 -2
- package/dist/settings-api.js +175 -72
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +20 -0
- package/dist/settings-baseline.js +104 -0
- package/dist/settings-baseline.js.map +1 -0
- package/dist/settings-change.d.ts +21 -0
- package/dist/settings-change.js +133 -0
- package/dist/settings-change.js.map +1 -0
- package/dist/settings-confirmation.d.ts +105 -0
- package/dist/settings-confirmation.js +232 -0
- package/dist/settings-confirmation.js.map +1 -0
- package/dist/settings-control.d.ts +41 -0
- package/dist/settings-control.js +294 -0
- package/dist/settings-control.js.map +1 -0
- package/dist/settings-effect.d.ts +24 -0
- package/dist/settings-effect.js +169 -0
- package/dist/settings-effect.js.map +1 -0
- package/dist/settings-http-confirmation.d.ts +29 -0
- package/dist/settings-http-confirmation.js +123 -0
- package/dist/settings-http-confirmation.js.map +1 -0
- package/dist/settings-instance-patch.d.ts +4 -0
- package/dist/settings-instance-patch.js +26 -0
- package/dist/settings-instance-patch.js.map +1 -0
- package/dist/settings-request-capability.d.ts +16 -0
- package/dist/settings-request-capability.js +32 -0
- package/dist/settings-request-capability.js.map +1 -0
- package/dist/settings-transaction.d.ts +65 -0
- package/dist/settings-transaction.js +223 -0
- package/dist/settings-transaction.js.map +1 -0
- package/dist/setup-auth.d.ts +10 -18
- package/dist/setup-auth.js +14 -38
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +75 -18
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-guide.d.ts +13 -0
- package/dist/setup-guide.js +25 -0
- package/dist/setup-guide.js.map +1 -0
- package/dist/setup-host.d.ts +16 -0
- package/dist/setup-host.js +197 -32
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +3 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/slash-authz.d.ts +17 -3
- package/dist/slash-authz.js +5 -0
- package/dist/slash-authz.js.map +1 -1
- package/dist/spawn-gate.js +3 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/statusline-watcher.d.ts +5 -0
- package/dist/statusline-watcher.js +2 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/steer-capability.d.ts +6 -0
- package/dist/steer-capability.js +8 -0
- package/dist/steer-capability.js.map +1 -1
- package/dist/sync-work-attribution.d.ts +14 -0
- package/dist/sync-work-attribution.js +43 -8
- package/dist/sync-work-attribution.js.map +1 -1
- package/dist/tips.js +10 -5
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.d.ts +35 -5
- package/dist/tmux-control.js +291 -57
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +20 -6
- package/dist/tmux-manager.js +90 -47
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +59 -0
- package/dist/tmux-read.js +213 -0
- package/dist/tmux-read.js.map +1 -0
- package/dist/topic-commands.d.ts +21 -10
- package/dist/topic-commands.js +191 -58
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.js +2 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +2 -0
- package/dist/tunnel/cloudflared-install.js +1 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +14 -0
- package/dist/tunnel/purpose-lane.js +43 -0
- package/dist/tunnel/purpose-lane.js.map +1 -0
- package/dist/turn-reply-guard.d.ts +2 -0
- package/dist/turn-reply-guard.js +10 -1
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/ui/app.html +18 -0
- package/dist/ui/chat-render.js +478 -0
- package/dist/ui/chat-store.js +289 -0
- package/dist/ui/chat-strings.js +69 -0
- package/dist/ui/chat-thread.js +209 -0
- package/dist/ui/chat-tour.js +116 -0
- package/dist/ui/fleet-org.js +142 -0
- package/dist/ui/panel-chat.js +418 -0
- package/dist/ui/panel-fleet.js +413 -0
- package/dist/ui/panel-needs.js +202 -0
- package/dist/ui/panel-settings.js +750 -0
- package/dist/ui/preview.js +266 -0
- package/dist/ui/settings-apply.js +239 -0
- package/dist/ui/settings-confirm.js +186 -0
- package/dist/ui/settings-dialogs.js +546 -0
- package/dist/ui/settings-model.js +277 -0
- package/dist/ui/settings-strings.js +652 -0
- package/dist/ui/settings-wizard.js +140 -0
- package/dist/ui/shared/agend-auth.js +93 -0
- package/dist/ui/shared/app-ctx.js +80 -0
- package/dist/ui/shared/app-html.js +9 -0
- package/dist/ui/shared/app-i18n.js +95 -0
- package/dist/ui/shared/app-nav.js +73 -0
- package/dist/ui/shared/app-needs.js +114 -0
- package/dist/ui/shared/app-route.js +73 -0
- package/dist/ui/shared/app-session.js +66 -0
- package/dist/ui/shared/app-shell.js +344 -0
- package/dist/ui/shared/app-store.js +51 -0
- package/dist/ui/shared/app-stream.js +201 -0
- package/dist/ui/shared/app.css +676 -0
- package/dist/ui/shared/app.js +88 -0
- package/dist/ui/shared/fonts/OFL.txt +92 -0
- package/dist/ui/shared/fonts/README.md +21 -0
- package/dist/ui/shared/fonts/inter.woff2 +0 -0
- package/dist/ui/shared/htm.module.js +1 -0
- package/dist/ui/shared/panel-view.js +655 -0
- package/dist/ui/shared/preact-hooks.module.js +2 -0
- package/dist/ui/shared/preact.module.js +2 -0
- package/dist/ui/shared/signin.js +130 -0
- package/dist/ui/shared/theme.js +29 -0
- package/dist/ui/shared/tokens.css +153 -0
- package/dist/ui/shared/ui-confirm.js +43 -0
- package/dist/ui/shared/ui-dialog.js +45 -0
- package/dist/ui/shared/ui-icons.js +61 -0
- package/dist/ui/shared/ui-menu.js +39 -0
- package/dist/ui/shared/ui-states.js +20 -0
- package/dist/ui/shared/ui-toast.js +18 -0
- package/dist/ui/shared/vendor/htm.LICENSE +202 -0
- package/dist/ui/shared/vendor/preact.LICENSE +21 -0
- package/dist/ui/shared/vendor/vendor.json +39 -0
- package/dist/ui/shared/view-strings.js +309 -0
- package/dist/ui/signin.html +51 -0
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +12 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-install.d.ts +71 -0
- package/dist/update-install.js +162 -0
- package/dist/update-install.js.map +1 -0
- package/dist/upgrade-notices.d.ts +17 -0
- package/dist/upgrade-notices.js +93 -0
- package/dist/upgrade-notices.js.map +1 -0
- package/dist/usage/statusline-usage.d.ts +2 -0
- package/dist/usage/statusline-usage.js +14 -10
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +6 -1
- package/dist/view-api.js +62 -51
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +71 -14
- package/dist/web-api.js +492 -77
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +71 -27
- package/dist/web-auth.js +169 -69
- package/dist/web-auth.js.map +1 -1
- package/dist/web-body.d.ts +3 -0
- package/dist/web-body.js +55 -0
- package/dist/web-body.js.map +1 -0
- package/dist/web-channel-echo.d.ts +9 -0
- package/dist/web-channel-echo.js +55 -0
- package/dist/web-channel-echo.js.map +1 -0
- package/dist/web-chat-history.d.ts +125 -0
- package/dist/web-chat-history.js +184 -0
- package/dist/web-chat-history.js.map +1 -0
- package/dist/web-continuation.d.ts +7 -0
- package/dist/web-continuation.js +22 -0
- package/dist/web-continuation.js.map +1 -0
- package/dist/web-host-guard.d.ts +34 -0
- package/dist/web-host-guard.js +57 -1
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-login.d.ts +72 -0
- package/dist/web-login.js +132 -0
- package/dist/web-login.js.map +1 -0
- package/dist/web-org.d.ts +55 -0
- package/dist/web-org.js +67 -0
- package/dist/web-org.js.map +1 -0
- package/dist/web-preview.d.ts +77 -0
- package/dist/web-preview.js +240 -0
- package/dist/web-preview.js.map +1 -0
- package/dist/web-request-context.d.ts +10 -0
- package/dist/web-request-context.js +13 -0
- package/dist/web-request-context.js.map +1 -0
- package/dist/web-session.d.ts +167 -0
- package/dist/web-session.js +389 -0
- package/dist/web-session.js.map +1 -0
- package/dist/web-shell-routes.d.ts +59 -0
- package/dist/web-shell-routes.js +96 -0
- package/dist/web-shell-routes.js.map +1 -0
- package/dist/web-upload.d.ts +183 -0
- package/dist/web-upload.js +468 -0
- package/dist/web-upload.js.map +1 -0
- package/dist/website-tips-renderer.d.ts +2 -2
- package/dist/website-tips-renderer.js +3 -3
- package/dist/website-tips-renderer.js.map +1 -1
- package/package.json +8 -5
- package/scripts/preinstall-guard.cjs +36 -0
- package/dist/ui/dashboard.html +0 -774
- package/dist/ui/settings.html +0 -2165
- package/dist/ui/view.html +0 -1139
package/dist/update-check.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { SYSTEMD_RESTART_INDETERMINATE_EXIT_CODE } from "./service-restart-selection.js";
|
|
2
3
|
/**
|
|
3
4
|
* What a chat `/update` (Discord slash or Telegram) runs: no channel flag, ever.
|
|
4
5
|
* The installed CLI decides from its own version (getUpdateSelector), so the
|
|
@@ -172,15 +173,23 @@ export function processStartMs(pid, run = args => execFileSync("ps", args, { enc
|
|
|
172
173
|
return null;
|
|
173
174
|
}
|
|
174
175
|
}
|
|
175
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* Report what `agend restart` came to (#1446 item 4): "restarted"; "pending" when systemd is still running the
|
|
178
|
+
* restart job after our wait (exit SYSTEMD_RESTART_INDETERMINATE_EXIT_CODE) — not a success, not a failure: the
|
|
179
|
+
* replacement fleet settles the update; or "failed", which the CLI turns into exit code 1.
|
|
180
|
+
*/
|
|
176
181
|
export function reportUpdateRestart(status, output = console) {
|
|
177
182
|
if (status === 0) {
|
|
178
183
|
output.log(" ✓ Service restarted");
|
|
179
|
-
return
|
|
184
|
+
return "restarted";
|
|
185
|
+
}
|
|
186
|
+
if (status === SYSTEMD_RESTART_INDETERMINATE_EXIT_CODE) {
|
|
187
|
+
output.log(" … The service restart is still running; the new fleet reports when it is up (check: agend status).");
|
|
188
|
+
return "pending";
|
|
180
189
|
}
|
|
181
190
|
output.error("\n ✗ Auto-restart FAILED. Fleet may be stopped.");
|
|
182
191
|
output.error(" Run: agend start");
|
|
183
192
|
output.error(" Service status: agend status\n");
|
|
184
|
-
return
|
|
193
|
+
return "failed";
|
|
185
194
|
}
|
|
186
195
|
//# sourceMappingURL=update-check.js.map
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface CommandResult {
|
|
2
|
+
status: number | null;
|
|
3
|
+
signal: NodeJS.Signals | null;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CommandRunner {
|
|
8
|
+
/** Run a program; `inherit` streams its output to the terminal (npm's progress), otherwise it is captured. */
|
|
9
|
+
run(command: string, args: string[], options?: {
|
|
10
|
+
inherit?: boolean;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}): CommandResult;
|
|
13
|
+
/** Progress for the operator, printed when it happens. */
|
|
14
|
+
log(message: string): void;
|
|
15
|
+
}
|
|
16
|
+
export interface UpdateInstallPlan {
|
|
17
|
+
/** The npm spec to install, e.g. `@songsid/agend@2.2.0`. */
|
|
18
|
+
pkg: string;
|
|
19
|
+
/** The exact version that spec must produce, or null when only a dist-tag is known. */
|
|
20
|
+
targetVersion: string | null;
|
|
21
|
+
/** The npm global prefix is not writable: install under nvm's Node 22 instead (no sudo). */
|
|
22
|
+
viaNvm: boolean;
|
|
23
|
+
/** `~/.nvm/nvm.sh`. */
|
|
24
|
+
nvmSh: string;
|
|
25
|
+
}
|
|
26
|
+
export type UpdateInstallOutcome = {
|
|
27
|
+
ok: true;
|
|
28
|
+
agendPath: string;
|
|
29
|
+
version: string;
|
|
30
|
+
dir: string;
|
|
31
|
+
bin: string;
|
|
32
|
+
node: string;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
stage: "install" | "verify";
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The `bash -c` script that puts nvm's Node 22 on PATH for the rest of the same shell (nvm only changes its own shell),
|
|
40
|
+
* then runs the remaining arguments. The nvm.sh path is DATA — positional `$1`, never spliced into the script — so a
|
|
41
|
+
* path with `$`, spaces or quotes is sourced as written (#1449 review). `--no-use` keeps nvm.sh from reading our
|
|
42
|
+
* arguments or switching to its default before `nvm use 22`.
|
|
43
|
+
*/
|
|
44
|
+
export declare const NVM_RUN_SCRIPT = "n=$1; shift; . \"$n\" --no-use >/dev/null 2>&1 && nvm use 22 >/dev/null 2>&1 && \"$@\"";
|
|
45
|
+
/** The install itself, also with every path and spec as data: `$1` = nvm.sh, `$2` = the npm spec. */
|
|
46
|
+
export declare const NVM_INSTALL_SCRIPT = "n=$1; p=$2; . \"$n\" --no-use && nvm install 22 && nvm use 22 && npm install -g \"$p\"";
|
|
47
|
+
/**
|
|
48
|
+
* How to run the NEW `agend` after the install: directly, or — for an nvm install — inside nvm's Node 22, because its
|
|
49
|
+
* `#!/usr/bin/env node` would otherwise pick the parent's (old) Node from PATH (#1446 item 1). Append the subcommand.
|
|
50
|
+
*/
|
|
51
|
+
export declare function newAgendInvocation(plan: Pick<UpdateInstallPlan, "viaNvm" | "nvmSh">, agendPath: string): {
|
|
52
|
+
command: string;
|
|
53
|
+
args: string[];
|
|
54
|
+
};
|
|
55
|
+
/** `npm link` leaves a symlink to a source checkout outside any node_modules tree; a registry install is a directory. */
|
|
56
|
+
export declare function isLocalLinkTarget(entryIsSymlink: boolean, realTarget: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* The identity of what npm installed: `$1` is the package directory in npm's global root. Prints its name, version and
|
|
59
|
+
* the REAL path of its `agend` bin target, so PATH's `agend` can be held to that exact file.
|
|
60
|
+
*/
|
|
61
|
+
export declare const PACKAGE_IDENTITY_SCRIPT: string;
|
|
62
|
+
/** Proves the native module loads AND works: on Node 20 better-sqlite3 13 imports fine and then SIGSEGVs on open. */
|
|
63
|
+
export declare const NATIVE_CHECK_SCRIPT: string;
|
|
64
|
+
/**
|
|
65
|
+
* Prove the package npm installed — read from npm's own global root and prefix in the install environment — is the
|
|
66
|
+
* one `agend` on PATH runs, reports `plan.targetVersion` (when known) and opens a database on the interpreter its
|
|
67
|
+
* shebang resolves to. Used after an install, and before restarting a fleet that predates an earlier install (#1449
|
|
68
|
+
* review: an update whose verification failed must not be completed by simply running `agend update` again).
|
|
69
|
+
*/
|
|
70
|
+
export declare function verifyInstalledPackage(plan: UpdateInstallPlan, runner: CommandRunner): UpdateInstallOutcome;
|
|
71
|
+
export declare function runUpdateInstall(plan: UpdateInstallPlan, runner: CommandRunner): UpdateInstallOutcome;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The install half of `agend update` (#1446): install the target release, prove the installed `agend` is that
|
|
3
|
+
* release and can load its native module, and only then clean up anything the old install left behind.
|
|
4
|
+
*
|
|
5
|
+
* Order is the point. The current install is never removed before the new one has succeeded: npm replaces a global
|
|
6
|
+
* package in place — including a global `npm link` in the same prefix — and leaves it untouched when the install
|
|
7
|
+
* fails (verified with a failing-preinstall package on npm 10). The old updater ran `npm unlink -g @songsid/agend`
|
|
8
|
+
* first, on a check that matched every normal global install, so a failed install left no agend at all.
|
|
9
|
+
*
|
|
10
|
+
* Every command goes through an injected runner, so the sequence is testable without npm, nvm or a fleet.
|
|
11
|
+
*/
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
/**
|
|
14
|
+
* The `bash -c` script that puts nvm's Node 22 on PATH for the rest of the same shell (nvm only changes its own shell),
|
|
15
|
+
* then runs the remaining arguments. The nvm.sh path is DATA — positional `$1`, never spliced into the script — so a
|
|
16
|
+
* path with `$`, spaces or quotes is sourced as written (#1449 review). `--no-use` keeps nvm.sh from reading our
|
|
17
|
+
* arguments or switching to its default before `nvm use 22`.
|
|
18
|
+
*/
|
|
19
|
+
export const NVM_RUN_SCRIPT = 'n=$1; shift; . "$n" --no-use >/dev/null 2>&1 && nvm use 22 >/dev/null 2>&1 && "$@"';
|
|
20
|
+
/** The install itself, also with every path and spec as data: `$1` = nvm.sh, `$2` = the npm spec. */
|
|
21
|
+
export const NVM_INSTALL_SCRIPT = 'n=$1; p=$2; . "$n" --no-use && nvm install 22 && nvm use 22 && npm install -g "$p"';
|
|
22
|
+
/**
|
|
23
|
+
* Run `argv` in the environment the new `agend` will run in: the parent's PATH for a direct install, nvm's Node 22
|
|
24
|
+
* for an nvm install — so `agend`'s `#!/usr/bin/env node` and a bare `node` resolve to the same interpreter.
|
|
25
|
+
*/
|
|
26
|
+
function inInstallEnv(runner, plan, argv, options = {}) {
|
|
27
|
+
if (!plan.viaNvm)
|
|
28
|
+
return runner.run(argv[0], argv.slice(1), options);
|
|
29
|
+
return runner.run("bash", ["-c", NVM_RUN_SCRIPT, "bash", plan.nvmSh, ...argv], options);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* How to run the NEW `agend` after the install: directly, or — for an nvm install — inside nvm's Node 22, because its
|
|
33
|
+
* `#!/usr/bin/env node` would otherwise pick the parent's (old) Node from PATH (#1446 item 1). Append the subcommand.
|
|
34
|
+
*/
|
|
35
|
+
export function newAgendInvocation(plan, agendPath) {
|
|
36
|
+
if (!plan.viaNvm)
|
|
37
|
+
return { command: agendPath, args: [] };
|
|
38
|
+
return { command: "bash", args: ["-c", NVM_RUN_SCRIPT, "bash", plan.nvmSh, agendPath] };
|
|
39
|
+
}
|
|
40
|
+
/** `npm link` leaves a symlink to a source checkout outside any node_modules tree; a registry install is a directory. */
|
|
41
|
+
export function isLocalLinkTarget(entryIsSymlink, realTarget) {
|
|
42
|
+
return entryIsSymlink && !realTarget.split("/").includes("node_modules");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The identity of what npm installed: `$1` is the package directory in npm's global root. Prints its name, version and
|
|
46
|
+
* the REAL path of its `agend` bin target, so PATH's `agend` can be held to that exact file.
|
|
47
|
+
*/
|
|
48
|
+
export const PACKAGE_IDENTITY_SCRIPT = [
|
|
49
|
+
"const fs = require('node:fs'), path = require('node:path');",
|
|
50
|
+
"const dir = process.argv[1];",
|
|
51
|
+
"const p = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));",
|
|
52
|
+
"const bin = typeof p.bin === 'string' ? p.bin : (p.bin || {}).agend;",
|
|
53
|
+
"process.stdout.write(JSON.stringify({ name: p.name, version: p.version, dir: fs.realpathSync(dir), bin: bin ? fs.realpathSync(path.join(dir, bin)) : null }));",
|
|
54
|
+
].join(" ");
|
|
55
|
+
/** Proves the native module loads AND works: on Node 20 better-sqlite3 13 imports fine and then SIGSEGVs on open. */
|
|
56
|
+
export const NATIVE_CHECK_SCRIPT = [
|
|
57
|
+
"const { createRequire } = require('node:module');",
|
|
58
|
+
"const req = createRequire(require('node:path').join(process.argv[1], 'package.json'));",
|
|
59
|
+
"const Database = req('better-sqlite3');",
|
|
60
|
+
"const db = new Database(':memory:');",
|
|
61
|
+
"if (db.prepare('select 1 as one').get().one !== 1) process.exit(3);",
|
|
62
|
+
"db.close();",
|
|
63
|
+
"process.stdout.write('native-ok');",
|
|
64
|
+
].join(" ");
|
|
65
|
+
const normalizeVersion = (text) => text.trim().replace(/^v/i, "");
|
|
66
|
+
/**
|
|
67
|
+
* Prove the package npm installed — read from npm's own global root and prefix in the install environment — is the
|
|
68
|
+
* one `agend` on PATH runs, reports `plan.targetVersion` (when known) and opens a database on the interpreter its
|
|
69
|
+
* shebang resolves to. Used after an install, and before restarting a fleet that predates an earlier install (#1449
|
|
70
|
+
* review: an update whose verification failed must not be completed by simply running `agend update` again).
|
|
71
|
+
*/
|
|
72
|
+
export function verifyInstalledPackage(plan, runner) {
|
|
73
|
+
const fail = (message) => ({ ok: false, stage: "verify", message });
|
|
74
|
+
const run = (argv, timeoutMs = 15_000) => inInstallEnv(runner, plan, argv, { timeoutMs });
|
|
75
|
+
const out = (r) => r.stdout.trim().split("\n").pop()?.trim() ?? "";
|
|
76
|
+
// What npm installed, read from npm's own global root and prefix in the install environment — not from whatever
|
|
77
|
+
// `agend` happens to win PATH (#1449 review: a same-version checkout earlier on PATH must not pass).
|
|
78
|
+
const rootRun = run(["npm", "root", "-g"]);
|
|
79
|
+
const prefixRun = run(["npm", "prefix", "-g"]);
|
|
80
|
+
if (rootRun.status !== 0 || prefixRun.status !== 0 || !out(rootRun) || !out(prefixRun)) {
|
|
81
|
+
return fail(" ✗ Verification failed: could not ask npm where it installed the package.");
|
|
82
|
+
}
|
|
83
|
+
const pkgDir = join(out(rootRun), "@songsid", "agend");
|
|
84
|
+
const identityRun = run(["node", "-e", PACKAGE_IDENTITY_SCRIPT, pkgDir]);
|
|
85
|
+
let identity = {};
|
|
86
|
+
try {
|
|
87
|
+
identity = JSON.parse(out(identityRun));
|
|
88
|
+
}
|
|
89
|
+
catch { /* checked below */ }
|
|
90
|
+
if (identityRun.status !== 0 || identity.name !== "@songsid/agend" || !identity.version || !identity.dir || !identity.bin) {
|
|
91
|
+
return fail(` ✗ Verification failed: ${pkgDir} is not an installed @songsid/agend package.`);
|
|
92
|
+
}
|
|
93
|
+
const version = normalizeVersion(identity.version);
|
|
94
|
+
if (plan.targetVersion && version !== plan.targetVersion) {
|
|
95
|
+
return fail(` ✗ Verification failed: npm installed v${version} at ${pkgDir}, not v${plan.targetVersion}.`);
|
|
96
|
+
}
|
|
97
|
+
const agendPath = join(out(prefixRun), "bin", "agend");
|
|
98
|
+
const binReal = runner.run("readlink", ["-f", agendPath], { timeoutMs: 5_000 });
|
|
99
|
+
if (binReal.status !== 0 || out(binReal) !== identity.bin) {
|
|
100
|
+
return fail(` ✗ Verification failed: ${agendPath} does not lead to the installed package (${identity.bin}).`);
|
|
101
|
+
}
|
|
102
|
+
// The `agend` the operator, the service refresh and the restart will run must be that same file.
|
|
103
|
+
const which = run(["sh", "-c", "command -v agend"]);
|
|
104
|
+
const onPath = out(which);
|
|
105
|
+
const onPathReal = onPath ? runner.run("readlink", ["-f", onPath], { timeoutMs: 5_000 }) : null;
|
|
106
|
+
if (which.status !== 0 || !onPathReal || onPathReal.status !== 0 || out(onPathReal) !== identity.bin) {
|
|
107
|
+
return fail(` ✗ Verification failed: npm installed v${version} at ${pkgDir}, but \`agend\` on PATH is ${onPath || "missing"}${onPathReal?.status === 0 ? ` (${out(onPathReal)})` : ""}. Another install shadows it; remove that one and retry.${plan.viaNvm && !onPath ? " You may need to add nvm to your shell profile." : ""}`);
|
|
108
|
+
}
|
|
109
|
+
const versionRun = run([agendPath, "--version"]);
|
|
110
|
+
if (versionRun.status !== 0)
|
|
111
|
+
return fail(` ✗ Verification failed: \`${agendPath} --version\` exited ${versionRun.status ?? versionRun.signal}.`);
|
|
112
|
+
if (normalizeVersion(out(versionRun)) !== version) {
|
|
113
|
+
return fail(` ✗ Verification failed: \`${agendPath} --version\` printed ${out(versionRun)}, but the installed package is v${version}.`);
|
|
114
|
+
}
|
|
115
|
+
const native = run(["node", "-e", NATIVE_CHECK_SCRIPT, identity.dir], 30_000);
|
|
116
|
+
if (native.status !== 0 || out(native) !== "native-ok") {
|
|
117
|
+
return fail(` ✗ Verification failed: the installed package cannot open a database with this Node (${native.signal ?? `exit ${native.status}`}). ${native.stderr.trim().split("\n").pop() ?? ""}`.trimEnd());
|
|
118
|
+
}
|
|
119
|
+
// The interpreter that ran the native proof — the one `agend`'s `#!/usr/bin/env node` resolves to here. Activation
|
|
120
|
+
// requires the service to run on exactly this one (service-activation.ts).
|
|
121
|
+
const nodeRun = run(["sh", "-c", "command -v node"]);
|
|
122
|
+
const nodeReal = out(nodeRun) ? runner.run("readlink", ["-f", out(nodeRun)], { timeoutMs: 5_000 }) : null;
|
|
123
|
+
if (nodeRun.status !== 0 || !nodeReal || nodeReal.status !== 0 || !out(nodeReal)) {
|
|
124
|
+
return fail(" ✗ Verification failed: could not resolve the Node the installed package runs on.");
|
|
125
|
+
}
|
|
126
|
+
return { ok: true, agendPath, version, dir: identity.dir, bin: identity.bin, node: out(nodeReal) };
|
|
127
|
+
}
|
|
128
|
+
export function runUpdateInstall(plan, runner) {
|
|
129
|
+
// A real local link is only reported: the install below replaces it in place, and a failed install leaves it.
|
|
130
|
+
const root = runner.run("npm", ["root", "-g"], { timeoutMs: 15_000 });
|
|
131
|
+
if (root.status === 0 && root.stdout.trim()) {
|
|
132
|
+
const entry = join(root.stdout.trim(), "@songsid", "agend");
|
|
133
|
+
const link = runner.run("readlink", [entry], { timeoutMs: 5_000 });
|
|
134
|
+
if (link.status === 0) {
|
|
135
|
+
const real = runner.run("readlink", ["-f", entry], { timeoutMs: 5_000 });
|
|
136
|
+
if (real.status === 0 && isLocalLinkTarget(true, real.stdout.trim())) {
|
|
137
|
+
runner.log(` ⚠️ The global agend is a local npm link (${real.stdout.trim()}); the release install replaces it.`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const install = plan.viaNvm
|
|
142
|
+
? runner.run("bash", ["-c", NVM_INSTALL_SCRIPT, "bash", plan.nvmSh, plan.pkg], { inherit: true })
|
|
143
|
+
: runner.run("npm", ["install", "-g", plan.pkg], { inherit: true });
|
|
144
|
+
if (install.status !== 0) {
|
|
145
|
+
return {
|
|
146
|
+
ok: false, stage: "install",
|
|
147
|
+
message: plan.viaNvm ? " Failed to install via nvm. The current install was not touched."
|
|
148
|
+
: ` Failed to update; the current install was not touched. Try: npm install -g ${plan.pkg}`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const verified = verifyInstalledPackage(plan, runner);
|
|
152
|
+
if (!verified.ok)
|
|
153
|
+
return verified;
|
|
154
|
+
// Only now is the new install proven: clean up the old system copy an nvm install leaves behind. Best effort, and
|
|
155
|
+
// never waits for a password.
|
|
156
|
+
if (plan.viaNvm) {
|
|
157
|
+
runner.log(" Note: removing old system install (may require sudo)...");
|
|
158
|
+
runner.run("sudo", ["-n", "npm", "uninstall", "-g", "@songsid/agend"], { inherit: true, timeoutMs: 10_000 });
|
|
159
|
+
}
|
|
160
|
+
return verified;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=update-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-install.js","sourceRoot":"","sources":["../src/update-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const WEB_CHAT_NOTICE = "web-chat-2.2";
|
|
2
|
+
/** Where the web chat notice points a phone user, until the public link (#1367) gives them a menu option. */
|
|
3
|
+
export declare const WEB_REMOTE_DOCS_URL = "https://github.com/songsid/AgEnD/blob/main/docs/web-dashboard.md#reaching-it-from-elsewhere";
|
|
4
|
+
export declare function upgradeNoticesPath(dataDir: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Whether this version has web chat: 2.2 or later, prereleases included. The 2.2 betas (2.2.0-beta.N) are where
|
|
7
|
+
* upgrading users first meet it, although SemVer orders them before 2.2.0. A version that does not parse (a dev
|
|
8
|
+
* checkout says 1.22.0, an unknown one says "unknown") is not.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hasWebChat(version: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Record that `notice` is being sent to `adapterId`. True only when this call recorded it: false when it was
|
|
13
|
+
* recorded before, or when the file cannot be read or written (then the caller sends nothing).
|
|
14
|
+
*/
|
|
15
|
+
export declare function claimNotice(path: string, notice: string, adapterId: string): boolean;
|
|
16
|
+
/** Undo a claim whose send failed, so the next start tries again. Best effort: false when it could not be undone. */
|
|
17
|
+
export declare function releaseNotice(path: string, notice: string, adapterId: string): boolean;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time notices for people who upgrade into a release that changed how AgEnD is used (#1366).
|
|
3
|
+
*
|
|
4
|
+
* The first is web chat (2.2): a fleet that has run 2.1 for months gives no sign that its agents can now be talked
|
|
5
|
+
* to from a browser. The first time a fleet runs 2.2 or later, each chat platform's General is told once.
|
|
6
|
+
*
|
|
7
|
+
* What was announced where is recorded in `<AGEND_HOME>/upgrade-notices.json`: `{ "<notice>": ["<adapter id>", …] }`.
|
|
8
|
+
* A notice is claimed in that file before it is sent, and the claim is released if the send fails, so the next start
|
|
9
|
+
* tries again. When the file cannot be read or written, nothing is sent: a missed notice is better than one that
|
|
10
|
+
* repeats on every restart.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { writeFileAtomic } from "./backend/kiro-engine-ledger.js";
|
|
15
|
+
export const WEB_CHAT_NOTICE = "web-chat-2.2";
|
|
16
|
+
/** Where the web chat notice points a phone user, until the public link (#1367) gives them a menu option. */
|
|
17
|
+
export const WEB_REMOTE_DOCS_URL = "https://github.com/songsid/AgEnD/blob/main/docs/web-dashboard.md#reaching-it-from-elsewhere";
|
|
18
|
+
export function upgradeNoticesPath(dataDir) {
|
|
19
|
+
return join(dataDir, "upgrade-notices.json");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether this version has web chat: 2.2 or later, prereleases included. The 2.2 betas (2.2.0-beta.N) are where
|
|
23
|
+
* upgrading users first meet it, although SemVer orders them before 2.2.0. A version that does not parse (a dev
|
|
24
|
+
* checkout says 1.22.0, an unknown one says "unknown") is not.
|
|
25
|
+
*/
|
|
26
|
+
export function hasWebChat(version) {
|
|
27
|
+
const m = /^(\d+)\.(\d+)\.\d+(?:[-+].*)?$/.exec(version.trim());
|
|
28
|
+
if (!m)
|
|
29
|
+
return false;
|
|
30
|
+
const major = Number(m[1]), minor = Number(m[2]);
|
|
31
|
+
return major > 2 || (major === 2 && minor >= 2);
|
|
32
|
+
}
|
|
33
|
+
/** The state, `{}` when there is no file yet, or null when it exists but cannot be read or understood. */
|
|
34
|
+
function readState(path) {
|
|
35
|
+
let text;
|
|
36
|
+
try {
|
|
37
|
+
text = readFileSync(path, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return err.code === "ENOENT" ? {} : null;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const parsed = JSON.parse(text);
|
|
44
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
45
|
+
return null;
|
|
46
|
+
const state = {};
|
|
47
|
+
for (const [notice, adapters] of Object.entries(parsed)) {
|
|
48
|
+
if (!Array.isArray(adapters) || !adapters.every(a => typeof a === "string"))
|
|
49
|
+
return null;
|
|
50
|
+
state[notice] = adapters;
|
|
51
|
+
}
|
|
52
|
+
return state;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Record that `notice` is being sent to `adapterId`. True only when this call recorded it: false when it was
|
|
60
|
+
* recorded before, or when the file cannot be read or written (then the caller sends nothing).
|
|
61
|
+
*/
|
|
62
|
+
export function claimNotice(path, notice, adapterId) {
|
|
63
|
+
const state = readState(path);
|
|
64
|
+
if (!state || state[notice]?.includes(adapterId))
|
|
65
|
+
return false;
|
|
66
|
+
state[notice] = [...(state[notice] ?? []), adapterId];
|
|
67
|
+
try {
|
|
68
|
+
writeFileAtomic(path, JSON.stringify(state, null, 2) + "\n");
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/** Undo a claim whose send failed, so the next start tries again. Best effort: false when it could not be undone. */
|
|
76
|
+
export function releaseNotice(path, notice, adapterId) {
|
|
77
|
+
const state = readState(path);
|
|
78
|
+
if (!state)
|
|
79
|
+
return false;
|
|
80
|
+
const left = (state[notice] ?? []).filter(a => a !== adapterId);
|
|
81
|
+
if (left.length > 0)
|
|
82
|
+
state[notice] = left;
|
|
83
|
+
else
|
|
84
|
+
delete state[notice];
|
|
85
|
+
try {
|
|
86
|
+
writeFileAtomic(path, JSON.stringify(state, null, 2) + "\n");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=upgrade-notices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-notices.js","sourceRoot":"","sources":["../src/upgrade-notices.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export interface StatuslineRateLimits {
|
|
|
13
13
|
/** When that instance last wrote the file. */
|
|
14
14
|
observedAtMs: number;
|
|
15
15
|
}
|
|
16
|
+
/** A statusline window's `resets_at` as epoch ms, or null when it has no usable reset time. */
|
|
17
|
+
export declare function statuslineResetsAtMs(value: unknown): number | null;
|
|
16
18
|
/**
|
|
17
19
|
* The most recent rate-limit reading any claude-code instance has written, or
|
|
18
20
|
* null when no instance has one worth using.
|
|
@@ -41,20 +41,24 @@ import { join } from "node:path";
|
|
|
41
41
|
import { getAgendHome } from "../paths.js";
|
|
42
42
|
/** Older than this and we would rather say nothing — see isFresh below. */
|
|
43
43
|
export const STATUSLINE_MAX_AGE_MS = 60 * 60_000;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (typeof
|
|
47
|
-
return null;
|
|
48
|
-
let resetsAtMs = null;
|
|
49
|
-
if (typeof w.resets_at === "number" && Number.isFinite(w.resets_at)) {
|
|
44
|
+
/** A statusline window's `resets_at` as epoch ms, or null when it has no usable reset time. */
|
|
45
|
+
export function statuslineResetsAtMs(value) {
|
|
46
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
50
47
|
// Seconds in practice; tolerate milliseconds so a format change is not an outage.
|
|
51
|
-
|
|
48
|
+
return Math.abs(value) < 1e10 ? value * 1000 : value;
|
|
52
49
|
}
|
|
53
|
-
|
|
54
|
-
const parsed = new Date(
|
|
50
|
+
if (typeof value === "string" && value.trim()) {
|
|
51
|
+
const parsed = new Date(value).getTime();
|
|
55
52
|
if (!Number.isNaN(parsed))
|
|
56
|
-
|
|
53
|
+
return parsed;
|
|
57
54
|
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function parseWindow(raw, now) {
|
|
58
|
+
const w = raw;
|
|
59
|
+
if (typeof w?.used_percentage !== "number" || !Number.isFinite(w.used_percentage))
|
|
60
|
+
return null;
|
|
61
|
+
const resetsAtMs = statuslineResetsAtMs(w.resets_at);
|
|
58
62
|
// A window whose reset time has passed has rolled over: the percentage in the
|
|
59
63
|
// file describes a window that no longer exists. Reporting it would show a
|
|
60
64
|
// scary 95% for a quota that is actually empty.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusline-usage.js","sourceRoot":"","sources":["../../src/usage/statusline-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,MAAM,CAAC;AAiBjD
|
|
1
|
+
{"version":3,"file":"statusline-usage.js","sourceRoot":"","sources":["../../src/usage/statusline-usage.ts"],"names":[],"mappings":"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"}
|
package/dist/view-api.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { type AppShellContext } from "./web-api.js";
|
|
1
2
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
3
|
import type { FleetConfig } from "./types.js";
|
|
3
4
|
import type { Logger } from "./logger.js";
|
|
5
|
+
import type { WebSessionStore } from "./web-session.js";
|
|
4
6
|
export interface ViewApiContext {
|
|
5
|
-
readonly viewToken: string | null;
|
|
6
7
|
readonly webToken: string | null;
|
|
8
|
+
/** Absent in a hand-built context: cookies are then not a credential; the header token still is. */
|
|
9
|
+
readonly webSessions?: WebSessionStore | null;
|
|
7
10
|
readonly dataDir: string;
|
|
8
11
|
readonly fleetConfig: FleetConfig | null;
|
|
9
12
|
readonly logger: Logger;
|
|
@@ -22,6 +25,8 @@ export interface ViewApiContext {
|
|
|
22
25
|
resolveInstanceModel?(name: string): {
|
|
23
26
|
model: string;
|
|
24
27
|
};
|
|
28
|
+
/** #1306: the preview origin chosen for a signed-in shell load (the same hook web-api.ts uses). */
|
|
29
|
+
previewForUi?: AppShellContext["previewForUi"];
|
|
25
30
|
}
|
|
26
31
|
/** A pane's logical grid size in cells, as tmux sees it. */
|
|
27
32
|
export interface PaneSize {
|