@modelprofile.com/flexharness 6.1.0 → 7.0.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_chat/classes.chatsession.d.ts +37 -0
- package/dist_ts_chat/classes.chatsession.js +102 -0
- package/dist_ts_chat/index.d.ts +2 -0
- package/dist_ts_chat/index.js +2 -0
- package/dist_ts_chat/interfaces.d.ts +72 -0
- package/dist_ts_chat/interfaces.js +2 -0
- package/dist_ts_chat/plugins.d.ts +4 -0
- package/dist_ts_chat/plugins.js +4 -0
- package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
- package/dist_ts_chat_cli/components.chatapp.js +75 -0
- package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
- package/dist_ts_chat_cli/components.inputarea.js +18 -0
- package/dist_ts_chat_cli/components.message.d.ts +12 -0
- package/dist_ts_chat_cli/components.message.js +21 -0
- package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
- package/dist_ts_chat_cli/components.messagelist.js +19 -0
- package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
- package/dist_ts_chat_cli/components.statusbar.js +15 -0
- package/dist_ts_chat_cli/index.d.ts +2 -0
- package/dist_ts_chat_cli/index.js +2 -0
- package/dist_ts_chat_cli/plugins.d.ts +12 -0
- package/dist_ts_chat_cli/plugins.js +14 -0
- package/dist_ts_chat_cli/startchat.d.ts +18 -0
- package/dist_ts_chat_cli/startchat.js +17 -0
- package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
- package/dist_ts_chat_web/flexchat-input.js +172 -0
- package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
- package/dist_ts_chat_web/flexchat-message.js +174 -0
- package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
- package/dist_ts_chat_web/flexchat-window.js +394 -0
- package/dist_ts_chat_web/index.d.ts +3 -0
- package/dist_ts_chat_web/index.js +4 -0
- package/dist_ts_chat_web/plugins.d.ts +6 -0
- package/dist_ts_chat_web/plugins.js +4 -0
- package/dist_ts_compaction/index.d.ts +2 -0
- package/dist_ts_compaction/index.js +2 -0
- package/dist_ts_compaction/plugins.d.ts +4 -0
- package/dist_ts_compaction/plugins.js +3 -0
- package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
- package/dist_ts_compaction/smartagent.compaction.js +49 -0
- package/dist_ts_document/index.d.ts +19 -0
- package/dist_ts_document/index.js +55 -0
- package/dist_ts_document/plugins.d.ts +3 -0
- package/dist_ts_document/plugins.js +4 -0
- package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
- package/dist_ts_kvm/classes.browserkvm.js +271 -0
- package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
- package/dist_ts_kvm/classes.kvmterminal.js +88 -0
- package/dist_ts_kvm/commandwrappers.d.ts +14 -0
- package/dist_ts_kvm/commandwrappers.js +58 -0
- package/dist_ts_kvm/index.d.ts +6 -0
- package/dist_ts_kvm/index.js +7 -0
- package/dist_ts_kvm/interfaces.d.ts +106 -0
- package/dist_ts_kvm/interfaces.js +2 -0
- package/dist_ts_kvm/ocr.d.ts +14 -0
- package/dist_ts_kvm/ocr.js +23 -0
- package/dist_ts_kvm/plugins.d.ts +6 -0
- package/dist_ts_kvm/plugins.js +10 -0
- package/dist_ts_kvm/tools.d.ts +15 -0
- package/dist_ts_kvm/tools.js +40 -0
- package/dist_ts_mcp/index.d.ts +86 -0
- package/dist_ts_mcp/index.js +284 -0
- package/dist_ts_mcp/requestcontext.d.ts +11 -0
- package/dist_ts_mcp/requestcontext.js +42 -0
- package/dist_ts_media/index.d.ts +8 -0
- package/dist_ts_media/index.js +21 -0
- package/dist_ts_media/plugins.d.ts +2 -0
- package/dist_ts_media/plugins.js +3 -0
- package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
- package/dist_ts_ocr/classes.imageocr.js +27 -0
- package/dist_ts_ocr/index.d.ts +2 -0
- package/dist_ts_ocr/index.js +3 -0
- package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
- package/dist_ts_ocr/ocr.mistral.js +77 -0
- package/dist_ts_tools/index.d.ts +17 -0
- package/dist_ts_tools/index.js +10 -0
- package/dist_ts_tools/plugins.d.ts +7 -0
- package/dist_ts_tools/plugins.js +6 -0
- package/dist_ts_tools/tool.browser.d.ts +11 -0
- package/dist_ts_tools/tool.browser.js +128 -0
- package/dist_ts_tools/tool.context.d.ts +4 -0
- package/dist_ts_tools/tool.context.js +23 -0
- package/dist_ts_tools/tool.filesystem.d.ts +11 -0
- package/dist_ts_tools/tool.filesystem.js +106 -0
- package/dist_ts_tools/tool.http.d.ts +2 -0
- package/dist_ts_tools/tool.http.js +65 -0
- package/dist_ts_tools/tool.json.d.ts +2 -0
- package/dist_ts_tools/tool.json.js +47 -0
- package/dist_ts_tools/tool.shell.d.ts +15 -0
- package/dist_ts_tools/tool.shell.js +329 -0
- package/dist_ts_tools/utils.truncation.d.ts +10 -0
- package/dist_ts_tools/utils.truncation.js +26 -0
- package/dist_ts_tools_node/index.d.ts +5 -0
- package/dist_ts_tools_node/index.js +4 -0
- package/dist_ts_tools_node/plugins.d.ts +13 -0
- package/dist_ts_tools_node/plugins.js +13 -0
- package/dist_ts_tools_node/tool.context.d.ts +31 -0
- package/dist_ts_tools_node/tool.context.js +837 -0
- package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
- package/dist_ts_tools_node/tool.persistence.js +129 -0
- package/dist_ts_tools_node/tools.local.d.ts +11 -0
- package/dist_ts_tools_node/tools.local.js +15 -0
- package/package.json +112 -4
- package/readme.md +122 -66
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/readme.md +122 -66
- package/ts_chat/classes.chatsession.ts +116 -0
- package/ts_chat/index.ts +8 -0
- package/ts_chat/interfaces.ts +64 -0
- package/ts_chat/plugins.ts +7 -0
- package/ts_chat/readme.md +49 -0
- package/ts_chat_cli/components.chatapp.ts +103 -0
- package/ts_chat_cli/components.inputarea.ts +29 -0
- package/ts_chat_cli/components.message.ts +48 -0
- package/ts_chat_cli/components.messagelist.ts +45 -0
- package/ts_chat_cli/components.statusbar.ts +31 -0
- package/ts_chat_cli/index.ts +2 -0
- package/ts_chat_cli/plugins.ts +21 -0
- package/ts_chat_cli/readme.md +40 -0
- package/ts_chat_cli/startchat.ts +34 -0
- package/ts_chat_web/flexchat-input.ts +184 -0
- package/ts_chat_web/flexchat-message.ts +185 -0
- package/ts_chat_web/flexchat-window.ts +416 -0
- package/ts_chat_web/index.ts +3 -0
- package/ts_chat_web/plugins.ts +9 -0
- package/ts_chat_web/readme.md +46 -0
- package/ts_compaction/index.ts +2 -0
- package/ts_compaction/plugins.ts +6 -0
- package/ts_compaction/readme.md +37 -0
- package/ts_compaction/smartagent.compaction.ts +59 -0
- package/ts_document/index.ts +82 -0
- package/ts_document/plugins.ts +3 -0
- package/ts_document/readme.md +49 -0
- package/ts_kvm/classes.browserkvm.ts +335 -0
- package/ts_kvm/classes.kvmterminal.ts +103 -0
- package/ts_kvm/commandwrappers.ts +83 -0
- package/ts_kvm/index.ts +6 -0
- package/ts_kvm/interfaces.ts +152 -0
- package/ts_kvm/ocr.ts +41 -0
- package/ts_kvm/plugins.ts +13 -0
- package/ts_kvm/readme.md +482 -0
- package/ts_kvm/tools.ts +58 -0
- package/ts_mcp/index.ts +470 -0
- package/ts_mcp/readme.md +37 -0
- package/ts_mcp/requestcontext.ts +66 -0
- package/ts_media/index.ts +29 -0
- package/ts_media/plugins.ts +2 -0
- package/ts_media/readme.md +37 -0
- package/ts_ocr/classes.imageocr.ts +53 -0
- package/ts_ocr/index.ts +2 -0
- package/ts_ocr/ocr.mistral.ts +192 -0
- package/ts_ocr/readme.md +48 -0
- package/ts_tools/index.ts +49 -0
- package/ts_tools/plugins.ts +7 -0
- package/ts_tools/readme.md +37 -0
- package/ts_tools/tool.browser.ts +159 -0
- package/ts_tools/tool.context.ts +23 -0
- package/ts_tools/tool.filesystem.ts +144 -0
- package/ts_tools/tool.http.ts +78 -0
- package/ts_tools/tool.json.ts +53 -0
- package/ts_tools/tool.shell.ts +418 -0
- package/ts_tools/utils.truncation.ts +39 -0
- package/ts_tools_node/index.ts +5 -0
- package/ts_tools_node/plugins.ts +16 -0
- package/ts_tools_node/readme.md +37 -0
- package/ts_tools_node/tool.context.ts +991 -0
- package/ts_tools_node/tool.persistence.ts +146 -0
- package/ts_tools_node/tools.local.ts +26 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@modelprofile.com/flexharness',
|
|
6
|
-
version: '
|
|
6
|
+
version: '7.0.0',
|
|
7
7
|
description: 'The FlexHarness toolbox source repository and shared dependency catalog.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwrQkFBK0I7SUFDckMsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ModelMessage, IAgentRunResult } from './plugins.js';
|
|
2
|
+
import type { IChatSessionOptions, IChatCallbacks, IChatUsage } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* ChatSession manages in-memory conversation state and wraps `runAgent()`.
|
|
5
|
+
* Conversation state stays in memory; consumers own persistence.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ChatSession {
|
|
8
|
+
private options;
|
|
9
|
+
private callbacks;
|
|
10
|
+
private messages;
|
|
11
|
+
private usage;
|
|
12
|
+
private busy;
|
|
13
|
+
private readonly subscribers;
|
|
14
|
+
constructor(options: IChatSessionOptions, callbacks?: IChatCallbacks);
|
|
15
|
+
/**
|
|
16
|
+
* Send a user message, run the agent, and return the result.
|
|
17
|
+
* Updates internal message history automatically.
|
|
18
|
+
*/
|
|
19
|
+
send(userMessage: string): Promise<IAgentRunResult>;
|
|
20
|
+
/** Whether a turn is currently in progress */
|
|
21
|
+
isBusy(): boolean;
|
|
22
|
+
/** Get current conversation history */
|
|
23
|
+
getMessages(): ModelMessage[];
|
|
24
|
+
/** Replace messages (e.g. for restoring a saved session) */
|
|
25
|
+
setMessages(messages: ModelMessage[]): void;
|
|
26
|
+
/** Clear conversation history and reset usage */
|
|
27
|
+
clear(): void;
|
|
28
|
+
/** Get accumulated token usage across all turns */
|
|
29
|
+
getUsage(): IChatUsage;
|
|
30
|
+
/** Update session options (model, system prompt, tools, etc.) */
|
|
31
|
+
updateOptions(options: Partial<IChatSessionOptions>): void;
|
|
32
|
+
/** Update callbacks */
|
|
33
|
+
updateCallbacks(callbacks: Partial<IChatCallbacks>): void;
|
|
34
|
+
/** Attach an independent UI observer without replacing the caller's callbacks. */
|
|
35
|
+
subscribe(callbacks: IChatCallbacks): () => void;
|
|
36
|
+
private notify;
|
|
37
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { runAgent } from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* ChatSession manages in-memory conversation state and wraps `runAgent()`.
|
|
4
|
+
* Conversation state stays in memory; consumers own persistence.
|
|
5
|
+
*/
|
|
6
|
+
export class ChatSession {
|
|
7
|
+
options;
|
|
8
|
+
callbacks;
|
|
9
|
+
messages = [];
|
|
10
|
+
usage = {
|
|
11
|
+
inputTokens: 0,
|
|
12
|
+
outputTokens: 0,
|
|
13
|
+
totalTokens: 0,
|
|
14
|
+
turns: 0,
|
|
15
|
+
};
|
|
16
|
+
busy = false;
|
|
17
|
+
subscribers = new Set();
|
|
18
|
+
constructor(options, callbacks = {}) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.callbacks = callbacks;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Send a user message, run the agent, and return the result.
|
|
24
|
+
* Updates internal message history automatically.
|
|
25
|
+
*/
|
|
26
|
+
async send(userMessage) {
|
|
27
|
+
if (this.busy) {
|
|
28
|
+
throw new Error('ChatSession is busy — wait for the current turn to complete.');
|
|
29
|
+
}
|
|
30
|
+
this.busy = true;
|
|
31
|
+
try {
|
|
32
|
+
const result = await (this.options.run ?? runAgent)({
|
|
33
|
+
model: this.options.model,
|
|
34
|
+
system: this.options.system,
|
|
35
|
+
prompt: userMessage,
|
|
36
|
+
tools: this.options.tools,
|
|
37
|
+
maxSteps: this.options.maxSteps ?? 20,
|
|
38
|
+
messages: this.messages,
|
|
39
|
+
onToken: (delta) => this.notify((callbacks) => callbacks.onToken?.(delta)),
|
|
40
|
+
onToolCall: (name, input) => this.notify((callbacks) => callbacks.onToolCall?.(name, input)),
|
|
41
|
+
onToolResult: (name, result) => this.notify((callbacks) => callbacks.onToolResult?.(name, result)),
|
|
42
|
+
});
|
|
43
|
+
// Update conversation history
|
|
44
|
+
this.messages = result.messages;
|
|
45
|
+
// Accumulate usage
|
|
46
|
+
this.usage.inputTokens += result.usage.inputTokens;
|
|
47
|
+
this.usage.outputTokens += result.usage.outputTokens;
|
|
48
|
+
this.usage.totalTokens += result.usage.totalTokens;
|
|
49
|
+
this.usage.turns++;
|
|
50
|
+
this.notify((callbacks) => callbacks.onTurnComplete?.(result));
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
55
|
+
this.notify((callbacks) => callbacks.onError?.(err));
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
this.busy = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Whether a turn is currently in progress */
|
|
63
|
+
isBusy() {
|
|
64
|
+
return this.busy;
|
|
65
|
+
}
|
|
66
|
+
/** Get current conversation history */
|
|
67
|
+
getMessages() {
|
|
68
|
+
return [...this.messages];
|
|
69
|
+
}
|
|
70
|
+
/** Replace messages (e.g. for restoring a saved session) */
|
|
71
|
+
setMessages(messages) {
|
|
72
|
+
this.messages = [...messages];
|
|
73
|
+
}
|
|
74
|
+
/** Clear conversation history and reset usage */
|
|
75
|
+
clear() {
|
|
76
|
+
this.messages = [];
|
|
77
|
+
this.usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0, turns: 0 };
|
|
78
|
+
}
|
|
79
|
+
/** Get accumulated token usage across all turns */
|
|
80
|
+
getUsage() {
|
|
81
|
+
return { ...this.usage };
|
|
82
|
+
}
|
|
83
|
+
/** Update session options (model, system prompt, tools, etc.) */
|
|
84
|
+
updateOptions(options) {
|
|
85
|
+
Object.assign(this.options, options);
|
|
86
|
+
}
|
|
87
|
+
/** Update callbacks */
|
|
88
|
+
updateCallbacks(callbacks) {
|
|
89
|
+
Object.assign(this.callbacks, callbacks);
|
|
90
|
+
}
|
|
91
|
+
/** Attach an independent UI observer without replacing the caller's callbacks. */
|
|
92
|
+
subscribe(callbacks) {
|
|
93
|
+
this.subscribers.add(callbacks);
|
|
94
|
+
return () => { this.subscribers.delete(callbacks); };
|
|
95
|
+
}
|
|
96
|
+
notify(invoke) {
|
|
97
|
+
invoke(this.callbacks);
|
|
98
|
+
for (const callbacks of [...this.subscribers])
|
|
99
|
+
invoke(callbacks);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jaGF0c2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXQvY2xhc3Nlcy5jaGF0c2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSXhDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBWVo7SUFDQTtJQVpGLFFBQVEsR0FBbUIsRUFBRSxDQUFDO0lBQzlCLEtBQUssR0FBZTtRQUMxQixXQUFXLEVBQUUsQ0FBQztRQUNkLFlBQVksRUFBRSxDQUFDO1FBQ2YsV0FBVyxFQUFFLENBQUM7UUFDZCxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUM7SUFDTSxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ0osV0FBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRXpELFlBQ1UsT0FBNEIsRUFDNUIsWUFBNEIsRUFBRTtRQUQ5QixZQUFPLEdBQVAsT0FBTyxDQUFxQjtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFxQjtJQUNyQyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFtQjtRQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRCxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUMzQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxP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
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ChatSession } from './classes.chatsession.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQyJ9
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { TSmartAiLanguageModel, ModelMessage, ToolSet, IAgentRunResult, IAgentRunOptions } from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for creating a ChatSession.
|
|
4
|
+
*/
|
|
5
|
+
export interface IChatSessionOptions {
|
|
6
|
+
/** The language model to use */
|
|
7
|
+
model: TSmartAiLanguageModel;
|
|
8
|
+
/** System prompt for the agent */
|
|
9
|
+
system?: string;
|
|
10
|
+
/** Tools available to the agent */
|
|
11
|
+
tools?: ToolSet;
|
|
12
|
+
/** Maximum agentic steps per turn */
|
|
13
|
+
maxSteps?: number;
|
|
14
|
+
/** Optional caller-owned runner, for example a server transport. */
|
|
15
|
+
run?: (options: IAgentRunOptions) => Promise<IAgentRunResult>;
|
|
16
|
+
}
|
|
17
|
+
/** Structural session contract shared by local sessions and remote frontends. */
|
|
18
|
+
export interface IChatSession {
|
|
19
|
+
send(userMessage: string): Promise<IAgentRunResult>;
|
|
20
|
+
isBusy(): boolean;
|
|
21
|
+
getMessages(): ModelMessage[];
|
|
22
|
+
getUsage(): IChatUsage;
|
|
23
|
+
updateCallbacks(callbacks: Partial<IChatCallbacks>): void;
|
|
24
|
+
subscribe(callbacks: IChatCallbacks): () => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Callbacks for real-time streaming events during a turn.
|
|
28
|
+
*/
|
|
29
|
+
export interface IChatCallbacks {
|
|
30
|
+
/** Called for each streamed text token */
|
|
31
|
+
onToken?: (delta: string) => void;
|
|
32
|
+
/** Called when a tool call starts */
|
|
33
|
+
onToolCall?: (name: string, input: unknown) => void;
|
|
34
|
+
/** Called when a tool call completes */
|
|
35
|
+
onToolResult?: (name: string, result: unknown) => void;
|
|
36
|
+
/** Called when a turn completes */
|
|
37
|
+
onTurnComplete?: (result: IAgentRunResult) => void;
|
|
38
|
+
/** Called on error */
|
|
39
|
+
onError?: (error: Error) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Events emitted during chat.
|
|
43
|
+
*/
|
|
44
|
+
export type TChatEvent = {
|
|
45
|
+
type: 'token';
|
|
46
|
+
delta: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'tool_call_start';
|
|
49
|
+
name: string;
|
|
50
|
+
input: unknown;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'tool_call_end';
|
|
53
|
+
name: string;
|
|
54
|
+
result: string;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'turn_start';
|
|
57
|
+
} | {
|
|
58
|
+
type: 'turn_complete';
|
|
59
|
+
result: IAgentRunResult;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'error';
|
|
62
|
+
error: Error;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Usage stats accumulated across all turns.
|
|
66
|
+
*/
|
|
67
|
+
export interface IChatUsage {
|
|
68
|
+
inputTokens: number;
|
|
69
|
+
outputTokens: number;
|
|
70
|
+
totalTokens: number;
|
|
71
|
+
turns: number;
|
|
72
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { runAgent } from '@modelprofile.com/flexharness-agent/runner';
|
|
2
|
+
export { runAgent };
|
|
3
|
+
export type { IAgentRunOptions, IAgentRunResult } from '@modelprofile.com/flexharness-agent/runner';
|
|
4
|
+
export type { TSmartAiLanguageModel, ModelMessage, ToolSet } from '@modelprofile.com/flexharness-models';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @modelprofile.com/flexharness-agent
|
|
2
|
+
import { runAgent } from '@modelprofile.com/flexharness-agent/runner';
|
|
3
|
+
export { runAgent };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXQvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { React } from './plugins.js';
|
|
2
|
+
import type { TSmartAiLanguageModel, ToolSet } from './plugins.js';
|
|
3
|
+
export interface IChatAppProps {
|
|
4
|
+
model: TSmartAiLanguageModel;
|
|
5
|
+
system?: string;
|
|
6
|
+
tools?: ToolSet;
|
|
7
|
+
maxSteps?: number;
|
|
8
|
+
modelName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function ChatApp({ model, system, tools, maxSteps, modelName }: IChatAppProps): React.ReactElement;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { React, h, Box, Text, useInput, useApp, ChatSession } from './plugins.js';
|
|
2
|
+
import { MessageList } from './components.messagelist.js';
|
|
3
|
+
import { InputArea } from './components.inputarea.js';
|
|
4
|
+
import { StatusBar } from './components.statusbar.js';
|
|
5
|
+
const emptyUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0, turns: 0 };
|
|
6
|
+
export function ChatApp({ model, system, tools, maxSteps, modelName }) {
|
|
7
|
+
const { exit } = useApp();
|
|
8
|
+
const [messages, setMessages] = React.useState([]);
|
|
9
|
+
const [streamingText, setStreamingText] = React.useState('');
|
|
10
|
+
const [busy, setBusy] = React.useState(false);
|
|
11
|
+
const [usage, setUsage] = React.useState({ ...emptyUsage });
|
|
12
|
+
const sessionRef = React.useRef(null);
|
|
13
|
+
if (!sessionRef.current) {
|
|
14
|
+
sessionRef.current = new ChatSession({ model, system, tools, maxSteps: maxSteps ?? 20 }, {
|
|
15
|
+
onToken: (delta) => {
|
|
16
|
+
setStreamingText((prev) => prev + delta);
|
|
17
|
+
},
|
|
18
|
+
onToolCall: (name, input) => {
|
|
19
|
+
setMessages((prev) => [
|
|
20
|
+
...prev,
|
|
21
|
+
{
|
|
22
|
+
role: 'tool',
|
|
23
|
+
content: '',
|
|
24
|
+
toolName: name,
|
|
25
|
+
toolInput: typeof input === 'string' ? input : JSON.stringify(input),
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
useInput((input, key) => {
|
|
32
|
+
if (input === 'c' && key.ctrl) {
|
|
33
|
+
exit();
|
|
34
|
+
}
|
|
35
|
+
if (input === 'l' && key.ctrl) {
|
|
36
|
+
setMessages([]);
|
|
37
|
+
setStreamingText('');
|
|
38
|
+
sessionRef.current?.clear();
|
|
39
|
+
setUsage({ ...emptyUsage });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const handleSubmit = async (text) => {
|
|
43
|
+
if (busy)
|
|
44
|
+
return;
|
|
45
|
+
if (text === '/clear') {
|
|
46
|
+
setMessages([]);
|
|
47
|
+
setStreamingText('');
|
|
48
|
+
sessionRef.current?.clear();
|
|
49
|
+
setUsage({ ...emptyUsage });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (text === '/quit' || text === '/exit') {
|
|
53
|
+
exit();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
setMessages((prev) => [...prev, { role: 'user', content: text }]);
|
|
57
|
+
setBusy(true);
|
|
58
|
+
setStreamingText('');
|
|
59
|
+
try {
|
|
60
|
+
const result = await sessionRef.current.send(text);
|
|
61
|
+
setStreamingText('');
|
|
62
|
+
setMessages((prev) => [...prev, { role: 'assistant', content: result.text }]);
|
|
63
|
+
setUsage(sessionRef.current.getUsage());
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
67
|
+
setMessages((prev) => [...prev, { role: 'assistant', content: `Error: ${errMsg}` }]);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
setBusy(false);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return h(Box, { flexDirection: 'column' }, h(Box, { paddingX: 1 }, h(Text, { bold: true, color: 'cyan' }, 'FlexChat'), modelName ? h(Text, { dimColor: true }, ` \u2014 ${modelName}`) : null), h(MessageList, { messages, streamingText, busy }), h(InputArea, { disabled: busy, onSubmit: handleSubmit }), h(StatusBar, { modelName, usage, busy }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5jaGF0YXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9jbGkvY29tcG9uZW50cy5jaGF0YXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFXdEQsTUFBTSxVQUFVLEdBQWUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFFN0YsTUFBTSxVQUFVLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQWlCO0lBQ2xGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUMxQixNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdELE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQWEsRUFBRSxH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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { React, h, Box, Text, TextInput } from './plugins.js';
|
|
2
|
+
export function InputArea({ disabled, onSubmit }) {
|
|
3
|
+
const [value, setValue] = React.useState('');
|
|
4
|
+
const handleSubmit = (text) => {
|
|
5
|
+
if (!text.trim())
|
|
6
|
+
return;
|
|
7
|
+
onSubmit(text.trim());
|
|
8
|
+
setValue('');
|
|
9
|
+
};
|
|
10
|
+
return h(Box, { borderStyle: 'single', borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, paddingX: 1 }, h(Text, { bold: true, color: disabled ? 'gray' : 'cyan' }, '> '), h(TextInput, {
|
|
11
|
+
value,
|
|
12
|
+
onChange: setValue,
|
|
13
|
+
onSubmit: handleSubmit,
|
|
14
|
+
placeholder: disabled ? 'Waiting for response...' : 'Type a message...',
|
|
15
|
+
focus: !disabled,
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5pbnB1dGFyZWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2NsaS9jb21wb25lbnRzLmlucHV0YXJlYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQU85RCxNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBbUI7SUFDL0QsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1FBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0QixRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixPQUFPLENBQUMsQ0FDTixHQUFHLEVBQ0gsRUFBRSxXQUFXLEVBQUUsUUFBaUIsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDNUgsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFDaEUsQ0FBQyxDQUFDLFNBQVMsRUFBRTtRQUNYLEtBQUs7UUFDTCxRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRLEVBQUUsWUFBWTtRQUN0QixXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBQ3ZFLEtBQUssRUFBRSxDQUFDLFFBQVE7S0FDakIsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { React } from './plugins.js';
|
|
2
|
+
export interface IChatMessage {
|
|
3
|
+
role: 'user' | 'assistant' | 'tool';
|
|
4
|
+
content: string;
|
|
5
|
+
toolName?: string;
|
|
6
|
+
toolInput?: string;
|
|
7
|
+
}
|
|
8
|
+
interface IMessageProps {
|
|
9
|
+
message: IChatMessage;
|
|
10
|
+
}
|
|
11
|
+
export declare function Message({ message }: IMessageProps): React.ReactElement | null;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { React, h, Box, Text } from './plugins.js';
|
|
2
|
+
function truncate(text, maxLen) {
|
|
3
|
+
if (text.length <= maxLen)
|
|
4
|
+
return text;
|
|
5
|
+
return text.substring(0, maxLen) + '...';
|
|
6
|
+
}
|
|
7
|
+
export function Message({ message }) {
|
|
8
|
+
switch (message.role) {
|
|
9
|
+
case 'user':
|
|
10
|
+
return h(Box, { marginY: 0 }, h(Text, { bold: true, color: 'blue' }, 'You: '), h(Text, null, message.content));
|
|
11
|
+
case 'assistant':
|
|
12
|
+
return h(Box, { marginY: 0 }, h(Text, { bold: true, color: 'green' }, 'Assistant: '), h(Text, null, message.content));
|
|
13
|
+
case 'tool':
|
|
14
|
+
return h(Box, { marginY: 0, marginLeft: 2, flexDirection: 'column' }, h(Text, { dimColor: true }, `tool: ${message.toolName}${message.toolInput ? ` (${message.toolInput})` : ''}`), message.content
|
|
15
|
+
? h(Box, { marginLeft: 2 }, h(Text, { dimColor: true }, truncate(message.content, 200)))
|
|
16
|
+
: null);
|
|
17
|
+
default:
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5tZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9jbGkvY29tcG9uZW50cy5tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFhbkQsU0FBUyxRQUFRLENBQUMsSUFBWSxFQUFFLE1BQWM7SUFDNUMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBaUI7SUFDaEQsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUMxQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQy9DLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FDL0IsQ0FBQztRQUVKLEtBQUssV0FBVztZQUNkLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFDMUIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUN0RCxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQy9CLENBQUM7UUFFSixLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQWlCLEVBQUUsRUFDM0UsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFDeEIsU0FBUyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDakYsRUFDRCxPQUFPLENBQUMsT0FBTztnQkFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFDdEIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUM1RDtnQkFDSCxDQUFDLENBQUMsSUFBSSxDQUNULENBQUM7UUFFSjtZQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { React } from './plugins.js';
|
|
2
|
+
import { type IChatMessage } from './components.message.js';
|
|
3
|
+
interface IMessageListProps {
|
|
4
|
+
messages: IChatMessage[];
|
|
5
|
+
streamingText: string;
|
|
6
|
+
busy: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function MessageList({ messages, streamingText, busy }: IMessageListProps): React.ReactElement;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { React, h, Box, Text } from './plugins.js';
|
|
2
|
+
import { Message } from './components.message.js';
|
|
3
|
+
export function MessageList({ messages, streamingText, busy }) {
|
|
4
|
+
const children = [];
|
|
5
|
+
if (messages.length === 0 && !busy) {
|
|
6
|
+
children.push(h(Box, { justifyContent: 'center', marginY: 1, key: 'empty' }, h(Text, { dimColor: true }, 'Type a message to start chatting.')));
|
|
7
|
+
}
|
|
8
|
+
for (let i = 0; i < messages.length; i++) {
|
|
9
|
+
children.push(h(Message, { key: `msg-${i}`, message: messages[i] }));
|
|
10
|
+
}
|
|
11
|
+
if (busy && streamingText) {
|
|
12
|
+
children.push(h(Box, { marginY: 0, key: 'streaming' }, h(Text, { bold: true, color: 'green' }, 'Assistant: '), h(Text, null, streamingText), h(Text, { dimColor: true }, '\u2588')));
|
|
13
|
+
}
|
|
14
|
+
if (busy && !streamingText) {
|
|
15
|
+
children.push(h(Box, { marginY: 0, key: 'spinner' }, h(Text, { color: 'yellow' }, '\u25CF'), h(Text, { dimColor: true }, ' Thinking...')));
|
|
16
|
+
}
|
|
17
|
+
return h(Box, { flexDirection: 'column', flexGrow: 1 }, ...children);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5tZXNzYWdlbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfY2xpL2NvbXBvbmVudHMubWVzc2FnZWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBUXJFLE1BQU0sVUFBVSxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBcUI7SUFDOUUsTUFBTSxRQUFRLEdBQXNCLEVBQUUsQ0FBQztJQUV2QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLElBQUksQ0FDWCxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFDM0QsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxtQ0FBbUMsQ0FBQyxDQUNqRSxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUMxQixRQUFRLENBQUMsSUFBSSxDQUNYLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFDckMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUN0RCxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsRUFDNUIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FDdEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksQ0FDWCxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQ25DLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQ3RDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQzVDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLEVBQUUsUUFBaUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUNoRixDQUFDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { React } from './plugins.js';
|
|
2
|
+
import type { IChatUsage } from './plugins.js';
|
|
3
|
+
interface IStatusBarProps {
|
|
4
|
+
modelName?: string;
|
|
5
|
+
usage: IChatUsage;
|
|
6
|
+
busy: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function StatusBar({ modelName, usage, busy }: IStatusBarProps): React.ReactElement;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { React, h, Box, Text } from './plugins.js';
|
|
2
|
+
export function StatusBar({ modelName, usage, busy }) {
|
|
3
|
+
const children = [
|
|
4
|
+
h(Text, { dimColor: true, key: 'model' }, modelName ? `model: ${modelName}` : 'FlexChat'),
|
|
5
|
+
h(Text, { dimColor: true, key: 'sep1' }, ' | '),
|
|
6
|
+
h(Text, { dimColor: true, key: 'tokens' }, `tokens: ${usage.totalTokens.toLocaleString()}`),
|
|
7
|
+
h(Text, { dimColor: true, key: 'sep2' }, ' | '),
|
|
8
|
+
h(Text, { dimColor: true, key: 'turns' }, `turns: ${usage.turns}`),
|
|
9
|
+
];
|
|
10
|
+
if (busy) {
|
|
11
|
+
children.push(h(Text, { dimColor: true, key: 'sep3' }, ' | '), h(Text, { color: 'yellow', key: 'thinking' }, 'thinking...'));
|
|
12
|
+
}
|
|
13
|
+
return h(Box, { borderStyle: 'single', borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, paddingX: 1 }, ...children);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5zdGF0dXNiYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2NsaS9jb21wb25lbnRzLnN0YXR1c2Jhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU25ELE1BQU0sVUFBVSxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBbUI7SUFDbkUsTUFBTSxRQUFRLEdBQXNCO1FBQ2xDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUN6RixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxXQUFXLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUMzRixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNuRSxDQUFDO0lBRUYsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULFFBQVEsQ0FBQyxJQUFJLENBQ1gsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUMvQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQzdELENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLENBQ04sR0FBRyxFQUNILEVBQUUsV0FBVyxFQUFFLFFBQWlCLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQzVILEdBQUcsUUFBUSxDQUNaLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { startChat } from './startchat.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2NsaS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUMifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { render, Box, Text, Static, Newline, Spacer, useInput, useApp } from 'ink';
|
|
2
|
+
export { render, Box, Text, Static, Newline, Spacer, useInput, useApp };
|
|
3
|
+
import TextInput from 'ink-text-input';
|
|
4
|
+
export { TextInput };
|
|
5
|
+
import React from 'react';
|
|
6
|
+
export { React };
|
|
7
|
+
export declare const h: typeof React.createElement;
|
|
8
|
+
import { ChatSession } from '@modelprofile.com/flexharness/chat';
|
|
9
|
+
export { ChatSession };
|
|
10
|
+
export type { IChatSessionOptions, IChatCallbacks, IChatUsage } from '@modelprofile.com/flexharness/chat';
|
|
11
|
+
export type { IAgentRunResult } from '@modelprofile.com/flexharness-agent';
|
|
12
|
+
export type { TSmartAiLanguageModel, ToolSet } from '@modelprofile.com/flexharness-models';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// ink (React-based terminal UI)
|
|
2
|
+
import { render, Box, Text, Static, Newline, Spacer, useInput, useApp } from 'ink';
|
|
3
|
+
export { render, Box, Text, Static, Newline, Spacer, useInput, useApp };
|
|
4
|
+
// ink components
|
|
5
|
+
import TextInput from 'ink-text-input';
|
|
6
|
+
export { TextInput };
|
|
7
|
+
// React
|
|
8
|
+
import React from 'react';
|
|
9
|
+
export { React };
|
|
10
|
+
export const h = React.createElement;
|
|
11
|
+
// Core (cross-folder import)
|
|
12
|
+
import { ChatSession } from '@modelprofile.com/flexharness/chat';
|
|
13
|
+
export { ChatSession };
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfY2xpL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFFeEUsaUJBQWlCO0FBQ2pCLE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUVyQixRQUFRO0FBQ1IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztBQUVyQyw2QkFBNkI7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TSmartAiLanguageModel, ToolSet } from './plugins.js';
|
|
2
|
+
export interface IStartChatOptions {
|
|
3
|
+
/** The language model to use */
|
|
4
|
+
model: TSmartAiLanguageModel;
|
|
5
|
+
/** System prompt for the agent */
|
|
6
|
+
system?: string;
|
|
7
|
+
/** Tools available to the agent */
|
|
8
|
+
tools?: ToolSet;
|
|
9
|
+
/** Maximum agentic steps per turn */
|
|
10
|
+
maxSteps?: number;
|
|
11
|
+
/** Display name for the model (shown in header/status) */
|
|
12
|
+
modelName?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Start an interactive chat TUI in the terminal.
|
|
16
|
+
* Returns a promise that resolves when the user exits.
|
|
17
|
+
*/
|
|
18
|
+
export declare function startChat(options: IStartChatOptions): Promise<void>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { React, h, render } from './plugins.js';
|
|
2
|
+
import { ChatApp } from './components.chatapp.js';
|
|
3
|
+
/**
|
|
4
|
+
* Start an interactive chat TUI in the terminal.
|
|
5
|
+
* Returns a promise that resolves when the user exits.
|
|
6
|
+
*/
|
|
7
|
+
export async function startChat(options) {
|
|
8
|
+
const instance = render(h(ChatApp, {
|
|
9
|
+
model: options.model,
|
|
10
|
+
system: options.system,
|
|
11
|
+
tools: options.tools,
|
|
12
|
+
maxSteps: options.maxSteps,
|
|
13
|
+
modelName: options.modelName,
|
|
14
|
+
}));
|
|
15
|
+
await instance.waitUntilExit();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRjaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9jbGkvc3RhcnRjaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFlbEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBMEI7SUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUNyQixDQUFDLENBQUMsT0FBTyxFQUFFO1FBQ1QsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztLQUM3QixDQUFDLENBQ0gsQ0FBQztJQUVGLE1BQU0sUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBQ2pDLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LitElement } from './plugins.js';
|
|
2
|
+
import type { CSSResult, TemplateResult } from './plugins.js';
|
|
3
|
+
export declare class FlexChatInput extends LitElement {
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
placeholder: string;
|
|
6
|
+
private value;
|
|
7
|
+
static properties: {
|
|
8
|
+
disabled: {
|
|
9
|
+
type: BooleanConstructor;
|
|
10
|
+
};
|
|
11
|
+
placeholder: {
|
|
12
|
+
type: StringConstructor;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
static styles: CSSResult;
|
|
16
|
+
constructor();
|
|
17
|
+
private handleKeydown;
|
|
18
|
+
private handleInput;
|
|
19
|
+
private submit;
|
|
20
|
+
render(): TemplateResult;
|
|
21
|
+
}
|