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,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authorizeXaiWithBrowser = authorizeXaiWithBrowser;
4
+ exports.extractPastedCode = extractPastedCode;
5
+ exports.buildXaiAuthorizeUrl = buildXaiAuthorizeUrl;
6
+ const crypto_1 = require("crypto");
7
+ const http_1 = require("http");
8
+ const child_process_1 = require("child_process");
9
+ const core_1 = require("@marifold/core");
10
+ // xAI Grok SuperGrok / X Premium+ OAuth. api.x.ai is a plain OpenAI-compatible
11
+ // surface, so the access token is used as a normal Bearer credential — there is
12
+ // no account-id header (unlike the ChatGPT Codex backend). The client id is
13
+ // xAI's public desktop OAuth client used by the Grok CLI; it is not a secret.
14
+ const XAI_AUTH_ISSUER = 'https://auth.x.ai';
15
+ const XAI_OAUTH_AUTHORIZE_URL = `${XAI_AUTH_ISSUER}/oauth2/authorize`;
16
+ const XAI_OAUTH_TOKEN_URL = `${XAI_AUTH_ISSUER}/oauth2/token`;
17
+ const XAI_OAUTH_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';
18
+ const XAI_OAUTH_SCOPE = 'openid profile email offline_access grok-cli:access api:access';
19
+ const XAI_OAUTH_PORT = 56121;
20
+ const XAI_CALLBACK_PATH = '/callback';
21
+ async function authorizeXaiWithBrowser(write = text => process.stdout.write(text), readPastedCode, options = {}) {
22
+ const pkce = generatePkce();
23
+ const state = base64Url((0, crypto_1.randomBytes)(32));
24
+ const nonce = base64Url((0, crypto_1.randomBytes)(16));
25
+ const callback = await startCallbackServer(state);
26
+ const authUrl = buildXaiAuthorizeUrl(callback.redirectUri, pkce, state, nonce);
27
+ try {
28
+ openBrowser(authUrl);
29
+ write('Open this URL in your browser to sign in with your SuperGrok / X Premium+ account:\n');
30
+ write(`${authUrl}\n`);
31
+ // xAI often shows a "copy this code" page instead of redirecting back to the
32
+ // loopback listener, so offer a paste path and keep the redirect as a
33
+ // fallback (press Enter to wait). Whichever the user does, the code is
34
+ // exchanged against the same redirect_uri it was issued for.
35
+ let code;
36
+ if (readPastedCode) {
37
+ write("\nWhen approved, xAI shows a code to copy (or returns here automatically).\n");
38
+ const pasted = await readPastedCode('Paste the code from your browser, or press Enter to wait for the redirect: ');
39
+ const trimmed = (pasted ?? '').trim();
40
+ if (trimmed) {
41
+ code = extractPastedCode(trimmed, state);
42
+ }
43
+ else {
44
+ write('Waiting for the browser redirect...\n');
45
+ code = await callback.waitForCode();
46
+ }
47
+ }
48
+ else {
49
+ write('Waiting for the browser redirect...\n');
50
+ code = await callback.waitForCode();
51
+ }
52
+ write('Exchanging the authorization code for tokens with xAI...\n');
53
+ return await exchangeXaiCodeForTokens(code, callback.redirectUri, pkce, options.proxy);
54
+ }
55
+ finally {
56
+ await callback.close();
57
+ }
58
+ }
59
+ /**
60
+ * Extract the authorization code from whatever the user pastes: the full
61
+ * `http://127.0.0.1:56121/callback?code=…&state=…` redirect, a bare
62
+ * `code=…&state=…` querystring, or just the code shown on xAI's page.
63
+ */
64
+ function extractPastedCode(input, expectedState) {
65
+ const value = input.trim();
66
+ let code;
67
+ let state;
68
+ try {
69
+ const url = new URL(value);
70
+ code = url.searchParams.get('code') ?? undefined;
71
+ state = url.searchParams.get('state') ?? undefined;
72
+ }
73
+ catch {
74
+ if (value.includes('code=')) {
75
+ const params = new URLSearchParams(value);
76
+ code = params.get('code') ?? undefined;
77
+ state = params.get('state') ?? undefined;
78
+ }
79
+ else {
80
+ code = value; // bare code — xAI's paste page shows no state
81
+ }
82
+ }
83
+ if (!code)
84
+ throw new Error('Could not find an authorization code in the pasted value.');
85
+ if (state && state !== expectedState)
86
+ throw new Error('OAuth state mismatch in the pasted redirect.');
87
+ return code;
88
+ }
89
+ function buildXaiAuthorizeUrl(redirectUri, pkce, state, nonce) {
90
+ const params = new URLSearchParams({
91
+ response_type: 'code',
92
+ client_id: XAI_OAUTH_CLIENT_ID,
93
+ redirect_uri: redirectUri,
94
+ scope: XAI_OAUTH_SCOPE,
95
+ code_challenge: pkce.codeChallenge,
96
+ code_challenge_method: 'S256',
97
+ state,
98
+ nonce,
99
+ plan: 'generic',
100
+ referrer: 'hermes-agent',
101
+ });
102
+ return `${XAI_OAUTH_AUTHORIZE_URL}?${params.toString()}`;
103
+ }
104
+ async function exchangeXaiCodeForTokens(code, redirectUri, pkce, proxy) {
105
+ const data = await postForm(XAI_OAUTH_TOKEN_URL, {
106
+ grant_type: 'authorization_code',
107
+ code,
108
+ redirect_uri: redirectUri,
109
+ client_id: XAI_OAUTH_CLIENT_ID,
110
+ code_verifier: pkce.codeVerifier,
111
+ code_challenge: pkce.codeChallenge,
112
+ code_challenge_method: 'S256',
113
+ }, 'xAI token exchange failed', proxy);
114
+ const accessToken = stringField(data.access_token);
115
+ const refreshToken = stringField(data.refresh_token);
116
+ if (!accessToken || !refreshToken) {
117
+ throw new Error('xAI token exchange response did not include access and refresh tokens.');
118
+ }
119
+ const expiresIn = numberField(data.expires_in);
120
+ return {
121
+ accessToken,
122
+ refreshToken,
123
+ expiresAt: expiresIn !== undefined ? Math.floor(Date.now() / 1000) + expiresIn : undefined,
124
+ };
125
+ }
126
+ async function postForm(url, data, label, proxy) {
127
+ // Node's fetch ignores HTTPS_PROXY by default; honor it for this external call
128
+ // (xAI's token endpoint) so the exchange works behind a proxy like the browser.
129
+ const init = {
130
+ method: 'POST',
131
+ headers: {
132
+ Accept: 'application/json',
133
+ 'Content-Type': 'application/x-www-form-urlencoded',
134
+ },
135
+ body: new URLSearchParams(data),
136
+ // Generous ceiling: the OAuth token endpoint can be slow through a proxy.
137
+ signal: AbortSignal.timeout(60000),
138
+ };
139
+ const dispatcher = (0, core_1.proxyDispatcher)(proxy);
140
+ if (dispatcher)
141
+ init.dispatcher = dispatcher;
142
+ try {
143
+ const response = await (0, core_1.fetchWithTransientRetry)(url, init).catch(error => {
144
+ throw new Error(`${label}: ${stringifyError(error)}`);
145
+ });
146
+ if (!response.ok)
147
+ throw new Error(`${label}: HTTP ${response.status}: ${await response.text()}`);
148
+ return await response.json();
149
+ }
150
+ finally {
151
+ await dispatcher?.close();
152
+ }
153
+ }
154
+ async function startCallbackServer(expectedState) {
155
+ try {
156
+ return await listenOnPort(XAI_OAUTH_PORT, expectedState);
157
+ }
158
+ catch (error) {
159
+ const message = error instanceof Error ? error.message : String(error);
160
+ throw new Error(`Could not start local OAuth callback server on port ${XAI_OAUTH_PORT}: ${message}`);
161
+ }
162
+ }
163
+ function listenOnPort(port, expectedState) {
164
+ return new Promise((resolve, reject) => {
165
+ let resolveCode;
166
+ let rejectCode;
167
+ const codePromise = new Promise((codeResolve, codeReject) => {
168
+ resolveCode = codeResolve;
169
+ rejectCode = codeReject;
170
+ });
171
+ const server = (0, http_1.createServer)((request, response) => {
172
+ const requestUrl = new URL(request.url ?? '/', `http://localhost:${port}`);
173
+ if (requestUrl.pathname !== XAI_CALLBACK_PATH) {
174
+ response.writeHead(404);
175
+ response.end('Not Found');
176
+ return;
177
+ }
178
+ const state = requestUrl.searchParams.get('state') ?? '';
179
+ if (state !== expectedState) {
180
+ respond(response, 'Sign-in failed: state mismatch.', 400);
181
+ rejectCode?.(new Error('OAuth callback state mismatch.'));
182
+ return;
183
+ }
184
+ const error = requestUrl.searchParams.get('error');
185
+ if (error) {
186
+ const description = requestUrl.searchParams.get('error_description') ?? error;
187
+ respond(response, `Sign-in failed: ${description}`, 400);
188
+ rejectCode?.(new Error(description));
189
+ return;
190
+ }
191
+ const code = requestUrl.searchParams.get('code');
192
+ if (!code) {
193
+ respond(response, 'Sign-in failed: missing authorization code.', 400);
194
+ rejectCode?.(new Error('OAuth callback did not include an authorization code.'));
195
+ return;
196
+ }
197
+ respond(response, 'Sign-in complete. You can close this window and return to Marifold.');
198
+ resolveCode?.(code);
199
+ });
200
+ server.once('error', error => reject(error));
201
+ server.listen(port, '127.0.0.1', () => {
202
+ resolve({
203
+ redirectUri: `http://127.0.0.1:${port}${XAI_CALLBACK_PATH}`,
204
+ waitForCode: () => withTimeout(codePromise, 300000, 'xAI sign-in timed out before the callback was received.'),
205
+ close: () => closeServer(server),
206
+ });
207
+ });
208
+ });
209
+ }
210
+ function respond(response, message, status = 200) {
211
+ const escaped = message.replace(/[&<>"']/g, char => ({
212
+ '&': '&amp;',
213
+ '<': '&lt;',
214
+ '>': '&gt;',
215
+ '"': '&quot;',
216
+ "'": '&#39;',
217
+ }[char] ?? char));
218
+ const body = `<!doctype html><html><head><title>marifold auth</title></head><body><p>${escaped}</p></body></html>`;
219
+ response.writeHead(status, {
220
+ 'Content-Type': 'text/html; charset=utf-8',
221
+ 'Content-Length': String(Buffer.byteLength(body)),
222
+ });
223
+ response.end(body);
224
+ }
225
+ function closeServer(server) {
226
+ return new Promise(resolve => {
227
+ server.close(() => resolve());
228
+ // The browser keeps the success-page connection alive, which blocks
229
+ // server.close() from ever completing; force lingering sockets closed so
230
+ // the sign-in returns promptly instead of hanging after the token exchange.
231
+ server.closeAllConnections();
232
+ });
233
+ }
234
+ function withTimeout(promise, ms, message) {
235
+ return new Promise((resolve, reject) => {
236
+ const timer = setTimeout(() => reject(new Error(message)), ms);
237
+ promise.then(value => {
238
+ clearTimeout(timer);
239
+ resolve(value);
240
+ }, error => {
241
+ clearTimeout(timer);
242
+ reject(error);
243
+ });
244
+ });
245
+ }
246
+ function generatePkce() {
247
+ const codeVerifier = base64Url((0, crypto_1.randomBytes)(32));
248
+ const codeChallenge = base64Url((0, crypto_1.createHash)('sha256').update(codeVerifier).digest());
249
+ return { codeVerifier, codeChallenge };
250
+ }
251
+ function base64Url(bytes) {
252
+ return bytes.toString('base64url');
253
+ }
254
+ function openBrowser(url) {
255
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
256
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
257
+ const child = (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
258
+ child.unref();
259
+ }
260
+ function stringField(value) {
261
+ return typeof value === 'string' ? value : undefined;
262
+ }
263
+ function numberField(value) {
264
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
265
+ }
266
+ function stringifyError(error) {
267
+ if (!(error instanceof Error))
268
+ return String(error);
269
+ // undici surfaces the real transport reason (ECONNREFUSED, ECONNRESET, TLS,
270
+ // proxy errors) on `.cause`, not the bare "fetch failed" message — include it
271
+ // so a failed sign-in is diagnosable (e.g. a missing HTTPS_PROXY in China).
272
+ const cause = error.cause;
273
+ const causeText = cause instanceof Error
274
+ ? ` (cause: ${cause.code ?? cause.message})`
275
+ : cause && typeof cause === 'object' && 'code' in cause
276
+ ? ` (cause: ${cause.code})`
277
+ : '';
278
+ return `${error.name}: ${error.message}${causeText}`;
279
+ }
280
+ //# sourceMappingURL=XaiAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XaiAuth.js","sourceRoot":"","sources":["../../src/auth/XaiAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import { LoadedMarifoldConfig, MarifoldRuntime } from '@marifold/core';
3
+ export interface RootCommandOptions {
4
+ config?: string;
5
+ }
6
+ export declare function createRuntime(program: Command): MarifoldRuntime;
7
+ export declare function loadConfig(program: Command): LoadedMarifoldConfig;
8
+ //# sourceMappingURL=RuntimeFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeFactory.d.ts","sourceRoot":"","sources":["../../src/commands/RuntimeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAgB,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAE/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CAGjE"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRuntime = createRuntime;
4
+ exports.loadConfig = loadConfig;
5
+ const core_1 = require("@marifold/core");
6
+ function createRuntime(program) {
7
+ return new core_1.MarifoldRuntime({ loadedConfig: loadConfig(program) });
8
+ }
9
+ function loadConfig(program) {
10
+ const rootOptions = program.opts();
11
+ return new core_1.ConfigLoader().load({ configPath: rootOptions.config });
12
+ }
13
+ //# sourceMappingURL=RuntimeFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeFactory.js","sourceRoot":"","sources":["../../src/commands/RuntimeFactory.ts"],"names":[],"mappings":";;;;AACA,yCAAqF;AAMrF,uBAA8B,OAAgB;IAC5C,OAAO,IAAI,sBAAe,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,oBAA2B,OAAgB;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAsB,CAAC;IACvD,OAAO,IAAI,mBAAY,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ import { ConsolePrinter } from '../output/ConsolePrinter';
3
+ export declare function registerAgentCommand(program: Command, printer: ConsolePrinter): void;
4
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAa1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAsDpF"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAgentCommand = registerAgentCommand;
4
+ const InteractivePrompt_1 = require("../input/InteractivePrompt");
5
+ const TerminalStyle_1 = require("../output/TerminalStyle");
6
+ const RuntimeFactory_1 = require("./RuntimeFactory");
7
+ function registerAgentCommand(program, printer) {
8
+ program
9
+ .command('agent')
10
+ .description('Run an approval-aware agent loop toward an objective, persisting task state.')
11
+ .argument('<objective...>', 'The objective for the agent run.')
12
+ .option('--profile <name>', 'Profile name.')
13
+ .option('--provider <name>', 'Provider key from config.toml.')
14
+ .option('--model <model>', 'Model name.')
15
+ .option('--max-iterations <count>', 'Maximum model turns for this run.', parsePositiveInteger)
16
+ .option('--tool-mode <mode>', 'Tool calling mode: auto, native, or control-block.', parseToolMode)
17
+ .option('--yes', 'Approve all tool calls without prompting (use with care).')
18
+ .action(async (objectiveParts, options) => {
19
+ const runtime = (0, RuntimeFactory_1.createRuntime)(program);
20
+ const style = new TerminalStyle_1.TerminalStyle(process.stdout.isTTY ?? false);
21
+ const prompt = new InteractivePrompt_1.InteractivePrompt();
22
+ const controller = new AbortController();
23
+ const onSigint = () => controller.abort();
24
+ process.on('SIGINT', onSigint);
25
+ try {
26
+ const runner = runtime.createAgentRunner(options.profile);
27
+ const approvalHandler = options.yes
28
+ // --yes may satisfy ordinary kind-level prompts, but it must never
29
+ // silently cross the non-persistable host/network boundary.
30
+ ? ((request) => request.persistable === false
31
+ ? promptForApproval(prompt, style, request)
32
+ : Promise.resolve({ approved: true }))
33
+ : ((request) => promptForApproval(prompt, style, request));
34
+ const events = runner.run({
35
+ objective: objectiveParts.join(' '),
36
+ profile: options.profile,
37
+ provider: options.provider,
38
+ model: options.model,
39
+ maxIterations: options.maxIterations,
40
+ toolMode: options.toolMode,
41
+ signal: controller.signal,
42
+ approvalHandler,
43
+ });
44
+ let failed = false;
45
+ for await (const event of events) {
46
+ renderAgentEvent(event, style);
47
+ if (event.type === 'done' && event.status !== 'completed')
48
+ failed = true;
49
+ }
50
+ if (failed)
51
+ process.exitCode = 1;
52
+ }
53
+ catch (error) {
54
+ printer.printError(error);
55
+ process.exitCode = 1;
56
+ }
57
+ finally {
58
+ process.off('SIGINT', onSigint);
59
+ prompt.close();
60
+ runtime.close();
61
+ }
62
+ });
63
+ }
64
+ async function promptForApproval(prompt, style, request) {
65
+ const escalation = request.escalated && request.escalationReason
66
+ ? `\n${style.yellow(`! ${request.escalationReason}`)}`
67
+ : '';
68
+ process.stdout.write(`${style.yellow('approve?')} [${request.kind}] ${request.summary}${escalation}\n`);
69
+ const answer = await prompt.readUserMessage(' y/N > ');
70
+ const approved = answer !== undefined && ['y', 'yes'].includes(answer.trim().toLowerCase());
71
+ return approved ? { approved: true } : { approved: false, reason: 'declined at the prompt' };
72
+ }
73
+ function renderAgentEvent(event, style) {
74
+ switch (event.type) {
75
+ case 'status':
76
+ process.stdout.write(`${style.dim(`[task ${event.taskId}] ${event.status}`)}\n`);
77
+ break;
78
+ case 'plan':
79
+ process.stdout.write(`${style.bold('Plan:')}\n`);
80
+ for (const step of event.plan) {
81
+ process.stdout.write(` ${style.dim(`${step.id}.`)} ${step.text}\n`);
82
+ }
83
+ break;
84
+ case 'step':
85
+ process.stdout.write(`${style.dim(`step ${event.stepId}: ${event.status}`)}\n`);
86
+ break;
87
+ case 'text':
88
+ process.stdout.write(`${event.phase === 'progress' ? style.dim(event.text) : event.text}\n`);
89
+ break;
90
+ case 'reasoning':
91
+ process.stdout.write(`${style.dim(`Reasoning: ${event.summary}`)}\n`);
92
+ break;
93
+ case 'tool_request':
94
+ process.stdout.write(`${style.dim(`tool> ${event.call.summary}`)}\n`);
95
+ break;
96
+ case 'approval_request':
97
+ // The interactive prompt itself is rendered by the approval handler.
98
+ break;
99
+ case 'approval_decision':
100
+ if (!event.approved) {
101
+ process.stdout.write(`${style.yellow(`denied (${event.source}${event.reason ? `: ${event.reason}` : ''})`)}\n`);
102
+ }
103
+ break;
104
+ case 'tool_result':
105
+ process.stdout.write(`${event.isError ? style.red(`tool! ${event.summary}`) : style.dim(`tool< ${event.summary}`)}\n`);
106
+ break;
107
+ case 'verification':
108
+ process.stdout.write(`${event.passed ? style.dim(`verified: ${event.notes}`) : style.yellow(`not verified: ${event.notes}`)}\n`);
109
+ break;
110
+ case 'error':
111
+ process.stdout.write(`${style.red(`error [${event.code}]: ${event.message}`)}\n`);
112
+ break;
113
+ case 'done':
114
+ process.stdout.write(`${style.bold(`done: ${event.status}`)}${event.summary ? `\n${event.summary}` : ''}\n`);
115
+ break;
116
+ }
117
+ }
118
+ function parsePositiveInteger(value) {
119
+ const parsed = Number.parseInt(value, 10);
120
+ if (!Number.isInteger(parsed) || parsed < 1) {
121
+ throw new Error('Expected --max-iterations to be a positive integer.');
122
+ }
123
+ return parsed;
124
+ }
125
+ function parseToolMode(value) {
126
+ if (value === 'auto' || value === 'native' || value === 'control-block')
127
+ return value;
128
+ throw new Error('Expected --tool-mode to be auto, native, or control-block.');
129
+ }
130
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.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 registerAskCommand(program: Command, printer: ConsolePrinter): void;
4
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAa1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAkClF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAskCommand = registerAskCommand;
4
+ const core_1 = require("@marifold/core");
5
+ const RuntimeFactory_1 = require("./RuntimeFactory");
6
+ function registerAskCommand(program, printer) {
7
+ program
8
+ .command('ask')
9
+ .description('Send one prompt and print one assistant response.')
10
+ .argument('<prompt...>', 'Prompt text.')
11
+ .option('--profile <name>', 'Profile name.')
12
+ .option('--provider <name>', 'Provider key from config.toml.')
13
+ .option('--model <model>', 'Model name.')
14
+ .option('--session <id>', 'Optional session id for continuity.')
15
+ .option('--no-memories', 'Disable profile memory for this run.')
16
+ .option('--think [state]', 'Enable or disable thinking mode for this run. Accepts true/false.', parseOptionalBoolean)
17
+ .option('--image <path>', 'Attach an image file to the prompt. Repeatable.', collectImage, [])
18
+ .action(async (promptParts, options) => {
19
+ const runtime = (0, RuntimeFactory_1.createRuntime)(program);
20
+ try {
21
+ const response = await runtime.ask({
22
+ prompt: promptParts.join(' '),
23
+ profile: options.profile,
24
+ provider: options.provider,
25
+ model: options.model,
26
+ sessionId: options.session,
27
+ memories: options.memories,
28
+ think: options.think,
29
+ images: options.image && options.image.length > 0 ? options.image.map(path => ({ path: (0, core_1.expandHome)(path) })) : undefined,
30
+ });
31
+ printer.printAskResponse(response);
32
+ if (!response.ok)
33
+ process.exitCode = 1;
34
+ }
35
+ catch (error) {
36
+ printer.printError(error);
37
+ process.exitCode = 1;
38
+ }
39
+ finally {
40
+ runtime.close();
41
+ }
42
+ });
43
+ }
44
+ function collectImage(value, previous) {
45
+ return [...previous, value];
46
+ }
47
+ function parseOptionalBoolean(value) {
48
+ if (value === undefined)
49
+ return true;
50
+ const normalized = value.trim().toLowerCase();
51
+ if (normalized === 'true' || normalized === 'on' || normalized === '1')
52
+ return true;
53
+ if (normalized === 'false' || normalized === 'off' || normalized === '0')
54
+ return false;
55
+ throw new Error('Expected --think to be true or false.');
56
+ }
57
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":";;;AACA,yCAA4C;AAE5C,qDAAiD;AAYjD,4BAAmC,OAAgB,EAAE,OAAuB;IAC1E,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,mDAAmD,CAAC;SAChE,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,mEAAmE,EAAE,oBAAoB,CAAC;SACpH,MAAM,CAAC,gBAAgB,EAAE,iDAAiD,EAAE,YAAY,EAAE,EAAc,CAAC;SACzG,MAAM,CAAC,KAAK,EAAE,WAAqB,EAAE,OAAmB,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAA,8BAAa,EAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,OAAO;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAA,iBAAU,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aACxH,CAAC,CAAC;YACH,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,QAAkB;IACrD,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACvF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import { ConsolePrinter } from '../output/ConsolePrinter';
3
+ /**
4
+ * `marifold channel <app>` — messaging bridges. For now this is config-only
5
+ * (`telegram setup`); the running bridge (long-poll loop) is a separate command.
6
+ */
7
+ export declare function registerChannelCommand(program: Command, printer: ConsolePrinter): void;
8
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CA6GtF"}