@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.
- package/README.md +3 -2
- package/assets/skills/task-list/SKILL.md +39 -0
- package/dist/app-sidecar/app-settings.js +11 -5
- package/dist/app-sidecar/app-settings.js.map +1 -1
- package/dist/app-sidecar/auth-routes.js +10 -3
- package/dist/app-sidecar/auth-routes.js.map +1 -1
- package/dist/app-sidecar/git-target.d.ts +15 -2
- package/dist/app-sidecar/git-target.js +24 -10
- package/dist/app-sidecar/git-target.js.map +1 -1
- package/dist/app-sidecar/goal-routes.js +8 -0
- package/dist/app-sidecar/goal-routes.js.map +1 -1
- package/dist/app-sidecar/history-routes.js +7 -0
- package/dist/app-sidecar/history-routes.js.map +1 -1
- package/dist/app-sidecar/history.d.ts +5 -0
- package/dist/app-sidecar/history.js.map +1 -1
- package/dist/app-sidecar/integration-routes.js +4 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-routes.js +1 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-rows.d.ts +2 -0
- package/dist/app-sidecar/mcp-rows.js +4 -1
- package/dist/app-sidecar/mcp-rows.js.map +1 -1
- package/dist/app-sidecar/prompt-routes.js +67 -1
- package/dist/app-sidecar/prompt-routes.js.map +1 -1
- package/dist/app-sidecar/route-context.d.ts +2 -0
- package/dist/app-sidecar/run-control-routes.js +43 -3
- package/dist/app-sidecar/run-control-routes.js.map +1 -1
- package/dist/app-sidecar/session-routes.js +10 -0
- package/dist/app-sidecar/session-routes.js.map +1 -1
- package/dist/app-sidecar/task-routes.js +2 -0
- package/dist/app-sidecar/task-routes.js.map +1 -1
- package/dist/app-sidecar/trophy-manager.d.ts +15 -0
- package/dist/app-sidecar/trophy-manager.js +71 -0
- package/dist/app-sidecar/trophy-manager.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.js +1 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -1
- package/dist/app-sidecar.js +157 -30
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/auth.js +22 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/mcp.js +6 -1
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli.js +13 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/core/action-threats.d.ts +68 -0
- package/dist/core/action-threats.js +894 -0
- package/dist/core/action-threats.js.map +1 -0
- package/dist/core/agent-notifications.d.ts +18 -0
- package/dist/core/agent-notifications.js +35 -2
- package/dist/core/agent-notifications.js.map +1 -1
- package/dist/core/agent-session/verification-tracker.d.ts +21 -0
- package/dist/core/agent-session/verification-tracker.js +39 -1
- package/dist/core/agent-session/verification-tracker.js.map +1 -1
- package/dist/core/agent-session.d.ts +168 -2
- package/dist/core/agent-session.js +486 -23
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/blocked-packages-file.d.ts +33 -0
- package/dist/core/blocked-packages-file.js +274 -0
- package/dist/core/blocked-packages-file.js.map +1 -0
- package/dist/core/compaction/policy.d.ts +2 -2
- package/dist/core/compaction/policy.js +86 -43
- package/dist/core/compaction/policy.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts +4 -1
- package/dist/core/compaction/token-estimator.js +5 -2
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/event-bus.d.ts +10 -0
- package/dist/core/event-bus.js +2 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/idle-wake.d.ts +62 -0
- package/dist/core/idle-wake.js +103 -0
- package/dist/core/idle-wake.js.map +1 -0
- package/dist/core/injection-detect.d.ts +2 -1
- package/dist/core/injection-detect.js +13 -4
- package/dist/core/injection-detect.js.map +1 -1
- package/dist/core/installed-threats.d.ts +23 -0
- package/dist/core/installed-threats.js +71 -0
- package/dist/core/installed-threats.js.map +1 -0
- package/dist/core/mcp/catalog-cache.d.ts +2 -0
- package/dist/core/mcp/catalog-cache.js +4 -0
- package/dist/core/mcp/catalog-cache.js.map +1 -1
- package/dist/core/mcp/client.d.ts +8 -0
- package/dist/core/mcp/client.js +37 -3
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/deferred-catalog.d.ts +12 -1
- package/dist/core/mcp/deferred-catalog.js +37 -10
- package/dist/core/mcp/deferred-catalog.js.map +1 -1
- package/dist/core/mcp/index.d.ts +2 -0
- package/dist/core/mcp/index.js +1 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/tool-guard.d.ts +58 -0
- package/dist/core/mcp/tool-guard.js +215 -0
- package/dist/core/mcp/tool-guard.js.map +1 -0
- package/dist/core/network-guard.d.ts +0 -20
- package/dist/core/network-guard.js +6 -0
- package/dist/core/network-guard.js.map +1 -1
- package/dist/core/package-cooldown.d.ts +71 -0
- package/dist/core/package-cooldown.js +301 -0
- package/dist/core/package-cooldown.js.map +1 -0
- package/dist/core/package-threats.d.ts +77 -3
- package/dist/core/package-threats.js +1250 -78
- package/dist/core/package-threats.js.map +1 -1
- package/dist/core/process-manager.d.ts +54 -12
- package/dist/core/process-manager.js +233 -56
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-files.d.ts +15 -0
- package/dist/core/project-files.js +37 -0
- package/dist/core/project-files.js.map +1 -0
- package/dist/core/prompt-commands.js +1 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.js +4 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-threats.d.ts +14 -1
- package/dist/core/shell-threats.js +73 -24
- package/dist/core/shell-threats.js.map +1 -1
- package/dist/core/skill-scan.d.ts +112 -0
- package/dist/core/skill-scan.js +781 -0
- package/dist/core/skill-scan.js.map +1 -0
- package/dist/core/skills.d.ts +33 -0
- package/dist/core/skills.js +87 -16
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +5 -1
- package/dist/core/slash-commands.js +24 -9
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/steering.d.ts +7 -0
- package/dist/core/steering.js +13 -0
- package/dist/core/steering.js.map +1 -1
- package/dist/core/style-packs/index.js +1 -1
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.js +2 -2
- package/dist/core/subagent-manager.js +5 -4
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/threat-feed.d.ts +65 -0
- package/dist/core/threat-feed.js +335 -0
- package/dist/core/threat-feed.js.map +1 -0
- package/dist/core/trophies/catalog-more.d.ts +2 -0
- package/dist/core/trophies/catalog-more.js +857 -0
- package/dist/core/trophies/catalog-more.js.map +1 -0
- package/dist/core/trophies/catalog.d.ts +4 -0
- package/dist/core/trophies/catalog.js +649 -0
- package/dist/core/trophies/catalog.js.map +1 -0
- package/dist/core/trophies/engine.d.ts +70 -0
- package/dist/core/trophies/engine.js +351 -0
- package/dist/core/trophies/engine.js.map +1 -0
- package/dist/core/trophies/store.d.ts +17 -0
- package/dist/core/trophies/store.js +113 -0
- package/dist/core/trophies/store.js.map +1 -0
- package/dist/core/trophies/types.d.ts +119 -0
- package/dist/core/trophies/types.js +78 -0
- package/dist/core/trophies/types.js.map +1 -0
- package/dist/core/verification-evidence.d.ts +10 -6
- package/dist/core/verification-evidence.js +190 -11
- package/dist/core/verification-evidence.js.map +1 -1
- package/dist/goals-agent/goals-agent.js +3 -2
- package/dist/goals-agent/goals-agent.js.map +1 -1
- package/dist/interactive.js +16 -5
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-mode.js +8 -1
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/agent-home-mode.js +13 -1
- package/dist/modes/agent-home-mode.js.map +1 -1
- package/dist/modes/rpc-mode.d.ts +2 -1
- package/dist/modes/rpc-mode.js +15 -3
- package/dist/modes/rpc-mode.js.map +1 -1
- package/dist/modes/serve-mode.js +13 -1
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +8 -0
- package/dist/system-prompt.js +34 -13
- package/dist/system-prompt.js.map +1 -1
- package/dist/test-support/slow-git.d.ts +1 -0
- package/dist/test-support/slow-git.js +21 -0
- package/dist/test-support/slow-git.js.map +1 -0
- package/dist/tools/background-watch-lint.d.ts +18 -0
- package/dist/tools/background-watch-lint.js +102 -0
- package/dist/tools/background-watch-lint.js.map +1 -0
- package/dist/tools/bash.d.ts +15 -4
- package/dist/tools/bash.js +75 -47
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +3 -3
- package/dist/tools/compress.js +45 -0
- package/dist/tools/compress.js.map +1 -1
- package/dist/tools/edit.js +5 -0
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/generate-image.d.ts +29 -6
- package/dist/tools/generate-image.js +325 -151
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/grep.d.ts +14 -0
- package/dist/tools/grep.js +36 -2
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/tools/index.js +7 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts +8 -1
- package/dist/tools/prompt-hints.js +22 -2
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/routine-output.d.ts +30 -0
- package/dist/tools/routine-output.js +203 -0
- package/dist/tools/routine-output.js.map +1 -0
- package/dist/tools/skill.d.ts +2 -2
- package/dist/tools/skill.js +8 -1
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/task-output.js +11 -1
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/write.js +8 -0
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts +10 -0
- package/dist/ui/components/ModelSelector.js +51 -5
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/ToolExecution.js +2 -2
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/mcp.d.ts +2 -0
- package/dist/ui/mcp.js.map +1 -1
- package/dist/ui/terminal-history.js +2 -1
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/tool-line-summary.js +3 -1
- package/dist/ui/tool-line-summary.js.map +1 -1
- package/dist/utils/git.d.ts +12 -3
- package/dist/utils/git.js +21 -8
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +23 -0
- package/dist/utils/image.js.map +1 -1
- 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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"}
|