@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
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { LitElement, html, css } from './plugins.js';
|
|
2
|
+
import './flexchat-message.js';
|
|
3
|
+
import './flexchat-input.js';
|
|
4
|
+
export class FlexChatWindow extends LitElement {
|
|
5
|
+
messages = [];
|
|
6
|
+
busy = false;
|
|
7
|
+
streamingText = '';
|
|
8
|
+
unsubscribe;
|
|
9
|
+
static properties = {
|
|
10
|
+
chatSession: { attribute: false },
|
|
11
|
+
placeholder: { type: String },
|
|
12
|
+
headerTitle: { type: String, attribute: 'header-title' },
|
|
13
|
+
};
|
|
14
|
+
static styles = css `
|
|
15
|
+
:host {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
height: 100%;
|
|
19
|
+
background: var(--flexchat-bg, #0c0c14);
|
|
20
|
+
color: var(--flexchat-text, #e4e4e7);
|
|
21
|
+
font-family: var(--flexchat-font, 'Inter', system-ui, -apple-system, sans-serif);
|
|
22
|
+
font-size: 14px;
|
|
23
|
+
line-height: 1.6;
|
|
24
|
+
border-radius: var(--flexchat-radius, 16px);
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ── Header ── */
|
|
29
|
+
.header {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: 12px;
|
|
33
|
+
padding: 14px 20px;
|
|
34
|
+
background: var(--flexchat-header-bg, rgba(255, 255, 255, 0.025));
|
|
35
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
|
|
36
|
+
flex-shrink: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.header-icon {
|
|
40
|
+
width: 34px;
|
|
41
|
+
height: 34px;
|
|
42
|
+
border-radius: 50%;
|
|
43
|
+
background: linear-gradient(135deg, #6366f1, #7c3aed);
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-content: center;
|
|
47
|
+
font-size: 15px;
|
|
48
|
+
color: #fff;
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
box-shadow: 0 2px 10px rgba(99, 102, 241, 0.35);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.header-info {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
gap: 1px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.header-title {
|
|
60
|
+
font-weight: 600;
|
|
61
|
+
font-size: 14px;
|
|
62
|
+
color: #f0f0f3;
|
|
63
|
+
letter-spacing: -0.01em;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.header-status {
|
|
67
|
+
font-size: 11px;
|
|
68
|
+
color: #71717a;
|
|
69
|
+
display: flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
gap: 5px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.status-dot {
|
|
75
|
+
width: 7px;
|
|
76
|
+
height: 7px;
|
|
77
|
+
border-radius: 50%;
|
|
78
|
+
background: #22c55e;
|
|
79
|
+
box-shadow: 0 0 6px rgba(34, 197, 94, 0.5);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.status-dot.busy {
|
|
83
|
+
background: #f59e0b;
|
|
84
|
+
box-shadow: 0 0 6px rgba(245, 158, 11, 0.5);
|
|
85
|
+
animation: pulse-dot 1.4s ease-in-out infinite;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@keyframes pulse-dot {
|
|
89
|
+
0%, 100% { opacity: 1; }
|
|
90
|
+
50% { opacity: 0.35; }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* ── Message List ── */
|
|
94
|
+
.message-list {
|
|
95
|
+
flex: 1;
|
|
96
|
+
overflow-y: auto;
|
|
97
|
+
padding: 16px 20px;
|
|
98
|
+
display: flex;
|
|
99
|
+
flex-direction: column;
|
|
100
|
+
gap: 0;
|
|
101
|
+
scroll-behavior: smooth;
|
|
102
|
+
overscroll-behavior: contain;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.message-list::-webkit-scrollbar {
|
|
106
|
+
width: 5px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.message-list::-webkit-scrollbar-track {
|
|
110
|
+
background: transparent;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.message-list::-webkit-scrollbar-thumb {
|
|
114
|
+
background: rgba(255, 255, 255, 0.07);
|
|
115
|
+
border-radius: 3px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.message-list::-webkit-scrollbar-thumb:hover {
|
|
119
|
+
background: rgba(255, 255, 255, 0.14);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* ── Empty State ── */
|
|
123
|
+
.empty-state {
|
|
124
|
+
display: flex;
|
|
125
|
+
flex-direction: column;
|
|
126
|
+
align-items: center;
|
|
127
|
+
justify-content: center;
|
|
128
|
+
flex: 1;
|
|
129
|
+
gap: 14px;
|
|
130
|
+
padding: 40px 20px;
|
|
131
|
+
text-align: center;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.empty-icon {
|
|
135
|
+
width: 56px;
|
|
136
|
+
height: 56px;
|
|
137
|
+
border-radius: 50%;
|
|
138
|
+
background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(124, 58, 237, 0.06));
|
|
139
|
+
border: 1px solid rgba(99, 102, 241, 0.12);
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
font-size: 22px;
|
|
144
|
+
color: #818cf8;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.empty-title {
|
|
148
|
+
font-size: 15px;
|
|
149
|
+
font-weight: 600;
|
|
150
|
+
color: #e4e4e7;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.empty-subtitle {
|
|
154
|
+
font-size: 13px;
|
|
155
|
+
color: #52525b;
|
|
156
|
+
max-width: 260px;
|
|
157
|
+
line-height: 1.5;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ── Streaming ── */
|
|
161
|
+
.streaming-row {
|
|
162
|
+
display: flex;
|
|
163
|
+
gap: 10px;
|
|
164
|
+
align-items: flex-end;
|
|
165
|
+
margin-bottom: 4px;
|
|
166
|
+
padding-top: 4px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.stream-avatar {
|
|
170
|
+
width: 28px;
|
|
171
|
+
height: 28px;
|
|
172
|
+
border-radius: 50%;
|
|
173
|
+
background: linear-gradient(135deg, #6366f1, #7c3aed);
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
justify-content: center;
|
|
177
|
+
font-size: 12px;
|
|
178
|
+
color: #fff;
|
|
179
|
+
flex-shrink: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.stream-bubble {
|
|
183
|
+
background: #1e1e2e;
|
|
184
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
185
|
+
color: #d1d5db;
|
|
186
|
+
padding: 10px 14px;
|
|
187
|
+
border-radius: 18px;
|
|
188
|
+
border-bottom-left-radius: 6px;
|
|
189
|
+
max-width: min(75%, 480px);
|
|
190
|
+
white-space: pre-wrap;
|
|
191
|
+
word-break: break-word;
|
|
192
|
+
font-size: 14px;
|
|
193
|
+
line-height: 1.55;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.cursor {
|
|
197
|
+
display: inline-block;
|
|
198
|
+
width: 2px;
|
|
199
|
+
height: 1.1em;
|
|
200
|
+
background: #818cf8;
|
|
201
|
+
vertical-align: text-bottom;
|
|
202
|
+
margin-left: 1px;
|
|
203
|
+
animation: cursor-blink 0.8s step-end infinite;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@keyframes cursor-blink {
|
|
207
|
+
50% { opacity: 0; }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* ── Thinking Indicator ── */
|
|
211
|
+
.thinking-bubble {
|
|
212
|
+
display: inline-flex;
|
|
213
|
+
align-items: center;
|
|
214
|
+
gap: 5px;
|
|
215
|
+
padding: 12px 18px;
|
|
216
|
+
background: #1e1e2e;
|
|
217
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
218
|
+
border-radius: 18px;
|
|
219
|
+
border-bottom-left-radius: 6px;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.thinking-dot {
|
|
223
|
+
width: 7px;
|
|
224
|
+
height: 7px;
|
|
225
|
+
border-radius: 50%;
|
|
226
|
+
background: #6366f1;
|
|
227
|
+
animation: thinking-bounce 1.4s ease-in-out infinite;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.thinking-dot:nth-child(2) { animation-delay: 0.16s; }
|
|
231
|
+
.thinking-dot:nth-child(3) { animation-delay: 0.32s; }
|
|
232
|
+
|
|
233
|
+
@keyframes thinking-bounce {
|
|
234
|
+
0%, 60%, 100% {
|
|
235
|
+
transform: translateY(0);
|
|
236
|
+
opacity: 0.3;
|
|
237
|
+
}
|
|
238
|
+
30% {
|
|
239
|
+
transform: translateY(-5px);
|
|
240
|
+
opacity: 1;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ── Input Area ── */
|
|
245
|
+
.input-area {
|
|
246
|
+
padding: 12px 20px 16px;
|
|
247
|
+
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
|
248
|
+
background: var(--flexchat-input-area-bg, rgba(255, 255, 255, 0.015));
|
|
249
|
+
flex-shrink: 0;
|
|
250
|
+
}
|
|
251
|
+
`;
|
|
252
|
+
constructor() {
|
|
253
|
+
super();
|
|
254
|
+
this.placeholder = 'Type a message...';
|
|
255
|
+
this.headerTitle = 'FlexChat';
|
|
256
|
+
}
|
|
257
|
+
connectedCallback() {
|
|
258
|
+
super.connectedCallback();
|
|
259
|
+
this.bindSession();
|
|
260
|
+
}
|
|
261
|
+
disconnectedCallback() {
|
|
262
|
+
this.unsubscribe?.();
|
|
263
|
+
this.unsubscribe = undefined;
|
|
264
|
+
super.disconnectedCallback();
|
|
265
|
+
}
|
|
266
|
+
updated(changed) {
|
|
267
|
+
if (changed.has('chatSession'))
|
|
268
|
+
this.bindSession();
|
|
269
|
+
}
|
|
270
|
+
bindSession() {
|
|
271
|
+
this.unsubscribe?.();
|
|
272
|
+
this.unsubscribe = undefined;
|
|
273
|
+
if (this.isConnected && this.chatSession) {
|
|
274
|
+
this.unsubscribe = this.chatSession.subscribe({
|
|
275
|
+
onToken: (delta) => {
|
|
276
|
+
this.streamingText += delta;
|
|
277
|
+
this.requestUpdate();
|
|
278
|
+
this.scrollToBottom();
|
|
279
|
+
},
|
|
280
|
+
onToolCall: (name) => {
|
|
281
|
+
this.messages = [
|
|
282
|
+
...this.messages,
|
|
283
|
+
{ role: 'tool', content: '', toolName: name, timestamp: Date.now() },
|
|
284
|
+
];
|
|
285
|
+
this.requestUpdate();
|
|
286
|
+
this.scrollToBottom();
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
scrollToBottom() {
|
|
292
|
+
requestAnimationFrame(() => {
|
|
293
|
+
const list = this.shadowRoot?.querySelector('.message-list');
|
|
294
|
+
if (list) {
|
|
295
|
+
list.scrollTop = list.scrollHeight;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async handleSend(e) {
|
|
300
|
+
if (this.busy)
|
|
301
|
+
return;
|
|
302
|
+
const text = e.detail.text;
|
|
303
|
+
this.messages = [...this.messages, { role: 'user', content: text, timestamp: Date.now() }];
|
|
304
|
+
this.busy = true;
|
|
305
|
+
this.streamingText = '';
|
|
306
|
+
this.requestUpdate();
|
|
307
|
+
this.scrollToBottom();
|
|
308
|
+
try {
|
|
309
|
+
const result = await this.chatSession.send(text);
|
|
310
|
+
this.streamingText = '';
|
|
311
|
+
this.messages = [...this.messages, { role: 'assistant', content: result.text, timestamp: Date.now() }];
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
315
|
+
this.messages = [
|
|
316
|
+
...this.messages,
|
|
317
|
+
{ role: 'assistant', content: `Error: ${errMsg}`, timestamp: Date.now() },
|
|
318
|
+
];
|
|
319
|
+
}
|
|
320
|
+
finally {
|
|
321
|
+
this.busy = false;
|
|
322
|
+
this.requestUpdate();
|
|
323
|
+
this.scrollToBottom();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
render() {
|
|
327
|
+
return html `
|
|
328
|
+
<div class="header">
|
|
329
|
+
<div class="header-icon">✦</div>
|
|
330
|
+
<div class="header-info">
|
|
331
|
+
<div class="header-title">${this.headerTitle}</div>
|
|
332
|
+
<div class="header-status">
|
|
333
|
+
<span class="status-dot ${this.busy ? 'busy' : ''}"></span>
|
|
334
|
+
${this.busy ? 'Thinking...' : 'Online'}
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
|
|
339
|
+
<div class="message-list">
|
|
340
|
+
${this.messages.length === 0 && !this.busy
|
|
341
|
+
? html `
|
|
342
|
+
<div class="empty-state">
|
|
343
|
+
<div class="empty-icon">✦</div>
|
|
344
|
+
<div class="empty-title">Start a conversation</div>
|
|
345
|
+
<div class="empty-subtitle">
|
|
346
|
+
Send a message below to begin chatting.
|
|
347
|
+
</div>
|
|
348
|
+
</div>
|
|
349
|
+
`
|
|
350
|
+
: ''}
|
|
351
|
+
${this.messages.map((msg) => html `
|
|
352
|
+
<flexchat-message
|
|
353
|
+
role=${msg.role}
|
|
354
|
+
content=${msg.content}
|
|
355
|
+
.toolName=${msg.toolName ?? ''}
|
|
356
|
+
.timestamp=${msg.timestamp ?? 0}
|
|
357
|
+
></flexchat-message>
|
|
358
|
+
`)}
|
|
359
|
+
${this.busy && this.streamingText
|
|
360
|
+
? html `
|
|
361
|
+
<div class="streaming-row">
|
|
362
|
+
<div class="stream-avatar">✦</div>
|
|
363
|
+
<div class="stream-bubble">
|
|
364
|
+
${this.streamingText}<span class="cursor"></span>
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
367
|
+
`
|
|
368
|
+
: ''}
|
|
369
|
+
${this.busy && !this.streamingText
|
|
370
|
+
? html `
|
|
371
|
+
<div class="streaming-row">
|
|
372
|
+
<div class="stream-avatar">✦</div>
|
|
373
|
+
<div class="thinking-bubble">
|
|
374
|
+
<span class="thinking-dot"></span>
|
|
375
|
+
<span class="thinking-dot"></span>
|
|
376
|
+
<span class="thinking-dot"></span>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
`
|
|
380
|
+
: ''}
|
|
381
|
+
</div>
|
|
382
|
+
|
|
383
|
+
<div class="input-area">
|
|
384
|
+
<flexchat-input
|
|
385
|
+
?disabled=${this.busy}
|
|
386
|
+
placeholder=${this.placeholder}
|
|
387
|
+
@send=${this.handleSend}
|
|
388
|
+
></flexchat-input>
|
|
389
|
+
</div>
|
|
390
|
+
`;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
customElements.define('flexchat-window', FlexChatWindow);
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleGNoYXQtd2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF93ZWIvZmxleGNoYXQtd2luZG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8scUJBQXFCLENBQUM7QUFTN0IsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFVO0lBSXBDLFFBQVEsR0FBc0IsRUFBRSxDQUFDO0lBQ2pDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ25CLFdBQVcsQ0FBMkI7SUFFOUMsTUFBTSxDQUFDLFVBQVUsR0FBRztRQUNsQixXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQ2pDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7UUFDN0IsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO0tBQ3pELENBQUM7SUFFRixNQUFNLENBQUMsTUFBTSxHQUFjLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNk83QixDQUFDO0lBRUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFDdkMsSUFBSSxDQUFD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
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { FlexChatWindow } from './flexchat-window.js';
|
|
2
|
+
export { FlexChatMessage } from './flexchat-message.js';
|
|
3
|
+
export { FlexChatInput } from './flexchat-input.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X3dlYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { LitElement, html, css } from 'lit';
|
|
2
|
+
export { LitElement, html, css };
|
|
3
|
+
export type { TemplateResult, CSSResult, PropertyValues } from 'lit';
|
|
4
|
+
export type { IChatSession } from '@modelprofile.com/flexharness/chat';
|
|
5
|
+
export type { IChatSessionOptions, IChatCallbacks, IChatUsage } from '@modelprofile.com/flexharness/chat';
|
|
6
|
+
export type { IAgentRunResult } from '@modelprofile.com/flexharness-agent';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Lit
|
|
2
|
+
import { LitElement, html, css } from 'lit';
|
|
3
|
+
export { LitElement, html, css };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfd2ViL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { compactMessages } from './smartagent.compaction.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jb21wYWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { generateText } from 'ai';
|
|
2
|
+
export { generateText };
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NvbXBhY3Rpb24vcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export interface ICompactMessagesOptions {
|
|
3
|
+
abortSignal?: AbortSignal;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Compacts a message history into a summary.
|
|
7
|
+
* Pass this as the onContextOverflow handler in IAgentRunOptions.
|
|
8
|
+
*
|
|
9
|
+
* @param model The same model used by runAgent, or a cheaper small model
|
|
10
|
+
* @param messages The full message history that overflowed
|
|
11
|
+
* @param options Invocation options, including cancellation
|
|
12
|
+
* @returns A minimal ModelMessage[] containing the summary as context
|
|
13
|
+
*/
|
|
14
|
+
export declare function compactMessages(model: plugins.TSmartAiLanguageModel, messages: plugins.ModelMessage[], options?: ICompactMessagesOptions): Promise<plugins.ModelMessage[]>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
const COMPACTION_PROMPT = `Provide a detailed prompt for continuing our conversation above.
|
|
3
|
+
Focus on information that would be helpful for continuing the conversation, including what we did, what we're doing, which files we're working on, and what we're going to do next.
|
|
4
|
+
The summary that you construct will be used so that another agent can read it and continue the work.
|
|
5
|
+
|
|
6
|
+
When constructing the summary, try to stick to this template:
|
|
7
|
+
---
|
|
8
|
+
## Goal
|
|
9
|
+
[What goal(s) is the user trying to accomplish?]
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
- [What important instructions did the user give you that are relevant]
|
|
13
|
+
|
|
14
|
+
## Discoveries
|
|
15
|
+
[What notable things were learned during this conversation that would be useful for the next agent to know]
|
|
16
|
+
|
|
17
|
+
## Accomplished
|
|
18
|
+
[What work has been completed, what work is still in progress, and what work is left?]
|
|
19
|
+
|
|
20
|
+
## Relevant files / directories
|
|
21
|
+
[A structured list of relevant files that have been read, edited, or created]
|
|
22
|
+
---`;
|
|
23
|
+
/**
|
|
24
|
+
* Compacts a message history into a summary.
|
|
25
|
+
* Pass this as the onContextOverflow handler in IAgentRunOptions.
|
|
26
|
+
*
|
|
27
|
+
* @param model The same model used by runAgent, or a cheaper small model
|
|
28
|
+
* @param messages The full message history that overflowed
|
|
29
|
+
* @param options Invocation options, including cancellation
|
|
30
|
+
* @returns A minimal ModelMessage[] containing the summary as context
|
|
31
|
+
*/
|
|
32
|
+
export async function compactMessages(model, messages, options = {}) {
|
|
33
|
+
const result = await plugins.generateText({
|
|
34
|
+
model,
|
|
35
|
+
abortSignal: options.abortSignal,
|
|
36
|
+
allowSystemInMessages: true,
|
|
37
|
+
messages: [
|
|
38
|
+
...messages,
|
|
39
|
+
{ role: 'user', content: COMPACTION_PROMPT },
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
role: 'user',
|
|
45
|
+
content: `[Previous conversation summary]\n\n${result.text}\n\n[End of summary. Continue from here.]`,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jb21wYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY29tcGFjdGlvbi9zbWFydGFnZW50LmNvbXBhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQnRCLENBQUM7QUFNTDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxLQUFvQyxFQUNwQyxRQUFnQyxFQUNoQyxVQUFtQyxFQUFFO0lBRXJDLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQztRQUN4QyxLQUFLO1FBQ0wsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLHFCQUFxQixFQUFFLElBQUk7UUFDM0IsUUFBUSxFQUFFO1lBQ1IsR0FBRyxRQUFRO1lBQ1gsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtTQUM3QztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTDtZQUNFLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLHNDQUFzQyxNQUFNLENBQUMsSUFBSSwyQ0FBMkM7U0FDdEc7S0FDRixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ModelMessage } from 'ai';
|
|
2
|
+
import type { TSmartAiLanguageModel } from '@modelprofile.com/flexharness-models';
|
|
3
|
+
export interface IDocumentOptions {
|
|
4
|
+
model: TSmartAiLanguageModel;
|
|
5
|
+
systemMessage?: string;
|
|
6
|
+
userMessage: string;
|
|
7
|
+
pdfDocuments: Uint8Array[];
|
|
8
|
+
messageHistory?: ModelMessage[];
|
|
9
|
+
}
|
|
10
|
+
export interface IPdfTextExtractionOptions {
|
|
11
|
+
model: TSmartAiLanguageModel;
|
|
12
|
+
systemMessage?: string;
|
|
13
|
+
userMessage?: string;
|
|
14
|
+
messageHistory?: ModelMessage[];
|
|
15
|
+
}
|
|
16
|
+
/** The model-based PDF OCR recipe formerly provided by SmartOCR. */
|
|
17
|
+
export declare function extractTextFromPdf(pdfDocument: Uint8Array, options: IPdfTextExtractionOptions): Promise<string>;
|
|
18
|
+
export declare function analyzeDocuments(options: IDocumentOptions): Promise<string>;
|
|
19
|
+
export declare function stopSmartpdf(): Promise<void>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
let smartpdfInstance = null;
|
|
3
|
+
async function ensureSmartpdf() {
|
|
4
|
+
if (!smartpdfInstance) {
|
|
5
|
+
smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
6
|
+
await smartpdfInstance.start();
|
|
7
|
+
}
|
|
8
|
+
return smartpdfInstance;
|
|
9
|
+
}
|
|
10
|
+
/** The model-based PDF OCR recipe formerly provided by SmartOCR. */
|
|
11
|
+
export async function extractTextFromPdf(pdfDocument, options) {
|
|
12
|
+
return analyzeDocuments({
|
|
13
|
+
model: options.model,
|
|
14
|
+
systemMessage: options.systemMessage ?? 'You are a precise OCR engine. Extract text faithfully and do not summarize.',
|
|
15
|
+
userMessage: options.userMessage ?? 'Extract all readable text from this PDF. Preserve page order, line breaks, table structure, and obvious headings. Return only the extracted text.',
|
|
16
|
+
pdfDocuments: [pdfDocument],
|
|
17
|
+
messageHistory: options.messageHistory,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export async function analyzeDocuments(options) {
|
|
21
|
+
const pdf = await ensureSmartpdf();
|
|
22
|
+
const imagePages = [];
|
|
23
|
+
for (const doc of options.pdfDocuments) {
|
|
24
|
+
const pages = await pdf.convertPDFToPngBytes(doc);
|
|
25
|
+
imagePages.push(...pages);
|
|
26
|
+
}
|
|
27
|
+
// Filter out empty buffers
|
|
28
|
+
const validPages = imagePages.filter(page => page && page.length > 0);
|
|
29
|
+
const result = await plugins.generateText({
|
|
30
|
+
model: options.model,
|
|
31
|
+
instructions: options.systemMessage,
|
|
32
|
+
messages: [
|
|
33
|
+
...(options.messageHistory ?? []),
|
|
34
|
+
{
|
|
35
|
+
role: 'user',
|
|
36
|
+
content: [
|
|
37
|
+
{ type: 'text', text: options.userMessage },
|
|
38
|
+
...validPages.map(page => ({
|
|
39
|
+
type: 'file',
|
|
40
|
+
data: page,
|
|
41
|
+
mediaType: 'image/png',
|
|
42
|
+
})),
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
return result.text;
|
|
48
|
+
}
|
|
49
|
+
export async function stopSmartpdf() {
|
|
50
|
+
if (smartpdfInstance) {
|
|
51
|
+
await smartpdfInstance.stop();
|
|
52
|
+
smartpdfInstance = null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19kb2N1bWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUl4QyxJQUFJLGdCQUFnQixHQUEwRCxJQUFJLENBQUM7QUFFbkYsS0FBSyxVQUFVLGNBQWM7SUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25ELE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQWlCRCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsV0FBdUIsRUFDdkIsT0FBa0M7SUFFbEMsT0FBTyxnQkFBZ0IsQ0FBQztRQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLElBQUksNkVBQTZFO1FBQ3JILFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLG1KQUFtSjtRQUN2TCxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDM0IsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO0tBQ3ZDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLE9BQXlCO0lBQzlELE1BQU0sR0FBRyxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUM7SUFFbkMsTUFBTSxVQUFVLEdBQWlCLEVBQUUsQ0FBQztJQUNwQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3hDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixZQUFZLEVBQUUsT0FBTyxDQUFDLGFBQWE7UUFDbkMsUUFBUSxFQUFFO1lBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ2pDO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLE9BQU8sRUFBRTtvQkFDUCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUU7b0JBQzNDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3pCLElBQUksRUFBRSxNQUFlO3dCQUNyQixJQUFJLEVBQUUsSUFBSTt3QkFDVixTQUFTLEVBQUUsV0FBb0I7cUJBQ2hDLENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWTtJQUNoQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { generateText } from 'ai';
|
|
2
|
+
import * as smartpdf from '@push.rocks/smartpdf';
|
|
3
|
+
export { generateText, smartpdf };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2RvY3VtZW50L3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IBrowserKvmOptions, IKvmDriver, IKvmFrame, IKvmTypeTextOptions, TKvmKey, TKvmKind } from './interfaces.js';
|
|
2
|
+
export declare class BrowserKvm implements IKvmDriver {
|
|
3
|
+
readonly kind: TKvmKind;
|
|
4
|
+
private options;
|
|
5
|
+
private browser?;
|
|
6
|
+
private page?;
|
|
7
|
+
constructor(options: IBrowserKvmOptions);
|
|
8
|
+
connect(): Promise<void>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
focusViewer(): Promise<void>;
|
|
11
|
+
captureFrame(): Promise<IKvmFrame>;
|
|
12
|
+
typeText(text: string, options?: IKvmTypeTextOptions): Promise<void>;
|
|
13
|
+
pressKey(key: TKvmKey): Promise<void>;
|
|
14
|
+
pressShortcut(keys: TKvmKey[]): Promise<void>;
|
|
15
|
+
wait(milliseconds: number): Promise<void>;
|
|
16
|
+
private tryGenericLogin;
|
|
17
|
+
private waitForViewerReady;
|
|
18
|
+
private findFirstElement;
|
|
19
|
+
private getViewerSelector;
|
|
20
|
+
private getCaptureSelector;
|
|
21
|
+
private requirePage;
|
|
22
|
+
}
|