gencode-ai 0.1.3 → 0.3.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/README.md +2 -1
- package/dist/agent/agent.d.ts +44 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +130 -11
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/types.d.ts +11 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/checkpointing/checkpoint-manager.d.ts +87 -0
- package/dist/checkpointing/checkpoint-manager.d.ts.map +1 -0
- package/dist/checkpointing/checkpoint-manager.js +281 -0
- package/dist/checkpointing/checkpoint-manager.js.map +1 -0
- package/dist/checkpointing/index.d.ts +29 -0
- package/dist/checkpointing/index.d.ts.map +1 -0
- package/dist/checkpointing/index.js +29 -0
- package/dist/checkpointing/index.js.map +1 -0
- package/dist/checkpointing/types.d.ts +98 -0
- package/dist/checkpointing/types.d.ts.map +1 -0
- package/dist/checkpointing/types.js +7 -0
- package/dist/checkpointing/types.js.map +1 -0
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +171 -14
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +5 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +7 -1
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +12 -3
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/ModeIndicator.d.ts +42 -0
- package/dist/cli/components/ModeIndicator.d.ts.map +1 -0
- package/dist/cli/components/ModeIndicator.js +52 -0
- package/dist/cli/components/ModeIndicator.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +4 -3
- package/dist/cli/components/ModelSelector.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.js +54 -37
- package/dist/cli/components/ModelSelector.js.map +1 -1
- package/dist/cli/components/PlanApproval.d.ts +36 -0
- package/dist/cli/components/PlanApproval.d.ts.map +1 -0
- package/dist/cli/components/PlanApproval.js +154 -0
- package/dist/cli/components/PlanApproval.js.map +1 -0
- package/dist/cli/components/ProviderManager.d.ts +2 -2
- package/dist/cli/components/ProviderManager.d.ts.map +1 -1
- package/dist/cli/components/ProviderManager.js +137 -156
- package/dist/cli/components/ProviderManager.js.map +1 -1
- package/dist/cli/components/theme.d.ts +2 -0
- package/dist/cli/components/theme.d.ts.map +1 -1
- package/dist/cli/components/theme.js +3 -0
- package/dist/cli/components/theme.js.map +1 -1
- package/dist/cli/index.js +30 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +5 -5
- package/dist/config/levels.d.ts.map +1 -1
- package/dist/config/levels.js +20 -20
- package/dist/config/levels.js.map +1 -1
- package/dist/config/merger.js +1 -1
- package/dist/config/merger.js.map +1 -1
- package/dist/config/providers-config.d.ts +8 -5
- package/dist/config/providers-config.d.ts.map +1 -1
- package/dist/config/providers-config.js +19 -22
- package/dist/config/providers-config.js.map +1 -1
- package/dist/config/test-utils.d.ts +2 -2
- package/dist/config/test-utils.d.ts.map +1 -1
- package/dist/config/test-utils.js +4 -4
- package/dist/config/test-utils.js.map +1 -1
- package/dist/config/types.d.ts +23 -17
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +14 -14
- package/dist/config/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +25 -12
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +241 -112
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/test-utils.d.ts +1 -1
- package/dist/memory/test-utils.d.ts.map +1 -1
- package/dist/memory/test-utils.js +3 -3
- package/dist/memory/test-utils.js.map +1 -1
- package/dist/memory/types.d.ts +20 -10
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +13 -13
- package/dist/memory/types.js.map +1 -1
- package/dist/migration/migrate.d.ts +24 -0
- package/dist/migration/migrate.d.ts.map +1 -0
- package/dist/migration/migrate.js +164 -0
- package/dist/migration/migrate.js.map +1 -0
- package/dist/permissions/persistence.d.ts +2 -2
- package/dist/permissions/persistence.js +4 -4
- package/dist/permissions/persistence.js.map +1 -1
- package/dist/planning/index.d.ts +13 -0
- package/dist/planning/index.d.ts.map +1 -0
- package/dist/planning/index.js +15 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/plan-file.d.ts +59 -0
- package/dist/planning/plan-file.d.ts.map +1 -0
- package/dist/planning/plan-file.js +278 -0
- package/dist/planning/plan-file.js.map +1 -0
- package/dist/planning/state.d.ts +127 -0
- package/dist/planning/state.d.ts.map +1 -0
- package/dist/planning/state.js +261 -0
- package/dist/planning/state.js.map +1 -0
- package/dist/planning/tools/enter-plan-mode.d.ts +25 -0
- package/dist/planning/tools/enter-plan-mode.d.ts.map +1 -0
- package/dist/planning/tools/enter-plan-mode.js +98 -0
- package/dist/planning/tools/enter-plan-mode.js.map +1 -0
- package/dist/planning/tools/exit-plan-mode.d.ts +24 -0
- package/dist/planning/tools/exit-plan-mode.d.ts.map +1 -0
- package/dist/planning/tools/exit-plan-mode.js +149 -0
- package/dist/planning/tools/exit-plan-mode.js.map +1 -0
- package/dist/planning/types.d.ts +100 -0
- package/dist/planning/types.d.ts.map +1 -0
- package/dist/planning/types.js +28 -0
- package/dist/planning/types.js.map +1 -0
- package/dist/pricing/calculator.d.ts +21 -0
- package/dist/pricing/calculator.d.ts.map +1 -0
- package/dist/pricing/calculator.js +59 -0
- package/dist/pricing/calculator.js.map +1 -0
- package/dist/pricing/index.d.ts +7 -0
- package/dist/pricing/index.d.ts.map +1 -0
- package/dist/pricing/index.js +7 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/models.d.ts +20 -0
- package/dist/pricing/models.d.ts.map +1 -0
- package/dist/pricing/models.js +322 -0
- package/dist/pricing/models.js.map +1 -0
- package/dist/pricing/types.d.ts +30 -0
- package/dist/pricing/types.d.ts.map +1 -0
- package/dist/pricing/types.js +5 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/prompts/index.d.ts +5 -4
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +11 -8
- package/dist/prompts/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +2 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +24 -10
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/gemini.d.ts +2 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +28 -14
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +20 -10
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +48 -24
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +19 -8
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +48 -34
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +72 -88
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/store.d.ts +43 -17
- package/dist/providers/store.d.ts.map +1 -1
- package/dist/providers/store.js +112 -19
- package/dist/providers/store.js.map +1 -1
- package/dist/providers/types.d.ts +25 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/vertex-ai.d.ts +15 -7
- package/dist/providers/vertex-ai.d.ts.map +1 -1
- package/dist/providers/vertex-ai.js +63 -23
- package/dist/providers/vertex-ai.js.map +1 -1
- package/dist/session/manager.d.ts +4 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +8 -0
- package/dist/session/manager.js.map +1 -1
- package/dist/session/types.js +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/tools/index.d.ts +7 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +13 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +79 -2
- package/dist/tools/registry.js.map +1 -1
- package/docs/config-system-comparison.md +50 -50
- package/docs/cost-tracking-comparison.md +904 -0
- package/docs/memory-system.md +124 -31
- package/docs/operating-modes.md +96 -0
- package/docs/permissions.md +2 -2
- package/docs/proposals/0006-memory-system.md +4 -4
- package/docs/proposals/0008-checkpointing.md +109 -2
- package/docs/proposals/0011-custom-commands.md +2 -1
- package/docs/proposals/0021-skills-system.md +2 -1
- package/docs/proposals/0023-permission-enhancements.md +2 -2
- package/docs/proposals/0025-cost-tracking.md +60 -2
- package/docs/proposals/0033-enterprise-deployment.md +1 -1
- package/docs/proposals/0041-configuration-system.md +17 -19
- package/docs/proposals/0042-prompt-optimization.md +17 -9
- package/docs/proposals/README.md +6 -6
- package/docs/providers.md +94 -9
- package/examples/test-checkpointing.ts +121 -0
- package/examples/test-cost-tracking.ts +77 -0
- package/examples/test-interrupt-cleanup.ts +94 -0
- package/package.json +3 -2
- package/scripts/migrate.ts +449 -0
- package/src/agent/agent.ts +161 -12
- package/src/agent/types.ts +11 -1
- package/src/checkpointing/checkpoint-manager.ts +327 -0
- package/src/checkpointing/index.ts +45 -0
- package/src/checkpointing/types.ts +104 -0
- package/src/cli/components/App.tsx +221 -13
- package/src/cli/components/CommandSuggestions.tsx +5 -0
- package/src/cli/components/Messages.tsx +24 -5
- package/src/cli/components/ModeIndicator.tsx +174 -0
- package/src/cli/components/ModelSelector.tsx +62 -43
- package/src/cli/components/PlanApproval.tsx +327 -0
- package/src/cli/components/ProviderManager.tsx +278 -323
- package/src/cli/components/theme.ts +3 -0
- package/src/cli/index.tsx +36 -17
- package/src/config/index.ts +5 -3
- package/src/config/levels.test.ts +22 -22
- package/src/config/levels.ts +22 -22
- package/src/config/loader.test.ts +14 -14
- package/src/config/manager.test.ts +19 -19
- package/src/config/merger.test.ts +23 -23
- package/src/config/merger.ts +1 -1
- package/src/config/providers-config.ts +23 -21
- package/src/config/test-utils.ts +6 -6
- package/src/config/types.ts +30 -20
- package/src/index.ts +15 -0
- package/src/memory/memory-manager.test.ts +242 -24
- package/src/memory/memory-manager.ts +270 -141
- package/src/memory/test-utils.ts +4 -4
- package/src/memory/types.ts +28 -17
- package/src/permissions/persistence.ts +4 -4
- package/src/planning/index.ts +53 -0
- package/src/planning/plan-file.ts +326 -0
- package/src/planning/state.ts +305 -0
- package/src/planning/tools/enter-plan-mode.ts +111 -0
- package/src/planning/tools/exit-plan-mode.ts +170 -0
- package/src/planning/types.ts +150 -0
- package/src/pricing/calculator.ts +71 -0
- package/src/pricing/index.ts +7 -0
- package/src/pricing/models.ts +334 -0
- package/src/pricing/types.ts +32 -0
- package/src/prompts/index.ts +13 -9
- package/src/providers/anthropic.ts +30 -10
- package/src/providers/gemini.ts +34 -14
- package/src/providers/index.ts +76 -33
- package/src/providers/openai.ts +26 -8
- package/src/providers/registry.ts +116 -111
- package/src/providers/store.ts +130 -28
- package/src/providers/types.ts +36 -1
- package/src/providers/vertex-ai.ts +70 -23
- package/src/session/manager.ts +9 -0
- package/src/session/types.ts +1 -1
- package/src/tools/index.ts +8 -0
- package/src/tools/registry.ts +95 -2
- package/.gencode/settings.local.json +0 -7
- package/CLAUDE.md +0 -86
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Types for Plan Mode - a read-only exploration mode that allows
|
|
5
|
+
* the LLM to plan implementations before executing changes.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Plan Mode State Types
|
|
10
|
+
// ============================================================================
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Plan mode phases following Claude Code's workflow
|
|
14
|
+
*/
|
|
15
|
+
export type PlanPhase =
|
|
16
|
+
| 'understanding' // Initial exploration
|
|
17
|
+
| 'design' // Planning approach
|
|
18
|
+
| 'review' // Clarifying with user
|
|
19
|
+
| 'final' // Writing plan file
|
|
20
|
+
| 'approval'; // Waiting for user approval
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* User approval options for plan mode
|
|
24
|
+
*/
|
|
25
|
+
export type PlanApprovalOption =
|
|
26
|
+
| 'approve' // Accept plan and execute with auto-accept edits
|
|
27
|
+
| 'approve_clear' // Accept plan, clear context, auto-accept edits
|
|
28
|
+
| 'approve_manual' // Accept plan but manually approve each edit
|
|
29
|
+
| 'modify' // Go back to modify the plan
|
|
30
|
+
| 'cancel'; // Cancel plan mode entirely
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Pre-approved permission request (Claude Code ExitPlanMode style)
|
|
34
|
+
*/
|
|
35
|
+
export interface AllowedPrompt {
|
|
36
|
+
tool: 'Bash';
|
|
37
|
+
prompt: string; // Semantic description, e.g., "run tests", "install dependencies"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Plan mode state
|
|
42
|
+
*/
|
|
43
|
+
export interface PlanModeState {
|
|
44
|
+
/** Whether plan mode is currently active */
|
|
45
|
+
active: boolean;
|
|
46
|
+
|
|
47
|
+
/** Current phase of planning */
|
|
48
|
+
phase: PlanPhase;
|
|
49
|
+
|
|
50
|
+
/** Path to the plan file */
|
|
51
|
+
planFilePath: string | null;
|
|
52
|
+
|
|
53
|
+
/** User's original request that triggered plan mode */
|
|
54
|
+
originalRequest: string | null;
|
|
55
|
+
|
|
56
|
+
/** Requested permissions for execution phase */
|
|
57
|
+
requestedPermissions: AllowedPrompt[];
|
|
58
|
+
|
|
59
|
+
/** Timestamp when plan mode was entered */
|
|
60
|
+
enteredAt: Date | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Plan file structure
|
|
65
|
+
*/
|
|
66
|
+
export interface PlanFile {
|
|
67
|
+
/** Plan file path */
|
|
68
|
+
path: string;
|
|
69
|
+
|
|
70
|
+
/** Plan content in markdown */
|
|
71
|
+
content: string;
|
|
72
|
+
|
|
73
|
+
/** Creation timestamp */
|
|
74
|
+
createdAt: Date;
|
|
75
|
+
|
|
76
|
+
/** Last update timestamp */
|
|
77
|
+
updatedAt: Date;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Tool Filtering Types
|
|
82
|
+
// ============================================================================
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Tools allowed in plan mode (read-only + planning tools)
|
|
86
|
+
*/
|
|
87
|
+
export const PLAN_MODE_ALLOWED_TOOLS = [
|
|
88
|
+
'Read',
|
|
89
|
+
'Glob',
|
|
90
|
+
'Grep',
|
|
91
|
+
'WebFetch',
|
|
92
|
+
'WebSearch',
|
|
93
|
+
'TodoWrite',
|
|
94
|
+
'AskUserQuestion',
|
|
95
|
+
'EnterPlanMode', // Can re-enter if needed
|
|
96
|
+
'ExitPlanMode', // To exit plan mode
|
|
97
|
+
] as const;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Tools blocked in plan mode (write/execute operations)
|
|
101
|
+
*/
|
|
102
|
+
export const PLAN_MODE_BLOCKED_TOOLS = ['Write', 'Edit', 'Bash'] as const;
|
|
103
|
+
|
|
104
|
+
export type PlanModeAllowedTool = (typeof PLAN_MODE_ALLOWED_TOOLS)[number];
|
|
105
|
+
export type PlanModeBlockedTool = (typeof PLAN_MODE_BLOCKED_TOOLS)[number];
|
|
106
|
+
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// UI Types
|
|
109
|
+
// ============================================================================
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Operating mode (cycle with Shift+Tab: normal → plan → accept → normal)
|
|
113
|
+
* - normal: Default mode, edits require confirmation
|
|
114
|
+
* - plan: Read-only exploration mode, edits blocked
|
|
115
|
+
* - accept: Auto-accept mode, edits approved without confirmation
|
|
116
|
+
*/
|
|
117
|
+
export type ModeType = 'normal' | 'plan' | 'accept';
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Plan approval UI state
|
|
121
|
+
*/
|
|
122
|
+
export interface PlanApprovalState {
|
|
123
|
+
/** Plan content for display */
|
|
124
|
+
planContent: string;
|
|
125
|
+
|
|
126
|
+
/** Summary of files to change */
|
|
127
|
+
filesToChange: Array<{
|
|
128
|
+
path: string;
|
|
129
|
+
action: 'create' | 'modify' | 'delete';
|
|
130
|
+
}>;
|
|
131
|
+
|
|
132
|
+
/** Requested permissions */
|
|
133
|
+
requestedPermissions: AllowedPrompt[];
|
|
134
|
+
|
|
135
|
+
/** Callback when user makes decision */
|
|
136
|
+
onDecision: (option: PlanApprovalOption) => void;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// Event Types
|
|
141
|
+
// ============================================================================
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Plan mode events for UI updates
|
|
145
|
+
*/
|
|
146
|
+
export type PlanModeEvent =
|
|
147
|
+
| { type: 'enter'; planFilePath: string }
|
|
148
|
+
| { type: 'phase_change'; phase: PlanPhase }
|
|
149
|
+
| { type: 'exit'; approved: boolean }
|
|
150
|
+
| { type: 'toggle' }; // Shift+Tab toggle
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost calculation utilities
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { getModelPricing } from './models.js';
|
|
6
|
+
import { CostEstimate, TokenUsage } from './types.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Calculate cost from token usage
|
|
10
|
+
*/
|
|
11
|
+
export function calculateCost(
|
|
12
|
+
provider: string,
|
|
13
|
+
model: string,
|
|
14
|
+
tokens: TokenUsage
|
|
15
|
+
): CostEstimate {
|
|
16
|
+
const pricing = getModelPricing(provider, model);
|
|
17
|
+
|
|
18
|
+
// If no pricing found, return zero cost
|
|
19
|
+
if (!pricing) {
|
|
20
|
+
return {
|
|
21
|
+
inputCost: 0,
|
|
22
|
+
outputCost: 0,
|
|
23
|
+
totalCost: 0,
|
|
24
|
+
currency: 'USD',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Calculate cost per token type
|
|
29
|
+
const inputCost = (tokens.inputTokens / 1_000_000) * pricing.inputPer1M;
|
|
30
|
+
const outputCost = (tokens.outputTokens / 1_000_000) * pricing.outputPer1M;
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
inputCost,
|
|
34
|
+
outputCost,
|
|
35
|
+
totalCost: inputCost + outputCost,
|
|
36
|
+
currency: 'USD',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Format cost for display
|
|
42
|
+
*/
|
|
43
|
+
export function formatCost(cost: number): string {
|
|
44
|
+
if (cost === 0) {
|
|
45
|
+
return '$0.00';
|
|
46
|
+
}
|
|
47
|
+
if (cost < 0.01) {
|
|
48
|
+
return '<$0.01';
|
|
49
|
+
}
|
|
50
|
+
return `$${cost.toFixed(2)}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Format token count for display
|
|
55
|
+
*/
|
|
56
|
+
export function formatTokens(count: number): string {
|
|
57
|
+
if (count >= 1_000_000) {
|
|
58
|
+
return `${(count / 1_000_000).toFixed(1)}M`;
|
|
59
|
+
}
|
|
60
|
+
if (count >= 1_000) {
|
|
61
|
+
return `${(count / 1_000).toFixed(1)}K`;
|
|
62
|
+
}
|
|
63
|
+
return count.toString();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Format cost estimate for display
|
|
68
|
+
*/
|
|
69
|
+
export function formatCostEstimate(estimate: CostEstimate): string {
|
|
70
|
+
return formatCost(estimate.totalCost);
|
|
71
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model pricing database
|
|
3
|
+
* Prices are per 1M tokens in USD
|
|
4
|
+
* Updated: January 2025
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ModelPricing } from './types.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Pricing data for all supported models
|
|
11
|
+
* Source: Official provider pricing pages as of January 2025
|
|
12
|
+
*/
|
|
13
|
+
export const MODEL_PRICING: ModelPricing[] = [
|
|
14
|
+
// Anthropic Claude Models
|
|
15
|
+
{
|
|
16
|
+
provider: 'anthropic',
|
|
17
|
+
model: 'claude-opus-4-5',
|
|
18
|
+
inputPer1M: 15.0,
|
|
19
|
+
outputPer1M: 75.0,
|
|
20
|
+
effectiveDate: '2025-01-01',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
provider: 'anthropic',
|
|
24
|
+
model: 'claude-opus-4',
|
|
25
|
+
inputPer1M: 15.0,
|
|
26
|
+
outputPer1M: 75.0,
|
|
27
|
+
effectiveDate: '2024-11-01',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
provider: 'anthropic',
|
|
31
|
+
model: 'claude-sonnet-4-5',
|
|
32
|
+
inputPer1M: 3.0,
|
|
33
|
+
outputPer1M: 15.0,
|
|
34
|
+
effectiveDate: '2025-01-01',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
provider: 'anthropic',
|
|
38
|
+
model: 'claude-sonnet-4',
|
|
39
|
+
inputPer1M: 3.0,
|
|
40
|
+
outputPer1M: 15.0,
|
|
41
|
+
effectiveDate: '2024-10-22',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
provider: 'anthropic',
|
|
45
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
46
|
+
inputPer1M: 3.0,
|
|
47
|
+
outputPer1M: 15.0,
|
|
48
|
+
effectiveDate: '2024-10-22',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
provider: 'anthropic',
|
|
52
|
+
model: 'claude-3-5-sonnet-20240620',
|
|
53
|
+
inputPer1M: 3.0,
|
|
54
|
+
outputPer1M: 15.0,
|
|
55
|
+
effectiveDate: '2024-06-20',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
provider: 'anthropic',
|
|
59
|
+
model: 'claude-haiku-3-5',
|
|
60
|
+
inputPer1M: 0.8,
|
|
61
|
+
outputPer1M: 4.0,
|
|
62
|
+
effectiveDate: '2024-11-01',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
provider: 'anthropic',
|
|
66
|
+
model: 'claude-3-5-haiku-20241022',
|
|
67
|
+
inputPer1M: 0.8,
|
|
68
|
+
outputPer1M: 4.0,
|
|
69
|
+
effectiveDate: '2024-10-22',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
provider: 'anthropic',
|
|
73
|
+
model: 'claude-3-haiku-20240307',
|
|
74
|
+
inputPer1M: 0.25,
|
|
75
|
+
outputPer1M: 1.25,
|
|
76
|
+
effectiveDate: '2024-03-07',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
provider: 'anthropic',
|
|
80
|
+
model: 'claude-3-opus-20240229',
|
|
81
|
+
inputPer1M: 15.0,
|
|
82
|
+
outputPer1M: 75.0,
|
|
83
|
+
effectiveDate: '2024-02-29',
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
// OpenAI Models
|
|
87
|
+
{
|
|
88
|
+
provider: 'openai',
|
|
89
|
+
model: 'gpt-4o',
|
|
90
|
+
inputPer1M: 2.5,
|
|
91
|
+
outputPer1M: 10.0,
|
|
92
|
+
effectiveDate: '2024-08-06',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
provider: 'openai',
|
|
96
|
+
model: 'gpt-4o-2024-11-20',
|
|
97
|
+
inputPer1M: 2.5,
|
|
98
|
+
outputPer1M: 10.0,
|
|
99
|
+
effectiveDate: '2024-11-20',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
provider: 'openai',
|
|
103
|
+
model: 'gpt-4o-2024-08-06',
|
|
104
|
+
inputPer1M: 2.5,
|
|
105
|
+
outputPer1M: 10.0,
|
|
106
|
+
effectiveDate: '2024-08-06',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
provider: 'openai',
|
|
110
|
+
model: 'gpt-4o-2024-05-13',
|
|
111
|
+
inputPer1M: 5.0,
|
|
112
|
+
outputPer1M: 15.0,
|
|
113
|
+
effectiveDate: '2024-05-13',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
provider: 'openai',
|
|
117
|
+
model: 'gpt-4o-mini',
|
|
118
|
+
inputPer1M: 0.15,
|
|
119
|
+
outputPer1M: 0.6,
|
|
120
|
+
effectiveDate: '2024-07-18',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
provider: 'openai',
|
|
124
|
+
model: 'gpt-4o-mini-2024-07-18',
|
|
125
|
+
inputPer1M: 0.15,
|
|
126
|
+
outputPer1M: 0.6,
|
|
127
|
+
effectiveDate: '2024-07-18',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
provider: 'openai',
|
|
131
|
+
model: 'gpt-4-turbo',
|
|
132
|
+
inputPer1M: 10.0,
|
|
133
|
+
outputPer1M: 30.0,
|
|
134
|
+
effectiveDate: '2024-04-09',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
provider: 'openai',
|
|
138
|
+
model: 'gpt-4-turbo-2024-04-09',
|
|
139
|
+
inputPer1M: 10.0,
|
|
140
|
+
outputPer1M: 30.0,
|
|
141
|
+
effectiveDate: '2024-04-09',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
provider: 'openai',
|
|
145
|
+
model: 'gpt-4',
|
|
146
|
+
inputPer1M: 30.0,
|
|
147
|
+
outputPer1M: 60.0,
|
|
148
|
+
effectiveDate: '2023-03-14',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
provider: 'openai',
|
|
152
|
+
model: 'gpt-3.5-turbo',
|
|
153
|
+
inputPer1M: 0.5,
|
|
154
|
+
outputPer1M: 1.5,
|
|
155
|
+
effectiveDate: '2023-11-06',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
provider: 'openai',
|
|
159
|
+
model: 'o1',
|
|
160
|
+
inputPer1M: 15.0,
|
|
161
|
+
outputPer1M: 60.0,
|
|
162
|
+
effectiveDate: '2024-12-17',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
provider: 'openai',
|
|
166
|
+
model: 'o1-2024-12-17',
|
|
167
|
+
inputPer1M: 15.0,
|
|
168
|
+
outputPer1M: 60.0,
|
|
169
|
+
effectiveDate: '2024-12-17',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
provider: 'openai',
|
|
173
|
+
model: 'o1-preview',
|
|
174
|
+
inputPer1M: 15.0,
|
|
175
|
+
outputPer1M: 60.0,
|
|
176
|
+
effectiveDate: '2024-09-12',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
provider: 'openai',
|
|
180
|
+
model: 'o1-preview-2024-09-12',
|
|
181
|
+
inputPer1M: 15.0,
|
|
182
|
+
outputPer1M: 60.0,
|
|
183
|
+
effectiveDate: '2024-09-12',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
provider: 'openai',
|
|
187
|
+
model: 'o1-mini',
|
|
188
|
+
inputPer1M: 3.0,
|
|
189
|
+
outputPer1M: 12.0,
|
|
190
|
+
effectiveDate: '2024-09-12',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
provider: 'openai',
|
|
194
|
+
model: 'o1-mini-2024-09-12',
|
|
195
|
+
inputPer1M: 3.0,
|
|
196
|
+
outputPer1M: 12.0,
|
|
197
|
+
effectiveDate: '2024-09-12',
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
// Google Gemini Models
|
|
201
|
+
{
|
|
202
|
+
provider: 'gemini',
|
|
203
|
+
model: 'gemini-2.0-flash-exp',
|
|
204
|
+
inputPer1M: 0.0,
|
|
205
|
+
outputPer1M: 0.0,
|
|
206
|
+
effectiveDate: '2024-12-11',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
provider: 'gemini',
|
|
210
|
+
model: 'gemini-2.0-flash',
|
|
211
|
+
inputPer1M: 0.075,
|
|
212
|
+
outputPer1M: 0.3,
|
|
213
|
+
effectiveDate: '2025-01-01',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
provider: 'gemini',
|
|
217
|
+
model: 'gemini-exp-1206',
|
|
218
|
+
inputPer1M: 0.0,
|
|
219
|
+
outputPer1M: 0.0,
|
|
220
|
+
effectiveDate: '2024-12-06',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
provider: 'gemini',
|
|
224
|
+
model: 'gemini-1.5-pro',
|
|
225
|
+
inputPer1M: 1.25,
|
|
226
|
+
outputPer1M: 5.0,
|
|
227
|
+
effectiveDate: '2024-05-14',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
provider: 'gemini',
|
|
231
|
+
model: 'gemini-1.5-pro-002',
|
|
232
|
+
inputPer1M: 1.25,
|
|
233
|
+
outputPer1M: 5.0,
|
|
234
|
+
effectiveDate: '2024-09-24',
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
provider: 'gemini',
|
|
238
|
+
model: 'gemini-1.5-flash',
|
|
239
|
+
inputPer1M: 0.075,
|
|
240
|
+
outputPer1M: 0.3,
|
|
241
|
+
effectiveDate: '2024-05-14',
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
provider: 'gemini',
|
|
245
|
+
model: 'gemini-1.5-flash-002',
|
|
246
|
+
inputPer1M: 0.075,
|
|
247
|
+
outputPer1M: 0.3,
|
|
248
|
+
effectiveDate: '2024-09-24',
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
provider: 'gemini',
|
|
252
|
+
model: 'gemini-1.5-flash-8b',
|
|
253
|
+
inputPer1M: 0.0375,
|
|
254
|
+
outputPer1M: 0.15,
|
|
255
|
+
effectiveDate: '2024-10-03',
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
// Google Vertex AI (same pricing as Gemini)
|
|
259
|
+
{
|
|
260
|
+
provider: 'vertex-ai',
|
|
261
|
+
model: 'gemini-2.0-flash-exp',
|
|
262
|
+
inputPer1M: 0.0,
|
|
263
|
+
outputPer1M: 0.0,
|
|
264
|
+
effectiveDate: '2024-12-11',
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
provider: 'vertex-ai',
|
|
268
|
+
model: 'gemini-2.0-flash',
|
|
269
|
+
inputPer1M: 0.075,
|
|
270
|
+
outputPer1M: 0.3,
|
|
271
|
+
effectiveDate: '2025-01-01',
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
provider: 'vertex-ai',
|
|
275
|
+
model: 'gemini-exp-1206',
|
|
276
|
+
inputPer1M: 0.0,
|
|
277
|
+
outputPer1M: 0.0,
|
|
278
|
+
effectiveDate: '2024-12-06',
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
provider: 'vertex-ai',
|
|
282
|
+
model: 'gemini-1.5-pro',
|
|
283
|
+
inputPer1M: 1.25,
|
|
284
|
+
outputPer1M: 5.0,
|
|
285
|
+
effectiveDate: '2024-05-14',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
provider: 'vertex-ai',
|
|
289
|
+
model: 'gemini-1.5-pro-002',
|
|
290
|
+
inputPer1M: 1.25,
|
|
291
|
+
outputPer1M: 5.0,
|
|
292
|
+
effectiveDate: '2024-09-24',
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
provider: 'vertex-ai',
|
|
296
|
+
model: 'gemini-1.5-flash',
|
|
297
|
+
inputPer1M: 0.075,
|
|
298
|
+
outputPer1M: 0.3,
|
|
299
|
+
effectiveDate: '2024-05-14',
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
provider: 'vertex-ai',
|
|
303
|
+
model: 'gemini-1.5-flash-002',
|
|
304
|
+
inputPer1M: 0.075,
|
|
305
|
+
outputPer1M: 0.3,
|
|
306
|
+
effectiveDate: '2024-09-24',
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
provider: 'vertex-ai',
|
|
310
|
+
model: 'gemini-1.5-flash-8b',
|
|
311
|
+
inputPer1M: 0.0375,
|
|
312
|
+
outputPer1M: 0.15,
|
|
313
|
+
effectiveDate: '2024-10-03',
|
|
314
|
+
},
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Get pricing for a specific model
|
|
319
|
+
*/
|
|
320
|
+
export function getModelPricing(
|
|
321
|
+
provider: string,
|
|
322
|
+
model: string
|
|
323
|
+
): ModelPricing | undefined {
|
|
324
|
+
return MODEL_PRICING.find(
|
|
325
|
+
(p) => p.provider === provider && p.model === model
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Get all pricing for a provider
|
|
331
|
+
*/
|
|
332
|
+
export function getProviderPricing(provider: string): ModelPricing[] {
|
|
333
|
+
return MODEL_PRICING.filter((p) => p.provider === provider);
|
|
334
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing and cost tracking types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Token usage information
|
|
7
|
+
*/
|
|
8
|
+
export interface TokenUsage {
|
|
9
|
+
inputTokens: number;
|
|
10
|
+
outputTokens: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Cost estimate in USD
|
|
15
|
+
*/
|
|
16
|
+
export interface CostEstimate {
|
|
17
|
+
inputCost: number;
|
|
18
|
+
outputCost: number;
|
|
19
|
+
totalCost: number;
|
|
20
|
+
currency: string; // 'USD'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Model pricing per 1M tokens (USD)
|
|
25
|
+
*/
|
|
26
|
+
export interface ModelPricing {
|
|
27
|
+
provider: string;
|
|
28
|
+
model: string;
|
|
29
|
+
inputPer1M: number; // USD per 1M input tokens
|
|
30
|
+
outputPer1M: number; // USD per 1M output tokens
|
|
31
|
+
effectiveDate?: string; // When this pricing became effective
|
|
32
|
+
}
|
package/src/prompts/index.ts
CHANGED
|
@@ -14,7 +14,7 @@ import * as os from 'os';
|
|
|
14
14
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
15
|
|
|
16
16
|
// Path to providers.json config
|
|
17
|
-
const PROVIDERS_CONFIG_PATH = join(homedir(), '.
|
|
17
|
+
const PROVIDERS_CONFIG_PATH = join(homedir(), '.gen', 'providers.json');
|
|
18
18
|
|
|
19
19
|
// Resolve prompts directory - check both src and dist locations
|
|
20
20
|
function getPromptsDir(): string {
|
|
@@ -33,7 +33,7 @@ const promptsDir = getPromptsDir();
|
|
|
33
33
|
export type ProviderType = 'anthropic' | 'openai' | 'gemini' | 'generic';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Providers config structure from ~/.
|
|
36
|
+
* Providers config structure from ~/.gen/providers.json
|
|
37
37
|
*/
|
|
38
38
|
interface ProvidersConfig {
|
|
39
39
|
connections: Record<string, unknown>;
|
|
@@ -41,7 +41,7 @@ interface ProvidersConfig {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* Load providers config from ~/.
|
|
44
|
+
* Load providers config from ~/.gen/providers.json
|
|
45
45
|
*/
|
|
46
46
|
function loadProvidersConfig(): ProvidersConfig | null {
|
|
47
47
|
try {
|
|
@@ -57,7 +57,7 @@ function loadProvidersConfig(): ProvidersConfig | null {
|
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Look up which provider owns a given model ID
|
|
60
|
-
* Searches through ~/.
|
|
60
|
+
* Searches through ~/.gen/providers.json to find the provider
|
|
61
61
|
*
|
|
62
62
|
* @param model - The model ID (e.g., "claude-sonnet-4-5@20250929")
|
|
63
63
|
* @returns The provider name (e.g., "anthropic") or null if not found
|
|
@@ -80,9 +80,13 @@ export function getProviderForModel(model: string): string | null {
|
|
|
80
80
|
/**
|
|
81
81
|
* Map provider names to prompt types
|
|
82
82
|
* Falls back to 'generic' for unknown providers
|
|
83
|
+
* Handles both "provider" and "provider:authMethod" formats
|
|
83
84
|
*/
|
|
84
85
|
export function mapProviderToPromptType(provider: string): ProviderType {
|
|
85
|
-
|
|
86
|
+
// Extract provider prefix (e.g., "gemini:api_key" → "gemini")
|
|
87
|
+
const providerPrefix = provider.split(':')[0];
|
|
88
|
+
|
|
89
|
+
switch (providerPrefix) {
|
|
86
90
|
case 'anthropic':
|
|
87
91
|
return 'anthropic';
|
|
88
92
|
case 'openai':
|
|
@@ -200,7 +204,7 @@ export function buildSystemPrompt(
|
|
|
200
204
|
|
|
201
205
|
/**
|
|
202
206
|
* Format memory context for injection into system prompt
|
|
203
|
-
* Uses <claudeMd> tag for Claude
|
|
207
|
+
* Uses <claudeMd> tag for optimal compatibility with Claude models
|
|
204
208
|
*/
|
|
205
209
|
export function formatMemoryContext(memoryContext: string): string {
|
|
206
210
|
if (!memoryContext) {
|
|
@@ -240,7 +244,7 @@ export function buildSystemPromptWithMemory(
|
|
|
240
244
|
* Flow: model → provider (from providers.json) → prompt
|
|
241
245
|
*
|
|
242
246
|
* This is the recommended way to build system prompts as it automatically
|
|
243
|
-
* looks up the provider for the given model from ~/.
|
|
247
|
+
* looks up the provider for the given model from ~/.gen/providers.json
|
|
244
248
|
*
|
|
245
249
|
* @param model - The model ID (e.g., "claude-sonnet-4-5@20250929")
|
|
246
250
|
* @param cwd - Current working directory
|
|
@@ -261,10 +265,10 @@ export function buildSystemPromptForModel(
|
|
|
261
265
|
|
|
262
266
|
/**
|
|
263
267
|
* Debug utility to verify prompt loading at runtime
|
|
264
|
-
* Set
|
|
268
|
+
* Set GEN_DEBUG_PROMPTS=1 for summary, GEN_DEBUG_PROMPTS=2 for full content
|
|
265
269
|
*/
|
|
266
270
|
export function debugPromptLoading(model: string, fallbackProvider?: string): void {
|
|
267
|
-
const debugLevel = process.env.
|
|
271
|
+
const debugLevel = process.env.GEN_DEBUG_PROMPTS;
|
|
268
272
|
if (!debugLevel || debugLevel === '0') {
|
|
269
273
|
return;
|
|
270
274
|
}
|