@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
@@ -0,0 +1,172 @@
1
+ import { LitElement, html, css } from './plugins.js';
2
+ export class FlexChatInput extends LitElement {
3
+ value = '';
4
+ static properties = {
5
+ disabled: { type: Boolean },
6
+ placeholder: { type: String },
7
+ };
8
+ static styles = css `
9
+ :host {
10
+ display: block;
11
+ }
12
+
13
+ .input-wrap {
14
+ display: flex;
15
+ align-items: flex-end;
16
+ gap: 8px;
17
+ padding: 10px 12px;
18
+ background: rgba(255, 255, 255, 0.04);
19
+ border-radius: 16px;
20
+ border: 1px solid rgba(255, 255, 255, 0.07);
21
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
22
+ }
23
+
24
+ .input-wrap:focus-within {
25
+ border-color: rgba(99, 102, 241, 0.45);
26
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.08);
27
+ }
28
+
29
+ .input-wrap.disabled {
30
+ opacity: 0.45;
31
+ pointer-events: none;
32
+ }
33
+
34
+ textarea {
35
+ flex: 1;
36
+ background: transparent;
37
+ border: none;
38
+ outline: none;
39
+ color: #e4e4e7;
40
+ font-size: 14px;
41
+ font-family: inherit;
42
+ line-height: 1.5;
43
+ resize: none;
44
+ min-height: 22px;
45
+ max-height: 110px;
46
+ padding: 2px 0;
47
+ }
48
+
49
+ textarea::placeholder {
50
+ color: rgba(255, 255, 255, 0.22);
51
+ }
52
+
53
+ .send-btn {
54
+ width: 32px;
55
+ height: 32px;
56
+ border-radius: 50%;
57
+ border: none;
58
+ background: linear-gradient(135deg, #6366f1, #7c3aed);
59
+ color: #fff;
60
+ cursor: pointer;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ flex-shrink: 0;
65
+ transition: transform 0.12s ease, opacity 0.12s ease, box-shadow 0.12s ease;
66
+ box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);
67
+ }
68
+
69
+ .send-btn:hover:not(:disabled) {
70
+ transform: scale(1.08);
71
+ box-shadow: 0 3px 12px rgba(99, 102, 241, 0.45);
72
+ }
73
+
74
+ .send-btn:active:not(:disabled) {
75
+ transform: scale(0.94);
76
+ }
77
+
78
+ .send-btn:disabled {
79
+ opacity: 0.25;
80
+ cursor: default;
81
+ box-shadow: none;
82
+ }
83
+
84
+ .send-btn svg {
85
+ width: 15px;
86
+ height: 15px;
87
+ }
88
+
89
+ .hint {
90
+ display: flex;
91
+ justify-content: flex-end;
92
+ padding: 5px 2px 0;
93
+ }
94
+
95
+ .hint-text {
96
+ font-size: 10.5px;
97
+ color: rgba(255, 255, 255, 0.13);
98
+ }
99
+
100
+ kbd {
101
+ padding: 0 3px;
102
+ border-radius: 3px;
103
+ background: rgba(255, 255, 255, 0.05);
104
+ border: 1px solid rgba(255, 255, 255, 0.07);
105
+ font-family: inherit;
106
+ font-size: 10px;
107
+ }
108
+ `;
109
+ constructor() {
110
+ super();
111
+ this.disabled = false;
112
+ this.placeholder = 'Type a message...';
113
+ }
114
+ handleKeydown(e) {
115
+ if (e.key === 'Enter' && !e.shiftKey) {
116
+ e.preventDefault();
117
+ this.submit();
118
+ }
119
+ }
120
+ handleInput(e) {
121
+ const textarea = e.target;
122
+ this.value = textarea.value;
123
+ textarea.style.height = 'auto';
124
+ textarea.style.height = Math.min(textarea.scrollHeight, 110) + 'px';
125
+ }
126
+ submit() {
127
+ if (!this.value.trim() || this.disabled)
128
+ return;
129
+ this.dispatchEvent(new CustomEvent('send', {
130
+ detail: { text: this.value.trim() },
131
+ bubbles: true,
132
+ composed: true,
133
+ }));
134
+ this.value = '';
135
+ const textarea = this.shadowRoot?.querySelector('textarea');
136
+ if (textarea) {
137
+ textarea.value = '';
138
+ textarea.style.height = 'auto';
139
+ }
140
+ }
141
+ render() {
142
+ const canSend = !this.disabled && !!this.value.trim();
143
+ return html `
144
+ <div class="input-wrap ${this.disabled ? 'disabled' : ''}">
145
+ <textarea
146
+ rows="1"
147
+ .value=${this.value}
148
+ @input=${this.handleInput}
149
+ @keydown=${this.handleKeydown}
150
+ placeholder=${this.disabled ? 'Waiting for response...' : this.placeholder}
151
+ ?disabled=${this.disabled}
152
+ ></textarea>
153
+ <button
154
+ class="send-btn"
155
+ @click=${this.submit}
156
+ ?disabled=${!canSend}
157
+ aria-label="Send message"
158
+ >
159
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
160
+ <line x1="12" y1="19" x2="12" y2="5"></line>
161
+ <polyline points="5 12 12 5 19 12"></polyline>
162
+ </svg>
163
+ </button>
164
+ </div>
165
+ <div class="hint">
166
+ <span class="hint-text"><kbd>Enter</kbd> send · <kbd>Shift+Enter</kbd> new line</span>
167
+ </div>
168
+ `;
169
+ }
170
+ }
171
+ customElements.define('flexchat-input', FlexChatInput);
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleGNoYXQtaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X3dlYi9mbGV4Y2hhdC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHckQsTUFBTSxPQUFPLGFBQWMsU0FBUSxVQUFVO0lBR25DLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFbkIsTUFBTSxDQUFDLFVBQVUsR0FBRztRQUNsQixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1FBQzNCLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7S0FDOUIsQ0FBQztJQUVGLE1BQU0sQ0FBQyxNQUFNLEdBQWMsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0c3QixDQUFDO0lBRUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDekMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxDQUFnQjtRQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsQ0FBUTtRQUMxQixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBNkIsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDNUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEUsQ0FBQztJQUVPLE1BQU07UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ25DLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNwQixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFBOytCQUNnQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7OzttQkFHM0MsSUFBSSxDQUFDLEtBQUs7bUJBQ1YsSUFBSSxDQUFDLFdBQVc7cUJBQ2QsSUFBSSxDQUFDLGFBQWE7d0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO3NCQUM5RCxJQUFJLENBQUMsUUFBUTs7OzttQkFJaEIsSUFBSSxDQUFDLE1BQU07c0JBQ1IsQ0FBQyxPQUFPOzs7Ozs7Ozs7Ozs7S0FZekIsQ0FBQztJQUNKLENBQUM7O0FBR0gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQyJ9
@@ -0,0 +1,26 @@
1
+ import { LitElement } from './plugins.js';
2
+ import type { CSSResult, TemplateResult } from './plugins.js';
3
+ export declare class FlexChatMessage extends LitElement {
4
+ role: 'user' | 'assistant' | 'tool';
5
+ content: string;
6
+ toolName: string;
7
+ timestamp: number;
8
+ static properties: {
9
+ role: {
10
+ type: StringConstructor;
11
+ };
12
+ content: {
13
+ type: StringConstructor;
14
+ };
15
+ toolName: {
16
+ type: StringConstructor;
17
+ };
18
+ timestamp: {
19
+ type: NumberConstructor;
20
+ };
21
+ };
22
+ static styles: CSSResult;
23
+ constructor();
24
+ private formatTime;
25
+ render(): TemplateResult;
26
+ }
@@ -0,0 +1,174 @@
1
+ import { LitElement, html, css } from './plugins.js';
2
+ export class FlexChatMessage extends LitElement {
3
+ static properties = {
4
+ role: { type: String },
5
+ content: { type: String },
6
+ toolName: { type: String },
7
+ timestamp: { type: Number },
8
+ };
9
+ static styles = css `
10
+ :host {
11
+ display: block;
12
+ animation: msg-in 0.3s ease-out both;
13
+ }
14
+
15
+ @keyframes msg-in {
16
+ from {
17
+ opacity: 0;
18
+ transform: translateY(6px);
19
+ }
20
+ to {
21
+ opacity: 1;
22
+ transform: translateY(0);
23
+ }
24
+ }
25
+
26
+ /* ── Message Row ── */
27
+ .row {
28
+ display: flex;
29
+ gap: 10px;
30
+ align-items: flex-end;
31
+ margin-bottom: 4px;
32
+ }
33
+
34
+ .row.user {
35
+ justify-content: flex-end;
36
+ }
37
+
38
+ .row.assistant {
39
+ justify-content: flex-start;
40
+ }
41
+
42
+ /* ── Avatar ── */
43
+ .avatar {
44
+ width: 28px;
45
+ height: 28px;
46
+ border-radius: 50%;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ font-size: 12px;
51
+ flex-shrink: 0;
52
+ line-height: 1;
53
+ }
54
+
55
+ .avatar.user {
56
+ background: linear-gradient(135deg, #3b82f6, #2563eb);
57
+ color: #fff;
58
+ order: 2;
59
+ }
60
+
61
+ .avatar.assistant {
62
+ background: linear-gradient(135deg, #6366f1, #7c3aed);
63
+ color: #fff;
64
+ }
65
+
66
+ /* ── Bubble ── */
67
+ .bubble {
68
+ padding: 10px 14px;
69
+ border-radius: 18px;
70
+ word-break: break-word;
71
+ white-space: pre-wrap;
72
+ font-size: 14px;
73
+ line-height: 1.55;
74
+ max-width: min(75%, 480px);
75
+ }
76
+
77
+ .bubble.user {
78
+ background: linear-gradient(135deg, #3b82f6, #2563eb);
79
+ color: #fff;
80
+ border-bottom-right-radius: 6px;
81
+ }
82
+
83
+ .bubble.assistant {
84
+ background: var(--flexchat-assistant-bg, #1e1e2e);
85
+ border: 1px solid var(--flexchat-assistant-border, rgba(255, 255, 255, 0.08));
86
+ color: var(--flexchat-assistant-text, #d1d5db);
87
+ border-bottom-left-radius: 6px;
88
+ }
89
+
90
+ /* ── Tool ── */
91
+ .tool-row {
92
+ display: flex;
93
+ justify-content: flex-start;
94
+ padding: 2px 0 2px 38px;
95
+ }
96
+
97
+ .tool-pill {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ gap: 6px;
101
+ padding: 4px 10px;
102
+ background: rgba(99, 102, 241, 0.1);
103
+ border: 1px solid rgba(99, 102, 241, 0.15);
104
+ border-radius: 20px;
105
+ font-size: 11px;
106
+ font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace;
107
+ color: #a5b4fc;
108
+ }
109
+
110
+ .tool-icon {
111
+ font-size: 10px;
112
+ }
113
+
114
+ .tool-name {
115
+ font-weight: 600;
116
+ }
117
+
118
+ /* ── Timestamp ── */
119
+ .time-row {
120
+ padding: 1px 38px 6px;
121
+ font-size: 10px;
122
+ color: rgba(255, 255, 255, 0.2);
123
+ font-variant-numeric: tabular-nums;
124
+ }
125
+
126
+ .time-row.user {
127
+ text-align: right;
128
+ }
129
+
130
+ .time-row.assistant {
131
+ text-align: left;
132
+ }
133
+ `;
134
+ constructor() {
135
+ super();
136
+ this.role = 'user';
137
+ this.content = '';
138
+ this.toolName = '';
139
+ this.timestamp = 0;
140
+ }
141
+ formatTime(ts) {
142
+ if (!ts)
143
+ return '';
144
+ const d = new Date(ts);
145
+ return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
146
+ }
147
+ render() {
148
+ if (this.role === 'tool') {
149
+ return html `
150
+ <div class="tool-row">
151
+ <div class="tool-pill">
152
+ <span class="tool-icon">⚡</span>
153
+ <span class="tool-name">${this.toolName || 'tool'}</span>
154
+ </div>
155
+ </div>
156
+ `;
157
+ }
158
+ return html `
159
+ <div class="row ${this.role}">
160
+ <div class="avatar ${this.role}">
161
+ ${this.role === 'user' ? '⬆' : '✦'}
162
+ </div>
163
+ <div class="bubble ${this.role}">
164
+ ${this.content}
165
+ </div>
166
+ </div>
167
+ ${this.timestamp
168
+ ? html `<div class="time-row ${this.role}">${this.formatTime(this.timestamp)}</div>`
169
+ : ''}
170
+ `;
171
+ }
172
+ }
173
+ customElements.define('flexchat-message', FlexChatMessage);
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleGNoYXQtbWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfd2ViL2ZsZXhjaGF0LW1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR3JELE1BQU0sT0FBTyxlQUFnQixTQUFRLFVBQVU7SUFNN0MsTUFBTSxDQUFDLFVBQVUsR0FBRztRQUNsQixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1FBQ3RCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7UUFDekIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtRQUMxQixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0tBQzVCLENBQUM7SUFFRixNQUFNLENBQUMsTUFBTSxHQUFjLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRIN0IsQ0FBQztJQUVGO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU8sVUFBVSxDQUFDLEVBQVU7UUFDM0IsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFBOzs7O3NDQUlxQixJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU07OztPQUd0RCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO3dCQUNTLElBQUksQ0FBQyxJQUFJOzZCQUNKLElBQUksQ0FBQyxJQUFJO1lBQzFCLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUc7OzZCQUVmLElBQUksQ0FBQyxJQUFJO1lBQzFCLElBQUksQ0FBQyxPQUFPOzs7UUFHaEIsSUFBSSxDQUFDLFNBQVM7WUFDZCxDQUFDLENBQUMsSUFBSSxDQUFBLHdCQUF3QixJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ25GLENBQUMsQ0FBQyxFQUFFO0tBQ1AsQ0FBQztJQUNKLENBQUM7O0FBR0gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLENBQUMsQ0FBQyJ9
@@ -0,0 +1,34 @@
1
+ import { LitElement } from './plugins.js';
2
+ import type { CSSResult, TemplateResult, IChatSession, PropertyValues } from './plugins.js';
3
+ import './flexchat-message.js';
4
+ import './flexchat-input.js';
5
+ export declare class FlexChatWindow extends LitElement {
6
+ chatSession: IChatSession;
7
+ placeholder: string;
8
+ headerTitle: string;
9
+ private messages;
10
+ private busy;
11
+ private streamingText;
12
+ private unsubscribe;
13
+ static properties: {
14
+ chatSession: {
15
+ attribute: boolean;
16
+ };
17
+ placeholder: {
18
+ type: StringConstructor;
19
+ };
20
+ headerTitle: {
21
+ type: StringConstructor;
22
+ attribute: string;
23
+ };
24
+ };
25
+ static styles: CSSResult;
26
+ constructor();
27
+ connectedCallback(): void;
28
+ disconnectedCallback(): void;
29
+ protected updated(changed: PropertyValues<this>): void;
30
+ private bindSession;
31
+ private scrollToBottom;
32
+ private handleSend;
33
+ render(): TemplateResult;
34
+ }