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.
- package/LICENSE +674 -0
- package/dist/auth/ChatGptAuth.d.ts +17 -0
- package/dist/auth/ChatGptAuth.d.ts.map +1 -0
- package/dist/auth/ChatGptAuth.js +215 -0
- package/dist/auth/ChatGptAuth.js.map +1 -0
- package/dist/auth/GitHubCopilotAuth.d.ts +10 -0
- package/dist/auth/GitHubCopilotAuth.d.ts.map +1 -0
- package/dist/auth/GitHubCopilotAuth.js +118 -0
- package/dist/auth/GitHubCopilotAuth.js.map +1 -0
- package/dist/auth/XaiAuth.d.ts +27 -0
- package/dist/auth/XaiAuth.d.ts.map +1 -0
- package/dist/auth/XaiAuth.js +280 -0
- package/dist/auth/XaiAuth.js.map +1 -0
- package/dist/commands/RuntimeFactory.d.ts +8 -0
- package/dist/commands/RuntimeFactory.d.ts.map +1 -0
- package/dist/commands/RuntimeFactory.js +13 -0
- package/dist/commands/RuntimeFactory.js.map +1 -0
- package/dist/commands/agent.d.ts +4 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +130 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/ask.d.ts +4 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +57 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/channel.d.ts +8 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +114 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/chat.d.ts +4 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +352 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +228 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +86 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +135 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/model.d.ts +4 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +384 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/profile.d.ts +4 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +231 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/provider.d.ts +4 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +254 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/schedule.d.ts +4 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +141 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/service.d.ts +15 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +421 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/session.d.ts +4 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +171 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/input/InteractivePrompt.d.ts +9 -0
- package/dist/input/InteractivePrompt.d.ts.map +1 -0
- package/dist/input/InteractivePrompt.js +101 -0
- package/dist/input/InteractivePrompt.js.map +1 -0
- package/dist/input/ModelPicker.d.ts +34 -0
- package/dist/input/ModelPicker.d.ts.map +1 -0
- package/dist/input/ModelPicker.js +327 -0
- package/dist/input/ModelPicker.js.map +1 -0
- package/dist/input/PromptAbort.d.ts +11 -0
- package/dist/input/PromptAbort.d.ts.map +1 -0
- package/dist/input/PromptAbort.js +28 -0
- package/dist/input/PromptAbort.js.map +1 -0
- package/dist/input/SecretPrompt.d.ts +3 -0
- package/dist/input/SecretPrompt.d.ts.map +1 -0
- package/dist/input/SecretPrompt.js +61 -0
- package/dist/input/SecretPrompt.js.map +1 -0
- package/dist/input/TerminalSelect.d.ts +17 -0
- package/dist/input/TerminalSelect.d.ts.map +1 -0
- package/dist/input/TerminalSelect.js +153 -0
- package/dist/input/TerminalSelect.js.map +1 -0
- package/dist/output/ConsolePrinter.d.ts +12 -0
- package/dist/output/ConsolePrinter.d.ts.map +1 -0
- package/dist/output/ConsolePrinter.js +69 -0
- package/dist/output/ConsolePrinter.js.map +1 -0
- package/dist/output/TerminalStyle.d.ts +11 -0
- package/dist/output/TerminalStyle.d.ts.map +1 -0
- package/dist/output/TerminalStyle.js +41 -0
- package/dist/output/TerminalStyle.js.map +1 -0
- package/dist/service/ServiceProcess.d.ts +45 -0
- package/dist/service/ServiceProcess.d.ts.map +1 -0
- package/dist/service/ServiceProcess.js +288 -0
- package/dist/service/ServiceProcess.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerConfigCommand = registerConfigCommand;
|
|
4
|
+
exports.resolveSearchUpdate = resolveSearchUpdate;
|
|
5
|
+
exports.searchUpdateFromFlags = searchUpdateFromFlags;
|
|
6
|
+
const core_1 = require("@marifold/core");
|
|
7
|
+
const InteractivePrompt_1 = require("../input/InteractivePrompt");
|
|
8
|
+
const PromptAbort_1 = require("../input/PromptAbort");
|
|
9
|
+
const SecretPrompt_1 = require("../input/SecretPrompt");
|
|
10
|
+
const TerminalSelect_1 = require("../input/TerminalSelect");
|
|
11
|
+
const TerminalStyle_1 = require("../output/TerminalStyle");
|
|
12
|
+
const RuntimeFactory_1 = require("./RuntimeFactory");
|
|
13
|
+
function registerConfigCommand(program, printer) {
|
|
14
|
+
const config = program
|
|
15
|
+
.command('config')
|
|
16
|
+
.description('Inspect and update Marifold configuration.');
|
|
17
|
+
config
|
|
18
|
+
.command('show')
|
|
19
|
+
.description('Print the resolved Marifold config.')
|
|
20
|
+
.action(() => {
|
|
21
|
+
try {
|
|
22
|
+
const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
|
|
23
|
+
process.stdout.write((0, core_1.renderMarifoldConfig)(loadedConfig.config));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
printer.printError(error);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
config
|
|
31
|
+
.command('set')
|
|
32
|
+
.description('Set a config value by dotted key (default.*, paths.*, memory.*, service.*, providers.<name>.*) or the top-level "proxy".')
|
|
33
|
+
.argument('<key>', 'Dotted config key, e.g. default.model, service.web_dir, or proxy.')
|
|
34
|
+
.argument('<value>', 'Value to write. service.cors_origins takes a comma-separated list; "" clears optional keys.')
|
|
35
|
+
.action((key, value) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = new core_1.ConfigManager((0, RuntimeFactory_1.loadConfig)(program)).setValue(key, value);
|
|
38
|
+
process.stdout.write(`Set ${result.key} = ${result.value}\n`);
|
|
39
|
+
process.stdout.write(`Saved ${result.configPath}\n`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
printer.printError(error);
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
config
|
|
47
|
+
.command('get')
|
|
48
|
+
.description('Read a config value by dotted key (same keys as config set).')
|
|
49
|
+
.argument('<key>', 'Dotted config key, e.g. default.model or service.web_dir.')
|
|
50
|
+
.action((key) => {
|
|
51
|
+
try {
|
|
52
|
+
const value = new core_1.ConfigManager((0, RuntimeFactory_1.loadConfig)(program)).getValue(key);
|
|
53
|
+
if (value === undefined) {
|
|
54
|
+
process.stdout.write(`${key} is not set\n`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
process.stdout.write(`${value}\n`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
printer.printError(error);
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
config
|
|
66
|
+
.command('export')
|
|
67
|
+
.description('Export local config, profiles, memories, and optionally sessions to a backup file.')
|
|
68
|
+
.argument('<file>', 'Backup file path.')
|
|
69
|
+
.option('--include-sessions', 'Include the SQLite sessions database in the backup.')
|
|
70
|
+
.action((file, options) => {
|
|
71
|
+
try {
|
|
72
|
+
const result = (0, core_1.exportConfigBackup)((0, RuntimeFactory_1.loadConfig)(program), file, {
|
|
73
|
+
includeSessions: options.includeSessions,
|
|
74
|
+
});
|
|
75
|
+
process.stdout.write(`Exported config backup to ${result.path}\n`);
|
|
76
|
+
process.stdout.write(`Profile files: ${result.profileFileCount}\n`);
|
|
77
|
+
process.stdout.write(`Sessions: ${result.includedSessions ? 'included' : 'not included'}\n`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
printer.printError(error);
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
config
|
|
85
|
+
.command('import')
|
|
86
|
+
.description('Import a Marifold config backup file.')
|
|
87
|
+
.argument('<file>', 'Backup file path.')
|
|
88
|
+
.option('--force', 'Overwrite existing config, profile files, and sessions database.')
|
|
89
|
+
.action((file, options) => {
|
|
90
|
+
try {
|
|
91
|
+
const result = (0, core_1.importConfigBackup)((0, RuntimeFactory_1.loadConfig)(program), file, {
|
|
92
|
+
force: options.force,
|
|
93
|
+
});
|
|
94
|
+
process.stdout.write(`Imported config backup to ${result.configPath}\n`);
|
|
95
|
+
process.stdout.write(`Profile files: ${result.profileFileCount}\n`);
|
|
96
|
+
process.stdout.write(`Sessions: ${result.restoredSessions ? 'restored' : 'not included'}\n`);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
printer.printError(error);
|
|
100
|
+
process.exitCode = 1;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
config
|
|
104
|
+
.command('search')
|
|
105
|
+
.description('Configure the web-search provider the model uses (duckduckgo or firecrawl).')
|
|
106
|
+
.option('--provider <name>', 'duckduckgo, firecrawl, or off.')
|
|
107
|
+
.option('--api-key-env <name>', 'Env var holding the Firecrawl API key (preferred over storing it).')
|
|
108
|
+
.option('--scrape', 'Firecrawl: scrape each result into markdown (costs more).')
|
|
109
|
+
.option('--enable', 'Enable model-initiated search.')
|
|
110
|
+
.option('--disable', 'Disable model-initiated search.')
|
|
111
|
+
.action(async (options) => {
|
|
112
|
+
let prompt;
|
|
113
|
+
try {
|
|
114
|
+
const manager = new core_1.ConfigManager((0, RuntimeFactory_1.loadConfig)(program));
|
|
115
|
+
const style = new TerminalStyle_1.TerminalStyle();
|
|
116
|
+
const getPrompt = () => (prompt ??= new InteractivePrompt_1.InteractivePrompt());
|
|
117
|
+
const update = await resolveSearchUpdate(options, getPrompt, style);
|
|
118
|
+
const result = manager.updateWebSearch(update);
|
|
119
|
+
printSearchSummary(manager.config.webSearch);
|
|
120
|
+
process.stdout.write(`Saved ${result.configPath}\n`);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if ((0, PromptAbort_1.isPromptAbortError)(error)) {
|
|
124
|
+
process.stderr.write('Aborted.\n');
|
|
125
|
+
process.exitCode = 130;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
printer.printError(error);
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
prompt?.close();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** Build the [web_search] changes from flags (non-interactive) or prompts. */
|
|
137
|
+
async function resolveSearchUpdate(options, getPrompt, style) {
|
|
138
|
+
const flagDriven = options.provider !== undefined || options.apiKeyEnv !== undefined
|
|
139
|
+
|| Boolean(options.scrape) || Boolean(options.enable) || Boolean(options.disable);
|
|
140
|
+
return flagDriven ? searchUpdateFromFlags(options) : searchUpdateInteractive(getPrompt, style);
|
|
141
|
+
}
|
|
142
|
+
function searchUpdateFromFlags(options) {
|
|
143
|
+
const update = {};
|
|
144
|
+
const provider = options.provider?.toLowerCase();
|
|
145
|
+
if (provider === 'off') {
|
|
146
|
+
update.enabled = false;
|
|
147
|
+
}
|
|
148
|
+
else if (provider === 'duckduckgo' || provider === 'firecrawl') {
|
|
149
|
+
update.provider = provider;
|
|
150
|
+
update.enabled = true;
|
|
151
|
+
}
|
|
152
|
+
else if (provider !== undefined) {
|
|
153
|
+
throw core_1.MarifoldError.configInvalid('Expected --provider to be "duckduckgo", "firecrawl", or "off".');
|
|
154
|
+
}
|
|
155
|
+
if (options.apiKeyEnv)
|
|
156
|
+
update.apiKeyEnv = options.apiKeyEnv;
|
|
157
|
+
if (options.scrape)
|
|
158
|
+
update.scrape = true;
|
|
159
|
+
if (options.enable)
|
|
160
|
+
update.enabled = true;
|
|
161
|
+
if (options.disable)
|
|
162
|
+
update.enabled = false;
|
|
163
|
+
return update;
|
|
164
|
+
}
|
|
165
|
+
async function searchUpdateInteractive(getPrompt, style) {
|
|
166
|
+
const provider = await pickOption(getPrompt, style, 'Web search provider:', [
|
|
167
|
+
{ label: 'DuckDuckGo — keyless, best-effort (default)', value: 'duckduckgo' },
|
|
168
|
+
{ label: 'Firecrawl — AI-ready results (needs an API key)', value: 'firecrawl' },
|
|
169
|
+
{ label: 'Off — disable model-initiated search', value: 'off' },
|
|
170
|
+
]);
|
|
171
|
+
if (provider === 'off')
|
|
172
|
+
return { enabled: false };
|
|
173
|
+
if (provider === 'duckduckgo')
|
|
174
|
+
return { provider: 'duckduckgo', enabled: true };
|
|
175
|
+
const update = { provider: 'firecrawl', enabled: true };
|
|
176
|
+
const keySource = await pickOption(getPrompt, style, 'Firecrawl API key:', [
|
|
177
|
+
{ label: 'Env var (recommended)', value: 'env' },
|
|
178
|
+
{ label: 'Paste key now (stored in config)', value: 'paste' },
|
|
179
|
+
{ label: 'Keyless (rate-limited)', value: 'keyless' },
|
|
180
|
+
]);
|
|
181
|
+
if (keySource === 'env') {
|
|
182
|
+
const name = await readLine(getPrompt(), style, 'Env var name [FIRECRAWL_API_KEY]: ');
|
|
183
|
+
update.apiKeyEnv = name || 'FIRECRAWL_API_KEY';
|
|
184
|
+
}
|
|
185
|
+
else if (keySource === 'paste') {
|
|
186
|
+
const key = await (0, SecretPrompt_1.readSecretLine)(style.bold('Firecrawl API key: '), getPrompt);
|
|
187
|
+
if (key)
|
|
188
|
+
update.apiKey = key;
|
|
189
|
+
}
|
|
190
|
+
const scrape = await pickOption(getPrompt, style, 'Scrape results into markdown (costs more)?', [
|
|
191
|
+
{ label: 'No — titles + snippets (cheaper)', value: 'no' },
|
|
192
|
+
{ label: 'Yes — full page markdown for the model', value: 'yes' },
|
|
193
|
+
]);
|
|
194
|
+
update.scrape = scrape === 'yes';
|
|
195
|
+
return update;
|
|
196
|
+
}
|
|
197
|
+
async function pickOption(getPrompt, style, message, options) {
|
|
198
|
+
const selected = await (0, TerminalSelect_1.selectTerminalOption)(message, options);
|
|
199
|
+
if (selected !== undefined)
|
|
200
|
+
return selected;
|
|
201
|
+
// Non-interactive fallback: numbered prompt.
|
|
202
|
+
process.stdout.write(`${message}\n`);
|
|
203
|
+
options.forEach((option, index) => process.stdout.write(` ${index + 1}. ${option.label}\n`));
|
|
204
|
+
const answer = await getPrompt().readUserMessage(style.bold('Choice [1]: '));
|
|
205
|
+
if (answer === undefined)
|
|
206
|
+
throw new PromptAbort_1.PromptAbortError();
|
|
207
|
+
const raw = answer.trim();
|
|
208
|
+
const index = raw ? Number(raw) : 1;
|
|
209
|
+
if (Number.isInteger(index) && index >= 1 && index <= options.length)
|
|
210
|
+
return options[index - 1].value;
|
|
211
|
+
throw core_1.MarifoldError.configInvalid('Invalid selection.');
|
|
212
|
+
}
|
|
213
|
+
async function readLine(prompt, style, label) {
|
|
214
|
+
const answer = await prompt.readUserMessage(style.bold(label));
|
|
215
|
+
if (answer === undefined)
|
|
216
|
+
throw new PromptAbort_1.PromptAbortError();
|
|
217
|
+
return answer.trim();
|
|
218
|
+
}
|
|
219
|
+
function printSearchSummary(config) {
|
|
220
|
+
if (!config)
|
|
221
|
+
return;
|
|
222
|
+
process.stdout.write(`Web search: ${config.provider}${config.enabled ? '' : ' (model-initiated search off)'}\n`);
|
|
223
|
+
if (config.provider === 'firecrawl') {
|
|
224
|
+
const key = config.apiKeyEnv ? `env ${config.apiKeyEnv}` : config.apiKey ? 'stored in config' : 'keyless (rate-limited)';
|
|
225
|
+
process.stdout.write(` key: ${key}\n scrape: ${config.scrape ? 'on' : 'off'}\n`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ConsolePrinter } from '../output/ConsolePrinter';
|
|
3
|
+
/**
|
|
4
|
+
* `marifold doctor` — environment health check. Reports the active provider/model
|
|
5
|
+
* config and, importantly, runs a read-only integrity check of the session DB.
|
|
6
|
+
* The session check is the reason this lives on the CLI rather than the TUI's
|
|
7
|
+
* `/doctor`: when the session DB is corrupt the TUI cannot even start, so the
|
|
8
|
+
* diagnostic must be reachable from a command that never opens the store eagerly.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerDoctorCommand(program: Command, printer: ConsolePrinter): void;
|
|
11
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAsErF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDoctorCommand = registerDoctorCommand;
|
|
4
|
+
const RuntimeFactory_1 = require("./RuntimeFactory");
|
|
5
|
+
/**
|
|
6
|
+
* `marifold doctor` — environment health check. Reports the active provider/model
|
|
7
|
+
* config and, importantly, runs a read-only integrity check of the session DB.
|
|
8
|
+
* The session check is the reason this lives on the CLI rather than the TUI's
|
|
9
|
+
* `/doctor`: when the session DB is corrupt the TUI cannot even start, so the
|
|
10
|
+
* diagnostic must be reachable from a command that never opens the store eagerly.
|
|
11
|
+
*/
|
|
12
|
+
function registerDoctorCommand(program, printer) {
|
|
13
|
+
program
|
|
14
|
+
.command('doctor')
|
|
15
|
+
.description('Check Marifold health: provider/model config and session database integrity.')
|
|
16
|
+
.option('--profile <name>', 'Check this profile (defaults to the active profile).')
|
|
17
|
+
.action((options) => {
|
|
18
|
+
const runtime = (0, RuntimeFactory_1.createRuntime)(program);
|
|
19
|
+
const out = process.stdout;
|
|
20
|
+
try {
|
|
21
|
+
out.write('Marifold doctor\n\n');
|
|
22
|
+
// Provider & model — resolved independently so a config gap here never
|
|
23
|
+
// blocks the session-DB check below.
|
|
24
|
+
out.write('Provider & model\n');
|
|
25
|
+
try {
|
|
26
|
+
const loaded = (0, RuntimeFactory_1.loadConfig)(program);
|
|
27
|
+
const settings = runtime.resolveSettings(options.profile ? { profile: options.profile } : {});
|
|
28
|
+
const provider = loaded.config.providers[settings.provider];
|
|
29
|
+
const keyEnv = provider?.apiKeyEnv;
|
|
30
|
+
out.write(` Profile: ${settings.profile}\n`);
|
|
31
|
+
out.write(` Provider: ${settings.provider}\n`);
|
|
32
|
+
out.write(` Model: ${settings.model}\n`);
|
|
33
|
+
out.write(` Type: ${provider?.type ?? 'unknown'}\n`);
|
|
34
|
+
out.write(` Base URL: ${provider?.baseUrl ?? '(default)'}\n`);
|
|
35
|
+
out.write(` API key env: ${keyEnv ? `${keyEnv} ${process.env[keyEnv] ? '✓ set' : '✗ unset'}` : '(none)'}\n`);
|
|
36
|
+
out.write(` Stored key: ${provider?.apiKey ? 'present' : 'none'}\n`);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
out.write(` ✗ ${error instanceof Error ? error.message : String(error)}\n`);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
// Session database — read-only integrity check; safe even when corrupt.
|
|
43
|
+
out.write('\nSession database\n');
|
|
44
|
+
out.write(` Path: ${runtime.sessionDbPath}\n`);
|
|
45
|
+
const health = runtime.checkSessionDb();
|
|
46
|
+
if (!health.exists) {
|
|
47
|
+
out.write(' Status: none yet (no sessions saved)\n');
|
|
48
|
+
}
|
|
49
|
+
else if (health.ok) {
|
|
50
|
+
out.write(` Status: ✓ ok (${health.sessions} sessions, ${health.turns} turns)\n`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
out.write(` Status: ✗ CORRUPT — ${health.error}\n`);
|
|
54
|
+
out.write(' The session DB is damaged. A guided repair (backs up first) is coming in `marifold session repair`.\n');
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
}
|
|
57
|
+
// Channels — only when a [channel.*] section is configured.
|
|
58
|
+
const tg = (0, RuntimeFactory_1.loadConfig)(program).config.channels?.telegram;
|
|
59
|
+
if (tg) {
|
|
60
|
+
out.write('\nChannel (telegram)\n');
|
|
61
|
+
const tokenOk = tg.botTokenEnv ? Boolean(process.env[tg.botTokenEnv]) : Boolean(tg.botToken);
|
|
62
|
+
const tokenDesc = tg.botTokenEnv ? `${tg.botTokenEnv} ${process.env[tg.botTokenEnv] ? '✓ set' : '✗ unset'}` : (tg.botToken ? 'in config' : '✗ missing');
|
|
63
|
+
const profileOk = runtime.listProfiles().some(p => p.name === tg.profile);
|
|
64
|
+
out.write(` Bot token: ${tokenDesc}\n`);
|
|
65
|
+
out.write(` Allowlist: ${tg.allowlist.length} user(s)${tg.allowlist.length === 0 ? ' ✗ (bot is locked)' : ''}\n`);
|
|
66
|
+
out.write(` Profile: ${tg.profile}${profileOk ? '' : ' ✗ (not found)'}\n`);
|
|
67
|
+
out.write(` Default mode: ${tg.defaultMode}\n`);
|
|
68
|
+
if (!tokenOk || tg.allowlist.length === 0 || !profileOk) {
|
|
69
|
+
out.write(' Status: ✗ not ready — fix the ✗ items (or rerun `marifold channel telegram setup`).\n');
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
out.write(' Status: ✓ ready\n');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
printer.printError(error);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
runtime.close();
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA0B1D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CA+DnF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInitCommand = registerInitCommand;
|
|
4
|
+
const core_1 = require("@marifold/core");
|
|
5
|
+
const InteractivePrompt_1 = require("../input/InteractivePrompt");
|
|
6
|
+
const PromptAbort_1 = require("../input/PromptAbort");
|
|
7
|
+
const TerminalStyle_1 = require("../output/TerminalStyle");
|
|
8
|
+
const ModelPicker_1 = require("../input/ModelPicker");
|
|
9
|
+
const config_1 = require("./config");
|
|
10
|
+
const RuntimeFactory_1 = require("./RuntimeFactory");
|
|
11
|
+
// Bootstrap model written before the interactive picker overrides the default.
|
|
12
|
+
const BOOTSTRAP_MODEL = { provider: 'ollama', model: 'gemma4:e4b' };
|
|
13
|
+
function registerInitCommand(program, printer) {
|
|
14
|
+
program
|
|
15
|
+
.command('init')
|
|
16
|
+
.description('Initialize Marifold config and the default profile.')
|
|
17
|
+
.option('--force', 'Rewrite config.toml if it already exists.')
|
|
18
|
+
.option('--provider <name>', 'Provider key to configure.', 'ollama')
|
|
19
|
+
.option('--provider-type <type>', 'Provider type: ollama, openai-compatible, or anthropic.')
|
|
20
|
+
.option('--model <model>', 'Default model name (skips the interactive model picker).')
|
|
21
|
+
.option('--profile <name>', 'Default profile name.', 'default')
|
|
22
|
+
.option('--profiles-dir <path>', 'Profiles directory.')
|
|
23
|
+
.option('--sessions-db <path>', 'SQLite sessions database path.')
|
|
24
|
+
.option('--tasks-dir <path>', 'Task-state directory.')
|
|
25
|
+
.option('--schedules-dir <path>', 'Schedules directory.')
|
|
26
|
+
.option('--apps-dir <path>', 'Apps directory.')
|
|
27
|
+
.option('--base-url <url>', 'Provider base URL.')
|
|
28
|
+
.option('--api-key-env <name>', 'Environment variable containing the provider API key.')
|
|
29
|
+
.option('--search-provider <name>', 'Web search provider: duckduckgo, firecrawl, or off.')
|
|
30
|
+
.option('--search-api-key-env <name>', 'Env var holding the search provider API key (Firecrawl).')
|
|
31
|
+
.action(async (options) => {
|
|
32
|
+
const rootOptions = program.opts();
|
|
33
|
+
// Interactive only on a real terminal when the model wasn't pinned by a
|
|
34
|
+
// flag — so scripts and CI (no TTY, or `--model`) keep the old behavior.
|
|
35
|
+
const interactive = !options.model && Boolean(process.stdout.isTTY && process.stdin.isTTY);
|
|
36
|
+
try {
|
|
37
|
+
const result = new core_1.WorkspaceInitializer().initialize({
|
|
38
|
+
configPath: rootOptions.config,
|
|
39
|
+
force: Boolean(options.force),
|
|
40
|
+
// Interactive runs bootstrap on Ollama defaults, then the picker
|
|
41
|
+
// rewrites the default model (and adds the chosen provider) below.
|
|
42
|
+
provider: interactive ? BOOTSTRAP_MODEL.provider : options.provider,
|
|
43
|
+
providerType: interactive ? undefined : parseProviderType(options.providerType),
|
|
44
|
+
model: options.model,
|
|
45
|
+
profile: options.profile,
|
|
46
|
+
profilesDir: options.profilesDir,
|
|
47
|
+
sessionsDb: options.sessionsDb,
|
|
48
|
+
tasksDir: options.tasksDir,
|
|
49
|
+
schedulesDir: options.schedulesDir,
|
|
50
|
+
appsDir: options.appsDir,
|
|
51
|
+
baseUrl: interactive ? undefined : options.baseUrl,
|
|
52
|
+
apiKeyEnv: interactive ? undefined : options.apiKeyEnv,
|
|
53
|
+
});
|
|
54
|
+
// In interactive mode, hide the bootstrap model line and Next steps —
|
|
55
|
+
// the chosen model and next steps are printed after the picker.
|
|
56
|
+
printer.printInitResult(result, interactive ? { showModel: false, showNextSteps: false } : {});
|
|
57
|
+
if (interactive) {
|
|
58
|
+
await runInteractiveSetup(program, printer);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (options.searchProvider) {
|
|
62
|
+
const manager = new core_1.ConfigManager((0, RuntimeFactory_1.loadConfig)(program));
|
|
63
|
+
manager.updateWebSearch((0, config_1.searchUpdateFromFlags)({
|
|
64
|
+
provider: options.searchProvider,
|
|
65
|
+
apiKeyEnv: options.searchApiKeyEnv,
|
|
66
|
+
}));
|
|
67
|
+
process.stdout.write(`Web search: ${manager.config.webSearch?.provider ?? 'duckduckgo'}\n`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
printer.printError(error);
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Pick a default model (and optionally enable web search) right after init, so
|
|
77
|
+
* a first run never points at a model the user doesn't have. Reuses the same
|
|
78
|
+
* provider/model picker as `marifold model add`/`model default`. */
|
|
79
|
+
async function runInteractiveSetup(program, printer) {
|
|
80
|
+
let prompt;
|
|
81
|
+
const getPrompt = () => (prompt ??= new InteractivePrompt_1.InteractivePrompt());
|
|
82
|
+
try {
|
|
83
|
+
const loadedConfig = (0, RuntimeFactory_1.loadConfig)(program);
|
|
84
|
+
const style = new TerminalStyle_1.TerminalStyle();
|
|
85
|
+
process.stdout.write('\nChoose the model Marifold should use by default:\n');
|
|
86
|
+
const { provider, model } = await (0, ModelPicker_1.resolveModelAddTarget)(loadedConfig, getPrompt, style);
|
|
87
|
+
const manager = new core_1.ConfigManager(loadedConfig);
|
|
88
|
+
manager.addModel(provider, model);
|
|
89
|
+
manager.setDefaultModel(model, provider);
|
|
90
|
+
// Drop the bootstrap placeholder unless that's exactly what was chosen.
|
|
91
|
+
if (provider !== BOOTSTRAP_MODEL.provider || model !== BOOTSTRAP_MODEL.model) {
|
|
92
|
+
try {
|
|
93
|
+
manager.removeModel(BOOTSTRAP_MODEL.provider, BOOTSTRAP_MODEL.model);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// The placeholder may already be gone or be the default — leave it.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
process.stdout.write(style.bold(`Default model: ${provider}/${model}\n`));
|
|
100
|
+
if (await readYesNo(getPrompt(), style, 'Enable web search (DuckDuckGo, no API key)?', false)) {
|
|
101
|
+
manager.updateWebSearch((0, config_1.searchUpdateFromFlags)({ provider: 'duckduckgo' }));
|
|
102
|
+
process.stdout.write('Web search: duckduckgo\n');
|
|
103
|
+
}
|
|
104
|
+
process.stdout.write('\nDone. Run `marifold` to start.\n');
|
|
105
|
+
process.stdout.write(style.dim('(Change the default model later with `marifold model default`.)\n'));
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if ((0, PromptAbort_1.isPromptAbortError)(error)) {
|
|
109
|
+
process.stdout.write('\nLeft at defaults. Set a model later with `marifold model default`.\n');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
printer.printError(error);
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
prompt?.close();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function readYesNo(prompt, style, label, def) {
|
|
120
|
+
const answer = await prompt.readUserMessage(style.bold(`${label}${def ? ' [Y/n] ' : ' [y/N] '}`));
|
|
121
|
+
if (answer === undefined)
|
|
122
|
+
return def;
|
|
123
|
+
const value = answer.trim().toLowerCase();
|
|
124
|
+
if (!value)
|
|
125
|
+
return def;
|
|
126
|
+
return value === 'y' || value === 'yes';
|
|
127
|
+
}
|
|
128
|
+
function parseProviderType(value) {
|
|
129
|
+
if (value === undefined)
|
|
130
|
+
return undefined;
|
|
131
|
+
if (value === 'ollama' || value === 'openai-compatible' || value === 'anthropic')
|
|
132
|
+
return value;
|
|
133
|
+
throw core_1.MarifoldError.configInvalid(`Expected --provider-type to be "ollama", "openai-compatible", or "anthropic".`);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA8B1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAoOpF"}
|