@ai-coders/context 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +7 -2
  2. package/dist/commands/shared/agents.d.ts +2 -0
  3. package/dist/commands/shared/agents.d.ts.map +1 -0
  4. package/dist/commands/shared/agents.js +15 -0
  5. package/dist/commands/shared/agents.js.map +1 -0
  6. package/dist/commands/shared/selection.d.ts +12 -0
  7. package/dist/commands/shared/selection.d.ts.map +1 -0
  8. package/dist/commands/shared/selection.js +95 -0
  9. package/dist/commands/shared/selection.js.map +1 -0
  10. package/dist/generators/plans/templates/planTemplate.d.ts.map +1 -1
  11. package/dist/generators/plans/templates/planTemplate.js +22 -10
  12. package/dist/generators/plans/templates/planTemplate.js.map +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +98 -40
  15. package/dist/index.js.map +1 -1
  16. package/dist/prompts/defaults.d.ts +3 -0
  17. package/dist/prompts/defaults.d.ts.map +1 -0
  18. package/dist/prompts/defaults.js +95 -0
  19. package/dist/prompts/defaults.js.map +1 -0
  20. package/dist/services/fill/fillService.d.ts +50 -0
  21. package/dist/services/fill/fillService.d.ts.map +1 -0
  22. package/dist/services/fill/fillService.js +302 -0
  23. package/dist/services/fill/fillService.js.map +1 -0
  24. package/dist/services/init/initService.d.ts +37 -0
  25. package/dist/services/init/initService.d.ts.map +1 -0
  26. package/dist/services/init/initService.js +137 -0
  27. package/dist/services/init/initService.js.map +1 -0
  28. package/dist/services/plan/planService.d.ts +59 -0
  29. package/dist/services/plan/planService.d.ts.map +1 -0
  30. package/dist/services/plan/planService.js +343 -0
  31. package/dist/services/plan/planService.js.map +1 -0
  32. package/dist/services/shared/llmConfig.d.ts +22 -0
  33. package/dist/services/shared/llmConfig.d.ts.map +1 -0
  34. package/dist/services/shared/llmConfig.js +80 -0
  35. package/dist/services/shared/llmConfig.js.map +1 -0
  36. package/dist/utils/i18n.d.ts +12 -1
  37. package/dist/utils/i18n.d.ts.map +1 -1
  38. package/dist/utils/i18n.js +26 -4
  39. package/dist/utils/i18n.js.map +1 -1
  40. package/dist/utils/promptLoader.d.ts +12 -0
  41. package/dist/utils/promptLoader.d.ts.map +1 -0
  42. package/dist/utils/promptLoader.js +81 -0
  43. package/dist/utils/promptLoader.js.map +1 -0
  44. package/dist/utils/versionChecker.d.ts +15 -0
  45. package/dist/utils/versionChecker.d.ts.map +1 -0
  46. package/dist/utils/versionChecker.js +49 -0
  47. package/dist/utils/versionChecker.js.map +1 -0
  48. package/package.json +4 -2
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.PlanService = void 0;
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs-extra"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const planGenerator_1 = require("../../generators/plans/planGenerator");
44
+ const shared_1 = require("../../generators/shared");
45
+ const promptLoader_1 = require("../../utils/promptLoader");
46
+ const llmConfig_1 = require("../shared/llmConfig");
47
+ const fileMapper_1 = require("../../utils/fileMapper");
48
+ const llmClientFactory_1 = require("../llmClientFactory");
49
+ class PlanService {
50
+ constructor(dependencies) {
51
+ this.ui = dependencies.ui;
52
+ this.t = dependencies.t;
53
+ this.version = dependencies.version;
54
+ this.defaultModel = dependencies.defaultModel;
55
+ this.planGenerator = dependencies.planGenerator ?? new planGenerator_1.PlanGenerator();
56
+ this.fileMapperFactory = dependencies.fileMapperFactory ?? ((exclude) => new fileMapper_1.FileMapper(exclude ?? []));
57
+ this.llmClientFactory = dependencies.llmClientFactory ?? llmClientFactory_1.LLMClientFactory;
58
+ }
59
+ async scaffoldPlanIfNeeded(planName, outputDir, options) {
60
+ const resolvedOutput = path.resolve(outputDir);
61
+ const plansDir = path.join(resolvedOutput, 'plans');
62
+ const normalizedInput = planName.replace(/\.md$/i, '');
63
+ const slug = shared_1.GeneratorUtils.slugify(normalizedInput);
64
+ if (!slug) {
65
+ throw new Error(this.t('errors.plan.invalidName'));
66
+ }
67
+ const planPath = path.join(plansDir, `${slug}.md`);
68
+ const planExists = await fs.pathExists(planPath);
69
+ if (planExists && !options.force) {
70
+ return;
71
+ }
72
+ const result = await this.planGenerator.generatePlan({
73
+ planName,
74
+ outputDir: resolvedOutput,
75
+ title: options.title,
76
+ summary: options.summary,
77
+ selectedAgentTypes: options.agentSelection
78
+ ? options.agentSelection.explicitNone
79
+ ? null
80
+ : options.agentSelection.selected
81
+ : undefined,
82
+ selectedDocKeys: options.docSelection
83
+ ? options.docSelection.explicitNone
84
+ ? null
85
+ : options.docSelection.selected
86
+ : undefined,
87
+ force: Boolean(options.force),
88
+ verbose: Boolean(options.verbose)
89
+ });
90
+ const relativePath = result.relativePath;
91
+ const message = planExists && options.force
92
+ ? this.t('messages.plan.regenerated', { path: relativePath })
93
+ : this.t('messages.plan.created', { path: relativePath });
94
+ this.ui.displayInfo(this.t('info.plan.scaffolded.title'), message);
95
+ }
96
+ async fillPlan(planName, rawOptions) {
97
+ const outputDir = path.resolve(rawOptions.output || './.context');
98
+ const plansDir = path.join(outputDir, 'plans');
99
+ await this.ensureDirectoryExists(plansDir, this.t('errors.plan.missingPlansDir'));
100
+ const planPath = await this.resolvePlanPath(planName, plansDir);
101
+ const docsDir = path.join(outputDir, 'docs');
102
+ const agentsDir = path.join(outputDir, 'agents');
103
+ await this.ensureDirectoryExists(docsDir, this.t('errors.fill.missingDocsScaffold'));
104
+ await this.ensureDirectoryExists(agentsDir, this.t('errors.fill.missingAgentsScaffold'));
105
+ const repoPath = path.resolve(rawOptions.repo || process.cwd());
106
+ if (!(await fs.pathExists(repoPath))) {
107
+ throw new Error(this.t('errors.common.repoMissing', { path: repoPath }));
108
+ }
109
+ const llmConfig = await (0, llmConfig_1.resolveLlmConfig)({
110
+ rawOptions: {
111
+ provider: rawOptions.provider,
112
+ model: rawOptions.model,
113
+ apiKey: rawOptions.apiKey,
114
+ baseUrl: rawOptions.baseUrl
115
+ },
116
+ fallbackModel: this.defaultModel,
117
+ t: this.t,
118
+ factory: this.llmClientFactory
119
+ });
120
+ const planPrompt = await (0, promptLoader_1.resolvePlanPrompt)(rawOptions.prompt, missingPath => this.t('errors.fill.promptMissing', { path: missingPath }));
121
+ const planContent = await fs.readFile(planPath, 'utf-8');
122
+ const docsIndexPath = path.join(docsDir, 'README.md');
123
+ const agentsIndexPath = path.join(agentsDir, 'README.md');
124
+ const docsIndex = (await fs.pathExists(docsIndexPath)) ? await fs.readFile(docsIndexPath, 'utf-8') : undefined;
125
+ const agentsIndex = (await fs.pathExists(agentsIndexPath)) ? await fs.readFile(agentsIndexPath, 'utf-8') : undefined;
126
+ const referencedDocs = await this.loadReferencedMarkdown(docsDir, this.extractPlanReferences(planContent, 'docs'));
127
+ const referencedAgents = await this.loadReferencedMarkdown(agentsDir, this.extractPlanReferences(planContent, 'agents'));
128
+ this.displayPromptSource(planPrompt.path, planPrompt.source);
129
+ this.ui.displayWelcome(this.version);
130
+ this.ui.displayProjectInfo(repoPath, outputDir, `plan-fill:${llmConfig.provider}`);
131
+ const fileMapper = this.fileMapperFactory(rawOptions.exclude);
132
+ this.ui.displayStep(1, 3, this.t('steps.plan.summary'));
133
+ this.ui.startSpinner(this.t('spinner.planFill.analyzingRepo'));
134
+ const repoStructure = await fileMapper.mapRepository(repoPath, rawOptions.include);
135
+ const contextSummary = this.buildContextSummary(repoStructure);
136
+ this.ui.updateSpinner(this.t('spinner.planFill.summaryReady'), 'success');
137
+ const llmClient = this.llmClientFactory.createClient({
138
+ apiKey: llmConfig.apiKey,
139
+ model: llmConfig.model,
140
+ provider: llmConfig.provider,
141
+ baseUrl: llmConfig.baseUrl
142
+ });
143
+ const planRelativePath = path.relative(outputDir, planPath);
144
+ const results = [];
145
+ this.ui.displayStep(2, 3, this.t('steps.plan.update', { path: planRelativePath, model: llmConfig.model }));
146
+ this.ui.startSpinner(this.t('spinner.planFill.updating', { path: planRelativePath }));
147
+ try {
148
+ const userPrompt = this.buildPlanUserPrompt({
149
+ relativePath: planRelativePath,
150
+ planContent,
151
+ contextSummary,
152
+ docsIndex,
153
+ agentsIndex,
154
+ docs: referencedDocs,
155
+ agents: referencedAgents
156
+ });
157
+ const updatedContent = await llmClient.generateText(userPrompt, planPrompt.content);
158
+ if (!updatedContent || !updatedContent.trim()) {
159
+ this.ui.updateSpinner(this.t('spinner.planFill.noContent'), 'warn');
160
+ results.push({ file: planRelativePath, status: 'skipped', message: this.t('messages.fill.emptyResponse') });
161
+ }
162
+ else if (rawOptions.dryRun) {
163
+ this.ui.updateSpinner(this.t('spinner.planFill.dryRun'), 'info');
164
+ console.log(chalk_1.default.gray(`\n${this.t('messages.fill.previewStart')}`));
165
+ console.log(updatedContent.trim());
166
+ console.log(chalk_1.default.gray(`${this.t('messages.fill.previewEnd')}\n`));
167
+ results.push({ file: planRelativePath, status: 'skipped', message: 'dry-run' });
168
+ }
169
+ else {
170
+ await fs.writeFile(planPath, this.ensureTrailingNewline(updatedContent));
171
+ this.ui.updateSpinner(this.t('spinner.planFill.updated', { path: planRelativePath }), 'success');
172
+ results.push({ file: planRelativePath, status: 'updated' });
173
+ }
174
+ }
175
+ catch (error) {
176
+ this.ui.updateSpinner(this.t('spinner.planFill.failed'), 'fail');
177
+ results.push({
178
+ file: planRelativePath,
179
+ status: 'failed',
180
+ message: error instanceof Error ? error.message : String(error)
181
+ });
182
+ }
183
+ finally {
184
+ this.ui.stopSpinner();
185
+ }
186
+ this.ui.displayStep(3, 3, this.t('steps.plan.summaryResults'));
187
+ this.printLlmSummary(llmClient.getUsageStats(), results, Boolean(rawOptions.dryRun));
188
+ this.ui.displaySuccess(this.t('success.plan.filled'));
189
+ }
190
+ async resolvePlanPath(planName, plansDir) {
191
+ const normalizedInput = planName.replace(/\.md$/i, '');
192
+ const slug = shared_1.GeneratorUtils.slugify(normalizedInput);
193
+ if (!slug) {
194
+ throw new Error(this.t('errors.plan.invalidName'));
195
+ }
196
+ const candidateFiles = new Set();
197
+ candidateFiles.add(path.join(plansDir, `${slug}.md`));
198
+ if (planName.toLowerCase().endsWith('.md')) {
199
+ candidateFiles.add(path.join(plansDir, planName));
200
+ }
201
+ for (const candidate of candidateFiles) {
202
+ if (await fs.pathExists(candidate)) {
203
+ return candidate;
204
+ }
205
+ }
206
+ const expected = Array.from(candidateFiles).map(file => path.relative(process.cwd(), file)).join(' or ');
207
+ throw new Error(this.t('errors.plan.notFound', { expected }));
208
+ }
209
+ async ensureDirectoryExists(dir, message) {
210
+ const exists = await fs.pathExists(dir);
211
+ if (!exists) {
212
+ throw new Error(message);
213
+ }
214
+ }
215
+ displayPromptSource(promptPath, source) {
216
+ if (source === 'custom' && promptPath) {
217
+ this.ui.displayInfo(this.t('info.prompt.title'), this.t('info.prompt.usingCustom', { path: this.displayablePath(promptPath) }));
218
+ return;
219
+ }
220
+ if (source === 'package' && promptPath) {
221
+ this.ui.displayInfo(this.t('info.prompt.title'), this.t('info.prompt.usingPackage', { path: this.displayablePath(promptPath) }));
222
+ return;
223
+ }
224
+ this.ui.displayInfo(this.t('info.prompt.title'), this.t('info.prompt.usingBundled'));
225
+ }
226
+ displayablePath(promptPath) {
227
+ const relative = path.relative(process.cwd(), promptPath);
228
+ return relative || promptPath;
229
+ }
230
+ buildPlanUserPrompt(context) {
231
+ const guidance = [
232
+ '- Preserve the YAML front matter and `ai-task` wrapper already in the plan.',
233
+ '- Replace TODOs with concrete steps that align with the provided documentation and agent playbooks.',
234
+ '- Keep the Agent Lineup and Documentation Touchpoints tables accurate and sorted.',
235
+ '- Ensure the work is segmented into phases, each with numbered steps, named owners, deliverables, evidence expectations, and a concluding Git commit checkpoint.',
236
+ '- Return only the full updated Markdown for this plan.'
237
+ ];
238
+ const sections = [
239
+ `Target file: ${context.relativePath}`,
240
+ 'Repository summary:',
241
+ context.contextSummary,
242
+ '',
243
+ 'Guidance:',
244
+ ...guidance,
245
+ '',
246
+ 'Current plan:',
247
+ '<plan>',
248
+ context.planContent,
249
+ '</plan>'
250
+ ];
251
+ if (context.docsIndex) {
252
+ sections.push('', 'Documentation index (docs/README.md):', '<docs-index>', context.docsIndex, '</docs-index>');
253
+ }
254
+ if (context.agentsIndex) {
255
+ sections.push('', 'Agent index (agents/README.md):', '<agents-index>', context.agentsIndex, '</agents-index>');
256
+ }
257
+ if (context.docs.length > 0) {
258
+ const docSections = context.docs
259
+ .map(doc => `Path: ${doc.path}\n<doc>\n${doc.content}\n</doc>`)
260
+ .join('\n\n');
261
+ sections.push('', 'Referenced documentation:', docSections);
262
+ }
263
+ if (context.agents.length > 0) {
264
+ const agentSections = context.agents
265
+ .map(agent => `Path: ${agent.path}\n<agent>\n${agent.content}\n</agent>`)
266
+ .join('\n\n');
267
+ sections.push('', 'Referenced agents:', agentSections);
268
+ }
269
+ return sections.join('\n');
270
+ }
271
+ async loadReferencedMarkdown(baseDir, references) {
272
+ const results = [];
273
+ const seen = new Set();
274
+ for (const reference of references) {
275
+ const normalized = reference.replace(/^\.\/+/, '');
276
+ if (seen.has(normalized)) {
277
+ continue;
278
+ }
279
+ const fullPath = path.join(baseDir, normalized);
280
+ if (!(await fs.pathExists(fullPath))) {
281
+ continue;
282
+ }
283
+ const content = await fs.readFile(fullPath, 'utf-8');
284
+ results.push({ path: normalized, content });
285
+ seen.add(normalized);
286
+ }
287
+ return results;
288
+ }
289
+ extractPlanReferences(content, type) {
290
+ const regex = new RegExp(`\[.+?\]\(\.{2}\/${type}/([^\)]+)\)`, 'g');
291
+ const matches = new Set();
292
+ let match;
293
+ while ((match = regex.exec(content)) !== null) {
294
+ matches.add(match[1]);
295
+ }
296
+ return matches;
297
+ }
298
+ ensureTrailingNewline(content) {
299
+ return content.endsWith('\n') ? content : `${content}\n`;
300
+ }
301
+ buildContextSummary(repoStructure) {
302
+ const directories = new Set();
303
+ repoStructure.directories.forEach(dir => {
304
+ const [first] = dir.relativePath.split(/[\\/]/).filter(Boolean);
305
+ if (first) {
306
+ directories.add(first);
307
+ }
308
+ });
309
+ const topDirs = Array.from(directories).sort().slice(0, 12);
310
+ const totalSizeMb = (repoStructure.totalSize / (1024 * 1024)).toFixed(2);
311
+ return [
312
+ `Top-level directories: ${topDirs.length ? topDirs.join(', ') : 'n/a'}`,
313
+ `Total files scanned: ${repoStructure.totalFiles}`,
314
+ `Repository size (approx.): ${totalSizeMb} MB`
315
+ ].join('\n');
316
+ }
317
+ printLlmSummary(usage, results, dryRun) {
318
+ const updated = results.filter(result => result.status === 'updated').length;
319
+ const skipped = results.filter(result => result.status === 'skipped').length;
320
+ const failed = results.filter(result => result.status === 'failed');
321
+ console.log('\n' + chalk_1.default.bold('🗺️ Plan Fill Summary'));
322
+ console.log(chalk_1.default.gray('─'.repeat(50)));
323
+ console.log(`${chalk_1.default.blue('Updated plans:')} ${chalk_1.default.white(updated.toString())}`);
324
+ console.log(`${chalk_1.default.blue('Skipped plans:')} ${chalk_1.default.white(skipped.toString())}${dryRun ? chalk_1.default.gray(' (dry run)') : ''}`);
325
+ console.log(`${chalk_1.default.blue('Failures:')} ${failed.length}`);
326
+ if (usage.totalCalls > 0) {
327
+ console.log(chalk_1.default.gray('─'.repeat(50)));
328
+ console.log(`${chalk_1.default.blue('LLM calls:')} ${usage.totalCalls}`);
329
+ console.log(`${chalk_1.default.blue('Prompt tokens:')} ${usage.totalPromptTokens}`);
330
+ console.log(`${chalk_1.default.blue('Completion tokens:')} ${usage.totalCompletionTokens}`);
331
+ console.log(`${chalk_1.default.blue('Estimated cost:')} ${usage.estimatedCost.toFixed(4)}`);
332
+ console.log(`${chalk_1.default.blue('Model:')} ${usage.model}`);
333
+ }
334
+ if (failed.length > 0) {
335
+ console.log(chalk_1.default.gray('─'.repeat(50)));
336
+ failed.forEach(item => {
337
+ console.log(`${chalk_1.default.red('✖')} ${chalk_1.default.white(item.file)} — ${chalk_1.default.gray(item.message || 'Unknown error')}`);
338
+ });
339
+ }
340
+ }
341
+ }
342
+ exports.PlanService = PlanService;
343
+ //# sourceMappingURL=planService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planService.js","sourceRoot":"","sources":["../../../src/services/plan/planService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { TranslateFn } from '../../utils/i18n';
2
+ import type { LLMConfig } from '../../types';
3
+ import { LLMClientFactory } from '../llmClientFactory';
4
+ export interface ResolvedLlmConfig {
5
+ provider: LLMConfig['provider'];
6
+ model: string;
7
+ apiKey: string;
8
+ baseUrl?: string;
9
+ }
10
+ export interface ResolveLlmConfigOptions {
11
+ rawOptions: {
12
+ provider?: LLMConfig['provider'];
13
+ model?: string;
14
+ apiKey?: string;
15
+ baseUrl?: string;
16
+ };
17
+ fallbackModel: string;
18
+ t: TranslateFn;
19
+ factory?: typeof LLMClientFactory;
20
+ }
21
+ export declare function resolveLlmConfig({ rawOptions, fallbackModel, t, factory }: ResolveLlmConfigOptions): Promise<ResolvedLlmConfig>;
22
+ //# sourceMappingURL=llmConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmConfig.d.ts","sourceRoot":"","sources":["../../../src/services/shared/llmConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE;QACV,QAAQ,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,EAAE,WAAW,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,gBAAgB,CAAC;CACnC;AAED,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,aAAa,EACb,CAAC,EACD,OAA0B,EAC3B,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgFtD"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveLlmConfig = resolveLlmConfig;
4
+ const llmClientFactory_1 = require("../llmClientFactory");
5
+ async function resolveLlmConfig({ rawOptions, fallbackModel, t, factory = llmClientFactory_1.LLMClientFactory }) {
6
+ const providerEnvMap = factory.getEnvironmentVariables();
7
+ const defaultModels = factory.getDefaultModels();
8
+ let provider = rawOptions.provider;
9
+ let model = rawOptions.model;
10
+ let apiKey = rawOptions.apiKey;
11
+ if (!apiKey) {
12
+ if (provider) {
13
+ for (const envVar of providerEnvMap[provider]) {
14
+ const value = process.env[envVar];
15
+ if (value) {
16
+ apiKey = value;
17
+ break;
18
+ }
19
+ }
20
+ }
21
+ else {
22
+ outer: for (const [prov, envVars] of Object.entries(providerEnvMap)) {
23
+ for (const envVar of envVars) {
24
+ const value = process.env[envVar];
25
+ if (value) {
26
+ apiKey = value;
27
+ provider = prov;
28
+ break outer;
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
34
+ if (!provider) {
35
+ if (model) {
36
+ provider = factory.detectProviderFromModel(model);
37
+ }
38
+ else if (apiKey) {
39
+ provider = factory.getProviderFromApiKey(apiKey);
40
+ }
41
+ }
42
+ if (!model) {
43
+ if (provider === 'openrouter' && process.env.OPENROUTER_MODEL) {
44
+ model = process.env.OPENROUTER_MODEL;
45
+ }
46
+ else if (provider && defaultModels[provider]?.length) {
47
+ model = defaultModels[provider][0];
48
+ }
49
+ else {
50
+ model = fallbackModel;
51
+ provider = factory.detectProviderFromModel(model);
52
+ }
53
+ }
54
+ if (!provider) {
55
+ provider = factory.detectProviderFromModel(model || fallbackModel);
56
+ }
57
+ if (!apiKey) {
58
+ for (const envVar of providerEnvMap[provider]) {
59
+ const value = process.env[envVar];
60
+ if (value) {
61
+ apiKey = value;
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ if (!apiKey) {
67
+ const envVars = providerEnvMap[provider];
68
+ throw new Error(t('errors.fill.apiKeyMissing', {
69
+ provider: provider.toUpperCase(),
70
+ envVars: envVars.join(', ')
71
+ }));
72
+ }
73
+ return {
74
+ provider,
75
+ model: model || fallbackModel,
76
+ apiKey,
77
+ baseUrl: rawOptions.baseUrl
78
+ };
79
+ }
80
+ //# sourceMappingURL=llmConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmConfig.js","sourceRoot":"","sources":["../../../src/services/shared/llmConfig.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,12 @@ declare const englishMessages: {
23
23
  readonly 'ui.generationSummary.timeElapsed': "Time elapsed";
24
24
  readonly 'ui.generationSummary.nextStep': "Next step: customize the generated templates to match your project.";
25
25
  readonly 'ui.error.title': "❌ Error Occurred";
26
+ readonly 'info.prompt.title': "System Prompt";
27
+ readonly 'info.prompt.usingCustom': "Using prompt from {path}.";
28
+ readonly 'info.prompt.usingPackage': "Using packaged prompt at {path}.";
29
+ readonly 'info.prompt.usingBundled': "Using built-in prompt bundled with ai-context.";
30
+ readonly 'info.update.available.title': "Update available";
31
+ readonly 'info.update.available.detail': "A newer version {latest} is available (current {current}). Update with {command}.";
26
32
  readonly 'commands.init.description': "Generate docs and agent scaffolding for a repository";
27
33
  readonly 'commands.init.arguments.repoPath': "Path to the repository to analyze";
28
34
  readonly 'commands.init.arguments.type': "Scaffold type: \"docs\", \"agents\", or \"both\" (default)";
@@ -132,6 +138,8 @@ declare const englishMessages: {
132
138
  readonly 'prompts.main.choice.scaffold': "Generate documentation/agent scaffolding";
133
139
  readonly 'prompts.main.choice.fill': "Fill docs and agents with an LLM";
134
140
  readonly 'prompts.main.choice.plan': "Create a development plan";
141
+ readonly 'prompts.main.choice.changeLanguage': "Change language";
142
+ readonly 'prompts.main.choice.exit': "Exit interactive mode";
135
143
  readonly 'prompts.scaffold.repoPath': "Repository path to analyze";
136
144
  readonly 'prompts.scaffold.includeDocs': "Generate documentation scaffolding?";
137
145
  readonly 'prompts.scaffold.selectDocs': "Select documentation guides to scaffold";
@@ -139,7 +147,7 @@ declare const englishMessages: {
139
147
  readonly 'prompts.scaffold.selectAgents': "Select agent playbooks to scaffold";
140
148
  readonly 'prompts.common.verbose': "Enable verbose logging?";
141
149
  readonly 'prompts.fill.repoPath': "Repository path containing the scaffold";
142
- readonly 'prompts.fill.promptPath': "Instruction prompt to follow";
150
+ readonly 'prompts.fill.promptPath': "Custom prompt path (leave blank to use the bundled default)";
143
151
  readonly 'prompts.fill.dryRun': "Preview changes without writing files?";
144
152
  readonly 'prompts.fill.processAll': "Process every Markdown file regardless of markers?";
145
153
  readonly 'prompts.fill.limit': "Maximum number of files to update (leave blank for all)";
@@ -169,6 +177,9 @@ declare const englishMessages: {
169
177
  readonly 'errors.plan.fillFailed': "Failed to fill plan with LLM assistance";
170
178
  readonly 'errors.fill.promptMissing': "Prompt file not found at {path}.";
171
179
  readonly 'errors.fill.apiKeyMissing': "{provider} API key is required. Set one of {envVars} or use --api-key.";
180
+ readonly 'info.interactive.returning.title': "Main menu";
181
+ readonly 'info.interactive.returning.detail': "Returning to the interactive menu. Pick another action or choose Exit.";
182
+ readonly 'success.interactive.goodbye': "Goodbye! Thanks for using ai-context.";
172
183
  };
173
184
  export type TranslationKey = keyof typeof englishMessages;
174
185
  export type TranslateParams = Record<string, string | number | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAoB,CAAC;AAC3D,eAAO,MAAM,cAAc,EAAE,MAAa,CAAC;AAE3C,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwKX,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAmL1D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC;AAEpF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAQ5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAS9E;AA4BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAoB,CAAC;AAC3D,eAAO,MAAM,cAAc,EAAE,MAAa,CAAC;AAE3C,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmLX,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AA8L1D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC;AAEpF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAQ5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAS9E;AA4BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -29,6 +29,12 @@ const englishMessages = {
29
29
  'ui.generationSummary.timeElapsed': 'Time elapsed',
30
30
  'ui.generationSummary.nextStep': 'Next step: customize the generated templates to match your project.',
31
31
  'ui.error.title': '❌ Error Occurred',
32
+ 'info.prompt.title': 'System Prompt',
33
+ 'info.prompt.usingCustom': 'Using prompt from {path}.',
34
+ 'info.prompt.usingPackage': 'Using packaged prompt at {path}.',
35
+ 'info.prompt.usingBundled': 'Using built-in prompt bundled with ai-context.',
36
+ 'info.update.available.title': 'Update available',
37
+ 'info.update.available.detail': 'A newer version {latest} is available (current {current}). Update with {command}.',
32
38
  'commands.init.description': 'Generate docs and agent scaffolding for a repository',
33
39
  'commands.init.arguments.repoPath': 'Path to the repository to analyze',
34
40
  'commands.init.arguments.type': 'Scaffold type: "docs", "agents", or "both" (default)',
@@ -138,6 +144,8 @@ const englishMessages = {
138
144
  'prompts.main.choice.scaffold': 'Generate documentation/agent scaffolding',
139
145
  'prompts.main.choice.fill': 'Fill docs and agents with an LLM',
140
146
  'prompts.main.choice.plan': 'Create a development plan',
147
+ 'prompts.main.choice.changeLanguage': 'Change language',
148
+ 'prompts.main.choice.exit': 'Exit interactive mode',
141
149
  'prompts.scaffold.repoPath': 'Repository path to analyze',
142
150
  'prompts.scaffold.includeDocs': 'Generate documentation scaffolding?',
143
151
  'prompts.scaffold.selectDocs': 'Select documentation guides to scaffold',
@@ -145,7 +153,7 @@ const englishMessages = {
145
153
  'prompts.scaffold.selectAgents': 'Select agent playbooks to scaffold',
146
154
  'prompts.common.verbose': 'Enable verbose logging?',
147
155
  'prompts.fill.repoPath': 'Repository path containing the scaffold',
148
- 'prompts.fill.promptPath': 'Instruction prompt to follow',
156
+ 'prompts.fill.promptPath': 'Custom prompt path (leave blank to use the bundled default)',
149
157
  'prompts.fill.dryRun': 'Preview changes without writing files?',
150
158
  'prompts.fill.processAll': 'Process every Markdown file regardless of markers?',
151
159
  'prompts.fill.limit': 'Maximum number of files to update (leave blank for all)',
@@ -174,7 +182,10 @@ const englishMessages = {
174
182
  'prompts.language.option.pt-BR': 'Portuguese (Brazil) / Português (Brasil)',
175
183
  'errors.plan.fillFailed': 'Failed to fill plan with LLM assistance',
176
184
  'errors.fill.promptMissing': 'Prompt file not found at {path}.',
177
- 'errors.fill.apiKeyMissing': '{provider} API key is required. Set one of {envVars} or use --api-key.'
185
+ 'errors.fill.apiKeyMissing': '{provider} API key is required. Set one of {envVars} or use --api-key.',
186
+ 'info.interactive.returning.title': 'Main menu',
187
+ 'info.interactive.returning.detail': 'Returning to the interactive menu. Pick another action or choose Exit.',
188
+ 'success.interactive.goodbye': 'Goodbye! Thanks for using ai-context.'
178
189
  };
179
190
  const portugueseMessages = {
180
191
  'cli.name': 'AI Coders Context by aicoders.academy',
@@ -198,6 +209,12 @@ const portugueseMessages = {
198
209
  'ui.generationSummary.timeElapsed': 'Tempo decorrido',
199
210
  'ui.generationSummary.nextStep': 'Próximo passo: personalize os templates gerados para o seu projeto.',
200
211
  'ui.error.title': '❌ Ocorreu um erro',
212
+ 'info.prompt.title': 'Prompt do sistema',
213
+ 'info.prompt.usingCustom': 'Usando prompt em {path}.',
214
+ 'info.prompt.usingPackage': 'Usando prompt empacotado em {path}.',
215
+ 'info.prompt.usingBundled': 'Usando prompt padrão incluído no ai-context.',
216
+ 'info.update.available.title': 'Atualização disponível',
217
+ 'info.update.available.detail': 'Uma nova versão {latest} está disponível (atual {current}). Atualize com {command}.',
201
218
  'commands.init.description': 'Gerar bases de documentação e agentes para um repositório',
202
219
  'commands.init.arguments.repoPath': 'Caminho do repositório a ser analisado',
203
220
  'commands.init.arguments.type': 'Tipo de base: "docs", "agents" ou "both" (padrão)',
@@ -307,6 +324,8 @@ const portugueseMessages = {
307
324
  'prompts.main.choice.scaffold': 'Gerar bases de documentação/agentes',
308
325
  'prompts.main.choice.fill': 'Preencher docs e agentes com um LLM',
309
326
  'prompts.main.choice.plan': 'Criar um plano de desenvolvimento',
327
+ 'prompts.main.choice.changeLanguage': 'Mudar idioma',
328
+ 'prompts.main.choice.exit': 'Sair do modo interativo',
310
329
  'prompts.scaffold.repoPath': 'Caminho do repositório para analisar',
311
330
  'prompts.scaffold.includeDocs': 'Gerar bases de documentação?',
312
331
  'prompts.scaffold.selectDocs': 'Selecione as guias de documentação para gerar bases',
@@ -314,7 +333,7 @@ const portugueseMessages = {
314
333
  'prompts.scaffold.selectAgents': 'Selecione os playbooks de agente para gerar bases',
315
334
  'prompts.common.verbose': 'Ativar logs detalhados?',
316
335
  'prompts.fill.repoPath': 'Caminho do repositório que contém a base',
317
- 'prompts.fill.promptPath': 'Prompt de instrução a seguir',
336
+ 'prompts.fill.promptPath': 'Caminho do prompt personalizado (deixe em branco para usar o padrão incluso)',
318
337
  'prompts.fill.dryRun': 'Pré-visualizar alterações sem escrever arquivos?',
319
338
  'prompts.fill.processAll': 'Processar todos os arquivos Markdown independentemente dos marcadores?',
320
339
  'prompts.fill.limit': 'Número máximo de arquivos a atualizar (deixe em branco para todos)',
@@ -343,7 +362,10 @@ const portugueseMessages = {
343
362
  'prompts.language.option.pt-BR': 'Português (Brasil) / Portuguese (Brazil)',
344
363
  'errors.plan.fillFailed': 'Falha ao preencher o plano com ajuda de um assistente de IA',
345
364
  'errors.fill.promptMissing': 'Arquivo de prompt não encontrado em {path}.',
346
- 'errors.fill.apiKeyMissing': 'É necessária uma chave de API {provider}. Defina uma das variáveis {envVars} ou use --api-key.'
365
+ 'errors.fill.apiKeyMissing': 'É necessária uma chave de API {provider}. Defina uma das variáveis {envVars} ou use --api-key.',
366
+ 'info.interactive.returning.title': 'Menu principal',
367
+ 'info.interactive.returning.detail': 'Voltando ao menu interativo. Escolha outra ação ou selecione Sair.',
368
+ 'success.interactive.goodbye': 'Até logo! Obrigado por usar o ai-context.'
347
369
  };
348
370
  const dictionaries = {
349
371
  en: englishMessages,