@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/PUBLIC_API.md +67 -6
- package/README.md +64 -4
- package/capabilities.json +18 -0
- package/dist/conversation-Dy2Sghjv.js +684 -0
- package/dist/conversation-Yku9Lzj_.cjs +1 -0
- package/dist/core/conversation.d.ts +30 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/make-app.cjs +1 -0
- package/dist/make-app.d.ts +36 -0
- package/dist/make-app.mjs +287 -0
- package/dist/make-console.cjs +1 -0
- package/dist/make-console.d.ts +58 -0
- package/dist/make-console.mjs +366 -0
- package/dist/react/make-ai-assistant.d.ts +3 -1
- package/dist/react.cjs +1 -1
- package/dist/react.mjs +560 -409
- package/dist/sse.cjs +1 -1
- package/dist/sse.mjs +1 -1
- package/dist/styles.css +125 -80
- package/docs/backend-contract.md +52 -3
- package/package.ai.json +9 -5
- package/package.json +11 -1
- package/recipes.json +36 -0
- package/dist/conversation-B5kECJz8.js +0 -595
- package/dist/conversation-DpYszfVd.cjs +0 -1
package/dist/sse.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./conversation-
|
|
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-
|
|
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%,
|
|
5
|
-
--make-ai-internal-bg: var(--make-ai-bg, var(--make-color-bg, #
|
|
6
|
-
--make-ai-internal-surface: var(--make-ai-surface, var(--make-color-bg-subtle, #
|
|
7
|
-
--make-ai-internal-surface-strong: var(--make-ai-surface-strong, var(--make-color-bg-muted, #
|
|
8
|
-
--make-ai-internal-text: var(--make-ai-text, var(--make-color-text, #
|
|
9
|
-
--make-ai-internal-text-secondary: var(--make-ai-text-secondary, var(--make-color-text-secondary, #
|
|
10
|
-
--make-ai-internal-border: var(--make-ai-border, var(--make-color-border, #
|
|
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
|
|
16
|
-
--make-ai-internal-drawer-width: var(--make-ai-drawer-width,
|
|
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:
|
|
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:
|
|
51
|
-
border:
|
|
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
|
|
55
|
-
color:
|
|
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:
|
|
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:
|
|
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
|
|
70
|
-
transform: translateY(-2px)
|
|
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)
|
|
92
|
+
border: 1px solid color-mix(in srgb, var(--make-ai-internal-accent) 30%, transparent);
|
|
93
93
|
border-radius: 50%;
|
|
94
|
-
inset: -
|
|
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
|
|
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:
|
|
128
|
-
padding: 14px
|
|
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:
|
|
140
|
-
font-weight:
|
|
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
|
-
|
|
151
|
-
margin-top:
|
|
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:
|
|
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-
|
|
213
|
-
|
|
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
|
-
|
|
209
|
+
line-height: 1.5;
|
|
210
|
+
margin: 12px 18px 0;
|
|
218
211
|
padding: 8px 10px;
|
|
219
|
-
border-radius:
|
|
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
|
|
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:
|
|
264
|
-
margin-bottom:
|
|
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:
|
|
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
|
-
|
|
285
|
-
border-radius: 4px 14px 14px;
|
|
293
|
+
color: var(--make-ai-internal-text);
|
|
286
294
|
font-size: 14px;
|
|
287
|
-
line-height: 1.
|
|
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-
|
|
294
|
-
border
|
|
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:
|
|
310
|
+
border-radius: 10px;
|
|
302
311
|
display: flex;
|
|
303
312
|
gap: 4px;
|
|
304
|
-
height:
|
|
305
|
-
padding: 0
|
|
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-
|
|
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:
|
|
329
|
-
|
|
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:
|
|
379
|
+
padding: 12px 18px 10px;
|
|
337
380
|
}
|
|
338
381
|
|
|
339
382
|
.make-ai-assistant__suggestions {
|
|
340
383
|
display: flex;
|
|
341
|
-
gap:
|
|
342
|
-
margin-bottom:
|
|
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:
|
|
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:
|
|
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:
|
|
410
|
+
border-radius: 16px;
|
|
368
411
|
display: flex;
|
|
369
412
|
gap: 8px;
|
|
370
|
-
padding:
|
|
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.
|
|
384
|
-
max-height:
|
|
385
|
-
min-height:
|
|
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%,
|
|
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:
|
|
401
|
-
color:
|
|
443
|
+
border-radius: 50%;
|
|
444
|
+
color: #fcfcff;
|
|
402
445
|
cursor: pointer;
|
|
403
446
|
display: flex;
|
|
404
447
|
flex: 0 0 auto;
|
|
405
|
-
height:
|
|
448
|
+
height: 36px;
|
|
406
449
|
justify-content: center;
|
|
407
|
-
width:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
}
|
package/docs/backend-contract.md
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
19
|
-
"npm": "npm install @qfei-design/make-ai-assistant@^0.1.
|
|
20
|
-
"yarn": "yarn add @qfei-design/make-ai-assistant@^0.1.
|
|
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
|
-
"
|
|
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.
|
|
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.",
|