@composy/chat-core 0.0.1 → 0.0.2
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 +187 -123
- package/dist/index.js +2018 -1035
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1370 -1644
- package/dist/index.min.js.map +1 -0
- package/es/.dts-output-manifest.json +1 -0
- package/es/.dts.tsbuildinfo +1 -0
- package/es/constants/dom.d.ts +3 -19
- package/es/constants/dom.js +4 -4
- package/es/constants/dom.js.map +1 -1
- package/es/core/chat-manager.d.ts +33 -22
- package/es/core/chat-manager.js +174 -50
- package/es/core/chat-manager.js.map +1 -1
- package/es/core/event-emitter.d.ts +0 -1
- package/es/core/event-emitter.js +14 -7
- package/es/core/event-emitter.js.map +1 -1
- package/es/core/mention-engine.d.ts +1 -2
- package/es/core/mention-engine.js +9 -9
- package/es/core/mention-engine.js.map +1 -1
- package/es/core/message-schema.d.ts +19 -0
- package/es/core/message-schema.js +197 -0
- package/es/core/message-schema.js.map +1 -0
- package/es/core/outbox.d.ts +63 -0
- package/es/core/outbox.js +160 -0
- package/es/core/outbox.js.map +1 -0
- package/es/core/transport.d.ts +79 -0
- package/es/core/transport.js +102 -0
- package/es/core/transport.js.map +1 -0
- package/es/index.d.ts +12 -7
- package/es/index.js +167 -36
- package/es/index.js.map +1 -1
- package/es/renderer/dom-renderer.d.ts +16 -4
- package/es/renderer/dom-renderer.js +316 -61
- package/es/renderer/dom-renderer.js.map +1 -1
- package/es/renderer/style-manager.d.ts +14 -38
- package/es/renderer/style-manager.js +92 -63
- package/es/renderer/style-manager.js.map +1 -1
- package/es/theme/theme-manager.d.ts +4 -3
- package/es/theme/theme-manager.js +19 -9
- package/es/theme/theme-manager.js.map +1 -1
- package/es/theme/tokens.d.ts +0 -1
- package/es/theme/tokens.js +92 -92
- package/es/theme/tokens.js.map +1 -1
- package/es/types/index.d.ts +104 -24
- package/es/types/index.js +8 -3
- package/es/types/index.js.map +1 -0
- package/esm/constants/dom.d.ts +3 -19
- package/esm/constants/dom.js +4 -4
- package/esm/constants/dom.js.map +1 -1
- package/esm/core/chat-manager.d.ts +33 -22
- package/esm/core/chat-manager.js +174 -50
- package/esm/core/chat-manager.js.map +1 -1
- package/esm/core/event-emitter.d.ts +0 -1
- package/esm/core/event-emitter.js +14 -7
- package/esm/core/event-emitter.js.map +1 -1
- package/esm/core/mention-engine.d.ts +1 -2
- package/esm/core/mention-engine.js +9 -9
- package/esm/core/mention-engine.js.map +1 -1
- package/esm/core/message-schema.d.ts +19 -0
- package/esm/core/message-schema.js +197 -0
- package/esm/core/message-schema.js.map +1 -0
- package/esm/core/outbox.d.ts +63 -0
- package/esm/core/outbox.js +160 -0
- package/esm/core/outbox.js.map +1 -0
- package/esm/core/transport.d.ts +79 -0
- package/esm/core/transport.js +102 -0
- package/esm/core/transport.js.map +1 -0
- package/esm/index.d.ts +12 -7
- package/esm/index.js +169 -38
- package/esm/index.js.map +1 -1
- package/esm/renderer/dom-renderer.d.ts +16 -4
- package/esm/renderer/dom-renderer.js +316 -61
- package/esm/renderer/dom-renderer.js.map +1 -1
- package/esm/renderer/style-manager.d.ts +14 -38
- package/esm/renderer/style-manager.js +92 -63
- package/esm/renderer/style-manager.js.map +1 -1
- package/esm/theme/theme-manager.d.ts +4 -3
- package/esm/theme/theme-manager.js +19 -9
- package/esm/theme/theme-manager.js.map +1 -1
- package/esm/theme/tokens.d.ts +0 -1
- package/esm/theme/tokens.js +92 -92
- package/esm/theme/tokens.js.map +1 -1
- package/esm/types/index.d.ts +104 -24
- package/esm/types/index.js +8 -3
- package/esm/types/index.js.map +1 -0
- package/lib/constants/dom.cjs +4 -4
- package/lib/constants/dom.cjs.map +1 -1
- package/lib/constants/dom.d.cts +25 -0
- package/lib/constants/dom.d.ts +3 -19
- package/lib/core/chat-manager.cjs +174 -50
- package/lib/core/chat-manager.cjs.map +1 -1
- package/lib/core/chat-manager.d.cts +45 -0
- package/lib/core/chat-manager.d.ts +33 -22
- package/lib/core/event-emitter.cjs +14 -7
- package/lib/core/event-emitter.cjs.map +1 -1
- package/lib/core/event-emitter.d.cts +47 -0
- package/lib/core/event-emitter.d.ts +0 -1
- package/lib/core/mention-engine.cjs +9 -9
- package/lib/core/mention-engine.cjs.map +1 -1
- package/lib/core/mention-engine.d.cts +40 -0
- package/lib/core/mention-engine.d.ts +1 -2
- package/lib/core/message-schema.cjs +202 -0
- package/lib/core/message-schema.cjs.map +1 -0
- package/lib/core/message-schema.d.cts +19 -0
- package/lib/core/message-schema.d.ts +19 -0
- package/lib/core/outbox.cjs +162 -0
- package/lib/core/outbox.cjs.map +1 -0
- package/lib/core/outbox.d.cts +63 -0
- package/lib/core/outbox.d.ts +63 -0
- package/lib/core/transport.cjs +103 -0
- package/lib/core/transport.cjs.map +1 -0
- package/lib/core/transport.d.cts +79 -0
- package/lib/core/transport.d.ts +79 -0
- package/lib/index.cjs +175 -35
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +33 -0
- package/lib/index.d.ts +12 -7
- package/lib/renderer/dom-renderer.cjs +316 -61
- package/lib/renderer/dom-renderer.cjs.map +1 -1
- package/lib/renderer/dom-renderer.d.cts +91 -0
- package/lib/renderer/dom-renderer.d.ts +16 -4
- package/lib/renderer/style-manager.cjs +92 -62
- package/lib/renderer/style-manager.cjs.map +1 -1
- package/lib/renderer/style-manager.d.cts +34 -0
- package/lib/renderer/style-manager.d.ts +14 -38
- package/lib/theme/theme-manager.cjs +19 -9
- package/lib/theme/theme-manager.cjs.map +1 -1
- package/lib/theme/theme-manager.d.cts +34 -0
- package/lib/theme/theme-manager.d.ts +4 -3
- package/lib/theme/tokens.cjs +92 -92
- package/lib/theme/tokens.cjs.map +1 -1
- package/lib/theme/tokens.d.cts +56 -0
- package/lib/theme/tokens.d.ts +0 -1
- package/lib/types/index.cjs +8 -3
- package/lib/types/index.cjs.map +1 -0
- package/lib/types/index.d.cts +284 -0
- package/lib/types/index.d.ts +104 -24
- package/package.json +16 -13
- package/es/constants/dom.d.ts.map +0 -1
- package/es/core/chat-manager.d.ts.map +0 -1
- package/es/core/event-emitter.d.ts.map +0 -1
- package/es/core/mention-engine.d.ts.map +0 -1
- package/es/index.d.ts.map +0 -1
- package/es/renderer/dom-renderer.d.ts.map +0 -1
- package/es/renderer/style-manager.d.ts.map +0 -1
- package/es/theme/theme-manager.d.ts.map +0 -1
- package/es/theme/tokens.d.ts.map +0 -1
- package/es/types/index.d.ts.map +0 -1
- package/esm/constants/dom.d.ts.map +0 -1
- package/esm/core/chat-manager.d.ts.map +0 -1
- package/esm/core/event-emitter.d.ts.map +0 -1
- package/esm/core/mention-engine.d.ts.map +0 -1
- package/esm/index.d.ts.map +0 -1
- package/esm/renderer/dom-renderer.d.ts.map +0 -1
- package/esm/renderer/style-manager.d.ts.map +0 -1
- package/esm/theme/theme-manager.d.ts.map +0 -1
- package/esm/theme/tokens.d.ts.map +0 -1
- package/esm/types/index.d.ts.map +0 -1
- package/lib/constants/dom.d.ts.map +0 -1
- package/lib/core/chat-manager.d.ts.map +0 -1
- package/lib/core/event-emitter.d.ts.map +0 -1
- package/lib/core/mention-engine.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/renderer/dom-renderer.d.ts.map +0 -1
- package/lib/renderer/style-manager.d.ts.map +0 -1
- package/lib/theme/theme-manager.d.ts.map +0 -1
- package/lib/theme/tokens.d.ts.map +0 -1
- package/lib/types/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,123 +1,187 @@
|
|
|
1
|
-
# @composy/chat-core
|
|
2
|
-
|
|
3
|
-
Framework-agnostic chat runtime for LDesign. It renders message lists, bubbles, input, mentions,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
chat
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
chat.addMessage(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
chat.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
1
|
+
# @composy/chat-core
|
|
2
|
+
|
|
3
|
+
Framework-agnostic chat runtime for LDesign. It renders message lists, bubbles, input, mentions,
|
|
4
|
+
toolbar actions, voice input hooks, upload/drop callbacks, message status, streaming text, and
|
|
5
|
+
light/dark/auto themes without depending on a UI framework.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Text, image, file, system, custom, revoked, and streaming messages.
|
|
10
|
+
- Mention engine with keyboard navigation, name/id filtering, and mention parsing.
|
|
11
|
+
- Toolbar callbacks for image upload, file upload, paste, drop, and browser speech recognition.
|
|
12
|
+
- Input helpers: `enterToSend`, `clearInputOnSend`, `maxInputLength`, `setInputContent`,
|
|
13
|
+
`clearInput`, and `onInputChange`.
|
|
14
|
+
- Runtime APIs for message CRUD, streaming append/finish, scroll control, loading-more state, and
|
|
15
|
+
message lookup.
|
|
16
|
+
- Versioned `ChatContentBlock` schema for text, mention, link, code, image, file, break, and custom
|
|
17
|
+
fallback content; unknown runtime blocks are dropped or rendered as safe text.
|
|
18
|
+
- Idempotent remote merge by `id`/`clientMessageId` with `sequence` filtering, plus transport
|
|
19
|
+
lifecycle (`connect`/`disconnect`/ack/cursor/error) for HTTP, SSE, WebSocket, or native bridges.
|
|
20
|
+
- Offline `ChatOutbox` with replaceable persistence, bounded retry, abort support, attempt tracking,
|
|
21
|
+
and stable idempotency keys.
|
|
22
|
+
- All generated classes use the `ldesign-` prefix. The default class prefix is `ldesign-chat`.
|
|
23
|
+
- Component CSS variables use `--ldesign-chat-*` and map to the generated `--ld-*` color and size
|
|
24
|
+
variables from `packages/color` and `packages/size`.
|
|
25
|
+
- Theme variables are applied per chat instance, so instances can use different themes and can live
|
|
26
|
+
in separate documents such as iframes.
|
|
27
|
+
- Custom HTML messages are sanitized. Scriptable elements, event attributes, inline styles, and
|
|
28
|
+
unsafe URLs are removed; basic text, formatting, list, link, and image elements are supported.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pnpm add @composy/chat-core
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Load the global LDesign color and size variable styles before mounting chat UI:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import '@composy/color-core/styles.css'
|
|
40
|
+
import '@composy/size-core/styles.css'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { createChat } from '@composy/chat-core'
|
|
47
|
+
|
|
48
|
+
const chat = createChat({
|
|
49
|
+
container: '#chat',
|
|
50
|
+
currentUserId: 'u1',
|
|
51
|
+
theme: 'auto',
|
|
52
|
+
enableMention: true,
|
|
53
|
+
mentionMembers: [{ id: 'u2', name: 'Alice' }],
|
|
54
|
+
onSend(content, mentions) {
|
|
55
|
+
console.info(content, mentions)
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
chat.addMessage({
|
|
60
|
+
id: 'm1',
|
|
61
|
+
type: 'text',
|
|
62
|
+
direction: 'incoming',
|
|
63
|
+
sender: { id: 'u2', nickname: 'Alice' },
|
|
64
|
+
content: 'Hello',
|
|
65
|
+
timestamp: Date.now(),
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
chat.addMessage({
|
|
69
|
+
id: 'm2',
|
|
70
|
+
type: 'custom',
|
|
71
|
+
direction: 'incoming',
|
|
72
|
+
sender: { id: 'u2', nickname: 'Alice' },
|
|
73
|
+
contentBlocks: [
|
|
74
|
+
{ type: 'text', text: 'See ' },
|
|
75
|
+
{ type: 'link', url: 'https://example.com', label: 'the docs' },
|
|
76
|
+
{ type: 'break' },
|
|
77
|
+
{ type: 'code', code: 'pnpm add @composy/chat-core' },
|
|
78
|
+
],
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Public API
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
chat.addMessage(message)
|
|
87
|
+
chat.prependMessages(messages)
|
|
88
|
+
chat.updateMessage(id, updates)
|
|
89
|
+
chat.removeMessage(id)
|
|
90
|
+
chat.setMessages(messages)
|
|
91
|
+
chat.clearMessages()
|
|
92
|
+
chat.getMessages()
|
|
93
|
+
chat.getMessage(id)
|
|
94
|
+
|
|
95
|
+
chat.beginStreaming(id, generation)
|
|
96
|
+
chat.appendMessageContent(id, chunk, { generation, sequence })
|
|
97
|
+
chat.finishStreaming(id, generation)
|
|
98
|
+
chat.cancelStreaming(id, generation)
|
|
99
|
+
|
|
100
|
+
chat.mergeMessage(remoteMessage, sequence)
|
|
101
|
+
chat.connectTransport(signal)
|
|
102
|
+
chat.disconnectTransport()
|
|
103
|
+
chat.getTransportStatus()
|
|
104
|
+
chat.sendMessage(message, { signal })
|
|
105
|
+
chat.flushOutbox({ maxAttempts, concurrency, signal })
|
|
106
|
+
|
|
107
|
+
chat.scrollToBottom(true)
|
|
108
|
+
chat.isAtBottom()
|
|
109
|
+
chat.setLoadingMore(false)
|
|
110
|
+
|
|
111
|
+
chat.setTheme('dark')
|
|
112
|
+
chat.setMentionMembers(members)
|
|
113
|
+
|
|
114
|
+
chat.focusInput()
|
|
115
|
+
chat.setInputContent('hello')
|
|
116
|
+
chat.getInputContent()
|
|
117
|
+
chat.clearInput()
|
|
118
|
+
|
|
119
|
+
chat.on('message-retry', message => console.info(message))
|
|
120
|
+
chat.destroy()
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For AI or network streams, use a generation and monotonically increasing chunk sequence. A late
|
|
124
|
+
chunk from a previous generation then returns `false` instead of mutating the current message:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
const generation = chat.beginStreaming('m3', 'reply-1')
|
|
128
|
+
chat.appendMessageContent('m3', '第一段', { generation, sequence: 1 })
|
|
129
|
+
chat.appendMessageContent('m3', '第二段', { generation, sequence: 2 })
|
|
130
|
+
chat.finishStreaming('m3', generation)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`ChatConfig.transport` accepts any adapter implementing `ChatTransport`. `sendMessage()` creates a
|
|
134
|
+
stable `clientMessageId`, marks the local message as `sending`, applies the server ack, and marks it
|
|
135
|
+
`failed` on error. Configure `outbox: new ChatOutbox()` when failed messages should survive an
|
|
136
|
+
offline period and call `flushOutbox()` after reconnecting.
|
|
137
|
+
|
|
138
|
+
## Styling Contract
|
|
139
|
+
|
|
140
|
+
The renderer normalizes `classPrefix`. If no prefix is passed, generated classes start with
|
|
141
|
+
`ldesign-chat-*`. If a custom prefix does not start with `ldesign-`, it is normalized to
|
|
142
|
+
`ldesign-${prefix}`.
|
|
143
|
+
|
|
144
|
+
Key classes:
|
|
145
|
+
|
|
146
|
+
- `ldesign-chat-container`
|
|
147
|
+
- `ldesign-chat-message-list`
|
|
148
|
+
- `ldesign-chat-message-row`
|
|
149
|
+
- `ldesign-chat-bubble`
|
|
150
|
+
- `ldesign-chat-input-area`
|
|
151
|
+
- `ldesign-chat-toolbar`
|
|
152
|
+
- `ldesign-chat-mention-panel`
|
|
153
|
+
|
|
154
|
+
The injected stylesheet defines component variables such as:
|
|
155
|
+
|
|
156
|
+
- `--ldesign-chat-bg-primary`
|
|
157
|
+
- `--ldesign-chat-text-primary`
|
|
158
|
+
- `--ldesign-chat-border-primary`
|
|
159
|
+
- `--ldesign-chat-avatar-size`
|
|
160
|
+
- `--ldesign-chat-radius-md`
|
|
161
|
+
- `--ldesign-chat-transition-fast`
|
|
162
|
+
|
|
163
|
+
Defaults reference `--ld-*` color and size tokens, so consumers should load the shared Color and
|
|
164
|
+
Size styles before mounting chat. Each instance keeps its theme overrides on its own root element.
|
|
165
|
+
|
|
166
|
+
Calling `getMessage()` or `getMessages()` returns defensive copies. Message IDs must be non-empty
|
|
167
|
+
and unique within the list, and an existing message ID cannot be changed with `updateMessage()`.
|
|
168
|
+
Load-more callback rejections are caught and emitted as `load-more-error` through `chat.on()`.
|
|
169
|
+
Messages entering the manager are normalized to schema version 1. Remote messages with an older
|
|
170
|
+
`sequence` are ignored. Use `clientMessageId` as the server idempotency key and persist failed
|
|
171
|
+
messages with `ChatOutbox` when the transport can be offline.
|
|
172
|
+
|
|
173
|
+
## Build
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
pnpm run type-check
|
|
177
|
+
pnpm run type-check:cjs
|
|
178
|
+
pnpm run build
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
TypeScript ESM/CJS configurations and the rolldown Builder configuration live in `.ldesign/`. The
|
|
182
|
+
build generates `dist`, `es`, `esm`, and `lib`; `postbuild` normalizes and validates the package
|
|
183
|
+
outputs against the manifest.
|
|
184
|
+
|
|
185
|
+
## License
|
|
186
|
+
|
|
187
|
+
MIT
|