@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.
Files changed (169) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts_chat/classes.chatsession.d.ts +37 -0
  3. package/dist_ts_chat/classes.chatsession.js +102 -0
  4. package/dist_ts_chat/index.d.ts +2 -0
  5. package/dist_ts_chat/index.js +2 -0
  6. package/dist_ts_chat/interfaces.d.ts +72 -0
  7. package/dist_ts_chat/interfaces.js +2 -0
  8. package/dist_ts_chat/plugins.d.ts +4 -0
  9. package/dist_ts_chat/plugins.js +4 -0
  10. package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
  11. package/dist_ts_chat_cli/components.chatapp.js +75 -0
  12. package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
  13. package/dist_ts_chat_cli/components.inputarea.js +18 -0
  14. package/dist_ts_chat_cli/components.message.d.ts +12 -0
  15. package/dist_ts_chat_cli/components.message.js +21 -0
  16. package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
  17. package/dist_ts_chat_cli/components.messagelist.js +19 -0
  18. package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
  19. package/dist_ts_chat_cli/components.statusbar.js +15 -0
  20. package/dist_ts_chat_cli/index.d.ts +2 -0
  21. package/dist_ts_chat_cli/index.js +2 -0
  22. package/dist_ts_chat_cli/plugins.d.ts +12 -0
  23. package/dist_ts_chat_cli/plugins.js +14 -0
  24. package/dist_ts_chat_cli/startchat.d.ts +18 -0
  25. package/dist_ts_chat_cli/startchat.js +17 -0
  26. package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
  27. package/dist_ts_chat_web/flexchat-input.js +172 -0
  28. package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
  29. package/dist_ts_chat_web/flexchat-message.js +174 -0
  30. package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
  31. package/dist_ts_chat_web/flexchat-window.js +394 -0
  32. package/dist_ts_chat_web/index.d.ts +3 -0
  33. package/dist_ts_chat_web/index.js +4 -0
  34. package/dist_ts_chat_web/plugins.d.ts +6 -0
  35. package/dist_ts_chat_web/plugins.js +4 -0
  36. package/dist_ts_compaction/index.d.ts +2 -0
  37. package/dist_ts_compaction/index.js +2 -0
  38. package/dist_ts_compaction/plugins.d.ts +4 -0
  39. package/dist_ts_compaction/plugins.js +3 -0
  40. package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
  41. package/dist_ts_compaction/smartagent.compaction.js +49 -0
  42. package/dist_ts_document/index.d.ts +19 -0
  43. package/dist_ts_document/index.js +55 -0
  44. package/dist_ts_document/plugins.d.ts +3 -0
  45. package/dist_ts_document/plugins.js +4 -0
  46. package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
  47. package/dist_ts_kvm/classes.browserkvm.js +271 -0
  48. package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
  49. package/dist_ts_kvm/classes.kvmterminal.js +88 -0
  50. package/dist_ts_kvm/commandwrappers.d.ts +14 -0
  51. package/dist_ts_kvm/commandwrappers.js +58 -0
  52. package/dist_ts_kvm/index.d.ts +6 -0
  53. package/dist_ts_kvm/index.js +7 -0
  54. package/dist_ts_kvm/interfaces.d.ts +106 -0
  55. package/dist_ts_kvm/interfaces.js +2 -0
  56. package/dist_ts_kvm/ocr.d.ts +14 -0
  57. package/dist_ts_kvm/ocr.js +23 -0
  58. package/dist_ts_kvm/plugins.d.ts +6 -0
  59. package/dist_ts_kvm/plugins.js +10 -0
  60. package/dist_ts_kvm/tools.d.ts +15 -0
  61. package/dist_ts_kvm/tools.js +40 -0
  62. package/dist_ts_mcp/index.d.ts +86 -0
  63. package/dist_ts_mcp/index.js +284 -0
  64. package/dist_ts_mcp/requestcontext.d.ts +11 -0
  65. package/dist_ts_mcp/requestcontext.js +42 -0
  66. package/dist_ts_media/index.d.ts +8 -0
  67. package/dist_ts_media/index.js +21 -0
  68. package/dist_ts_media/plugins.d.ts +2 -0
  69. package/dist_ts_media/plugins.js +3 -0
  70. package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
  71. package/dist_ts_ocr/classes.imageocr.js +27 -0
  72. package/dist_ts_ocr/index.d.ts +2 -0
  73. package/dist_ts_ocr/index.js +3 -0
  74. package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
  75. package/dist_ts_ocr/ocr.mistral.js +77 -0
  76. package/dist_ts_tools/index.d.ts +17 -0
  77. package/dist_ts_tools/index.js +10 -0
  78. package/dist_ts_tools/plugins.d.ts +7 -0
  79. package/dist_ts_tools/plugins.js +6 -0
  80. package/dist_ts_tools/tool.browser.d.ts +11 -0
  81. package/dist_ts_tools/tool.browser.js +128 -0
  82. package/dist_ts_tools/tool.context.d.ts +4 -0
  83. package/dist_ts_tools/tool.context.js +23 -0
  84. package/dist_ts_tools/tool.filesystem.d.ts +11 -0
  85. package/dist_ts_tools/tool.filesystem.js +106 -0
  86. package/dist_ts_tools/tool.http.d.ts +2 -0
  87. package/dist_ts_tools/tool.http.js +65 -0
  88. package/dist_ts_tools/tool.json.d.ts +2 -0
  89. package/dist_ts_tools/tool.json.js +47 -0
  90. package/dist_ts_tools/tool.shell.d.ts +15 -0
  91. package/dist_ts_tools/tool.shell.js +329 -0
  92. package/dist_ts_tools/utils.truncation.d.ts +10 -0
  93. package/dist_ts_tools/utils.truncation.js +26 -0
  94. package/dist_ts_tools_node/index.d.ts +5 -0
  95. package/dist_ts_tools_node/index.js +4 -0
  96. package/dist_ts_tools_node/plugins.d.ts +13 -0
  97. package/dist_ts_tools_node/plugins.js +13 -0
  98. package/dist_ts_tools_node/tool.context.d.ts +31 -0
  99. package/dist_ts_tools_node/tool.context.js +837 -0
  100. package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
  101. package/dist_ts_tools_node/tool.persistence.js +129 -0
  102. package/dist_ts_tools_node/tools.local.d.ts +11 -0
  103. package/dist_ts_tools_node/tools.local.js +15 -0
  104. package/package.json +112 -4
  105. package/readme.md +122 -66
  106. package/ts/00_commitinfo_data.ts +1 -1
  107. package/ts/readme.md +122 -66
  108. package/ts_chat/classes.chatsession.ts +116 -0
  109. package/ts_chat/index.ts +8 -0
  110. package/ts_chat/interfaces.ts +64 -0
  111. package/ts_chat/plugins.ts +7 -0
  112. package/ts_chat/readme.md +49 -0
  113. package/ts_chat_cli/components.chatapp.ts +103 -0
  114. package/ts_chat_cli/components.inputarea.ts +29 -0
  115. package/ts_chat_cli/components.message.ts +48 -0
  116. package/ts_chat_cli/components.messagelist.ts +45 -0
  117. package/ts_chat_cli/components.statusbar.ts +31 -0
  118. package/ts_chat_cli/index.ts +2 -0
  119. package/ts_chat_cli/plugins.ts +21 -0
  120. package/ts_chat_cli/readme.md +40 -0
  121. package/ts_chat_cli/startchat.ts +34 -0
  122. package/ts_chat_web/flexchat-input.ts +184 -0
  123. package/ts_chat_web/flexchat-message.ts +185 -0
  124. package/ts_chat_web/flexchat-window.ts +416 -0
  125. package/ts_chat_web/index.ts +3 -0
  126. package/ts_chat_web/plugins.ts +9 -0
  127. package/ts_chat_web/readme.md +46 -0
  128. package/ts_compaction/index.ts +2 -0
  129. package/ts_compaction/plugins.ts +6 -0
  130. package/ts_compaction/readme.md +37 -0
  131. package/ts_compaction/smartagent.compaction.ts +59 -0
  132. package/ts_document/index.ts +82 -0
  133. package/ts_document/plugins.ts +3 -0
  134. package/ts_document/readme.md +49 -0
  135. package/ts_kvm/classes.browserkvm.ts +335 -0
  136. package/ts_kvm/classes.kvmterminal.ts +103 -0
  137. package/ts_kvm/commandwrappers.ts +83 -0
  138. package/ts_kvm/index.ts +6 -0
  139. package/ts_kvm/interfaces.ts +152 -0
  140. package/ts_kvm/ocr.ts +41 -0
  141. package/ts_kvm/plugins.ts +13 -0
  142. package/ts_kvm/readme.md +482 -0
  143. package/ts_kvm/tools.ts +58 -0
  144. package/ts_mcp/index.ts +470 -0
  145. package/ts_mcp/readme.md +37 -0
  146. package/ts_mcp/requestcontext.ts +66 -0
  147. package/ts_media/index.ts +29 -0
  148. package/ts_media/plugins.ts +2 -0
  149. package/ts_media/readme.md +37 -0
  150. package/ts_ocr/classes.imageocr.ts +53 -0
  151. package/ts_ocr/index.ts +2 -0
  152. package/ts_ocr/ocr.mistral.ts +192 -0
  153. package/ts_ocr/readme.md +48 -0
  154. package/ts_tools/index.ts +49 -0
  155. package/ts_tools/plugins.ts +7 -0
  156. package/ts_tools/readme.md +37 -0
  157. package/ts_tools/tool.browser.ts +159 -0
  158. package/ts_tools/tool.context.ts +23 -0
  159. package/ts_tools/tool.filesystem.ts +144 -0
  160. package/ts_tools/tool.http.ts +78 -0
  161. package/ts_tools/tool.json.ts +53 -0
  162. package/ts_tools/tool.shell.ts +418 -0
  163. package/ts_tools/utils.truncation.ts +39 -0
  164. package/ts_tools_node/index.ts +5 -0
  165. package/ts_tools_node/plugins.ts +16 -0
  166. package/ts_tools_node/readme.md +37 -0
  167. package/ts_tools_node/tool.context.ts +991 -0
  168. package/ts_tools_node/tool.persistence.ts +146 -0
  169. 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.1.0',
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
+ export type { IChatSession, IChatSessionOptions, IChatCallbacks, TChatEvent, IChatUsage, } from './interfaces.js';
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXQvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -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,7 @@
1
+ import { React } from './plugins.js';
2
+ interface IInputAreaProps {
3
+ disabled: boolean;
4
+ onSubmit: (text: string) => void;
5
+ }
6
+ export declare function InputArea({ disabled, onSubmit }: IInputAreaProps): React.ReactElement;
7
+ export {};
@@ -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
+ export type { IStartChatOptions } from './startchat.js';
@@ -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
+ }