@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.
Files changed (104) hide show
  1. package/LICENSE +674 -0
  2. package/dist/core/appState.d.ts +158 -0
  3. package/dist/core/appState.d.ts.map +1 -0
  4. package/dist/core/appState.js +167 -0
  5. package/dist/core/appState.js.map +1 -0
  6. package/dist/core/commands.d.ts +70 -0
  7. package/dist/core/commands.d.ts.map +1 -0
  8. package/dist/core/commands.js +227 -0
  9. package/dist/core/commands.js.map +1 -0
  10. package/dist/core/displayPaths.d.ts +5 -0
  11. package/dist/core/displayPaths.d.ts.map +1 -0
  12. package/dist/core/displayPaths.js +14 -0
  13. package/dist/core/displayPaths.js.map +1 -0
  14. package/dist/core/eventView.d.ts +10 -0
  15. package/dist/core/eventView.d.ts.map +1 -0
  16. package/dist/core/eventView.js +77 -0
  17. package/dist/core/eventView.js.map +1 -0
  18. package/dist/core/inputGrammar.d.ts +29 -0
  19. package/dist/core/inputGrammar.d.ts.map +1 -0
  20. package/dist/core/inputGrammar.js +30 -0
  21. package/dist/core/inputGrammar.js.map +1 -0
  22. package/dist/core/skills.d.ts +2 -0
  23. package/dist/core/skills.d.ts.map +1 -0
  24. package/dist/core/skills.js +2 -0
  25. package/dist/core/skills.js.map +1 -0
  26. package/dist/core/transcriptWindow.d.ts.map +1 -0
  27. package/dist/core/transcriptWindow.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/runTui.d.ts +18 -0
  33. package/dist/runTui.d.ts.map +1 -0
  34. package/dist/runTui.js +146 -0
  35. package/dist/runTui.js.map +1 -0
  36. package/dist/ui/App.d.ts +23 -0
  37. package/dist/ui/App.d.ts.map +1 -0
  38. package/dist/ui/App.js +991 -0
  39. package/dist/ui/App.js.map +1 -0
  40. package/dist/ui/ApprovalModal.d.ts +12 -0
  41. package/dist/ui/ApprovalModal.d.ts.map +1 -0
  42. package/dist/ui/ApprovalModal.js +62 -0
  43. package/dist/ui/ApprovalModal.js.map +1 -0
  44. package/dist/ui/Header.d.ts +12 -0
  45. package/dist/ui/Header.d.ts.map +1 -0
  46. package/dist/ui/Header.js +15 -0
  47. package/dist/ui/Header.js.map +1 -0
  48. package/dist/ui/InfoPanel.d.ts +11 -0
  49. package/dist/ui/InfoPanel.d.ts.map +1 -0
  50. package/dist/ui/InfoPanel.js +16 -0
  51. package/dist/ui/InfoPanel.js.map +1 -0
  52. package/dist/ui/InputBox.d.ts +31 -0
  53. package/dist/ui/InputBox.d.ts.map +1 -0
  54. package/dist/ui/InputBox.js +410 -0
  55. package/dist/ui/InputBox.js.map +1 -0
  56. package/dist/ui/Markdown.d.ts +12 -0
  57. package/dist/ui/Markdown.d.ts.map +1 -0
  58. package/dist/ui/Markdown.js +111 -0
  59. package/dist/ui/Markdown.js.map +1 -0
  60. package/dist/ui/QuestionModal.d.ts +11 -0
  61. package/dist/ui/QuestionModal.d.ts.map +1 -0
  62. package/dist/ui/QuestionModal.js +211 -0
  63. package/dist/ui/QuestionModal.js.map +1 -0
  64. package/dist/ui/RunStatus.d.ts +17 -0
  65. package/dist/ui/RunStatus.d.ts.map +1 -0
  66. package/dist/ui/RunStatus.js +46 -0
  67. package/dist/ui/RunStatus.js.map +1 -0
  68. package/dist/ui/SelectList.d.ts +18 -0
  69. package/dist/ui/SelectList.d.ts.map +1 -0
  70. package/dist/ui/SelectList.js +54 -0
  71. package/dist/ui/SelectList.js.map +1 -0
  72. package/dist/ui/Spinner.d.ts +6 -0
  73. package/dist/ui/Spinner.d.ts.map +1 -0
  74. package/dist/ui/Spinner.js +14 -0
  75. package/dist/ui/Spinner.js.map +1 -0
  76. package/dist/ui/StatusLine.d.ts +6 -0
  77. package/dist/ui/StatusLine.d.ts.map +1 -0
  78. package/dist/ui/StatusLine.js +32 -0
  79. package/dist/ui/StatusLine.js.map +1 -0
  80. package/dist/ui/Transcript.d.ts +17 -0
  81. package/dist/ui/Transcript.d.ts.map +1 -0
  82. package/dist/ui/Transcript.js +58 -0
  83. package/dist/ui/Transcript.js.map +1 -0
  84. package/dist/ui/appHelpers.d.ts +16 -0
  85. package/dist/ui/appHelpers.d.ts.map +1 -0
  86. package/dist/ui/appHelpers.js +59 -0
  87. package/dist/ui/appHelpers.js.map +1 -0
  88. package/dist/ui/text.d.ts +7 -0
  89. package/dist/ui/text.d.ts.map +1 -0
  90. package/dist/ui/text.js +16 -0
  91. package/dist/ui/text.js.map +1 -0
  92. package/dist/ui/theme.d.ts +12 -0
  93. package/dist/ui/theme.d.ts.map +1 -0
  94. package/dist/ui/theme.js +12 -0
  95. package/dist/ui/theme.js.map +1 -0
  96. package/dist/ui/useResizing.d.ts +14 -0
  97. package/dist/ui/useResizing.d.ts.map +1 -0
  98. package/dist/ui/useResizing.js +37 -0
  99. package/dist/ui/useResizing.js.map +1 -0
  100. package/dist/ui/useTerminalSize.d.ts +8 -0
  101. package/dist/ui/useTerminalSize.d.ts.map +1 -0
  102. package/dist/ui/useTerminalSize.js +23 -0
  103. package/dist/ui/useTerminalSize.js.map +1 -0
  104. package/package.json +32 -0
@@ -0,0 +1,158 @@
1
+ import type { AgentEvent, AgentToolKind, ApprovalRequest, UserInputRequest } from '@marifold/core';
2
+ export type Mode = 'agent' | 'chat';
3
+ export type NoticeTone = 'info' | 'warn' | 'error';
4
+ /** A renderable transcript entry without its assigned id. */
5
+ export type TranscriptItemData = {
6
+ kind: 'user';
7
+ text: string;
8
+ } | {
9
+ kind: 'assistant';
10
+ text: string;
11
+ muted?: boolean;
12
+ } | {
13
+ kind: 'notice';
14
+ tone: NoticeTone;
15
+ text: string;
16
+ } | {
17
+ kind: 'plan';
18
+ steps: Array<{
19
+ id: string;
20
+ text: string;
21
+ status: string;
22
+ }>;
23
+ } | {
24
+ kind: 'tool';
25
+ tool: string;
26
+ toolKind?: AgentToolKind;
27
+ summary: string;
28
+ phase: 'request' | 'result';
29
+ isError?: boolean;
30
+ callId?: string;
31
+ } | {
32
+ kind: 'verification';
33
+ passed: boolean;
34
+ notes: string;
35
+ } | {
36
+ kind: 'info';
37
+ title: string;
38
+ lines: string[];
39
+ };
40
+ export type TranscriptItem = TranscriptItemData & {
41
+ id: string;
42
+ };
43
+ export interface AppState {
44
+ profile: string;
45
+ displayName: string;
46
+ provider: string;
47
+ model: string;
48
+ mode: Mode;
49
+ cwd: string;
50
+ /** This build's version, shown in the header banner. */
51
+ version: string;
52
+ /** A known newer version; drives the header's update notice when set. */
53
+ latestVersion?: string;
54
+ sessionId?: string;
55
+ /** Conversation-context budget in tokens for the active profile (undefined = compaction off). */
56
+ maxContextTokens?: number;
57
+ /** Input tokens the last turn sent — drives the context gauge. */
58
+ contextTokens?: number;
59
+ transcript: TranscriptItem[];
60
+ running: boolean;
61
+ /** Pending approval request; non-undefined drives the approval modal. */
62
+ approval?: ApprovalRequest;
63
+ /** Pending clarification questions; non-undefined drives QuestionModal. */
64
+ userInput?: UserInputRequest;
65
+ /** Short status-line activity label, e.g. "thinking" or "shell". */
66
+ activity?: string;
67
+ /** True while an assistant item is open and accepting streamed deltas. */
68
+ streamingAssistant: boolean;
69
+ exiting: boolean;
70
+ seq: number;
71
+ }
72
+ export interface InitialAppState {
73
+ profile: string;
74
+ displayName?: string;
75
+ provider: string;
76
+ model: string;
77
+ cwd: string;
78
+ version: string;
79
+ latestVersion?: string;
80
+ mode?: Mode;
81
+ sessionId?: string;
82
+ /** Conversation-context budget in tokens for the launch profile (undefined = off). */
83
+ maxContextTokens?: number;
84
+ /** Pre-existing transcript to seed (e.g. a resumed session's turns). */
85
+ transcript?: TranscriptItemData[];
86
+ }
87
+ export declare function createInitialState(init: InitialAppState): AppState;
88
+ export type AppAction = {
89
+ type: 'set_mode';
90
+ mode: Mode;
91
+ } | {
92
+ type: 'set_model';
93
+ provider: string;
94
+ model: string;
95
+ } | {
96
+ type: 'set_profile';
97
+ profile: string;
98
+ displayName?: string;
99
+ provider: string;
100
+ model: string;
101
+ maxContextTokens?: number;
102
+ } | {
103
+ type: 'add_user';
104
+ text: string;
105
+ } | {
106
+ type: 'add_item';
107
+ item: TranscriptItemData;
108
+ } | {
109
+ type: 'reasoning_delta';
110
+ text: string;
111
+ } | {
112
+ type: 'assistant_delta';
113
+ text: string;
114
+ } | {
115
+ type: 'end_assistant';
116
+ } | {
117
+ type: 'set_running';
118
+ running: boolean;
119
+ } | {
120
+ type: 'set_activity';
121
+ activity?: string;
122
+ } | {
123
+ type: 'set_approval';
124
+ request?: ApprovalRequest;
125
+ } | {
126
+ type: 'set_user_input';
127
+ request?: UserInputRequest;
128
+ } | {
129
+ type: 'agent_event';
130
+ event: AgentEvent;
131
+ } | {
132
+ type: 'notice';
133
+ tone?: NoticeTone;
134
+ text: string;
135
+ } | {
136
+ type: 'clear';
137
+ } | {
138
+ type: 'new_session';
139
+ sessionId?: string;
140
+ } | {
141
+ type: 'set_session';
142
+ sessionId?: string;
143
+ } | {
144
+ type: 'set_context_usage';
145
+ tokens?: number;
146
+ } | {
147
+ type: 'set_context_budget';
148
+ maxContextTokens?: number;
149
+ } | {
150
+ type: 'exit';
151
+ };
152
+ /**
153
+ * Pure reducer over the whole TUI state. All transcript mutation, streaming,
154
+ * approval, and run lifecycle flows through here so behavior is unit-testable
155
+ * without rendering Ink. Components only dispatch and read.
156
+ */
157
+ export declare function appReducer(state: AppState, action: AppAction): AppState;
158
+ //# sourceMappingURL=appState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appState.d.ts","sourceRoot":"","sources":["../../src/core/appState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import { agentEventToItems } from './eventView.js';
2
+ export function createInitialState(init) {
3
+ // Seed any provided history with the same `item_${seq}` id scheme the reducer
4
+ // uses, and start `seq` past it so later items continue the sequence.
5
+ const seeded = (init.transcript ?? []).map((item, index) => ({ ...item, id: `item_${index + 1}` }));
6
+ return {
7
+ profile: init.profile,
8
+ displayName: init.displayName ?? init.profile,
9
+ provider: init.provider,
10
+ model: init.model,
11
+ mode: init.mode ?? 'agent',
12
+ cwd: init.cwd,
13
+ version: init.version,
14
+ ...(init.latestVersion ? { latestVersion: init.latestVersion } : {}),
15
+ ...(init.sessionId ? { sessionId: init.sessionId } : {}),
16
+ ...(init.maxContextTokens != null ? { maxContextTokens: init.maxContextTokens } : {}),
17
+ transcript: seeded,
18
+ running: false,
19
+ streamingAssistant: false,
20
+ exiting: false,
21
+ seq: seeded.length,
22
+ };
23
+ }
24
+ function withItem(state, item) {
25
+ const seq = state.seq + 1;
26
+ return { ...state, seq, transcript: [...state.transcript, { ...item, id: `item_${seq}` }] };
27
+ }
28
+ function withItems(state, items) {
29
+ return items.reduce(withItem, state);
30
+ }
31
+ /**
32
+ * Pure reducer over the whole TUI state. All transcript mutation, streaming,
33
+ * approval, and run lifecycle flows through here so behavior is unit-testable
34
+ * without rendering Ink. Components only dispatch and read.
35
+ */
36
+ export function appReducer(state, action) {
37
+ switch (action.type) {
38
+ case 'set_mode':
39
+ return { ...state, mode: action.mode };
40
+ case 'set_model':
41
+ return { ...state, provider: action.provider, model: action.model };
42
+ case 'set_profile':
43
+ return {
44
+ ...state,
45
+ profile: action.profile,
46
+ displayName: action.displayName ?? action.profile,
47
+ provider: action.provider,
48
+ model: action.model,
49
+ maxContextTokens: action.maxContextTokens,
50
+ contextTokens: undefined,
51
+ };
52
+ case 'add_user':
53
+ return withItem(state, { kind: 'user', text: action.text });
54
+ case 'add_item':
55
+ return withItem(state, action.item);
56
+ case 'reasoning_delta': {
57
+ const transcript = [...state.transcript];
58
+ const last = transcript[transcript.length - 1];
59
+ if (!state.streamingAssistant && last?.kind === 'assistant' && last.muted) {
60
+ transcript[transcript.length - 1] = { ...last, text: last.text + action.text };
61
+ return { ...state, transcript };
62
+ }
63
+ return withItem(state, { kind: 'assistant', text: `Reasoning: ${action.text}`, muted: true });
64
+ }
65
+ case 'assistant_delta': {
66
+ // Append to the open assistant item, or open a new one.
67
+ if (state.streamingAssistant) {
68
+ const transcript = [...state.transcript];
69
+ const last = transcript[transcript.length - 1];
70
+ if (last && last.kind === 'assistant') {
71
+ transcript[transcript.length - 1] = { ...last, text: last.text + action.text };
72
+ return { ...state, transcript };
73
+ }
74
+ }
75
+ const seq = state.seq + 1;
76
+ return {
77
+ ...state,
78
+ seq,
79
+ streamingAssistant: true,
80
+ transcript: [...state.transcript, { id: `item_${seq}`, kind: 'assistant', text: action.text }],
81
+ };
82
+ }
83
+ case 'end_assistant':
84
+ return { ...state, streamingAssistant: false };
85
+ case 'set_running':
86
+ return { ...state, running: action.running, ...(action.running ? {} : { activity: undefined }) };
87
+ case 'set_activity':
88
+ return { ...state, activity: action.activity };
89
+ case 'set_approval':
90
+ return { ...state, approval: action.request };
91
+ case 'set_user_input':
92
+ return { ...state, userInput: action.request };
93
+ case 'agent_event':
94
+ return applyAgentEvent(state, action.event);
95
+ case 'notice':
96
+ return withItem(state, { kind: 'notice', tone: action.tone ?? 'info', text: action.text });
97
+ case 'clear':
98
+ return { ...state, transcript: [], streamingAssistant: false };
99
+ case 'new_session':
100
+ return { ...state, transcript: [], streamingAssistant: false, sessionId: action.sessionId, contextTokens: undefined };
101
+ case 'set_session':
102
+ return { ...state, sessionId: action.sessionId };
103
+ case 'set_context_usage':
104
+ return { ...state, contextTokens: action.tokens };
105
+ case 'set_context_budget':
106
+ return { ...state, maxContextTokens: action.maxContextTokens };
107
+ case 'exit':
108
+ return { ...state, exiting: true };
109
+ default:
110
+ return state;
111
+ }
112
+ }
113
+ /** Fold a single AgentEvent into state: transcript items via eventView, plus
114
+ * the status-line / modal transitions the transcript itself doesn't show. */
115
+ function applyAgentEvent(state, event) {
116
+ // A tool result folds onto its own request row (matched by callId) so each
117
+ // tool call is one self-updating line — `→ read_file …` becomes `← read_file …`
118
+ // in place — instead of two rows with the path repeated.
119
+ if (event.type === 'tool_result') {
120
+ const transcript = [...state.transcript];
121
+ for (let i = transcript.length - 1; i >= 0; i -= 1) {
122
+ const item = transcript[i];
123
+ if (item.kind === 'tool' && item.callId === event.callId && item.phase === 'request') {
124
+ // New id so the App's append-only <Static> repaints this row in place
125
+ // (it only redraws on id changes), turning `→ …` into `← …` on one line.
126
+ transcript[i] = { ...item, id: `${item.id}~done`, phase: 'result', summary: event.summary, isError: event.isError };
127
+ return { ...state, streamingAssistant: false, transcript };
128
+ }
129
+ }
130
+ // No matching request found — fall back to appending a standalone result.
131
+ return withItems({ ...state, streamingAssistant: false }, agentEventToItems(event));
132
+ }
133
+ let next = withItems({ ...state, streamingAssistant: false }, agentEventToItems(event));
134
+ switch (event.type) {
135
+ case 'status':
136
+ next = { ...next, activity: event.status === 'running' ? 'thinking' : undefined };
137
+ break;
138
+ case 'tool_request':
139
+ next = { ...next, activity: event.call.tool };
140
+ break;
141
+ case 'text':
142
+ next = { ...next, activity: 'thinking' };
143
+ break;
144
+ case 'reasoning':
145
+ next = { ...next, activity: 'reasoning' };
146
+ break;
147
+ case 'approval_request':
148
+ next = { ...next, approval: event.request };
149
+ break;
150
+ case 'approval_decision':
151
+ next = { ...next, approval: undefined };
152
+ break;
153
+ case 'user_input_request':
154
+ next = { ...next, userInput: event.request, activity: 'waiting for your answers' };
155
+ break;
156
+ case 'user_input_response':
157
+ next = { ...next, userInput: undefined, activity: 'thinking' };
158
+ break;
159
+ case 'done':
160
+ next = { ...next, running: false, activity: undefined, approval: undefined, userInput: undefined };
161
+ break;
162
+ default:
163
+ break;
164
+ }
165
+ return next;
166
+ }
167
+ //# sourceMappingURL=appState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appState.js","sourceRoot":"","sources":["../../src/core/appState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { Mode, NoticeTone } from './appState.js';
2
+ /**
3
+ * Operations a `/command` can perform. The App implements this against the
4
+ * live runtime and dispatcher; tests pass a fake to assert dispatch. Commands
5
+ * are deterministic and never call the model — that is the design rule that
6
+ * separates `/command` (code) from `$skill` (model-backed).
7
+ */
8
+ export interface CommandContext {
9
+ notify(text: string, tone?: NoticeTone): void;
10
+ setMode(mode: Mode): void;
11
+ /** Persist `mode` as the current profile's default (profile.toml) and apply it now. */
12
+ setDefaultMode(mode: Mode): void;
13
+ newSession(): void;
14
+ clear(): void;
15
+ stop(): void;
16
+ steer(text: string): void;
17
+ exit(): void;
18
+ setThink(on: boolean): void;
19
+ openModelPicker(): void;
20
+ openProfilePicker(): void;
21
+ selectProfile(name: string): void;
22
+ openSkills(scope?: 'global' | 'profile'): void;
23
+ showPermissions(): void;
24
+ showHelp(): void;
25
+ showStatus(): void;
26
+ /** Arm a one-shot forced plan for the next message (toggles off if armed). */
27
+ toggleForcePlan(): void;
28
+ copyLast(): void;
29
+ /** Re-run the last plain-text message through the current profile/model/mode. */
30
+ retryLast(): void;
31
+ /** Send one prompt with attached images preserved byte-for-byte. */
32
+ sendOriginal(text: string): void;
33
+ showSessions(): void;
34
+ runDoctor(): void;
35
+ installSkill(arg: string): void;
36
+ readFile(path: string): void;
37
+ setImage(arg: string): void;
38
+ remember(text: string): void;
39
+ forget(query: string): void;
40
+ deleteMemory(query: string): void;
41
+ /** Show the current context budget + usage. */
42
+ showContextWindow(): void;
43
+ /** Set the context budget for this session (tokens), or 0/undefined to disable. */
44
+ setContextWindow(tokens?: number): void;
45
+ /** Persist the context budget as the current profile's default (profile.toml). */
46
+ setDefaultContextWindow(tokens?: number): void;
47
+ /** Compact the current session now (model-backed). */
48
+ compactNow(): void;
49
+ /** Trust a folder for the active profile — file writes there won't prompt. */
50
+ trustFolder(path: string): void;
51
+ }
52
+ export interface CommandSpec {
53
+ name: string;
54
+ /** Alternate invocations (e.g. quit → exit). */
55
+ aliases?: string[];
56
+ summary: string;
57
+ run(ctx: CommandContext, args: string): void;
58
+ }
59
+ export interface CommandCompletion {
60
+ name: string;
61
+ hint: string;
62
+ }
63
+ export declare function listCommands(): CommandSpec[];
64
+ /** Canonical command names plus discoverable aliases for the input menu. */
65
+ export declare function listCommandCompletions(): CommandCompletion[];
66
+ export declare function findCommand(name: string): CommandSpec | undefined;
67
+ /** Run a parsed command. Returns false when the name is unknown so the caller
68
+ * can surface a hint. */
69
+ export declare function runCommand(ctx: CommandContext, name: string, args: string): boolean;
70
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,uFAAuF;IACvF,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACjC,UAAU,IAAI,IAAI,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,eAAe,IAAI,IAAI,CAAC;IACxB,iBAAiB,IAAI,IAAI,CAAC;IAC1B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/C,eAAe,IAAI,IAAI,CAAC;IACxB,QAAQ,IAAI,IAAI,CAAC;IACjB,UAAU,IAAI,IAAI,CAAC;IACnB,8EAA8E;IAC9E,eAAe,IAAI,IAAI,CAAC;IACxB,QAAQ,IAAI,IAAI,CAAC;IACjB,iFAAiF;IACjF,SAAS,IAAI,IAAI,CAAC;IAClB,oEAAoE;IACpE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,IAAI,IAAI,CAAC;IACrB,SAAS,IAAI,IAAI,CAAC;IAClB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,+CAA+C;IAC/C,iBAAiB,IAAI,IAAI,CAAC;IAC1B,mFAAmF;IACnF,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,sDAAsD;IACtD,UAAU,IAAI,IAAI,CAAC;IACnB,8EAA8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AA8KD,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAE5C;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,iBAAiB,EAAE,CAQ5D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE;AAED;yBACyB;AACzB,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnF"}
@@ -0,0 +1,227 @@
1
+ const COMMANDS = [
2
+ { name: 'help', summary: 'List commands and input syntax.', run: ctx => ctx.showHelp() },
3
+ { name: 'status', summary: 'Show profile, mode, model, thinking, and session.', run: ctx => ctx.showStatus() },
4
+ { name: 'copy', summary: "Copy the last response's original text to the clipboard.", run: ctx => ctx.copyLast() },
5
+ { name: 'retry', aliases: ['regenerate'], summary: 'Re-run your last message (e.g. after /model to compare).', run: ctx => ctx.retryLast() },
6
+ {
7
+ name: 'attach-original',
8
+ summary: 'Send attached images unchanged for this message: /attach-original <prompt>.',
9
+ run: (ctx, args) => {
10
+ const text = args.trim();
11
+ if (!text)
12
+ ctx.notify('Usage: /attach-original <prompt>', 'warn');
13
+ else
14
+ ctx.sendOriginal(text);
15
+ },
16
+ },
17
+ { name: 'exit', aliases: ['quit'], summary: 'Leave the TUI.', run: ctx => ctx.exit() },
18
+ { name: 'new', summary: 'Start a fresh session (clear transcript).', run: ctx => ctx.newSession() },
19
+ {
20
+ name: 'agent',
21
+ summary: 'Agent mode: /agent (this session) or /agent default (save to profile).',
22
+ run: (ctx, args) => (args.trim() === 'default' ? ctx.setDefaultMode('agent') : ctx.setMode('agent')),
23
+ },
24
+ {
25
+ name: 'chat',
26
+ summary: 'Chat mode: /chat (this session) or /chat default (save to profile).',
27
+ run: (ctx, args) => (args.trim() === 'default' ? ctx.setDefaultMode('chat') : ctx.setMode('chat')),
28
+ },
29
+ { name: 'clear', summary: 'Clear the transcript.', run: ctx => ctx.clear() },
30
+ { name: 'steps', summary: 'Force a step-by-step plan on your next message (one-shot).', run: ctx => ctx.toggleForcePlan() },
31
+ { name: 'stop', summary: 'Cancel the running task.', run: ctx => ctx.stop() },
32
+ {
33
+ name: 'btw',
34
+ summary: 'Steer the running task without cancelling it: /btw <text>.',
35
+ run: (ctx, args) => {
36
+ const text = args.trim();
37
+ if (!text)
38
+ ctx.notify('Usage: /btw <text>', 'warn');
39
+ else
40
+ ctx.steer(text);
41
+ },
42
+ },
43
+ { name: 'model', summary: 'Pick the active model.', run: ctx => ctx.openModelPicker() },
44
+ {
45
+ name: 'profile',
46
+ summary: 'Switch profile: /profile [name] (omit name for a picker).',
47
+ run: (ctx, args) => {
48
+ const name = args.trim();
49
+ if (name)
50
+ ctx.selectProfile(name);
51
+ else
52
+ ctx.openProfilePicker();
53
+ },
54
+ },
55
+ {
56
+ name: 'resume',
57
+ aliases: ['session'],
58
+ summary: 'Resume a recent session from an interactive picker.',
59
+ run: ctx => ctx.showSessions(),
60
+ },
61
+ {
62
+ name: 'think',
63
+ summary: 'Toggle thinking: /think on|off.',
64
+ run: (ctx, args) => {
65
+ const value = args.trim().toLowerCase();
66
+ if (value === 'on')
67
+ ctx.setThink(true);
68
+ else if (value === 'off')
69
+ ctx.setThink(false);
70
+ else
71
+ ctx.notify('Usage: /think on|off', 'warn');
72
+ },
73
+ },
74
+ { name: 'permissions', summary: 'Show approval modes and active session grants.', run: ctx => ctx.showPermissions() },
75
+ {
76
+ name: 'trust-folder',
77
+ summary: 'Trust a folder for this profile: /trust-folder <path> (writes there stop asking).',
78
+ run: (ctx, args) => {
79
+ const target = args.trim();
80
+ if (!target)
81
+ ctx.notify('Usage: /trust-folder <path>', 'warn');
82
+ else
83
+ ctx.trustFolder(target);
84
+ },
85
+ },
86
+ {
87
+ name: 'skills',
88
+ summary: 'Manage skills: /skills (this profile) or /skills --global.',
89
+ run: (ctx, args) => ctx.openSkills(args.trim() === '--global' ? 'global' : 'profile'),
90
+ },
91
+ {
92
+ name: 'install-skill',
93
+ summary: 'Install a skill: /install-skill [--global] <path|url>.',
94
+ run: (ctx, args) => {
95
+ const arg = args.trim();
96
+ if (!arg)
97
+ ctx.notify('Usage: /install-skill <path>', 'warn');
98
+ else
99
+ ctx.installSkill(arg);
100
+ },
101
+ },
102
+ { name: 'doctor', summary: 'Check provider/model health.', run: ctx => ctx.runDoctor() },
103
+ {
104
+ name: 'read',
105
+ summary: 'Read a file into context: /read <path>.',
106
+ run: (ctx, args) => {
107
+ const file = args.trim();
108
+ if (!file)
109
+ ctx.notify('Usage: /read <path>', 'warn');
110
+ else
111
+ ctx.readFile(file);
112
+ },
113
+ },
114
+ {
115
+ name: 'image',
116
+ summary: 'Attach an image: /image <path> | /image clear.',
117
+ run: (ctx, args) => ctx.setImage(args.trim()),
118
+ },
119
+ {
120
+ name: 'remember',
121
+ summary: 'Save a memory: /remember <text>.',
122
+ run: (ctx, args) => {
123
+ const text = args.trim();
124
+ if (!text)
125
+ ctx.notify('Usage: /remember <text>', 'warn');
126
+ else
127
+ ctx.remember(text);
128
+ },
129
+ },
130
+ {
131
+ name: 'forget',
132
+ summary: 'Forget matching memories: /forget <query>.',
133
+ run: (ctx, args) => {
134
+ const query = args.trim();
135
+ if (!query)
136
+ ctx.notify('Usage: /forget <query>', 'warn');
137
+ else
138
+ ctx.forget(query);
139
+ },
140
+ },
141
+ {
142
+ name: 'delete-memory',
143
+ summary: 'Delete matching memories: /delete-memory <query>.',
144
+ run: (ctx, args) => {
145
+ const query = args.trim();
146
+ if (!query)
147
+ ctx.notify('Usage: /delete-memory <query>', 'warn');
148
+ else
149
+ ctx.deleteMemory(query);
150
+ },
151
+ },
152
+ {
153
+ name: 'context-window',
154
+ aliases: ['ctx'],
155
+ summary: 'Context budget: /context-window, set <tokens|off> [default].',
156
+ run: (ctx, args) => {
157
+ const parts = args.trim().split(/\s+/).filter(Boolean);
158
+ if (parts.length === 0) {
159
+ ctx.showContextWindow();
160
+ return;
161
+ }
162
+ if (parts[0].toLowerCase() !== 'set') {
163
+ ctx.notify('Usage: /context-window [set <tokens|off> [default]]', 'warn');
164
+ return;
165
+ }
166
+ const toDefault = parts[2]?.toLowerCase() === 'default';
167
+ const raw = (parts[1] ?? '').toLowerCase();
168
+ if (raw === 'off') {
169
+ if (toDefault)
170
+ ctx.setDefaultContextWindow(undefined);
171
+ else
172
+ ctx.setContextWindow(undefined);
173
+ return;
174
+ }
175
+ const tokens = parseTokens(raw);
176
+ if (tokens == null) {
177
+ ctx.notify('Usage: /context-window set <tokens|off> [default] (e.g. 16000 or 16k)', 'warn');
178
+ return;
179
+ }
180
+ if (toDefault)
181
+ ctx.setDefaultContextWindow(tokens);
182
+ else
183
+ ctx.setContextWindow(tokens);
184
+ },
185
+ },
186
+ { name: 'compact', summary: 'Compact the current session now (summarize older turns).', run: ctx => ctx.compactNow() },
187
+ ];
188
+ /** Parse a token count: "16000" or "16k"/"16K" → 16000. Returns undefined when invalid. */
189
+ function parseTokens(raw) {
190
+ const match = /^(\d+(?:\.\d+)?)(k)?$/i.exec(raw);
191
+ if (!match)
192
+ return undefined;
193
+ const value = Number(match[1]) * (match[2] ? 1000 : 1);
194
+ return Number.isFinite(value) && value > 0 ? Math.round(value) : undefined;
195
+ }
196
+ const REGISTRY = new Map();
197
+ for (const spec of COMMANDS) {
198
+ REGISTRY.set(spec.name, spec);
199
+ for (const alias of spec.aliases ?? [])
200
+ REGISTRY.set(alias, spec);
201
+ }
202
+ export function listCommands() {
203
+ return COMMANDS;
204
+ }
205
+ /** Canonical command names plus discoverable aliases for the input menu. */
206
+ export function listCommandCompletions() {
207
+ return COMMANDS.flatMap(spec => [
208
+ { name: spec.name, hint: spec.summary },
209
+ ...(spec.aliases ?? []).map(alias => ({
210
+ name: alias,
211
+ hint: `Alias for /${spec.name}. ${spec.summary}`,
212
+ })),
213
+ ]);
214
+ }
215
+ export function findCommand(name) {
216
+ return REGISTRY.get(name.toLowerCase());
217
+ }
218
+ /** Run a parsed command. Returns false when the name is unknown so the caller
219
+ * can surface a hint. */
220
+ export function runCommand(ctx, name, args) {
221
+ const spec = findCommand(name);
222
+ if (!spec)
223
+ return false;
224
+ spec.run(ctx, args);
225
+ return true;
226
+ }
227
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"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"}