@prestyj/cli 5.30.2 → 5.31.0
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/dist/app-sidecar/app-settings.d.ts +6 -2
- package/dist/app-sidecar/app-settings.js +39 -20
- package/dist/app-sidecar/app-settings.js.map +1 -1
- package/dist/app-sidecar/git-target.d.ts +17 -0
- package/dist/app-sidecar/git-target.js +31 -0
- package/dist/app-sidecar/git-target.js.map +1 -0
- package/dist/app-sidecar/goal-routes.d.ts +6 -0
- package/dist/app-sidecar/goal-routes.js +360 -0
- package/dist/app-sidecar/goal-routes.js.map +1 -0
- package/dist/app-sidecar/history-routes.d.ts +13 -0
- package/dist/app-sidecar/history-routes.js +37 -27
- package/dist/app-sidecar/history-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-routes.js +1 -2
- package/dist/app-sidecar/mcp-routes.js.map +1 -1
- package/dist/app-sidecar/prompt-routes.js +1 -2
- package/dist/app-sidecar/prompt-routes.js.map +1 -1
- package/dist/app-sidecar/route-context.d.ts +12 -0
- package/dist/app-sidecar/run-control-routes.js +2 -1
- package/dist/app-sidecar/run-control-routes.js.map +1 -1
- package/dist/app-sidecar/session-routes.js +41 -0
- package/dist/app-sidecar/session-routes.js.map +1 -1
- package/dist/app-sidecar/session-types.d.ts +2 -0
- package/dist/app-sidecar/workspace-routes.js +13 -95
- package/dist/app-sidecar/workspace-routes.js.map +1 -1
- package/dist/app-sidecar.js +219 -67
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/shared.js +1 -1
- package/dist/cli/shared.js.map +1 -1
- package/dist/core/acceptance-checks.js +17 -4
- package/dist/core/acceptance-checks.js.map +1 -1
- package/dist/core/agent-notifications.d.ts +1 -1
- package/dist/core/agent-session.d.ts +90 -5
- package/dist/core/agent-session.js +185 -63
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/ask-user.d.ts +11 -0
- package/dist/core/ask-user.js +6 -1
- package/dist/core/ask-user.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -80
- package/dist/core/auth-providers.js +4 -183
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/cache-diagnostics.d.ts +1 -1
- package/dist/core/cache-diagnostics.js +2 -1
- package/dist/core/cache-diagnostics.js.map +1 -1
- package/dist/core/compaction/tool-result-pruner.d.ts +10 -0
- package/dist/core/compaction/tool-result-pruner.js +12 -0
- package/dist/core/compaction/tool-result-pruner.js.map +1 -1
- package/dist/core/context-files.d.ts +8 -0
- package/dist/core/context-files.js +46 -0
- package/dist/core/context-files.js.map +1 -0
- package/dist/core/custom-commands.d.ts +6 -0
- package/dist/core/custom-commands.js +17 -0
- package/dist/core/custom-commands.js.map +1 -1
- package/dist/core/env-delta.d.ts +9 -1
- package/dist/core/env-delta.js +20 -0
- package/dist/core/env-delta.js.map +1 -1
- package/dist/core/goal-summary.d.ts +32 -0
- package/dist/core/goal-summary.js +104 -0
- package/dist/core/goal-summary.js.map +1 -0
- package/dist/core/goals-store.d.ts +208 -0
- package/dist/core/goals-store.js +521 -0
- package/dist/core/goals-store.js.map +1 -0
- package/dist/core/local-endpoint-store.js +15 -11
- package/dist/core/local-endpoint-store.js.map +1 -1
- package/dist/core/plan-handoff.d.ts +8 -0
- package/dist/core/plan-handoff.js +11 -0
- package/dist/core/plan-handoff.js.map +1 -1
- package/dist/core/project-discovery.d.ts +7 -0
- package/dist/core/project-discovery.js +9 -3
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/radio.d.ts +2 -3
- package/dist/core/radio.js.map +1 -1
- package/dist/core/session-manager.d.ts +7 -1
- package/dist/core/session-manager.js +17 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +3 -0
- package/dist/core/session-storage.js +8 -2
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/steroids.d.ts +8 -0
- package/dist/core/steroids.js +19 -3
- package/dist/core/steroids.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +51 -0
- package/dist/core/subagent-manager.js +103 -16
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-store.js +2 -1
- package/dist/core/subagent-store.js.map +1 -1
- package/dist/goals-agent/goal-team.d.ts +2 -0
- package/dist/goals-agent/goal-team.js +83 -0
- package/dist/goals-agent/goal-team.js.map +1 -0
- package/dist/goals-agent/goals-agent.d.ts +90 -0
- package/dist/goals-agent/goals-agent.js +246 -0
- package/dist/goals-agent/goals-agent.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interactive.js +4 -3
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-autopilot.d.ts +27 -0
- package/dist/modes/acp-autopilot.js +54 -0
- package/dist/modes/acp-autopilot.js.map +1 -0
- package/dist/modes/acp-goals.d.ts +48 -0
- package/dist/modes/acp-goals.js +103 -0
- package/dist/modes/acp-goals.js.map +1 -0
- package/dist/modes/acp-mode.d.ts +128 -3
- package/dist/modes/acp-mode.js +1082 -52
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +14 -0
- package/dist/modes/subagent-worker-mode.js +32 -1
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +8 -0
- package/dist/system-prompt.js +21 -9
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash-read-evidence.d.ts +13 -0
- package/dist/tools/bash-read-evidence.js +48 -1
- package/dist/tools/bash-read-evidence.js.map +1 -1
- package/dist/tools/grep-scan.d.ts +96 -0
- package/dist/tools/grep-scan.js +283 -0
- package/dist/tools/grep-scan.js.map +1 -0
- package/dist/tools/grep.d.ts +10 -0
- package/dist/tools/grep.js +418 -10
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +7 -1
- package/dist/tools/index.js +10 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-tracker.d.ts +6 -12
- package/dist/tools/read-tracker.js +21 -36
- package/dist/tools/read-tracker.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent-control.js +22 -3
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/write.js +110 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts +5 -5
- package/dist/ui/components/InputArea.d.ts +2 -2
- package/dist/ui/components/InputArea.js +3 -3
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts +2 -2
- package/dist/ui/hooks/useContextCompaction.js +38 -31
- package/dist/ui/hooks/useContextCompaction.js.map +1 -1
- package/dist/utils/format.d.ts +0 -4
- package/dist/utils/format.js +0 -7
- package/dist/utils/format.js.map +1 -1
- package/package.json +4 -4
|
@@ -34,6 +34,12 @@ export declare function defaultProjectsRoot(): string;
|
|
|
34
34
|
export declare function projectModelKey(cwd: string): string;
|
|
35
35
|
export declare function loadAppSettings(): Promise<AppSettings>;
|
|
36
36
|
export declare function saveAppSettings(settings: AppSettings): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Read-modify-write ezcoder-app.json under the shared file lock, so two windows
|
|
39
|
+
* saving at once (or a local-endpoint save racing a model save) can't lose
|
|
40
|
+
* each other's change. Every settings write in the sidecar goes through here.
|
|
41
|
+
*/
|
|
42
|
+
export declare function updateAppSettings<T = void>(mutate: (settings: AppSettings) => T | Promise<T>): Promise<T>;
|
|
37
43
|
/** Read this project's persisted model/thinking prefs, if any. */
|
|
38
44
|
export declare function loadProjectModelPrefs(cwd: string): Promise<ProjectModelPrefs | undefined>;
|
|
39
45
|
/** Persist this project's model/thinking prefs via read-modify-write so the rest
|
|
@@ -59,5 +65,3 @@ export declare function persistModelSelection(settingsFile: string, provider: Pr
|
|
|
59
65
|
* Mirrors the CLI's handleToggleThinking persistence (App.tsx).
|
|
60
66
|
*/
|
|
61
67
|
export declare function persistThinkingLevel(settingsFile: string, level: ThinkingLevel | undefined): Promise<void>;
|
|
62
|
-
/** Validate a project folder name: lowercase letters, digits, dashes only. */
|
|
63
|
-
export declare function isValidProjectName(name: string): boolean;
|
|
@@ -3,6 +3,8 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { SettingsManager } from "../core/settings-manager.js";
|
|
5
5
|
import { log } from "../core/logger.js";
|
|
6
|
+
import { atomicWrite } from "../core/session-storage.js";
|
|
7
|
+
import { withFileLock } from "@prestyj/core";
|
|
6
8
|
export const ALL_PROVIDERS = [
|
|
7
9
|
// US
|
|
8
10
|
"anthropic",
|
|
@@ -40,8 +42,15 @@ export function projectModelKey(cwd) {
|
|
|
40
42
|
}
|
|
41
43
|
export async function loadAppSettings() {
|
|
42
44
|
try {
|
|
43
|
-
const
|
|
45
|
+
const parsed = JSON.parse(await fs.readFile(appSettingsFile(), "utf-8"));
|
|
46
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
47
|
+
return { projectsRoot: defaultProjectsRoot() };
|
|
48
|
+
}
|
|
49
|
+
const raw = parsed;
|
|
44
50
|
return {
|
|
51
|
+
// Keep every key this module doesn't own (localEndpoints, fields a newer
|
|
52
|
+
// app version or the Rust side writes) so a save never drops them.
|
|
53
|
+
...raw,
|
|
45
54
|
projectsRoot: typeof raw.projectsRoot === "string" && raw.projectsRoot.trim()
|
|
46
55
|
? raw.projectsRoot
|
|
47
56
|
: defaultProjectsRoot(),
|
|
@@ -60,7 +69,21 @@ export async function loadAppSettings() {
|
|
|
60
69
|
}
|
|
61
70
|
export async function saveAppSettings(settings) {
|
|
62
71
|
await fs.mkdir(path.dirname(appSettingsFile()), { recursive: true });
|
|
63
|
-
await
|
|
72
|
+
await atomicWrite(appSettingsFile(), JSON.stringify(settings, null, 2));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read-modify-write ezcoder-app.json under the shared file lock, so two windows
|
|
76
|
+
* saving at once (or a local-endpoint save racing a model save) can't lose
|
|
77
|
+
* each other's change. Every settings write in the sidecar goes through here.
|
|
78
|
+
*/
|
|
79
|
+
export async function updateAppSettings(mutate) {
|
|
80
|
+
await fs.mkdir(path.dirname(appSettingsFile()), { recursive: true });
|
|
81
|
+
return withFileLock(appSettingsFile(), async () => {
|
|
82
|
+
const s = await loadAppSettings();
|
|
83
|
+
const result = await mutate(s);
|
|
84
|
+
await saveAppSettings(s);
|
|
85
|
+
return result;
|
|
86
|
+
});
|
|
64
87
|
}
|
|
65
88
|
/** Read this project's persisted model/thinking prefs, if any. */
|
|
66
89
|
export async function loadProjectModelPrefs(cwd) {
|
|
@@ -70,10 +93,10 @@ export async function loadProjectModelPrefs(cwd) {
|
|
|
70
93
|
/** Persist this project's model/thinking prefs via read-modify-write so the rest
|
|
71
94
|
* of the settings file (projectsRoot, other projects' entries) is preserved. */
|
|
72
95
|
export async function saveProjectModelPrefs(cwd, prefs) {
|
|
73
|
-
const s = await loadAppSettings();
|
|
74
96
|
const key = projectModelKey(cwd);
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
await updateAppSettings((s) => {
|
|
98
|
+
s.projectModels = { ...(s.projectModels ?? {}), [key]: prefs };
|
|
99
|
+
});
|
|
77
100
|
}
|
|
78
101
|
/** Read this project's persisted Nolan model override, if any. */
|
|
79
102
|
export async function loadNolanModelPref(cwd) {
|
|
@@ -83,15 +106,15 @@ export async function loadNolanModelPref(cwd) {
|
|
|
83
106
|
/** Persist (or with null, clear) this project's Nolan model override via
|
|
84
107
|
* read-modify-write so the rest of the settings file is preserved. */
|
|
85
108
|
export async function saveNolanModelPref(cwd, pref) {
|
|
86
|
-
const s = await loadAppSettings();
|
|
87
109
|
const key = projectModelKey(cwd);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
110
|
+
await updateAppSettings((s) => {
|
|
111
|
+
const next = { ...(s.nolanModels ?? {}) };
|
|
112
|
+
if (pref)
|
|
113
|
+
next[key] = pref;
|
|
114
|
+
else
|
|
115
|
+
delete next[key];
|
|
116
|
+
s.nolanModels = next;
|
|
117
|
+
});
|
|
95
118
|
}
|
|
96
119
|
/** Read this project's persisted autopilot flag (default off). */
|
|
97
120
|
export async function loadAutopilot(cwd) {
|
|
@@ -101,10 +124,10 @@ export async function loadAutopilot(cwd) {
|
|
|
101
124
|
/** Persist this project's autopilot flag via read-modify-write so the rest of
|
|
102
125
|
* the settings file (projectsRoot, model map, other projects) is preserved. */
|
|
103
126
|
export async function saveAutopilot(cwd, enabled) {
|
|
104
|
-
const s = await loadAppSettings();
|
|
105
127
|
const key = projectModelKey(cwd);
|
|
106
|
-
|
|
107
|
-
|
|
128
|
+
await updateAppSettings((s) => {
|
|
129
|
+
s.autopilot = { ...(s.autopilot ?? {}), [key]: enabled };
|
|
130
|
+
});
|
|
108
131
|
}
|
|
109
132
|
/**
|
|
110
133
|
* Persist the active model selection to ~/.ezcoder/settings.json so it survives app
|
|
@@ -137,10 +160,6 @@ export async function persistThinkingLevel(settingsFile, level) {
|
|
|
137
160
|
log("WARN", "app-sidecar", "failed to persist thinking level", { err: String(err) });
|
|
138
161
|
}
|
|
139
162
|
}
|
|
140
|
-
/** Validate a project folder name: lowercase letters, digits, dashes only. */
|
|
141
|
-
export function isValidProjectName(name) {
|
|
142
|
-
return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name);
|
|
143
|
-
}
|
|
144
163
|
// ── History reconstruction types ──────────────────────────
|
|
145
164
|
// Mirrors HistoryEntry in ezcoder-app/src/agent.ts — the wire shape the webview
|
|
146
165
|
// receives from GET /history. Fields beyond role/text carry the transcript
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-settings.js","sourceRoot":"","sources":["../../src/app-sidecar/app-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAiB,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-settings.js","sourceRoot":"","sources":["../../src/app-sidecar/app-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GoalRecord } from "../core/goals-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* The folder whose git state a window's titlebar shows (branch, uncommitted
|
|
4
|
+
* files, GitHub, CI, Project Health). Normally the window's cwd. A Goal
|
|
5
|
+
* window's cwd is the goal's own folder under `~/.ezcoder/goals`, which is not a
|
|
6
|
+
* repo, so it uses the first attached folder that is inside a git work tree:
|
|
7
|
+
* the project the goal is actually changing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveGitCwd(cwd: string, goal: Pick<GoalRecord, "context"> | null, isRepo?: (dir: string) => Promise<boolean>): Promise<string>;
|
|
10
|
+
export interface GitState {
|
|
11
|
+
branch: string | null;
|
|
12
|
+
isRepo: boolean;
|
|
13
|
+
dirtyFileCount: number;
|
|
14
|
+
gitHubSlug: string | null;
|
|
15
|
+
}
|
|
16
|
+
/** Read a folder's git state; each part falls back on its own when git fails. */
|
|
17
|
+
export declare function readGitState(dir: string): Promise<GitState>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getGitBranch, getGitDirtyFileCount, isGitRepo } from "../utils/git.js";
|
|
2
|
+
import { getGitHubRepoSlug } from "../utils/github.js";
|
|
3
|
+
/**
|
|
4
|
+
* The folder whose git state a window's titlebar shows (branch, uncommitted
|
|
5
|
+
* files, GitHub, CI, Project Health). Normally the window's cwd. A Goal
|
|
6
|
+
* window's cwd is the goal's own folder under `~/.ezcoder/goals`, which is not a
|
|
7
|
+
* repo, so it uses the first attached folder that is inside a git work tree:
|
|
8
|
+
* the project the goal is actually changing.
|
|
9
|
+
*/
|
|
10
|
+
export async function resolveGitCwd(cwd, goal, isRepo = isGitRepo) {
|
|
11
|
+
if (!goal)
|
|
12
|
+
return cwd;
|
|
13
|
+
for (const item of goal.context) {
|
|
14
|
+
if (item.kind !== "folder")
|
|
15
|
+
continue;
|
|
16
|
+
if (await isRepo(item.path).catch(() => false))
|
|
17
|
+
return item.path;
|
|
18
|
+
}
|
|
19
|
+
return cwd;
|
|
20
|
+
}
|
|
21
|
+
/** Read a folder's git state; each part falls back on its own when git fails. */
|
|
22
|
+
export async function readGitState(dir) {
|
|
23
|
+
const [branch, isRepo, dirtyFileCount, gitHubSlug] = await Promise.all([
|
|
24
|
+
getGitBranch(dir).catch(() => null),
|
|
25
|
+
isGitRepo(dir).catch(() => false),
|
|
26
|
+
getGitDirtyFileCount(dir).catch(() => 0),
|
|
27
|
+
getGitHubRepoSlug(dir).catch(() => null),
|
|
28
|
+
]);
|
|
29
|
+
return { branch, isRepo, dirtyFileCount, gitHubSlug };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=git-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-target.js","sourceRoot":"","sources":["../../src/app-sidecar/git-target.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,IAAwC,EACxC,SAA4C,SAAS;IAErD,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AASD,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrE,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACnC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QACjC,oBAAoB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KACzC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import { goalListStatus, type GoalSummary } from "../core/goal-summary.js";
|
|
3
|
+
import type { SessionRouteContext } from "./route-context.js";
|
|
4
|
+
export { goalListStatus, type GoalSummary };
|
|
5
|
+
/** Goal list, create, and the coordinator's automatic first reply. */
|
|
6
|
+
export declare function handleGoalRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createGoal, deleteGoal, goalKickoffPrompt, goalNeedsKickoff, goalPhase, goalResumePrompt, goalSettingsNote, goalWasInterrupted, setGoalCritterModel, setGoalPaused, updateGoal, goalsRoot, listGoals, markGoalKickoff, } from "../core/goals-store.js";
|
|
3
|
+
import { GOAL_RUNTIME_PROVENANCE, goalListStatus, summarizeGoal, } from "../core/goal-summary.js";
|
|
4
|
+
import { getModel } from "../core/model-registry.js";
|
|
5
|
+
import { goalCritterPick } from "../goals-agent/goals-agent.js";
|
|
6
|
+
import { SessionManager } from "../core/session-manager.js";
|
|
7
|
+
import { log } from "../core/logger.js";
|
|
8
|
+
import { readBody, json } from "./http.js";
|
|
9
|
+
const KICKOFF_PROVENANCE = GOAL_RUNTIME_PROVENANCE;
|
|
10
|
+
export { goalListStatus };
|
|
11
|
+
/** The sidecar's row: the shared summary without the ACP-only session id. */
|
|
12
|
+
async function summarize(sessions, dir, record, busy = false) {
|
|
13
|
+
const { latestSessionId: _latestSessionId, ...summary } = await summarizeGoal(sessions, dir, record, busy);
|
|
14
|
+
return summary;
|
|
15
|
+
}
|
|
16
|
+
/** Goal list, create, and the coordinator's automatic first reply. */
|
|
17
|
+
export function handleGoalRoutes(ctx, req, res, url, method) {
|
|
18
|
+
if (method === "GET" && url === "/goals") {
|
|
19
|
+
const sessions = new SessionManager(ctx.paths.sessionsDir);
|
|
20
|
+
void listGoals(goalsRoot(ctx.paths.agentDir))
|
|
21
|
+
.then((goals) => Promise.all(goals.map((g) => summarize(sessions, g.dir, g.record, ctx.busyAt(g.dir)))))
|
|
22
|
+
.then((goals) => {
|
|
23
|
+
goals.sort((a, b) => b.lastActiveMs - a.lastActiveMs || a.id.localeCompare(b.id));
|
|
24
|
+
json(res, 200, { goals });
|
|
25
|
+
})
|
|
26
|
+
.catch((err) => {
|
|
27
|
+
log("ERROR", "app-sidecar", "listGoals failed", {
|
|
28
|
+
message: err instanceof Error ? err.message : String(err),
|
|
29
|
+
});
|
|
30
|
+
json(res, 500, { error: "Couldn't read your goals" });
|
|
31
|
+
});
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (method === "POST" && url === "/goals") {
|
|
35
|
+
void readBody(req, res).then(async (raw) => {
|
|
36
|
+
if (raw === null)
|
|
37
|
+
return;
|
|
38
|
+
let body;
|
|
39
|
+
try {
|
|
40
|
+
body = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const input = body && typeof body === "object"
|
|
47
|
+
? body
|
|
48
|
+
: {};
|
|
49
|
+
try {
|
|
50
|
+
const created = await createGoal(goalsRoot(ctx.paths.agentDir), {
|
|
51
|
+
name: typeof input.name === "string" ? input.name : "",
|
|
52
|
+
goal: typeof input.goal === "string" ? input.goal : "",
|
|
53
|
+
context: Array.isArray(input.context)
|
|
54
|
+
? input.context.filter((p) => typeof p === "string")
|
|
55
|
+
: [],
|
|
56
|
+
...(typeof input.instructions === "string" ? { instructions: input.instructions } : {}),
|
|
57
|
+
}, new Date());
|
|
58
|
+
if (!created.ok) {
|
|
59
|
+
json(res, 400, { error: created.error });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const sessions = new SessionManager(ctx.paths.sessionsDir);
|
|
63
|
+
json(res, 200, {
|
|
64
|
+
goal: await summarize(sessions, created.value.dir, created.value.record),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
log("ERROR", "app-sidecar", "createGoal failed", {
|
|
69
|
+
message: err instanceof Error ? err.message : String(err),
|
|
70
|
+
});
|
|
71
|
+
json(res, 500, { error: "Couldn't create the goal" });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Deleting removes the goal folder and its coordinator sessions. Refused
|
|
77
|
+
// while another window has the goal open, or while this window is running in
|
|
78
|
+
// it, so no live session is left working in a folder that no longer exists.
|
|
79
|
+
if (method === "POST" && url === "/goals/delete") {
|
|
80
|
+
void readBody(req, res).then(async (raw) => {
|
|
81
|
+
if (raw === null)
|
|
82
|
+
return;
|
|
83
|
+
let id;
|
|
84
|
+
try {
|
|
85
|
+
id = JSON.parse(raw)?.id;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (typeof id !== "string" || !id) {
|
|
92
|
+
json(res, 400, { error: "Missing goal id" });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const root = goalsRoot(ctx.paths.agentDir);
|
|
96
|
+
const dir = path.join(root, id);
|
|
97
|
+
const holders = ctx.sessionIdsAt(dir);
|
|
98
|
+
if (holders.some((holder) => holder !== ctx.sessionId)) {
|
|
99
|
+
json(res, 409, { error: "This goal is open in another window. Close it there first." });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const ownsIt = holders.includes(ctx.sessionId);
|
|
103
|
+
if (ownsIt && (ctx.running || ctx.runClaim.active || ctx.autopilotActive)) {
|
|
104
|
+
json(res, 409, { error: "This goal is still working. Stop it first." });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const deleted = await deleteGoal(root, ctx.paths.sessionsDir, id);
|
|
109
|
+
if (!deleted.ok) {
|
|
110
|
+
json(res, 404, { error: deleted.error });
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (ownsIt)
|
|
114
|
+
ctx.goal = null;
|
|
115
|
+
json(res, 200, { ok: true });
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
log("ERROR", "app-sidecar", "deleteGoal failed", {
|
|
119
|
+
message: err instanceof Error ? err.message : String(err),
|
|
120
|
+
});
|
|
121
|
+
json(res, 500, { error: "Couldn't delete the goal" });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
// Pin the model EZ Goals' workers run on, or clear it (null) so they follow
|
|
127
|
+
// EZ Goals. Applies to the next worker started; running ones keep theirs,
|
|
128
|
+
// so this needs no run lock.
|
|
129
|
+
if (method === "POST" && url === "/goal/critter-model") {
|
|
130
|
+
const goal = ctx.goal;
|
|
131
|
+
if (!goal) {
|
|
132
|
+
json(res, 404, { error: "This window is not a goal" });
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
void readBody(req, res).then(async (raw) => {
|
|
136
|
+
if (raw === null)
|
|
137
|
+
return;
|
|
138
|
+
let requested;
|
|
139
|
+
try {
|
|
140
|
+
const parsed = JSON.parse(raw)?.model;
|
|
141
|
+
requested = typeof parsed === "string" && parsed.trim() ? parsed.trim() : null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
let pick = null;
|
|
149
|
+
if (requested !== null) {
|
|
150
|
+
const target = getModel(requested);
|
|
151
|
+
if (!target) {
|
|
152
|
+
json(res, 404, { error: `unknown model: ${requested}` });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (!(await ctx.auth.hasProviderAuth(target.provider))) {
|
|
156
|
+
json(res, 400, { error: `Connect ${target.provider} first to use ${target.name}.` });
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
pick = { provider: target.provider, model: target.id };
|
|
160
|
+
}
|
|
161
|
+
const updated = await setGoalCritterModel(goal.dir, pick);
|
|
162
|
+
if (!updated) {
|
|
163
|
+
json(res, 404, { error: "Unknown goal" });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
ctx.goal = { dir: goal.dir, record: updated };
|
|
167
|
+
const payload = {
|
|
168
|
+
id: updated.id,
|
|
169
|
+
phase: goalPhase(updated),
|
|
170
|
+
critterModel: goalCritterPick(updated)?.model ?? null,
|
|
171
|
+
};
|
|
172
|
+
ctx.broadcast("goal_state", payload);
|
|
173
|
+
json(res, 200, payload);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
log("ERROR", "app-sidecar", "set critter model failed", {
|
|
177
|
+
message: err instanceof Error ? err.message : String(err),
|
|
178
|
+
});
|
|
179
|
+
json(res, 500, { error: "Couldn't change the critters' model" });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
// Change this goal's attached folders/files or standing instructions. GG
|
|
185
|
+
// Goals' brief is fixed for a session (prompt cache), so the change reaches
|
|
186
|
+
// it in the goal's next session; refused mid-run so no worker is left
|
|
187
|
+
// working from a folder that was just detached.
|
|
188
|
+
if (method === "POST" && url === "/goal/update") {
|
|
189
|
+
const goal = ctx.goal;
|
|
190
|
+
if (!goal) {
|
|
191
|
+
json(res, 404, { error: "This window is not a goal" });
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
if (ctx.running || ctx.runClaim.active || ctx.autopilotActive) {
|
|
195
|
+
json(res, 409, { error: "This goal is still working. Pause it first." });
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
void readBody(req, res).then(async (raw) => {
|
|
199
|
+
if (raw === null)
|
|
200
|
+
return;
|
|
201
|
+
let body;
|
|
202
|
+
try {
|
|
203
|
+
body = JSON.parse(raw);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const updated = await updateGoal(goal.dir, body);
|
|
211
|
+
if (!updated.ok) {
|
|
212
|
+
json(res, 400, { error: updated.error });
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
ctx.goal = { dir: goal.dir, record: updated.value };
|
|
216
|
+
// EZ Goals' brief is fixed for the session (prompt cache): tell it the
|
|
217
|
+
// new settings at its next turn instead, and they're in the brief from
|
|
218
|
+
// the next session on.
|
|
219
|
+
ctx.session.notify("goal-settings", goalSettingsNote(updated.value));
|
|
220
|
+
for (const item of updated.value.context) {
|
|
221
|
+
if (item.kind !== "folder")
|
|
222
|
+
continue;
|
|
223
|
+
const added = await ctx.session.addDirectory(item.path);
|
|
224
|
+
if (!added.ok && !added.error.startsWith("Already in the workspace")) {
|
|
225
|
+
log("WARN", "app-sidecar", "goal context folder unavailable", { error: added.error });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
json(res, 200, {
|
|
229
|
+
context: updated.value.context,
|
|
230
|
+
instructions: updated.value.instructions ?? "",
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
log("ERROR", "app-sidecar", "update goal failed", {
|
|
235
|
+
message: err instanceof Error ? err.message : String(err),
|
|
236
|
+
});
|
|
237
|
+
json(res, 500, { error: "Couldn't update the goal" });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
// Pause: the app stops the current run (POST /cancel, which also stops its
|
|
243
|
+
// workers) and the goal stays put, even across a restart, until resumed.
|
|
244
|
+
if (method === "POST" && url === "/goal/pause") {
|
|
245
|
+
const goal = ctx.goal;
|
|
246
|
+
if (!goal) {
|
|
247
|
+
json(res, 404, { error: "This window is not a goal" });
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
void setGoalPaused(goal.dir, true, new Date())
|
|
251
|
+
.then((updated) => {
|
|
252
|
+
if (!updated) {
|
|
253
|
+
json(res, 404, { error: "Unknown goal" });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
ctx.goal = { dir: goal.dir, record: updated };
|
|
257
|
+
const payload = { id: updated.id, phase: goalPhase(updated), paused: true };
|
|
258
|
+
ctx.broadcast("goal_state", payload);
|
|
259
|
+
json(res, 200, payload);
|
|
260
|
+
})
|
|
261
|
+
.catch((err) => {
|
|
262
|
+
log("ERROR", "app-sidecar", "pause goal failed", {
|
|
263
|
+
message: err instanceof Error ? err.message : String(err),
|
|
264
|
+
});
|
|
265
|
+
json(res, 500, { error: "Couldn't pause the goal" });
|
|
266
|
+
});
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
// Carry a goal on: after a pause, or when its window opens after the app
|
|
270
|
+
// was closed mid-work. Lifts any pause, then, if the goal was cut off
|
|
271
|
+
// (a worker interrupted, or EZ Goals' own turn unfinished), runs once with
|
|
272
|
+
// the resume note so EZ Goals checks what's done and continues. Idempotent:
|
|
273
|
+
// nothing to resume answers { resumed: false }.
|
|
274
|
+
if (method === "POST" && url === "/goal/resume") {
|
|
275
|
+
const goal = ctx.goal;
|
|
276
|
+
if (!goal) {
|
|
277
|
+
json(res, 404, { error: "This window is not a goal" });
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
if (ctx.running || ctx.runClaim.active || ctx.autopilotActive) {
|
|
281
|
+
json(res, 200, { resumed: false });
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
if (!ctx.runClaim.claim()) {
|
|
285
|
+
json(res, 200, { resumed: false });
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
void (async () => {
|
|
289
|
+
const wasPaused = Boolean(goal.record.pausedAt);
|
|
290
|
+
const record = wasPaused
|
|
291
|
+
? ((await setGoalPaused(goal.dir, false, new Date())) ?? goal.record)
|
|
292
|
+
: goal.record;
|
|
293
|
+
ctx.goal = { dir: goal.dir, record };
|
|
294
|
+
if (wasPaused) {
|
|
295
|
+
ctx.broadcast("goal_state", { id: record.id, phase: goalPhase(record), paused: false });
|
|
296
|
+
}
|
|
297
|
+
const cutOff = wasPaused ||
|
|
298
|
+
goalWasInterrupted(record, ctx.session.getMessages(), ctx.session.listSubAgents());
|
|
299
|
+
if (!cutOff) {
|
|
300
|
+
json(res, 200, { resumed: false });
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
json(res, 202, { resumed: true });
|
|
304
|
+
await ctx.runAgent(record.name, () => ctx.session.prompt(goalResumePrompt(record), KICKOFF_PROVENANCE));
|
|
305
|
+
})()
|
|
306
|
+
.catch((err) => {
|
|
307
|
+
log("ERROR", "app-sidecar", "goal resume failed", {
|
|
308
|
+
message: err instanceof Error ? err.message : String(err),
|
|
309
|
+
});
|
|
310
|
+
if (!res.headersSent)
|
|
311
|
+
json(res, 500, { error: "Couldn't resume the goal" });
|
|
312
|
+
})
|
|
313
|
+
.finally(() => ctx.runClaim.release());
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
// Idempotent: the app calls this whenever it opens a goal that still needs
|
|
317
|
+
// its first reply. Only the first call on a fresh goal starts a run.
|
|
318
|
+
if (method === "POST" && url === "/goal/kickoff") {
|
|
319
|
+
const goal = ctx.goal;
|
|
320
|
+
if (!goal) {
|
|
321
|
+
json(res, 404, { error: "This window is not a goal" });
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
if (!goalNeedsKickoff(goal.record, ctx.session.getMessages())) {
|
|
325
|
+
json(res, 200, { started: false });
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
if (ctx.running || ctx.runClaim.active || ctx.autopilotActive) {
|
|
329
|
+
json(res, 409, { error: "The agent is busy" });
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
// Claim synchronously so a racing prompt queues instead of starting a
|
|
333
|
+
// second run while the kickoff record is being written.
|
|
334
|
+
if (!ctx.runClaim.claim()) {
|
|
335
|
+
json(res, 409, { error: "The agent is busy" });
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
void markGoalKickoff(goal.dir, new Date())
|
|
339
|
+
.then(async (updated) => {
|
|
340
|
+
if (!updated) {
|
|
341
|
+
json(res, 200, { started: false });
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
ctx.goal = { dir: goal.dir, record: updated };
|
|
345
|
+
json(res, 202, { started: true });
|
|
346
|
+
await ctx.runAgent(updated.name, () => ctx.session.prompt(goalKickoffPrompt(updated), KICKOFF_PROVENANCE));
|
|
347
|
+
})
|
|
348
|
+
.catch((err) => {
|
|
349
|
+
log("ERROR", "app-sidecar", "goal kickoff failed", {
|
|
350
|
+
message: err instanceof Error ? err.message : String(err),
|
|
351
|
+
});
|
|
352
|
+
if (!res.headersSent)
|
|
353
|
+
json(res, 500, { error: "Couldn't start the goal" });
|
|
354
|
+
})
|
|
355
|
+
.finally(() => ctx.runClaim.release());
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=goal-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/goal-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import type http from "node:http";
|
|
2
2
|
import type { SessionRouteContext } from "./route-context.js";
|
|
3
|
+
/**
|
|
4
|
+
* The restored worker rows for one delegation call, as the transcript shows
|
|
5
|
+
* them on reopen (`resultIsError`: null when no result was saved). Async
|
|
6
|
+
* workers are intentionally non-resumable; restored rows are historical.
|
|
7
|
+
*/
|
|
8
|
+
export declare function restoredWorkerRows(call: {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly args: Record<string, unknown>;
|
|
11
|
+
}, resultIsError: boolean | null): Array<{
|
|
12
|
+
agentName: string | undefined;
|
|
13
|
+
status: "done" | "error";
|
|
14
|
+
toolUseCount: number;
|
|
15
|
+
}>;
|
|
3
16
|
export declare function handleHistoryRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;
|