@x-code-cli/core 0.1.11 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/api-errors.d.ts.map +1 -1
- package/dist/agent/api-errors.js +18 -0
- package/dist/agent/api-errors.js.map +1 -1
- package/dist/agent/diff.d.ts +35 -0
- package/dist/agent/diff.d.ts.map +1 -0
- package/dist/agent/diff.js +83 -0
- package/dist/agent/diff.js.map +1 -0
- package/dist/agent/loop-state.d.ts +45 -3
- package/dist/agent/loop-state.d.ts.map +1 -1
- package/dist/agent/loop-state.js +24 -3
- package/dist/agent/loop-state.js.map +1 -1
- package/dist/agent/loop.d.ts +10 -6
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +212 -30
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/plan-storage.d.ts +55 -0
- package/dist/agent/plan-storage.d.ts.map +1 -0
- package/dist/agent/plan-storage.js +156 -0
- package/dist/agent/plan-storage.js.map +1 -0
- package/dist/agent/session-store.d.ts +114 -0
- package/dist/agent/session-store.d.ts.map +1 -0
- package/dist/agent/session-store.js +415 -0
- package/dist/agent/session-store.js.map +1 -0
- package/dist/agent/sub-agents/built-in.d.ts +3 -0
- package/dist/agent/sub-agents/built-in.d.ts.map +1 -0
- package/dist/agent/sub-agents/built-in.js +98 -0
- package/dist/agent/sub-agents/built-in.js.map +1 -0
- package/dist/agent/sub-agents/index.d.ts +7 -0
- package/dist/agent/sub-agents/index.d.ts.map +1 -0
- package/dist/agent/sub-agents/index.js +5 -0
- package/dist/agent/sub-agents/index.js.map +1 -0
- package/dist/agent/sub-agents/loader.d.ts +5 -0
- package/dist/agent/sub-agents/loader.d.ts.map +1 -0
- package/dist/agent/sub-agents/loader.js +117 -0
- package/dist/agent/sub-agents/loader.js.map +1 -0
- package/dist/agent/sub-agents/registry.d.ts +14 -0
- package/dist/agent/sub-agents/registry.d.ts.map +1 -0
- package/dist/agent/sub-agents/registry.js +37 -0
- package/dist/agent/sub-agents/registry.js.map +1 -0
- package/dist/agent/sub-agents/runner.d.ts +26 -0
- package/dist/agent/sub-agents/runner.d.ts.map +1 -0
- package/dist/agent/sub-agents/runner.js +287 -0
- package/dist/agent/sub-agents/runner.js.map +1 -0
- package/dist/agent/sub-agents/types.d.ts +63 -0
- package/dist/agent/sub-agents/types.d.ts.map +1 -0
- package/dist/agent/sub-agents/types.js +2 -0
- package/dist/agent/sub-agents/types.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +15 -0
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +161 -0
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts +4 -3
- package/dist/agent/tool-execution.d.ts.map +1 -1
- package/dist/agent/tool-execution.js +316 -14
- package/dist/agent/tool-execution.js.map +1 -1
- package/dist/agent/tool-result-sanitize.d.ts +12 -0
- package/dist/agent/tool-result-sanitize.d.ts.map +1 -1
- package/dist/agent/tool-result-sanitize.js +70 -0
- package/dist/agent/tool-result-sanitize.js.map +1 -1
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/knowledge/session.d.ts +4 -7
- package/dist/knowledge/session.d.ts.map +1 -1
- package/dist/knowledge/session.js +20 -55
- package/dist/knowledge/session.js.map +1 -1
- package/dist/permissions/index.d.ts +18 -3
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +20 -2
- package/dist/permissions/index.js.map +1 -1
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +8 -6
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/enter-plan-mode.d.ts +25 -0
- package/dist/tools/enter-plan-mode.d.ts.map +1 -0
- package/dist/tools/enter-plan-mode.js +120 -0
- package/dist/tools/enter-plan-mode.js.map +1 -0
- package/dist/tools/exit-plan-mode.d.ts +13 -0
- package/dist/tools/exit-plan-mode.d.ts.map +1 -0
- package/dist/tools/exit-plan-mode.js +22 -0
- package/dist/tools/exit-plan-mode.js.map +1 -0
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/index.d.ts +20 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/save-knowledge.d.ts +2 -2
- package/dist/tools/shell-provider.d.ts +4 -0
- package/dist/tools/shell-provider.d.ts.map +1 -1
- package/dist/tools/shell-provider.js +2 -0
- package/dist/tools/shell-provider.js.map +1 -1
- package/dist/tools/task.d.ts +14 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +95 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todo-write.d.ts +21 -0
- package/dist/tools/todo-write.d.ts.map +1 -0
- package/dist/tools/todo-write.js +117 -0
- package/dist/tools/todo-write.js.map +1 -0
- package/dist/types/index.d.ts +103 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/knowledge/session-usage.d.ts +0 -24
- package/dist/knowledge/session-usage.d.ts.map +0 -1
- package/dist/knowledge/session-usage.js +0 -86
- package/dist/knowledge/session-usage.js.map +0 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
import type { LanguageModel, ModelMessage } from 'ai';
|
|
2
|
+
import type { EditDiffPayload } from '../agent/diff.js';
|
|
3
|
+
import type { SubAgentEvent } from '../agent/sub-agents/types.js';
|
|
4
|
+
import type { SubAgentRegistry } from '../agent/sub-agents/registry.js';
|
|
2
5
|
export type PermissionLevel = 'always-allow' | 'ask' | 'deny';
|
|
6
|
+
/** Approval mode for the current session.
|
|
7
|
+
*
|
|
8
|
+
* 'default' — normal flow: write tools ask, model can call anything.
|
|
9
|
+
* 'plan' — read-only mode: the model is told (via system-prompt
|
|
10
|
+
* overlay) to explore + write a plan to a session-local
|
|
11
|
+
* plan file but make no other edits. Enforcement is
|
|
12
|
+
* prompt-based — matching Claude Code, no hard
|
|
13
|
+
* permission-layer block — so a non-compliant model
|
|
14
|
+
* would still hit the regular `ask` prompt for
|
|
15
|
+
* write/edit/shell.
|
|
16
|
+
* 'acceptEdits' — write tools (writeFile / edit) auto-approve without
|
|
17
|
+
* asking; shell still goes through normal classification
|
|
18
|
+
* (always-allow / ask / deny) so destructive commands
|
|
19
|
+
* stay gated. Useful right after a plan is approved —
|
|
20
|
+
* the user already vetted the plan, having to click
|
|
21
|
+
* "Yes" on every writeFile during implementation is
|
|
22
|
+
* pure friction. exitPlanMode auto-switches into this
|
|
23
|
+
* mode on approval; the user can also enter it
|
|
24
|
+
* manually via Shift+Tab cycling.
|
|
25
|
+
*
|
|
26
|
+
* Cycling order on Shift+Tab: default → acceptEdits → plan → default. */
|
|
27
|
+
export type PermissionMode = 'default' | 'acceptEdits' | 'plan';
|
|
28
|
+
/** A single entry on the model's working checklist.
|
|
29
|
+
*
|
|
30
|
+
* content — imperative phrasing of the task ("Update auth handler")
|
|
31
|
+
* activeForm — present-continuous phrasing for the live indicator
|
|
32
|
+
* ("Updating auth handler"); shown in UI while status is
|
|
33
|
+
* 'in_progress' so the user sees what the agent is doing
|
|
34
|
+
* right now.
|
|
35
|
+
* status — 'pending' | 'in_progress' | 'completed'.
|
|
36
|
+
*
|
|
37
|
+
* Mirrors Claude Code's TodoWrite payload shape verbatim. Persisted
|
|
38
|
+
* in-memory only (LoopState.todos), per-session, no disk. */
|
|
39
|
+
export type TodoStatus = 'pending' | 'in_progress' | 'completed';
|
|
40
|
+
export interface TodoItem {
|
|
41
|
+
content: string;
|
|
42
|
+
activeForm: string;
|
|
43
|
+
status: TodoStatus;
|
|
44
|
+
}
|
|
3
45
|
export interface TokenUsage {
|
|
4
46
|
inputTokens: number;
|
|
5
47
|
outputTokens: number;
|
|
@@ -12,6 +54,21 @@ export interface TokenUsage {
|
|
|
12
54
|
* Billed at a premium over normal input rate but unlocks cheap reads on
|
|
13
55
|
* subsequent turns. Zero on providers that don't separate creation from read. */
|
|
14
56
|
cacheCreationTokens: number;
|
|
57
|
+
/** Current context-window occupancy — `input_tokens + output_tokens` of
|
|
58
|
+
* the MOST RECENT API response (`inputTokens` already includes cache_read
|
|
59
|
+
* + cache_write since AI SDK v6 normalises them into one field). Unlike
|
|
60
|
+
* the cumulative fields above, this is a SNAPSHOT — overwritten each
|
|
61
|
+
* turn, not accumulated. Drives the footer "N / M · X%" indicator.
|
|
62
|
+
*
|
|
63
|
+
* Why input + output (matching every provider's definition):
|
|
64
|
+
* every major LLM API — Anthropic, OpenAI, Google Gemini, DeepSeek,
|
|
65
|
+
* Moonshot, Alibaba, xAI — defines "context window" as the shared
|
|
66
|
+
* budget pool of input + output, with `input + output ≤ context_window`
|
|
67
|
+
* as the architectural constraint (single KV-cache cap). Showing input
|
|
68
|
+
* alone in the footer would be a different number than what users see
|
|
69
|
+
* when reading provider docs about model context windows. The cumulative
|
|
70
|
+
* fields above remain for `/usage` billing summaries. */
|
|
71
|
+
currentContextTokens: number;
|
|
15
72
|
}
|
|
16
73
|
export interface DisplayMessage {
|
|
17
74
|
id: string;
|
|
@@ -47,6 +104,11 @@ export interface DisplayToolCall {
|
|
|
47
104
|
status: 'pending' | 'running' | 'completed' | 'denied' | 'error';
|
|
48
105
|
/** How long the tool call took to execute (milliseconds) */
|
|
49
106
|
durationMs?: number;
|
|
107
|
+
/** Structured patch produced by writeFile / edit — drives the colored
|
|
108
|
+
* diff block under the tool bullet in scrollback. Absent for non-edit
|
|
109
|
+
* tools, hydrated history (we don't recompute on session resume), and
|
|
110
|
+
* edits that actually had no effect (oldContent === newContent). */
|
|
111
|
+
editPayload?: EditDiffPayload;
|
|
50
112
|
}
|
|
51
113
|
export interface AgentCallbacks {
|
|
52
114
|
onTextDelta: (text: string) => void;
|
|
@@ -56,6 +118,12 @@ export interface AgentCallbacks {
|
|
|
56
118
|
* shown in the live UI; the final summary comes through onToolResult. */
|
|
57
119
|
onToolProgress: (toolCallId: string, message: string) => void;
|
|
58
120
|
onToolResult: (toolCallId: string, result: string, isError?: boolean) => void;
|
|
121
|
+
/** Optional. Fired right BEFORE `onToolResult` for a successful
|
|
122
|
+
* writeFile / edit, carrying the structured patch + line counts so the
|
|
123
|
+
* UI can render a diff block under the tool bullet. Skipped for
|
|
124
|
+
* permission-denied / errored writes (the file wasn't actually changed)
|
|
125
|
+
* and for no-op edits that produced an identical file. */
|
|
126
|
+
onFileEdit?: (toolCallId: string, payload: EditDiffPayload) => void;
|
|
59
127
|
onAskPermission: (toolCall: {
|
|
60
128
|
toolCallId: string;
|
|
61
129
|
toolName: string;
|
|
@@ -65,10 +133,24 @@ export interface AgentCallbacks {
|
|
|
65
133
|
label: string;
|
|
66
134
|
description: string;
|
|
67
135
|
}[]) => Promise<string>;
|
|
136
|
+
/** Triggered by `exitPlanMode`. Resolve `true` to leave plan mode and
|
|
137
|
+
* let the model start implementing; resolve `false` to reject the plan
|
|
138
|
+
* and keep the model in plan mode for further iteration. */
|
|
139
|
+
onPlanApprovalRequest: (planText: string) => Promise<boolean>;
|
|
140
|
+
/** Fired whenever permissionMode flips so the UI can resync the bottom
|
|
141
|
+
* indicator and (when persisting) write the new value to user config. */
|
|
142
|
+
onPlanModeChange: (mode: PermissionMode) => void;
|
|
143
|
+
/** Fired after the model calls `todoWrite` so the UI can show the
|
|
144
|
+
* current checklist. The full list is passed every call (todoWrite
|
|
145
|
+
* is a full-replacement tool, not a delta) — UI just stores it. */
|
|
146
|
+
onTodosUpdate: (todos: TodoItem[]) => void;
|
|
68
147
|
onShellOutput: (chunk: string) => void;
|
|
69
148
|
onUsageUpdate: (usage: TokenUsage) => void;
|
|
70
149
|
onContextCompressed: (summary: string) => void;
|
|
71
150
|
onError: (error: Error) => void;
|
|
151
|
+
/** Fired by the sub-agent runner to stream progress from child agent loops.
|
|
152
|
+
* The CLI UI uses these events to build the collapsed/expanded task block. */
|
|
153
|
+
onSubAgentEvent?: (event: SubAgentEvent) => void;
|
|
72
154
|
}
|
|
73
155
|
export interface AgentOptions {
|
|
74
156
|
modelId: string;
|
|
@@ -80,8 +162,27 @@ export interface AgentOptions {
|
|
|
80
162
|
* Persisted in `~/.x-code/config.json` as `thinking: boolean`,
|
|
81
163
|
* toggled at runtime via `/thinking on|off`. Defaults to false. */
|
|
82
164
|
thinking?: boolean;
|
|
165
|
+
/** Initial permission mode for the session. Defaults to 'default'.
|
|
166
|
+
* Set from `--plan` CLI flag or `loadUserConfig().permissionMode`. */
|
|
167
|
+
permissionMode?: PermissionMode;
|
|
83
168
|
systemPromptExtra?: string;
|
|
84
169
|
abortSignal?: AbortSignal;
|
|
170
|
+
/** Provider registry for resolving sub-agent model overrides.
|
|
171
|
+
* Injected by the CLI at startup. Absent = sub-agents inherit the
|
|
172
|
+
* parent model (no independent model selection). */
|
|
173
|
+
modelRegistry?: {
|
|
174
|
+
languageModel: (...args: any[]) => LanguageModel;
|
|
175
|
+
};
|
|
176
|
+
/** Sub-agent registry. Injected by the CLI at startup after scanning
|
|
177
|
+
* built-in + custom agent definitions. Absent = task tool is not
|
|
178
|
+
* registered (no sub-agent support). */
|
|
179
|
+
subAgentRegistry?: SubAgentRegistry;
|
|
180
|
+
/** Tool allow/deny filter. Used by sub-agent loops to restrict
|
|
181
|
+
* which tools the child can call. `task` is always in `deny`. */
|
|
182
|
+
toolFilter?: {
|
|
183
|
+
allow?: string[];
|
|
184
|
+
deny?: string[];
|
|
185
|
+
};
|
|
85
186
|
}
|
|
86
187
|
/**
|
|
87
188
|
* Category taxonomy for auto memory entries. Categories describe the TYPE of
|
|
@@ -157,4 +258,6 @@ export interface ProviderModel {
|
|
|
157
258
|
export declare const PROVIDER_MODELS: Record<string, readonly ProviderModel[]>;
|
|
158
259
|
export declare const PROVIDER_KEY_URLS: Record<string, string>;
|
|
159
260
|
export type { ModelMessage, LanguageModel };
|
|
261
|
+
export type { SubAgentEvent, SubAgentDefinition, SubAgentTrace } from '../agent/sub-agents/types.js';
|
|
262
|
+
export type { SubAgentRegistry } from '../agent/sub-agents/registry.js';
|
|
160
263
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { LoopState } from '../agent/loop-state.js';
|
|
2
|
-
import type { TokenUsage } from '../types/index.js';
|
|
3
|
-
export interface SessionUsageSnapshot {
|
|
4
|
-
id: string;
|
|
5
|
-
modelId: string;
|
|
6
|
-
startedAt: string;
|
|
7
|
-
updatedAt: string;
|
|
8
|
-
turnCount: number;
|
|
9
|
-
usage: TokenUsage;
|
|
10
|
-
}
|
|
11
|
-
/** Write the current usage state to disk. Fire-and-forget from the loop —
|
|
12
|
-
* callers should `void` this; failures are swallowed so a transient FS error
|
|
13
|
-
* never aborts the agent turn. */
|
|
14
|
-
export declare function persistUsageSnapshot(state: LoopState, modelId: string): Promise<void>;
|
|
15
|
-
/** Read the most recent usage snapshot for the current project (cwd). Returns
|
|
16
|
-
* null when no session has run here yet. /usage prefers in-memory state for
|
|
17
|
-
* the live session and only hits this on a fresh process. */
|
|
18
|
-
export declare function loadLatestUsageSnapshot(): Promise<SessionUsageSnapshot | null>;
|
|
19
|
-
/** Enumerate every per-session usage snapshot in this project, newest first.
|
|
20
|
-
* Used by `/usage history` — purely project-local, never traverses other
|
|
21
|
-
* cwds. Skips `latest.usage.json` since it's a duplicate pointer. Silently
|
|
22
|
-
* drops malformed JSON files instead of failing the whole listing. */
|
|
23
|
-
export declare function listSessionUsageSnapshots(): Promise<SessionUsageSnapshot[]>;
|
|
24
|
-
//# sourceMappingURL=session-usage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage.d.ts","sourceRoot":"","sources":["../../src/knowledge/session-usage.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;CAClB;AAgBD;;mCAEmC;AACnC,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3F;AAED;;8DAE8D;AAC9D,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAOpF;AAED;;;uEAGuE;AACvE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqBjF"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
// @x-code-cli/core — Per-session token usage persistence.
|
|
2
|
-
//
|
|
3
|
-
// Writes a small JSON snapshot to .x-code/sessions/{sessionId}.usage.json on
|
|
4
|
-
// every assistant turn so that /usage works after a restart and so the user
|
|
5
|
-
// can grep/diff usage across sessions in the project. Scope is intentionally
|
|
6
|
-
// per-cwd (project-local) — there's no cross-project aggregation.
|
|
7
|
-
//
|
|
8
|
-
// Kept separate from session.ts (which writes the LLM-generated SessionSummary
|
|
9
|
-
// at exit/compact) because the two write at different cadences and would
|
|
10
|
-
// clobber each other if they shared a file.
|
|
11
|
-
import fs from 'node:fs/promises';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import { XCODE_DIR } from '../utils.js';
|
|
14
|
-
const SESSIONS_DIR = `${XCODE_DIR}/sessions`;
|
|
15
|
-
function getSessionsDir() {
|
|
16
|
-
return path.join(process.cwd(), SESSIONS_DIR);
|
|
17
|
-
}
|
|
18
|
-
function getUsagePath(sessionId) {
|
|
19
|
-
return path.join(getSessionsDir(), `${sessionId}.usage.json`);
|
|
20
|
-
}
|
|
21
|
-
function getLatestUsagePath() {
|
|
22
|
-
return path.join(getSessionsDir(), 'latest.usage.json');
|
|
23
|
-
}
|
|
24
|
-
/** Write the current usage state to disk. Fire-and-forget from the loop —
|
|
25
|
-
* callers should `void` this; failures are swallowed so a transient FS error
|
|
26
|
-
* never aborts the agent turn. */
|
|
27
|
-
export async function persistUsageSnapshot(state, modelId) {
|
|
28
|
-
const snapshot = {
|
|
29
|
-
id: state.sessionId,
|
|
30
|
-
modelId,
|
|
31
|
-
startedAt: state.startedAt,
|
|
32
|
-
updatedAt: new Date().toISOString(),
|
|
33
|
-
turnCount: state.turnCount,
|
|
34
|
-
usage: { ...state.tokenUsage },
|
|
35
|
-
};
|
|
36
|
-
try {
|
|
37
|
-
await fs.mkdir(getSessionsDir(), { recursive: true });
|
|
38
|
-
const json = JSON.stringify(snapshot, null, 2);
|
|
39
|
-
await Promise.all([
|
|
40
|
-
fs.writeFile(getUsagePath(state.sessionId), json, 'utf-8'),
|
|
41
|
-
fs.writeFile(getLatestUsagePath(), json, 'utf-8'),
|
|
42
|
-
]);
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// Persistence is best-effort; never block the agent loop on FS errors.
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** Read the most recent usage snapshot for the current project (cwd). Returns
|
|
49
|
-
* null when no session has run here yet. /usage prefers in-memory state for
|
|
50
|
-
* the live session and only hits this on a fresh process. */
|
|
51
|
-
export async function loadLatestUsageSnapshot() {
|
|
52
|
-
try {
|
|
53
|
-
const raw = await fs.readFile(getLatestUsagePath(), 'utf-8');
|
|
54
|
-
return JSON.parse(raw);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** Enumerate every per-session usage snapshot in this project, newest first.
|
|
61
|
-
* Used by `/usage history` — purely project-local, never traverses other
|
|
62
|
-
* cwds. Skips `latest.usage.json` since it's a duplicate pointer. Silently
|
|
63
|
-
* drops malformed JSON files instead of failing the whole listing. */
|
|
64
|
-
export async function listSessionUsageSnapshots() {
|
|
65
|
-
let entries;
|
|
66
|
-
try {
|
|
67
|
-
entries = await fs.readdir(getSessionsDir());
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
const usageFiles = entries.filter((f) => f.endsWith('.usage.json') && f !== 'latest.usage.json');
|
|
73
|
-
const snapshots = await Promise.all(usageFiles.map(async (f) => {
|
|
74
|
-
try {
|
|
75
|
-
const raw = await fs.readFile(path.join(getSessionsDir(), f), 'utf-8');
|
|
76
|
-
return JSON.parse(raw);
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
}));
|
|
82
|
-
return snapshots
|
|
83
|
-
.filter((s) => s !== null)
|
|
84
|
-
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=session-usage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage.js","sourceRoot":"","sources":["../../src/knowledge/session-usage.ts"],"names":[],"mappings":"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"}
|