@jini-ai/chat 0.3.4 → 0.3.7

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 (92) hide show
  1. package/dist/react/components/AttachmentPreviewModal.d.ts +7 -0
  2. package/dist/react/components/AttachmentPreviewModal.d.ts.map +1 -0
  3. package/dist/react/components/AttachmentPreviewModal.hooks.d.ts +70 -0
  4. package/dist/react/components/AttachmentPreviewModal.hooks.d.ts.map +1 -0
  5. package/dist/react/components/AttachmentPreviewModal.hooks.js +200 -0
  6. package/dist/react/components/AttachmentPreviewModal.hooks.js.map +1 -0
  7. package/dist/react/components/AttachmentPreviewModal.js +18 -0
  8. package/dist/react/components/AttachmentPreviewModal.js.map +1 -0
  9. package/dist/react/components/Composer.d.ts.map +1 -1
  10. package/dist/react/components/Composer.js +1 -1
  11. package/dist/react/components/Composer.js.map +1 -1
  12. package/dist/react/components/MessageRow.d.ts.map +1 -1
  13. package/dist/react/components/MessageRow.js +7 -2
  14. package/dist/react/components/MessageRow.js.map +1 -1
  15. package/dist/react/components/composer-discovery.js +1 -1
  16. package/dist/react/features/chat-pane/components/ChatPane.d.ts +1 -1
  17. package/dist/react/features/chat-pane/components/ChatPane.d.ts.map +1 -1
  18. package/dist/react/features/chat-pane/components/ChatPane.js +4 -2
  19. package/dist/react/features/chat-pane/components/ChatPane.js.map +1 -1
  20. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts.map +1 -1
  21. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js +20 -3
  22. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js.map +1 -1
  23. package/dist/react/features/chat-pane/hooks/useChatPaneComposerPlaceholder.hooks.d.ts +10 -0
  24. package/dist/react/features/chat-pane/hooks/useChatPaneComposerPlaceholder.hooks.d.ts.map +1 -0
  25. package/dist/react/features/chat-pane/hooks/useChatPaneComposerPlaceholder.hooks.js +66 -0
  26. package/dist/react/features/chat-pane/hooks/useChatPaneComposerPlaceholder.hooks.js.map +1 -0
  27. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts +12 -0
  28. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts.map +1 -0
  29. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js +102 -0
  30. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js.map +1 -0
  31. package/dist/react/features/chat-pane/react/components/ChatPane.d.ts +10 -0
  32. package/dist/react/features/chat-pane/react/components/ChatPane.d.ts.map +1 -0
  33. package/dist/react/features/chat-pane/react/components/ChatPane.js +137 -0
  34. package/dist/react/features/chat-pane/react/components/ChatPane.js.map +1 -0
  35. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
  36. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
  37. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js +258 -0
  38. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
  39. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts +66 -0
  40. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts.map +1 -0
  41. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js +223 -0
  42. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js.map +1 -0
  43. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
  44. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
  45. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js +252 -0
  46. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
  47. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
  48. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
  49. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js +60 -0
  50. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
  51. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
  52. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
  53. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js +83 -0
  54. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
  55. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
  56. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
  57. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
  58. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
  59. package/dist/react/features/chat-pane/react/styles.d.ts +2 -0
  60. package/dist/react/features/chat-pane/react/styles.d.ts.map +1 -0
  61. package/dist/react/features/chat-pane/react/styles.js +863 -0
  62. package/dist/react/features/chat-pane/react/styles.js.map +1 -0
  63. package/dist/react/features/chat-pane/styles.d.ts +1 -1
  64. package/dist/react/features/chat-pane/styles.d.ts.map +1 -1
  65. package/dist/react/features/chat-pane/styles.js +139 -3
  66. package/dist/react/features/chat-pane/styles.js.map +1 -1
  67. package/dist/react/features/chat-pane/types.d.ts +8 -0
  68. package/dist/react/features/chat-pane/types.d.ts.map +1 -1
  69. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts +7 -0
  70. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts.map +1 -0
  71. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js +20 -0
  72. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js.map +1 -0
  73. package/dist/react/features/model-picker/react/components/ModelPicker.d.ts +9 -0
  74. package/dist/react/features/model-picker/react/components/ModelPicker.d.ts.map +1 -0
  75. package/dist/react/features/model-picker/react/components/ModelPicker.js +34 -0
  76. package/dist/react/features/model-picker/react/components/ModelPicker.js.map +1 -0
  77. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts +27 -0
  78. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts.map +1 -0
  79. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js +62 -0
  80. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js.map +1 -0
  81. package/dist/react/hooks/attachment-preview-cache.d.ts +47 -0
  82. package/dist/react/hooks/attachment-preview-cache.d.ts.map +1 -0
  83. package/dist/react/hooks/attachment-preview-cache.js +59 -0
  84. package/dist/react/hooks/attachment-preview-cache.js.map +1 -0
  85. package/dist/react/hooks/useComposer.d.ts.map +1 -1
  86. package/dist/react/hooks/useComposer.js +12 -0
  87. package/dist/react/hooks/useComposer.js.map +1 -1
  88. package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts +1 -1
  89. package/dist/react/poc-mcp-ui-official/create-poc-resource.js +1 -1
  90. package/dist/react/slots.d.ts +8 -0
  91. package/dist/react/slots.d.ts.map +1 -1
  92. package/package.json +5 -5
@@ -0,0 +1,863 @@
1
+ export const CHAT_PANE_STYLES = `
2
+ .jini-chat-pane {
3
+ --jini-chat-bg: #faf9f7;
4
+ --jini-chat-panel: #fdfcfa;
5
+ --jini-chat-text: #1a1916;
6
+ --jini-chat-text-strong: #0d0c0a;
7
+ --jini-chat-muted: #74716b;
8
+ --jini-chat-faint: #b3b0a8;
9
+ --jini-chat-border: #e1e5eb;
10
+ --jini-chat-border-strong: #c9d0da;
11
+ --jini-chat-border-soft: #edf0f4;
12
+ --jini-chat-subtle: #f4f5f7;
13
+ --jini-chat-accent: #c96442;
14
+ --jini-chat-accent-soft: #fbeee5;
15
+ --bg-panel: var(--jini-chat-panel);
16
+ --bg-subtle: var(--jini-chat-subtle);
17
+ --border: var(--jini-chat-border);
18
+ --border-strong: var(--jini-chat-border-strong);
19
+ --text: var(--jini-chat-text);
20
+ --text-strong: var(--jini-chat-text-strong);
21
+ --text-muted: var(--jini-chat-muted);
22
+ --danger: #e5484d;
23
+ --radius: 8px;
24
+ --radius-lg: 12px;
25
+ position: relative;
26
+ display: grid;
27
+ grid-template-rows: auto minmax(0, 1fr) auto;
28
+ min-width: 0;
29
+ min-height: 0;
30
+ height: 100%;
31
+ overflow: hidden;
32
+ color: var(--jini-chat-text);
33
+ background: var(--jini-chat-bg);
34
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
35
+ font-size: 13.5px;
36
+ line-height: 1.5;
37
+ -webkit-font-smoothing: antialiased;
38
+ -moz-osx-font-smoothing: grayscale;
39
+ }
40
+ .jini-chat-pane button,
41
+ .jini-runtime-popover button,
42
+ .jini-runtime-popover select {
43
+ font: inherit;
44
+ }
45
+ .jini-chat-pane__header {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ min-height: 74px;
50
+ padding: 18px 22px 14px;
51
+ border-bottom: 1px solid var(--jini-chat-border-soft);
52
+ }
53
+ .jini-chat-pane__heading { min-width: 0; }
54
+ .jini-chat-pane__eyebrow {
55
+ display: block;
56
+ margin-bottom: 4px;
57
+ color: var(--jini-chat-muted);
58
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
59
+ font-size: 10px;
60
+ letter-spacing: .1em;
61
+ text-transform: uppercase;
62
+ }
63
+ .jini-chat-pane__title {
64
+ overflow: hidden;
65
+ margin: 0;
66
+ font-size: 21px;
67
+ font-weight: 650;
68
+ letter-spacing: -.025em;
69
+ text-overflow: ellipsis;
70
+ white-space: nowrap;
71
+ }
72
+ .jini-chat-pane__new-thread {
73
+ padding: 8px 12px;
74
+ color: var(--jini-chat-muted);
75
+ background: var(--jini-chat-panel);
76
+ border: 1px solid var(--jini-chat-border);
77
+ border-radius: 8px;
78
+ cursor: pointer;
79
+ }
80
+ .jini-chat-pane__body {
81
+ position: relative;
82
+ min-height: 0;
83
+ overflow: hidden;
84
+ }
85
+ .jini-chat-pane .jini-message-list {
86
+ height: 100%;
87
+ overflow-y: auto;
88
+ /*
89
+ * .jini-chat-pane__controls is an absolutely-positioned overlay (not a flex/grid sibling that
90
+ * pushes this list up), so its real height has to be reserved here instead. Measured against a
91
+ * live render: the composer + footer + working-directory row alone is already 179.75px, above
92
+ * the 170px this used to reserve -- the last message's tail rendered clipped under the overlay as
93
+ * a direct result. 240px adds real margin above that measurement rather than matching it exactly,
94
+ * because the composer also grows conditionally (a suggestions row, an attachment tray) that
95
+ * this measurement did not have present.
96
+ */
97
+ padding: 20px 22px 240px;
98
+ scrollbar-width: thin;
99
+ }
100
+ .jini-chat-pane .jini-message {
101
+ margin-bottom: 20px;
102
+ color: var(--jini-chat-text);
103
+ font-size: 14px;
104
+ line-height: 1.62;
105
+ }
106
+ /*
107
+ * Bubble on the content, not the row: MessageRow.tsx renders attachments as siblings of
108
+ * .jini-message-content inside .jini-message-user, each with their own chip styling -- bubbling
109
+ * the whole row would nest one background box inside another. This replaces a dead rule this file
110
+ * shipped with (.jini-message-row[data-role="user"] / .jini-message-row.user): MessageRow.tsx
111
+ * has never rendered a jini-message-row class or a data-role attribute, and a user message's
112
+ * root class is jini-message-user, not bare "user" -- the selector never matched anything real.
113
+ */
114
+ .jini-chat-pane .jini-message-user .jini-message-content {
115
+ margin-left: auto;
116
+ padding: 10px 13px;
117
+ width: fit-content;
118
+ max-width: 88%;
119
+ background: var(--jini-chat-subtle);
120
+ border-radius: 12px 12px 3px 12px;
121
+ }
122
+ .jini-chat-pane .jini-message-user .jini-message-attachments {
123
+ display: flex;
124
+ flex-wrap: wrap;
125
+ gap: 6px;
126
+ justify-content: flex-end;
127
+ margin-bottom: 4px;
128
+ }
129
+ .jini-chat-pane .jini-message-user .jini-message-attachment-chip {
130
+ font-size: 11px;
131
+ color: var(--jini-chat-muted);
132
+ background: var(--jini-chat-subtle);
133
+ border: 1px solid var(--jini-chat-border);
134
+ border-radius: 999px;
135
+ padding: 3px 10px;
136
+ }
137
+ .jini-chat-pane .jini-message-agent {
138
+ font-size: 11px;
139
+ font-weight: 700;
140
+ letter-spacing: .02em;
141
+ text-transform: uppercase;
142
+ color: var(--jini-chat-faint);
143
+ margin-bottom: 4px;
144
+ }
145
+ .jini-chat-pane .jini-message-error { color: var(--danger); font-size: 13px; }
146
+ .jini-chat-pane .jini-message-pending { color: var(--jini-chat-muted); font-size: 13px; font-style: italic; }
147
+ .jini-chat-pane__controls {
148
+ position: absolute;
149
+ right: 0;
150
+ bottom: 0;
151
+ left: 0;
152
+ z-index: 4;
153
+ padding: 0 16px 14px;
154
+ background: linear-gradient(to bottom, transparent, var(--jini-chat-bg) 22px);
155
+ }
156
+ .jini-chat-pane__suggestions {
157
+ display: flex;
158
+ gap: 8px;
159
+ margin: 0 2px 8px;
160
+ overflow-x: auto;
161
+ }
162
+ .jini-chat-pane__suggestion {
163
+ flex: 0 0 auto;
164
+ max-width: 290px;
165
+ overflow: hidden;
166
+ padding: 7px 11px;
167
+ color: var(--jini-chat-muted);
168
+ background: color-mix(in srgb, var(--jini-chat-panel) 92%, transparent);
169
+ border: 1px solid var(--jini-chat-border);
170
+ border-radius: 999px;
171
+ font-size: 11px;
172
+ text-overflow: ellipsis;
173
+ white-space: nowrap;
174
+ cursor: pointer;
175
+ }
176
+ .jini-chat-pane__error {
177
+ margin: 0 2px 8px;
178
+ padding: 8px 10px;
179
+ color: #8c2f20;
180
+ background: #fff1ed;
181
+ border: 1px solid #f2c8bb;
182
+ border-radius: 8px;
183
+ font-size: 12px;
184
+ }
185
+ .jini-chat-pane__status {
186
+ margin: 0 2px 8px;
187
+ padding: 8px 10px;
188
+ color: var(--jini-chat-muted);
189
+ background: var(--jini-chat-subtle);
190
+ border: 1px solid var(--jini-chat-border);
191
+ border-radius: 8px;
192
+ font-size: 12px;
193
+ }
194
+ .jini-chat-pane__drop-target {
195
+ position: relative;
196
+ margin: -8px -8px -8px;
197
+ padding: 6px;
198
+ border: 2px dashed transparent;
199
+ border-radius: 16px;
200
+ transition:
201
+ background-color .14s ease,
202
+ border-color .14s ease,
203
+ box-shadow .14s ease;
204
+ }
205
+ .jini-chat-pane__drop-target.is-dragging-files {
206
+ background: color-mix(in srgb, var(--jini-chat-accent-soft) 72%, transparent);
207
+ border-color: var(--jini-chat-accent);
208
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--jini-chat-accent) 15%, transparent);
209
+ }
210
+ .jini-chat-pane__drop-target.is-dragging-files .jini-composer {
211
+ background: color-mix(in srgb, var(--jini-chat-accent-soft) 58%, var(--jini-chat-panel));
212
+ border-color: color-mix(in srgb, var(--jini-chat-accent) 68%, var(--jini-chat-border));
213
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-chat-accent) 10%, transparent);
214
+ }
215
+ .jini-chat-pane__drop-announcement {
216
+ position: absolute;
217
+ width: 1px;
218
+ height: 1px;
219
+ overflow: hidden;
220
+ clip: rect(0, 0, 0, 0);
221
+ white-space: nowrap;
222
+ clip-path: inset(50%);
223
+ }
224
+ .jini-chat-pane .jini-composer {
225
+ position: relative;
226
+ overflow: visible;
227
+ padding: 0;
228
+ background: var(--jini-chat-subtle);
229
+ border: 1px solid var(--jini-chat-border);
230
+ border-radius: 12px;
231
+ box-shadow: none;
232
+ transition: border-color .16s ease, box-shadow .16s ease;
233
+ }
234
+ .jini-chat-pane .jini-composer:focus-within {
235
+ background: var(--jini-chat-panel);
236
+ border-color: color-mix(in srgb, var(--jini-chat-accent) 22%, var(--jini-chat-border-strong));
237
+ box-shadow: 0 1px 2px rgba(26, 25, 22, .06), 0 0 0 1px rgba(201, 100, 66, .06);
238
+ }
239
+ .jini-chat-pane .jini-composer-leading {
240
+ padding: 8px 12px 0;
241
+ }
242
+ .jini-chat-pane .jini-attachment-tray {
243
+ display: flex;
244
+ flex-wrap: wrap;
245
+ gap: 6px;
246
+ max-height: 88px;
247
+ overflow-y: auto;
248
+ padding: 8px 10px 0;
249
+ scrollbar-width: thin;
250
+ }
251
+ .jini-chat-pane .jini-attachment-tray:empty { display: none; }
252
+ .jini-chat-pane .jini-attachment-chip {
253
+ display: inline-flex;
254
+ align-items: center;
255
+ box-sizing: border-box;
256
+ min-width: 0;
257
+ max-width: min(100%, 290px);
258
+ height: 36px;
259
+ padding: 3px 4px 3px 5px;
260
+ color: var(--jini-chat-text);
261
+ background: color-mix(in srgb, var(--jini-chat-panel) 88%, var(--jini-chat-subtle));
262
+ border: 1px solid var(--jini-chat-border);
263
+ border-radius: 9px;
264
+ box-shadow: 0 1px 1px rgba(13, 12, 10, .025);
265
+ }
266
+ .jini-chat-pane .jini-attachment-chip-body {
267
+ display: flex;
268
+ align-items: center;
269
+ min-width: 0;
270
+ gap: 7px;
271
+ }
272
+ .jini-chat-pane .jini-attachment-chip-icon {
273
+ display: grid;
274
+ flex: 0 0 auto;
275
+ place-items: center;
276
+ width: 26px;
277
+ height: 26px;
278
+ color: var(--jini-chat-muted);
279
+ background: var(--jini-chat-subtle);
280
+ border-radius: 7px;
281
+ }
282
+ .jini-chat-pane .jini-attachment-chip-icon.is-image {
283
+ color: var(--jini-chat-accent);
284
+ background: var(--jini-chat-accent-soft);
285
+ }
286
+ .jini-chat-pane .jini-attachment-chip-copy {
287
+ display: flex;
288
+ min-width: 0;
289
+ flex-direction: column;
290
+ line-height: 1.15;
291
+ }
292
+ .jini-chat-pane .jini-attachment-chip-name {
293
+ overflow: hidden;
294
+ font-size: 11.5px;
295
+ font-weight: 550;
296
+ text-overflow: ellipsis;
297
+ white-space: nowrap;
298
+ }
299
+ .jini-chat-pane .jini-attachment-chip-size {
300
+ color: var(--jini-chat-muted);
301
+ font-size: 9.5px;
302
+ }
303
+ .jini-chat-pane .jini-attachment-remove {
304
+ display: grid;
305
+ flex: 0 0 auto;
306
+ place-items: center;
307
+ width: 25px;
308
+ height: 25px;
309
+ margin-left: 4px;
310
+ padding: 0;
311
+ color: var(--jini-chat-muted);
312
+ background: transparent;
313
+ border: 0;
314
+ border-radius: 7px;
315
+ cursor: pointer;
316
+ }
317
+ .jini-chat-pane .jini-attachment-remove:hover,
318
+ .jini-chat-pane .jini-attachment-remove:focus-visible {
319
+ color: var(--jini-chat-text-strong);
320
+ background: var(--jini-chat-subtle);
321
+ outline: none;
322
+ }
323
+ .jini-chat-pane .jini-composer-input {
324
+ display: block;
325
+ box-sizing: border-box;
326
+ width: 100%;
327
+ min-height: 92px;
328
+ resize: none;
329
+ padding: 12px 14px 8px;
330
+ color: var(--jini-chat-text);
331
+ background: transparent;
332
+ border: 0;
333
+ outline: 0;
334
+ font-size: 13.5px;
335
+ line-height: 1.6;
336
+ }
337
+ .jini-chat-pane .jini-composer-input::placeholder { color: var(--jini-chat-faint); }
338
+ .jini-chat-pane .jini-composer-footer {
339
+ display: flex;
340
+ align-items: center;
341
+ justify-content: space-between;
342
+ min-height: 42px;
343
+ gap: 6px;
344
+ padding: 6px 8px 8px;
345
+ border-top: 1px solid var(--jini-chat-border-soft);
346
+ }
347
+ .jini-chat-pane .jini-composer-attachment-picker { display: inline-flex; }
348
+ .jini-chat-pane .jini-composer-file-input {
349
+ position: absolute;
350
+ width: 1px;
351
+ height: 1px;
352
+ overflow: hidden;
353
+ clip: rect(0, 0, 0, 0);
354
+ white-space: nowrap;
355
+ clip-path: inset(50%);
356
+ }
357
+ .jini-chat-pane .jini-composer-attach {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ width: 32px;
362
+ height: 32px;
363
+ padding: 0;
364
+ color: var(--jini-chat-muted);
365
+ background: transparent;
366
+ border: 1px solid transparent;
367
+ border-radius: 8px;
368
+ cursor: pointer;
369
+ }
370
+ .jini-chat-pane .jini-composer-attach:hover:not(:disabled) {
371
+ color: var(--jini-chat-text);
372
+ background: var(--jini-chat-panel);
373
+ border-color: var(--jini-chat-border);
374
+ }
375
+ .jini-chat-pane .jini-composer-attach:disabled { opacity: .45; cursor: default; }
376
+ .jini-composer-spinner,
377
+ .jini-runtime-spinner { animation: jini-chat-spin .8s linear infinite; }
378
+ @keyframes jini-chat-spin { to { transform: rotate(360deg); } }
379
+ .jini-chat-pane .jini-composer-footer-accessories {
380
+ display: flex;
381
+ margin-left: auto;
382
+ min-width: 0;
383
+ }
384
+ .jini-chat-pane .jini-composer-send {
385
+ display: grid;
386
+ place-items: center;
387
+ width: 32px;
388
+ height: 32px;
389
+ padding: 0;
390
+ color: white;
391
+ background: var(--jini-chat-text-strong);
392
+ border: 0;
393
+ border-radius: 8px;
394
+ cursor: pointer;
395
+ }
396
+ .jini-chat-pane .jini-composer-send:disabled {
397
+ color: #aaa59e;
398
+ background: #ece8e2;
399
+ cursor: default;
400
+ }
401
+ .jini-chat-pane__cancel {
402
+ position: absolute;
403
+ right: 48px;
404
+ bottom: 22px;
405
+ padding: 5px 9px;
406
+ color: var(--jini-chat-muted);
407
+ background: var(--jini-chat-panel);
408
+ border: 1px solid var(--jini-chat-border);
409
+ border-radius: 7px;
410
+ cursor: pointer;
411
+ }
412
+ .jini-chat-pane__workdir {
413
+ display: flex;
414
+ align-items: center;
415
+ gap: 7px;
416
+ min-width: 0;
417
+ padding: 5px 4px 0;
418
+ color: var(--jini-chat-muted);
419
+ font-size: 13px;
420
+ }
421
+ .jini-chat-pane__workdir code {
422
+ overflow: hidden;
423
+ text-overflow: ellipsis;
424
+ white-space: nowrap;
425
+ }
426
+ .jini-chat-pane .jini-working-dir-picker {
427
+ position: relative;
428
+ display: inline-flex;
429
+ align-items: flex-start;
430
+ }
431
+ .jini-chat-pane .jini-working-dir-trigger-row {
432
+ display: inline-flex;
433
+ align-items: center;
434
+ gap: 2px;
435
+ }
436
+ .jini-chat-pane .jini-working-dir-trigger {
437
+ appearance: none;
438
+ display: inline-flex;
439
+ align-items: center;
440
+ gap: 6px;
441
+ padding: 4px 6px;
442
+ color: var(--jini-chat-muted);
443
+ background: transparent;
444
+ border: 0;
445
+ border-radius: 8px;
446
+ font: inherit;
447
+ font-size: 13px;
448
+ cursor: pointer;
449
+ }
450
+ .jini-chat-pane .jini-working-dir-trigger:hover,
451
+ .jini-chat-pane .jini-working-dir-trigger:focus-visible {
452
+ color: var(--jini-chat-text-strong);
453
+ background: var(--jini-chat-subtle);
454
+ outline: none;
455
+ }
456
+ .jini-chat-pane .jini-working-dir-trigger.invalid { color: var(--danger); }
457
+ .jini-chat-pane .jini-working-dir-trigger-icon { flex: 0 0 auto; opacity: .75; }
458
+ .jini-chat-pane .jini-working-dir-trigger.invalid .jini-working-dir-trigger-icon {
459
+ color: var(--danger);
460
+ opacity: 1;
461
+ }
462
+ .jini-chat-pane .jini-working-dir-trigger-label {
463
+ max-width: 240px;
464
+ overflow: hidden;
465
+ text-overflow: ellipsis;
466
+ white-space: nowrap;
467
+ }
468
+ .jini-chat-pane .jini-working-dir-trigger-chevron { flex: 0 0 auto; opacity: .55; }
469
+ .jini-chat-pane .jini-working-dir-panel,
470
+ .jini-chat-pane .jini-working-dir-flyout {
471
+ position: absolute;
472
+ z-index: 90;
473
+ display: flex;
474
+ flex-direction: column;
475
+ min-width: 210px;
476
+ padding: 5px;
477
+ background: var(--jini-chat-panel);
478
+ border: 1px solid var(--jini-chat-border-strong);
479
+ border-radius: 12px;
480
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 10px 28px -10px rgba(0, 0, 0, .18);
481
+ }
482
+ .jini-chat-pane .jini-working-dir-panel {
483
+ top: calc(100% + 6px);
484
+ left: 0;
485
+ }
486
+ .jini-chat-pane .jini-working-dir-panel.up {
487
+ top: auto;
488
+ bottom: calc(100% + 6px);
489
+ }
490
+ .jini-chat-pane .jini-working-dir-item {
491
+ appearance: none;
492
+ display: flex;
493
+ align-items: center;
494
+ gap: 9px;
495
+ width: 100%;
496
+ min-height: 32px;
497
+ padding: 0 9px;
498
+ color: var(--jini-chat-text-strong);
499
+ background: transparent;
500
+ border: 0;
501
+ border-radius: 8px;
502
+ font: inherit;
503
+ font-size: 13px;
504
+ text-align: left;
505
+ cursor: pointer;
506
+ }
507
+ .jini-chat-pane .jini-working-dir-item:hover,
508
+ .jini-chat-pane .jini-working-dir-item:focus-visible,
509
+ .jini-chat-pane .jini-working-dir-recent-item:hover,
510
+ .jini-chat-pane .jini-working-dir-recent-item:focus-visible {
511
+ background: var(--jini-chat-subtle);
512
+ outline: none;
513
+ }
514
+ .jini-chat-pane .jini-working-dir-item-icon { flex: 0 0 auto; opacity: .8; }
515
+ .jini-chat-pane .jini-working-dir-item > span {
516
+ flex: 1 1 auto;
517
+ min-width: 0;
518
+ overflow: hidden;
519
+ text-overflow: ellipsis;
520
+ white-space: nowrap;
521
+ }
522
+ .jini-chat-pane .jini-working-dir-item-chevron { margin-left: auto; opacity: .55; }
523
+ .jini-chat-pane .jini-working-dir-submenu-row { position: relative; }
524
+ .jini-chat-pane .jini-working-dir-flyout {
525
+ top: -5px;
526
+ left: 100%;
527
+ z-index: 91;
528
+ min-width: 220px;
529
+ max-width: 320px;
530
+ margin-left: 4px;
531
+ }
532
+ .jini-chat-pane .jini-working-dir-flyout.up { top: auto; bottom: -5px; }
533
+ .jini-chat-pane .jini-working-dir-flyout::before {
534
+ position: absolute;
535
+ top: 0;
536
+ left: -8px;
537
+ width: 8px;
538
+ height: 100%;
539
+ content: "";
540
+ }
541
+ .jini-chat-pane .jini-working-dir-recent-item {
542
+ appearance: none;
543
+ display: grid;
544
+ grid-template-rows: auto auto;
545
+ grid-template-columns: auto 1fr;
546
+ align-items: center;
547
+ width: 100%;
548
+ min-height: 36px;
549
+ padding: 4px 9px;
550
+ color: var(--jini-chat-text-strong);
551
+ background: transparent;
552
+ border: 0;
553
+ border-radius: 8px;
554
+ font: inherit;
555
+ text-align: left;
556
+ cursor: pointer;
557
+ column-gap: 9px;
558
+ }
559
+ .jini-chat-pane .jini-working-dir-recent-item .jini-working-dir-item-icon {
560
+ grid-row: 1 / span 2;
561
+ }
562
+ .jini-chat-pane .jini-working-dir-recent-name,
563
+ .jini-chat-pane .jini-working-dir-recent-path {
564
+ grid-column: 2;
565
+ overflow: hidden;
566
+ text-overflow: ellipsis;
567
+ white-space: nowrap;
568
+ }
569
+ .jini-chat-pane .jini-working-dir-recent-name { font-size: 13px; }
570
+ .jini-chat-pane .jini-working-dir-recent-path {
571
+ color: var(--jini-chat-muted);
572
+ font-size: 11px;
573
+ opacity: .7;
574
+ }
575
+ .jini-chat-pane .jini-working-dir-empty {
576
+ padding: 8px 10px;
577
+ color: var(--jini-chat-muted);
578
+ font-size: 12px;
579
+ white-space: nowrap;
580
+ opacity: .7;
581
+ }
582
+ .jini-runtime-picker { position: relative; }
583
+ .jini-runtime-trigger {
584
+ display: inline-grid;
585
+ grid-template-columns: 24px 14px;
586
+ align-items: center;
587
+ gap: 7px;
588
+ height: 32px;
589
+ min-width: 0;
590
+ padding: 3px 7px 3px 5px;
591
+ color: var(--jini-chat-text);
592
+ background: transparent;
593
+ border: 0;
594
+ border-radius: 8px;
595
+ cursor: pointer;
596
+ }
597
+ .jini-runtime-trigger:hover { background: var(--jini-chat-subtle); }
598
+ .jini-runtime-trigger__copy { display: none; }
599
+ .jini-runtime-trigger__copy strong {
600
+ overflow: hidden;
601
+ max-width: 122px;
602
+ font-size: 11px;
603
+ font-weight: 650;
604
+ text-overflow: ellipsis;
605
+ white-space: nowrap;
606
+ }
607
+ .jini-runtime-trigger__copy small {
608
+ overflow: hidden;
609
+ max-width: 122px;
610
+ color: var(--jini-chat-muted);
611
+ font-size: 9px;
612
+ text-overflow: ellipsis;
613
+ white-space: nowrap;
614
+ }
615
+ .jini-runtime-trigger__chevron { color: var(--jini-chat-muted); font-size: 12px; }
616
+ .jini-runtime-agent-icon.agent-icon { flex: 0 0 auto; object-fit: contain; }
617
+ .jini-runtime-agent-icon.agent-icon-mono {
618
+ display: inline-block;
619
+ background-color: currentColor;
620
+ -webkit-mask-repeat: no-repeat;
621
+ mask-repeat: no-repeat;
622
+ -webkit-mask-position: center;
623
+ mask-position: center;
624
+ -webkit-mask-size: contain;
625
+ mask-size: contain;
626
+ }
627
+ .jini-runtime-agent-icon.agent-icon-fallback {
628
+ display: inline-flex;
629
+ align-items: center;
630
+ justify-content: center;
631
+ color: #74716b;
632
+ background: #f4f5f7;
633
+ border: 1px solid #e1e5eb;
634
+ border-radius: 6px;
635
+ font-weight: 700;
636
+ }
637
+ .jini-runtime-popover {
638
+ --jini-chat-panel: #fdfcfa;
639
+ --jini-chat-text: #1a1916;
640
+ --jini-chat-text-strong: #0d0c0a;
641
+ --jini-chat-muted: #74716b;
642
+ --jini-chat-faint: #b3b0a8;
643
+ --jini-chat-border: #e1e5eb;
644
+ --jini-chat-border-soft: #edf0f4;
645
+ --jini-chat-subtle: #f4f5f7;
646
+ box-sizing: border-box;
647
+ padding: 8px;
648
+ color: var(--jini-chat-text);
649
+ background: var(--jini-chat-panel);
650
+ border: 1px solid var(--jini-chat-border);
651
+ border-radius: 12px;
652
+ box-shadow: 0 18px 46px rgba(13, 12, 10, .15), 0 2px 8px rgba(13, 12, 10, .06);
653
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
654
+ font-size: 13.5px;
655
+ line-height: 1.5;
656
+ -webkit-font-smoothing: antialiased;
657
+ }
658
+ .jini-runtime-popover__head {
659
+ display: flex;
660
+ flex-direction: column;
661
+ gap: 3px;
662
+ padding: 10px 12px 12px;
663
+ border-bottom: 1px solid var(--jini-chat-border-soft);
664
+ }
665
+ .jini-runtime-popover__head strong { color: var(--jini-chat-text-strong); font-size: 14px; font-weight: 650; }
666
+ .jini-runtime-popover__head span { color: var(--jini-chat-muted); font-size: 12px; }
667
+ .jini-runtime-mode,
668
+ .jini-runtime-agent,
669
+ .jini-runtime-rescan {
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 11px;
673
+ box-sizing: border-box;
674
+ width: 100%;
675
+ min-height: 40px;
676
+ padding: 8px 11px;
677
+ color: var(--jini-chat-text);
678
+ background: transparent;
679
+ border: 0;
680
+ border-radius: 8px;
681
+ text-align: left;
682
+ cursor: pointer;
683
+ }
684
+ .jini-runtime-mode:hover,
685
+ .jini-runtime-agent:hover:not(:disabled),
686
+ .jini-runtime-rescan:hover:not(:disabled) { background: var(--jini-chat-subtle); }
687
+ .jini-runtime-mode.is-active { font-weight: 650; }
688
+ .jini-runtime-mode:disabled,
689
+ .jini-runtime-agent:disabled,
690
+ .jini-runtime-rescan:disabled { color: var(--jini-chat-faint); cursor: default; }
691
+ .jini-runtime-mode__meta,
692
+ .jini-runtime-agent__status {
693
+ margin-left: auto;
694
+ color: var(--jini-chat-muted);
695
+ font-size: 12px;
696
+ white-space: nowrap;
697
+ }
698
+ .jini-runtime-check { flex: 0 0 auto; color: var(--jini-chat-text); }
699
+ .jini-runtime-section-label {
700
+ padding: 12px 11px 5px;
701
+ color: var(--jini-chat-faint);
702
+ font-size: 11px;
703
+ font-weight: 650;
704
+ letter-spacing: .08em;
705
+ text-transform: uppercase;
706
+ }
707
+ .jini-runtime-agent.is-active { background: transparent; }
708
+ .jini-runtime-agent__copy {
709
+ display: flex;
710
+ flex: 1;
711
+ flex-direction: column;
712
+ min-width: 0;
713
+ }
714
+ .jini-runtime-agent__copy strong { font-size: 13.5px; font-weight: 500; }
715
+ .jini-runtime-agent__copy small {
716
+ overflow: hidden;
717
+ color: #8b857e;
718
+ font-size: 10px;
719
+ text-overflow: ellipsis;
720
+ white-space: nowrap;
721
+ }
722
+ .jini-runtime-empty { padding: 10px 11px; color: var(--jini-chat-muted); font-size: 12px; }
723
+ .jini-runtime-models {
724
+ display: flex;
725
+ flex-direction: column;
726
+ gap: 9px;
727
+ margin-top: 5px;
728
+ padding: 10px 11px 8px;
729
+ border-top: 1px dashed var(--jini-chat-border);
730
+ }
731
+ .jini-runtime-select {
732
+ display: flex;
733
+ flex-direction: column;
734
+ gap: 5px;
735
+ color: var(--jini-chat-muted);
736
+ font-size: 13px;
737
+ }
738
+ .jini-runtime-select select {
739
+ box-sizing: border-box;
740
+ width: 100%;
741
+ min-height: 40px;
742
+ padding: 7px 10px;
743
+ color: var(--jini-chat-text);
744
+ background: var(--jini-chat-panel);
745
+ border: 1px solid var(--jini-chat-border);
746
+ border-radius: 8px;
747
+ }
748
+ /*
749
+ * The BYOK model, rendered as a value rather than a control — see RuntimeByokDetails for why it
750
+ * is not a disabled select. It occupies the same box the sibling selects do so the row still
751
+ * reads as part of the same list, but carries no border: a bordered box with no affordance is
752
+ * exactly the "looks editable, isn't" shape the plain text exists to avoid.
753
+ */
754
+ /*
755
+ * The BYOK model list, which CustomSelect portals to document.body. runtimePopoverPosition puts
756
+ * the runtime popover at z-index 1000; the shared .jini-select-menu default is 60, which is right
757
+ * everywhere else and puts this menu behind the very popover that opened it. One above the
758
+ * popover, not far above: it must clear its own surface and nothing else.
759
+ */
760
+ .jini-select-menu.jini-runtime-model-menu {
761
+ z-index: 1001;
762
+ }
763
+ .jini-runtime-byok-model strong {
764
+ box-sizing: border-box;
765
+ display: flex;
766
+ align-items: center;
767
+ min-height: 40px;
768
+ padding: 7px 10px;
769
+ color: var(--jini-chat-text);
770
+ font-weight: 600;
771
+ word-break: break-all;
772
+ }
773
+ /*
774
+ * Tool-call cards (ToolCard.tsx) and the per-turn usage summary (MessageRow.tsx) ship no CSS of
775
+ * their own — see this file's own header note on why the package supplies a default theme at all.
776
+ * Collapsed by default (.op-card-head is the only always-visible part), so a run with a dozen tool
777
+ * calls reads as a dozen one-line rows, not a page of raw JSON.
778
+ */
779
+ .jini-chat-pane .jini-message-tools {
780
+ display: flex;
781
+ flex-direction: column;
782
+ gap: 6px;
783
+ width: 100%;
784
+ }
785
+ .jini-chat-pane .op-card {
786
+ border: 1px solid var(--jini-chat-border);
787
+ border-radius: var(--radius);
788
+ background: var(--jini-chat-subtle);
789
+ overflow: hidden;
790
+ font-size: 13px;
791
+ }
792
+ .jini-chat-pane .op-card-head {
793
+ display: flex;
794
+ align-items: center;
795
+ gap: 8px;
796
+ width: 100%;
797
+ padding: 7px 10px;
798
+ background: none;
799
+ border: 0;
800
+ font: inherit;
801
+ text-align: left;
802
+ cursor: pointer;
803
+ color: inherit;
804
+ }
805
+ .jini-chat-pane .op-status { display: inline-flex; flex-shrink: 0; }
806
+ .jini-chat-pane .op-status-ok { color: #4e875f; }
807
+ .jini-chat-pane .op-status-error { color: var(--danger); }
808
+ .jini-chat-pane .op-status-running { color: var(--jini-chat-accent); }
809
+ .jini-chat-pane .op-title { font-weight: 600; flex-shrink: 0; }
810
+ .jini-chat-pane .shimmer-text { opacity: .6; }
811
+ .jini-chat-pane .op-meta {
812
+ color: var(--jini-chat-muted);
813
+ overflow: hidden;
814
+ text-overflow: ellipsis;
815
+ white-space: nowrap;
816
+ flex: 1;
817
+ min-width: 0;
818
+ }
819
+ .jini-chat-pane .op-expand-chev { flex-shrink: 0; color: var(--jini-chat-faint); }
820
+ /* Collapsed by default: 0 max-height clips the inner content, no display:none — keeps the height
821
+ transition instead of an instant jump cut. */
822
+ .jini-chat-pane .accordion-collapsible { max-height: 0; overflow: hidden; transition: max-height .15s ease; }
823
+ .jini-chat-pane .accordion-collapsible.open { max-height: 480px; overflow-y: auto; }
824
+ .jini-chat-pane .accordion-collapsible-inner { padding: 0 10px 10px; }
825
+ .jini-chat-pane .op-card-detail { display: flex; flex-direction: column; gap: 6px; }
826
+ .jini-chat-pane .op-path,
827
+ .jini-chat-pane .op-command,
828
+ .jini-chat-pane .op-output {
829
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
830
+ font-size: 12px;
831
+ background: var(--jini-chat-panel);
832
+ border: 1px solid var(--jini-chat-border);
833
+ border-radius: 6px;
834
+ padding: 6px 8px;
835
+ margin: 0;
836
+ white-space: pre-wrap;
837
+ word-break: break-word;
838
+ }
839
+ .jini-chat-pane .op-open {
840
+ border: 1px solid var(--jini-chat-border-strong);
841
+ border-radius: 6px;
842
+ background: var(--jini-chat-panel);
843
+ padding: 2px 8px;
844
+ font-size: 11px;
845
+ cursor: pointer;
846
+ }
847
+ /* The "Done · 6m 29s · 2612 out · $0.4028" line — real numbers from the run's own kind:'usage' event. */
848
+ .jini-chat-pane .jini-message-usage {
849
+ display: flex;
850
+ align-items: center;
851
+ gap: 6px;
852
+ font-size: 11px;
853
+ color: var(--jini-chat-muted);
854
+ margin-top: 2px;
855
+ }
856
+ .jini-chat-pane .jini-message-usage-dot { font-size: 8px; color: #4e875f; }
857
+ @media (max-width: 560px) {
858
+ .jini-chat-pane__header { padding-inline: 16px; }
859
+ .jini-chat-pane .jini-message-list { padding-inline: 16px; }
860
+ .jini-chat-pane__controls { padding-inline: 10px; }
861
+ }
862
+ `;
863
+ //# sourceMappingURL=styles.js.map