@prestyj/cli 5.32.0 → 5.32.2

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 (230) 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 +8 -0
  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.js +43 -3
  27. package/dist/app-sidecar/run-control-routes.js.map +1 -1
  28. package/dist/app-sidecar/session-routes.js +10 -0
  29. package/dist/app-sidecar/session-routes.js.map +1 -1
  30. package/dist/app-sidecar/task-routes.js +2 -0
  31. package/dist/app-sidecar/task-routes.js.map +1 -1
  32. package/dist/app-sidecar/trophy-manager.d.ts +15 -0
  33. package/dist/app-sidecar/trophy-manager.js +71 -0
  34. package/dist/app-sidecar/trophy-manager.js.map +1 -0
  35. package/dist/app-sidecar/workspace-routes.js +1 -0
  36. package/dist/app-sidecar/workspace-routes.js.map +1 -1
  37. package/dist/app-sidecar.js +157 -30
  38. package/dist/app-sidecar.js.map +1 -1
  39. package/dist/cli/auth.js +22 -1
  40. package/dist/cli/auth.js.map +1 -1
  41. package/dist/cli/mcp.js +6 -1
  42. package/dist/cli/mcp.js.map +1 -1
  43. package/dist/cli.js +13 -9
  44. package/dist/cli.js.map +1 -1
  45. package/dist/config.js +4 -2
  46. package/dist/config.js.map +1 -1
  47. package/dist/core/action-threats.d.ts +68 -0
  48. package/dist/core/action-threats.js +894 -0
  49. package/dist/core/action-threats.js.map +1 -0
  50. package/dist/core/agent-notifications.d.ts +18 -0
  51. package/dist/core/agent-notifications.js +35 -2
  52. package/dist/core/agent-notifications.js.map +1 -1
  53. package/dist/core/agent-session/verification-tracker.d.ts +21 -0
  54. package/dist/core/agent-session/verification-tracker.js +39 -1
  55. package/dist/core/agent-session/verification-tracker.js.map +1 -1
  56. package/dist/core/agent-session.d.ts +168 -2
  57. package/dist/core/agent-session.js +486 -23
  58. package/dist/core/agent-session.js.map +1 -1
  59. package/dist/core/blocked-packages-file.d.ts +33 -0
  60. package/dist/core/blocked-packages-file.js +274 -0
  61. package/dist/core/blocked-packages-file.js.map +1 -0
  62. package/dist/core/compaction/policy.d.ts +2 -2
  63. package/dist/core/compaction/policy.js +86 -43
  64. package/dist/core/compaction/policy.js.map +1 -1
  65. package/dist/core/compaction/token-estimator.d.ts +4 -1
  66. package/dist/core/compaction/token-estimator.js +5 -2
  67. package/dist/core/compaction/token-estimator.js.map +1 -1
  68. package/dist/core/event-bus.d.ts +10 -0
  69. package/dist/core/event-bus.js +2 -0
  70. package/dist/core/event-bus.js.map +1 -1
  71. package/dist/core/idle-wake.d.ts +62 -0
  72. package/dist/core/idle-wake.js +103 -0
  73. package/dist/core/idle-wake.js.map +1 -0
  74. package/dist/core/injection-detect.d.ts +2 -1
  75. package/dist/core/injection-detect.js +13 -4
  76. package/dist/core/injection-detect.js.map +1 -1
  77. package/dist/core/installed-threats.d.ts +23 -0
  78. package/dist/core/installed-threats.js +71 -0
  79. package/dist/core/installed-threats.js.map +1 -0
  80. package/dist/core/mcp/catalog-cache.d.ts +2 -0
  81. package/dist/core/mcp/catalog-cache.js +4 -0
  82. package/dist/core/mcp/catalog-cache.js.map +1 -1
  83. package/dist/core/mcp/client.d.ts +8 -0
  84. package/dist/core/mcp/client.js +37 -3
  85. package/dist/core/mcp/client.js.map +1 -1
  86. package/dist/core/mcp/deferred-catalog.d.ts +12 -1
  87. package/dist/core/mcp/deferred-catalog.js +37 -10
  88. package/dist/core/mcp/deferred-catalog.js.map +1 -1
  89. package/dist/core/mcp/index.d.ts +2 -0
  90. package/dist/core/mcp/index.js +1 -0
  91. package/dist/core/mcp/index.js.map +1 -1
  92. package/dist/core/mcp/tool-guard.d.ts +58 -0
  93. package/dist/core/mcp/tool-guard.js +215 -0
  94. package/dist/core/mcp/tool-guard.js.map +1 -0
  95. package/dist/core/network-guard.d.ts +0 -20
  96. package/dist/core/network-guard.js +6 -0
  97. package/dist/core/network-guard.js.map +1 -1
  98. package/dist/core/package-cooldown.d.ts +71 -0
  99. package/dist/core/package-cooldown.js +301 -0
  100. package/dist/core/package-cooldown.js.map +1 -0
  101. package/dist/core/package-threats.d.ts +77 -3
  102. package/dist/core/package-threats.js +1250 -78
  103. package/dist/core/package-threats.js.map +1 -1
  104. package/dist/core/process-manager.d.ts +54 -12
  105. package/dist/core/process-manager.js +233 -56
  106. package/dist/core/process-manager.js.map +1 -1
  107. package/dist/core/project-files.d.ts +15 -0
  108. package/dist/core/project-files.js +37 -0
  109. package/dist/core/project-files.js.map +1 -0
  110. package/dist/core/prompt-commands.js +1 -0
  111. package/dist/core/prompt-commands.js.map +1 -1
  112. package/dist/core/session-manager.d.ts +3 -1
  113. package/dist/core/session-manager.js +2 -1
  114. package/dist/core/session-manager.js.map +1 -1
  115. package/dist/core/settings-manager.d.ts +1 -0
  116. package/dist/core/settings-manager.js +4 -0
  117. package/dist/core/settings-manager.js.map +1 -1
  118. package/dist/core/shell-threats.d.ts +14 -1
  119. package/dist/core/shell-threats.js +73 -24
  120. package/dist/core/shell-threats.js.map +1 -1
  121. package/dist/core/skill-scan.d.ts +112 -0
  122. package/dist/core/skill-scan.js +781 -0
  123. package/dist/core/skill-scan.js.map +1 -0
  124. package/dist/core/skills.d.ts +33 -0
  125. package/dist/core/skills.js +87 -16
  126. package/dist/core/skills.js.map +1 -1
  127. package/dist/core/slash-commands.d.ts +5 -1
  128. package/dist/core/slash-commands.js +24 -9
  129. package/dist/core/slash-commands.js.map +1 -1
  130. package/dist/core/steering.d.ts +7 -0
  131. package/dist/core/steering.js +13 -0
  132. package/dist/core/steering.js.map +1 -1
  133. package/dist/core/style-packs/index.js +1 -1
  134. package/dist/core/style-packs/index.js.map +1 -1
  135. package/dist/core/style-packs/packs.js +2 -2
  136. package/dist/core/subagent-manager.js +5 -4
  137. package/dist/core/subagent-manager.js.map +1 -1
  138. package/dist/core/threat-feed.d.ts +65 -0
  139. package/dist/core/threat-feed.js +335 -0
  140. package/dist/core/threat-feed.js.map +1 -0
  141. package/dist/core/trophies/catalog-more.d.ts +2 -0
  142. package/dist/core/trophies/catalog-more.js +857 -0
  143. package/dist/core/trophies/catalog-more.js.map +1 -0
  144. package/dist/core/trophies/catalog.d.ts +4 -0
  145. package/dist/core/trophies/catalog.js +649 -0
  146. package/dist/core/trophies/catalog.js.map +1 -0
  147. package/dist/core/trophies/engine.d.ts +70 -0
  148. package/dist/core/trophies/engine.js +351 -0
  149. package/dist/core/trophies/engine.js.map +1 -0
  150. package/dist/core/trophies/store.d.ts +17 -0
  151. package/dist/core/trophies/store.js +113 -0
  152. package/dist/core/trophies/store.js.map +1 -0
  153. package/dist/core/trophies/types.d.ts +119 -0
  154. package/dist/core/trophies/types.js +78 -0
  155. package/dist/core/trophies/types.js.map +1 -0
  156. package/dist/core/verification-evidence.d.ts +10 -6
  157. package/dist/core/verification-evidence.js +190 -11
  158. package/dist/core/verification-evidence.js.map +1 -1
  159. package/dist/goals-agent/goals-agent.js +3 -2
  160. package/dist/goals-agent/goals-agent.js.map +1 -1
  161. package/dist/interactive.js +16 -5
  162. package/dist/interactive.js.map +1 -1
  163. package/dist/modes/acp-mode.js +8 -1
  164. package/dist/modes/acp-mode.js.map +1 -1
  165. package/dist/modes/agent-home-mode.js +13 -1
  166. package/dist/modes/agent-home-mode.js.map +1 -1
  167. package/dist/modes/rpc-mode.d.ts +2 -1
  168. package/dist/modes/rpc-mode.js +15 -3
  169. package/dist/modes/rpc-mode.js.map +1 -1
  170. package/dist/modes/serve-mode.js +13 -1
  171. package/dist/modes/serve-mode.js.map +1 -1
  172. package/dist/system-prompt.d.ts +8 -0
  173. package/dist/system-prompt.js +34 -13
  174. package/dist/system-prompt.js.map +1 -1
  175. package/dist/test-support/slow-git.d.ts +1 -0
  176. package/dist/test-support/slow-git.js +21 -0
  177. package/dist/test-support/slow-git.js.map +1 -0
  178. package/dist/tools/background-watch-lint.d.ts +18 -0
  179. package/dist/tools/background-watch-lint.js +102 -0
  180. package/dist/tools/background-watch-lint.js.map +1 -0
  181. package/dist/tools/bash.d.ts +15 -4
  182. package/dist/tools/bash.js +75 -47
  183. package/dist/tools/bash.js.map +1 -1
  184. package/dist/tools/checklist.d.ts +3 -3
  185. package/dist/tools/compress.js +45 -0
  186. package/dist/tools/compress.js.map +1 -1
  187. package/dist/tools/edit.js +5 -0
  188. package/dist/tools/edit.js.map +1 -1
  189. package/dist/tools/generate-image.d.ts +29 -6
  190. package/dist/tools/generate-image.js +325 -151
  191. package/dist/tools/generate-image.js.map +1 -1
  192. package/dist/tools/grep.d.ts +14 -0
  193. package/dist/tools/grep.js +36 -2
  194. package/dist/tools/grep.js.map +1 -1
  195. package/dist/tools/index.d.ts +5 -1
  196. package/dist/tools/index.js +7 -4
  197. package/dist/tools/index.js.map +1 -1
  198. package/dist/tools/prompt-hints.d.ts +8 -1
  199. package/dist/tools/prompt-hints.js +22 -2
  200. package/dist/tools/prompt-hints.js.map +1 -1
  201. package/dist/tools/routine-output.d.ts +30 -0
  202. package/dist/tools/routine-output.js +203 -0
  203. package/dist/tools/routine-output.js.map +1 -0
  204. package/dist/tools/skill.d.ts +2 -2
  205. package/dist/tools/skill.js +8 -1
  206. package/dist/tools/skill.js.map +1 -1
  207. package/dist/tools/subagent-shared.js +4 -1
  208. package/dist/tools/subagent-shared.js.map +1 -1
  209. package/dist/tools/task-output.js +11 -1
  210. package/dist/tools/task-output.js.map +1 -1
  211. package/dist/tools/write.js +8 -0
  212. package/dist/tools/write.js.map +1 -1
  213. package/dist/ui/components/ModelSelector.d.ts +10 -0
  214. package/dist/ui/components/ModelSelector.js +51 -5
  215. package/dist/ui/components/ModelSelector.js.map +1 -1
  216. package/dist/ui/components/ToolExecution.js +2 -2
  217. package/dist/ui/components/ToolExecution.js.map +1 -1
  218. package/dist/ui/mcp.d.ts +2 -0
  219. package/dist/ui/mcp.js.map +1 -1
  220. package/dist/ui/terminal-history.js +2 -1
  221. package/dist/ui/terminal-history.js.map +1 -1
  222. package/dist/ui/tool-line-summary.js +3 -1
  223. package/dist/ui/tool-line-summary.js.map +1 -1
  224. package/dist/utils/git.d.ts +12 -3
  225. package/dist/utils/git.js +21 -8
  226. package/dist/utils/git.js.map +1 -1
  227. package/dist/utils/image.d.ts +14 -0
  228. package/dist/utils/image.js +23 -0
  229. package/dist/utils/image.js.map +1 -1
  230. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/core/trophies/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { type TrophyDelta, type TrophyFile, type TrophyProgressFacts, type TrophySnapshot } from "./types.js";
2
+ export declare const EMPTY_PROGRESS_FACTS: TrophyProgressFacts;
3
+ /** A date as local YYYY-MM-DD, the day-streak's unit. */
4
+ export declare function localTrophyDate(d: Date): string;
5
+ /** Add a delta to the file's counters and sets. Unknown keys are ignored. */
6
+ export declare function applyDelta(file: TrophyFile, delta: TrophyDelta): void;
7
+ /**
8
+ * Mark every trophy whose goal is now met. Returns the ids newly earned, in
9
+ * catalog order. Repeats until nothing changes, since earning trophies can
10
+ * earn the ones that count trophies.
11
+ */
12
+ export declare function evaluateTrophies(file: TrophyFile, facts: TrophyProgressFacts, now: Date): string[];
13
+ export declare function buildTrophySnapshot(file: TrophyFile, facts: TrophyProgressFacts, event?: {
14
+ unlocked: string[];
15
+ nonce: string | null;
16
+ }): TrophySnapshot;
17
+ /** A run of 30 minutes or more is a marathon. */
18
+ export declare const LONG_RUN_MS: number;
19
+ /** A run that touches this many files is a big change. */
20
+ export declare const BIG_RUN_FILES = 10;
21
+ /** One tool call: its name and, when known, its arguments. */
22
+ export interface TrophyToolCall {
23
+ name: string;
24
+ args?: Record<string, unknown>;
25
+ }
26
+ /** One finished, successful run, as the sidecar saw it. */
27
+ export interface TrophyRunFacts {
28
+ mode: "code" | "chat" | "motion";
29
+ /** Set in chat windows. */
30
+ chatAgent?: string;
31
+ /** True when the window is a Goal. */
32
+ goal: boolean;
33
+ provider: string;
34
+ model: string;
35
+ /** Every tool call the run made, in order, repeats included. */
36
+ tools: readonly TrophyToolCall[];
37
+ durationMs: number;
38
+ /** Local hour (0-23) the run finished in. */
39
+ hour: number;
40
+ /** Local day of the week (0 Sunday … 6 Saturday). */
41
+ day: number;
42
+ /** Local date (YYYY-MM-DD) the run finished on. */
43
+ date: string;
44
+ /** A short hash of the project's path. */
45
+ project: string;
46
+ }
47
+ export declare function runDelta(run: TrophyRunFacts): TrophyDelta;
48
+ /** What a sent prompt says about how it was written. */
49
+ export interface TrophyPromptFacts {
50
+ /** The slash command it ran (`commit` for `/commit …`), if any. */
51
+ command: string | null;
52
+ /** The command is the user's own, from `.ezcoder/commands`. */
53
+ customCommand: boolean;
54
+ /** Sent after Enhance rewrote it. */
55
+ enhanced: boolean;
56
+ attachments: number;
57
+ /** How many `@file` mentions point at real files. */
58
+ fileMentions: number;
59
+ /** Sent while a run was in progress (steering). */
60
+ steer: boolean;
61
+ }
62
+ export declare function promptDelta(p: TrophyPromptFacts): TrophyDelta;
63
+ /** `/name args` → `name` (lowercase), or null for anything else. */
64
+ export declare function slashCommandName(text: string): string | null;
65
+ /**
66
+ * Files a prompt points at: the app's @-picker sends them as a
67
+ * "Referenced files:" list after the text; a typed `@path` counts too.
68
+ * `@Nolan` is a person, not a file.
69
+ */
70
+ export declare function mentionedPaths(text: string, limit?: number): string[];
@@ -0,0 +1,351 @@
1
+ // Pure trophy engine: record what happened, decide what it unlocks, and build
2
+ // the snapshot the app shows. No I/O here; the store persists the file.
3
+ import { TROPHIES, TROPHY_CATEGORIES } from "./catalog.js";
4
+ import { TROPHY_COUNTERS, TROPHY_SETS, } from "./types.js";
5
+ /** Each set stays bounded however long someone uses the app. */
6
+ const SET_CAP = {
7
+ slashCommandNames: 64,
8
+ modelsUsed: 64,
9
+ toolsUsed: 128,
10
+ chatAgents: 8,
11
+ skillsUsed: 64,
12
+ providersUsed: 32,
13
+ radioStations: 32,
14
+ checklistItems: 64,
15
+ projects: 128,
16
+ };
17
+ const COUNTER_KEYS = new Set(TROPHY_COUNTERS);
18
+ const SET_KEYS = new Set(TROPHY_SETS);
19
+ export const EMPTY_PROGRESS_FACTS = {
20
+ prompts: 0,
21
+ commits: 0,
22
+ linesShipped: 0,
23
+ level: 1,
24
+ };
25
+ /** A date as local YYYY-MM-DD, the day-streak's unit. */
26
+ export function localTrophyDate(d) {
27
+ const pad = (n) => String(n).padStart(2, "0");
28
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
29
+ }
30
+ /** Whole days from one local YYYY-MM-DD date to another (NaN if malformed). */
31
+ function daysBetween(from, to) {
32
+ const parse = (d) => {
33
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(d);
34
+ return m ? Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : Number.NaN;
35
+ };
36
+ return Math.round((parse(to) - parse(from)) / 86_400_000);
37
+ }
38
+ /** Count a day with a finished run toward the streak. */
39
+ function applyActiveDay(file, day) {
40
+ const { streak } = file;
41
+ if (streak.last === day)
42
+ return;
43
+ const gap = streak.last ? daysBetween(streak.last, day) : Number.NaN;
44
+ // A clock moved backwards (gap < 0) leaves the streak alone.
45
+ if (gap < 0)
46
+ return;
47
+ streak.current = gap === 1 ? streak.current + 1 : 1;
48
+ streak.last = day;
49
+ streak.best = Math.max(streak.best, streak.current);
50
+ }
51
+ /** Add a delta to the file's counters and sets. Unknown keys are ignored. */
52
+ export function applyDelta(file, delta) {
53
+ for (const [key, by] of Object.entries(delta.count ?? {})) {
54
+ if (!COUNTER_KEYS.has(key) || typeof by !== "number" || !Number.isFinite(by) || by <= 0) {
55
+ continue;
56
+ }
57
+ const k = key;
58
+ file.counters[k] = (file.counters[k] ?? 0) + Math.floor(by);
59
+ }
60
+ for (const [key, members] of Object.entries(delta.add ?? {})) {
61
+ if (!SET_KEYS.has(key) || !Array.isArray(members))
62
+ continue;
63
+ const k = key;
64
+ const current = file.sets[k] ?? [];
65
+ for (const member of members) {
66
+ if (typeof member !== "string" || member.length === 0 || member.length > 200)
67
+ continue;
68
+ if (current.length >= SET_CAP[k])
69
+ break;
70
+ if (!current.includes(member))
71
+ current.push(member);
72
+ }
73
+ file.sets[k] = current;
74
+ }
75
+ if (typeof delta.activeDay === "string")
76
+ applyActiveDay(file, delta.activeDay);
77
+ }
78
+ function statValue(def, file, facts) {
79
+ switch (def.stat.kind) {
80
+ case "count":
81
+ return file.counters[def.stat.key] ?? 0;
82
+ case "distinct":
83
+ return file.sets[def.stat.key]?.length ?? 0;
84
+ case "progress": {
85
+ // Only what happened since trophies began; no baseline yet means nothing has.
86
+ const base = file.baseline?.[def.stat.key];
87
+ return base === undefined ? 0 : Math.max(0, facts[def.stat.key] - base);
88
+ }
89
+ case "streak":
90
+ return file.streak.best;
91
+ case "earned":
92
+ return Object.keys(file.unlocked).filter((id) => id !== def.id).length;
93
+ }
94
+ }
95
+ /**
96
+ * Mark every trophy whose goal is now met. Returns the ids newly earned, in
97
+ * catalog order. Repeats until nothing changes, since earning trophies can
98
+ * earn the ones that count trophies.
99
+ */
100
+ export function evaluateTrophies(file, facts, now) {
101
+ const earned = [];
102
+ let changed = true;
103
+ while (changed) {
104
+ changed = false;
105
+ for (const def of TROPHIES) {
106
+ if (file.unlocked[def.id])
107
+ continue;
108
+ if (statValue(def, file, facts) >= def.goal) {
109
+ file.unlocked[def.id] = now.toISOString();
110
+ earned.push(def.id);
111
+ changed = true;
112
+ }
113
+ }
114
+ }
115
+ return earned;
116
+ }
117
+ export function buildTrophySnapshot(file, facts, event = { unlocked: [], nonce: null }) {
118
+ const trophies = TROPHIES.map((def) => {
119
+ const unlockedAt = file.unlocked[def.id] ?? null;
120
+ const current = Math.min(def.goal, Math.max(0, statValue(def, file, facts)));
121
+ // A secret stays secret until it's earned: no title, story or progress.
122
+ if (def.secret && !unlockedAt) {
123
+ return {
124
+ id: def.id,
125
+ title: "Secret trophy",
126
+ tier: def.tier,
127
+ category: def.category,
128
+ description: "",
129
+ hint: "Keep exploring. Some trophies are a surprise.",
130
+ goal: 1,
131
+ current: 0,
132
+ unlockedAt: null,
133
+ secret: true,
134
+ };
135
+ }
136
+ return {
137
+ id: def.id,
138
+ title: def.title,
139
+ tier: def.tier,
140
+ category: def.category,
141
+ description: def.description,
142
+ hint: def.hint,
143
+ goal: def.goal,
144
+ current: unlockedAt ? def.goal : current,
145
+ unlockedAt,
146
+ secret: def.secret === true,
147
+ };
148
+ });
149
+ return {
150
+ trophies,
151
+ categories: [...TROPHY_CATEGORIES],
152
+ earned: trophies.filter((t) => t.unlockedAt !== null).length,
153
+ total: trophies.length,
154
+ unlocked: event.unlocked,
155
+ eventNonce: event.nonce,
156
+ };
157
+ }
158
+ // ── Translating what happened into counters ─────────────────────────────
159
+ const WEB_TOOLS = new Set(["web_search", "web_fetch"]);
160
+ const HELPER_TOOLS = new Set(["spawn_agent", "subagent"]);
161
+ const BACKGROUND_TOOLS = new Set(["task_output", "task_stop", "task_send"]);
162
+ const MEMORY_TOOLS = new Set(["remember", "update_memory"]);
163
+ const SOUL_TOOLS = new Set(["set_jiwa", "update_jiwa"]);
164
+ /** A run of 30 minutes or more is a marathon. */
165
+ export const LONG_RUN_MS = 30 * 60 * 1000;
166
+ /** A run that touches this many files is a big change. */
167
+ export const BIG_RUN_FILES = 10;
168
+ /** MCP tools are named `mcp__<server>__<tool>`; one server counts once. */
169
+ function toolFamily(name) {
170
+ if (name.startsWith("mcp__")) {
171
+ const server = name.slice(5).split("__")[0];
172
+ return server ? `mcp__${server}` : "mcp";
173
+ }
174
+ return name;
175
+ }
176
+ const str = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
177
+ /** Files a write or edit call touched (edit takes `file_path` or a `files` list). */
178
+ function touchedFiles(call) {
179
+ if (call.name !== "write" && call.name !== "edit")
180
+ return [];
181
+ const out = [];
182
+ const top = str(call.args?.file_path);
183
+ if (top)
184
+ out.push(top);
185
+ const files = call.args?.files;
186
+ if (Array.isArray(files)) {
187
+ for (const f of files) {
188
+ const p = typeof f === "object" && f !== null ? str(f.file_path) : null;
189
+ if (p)
190
+ out.push(p);
191
+ }
192
+ }
193
+ return out;
194
+ }
195
+ /** `git push` anywhere in a shell line (not `git push --dry-run`). */
196
+ const GIT_PUSH = /(?:^|[;&|(\s])git\s+(?:-C\s+\S+\s+)?push\b(?![^;&|]*--dry-run)/;
197
+ /** `gh pr create` anywhere in a shell line. */
198
+ const GH_PR_CREATE = /(?:^|[;&|(\s])gh\s+pr\s+create\b/;
199
+ export function runDelta(run) {
200
+ const names = run.tools.map((c) => c.name);
201
+ const used = new Set(names);
202
+ const has = (set) => names.some((n) => set.has(n));
203
+ const count = {};
204
+ const bash = run.tools
205
+ .filter((c) => c.name === "bash")
206
+ .map((c) => ({
207
+ command: str(c.args?.command) ?? "",
208
+ background: c.args?.run_in_background === true,
209
+ }));
210
+ if (has(WEB_TOOLS))
211
+ count.webRuns = 1;
212
+ if (has(HELPER_TOOLS) && !run.goal)
213
+ count.subagentRuns = 1;
214
+ if (has(BACKGROUND_TOOLS) || bash.some((b) => b.background))
215
+ count.backgroundRuns = 1;
216
+ if (used.has("skill"))
217
+ count.skillRuns = 1;
218
+ if (names.some((n) => n.startsWith("mcp__")))
219
+ count.mcpRuns = 1;
220
+ if (used.has("screenshot"))
221
+ count.screenshots = 1;
222
+ if (used.has("debug"))
223
+ count.debugRuns = 1;
224
+ if (used.has("ui_adopt"))
225
+ count.uiComponents = 1;
226
+ if (used.has("code_search"))
227
+ count.codeSearches = 1;
228
+ if (used.has("code_nav"))
229
+ count.codeNavs = 1;
230
+ if (has(MEMORY_TOOLS))
231
+ count.memoriesSaved = 1;
232
+ if (has(SOUL_TOOLS))
233
+ count.soulNotes = 1;
234
+ if (used.has("delegate_to_agent"))
235
+ count.handoffs = 1;
236
+ if (bash.some((b) => GIT_PUSH.test(b.command)))
237
+ count.pushes = 1;
238
+ if (bash.some((b) => GH_PR_CREATE.test(b.command)))
239
+ count.pullRequests = 1;
240
+ if (run.provider === "local")
241
+ count.localRuns = 1;
242
+ if (run.mode === "chat")
243
+ count.chatRuns = 1;
244
+ if (run.mode === "motion")
245
+ count.motionRuns = 1;
246
+ if (run.goal) {
247
+ const workers = names.filter((n) => HELPER_TOOLS.has(n)).length;
248
+ if (workers > 0)
249
+ count.goalWorkers = workers;
250
+ }
251
+ const records = run.tools.filter((c) => c.name === "checklist" && c.args?.action === "record");
252
+ if (records.length > 0)
253
+ count.checklistRecords = records.length;
254
+ const files = new Set(run.tools.flatMap(touchedFiles));
255
+ if (files.size > 0)
256
+ count.filesTouched = files.size;
257
+ if (files.size >= BIG_RUN_FILES)
258
+ count.bigRuns = 1;
259
+ if (run.hour >= 0 && run.hour < 5)
260
+ count.nightRuns = 1;
261
+ if (run.hour >= 5 && run.hour < 7)
262
+ count.earlyRuns = 1;
263
+ if (run.day === 0 || run.day === 6)
264
+ count.weekendRuns = 1;
265
+ if (run.durationMs >= LONG_RUN_MS)
266
+ count.longRuns = 1;
267
+ const add = {
268
+ toolsUsed: [...new Set(names.map(toolFamily))].sort(),
269
+ };
270
+ if (run.model)
271
+ add.modelsUsed = [`${run.provider}/${run.model}`];
272
+ if (run.provider)
273
+ add.providersUsed = [run.provider];
274
+ if (run.project)
275
+ add.projects = [run.project];
276
+ if (run.mode === "chat" && run.chatAgent)
277
+ add.chatAgents = [run.chatAgent];
278
+ const skills = run.tools
279
+ .filter((c) => c.name === "skill")
280
+ .map((c) => str(c.args?.skill)?.toLowerCase())
281
+ .filter((v) => !!v);
282
+ if (skills.length > 0)
283
+ add.skillsUsed = [...new Set(skills)].sort();
284
+ const items = records.map((c) => str(c.args?.id)).filter((v) => !!v);
285
+ if (items.length > 0)
286
+ add.checklistItems = [...new Set(items)].sort();
287
+ return { count, add, activeDay: run.date };
288
+ }
289
+ export function promptDelta(p) {
290
+ const count = {};
291
+ const add = {};
292
+ if (p.command) {
293
+ if (p.command === "add-dir") {
294
+ count.addDirs = 1;
295
+ }
296
+ else {
297
+ count.slashCommands = 1;
298
+ add.slashCommandNames = [p.command];
299
+ if (p.customCommand)
300
+ count.customCommands = 1;
301
+ }
302
+ }
303
+ if (p.enhanced)
304
+ count.enhancedSends = 1;
305
+ if (p.attachments > 0)
306
+ count.attachments = 1;
307
+ if (p.fileMentions > 0)
308
+ count.fileMentions = 1;
309
+ if (p.steer)
310
+ count.steers = 1;
311
+ return { count, add };
312
+ }
313
+ /** `/name args` → `name` (lowercase), or null for anything else. */
314
+ export function slashCommandName(text) {
315
+ const match = /^\/([a-z0-9][\w:-]*)/i.exec(text.trim());
316
+ return match?.[1] ? match[1].toLowerCase() : null;
317
+ }
318
+ /** The heading the app's @-picker uses for the files it attaches to a prompt. */
319
+ const REF_HEADING = "Referenced files:";
320
+ /**
321
+ * Files a prompt points at: the app's @-picker sends them as a
322
+ * "Referenced files:" list after the text; a typed `@path` counts too.
323
+ * `@Nolan` is a person, not a file.
324
+ */
325
+ export function mentionedPaths(text, limit = 10) {
326
+ const out = [];
327
+ const push = (p) => {
328
+ if (out.length < limit && p && !out.includes(p))
329
+ out.push(p);
330
+ };
331
+ const at = text.lastIndexOf(REF_HEADING);
332
+ if (at === 0 || (at > 0 && text.slice(at - 2, at) === "\n\n")) {
333
+ for (const line of text
334
+ .slice(at + REF_HEADING.length)
335
+ .split("\n")
336
+ .slice(1)) {
337
+ const m = /^- (.+)$/.exec(line);
338
+ if (!m?.[1])
339
+ break;
340
+ push(m[1].trim());
341
+ }
342
+ }
343
+ const re = /(?:^|\s)@([\w./-]*[\w-])/g;
344
+ for (let m = re.exec(text); m && out.length < limit; m = re.exec(text)) {
345
+ const token = m[1];
346
+ if (token && token.toLowerCase() !== "nolan")
347
+ push(token);
348
+ }
349
+ return out;
350
+ }
351
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/core/trophies/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type TrophyFile } from "./types.js";
2
+ export declare function createEmptyTrophies(now?: Date): TrophyFile;
3
+ export interface LoadedTrophies {
4
+ file: TrophyFile;
5
+ /** True when no usable file existed (first run, or a damaged file). */
6
+ fresh: boolean;
7
+ }
8
+ /** Read the file, or start an empty one. Never writes. */
9
+ export declare function loadTrophies(filePath?: string): Promise<LoadedTrophies>;
10
+ /**
11
+ * Read-modify-write under the lock. A damaged file is set aside as
12
+ * `trophies.json.bad` rather than silently replaced.
13
+ */
14
+ export declare function updateTrophies<T>(mutate: (file: TrophyFile) => T, filePath?: string): Promise<{
15
+ file: TrophyFile;
16
+ result: T;
17
+ }>;
@@ -0,0 +1,113 @@
1
+ // Durable trophies file (~/.ezcoder/trophies.json): read-modify-write under the
2
+ // same file lock and atomic rename the progress store uses, so several app
3
+ // processes can record at once without losing an unlock.
4
+ import fs from "node:fs/promises";
5
+ import path from "node:path";
6
+ import { z } from "zod";
7
+ import { getAppPaths, withFileLock } from "@prestyj/core";
8
+ import { TROPHY_COUNTERS, TROPHY_SETS } from "./types.js";
9
+ const factsSchema = z.object({
10
+ prompts: z.number(),
11
+ commits: z.number(),
12
+ linesShipped: z.number(),
13
+ level: z.number(),
14
+ });
15
+ const fileSchema = z.object({
16
+ v: z.literal(2),
17
+ createdAt: z.string(),
18
+ baseline: factsSchema.nullable(),
19
+ streak: z.object({ last: z.string().nullable(), current: z.number(), best: z.number() }),
20
+ counters: z.record(z.string(), z.number()),
21
+ sets: z.record(z.string(), z.array(z.string())),
22
+ unlocked: z.record(z.string(), z.string()),
23
+ lastEvent: z.object({ nonce: z.string(), unlocked: z.array(z.string()) }).nullable(),
24
+ });
25
+ export function createEmptyTrophies(now = new Date()) {
26
+ return {
27
+ v: 2,
28
+ createdAt: now.toISOString(),
29
+ baseline: null,
30
+ streak: { last: null, current: 0, best: 0 },
31
+ counters: {},
32
+ sets: {},
33
+ unlocked: {},
34
+ lastEvent: null,
35
+ };
36
+ }
37
+ /** Keep only known counters and sets, so a newer app's keys don't break this one. */
38
+ function normalize(parsed) {
39
+ const counters = {};
40
+ for (const key of TROPHY_COUNTERS) {
41
+ const value = parsed.counters[key];
42
+ if (typeof value === "number" && Number.isFinite(value) && value > 0)
43
+ counters[key] = value;
44
+ }
45
+ const sets = {};
46
+ for (const key of TROPHY_SETS) {
47
+ const value = parsed.sets[key];
48
+ if (value)
49
+ sets[key] = [...new Set(value)];
50
+ }
51
+ return { ...parsed, counters, sets };
52
+ }
53
+ function resolvePath(filePath) {
54
+ return filePath ?? getAppPaths().trophiesFile;
55
+ }
56
+ async function readFile(filePath) {
57
+ let raw;
58
+ try {
59
+ raw = await fs.readFile(filePath, "utf-8");
60
+ }
61
+ catch {
62
+ return "missing";
63
+ }
64
+ let json;
65
+ try {
66
+ json = JSON.parse(raw);
67
+ }
68
+ catch {
69
+ return "damaged";
70
+ }
71
+ // Version 1 shipped only in pre-release builds and credited past XP as
72
+ // trophies. Everyone starts from zero, so it's dropped, not kept aside.
73
+ if (typeof json === "object" && json !== null && json.v === 1) {
74
+ return "obsolete";
75
+ }
76
+ const parsed = fileSchema.safeParse(json);
77
+ return parsed.success ? normalize(parsed.data) : "damaged";
78
+ }
79
+ const isFile = (r) => typeof r === "object";
80
+ async function atomicWrite(filePath, file) {
81
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
82
+ const tmp = `${filePath}.tmp`;
83
+ await fs.writeFile(tmp, JSON.stringify(file, null, 2), "utf-8");
84
+ await fs.rename(tmp, filePath);
85
+ }
86
+ /** Read the file, or start an empty one. Never writes. */
87
+ export async function loadTrophies(filePath) {
88
+ const read = await readFile(resolvePath(filePath));
89
+ return isFile(read) ? { file: read, fresh: false } : { file: createEmptyTrophies(), fresh: true };
90
+ }
91
+ /**
92
+ * Read-modify-write under the lock. A damaged file is set aside as
93
+ * `trophies.json.bad` rather than silently replaced.
94
+ */
95
+ export async function updateTrophies(mutate, filePath) {
96
+ const target = resolvePath(filePath);
97
+ return withFileLock(target, async () => {
98
+ const read = await readFile(target);
99
+ let current;
100
+ if (isFile(read)) {
101
+ current = read;
102
+ }
103
+ else {
104
+ if (read === "damaged")
105
+ await fs.rename(target, `${target}.bad`).catch(() => { });
106
+ current = createEmptyTrophies();
107
+ }
108
+ const result = mutate(current);
109
+ await atomicWrite(target, current);
110
+ return { file: current, result };
111
+ });
112
+ }
113
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/trophies/store.ts"],"names":[],"mappings":"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"}