@mono-agent/tui 0.1.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/README.md +46 -0
- package/dist/agent/history.d.ts +30 -0
- package/dist/agent/history.d.ts.map +1 -0
- package/dist/agent/history.js +61 -0
- package/dist/agent/history.js.map +1 -0
- package/dist/agent/message-stream.d.ts +52 -0
- package/dist/agent/message-stream.d.ts.map +1 -0
- package/dist/agent/message-stream.js +110 -0
- package/dist/agent/message-stream.js.map +1 -0
- package/dist/agent/responder.d.ts +11 -0
- package/dist/agent/responder.d.ts.map +1 -0
- package/dist/agent/responder.js +11 -0
- package/dist/agent/responder.js.map +1 -0
- package/dist/bin/cli.d.ts +25 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +112 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/mono-agent-tui.d.ts +3 -0
- package/dist/bin/mono-agent-tui.d.ts.map +1 -0
- package/dist/bin/mono-agent-tui.js +39 -0
- package/dist/bin/mono-agent-tui.js.map +1 -0
- package/dist/components/ChatPane.d.ts +20 -0
- package/dist/components/ChatPane.d.ts.map +1 -0
- package/dist/components/ChatPane.js +142 -0
- package/dist/components/ChatPane.js.map +1 -0
- package/dist/components/ConfigPane.d.ts +12 -0
- package/dist/components/ConfigPane.d.ts.map +1 -0
- package/dist/components/ConfigPane.js +70 -0
- package/dist/components/ConfigPane.js.map +1 -0
- package/dist/components/HelpOverlay.d.ts +6 -0
- package/dist/components/HelpOverlay.d.ts.map +1 -0
- package/dist/components/HelpOverlay.js +18 -0
- package/dist/components/HelpOverlay.js.map +1 -0
- package/dist/components/HistoryPane.d.ts +9 -0
- package/dist/components/HistoryPane.d.ts.map +1 -0
- package/dist/components/HistoryPane.js +125 -0
- package/dist/components/HistoryPane.js.map +1 -0
- package/dist/components/StatusBar.d.ts +10 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +15 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/TuiApp.d.ts +29 -0
- package/dist/components/TuiApp.d.ts.map +1 -0
- package/dist/components/TuiApp.js +81 -0
- package/dist/components/TuiApp.js.map +1 -0
- package/dist/components/primitives/Badge.d.ts +8 -0
- package/dist/components/primitives/Badge.d.ts.map +1 -0
- package/dist/components/primitives/Badge.js +14 -0
- package/dist/components/primitives/Badge.js.map +1 -0
- package/dist/components/primitives/Spinner.d.ts +6 -0
- package/dist/components/primitives/Spinner.d.ts.map +1 -0
- package/dist/components/primitives/Spinner.js +8 -0
- package/dist/components/primitives/Spinner.js.map +1 -0
- package/dist/components/primitives/TranscriptLine.d.ts +10 -0
- package/dist/components/primitives/TranscriptLine.d.ts.map +1 -0
- package/dist/components/primitives/TranscriptLine.js +15 -0
- package/dist/components/primitives/TranscriptLine.js.map +1 -0
- package/dist/config/pane.d.ts +25 -0
- package/dist/config/pane.d.ts.map +1 -0
- package/dist/config/pane.js +210 -0
- package/dist/config/pane.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/start.d.ts +27 -0
- package/dist/runtime/start.d.ts.map +1 -0
- package/dist/runtime/start.js +46 -0
- package/dist/runtime/start.js.map +1 -0
- package/dist/runtime/version.d.ts +7 -0
- package/dist/runtime/version.d.ts.map +1 -0
- package/dist/runtime/version.js +7 -0
- package/dist/runtime/version.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @mono-agent/tui
|
|
2
|
+
|
|
3
|
+
## Category
|
|
4
|
+
|
|
5
|
+
Category: `operator-surface`
|
|
6
|
+
|
|
7
|
+
## Responsibility
|
|
8
|
+
|
|
9
|
+
Terminal operator surface built with Ink. It provides local chat, in-memory transcript display, cancellation handling, and a redacted read-only core config pane for hosts that want a terminal console.
|
|
10
|
+
|
|
11
|
+
## Install / Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm --filter @mono-agent/tui run build
|
|
15
|
+
mono-agent-tui --help
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { startMonoAgentTui } from "@mono-agent/tui";
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Hosts supply a structural responder compatible with `@mono-agent/agent-contracts` and decide how config files are loaded.
|
|
23
|
+
|
|
24
|
+
## Public API
|
|
25
|
+
|
|
26
|
+
- `startMonoAgentTui`
|
|
27
|
+
- TUI app/component types and message-stream helpers
|
|
28
|
+
- Structural `AgentResponder` aliases and cancellation helpers backed by `@mono-agent/agent-contracts`
|
|
29
|
+
- Read-only config summary helpers
|
|
30
|
+
- Bin: `mono-agent-tui`
|
|
31
|
+
|
|
32
|
+
## Dependency Boundary
|
|
33
|
+
|
|
34
|
+
The TUI depends on React/Ink, shared contracts, and `@mono-agent/config` for core config summaries. It remains a terminal operator surface, not a communication adapter, runtime host, or settings editor.
|
|
35
|
+
|
|
36
|
+
## What This Package Does Not Own
|
|
37
|
+
|
|
38
|
+
It does not poll Telegram/WhatsApp, edit config inline, persist transcripts, call model runtimes directly, or own adapter-specific settings.
|
|
39
|
+
|
|
40
|
+
## Verification
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm --filter @mono-agent/tui run build
|
|
44
|
+
pnpm --filter @mono-agent/tui run typecheck
|
|
45
|
+
pnpm --filter @mono-agent/tui run test
|
|
46
|
+
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory transcript store for the TUI history pane.
|
|
3
|
+
*
|
|
4
|
+
* Hosts that need persistence across TUI restarts can implement
|
|
5
|
+
* TuiHistoryStore against their own backend (the harness has its own
|
|
6
|
+
* conversation history; this store is purely for what the user sees).
|
|
7
|
+
*/
|
|
8
|
+
export type TuiHistoryRole = "user" | "assistant";
|
|
9
|
+
export type TuiHistoryStatus = "ok" | "cancelled" | "error";
|
|
10
|
+
export interface TuiHistoryMessage {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly role: TuiHistoryRole;
|
|
13
|
+
readonly text: string;
|
|
14
|
+
readonly timestamp: number;
|
|
15
|
+
readonly conversationId?: string;
|
|
16
|
+
readonly status?: TuiHistoryStatus;
|
|
17
|
+
readonly metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface TuiHistoryStore {
|
|
20
|
+
list(): readonly TuiHistoryMessage[];
|
|
21
|
+
append(message: TuiHistoryMessage): void;
|
|
22
|
+
remove(id: string): void;
|
|
23
|
+
clear(): void;
|
|
24
|
+
subscribe(listener: () => void): () => void;
|
|
25
|
+
}
|
|
26
|
+
export interface CreateInMemoryTuiHistoryOptions {
|
|
27
|
+
readonly maxMessages?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function createInMemoryTuiHistory(options?: CreateInMemoryTuiHistoryOptions): TuiHistoryStore;
|
|
30
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/agent/history.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,SAAS,iBAAiB,EAAE,CAAC;IACrC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,eAAe,CAqDjB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory transcript store for the TUI history pane.
|
|
3
|
+
*
|
|
4
|
+
* Hosts that need persistence across TUI restarts can implement
|
|
5
|
+
* TuiHistoryStore against their own backend (the harness has its own
|
|
6
|
+
* conversation history; this store is purely for what the user sees).
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_MAX_MESSAGES = 500;
|
|
9
|
+
export function createInMemoryTuiHistory(options = {}) {
|
|
10
|
+
const maxMessages = options.maxMessages ?? DEFAULT_MAX_MESSAGES;
|
|
11
|
+
if (!Number.isInteger(maxMessages) || maxMessages < 1) {
|
|
12
|
+
throw new RangeError("maxMessages must be a positive integer.");
|
|
13
|
+
}
|
|
14
|
+
let messages = [];
|
|
15
|
+
const listeners = new Set();
|
|
16
|
+
const notify = () => {
|
|
17
|
+
for (const listener of listeners) {
|
|
18
|
+
try {
|
|
19
|
+
listener();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Swallow listener errors so one bad subscriber cannot break the
|
|
23
|
+
// store; the TUI app re-renders on every notify anyway.
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
list() {
|
|
29
|
+
return messages;
|
|
30
|
+
},
|
|
31
|
+
append(message) {
|
|
32
|
+
messages = [...messages, message];
|
|
33
|
+
if (messages.length > maxMessages) {
|
|
34
|
+
messages = messages.slice(messages.length - maxMessages);
|
|
35
|
+
}
|
|
36
|
+
notify();
|
|
37
|
+
},
|
|
38
|
+
remove(id) {
|
|
39
|
+
const next = messages.filter((message) => message.id !== id);
|
|
40
|
+
if (next.length === messages.length) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
messages = next;
|
|
44
|
+
notify();
|
|
45
|
+
},
|
|
46
|
+
clear() {
|
|
47
|
+
if (messages.length === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
messages = [];
|
|
51
|
+
notify();
|
|
52
|
+
},
|
|
53
|
+
subscribe(listener) {
|
|
54
|
+
listeners.add(listener);
|
|
55
|
+
return () => {
|
|
56
|
+
listeners.delete(listener);
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/agent/history.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4BH,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,MAAM,UAAU,wBAAwB,CACtC,UAA2C,EAAE;IAE7C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAwB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;gBACjE,wDAAwD;YAC1D,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,OAA0B;YAC/B,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBAClC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC;QACD,MAAM,CAAC,EAAU;YACf,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,CAAC;QACX,CAAC;QACD,KAAK;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;QACX,CAAC;QACD,SAAS,CAAC,QAAoB;YAC5B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AgentMessageStreamLike } from "./responder.js";
|
|
2
|
+
/**
|
|
3
|
+
* State snapshot produced by TuiInkMessageStream after every flush.
|
|
4
|
+
* The Chat pane re-renders the in-flight assistant block from this.
|
|
5
|
+
*/
|
|
6
|
+
export interface TuiStreamState {
|
|
7
|
+
readonly statusText: string;
|
|
8
|
+
readonly text: string;
|
|
9
|
+
readonly finished: boolean;
|
|
10
|
+
readonly hasOutput: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface TuiInkMessageStreamOptions {
|
|
13
|
+
readonly initialStatusText?: string;
|
|
14
|
+
readonly streamDebounceMs?: number;
|
|
15
|
+
readonly onState: (state: TuiStreamState) => void;
|
|
16
|
+
readonly now?: () => number;
|
|
17
|
+
readonly setTimer?: (handler: () => void, ms: number) => unknown;
|
|
18
|
+
readonly clearTimer?: (handle: unknown) => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* AgentMessageStreamLike implementation that buffers incoming deltas and
|
|
22
|
+
* emits a single state snapshot per debounce window. This keeps the React
|
|
23
|
+
* reconciler from churning when a responder calls `append` in a tight
|
|
24
|
+
* loop (typical of token-by-token streaming).
|
|
25
|
+
*/
|
|
26
|
+
export declare class TuiInkMessageStream implements AgentMessageStreamLike {
|
|
27
|
+
private readonly emit;
|
|
28
|
+
private readonly debounceMs;
|
|
29
|
+
private readonly setTimerImpl;
|
|
30
|
+
private readonly clearTimerImpl;
|
|
31
|
+
private statusText;
|
|
32
|
+
private currentText;
|
|
33
|
+
private finished;
|
|
34
|
+
private hasOutput;
|
|
35
|
+
private pendingTimer;
|
|
36
|
+
private dirty;
|
|
37
|
+
constructor(options: TuiInkMessageStreamOptions);
|
|
38
|
+
status(text: string): Promise<void>;
|
|
39
|
+
append(delta: string): Promise<void>;
|
|
40
|
+
replace(text: string): Promise<void>;
|
|
41
|
+
finish(finalText?: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Flushes any pending state immediately. Useful when the host wants to
|
|
44
|
+
* cancel mid-stream and render the partial result before unmounting.
|
|
45
|
+
*/
|
|
46
|
+
flushPending(): void;
|
|
47
|
+
snapshot(): TuiStreamState;
|
|
48
|
+
private scheduleEmit;
|
|
49
|
+
private flushNow;
|
|
50
|
+
private assertOpen;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=message-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-stream.d.ts","sourceRoot":"","sources":["../../src/agent/message-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD;AAKD;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,0BAA0B;IAiBzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C;;;OAGG;IACH,YAAY,IAAI,IAAI;IAMpB,QAAQ,IAAI,cAAc;IAS1B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,UAAU;CAKnB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const DEFAULT_INITIAL_STATUS_TEXT = "Thinking…";
|
|
2
|
+
const DEFAULT_DEBOUNCE_MS = 30;
|
|
3
|
+
/**
|
|
4
|
+
* AgentMessageStreamLike implementation that buffers incoming deltas and
|
|
5
|
+
* emits a single state snapshot per debounce window. This keeps the React
|
|
6
|
+
* reconciler from churning when a responder calls `append` in a tight
|
|
7
|
+
* loop (typical of token-by-token streaming).
|
|
8
|
+
*/
|
|
9
|
+
export class TuiInkMessageStream {
|
|
10
|
+
emit;
|
|
11
|
+
debounceMs;
|
|
12
|
+
setTimerImpl;
|
|
13
|
+
clearTimerImpl;
|
|
14
|
+
statusText;
|
|
15
|
+
currentText = "";
|
|
16
|
+
finished = false;
|
|
17
|
+
hasOutput = false;
|
|
18
|
+
pendingTimer;
|
|
19
|
+
dirty = false;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.emit = options.onState;
|
|
22
|
+
this.debounceMs = options.streamDebounceMs ?? DEFAULT_DEBOUNCE_MS;
|
|
23
|
+
if (!Number.isFinite(this.debounceMs) || this.debounceMs < 0) {
|
|
24
|
+
throw new RangeError("streamDebounceMs must be a non-negative number.");
|
|
25
|
+
}
|
|
26
|
+
this.statusText = options.initialStatusText ?? DEFAULT_INITIAL_STATUS_TEXT;
|
|
27
|
+
this.setTimerImpl =
|
|
28
|
+
options.setTimer ??
|
|
29
|
+
((handler, ms) => setTimeout(handler, ms));
|
|
30
|
+
this.clearTimerImpl =
|
|
31
|
+
options.clearTimer ??
|
|
32
|
+
((handle) => {
|
|
33
|
+
clearTimeout(handle);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async status(text) {
|
|
37
|
+
this.assertOpen();
|
|
38
|
+
this.statusText = text;
|
|
39
|
+
this.scheduleEmit();
|
|
40
|
+
}
|
|
41
|
+
async append(delta) {
|
|
42
|
+
this.assertOpen();
|
|
43
|
+
if (delta.length === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.currentText += delta;
|
|
47
|
+
this.hasOutput = true;
|
|
48
|
+
this.scheduleEmit();
|
|
49
|
+
}
|
|
50
|
+
async replace(text) {
|
|
51
|
+
this.assertOpen();
|
|
52
|
+
this.currentText = text;
|
|
53
|
+
this.hasOutput = text.length > 0;
|
|
54
|
+
this.scheduleEmit();
|
|
55
|
+
}
|
|
56
|
+
async finish(finalText) {
|
|
57
|
+
this.assertOpen();
|
|
58
|
+
if (finalText !== undefined) {
|
|
59
|
+
this.currentText = finalText;
|
|
60
|
+
this.hasOutput = finalText.length > 0;
|
|
61
|
+
}
|
|
62
|
+
this.finished = true;
|
|
63
|
+
this.flushNow();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Flushes any pending state immediately. Useful when the host wants to
|
|
67
|
+
* cancel mid-stream and render the partial result before unmounting.
|
|
68
|
+
*/
|
|
69
|
+
flushPending() {
|
|
70
|
+
if (this.dirty || this.pendingTimer !== undefined) {
|
|
71
|
+
this.flushNow();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
snapshot() {
|
|
75
|
+
return {
|
|
76
|
+
statusText: this.statusText,
|
|
77
|
+
text: this.currentText,
|
|
78
|
+
finished: this.finished,
|
|
79
|
+
hasOutput: this.hasOutput,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
scheduleEmit() {
|
|
83
|
+
this.dirty = true;
|
|
84
|
+
if (this.debounceMs === 0) {
|
|
85
|
+
this.flushNow();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (this.pendingTimer !== undefined) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.pendingTimer = this.setTimerImpl(() => {
|
|
92
|
+
this.pendingTimer = undefined;
|
|
93
|
+
this.flushNow();
|
|
94
|
+
}, this.debounceMs);
|
|
95
|
+
}
|
|
96
|
+
flushNow() {
|
|
97
|
+
if (this.pendingTimer !== undefined) {
|
|
98
|
+
this.clearTimerImpl(this.pendingTimer);
|
|
99
|
+
this.pendingTimer = undefined;
|
|
100
|
+
}
|
|
101
|
+
this.dirty = false;
|
|
102
|
+
this.emit(this.snapshot());
|
|
103
|
+
}
|
|
104
|
+
assertOpen() {
|
|
105
|
+
if (this.finished) {
|
|
106
|
+
throw new Error("TuiInkMessageStream has already been finished.");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=message-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-stream.js","sourceRoot":"","sources":["../../src/agent/message-stream.ts"],"names":[],"mappings":"AAsBA,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAChD,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACb,IAAI,CAAkC;IACtC,UAAU,CAAS;IACnB,YAAY,CAA+C;IAC3D,cAAc,CAA4B;IAEnD,UAAU,CAAS;IACnB,WAAW,GAAG,EAAE,CAAC;IACjB,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,YAAY,CAAU;IACtB,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,OAAmC;QAC7C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,gBAAgB,IAAI,mBAAmB,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,UAAU,CAAC,iDAAiD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;QAC3E,IAAI,CAAC,YAAY;YACf,OAAO,CAAC,QAAQ;gBAChB,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAY,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc;YACjB,OAAO,CAAC,UAAU;gBAClB,CAAC,CAAC,MAAM,EAAE,EAAE;oBACV,YAAY,CAAC,MAAuC,CAAC,CAAC;gBACxD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7B,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AgentResponseCancelledError, type AgentMessageStream, type AgentRequestBase, type AgentResponder, type AgentResponse, type AgentResponseCancelledErrorOptions } from "@mono-agent/agent-contracts";
|
|
2
|
+
export type AgentRequestLike = AgentRequestBase;
|
|
3
|
+
export type AgentResponseLike = AgentResponse;
|
|
4
|
+
export type AgentMessageStreamLike = AgentMessageStream;
|
|
5
|
+
export type AgentResponderLike = AgentResponder;
|
|
6
|
+
export type TuiAgentCancelledErrorOptions = AgentResponseCancelledErrorOptions;
|
|
7
|
+
export declare class TuiAgentCancelledError extends AgentResponseCancelledError {
|
|
8
|
+
constructor(message?: string, options?: TuiAgentCancelledErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
export declare function isTuiAgentCancelledError(error: unknown): boolean;
|
|
11
|
+
//# sourceMappingURL=responder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder.d.ts","sourceRoot":"","sources":["../../src/agent/responder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAE3B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kCAAkC,EACxC,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC9C,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AACxD,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAChD,MAAM,MAAM,6BAA6B,GAAG,kCAAkC,CAAC;AAE/E,qBAAa,sBAAuB,SAAQ,2BAA2B;gBAEnE,OAAO,SAAkC,EACzC,OAAO,GAAE,6BAAkC;CAK9C;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AgentResponseCancelledError, isAgentResponseCancelledError, } from "@mono-agent/agent-contracts";
|
|
2
|
+
export class TuiAgentCancelledError extends AgentResponseCancelledError {
|
|
3
|
+
constructor(message = "Agent response was cancelled.", options = {}) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = "TuiAgentCancelledError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function isTuiAgentCancelledError(error) {
|
|
9
|
+
return error instanceof TuiAgentCancelledError || isAgentResponseCancelledError(error);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=responder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder.js","sourceRoot":"","sources":["../../src/agent/responder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAM9B,MAAM,6BAA6B,CAAC;AAQrC,MAAM,OAAO,sBAAuB,SAAQ,2BAA2B;IACrE,YACE,OAAO,GAAG,+BAA+B,EACzC,UAAyC,EAAE;QAE3C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,KAAK,YAAY,sBAAsB,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AgentResponderLike } from "../agent/responder.js";
|
|
2
|
+
export interface ParsedArgs {
|
|
3
|
+
readonly responder?: string;
|
|
4
|
+
readonly config?: string;
|
|
5
|
+
readonly title?: string;
|
|
6
|
+
readonly conversationId?: string;
|
|
7
|
+
readonly help: boolean;
|
|
8
|
+
}
|
|
9
|
+
export type ParseArgsResult = ParsedArgs | {
|
|
10
|
+
readonly error: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parse the `mono-agent-tui` argv (already stripped of `node` + script path).
|
|
14
|
+
* Pure and side-effect free so it can be unit-tested without booting the CLI.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseArgs(argv: readonly string[]): ParseArgsResult;
|
|
17
|
+
export declare const HELP_TEXT = "Usage: mono-agent-tui [options]\n\n --responder <file> Path to an ESM module that default-exports an\n AgentResponderLike, or exports\n createResponder(env, cwd, configJson).\n --config <path> Path to mono-agent.config.json. When set, the\n Config pane is enabled and the file is forwarded\n to createResponder().\n --conversation <id> Conversation id passed to the responder\n (default: tui-local).\n --title <text> Header title (default: \"Agent\").\n -h, --help Show this help and exit.\n\nThe TUI is a communication adapter \u2014 it does not boot a harness on its\nown. Hosts that want a runnable TUI in their own demo should call\nstartMonoAgentTui() from their own bin and pass an AgentResponderLike\nbacked by createAgentResponder({ harness }).\n";
|
|
18
|
+
export declare function exitWithError(message: string): never;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve and import an `AgentResponderLike` from a host-supplied module.
|
|
21
|
+
* Accepts either a `createResponder(env, cwd, configPath)` factory export or
|
|
22
|
+
* a default-exported responder. Exits the process with a 2 on user error.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadResponder(responderPath: string, configPath: string | undefined): Promise<AgentResponderLike>;
|
|
25
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CA4DlE;AAED,eAAO,MAAM,SAAS,g6BAiBrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAIpD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
|
package/dist/bin/cli.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Parse the `mono-agent-tui` argv (already stripped of `node` + script path).
|
|
6
|
+
* Pure and side-effect free so it can be unit-tested without booting the CLI.
|
|
7
|
+
*/
|
|
8
|
+
export function parseArgs(argv) {
|
|
9
|
+
let help = false;
|
|
10
|
+
let responder;
|
|
11
|
+
let config;
|
|
12
|
+
let title;
|
|
13
|
+
let conversationId;
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const flag = argv[i];
|
|
16
|
+
if (flag === "-h" || flag === "--help") {
|
|
17
|
+
help = true;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (flag === "--responder") {
|
|
21
|
+
const value = argv[i + 1];
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
return { error: "--responder requires a path" };
|
|
24
|
+
}
|
|
25
|
+
responder = value;
|
|
26
|
+
i++;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (flag === "--config") {
|
|
30
|
+
const value = argv[i + 1];
|
|
31
|
+
if (value === undefined) {
|
|
32
|
+
return { error: "--config requires a path" };
|
|
33
|
+
}
|
|
34
|
+
config = value;
|
|
35
|
+
i++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (flag === "--title") {
|
|
39
|
+
const value = argv[i + 1];
|
|
40
|
+
if (value === undefined) {
|
|
41
|
+
return { error: "--title requires a value" };
|
|
42
|
+
}
|
|
43
|
+
title = value;
|
|
44
|
+
i++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (flag === "--conversation") {
|
|
48
|
+
const value = argv[i + 1];
|
|
49
|
+
if (value === undefined) {
|
|
50
|
+
return { error: "--conversation requires a value" };
|
|
51
|
+
}
|
|
52
|
+
conversationId = value;
|
|
53
|
+
i++;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
return { error: `unknown argument: ${String(flag)}` };
|
|
57
|
+
}
|
|
58
|
+
const result = {
|
|
59
|
+
help,
|
|
60
|
+
...(responder === undefined ? {} : { responder }),
|
|
61
|
+
...(config === undefined ? {} : { config }),
|
|
62
|
+
...(title === undefined ? {} : { title }),
|
|
63
|
+
...(conversationId === undefined ? {} : { conversationId }),
|
|
64
|
+
};
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
export const HELP_TEXT = `Usage: mono-agent-tui [options]
|
|
68
|
+
|
|
69
|
+
--responder <file> Path to an ESM module that default-exports an
|
|
70
|
+
AgentResponderLike, or exports
|
|
71
|
+
createResponder(env, cwd, configJson).
|
|
72
|
+
--config <path> Path to mono-agent.config.json. When set, the
|
|
73
|
+
Config pane is enabled and the file is forwarded
|
|
74
|
+
to createResponder().
|
|
75
|
+
--conversation <id> Conversation id passed to the responder
|
|
76
|
+
(default: tui-local).
|
|
77
|
+
--title <text> Header title (default: "Agent").
|
|
78
|
+
-h, --help Show this help and exit.
|
|
79
|
+
|
|
80
|
+
The TUI is a communication adapter — it does not boot a harness on its
|
|
81
|
+
own. Hosts that want a runnable TUI in their own demo should call
|
|
82
|
+
startMonoAgentTui() from their own bin and pass an AgentResponderLike
|
|
83
|
+
backed by createAgentResponder({ harness }).
|
|
84
|
+
`;
|
|
85
|
+
export function exitWithError(message) {
|
|
86
|
+
process.stderr.write(`mono-agent-tui: ${message}\n`);
|
|
87
|
+
process.stderr.write(HELP_TEXT);
|
|
88
|
+
process.exit(2);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolve and import an `AgentResponderLike` from a host-supplied module.
|
|
92
|
+
* Accepts either a `createResponder(env, cwd, configPath)` factory export or
|
|
93
|
+
* a default-exported responder. Exits the process with a 2 on user error.
|
|
94
|
+
*/
|
|
95
|
+
export async function loadResponder(responderPath, configPath) {
|
|
96
|
+
const absolute = resolve(process.cwd(), responderPath);
|
|
97
|
+
if (!existsSync(absolute)) {
|
|
98
|
+
exitWithError(`responder file not found: ${absolute}`);
|
|
99
|
+
}
|
|
100
|
+
const moduleUrl = pathToFileURL(absolute).href;
|
|
101
|
+
const moduleExports = (await import(moduleUrl));
|
|
102
|
+
if (typeof moduleExports.createResponder === "function") {
|
|
103
|
+
const result = await moduleExports.createResponder({ ...process.env }, process.cwd(), configPath);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
if (moduleExports.default !== undefined &&
|
|
107
|
+
typeof moduleExports.default.respond === "function") {
|
|
108
|
+
return moduleExports.default;
|
|
109
|
+
}
|
|
110
|
+
exitWithError(`module ${absolute} did not export a default AgentResponderLike or createResponder().`);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mono-agent-tui.d.ts","sourceRoot":"","sources":["../../src/bin/mono-agent-tui.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { startMonoAgentTui } from "../runtime/start.js";
|
|
4
|
+
import { exitWithError, HELP_TEXT, loadResponder, parseArgs } from "./cli.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
7
|
+
if ("error" in parsed) {
|
|
8
|
+
exitWithError(parsed.error);
|
|
9
|
+
}
|
|
10
|
+
if (parsed.help) {
|
|
11
|
+
process.stdout.write(HELP_TEXT);
|
|
12
|
+
process.exit(0);
|
|
13
|
+
}
|
|
14
|
+
if (parsed.responder === undefined) {
|
|
15
|
+
exitWithError("--responder is required (the TUI does not boot a harness on its own)");
|
|
16
|
+
}
|
|
17
|
+
if (process.stdin.isTTY !== true) {
|
|
18
|
+
exitWithError("stdin is not a TTY; mono-agent-tui needs an interactive terminal");
|
|
19
|
+
}
|
|
20
|
+
const responder = await loadResponder(parsed.responder, parsed.config);
|
|
21
|
+
const configPane = parsed.config !== undefined
|
|
22
|
+
? { path: resolve(process.cwd(), parsed.config), cwd: process.cwd(), env: { ...process.env } }
|
|
23
|
+
: undefined;
|
|
24
|
+
const handle = startMonoAgentTui({
|
|
25
|
+
responder,
|
|
26
|
+
...(configPane === undefined ? {} : { config: configPane }),
|
|
27
|
+
...(parsed.title === undefined ? {} : { title: parsed.title }),
|
|
28
|
+
...(parsed.conversationId === undefined
|
|
29
|
+
? {}
|
|
30
|
+
: { conversationId: parsed.conversationId }),
|
|
31
|
+
});
|
|
32
|
+
await handle.waitUntilExit();
|
|
33
|
+
}
|
|
34
|
+
main().catch((error) => {
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
process.stderr.write(`mono-agent-tui: ${message}\n`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=mono-agent-tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mono-agent-tui.js","sourceRoot":"","sources":["../../src/bin/mono-agent-tui.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE9E,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,aAAa,CAAC,sEAAsE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACjC,aAAa,CAAC,kEAAkE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,UAAU,GACd,MAAM,CAAC,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE;QAC9F,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,SAAS;QACT,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;AAC/B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { TuiHistoryStore } from "../agent/history.js";
|
|
3
|
+
import { type AgentResponderLike } from "../agent/responder.js";
|
|
4
|
+
export interface ChatPaneProps {
|
|
5
|
+
readonly responder: AgentResponderLike;
|
|
6
|
+
readonly history: TuiHistoryStore;
|
|
7
|
+
readonly conversationId: string;
|
|
8
|
+
readonly active: boolean;
|
|
9
|
+
readonly initialStatusText?: string;
|
|
10
|
+
readonly streamDebounceMs?: number;
|
|
11
|
+
readonly maxTranscriptLines?: number;
|
|
12
|
+
readonly idGenerator?: () => string;
|
|
13
|
+
readonly clock?: () => number;
|
|
14
|
+
readonly logger?: {
|
|
15
|
+
debug?: (message: string, metadata?: Record<string, unknown>) => void;
|
|
16
|
+
error?: (message: string, metadata?: Record<string, unknown>) => void;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function ChatPane({ responder, history, conversationId, active, initialStatusText, streamDebounceMs, maxTranscriptLines, idGenerator, clock, logger, }: ChatPaneProps): React.JSX.Element;
|
|
20
|
+
//# sourceMappingURL=ChatPane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPane.d.ts","sourceRoot":"","sources":["../../src/components/ChatPane.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAIjF,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACtE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KACvE,CAAC;CACH;AAiBD,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,OAAO,EACP,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,kBAA2C,EAC3C,WAAgC,EAChC,KAAgB,EAChB,MAAM,GACP,EAAE,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqMnC"}
|