@genesislcap/ai-assistant 14.459.0 → 14.460.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-assistant.api.json +1 -1
- package/dist/ai-assistant.d.ts +3 -1
- package/dist/dts/components/chat-driver/chat-driver.d.ts +3 -1
- package/dist/dts/components/chat-driver/chat-driver.d.ts.map +1 -1
- package/dist/dts/main/main.styles.d.ts.map +1 -1
- package/dist/dts/main/main.template.d.ts.map +1 -1
- package/dist/esm/components/chat-driver/chat-driver.js +7 -2
- package/dist/esm/components/chat-driver/chat-driver.test.js +24 -0
- package/dist/esm/main/main.styles.js +22 -1
- package/dist/esm/main/main.template.js +17 -4
- package/package.json +16 -16
- package/src/components/chat-driver/chat-driver.test.ts +36 -0
- package/src/components/chat-driver/chat-driver.ts +10 -2
- package/src/main/main.styles.ts +22 -1
- package/src/main/main.template.ts +28 -9
|
@@ -3454,7 +3454,7 @@
|
|
|
3454
3454
|
{
|
|
3455
3455
|
"kind": "Method",
|
|
3456
3456
|
"canonicalReference": "@genesislcap/ai-assistant!ChatDriver#requestInteraction:member(1)",
|
|
3457
|
-
"docComment": "/**\n * Request a custom UI interaction. Emits a new message with the interaction. Tool handlers can call this to pause execution until the user completes the UI interaction.\n *\n * If a host requester is wired (sub-agent case), the call delegates upward so the interaction lives on the parent — the main UI is only listening to the root driver. Only one interaction may be in flight at any time on a given root: concurrent calls (e.g. two parallel sub-agents both spawning a widget) throw. Parallel sub-agents are for parallel work, not for user interaction, which is inherently sequential.\n *\n * @param componentName - The custom element name to render.\n *\n * @param data - Data to pass to the component.\n *\n * @param options - Optional per-call overrides, including `chatInputDuringExecution` to hide or disable the main chat input while the widget is awaiting user input
|
|
3457
|
+
"docComment": "/**\n * Request a custom UI interaction. Emits a new message with the interaction. Tool handlers can call this to pause execution until the user completes the UI interaction.\n *\n * If a host requester is wired (sub-agent case), the call delegates upward so the interaction lives on the parent — the main UI is only listening to the root driver. Only one interaction may be in flight at any time on a given root: concurrent calls (e.g. two parallel sub-agents both spawning a widget) throw. Parallel sub-agents are for parallel work, not for user interaction, which is inherently sequential.\n *\n * @param componentName - The custom element name to render.\n *\n * @param data - Data to pass to the component.\n *\n * @param options - Optional per-call overrides, including `chatInputDuringExecution` to hide or disable the main chat input while the widget is awaiting user input (reverts when the interaction resolves), and `presentation` to control whether the host wraps the widget in a chat bubble and/or shows the \"Assistant\" label.\n */\n",
|
|
3458
3458
|
"excerptTokens": [
|
|
3459
3459
|
{
|
|
3460
3460
|
"kind": "Content",
|
package/dist/ai-assistant.d.ts
CHANGED
|
@@ -967,7 +967,9 @@ export declare class ChatDriver extends EventTarget implements AiDriver {
|
|
|
967
967
|
* @param data - Data to pass to the component.
|
|
968
968
|
* @param options - Optional per-call overrides, including
|
|
969
969
|
* `chatInputDuringExecution` to hide or disable the main chat input while
|
|
970
|
-
* the widget is awaiting user input
|
|
970
|
+
* the widget is awaiting user input (reverts when the interaction resolves),
|
|
971
|
+
* and `presentation` to control whether the host wraps the widget in a chat
|
|
972
|
+
* bubble and/or shows the "Assistant" label.
|
|
971
973
|
*/
|
|
972
974
|
requestInteraction<T>(componentName: string, data: any, options?: InteractionRequestOptions): Promise<T>;
|
|
973
975
|
/**
|
|
@@ -411,7 +411,9 @@ export declare class ChatDriver extends EventTarget implements AiDriver {
|
|
|
411
411
|
* @param data - Data to pass to the component.
|
|
412
412
|
* @param options - Optional per-call overrides, including
|
|
413
413
|
* `chatInputDuringExecution` to hide or disable the main chat input while
|
|
414
|
-
* the widget is awaiting user input
|
|
414
|
+
* the widget is awaiting user input (reverts when the interaction resolves),
|
|
415
|
+
* and `presentation` to control whether the host wraps the widget in a chat
|
|
416
|
+
* bubble and/or shows the "Assistant" label.
|
|
415
417
|
*/
|
|
416
418
|
requestInteraction<T>(componentName: string, data: any, options?: InteractionRequestOptions): Promise<T>;
|
|
417
419
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,iDA83BlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EAAuC,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAmNpD,gBAAgB;AAChB,eAAO,MAAM,6BAA6B,GACxC,oBAAoB,MAAM,KACzB,YAAY,CAAC,qBAAqB,CA2jBpC,CAAC"}
|
|
@@ -628,7 +628,9 @@ export class ChatDriver extends EventTarget {
|
|
|
628
628
|
* @param data - Data to pass to the component.
|
|
629
629
|
* @param options - Optional per-call overrides, including
|
|
630
630
|
* `chatInputDuringExecution` to hide or disable the main chat input while
|
|
631
|
-
* the widget is awaiting user input
|
|
631
|
+
* the widget is awaiting user input (reverts when the interaction resolves),
|
|
632
|
+
* and `presentation` to control whether the host wraps the widget in a chat
|
|
633
|
+
* bubble and/or shows the "Assistant" label.
|
|
632
634
|
*/
|
|
633
635
|
requestInteraction(componentName, data, options) {
|
|
634
636
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -643,6 +645,7 @@ export class ChatDriver extends EventTarget {
|
|
|
643
645
|
const interactionId = crypto.randomUUID();
|
|
644
646
|
const chatInputDuringExecution = options === null || options === void 0 ? void 0 : options.chatInputDuringExecution;
|
|
645
647
|
const timeoutMs = options === null || options === void 0 ? void 0 : options.timeoutMs;
|
|
648
|
+
const presentation = options === null || options === void 0 ? void 0 : options.presentation;
|
|
646
649
|
return new Promise((resolve, reject) => {
|
|
647
650
|
this.pendingInteractions.set(interactionId, {
|
|
648
651
|
resolve,
|
|
@@ -674,7 +677,9 @@ export class ChatDriver extends EventTarget {
|
|
|
674
677
|
this.appendToHistory({
|
|
675
678
|
role: 'assistant',
|
|
676
679
|
content: '',
|
|
677
|
-
interaction: { interactionId,
|
|
680
|
+
interaction: Object.assign({ interactionId,
|
|
681
|
+
componentName,
|
|
682
|
+
data }, (presentation ? { presentation } : {})),
|
|
678
683
|
});
|
|
679
684
|
});
|
|
680
685
|
});
|
|
@@ -779,6 +779,30 @@ syntheticUser('omitted or whitespace-only userMessage appends no synthetic-user
|
|
|
779
779
|
}));
|
|
780
780
|
syntheticUser.run();
|
|
781
781
|
// ---------------------------------------------------------------------------
|
|
782
|
+
// interaction presentation — the per-call `presentation` option is stamped
|
|
783
|
+
// onto the appended interaction so the renderer can frame the widget, and is
|
|
784
|
+
// absent (the historical default) when the option is omitted.
|
|
785
|
+
// ---------------------------------------------------------------------------
|
|
786
|
+
const interactionPresentation = createLogicSuite('ChatDriver interaction presentation');
|
|
787
|
+
interactionPresentation('presentation option is stamped onto the appended interaction', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
788
|
+
const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
|
|
789
|
+
const pending = driver.requestInteraction('w', {}, { presentation: 'bubble' });
|
|
790
|
+
const interaction = driver.getHistory().at(-1).interaction;
|
|
791
|
+
assert.is(interaction.presentation, 'bubble');
|
|
792
|
+
// Clean up the pending interaction so it does not dangle.
|
|
793
|
+
driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
|
|
794
|
+
yield pending;
|
|
795
|
+
}));
|
|
796
|
+
interactionPresentation('presentation is absent when the option is omitted', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
797
|
+
const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
|
|
798
|
+
const pending = driver.requestInteraction('w', {});
|
|
799
|
+
const interaction = driver.getHistory().at(-1).interaction;
|
|
800
|
+
assert.ok(!('presentation' in interaction));
|
|
801
|
+
driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
|
|
802
|
+
yield pending;
|
|
803
|
+
}));
|
|
804
|
+
interactionPresentation.run();
|
|
805
|
+
// ---------------------------------------------------------------------------
|
|
782
806
|
// interaction timeout — requestInteraction({ timeoutMs }) resolves with a
|
|
783
807
|
// status:'timeout' result (never rejects) and closes the widget read-only.
|
|
784
808
|
// ---------------------------------------------------------------------------
|
|
@@ -427,6 +427,13 @@ export const styles = css `
|
|
|
427
427
|
animation: slide-in-left 0.25s ease-out;
|
|
428
428
|
}
|
|
429
429
|
|
|
430
|
+
/* A 'bubble' interaction reads like a normal assistant message: avatar to the
|
|
431
|
+
left, bubble to the right — not the full-width column the other interaction
|
|
432
|
+
presentations use. */
|
|
433
|
+
.message-row.interaction.present-bubble {
|
|
434
|
+
flex-direction: row;
|
|
435
|
+
}
|
|
436
|
+
|
|
430
437
|
.avatar {
|
|
431
438
|
position: relative;
|
|
432
439
|
width: 32px;
|
|
@@ -535,7 +542,10 @@ export const styles = css `
|
|
|
535
542
|
border: 1px solid color-mix(in srgb, var(--ai-function-color, #86efac) 20%, transparent);
|
|
536
543
|
}
|
|
537
544
|
|
|
538
|
-
|
|
545
|
+
/* 'label' (default) and 'bare' interactions render the widget chrome-free and
|
|
546
|
+
full-width — the widget owns its body. */
|
|
547
|
+
.message-row.interaction.present-label .message,
|
|
548
|
+
.message-row.interaction.present-bare .message {
|
|
539
549
|
background: none;
|
|
540
550
|
border: none;
|
|
541
551
|
padding: 0;
|
|
@@ -543,6 +553,17 @@ export const styles = css `
|
|
|
543
553
|
width: 100%;
|
|
544
554
|
}
|
|
545
555
|
|
|
556
|
+
/* 'bubble' interactions reuse the standard assistant-message skin so the
|
|
557
|
+
widget sits inside a normal chat bubble. Padding, max-width and min-width
|
|
558
|
+
come from the base .message rule. */
|
|
559
|
+
.message-row.interaction.present-bubble .message {
|
|
560
|
+
background: linear-gradient(135deg, var(--neutral-layer-3) 0%, var(--neutral-layer-4) 100%);
|
|
561
|
+
color: var(--neutral-foreground-rest);
|
|
562
|
+
border-radius: 4px 18px 18px;
|
|
563
|
+
border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-rest);
|
|
564
|
+
box-shadow: var(--ai-message-shadow, 0 2px 8px rgb(0 0 0 / 15%));
|
|
565
|
+
}
|
|
566
|
+
|
|
546
567
|
.sender {
|
|
547
568
|
font-weight: bold;
|
|
548
569
|
font-size: 0.9em;
|
|
@@ -100,6 +100,12 @@ const senderLabel = {
|
|
|
100
100
|
interaction: 'Assistant',
|
|
101
101
|
ai: 'Assistant',
|
|
102
102
|
};
|
|
103
|
+
/**
|
|
104
|
+
* Resolves how the host frames an interaction widget, defaulting to `'label'`
|
|
105
|
+
* (the historical "Assistant" label, no bubble). Callers guard on
|
|
106
|
+
* `m.interaction` first; non-interaction messages never consult this.
|
|
107
|
+
*/
|
|
108
|
+
const interactionPresentation = (m) => { var _a, _b; return (_b = (_a = m.interaction) === null || _a === void 0 ? void 0 : _a.presentation) !== null && _b !== void 0 ? _b : 'label'; };
|
|
103
109
|
// ─── Sub-agent trace fragments ────────────────────────────────────────────────
|
|
104
110
|
const subAgentAssistantTemplate = html `
|
|
105
111
|
<div class="sub-agent-message sub-agent-assistant">${(m) => m.content}</div>
|
|
@@ -218,7 +224,9 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
|
|
|
218
224
|
</div>
|
|
219
225
|
`)}
|
|
220
226
|
${when((m) => m.role !== 'system-event', html `
|
|
221
|
-
<div
|
|
227
|
+
<div
|
|
228
|
+
class="message-row ${(m) => messageType(m)} ${(m) => m.interaction ? `present-${interactionPresentation(m)}` : ''}"
|
|
229
|
+
>
|
|
222
230
|
<div class="avatar ${(m) => messageType(m)}">
|
|
223
231
|
${when(
|
|
224
232
|
// Keyed on messageType (not raw role) so a synthetic-user message,
|
|
@@ -227,8 +235,12 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
|
|
|
227
235
|
(m) => messageType(m) === 'user', userAvatarTemplate)}${when((m) => messageType(m) !== 'user', assistantAvatarTemplate)}
|
|
228
236
|
</div>
|
|
229
237
|
<div class="message ${(m) => messageType(m)}">
|
|
230
|
-
|
|
231
|
-
|
|
238
|
+
${when(
|
|
239
|
+
// A 'bare' interaction owns its full presentation — suppress the
|
|
240
|
+
// host sender label. Every other message keeps it.
|
|
241
|
+
(m) => !(m.interaction && interactionPresentation(m) === 'bare'), html `
|
|
242
|
+
<div class="sender">
|
|
243
|
+
${(m, c) => {
|
|
232
244
|
var _a;
|
|
233
245
|
return messageType(m) === 'ai-function' &&
|
|
234
246
|
m.agentName &&
|
|
@@ -236,7 +248,8 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
|
|
|
236
248
|
? `Tool Call · ${(_a = m.agentLabel) !== null && _a !== void 0 ? _a : m.agentName}`
|
|
237
249
|
: senderLabel[messageType(m)];
|
|
238
250
|
}}
|
|
239
|
-
|
|
251
|
+
</div>
|
|
252
|
+
`)}
|
|
240
253
|
<div class="content">
|
|
241
254
|
${when((m) => m.content, html `
|
|
242
255
|
<ai-chat-markdown :content="${(m) => m.content}"></ai-chat-markdown>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genesislcap/ai-assistant",
|
|
3
3
|
"description": "Genesis AI Assistant micro-frontend",
|
|
4
|
-
"version": "14.
|
|
4
|
+
"version": "14.460.0",
|
|
5
5
|
"license": "SEE LICENSE IN license.txt",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
7
7
|
"types": "dist/ai-assistant.d.ts",
|
|
@@ -64,24 +64,24 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@genesislcap/foundation-testing": "14.
|
|
68
|
-
"@genesislcap/genx": "14.
|
|
69
|
-
"@genesislcap/rollup-builder": "14.
|
|
70
|
-
"@genesislcap/ts-builder": "14.
|
|
71
|
-
"@genesislcap/uvu-playwright-builder": "14.
|
|
72
|
-
"@genesislcap/vite-builder": "14.
|
|
73
|
-
"@genesislcap/webpack-builder": "14.
|
|
67
|
+
"@genesislcap/foundation-testing": "14.460.0",
|
|
68
|
+
"@genesislcap/genx": "14.460.0",
|
|
69
|
+
"@genesislcap/rollup-builder": "14.460.0",
|
|
70
|
+
"@genesislcap/ts-builder": "14.460.0",
|
|
71
|
+
"@genesislcap/uvu-playwright-builder": "14.460.0",
|
|
72
|
+
"@genesislcap/vite-builder": "14.460.0",
|
|
73
|
+
"@genesislcap/webpack-builder": "14.460.0",
|
|
74
74
|
"@types/dompurify": "^3.0.5",
|
|
75
75
|
"@types/marked": "^5.0.2"
|
|
76
76
|
},
|
|
77
77
|
"dependencies": {
|
|
78
|
-
"@genesislcap/foundation-ai": "14.
|
|
79
|
-
"@genesislcap/foundation-logger": "14.
|
|
80
|
-
"@genesislcap/foundation-redux": "14.
|
|
81
|
-
"@genesislcap/foundation-ui": "14.
|
|
82
|
-
"@genesislcap/foundation-utils": "14.
|
|
83
|
-
"@genesislcap/rapid-design-system": "14.
|
|
84
|
-
"@genesislcap/web-core": "14.
|
|
78
|
+
"@genesislcap/foundation-ai": "14.460.0",
|
|
79
|
+
"@genesislcap/foundation-logger": "14.460.0",
|
|
80
|
+
"@genesislcap/foundation-redux": "14.460.0",
|
|
81
|
+
"@genesislcap/foundation-ui": "14.460.0",
|
|
82
|
+
"@genesislcap/foundation-utils": "14.460.0",
|
|
83
|
+
"@genesislcap/rapid-design-system": "14.460.0",
|
|
84
|
+
"@genesislcap/web-core": "14.460.0",
|
|
85
85
|
"dompurify": "^3.3.1",
|
|
86
86
|
"marked": "^17.0.3"
|
|
87
87
|
},
|
|
@@ -93,5 +93,5 @@
|
|
|
93
93
|
"publishConfig": {
|
|
94
94
|
"access": "public"
|
|
95
95
|
},
|
|
96
|
-
"gitHead": "
|
|
96
|
+
"gitHead": "12d48ef6ec786b6fc0ad12bccb3682d0792e508c"
|
|
97
97
|
}
|
|
@@ -1058,6 +1058,42 @@ syntheticUser(
|
|
|
1058
1058
|
|
|
1059
1059
|
syntheticUser.run();
|
|
1060
1060
|
|
|
1061
|
+
// ---------------------------------------------------------------------------
|
|
1062
|
+
// interaction presentation — the per-call `presentation` option is stamped
|
|
1063
|
+
// onto the appended interaction so the renderer can frame the widget, and is
|
|
1064
|
+
// absent (the historical default) when the option is omitted.
|
|
1065
|
+
// ---------------------------------------------------------------------------
|
|
1066
|
+
|
|
1067
|
+
const interactionPresentation = createLogicSuite('ChatDriver interaction presentation');
|
|
1068
|
+
|
|
1069
|
+
interactionPresentation(
|
|
1070
|
+
'presentation option is stamped onto the appended interaction',
|
|
1071
|
+
async () => {
|
|
1072
|
+
const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
|
|
1073
|
+
|
|
1074
|
+
const pending = driver.requestInteraction('w', {}, { presentation: 'bubble' });
|
|
1075
|
+
const interaction = driver.getHistory().at(-1)!.interaction!;
|
|
1076
|
+
assert.is(interaction.presentation, 'bubble');
|
|
1077
|
+
|
|
1078
|
+
// Clean up the pending interaction so it does not dangle.
|
|
1079
|
+
driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
|
|
1080
|
+
await pending;
|
|
1081
|
+
},
|
|
1082
|
+
);
|
|
1083
|
+
|
|
1084
|
+
interactionPresentation('presentation is absent when the option is omitted', async () => {
|
|
1085
|
+
const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
|
|
1086
|
+
|
|
1087
|
+
const pending = driver.requestInteraction('w', {});
|
|
1088
|
+
const interaction = driver.getHistory().at(-1)!.interaction!;
|
|
1089
|
+
assert.ok(!('presentation' in interaction));
|
|
1090
|
+
|
|
1091
|
+
driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
|
|
1092
|
+
await pending;
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
interactionPresentation.run();
|
|
1096
|
+
|
|
1061
1097
|
// ---------------------------------------------------------------------------
|
|
1062
1098
|
// interaction timeout — requestInteraction({ timeoutMs }) resolves with a
|
|
1063
1099
|
// status:'timeout' result (never rejects) and closes the widget read-only.
|
|
@@ -874,7 +874,9 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
874
874
|
* @param data - Data to pass to the component.
|
|
875
875
|
* @param options - Optional per-call overrides, including
|
|
876
876
|
* `chatInputDuringExecution` to hide or disable the main chat input while
|
|
877
|
-
* the widget is awaiting user input
|
|
877
|
+
* the widget is awaiting user input (reverts when the interaction resolves),
|
|
878
|
+
* and `presentation` to control whether the host wraps the widget in a chat
|
|
879
|
+
* bubble and/or shows the "Assistant" label.
|
|
878
880
|
*/
|
|
879
881
|
public async requestInteraction<T>(
|
|
880
882
|
componentName: string,
|
|
@@ -894,6 +896,7 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
894
896
|
const interactionId = crypto.randomUUID();
|
|
895
897
|
const chatInputDuringExecution = options?.chatInputDuringExecution;
|
|
896
898
|
const timeoutMs = options?.timeoutMs;
|
|
899
|
+
const presentation = options?.presentation;
|
|
897
900
|
return new Promise((resolve, reject) => {
|
|
898
901
|
this.pendingInteractions.set(interactionId, {
|
|
899
902
|
resolve,
|
|
@@ -928,7 +931,12 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
928
931
|
this.appendToHistory({
|
|
929
932
|
role: 'assistant',
|
|
930
933
|
content: '',
|
|
931
|
-
interaction: {
|
|
934
|
+
interaction: {
|
|
935
|
+
interactionId,
|
|
936
|
+
componentName,
|
|
937
|
+
data,
|
|
938
|
+
...(presentation ? { presentation } : {}),
|
|
939
|
+
},
|
|
932
940
|
});
|
|
933
941
|
});
|
|
934
942
|
}
|
package/src/main/main.styles.ts
CHANGED
|
@@ -433,6 +433,13 @@ export const styles = css`
|
|
|
433
433
|
animation: slide-in-left 0.25s ease-out;
|
|
434
434
|
}
|
|
435
435
|
|
|
436
|
+
/* A 'bubble' interaction reads like a normal assistant message: avatar to the
|
|
437
|
+
left, bubble to the right — not the full-width column the other interaction
|
|
438
|
+
presentations use. */
|
|
439
|
+
.message-row.interaction.present-bubble {
|
|
440
|
+
flex-direction: row;
|
|
441
|
+
}
|
|
442
|
+
|
|
436
443
|
.avatar {
|
|
437
444
|
position: relative;
|
|
438
445
|
width: 32px;
|
|
@@ -541,7 +548,10 @@ export const styles = css`
|
|
|
541
548
|
border: 1px solid color-mix(in srgb, var(--ai-function-color, #86efac) 20%, transparent);
|
|
542
549
|
}
|
|
543
550
|
|
|
544
|
-
|
|
551
|
+
/* 'label' (default) and 'bare' interactions render the widget chrome-free and
|
|
552
|
+
full-width — the widget owns its body. */
|
|
553
|
+
.message-row.interaction.present-label .message,
|
|
554
|
+
.message-row.interaction.present-bare .message {
|
|
545
555
|
background: none;
|
|
546
556
|
border: none;
|
|
547
557
|
padding: 0;
|
|
@@ -549,6 +559,17 @@ export const styles = css`
|
|
|
549
559
|
width: 100%;
|
|
550
560
|
}
|
|
551
561
|
|
|
562
|
+
/* 'bubble' interactions reuse the standard assistant-message skin so the
|
|
563
|
+
widget sits inside a normal chat bubble. Padding, max-width and min-width
|
|
564
|
+
come from the base .message rule. */
|
|
565
|
+
.message-row.interaction.present-bubble .message {
|
|
566
|
+
background: linear-gradient(135deg, var(--neutral-layer-3) 0%, var(--neutral-layer-4) 100%);
|
|
567
|
+
color: var(--neutral-foreground-rest);
|
|
568
|
+
border-radius: 4px 18px 18px;
|
|
569
|
+
border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-rest);
|
|
570
|
+
box-shadow: var(--ai-message-shadow, 0 2px 8px rgb(0 0 0 / 15%));
|
|
571
|
+
}
|
|
572
|
+
|
|
552
573
|
.sender {
|
|
553
574
|
font-weight: bold;
|
|
554
575
|
font-size: 0.9em;
|
|
@@ -20,6 +20,7 @@ import type {
|
|
|
20
20
|
ChatAttachment,
|
|
21
21
|
ChatMessage,
|
|
22
22
|
ChatToolCall,
|
|
23
|
+
InteractionPresentation,
|
|
23
24
|
} from '@genesislcap/foundation-ai';
|
|
24
25
|
import { isChatToolCallUnknown } from '@genesislcap/foundation-ai';
|
|
25
26
|
import { classNames, html, ref, repeat, when, ViewTemplate } from '@genesislcap/web-core';
|
|
@@ -117,6 +118,14 @@ const senderLabel: Record<string, string> = {
|
|
|
117
118
|
ai: 'Assistant',
|
|
118
119
|
};
|
|
119
120
|
|
|
121
|
+
/**
|
|
122
|
+
* Resolves how the host frames an interaction widget, defaulting to `'label'`
|
|
123
|
+
* (the historical "Assistant" label, no bubble). Callers guard on
|
|
124
|
+
* `m.interaction` first; non-interaction messages never consult this.
|
|
125
|
+
*/
|
|
126
|
+
const interactionPresentation = (m: ChatMessage): InteractionPresentation =>
|
|
127
|
+
m.interaction?.presentation ?? 'label';
|
|
128
|
+
|
|
120
129
|
// ─── Sub-agent trace fragments ────────────────────────────────────────────────
|
|
121
130
|
|
|
122
131
|
const subAgentAssistantTemplate = html<ChatMessage>`
|
|
@@ -284,7 +293,10 @@ ${(tc) => (tc.foldPath?.length ? `${tc.foldPath.join(' › ')} › ` : '')}<stro
|
|
|
284
293
|
${when(
|
|
285
294
|
(m) => m.role !== 'system-event',
|
|
286
295
|
html<ChatMessage, FoundationAiAssistant>`
|
|
287
|
-
<div
|
|
296
|
+
<div
|
|
297
|
+
class="message-row ${(m) => messageType(m)} ${(m) =>
|
|
298
|
+
m.interaction ? `present-${interactionPresentation(m)}` : ''}"
|
|
299
|
+
>
|
|
288
300
|
<div class="avatar ${(m) => messageType(m)}">
|
|
289
301
|
${when(
|
|
290
302
|
// Keyed on messageType (not raw role) so a synthetic-user message,
|
|
@@ -295,14 +307,21 @@ ${(tc) => (tc.foldPath?.length ? `${tc.foldPath.join(' › ')} › ` : '')}<stro
|
|
|
295
307
|
)}${when((m) => messageType(m) !== 'user', assistantAvatarTemplate)}
|
|
296
308
|
</div>
|
|
297
309
|
<div class="message ${(m) => messageType(m)}">
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
310
|
+
${when(
|
|
311
|
+
// A 'bare' interaction owns its full presentation — suppress the
|
|
312
|
+
// host sender label. Every other message keeps it.
|
|
313
|
+
(m) => !(m.interaction && interactionPresentation(m) === 'bare'),
|
|
314
|
+
html<ChatMessage, FoundationAiAssistant>`
|
|
315
|
+
<div class="sender">
|
|
316
|
+
${(m, c) =>
|
|
317
|
+
messageType(m) === 'ai-function' &&
|
|
318
|
+
m.agentName &&
|
|
319
|
+
(c.parent as FoundationAiAssistant).showAgentSwitchIndicator
|
|
320
|
+
? `Tool Call · ${m.agentLabel ?? m.agentName}`
|
|
321
|
+
: senderLabel[messageType(m)]}
|
|
322
|
+
</div>
|
|
323
|
+
`,
|
|
324
|
+
)}
|
|
306
325
|
<div class="content">
|
|
307
326
|
${when(
|
|
308
327
|
(m) => m.content,
|