@ddse/acm-aicoder 0.5.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 (165) hide show
  1. package/.aicoder/index.json +304 -0
  2. package/AICODER_IMPLEMENTATION_PLAN_PHASE2.md +284 -0
  3. package/LICENSE +21 -0
  4. package/README.md +490 -0
  5. package/bin/interactive.tsx +232 -0
  6. package/dist/bin/interactive.d.ts +3 -0
  7. package/dist/bin/interactive.d.ts.map +1 -0
  8. package/dist/bin/interactive.js +155 -0
  9. package/dist/bin/interactive.js.map +1 -0
  10. package/dist/src/config/providers.d.ts +15 -0
  11. package/dist/src/config/providers.d.ts.map +1 -0
  12. package/dist/src/config/providers.js +142 -0
  13. package/dist/src/config/providers.js.map +1 -0
  14. package/dist/src/config/session.d.ts +25 -0
  15. package/dist/src/config/session.d.ts.map +1 -0
  16. package/dist/src/config/session.js +97 -0
  17. package/dist/src/config/session.js.map +1 -0
  18. package/dist/src/context/bm25.d.ts +68 -0
  19. package/dist/src/context/bm25.d.ts.map +1 -0
  20. package/dist/src/context/bm25.js +131 -0
  21. package/dist/src/context/bm25.js.map +1 -0
  22. package/dist/src/context/code-search.d.ts +30 -0
  23. package/dist/src/context/code-search.d.ts.map +1 -0
  24. package/dist/src/context/code-search.js +150 -0
  25. package/dist/src/context/code-search.js.map +1 -0
  26. package/dist/src/context/context-pack.d.ts +25 -0
  27. package/dist/src/context/context-pack.d.ts.map +1 -0
  28. package/dist/src/context/context-pack.js +92 -0
  29. package/dist/src/context/context-pack.js.map +1 -0
  30. package/dist/src/context/dependency-mapper.d.ts +10 -0
  31. package/dist/src/context/dependency-mapper.d.ts.map +1 -0
  32. package/dist/src/context/dependency-mapper.js +62 -0
  33. package/dist/src/context/dependency-mapper.js.map +1 -0
  34. package/dist/src/context/index.d.ts +8 -0
  35. package/dist/src/context/index.d.ts.map +1 -0
  36. package/dist/src/context/index.js +9 -0
  37. package/dist/src/context/index.js.map +1 -0
  38. package/dist/src/context/symbol-extractor.d.ts +26 -0
  39. package/dist/src/context/symbol-extractor.d.ts.map +1 -0
  40. package/dist/src/context/symbol-extractor.js +129 -0
  41. package/dist/src/context/symbol-extractor.js.map +1 -0
  42. package/dist/src/context/test-mapper.d.ts +16 -0
  43. package/dist/src/context/test-mapper.d.ts.map +1 -0
  44. package/dist/src/context/test-mapper.js +66 -0
  45. package/dist/src/context/test-mapper.js.map +1 -0
  46. package/dist/src/context/types.d.ts +61 -0
  47. package/dist/src/context/types.d.ts.map +1 -0
  48. package/dist/src/context/types.js +3 -0
  49. package/dist/src/context/types.js.map +1 -0
  50. package/dist/src/context/workspace-indexer.d.ts +39 -0
  51. package/dist/src/context/workspace-indexer.d.ts.map +1 -0
  52. package/dist/src/context/workspace-indexer.js +222 -0
  53. package/dist/src/context/workspace-indexer.js.map +1 -0
  54. package/dist/src/index.d.ts +5 -0
  55. package/dist/src/index.d.ts.map +1 -0
  56. package/dist/src/index.js +6 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/registries.d.ts +34 -0
  59. package/dist/src/registries.d.ts.map +1 -0
  60. package/dist/src/registries.js +87 -0
  61. package/dist/src/registries.js.map +1 -0
  62. package/dist/src/runtime/budget-manager.d.ts +42 -0
  63. package/dist/src/runtime/budget-manager.d.ts.map +1 -0
  64. package/dist/src/runtime/budget-manager.js +82 -0
  65. package/dist/src/runtime/budget-manager.js.map +1 -0
  66. package/dist/src/runtime/interactive-runtime.d.ts +39 -0
  67. package/dist/src/runtime/interactive-runtime.d.ts.map +1 -0
  68. package/dist/src/runtime/interactive-runtime.js +321 -0
  69. package/dist/src/runtime/interactive-runtime.js.map +1 -0
  70. package/dist/src/tasks-v2/analysis-tasks.d.ts +117 -0
  71. package/dist/src/tasks-v2/analysis-tasks.d.ts.map +1 -0
  72. package/dist/src/tasks-v2/analysis-tasks.js +209 -0
  73. package/dist/src/tasks-v2/analysis-tasks.js.map +1 -0
  74. package/dist/src/tasks-v2/developer-tasks.d.ts +226 -0
  75. package/dist/src/tasks-v2/developer-tasks.d.ts.map +1 -0
  76. package/dist/src/tasks-v2/developer-tasks.js +322 -0
  77. package/dist/src/tasks-v2/developer-tasks.js.map +1 -0
  78. package/dist/src/tasks-v2/index.d.ts +3 -0
  79. package/dist/src/tasks-v2/index.d.ts.map +1 -0
  80. package/dist/src/tasks-v2/index.js +4 -0
  81. package/dist/src/tasks-v2/index.js.map +1 -0
  82. package/dist/src/tools-v2/edit-tools.d.ts +67 -0
  83. package/dist/src/tools-v2/edit-tools.d.ts.map +1 -0
  84. package/dist/src/tools-v2/edit-tools.js +117 -0
  85. package/dist/src/tools-v2/edit-tools.js.map +1 -0
  86. package/dist/src/tools-v2/index.d.ts +6 -0
  87. package/dist/src/tools-v2/index.d.ts.map +1 -0
  88. package/dist/src/tools-v2/index.js +7 -0
  89. package/dist/src/tools-v2/index.js.map +1 -0
  90. package/dist/src/tools-v2/read-tools.d.ts +129 -0
  91. package/dist/src/tools-v2/read-tools.d.ts.map +1 -0
  92. package/dist/src/tools-v2/read-tools.js +216 -0
  93. package/dist/src/tools-v2/read-tools.js.map +1 -0
  94. package/dist/src/tools-v2/search-tools.d.ts +73 -0
  95. package/dist/src/tools-v2/search-tools.d.ts.map +1 -0
  96. package/dist/src/tools-v2/search-tools.js +132 -0
  97. package/dist/src/tools-v2/search-tools.js.map +1 -0
  98. package/dist/src/tools-v2/test-tools.d.ts +59 -0
  99. package/dist/src/tools-v2/test-tools.d.ts.map +1 -0
  100. package/dist/src/tools-v2/test-tools.js +111 -0
  101. package/dist/src/tools-v2/test-tools.js.map +1 -0
  102. package/dist/src/tools-v2/workspace-context.d.ts +65 -0
  103. package/dist/src/tools-v2/workspace-context.d.ts.map +1 -0
  104. package/dist/src/tools-v2/workspace-context.js +336 -0
  105. package/dist/src/tools-v2/workspace-context.js.map +1 -0
  106. package/dist/src/ui/App.d.ts +9 -0
  107. package/dist/src/ui/App.d.ts.map +1 -0
  108. package/dist/src/ui/App.js +257 -0
  109. package/dist/src/ui/App.js.map +1 -0
  110. package/dist/src/ui/components/ChatPane.d.ts +12 -0
  111. package/dist/src/ui/components/ChatPane.d.ts.map +1 -0
  112. package/dist/src/ui/components/ChatPane.js +41 -0
  113. package/dist/src/ui/components/ChatPane.js.map +1 -0
  114. package/dist/src/ui/components/EventsPane.d.ts +12 -0
  115. package/dist/src/ui/components/EventsPane.d.ts.map +1 -0
  116. package/dist/src/ui/components/EventsPane.js +48 -0
  117. package/dist/src/ui/components/EventsPane.js.map +1 -0
  118. package/dist/src/ui/components/GoalsTasksPane.d.ts +18 -0
  119. package/dist/src/ui/components/GoalsTasksPane.d.ts.map +1 -0
  120. package/dist/src/ui/components/GoalsTasksPane.js +83 -0
  121. package/dist/src/ui/components/GoalsTasksPane.js.map +1 -0
  122. package/dist/src/ui/store.d.ts +74 -0
  123. package/dist/src/ui/store.d.ts.map +1 -0
  124. package/dist/src/ui/store.js +260 -0
  125. package/dist/src/ui/store.js.map +1 -0
  126. package/dist/tests/integration.test.d.ts +2 -0
  127. package/dist/tests/integration.test.d.ts.map +1 -0
  128. package/dist/tests/integration.test.js +415 -0
  129. package/dist/tests/integration.test.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -0
  131. package/docs/AICODER.png +0 -0
  132. package/docs/INTERACTIVE_CLI_GUIDE.md +201 -0
  133. package/docs/TUI_MOCKUP.md +180 -0
  134. package/package.json +52 -0
  135. package/src/config/providers.ts +174 -0
  136. package/src/config/session.ts +143 -0
  137. package/src/context/bm25.ts +173 -0
  138. package/src/context/code-search.ts +188 -0
  139. package/src/context/context-pack.ts +133 -0
  140. package/src/context/dependency-mapper.ts +72 -0
  141. package/src/context/index.ts +8 -0
  142. package/src/context/symbol-extractor.ts +149 -0
  143. package/src/context/test-mapper.ts +77 -0
  144. package/src/context/types.ts +69 -0
  145. package/src/context/workspace-indexer.ts +249 -0
  146. package/src/index.ts +5 -0
  147. package/src/registries.ts +118 -0
  148. package/src/runtime/budget-manager.ts +118 -0
  149. package/src/runtime/interactive-runtime.ts +423 -0
  150. package/src/tasks-v2/analysis-tasks.ts +311 -0
  151. package/src/tasks-v2/developer-tasks.ts +437 -0
  152. package/src/tasks-v2/index.ts +3 -0
  153. package/src/tools-v2/edit-tools.ts +153 -0
  154. package/src/tools-v2/index.ts +6 -0
  155. package/src/tools-v2/read-tools.ts +286 -0
  156. package/src/tools-v2/search-tools.ts +175 -0
  157. package/src/tools-v2/test-tools.ts +147 -0
  158. package/src/tools-v2/workspace-context.ts +428 -0
  159. package/src/ui/App.tsx +392 -0
  160. package/src/ui/components/ChatPane.tsx +84 -0
  161. package/src/ui/components/EventsPane.tsx +81 -0
  162. package/src/ui/components/GoalsTasksPane.tsx +149 -0
  163. package/src/ui/store.ts +362 -0
  164. package/tests/integration.test.ts +537 -0
  165. package/tsconfig.json +22 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../bin/interactive.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ // ACM AI Coder - Phase 2 Interactive CLI
3
+ // Full-screen TUI with three-column layout
4
+ // Requires: --provider, --model, and --workspace (optional --base-url)
5
+ import React from 'react';
6
+ import { render } from 'ink';
7
+ import { ExternalContextProviderAdapter } from '@ddse/acm-sdk';
8
+ import { createOllamaClient, createVLLMClient } from '@ddse/acm-llm';
9
+ import { App } from '../src/ui/App.js';
10
+ import { AppStore } from '../src/ui/store.js';
11
+ import { InteractiveRuntime } from '../src/runtime/interactive-runtime.js';
12
+ import { parseCliArgs, validateAndNormalizeConfig } from '../src/config/session.js';
13
+ import { SimpleCapabilityRegistry, SimpleToolRegistry, SimplePolicyEngine,
14
+ // V2 Tools
15
+ FileStatTool, FileReadToolV2, CodeSearchTool, GrepTool, DiffTool, CodeEditToolV2, RunTestsToolV2, WorkspaceContextRetrievalTool, BuildTool,
16
+ // V2 Tasks
17
+ AnalyzeWorkspaceTask, CollectContextPackTask, SearchCodeTask, FindSymbolDefinitionTask, ImplementFunctionTask, RefactorRenameSymbolTask, FixTypeErrorTask, GenerateUnitTestsTask, } from '../src/index.js';
18
+ function buildWorkspaceContextInput(directive, goalIntent) {
19
+ const separatorIndex = directive.indexOf(':');
20
+ const payload = separatorIndex >= 0 ? directive.slice(separatorIndex + 1).trim() : '';
21
+ const operations = [];
22
+ if (payload.length > 0) {
23
+ if (payload.startsWith('{')) {
24
+ try {
25
+ const parsed = JSON.parse(payload);
26
+ if (Array.isArray(parsed.operations)) {
27
+ return {
28
+ directive,
29
+ goal: goalIntent,
30
+ operations: parsed.operations,
31
+ };
32
+ }
33
+ if (typeof parsed.query === 'string' && parsed.query.length > 0) {
34
+ operations.push({ type: 'search', query: parsed.query, includeContext: true });
35
+ }
36
+ if (typeof parsed.pattern === 'string' && parsed.pattern.length > 0) {
37
+ operations.push({ type: 'grep', pattern: parsed.pattern, maxResults: 20 });
38
+ }
39
+ }
40
+ catch {
41
+ // Fall through to textual parsing
42
+ }
43
+ }
44
+ if (operations.length === 0) {
45
+ operations.push({ type: 'search', query: payload, includeContext: true });
46
+ operations.push({ type: 'grep', pattern: payload, maxResults: 20 });
47
+ }
48
+ }
49
+ return {
50
+ directive,
51
+ goal: goalIntent,
52
+ operations,
53
+ };
54
+ }
55
+ async function main() {
56
+ try {
57
+ // Parse and validate CLI arguments
58
+ const args = parseCliArgs(process.argv.slice(2));
59
+ const config = validateAndNormalizeConfig(args);
60
+ // Ensure the process operates within the validated workspace
61
+ process.chdir(config.workspace);
62
+ // Create LLM client based on provider selection
63
+ const llm = config.provider === 'vllm'
64
+ ? createVLLMClient(config.model, config.baseUrl)
65
+ : createOllamaClient(config.model, config.baseUrl);
66
+ // Setup registries
67
+ const toolRegistry = new SimpleToolRegistry();
68
+ const capabilityRegistry = new SimpleCapabilityRegistry();
69
+ const policyEngine = new SimplePolicyEngine();
70
+ const contextProvider = new ExternalContextProviderAdapter();
71
+ // Register tools
72
+ const fileStatTool = new FileStatTool(config.workspace);
73
+ const fileReadTool = new FileReadToolV2(config.workspace);
74
+ const codeSearchTool = new CodeSearchTool(config.workspace);
75
+ const grepTool = new GrepTool(config.workspace);
76
+ const diffTool = new DiffTool(config.workspace);
77
+ const codeEditTool = new CodeEditToolV2(config.workspace);
78
+ const runTestsTool = new RunTestsToolV2(config.workspace);
79
+ const buildTool = new BuildTool(config.workspace);
80
+ const workspaceContextTool = new WorkspaceContextRetrievalTool(config.workspace);
81
+ toolRegistry.register(fileStatTool);
82
+ toolRegistry.register(fileReadTool);
83
+ toolRegistry.register(codeSearchTool);
84
+ toolRegistry.register(grepTool);
85
+ toolRegistry.register(diffTool);
86
+ toolRegistry.register(codeEditTool);
87
+ toolRegistry.register(runTestsTool);
88
+ toolRegistry.register(buildTool);
89
+ toolRegistry.register(workspaceContextTool);
90
+ contextProvider.register(workspaceContextTool, {
91
+ match: directive => directive.startsWith('workspace.context') || directive.startsWith('workspace_context'),
92
+ buildInput: (directive, ctx) => buildWorkspaceContextInput(directive, ctx.runContext?.goal.intent),
93
+ describe: 'Retrieve relevant workspace snippets, grep matches, and metadata to satisfy context requests.',
94
+ autoPromote: true,
95
+ maxArtifacts: 32,
96
+ });
97
+ // Register capabilities (tasks)
98
+ capabilityRegistry.register({ name: 'analyze_workspace', sideEffects: false }, new AnalyzeWorkspaceTask());
99
+ capabilityRegistry.register({ name: 'collect_context_pack', sideEffects: false }, new CollectContextPackTask());
100
+ capabilityRegistry.register({ name: 'search_code', sideEffects: false }, new SearchCodeTask());
101
+ capabilityRegistry.register({ name: 'find_symbol_definition', sideEffects: false }, new FindSymbolDefinitionTask());
102
+ capabilityRegistry.register({ name: 'implement_function', sideEffects: true }, new ImplementFunctionTask());
103
+ capabilityRegistry.register({ name: 'refactor_rename_symbol', sideEffects: true }, new RefactorRenameSymbolTask());
104
+ capabilityRegistry.register({ name: 'fix_type_error', sideEffects: true }, new FixTypeErrorTask());
105
+ capabilityRegistry.register({ name: 'generate_unit_tests', sideEffects: true }, new GenerateUnitTestsTask());
106
+ // Allow workspace operations
107
+ policyEngine.setAllowedPaths([config.workspace]);
108
+ // Create app store and runtime
109
+ const store = new AppStore();
110
+ const runtime = new InteractiveRuntime({
111
+ config,
112
+ llm,
113
+ capabilityRegistry,
114
+ toolRegistry,
115
+ policyEngine,
116
+ store,
117
+ contextProvider,
118
+ });
119
+ const initialBudget = runtime.getBudgetManager().getStatus();
120
+ // Welcome message
121
+ store.addMessage('system', `Welcome to ACM AI Coder (Phase 2)\n\n` +
122
+ `Configuration:\n` +
123
+ ` Provider: ${config.provider}\n` +
124
+ ` Model: ${config.model}\n` +
125
+ (config.baseUrl ? ` Base URL: ${config.baseUrl}\n` : '') +
126
+ ` Workspace: ${config.workspace}\n` +
127
+ (initialBudget.maxTokens !== undefined ? ` Token allowance: ${initialBudget.maxTokens}\n` : '') +
128
+ `\n` +
129
+ `Type your goal to start planning, or /help for commands.`);
130
+ // Update initial budget status
131
+ store.updateBudgetStatus(initialBudget);
132
+ // Handle commands from UI
133
+ const handleCommand = async (command) => {
134
+ if (command.startsWith('/')) {
135
+ // Already handled by UI component
136
+ return;
137
+ }
138
+ // Process as goal
139
+ await runtime.processGoal(command);
140
+ };
141
+ // Render TUI
142
+ render(React.createElement(App, { store: store, onCommand: handleCommand }));
143
+ }
144
+ catch (error) {
145
+ console.error('Error starting ACM AI Coder:');
146
+ console.error(error.message);
147
+ console.error('\nFor help, run: acm-aicoder --help');
148
+ process.exit(1);
149
+ }
150
+ }
151
+ main().catch(err => {
152
+ console.error('Fatal error:', err);
153
+ process.exit(1);
154
+ });
155
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../bin/interactive.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ProviderMetadata {
2
+ provider: string;
3
+ model: string;
4
+ inputCostPer1M?: number;
5
+ outputCostPer1M?: number;
6
+ maxContextTokens?: number;
7
+ maxConcurrentRequests?: number;
8
+ recommendedTemperature?: number;
9
+ supportsStreaming: boolean;
10
+ }
11
+ export declare const PROVIDER_METADATA: Record<string, ProviderMetadata>;
12
+ export declare function getProviderMetadata(model: string): ProviderMetadata;
13
+ export declare function estimateTokenCount(text: string): number;
14
+ export declare function estimateCost(inputTokens: number, outputTokens: number, metadata: ProviderMetadata): number;
15
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/config/providers.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IAGd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAG/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAuG9D,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAuBnE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CASR"}
@@ -0,0 +1,142 @@
1
+ // Provider metadata for budget governance
2
+ // Token costs and context limits per model/provider
3
+ // Provider metadata registry
4
+ // Sources: OpenAI pricing, Anthropic pricing, Azure OpenAI, local models
5
+ export const PROVIDER_METADATA = {
6
+ // OpenAI models
7
+ 'gpt-4o': {
8
+ provider: 'openai',
9
+ model: 'gpt-4o',
10
+ inputCostPer1M: 2.50,
11
+ outputCostPer1M: 10.00,
12
+ maxContextTokens: 128000,
13
+ maxConcurrentRequests: 10,
14
+ recommendedTemperature: 0.7,
15
+ supportsStreaming: true,
16
+ },
17
+ 'gpt-4o-mini': {
18
+ provider: 'openai',
19
+ model: 'gpt-4o-mini',
20
+ inputCostPer1M: 0.15,
21
+ outputCostPer1M: 0.60,
22
+ maxContextTokens: 128000,
23
+ maxConcurrentRequests: 10,
24
+ recommendedTemperature: 0.7,
25
+ supportsStreaming: true,
26
+ },
27
+ 'gpt-4-turbo': {
28
+ provider: 'openai',
29
+ model: 'gpt-4-turbo',
30
+ inputCostPer1M: 10.00,
31
+ outputCostPer1M: 30.00,
32
+ maxContextTokens: 128000,
33
+ maxConcurrentRequests: 10,
34
+ recommendedTemperature: 0.7,
35
+ supportsStreaming: true,
36
+ },
37
+ 'gpt-3.5-turbo': {
38
+ provider: 'openai',
39
+ model: 'gpt-3.5-turbo',
40
+ inputCostPer1M: 0.50,
41
+ outputCostPer1M: 1.50,
42
+ maxContextTokens: 16385,
43
+ maxConcurrentRequests: 10,
44
+ recommendedTemperature: 0.7,
45
+ supportsStreaming: true,
46
+ },
47
+ // Anthropic models
48
+ 'claude-3-opus-20240229': {
49
+ provider: 'anthropic',
50
+ model: 'claude-3-opus-20240229',
51
+ inputCostPer1M: 15.00,
52
+ outputCostPer1M: 75.00,
53
+ maxContextTokens: 200000,
54
+ maxConcurrentRequests: 5,
55
+ recommendedTemperature: 0.7,
56
+ supportsStreaming: true,
57
+ },
58
+ 'claude-3-sonnet-20240229': {
59
+ provider: 'anthropic',
60
+ model: 'claude-3-sonnet-20240229',
61
+ inputCostPer1M: 3.00,
62
+ outputCostPer1M: 15.00,
63
+ maxContextTokens: 200000,
64
+ maxConcurrentRequests: 5,
65
+ recommendedTemperature: 0.7,
66
+ supportsStreaming: true,
67
+ },
68
+ 'claude-3-haiku-20240307': {
69
+ provider: 'anthropic',
70
+ model: 'claude-3-haiku-20240307',
71
+ inputCostPer1M: 0.25,
72
+ outputCostPer1M: 1.25,
73
+ maxContextTokens: 200000,
74
+ maxConcurrentRequests: 5,
75
+ recommendedTemperature: 0.7,
76
+ supportsStreaming: true,
77
+ },
78
+ // Local/self-hosted models (no cost)
79
+ 'llama3.1': {
80
+ provider: 'ollama',
81
+ model: 'llama3.1',
82
+ inputCostPer1M: 0,
83
+ outputCostPer1M: 0,
84
+ maxContextTokens: 128000,
85
+ recommendedTemperature: 0.7,
86
+ supportsStreaming: true,
87
+ },
88
+ 'qwen2.5:7b': {
89
+ provider: 'ollama',
90
+ model: 'qwen2.5:7b',
91
+ inputCostPer1M: 0,
92
+ outputCostPer1M: 0,
93
+ maxContextTokens: 32768,
94
+ recommendedTemperature: 0.7,
95
+ supportsStreaming: true,
96
+ },
97
+ 'deepseek-coder': {
98
+ provider: 'ollama',
99
+ model: 'deepseek-coder',
100
+ inputCostPer1M: 0,
101
+ outputCostPer1M: 0,
102
+ maxContextTokens: 16000,
103
+ recommendedTemperature: 0.7,
104
+ supportsStreaming: true,
105
+ },
106
+ };
107
+ export function getProviderMetadata(model) {
108
+ // Try exact match first
109
+ if (PROVIDER_METADATA[model]) {
110
+ return PROVIDER_METADATA[model];
111
+ }
112
+ // Try prefix match (e.g., "gpt-4o-2024-05-13" matches "gpt-4o")
113
+ for (const [key, metadata] of Object.entries(PROVIDER_METADATA)) {
114
+ if (model.startsWith(key)) {
115
+ return metadata;
116
+ }
117
+ }
118
+ // Default metadata for unknown models (assume local/free)
119
+ return {
120
+ provider: 'unknown',
121
+ model,
122
+ inputCostPer1M: 0,
123
+ outputCostPer1M: 0,
124
+ maxContextTokens: 8192,
125
+ recommendedTemperature: 0.7,
126
+ supportsStreaming: true,
127
+ };
128
+ }
129
+ export function estimateTokenCount(text) {
130
+ // Rough approximation: 1 token ≈ 4 characters for English text
131
+ // More accurate would use tiktoken library, but this is sufficient for budget estimation
132
+ return Math.ceil(text.length / 4);
133
+ }
134
+ export function estimateCost(inputTokens, outputTokens, metadata) {
135
+ if (!metadata.inputCostPer1M || !metadata.outputCostPer1M) {
136
+ return 0;
137
+ }
138
+ const inputCost = (inputTokens / 1_000_000) * metadata.inputCostPer1M;
139
+ const outputCost = (outputTokens / 1_000_000) * metadata.outputCostPer1M;
140
+ return inputCost + outputCost;
141
+ }
142
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/config/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type Provider = 'ollama' | 'vllm';
2
+ export interface SessionConfig {
3
+ provider: Provider;
4
+ model: string;
5
+ baseUrl?: string;
6
+ workspace: string;
7
+ temperature: number;
8
+ seed?: number;
9
+ planCount: 1 | 2;
10
+ sessionId: string;
11
+ timestamp: number;
12
+ }
13
+ export interface CLIArgs {
14
+ provider?: string;
15
+ model?: string;
16
+ 'base-url'?: string;
17
+ workspace?: string;
18
+ temperature?: string;
19
+ seed?: string;
20
+ plans?: string;
21
+ [key: string]: string | undefined;
22
+ }
23
+ export declare function parseCliArgs(argv: string[]): CLIArgs;
24
+ export declare function validateAndNormalizeConfig(args: CLIArgs): SessionConfig;
25
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/config/session.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA6BpD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA+EvE"}
@@ -0,0 +1,97 @@
1
+ // Session configuration for AI Coder Phase 2
2
+ // Manages CLI arguments and session metadata using provider/model semantics
3
+ import { existsSync, statSync } from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ export function parseCliArgs(argv) {
7
+ const args = {};
8
+ for (let i = 0; i < argv.length; i++) {
9
+ const arg = argv[i];
10
+ if (arg.startsWith('--')) {
11
+ // Support --key=value form
12
+ if (arg.includes('=')) {
13
+ const pair = arg.slice(2);
14
+ const eqIndex = pair.indexOf('=');
15
+ const key = pair.slice(0, eqIndex);
16
+ const value = pair.slice(eqIndex + 1);
17
+ if (key.length > 0) {
18
+ args[key] = value;
19
+ }
20
+ continue;
21
+ }
22
+ // Support space-separated --key value form
23
+ const key = arg.slice(2);
24
+ const value = argv[i + 1];
25
+ if (value && !value.startsWith('--')) {
26
+ args[key] = value;
27
+ i++;
28
+ }
29
+ }
30
+ }
31
+ return args;
32
+ }
33
+ export function validateAndNormalizeConfig(args) {
34
+ const provider = args.provider || 'ollama';
35
+ if (!['ollama', 'vllm'].includes(provider)) {
36
+ throw new Error(`Invalid --provider: ${args.provider}. Must be "ollama" or "vllm".`);
37
+ }
38
+ const model = args.model || (provider === 'ollama' ? 'llama3.1' : undefined);
39
+ const missing = [];
40
+ if (!model)
41
+ missing.push('--model');
42
+ if (!args.workspace || args.workspace.trim().length === 0)
43
+ missing.push('--workspace');
44
+ if (missing.length > 0) {
45
+ throw new Error(`Missing required parameters: ${missing.join(', ')}\n\n` +
46
+ `ACM AI Coder requires these parameters to start:\n` +
47
+ ` --provider <ollama|vllm> LLM provider (default: ollama)\n` +
48
+ ` --model <name> Model identifier (e.g., llama3.1, gpt-4o)\n` +
49
+ ` --workspace <path> REQUIRED: absolute or relative path to project root\n\n` +
50
+ `Optional parameters:\n` +
51
+ ` --base-url <url> Override provider base URL\n` +
52
+ ` --temperature <0-2> LLM temperature (default: 0.7)\n` +
53
+ ` --seed <number> Random seed for reproducibility\n` +
54
+ ` --plans <1|2> Number of alternative plans (default: 1)\n\n` +
55
+ `Examples:\n` +
56
+ ` acm-aicoder --provider vllm --model gpt-4o --workspace /abs/path\n` +
57
+ ` acm-aicoder --provider ollama --model llama3.1 --workspace=~/myproject`);
58
+ }
59
+ const temperature = args.temperature ? parseFloat(args.temperature) : 0.7;
60
+ if (isNaN(temperature) || temperature < 0 || temperature > 2) {
61
+ throw new Error(`Invalid --temperature: must be between 0 and 2`);
62
+ }
63
+ const seed = args.seed ? parseInt(args.seed, 10) : undefined;
64
+ if (seed !== undefined && Number.isNaN(seed)) {
65
+ throw new Error(`Invalid --seed: must be a number`);
66
+ }
67
+ const planCount = args.plans === '2' ? 2 : 1;
68
+ // Enforce explicit workspace and normalize
69
+ const baseCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
70
+ let workspaceInput = args.workspace;
71
+ // Expand ~ to user home
72
+ if (workspaceInput.startsWith('~/')) {
73
+ workspaceInput = path.join(os.homedir(), workspaceInput.slice(2));
74
+ }
75
+ const resolvedWorkspace = path.isAbsolute(workspaceInput)
76
+ ? workspaceInput
77
+ : path.resolve(baseCwd, workspaceInput);
78
+ if (!existsSync(resolvedWorkspace)) {
79
+ throw new Error(`Workspace path "${resolvedWorkspace}" does not exist. Please provide a valid --workspace.`);
80
+ }
81
+ const stats = statSync(resolvedWorkspace);
82
+ if (!stats.isDirectory()) {
83
+ throw new Error(`Workspace path "${resolvedWorkspace}" is not a directory. Please provide a valid --workspace.`);
84
+ }
85
+ return {
86
+ provider,
87
+ model: model,
88
+ baseUrl: args['base-url'],
89
+ workspace: resolvedWorkspace,
90
+ temperature,
91
+ seed,
92
+ planCount,
93
+ sessionId: `session-${Date.now()}`,
94
+ timestamp: Date.now(),
95
+ };
96
+ }
97
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/config/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Document interface for BM25 search
3
+ */
4
+ export interface Document {
5
+ id: string;
6
+ title?: string;
7
+ content: string;
8
+ [key: string]: any;
9
+ }
10
+ /**
11
+ * Search result with score
12
+ */
13
+ export interface SearchResult {
14
+ document: Document;
15
+ score: number;
16
+ }
17
+ /**
18
+ * BM25 parameters
19
+ */
20
+ export interface BM25Params {
21
+ k1?: number;
22
+ b?: number;
23
+ }
24
+ /**
25
+ * BM25 Search Engine
26
+ *
27
+ * Implements the BM25 ranking function for full-text search.
28
+ * BM25 is a probabilistic ranking function used by search engines
29
+ * to estimate the relevance of documents to a query.
30
+ */
31
+ export declare class BM25Search {
32
+ private documents;
33
+ private documentTokens;
34
+ private documentFrequency;
35
+ private averageDocumentLength;
36
+ private k1;
37
+ private b;
38
+ constructor(params?: BM25Params);
39
+ /**
40
+ * Index documents for search
41
+ */
42
+ index(documents: Document[]): void;
43
+ /**
44
+ * Extract searchable text from document
45
+ */
46
+ private extractText;
47
+ /**
48
+ * Calculate IDF (Inverse Document Frequency)
49
+ */
50
+ private idf;
51
+ /**
52
+ * Calculate BM25 score for a document
53
+ */
54
+ private score;
55
+ /**
56
+ * Search for documents matching the query
57
+ */
58
+ search(query: string, limit?: number): SearchResult[];
59
+ /**
60
+ * Get all indexed documents
61
+ */
62
+ getDocuments(): Document[];
63
+ /**
64
+ * Get document count
65
+ */
66
+ getDocumentCount(): number;
67
+ }
68
+ //# sourceMappingURL=bm25.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../../src/context/bm25.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAeD;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,CAAC,CAAS;gBAEN,MAAM,GAAE,UAAe;IAKnC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAuBlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,GAAG;IAQX;;OAEG;IACH,OAAO,CAAC,KAAK;IAqBb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAwBzD;;OAEG;IACH,YAAY,IAAI,QAAQ,EAAE;IAI1B;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}