sidekick-shared 0.14.0 → 0.14.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.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/dist/modelContext.d.ts +15 -0
- package/dist/modelContext.js +70 -0
- package/dist/providers/claudeCode.d.ts +5 -1
- package/dist/providers/claudeCode.js +12 -3
- package/dist/providers/codex.js +2 -16
- package/dist/providers/openCode.d.ts +4 -0
- package/dist/providers/openCode.js +11 -25
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -88,5 +88,6 @@ export { fetchQuota } from './quota';
|
|
|
88
88
|
export type { QuotaWindow, QuotaState } from './quota';
|
|
89
89
|
export { describeQuotaFailure } from './quotaPresentation';
|
|
90
90
|
export type { QuotaFailureDescriptor } from './quotaPresentation';
|
|
91
|
+
export { getModelContextWindowSize, DEFAULT_CONTEXT_WINDOW } from './modelContext';
|
|
91
92
|
export { fetchProviderStatus } from './providerStatus';
|
|
92
93
|
export type { ProviderStatusState } from './providerStatus';
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.detectSessionActivity = exports.extractTaskInfo = exports.scanSubagentDir = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.CodexRolloutParser = exports.parseDbPartData = exports.parseDbMessageData = exports.convertOpenCodeMessage = exports.detectPlanModeFromText = exports.normalizeToolInput = exports.normalizeToolName = exports.TRUNCATION_PATTERNS = exports.JsonlParser = exports.CodexProvider = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = exports.getProjectSlugRaw = exports.getProjectSlug = exports.encodeWorkspacePath = exports.getGlobalDataPath = exports.getProjectDataPath = exports.getConfigDir = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyTokenTotals = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = void 0;
|
|
7
7
|
exports.HeatmapTracker = exports.FrequencyTracker = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.toFollowEvents = exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = void 0;
|
|
8
|
-
exports.fetchProviderStatus = exports.describeQuotaFailure = exports.fetchQuota = exports.isMultiAccountEnabled = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.getAccountsDir = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscript = exports.generateHtmlReport = exports.PatternExtractor = void 0;
|
|
8
|
+
exports.fetchProviderStatus = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = exports.describeQuotaFailure = exports.fetchQuota = exports.isMultiAccountEnabled = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.getAccountsDir = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscript = exports.generateHtmlReport = exports.PatternExtractor = void 0;
|
|
9
9
|
var taskPersistence_1 = require("./types/taskPersistence");
|
|
10
10
|
Object.defineProperty(exports, "TASK_PERSISTENCE_SCHEMA_VERSION", { enumerable: true, get: function () { return taskPersistence_1.TASK_PERSISTENCE_SCHEMA_VERSION; } });
|
|
11
11
|
Object.defineProperty(exports, "normalizeTaskStatus", { enumerable: true, get: function () { return taskPersistence_1.normalizeTaskStatus; } });
|
|
@@ -199,6 +199,10 @@ var quota_1 = require("./quota");
|
|
|
199
199
|
Object.defineProperty(exports, "fetchQuota", { enumerable: true, get: function () { return quota_1.fetchQuota; } });
|
|
200
200
|
var quotaPresentation_1 = require("./quotaPresentation");
|
|
201
201
|
Object.defineProperty(exports, "describeQuotaFailure", { enumerable: true, get: function () { return quotaPresentation_1.describeQuotaFailure; } });
|
|
202
|
+
// Model Context
|
|
203
|
+
var modelContext_1 = require("./modelContext");
|
|
204
|
+
Object.defineProperty(exports, "getModelContextWindowSize", { enumerable: true, get: function () { return modelContext_1.getModelContextWindowSize; } });
|
|
205
|
+
Object.defineProperty(exports, "DEFAULT_CONTEXT_WINDOW", { enumerable: true, get: function () { return modelContext_1.DEFAULT_CONTEXT_WINDOW; } });
|
|
202
206
|
// Provider Status
|
|
203
207
|
var providerStatus_1 = require("./providerStatus");
|
|
204
208
|
Object.defineProperty(exports, "fetchProviderStatus", { enumerable: true, get: function () { return providerStatus_1.fetchProviderStatus; } });
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized model ID → context window size lookup.
|
|
3
|
+
* Single source of truth used by all providers and the CLI dashboard.
|
|
4
|
+
*/
|
|
5
|
+
/** Default context window size when model is unknown. */
|
|
6
|
+
export declare const DEFAULT_CONTEXT_WINDOW = 200000;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the context window size for a model ID.
|
|
9
|
+
*
|
|
10
|
+
* Lookup order:
|
|
11
|
+
* 1. Exact match against MODEL_CONTEXT_SIZES
|
|
12
|
+
* 2. Longest-prefix match (e.g. "claude-opus-4-6-20250414" → "claude-opus-4-6")
|
|
13
|
+
* 3. DEFAULT_CONTEXT_WINDOW
|
|
14
|
+
*/
|
|
15
|
+
export declare function getModelContextWindowSize(modelId?: string): number;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Centralized model ID → context window size lookup.
|
|
4
|
+
* Single source of truth used by all providers and the CLI dashboard.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DEFAULT_CONTEXT_WINDOW = void 0;
|
|
8
|
+
exports.getModelContextWindowSize = getModelContextWindowSize;
|
|
9
|
+
/** Known model context window sizes (in tokens). */
|
|
10
|
+
const MODEL_CONTEXT_SIZES = {
|
|
11
|
+
// Claude 4.6 family (1M context)
|
|
12
|
+
'claude-opus-4-6': 1_000_000,
|
|
13
|
+
'claude-sonnet-4-6': 1_000_000,
|
|
14
|
+
// Claude 4 family
|
|
15
|
+
'claude-opus-4': 200_000,
|
|
16
|
+
'claude-sonnet-4': 200_000,
|
|
17
|
+
// Claude 3.5 family
|
|
18
|
+
'claude-3-5-sonnet': 200_000,
|
|
19
|
+
'claude-3-5-haiku': 200_000,
|
|
20
|
+
// Claude 4.5 / Haiku
|
|
21
|
+
'claude-haiku-4-5': 200_000,
|
|
22
|
+
// Claude 3 family
|
|
23
|
+
'claude-3-opus': 200_000,
|
|
24
|
+
'claude-3-sonnet': 200_000,
|
|
25
|
+
'claude-3-haiku': 200_000,
|
|
26
|
+
// OpenAI GPT-4.1 series (1M context)
|
|
27
|
+
'gpt-4.1': 1_048_576,
|
|
28
|
+
// OpenAI GPT-5 series
|
|
29
|
+
'gpt-5': 400_000,
|
|
30
|
+
// OpenAI reasoning
|
|
31
|
+
'o1': 200_000,
|
|
32
|
+
'o3': 200_000,
|
|
33
|
+
'o4': 200_000,
|
|
34
|
+
// OpenAI GPT-4 series
|
|
35
|
+
'gpt-4o': 128_000,
|
|
36
|
+
'gpt-4-turbo': 128_000,
|
|
37
|
+
'gpt-4': 8_192,
|
|
38
|
+
// Gemini
|
|
39
|
+
'gemini': 1_000_000,
|
|
40
|
+
// DeepSeek
|
|
41
|
+
'deepseek': 128_000,
|
|
42
|
+
};
|
|
43
|
+
/** Prefix keys sorted longest-first for correct prefix matching. */
|
|
44
|
+
const SORTED_KEYS = Object.keys(MODEL_CONTEXT_SIZES)
|
|
45
|
+
.sort((a, b) => b.length - a.length);
|
|
46
|
+
/** Default context window size when model is unknown. */
|
|
47
|
+
exports.DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the context window size for a model ID.
|
|
50
|
+
*
|
|
51
|
+
* Lookup order:
|
|
52
|
+
* 1. Exact match against MODEL_CONTEXT_SIZES
|
|
53
|
+
* 2. Longest-prefix match (e.g. "claude-opus-4-6-20250414" → "claude-opus-4-6")
|
|
54
|
+
* 3. DEFAULT_CONTEXT_WINDOW
|
|
55
|
+
*/
|
|
56
|
+
function getModelContextWindowSize(modelId) {
|
|
57
|
+
if (!modelId)
|
|
58
|
+
return exports.DEFAULT_CONTEXT_WINDOW;
|
|
59
|
+
// Exact match
|
|
60
|
+
if (MODEL_CONTEXT_SIZES[modelId] !== undefined) {
|
|
61
|
+
return MODEL_CONTEXT_SIZES[modelId];
|
|
62
|
+
}
|
|
63
|
+
// Longest-prefix match
|
|
64
|
+
for (const key of SORTED_KEYS) {
|
|
65
|
+
if (modelId.startsWith(key)) {
|
|
66
|
+
return MODEL_CONTEXT_SIZES[key];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return exports.DEFAULT_CONTEXT_WINDOW;
|
|
70
|
+
}
|
|
@@ -19,6 +19,8 @@ import type { SessionProviderBase, SessionReader, SessionFileStats, SearchHit, P
|
|
|
19
19
|
export declare class ClaudeCodeProvider implements SessionProviderBase {
|
|
20
20
|
readonly id: ProviderId;
|
|
21
21
|
readonly displayName = "Claude Code";
|
|
22
|
+
/** Runtime-reported context window limit (overrides static map when set). */
|
|
23
|
+
private dynamicContextWindowLimit;
|
|
22
24
|
getSessionDirectory(workspacePath: string): string;
|
|
23
25
|
discoverSessionDirectory(workspacePath: string): string | null;
|
|
24
26
|
findActiveSession(workspacePath: string): string | null;
|
|
@@ -36,7 +38,9 @@ export declare class ClaudeCodeProvider implements SessionProviderBase {
|
|
|
36
38
|
searchInSession(sessionPath: string, query: string, maxResults: number): SearchHit[];
|
|
37
39
|
getProjectsBaseDir(): string;
|
|
38
40
|
readSessionStats(sessionPath: string): SessionFileStats;
|
|
39
|
-
getContextWindowLimit(
|
|
41
|
+
getContextWindowLimit(modelId?: string): number;
|
|
42
|
+
/** Set a runtime-reported context window limit (overrides static map). */
|
|
43
|
+
setDynamicContextWindowLimit(limit: number): void;
|
|
40
44
|
/**
|
|
41
45
|
* Returns the latest assistant message's token usage snapshot.
|
|
42
46
|
*
|
|
@@ -49,6 +49,7 @@ const path = __importStar(require("path"));
|
|
|
49
49
|
const jsonl_1 = require("../parsers/jsonl");
|
|
50
50
|
const sessionPathResolver_1 = require("../parsers/sessionPathResolver");
|
|
51
51
|
const subagentScanner_1 = require("../parsers/subagentScanner");
|
|
52
|
+
const modelContext_1 = require("../modelContext");
|
|
52
53
|
/** Type guard for content blocks with a `type` string property */
|
|
53
54
|
function isTypedBlock(block) {
|
|
54
55
|
return block !== null && typeof block === 'object' && typeof block.type === 'string';
|
|
@@ -172,6 +173,8 @@ class ClaudeCodeReader {
|
|
|
172
173
|
class ClaudeCodeProvider {
|
|
173
174
|
id = 'claude-code';
|
|
174
175
|
displayName = 'Claude Code';
|
|
176
|
+
/** Runtime-reported context window limit (overrides static map when set). */
|
|
177
|
+
dynamicContextWindowLimit = null;
|
|
175
178
|
// --- Path resolution ---
|
|
176
179
|
getSessionDirectory(workspacePath) {
|
|
177
180
|
return (0, sessionPathResolver_1.getSessionDirectory)(workspacePath);
|
|
@@ -406,8 +409,14 @@ class ClaudeCodeProvider {
|
|
|
406
409
|
};
|
|
407
410
|
}
|
|
408
411
|
// --- Optional methods ---
|
|
409
|
-
getContextWindowLimit(
|
|
410
|
-
|
|
412
|
+
getContextWindowLimit(modelId) {
|
|
413
|
+
if (this.dynamicContextWindowLimit)
|
|
414
|
+
return this.dynamicContextWindowLimit;
|
|
415
|
+
return (0, modelContext_1.getModelContextWindowSize)(modelId);
|
|
416
|
+
}
|
|
417
|
+
/** Set a runtime-reported context window limit (overrides static map). */
|
|
418
|
+
setDynamicContextWindowLimit(limit) {
|
|
419
|
+
this.dynamicContextWindowLimit = limit;
|
|
411
420
|
}
|
|
412
421
|
/**
|
|
413
422
|
* Returns the latest assistant message's token usage snapshot.
|
|
@@ -459,7 +468,7 @@ class ClaudeCodeProvider {
|
|
|
459
468
|
}
|
|
460
469
|
// --- Lifecycle ---
|
|
461
470
|
dispose() {
|
|
462
|
-
|
|
471
|
+
this.dynamicContextWindowLimit = null;
|
|
463
472
|
}
|
|
464
473
|
}
|
|
465
474
|
exports.ClaudeCodeProvider = ClaudeCodeProvider;
|
package/dist/providers/codex.js
CHANGED
|
@@ -49,6 +49,7 @@ const os = __importStar(require("os"));
|
|
|
49
49
|
const path = __importStar(require("path"));
|
|
50
50
|
const codexParser_1 = require("../parsers/codexParser");
|
|
51
51
|
const codexDatabase_1 = require("./codexDatabase");
|
|
52
|
+
const modelContext_1 = require("../modelContext");
|
|
52
53
|
// ---------------------------------------------------------------------------
|
|
53
54
|
// Helper functions
|
|
54
55
|
// ---------------------------------------------------------------------------
|
|
@@ -897,22 +898,7 @@ class CodexProvider {
|
|
|
897
898
|
// Prefer actual model_context_window reported by token_count events
|
|
898
899
|
if (this.dynamicContextWindowLimit)
|
|
899
900
|
return this.dynamicContextWindowLimit;
|
|
900
|
-
|
|
901
|
-
return 128_000;
|
|
902
|
-
const id = modelId.toLowerCase();
|
|
903
|
-
// GPT-4.1 series: 1M context
|
|
904
|
-
if (id.startsWith('gpt-4.1'))
|
|
905
|
-
return 1_048_576;
|
|
906
|
-
// GPT-4o: 128K
|
|
907
|
-
if (id.startsWith('gpt-4o') || id.startsWith('gpt-4'))
|
|
908
|
-
return 128_000;
|
|
909
|
-
// o3 / o4-mini: 200K
|
|
910
|
-
if (id.startsWith('o3') || id.startsWith('o4'))
|
|
911
|
-
return 200_000;
|
|
912
|
-
// o1: 200K
|
|
913
|
-
if (id.startsWith('o1'))
|
|
914
|
-
return 200_000;
|
|
915
|
-
return 128_000;
|
|
901
|
+
return (0, modelContext_1.getModelContextWindowSize)(modelId);
|
|
916
902
|
}
|
|
917
903
|
getCurrentUsageSnapshot(_sessionPath) {
|
|
918
904
|
// Return the last token usage snapshot received via the CodexReader callback.
|
|
@@ -31,6 +31,8 @@ export declare class OpenCodeProvider implements SessionProviderBase {
|
|
|
31
31
|
private dbStatus;
|
|
32
32
|
/** Cache of session metadata populated during listing */
|
|
33
33
|
private sessionMetaCache;
|
|
34
|
+
/** Runtime-reported context window limit (overrides static map when set). */
|
|
35
|
+
private dynamicContextWindowLimit;
|
|
34
36
|
/** Lazy-initialize the database connection. */
|
|
35
37
|
private ensureDb;
|
|
36
38
|
getRuntimeStatus(): ProviderRuntimeStatus;
|
|
@@ -70,5 +72,7 @@ export declare class OpenCodeProvider implements SessionProviderBase {
|
|
|
70
72
|
computeContextSize(usage: TokenUsage): number;
|
|
71
73
|
getContextAttribution(sessionPath: string): ContextAttribution | null;
|
|
72
74
|
getContextWindowLimit(modelId?: string): number;
|
|
75
|
+
/** Set a runtime-reported context window limit (overrides static map). */
|
|
76
|
+
setDynamicContextWindowLimit(limit: number): void;
|
|
73
77
|
dispose(): void;
|
|
74
78
|
}
|
|
@@ -57,6 +57,7 @@ const path = __importStar(require("path"));
|
|
|
57
57
|
const child_process_1 = require("child_process");
|
|
58
58
|
const openCodeParser_1 = require("../parsers/openCodeParser");
|
|
59
59
|
const openCodeDatabase_1 = require("./openCodeDatabase");
|
|
60
|
+
const modelContext_1 = require("../modelContext");
|
|
60
61
|
// ---------------------------------------------------------------------------
|
|
61
62
|
// Helper functions
|
|
62
63
|
// ---------------------------------------------------------------------------
|
|
@@ -611,6 +612,8 @@ class OpenCodeProvider {
|
|
|
611
612
|
dbStatus = { available: false, kind: 'db_missing' };
|
|
612
613
|
/** Cache of session metadata populated during listing */
|
|
613
614
|
sessionMetaCache = new Map();
|
|
615
|
+
/** Runtime-reported context window limit (overrides static map when set). */
|
|
616
|
+
dynamicContextWindowLimit = null;
|
|
614
617
|
/** Lazy-initialize the database connection. */
|
|
615
618
|
ensureDb() {
|
|
616
619
|
if (this.dbInitialized)
|
|
@@ -1525,31 +1528,13 @@ class OpenCodeProvider {
|
|
|
1525
1528
|
}
|
|
1526
1529
|
}
|
|
1527
1530
|
getContextWindowLimit(modelId) {
|
|
1528
|
-
if (
|
|
1529
|
-
return
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
if (id.startsWith('gpt-5'))
|
|
1536
|
-
return 400_000;
|
|
1537
|
-
// o1, o3, o4 series: 200K context
|
|
1538
|
-
if (id.startsWith('o1') || id.startsWith('o3') || id.startsWith('o4'))
|
|
1539
|
-
return 200_000;
|
|
1540
|
-
// GPT-4o / GPT-4 series: 128K context
|
|
1541
|
-
if (id.startsWith('gpt-4'))
|
|
1542
|
-
return 128_000;
|
|
1543
|
-
// Claude models: 200K context
|
|
1544
|
-
if (id.startsWith('claude'))
|
|
1545
|
-
return 200_000;
|
|
1546
|
-
// Gemini models: 1M context
|
|
1547
|
-
if (id.startsWith('gemini'))
|
|
1548
|
-
return 1_000_000;
|
|
1549
|
-
// DeepSeek models: 128K context
|
|
1550
|
-
if (id.startsWith('deepseek'))
|
|
1551
|
-
return 128_000;
|
|
1552
|
-
return 200_000;
|
|
1531
|
+
if (this.dynamicContextWindowLimit)
|
|
1532
|
+
return this.dynamicContextWindowLimit;
|
|
1533
|
+
return (0, modelContext_1.getModelContextWindowSize)(modelId);
|
|
1534
|
+
}
|
|
1535
|
+
/** Set a runtime-reported context window limit (overrides static map). */
|
|
1536
|
+
setDynamicContextWindowLimit(limit) {
|
|
1537
|
+
this.dynamicContextWindowLimit = limit;
|
|
1553
1538
|
}
|
|
1554
1539
|
// --- Lifecycle ---
|
|
1555
1540
|
dispose() {
|
|
@@ -1557,6 +1542,7 @@ class OpenCodeProvider {
|
|
|
1557
1542
|
this.db = null;
|
|
1558
1543
|
this.dbInitialized = false;
|
|
1559
1544
|
this.sessionMetaCache.clear();
|
|
1545
|
+
this.dynamicContextWindowLimit = null;
|
|
1560
1546
|
}
|
|
1561
1547
|
}
|
|
1562
1548
|
exports.OpenCodeProvider = OpenCodeProvider;
|
package/package.json
CHANGED