@qfei-design/make-ai-assistant 0.1.0 → 0.1.3

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/sse.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./conversation-DpYszfVd.cjs"),S=1e6,u=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),p=(e,t,r)=>{const a=Object.keys(e).find(s=>s.toLowerCase()===t.toLowerCase());a&&delete e[a],e[t]=r},A=e=>{const t={};return Array.isArray(e)?e.forEach(([r,a])=>p(t,r,a)):e&&typeof e.forEach=="function"?e.forEach((r,a)=>p(t,a,r)):e&&Object.entries(e).forEach(([r,a])=>p(t,r,a)),p(t,"Accept","text/event-stream"),p(t,"Content-Type","application/json"),t},I=(e,t)=>{if(!u(t))throw new Error("Invalid assistant SSE event: data");if(Object.prototype.hasOwnProperty.call(t,"type"))throw new Error("Invalid assistant SSE event: unsupported field");try{return b.parseAssistantEvent({...t,type:e})}catch(r){throw r instanceof Error&&r.message.startsWith("Invalid assistant event")?new Error(r.message.replace("Invalid assistant event","Invalid assistant SSE event")):r}},w=e=>{if(!e.trim())return;const t=e.split(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./conversation-Yku9Lzj_.cjs"),S=1e6,u=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),p=(e,t,r)=>{const a=Object.keys(e).find(s=>s.toLowerCase()===t.toLowerCase());a&&delete e[a],e[t]=r},A=e=>{const t={};return Array.isArray(e)?e.forEach(([r,a])=>p(t,r,a)):e&&typeof e.forEach=="function"?e.forEach((r,a)=>p(t,a,r)):e&&Object.entries(e).forEach(([r,a])=>p(t,r,a)),p(t,"Accept","text/event-stream"),p(t,"Content-Type","application/json"),t},I=(e,t)=>{if(!u(t))throw new Error("Invalid assistant SSE event: data");if(Object.prototype.hasOwnProperty.call(t,"type"))throw new Error("Invalid assistant SSE event: unsupported field");try{return b.parseAssistantEvent({...t,type:e})}catch(r){throw r instanceof Error&&r.message.startsWith("Invalid assistant event")?new Error(r.message.replace("Invalid assistant event","Invalid assistant SSE event")):r}},w=e=>{if(!e.trim())return;const t=e.split(`
2
2
  `),r=t.find(n=>n.startsWith("event:"))?.slice(6).trim(),a=t.filter(n=>n.startsWith("data:")).map(n=>n.slice(5).trimStart()).join(`
3
3
  `);if(t.some(n=>n.startsWith("event:")||n.startsWith("data:"))){if(!r||!a)throw new Error("Invalid assistant SSE event: missing event or data");try{return I(r,JSON.parse(a))}catch(n){throw n instanceof Error&&n.message.startsWith("Invalid assistant SSE event")?n:new Error("Invalid assistant SSE event: JSON")}}};async function*T(e,t,r=S){if(!e.body)throw new Error("当前运行环境无法读取 AI 助手流式响应");const a=e.body.getReader(),s=new TextDecoder;let n="",d=!1,h=!1,l;const c=()=>(l??=a.cancel().catch(o=>{console.error("[make-ai-assistant] SSE reader cancellation failed",{errorType:o instanceof Error?o.name:typeof o})}),l),f=()=>{c()};t?.addEventListener("abort",f,{once:!0});const m=o=>{const i=o.type==="error"||o.type==="run.cancelled"||o.type==="run.complete";return h||=i,i};try{for(;;){if(t?.aborted)throw new DOMException("Aborted","AbortError");const o=await a.read();if(t?.aborted)throw new DOMException("Aborted","AbortError");let i=s.decode(o.value,{stream:!o.done});d&&(i=`\r${i}`,d=!1),!o.done&&i.endsWith("\r")&&(i=i.slice(0,-1),d=!0),o.done&&d&&(i+="\r",d=!1),n+=i.replace(/\r\n|\r/g,`
4
4
  `);let E=n.indexOf(`
package/dist/sse.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { p as b } from "./conversation-B5kECJz8.js";
1
+ import { p as b } from "./conversation-Dy2Sghjv.js";
2
2
  const S = 1e6, u = (e) => typeof e == "object" && e !== null && !Array.isArray(e), E = (e, t, r) => {
3
3
  const a = Object.keys(e).find(
4
4
  (s) => s.toLowerCase() === t.toLowerCase()
package/dist/styles.css CHANGED
@@ -1,19 +1,19 @@
1
1
  :where(.make-ai-assistant, .make-ai-artifact) {
2
2
  --make-ai-internal-accent: var(--make-ai-accent, var(--make-color-primary, #5147f3));
3
3
  --make-ai-internal-accent-strong: var(--make-ai-accent-strong, var(--make-color-primary-hover, #4037da));
4
- --make-ai-internal-accent-soft: var(--make-ai-accent-soft, color-mix(in srgb, var(--make-ai-internal-accent) 10%, white));
5
- --make-ai-internal-bg: var(--make-ai-bg, var(--make-color-bg, #ffffff));
6
- --make-ai-internal-surface: var(--make-ai-surface, var(--make-color-bg-subtle, #f7f8fb));
7
- --make-ai-internal-surface-strong: var(--make-ai-surface-strong, var(--make-color-bg-muted, #f0f2f7));
8
- --make-ai-internal-text: var(--make-ai-text, var(--make-color-text, #1f2430));
9
- --make-ai-internal-text-secondary: var(--make-ai-text-secondary, var(--make-color-text-secondary, #687080));
10
- --make-ai-internal-border: var(--make-ai-border, var(--make-color-border, #e5e8ef));
4
+ --make-ai-internal-accent-soft: var(--make-ai-accent-soft, color-mix(in srgb, var(--make-ai-internal-accent) 10%, var(--make-ai-internal-bg)));
5
+ --make-ai-internal-bg: var(--make-ai-bg, var(--make-color-bg, #fcfcff));
6
+ --make-ai-internal-surface: var(--make-ai-surface, var(--make-color-bg-subtle, #f8f8fc));
7
+ --make-ai-internal-surface-strong: var(--make-ai-surface-strong, var(--make-color-bg-muted, #f0f0f6));
8
+ --make-ai-internal-text: var(--make-ai-text, var(--make-color-text, #252631));
9
+ --make-ai-internal-text-secondary: var(--make-ai-text-secondary, var(--make-color-text-secondary, #666979));
10
+ --make-ai-internal-border: var(--make-ai-border, var(--make-color-border, #e4e5ed));
11
11
  --make-ai-internal-success: var(--make-ai-success, var(--make-color-success, #1a9a61));
12
12
  --make-ai-internal-warning: var(--make-ai-warning, var(--make-color-warning, #c77b00));
13
13
  --make-ai-internal-danger: var(--make-ai-danger, var(--make-color-danger, #d04444));
14
14
  --make-ai-internal-radius: var(--make-ai-radius, var(--make-radius-large, 14px));
15
- --make-ai-internal-shadow: var(--make-ai-shadow, 0 18px 52px rgb(23 26 38 / 16%));
16
- --make-ai-internal-drawer-width: var(--make-ai-drawer-width, 408px);
15
+ --make-ai-internal-shadow: var(--make-ai-shadow, 0 18px 48px rgb(30 31 43 / 12%));
16
+ --make-ai-internal-drawer-width: var(--make-ai-drawer-width, 432px);
17
17
  --make-ai-internal-z-index: var(--make-ai-z-index, 1050);
18
18
  }
19
19
 
@@ -33,7 +33,7 @@
33
33
 
34
34
  .make-ai-assistant {
35
35
  color: var(--make-ai-internal-text);
36
- font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
36
+ font-family: inherit;
37
37
  }
38
38
 
39
39
  .make-ai-assistant button,
@@ -47,27 +47,27 @@
47
47
 
48
48
  .make-ai-assistant__launcher {
49
49
  align-items: center;
50
- background: linear-gradient(145deg, color-mix(in srgb, var(--make-ai-internal-accent) 82%, #9f91ff), var(--make-ai-internal-accent));
51
- border: 0;
50
+ background: var(--make-ai-internal-accent);
51
+ border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 70%, var(--make-ai-internal-border));
52
52
  border-radius: 50%;
53
53
  bottom: 28px;
54
- box-shadow: 0 10px 30px color-mix(in srgb, var(--make-ai-internal-accent) 32%, transparent);
55
- color: white;
54
+ box-shadow: 0 10px 24px color-mix(in srgb, var(--make-ai-internal-accent) 22%, transparent);
55
+ color: #fcfcff;
56
56
  cursor: pointer;
57
57
  display: flex;
58
- height: 54px;
58
+ height: 50px;
59
59
  justify-content: center;
60
60
  padding: 0;
61
61
  position: fixed;
62
62
  right: 28px;
63
63
  transition: box-shadow 180ms ease, transform 180ms ease;
64
- width: 54px;
64
+ width: 50px;
65
65
  z-index: calc(var(--make-ai-internal-z-index) + 2);
66
66
  }
67
67
 
68
68
  .make-ai-assistant__launcher:hover {
69
- box-shadow: 0 14px 36px color-mix(in srgb, var(--make-ai-internal-accent) 42%, transparent);
70
- transform: translateY(-2px) scale(1.03);
69
+ box-shadow: 0 12px 28px color-mix(in srgb, var(--make-ai-internal-accent) 28%, transparent);
70
+ transform: translateY(-2px);
71
71
  }
72
72
 
73
73
  .make-ai-assistant__launcher:focus-visible,
@@ -89,11 +89,10 @@
89
89
  }
90
90
 
91
91
  .make-ai-assistant__launcher-orbit {
92
- border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 46%, transparent);
92
+ border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 30%, transparent);
93
93
  border-radius: 50%;
94
- inset: -7px;
94
+ inset: -5px;
95
95
  position: absolute;
96
- animation: make-ai-pulse 2.2s ease-out infinite;
97
96
  }
98
97
 
99
98
  .make-ai-assistant__drawer {
@@ -107,11 +106,12 @@
107
106
  top: 0;
108
107
  width: min(var(--make-ai-internal-drawer-width), 100vw);
109
108
  z-index: var(--make-ai-internal-z-index);
110
- animation: make-ai-drawer-in 220ms cubic-bezier(.2, .75, .35, 1);
109
+ animation: make-ai-drawer-in 180ms cubic-bezier(.2, .75, .35, 1);
111
110
  }
112
111
 
113
112
  .make-ai-assistant__panel {
114
113
  background: var(--make-ai-internal-bg);
114
+ container-type: inline-size;
115
115
  display: grid;
116
116
  grid-template-rows: auto auto minmax(0, 1fr) auto;
117
117
  height: 100%;
@@ -124,8 +124,8 @@
124
124
  display: grid;
125
125
  gap: 10px;
126
126
  grid-template-columns: auto 1fr auto;
127
- min-height: 72px;
128
- padding: 14px 16px;
127
+ min-height: 70px;
128
+ padding: 14px 18px;
129
129
  }
130
130
 
131
131
  .make-ai-assistant__header h2,
@@ -136,33 +136,24 @@
136
136
  }
137
137
 
138
138
  .make-ai-assistant__header h2 {
139
- font-size: 16px;
140
- font-weight: 650;
139
+ font-size: 15px;
140
+ font-weight: 700;
141
141
  letter-spacing: -.01em;
142
142
  line-height: 22px;
143
143
  }
144
144
 
145
145
  .make-ai-assistant__header p {
146
- align-items: center;
147
146
  color: var(--make-ai-internal-text-secondary);
148
- display: flex;
149
147
  font-size: 12px;
150
- gap: 6px;
151
- margin-top: 2px;
152
- }
153
-
154
- .make-ai-assistant__online-dot {
155
- background: var(--make-ai-internal-success);
156
- border-radius: 50%;
157
- height: 6px;
158
- width: 6px;
148
+ line-height: 18px;
149
+ margin-top: 1px;
159
150
  }
160
151
 
161
152
  .make-ai-assistant__avatar {
162
153
  align-items: center;
163
154
  background: var(--make-ai-internal-accent-soft);
164
155
  border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 12%, transparent);
165
- border-radius: 11px;
156
+ border-radius: 10px;
166
157
  color: var(--make-ai-internal-accent);
167
158
  display: inline-flex;
168
159
  flex: 0 0 auto;
@@ -209,21 +200,23 @@
209
200
 
210
201
  .make-ai-assistant__privacy-note {
211
202
  align-items: center;
212
- background: var(--make-ai-internal-accent-soft);
213
- color: color-mix(in srgb, var(--make-ai-internal-accent) 76%, var(--make-ai-internal-text));
203
+ background: var(--make-ai-internal-surface);
204
+ border: 1px solid color-mix(in srgb, var(--make-ai-internal-border) 84%, transparent);
205
+ color: var(--make-ai-internal-text-secondary);
214
206
  display: flex;
215
207
  font-size: 12px;
216
208
  gap: 8px;
217
- margin: 12px 14px 0;
209
+ line-height: 1.5;
210
+ margin: 12px 18px 0;
218
211
  padding: 8px 10px;
219
- border-radius: 8px;
212
+ border-radius: 10px;
220
213
  }
221
214
 
222
215
  .make-ai-assistant__body {
223
216
  min-height: 0;
224
217
  overflow: auto;
225
218
  overscroll-behavior: contain;
226
- padding: 18px 14px 28px;
219
+ padding: 22px 18px 30px;
227
220
  }
228
221
 
229
222
  .make-ai-assistant__empty {
@@ -260,8 +253,8 @@
260
253
  .make-ai-assistant__message {
261
254
  align-items: flex-start;
262
255
  display: flex;
263
- gap: 9px;
264
- margin-bottom: 22px;
256
+ gap: 10px;
257
+ margin-bottom: 24px;
265
258
  }
266
259
 
267
260
  .make-ai-assistant__message--user {
@@ -271,38 +264,54 @@
271
264
  .make-ai-assistant__message-stack {
272
265
  display: flex;
273
266
  flex-direction: column;
274
- gap: 10px;
275
- max-width: calc(100% - 45px);
267
+ gap: 8px;
276
268
  min-width: 0;
277
269
  }
278
270
 
271
+ .make-ai-assistant__message--assistant .make-ai-assistant__message-stack {
272
+ flex: 1;
273
+ max-width: calc(100% - 38px);
274
+ }
275
+
279
276
  .make-ai-assistant__message--user .make-ai-assistant__message-stack {
280
277
  align-items: flex-end;
278
+ max-width: min(82%, 330px);
279
+ }
280
+
281
+ .make-ai-assistant__message-sender {
282
+ color: var(--make-ai-internal-text-secondary);
283
+ font-size: 12px;
284
+ font-weight: 600;
285
+ line-height: 16px;
286
+ }
287
+
288
+ .make-ai-assistant__message--user .make-ai-assistant__message-sender {
289
+ color: color-mix(in srgb, var(--make-ai-internal-accent) 72%, var(--make-ai-internal-text));
281
290
  }
282
291
 
283
292
  .make-ai-assistant__bubble {
284
- background: var(--make-ai-internal-surface);
285
- border-radius: 4px 14px 14px;
293
+ color: var(--make-ai-internal-text);
286
294
  font-size: 14px;
287
- line-height: 1.65;
288
- padding: 10px 12px;
295
+ line-height: 1.7;
289
296
  white-space: pre-wrap;
290
297
  }
291
298
 
292
299
  .make-ai-assistant__message--user .make-ai-assistant__bubble {
293
- background: var(--make-ai-internal-accent-soft);
294
- border-radius: 14px 4px 14px 14px;
300
+ background: color-mix(in srgb, var(--make-ai-internal-accent) 10%, var(--make-ai-internal-surface));
301
+ border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 12%, var(--make-ai-internal-border));
302
+ border-radius: 16px 5px 16px 16px;
295
303
  color: color-mix(in srgb, var(--make-ai-internal-accent) 68%, var(--make-ai-internal-text));
304
+ padding: 10px 13px;
296
305
  }
297
306
 
298
307
  .make-ai-assistant__typing {
299
308
  align-items: center;
300
309
  background: var(--make-ai-internal-surface);
301
- border-radius: 4px 14px 14px;
310
+ border-radius: 10px;
302
311
  display: flex;
303
312
  gap: 4px;
304
- height: 38px;
305
- padding: 0 13px;
313
+ height: 34px;
314
+ padding: 0 12px;
306
315
  }
307
316
 
308
317
  .make-ai-assistant__typing span {
@@ -317,29 +326,63 @@
317
326
  .make-ai-assistant__typing span:nth-child(2) { animation-delay: 140ms; }
318
327
  .make-ai-assistant__typing span:nth-child(3) { animation-delay: 280ms; }
319
328
 
320
- .make-ai-assistant__error {
321
- background: color-mix(in srgb, var(--make-ai-internal-danger) 8%, white);
322
- border: 1px solid color-mix(in srgb, var(--make-ai-internal-danger) 20%, transparent);
329
+ .make-ai-assistant__message-status {
323
330
  border-radius: 10px;
324
- color: var(--make-ai-internal-danger);
325
331
  display: flex;
326
332
  flex-direction: column;
327
333
  font-size: 13px;
328
- gap: 3px;
329
- margin-left: 45px;
334
+ gap: 4px;
335
+ line-height: 1.55;
330
336
  padding: 10px 12px;
331
337
  }
332
338
 
339
+ .make-ai-assistant__message-status--error {
340
+ background: color-mix(in srgb, var(--make-ai-internal-danger) 7%, var(--make-ai-internal-surface));
341
+ border: 1px solid color-mix(in srgb, var(--make-ai-internal-danger) 22%, var(--make-ai-internal-border));
342
+ color: var(--make-ai-internal-danger);
343
+ }
344
+
345
+ .make-ai-assistant__progress {
346
+ align-items: center;
347
+ color: var(--make-ai-internal-text-secondary);
348
+ display: flex;
349
+ font-size: 12px;
350
+ gap: 7px;
351
+ line-height: 18px;
352
+ min-height: 24px;
353
+ }
354
+
355
+ .make-ai-assistant__progress > span {
356
+ animation: make-ai-pulse 1.2s ease-in-out infinite;
357
+ background: var(--make-ai-internal-accent);
358
+ border-radius: 50%;
359
+ height: 7px;
360
+ width: 7px;
361
+ }
362
+
363
+ .make-ai-assistant__retry {
364
+ align-self: flex-start;
365
+ background: transparent;
366
+ border: 1px solid currentColor;
367
+ border-radius: 7px;
368
+ color: inherit;
369
+ cursor: pointer;
370
+ font-size: 12px;
371
+ font-weight: 600;
372
+ margin-top: 3px;
373
+ padding: 5px 9px;
374
+ }
375
+
333
376
  .make-ai-assistant__composer-region {
334
377
  background: var(--make-ai-internal-bg);
335
378
  border-top: 1px solid var(--make-ai-internal-border);
336
- padding: 10px 14px 8px;
379
+ padding: 12px 18px 10px;
337
380
  }
338
381
 
339
382
  .make-ai-assistant__suggestions {
340
383
  display: flex;
341
- gap: 7px;
342
- margin-bottom: 9px;
384
+ gap: 8px;
385
+ margin-bottom: 10px;
343
386
  overflow: auto;
344
387
  scrollbar-width: none;
345
388
  }
@@ -347,12 +390,12 @@
347
390
  .make-ai-assistant__suggestions button {
348
391
  background: var(--make-ai-internal-surface);
349
392
  border: 1px solid var(--make-ai-internal-border);
350
- border-radius: 999px;
393
+ border-radius: 8px;
351
394
  color: var(--make-ai-internal-text-secondary);
352
395
  cursor: pointer;
353
396
  flex: 0 0 auto;
354
397
  font-size: 12px;
355
- padding: 6px 10px;
398
+ padding: 7px 10px;
356
399
  }
357
400
 
358
401
  .make-ai-assistant__suggestions button:hover {
@@ -364,10 +407,10 @@
364
407
  align-items: flex-end;
365
408
  background: var(--make-ai-internal-bg);
366
409
  border: 1px solid var(--make-ai-internal-border);
367
- border-radius: 12px;
410
+ border-radius: 16px;
368
411
  display: flex;
369
412
  gap: 8px;
370
- padding: 9px 9px 9px 12px;
413
+ padding: 10px 10px 10px 13px;
371
414
  transition: border-color 160ms ease, box-shadow 160ms ease;
372
415
  }
373
416
 
@@ -380,9 +423,9 @@
380
423
  background: transparent;
381
424
  border: 0;
382
425
  color: var(--make-ai-internal-text);
383
- line-height: 1.5;
384
- max-height: 116px;
385
- min-height: 42px;
426
+ line-height: 1.55;
427
+ max-height: 120px;
428
+ min-height: 46px;
386
429
  outline: 0;
387
430
  padding: 1px 0;
388
431
  resize: none;
@@ -390,21 +433,21 @@
390
433
  }
391
434
 
392
435
  .make-ai-assistant__composer textarea::placeholder {
393
- color: color-mix(in srgb, var(--make-ai-internal-text-secondary) 75%, white);
436
+ color: color-mix(in srgb, var(--make-ai-internal-text-secondary) 75%, var(--make-ai-internal-bg));
394
437
  }
395
438
 
396
439
  .make-ai-assistant__send {
397
440
  align-items: center;
398
441
  background: var(--make-ai-internal-accent);
399
442
  border: 0;
400
- border-radius: 9px;
401
- color: white;
443
+ border-radius: 50%;
444
+ color: #fcfcff;
402
445
  cursor: pointer;
403
446
  display: flex;
404
447
  flex: 0 0 auto;
405
- height: 34px;
448
+ height: 36px;
406
449
  justify-content: center;
407
- width: 34px;
450
+ width: 36px;
408
451
  }
409
452
 
410
453
  .make-ai-assistant__send:hover:not(:disabled) { background: var(--make-ai-internal-accent-strong); }
@@ -420,7 +463,8 @@
420
463
  .make-ai-assistant__composer-region > p {
421
464
  color: var(--make-ai-internal-text-secondary);
422
465
  font-size: 10px;
423
- margin: 7px 0 0;
466
+ line-height: 1.45;
467
+ margin: 8px 0 0;
424
468
  text-align: center;
425
469
  }
426
470
 
@@ -508,7 +552,7 @@
508
552
 
509
553
  .make-ai-artifact__action--primary {
510
554
  background: var(--make-ai-internal-accent);
511
- color: white;
555
+ color: #fcfcff;
512
556
  }
513
557
 
514
558
  .make-ai-artifact__action--secondary {
@@ -539,7 +583,7 @@
539
583
  .make-ai-artifact__trend-label { color: var(--make-ai-internal-text-secondary); font-size: 11px; margin-bottom: 8px; }
540
584
  .make-ai-artifact__trend-bars { align-items: flex-end; display: flex; gap: 5px; height: 112px; }
541
585
  .make-ai-artifact__trend-point { align-items: center; display: flex; flex: 1; flex-direction: column; height: 100%; justify-content: flex-end; min-width: 0; }
542
- .make-ai-artifact__trend-bar { background: linear-gradient(to top, var(--make-ai-internal-accent), color-mix(in srgb, var(--make-ai-internal-accent) 42%, white)); border-radius: 4px 4px 1px 1px; min-height: 4px; width: min(18px, 70%); }
586
+ .make-ai-artifact__trend-bar { background: var(--make-ai-internal-accent); border-radius: 4px 4px 1px 1px; min-height: 4px; width: min(18px, 70%); }
543
587
  .make-ai-artifact__trend-point small { color: var(--make-ai-internal-text-secondary); font-size: 9px; margin-top: 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; text-align: center; }
544
588
 
545
589
  .make-ai-artifact__ranking { list-style: none; margin: 12px 0 0; padding: 0; }
@@ -608,6 +652,7 @@ button.make-ai-artifact__record:hover { background: var(--make-ai-internal-accen
608
652
  @media (prefers-reduced-motion: reduce) {
609
653
  .make-ai-assistant__drawer,
610
654
  .make-ai-assistant__launcher-orbit,
655
+ .make-ai-assistant__progress > span,
611
656
  .make-ai-assistant__typing span {
612
657
  animation: none;
613
658
  }
@@ -1,8 +1,57 @@
1
1
  # Make AI 助手后端 V1 配合合同
2
2
 
3
- ## 接口能力
3
+ ## Make Console 当前 Web 接口
4
4
 
5
- 后端第一版至少提供以下能力:
5
+ `/make-console` adapter 对应 Console BFF 的五个语义操作。普通接口由宿主解包响应 `data`,
6
+ SSE 保持原始 `text/event-stream`:
7
+
8
+ | 语义操作 | Console Web 接口 |
9
+ | --- | --- |
10
+ | 查询 Agent | `GET /api/make/console/v1/apps/{appKey}/agent`,读取 `data.agents` |
11
+ | 创建/复用 Session | `POST /api/make/console/v1/apps/{appKey}/agent/{agentID}/sessions` |
12
+ | 读取持久事件 | `GET /api/make/console/v1/apps/{appKey}/agent/{agentID}/sessions/{sessionID}/events?from={seq}&limit={limit}` |
13
+ | 发送消息 | `POST /api/make/console/v1/apps/{appKey}/agent/messages?agentID={agentID}`,Body 为 `{ text }` |
14
+ | 订阅 Run | `GET /api/make/console/v1/apps/{appKey}/agent/{agentID}/sessions/{sessionID}/runs/{runID}/stream?after={cursor}` |
15
+
16
+ Console 浏览器请求使用已有登录态的 `credentials: "include"`,EventSource 使用
17
+ `withCredentials: true`。前端包和 App 业务代码不得读取、写入或复制 `zs_session`。
18
+ 租户、操作人、Agent 指令、模型和 MCP 工具均由 Console/Context/Runtime 服务端链路确定。
19
+
20
+ SSE 事件包括:`ready` 建连、`run-output` 增量或终态、`fallback` 实时流降级以及注释心跳。
21
+ `output_text.delta` 只追加到当前气泡;`response.completed` 后必须读取持久事件完成最终对账;
22
+ `response.failed` 使用稳定 `failureCode`;`fallback` 从用户消息 `seq + 1` 开始轮询。持久
23
+ `message` 事件且 `actor.kind=agent` 的完整文本是最终事实源。
24
+
25
+ Console BFF 与 Make App Browser API 的认证和资源模型不同,不能只替换 base URL 复用同一
26
+ transport。平台包分别提供 `/make-console` 与 `/make-app` 两个入口,聊天 UI 与 Artifact
27
+ 模板保持共享。
28
+
29
+ ## Make App 现有后端接入
30
+
31
+ Make App 内嵌助手可以通过 `/make-app` adapter 对接宿主已有的 Browser API。npm 包只定义
32
+ 下列语义操作,不定义或拼接任何部署路径:
33
+
34
+ | 语义操作 | 输入 | 输出 |
35
+ | --- | --- | --- |
36
+ | 定位会话 | 当前 `MakeAssistantHostContext` | `{ chatId }` |
37
+ | 加载历史 | `{ chatId, cursor: -1, limit }` | `{ messages }` |
38
+ | 提交消息 | `{ chatId, messageId, text }` | `{ chatId, responseId, acceptedCursor }` |
39
+ | 订阅响应 | `{ chatId, responseId, cursor }` | 兼容 adapter 合同的 EventSource |
40
+
41
+ 实际请求由宿主认证边界发起。URL、请求方法、Cookie、Ingress、Service 代理、租户与当前用户
42
+ 解析都由宿主决定;浏览器不能读取或构造服务端凭证。宿主必须传递 `AbortSignal`,并在取消
43
+ 后尽快停止尚未完成的请求。
44
+
45
+ 当前事件包括 `run.started`、`response.delta`、`response.progress`、
46
+ `response.message`、`response.completed`、`response.failed` 和 `heartbeat`。
47
+ `response.message` 是完整文本替换,不是 delta。当前接口没有新建会话、远程取消和
48
+ Artifact;前端必须按能力降级,不应伪造这些能力。
49
+ Make App adapter 会在 `JSON.parse` 前限制单个 EventSource `data` 字符数,默认
50
+ 1,000,000;历史恢复最多接受 200 条消息、1,000,000 字符正文和 500 个 Artifact。
51
+
52
+ ## 通用标准接口能力
53
+
54
+ 当接入自有 Agent 后端或未来统一协议时,建议至少提供以下能力:
6
55
 
7
56
  1. 创建或继续一次 run;
8
57
  2. 通过 SSE 流式返回文本与 Artifact;
@@ -20,7 +69,7 @@
20
69
  | `GET` | `/api/assistant/threads/:threadId` | 会话与历史消息 |
21
70
  | `DELETE` | `/api/assistant/threads/:threadId` | 删除会话,可放到后续版本 |
22
71
 
23
- 宿主 UI 只调用自己的 Service `/api`,不直接调用 Make API、模型服务或透传 Make token。
72
+ 宿主 UI 只经过平台同源入口或自己的 Service `/api`,不直接调用数据 API、模型服务或透传 Make token。
24
73
 
25
74
  ## Run 请求
26
75
 
package/package.ai.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "packageName": "@qfei-design/make-ai-assistant",
3
- "minimumRuntimeVersion": "0.1.0",
3
+ "minimumRuntimeVersion": "0.1.2",
4
4
  "readOrder": [
5
5
  "package.ai.json",
6
6
  "README.md",
@@ -15,14 +15,16 @@
15
15
  "ssrSupported": true
16
16
  },
17
17
  "install": {
18
- "pnpm": "pnpm add @qfei-design/make-ai-assistant@^0.1.0",
19
- "npm": "npm install @qfei-design/make-ai-assistant@^0.1.0",
20
- "yarn": "yarn add @qfei-design/make-ai-assistant@^0.1.0"
18
+ "pnpm": "pnpm add @qfei-design/make-ai-assistant@^0.1.2",
19
+ "npm": "npm install @qfei-design/make-ai-assistant@^0.1.2",
20
+ "yarn": "yarn add @qfei-design/make-ai-assistant@^0.1.2"
21
21
  },
22
22
  "exports": [
23
23
  "@qfei-design/make-ai-assistant",
24
24
  "@qfei-design/make-ai-assistant/react",
25
25
  "@qfei-design/make-ai-assistant/sse",
26
+ "@qfei-design/make-ai-assistant/make-app",
27
+ "@qfei-design/make-ai-assistant/make-console",
26
28
  "@qfei-design/make-ai-assistant/testing",
27
29
  "@qfei-design/make-ai-assistant/styles.css",
28
30
  "@qfei-design/make-ai-assistant/artifact-v1.schema.json"
@@ -37,6 +39,8 @@
37
39
  "Artifact V1 contracts and validation",
38
40
  "Conversation event reduction",
39
41
  "Standard abortable SSE transport",
42
+ "Host-injected Make App AI semantic transport",
43
+ "Host-injected Make Console Agent and Run semantic transport",
40
44
  "Template registration and capability negotiation",
41
45
  "Floating launcher, right drawer and embedded assistant panel",
42
46
  "Platform artifact templates",
@@ -44,7 +48,7 @@
44
48
  ],
45
49
  "hostResponsibilities": [
46
50
  "Current App and route context",
47
- "SSE or AG-UI transport adapter",
51
+ "Authenticated semantic operations and EventSource boundary",
48
52
  "Service authentication and server-side authorization",
49
53
  "Safe action execution and route mapping",
50
54
  "Optional App-specific templates and theme variables"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qfei-design/make-ai-assistant",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Platform-wide Make AI Assistant contracts, React shell, and context-aware artifact templates.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -25,6 +25,16 @@
25
25
  "import": "./dist/sse.mjs",
26
26
  "require": "./dist/sse.cjs"
27
27
  },
28
+ "./make-app": {
29
+ "types": "./dist/make-app.d.ts",
30
+ "import": "./dist/make-app.mjs",
31
+ "require": "./dist/make-app.cjs"
32
+ },
33
+ "./make-console": {
34
+ "types": "./dist/make-console.d.ts",
35
+ "import": "./dist/make-console.mjs",
36
+ "require": "./dist/make-console.cjs"
37
+ },
28
38
  "./testing": {
29
39
  "types": "./dist/testing/index.d.ts",
30
40
  "import": "./dist/testing.mjs",
package/recipes.json CHANGED
@@ -39,6 +39,42 @@
39
39
  "Ending a stream without run.complete, run.cancelled or error"
40
40
  ]
41
41
  },
42
+ {
43
+ "id": "make-app-browser-api",
44
+ "summary": "Connect the assistant to the existing Make App AI Browser API.",
45
+ "use": [
46
+ "@qfei-design/make-ai-assistant/make-app:createMakeAppAssistantTransport"
47
+ ],
48
+ "hostProvides": [
49
+ "Authenticated semantic callbacks for chat lookup, history and message submission",
50
+ "Credentialed response EventSource factory",
51
+ "Current Make App context"
52
+ ],
53
+ "readNext": ["README.md", "PUBLIC_API.md", "docs/backend-contract.md"],
54
+ "commonMistakes": [
55
+ "Creating or forwarding service credentials in browser code",
56
+ "Treating response.message as a text delta",
57
+ "Showing new-chat or remote-cancel controls when the backend does not support them"
58
+ ]
59
+ },
60
+ {
61
+ "id": "make-console-agent-api",
62
+ "summary": "Connect the assistant to the Make Console Agent, Session, durable-event and Run SSE APIs.",
63
+ "use": [
64
+ "@qfei-design/make-ai-assistant/make-console:createMakeConsoleAssistantTransport"
65
+ ],
66
+ "hostProvides": [
67
+ "Authenticated semantic callbacks for Agent lookup, Session lookup, durable events and message submission",
68
+ "Credentialed Run EventSource factory",
69
+ "Current Make Console App context"
70
+ ],
71
+ "readNext": ["README.md", "PUBLIC_API.md", "docs/backend-contract.md"],
72
+ "commonMistakes": [
73
+ "Reading or copying zs_session in application code",
74
+ "Treating SSE as the durable source of truth",
75
+ "Reusing the Make App Browser API transport by only replacing its base URL"
76
+ ]
77
+ },
42
78
  {
43
79
  "id": "app-artifact-template",
44
80
  "summary": "Register an App-specific result template without changing the platform package.",