marifold 0.60.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 (110) hide show
  1. package/LICENSE +674 -0
  2. package/dist/auth/ChatGptAuth.d.ts +17 -0
  3. package/dist/auth/ChatGptAuth.d.ts.map +1 -0
  4. package/dist/auth/ChatGptAuth.js +215 -0
  5. package/dist/auth/ChatGptAuth.js.map +1 -0
  6. package/dist/auth/GitHubCopilotAuth.d.ts +10 -0
  7. package/dist/auth/GitHubCopilotAuth.d.ts.map +1 -0
  8. package/dist/auth/GitHubCopilotAuth.js +118 -0
  9. package/dist/auth/GitHubCopilotAuth.js.map +1 -0
  10. package/dist/auth/XaiAuth.d.ts +27 -0
  11. package/dist/auth/XaiAuth.d.ts.map +1 -0
  12. package/dist/auth/XaiAuth.js +280 -0
  13. package/dist/auth/XaiAuth.js.map +1 -0
  14. package/dist/commands/RuntimeFactory.d.ts +8 -0
  15. package/dist/commands/RuntimeFactory.d.ts.map +1 -0
  16. package/dist/commands/RuntimeFactory.js +13 -0
  17. package/dist/commands/RuntimeFactory.js.map +1 -0
  18. package/dist/commands/agent.d.ts +4 -0
  19. package/dist/commands/agent.d.ts.map +1 -0
  20. package/dist/commands/agent.js +130 -0
  21. package/dist/commands/agent.js.map +1 -0
  22. package/dist/commands/ask.d.ts +4 -0
  23. package/dist/commands/ask.d.ts.map +1 -0
  24. package/dist/commands/ask.js +57 -0
  25. package/dist/commands/ask.js.map +1 -0
  26. package/dist/commands/channel.d.ts +8 -0
  27. package/dist/commands/channel.d.ts.map +1 -0
  28. package/dist/commands/channel.js +114 -0
  29. package/dist/commands/channel.js.map +1 -0
  30. package/dist/commands/chat.d.ts +4 -0
  31. package/dist/commands/chat.d.ts.map +1 -0
  32. package/dist/commands/chat.js +352 -0
  33. package/dist/commands/chat.js.map +1 -0
  34. package/dist/commands/config.d.ts +18 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +228 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +11 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +86 -0
  41. package/dist/commands/doctor.js.map +1 -0
  42. package/dist/commands/init.d.ts +4 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +135 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/model.d.ts +4 -0
  47. package/dist/commands/model.d.ts.map +1 -0
  48. package/dist/commands/model.js +384 -0
  49. package/dist/commands/model.js.map +1 -0
  50. package/dist/commands/profile.d.ts +4 -0
  51. package/dist/commands/profile.d.ts.map +1 -0
  52. package/dist/commands/profile.js +231 -0
  53. package/dist/commands/profile.js.map +1 -0
  54. package/dist/commands/provider.d.ts +4 -0
  55. package/dist/commands/provider.d.ts.map +1 -0
  56. package/dist/commands/provider.js +254 -0
  57. package/dist/commands/provider.js.map +1 -0
  58. package/dist/commands/schedule.d.ts +4 -0
  59. package/dist/commands/schedule.d.ts.map +1 -0
  60. package/dist/commands/schedule.js +141 -0
  61. package/dist/commands/schedule.js.map +1 -0
  62. package/dist/commands/service.d.ts +15 -0
  63. package/dist/commands/service.d.ts.map +1 -0
  64. package/dist/commands/service.js +421 -0
  65. package/dist/commands/service.js.map +1 -0
  66. package/dist/commands/session.d.ts +4 -0
  67. package/dist/commands/session.d.ts.map +1 -0
  68. package/dist/commands/session.js +171 -0
  69. package/dist/commands/session.js.map +1 -0
  70. package/dist/commands/status.d.ts +4 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +59 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +74 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/input/InteractivePrompt.d.ts +9 -0
  79. package/dist/input/InteractivePrompt.d.ts.map +1 -0
  80. package/dist/input/InteractivePrompt.js +101 -0
  81. package/dist/input/InteractivePrompt.js.map +1 -0
  82. package/dist/input/ModelPicker.d.ts +34 -0
  83. package/dist/input/ModelPicker.d.ts.map +1 -0
  84. package/dist/input/ModelPicker.js +327 -0
  85. package/dist/input/ModelPicker.js.map +1 -0
  86. package/dist/input/PromptAbort.d.ts +11 -0
  87. package/dist/input/PromptAbort.d.ts.map +1 -0
  88. package/dist/input/PromptAbort.js +28 -0
  89. package/dist/input/PromptAbort.js.map +1 -0
  90. package/dist/input/SecretPrompt.d.ts +3 -0
  91. package/dist/input/SecretPrompt.d.ts.map +1 -0
  92. package/dist/input/SecretPrompt.js +61 -0
  93. package/dist/input/SecretPrompt.js.map +1 -0
  94. package/dist/input/TerminalSelect.d.ts +17 -0
  95. package/dist/input/TerminalSelect.d.ts.map +1 -0
  96. package/dist/input/TerminalSelect.js +153 -0
  97. package/dist/input/TerminalSelect.js.map +1 -0
  98. package/dist/output/ConsolePrinter.d.ts +12 -0
  99. package/dist/output/ConsolePrinter.d.ts.map +1 -0
  100. package/dist/output/ConsolePrinter.js +69 -0
  101. package/dist/output/ConsolePrinter.js.map +1 -0
  102. package/dist/output/TerminalStyle.d.ts +11 -0
  103. package/dist/output/TerminalStyle.d.ts.map +1 -0
  104. package/dist/output/TerminalStyle.js +41 -0
  105. package/dist/output/TerminalStyle.js.map +1 -0
  106. package/dist/service/ServiceProcess.d.ts +45 -0
  107. package/dist/service/ServiceProcess.d.ts.map +1 -0
  108. package/dist/service/ServiceProcess.js +288 -0
  109. package/dist/service/ServiceProcess.js.map +1 -0
  110. package/package.json +34 -0
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerModelCommand = registerModelCommand;
4
+ const core_1 = require("@marifold/core");
5
+ const InteractivePrompt_1 = require("../input/InteractivePrompt");
6
+ const PromptAbort_1 = require("../input/PromptAbort");
7
+ const ModelPicker_1 = require("../input/ModelPicker");
8
+ const TerminalSelect_1 = require("../input/TerminalSelect");
9
+ const TerminalStyle_1 = require("../output/TerminalStyle");
10
+ const RuntimeFactory_1 = require("./RuntimeFactory");
11
+ const ADD_NEW_MODEL = '__marifold_add_new_model__';
12
+ const USE_GLOBAL_DEFAULT = '__marifold_use_global_default__';
13
+ function registerModelCommand(program, printer) {
14
+ const model = program
15
+ .command('model')
16
+ .description('Inspect and update default model settings.')
17
+ .action(() => {
18
+ try {
19
+ const { config } = (0, RuntimeFactory_1.loadConfig)(program);
20
+ process.stdout.write(`Current model: ${config.default.provider ?? 'unset'}/${config.default.model ?? 'unset'}\n`);
21
+ }
22
+ catch (error) {
23
+ printer.printError(error);
24
+ process.exitCode = 1;
25
+ }
26
+ });
27
+ model
28
+ .command('list')
29
+ .description('List saved provider/model options.')
30
+ .action(() => {
31
+ try {
32
+ const { config } = (0, RuntimeFactory_1.loadConfig)(program);
33
+ const options = normalizedModelOptions(config.models.options, config.default.provider, config.default.model);
34
+ if (options.length === 0) {
35
+ process.stdout.write('No saved model options.\n');
36
+ return;
37
+ }
38
+ for (const option of options) {
39
+ const marker = option === `${config.default.provider}/${config.default.model}` ? '*' : ' ';
40
+ process.stdout.write(`${marker} ${option}\n`);
41
+ }
42
+ }
43
+ catch (error) {
44
+ printer.printError(error);
45
+ process.exitCode = 1;
46
+ }
47
+ });
48
+ model
49
+ .command('validate')
50
+ .description('Validate a provider/model pair against configured provider access.')
51
+ .argument('[model]', 'Provider/model pair, or model name when --provider is set. Defaults to the resolved default model.')
52
+ .option('--provider <name>', 'Provider key from config.toml.')
53
+ .option('--profile <name>', 'Resolve the model through this profile.')
54
+ .option('--all', 'Validate every saved model plus global and profile model defaults.')
55
+ .action(async (modelArg, options) => {
56
+ let runtime;
57
+ try {
58
+ runtime = (0, RuntimeFactory_1.createRuntime)(program);
59
+ const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
60
+ const inspector = new core_1.ProviderInspector(loadedConfig);
61
+ if (options.all) {
62
+ if (modelArg || options.provider || options.profile) {
63
+ throw core_1.MarifoldError.configInvalid('--all cannot be combined with a model argument, --provider, or --profile.');
64
+ }
65
+ const targets = collectModelValidationTargets(loadedConfig, runtime);
66
+ if (targets.length === 0) {
67
+ throw core_1.MarifoldError.missingProviderModel(loadedConfig.configPath);
68
+ }
69
+ let hasError = false;
70
+ for (const target of targets) {
71
+ const result = await inspector.validateModel(target.provider, target.model);
72
+ process.stdout.write(`${result.status.toUpperCase()} ${result.provider}/${result.model} [${target.sources.join(', ')}]: ${result.message}\n`);
73
+ if (!result.valid)
74
+ hasError = true;
75
+ }
76
+ if (hasError)
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ const resolved = resolveModelValidationTarget(runtime, modelArg, options);
81
+ const result = await inspector.validateModel(resolved.provider, resolved.model);
82
+ process.stdout.write(`${result.status.toUpperCase()} ${result.provider}/${result.model}: ${result.message}\n`);
83
+ if (!result.valid)
84
+ process.exitCode = 1;
85
+ }
86
+ catch (error) {
87
+ printer.printError(error);
88
+ process.exitCode = 1;
89
+ }
90
+ finally {
91
+ runtime?.close();
92
+ }
93
+ });
94
+ model
95
+ .command('rm')
96
+ .alias('remove')
97
+ .description('Remove a saved provider/model option from Marifold config.')
98
+ .argument('<model>', 'Provider/model pair, or model name when --provider is set.')
99
+ .option('--provider <name>', 'Provider key from config.toml.')
100
+ .action((modelArg, options) => {
101
+ try {
102
+ const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
103
+ const { provider, model } = resolveModelPair(modelArg, options.provider, loadedConfig);
104
+ const result = new core_1.ConfigManager(loadedConfig).removeModel(provider, model);
105
+ if (!result.removed) {
106
+ process.stderr.write(`Saved model option not found: ${result.value}\n`);
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ process.stdout.write(`Removed ${result.value}\n`);
111
+ if (result.wasDefault) {
112
+ process.stdout.write('Current default model is unchanged.\n');
113
+ }
114
+ process.stdout.write(`Saved ${result.configPath}\n`);
115
+ }
116
+ catch (error) {
117
+ printer.printError(error);
118
+ process.exitCode = 1;
119
+ }
120
+ });
121
+ model
122
+ .command('add')
123
+ .description('Add a provider/model option to config.')
124
+ .argument('[provider]', 'Provider key. Omit for an interactive provider picker.')
125
+ .argument('[model]', 'Model name. Omit for an interactive model picker when provider model listing is available.')
126
+ .option('--provider-type <type>', 'Provider type: ollama, openai-compatible, or anthropic.')
127
+ .option('--base-url <url>', 'Provider base URL.')
128
+ .option('--api-key-env <name>', 'Environment variable containing the API key.')
129
+ .option('--default', 'Also make this the global default model.')
130
+ .action(async (providerArg, modelArg, options) => {
131
+ let prompt;
132
+ try {
133
+ const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
134
+ const style = new TerminalStyle_1.TerminalStyle();
135
+ const getPrompt = () => {
136
+ prompt ??= new InteractivePrompt_1.InteractivePrompt();
137
+ return prompt;
138
+ };
139
+ const { provider, model: modelName } = await (0, ModelPicker_1.resolveModelAddTarget)(loadedConfig, getPrompt, style, providerArg, modelArg, options);
140
+ assertCanSaveModelOption(provider, modelName);
141
+ const manager = new core_1.ConfigManager(loadedConfig);
142
+ const result = manager.addModel(provider, modelName, {
143
+ type: parseProviderType(options.providerType),
144
+ baseUrl: options.baseUrl,
145
+ apiKeyEnv: options.apiKeyEnv,
146
+ });
147
+ if (options.default)
148
+ manager.setDefaultModel(modelName, provider);
149
+ process.stdout.write(`Added ${result.value}\n`);
150
+ if (options.default)
151
+ process.stdout.write(`Set default model to ${provider}/${modelName}\n`);
152
+ process.stdout.write(`Saved ${result.configPath}\n`);
153
+ }
154
+ catch (error) {
155
+ if ((0, PromptAbort_1.isPromptAbortError)(error)) {
156
+ process.stderr.write('Aborted.\n');
157
+ process.exitCode = 130;
158
+ return;
159
+ }
160
+ printer.printError(error);
161
+ process.exitCode = 1;
162
+ }
163
+ finally {
164
+ prompt?.close();
165
+ }
166
+ });
167
+ model
168
+ .command('default')
169
+ .description('Set the global default model, or a profile model override.')
170
+ .argument('[model]', 'Model name.')
171
+ .option('--provider <name>', 'Provider key from config.toml.')
172
+ .option('--profile <name>', 'Write the model override to this profile.')
173
+ .option('--clear', 'Clear a profile model override.')
174
+ .action(async (modelName, options) => {
175
+ let prompt;
176
+ try {
177
+ const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
178
+ const style = new TerminalStyle_1.TerminalStyle();
179
+ const getPrompt = () => {
180
+ prompt ??= new InteractivePrompt_1.InteractivePrompt();
181
+ return prompt;
182
+ };
183
+ if (options.profile) {
184
+ const profileManager = new core_1.ProfileManager(loadedConfig.config.paths.profilesDir);
185
+ if (options.clear) {
186
+ const result = profileManager.clearModelOverride(options.profile);
187
+ process.stdout.write(`Cleared model override for profile '${result.name}'.\n`);
188
+ process.stdout.write(`Updated ${result.path}\n`);
189
+ return;
190
+ }
191
+ if (!modelName) {
192
+ const selected = await selectProfileDefaultModel(loadedConfig, getPrompt, style, options.profile);
193
+ if (selected === USE_GLOBAL_DEFAULT) {
194
+ const result = profileManager.clearModelOverride(options.profile);
195
+ process.stdout.write(`Cleared model override for profile '${result.name}'.\n`);
196
+ process.stdout.write(`Updated ${result.path}\n`);
197
+ return;
198
+ }
199
+ const { provider, model } = await resolveSelectedDefaultModel(loadedConfig, getPrompt, style, selected);
200
+ const result = profileManager.setModelOverride(options.profile, provider, model);
201
+ process.stdout.write(`Set profile '${result.name}' model to ${provider}/${model}.\n`);
202
+ process.stdout.write(`Updated ${result.path}\n`);
203
+ return;
204
+ }
205
+ const { provider, model } = resolveModelPair(modelName, options.provider, loadedConfig);
206
+ const result = profileManager.setModelOverride(options.profile, provider, model);
207
+ process.stdout.write(`Set profile '${result.name}' model to ${provider}/${model}.\n`);
208
+ process.stdout.write(`Updated ${result.path}\n`);
209
+ return;
210
+ }
211
+ if (options.clear)
212
+ throw core_1.MarifoldError.configInvalid('--clear is only valid with --profile.');
213
+ if (!modelName) {
214
+ const selected = await selectGlobalDefaultModel(loadedConfig, getPrompt, style);
215
+ const { provider, model } = await resolveSelectedDefaultModel(loadedConfig, getPrompt, style, selected);
216
+ const result = new core_1.ConfigManager(loadedConfig).setDefaultModel(model, provider);
217
+ process.stdout.write(`Set ${result.value}\n`);
218
+ process.stdout.write(`Saved ${result.configPath}\n`);
219
+ return;
220
+ }
221
+ const { provider, model } = resolveModelPair(modelName, options.provider, loadedConfig);
222
+ const result = new core_1.ConfigManager(loadedConfig).setDefaultModel(model, provider);
223
+ process.stdout.write(`Set ${result.value}\n`);
224
+ process.stdout.write(`Saved ${result.configPath}\n`);
225
+ }
226
+ catch (error) {
227
+ if ((0, PromptAbort_1.isPromptAbortError)(error)) {
228
+ process.stderr.write('Aborted.\n');
229
+ process.exitCode = 130;
230
+ return;
231
+ }
232
+ printer.printError(error);
233
+ process.exitCode = 1;
234
+ }
235
+ finally {
236
+ prompt?.close();
237
+ }
238
+ });
239
+ }
240
+ function resolveModelValidationTarget(runtime, modelArg, options) {
241
+ if (modelArg?.includes('/')) {
242
+ const [provider, ...rest] = modelArg.split('/');
243
+ const model = rest.join('/');
244
+ if (!provider || !model)
245
+ throw core_1.MarifoldError.configInvalid('Invalid model format. Use provider/model.');
246
+ return { provider, model };
247
+ }
248
+ if (modelArg) {
249
+ if (!options.provider)
250
+ throw core_1.MarifoldError.configInvalid('Use provider/model or pass --provider <name>.');
251
+ return { provider: options.provider, model: modelArg };
252
+ }
253
+ const settings = runtime.resolveSettings({
254
+ profile: options.profile,
255
+ provider: options.provider,
256
+ });
257
+ return { provider: settings.provider, model: settings.model };
258
+ }
259
+ function collectModelValidationTargets(loadedConfig, runtime) {
260
+ const targets = new Map();
261
+ const add = (provider, model, source) => {
262
+ if (!provider || !model)
263
+ return;
264
+ const key = `${provider}/${model}`;
265
+ const existing = targets.get(key);
266
+ if (existing) {
267
+ existing.sources.add(source);
268
+ return;
269
+ }
270
+ targets.set(key, { provider, model, sources: new Set([source]) });
271
+ };
272
+ add(loadedConfig.config.default.provider, loadedConfig.config.default.model, 'default');
273
+ for (const option of loadedConfig.config.models.options) {
274
+ const parsed = parseProviderModelOption(option);
275
+ add(parsed.provider, parsed.model, 'saved');
276
+ }
277
+ for (const profile of runtime.listProfiles()) {
278
+ const detail = runtime.getProfile(profile.name);
279
+ add(detail.settings.provider, detail.settings.model, `profile:${profile.name}`);
280
+ }
281
+ return [...targets.values()]
282
+ .map(target => ({
283
+ provider: target.provider,
284
+ model: target.model,
285
+ sources: [...target.sources].sort(),
286
+ }))
287
+ .sort((a, b) => `${a.provider}/${a.model}`.localeCompare(`${b.provider}/${b.model}`));
288
+ }
289
+ function normalizedModelOptions(options, provider, model) {
290
+ const set = new Set(options);
291
+ if (provider && model)
292
+ set.add(`${provider}/${model}`);
293
+ return [...set].sort();
294
+ }
295
+ async function selectGlobalDefaultModel(loadedConfig, getPrompt, style) {
296
+ const choices = normalizedModelOptions(loadedConfig.config.models.options, loadedConfig.config.default.provider, loadedConfig.config.default.model).filter(isChatCompatibleModelOption);
297
+ choices.push(ADD_NEW_MODEL);
298
+ return selectModelOption(getPrompt, style, 'Select default model:', choices, {
299
+ addNewLabel: 'Add new model...',
300
+ });
301
+ }
302
+ async function selectProfileDefaultModel(loadedConfig, getPrompt, style, profile) {
303
+ const choices = [
304
+ USE_GLOBAL_DEFAULT,
305
+ ...normalizedModelOptions(loadedConfig.config.models.options, loadedConfig.config.default.provider, loadedConfig.config.default.model).filter(isChatCompatibleModelOption),
306
+ ADD_NEW_MODEL,
307
+ ];
308
+ return selectModelOption(getPrompt, style, `Select model for profile '${profile}':`, choices, {
309
+ useDefaultLabel: `Use default (${globalDefaultLabel(loadedConfig)})`,
310
+ addNewLabel: 'Add new model...',
311
+ });
312
+ }
313
+ async function selectModelOption(getPrompt, style, message, choices, labels) {
314
+ if (choices.length === 0)
315
+ return ADD_NEW_MODEL;
316
+ const selected = await (0, TerminalSelect_1.selectTerminalOption)(message, choices.map(choice => ({
317
+ label: modelChoiceLabel(choice, labels),
318
+ value: choice,
319
+ })));
320
+ if (selected !== undefined)
321
+ return selected;
322
+ process.stdout.write(`${message}\n`);
323
+ choices.forEach((choice, index) => {
324
+ process.stdout.write(` ${index + 1}. ${modelChoiceLabel(choice, labels)}\n`);
325
+ });
326
+ return (0, ModelPicker_1.readChoice)(getPrompt(), style, 'Model', choices, {
327
+ defaultIndex: 0,
328
+ });
329
+ }
330
+ async function resolveSelectedDefaultModel(loadedConfig, getPrompt, style, selected) {
331
+ if (selected !== ADD_NEW_MODEL)
332
+ return parseProviderModelOption(selected);
333
+ process.stdout.write('\n');
334
+ const target = await (0, ModelPicker_1.resolveModelAddTarget)(loadedConfig, getPrompt, style);
335
+ new core_1.ConfigManager(loadedConfig).addModel(target.provider, target.model);
336
+ process.stdout.write(`Added ${target.provider}/${target.model}\n`);
337
+ return target;
338
+ }
339
+ function resolveModelPair(modelArg, providerArg, loadedConfig) {
340
+ if (modelArg.includes('/'))
341
+ return parseProviderModelOption(modelArg);
342
+ const provider = providerArg ?? loadedConfig.config.default.provider;
343
+ if (!provider)
344
+ throw core_1.MarifoldError.missingProviderModel(loadedConfig.configPath);
345
+ return { provider, model: modelArg };
346
+ }
347
+ function parseProviderModelOption(option) {
348
+ const [provider, ...rest] = option.split('/');
349
+ const model = rest.join('/');
350
+ if (!provider || !model)
351
+ throw core_1.MarifoldError.configInvalid('Invalid model format. Use provider/model.');
352
+ return { provider, model };
353
+ }
354
+ function modelChoiceLabel(choice, labels) {
355
+ if (choice === USE_GLOBAL_DEFAULT)
356
+ return labels.useDefaultLabel ?? 'Use default';
357
+ if (choice === ADD_NEW_MODEL)
358
+ return labels.addNewLabel;
359
+ return choice;
360
+ }
361
+ function globalDefaultLabel(loadedConfig) {
362
+ const provider = loadedConfig.config.default.provider;
363
+ const model = loadedConfig.config.default.model;
364
+ return provider && model ? `${provider}/${model}` : 'none';
365
+ }
366
+ function isChatCompatibleModelOption(option) {
367
+ const parsed = parseProviderModelOption(option);
368
+ if (parsed.provider !== 'github_copilot')
369
+ return true;
370
+ return !(0, core_1.isKnownGitHubCopilotUnsupportedModelId)(parsed.model);
371
+ }
372
+ function assertCanSaveModelOption(provider, model) {
373
+ if (provider === 'github_copilot' && (0, core_1.isKnownGitHubCopilotUnsupportedModelId)(model)) {
374
+ throw core_1.MarifoldError.configInvalid(`Model '${provider}/${model}' is not supported by Marifold's current GitHub Copilot adapters.`);
375
+ }
376
+ }
377
+ function parseProviderType(value) {
378
+ if (value === undefined)
379
+ return undefined;
380
+ if (value === 'ollama' || value === 'openai-compatible' || value === 'anthropic')
381
+ return value;
382
+ throw core_1.MarifoldError.configInvalid('Expected --provider-type to be "ollama", "openai-compatible", or "anthropic".');
383
+ }
384
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ import { ConsolePrinter } from '../output/ConsolePrinter';
3
+ export declare function registerProfileCommand(program: Command, printer: ConsolePrinter): void;
4
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAa1D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAwLtF"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerProfileCommand = registerProfileCommand;
4
+ const core_1 = require("@marifold/core");
5
+ const InteractivePrompt_1 = require("../input/InteractivePrompt");
6
+ const PromptAbort_1 = require("../input/PromptAbort");
7
+ const RuntimeFactory_1 = require("./RuntimeFactory");
8
+ const RuntimeFactory_2 = require("./RuntimeFactory");
9
+ function registerProfileCommand(program, printer) {
10
+ const profile = program
11
+ .command('profile')
12
+ .description('Inspect and manage Marifold profiles.')
13
+ .action(() => {
14
+ try {
15
+ const { config } = (0, RuntimeFactory_2.loadConfig)(program);
16
+ process.stdout.write(`Current profile: ${config.default.profile}\n`);
17
+ }
18
+ catch (error) {
19
+ printer.printError(error);
20
+ process.exitCode = 1;
21
+ }
22
+ });
23
+ profile
24
+ .command('list')
25
+ .description('List available profiles.')
26
+ .action(() => {
27
+ const runtime = (0, RuntimeFactory_1.createRuntime)(program);
28
+ try {
29
+ printer.printProfiles(runtime.listProfiles());
30
+ }
31
+ catch (error) {
32
+ printer.printError(error);
33
+ process.exitCode = 1;
34
+ }
35
+ finally {
36
+ runtime.close();
37
+ }
38
+ });
39
+ profile
40
+ .command('show')
41
+ .description('Show profile files and model settings.')
42
+ .argument('[name]', 'Profile name. Defaults to the configured default profile.')
43
+ .action((name) => {
44
+ const runtime = (0, RuntimeFactory_1.createRuntime)(program);
45
+ try {
46
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
47
+ const profileName = name ?? loadedConfig.config.default.profile;
48
+ const detail = runtime.getProfile(profileName);
49
+ process.stdout.write(`Profile: ${detail.name}\n`);
50
+ process.stdout.write(`Source: ${detail.source}\n`);
51
+ if (detail.path)
52
+ process.stdout.write(`Path: ${detail.path}\n`);
53
+ process.stdout.write(`Model: ${detail.settings.provider && detail.settings.model ? `${detail.settings.provider}/${detail.settings.model}` : 'default'}\n`);
54
+ process.stdout.write(`Memory: ${detail.settings.memories ? 'on' : 'off'}\n`);
55
+ printProfileSection('PROFILE.md', detail.files.profile);
56
+ printProfileSection('RULES.md', detail.files.rules);
57
+ printProfileSection('CUSTOM.md', detail.files.custom);
58
+ printProfileSection('profile.toml', detail.files.profileToml);
59
+ }
60
+ catch (error) {
61
+ printer.printError(error);
62
+ process.exitCode = 1;
63
+ }
64
+ finally {
65
+ runtime.close();
66
+ }
67
+ });
68
+ profile
69
+ .command('memory')
70
+ .description('List profile memory records.')
71
+ .argument('[name]', 'Profile name. Defaults to the configured default profile.')
72
+ .option('--all', 'Include superseded memory records.')
73
+ .option('--limit <n>', 'Maximum records to print.', parsePositiveInteger)
74
+ .action((name, options) => {
75
+ const runtime = (0, RuntimeFactory_1.createRuntime)(program);
76
+ try {
77
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
78
+ const profileName = name ?? loadedConfig.config.default.profile;
79
+ runtime.ensureProfileMemoryFiles(profileName);
80
+ const memories = runtime.listMemories(profileName, Boolean(options.all));
81
+ printMemoryRecords(profileName, memories, options.limit ?? 50);
82
+ }
83
+ catch (error) {
84
+ printer.printError(error);
85
+ process.exitCode = 1;
86
+ }
87
+ finally {
88
+ runtime.close();
89
+ }
90
+ });
91
+ profile
92
+ .command('init')
93
+ .description('Scaffold a new profile directory.')
94
+ .argument('[name]', 'Profile name (letters, numbers, underscores, and hyphens only).')
95
+ .action(async (name) => {
96
+ const prompt = new InteractivePrompt_1.InteractivePrompt();
97
+ try {
98
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
99
+ const profileName = name ?? (await prompt.readUserMessage('Profile name: '))?.trim();
100
+ if (!profileName)
101
+ throw core_1.MarifoldError.profileInvalid('Profile name cannot be empty.', '');
102
+ const result = new core_1.ProfileManager(loadedConfig.config.paths.profilesDir).init(profileName);
103
+ process.stdout.write(`Created profile '${result.name}' at ${result.path}\n`);
104
+ for (const filePath of result.files)
105
+ process.stdout.write(`created ${filePath}\n`);
106
+ }
107
+ catch (error) {
108
+ printer.printError(error);
109
+ process.exitCode = 1;
110
+ }
111
+ finally {
112
+ prompt.close();
113
+ }
114
+ });
115
+ profile
116
+ .command('rename')
117
+ .description('Rename a stored profile.')
118
+ .argument('<from>', 'Current profile name.')
119
+ .argument('<to>', 'New profile name (letters, numbers, underscores, and hyphens only).')
120
+ .action((from, to) => {
121
+ try {
122
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
123
+ const result = new core_1.ProfileManager(loadedConfig.config.paths.profilesDir).rename(from, to);
124
+ if (loadedConfig.config.default.profile === from) {
125
+ new core_1.ConfigManager(loadedConfig).setDefaultProfile(to);
126
+ process.stdout.write(`Default profile updated to '${to}'.\n`);
127
+ }
128
+ process.stdout.write(`Renamed profile '${result.from}' to '${result.to}'.\n`);
129
+ process.stdout.write(`Moved ${result.fromPath} to ${result.toPath}\n`);
130
+ }
131
+ catch (error) {
132
+ printer.printError(error);
133
+ process.exitCode = 1;
134
+ }
135
+ });
136
+ profile
137
+ .command('delete')
138
+ .alias('rm')
139
+ .description('Delete a stored profile directory or JSON file.')
140
+ .argument('<name>', 'Profile name.')
141
+ .option('--yes', 'Delete without interactive confirmation.')
142
+ .action(async (name, options) => {
143
+ const prompt = new InteractivePrompt_1.InteractivePrompt();
144
+ try {
145
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
146
+ if (loadedConfig.config.default.profile === name) {
147
+ throw core_1.MarifoldError.profileInvalid(`Cannot delete the current default profile '${name}'. Set another default profile first.`, name);
148
+ }
149
+ if (!options.yes) {
150
+ const answer = await prompt.readUserMessage(`Delete profile '${name}'? Type '${name}' to confirm: `);
151
+ if (answer === undefined)
152
+ throw new PromptAbort_1.PromptAbortError();
153
+ if (answer.trim() !== name) {
154
+ process.stdout.write('Aborted.\n');
155
+ process.exitCode = 1;
156
+ return;
157
+ }
158
+ }
159
+ const result = new core_1.ProfileManager(loadedConfig.config.paths.profilesDir).delete(name);
160
+ process.stdout.write(`Deleted profile '${result.name}' from ${result.path}\n`);
161
+ }
162
+ catch (error) {
163
+ if ((0, PromptAbort_1.isPromptAbortError)(error)) {
164
+ process.stderr.write('Aborted.\n');
165
+ process.exitCode = 130;
166
+ return;
167
+ }
168
+ printer.printError(error);
169
+ process.exitCode = 1;
170
+ }
171
+ finally {
172
+ prompt.close();
173
+ }
174
+ });
175
+ profile
176
+ .command('default')
177
+ .description('Show or set the default profile.')
178
+ .argument('[name]', 'Profile name to set as default.')
179
+ .action((name) => {
180
+ try {
181
+ const loadedConfig = (0, RuntimeFactory_2.loadConfig)(program);
182
+ if (!name) {
183
+ process.stdout.write(`Current profile: ${loadedConfig.config.default.profile}\n`);
184
+ return;
185
+ }
186
+ const profileManager = new core_1.ProfileManager(loadedConfig.config.paths.profilesDir);
187
+ if (!profileManager.exists(name)) {
188
+ throw core_1.MarifoldError.profileInvalid(`Profile '${name}' was not found.`, name);
189
+ }
190
+ const result = new core_1.ConfigManager(loadedConfig).setDefaultProfile(name);
191
+ process.stdout.write(`Default profile set to '${name}'.\n`);
192
+ process.stdout.write(`Saved ${result.configPath}\n`);
193
+ }
194
+ catch (error) {
195
+ printer.printError(error);
196
+ process.exitCode = 1;
197
+ }
198
+ });
199
+ }
200
+ function printProfileSection(label, file) {
201
+ process.stdout.write(`\n[${label}]`);
202
+ if (file.path)
203
+ process.stdout.write(` ${file.path}`);
204
+ process.stdout.write('\n');
205
+ process.stdout.write(file.content.trim() ? `${file.content.trimEnd()}\n` : '(empty)\n');
206
+ }
207
+ function printMemoryRecords(profile, memories, limit) {
208
+ process.stdout.write(`Profile: ${profile}\n`);
209
+ if (memories.length === 0) {
210
+ process.stdout.write('No memory records found.\n');
211
+ return;
212
+ }
213
+ for (const memory of memories.slice(0, limit)) {
214
+ const conflict = memory.conflict_key ? ` conflict=${memory.conflict_key}` : '';
215
+ process.stdout.write(`${memory.kind}\t${memory.status}\tpriority=${memory.priority}\tconfidence=${memory.confidence}${conflict}\n`);
216
+ process.stdout.write(` id: ${memory.id}\n`);
217
+ process.stdout.write(` text: ${memory.text}\n`);
218
+ process.stdout.write(` source: ${memory.source} (${memory.source_type}) scope=${memory.scope}\n`);
219
+ process.stdout.write(` updated: ${memory.updated_at}\n`);
220
+ }
221
+ if (memories.length > limit) {
222
+ process.stdout.write(`... ${memories.length - limit} more record(s). Use --limit to show more.\n`);
223
+ }
224
+ }
225
+ function parsePositiveInteger(value) {
226
+ const parsed = Number.parseInt(value, 10);
227
+ if (!Number.isFinite(parsed) || parsed <= 0)
228
+ throw new Error('Expected a positive integer.');
229
+ return parsed;
230
+ }
231
+ //# sourceMappingURL=profile.js.map