@marifold/tui 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/core/appState.d.ts +158 -0
- package/dist/core/appState.d.ts.map +1 -0
- package/dist/core/appState.js +167 -0
- package/dist/core/appState.js.map +1 -0
- package/dist/core/commands.d.ts +70 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +227 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/displayPaths.d.ts +5 -0
- package/dist/core/displayPaths.d.ts.map +1 -0
- package/dist/core/displayPaths.js +14 -0
- package/dist/core/displayPaths.js.map +1 -0
- package/dist/core/eventView.d.ts +10 -0
- package/dist/core/eventView.d.ts.map +1 -0
- package/dist/core/eventView.js +77 -0
- package/dist/core/eventView.js.map +1 -0
- package/dist/core/inputGrammar.d.ts +29 -0
- package/dist/core/inputGrammar.d.ts.map +1 -0
- package/dist/core/inputGrammar.js +30 -0
- package/dist/core/inputGrammar.js.map +1 -0
- package/dist/core/skills.d.ts +2 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +2 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/transcriptWindow.d.ts.map +1 -0
- package/dist/core/transcriptWindow.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/runTui.d.ts +18 -0
- package/dist/runTui.d.ts.map +1 -0
- package/dist/runTui.js +146 -0
- package/dist/runTui.js.map +1 -0
- package/dist/ui/App.d.ts +23 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +991 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/ApprovalModal.d.ts +12 -0
- package/dist/ui/ApprovalModal.d.ts.map +1 -0
- package/dist/ui/ApprovalModal.js +62 -0
- package/dist/ui/ApprovalModal.js.map +1 -0
- package/dist/ui/Header.d.ts +12 -0
- package/dist/ui/Header.d.ts.map +1 -0
- package/dist/ui/Header.js +15 -0
- package/dist/ui/Header.js.map +1 -0
- package/dist/ui/InfoPanel.d.ts +11 -0
- package/dist/ui/InfoPanel.d.ts.map +1 -0
- package/dist/ui/InfoPanel.js +16 -0
- package/dist/ui/InfoPanel.js.map +1 -0
- package/dist/ui/InputBox.d.ts +31 -0
- package/dist/ui/InputBox.d.ts.map +1 -0
- package/dist/ui/InputBox.js +410 -0
- package/dist/ui/InputBox.js.map +1 -0
- package/dist/ui/Markdown.d.ts +12 -0
- package/dist/ui/Markdown.d.ts.map +1 -0
- package/dist/ui/Markdown.js +111 -0
- package/dist/ui/Markdown.js.map +1 -0
- package/dist/ui/QuestionModal.d.ts +11 -0
- package/dist/ui/QuestionModal.d.ts.map +1 -0
- package/dist/ui/QuestionModal.js +211 -0
- package/dist/ui/QuestionModal.js.map +1 -0
- package/dist/ui/RunStatus.d.ts +17 -0
- package/dist/ui/RunStatus.d.ts.map +1 -0
- package/dist/ui/RunStatus.js +46 -0
- package/dist/ui/RunStatus.js.map +1 -0
- package/dist/ui/SelectList.d.ts +18 -0
- package/dist/ui/SelectList.d.ts.map +1 -0
- package/dist/ui/SelectList.js +54 -0
- package/dist/ui/SelectList.js.map +1 -0
- package/dist/ui/Spinner.d.ts +6 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +14 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/StatusLine.d.ts +6 -0
- package/dist/ui/StatusLine.d.ts.map +1 -0
- package/dist/ui/StatusLine.js +32 -0
- package/dist/ui/StatusLine.js.map +1 -0
- package/dist/ui/Transcript.d.ts +17 -0
- package/dist/ui/Transcript.d.ts.map +1 -0
- package/dist/ui/Transcript.js +58 -0
- package/dist/ui/Transcript.js.map +1 -0
- package/dist/ui/appHelpers.d.ts +16 -0
- package/dist/ui/appHelpers.d.ts.map +1 -0
- package/dist/ui/appHelpers.js +59 -0
- package/dist/ui/appHelpers.js.map +1 -0
- package/dist/ui/text.d.ts +7 -0
- package/dist/ui/text.d.ts.map +1 -0
- package/dist/ui/text.js +16 -0
- package/dist/ui/text.js.map +1 -0
- package/dist/ui/theme.d.ts +12 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +12 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/useResizing.d.ts +14 -0
- package/dist/ui/useResizing.d.ts.map +1 -0
- package/dist/ui/useResizing.js +37 -0
- package/dist/ui/useResizing.js.map +1 -0
- package/dist/ui/useTerminalSize.d.ts +8 -0
- package/dist/ui/useTerminalSize.d.ts.map +1 -0
- package/dist/ui/useTerminalSize.js +23 -0
- package/dist/ui/useTerminalSize.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Compress an absolute path under $HOME to a leading `~` for display, the
|
|
2
|
+
* inverse of core's `expandHome`. Returns the input unchanged when it is not
|
|
3
|
+
* inside the home directory. */
|
|
4
|
+
export declare function tildify(p: string): string;
|
|
5
|
+
//# sourceMappingURL=displayPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displayPaths.d.ts","sourceRoot":"","sources":["../../src/core/displayPaths.ts"],"names":[],"mappings":"AAGA;;gCAEgC;AAChC,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/** Compress an absolute path under $HOME to a leading `~` for display, the
|
|
4
|
+
* inverse of core's `expandHome`. Returns the input unchanged when it is not
|
|
5
|
+
* inside the home directory. */
|
|
6
|
+
export function tildify(p) {
|
|
7
|
+
const home = os.homedir();
|
|
8
|
+
if (p === home)
|
|
9
|
+
return '~';
|
|
10
|
+
if (p.startsWith(home + path.sep))
|
|
11
|
+
return `~${p.slice(home.length)}`;
|
|
12
|
+
return p;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=displayPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displayPaths.js","sourceRoot":"","sources":["../../src/core/displayPaths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;gCAEgC;AAChC,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACrE,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentEvent } from '@marifold/core';
|
|
2
|
+
import type { TranscriptItemData } from './appState.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pure map from an AgentEvent to zero or more transcript items. Status, step,
|
|
5
|
+
* and approval_request events produce no transcript item — they drive the
|
|
6
|
+
* status line and approval modal, handled by the reducer. Keeping this pure
|
|
7
|
+
* lets every event variant be covered without rendering Ink.
|
|
8
|
+
*/
|
|
9
|
+
export declare function agentEventToItems(event: AgentEvent): TranscriptItemData[];
|
|
10
|
+
//# sourceMappingURL=eventView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventView.d.ts","sourceRoot":"","sources":["../../src/core/eventView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB,EAAE,CAqEzE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure map from an AgentEvent to zero or more transcript items. Status, step,
|
|
3
|
+
* and approval_request events produce no transcript item — they drive the
|
|
4
|
+
* status line and approval modal, handled by the reducer. Keeping this pure
|
|
5
|
+
* lets every event variant be covered without rendering Ink.
|
|
6
|
+
*/
|
|
7
|
+
export function agentEventToItems(event) {
|
|
8
|
+
switch (event.type) {
|
|
9
|
+
case 'plan':
|
|
10
|
+
return [{
|
|
11
|
+
kind: 'plan',
|
|
12
|
+
steps: event.plan.map(step => ({ id: step.id, text: step.text, status: step.status })),
|
|
13
|
+
}];
|
|
14
|
+
case 'text':
|
|
15
|
+
return event.text.trim().length > 0
|
|
16
|
+
? [{ kind: 'assistant', text: event.text, ...(event.phase === 'progress' ? { muted: true } : {}) }]
|
|
17
|
+
: [];
|
|
18
|
+
case 'reasoning':
|
|
19
|
+
return event.summary.trim().length > 0
|
|
20
|
+
? [{ kind: 'assistant', text: `Reasoning: ${event.summary}`, muted: true }]
|
|
21
|
+
: [];
|
|
22
|
+
case 'steering':
|
|
23
|
+
// Queued guidance the runner just picked up for the next model turn.
|
|
24
|
+
return [{ kind: 'notice', tone: 'info', text: `Steering applied: ${event.text}` }];
|
|
25
|
+
case 'tool_request':
|
|
26
|
+
return [{
|
|
27
|
+
kind: 'tool',
|
|
28
|
+
tool: event.call.tool,
|
|
29
|
+
toolKind: event.call.kind,
|
|
30
|
+
summary: event.call.summary,
|
|
31
|
+
phase: 'request',
|
|
32
|
+
callId: event.call.id,
|
|
33
|
+
}];
|
|
34
|
+
case 'tool_result':
|
|
35
|
+
// Normally folded onto the request line by the reducer (matched by
|
|
36
|
+
// callId); this item is only used if no matching request is found.
|
|
37
|
+
return [{
|
|
38
|
+
kind: 'tool',
|
|
39
|
+
tool: event.tool,
|
|
40
|
+
summary: event.summary,
|
|
41
|
+
phase: 'result',
|
|
42
|
+
isError: event.isError,
|
|
43
|
+
callId: event.callId,
|
|
44
|
+
}];
|
|
45
|
+
case 'approval_decision':
|
|
46
|
+
// Approvals show in the modal; only surface denials in the transcript.
|
|
47
|
+
return event.approved
|
|
48
|
+
? []
|
|
49
|
+
: [{
|
|
50
|
+
kind: 'notice',
|
|
51
|
+
tone: 'warn',
|
|
52
|
+
text: `Denied (${event.source})${event.reason ? `: ${event.reason}` : ''}`,
|
|
53
|
+
}];
|
|
54
|
+
case 'user_input_response':
|
|
55
|
+
return [{
|
|
56
|
+
kind: 'notice',
|
|
57
|
+
tone: 'info',
|
|
58
|
+
text: `Answered: ${event.response.answers.map(answer => `${answer.questionId} = ${answer.value}`).join(' · ')}`,
|
|
59
|
+
}];
|
|
60
|
+
case 'verification':
|
|
61
|
+
return [{ kind: 'verification', passed: event.passed, notes: event.notes }];
|
|
62
|
+
case 'error':
|
|
63
|
+
return [{ kind: 'notice', tone: 'error', text: `Error [${event.code}]: ${event.message}` }];
|
|
64
|
+
case 'done':
|
|
65
|
+
// The completion line (with timing/tokens) is emitted by the App once the
|
|
66
|
+
// run's wall-clock and usage are known, so nothing is added here.
|
|
67
|
+
return [];
|
|
68
|
+
case 'status':
|
|
69
|
+
case 'step':
|
|
70
|
+
case 'approval_request':
|
|
71
|
+
case 'user_input_request':
|
|
72
|
+
return [];
|
|
73
|
+
default:
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=eventView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventView.js","sourceRoot":"","sources":["../../src/core/eventView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies a submitted input line into the three TUI primitives:
|
|
3
|
+
* - `/command [args]` → a deterministic, code-executed command (no model).
|
|
4
|
+
* - `$skill [args]` → invoke a model-backed skill (`$<name>` *is* the run).
|
|
5
|
+
* - plain text → talk to the agent (or chat in `/chat` mode).
|
|
6
|
+
*
|
|
7
|
+
* Pure and renderer-agnostic so it can be unit-tested without Ink.
|
|
8
|
+
*/
|
|
9
|
+
export type ParsedInput = {
|
|
10
|
+
kind: 'empty';
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'text';
|
|
13
|
+
text: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'command';
|
|
16
|
+
name: string;
|
|
17
|
+
args: string;
|
|
18
|
+
argv: string[];
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'skill';
|
|
21
|
+
name: string;
|
|
22
|
+
args: string;
|
|
23
|
+
argv: string[];
|
|
24
|
+
};
|
|
25
|
+
/** Split an argument string into whitespace-separated tokens, honoring
|
|
26
|
+
* single/double quotes so `$translate "good morning" ja` parses cleanly. */
|
|
27
|
+
export declare function tokenizeArgs(args: string): string[];
|
|
28
|
+
export declare function parseInput(raw: string): ParsedInput;
|
|
29
|
+
//# sourceMappingURL=inputGrammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputGrammar.d.ts","sourceRoot":"","sources":["../../src/core/inputGrammar.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAElE;4EAC4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiBnD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Split an argument string into whitespace-separated tokens, honoring
|
|
2
|
+
* single/double quotes so `$translate "good morning" ja` parses cleanly. */
|
|
3
|
+
export function tokenizeArgs(args) {
|
|
4
|
+
const tokens = [];
|
|
5
|
+
const pattern = /"([^"]*)"|'([^']*)'|(\S+)/g;
|
|
6
|
+
let match;
|
|
7
|
+
while ((match = pattern.exec(args)) !== null) {
|
|
8
|
+
tokens.push(match[1] ?? match[2] ?? match[3] ?? '');
|
|
9
|
+
}
|
|
10
|
+
return tokens;
|
|
11
|
+
}
|
|
12
|
+
export function parseInput(raw) {
|
|
13
|
+
const trimmed = raw.trim();
|
|
14
|
+
if (trimmed.length === 0)
|
|
15
|
+
return { kind: 'empty' };
|
|
16
|
+
const prefix = trimmed[0];
|
|
17
|
+
if (prefix === '/' || prefix === '$') {
|
|
18
|
+
// Strip the sigil, then split the head token from the remainder.
|
|
19
|
+
const body = trimmed.slice(1);
|
|
20
|
+
const headMatch = body.match(/^(\S+)\s*([\s\S]*)$/);
|
|
21
|
+
const name = (headMatch?.[1] ?? '').toLowerCase();
|
|
22
|
+
const args = headMatch?.[2] ?? '';
|
|
23
|
+
if (name.length === 0)
|
|
24
|
+
return { kind: 'text', text: trimmed };
|
|
25
|
+
const kind = prefix === '/' ? 'command' : 'skill';
|
|
26
|
+
return { kind, name, args, argv: tokenizeArgs(args) };
|
|
27
|
+
}
|
|
28
|
+
return { kind: 'text', text: trimmed };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=inputGrammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputGrammar.js","sourceRoot":"","sources":["../../src/core/inputGrammar.ts"],"names":[],"mappings":"AAcA;4EAC4E;AAC5E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,4BAA4B,CAAC;IAC7C,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,iEAAiE;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptWindow.d.ts","sourceRoot":"","sources":["../../src/core/transcriptWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC/D,gBAAgB,CA4BlB;AAED;2EAC2E;AAC3E,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptWindow.js","sourceRoot":"","sources":["../../src/core/transcriptWindow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/runTui.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LoadedMarifoldConfig } from '@marifold/core';
|
|
2
|
+
export interface RunTuiOptions {
|
|
3
|
+
loadedConfig: LoadedMarifoldConfig;
|
|
4
|
+
/** Profile to launch with; defaults to the configured default profile. */
|
|
5
|
+
profile?: string;
|
|
6
|
+
/** Resume a session: `true` continues the most recent session for the
|
|
7
|
+
* resolved profile; a string continues that specific session id. The prior
|
|
8
|
+
* turns are replayed into the transcript and the next message continues the
|
|
9
|
+
* session's context. */
|
|
10
|
+
resume?: string | boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Launch the Ink TUI. Falls back with a hint when stdout is not a TTY (piped
|
|
14
|
+
* or non-interactive), so `marifold | cat` never tries to drive Ink. When no
|
|
15
|
+
* profile resolves a provider/model, shows a profile picker before launching.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runTui(options: RunTuiOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=runTui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runTui.d.ts","sourceRoot":"","sources":["../src/runTui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAA4C,MAAM,gBAAgB,CAAC;AAgBrG,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,oBAAoB,CAAC;IACnC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;4BAGwB;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGlE"}
|
package/dist/runTui.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { Box, render, Text } from 'ink';
|
|
4
|
+
import { MarifoldRuntime } from '@marifold/core';
|
|
5
|
+
import { App } from './ui/App.js';
|
|
6
|
+
import { SelectList } from './ui/SelectList.js';
|
|
7
|
+
/** This package's version, read from its own package.json at runtime so the
|
|
8
|
+
* header banner never drifts from the published version. */
|
|
9
|
+
function readVersion() {
|
|
10
|
+
try {
|
|
11
|
+
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
12
|
+
return typeof pkg.version === 'string' ? pkg.version : '0.0.0';
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return '0.0.0';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Launch the Ink TUI. Falls back with a hint when stdout is not a TTY (piped
|
|
20
|
+
* or non-interactive), so `marifold | cat` never tries to drive Ink. When no
|
|
21
|
+
* profile resolves a provider/model, shows a profile picker before launching.
|
|
22
|
+
*/
|
|
23
|
+
export async function runTui(options) {
|
|
24
|
+
if (!process.stdout.isTTY) {
|
|
25
|
+
process.stderr.write('The marifold TUI needs an interactive terminal. Use `marifold chat` or `marifold agent "<objective>"` for non-interactive use.\n');
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Not initialized yet: no config file. Show one clear hint instead of a
|
|
30
|
+
// pointless profile picker that can't resolve a provider/model anyway.
|
|
31
|
+
if (!options.loadedConfig.foundConfig) {
|
|
32
|
+
process.stderr.write('Marifold is not initialized yet. Run `marifold init` to get started.\n');
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const runtime = new MarifoldRuntime({ loadedConfig: options.loadedConfig });
|
|
37
|
+
try {
|
|
38
|
+
let profile = options.profile;
|
|
39
|
+
let settings = tryResolve(runtime, profile);
|
|
40
|
+
// No resolvable default and no explicit profile: let the user pick one.
|
|
41
|
+
if (!settings && !profile) {
|
|
42
|
+
const profiles = runtime.listProfiles();
|
|
43
|
+
if (profiles.length > 0) {
|
|
44
|
+
profile = await selectProfile(profiles, options.loadedConfig.config.default.profile);
|
|
45
|
+
settings = tryResolve(runtime, profile);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!settings) {
|
|
49
|
+
process.stderr.write('Provider and model are not configured. Run `marifold init` and `marifold model add` first.\n');
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Resolve `--resume` to a concrete session before launch. A bare flag picks
|
|
54
|
+
// the most recent session for the resolved profile; an explicit id is looked
|
|
55
|
+
// up directly so a typo starts fresh with a clear message instead of
|
|
56
|
+
// silently creating an orphan session under the bad id. When a session is
|
|
57
|
+
// found, its turns seed the transcript so the prior conversation is shown.
|
|
58
|
+
let resumeSessionId;
|
|
59
|
+
let resumeTranscript;
|
|
60
|
+
if (options.resume !== undefined) {
|
|
61
|
+
const id = typeof options.resume === 'string'
|
|
62
|
+
? options.resume
|
|
63
|
+
: runtime.listSessions(1, settings.profile, { order: 'recent' })[0]?.id;
|
|
64
|
+
const detail = id ? runtime.getSession(id) : undefined;
|
|
65
|
+
if (detail) {
|
|
66
|
+
resumeSessionId = detail.id;
|
|
67
|
+
resumeTranscript = detail.turns.map(turn => ({ kind: turn.role, text: turn.content }));
|
|
68
|
+
}
|
|
69
|
+
else if (typeof options.resume === 'string') {
|
|
70
|
+
process.stderr.write(`Session not found: ${options.resume}. Starting a new session.\n`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
process.stderr.write(`No previous session for profile "${settings.profile}". Starting a new session.\n`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const initial = {
|
|
77
|
+
profile: settings.profile,
|
|
78
|
+
displayName: runtime.getProfile(settings.profile).displayName,
|
|
79
|
+
provider: settings.provider,
|
|
80
|
+
model: settings.model,
|
|
81
|
+
think: settings.think,
|
|
82
|
+
mode: settings.mode,
|
|
83
|
+
cwd: process.cwd(),
|
|
84
|
+
version: readVersion(),
|
|
85
|
+
maxContextTokens: settings.maxContextTokens ?? options.loadedConfig.config.default.maxContextTokens,
|
|
86
|
+
...(resumeSessionId ? { sessionId: resumeSessionId } : {}),
|
|
87
|
+
...(resumeTranscript ? { transcript: resumeTranscript } : {}),
|
|
88
|
+
};
|
|
89
|
+
// Render inline (like Claude Code / Codex), not in the alternate screen: the
|
|
90
|
+
// banner and transcript live in the terminal's native scrollback, so the
|
|
91
|
+
// conversation stays scrollable, copyable, and survives after exit — and the
|
|
92
|
+
// CLI never takes over the whole terminal. Ink 7 clears its live region on
|
|
93
|
+
// width-decrease (its `resized` handler), so the input area doesn't duplicate
|
|
94
|
+
// on shrink; committed history is left to the terminal's own reflow.
|
|
95
|
+
//
|
|
96
|
+
// Enable bracketed paste so dropped/pasted file paths arrive as one buffered
|
|
97
|
+
// event (Ink coalesces them) instead of fragmented keystrokes — otherwise a
|
|
98
|
+
// long dropped path lands as loose text instead of an `[image #n]` token.
|
|
99
|
+
process.stdout.write('\x1b[?2004h');
|
|
100
|
+
try {
|
|
101
|
+
const app = render(_jsx(App, { runtime: runtime, loadedConfig: options.loadedConfig, initial: initial }), { exitOnCtrlC: false });
|
|
102
|
+
await app.waitUntilExit();
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
process.stdout.write('\x1b[?2004l');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
runtime.close();
|
|
110
|
+
}
|
|
111
|
+
// Force the process to exit. On a programmatic exit (`/exit`, double Ctrl+C),
|
|
112
|
+
// Ink unmounts the React tree but leaves handles ref'd that keep the Node
|
|
113
|
+
// event loop alive — confirmed via getActiveResourcesInfo() to be the stdin
|
|
114
|
+
// TTY (Ink reads it in raw mode) plus a Timeout/Immediate from Ink's output
|
|
115
|
+
// throttle and React's scheduler. None of those are ours to cancel, so without
|
|
116
|
+
// this the CLI hangs instead of returning to the shell. Terminal teardown and
|
|
117
|
+
// runtime.close() have already run above, so exiting here is safe.
|
|
118
|
+
process.exit(process.exitCode ?? 0);
|
|
119
|
+
}
|
|
120
|
+
function tryResolve(runtime, profile) {
|
|
121
|
+
try {
|
|
122
|
+
return runtime.resolveSettings(profile ? { profile } : {});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Render a one-shot Ink picker and resolve to the chosen profile name. */
|
|
129
|
+
function selectProfile(profiles, defaultProfile) {
|
|
130
|
+
return new Promise(resolve => {
|
|
131
|
+
let settled = false;
|
|
132
|
+
const items = profiles.map(profile => ({
|
|
133
|
+
label: profile.name === defaultProfile ? `${profile.name} (default)` : profile.name,
|
|
134
|
+
value: profile.name,
|
|
135
|
+
}));
|
|
136
|
+
const finish = (value) => {
|
|
137
|
+
if (settled)
|
|
138
|
+
return;
|
|
139
|
+
settled = true;
|
|
140
|
+
instance.unmount();
|
|
141
|
+
resolve(value);
|
|
142
|
+
};
|
|
143
|
+
const instance = render(_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", children: "Select a profile to launch:" }), _jsx(SelectList, { title: "Profiles", items: items, onSelect: finish, onCancel: () => finish(defaultProfile) })] }), { exitOnCtrlC: false });
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=runTui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runTui.js","sourceRoot":"","sources":["../src/runTui.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/App.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { LoadedMarifoldConfig, MarifoldRuntime } from '@marifold/core';
|
|
3
|
+
import { type Mode, type TranscriptItemData } from '../core/appState.js';
|
|
4
|
+
export interface AppProps {
|
|
5
|
+
runtime: MarifoldRuntime;
|
|
6
|
+
loadedConfig: LoadedMarifoldConfig;
|
|
7
|
+
initial: {
|
|
8
|
+
profile: string;
|
|
9
|
+
displayName?: string;
|
|
10
|
+
provider: string;
|
|
11
|
+
model: string;
|
|
12
|
+
think: boolean;
|
|
13
|
+
mode?: Mode;
|
|
14
|
+
cwd: string;
|
|
15
|
+
version: string;
|
|
16
|
+
latestVersion?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
maxContextTokens?: number;
|
|
19
|
+
transcript?: TranscriptItemData[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare function App({ runtime, loadedConfig, initial }: AppProps): React.ReactElement;
|
|
23
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwE,MAAM,OAAO,CAAC;AAU7F,OAAO,KAAK,EAKV,oBAAoB,EACpB,eAAe,EAMhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkC,KAAK,IAAI,EAAwC,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAkB/I,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,oBAAoB,CAAC;IACnC,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;KACnC,CAAC;CACH;AAcD,wBAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,YAAY,CAs/BpF"}
|