gencode-ai 0.1.3 → 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.
Files changed (151) hide show
  1. package/README.md +2 -1
  2. package/dist/agent/agent.d.ts +35 -0
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +93 -3
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/types.d.ts +6 -0
  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 +157 -6
  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 +11 -2
  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/PlanApproval.d.ts +36 -0
  35. package/dist/cli/components/PlanApproval.d.ts.map +1 -0
  36. package/dist/cli/components/PlanApproval.js +154 -0
  37. package/dist/cli/components/PlanApproval.js.map +1 -0
  38. package/dist/cli/components/theme.d.ts +2 -0
  39. package/dist/cli/components/theme.d.ts.map +1 -1
  40. package/dist/cli/components/theme.js +3 -0
  41. package/dist/cli/components/theme.js.map +1 -1
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/planning/index.d.ts +13 -0
  47. package/dist/planning/index.d.ts.map +1 -0
  48. package/dist/planning/index.js +15 -0
  49. package/dist/planning/index.js.map +1 -0
  50. package/dist/planning/plan-file.d.ts +59 -0
  51. package/dist/planning/plan-file.d.ts.map +1 -0
  52. package/dist/planning/plan-file.js +278 -0
  53. package/dist/planning/plan-file.js.map +1 -0
  54. package/dist/planning/state.d.ts +127 -0
  55. package/dist/planning/state.d.ts.map +1 -0
  56. package/dist/planning/state.js +261 -0
  57. package/dist/planning/state.js.map +1 -0
  58. package/dist/planning/tools/enter-plan-mode.d.ts +25 -0
  59. package/dist/planning/tools/enter-plan-mode.d.ts.map +1 -0
  60. package/dist/planning/tools/enter-plan-mode.js +98 -0
  61. package/dist/planning/tools/enter-plan-mode.js.map +1 -0
  62. package/dist/planning/tools/exit-plan-mode.d.ts +24 -0
  63. package/dist/planning/tools/exit-plan-mode.d.ts.map +1 -0
  64. package/dist/planning/tools/exit-plan-mode.js +149 -0
  65. package/dist/planning/tools/exit-plan-mode.js.map +1 -0
  66. package/dist/planning/types.d.ts +100 -0
  67. package/dist/planning/types.d.ts.map +1 -0
  68. package/dist/planning/types.js +28 -0
  69. package/dist/planning/types.js.map +1 -0
  70. package/dist/pricing/calculator.d.ts +21 -0
  71. package/dist/pricing/calculator.d.ts.map +1 -0
  72. package/dist/pricing/calculator.js +59 -0
  73. package/dist/pricing/calculator.js.map +1 -0
  74. package/dist/pricing/index.d.ts +7 -0
  75. package/dist/pricing/index.d.ts.map +1 -0
  76. package/dist/pricing/index.js +7 -0
  77. package/dist/pricing/index.js.map +1 -0
  78. package/dist/pricing/models.d.ts +20 -0
  79. package/dist/pricing/models.d.ts.map +1 -0
  80. package/dist/pricing/models.js +322 -0
  81. package/dist/pricing/models.js.map +1 -0
  82. package/dist/pricing/types.d.ts +30 -0
  83. package/dist/pricing/types.d.ts.map +1 -0
  84. package/dist/pricing/types.js +5 -0
  85. package/dist/pricing/types.js.map +1 -0
  86. package/dist/providers/anthropic.d.ts.map +1 -1
  87. package/dist/providers/anthropic.js +17 -10
  88. package/dist/providers/anthropic.js.map +1 -1
  89. package/dist/providers/gemini.d.ts.map +1 -1
  90. package/dist/providers/gemini.js +21 -14
  91. package/dist/providers/gemini.js.map +1 -1
  92. package/dist/providers/openai.d.ts.map +1 -1
  93. package/dist/providers/openai.js +12 -8
  94. package/dist/providers/openai.js.map +1 -1
  95. package/dist/providers/types.d.ts +2 -0
  96. package/dist/providers/types.d.ts.map +1 -1
  97. package/dist/providers/vertex-ai.d.ts.map +1 -1
  98. package/dist/providers/vertex-ai.js +17 -10
  99. package/dist/providers/vertex-ai.js.map +1 -1
  100. package/dist/session/manager.d.ts +4 -0
  101. package/dist/session/manager.d.ts.map +1 -1
  102. package/dist/session/manager.js +8 -0
  103. package/dist/session/manager.js.map +1 -1
  104. package/dist/tools/index.d.ts +7 -1
  105. package/dist/tools/index.d.ts.map +1 -1
  106. package/dist/tools/index.js +7 -0
  107. package/dist/tools/index.js.map +1 -1
  108. package/dist/tools/registry.d.ts +13 -0
  109. package/dist/tools/registry.d.ts.map +1 -1
  110. package/dist/tools/registry.js +79 -2
  111. package/dist/tools/registry.js.map +1 -1
  112. package/docs/cost-tracking-comparison.md +904 -0
  113. package/docs/operating-modes.md +96 -0
  114. package/docs/proposals/0025-cost-tracking.md +60 -2
  115. package/docs/proposals/README.md +1 -1
  116. package/examples/test-checkpointing.ts +121 -0
  117. package/examples/test-cost-tracking.ts +77 -0
  118. package/examples/test-interrupt-cleanup.ts +94 -0
  119. package/package.json +1 -1
  120. package/src/agent/agent.ts +110 -3
  121. package/src/agent/types.ts +6 -0
  122. package/src/checkpointing/checkpoint-manager.ts +327 -0
  123. package/src/checkpointing/index.ts +45 -0
  124. package/src/checkpointing/types.ts +104 -0
  125. package/src/cli/components/App.tsx +204 -5
  126. package/src/cli/components/CommandSuggestions.tsx +5 -0
  127. package/src/cli/components/Messages.tsx +23 -4
  128. package/src/cli/components/ModeIndicator.tsx +174 -0
  129. package/src/cli/components/PlanApproval.tsx +327 -0
  130. package/src/cli/components/theme.ts +3 -0
  131. package/src/index.ts +15 -0
  132. package/src/planning/index.ts +53 -0
  133. package/src/planning/plan-file.ts +326 -0
  134. package/src/planning/state.ts +305 -0
  135. package/src/planning/tools/enter-plan-mode.ts +111 -0
  136. package/src/planning/tools/exit-plan-mode.ts +170 -0
  137. package/src/planning/types.ts +150 -0
  138. package/src/pricing/calculator.ts +71 -0
  139. package/src/pricing/index.ts +7 -0
  140. package/src/pricing/models.ts +334 -0
  141. package/src/pricing/types.ts +32 -0
  142. package/src/providers/anthropic.ts +21 -10
  143. package/src/providers/gemini.ts +25 -14
  144. package/src/providers/openai.ts +17 -8
  145. package/src/providers/types.ts +3 -0
  146. package/src/providers/vertex-ai.ts +21 -10
  147. package/src/session/manager.ts +9 -0
  148. package/src/tools/index.ts +8 -0
  149. package/src/tools/registry.ts +95 -2
  150. package/.gencode/settings.local.json +0 -7
  151. package/CLAUDE.md +0 -86
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Plan File Utilities
3
+ *
4
+ * Manages plan files stored in .gencode/plans/ directory.
5
+ * Generates unique filenames with timestamps and slugs.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { existsSync } from 'fs';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ const PLANS_DIR = '.gencode/plans';
14
+ const PLAN_FILE_EXTENSION = '.md';
15
+ // Word lists for generating memorable names (like Claude Code)
16
+ const ADJECTIVES = [
17
+ 'agile', 'bold', 'calm', 'deft', 'eager', 'fair', 'glad', 'humble',
18
+ 'ideal', 'jolly', 'keen', 'lively', 'merry', 'noble', 'polite', 'quiet',
19
+ 'rapid', 'smart', 'tidy', 'unique', 'vivid', 'warm', 'zealous', 'bright',
20
+ 'clear', 'crisp', 'fresh', 'golden', 'happy', 'lovely', 'neat', 'proud',
21
+ ];
22
+ const NOUNS = [
23
+ 'alpine', 'beacon', 'cipher', 'delta', 'ember', 'falcon', 'glacier', 'harbor',
24
+ 'island', 'jasper', 'kayak', 'lantern', 'marble', 'nebula', 'oracle', 'prism',
25
+ 'quartz', 'rapids', 'summit', 'timber', 'unity', 'vertex', 'willow', 'zenith',
26
+ 'arrow', 'bridge', 'canyon', 'dawn', 'echo', 'forest', 'grove', 'hollow',
27
+ ];
28
+ // ============================================================================
29
+ // Name Generation
30
+ // ============================================================================
31
+ /**
32
+ * Generate a memorable plan name (adjective-noun)
33
+ * Example: "agile-beacon", "bold-cipher"
34
+ */
35
+ function generateMemorableName() {
36
+ const adjective = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)];
37
+ const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)];
38
+ return `${adjective}-${noun}`;
39
+ }
40
+ /**
41
+ * Generate a slug from text (for task-specific naming)
42
+ */
43
+ function generateSlug(text) {
44
+ return text
45
+ .toLowerCase()
46
+ .replace(/[^a-z0-9\s-]/g, '') // Remove special chars
47
+ .replace(/\s+/g, '-') // Replace spaces with dashes
48
+ .replace(/-+/g, '-') // Collapse multiple dashes
49
+ .slice(0, 30) // Limit length
50
+ .replace(/^-|-$/g, ''); // Trim dashes from ends
51
+ }
52
+ /**
53
+ * Generate plan file name
54
+ * Format: <memorable-name>.md (like Claude Code)
55
+ */
56
+ export function generatePlanFileName(taskDescription) {
57
+ // Use memorable name like Claude Code (melodic-humming-lampson)
58
+ const name = generateMemorableName();
59
+ return `${name}${PLAN_FILE_EXTENSION}`;
60
+ }
61
+ // ============================================================================
62
+ // Directory Management
63
+ // ============================================================================
64
+ /**
65
+ * Get the plans directory path for a project
66
+ */
67
+ export function getPlansDir(cwd) {
68
+ return path.join(cwd, PLANS_DIR);
69
+ }
70
+ /**
71
+ * Ensure the plans directory exists
72
+ */
73
+ export async function ensurePlansDir(cwd) {
74
+ const plansDir = getPlansDir(cwd);
75
+ if (!existsSync(plansDir)) {
76
+ await fs.mkdir(plansDir, { recursive: true });
77
+ }
78
+ return plansDir;
79
+ }
80
+ // ============================================================================
81
+ // Plan File Operations
82
+ // ============================================================================
83
+ /**
84
+ * Create a new plan file
85
+ */
86
+ export async function createPlanFile(cwd, taskDescription) {
87
+ const plansDir = await ensurePlansDir(cwd);
88
+ const fileName = generatePlanFileName(taskDescription);
89
+ const filePath = path.join(plansDir, fileName);
90
+ // Initial plan template
91
+ const initialContent = `# Implementation Plan
92
+
93
+ ## Task
94
+ ${taskDescription || 'Describe the task here...'}
95
+
96
+ ## Analysis
97
+ _Understanding the codebase and requirements..._
98
+
99
+ ## Approach
100
+ _Design decisions and implementation strategy..._
101
+
102
+ ## Files to Change
103
+ - [ ] File 1 (action)
104
+ - [ ] File 2 (action)
105
+
106
+ ## Steps
107
+ 1. Step 1
108
+ 2. Step 2
109
+ 3. Step 3
110
+
111
+ ## Pre-approved Permissions
112
+ _Commands that will be allowed during execution..._
113
+
114
+ ---
115
+ _Generated by GenCode Plan Mode_
116
+ `;
117
+ const now = new Date();
118
+ await fs.writeFile(filePath, initialContent, 'utf-8');
119
+ return {
120
+ path: filePath,
121
+ content: initialContent,
122
+ createdAt: now,
123
+ updatedAt: now,
124
+ };
125
+ }
126
+ /**
127
+ * Read a plan file
128
+ */
129
+ export async function readPlanFile(filePath) {
130
+ try {
131
+ const content = await fs.readFile(filePath, 'utf-8');
132
+ const stats = await fs.stat(filePath);
133
+ return {
134
+ path: filePath,
135
+ content,
136
+ createdAt: stats.birthtime,
137
+ updatedAt: stats.mtime,
138
+ };
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Write to a plan file
146
+ */
147
+ export async function writePlanFile(filePath, content) {
148
+ // Ensure directory exists
149
+ const dir = path.dirname(filePath);
150
+ if (!existsSync(dir)) {
151
+ await fs.mkdir(dir, { recursive: true });
152
+ }
153
+ await fs.writeFile(filePath, content, 'utf-8');
154
+ }
155
+ /**
156
+ * List all plan files in the project
157
+ */
158
+ export async function listPlanFiles(cwd) {
159
+ const plansDir = getPlansDir(cwd);
160
+ if (!existsSync(plansDir)) {
161
+ return [];
162
+ }
163
+ try {
164
+ const files = await fs.readdir(plansDir);
165
+ const planFiles = [];
166
+ for (const file of files) {
167
+ if (file.endsWith(PLAN_FILE_EXTENSION)) {
168
+ const filePath = path.join(plansDir, file);
169
+ const planFile = await readPlanFile(filePath);
170
+ if (planFile) {
171
+ planFiles.push(planFile);
172
+ }
173
+ }
174
+ }
175
+ // Sort by updated time, newest first
176
+ planFiles.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
177
+ return planFiles;
178
+ }
179
+ catch {
180
+ return [];
181
+ }
182
+ }
183
+ /**
184
+ * Delete a plan file
185
+ */
186
+ export async function deletePlanFile(filePath) {
187
+ try {
188
+ await fs.unlink(filePath);
189
+ return true;
190
+ }
191
+ catch {
192
+ return false;
193
+ }
194
+ }
195
+ // ============================================================================
196
+ // Plan Content Parsing
197
+ // ============================================================================
198
+ /**
199
+ * Extract files to change from plan content
200
+ */
201
+ export function parseFilesToChange(content) {
202
+ const files = [];
203
+ // Look for patterns like:
204
+ // - [ ] src/file.ts (create)
205
+ // - [x] src/file.ts (modify)
206
+ // + src/file.ts (create)
207
+ // ~ src/file.ts (modify)
208
+ // - src/file.ts (delete)
209
+ const lines = content.split('\n');
210
+ for (const line of lines) {
211
+ // Checkbox format
212
+ let match = line.match(/^[-*]\s*\[[ x]\]\s+([^\s(]+)\s*\((\w+)\)/);
213
+ if (match) {
214
+ const [, filePath, action] = match;
215
+ if (action === 'create' || action === 'modify' || action === 'delete') {
216
+ files.push({ path: filePath, action });
217
+ }
218
+ continue;
219
+ }
220
+ // Symbol format (+, ~, -)
221
+ match = line.match(/^\s*([+~-])\s+([^\s(]+)(?:\s*\((\w+)\))?/);
222
+ if (match) {
223
+ const [, symbol, filePath, explicitAction] = match;
224
+ let action;
225
+ if (explicitAction === 'create' || explicitAction === 'modify' || explicitAction === 'delete') {
226
+ action = explicitAction;
227
+ }
228
+ else {
229
+ action = symbol === '+' ? 'create' : symbol === '~' ? 'modify' : 'delete';
230
+ }
231
+ files.push({ path: filePath, action });
232
+ }
233
+ }
234
+ return files;
235
+ }
236
+ /**
237
+ * Extract pre-approved permissions from plan content
238
+ */
239
+ export function parsePreApprovedPermissions(content) {
240
+ const permissions = [];
241
+ // Look for patterns like:
242
+ // - Bash: run tests
243
+ // - npm test
244
+ // - npm install
245
+ const permissionSection = content.match(/## Pre-approved Permissions[\s\S]*?(?=##|$)/i);
246
+ if (!permissionSection) {
247
+ return permissions;
248
+ }
249
+ const lines = permissionSection[0].split('\n');
250
+ for (const line of lines) {
251
+ // Skip header and empty lines
252
+ if (line.startsWith('##') || line.startsWith('_') || !line.trim()) {
253
+ continue;
254
+ }
255
+ // Match "- Bash: description" or "- description"
256
+ const match = line.match(/^[-*]\s+(?:Bash:\s+)?(.+)/);
257
+ if (match) {
258
+ permissions.push({ tool: 'Bash', prompt: match[1].trim() });
259
+ }
260
+ }
261
+ return permissions;
262
+ }
263
+ /**
264
+ * Get relative path for display
265
+ */
266
+ export function getDisplayPath(fullPath, cwd) {
267
+ const relativePath = path.relative(cwd, fullPath);
268
+ const home = process.env.HOME || '';
269
+ if (relativePath.startsWith('..')) {
270
+ // Path is outside cwd, try home-relative
271
+ if (fullPath.startsWith(home)) {
272
+ return '~' + fullPath.slice(home.length);
273
+ }
274
+ return fullPath;
275
+ }
276
+ return relativePath;
277
+ }
278
+ //# sourceMappingURL=plan-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-file.js","sourceRoot":"","sources":["../../src/planning/plan-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Plan Mode State Management
3
+ *
4
+ * Singleton state manager for plan mode. Tracks whether plan mode
5
+ * is active, current phase, and manages tool filtering.
6
+ */
7
+ import type { PlanModeState, PlanPhase, AllowedPrompt, ModeType, PlanModeEvent } from './types.js';
8
+ /**
9
+ * Plan Mode State Manager
10
+ *
11
+ * Manages the plan mode state and provides methods for:
12
+ * - Entering/exiting plan mode
13
+ * - Phase transitions
14
+ * - Tool filtering
15
+ * - Event notifications
16
+ */
17
+ export declare class PlanModeManager {
18
+ private state;
19
+ private eventListeners;
20
+ constructor();
21
+ /**
22
+ * Get initial state
23
+ */
24
+ private getInitialState;
25
+ /**
26
+ * Get current state (readonly)
27
+ */
28
+ getState(): Readonly<PlanModeState>;
29
+ /**
30
+ * Check if plan mode is active
31
+ */
32
+ isActive(): boolean;
33
+ /**
34
+ * Get current mode type for UI
35
+ * Note: Returns 'plan' or 'normal'. 'accept' mode is managed at the App level.
36
+ */
37
+ getCurrentMode(): ModeType;
38
+ /**
39
+ * Enter plan mode
40
+ */
41
+ enter(planFilePath: string, originalRequest?: string): void;
42
+ /**
43
+ * Exit plan mode
44
+ */
45
+ exit(approved?: boolean): void;
46
+ /**
47
+ * Toggle plan mode (for Shift+Tab)
48
+ */
49
+ toggle(planFilePath?: string): void;
50
+ /**
51
+ * Update phase
52
+ */
53
+ setPhase(phase: PlanPhase): void;
54
+ /**
55
+ * Get current phase
56
+ */
57
+ getPhase(): PlanPhase;
58
+ /**
59
+ * Set requested permissions (from ExitPlanMode)
60
+ */
61
+ setRequestedPermissions(permissions: AllowedPrompt[]): void;
62
+ /**
63
+ * Get requested permissions
64
+ */
65
+ getRequestedPermissions(): AllowedPrompt[];
66
+ /**
67
+ * Get plan file path
68
+ */
69
+ getPlanFilePath(): string | null;
70
+ /**
71
+ * Check if a tool is allowed in the current mode
72
+ */
73
+ isToolAllowed(toolName: string): boolean;
74
+ /**
75
+ * Check if a tool is blocked in the current mode
76
+ */
77
+ isToolBlocked(toolName: string): boolean;
78
+ /**
79
+ * Get list of allowed tools for current mode
80
+ */
81
+ getAllowedTools(): string[];
82
+ /**
83
+ * Get list of blocked tools for current mode
84
+ */
85
+ getBlockedTools(): string[];
86
+ /**
87
+ * Filter tool list based on current mode
88
+ */
89
+ filterTools(toolNames: string[]): string[];
90
+ /**
91
+ * Subscribe to plan mode events
92
+ */
93
+ subscribe(listener: (event: PlanModeEvent) => void): () => void;
94
+ /**
95
+ * Emit an event to all listeners
96
+ */
97
+ private emit;
98
+ }
99
+ /**
100
+ * Get the global plan mode manager
101
+ */
102
+ export declare function getPlanModeManager(): PlanModeManager;
103
+ /**
104
+ * Reset the global plan mode manager (for testing)
105
+ */
106
+ export declare function resetPlanModeManager(): void;
107
+ /**
108
+ * Check if plan mode is currently active
109
+ */
110
+ export declare function isPlanModeActive(): boolean;
111
+ /**
112
+ * Get the current mode type
113
+ */
114
+ export declare function getCurrentMode(): ModeType;
115
+ /**
116
+ * Enter plan mode
117
+ */
118
+ export declare function enterPlanMode(planFilePath: string, originalRequest?: string): void;
119
+ /**
120
+ * Exit plan mode
121
+ */
122
+ export declare function exitPlanMode(approved?: boolean): void;
123
+ /**
124
+ * Toggle plan mode
125
+ */
126
+ export declare function togglePlanMode(planFilePath?: string): void;
127
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/planning/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACb,QAAQ,EACR,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,cAAc,CAAsC;;IAO5D;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC;IAInC;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACH,cAAc,IAAI,QAAQ;IAI1B;;OAEG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAa3D;;OAEG;IACH,IAAI,CAAC,QAAQ,GAAE,OAAe,GAAG,IAAI;IASrC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IASnC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOhC;;OAEG;IACH,QAAQ,IAAI,SAAS;IAIrB;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI;IAI3D;;OAEG;IACH,uBAAuB,IAAI,aAAa,EAAE;IAI1C;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IASxC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQxC;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAO3B;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAO3B;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAY1C;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAO/D;;OAEG;IACH,OAAO,CAAC,IAAI;CASb;AAWD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAEzC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAElF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,OAAe,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1D"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Plan Mode State Management
3
+ *
4
+ * Singleton state manager for plan mode. Tracks whether plan mode
5
+ * is active, current phase, and manages tool filtering.
6
+ */
7
+ import { PLAN_MODE_ALLOWED_TOOLS, PLAN_MODE_BLOCKED_TOOLS } from './types.js';
8
+ // ============================================================================
9
+ // State Manager
10
+ // ============================================================================
11
+ /**
12
+ * Plan Mode State Manager
13
+ *
14
+ * Manages the plan mode state and provides methods for:
15
+ * - Entering/exiting plan mode
16
+ * - Phase transitions
17
+ * - Tool filtering
18
+ * - Event notifications
19
+ */
20
+ export class PlanModeManager {
21
+ state;
22
+ eventListeners;
23
+ constructor() {
24
+ this.state = this.getInitialState();
25
+ this.eventListeners = new Set();
26
+ }
27
+ /**
28
+ * Get initial state
29
+ */
30
+ getInitialState() {
31
+ return {
32
+ active: false,
33
+ phase: 'understanding',
34
+ planFilePath: null,
35
+ originalRequest: null,
36
+ requestedPermissions: [],
37
+ enteredAt: null,
38
+ };
39
+ }
40
+ /**
41
+ * Get current state (readonly)
42
+ */
43
+ getState() {
44
+ return { ...this.state };
45
+ }
46
+ /**
47
+ * Check if plan mode is active
48
+ */
49
+ isActive() {
50
+ return this.state.active;
51
+ }
52
+ /**
53
+ * Get current mode type for UI
54
+ * Note: Returns 'plan' or 'normal'. 'accept' mode is managed at the App level.
55
+ */
56
+ getCurrentMode() {
57
+ return this.state.active ? 'plan' : 'normal';
58
+ }
59
+ /**
60
+ * Enter plan mode
61
+ */
62
+ enter(planFilePath, originalRequest) {
63
+ this.state = {
64
+ active: true,
65
+ phase: 'understanding',
66
+ planFilePath,
67
+ originalRequest: originalRequest ?? null,
68
+ requestedPermissions: [],
69
+ enteredAt: new Date(),
70
+ };
71
+ this.emit({ type: 'enter', planFilePath });
72
+ }
73
+ /**
74
+ * Exit plan mode
75
+ */
76
+ exit(approved = false) {
77
+ const wasActive = this.state.active;
78
+ this.state = this.getInitialState();
79
+ if (wasActive) {
80
+ this.emit({ type: 'exit', approved });
81
+ }
82
+ }
83
+ /**
84
+ * Toggle plan mode (for Shift+Tab)
85
+ */
86
+ toggle(planFilePath) {
87
+ if (this.state.active) {
88
+ this.exit(false);
89
+ }
90
+ else if (planFilePath) {
91
+ this.enter(planFilePath);
92
+ }
93
+ this.emit({ type: 'toggle' });
94
+ }
95
+ /**
96
+ * Update phase
97
+ */
98
+ setPhase(phase) {
99
+ if (this.state.active) {
100
+ this.state.phase = phase;
101
+ this.emit({ type: 'phase_change', phase });
102
+ }
103
+ }
104
+ /**
105
+ * Get current phase
106
+ */
107
+ getPhase() {
108
+ return this.state.phase;
109
+ }
110
+ /**
111
+ * Set requested permissions (from ExitPlanMode)
112
+ */
113
+ setRequestedPermissions(permissions) {
114
+ this.state.requestedPermissions = permissions;
115
+ }
116
+ /**
117
+ * Get requested permissions
118
+ */
119
+ getRequestedPermissions() {
120
+ return [...this.state.requestedPermissions];
121
+ }
122
+ /**
123
+ * Get plan file path
124
+ */
125
+ getPlanFilePath() {
126
+ return this.state.planFilePath;
127
+ }
128
+ // ============================================================================
129
+ // Tool Filtering
130
+ // ============================================================================
131
+ /**
132
+ * Check if a tool is allowed in the current mode
133
+ */
134
+ isToolAllowed(toolName) {
135
+ if (!this.state.active) {
136
+ return true; // All tools allowed in build mode
137
+ }
138
+ // In plan mode, only allow read-only tools
139
+ return PLAN_MODE_ALLOWED_TOOLS.includes(toolName);
140
+ }
141
+ /**
142
+ * Check if a tool is blocked in the current mode
143
+ */
144
+ isToolBlocked(toolName) {
145
+ if (!this.state.active) {
146
+ return false; // No tools blocked in build mode
147
+ }
148
+ return PLAN_MODE_BLOCKED_TOOLS.includes(toolName);
149
+ }
150
+ /**
151
+ * Get list of allowed tools for current mode
152
+ */
153
+ getAllowedTools() {
154
+ if (!this.state.active) {
155
+ return []; // Empty means all allowed
156
+ }
157
+ return [...PLAN_MODE_ALLOWED_TOOLS];
158
+ }
159
+ /**
160
+ * Get list of blocked tools for current mode
161
+ */
162
+ getBlockedTools() {
163
+ if (!this.state.active) {
164
+ return [];
165
+ }
166
+ return [...PLAN_MODE_BLOCKED_TOOLS];
167
+ }
168
+ /**
169
+ * Filter tool list based on current mode
170
+ */
171
+ filterTools(toolNames) {
172
+ if (!this.state.active) {
173
+ return toolNames;
174
+ }
175
+ return toolNames.filter((name) => this.isToolAllowed(name));
176
+ }
177
+ // ============================================================================
178
+ // Event System
179
+ // ============================================================================
180
+ /**
181
+ * Subscribe to plan mode events
182
+ */
183
+ subscribe(listener) {
184
+ this.eventListeners.add(listener);
185
+ return () => {
186
+ this.eventListeners.delete(listener);
187
+ };
188
+ }
189
+ /**
190
+ * Emit an event to all listeners
191
+ */
192
+ emit(event) {
193
+ for (const listener of this.eventListeners) {
194
+ try {
195
+ listener(event);
196
+ }
197
+ catch (error) {
198
+ console.error('Error in plan mode event listener:', error);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ // ============================================================================
204
+ // Singleton Instance
205
+ // ============================================================================
206
+ /**
207
+ * Global plan mode manager instance
208
+ */
209
+ let globalPlanModeManager = null;
210
+ /**
211
+ * Get the global plan mode manager
212
+ */
213
+ export function getPlanModeManager() {
214
+ if (!globalPlanModeManager) {
215
+ globalPlanModeManager = new PlanModeManager();
216
+ }
217
+ return globalPlanModeManager;
218
+ }
219
+ /**
220
+ * Reset the global plan mode manager (for testing)
221
+ */
222
+ export function resetPlanModeManager() {
223
+ if (globalPlanModeManager) {
224
+ globalPlanModeManager.exit(false);
225
+ }
226
+ globalPlanModeManager = null;
227
+ }
228
+ // ============================================================================
229
+ // Convenience Functions
230
+ // ============================================================================
231
+ /**
232
+ * Check if plan mode is currently active
233
+ */
234
+ export function isPlanModeActive() {
235
+ return getPlanModeManager().isActive();
236
+ }
237
+ /**
238
+ * Get the current mode type
239
+ */
240
+ export function getCurrentMode() {
241
+ return getPlanModeManager().getCurrentMode();
242
+ }
243
+ /**
244
+ * Enter plan mode
245
+ */
246
+ export function enterPlanMode(planFilePath, originalRequest) {
247
+ getPlanModeManager().enter(planFilePath, originalRequest);
248
+ }
249
+ /**
250
+ * Exit plan mode
251
+ */
252
+ export function exitPlanMode(approved = false) {
253
+ getPlanModeManager().exit(approved);
254
+ }
255
+ /**
256
+ * Toggle plan mode
257
+ */
258
+ export function togglePlanMode(planFilePath) {
259
+ getPlanModeManager().toggle(planFilePath);
260
+ }
261
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/planning/state.ts"],"names":[],"mappings":"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"}