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.
Files changed (260) hide show
  1. package/README.md +2 -1
  2. package/dist/agent/agent.d.ts +44 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +130 -11
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/types.d.ts +11 -1
  7. package/dist/agent/types.d.ts.map +1 -1
  8. package/dist/checkpointing/checkpoint-manager.d.ts +87 -0
  9. package/dist/checkpointing/checkpoint-manager.d.ts.map +1 -0
  10. package/dist/checkpointing/checkpoint-manager.js +281 -0
  11. package/dist/checkpointing/checkpoint-manager.js.map +1 -0
  12. package/dist/checkpointing/index.d.ts +29 -0
  13. package/dist/checkpointing/index.d.ts.map +1 -0
  14. package/dist/checkpointing/index.js +29 -0
  15. package/dist/checkpointing/index.js.map +1 -0
  16. package/dist/checkpointing/types.d.ts +98 -0
  17. package/dist/checkpointing/types.d.ts.map +1 -0
  18. package/dist/checkpointing/types.js +7 -0
  19. package/dist/checkpointing/types.js.map +1 -0
  20. package/dist/cli/components/App.d.ts.map +1 -1
  21. package/dist/cli/components/App.js +171 -14
  22. package/dist/cli/components/App.js.map +1 -1
  23. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  24. package/dist/cli/components/CommandSuggestions.js +5 -0
  25. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  26. package/dist/cli/components/Messages.d.ts +7 -1
  27. package/dist/cli/components/Messages.d.ts.map +1 -1
  28. package/dist/cli/components/Messages.js +12 -3
  29. package/dist/cli/components/Messages.js.map +1 -1
  30. package/dist/cli/components/ModeIndicator.d.ts +42 -0
  31. package/dist/cli/components/ModeIndicator.d.ts.map +1 -0
  32. package/dist/cli/components/ModeIndicator.js +52 -0
  33. package/dist/cli/components/ModeIndicator.js.map +1 -0
  34. package/dist/cli/components/ModelSelector.d.ts +4 -3
  35. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  36. package/dist/cli/components/ModelSelector.js +54 -37
  37. package/dist/cli/components/ModelSelector.js.map +1 -1
  38. package/dist/cli/components/PlanApproval.d.ts +36 -0
  39. package/dist/cli/components/PlanApproval.d.ts.map +1 -0
  40. package/dist/cli/components/PlanApproval.js +154 -0
  41. package/dist/cli/components/PlanApproval.js.map +1 -0
  42. package/dist/cli/components/ProviderManager.d.ts +2 -2
  43. package/dist/cli/components/ProviderManager.d.ts.map +1 -1
  44. package/dist/cli/components/ProviderManager.js +137 -156
  45. package/dist/cli/components/ProviderManager.js.map +1 -1
  46. package/dist/cli/components/theme.d.ts +2 -0
  47. package/dist/cli/components/theme.d.ts.map +1 -1
  48. package/dist/cli/components/theme.js +3 -0
  49. package/dist/cli/components/theme.js.map +1 -1
  50. package/dist/cli/index.js +30 -13
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/config/index.d.ts +2 -2
  53. package/dist/config/index.d.ts.map +1 -1
  54. package/dist/config/index.js +1 -1
  55. package/dist/config/index.js.map +1 -1
  56. package/dist/config/levels.d.ts +5 -5
  57. package/dist/config/levels.d.ts.map +1 -1
  58. package/dist/config/levels.js +20 -20
  59. package/dist/config/levels.js.map +1 -1
  60. package/dist/config/merger.js +1 -1
  61. package/dist/config/merger.js.map +1 -1
  62. package/dist/config/providers-config.d.ts +8 -5
  63. package/dist/config/providers-config.d.ts.map +1 -1
  64. package/dist/config/providers-config.js +19 -22
  65. package/dist/config/providers-config.js.map +1 -1
  66. package/dist/config/test-utils.d.ts +2 -2
  67. package/dist/config/test-utils.d.ts.map +1 -1
  68. package/dist/config/test-utils.js +4 -4
  69. package/dist/config/test-utils.js.map +1 -1
  70. package/dist/config/types.d.ts +23 -17
  71. package/dist/config/types.d.ts.map +1 -1
  72. package/dist/config/types.js +14 -14
  73. package/dist/config/types.js.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +2 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/memory/memory-manager.d.ts +25 -12
  79. package/dist/memory/memory-manager.d.ts.map +1 -1
  80. package/dist/memory/memory-manager.js +241 -112
  81. package/dist/memory/memory-manager.js.map +1 -1
  82. package/dist/memory/test-utils.d.ts +1 -1
  83. package/dist/memory/test-utils.d.ts.map +1 -1
  84. package/dist/memory/test-utils.js +3 -3
  85. package/dist/memory/test-utils.js.map +1 -1
  86. package/dist/memory/types.d.ts +20 -10
  87. package/dist/memory/types.d.ts.map +1 -1
  88. package/dist/memory/types.js +13 -13
  89. package/dist/memory/types.js.map +1 -1
  90. package/dist/migration/migrate.d.ts +24 -0
  91. package/dist/migration/migrate.d.ts.map +1 -0
  92. package/dist/migration/migrate.js +164 -0
  93. package/dist/migration/migrate.js.map +1 -0
  94. package/dist/permissions/persistence.d.ts +2 -2
  95. package/dist/permissions/persistence.js +4 -4
  96. package/dist/permissions/persistence.js.map +1 -1
  97. package/dist/planning/index.d.ts +13 -0
  98. package/dist/planning/index.d.ts.map +1 -0
  99. package/dist/planning/index.js +15 -0
  100. package/dist/planning/index.js.map +1 -0
  101. package/dist/planning/plan-file.d.ts +59 -0
  102. package/dist/planning/plan-file.d.ts.map +1 -0
  103. package/dist/planning/plan-file.js +278 -0
  104. package/dist/planning/plan-file.js.map +1 -0
  105. package/dist/planning/state.d.ts +127 -0
  106. package/dist/planning/state.d.ts.map +1 -0
  107. package/dist/planning/state.js +261 -0
  108. package/dist/planning/state.js.map +1 -0
  109. package/dist/planning/tools/enter-plan-mode.d.ts +25 -0
  110. package/dist/planning/tools/enter-plan-mode.d.ts.map +1 -0
  111. package/dist/planning/tools/enter-plan-mode.js +98 -0
  112. package/dist/planning/tools/enter-plan-mode.js.map +1 -0
  113. package/dist/planning/tools/exit-plan-mode.d.ts +24 -0
  114. package/dist/planning/tools/exit-plan-mode.d.ts.map +1 -0
  115. package/dist/planning/tools/exit-plan-mode.js +149 -0
  116. package/dist/planning/tools/exit-plan-mode.js.map +1 -0
  117. package/dist/planning/types.d.ts +100 -0
  118. package/dist/planning/types.d.ts.map +1 -0
  119. package/dist/planning/types.js +28 -0
  120. package/dist/planning/types.js.map +1 -0
  121. package/dist/pricing/calculator.d.ts +21 -0
  122. package/dist/pricing/calculator.d.ts.map +1 -0
  123. package/dist/pricing/calculator.js +59 -0
  124. package/dist/pricing/calculator.js.map +1 -0
  125. package/dist/pricing/index.d.ts +7 -0
  126. package/dist/pricing/index.d.ts.map +1 -0
  127. package/dist/pricing/index.js +7 -0
  128. package/dist/pricing/index.js.map +1 -0
  129. package/dist/pricing/models.d.ts +20 -0
  130. package/dist/pricing/models.d.ts.map +1 -0
  131. package/dist/pricing/models.js +322 -0
  132. package/dist/pricing/models.js.map +1 -0
  133. package/dist/pricing/types.d.ts +30 -0
  134. package/dist/pricing/types.d.ts.map +1 -0
  135. package/dist/pricing/types.js +5 -0
  136. package/dist/pricing/types.js.map +1 -0
  137. package/dist/prompts/index.d.ts +5 -4
  138. package/dist/prompts/index.d.ts.map +1 -1
  139. package/dist/prompts/index.js +11 -8
  140. package/dist/prompts/index.js.map +1 -1
  141. package/dist/providers/anthropic.d.ts +2 -1
  142. package/dist/providers/anthropic.d.ts.map +1 -1
  143. package/dist/providers/anthropic.js +24 -10
  144. package/dist/providers/anthropic.js.map +1 -1
  145. package/dist/providers/gemini.d.ts +2 -1
  146. package/dist/providers/gemini.d.ts.map +1 -1
  147. package/dist/providers/gemini.js +28 -14
  148. package/dist/providers/gemini.js.map +1 -1
  149. package/dist/providers/index.d.ts +20 -10
  150. package/dist/providers/index.d.ts.map +1 -1
  151. package/dist/providers/index.js +48 -24
  152. package/dist/providers/index.js.map +1 -1
  153. package/dist/providers/openai.d.ts +2 -1
  154. package/dist/providers/openai.d.ts.map +1 -1
  155. package/dist/providers/openai.js +19 -8
  156. package/dist/providers/openai.js.map +1 -1
  157. package/dist/providers/registry.d.ts +48 -34
  158. package/dist/providers/registry.d.ts.map +1 -1
  159. package/dist/providers/registry.js +72 -88
  160. package/dist/providers/registry.js.map +1 -1
  161. package/dist/providers/store.d.ts +43 -17
  162. package/dist/providers/store.d.ts.map +1 -1
  163. package/dist/providers/store.js +112 -19
  164. package/dist/providers/store.js.map +1 -1
  165. package/dist/providers/types.d.ts +25 -0
  166. package/dist/providers/types.d.ts.map +1 -1
  167. package/dist/providers/vertex-ai.d.ts +15 -7
  168. package/dist/providers/vertex-ai.d.ts.map +1 -1
  169. package/dist/providers/vertex-ai.js +63 -23
  170. package/dist/providers/vertex-ai.js.map +1 -1
  171. package/dist/session/manager.d.ts +4 -0
  172. package/dist/session/manager.d.ts.map +1 -1
  173. package/dist/session/manager.js +8 -0
  174. package/dist/session/manager.js.map +1 -1
  175. package/dist/session/types.js +1 -1
  176. package/dist/session/types.js.map +1 -1
  177. package/dist/tools/index.d.ts +7 -1
  178. package/dist/tools/index.d.ts.map +1 -1
  179. package/dist/tools/index.js +7 -0
  180. package/dist/tools/index.js.map +1 -1
  181. package/dist/tools/registry.d.ts +13 -0
  182. package/dist/tools/registry.d.ts.map +1 -1
  183. package/dist/tools/registry.js +79 -2
  184. package/dist/tools/registry.js.map +1 -1
  185. package/docs/config-system-comparison.md +50 -50
  186. package/docs/cost-tracking-comparison.md +904 -0
  187. package/docs/memory-system.md +124 -31
  188. package/docs/operating-modes.md +96 -0
  189. package/docs/permissions.md +2 -2
  190. package/docs/proposals/0006-memory-system.md +4 -4
  191. package/docs/proposals/0008-checkpointing.md +109 -2
  192. package/docs/proposals/0011-custom-commands.md +2 -1
  193. package/docs/proposals/0021-skills-system.md +2 -1
  194. package/docs/proposals/0023-permission-enhancements.md +2 -2
  195. package/docs/proposals/0025-cost-tracking.md +60 -2
  196. package/docs/proposals/0033-enterprise-deployment.md +1 -1
  197. package/docs/proposals/0041-configuration-system.md +17 -19
  198. package/docs/proposals/0042-prompt-optimization.md +17 -9
  199. package/docs/proposals/README.md +6 -6
  200. package/docs/providers.md +94 -9
  201. package/examples/test-checkpointing.ts +121 -0
  202. package/examples/test-cost-tracking.ts +77 -0
  203. package/examples/test-interrupt-cleanup.ts +94 -0
  204. package/package.json +3 -2
  205. package/scripts/migrate.ts +449 -0
  206. package/src/agent/agent.ts +161 -12
  207. package/src/agent/types.ts +11 -1
  208. package/src/checkpointing/checkpoint-manager.ts +327 -0
  209. package/src/checkpointing/index.ts +45 -0
  210. package/src/checkpointing/types.ts +104 -0
  211. package/src/cli/components/App.tsx +221 -13
  212. package/src/cli/components/CommandSuggestions.tsx +5 -0
  213. package/src/cli/components/Messages.tsx +24 -5
  214. package/src/cli/components/ModeIndicator.tsx +174 -0
  215. package/src/cli/components/ModelSelector.tsx +62 -43
  216. package/src/cli/components/PlanApproval.tsx +327 -0
  217. package/src/cli/components/ProviderManager.tsx +278 -323
  218. package/src/cli/components/theme.ts +3 -0
  219. package/src/cli/index.tsx +36 -17
  220. package/src/config/index.ts +5 -3
  221. package/src/config/levels.test.ts +22 -22
  222. package/src/config/levels.ts +22 -22
  223. package/src/config/loader.test.ts +14 -14
  224. package/src/config/manager.test.ts +19 -19
  225. package/src/config/merger.test.ts +23 -23
  226. package/src/config/merger.ts +1 -1
  227. package/src/config/providers-config.ts +23 -21
  228. package/src/config/test-utils.ts +6 -6
  229. package/src/config/types.ts +30 -20
  230. package/src/index.ts +15 -0
  231. package/src/memory/memory-manager.test.ts +242 -24
  232. package/src/memory/memory-manager.ts +270 -141
  233. package/src/memory/test-utils.ts +4 -4
  234. package/src/memory/types.ts +28 -17
  235. package/src/permissions/persistence.ts +4 -4
  236. package/src/planning/index.ts +53 -0
  237. package/src/planning/plan-file.ts +326 -0
  238. package/src/planning/state.ts +305 -0
  239. package/src/planning/tools/enter-plan-mode.ts +111 -0
  240. package/src/planning/tools/exit-plan-mode.ts +170 -0
  241. package/src/planning/types.ts +150 -0
  242. package/src/pricing/calculator.ts +71 -0
  243. package/src/pricing/index.ts +7 -0
  244. package/src/pricing/models.ts +334 -0
  245. package/src/pricing/types.ts +32 -0
  246. package/src/prompts/index.ts +13 -9
  247. package/src/providers/anthropic.ts +30 -10
  248. package/src/providers/gemini.ts +34 -14
  249. package/src/providers/index.ts +76 -33
  250. package/src/providers/openai.ts +26 -8
  251. package/src/providers/registry.ts +116 -111
  252. package/src/providers/store.ts +130 -28
  253. package/src/providers/types.ts +36 -1
  254. package/src/providers/vertex-ai.ts +70 -23
  255. package/src/session/manager.ts +9 -0
  256. package/src/session/types.ts +1 -1
  257. package/src/tools/index.ts +8 -0
  258. package/src/tools/registry.ts +95 -2
  259. package/.gencode/settings.local.json +0 -7
  260. 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,7 @@
1
+ /**
2
+ * Pricing and cost tracking module
3
+ */
4
+
5
+ export * from './types.js';
6
+ export * from './models.js';
7
+ export * from './calculator.js';
@@ -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
+ }
@@ -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(), '.gencode', 'providers.json');
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 ~/.gencode/providers.json
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 ~/.gencode/providers.json
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 ~/.gencode/providers.json to find the provider
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
- switch (provider) {
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 Code compatibility
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 ~/.gencode/providers.json
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 GENCODE_DEBUG_PROMPTS=1 for summary, GENCODE_DEBUG_PROMPTS=2 for full content
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.GENCODE_DEBUG_PROMPTS;
271
+ const debugLevel = process.env.GEN_DEBUG_PROMPTS;
268
272
  if (!debugLevel || debugLevel === '0') {
269
273
  return;
270
274
  }