@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.
Files changed (142) hide show
  1. package/dist/app-sidecar/app-settings.d.ts +6 -2
  2. package/dist/app-sidecar/app-settings.js +39 -20
  3. package/dist/app-sidecar/app-settings.js.map +1 -1
  4. package/dist/app-sidecar/git-target.d.ts +17 -0
  5. package/dist/app-sidecar/git-target.js +31 -0
  6. package/dist/app-sidecar/git-target.js.map +1 -0
  7. package/dist/app-sidecar/goal-routes.d.ts +6 -0
  8. package/dist/app-sidecar/goal-routes.js +360 -0
  9. package/dist/app-sidecar/goal-routes.js.map +1 -0
  10. package/dist/app-sidecar/history-routes.d.ts +13 -0
  11. package/dist/app-sidecar/history-routes.js +37 -27
  12. package/dist/app-sidecar/history-routes.js.map +1 -1
  13. package/dist/app-sidecar/mcp-routes.js +1 -2
  14. package/dist/app-sidecar/mcp-routes.js.map +1 -1
  15. package/dist/app-sidecar/prompt-routes.js +1 -2
  16. package/dist/app-sidecar/prompt-routes.js.map +1 -1
  17. package/dist/app-sidecar/route-context.d.ts +12 -0
  18. package/dist/app-sidecar/run-control-routes.js +2 -1
  19. package/dist/app-sidecar/run-control-routes.js.map +1 -1
  20. package/dist/app-sidecar/session-routes.js +41 -0
  21. package/dist/app-sidecar/session-routes.js.map +1 -1
  22. package/dist/app-sidecar/session-types.d.ts +2 -0
  23. package/dist/app-sidecar/workspace-routes.js +13 -95
  24. package/dist/app-sidecar/workspace-routes.js.map +1 -1
  25. package/dist/app-sidecar.js +219 -67
  26. package/dist/app-sidecar.js.map +1 -1
  27. package/dist/cli/shared.js +1 -1
  28. package/dist/cli/shared.js.map +1 -1
  29. package/dist/core/acceptance-checks.js +17 -4
  30. package/dist/core/acceptance-checks.js.map +1 -1
  31. package/dist/core/agent-notifications.d.ts +1 -1
  32. package/dist/core/agent-session.d.ts +90 -5
  33. package/dist/core/agent-session.js +185 -63
  34. package/dist/core/agent-session.js.map +1 -1
  35. package/dist/core/ask-user.d.ts +11 -0
  36. package/dist/core/ask-user.js +6 -1
  37. package/dist/core/ask-user.js.map +1 -1
  38. package/dist/core/auth-providers.d.ts +2 -80
  39. package/dist/core/auth-providers.js +4 -183
  40. package/dist/core/auth-providers.js.map +1 -1
  41. package/dist/core/cache-diagnostics.d.ts +1 -1
  42. package/dist/core/cache-diagnostics.js +2 -1
  43. package/dist/core/cache-diagnostics.js.map +1 -1
  44. package/dist/core/compaction/tool-result-pruner.d.ts +10 -0
  45. package/dist/core/compaction/tool-result-pruner.js +12 -0
  46. package/dist/core/compaction/tool-result-pruner.js.map +1 -1
  47. package/dist/core/context-files.d.ts +8 -0
  48. package/dist/core/context-files.js +46 -0
  49. package/dist/core/context-files.js.map +1 -0
  50. package/dist/core/custom-commands.d.ts +6 -0
  51. package/dist/core/custom-commands.js +17 -0
  52. package/dist/core/custom-commands.js.map +1 -1
  53. package/dist/core/env-delta.d.ts +9 -1
  54. package/dist/core/env-delta.js +20 -0
  55. package/dist/core/env-delta.js.map +1 -1
  56. package/dist/core/goal-summary.d.ts +32 -0
  57. package/dist/core/goal-summary.js +104 -0
  58. package/dist/core/goal-summary.js.map +1 -0
  59. package/dist/core/goals-store.d.ts +208 -0
  60. package/dist/core/goals-store.js +521 -0
  61. package/dist/core/goals-store.js.map +1 -0
  62. package/dist/core/local-endpoint-store.js +15 -11
  63. package/dist/core/local-endpoint-store.js.map +1 -1
  64. package/dist/core/plan-handoff.d.ts +8 -0
  65. package/dist/core/plan-handoff.js +11 -0
  66. package/dist/core/plan-handoff.js.map +1 -1
  67. package/dist/core/project-discovery.d.ts +7 -0
  68. package/dist/core/project-discovery.js +9 -3
  69. package/dist/core/project-discovery.js.map +1 -1
  70. package/dist/core/radio.d.ts +2 -3
  71. package/dist/core/radio.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +7 -1
  73. package/dist/core/session-manager.js +17 -7
  74. package/dist/core/session-manager.js.map +1 -1
  75. package/dist/core/session-storage.d.ts +3 -0
  76. package/dist/core/session-storage.js +8 -2
  77. package/dist/core/session-storage.js.map +1 -1
  78. package/dist/core/steroids.d.ts +8 -0
  79. package/dist/core/steroids.js +19 -3
  80. package/dist/core/steroids.js.map +1 -1
  81. package/dist/core/subagent-manager.d.ts +51 -0
  82. package/dist/core/subagent-manager.js +103 -16
  83. package/dist/core/subagent-manager.js.map +1 -1
  84. package/dist/core/subagent-store.js +2 -1
  85. package/dist/core/subagent-store.js.map +1 -1
  86. package/dist/goals-agent/goal-team.d.ts +2 -0
  87. package/dist/goals-agent/goal-team.js +83 -0
  88. package/dist/goals-agent/goal-team.js.map +1 -0
  89. package/dist/goals-agent/goals-agent.d.ts +90 -0
  90. package/dist/goals-agent/goals-agent.js +246 -0
  91. package/dist/goals-agent/goals-agent.js.map +1 -0
  92. package/dist/index.js +1 -1
  93. package/dist/index.js.map +1 -1
  94. package/dist/interactive.js +4 -3
  95. package/dist/interactive.js.map +1 -1
  96. package/dist/modes/acp-autopilot.d.ts +27 -0
  97. package/dist/modes/acp-autopilot.js +54 -0
  98. package/dist/modes/acp-autopilot.js.map +1 -0
  99. package/dist/modes/acp-goals.d.ts +48 -0
  100. package/dist/modes/acp-goals.js +103 -0
  101. package/dist/modes/acp-goals.js.map +1 -0
  102. package/dist/modes/acp-mode.d.ts +128 -3
  103. package/dist/modes/acp-mode.js +1082 -52
  104. package/dist/modes/acp-mode.js.map +1 -1
  105. package/dist/modes/subagent-worker-mode.d.ts +14 -0
  106. package/dist/modes/subagent-worker-mode.js +32 -1
  107. package/dist/modes/subagent-worker-mode.js.map +1 -1
  108. package/dist/system-prompt.d.ts +8 -0
  109. package/dist/system-prompt.js +21 -9
  110. package/dist/system-prompt.js.map +1 -1
  111. package/dist/tools/bash-read-evidence.d.ts +13 -0
  112. package/dist/tools/bash-read-evidence.js +48 -1
  113. package/dist/tools/bash-read-evidence.js.map +1 -1
  114. package/dist/tools/grep-scan.d.ts +96 -0
  115. package/dist/tools/grep-scan.js +283 -0
  116. package/dist/tools/grep-scan.js.map +1 -0
  117. package/dist/tools/grep.d.ts +10 -0
  118. package/dist/tools/grep.js +418 -10
  119. package/dist/tools/grep.js.map +1 -1
  120. package/dist/tools/index.d.ts +7 -1
  121. package/dist/tools/index.js +10 -2
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/read-tracker.d.ts +6 -12
  124. package/dist/tools/read-tracker.js +21 -36
  125. package/dist/tools/read-tracker.js.map +1 -1
  126. package/dist/tools/read.js +2 -2
  127. package/dist/tools/read.js.map +1 -1
  128. package/dist/tools/subagent-control.js +22 -3
  129. package/dist/tools/subagent-control.js.map +1 -1
  130. package/dist/tools/write.js +110 -8
  131. package/dist/tools/write.js.map +1 -1
  132. package/dist/ui/components/ActivityIndicator.d.ts +5 -5
  133. package/dist/ui/components/InputArea.d.ts +2 -2
  134. package/dist/ui/components/InputArea.js +3 -3
  135. package/dist/ui/components/InputArea.js.map +1 -1
  136. package/dist/ui/components/ToolExecution.d.ts +2 -2
  137. package/dist/ui/hooks/useContextCompaction.js +38 -31
  138. package/dist/ui/hooks/useContextCompaction.js.map +1 -1
  139. package/dist/utils/format.d.ts +0 -4
  140. package/dist/utils/format.js +0 -7
  141. package/dist/utils/format.js.map +1 -1
  142. 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 raw = JSON.parse(await fs.readFile(appSettingsFile(), "utf-8"));
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 fs.writeFile(appSettingsFile(), JSON.stringify(settings, null, 2), "utf-8");
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
- s.projectModels = { ...(s.projectModels ?? {}), [key]: prefs };
76
- await saveAppSettings(s);
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
- const next = { ...(s.nolanModels ?? {}) };
89
- if (pref)
90
- next[key] = pref;
91
- else
92
- delete next[key];
93
- s.nolanModels = next;
94
- await saveAppSettings(s);
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
- s.autopilot = { ...(s.autopilot ?? {}), [key]: enabled };
107
- await saveAppSettings(s);
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":"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"}
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;