@prestyj/cli 5.31.0 → 5.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +3 -2
  2. package/assets/skills/task-list/SKILL.md +39 -0
  3. package/dist/app-sidecar/app-settings.js +11 -5
  4. package/dist/app-sidecar/app-settings.js.map +1 -1
  5. package/dist/app-sidecar/auth-routes.js +10 -3
  6. package/dist/app-sidecar/auth-routes.js.map +1 -1
  7. package/dist/app-sidecar/git-target.d.ts +15 -2
  8. package/dist/app-sidecar/git-target.js +24 -10
  9. package/dist/app-sidecar/git-target.js.map +1 -1
  10. package/dist/app-sidecar/goal-routes.js +14 -2
  11. package/dist/app-sidecar/goal-routes.js.map +1 -1
  12. package/dist/app-sidecar/history-routes.js +7 -0
  13. package/dist/app-sidecar/history-routes.js.map +1 -1
  14. package/dist/app-sidecar/history.d.ts +5 -0
  15. package/dist/app-sidecar/history.js.map +1 -1
  16. package/dist/app-sidecar/integration-routes.js +4 -0
  17. package/dist/app-sidecar/integration-routes.js.map +1 -1
  18. package/dist/app-sidecar/mcp-routes.js +1 -0
  19. package/dist/app-sidecar/mcp-routes.js.map +1 -1
  20. package/dist/app-sidecar/mcp-rows.d.ts +2 -0
  21. package/dist/app-sidecar/mcp-rows.js +4 -1
  22. package/dist/app-sidecar/mcp-rows.js.map +1 -1
  23. package/dist/app-sidecar/prompt-routes.js +67 -1
  24. package/dist/app-sidecar/prompt-routes.js.map +1 -1
  25. package/dist/app-sidecar/route-context.d.ts +2 -0
  26. package/dist/app-sidecar/run-control-routes.d.ts +14 -0
  27. package/dist/app-sidecar/run-control-routes.js +104 -25
  28. package/dist/app-sidecar/run-control-routes.js.map +1 -1
  29. package/dist/app-sidecar/session-routes.js +15 -1
  30. package/dist/app-sidecar/session-routes.js.map +1 -1
  31. package/dist/app-sidecar/task-routes.js +24 -0
  32. package/dist/app-sidecar/task-routes.js.map +1 -1
  33. package/dist/app-sidecar/trophy-manager.d.ts +15 -0
  34. package/dist/app-sidecar/trophy-manager.js +71 -0
  35. package/dist/app-sidecar/trophy-manager.js.map +1 -0
  36. package/dist/app-sidecar/workspace-routes.js +1 -0
  37. package/dist/app-sidecar/workspace-routes.js.map +1 -1
  38. package/dist/app-sidecar.js +157 -30
  39. package/dist/app-sidecar.js.map +1 -1
  40. package/dist/cli/auth.js +22 -1
  41. package/dist/cli/auth.js.map +1 -1
  42. package/dist/cli/mcp.js +6 -1
  43. package/dist/cli/mcp.js.map +1 -1
  44. package/dist/cli.js +13 -9
  45. package/dist/cli.js.map +1 -1
  46. package/dist/config.js +4 -2
  47. package/dist/config.js.map +1 -1
  48. package/dist/core/action-threats.d.ts +68 -0
  49. package/dist/core/action-threats.js +894 -0
  50. package/dist/core/action-threats.js.map +1 -0
  51. package/dist/core/agent-notifications.d.ts +18 -0
  52. package/dist/core/agent-notifications.js +35 -2
  53. package/dist/core/agent-notifications.js.map +1 -1
  54. package/dist/core/agent-session/verification-tracker.d.ts +21 -0
  55. package/dist/core/agent-session/verification-tracker.js +39 -1
  56. package/dist/core/agent-session/verification-tracker.js.map +1 -1
  57. package/dist/core/agent-session.d.ts +176 -2
  58. package/dist/core/agent-session.js +515 -30
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/blocked-packages-file.d.ts +33 -0
  61. package/dist/core/blocked-packages-file.js +274 -0
  62. package/dist/core/blocked-packages-file.js.map +1 -0
  63. package/dist/core/compaction/policy.d.ts +2 -2
  64. package/dist/core/compaction/policy.js +86 -43
  65. package/dist/core/compaction/policy.js.map +1 -1
  66. package/dist/core/compaction/token-estimator.d.ts +4 -1
  67. package/dist/core/compaction/token-estimator.js +5 -2
  68. package/dist/core/compaction/token-estimator.js.map +1 -1
  69. package/dist/core/event-bus.d.ts +10 -0
  70. package/dist/core/event-bus.js +2 -0
  71. package/dist/core/event-bus.js.map +1 -1
  72. package/dist/core/goal-run-marker.d.ts +32 -0
  73. package/dist/core/goal-run-marker.js +178 -0
  74. package/dist/core/goal-run-marker.js.map +1 -0
  75. package/dist/core/goal-summary.js +8 -2
  76. package/dist/core/goal-summary.js.map +1 -1
  77. package/dist/core/idle-wake.d.ts +62 -0
  78. package/dist/core/idle-wake.js +103 -0
  79. package/dist/core/idle-wake.js.map +1 -0
  80. package/dist/core/injection-detect.d.ts +2 -1
  81. package/dist/core/injection-detect.js +13 -4
  82. package/dist/core/injection-detect.js.map +1 -1
  83. package/dist/core/installed-threats.d.ts +23 -0
  84. package/dist/core/installed-threats.js +71 -0
  85. package/dist/core/installed-threats.js.map +1 -0
  86. package/dist/core/mcp/catalog-cache.d.ts +2 -0
  87. package/dist/core/mcp/catalog-cache.js +4 -0
  88. package/dist/core/mcp/catalog-cache.js.map +1 -1
  89. package/dist/core/mcp/client.d.ts +8 -0
  90. package/dist/core/mcp/client.js +37 -3
  91. package/dist/core/mcp/client.js.map +1 -1
  92. package/dist/core/mcp/deferred-catalog.d.ts +12 -1
  93. package/dist/core/mcp/deferred-catalog.js +37 -10
  94. package/dist/core/mcp/deferred-catalog.js.map +1 -1
  95. package/dist/core/mcp/index.d.ts +2 -0
  96. package/dist/core/mcp/index.js +1 -0
  97. package/dist/core/mcp/index.js.map +1 -1
  98. package/dist/core/mcp/tool-guard.d.ts +58 -0
  99. package/dist/core/mcp/tool-guard.js +215 -0
  100. package/dist/core/mcp/tool-guard.js.map +1 -0
  101. package/dist/core/network-guard.d.ts +0 -20
  102. package/dist/core/network-guard.js +6 -0
  103. package/dist/core/network-guard.js.map +1 -1
  104. package/dist/core/package-cooldown.d.ts +71 -0
  105. package/dist/core/package-cooldown.js +301 -0
  106. package/dist/core/package-cooldown.js.map +1 -0
  107. package/dist/core/package-threats.d.ts +77 -3
  108. package/dist/core/package-threats.js +1250 -78
  109. package/dist/core/package-threats.js.map +1 -1
  110. package/dist/core/process-manager.d.ts +54 -12
  111. package/dist/core/process-manager.js +233 -56
  112. package/dist/core/process-manager.js.map +1 -1
  113. package/dist/core/prompt-commands.js +1 -0
  114. package/dist/core/prompt-commands.js.map +1 -1
  115. package/dist/core/resolve-start.d.ts +2 -0
  116. package/dist/core/resolve-start.js +34 -5
  117. package/dist/core/resolve-start.js.map +1 -1
  118. package/dist/core/session-manager.d.ts +3 -1
  119. package/dist/core/session-manager.js +2 -1
  120. package/dist/core/session-manager.js.map +1 -1
  121. package/dist/core/settings-manager.d.ts +1 -0
  122. package/dist/core/settings-manager.js +4 -0
  123. package/dist/core/settings-manager.js.map +1 -1
  124. package/dist/core/shell-threats.d.ts +14 -1
  125. package/dist/core/shell-threats.js +73 -24
  126. package/dist/core/shell-threats.js.map +1 -1
  127. package/dist/core/skill-scan.d.ts +112 -0
  128. package/dist/core/skill-scan.js +781 -0
  129. package/dist/core/skill-scan.js.map +1 -0
  130. package/dist/core/skills.d.ts +33 -0
  131. package/dist/core/skills.js +87 -16
  132. package/dist/core/skills.js.map +1 -1
  133. package/dist/core/slash-commands.d.ts +5 -1
  134. package/dist/core/slash-commands.js +24 -9
  135. package/dist/core/slash-commands.js.map +1 -1
  136. package/dist/core/steering.d.ts +7 -0
  137. package/dist/core/steering.js +13 -0
  138. package/dist/core/steering.js.map +1 -1
  139. package/dist/core/style-packs/index.js +1 -1
  140. package/dist/core/style-packs/index.js.map +1 -1
  141. package/dist/core/style-packs/packs.js +2 -2
  142. package/dist/core/subagent-manager.js +5 -4
  143. package/dist/core/subagent-manager.js.map +1 -1
  144. package/dist/core/subagent-policy.js +4 -1
  145. package/dist/core/subagent-policy.js.map +1 -1
  146. package/dist/core/threat-feed.d.ts +65 -0
  147. package/dist/core/threat-feed.js +329 -0
  148. package/dist/core/threat-feed.js.map +1 -0
  149. package/dist/core/trophies/catalog-more.d.ts +2 -0
  150. package/dist/core/trophies/catalog-more.js +857 -0
  151. package/dist/core/trophies/catalog-more.js.map +1 -0
  152. package/dist/core/trophies/catalog.d.ts +4 -0
  153. package/dist/core/trophies/catalog.js +649 -0
  154. package/dist/core/trophies/catalog.js.map +1 -0
  155. package/dist/core/trophies/engine.d.ts +70 -0
  156. package/dist/core/trophies/engine.js +351 -0
  157. package/dist/core/trophies/engine.js.map +1 -0
  158. package/dist/core/trophies/store.d.ts +17 -0
  159. package/dist/core/trophies/store.js +113 -0
  160. package/dist/core/trophies/store.js.map +1 -0
  161. package/dist/core/trophies/types.d.ts +119 -0
  162. package/dist/core/trophies/types.js +78 -0
  163. package/dist/core/trophies/types.js.map +1 -0
  164. package/dist/core/verification-evidence.d.ts +10 -6
  165. package/dist/core/verification-evidence.js +190 -11
  166. package/dist/core/verification-evidence.js.map +1 -1
  167. package/dist/goals-agent/goals-agent.js +46 -3
  168. package/dist/goals-agent/goals-agent.js.map +1 -1
  169. package/dist/interactive.js +16 -5
  170. package/dist/interactive.js.map +1 -1
  171. package/dist/modes/acp-goals.d.ts +6 -2
  172. package/dist/modes/acp-goals.js +1 -2
  173. package/dist/modes/acp-goals.js.map +1 -1
  174. package/dist/modes/acp-mode.js +14 -3
  175. package/dist/modes/acp-mode.js.map +1 -1
  176. package/dist/modes/agent-home-mode.js +13 -1
  177. package/dist/modes/agent-home-mode.js.map +1 -1
  178. package/dist/modes/rpc-mode.d.ts +2 -1
  179. package/dist/modes/rpc-mode.js +15 -3
  180. package/dist/modes/rpc-mode.js.map +1 -1
  181. package/dist/modes/serve-mode.js +13 -1
  182. package/dist/modes/serve-mode.js.map +1 -1
  183. package/dist/system-prompt.d.ts +1 -0
  184. package/dist/system-prompt.js +12 -8
  185. package/dist/system-prompt.js.map +1 -1
  186. package/dist/test-support/slow-git.d.ts +1 -0
  187. package/dist/test-support/slow-git.js +21 -0
  188. package/dist/test-support/slow-git.js.map +1 -0
  189. package/dist/tools/background-watch-lint.d.ts +18 -0
  190. package/dist/tools/background-watch-lint.js +102 -0
  191. package/dist/tools/background-watch-lint.js.map +1 -0
  192. package/dist/tools/bash.d.ts +15 -4
  193. package/dist/tools/bash.js +72 -47
  194. package/dist/tools/bash.js.map +1 -1
  195. package/dist/tools/checklist.d.ts +3 -3
  196. package/dist/tools/compress.js +45 -0
  197. package/dist/tools/compress.js.map +1 -1
  198. package/dist/tools/edit.js +5 -0
  199. package/dist/tools/edit.js.map +1 -1
  200. package/dist/tools/generate-image.d.ts +29 -6
  201. package/dist/tools/generate-image.js +325 -151
  202. package/dist/tools/generate-image.js.map +1 -1
  203. package/dist/tools/grep.d.ts +14 -0
  204. package/dist/tools/grep.js +36 -2
  205. package/dist/tools/grep.js.map +1 -1
  206. package/dist/tools/index.d.ts +5 -1
  207. package/dist/tools/index.js +7 -4
  208. package/dist/tools/index.js.map +1 -1
  209. package/dist/tools/skill.d.ts +2 -2
  210. package/dist/tools/skill.js +8 -1
  211. package/dist/tools/skill.js.map +1 -1
  212. package/dist/tools/subagent-shared.js +4 -1
  213. package/dist/tools/subagent-shared.js.map +1 -1
  214. package/dist/tools/task-output.js +11 -1
  215. package/dist/tools/task-output.js.map +1 -1
  216. package/dist/tools/write.js +8 -0
  217. package/dist/tools/write.js.map +1 -1
  218. package/dist/ui/components/Footer.js +4 -0
  219. package/dist/ui/components/Footer.js.map +1 -1
  220. package/dist/ui/components/ModelSelector.d.ts +10 -0
  221. package/dist/ui/components/ModelSelector.js +51 -5
  222. package/dist/ui/components/ModelSelector.js.map +1 -1
  223. package/dist/ui/components/ToolExecution.js +2 -2
  224. package/dist/ui/components/ToolExecution.js.map +1 -1
  225. package/dist/ui/mcp.d.ts +2 -0
  226. package/dist/ui/mcp.js.map +1 -1
  227. package/dist/ui/terminal-history.js +2 -1
  228. package/dist/ui/terminal-history.js.map +1 -1
  229. package/dist/ui/tool-line-summary.js +3 -1
  230. package/dist/ui/tool-line-summary.js.map +1 -1
  231. package/dist/utils/git-overview.d.ts +41 -0
  232. package/dist/utils/git-overview.js +146 -0
  233. package/dist/utils/git-overview.js.map +1 -0
  234. package/dist/utils/git.d.ts +12 -3
  235. package/dist/utils/git.js +21 -8
  236. package/dist/utils/git.js.map +1 -1
  237. package/dist/utils/image.d.ts +14 -0
  238. package/dist/utils/image.js +23 -0
  239. package/dist/utils/image.js.map +1 -1
  240. package/package.json +4 -4
@@ -0,0 +1,32 @@
1
+ /** How often a held marker is re-stamped. */
2
+ export declare const GOAL_RUN_HEARTBEAT_MS = 15000;
3
+ /** A marker not re-stamped for this long belongs to a run that is gone. */
4
+ export declare const GOAL_RUN_STALE_MS = 60000;
5
+ /** What the file holds. */
6
+ export interface GoalRunMarker {
7
+ version: 1;
8
+ pid: number;
9
+ /** Distinguishes two holds by the same pid across a restart of the process. */
10
+ token: string;
11
+ startedAt: string;
12
+ heartbeatAt: string;
13
+ }
14
+ export declare function goalRunMarkerPath(dir: string): string;
15
+ /** Whether a marker stands for a run still going. Pure, so it can be tested. */
16
+ export declare function goalRunMarkerLive(marker: GoalRunMarker, now: number, isAlive?: (pid: number) => boolean): boolean;
17
+ /** The marker in a goal folder, or null when there is none or it can't be read. */
18
+ export declare function readGoalRunMarker(dir: string): GoalRunMarker | null;
19
+ /** Some process (this one included) is running the goal right now. */
20
+ export declare function goalRunLive(dir: string, now?: number): boolean;
21
+ /**
22
+ * Another process is running the goal right now. What the resume checks ask:
23
+ * this process's own run is already known to them, and must not stop it
24
+ * resuming a goal it was itself cut off from.
25
+ */
26
+ export declare function goalRunningElsewhere(dir: string, now?: number): boolean;
27
+ /**
28
+ * Mark a goal as being worked on by this process until the returned release
29
+ * is called. Holds nest: two sessions on one goal (two windows) keep the
30
+ * marker until both let go. Releasing twice is harmless.
31
+ */
32
+ export declare function holdGoalRun(goalDir: string, now?: () => Date): () => void;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Whether a goal is being worked on right now, by any process on this machine.
3
+ *
4
+ * A goal can be run by the desktop app's sidecar, by `ezcoder acp` (pew2 on
5
+ * the phone spawns that), or by both over a day. Each knows only its own
6
+ * sessions, so a goal another process was in the middle of read as cut off
7
+ * mid-work: its session file ends on a tool call. The goal list said
8
+ * "Interrupted" for a goal that was running, and opening it offered to resume
9
+ * it, which would start a second coordinator on the same goal.
10
+ *
11
+ * So the process running a goal says so, in a small file in the goal's
12
+ * `.gg` folder: its pid and a heartbeat. A reader counts it only while that
13
+ * pid is alive *and* the heartbeat is fresh. A crash leaves the file behind,
14
+ * and the heartbeat going stale (or the pid being gone) is what lets the goal
15
+ * read as interrupted again; the freshness check also stops a recycled pid
16
+ * from passing as the old run.
17
+ */
18
+ import fs from "node:fs";
19
+ import path from "node:path";
20
+ import { randomUUID } from "node:crypto";
21
+ /** How often a held marker is re-stamped. */
22
+ export const GOAL_RUN_HEARTBEAT_MS = 15_000;
23
+ /** A marker not re-stamped for this long belongs to a run that is gone. */
24
+ export const GOAL_RUN_STALE_MS = 60_000;
25
+ export function goalRunMarkerPath(dir) {
26
+ return path.join(dir, ".ezcoder", "goal-running.json");
27
+ }
28
+ /** True when a process with this pid exists (EPERM: it exists, it's just not ours). */
29
+ function processAlive(pid) {
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ }
34
+ catch (err) {
35
+ return err.code === "EPERM";
36
+ }
37
+ }
38
+ /** Whether a marker stands for a run still going. Pure, so it can be tested. */
39
+ export function goalRunMarkerLive(marker, now, isAlive = processAlive) {
40
+ const beat = Date.parse(marker.heartbeatAt);
41
+ if (!Number.isFinite(beat) || now - beat > GOAL_RUN_STALE_MS)
42
+ return false;
43
+ return isAlive(marker.pid);
44
+ }
45
+ /** The marker in a goal folder, or null when there is none or it can't be read. */
46
+ export function readGoalRunMarker(dir) {
47
+ let raw;
48
+ try {
49
+ raw = fs.readFileSync(goalRunMarkerPath(dir), "utf-8");
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ try {
55
+ const value = JSON.parse(raw);
56
+ if (value.version !== 1 ||
57
+ typeof value.pid !== "number" ||
58
+ !Number.isInteger(value.pid) ||
59
+ value.pid <= 0 ||
60
+ typeof value.token !== "string" ||
61
+ typeof value.startedAt !== "string" ||
62
+ typeof value.heartbeatAt !== "string") {
63
+ return null;
64
+ }
65
+ return value;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /** Some process (this one included) is running the goal right now. */
72
+ export function goalRunLive(dir, now = Date.now()) {
73
+ const marker = readGoalRunMarker(dir);
74
+ return marker !== null && goalRunMarkerLive(marker, now);
75
+ }
76
+ /**
77
+ * Another process is running the goal right now. What the resume checks ask:
78
+ * this process's own run is already known to them, and must not stop it
79
+ * resuming a goal it was itself cut off from.
80
+ */
81
+ export function goalRunningElsewhere(dir, now = Date.now()) {
82
+ const marker = readGoalRunMarker(dir);
83
+ return marker !== null && marker.pid !== process.pid && goalRunMarkerLive(marker, now);
84
+ }
85
+ /** Live holds in this process, by resolved goal folder. */
86
+ const holds = new Map();
87
+ let exitHookInstalled = false;
88
+ /** Written beside the target and renamed, so a reader never sees half a file. */
89
+ function writeMarker(dir, marker) {
90
+ const file = goalRunMarkerPath(dir);
91
+ try {
92
+ fs.mkdirSync(path.dirname(file), { recursive: true });
93
+ const tmp = `${file}.${process.pid}.tmp`;
94
+ fs.writeFileSync(tmp, JSON.stringify(marker));
95
+ fs.renameSync(tmp, file);
96
+ }
97
+ catch {
98
+ // Best effort: without the file the goal just isn't shown as running
99
+ // elsewhere, exactly as before the marker existed. Never fail a run on it.
100
+ }
101
+ }
102
+ /** Removes the file only while it is still this hold's: another process may have taken over. */
103
+ function removeMarker(dir, marker) {
104
+ const current = readGoalRunMarker(dir);
105
+ if (!current || current.pid !== marker.pid || current.token !== marker.token)
106
+ return;
107
+ try {
108
+ fs.unlinkSync(goalRunMarkerPath(dir));
109
+ }
110
+ catch {
111
+ // Already gone.
112
+ }
113
+ }
114
+ function installExitHook() {
115
+ if (exitHookInstalled)
116
+ return;
117
+ exitHookInstalled = true;
118
+ // A clean exit (quit, a supervisor restart) clears its markers at once
119
+ // instead of leaving the goal "running" until the heartbeat goes stale.
120
+ process.once("exit", () => {
121
+ for (const [dir, hold] of holds) {
122
+ clearInterval(hold.timer);
123
+ removeMarker(dir, hold.marker);
124
+ }
125
+ holds.clear();
126
+ });
127
+ }
128
+ /**
129
+ * Mark a goal as being worked on by this process until the returned release
130
+ * is called. Holds nest: two sessions on one goal (two windows) keep the
131
+ * marker until both let go. Releasing twice is harmless.
132
+ */
133
+ export function holdGoalRun(goalDir, now = () => new Date()) {
134
+ const dir = path.resolve(goalDir);
135
+ let hold = holds.get(dir);
136
+ if (hold) {
137
+ hold.count++;
138
+ }
139
+ else {
140
+ const at = now().toISOString();
141
+ const marker = {
142
+ version: 1,
143
+ pid: process.pid,
144
+ token: randomUUID(),
145
+ startedAt: at,
146
+ heartbeatAt: at,
147
+ };
148
+ writeMarker(dir, marker);
149
+ const timer = setInterval(() => {
150
+ const current = holds.get(dir);
151
+ if (!current)
152
+ return;
153
+ current.marker = { ...current.marker, heartbeatAt: now().toISOString() };
154
+ writeMarker(dir, current.marker);
155
+ }, GOAL_RUN_HEARTBEAT_MS);
156
+ // Never what keeps a process alive.
157
+ timer.unref?.();
158
+ hold = { count: 1, marker, timer };
159
+ holds.set(dir, hold);
160
+ installExitHook();
161
+ }
162
+ let released = false;
163
+ return () => {
164
+ if (released)
165
+ return;
166
+ released = true;
167
+ const current = holds.get(dir);
168
+ if (!current)
169
+ return;
170
+ current.count--;
171
+ if (current.count > 0)
172
+ return;
173
+ clearInterval(current.timer);
174
+ holds.delete(dir);
175
+ removeMarker(dir, current.marker);
176
+ };
177
+ }
178
+ //# sourceMappingURL=goal-run-marker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-run-marker.js","sourceRoot":"","sources":["../../src/core/goal-run-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAYxC,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;AACzD,CAAC;AAED,uFAAuF;AACvF,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC;IACzD,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,GAAW,EACX,UAAoC,YAAY;IAEhD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACxD,IACE,KAAK,CAAC,OAAO,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;YAC7B,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;YAC5B,KAAK,CAAC,GAAG,IAAI,CAAC;YACd,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;YACnC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAsB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAChE,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACzF,CAAC;AAQD,2DAA2D;AAC3D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;AACtC,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B,iFAAiF;AACjF,SAAS,WAAW,CAAC,GAAW,EAAE,MAAqB;IACrD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,2EAA2E;IAC7E,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,SAAS,YAAY,CAAC,GAAW,EAAE,MAAqB;IACtD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;QAAE,OAAO;IACrF,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,iBAAiB;QAAE,OAAO;IAC9B,iBAAiB,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,wEAAwE;IACxE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,UAAU,EAAE;YACnB,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACzE,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1B,oCAAoC;QACpC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrB,eAAe,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC;YAAE,OAAO;QAC9B,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
7
  import { goalWasInterrupted } from "./goals-store.js";
8
+ import { goalRunLive } from "./goal-run-marker.js";
8
9
  import { formatRelativeTime } from "./project-discovery.js";
9
10
  /** The kickoff/resume instruction is runtime-authored and never shown as a user bubble. */
10
11
  export const GOAL_RUNTIME_PROVENANCE = {
@@ -81,6 +82,11 @@ export async function summarizeGoal(sessions, dir, record, busy = false) {
81
82
  if (ms > lastActiveMs)
82
83
  lastActiveMs = ms;
83
84
  }
85
+ // `busy` only knows this process's sessions. A goal another process is
86
+ // running (the phone through `ezcoder acp`, or the desktop app while the
87
+ // phone asks) says so through its run marker; without it, a session file
88
+ // ending on a tool call read as "Interrupted" while the goal was working.
89
+ const live = busy || goalRunLive(dir);
84
90
  return {
85
91
  id: record.id,
86
92
  name: record.name,
@@ -92,10 +98,10 @@ export async function summarizeGoal(sessions, dir, record, busy = false) {
92
98
  lastActiveDisplay: formatRelativeTime(lastActiveMs),
93
99
  latestSessionPath,
94
100
  latestSessionId,
95
- status: goalListStatus(record, busy,
101
+ status: goalListStatus(record, live,
96
102
  // Not working, but its last turn never finished: the app closed, or it
97
103
  // was stopped, mid-work. Workers aren't known here, only the session.
98
- !busy &&
104
+ !live &&
99
105
  Boolean(record.startedAt) &&
100
106
  latestSessionPath !== null &&
101
107
  goalWasInterrupted(record, await lastMessages(latestSessionPath), [])),
@@ -1 +1 @@
1
- {"version":3,"file":"goal-summary.js","sourceRoot":"","sources":["../../src/core/goal-summary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-summary.js","sourceRoot":"","sources":["../../src/core/goal-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Wake an idle session when its own background work needs attention.
3
+ *
4
+ * Background alerts — a build or CI watcher that failed, a task that exited
5
+ * non-zero, a child agent that finished — ride the steering path, which only
6
+ * exists while a run is live. Once the agent has ended its turn, an alert sat
7
+ * in the queue until the user happened to send another message (measured: 8 of
8
+ * 483 runs began with a status update that had been waiting for exactly that).
9
+ *
10
+ * This starts a run for the alert instead, inside hard limits:
11
+ *
12
+ * - Never while anything else could deliver it: a live run, a run being
13
+ * claimed, an autopilot cycle. The alert waits for that run's next steering
14
+ * boundary instead, and is retried here if the run ends without draining it.
15
+ * - Never while the user is deciding something (a plan awaiting review).
16
+ * - Never after the user pressed Stop, until they send another message. Stop
17
+ * means "stop acting on your own", and a background exit is not a reason to
18
+ * override it.
19
+ * - At most {@link DEFAULT_MAX_WAKES_PER_PROMPT} wakes per user message, so a
20
+ * flapping task cannot keep the agent (and the bill) running unattended.
21
+ *
22
+ * Pure policy over injected callbacks; the host owns the run itself.
23
+ */
24
+ /** Batch alerts that land together (a failure line, then the exit) into one run. */
25
+ export declare const DEFAULT_IDLE_WAKE_DEBOUNCE_MS = 2000;
26
+ /** Unattended wakes allowed per human prompt. */
27
+ export declare const DEFAULT_MAX_WAKES_PER_PROMPT = 2;
28
+ export type IdleWakeSkip = "stopped" | "budget" | "blocked" | "nothing-pending";
29
+ export interface IdleWakeDeps {
30
+ /** A run, a run claim, or an autopilot cycle is live and will deliver it. */
31
+ isBusy: () => boolean;
32
+ /** The user is deciding something (a plan awaiting review). */
33
+ isBlocked: () => boolean;
34
+ /** An urgent alert is still waiting to be delivered. */
35
+ hasPendingAlert: () => boolean;
36
+ /** Monotonic count of human prompts; budgets and Stop reset when it moves. */
37
+ humanPromptSeq: () => number;
38
+ /** Start the wake run; resolves when it has settled. */
39
+ start: () => Promise<void>;
40
+ /** Observability hook for skipped wakes. */
41
+ onSkip?: (reason: IdleWakeSkip) => void;
42
+ debounceMs?: number;
43
+ maxWakesPerPrompt?: number;
44
+ }
45
+ export declare class IdleWakeController {
46
+ private readonly deps;
47
+ private timer;
48
+ private budgetSeq;
49
+ private wakesUsed;
50
+ private stoppedAtSeq;
51
+ private starting;
52
+ private disposed;
53
+ constructor(deps: IdleWakeDeps);
54
+ /** An urgent alert was queued. Debounced; safe to call often. */
55
+ trigger(): void;
56
+ /** The user pressed Stop: no unattended wakes until their next message. */
57
+ noteStop(): void;
58
+ dispose(): void;
59
+ private cancelTimer;
60
+ private fire;
61
+ private skip;
62
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Wake an idle session when its own background work needs attention.
3
+ *
4
+ * Background alerts — a build or CI watcher that failed, a task that exited
5
+ * non-zero, a child agent that finished — ride the steering path, which only
6
+ * exists while a run is live. Once the agent has ended its turn, an alert sat
7
+ * in the queue until the user happened to send another message (measured: 8 of
8
+ * 483 runs began with a status update that had been waiting for exactly that).
9
+ *
10
+ * This starts a run for the alert instead, inside hard limits:
11
+ *
12
+ * - Never while anything else could deliver it: a live run, a run being
13
+ * claimed, an autopilot cycle. The alert waits for that run's next steering
14
+ * boundary instead, and is retried here if the run ends without draining it.
15
+ * - Never while the user is deciding something (a plan awaiting review).
16
+ * - Never after the user pressed Stop, until they send another message. Stop
17
+ * means "stop acting on your own", and a background exit is not a reason to
18
+ * override it.
19
+ * - At most {@link DEFAULT_MAX_WAKES_PER_PROMPT} wakes per user message, so a
20
+ * flapping task cannot keep the agent (and the bill) running unattended.
21
+ *
22
+ * Pure policy over injected callbacks; the host owns the run itself.
23
+ */
24
+ /** Batch alerts that land together (a failure line, then the exit) into one run. */
25
+ export const DEFAULT_IDLE_WAKE_DEBOUNCE_MS = 2_000;
26
+ /** Unattended wakes allowed per human prompt. */
27
+ export const DEFAULT_MAX_WAKES_PER_PROMPT = 2;
28
+ export class IdleWakeController {
29
+ deps;
30
+ timer = null;
31
+ budgetSeq = -1;
32
+ wakesUsed = 0;
33
+ stoppedAtSeq = null;
34
+ starting = false;
35
+ disposed = false;
36
+ constructor(deps) {
37
+ this.deps = deps;
38
+ }
39
+ /** An urgent alert was queued. Debounced; safe to call often. */
40
+ trigger() {
41
+ if (this.disposed || this.timer !== null)
42
+ return;
43
+ this.timer = setTimeout(() => {
44
+ this.timer = null;
45
+ void this.fire();
46
+ }, this.deps.debounceMs ?? DEFAULT_IDLE_WAKE_DEBOUNCE_MS);
47
+ this.timer.unref?.();
48
+ }
49
+ /** The user pressed Stop: no unattended wakes until their next message. */
50
+ noteStop() {
51
+ this.stoppedAtSeq = this.deps.humanPromptSeq();
52
+ this.cancelTimer();
53
+ }
54
+ dispose() {
55
+ this.disposed = true;
56
+ this.cancelTimer();
57
+ }
58
+ cancelTimer() {
59
+ if (this.timer !== null)
60
+ clearTimeout(this.timer);
61
+ this.timer = null;
62
+ }
63
+ async fire() {
64
+ if (this.disposed || this.starting)
65
+ return;
66
+ if (!this.deps.hasPendingAlert())
67
+ return this.skip("nothing-pending");
68
+ const seq = this.deps.humanPromptSeq();
69
+ if (this.stoppedAtSeq === seq)
70
+ return this.skip("stopped");
71
+ if (seq !== this.budgetSeq) {
72
+ this.budgetSeq = seq;
73
+ this.wakesUsed = 0;
74
+ }
75
+ if (this.wakesUsed >= (this.deps.maxWakesPerPrompt ?? DEFAULT_MAX_WAKES_PER_PROMPT)) {
76
+ return this.skip("budget");
77
+ }
78
+ if (this.deps.isBusy()) {
79
+ // The live run should drain it at its next steering boundary. If that
80
+ // run is already past its last boundary, the alert would strand — so
81
+ // look again shortly rather than trusting the run to have taken it.
82
+ this.trigger();
83
+ return;
84
+ }
85
+ if (this.deps.isBlocked())
86
+ return this.skip("blocked");
87
+ this.wakesUsed += 1;
88
+ this.starting = true;
89
+ try {
90
+ await this.deps.start();
91
+ }
92
+ finally {
93
+ this.starting = false;
94
+ }
95
+ // An alert that landed after the wake run's last steering boundary.
96
+ if (this.deps.hasPendingAlert())
97
+ this.trigger();
98
+ }
99
+ skip(reason) {
100
+ this.deps.onSkip?.(reason);
101
+ }
102
+ }
103
+ //# sourceMappingURL=idle-wake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-wake.js","sourceRoot":"","sources":["../../src/core/idle-wake.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ export declare function normalizeForDetection(text: string): string;
27
27
  /** Scan untrusted text; `null` when nothing instruction-like was found. */
28
28
  export declare function detectInjection(text: string): InjectionHit | null;
29
29
  /** Tools whose output is attacker-controllable content from outside the repo. */
30
- export declare function isUntrustedTool(name: string): boolean;
30
+ export declare function isUntrustedTool(name: string, args?: Record<string, unknown>): boolean;
31
31
  export declare function injectionWarning(kind: string): string;
32
32
  /**
33
33
  * `transformToolResult` hook body: for untrusted tools, append the warning
@@ -35,4 +35,5 @@ export declare function injectionWarning(kind: string): string;
35
35
  */
36
36
  export declare function flagUntrustedToolResult(call: {
37
37
  name: string;
38
+ args?: Record<string, unknown>;
38
39
  }, content: ToolResultContent): ToolResultContent;
@@ -15,7 +15,7 @@
15
15
  * attacker would use. Mere mentions of the topic ("prompt injection",
16
16
  * "system prompt") do not hit.
17
17
  */
18
- const SCAN_WINDOW = 200_000;
18
+ const SCAN_WINDOW = 100_000;
19
19
  const MAX_BLOBS = 64;
20
20
  const MAX_BLOB_CHARS = 16_384;
21
21
  /** Zero-width, joiners, bidi controls/isolates, soft hyphen, BOM, tag chars. */
@@ -146,7 +146,7 @@ const RULES = [
146
146
  kind: "fake role/tool marker",
147
147
  re: new RegExp(String.raw `<\|im_start\|>\s*(?:system|assistant)|<\|(?:start_header_id|eot_id|endoftext|system)\|>` +
148
148
  String.raw `|</?(?:tool_result|function_results|function_calls|system-reminder|system_prompt)>` +
149
- String.raw `|(?:^|\n)[ \t]*\[(?:system|/?inst)\][ \t]*(?:\n|$|[a-z])`),
149
+ String.raw `|(?:^|\n)[ \t]*\[(?:system|/?inst)\][ \t]*\r?(?:\n|$|[a-z])`),
150
150
  },
151
151
  ];
152
152
  /** Encoded blobs: long base64 or hex runs. */
@@ -205,8 +205,17 @@ export function detectInjection(text) {
205
205
  }
206
206
  return scanBlobs(window.replace(INVISIBLE, ""));
207
207
  }
208
+ /**
209
+ * Bash commands whose output is third-party text: issue/PR bodies and
210
+ * comments (`gh`, `glab`) and fetched web pages (`curl`/`wget`).
211
+ */
212
+ const UNTRUSTED_BASH = /(?:^|[\s;&|(])(?:gh\s+(?:issue\s+(?:view|list)|pr\s+(?:view|diff|list)|api|release\s+view|search)\b|glab\s|curl\s|wget\s)/;
208
213
  /** Tools whose output is attacker-controllable content from outside the repo. */
209
- export function isUntrustedTool(name) {
214
+ export function isUntrustedTool(name, args) {
215
+ if (name === "bash") {
216
+ const command = args?.command;
217
+ return typeof command === "string" && UNTRUSTED_BASH.test(command);
218
+ }
210
219
  return name === "web_fetch" || name === "web_search" || name.startsWith("mcp__");
211
220
  }
212
221
  export function injectionWarning(kind) {
@@ -217,7 +226,7 @@ export function injectionWarning(kind) {
217
226
  * line on a hit. Content is never altered otherwise.
218
227
  */
219
228
  export function flagUntrustedToolResult(call, content) {
220
- if (!isUntrustedTool(call.name))
229
+ if (!isUntrustedTool(call.name, call.args))
221
230
  return content;
222
231
  if (typeof content === "string") {
223
232
  const hit = detectInjection(content);
@@ -1 +1 @@
1
- {"version":3,"file":"injection-detect.js","sourceRoot":"","sources":["../../src/core/injection-detect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"injection-detect.js","sourceRoot":"","sources":["../../src/core/injection-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { BlockedPackage } from "./shell-threats.js";
2
+ import { type PackageCheckOptions } from "./package-threats.js";
3
+ export interface InstalledThreat {
4
+ /** Stable id: lockfile path + flagged items (a fix or new hit is a new key). */
5
+ key: string;
6
+ /** Absolute lockfile path. */
7
+ file: string;
8
+ /** Flagged `name@version (IDs)` items. */
9
+ packages: string[];
10
+ /** The same, structured, for the project's "don't install" list. */
11
+ blocked: BlockedPackage[];
12
+ /** One plain line for the user. */
13
+ message: string;
14
+ /** What the agent is told to do. */
15
+ agentText: string;
16
+ }
17
+ /** Lockfile path → mtime, for "did a run change a lockfile?" checks. */
18
+ export type LockfileStamp = Map<string, number>;
19
+ /** Which known lockfiles exist in `dir`, with their mtimes. Missing ones are skipped. */
20
+ export declare function stampProjectLockfiles(dir: string): Promise<LockfileStamp>;
21
+ export declare function sameStamp(a: LockfileStamp, b: LockfileStamp): boolean;
22
+ /** Check every known lockfile in `dir`. Clean or nothing to check → []. */
23
+ export declare function scanProjectLockfiles(dir: string, options?: PackageCheckOptions): Promise<InstalledThreat[]>;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Already-installed packages: check a project's existing lockfiles against the
3
+ * malware data (local daily feed + one batched OSV lookup per lockfile), so a
4
+ * package flagged AFTER it was installed is still found. Runs in the
5
+ * background (session start, after each daily feed update, after a run that
6
+ * changed a lockfile); never on a command's critical path, never a prompt.
7
+ *
8
+ * Cost: one `stat` per known lockfile name; a lockfile is only read when it
9
+ * exists, and its verdict is cached by content hash and re-asked of OSV at most
10
+ * once a day (core/package-threats.ts).
11
+ */
12
+ import fsp from "node:fs/promises";
13
+ import path from "node:path";
14
+ import { checkLockfileMalware, PROJECT_LOCKFILES, } from "./package-threats.js";
15
+ /** Which known lockfiles exist in `dir`, with their mtimes. Missing ones are skipped. */
16
+ export async function stampProjectLockfiles(dir) {
17
+ const stamp = new Map();
18
+ await Promise.all(PROJECT_LOCKFILES.map(async (lock) => {
19
+ const file = path.join(dir, lock.file);
20
+ try {
21
+ const st = await fsp.stat(file);
22
+ if (st.isFile())
23
+ stamp.set(file, st.mtimeMs);
24
+ }
25
+ catch {
26
+ // Not there: nothing to check.
27
+ }
28
+ }));
29
+ return stamp;
30
+ }
31
+ export function sameStamp(a, b) {
32
+ if (a.size !== b.size)
33
+ return false;
34
+ for (const [file, mtime] of a)
35
+ if (b.get(file) !== mtime)
36
+ return false;
37
+ return true;
38
+ }
39
+ function describe(file, dir, packages, blocked) {
40
+ const rel = path.relative(dir, file) || path.basename(file);
41
+ const list = packages.slice(0, 5).join(", ") +
42
+ (packages.length > 5 ? ` and ${packages.length - 5} more` : "");
43
+ return {
44
+ key: `${file}\0${[...packages].sort().join("\0")}`,
45
+ file,
46
+ packages,
47
+ blocked,
48
+ message: `This project uses a package now known to be infected: ${list} (in ${rel}). ` +
49
+ `The agent has been told to replace it.`,
50
+ agentText: `Security notice: ${rel} in this project pins a package that is now known to be malware: ${list}. ` +
51
+ `Before running any of the project's code, replace it: update the dependency to a clean version ` +
52
+ `(the release before the flagged one, or a newer fixed one), regenerate the lockfile and reinstall. ` +
53
+ `Then tell the user in one plain sentence what you changed. Do not run the flagged version.`,
54
+ };
55
+ }
56
+ /** Check every known lockfile in `dir`. Clean or nothing to check → []. */
57
+ export async function scanProjectLockfiles(dir, options = {}) {
58
+ const stamp = await stampProjectLockfiles(dir);
59
+ if (stamp.size === 0)
60
+ return [];
61
+ const found = await Promise.all(PROJECT_LOCKFILES.filter((lock) => stamp.has(path.join(dir, lock.file))).map(async (lock) => {
62
+ const threats = await checkLockfileMalware(lock, dir, options);
63
+ const packages = threats.flatMap((t) => t.packages ?? []);
64
+ const blocked = threats.flatMap((t) => t.blocked ?? []);
65
+ return packages.length > 0
66
+ ? describe(path.join(dir, lock.file), dir, packages, blocked)
67
+ : null;
68
+ }));
69
+ return found.filter((t) => t !== null);
70
+ }
71
+ //# sourceMappingURL=installed-threats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-threats.js","sourceRoot":"","sources":["../../src/core/installed-threats.ts"],"names":[],"mappings":"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"}