juneau 0.6.0 → 0.7.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/README.md +52 -3
- package/dist/adapters/mockAdapter.d.ts.map +1 -1
- package/dist/components/AiChat/AiChat.d.ts +4 -2
- package/dist/components/AiChat/AiChat.d.ts.map +1 -1
- package/dist/components/AiMessageBubble/AiMessageBubble.d.ts +4 -2
- package/dist/components/AiMessageBubble/AiMessageBubble.d.ts.map +1 -1
- package/dist/components/AiMessageList/AiMessageList.d.ts +4 -2
- package/dist/components/AiMessageList/AiMessageList.d.ts.map +1 -1
- package/dist/components/AiSidebar/AiSidebar.d.ts +4 -1
- package/dist/components/AiSidebar/AiSidebar.d.ts.map +1 -1
- package/dist/components/parts/AiEntityCard.d.ts +9 -0
- package/dist/components/parts/AiEntityCard.d.ts.map +1 -0
- package/dist/components/parts/AiEntityListPart.d.ts +9 -0
- package/dist/components/parts/AiEntityListPart.d.ts.map +1 -0
- package/dist/components/parts/AiMessagePartRenderer.d.ts +4 -2
- package/dist/components/parts/AiMessagePartRenderer.d.ts.map +1 -1
- package/dist/core/types.d.ts +41 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.cjs +41 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2411 -2284
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/types.d.ts +3 -2
- package/dist/server/types.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ It receives the conversation history and streams back typed events:
|
|
|
45
45
|
```ts
|
|
46
46
|
type AiStreamEvent =
|
|
47
47
|
| { type: 'text'; text: string } // streamed text chunk — append to current bubble
|
|
48
|
-
| { type: 'part'; part: AiMessagePart } // rich UI block (table, proposal, activity, error)
|
|
48
|
+
| { type: 'part'; part: AiMessagePart } // rich UI block (table, entity, entity-list, proposal, activity, error)
|
|
49
49
|
| { type: 'done' } // stream finished cleanly
|
|
50
50
|
| { type: 'error'; message: string } // stream failed
|
|
51
51
|
```
|
|
@@ -300,8 +300,10 @@ If your backend is built specifically for Juneau (e.g. Tappeer), stream newline-
|
|
|
300
300
|
{ "type": "activity", "id": "doc-search", "title": "Searching document", "status": "running" }
|
|
301
301
|
{ "type": "activity", "id": "doc-search", "title": "Document found", "description": "INV-2024-0894", "status": "done" }
|
|
302
302
|
|
|
303
|
-
// Rich block — table or proposal
|
|
303
|
+
// Rich block — table, entity, entity list, or proposal
|
|
304
304
|
{ "type": "part", "part": { "type": "table", "columns": ["Name", "Amount"], "rows": [...] } }
|
|
305
|
+
{ "type": "part", "part": { "type": "entity", "entityType": "invoice", "entity": { "id": "...", "title": "...", "subtitle": "...", "fields": [{ "label": "Status", "value": "Approved", "badge": "success" }] } } }
|
|
306
|
+
{ "type": "part", "part": { "type": "entity-list", "title": "3 results", "entities": [...] } }
|
|
305
307
|
{ "type": "part", "part": { "type": "proposal", "proposal": { "id": "...", "title": "..." } } }
|
|
306
308
|
|
|
307
309
|
// Stream finished cleanly
|
|
@@ -331,6 +333,7 @@ Shipped for local development. No backend needed — responds to keywords in the
|
|
|
331
333
|
|---|---|
|
|
332
334
|
| `"show"`, `"list"`, `"data"`, `"table"` | A rendered data table |
|
|
333
335
|
| `"suggest"`, `"recommend"`, `"proposal"` | A proposal card with confirm/cancel |
|
|
336
|
+
| `"entity"`, `"card"`, `"detail"`, `"find"` | An entity list + entity detail card |
|
|
334
337
|
| `"activity"`, `"progress"`, `"document"` | An activity timeline with running/done states |
|
|
335
338
|
| `"help"`, `"what can you do"` | Capability overview |
|
|
336
339
|
| `"error"`, `"fail"` | Simulated error response |
|
|
@@ -465,6 +468,8 @@ The sidebar anchors to the bottom-right of the viewport and opens at 60% screen
|
|
|
465
468
|
| `height` | `string` | Height when open. Any CSS value. Defaults to `'60vh'`. |
|
|
466
469
|
| `className` | `string` | Added to the `<aside>` element. |
|
|
467
470
|
| `style` | `CSSProperties` | Inline styles on the `<aside>`. |
|
|
471
|
+
| `renderPart` | `RenderPartFn` | Custom part renderer — see below. |
|
|
472
|
+
| `onEntityClick` | `(entity, entityType?) => void` | Makes entity cards clickable — e.g. navigate to the record. |
|
|
468
473
|
|
|
469
474
|
---
|
|
470
475
|
|
|
@@ -515,6 +520,7 @@ function MyPage() {
|
|
|
515
520
|
| `sendIcon` | `ReactNode` | Override send button icon. |
|
|
516
521
|
| `placeholder` | `string` | Input placeholder text. |
|
|
517
522
|
| `renderPart` | `RenderPartFn` | Custom part renderer — see below. |
|
|
523
|
+
| `onEntityClick` | `(entity, entityType?) => void` | Makes entity cards clickable — e.g. navigate to the record. |
|
|
518
524
|
|
|
519
525
|
---
|
|
520
526
|
|
|
@@ -526,7 +532,7 @@ Both `AiSidebar` and `AiChat` accept a `renderPart` prop — an escape hatch for
|
|
|
526
532
|
type RenderPartFn = (part: AiMessagePart) => ReactNode | null | undefined;
|
|
527
533
|
```
|
|
528
534
|
|
|
529
|
-
It is called **before** the built-in renderers for every message part. Return a ReactNode to render it; return `null`/`undefined` to fall through to the built-ins (`text`, `table`, `proposal`, `activity`, `error`).
|
|
535
|
+
It is called **before** the built-in renderers for every message part. Return a ReactNode to render it; return `null`/`undefined` to fall through to the built-ins (`text`, `table`, `entity`, `entity-list`, `proposal`, `activity`, `error`).
|
|
530
536
|
|
|
531
537
|
The backend can stream any custom part through the standard wire protocol:
|
|
532
538
|
|
|
@@ -686,6 +692,8 @@ Assistant messages are composed of typed **parts**. Text is streamed chunk by ch
|
|
|
686
692
|
|---|---|---|
|
|
687
693
|
| `text` | `{ type: 'text', text: string }` stream events, accumulated | Markdown via `react-markdown` — safe against XSS |
|
|
688
694
|
| `table` | `{ type: 'part', part: { type: 'table', ... } }` | `AiTablePart` |
|
|
695
|
+
| `entity` | `{ type: 'part', part: { type: 'entity', ... } }` | `AiEntityCard` |
|
|
696
|
+
| `entity-list` | `{ type: 'part', part: { type: 'entity-list', ... } }` | `AiEntityListPart` |
|
|
689
697
|
| `proposal` | `{ type: 'part', part: { type: 'proposal', ... } }` | `AiProposalCard` |
|
|
690
698
|
| `activity` | `{ type: 'part', part: { type: 'activity', ... } }` | `AiActivityPart` |
|
|
691
699
|
| `error` | `{ type: 'error', message: string }` or `{ type: 'part', part: { type: 'error', ... } }` | Inline error in bubble |
|
|
@@ -755,6 +763,47 @@ yield {
|
|
|
755
763
|
};
|
|
756
764
|
```
|
|
757
765
|
|
|
766
|
+
**Emitting an entity or entity list:**
|
|
767
|
+
|
|
768
|
+
Entity parts render structured records as cards — a title, optional subtitle, and labelled field rows. Field values can render as badges (`success` / `warning` / `danger` / `neutral`). Pass `onEntityClick` to `AiSidebar` / `AiChat` to make the cards clickable (e.g. navigate to the record); `entityType` and `entity.payload` are forwarded so consumers can route without guessing.
|
|
769
|
+
|
|
770
|
+
```ts
|
|
771
|
+
// Single entity card
|
|
772
|
+
yield {
|
|
773
|
+
type: 'part',
|
|
774
|
+
part: {
|
|
775
|
+
type: 'entity',
|
|
776
|
+
entityType: 'invoice', // optional kind — forwarded to onEntityClick and custom renderers
|
|
777
|
+
entity: {
|
|
778
|
+
id: 'inv-0894', // forwarded to onEntityClick
|
|
779
|
+
title: 'INV-2024-0894',
|
|
780
|
+
subtitle: 'DataSys a.s.',
|
|
781
|
+
fields: [
|
|
782
|
+
{ label: 'Amount', value: 'CZK 390 000' },
|
|
783
|
+
{ label: 'Status', value: 'Approved', badge: 'success' },
|
|
784
|
+
],
|
|
785
|
+
payload: { internalId: 42 }, // anything — not rendered, available in onEntityClick
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
};
|
|
789
|
+
|
|
790
|
+
// List of entities with an optional heading
|
|
791
|
+
yield {
|
|
792
|
+
type: 'part',
|
|
793
|
+
part: {
|
|
794
|
+
type: 'entity-list',
|
|
795
|
+
title: '2 results',
|
|
796
|
+
entityType: 'invoice',
|
|
797
|
+
entities: [
|
|
798
|
+
{ id: 'inv-1', title: 'INV-2024-0894', fields: [{ label: 'Status', value: 'Approved', badge: 'success' }] },
|
|
799
|
+
{ id: 'inv-2', title: 'INV-2024-0895', fields: [{ label: 'Status', value: 'Pending', badge: 'warning' }] },
|
|
800
|
+
],
|
|
801
|
+
},
|
|
802
|
+
};
|
|
803
|
+
```
|
|
804
|
+
|
|
805
|
+
For fully custom entity layouts, override the built-in card via `renderPart` — return your own component for `part.type === 'entity'` / `'entity-list'` and it wins over the default renderer.
|
|
806
|
+
|
|
758
807
|
---
|
|
759
808
|
|
|
760
809
|
## Chat history
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mockAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,eAAe,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"mockAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mockAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,eAAe,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,gBAqBzB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
-
import type { AiMessage } from '../../core/types';
|
|
2
|
+
import type { AiEntity, AiMessage } from '../../core/types';
|
|
3
3
|
import type { AiInputAction } from '../AiInput/AiInput';
|
|
4
4
|
import type { RenderPartFn } from '../parts/AiMessagePartRenderer';
|
|
5
5
|
type Props = {
|
|
@@ -14,6 +14,8 @@ type Props = {
|
|
|
14
14
|
onStop?: () => void;
|
|
15
15
|
onProposalConfirm: (proposalId: string, payload: unknown) => void;
|
|
16
16
|
onProposalCancel: (proposalId: string) => void;
|
|
17
|
+
/** Makes entity cards clickable — receives the entity and its optional entityType. */
|
|
18
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
17
19
|
placeholder?: string;
|
|
18
20
|
/** Override the assistant avatar icon. Forwarded to every message bubble. */
|
|
19
21
|
assistantIcon?: ReactNode;
|
|
@@ -42,6 +44,6 @@ type Props = {
|
|
|
42
44
|
* Used by AiSidebar (inside the sidebar chrome) and directly in dashboard
|
|
43
45
|
* or any other layout where you want chat without the sidebar wrapper.
|
|
44
46
|
*/
|
|
45
|
-
export declare function AiChat({ messages, input, isLoading, isConnecting, error, onInputChange, onSend, onStop, onProposalConfirm, onProposalCancel, placeholder, assistantIcon, actions, sendIcon, renderPart, className, style, }: Props): import("react").JSX.Element;
|
|
47
|
+
export declare function AiChat({ messages, input, isLoading, isConnecting, error, onInputChange, onSend, onStop, onProposalConfirm, onProposalCancel, onEntityClick, placeholder, assistantIcon, actions, sendIcon, renderPart, className, style, }: Props): import("react").JSX.Element;
|
|
46
48
|
export {};
|
|
47
49
|
//# sourceMappingURL=AiChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChat.d.ts","sourceRoot":"","sources":["../../../src/components/AiChat/AiChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"AiChat.d.ts","sourceRoot":"","sources":["../../../src/components/AiChat/AiChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,iGAAiG;IACjG,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EACL,aAAa,EACb,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,OAAO,EACP,QAAQ,EACR,UAAU,EACV,SAAS,EACT,KAAK,GACN,EAAE,KAAK,+BA+BP"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
-
import type { AiMessage } from '../../core/types';
|
|
2
|
+
import type { AiEntity, AiMessage } from '../../core/types';
|
|
3
3
|
import type { RenderPartFn } from '../parts/AiMessagePartRenderer';
|
|
4
4
|
type Props = {
|
|
5
5
|
message: AiMessage;
|
|
@@ -7,9 +7,11 @@ type Props = {
|
|
|
7
7
|
onProposalCancel: (proposalId: string) => void;
|
|
8
8
|
/** Override the assistant avatar icon. Pass any ReactNode — an SVG, img, or component. Defaults to a brain icon. */
|
|
9
9
|
assistantIcon?: ReactNode;
|
|
10
|
+
/** Makes entity cards clickable — forwarded to every AiMessagePartRenderer. */
|
|
11
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
10
12
|
/** Custom part renderer — forwarded to every AiMessagePartRenderer. */
|
|
11
13
|
renderPart?: RenderPartFn;
|
|
12
14
|
};
|
|
13
|
-
export declare function AiMessageBubble({ message, onProposalConfirm, onProposalCancel, assistantIcon, renderPart }: Props): import("react").JSX.Element;
|
|
15
|
+
export declare function AiMessageBubble({ message, onProposalConfirm, onProposalCancel, onEntityClick, assistantIcon, renderPart }: Props): import("react").JSX.Element;
|
|
14
16
|
export {};
|
|
15
17
|
//# sourceMappingURL=AiMessageBubble.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/components/AiMessageBubble/AiMessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"AiMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/components/AiMessageBubble/AiMessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,SAAS,CAAC;IACnB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,oHAAoH;IACpH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,uEAAuE;IACvE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,KAAK,+BA6BhI"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
-
import type { AiMessage } from '../../core/types';
|
|
2
|
+
import type { AiEntity, AiMessage } from '../../core/types';
|
|
3
3
|
import type { RenderPartFn } from '../parts/AiMessagePartRenderer';
|
|
4
4
|
type Props = {
|
|
5
5
|
messages: AiMessage[];
|
|
@@ -10,9 +10,11 @@ type Props = {
|
|
|
10
10
|
onProposalCancel: (proposalId: string) => void;
|
|
11
11
|
/** Override the assistant avatar icon. Forwarded to every AiMessageBubble. */
|
|
12
12
|
assistantIcon?: ReactNode;
|
|
13
|
+
/** Makes entity cards clickable — forwarded to every AiMessageBubble. */
|
|
14
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
13
15
|
/** Custom part renderer — forwarded to every AiMessageBubble. */
|
|
14
16
|
renderPart?: RenderPartFn;
|
|
15
17
|
};
|
|
16
|
-
export declare function AiMessageList({ messages, isLoading, isConnecting, onProposalConfirm, onProposalCancel, assistantIcon, renderPart }: Props): import("react").JSX.Element;
|
|
18
|
+
export declare function AiMessageList({ messages, isLoading, isConnecting, onProposalConfirm, onProposalCancel, onEntityClick, assistantIcon, renderPart }: Props): import("react").JSX.Element;
|
|
17
19
|
export {};
|
|
18
20
|
//# sourceMappingURL=AiMessageList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/AiMessageList/AiMessageList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"AiMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/AiMessageList/AiMessageList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,uGAAuG;IACvG,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,iEAAiE;IACjE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,KAAK,+BAqCxJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
import type { AiEntity } from '../../core/types';
|
|
2
3
|
import type { AiInputAction } from '../AiInput/AiInput';
|
|
3
4
|
import type { RenderPartFn } from '../parts/AiMessagePartRenderer';
|
|
4
5
|
type Props = {
|
|
@@ -32,7 +33,9 @@ type Props = {
|
|
|
32
33
|
* through to the built-ins. Enables custom part types like invoice cards.
|
|
33
34
|
*/
|
|
34
35
|
renderPart?: RenderPartFn;
|
|
36
|
+
/** Makes entity cards clickable — receives the entity and its optional entityType. */
|
|
37
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
35
38
|
};
|
|
36
|
-
export declare function AiSidebar({ title, icon, actions, sendIcon, height, className, style, onReset, renderPart, }: Props): import("react").JSX.Element;
|
|
39
|
+
export declare function AiSidebar({ title, icon, actions, sendIcon, height, className, style, onReset, renderPart, onEntityClick, }: Props): import("react").JSX.Element;
|
|
37
40
|
export {};
|
|
38
41
|
//# sourceMappingURL=AiSidebar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/AiSidebar/AiSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AiSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/AiSidebar/AiSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,KAAK,KAAK,GAAG;IACX,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,MAAe,EACf,SAAS,EACT,KAAK,EACL,OAAO,EACP,UAAU,EACV,aAAa,GACd,EAAE,KAAK,+BAuDP"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AiEntity, AiEntityPart } from '../../core/types';
|
|
2
|
+
type Props = {
|
|
3
|
+
part: AiEntityPart;
|
|
4
|
+
/** Optional click handler — the card becomes interactive when provided */
|
|
5
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function AiEntityCard({ part, onEntityClick }: Props): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=AiEntityCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiEntityCard.d.ts","sourceRoot":"","sources":["../../../src/components/parts/AiEntityCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAqB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGlF,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE,CAAC;AASF,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,+BA0C1D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AiEntity, AiEntityListPart as AiEntityListPartType } from '../../core/types';
|
|
2
|
+
type Props = {
|
|
3
|
+
part: AiEntityListPartType;
|
|
4
|
+
/** Optional click handler — cards become interactive when provided */
|
|
5
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function AiEntityListPart({ part, onEntityClick }: Props): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=AiEntityListPart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiEntityListPart.d.ts","sourceRoot":"","sources":["../../../src/components/parts/AiEntityListPart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI3F,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,oBAAoB,CAAC;IAC3B,sEAAsE;IACtE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,+BAa9D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
-
import type { AiMessagePart } from '../../core/types';
|
|
2
|
+
import type { AiEntity, AiMessagePart } from '../../core/types';
|
|
3
3
|
/**
|
|
4
4
|
* Consumer escape hatch for rendering custom part types (or overriding
|
|
5
5
|
* built-in ones). Receives the raw part object with no narrowing or
|
|
@@ -11,9 +11,11 @@ type Props = {
|
|
|
11
11
|
part: AiMessagePart;
|
|
12
12
|
onProposalConfirm: (proposalId: string, payload: unknown) => void;
|
|
13
13
|
onProposalCancel: (proposalId: string) => void;
|
|
14
|
+
/** Makes entity cards clickable — receives the entity and its optional entityType. */
|
|
15
|
+
onEntityClick?: (entity: AiEntity, entityType?: string) => void;
|
|
14
16
|
/** Called before the built-in switch — a non-nullish return value wins. */
|
|
15
17
|
renderPart?: RenderPartFn;
|
|
16
18
|
};
|
|
17
|
-
export declare function AiMessagePartRenderer({ part, onProposalConfirm, onProposalCancel, renderPart }: Props): import("react").JSX.Element | null;
|
|
19
|
+
export declare function AiMessagePartRenderer({ part, onProposalConfirm, onProposalCancel, onEntityClick, renderPart }: Props): import("react").JSX.Element | null;
|
|
18
20
|
export {};
|
|
19
21
|
//# sourceMappingURL=AiMessagePartRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiMessagePartRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/parts/AiMessagePartRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"AiMessagePartRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/parts/AiMessagePartRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EAQd,MAAM,kBAAkB,CAAC;AAS1B;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;AAEjF,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,2EAA2E;IAC3E,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,KAAK,sCA0DpH"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -34,6 +34,43 @@ export type AiErrorPart = {
|
|
|
34
34
|
type: 'error';
|
|
35
35
|
message: string;
|
|
36
36
|
};
|
|
37
|
+
/** Badge tone for an entity field value */
|
|
38
|
+
export type AiEntityBadgeTone = 'success' | 'warning' | 'danger' | 'neutral';
|
|
39
|
+
/** One labelled field of an entity — rendered as a label/value row */
|
|
40
|
+
export type AiEntityField = {
|
|
41
|
+
label: string;
|
|
42
|
+
value: string;
|
|
43
|
+
/** Render the value as a coloured badge instead of plain text */
|
|
44
|
+
badge?: AiEntityBadgeTone;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* A generic structured entity — a domain record (any object with a title
|
|
48
|
+
* and fields). Juneau renders it as a card; consumers can override via
|
|
49
|
+
* `renderPart` for domain-specific layouts.
|
|
50
|
+
*/
|
|
51
|
+
export type AiEntity = {
|
|
52
|
+
/** Stable ID — forwarded to `onEntityClick` so consumers can navigate */
|
|
53
|
+
id?: string;
|
|
54
|
+
title: string;
|
|
55
|
+
subtitle?: string;
|
|
56
|
+
fields?: AiEntityField[];
|
|
57
|
+
/** Arbitrary payload — not rendered, available for custom renderers and click handlers */
|
|
58
|
+
payload?: unknown;
|
|
59
|
+
};
|
|
60
|
+
export type AiEntityPart = {
|
|
61
|
+
type: 'entity';
|
|
62
|
+
entity: AiEntity;
|
|
63
|
+
/** Optional entity kind (e.g. "invoice") — available for custom renderers */
|
|
64
|
+
entityType?: string;
|
|
65
|
+
};
|
|
66
|
+
export type AiEntityListPart = {
|
|
67
|
+
type: 'entity-list';
|
|
68
|
+
entities: AiEntity[];
|
|
69
|
+
/** Optional heading above the list */
|
|
70
|
+
title?: string;
|
|
71
|
+
/** Optional entity kind shared by all items — available for custom renderers */
|
|
72
|
+
entityType?: string;
|
|
73
|
+
};
|
|
37
74
|
export type AiActivityStatus = 'running' | 'done' | 'failed';
|
|
38
75
|
export type AiActivityPart = {
|
|
39
76
|
type: 'activity';
|
|
@@ -57,7 +94,7 @@ export type AiCustomPart = {
|
|
|
57
94
|
type: string;
|
|
58
95
|
[key: string]: unknown;
|
|
59
96
|
};
|
|
60
|
-
export type AiMessagePart = AiTextPart | AiTablePart | AiProposalPart | AiActivityPart | AiErrorPart | AiCustomPart;
|
|
97
|
+
export type AiMessagePart = AiTextPart | AiTablePart | AiProposalPart | AiActivityPart | AiErrorPart | AiEntityPart | AiEntityListPart | AiCustomPart;
|
|
61
98
|
export type AiMessage = {
|
|
62
99
|
id: string;
|
|
63
100
|
role: AiMessageRole;
|
|
@@ -89,7 +126,7 @@ export type AiStreamTextEvent = {
|
|
|
89
126
|
};
|
|
90
127
|
export type AiStreamPartEvent = {
|
|
91
128
|
type: 'part';
|
|
92
|
-
part: AiTablePart | AiProposalPart | AiActivityPart | AiErrorPart | AiCustomPart;
|
|
129
|
+
part: AiTablePart | AiProposalPart | AiActivityPart | AiErrorPart | AiEntityPart | AiEntityListPart | AiCustomPart;
|
|
93
130
|
};
|
|
94
131
|
export type AiStreamDoneEvent = {
|
|
95
132
|
type: 'done';
|
|
@@ -127,10 +164,10 @@ export type JuneauWireActivity = {
|
|
|
127
164
|
*/
|
|
128
165
|
metadata?: Record<string, unknown>;
|
|
129
166
|
};
|
|
130
|
-
/** Structured rich block — table, proposal, or any consumer-defined custom part */
|
|
167
|
+
/** Structured rich block — table, proposal, entity, entity list, or any consumer-defined custom part */
|
|
131
168
|
export type JuneauWirePart = {
|
|
132
169
|
type: 'part';
|
|
133
|
-
part: AiTablePart | AiProposalPart | AiCustomPart;
|
|
170
|
+
part: AiTablePart | AiProposalPart | AiEntityPart | AiEntityListPart | AiCustomPart;
|
|
134
171
|
};
|
|
135
172
|
/** Stream finished cleanly */
|
|
136
173
|
export type JuneauWireDone = {
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAG5D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,WAAW,GACX,cAAc,GACd,cAAc,GACd,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAQF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,GAAG,YAAY,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|