@prestyj/cli 4.3.15 → 4.3.54
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 +4 -4
- package/dist/cli.js +529 -74
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +122 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +41 -23
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +14 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/auto-update.d.ts +24 -3
- package/dist/core/auto-update.d.ts.map +1 -1
- package/dist/core/auto-update.js +143 -55
- package/dist/core/auto-update.js.map +1 -1
- package/dist/core/auto-update.test.d.ts +2 -0
- package/dist/core/auto-update.test.d.ts.map +1 -0
- package/dist/core/auto-update.test.js +205 -0
- package/dist/core/auto-update.test.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +4 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +17 -1
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +44 -11
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts.map +1 -1
- package/dist/core/compaction/token-estimator.js +14 -1
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +1 -1
- package/dist/core/logger.d.ts +7 -2
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +48 -4
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +56 -21
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +356 -1
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +3 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +29 -14
- package/dist/core/skills.js.map +1 -1
- package/dist/modes/agent-home-mode.d.ts +21 -0
- package/dist/modes/agent-home-mode.d.ts.map +1 -0
- package/dist/modes/agent-home-mode.js +553 -0
- package/dist/modes/agent-home-mode.js.map +1 -0
- package/dist/system-prompt.d.ts +5 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +118 -82
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash.js +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +4 -2
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +61 -33
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +80 -20
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +12 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/plan-mode.test.js +22 -6
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts +10 -0
- package/dist/tools/prompt-hints.d.ts.map +1 -0
- package/dist/tools/prompt-hints.js +45 -0
- package/dist/tools/prompt-hints.js.map +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +32 -6
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/read.test.js +23 -4
- package/dist/tools/read.test.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +20 -3
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/write.test.js +13 -1
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +6 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +195 -70
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +0 -1
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/EyesOverlay.d.ts +10 -0
- package/dist/ui/components/EyesOverlay.d.ts.map +1 -0
- package/dist/ui/components/EyesOverlay.js +220 -0
- package/dist/ui/components/EyesOverlay.js.map +1 -0
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +7 -6
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts +4 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +6 -5
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts.map +1 -1
- package/dist/ui/components/ModelSelector.js +2 -1
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
- package/dist/ui/components/PlanOverlay.js +7 -1
- package/dist/ui/components/PlanOverlay.js.map +1 -1
- package/dist/ui/components/SelectList.d.ts +3 -1
- package/dist/ui/components/SelectList.d.ts.map +1 -1
- package/dist/ui/components/SelectList.js +15 -2
- package/dist/ui/components/SelectList.js.map +1 -1
- package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
- package/dist/ui/components/SkillsOverlay.js +6 -59
- package/dist/ui/components/SkillsOverlay.js.map +1 -1
- package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
- package/dist/ui/components/SlashCommandMenu.js +18 -8
- package/dist/ui/components/SlashCommandMenu.js.map +1 -1
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +2 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +1 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.js +94 -0
- package/dist/ui/hooks/stall-retry-duplicate.test.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +19 -0
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/login.d.ts.map +1 -1
- package/dist/ui/login.js +6 -5
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/stores/create-store.d.ts +15 -0
- package/dist/ui/stores/create-store.d.ts.map +1 -0
- package/dist/ui/stores/create-store.js +30 -0
- package/dist/ui/stores/create-store.js.map +1 -0
- package/dist/ui/stores/index.d.ts +3 -0
- package/dist/ui/stores/index.d.ts.map +1 -0
- package/dist/ui/stores/index.js +3 -0
- package/dist/ui/stores/index.js.map +1 -0
- package/dist/ui/stores/taskbar-store.d.ts +19 -0
- package/dist/ui/stores/taskbar-store.d.ts.map +1 -0
- package/dist/ui/stores/taskbar-store.js +59 -0
- package/dist/ui/stores/taskbar-store.js.map +1 -0
- package/dist/ui/utils/token-to-ansi.d.ts.map +1 -1
- package/dist/ui/utils/token-to-ansi.js +9 -1
- package/dist/ui/utils/token-to-ansi.js.map +1 -1
- package/dist/utils/image.d.ts +18 -1
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js +80 -31
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/session-title.js +1 -1
- package/package.json +13 -9
|
@@ -4,6 +4,7 @@ import { getAppPaths } from "../config.js";
|
|
|
4
4
|
import { refreshAnthropicToken } from "./oauth/anthropic.js";
|
|
5
5
|
import { refreshOpenAIToken } from "./oauth/openai.js";
|
|
6
6
|
import { withFileLock } from "./file-lock.js";
|
|
7
|
+
import { log } from "./logger.js";
|
|
7
8
|
export class AuthStorage {
|
|
8
9
|
data = {};
|
|
9
10
|
filePath;
|
|
@@ -18,9 +19,19 @@ export class AuthStorage {
|
|
|
18
19
|
try {
|
|
19
20
|
const content = await fs.readFile(this.filePath, "utf-8");
|
|
20
21
|
this.data = JSON.parse(content);
|
|
22
|
+
log("INFO", "auth", `Loaded credentials from ${this.filePath}`, {
|
|
23
|
+
providers: Object.keys(this.data).join(",") || "(none)",
|
|
24
|
+
});
|
|
21
25
|
}
|
|
22
|
-
catch {
|
|
26
|
+
catch (err) {
|
|
23
27
|
this.data = {};
|
|
28
|
+
const code = err.code;
|
|
29
|
+
if (code === "ENOENT") {
|
|
30
|
+
log("INFO", "auth", `No auth file found at ${this.filePath} (first run)`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
log("ERROR", "auth", `Failed to load auth file: ${err instanceof Error ? err.message : String(err)}`, { path: this.filePath, code: code ?? "unknown" });
|
|
34
|
+
}
|
|
24
35
|
}
|
|
25
36
|
});
|
|
26
37
|
this.loaded = true;
|
|
@@ -63,7 +74,8 @@ export class AuthStorage {
|
|
|
63
74
|
if (provider === "glm" ||
|
|
64
75
|
provider === "moonshot" ||
|
|
65
76
|
provider === "xiaomi" ||
|
|
66
|
-
provider === "minimax"
|
|
77
|
+
provider === "minimax" ||
|
|
78
|
+
provider === "openrouter") {
|
|
67
79
|
return creds;
|
|
68
80
|
}
|
|
69
81
|
// Return if not expired and not force-refreshing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-storage.js","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-storage.js","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Check for updates
|
|
3
|
-
* Called at CLI startup. Non-blocking on failure — the CLI always proceeds.
|
|
2
|
+
* Check for updates at CLI startup. Two-phase approach:
|
|
4
3
|
*
|
|
5
|
-
*
|
|
4
|
+
* Phase 1 (instant): If a previous background check found a newer version,
|
|
5
|
+
* kick off a background update now. Non-blocking.
|
|
6
|
+
*
|
|
7
|
+
* Phase 2 (async): Fire off a background version check for the *next* startup.
|
|
8
|
+
*
|
|
9
|
+
* Returns a message to display, or null.
|
|
6
10
|
*/
|
|
7
11
|
export declare function checkAndAutoUpdate(currentVersion: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Read the current state file and report whether a newer version has been
|
|
14
|
+
* downloaded / is pending install. Used by the TUI to show a persistent
|
|
15
|
+
* "update ready" indicator in the status row.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getPendingUpdate(currentVersion: string): {
|
|
18
|
+
latestVersion: string;
|
|
19
|
+
} | null;
|
|
20
|
+
/**
|
|
21
|
+
* Start periodic update checks during a long-running session.
|
|
22
|
+
* Checks every hour. If an update is found, calls `onUpdate` with a message.
|
|
23
|
+
*/
|
|
24
|
+
export declare function startPeriodicUpdateCheck(currentVersion: string, onUpdate: (message: string) => void): void;
|
|
25
|
+
/**
|
|
26
|
+
* Stop periodic update checks.
|
|
27
|
+
*/
|
|
28
|
+
export declare function stopPeriodicUpdateCheck(): void;
|
|
8
29
|
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"AAkIA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqCxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASzF;AA8BD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAClC,IAAI,CAiCN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
|
package/dist/core/auto-update.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
const PACKAGE_NAME = "@prestyj/cli";
|
|
6
6
|
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
7
|
-
const CHECK_INTERVAL_MS =
|
|
8
|
-
const FETCH_TIMEOUT_MS =
|
|
7
|
+
const CHECK_INTERVAL_MS = 1 * 60 * 60 * 1000; // 1 hour
|
|
8
|
+
const FETCH_TIMEOUT_MS = 10_000; // 10s — npm can be slow
|
|
9
9
|
var PackageManager;
|
|
10
10
|
(function (PackageManager) {
|
|
11
11
|
PackageManager["NPM"] = "npm";
|
|
@@ -35,12 +35,6 @@ function writeState(state) {
|
|
|
35
35
|
// Non-fatal
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
function shouldCheck() {
|
|
39
|
-
const state = readState();
|
|
40
|
-
if (!state)
|
|
41
|
-
return true;
|
|
42
|
-
return Date.now() - state.lastCheckedAt > CHECK_INTERVAL_MS;
|
|
43
|
-
}
|
|
44
38
|
function compareVersions(a, b) {
|
|
45
39
|
const pa = a.split(".").map(Number);
|
|
46
40
|
const pb = b.split(".").map(Number);
|
|
@@ -77,76 +71,170 @@ function detectInstallInfo() {
|
|
|
77
71
|
updateCommand: `npm install -g ${PACKAGE_NAME}@latest`,
|
|
78
72
|
};
|
|
79
73
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Fetch latest version from npm registry asynchronously.
|
|
76
|
+
*/
|
|
77
|
+
async function fetchLatestVersion() {
|
|
83
78
|
try {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
.catch(() => { clearTimeout(t); process.exit(1); });
|
|
91
|
-
`;
|
|
92
|
-
const result = spawnSync(process.execPath, ["--input-type=module", "-e", script], {
|
|
93
|
-
encoding: "utf-8",
|
|
94
|
-
timeout: FETCH_TIMEOUT_MS + 1000,
|
|
95
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
96
|
-
});
|
|
97
|
-
const version = result.stdout?.trim();
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
81
|
+
const response = await fetch(REGISTRY_URL, { signal: controller.signal });
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
const data = (await response.json());
|
|
84
|
+
const version = data.version?.trim();
|
|
98
85
|
return version && /^\d+\.\d+\.\d+/.test(version) ? version : null;
|
|
99
86
|
}
|
|
100
87
|
catch {
|
|
101
88
|
return null;
|
|
102
89
|
}
|
|
103
90
|
}
|
|
104
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Perform the update in a detached background process so it doesn't block
|
|
93
|
+
* or interfere with the current CLI session. The update takes effect on
|
|
94
|
+
* the next launch.
|
|
95
|
+
*/
|
|
96
|
+
function performUpdateInBackground(command) {
|
|
105
97
|
try {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
98
|
+
const parts = command.split(" ");
|
|
99
|
+
const child = spawn(parts[0], parts.slice(1), {
|
|
100
|
+
detached: true,
|
|
101
|
+
stdio: "ignore",
|
|
109
102
|
env: { ...process.env, npm_config_loglevel: "silent" },
|
|
110
103
|
});
|
|
111
|
-
|
|
104
|
+
child.unref();
|
|
112
105
|
}
|
|
113
106
|
catch {
|
|
114
|
-
|
|
107
|
+
// Non-fatal — will retry next startup
|
|
115
108
|
}
|
|
116
109
|
}
|
|
117
110
|
/**
|
|
118
|
-
* Check for updates
|
|
119
|
-
*
|
|
111
|
+
* Check for updates at CLI startup. Two-phase approach:
|
|
112
|
+
*
|
|
113
|
+
* Phase 1 (instant): If a previous background check found a newer version,
|
|
114
|
+
* kick off a background update now. Non-blocking.
|
|
115
|
+
*
|
|
116
|
+
* Phase 2 (async): Fire off a background version check for the *next* startup.
|
|
120
117
|
*
|
|
121
|
-
* Returns a message to display
|
|
118
|
+
* Returns a message to display, or null.
|
|
122
119
|
*/
|
|
123
120
|
export function checkAndAutoUpdate(currentVersion) {
|
|
124
121
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
122
|
+
const state = readState();
|
|
123
|
+
let message = null;
|
|
124
|
+
// Phase 1: Apply pending update from previous check
|
|
125
|
+
if (state?.updatePending && state.latestVersion) {
|
|
126
|
+
if (compareVersions(state.latestVersion, currentVersion) > 0) {
|
|
127
|
+
const info = detectInstallInfo();
|
|
128
|
+
if (info.updateCommand) {
|
|
129
|
+
// Run update in background — takes effect next launch
|
|
130
|
+
performUpdateInBackground(info.updateCommand);
|
|
131
|
+
message = `Ken just shipped ${state.latestVersion}! Installing in the background — takes effect next launch.`;
|
|
132
|
+
writeState({
|
|
133
|
+
...state,
|
|
134
|
+
lastCheckedAt: Date.now(),
|
|
135
|
+
updatePending: false,
|
|
136
|
+
lastUpdateAttempt: Date.now(),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Already on latest (user may have updated manually)
|
|
142
|
+
writeState({ ...state, updatePending: false });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Phase 2: Schedule background check for next startup
|
|
146
|
+
const shouldCheck = !state || Date.now() - state.lastCheckedAt > CHECK_INTERVAL_MS;
|
|
147
|
+
if (shouldCheck) {
|
|
148
|
+
scheduleBackgroundCheck(currentVersion);
|
|
149
|
+
}
|
|
150
|
+
return message;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Read the current state file and report whether a newer version has been
|
|
158
|
+
* downloaded / is pending install. Used by the TUI to show a persistent
|
|
159
|
+
* "update ready" indicator in the status row.
|
|
160
|
+
*/
|
|
161
|
+
export function getPendingUpdate(currentVersion) {
|
|
162
|
+
try {
|
|
163
|
+
const state = readState();
|
|
164
|
+
if (!state?.latestVersion)
|
|
136
165
|
return null;
|
|
137
|
-
|
|
138
|
-
if (!info.updateCommand)
|
|
166
|
+
if (compareVersions(state.latestVersion, currentVersion) <= 0)
|
|
139
167
|
return null;
|
|
140
|
-
|
|
141
|
-
if (success) {
|
|
142
|
-
return `Updated ${PACKAGE_NAME} ${currentVersion} \u2192 ${latestVersion}`;
|
|
143
|
-
}
|
|
144
|
-
// Update failed — show manual instructions
|
|
145
|
-
return `Update available: ${currentVersion} \u2192 ${latestVersion}\nRun: ${info.updateCommand}`;
|
|
168
|
+
return { latestVersion: state.latestVersion };
|
|
146
169
|
}
|
|
147
170
|
catch {
|
|
148
|
-
// Never block CLI startup
|
|
149
171
|
return null;
|
|
150
172
|
}
|
|
151
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Fire-and-forget async version check. Updates the state file so the
|
|
176
|
+
* next startup knows whether an update is available.
|
|
177
|
+
*/
|
|
178
|
+
function scheduleBackgroundCheck(currentVersion) {
|
|
179
|
+
fetchLatestVersion()
|
|
180
|
+
.then((latestVersion) => {
|
|
181
|
+
const newState = {
|
|
182
|
+
lastCheckedAt: Date.now(),
|
|
183
|
+
latestVersion: latestVersion ?? undefined,
|
|
184
|
+
updatePending: false,
|
|
185
|
+
};
|
|
186
|
+
if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
|
|
187
|
+
newState.updatePending = true;
|
|
188
|
+
}
|
|
189
|
+
writeState(newState);
|
|
190
|
+
})
|
|
191
|
+
.catch(() => {
|
|
192
|
+
// Non-fatal — will retry next time
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// ── In-session periodic check ──────────────────────────────────────────
|
|
196
|
+
let periodicTimer = null;
|
|
197
|
+
/**
|
|
198
|
+
* Start periodic update checks during a long-running session.
|
|
199
|
+
* Checks every hour. If an update is found, calls `onUpdate` with a message.
|
|
200
|
+
*/
|
|
201
|
+
export function startPeriodicUpdateCheck(currentVersion, onUpdate) {
|
|
202
|
+
if (periodicTimer)
|
|
203
|
+
return; // Already running
|
|
204
|
+
periodicTimer = setInterval(() => {
|
|
205
|
+
fetchLatestVersion()
|
|
206
|
+
.then((latestVersion) => {
|
|
207
|
+
if (!latestVersion)
|
|
208
|
+
return;
|
|
209
|
+
if (compareVersions(latestVersion, currentVersion) <= 0)
|
|
210
|
+
return;
|
|
211
|
+
const info = detectInstallInfo();
|
|
212
|
+
if (!info.updateCommand)
|
|
213
|
+
return;
|
|
214
|
+
// Mark pending for next startup
|
|
215
|
+
writeState({
|
|
216
|
+
lastCheckedAt: Date.now(),
|
|
217
|
+
latestVersion,
|
|
218
|
+
updatePending: true,
|
|
219
|
+
});
|
|
220
|
+
onUpdate(`Ken just pushed a fresh update — ${currentVersion} → ${latestVersion}! I'll grab it on next launch (or run ${info.updateCommand} if you can't wait).`);
|
|
221
|
+
// Stop checking once we've notified
|
|
222
|
+
stopPeriodicUpdateCheck();
|
|
223
|
+
})
|
|
224
|
+
.catch(() => {
|
|
225
|
+
// Non-fatal
|
|
226
|
+
});
|
|
227
|
+
}, CHECK_INTERVAL_MS);
|
|
228
|
+
// Don't keep the process alive just for update checks
|
|
229
|
+
periodicTimer.unref();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Stop periodic update checks.
|
|
233
|
+
*/
|
|
234
|
+
export function stopPeriodicUpdateCheck() {
|
|
235
|
+
if (periodicTimer) {
|
|
236
|
+
clearInterval(periodicTimer);
|
|
237
|
+
periodicTimer = null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
152
240
|
//# sourceMappingURL=auto-update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.test.d.ts","sourceRoot":"","sources":["../../src/core/auto-update.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { checkAndAutoUpdate, startPeriodicUpdateCheck, stopPeriodicUpdateCheck, } from "./auto-update.js";
|
|
7
|
+
// Use a temp directory for state file instead of the real ~/.gg
|
|
8
|
+
const tmpDir = path.join(os.tmpdir(), `gg-update-test-${process.pid}`);
|
|
9
|
+
// Mock the state file path
|
|
10
|
+
vi.mock("node:os", async () => {
|
|
11
|
+
const actual = await vi.importActual("node:os");
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
default: {
|
|
15
|
+
...actual,
|
|
16
|
+
homedir: () => tmpDir,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
// Mock spawn so we never actually run install commands
|
|
21
|
+
vi.mock("node:child_process", () => ({
|
|
22
|
+
spawn: vi.fn(() => ({ unref: vi.fn() })),
|
|
23
|
+
}));
|
|
24
|
+
function writeStateFile(state) {
|
|
25
|
+
fs.mkdirSync(path.join(tmpDir, ".ezcoder"), { recursive: true });
|
|
26
|
+
fs.writeFileSync(path.join(tmpDir, ".ezcoder", "update-state.json"), JSON.stringify(state));
|
|
27
|
+
}
|
|
28
|
+
function readStateFile() {
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(fs.readFileSync(path.join(tmpDir, ".ezcoder", "update-state.json"), "utf-8"));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
fs.mkdirSync(path.join(tmpDir, ".ezcoder"), { recursive: true });
|
|
38
|
+
// Clear any existing state
|
|
39
|
+
try {
|
|
40
|
+
fs.unlinkSync(path.join(tmpDir, ".ezcoder", "update-state.json"));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// fine
|
|
44
|
+
}
|
|
45
|
+
vi.restoreAllMocks();
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
stopPeriodicUpdateCheck();
|
|
49
|
+
vi.restoreAllMocks();
|
|
50
|
+
try {
|
|
51
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// fine
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
describe("checkAndAutoUpdate", () => {
|
|
58
|
+
it("returns null on first run with no state file", () => {
|
|
59
|
+
// Mock fetch to return a version (but the background check is async, so
|
|
60
|
+
// on first call it just schedules a check and returns null)
|
|
61
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
62
|
+
json: () => Promise.resolve({ version: "99.0.0" }),
|
|
63
|
+
}));
|
|
64
|
+
const result = checkAndAutoUpdate("1.0.0");
|
|
65
|
+
expect(result).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
it("returns null when already on latest version", () => {
|
|
68
|
+
writeStateFile({
|
|
69
|
+
lastCheckedAt: Date.now(),
|
|
70
|
+
latestVersion: "1.0.0",
|
|
71
|
+
updatePending: true,
|
|
72
|
+
});
|
|
73
|
+
const result = checkAndAutoUpdate("1.0.0");
|
|
74
|
+
expect(result).toBeNull();
|
|
75
|
+
// Should clear the pending flag
|
|
76
|
+
const state = readStateFile();
|
|
77
|
+
expect(state?.updatePending).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
it("returns null when on a newer version than registry (manual install)", () => {
|
|
80
|
+
writeStateFile({
|
|
81
|
+
lastCheckedAt: Date.now(),
|
|
82
|
+
latestVersion: "1.0.0",
|
|
83
|
+
updatePending: true,
|
|
84
|
+
});
|
|
85
|
+
const result = checkAndAutoUpdate("2.0.0");
|
|
86
|
+
expect(result).toBeNull();
|
|
87
|
+
const state = readStateFile();
|
|
88
|
+
expect(state?.updatePending).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
it("triggers background update when pending update exists", () => {
|
|
91
|
+
writeStateFile({
|
|
92
|
+
lastCheckedAt: Date.now(),
|
|
93
|
+
latestVersion: "2.0.0",
|
|
94
|
+
updatePending: true,
|
|
95
|
+
});
|
|
96
|
+
const result = checkAndAutoUpdate("1.0.0");
|
|
97
|
+
expect(result).toContain("Updating");
|
|
98
|
+
expect(result).toContain("1.0.0");
|
|
99
|
+
expect(result).toContain("2.0.0");
|
|
100
|
+
expect(vi.mocked(spawn)).toHaveBeenCalled();
|
|
101
|
+
// Should clear the pending flag
|
|
102
|
+
const state = readStateFile();
|
|
103
|
+
expect(state?.updatePending).toBe(false);
|
|
104
|
+
expect(state?.lastUpdateAttempt).toBeDefined();
|
|
105
|
+
});
|
|
106
|
+
it("schedules background check when last check was long ago", async () => {
|
|
107
|
+
const fetchMock = vi.fn().mockResolvedValue({
|
|
108
|
+
json: () => Promise.resolve({ version: "5.0.0" }),
|
|
109
|
+
});
|
|
110
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
111
|
+
writeStateFile({
|
|
112
|
+
lastCheckedAt: 0, // very old
|
|
113
|
+
latestVersion: "1.0.0",
|
|
114
|
+
updatePending: false,
|
|
115
|
+
});
|
|
116
|
+
checkAndAutoUpdate("1.0.0");
|
|
117
|
+
// Give the async check time to complete
|
|
118
|
+
await vi.waitFor(() => {
|
|
119
|
+
expect(fetchMock).toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
// Wait for the state to be written
|
|
122
|
+
await vi.waitFor(() => {
|
|
123
|
+
const state = readStateFile();
|
|
124
|
+
expect(state?.latestVersion).toBe("5.0.0");
|
|
125
|
+
expect(state?.updatePending).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it("does not schedule check when recently checked", () => {
|
|
129
|
+
const fetchMock = vi.fn().mockResolvedValue({
|
|
130
|
+
json: () => Promise.resolve({ version: "5.0.0" }),
|
|
131
|
+
});
|
|
132
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
133
|
+
writeStateFile({
|
|
134
|
+
lastCheckedAt: Date.now(), // just now
|
|
135
|
+
latestVersion: "1.0.0",
|
|
136
|
+
updatePending: false,
|
|
137
|
+
});
|
|
138
|
+
checkAndAutoUpdate("1.0.0");
|
|
139
|
+
// fetch should NOT be called since we just checked
|
|
140
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
141
|
+
});
|
|
142
|
+
it("handles fetch failure gracefully", async () => {
|
|
143
|
+
const fetchMock = vi.fn().mockRejectedValue(new Error("network error"));
|
|
144
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
145
|
+
writeStateFile({
|
|
146
|
+
lastCheckedAt: 0,
|
|
147
|
+
updatePending: false,
|
|
148
|
+
});
|
|
149
|
+
// Should not throw
|
|
150
|
+
const result = checkAndAutoUpdate("1.0.0");
|
|
151
|
+
expect(result).toBeNull();
|
|
152
|
+
});
|
|
153
|
+
it("handles corrupt state file gracefully", () => {
|
|
154
|
+
fs.writeFileSync(path.join(tmpDir, ".ezcoder", "update-state.json"), "not json{{{");
|
|
155
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
156
|
+
json: () => Promise.resolve({ version: "2.0.0" }),
|
|
157
|
+
}));
|
|
158
|
+
// Should not throw — treats corrupt file like no file
|
|
159
|
+
const result = checkAndAutoUpdate("1.0.0");
|
|
160
|
+
expect(result).toBeNull();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe("startPeriodicUpdateCheck", () => {
|
|
164
|
+
it("calls onUpdate when a newer version is found", async () => {
|
|
165
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
166
|
+
json: () => Promise.resolve({ version: "99.0.0" }),
|
|
167
|
+
}));
|
|
168
|
+
const onUpdate = vi.fn();
|
|
169
|
+
vi.useFakeTimers();
|
|
170
|
+
startPeriodicUpdateCheck("1.0.0", onUpdate);
|
|
171
|
+
// Advance past one check interval
|
|
172
|
+
await vi.advanceTimersByTimeAsync(1 * 60 * 60 * 1000 + 100);
|
|
173
|
+
expect(onUpdate).toHaveBeenCalledWith(expect.stringContaining("99.0.0"));
|
|
174
|
+
vi.useRealTimers();
|
|
175
|
+
});
|
|
176
|
+
it("does not call onUpdate when already on latest", async () => {
|
|
177
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
178
|
+
json: () => Promise.resolve({ version: "1.0.0" }),
|
|
179
|
+
}));
|
|
180
|
+
const onUpdate = vi.fn();
|
|
181
|
+
vi.useFakeTimers();
|
|
182
|
+
startPeriodicUpdateCheck("1.0.0", onUpdate);
|
|
183
|
+
await vi.advanceTimersByTimeAsync(1 * 60 * 60 * 1000 + 100);
|
|
184
|
+
expect(onUpdate).not.toHaveBeenCalled();
|
|
185
|
+
vi.useRealTimers();
|
|
186
|
+
});
|
|
187
|
+
it("stops checking after first notification", async () => {
|
|
188
|
+
const fetchMock = vi.fn().mockResolvedValue({
|
|
189
|
+
json: () => Promise.resolve({ version: "99.0.0" }),
|
|
190
|
+
});
|
|
191
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
192
|
+
const onUpdate = vi.fn();
|
|
193
|
+
vi.useFakeTimers();
|
|
194
|
+
startPeriodicUpdateCheck("1.0.0", onUpdate);
|
|
195
|
+
// First interval
|
|
196
|
+
await vi.advanceTimersByTimeAsync(1 * 60 * 60 * 1000 + 100);
|
|
197
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
198
|
+
// Second interval — should NOT fire again (timer stopped)
|
|
199
|
+
fetchMock.mockClear();
|
|
200
|
+
await vi.advanceTimersByTimeAsync(1 * 60 * 60 * 1000 + 100);
|
|
201
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
202
|
+
vi.useRealTimers();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=auto-update.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.test.js","sourceRoot":"","sources":["../../src/core/auto-update.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { type Message, type Provider, type ContentPart } from "@prestyj/ai";
|
|
2
2
|
export interface CompactionResult {
|
|
3
|
+
/** Whether messages were actually reduced. */
|
|
4
|
+
compacted: boolean;
|
|
5
|
+
/** Why compaction was skipped (only set when compacted is false). */
|
|
6
|
+
reason?: string;
|
|
3
7
|
originalCount: number;
|
|
4
8
|
newCount: number;
|
|
5
9
|
tokensBeforeEstimate: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAwCrB,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAwCrB,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAKhD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,SAAM;AACf,2FAA2F;AAC3F,YAAY,CAAC,EAAE,MAAM;AACrB,6EAA6E;AAC7E,aAAa,SAA4B,GACxC,OAAO,CAoBT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA4CnF;AAqED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA6CpE;AAqID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAkBtF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,OAAO,EAAE,EACzB,OAAO,EAAE;IAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,GACpD,MAAM,CAgCR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,MAAM,CAM1E;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE;IACP,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAiP5D"}
|