@happyvertical/smrt-chat 0.30.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.
Files changed (169) hide show
  1. package/AGENTS.md +35 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +163 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/chunks/ChatService-Dpzc1Pa5.js +2044 -0
  8. package/dist/chunks/ChatService-Dpzc1Pa5.js.map +1 -0
  9. package/dist/collections/AgentSessionCollection.d.ts +57 -0
  10. package/dist/collections/AgentSessionCollection.d.ts.map +1 -0
  11. package/dist/collections/ChatMessageCollection.d.ts +79 -0
  12. package/dist/collections/ChatMessageCollection.d.ts.map +1 -0
  13. package/dist/collections/ChatParticipantCollection.d.ts +26 -0
  14. package/dist/collections/ChatParticipantCollection.d.ts.map +1 -0
  15. package/dist/collections/ChatReactionCollection.d.ts +23 -0
  16. package/dist/collections/ChatReactionCollection.d.ts.map +1 -0
  17. package/dist/collections/ChatRoomCollection.d.ts +43 -0
  18. package/dist/collections/ChatRoomCollection.d.ts.map +1 -0
  19. package/dist/collections/ChatThreadCollection.d.ts +9 -0
  20. package/dist/collections/ChatThreadCollection.d.ts.map +1 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +18 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/internal/agent-runtime.d.ts +16 -0
  26. package/dist/internal/agent-runtime.d.ts.map +1 -0
  27. package/dist/internal/agent-runtime.js +5 -0
  28. package/dist/internal/agent-runtime.js.map +1 -0
  29. package/dist/manifest.json +2811 -0
  30. package/dist/models/AgentSession.d.ts +70 -0
  31. package/dist/models/AgentSession.d.ts.map +1 -0
  32. package/dist/models/ChatMessage.d.ts +55 -0
  33. package/dist/models/ChatMessage.d.ts.map +1 -0
  34. package/dist/models/ChatParticipant.d.ts +32 -0
  35. package/dist/models/ChatParticipant.d.ts.map +1 -0
  36. package/dist/models/ChatReaction.d.ts +19 -0
  37. package/dist/models/ChatReaction.d.ts.map +1 -0
  38. package/dist/models/ChatRoom.d.ts +44 -0
  39. package/dist/models/ChatRoom.d.ts.map +1 -0
  40. package/dist/models/ChatThread.d.ts +24 -0
  41. package/dist/models/ChatThread.d.ts.map +1 -0
  42. package/dist/models/index.d.ts +7 -0
  43. package/dist/models/index.d.ts.map +1 -0
  44. package/dist/playground.d.ts +2 -0
  45. package/dist/playground.d.ts.map +1 -0
  46. package/dist/playground.js +166 -0
  47. package/dist/playground.js.map +1 -0
  48. package/dist/services/ChatService.d.ts +390 -0
  49. package/dist/services/ChatService.d.ts.map +1 -0
  50. package/dist/services/index.d.ts +2 -0
  51. package/dist/services/index.d.ts.map +1 -0
  52. package/dist/smrt-knowledge.json +1507 -0
  53. package/dist/svelte/components/agent/AgentChat.svelte +542 -0
  54. package/dist/svelte/components/agent/AgentChat.svelte.d.ts +21 -0
  55. package/dist/svelte/components/agent/AgentChat.svelte.d.ts.map +1 -0
  56. package/dist/svelte/components/agent/AgentSelector.svelte +175 -0
  57. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts +11 -0
  58. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts.map +1 -0
  59. package/dist/svelte/components/agent/AgentSessionPanel.svelte +322 -0
  60. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts +15 -0
  61. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts.map +1 -0
  62. package/dist/svelte/components/agent/ToolCallDisplay.svelte +335 -0
  63. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts +9 -0
  64. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts.map +1 -0
  65. package/dist/svelte/components/agent/message-blocks.d.ts +12 -0
  66. package/dist/svelte/components/agent/message-blocks.d.ts.map +1 -0
  67. package/dist/svelte/components/agent/message-blocks.js +41 -0
  68. package/dist/svelte/components/agent/message-blocks.test.js +31 -0
  69. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte +403 -0
  70. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts +16 -0
  71. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/dialogs/SearchMessages.svelte +457 -0
  73. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts +17 -0
  74. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts.map +1 -0
  75. package/dist/svelte/components/layout/ChatLayout.svelte +150 -0
  76. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts +18 -0
  77. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts.map +1 -0
  78. package/dist/svelte/components/layout/MemberList.svelte +389 -0
  79. package/dist/svelte/components/layout/MemberList.svelte.d.ts +11 -0
  80. package/dist/svelte/components/layout/MemberList.svelte.d.ts.map +1 -0
  81. package/dist/svelte/components/layout/RoomHeader.svelte +241 -0
  82. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts +15 -0
  83. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts.map +1 -0
  84. package/dist/svelte/components/layout/RoomList.svelte +471 -0
  85. package/dist/svelte/components/layout/RoomList.svelte.d.ts +15 -0
  86. package/dist/svelte/components/layout/RoomList.svelte.d.ts.map +1 -0
  87. package/dist/svelte/components/messages/MessageInput.svelte +232 -0
  88. package/dist/svelte/components/messages/MessageInput.svelte.d.ts +20 -0
  89. package/dist/svelte/components/messages/MessageInput.svelte.d.ts.map +1 -0
  90. package/dist/svelte/components/messages/MessageItem.svelte +431 -0
  91. package/dist/svelte/components/messages/MessageItem.svelte.d.ts +19 -0
  92. package/dist/svelte/components/messages/MessageItem.svelte.d.ts.map +1 -0
  93. package/dist/svelte/components/messages/MessageList.svelte +129 -0
  94. package/dist/svelte/components/messages/MessageList.svelte.d.ts +17 -0
  95. package/dist/svelte/components/messages/MessageList.svelte.d.ts.map +1 -0
  96. package/dist/svelte/components/messages/ThreadPanel.svelte +156 -0
  97. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts +17 -0
  98. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts.map +1 -0
  99. package/dist/svelte/components/messages/__tests__/MessageInput.test.js +38 -0
  100. package/dist/svelte/components/shared/Avatar.svelte +30 -0
  101. package/dist/svelte/components/shared/Avatar.svelte.d.ts +14 -0
  102. package/dist/svelte/components/shared/Avatar.svelte.d.ts.map +1 -0
  103. package/dist/svelte/components/shared/FileUpload.svelte +382 -0
  104. package/dist/svelte/components/shared/FileUpload.svelte.d.ts +14 -0
  105. package/dist/svelte/components/shared/FileUpload.svelte.d.ts.map +1 -0
  106. package/dist/svelte/components/shared/LinkPreview.svelte +108 -0
  107. package/dist/svelte/components/shared/LinkPreview.svelte.d.ts +18 -0
  108. package/dist/svelte/components/shared/LinkPreview.svelte.d.ts.map +1 -0
  109. package/dist/svelte/components/shared/MentionAutocomplete.svelte +168 -0
  110. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts +18 -0
  111. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts.map +1 -0
  112. package/dist/svelte/components/shared/MessageBubble.svelte +81 -0
  113. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts +16 -0
  114. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts.map +1 -0
  115. package/dist/svelte/components/shared/ReactionPicker.svelte +103 -0
  116. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts +10 -0
  117. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts.map +1 -0
  118. package/dist/svelte/components/shared/ReadReceipts.svelte +127 -0
  119. package/dist/svelte/components/shared/ReadReceipts.svelte.d.ts +13 -0
  120. package/dist/svelte/components/shared/ReadReceipts.svelte.d.ts.map +1 -0
  121. package/dist/svelte/components/shared/TypingIndicator.svelte +90 -0
  122. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts +12 -0
  123. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts.map +1 -0
  124. package/dist/svelte/components/shared/UserPresence.svelte +65 -0
  125. package/dist/svelte/components/shared/UserPresence.svelte.d.ts +13 -0
  126. package/dist/svelte/components/shared/UserPresence.svelte.d.ts.map +1 -0
  127. package/dist/svelte/components/shared/__tests__/Avatar.test.js +20 -0
  128. package/dist/svelte/components/shared/__tests__/LinkPreview.test.js +29 -0
  129. package/dist/svelte/components/shared/__tests__/MessageBubble.test.js +21 -0
  130. package/dist/svelte/components/shared/__tests__/ReactionPicker.test.js +35 -0
  131. package/dist/svelte/components/shared/__tests__/ReadReceipts.test.js +28 -0
  132. package/dist/svelte/components/shared/__tests__/TypingIndicator.test.js +27 -0
  133. package/dist/svelte/components/shared/__tests__/UserPresence.test.js +23 -0
  134. package/dist/svelte/components/tabs/ChatTab.svelte +240 -0
  135. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts +21 -0
  136. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts.map +1 -0
  137. package/dist/svelte/components/tabs/ChatTabList.svelte +158 -0
  138. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts +13 -0
  139. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts.map +1 -0
  140. package/dist/svelte/components/tabs/ChatTabs.svelte +88 -0
  141. package/dist/svelte/components/tabs/ChatTabs.svelte.d.ts +21 -0
  142. package/dist/svelte/components/tabs/ChatTabs.svelte.d.ts.map +1 -0
  143. package/dist/svelte/components/tabs/MiniChat.svelte +253 -0
  144. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts +15 -0
  145. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts.map +1 -0
  146. package/dist/svelte/i18n.d.ts +51 -0
  147. package/dist/svelte/i18n.d.ts.map +1 -0
  148. package/dist/svelte/i18n.js +72 -0
  149. package/dist/svelte/i18n.messages.d.ts +50 -0
  150. package/dist/svelte/i18n.messages.d.ts.map +1 -0
  151. package/dist/svelte/i18n.messages.js +69 -0
  152. package/dist/svelte/index.d.ts +48 -0
  153. package/dist/svelte/index.d.ts.map +1 -0
  154. package/dist/svelte/index.js +117 -0
  155. package/dist/svelte/playground.d.ts +171 -0
  156. package/dist/svelte/playground.d.ts.map +1 -0
  157. package/dist/svelte/playground.js +161 -0
  158. package/dist/svelte/types.d.ts +116 -0
  159. package/dist/svelte/types.d.ts.map +1 -0
  160. package/dist/svelte/types.js +1 -0
  161. package/dist/types.d.ts +99 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +2 -0
  164. package/dist/types.js.map +1 -0
  165. package/dist/ui.d.ts +4 -0
  166. package/dist/ui.d.ts.map +1 -0
  167. package/dist/ui.js +92 -0
  168. package/dist/ui.js.map +1 -0
  169. package/package.json +95 -0
@@ -0,0 +1,1507 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-06-23T01:12:05.520Z",
4
+ "packageName": "@happyvertical/smrt-chat",
5
+ "packageVersion": "0.30.0",
6
+ "sourceManifestPath": "dist/manifest.json",
7
+ "agentDocPath": "AGENTS.md",
8
+ "sourceHashes": {
9
+ "manifest": "60c8eb52b192ffae7154d85d461e13eb8bc29a577fb4348e4d1c7ecdd6c1363d",
10
+ "packageJson": "c390a11b1e803bc96928ec2700e460859b575a486289a78dcbe4fe4e8659226c",
11
+ "agents": "e0a8c6788fbd48c2619a353295d4538e9ff6863d483bcd354af522fb7c6a31bc"
12
+ },
13
+ "exports": [
14
+ ".",
15
+ "./internal/agent-runtime",
16
+ "./manifest",
17
+ "./manifest.json",
18
+ "./playground",
19
+ "./svelte",
20
+ "./ui"
21
+ ],
22
+ "dependencies": {
23
+ "@happyvertical/smrt-core": "workspace:*",
24
+ "@happyvertical/smrt-tenancy": "workspace:*",
25
+ "@happyvertical/smrt-types": "workspace:*",
26
+ "@happyvertical/smrt-ui": "workspace:*",
27
+ "@happyvertical/smrt-agents": "workspace:*",
28
+ "@happyvertical/smrt-profiles": "workspace:*",
29
+ "@happyvertical/smrt-vitest": "workspace:*",
30
+ "@sveltejs/package": "^2.5.7",
31
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
32
+ "@types/node": "25.0.9",
33
+ "fast-glob": "^3.3.3",
34
+ "svelte": "^5.18.0",
35
+ "svelte-check": "^4.3.5",
36
+ "typescript": "^5.9.3",
37
+ "vite": "^7.3.1",
38
+ "vitest": "^4.0.17"
39
+ },
40
+ "smrtDependencies": [
41
+ "@happyvertical/smrt-agents",
42
+ "@happyvertical/smrt-core",
43
+ "@happyvertical/smrt-profiles",
44
+ "@happyvertical/smrt-tenancy",
45
+ "@happyvertical/smrt-types",
46
+ "@happyvertical/smrt-ui",
47
+ "@happyvertical/smrt-vitest"
48
+ ],
49
+ "sdkDependencies": [],
50
+ "tags": [],
51
+ "risks": [],
52
+ "objects": [
53
+ {
54
+ "name": "AgentSessionCollection",
55
+ "qualifiedName": "@happyvertical/smrt-chat:AgentSessionCollection",
56
+ "collection": "agentsessions",
57
+ "tableName": "agent_sessions",
58
+ "packageName": "@happyvertical/smrt-chat",
59
+ "extends": "SmrtCollection",
60
+ "fields": [],
61
+ "relationships": [],
62
+ "methods": [
63
+ "expireStale",
64
+ "findActiveByParticipant",
65
+ "findActiveSession",
66
+ "findByAgent",
67
+ "findOrCreate"
68
+ ],
69
+ "surfaces": [],
70
+ "relationshipFeatures": [
71
+ "uuidColumns"
72
+ ],
73
+ "tags": [],
74
+ "risks": []
75
+ },
76
+ {
77
+ "name": "ChatMessageCollection",
78
+ "qualifiedName": "@happyvertical/smrt-chat:ChatMessageCollection",
79
+ "collection": "chatmessages",
80
+ "tableName": "chat_messages",
81
+ "packageName": "@happyvertical/smrt-chat",
82
+ "extends": "SmrtCollection",
83
+ "fields": [],
84
+ "relationships": [],
85
+ "methods": [
86
+ "getByAgentSession",
87
+ "getByRoom",
88
+ "getByThread",
89
+ "getLatestPerRoom",
90
+ "getUnreadCount",
91
+ "search"
92
+ ],
93
+ "surfaces": [],
94
+ "relationshipFeatures": [
95
+ "uuidColumns"
96
+ ],
97
+ "tags": [],
98
+ "risks": []
99
+ },
100
+ {
101
+ "name": "ChatParticipantCollection",
102
+ "qualifiedName": "@happyvertical/smrt-chat:ChatParticipantCollection",
103
+ "collection": "chatparticipants",
104
+ "tableName": "chat_participants",
105
+ "packageName": "@happyvertical/smrt-chat",
106
+ "extends": "SmrtCollection",
107
+ "fields": [],
108
+ "relationships": [],
109
+ "methods": [
110
+ "countInRoom",
111
+ "findActiveMembership",
112
+ "findMembership",
113
+ "getAdminsInRoom",
114
+ "getByProfile",
115
+ "getByRoom",
116
+ "getOnlineInRoom",
117
+ "isActiveMember"
118
+ ],
119
+ "surfaces": [],
120
+ "relationshipFeatures": [
121
+ "uuidColumns"
122
+ ],
123
+ "tags": [],
124
+ "risks": []
125
+ },
126
+ {
127
+ "name": "ChatReactionCollection",
128
+ "qualifiedName": "@happyvertical/smrt-chat:ChatReactionCollection",
129
+ "collection": "chatreactions",
130
+ "tableName": "chat_reactions",
131
+ "packageName": "@happyvertical/smrt-chat",
132
+ "extends": "SmrtCollection",
133
+ "fields": [],
134
+ "relationships": [],
135
+ "methods": [
136
+ "getByMessage",
137
+ "getReactionCounts",
138
+ "toggle"
139
+ ],
140
+ "surfaces": [],
141
+ "relationshipFeatures": [
142
+ "uuidColumns"
143
+ ],
144
+ "tags": [],
145
+ "risks": []
146
+ },
147
+ {
148
+ "name": "ChatRoomCollection",
149
+ "qualifiedName": "@happyvertical/smrt-chat:ChatRoomCollection",
150
+ "collection": "chatrooms",
151
+ "tableName": "chat_rooms",
152
+ "packageName": "@happyvertical/smrt-chat",
153
+ "extends": "SmrtCollection",
154
+ "fields": [],
155
+ "relationships": [],
156
+ "methods": [
157
+ "findAgentRooms",
158
+ "findByType",
159
+ "findDMs",
160
+ "findOrCreateDM",
161
+ "findPublic",
162
+ "search"
163
+ ],
164
+ "surfaces": [],
165
+ "relationshipFeatures": [
166
+ "uuidColumns"
167
+ ],
168
+ "tags": [],
169
+ "risks": []
170
+ },
171
+ {
172
+ "name": "ChatThreadCollection",
173
+ "qualifiedName": "@happyvertical/smrt-chat:ChatThreadCollection",
174
+ "collection": "chatthreads",
175
+ "tableName": "chat_threads",
176
+ "packageName": "@happyvertical/smrt-chat",
177
+ "extends": "SmrtCollection",
178
+ "fields": [],
179
+ "relationships": [],
180
+ "methods": [
181
+ "getActive",
182
+ "getByRoom",
183
+ "getUnresolved"
184
+ ],
185
+ "surfaces": [],
186
+ "relationshipFeatures": [
187
+ "uuidColumns"
188
+ ],
189
+ "tags": [],
190
+ "risks": []
191
+ },
192
+ {
193
+ "name": "AgentSession",
194
+ "qualifiedName": "@happyvertical/smrt-chat:AgentSession",
195
+ "collection": "agentsessions",
196
+ "tableName": "agent_sessions",
197
+ "packageName": "@happyvertical/smrt-chat",
198
+ "extends": "SmrtObject",
199
+ "fields": [
200
+ {
201
+ "name": "tenantId",
202
+ "type": "text",
203
+ "required": false,
204
+ "columnType": "UUID"
205
+ },
206
+ {
207
+ "name": "agentId",
208
+ "type": "text",
209
+ "required": true,
210
+ "columnType": "TEXT"
211
+ },
212
+ {
213
+ "name": "participantProfileId",
214
+ "type": "crossPackageRef",
215
+ "required": true,
216
+ "related": "@happyvertical/smrt-profiles:Profile",
217
+ "columnType": "UUID"
218
+ },
219
+ {
220
+ "name": "chatRoomId",
221
+ "type": "foreignKey",
222
+ "required": false,
223
+ "related": "ChatRoom",
224
+ "columnType": "UUID"
225
+ },
226
+ {
227
+ "name": "status",
228
+ "type": "text",
229
+ "required": true,
230
+ "columnType": "TEXT"
231
+ },
232
+ {
233
+ "name": "allowedTools",
234
+ "type": "text",
235
+ "required": false,
236
+ "columnType": "TEXT"
237
+ },
238
+ {
239
+ "name": "sessionContext",
240
+ "type": "text",
241
+ "required": false,
242
+ "columnType": "TEXT"
243
+ },
244
+ {
245
+ "name": "systemPrompt",
246
+ "type": "text",
247
+ "required": false,
248
+ "columnType": "TEXT"
249
+ },
250
+ {
251
+ "name": "messageCount",
252
+ "type": "integer",
253
+ "required": false,
254
+ "columnType": "INTEGER"
255
+ },
256
+ {
257
+ "name": "totalTokensUsed",
258
+ "type": "integer",
259
+ "required": false,
260
+ "columnType": "INTEGER"
261
+ },
262
+ {
263
+ "name": "maxTokens",
264
+ "type": "integer",
265
+ "required": false,
266
+ "columnType": "INTEGER"
267
+ },
268
+ {
269
+ "name": "maxMessages",
270
+ "type": "integer",
271
+ "required": false,
272
+ "columnType": "INTEGER"
273
+ },
274
+ {
275
+ "name": "lastMessageAt",
276
+ "type": "datetime",
277
+ "required": false,
278
+ "columnType": "TIMESTAMP"
279
+ },
280
+ {
281
+ "name": "expiresAt",
282
+ "type": "datetime",
283
+ "required": false,
284
+ "columnType": "TIMESTAMP"
285
+ },
286
+ {
287
+ "name": "closedAt",
288
+ "type": "datetime",
289
+ "required": false,
290
+ "columnType": "TIMESTAMP"
291
+ }
292
+ ],
293
+ "relationships": [
294
+ {
295
+ "name": "participantProfileId",
296
+ "type": "crossPackageRef",
297
+ "required": true,
298
+ "related": "@happyvertical/smrt-profiles:Profile",
299
+ "columnType": "UUID"
300
+ },
301
+ {
302
+ "name": "chatRoomId",
303
+ "type": "foreignKey",
304
+ "required": false,
305
+ "related": "ChatRoom",
306
+ "columnType": "UUID"
307
+ }
308
+ ],
309
+ "methods": [
310
+ "close",
311
+ "expire",
312
+ "getAllowedTools",
313
+ "getSessionContext",
314
+ "getSessionKey",
315
+ "isActive",
316
+ "isExpired",
317
+ "isToolAllowed",
318
+ "recordMessage",
319
+ "setAllowedTools",
320
+ "setSessionContext",
321
+ "updateSessionContext"
322
+ ],
323
+ "surfaces": [
324
+ {
325
+ "kind": "api",
326
+ "name": "agentsessions.list",
327
+ "operation": "list",
328
+ "objectName": "@happyvertical/smrt-chat:AgentSession",
329
+ "path": "/agentsessions",
330
+ "method": "GET"
331
+ },
332
+ {
333
+ "kind": "api",
334
+ "name": "agentsessions.get",
335
+ "operation": "get",
336
+ "objectName": "@happyvertical/smrt-chat:AgentSession",
337
+ "path": "/agentsessions/[id]",
338
+ "method": "GET"
339
+ },
340
+ {
341
+ "kind": "cli",
342
+ "name": "agentsession_list",
343
+ "operation": "list",
344
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
345
+ },
346
+ {
347
+ "kind": "cli",
348
+ "name": "agentsession_get",
349
+ "operation": "get",
350
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
351
+ },
352
+ {
353
+ "kind": "cli",
354
+ "name": "agentsession_create",
355
+ "operation": "create",
356
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
357
+ },
358
+ {
359
+ "kind": "cli",
360
+ "name": "agentsession_update",
361
+ "operation": "update",
362
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
363
+ },
364
+ {
365
+ "kind": "cli",
366
+ "name": "agentsession_delete",
367
+ "operation": "delete",
368
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
369
+ },
370
+ {
371
+ "kind": "mcp",
372
+ "name": "agentsession_list",
373
+ "operation": "list",
374
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
375
+ },
376
+ {
377
+ "kind": "mcp",
378
+ "name": "agentsession_get",
379
+ "operation": "get",
380
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
381
+ }
382
+ ],
383
+ "relationshipFeatures": [
384
+ "crossPackageRef",
385
+ "foreignKey",
386
+ "uuidColumns"
387
+ ],
388
+ "tags": [],
389
+ "risks": []
390
+ },
391
+ {
392
+ "name": "ChatMessage",
393
+ "qualifiedName": "@happyvertical/smrt-chat:ChatMessage",
394
+ "collection": "chatmessages",
395
+ "tableName": "chat_messages",
396
+ "packageName": "@happyvertical/smrt-chat",
397
+ "extends": "SmrtObject",
398
+ "fields": [
399
+ {
400
+ "name": "tenantId",
401
+ "type": "text",
402
+ "required": true,
403
+ "columnType": "UUID"
404
+ },
405
+ {
406
+ "name": "roomId",
407
+ "type": "foreignKey",
408
+ "required": true,
409
+ "related": "ChatRoom",
410
+ "columnType": "UUID"
411
+ },
412
+ {
413
+ "name": "threadId",
414
+ "type": "foreignKey",
415
+ "required": false,
416
+ "related": "ChatThread",
417
+ "columnType": "UUID"
418
+ },
419
+ {
420
+ "name": "senderProfileId",
421
+ "type": "crossPackageRef",
422
+ "required": true,
423
+ "related": "@happyvertical/smrt-profiles:Profile",
424
+ "columnType": "UUID"
425
+ },
426
+ {
427
+ "name": "agentSessionId",
428
+ "type": "foreignKey",
429
+ "required": false,
430
+ "related": "AgentSession",
431
+ "columnType": "UUID"
432
+ },
433
+ {
434
+ "name": "content",
435
+ "type": "text",
436
+ "required": false,
437
+ "columnType": "TEXT"
438
+ },
439
+ {
440
+ "name": "messageType",
441
+ "type": "text",
442
+ "required": true,
443
+ "columnType": "TEXT"
444
+ },
445
+ {
446
+ "name": "role",
447
+ "type": "text",
448
+ "required": true,
449
+ "columnType": "TEXT"
450
+ },
451
+ {
452
+ "name": "isEdited",
453
+ "type": "boolean",
454
+ "required": false,
455
+ "columnType": "BOOLEAN"
456
+ },
457
+ {
458
+ "name": "editedAt",
459
+ "type": "datetime",
460
+ "required": false,
461
+ "columnType": "TIMESTAMP"
462
+ },
463
+ {
464
+ "name": "isDeleted",
465
+ "type": "boolean",
466
+ "required": false,
467
+ "columnType": "BOOLEAN"
468
+ },
469
+ {
470
+ "name": "replyToMessageId",
471
+ "type": "foreignKey",
472
+ "required": false,
473
+ "related": "ChatMessage",
474
+ "columnType": "UUID"
475
+ },
476
+ {
477
+ "name": "metadata",
478
+ "type": "text",
479
+ "required": false,
480
+ "columnType": "TEXT"
481
+ },
482
+ {
483
+ "name": "toolCallData",
484
+ "type": "text",
485
+ "required": false,
486
+ "columnType": "TEXT"
487
+ },
488
+ {
489
+ "name": "attachments",
490
+ "type": "text",
491
+ "required": false,
492
+ "columnType": "TEXT"
493
+ }
494
+ ],
495
+ "relationships": [
496
+ {
497
+ "name": "roomId",
498
+ "type": "foreignKey",
499
+ "required": true,
500
+ "related": "ChatRoom",
501
+ "columnType": "UUID"
502
+ },
503
+ {
504
+ "name": "threadId",
505
+ "type": "foreignKey",
506
+ "required": false,
507
+ "related": "ChatThread",
508
+ "columnType": "UUID"
509
+ },
510
+ {
511
+ "name": "senderProfileId",
512
+ "type": "crossPackageRef",
513
+ "required": true,
514
+ "related": "@happyvertical/smrt-profiles:Profile",
515
+ "columnType": "UUID"
516
+ },
517
+ {
518
+ "name": "agentSessionId",
519
+ "type": "foreignKey",
520
+ "required": false,
521
+ "related": "AgentSession",
522
+ "columnType": "UUID"
523
+ },
524
+ {
525
+ "name": "replyToMessageId",
526
+ "type": "foreignKey",
527
+ "required": false,
528
+ "related": "ChatMessage",
529
+ "columnType": "UUID"
530
+ }
531
+ ],
532
+ "methods": [
533
+ "edit",
534
+ "getAttachments",
535
+ "getMetadata",
536
+ "getPreview",
537
+ "getToolCallData",
538
+ "hasAttachments",
539
+ "isFromAgent",
540
+ "isSystemMessage",
541
+ "isToolCall",
542
+ "isToolResult",
543
+ "setAttachments",
544
+ "setMetadata",
545
+ "setToolCallData",
546
+ "softDelete"
547
+ ],
548
+ "surfaces": [
549
+ {
550
+ "kind": "api",
551
+ "name": "chatmessages.list",
552
+ "operation": "list",
553
+ "objectName": "@happyvertical/smrt-chat:ChatMessage",
554
+ "path": "/chatmessages",
555
+ "method": "GET"
556
+ },
557
+ {
558
+ "kind": "api",
559
+ "name": "chatmessages.get",
560
+ "operation": "get",
561
+ "objectName": "@happyvertical/smrt-chat:ChatMessage",
562
+ "path": "/chatmessages/[id]",
563
+ "method": "GET"
564
+ },
565
+ {
566
+ "kind": "cli",
567
+ "name": "chatmessage_list",
568
+ "operation": "list",
569
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
570
+ },
571
+ {
572
+ "kind": "cli",
573
+ "name": "chatmessage_get",
574
+ "operation": "get",
575
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
576
+ },
577
+ {
578
+ "kind": "cli",
579
+ "name": "chatmessage_create",
580
+ "operation": "create",
581
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
582
+ },
583
+ {
584
+ "kind": "cli",
585
+ "name": "chatmessage_update",
586
+ "operation": "update",
587
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
588
+ },
589
+ {
590
+ "kind": "cli",
591
+ "name": "chatmessage_delete",
592
+ "operation": "delete",
593
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
594
+ },
595
+ {
596
+ "kind": "mcp",
597
+ "name": "chatmessage_list",
598
+ "operation": "list",
599
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
600
+ },
601
+ {
602
+ "kind": "mcp",
603
+ "name": "chatmessage_get",
604
+ "operation": "get",
605
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
606
+ }
607
+ ],
608
+ "relationshipFeatures": [
609
+ "crossPackageRef",
610
+ "foreignKey",
611
+ "uuidColumns"
612
+ ],
613
+ "tags": [],
614
+ "risks": []
615
+ },
616
+ {
617
+ "name": "ChatParticipant",
618
+ "qualifiedName": "@happyvertical/smrt-chat:ChatParticipant",
619
+ "collection": "chatparticipants",
620
+ "tableName": "chat_participants",
621
+ "packageName": "@happyvertical/smrt-chat",
622
+ "extends": "SmrtObject",
623
+ "fields": [
624
+ {
625
+ "name": "tenantId",
626
+ "type": "text",
627
+ "required": true,
628
+ "columnType": "UUID"
629
+ },
630
+ {
631
+ "name": "roomId",
632
+ "type": "foreignKey",
633
+ "required": true,
634
+ "related": "ChatRoom",
635
+ "columnType": "UUID"
636
+ },
637
+ {
638
+ "name": "profileId",
639
+ "type": "crossPackageRef",
640
+ "required": true,
641
+ "related": "@happyvertical/smrt-profiles:Profile",
642
+ "columnType": "UUID"
643
+ },
644
+ {
645
+ "name": "role",
646
+ "type": "text",
647
+ "required": true,
648
+ "columnType": "TEXT"
649
+ },
650
+ {
651
+ "name": "status",
652
+ "type": "text",
653
+ "required": true,
654
+ "columnType": "TEXT"
655
+ },
656
+ {
657
+ "name": "onlineStatus",
658
+ "type": "text",
659
+ "required": true,
660
+ "columnType": "TEXT"
661
+ },
662
+ {
663
+ "name": "lastReadMessageId",
664
+ "type": "foreignKey",
665
+ "required": false,
666
+ "related": "ChatMessage",
667
+ "columnType": "UUID"
668
+ },
669
+ {
670
+ "name": "lastSeenAt",
671
+ "type": "datetime",
672
+ "required": false,
673
+ "columnType": "TIMESTAMP"
674
+ },
675
+ {
676
+ "name": "joinedAt",
677
+ "type": "datetime",
678
+ "required": false,
679
+ "columnType": "TIMESTAMP"
680
+ },
681
+ {
682
+ "name": "nickname",
683
+ "type": "text",
684
+ "required": false,
685
+ "columnType": "TEXT"
686
+ },
687
+ {
688
+ "name": "isMuted",
689
+ "type": "boolean",
690
+ "required": false,
691
+ "columnType": "BOOLEAN"
692
+ },
693
+ {
694
+ "name": "isPinned",
695
+ "type": "boolean",
696
+ "required": false,
697
+ "columnType": "BOOLEAN"
698
+ }
699
+ ],
700
+ "relationships": [
701
+ {
702
+ "name": "roomId",
703
+ "type": "foreignKey",
704
+ "required": true,
705
+ "related": "ChatRoom",
706
+ "columnType": "UUID"
707
+ },
708
+ {
709
+ "name": "profileId",
710
+ "type": "crossPackageRef",
711
+ "required": true,
712
+ "related": "@happyvertical/smrt-profiles:Profile",
713
+ "columnType": "UUID"
714
+ },
715
+ {
716
+ "name": "lastReadMessageId",
717
+ "type": "foreignKey",
718
+ "required": false,
719
+ "related": "ChatMessage",
720
+ "columnType": "UUID"
721
+ }
722
+ ],
723
+ "methods": [
724
+ "isActive",
725
+ "isAdmin",
726
+ "isOwner",
727
+ "leave",
728
+ "markRead",
729
+ "setOnline"
730
+ ],
731
+ "surfaces": [
732
+ {
733
+ "kind": "api",
734
+ "name": "chatparticipants.list",
735
+ "operation": "list",
736
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant",
737
+ "path": "/chatparticipants",
738
+ "method": "GET"
739
+ },
740
+ {
741
+ "kind": "api",
742
+ "name": "chatparticipants.get",
743
+ "operation": "get",
744
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant",
745
+ "path": "/chatparticipants/[id]",
746
+ "method": "GET"
747
+ },
748
+ {
749
+ "kind": "cli",
750
+ "name": "chatparticipant_list",
751
+ "operation": "list",
752
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
753
+ },
754
+ {
755
+ "kind": "cli",
756
+ "name": "chatparticipant_get",
757
+ "operation": "get",
758
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
759
+ },
760
+ {
761
+ "kind": "cli",
762
+ "name": "chatparticipant_create",
763
+ "operation": "create",
764
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
765
+ },
766
+ {
767
+ "kind": "cli",
768
+ "name": "chatparticipant_update",
769
+ "operation": "update",
770
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
771
+ },
772
+ {
773
+ "kind": "cli",
774
+ "name": "chatparticipant_delete",
775
+ "operation": "delete",
776
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
777
+ },
778
+ {
779
+ "kind": "mcp",
780
+ "name": "chatparticipant_list",
781
+ "operation": "list",
782
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
783
+ },
784
+ {
785
+ "kind": "mcp",
786
+ "name": "chatparticipant_get",
787
+ "operation": "get",
788
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
789
+ }
790
+ ],
791
+ "relationshipFeatures": [
792
+ "crossPackageRef",
793
+ "foreignKey",
794
+ "uuidColumns"
795
+ ],
796
+ "tags": [],
797
+ "risks": []
798
+ },
799
+ {
800
+ "name": "ChatReaction",
801
+ "qualifiedName": "@happyvertical/smrt-chat:ChatReaction",
802
+ "collection": "chatreactions",
803
+ "tableName": "chat_reactions",
804
+ "packageName": "@happyvertical/smrt-chat",
805
+ "extends": "SmrtObject",
806
+ "fields": [
807
+ {
808
+ "name": "tenantId",
809
+ "type": "text",
810
+ "required": true,
811
+ "columnType": "UUID"
812
+ },
813
+ {
814
+ "name": "messageId",
815
+ "type": "foreignKey",
816
+ "required": true,
817
+ "related": "ChatMessage",
818
+ "columnType": "UUID"
819
+ },
820
+ {
821
+ "name": "profileId",
822
+ "type": "crossPackageRef",
823
+ "required": true,
824
+ "related": "@happyvertical/smrt-profiles:Profile",
825
+ "columnType": "UUID"
826
+ },
827
+ {
828
+ "name": "emoji",
829
+ "type": "text",
830
+ "required": true,
831
+ "columnType": "TEXT"
832
+ }
833
+ ],
834
+ "relationships": [
835
+ {
836
+ "name": "messageId",
837
+ "type": "foreignKey",
838
+ "required": true,
839
+ "related": "ChatMessage",
840
+ "columnType": "UUID"
841
+ },
842
+ {
843
+ "name": "profileId",
844
+ "type": "crossPackageRef",
845
+ "required": true,
846
+ "related": "@happyvertical/smrt-profiles:Profile",
847
+ "columnType": "UUID"
848
+ }
849
+ ],
850
+ "methods": [],
851
+ "surfaces": [
852
+ {
853
+ "kind": "api",
854
+ "name": "chatreactions.list",
855
+ "operation": "list",
856
+ "objectName": "@happyvertical/smrt-chat:ChatReaction",
857
+ "path": "/chatreactions",
858
+ "method": "GET"
859
+ },
860
+ {
861
+ "kind": "mcp",
862
+ "name": "chatreaction_list",
863
+ "operation": "list",
864
+ "objectName": "@happyvertical/smrt-chat:ChatReaction"
865
+ }
866
+ ],
867
+ "relationshipFeatures": [
868
+ "crossPackageRef",
869
+ "foreignKey",
870
+ "uuidColumns"
871
+ ],
872
+ "tags": [],
873
+ "risks": []
874
+ },
875
+ {
876
+ "name": "ChatRoom",
877
+ "qualifiedName": "@happyvertical/smrt-chat:ChatRoom",
878
+ "collection": "chatrooms",
879
+ "tableName": "chat_rooms",
880
+ "packageName": "@happyvertical/smrt-chat",
881
+ "extends": "SmrtObject",
882
+ "fields": [
883
+ {
884
+ "name": "tenantId",
885
+ "type": "text",
886
+ "required": true,
887
+ "columnType": "UUID"
888
+ },
889
+ {
890
+ "name": "name",
891
+ "type": "text",
892
+ "required": false,
893
+ "columnType": "TEXT"
894
+ },
895
+ {
896
+ "name": "description",
897
+ "type": "text",
898
+ "required": false,
899
+ "columnType": "TEXT"
900
+ },
901
+ {
902
+ "name": "roomType",
903
+ "type": "text",
904
+ "required": true,
905
+ "columnType": "TEXT"
906
+ },
907
+ {
908
+ "name": "status",
909
+ "type": "text",
910
+ "required": true,
911
+ "columnType": "TEXT"
912
+ },
913
+ {
914
+ "name": "topic",
915
+ "type": "text",
916
+ "required": false,
917
+ "columnType": "TEXT"
918
+ },
919
+ {
920
+ "name": "avatarUrl",
921
+ "type": "text",
922
+ "required": false,
923
+ "columnType": "TEXT"
924
+ },
925
+ {
926
+ "name": "isArchived",
927
+ "type": "boolean",
928
+ "required": false,
929
+ "columnType": "BOOLEAN"
930
+ },
931
+ {
932
+ "name": "maxParticipants",
933
+ "type": "integer",
934
+ "required": false,
935
+ "columnType": "INTEGER"
936
+ },
937
+ {
938
+ "name": "metadata",
939
+ "type": "text",
940
+ "required": false,
941
+ "columnType": "TEXT"
942
+ },
943
+ {
944
+ "name": "createdByProfileId",
945
+ "type": "crossPackageRef",
946
+ "required": false,
947
+ "related": "@happyvertical/smrt-profiles:Profile",
948
+ "columnType": "UUID"
949
+ },
950
+ {
951
+ "name": "lastMessageAt",
952
+ "type": "datetime",
953
+ "required": false,
954
+ "columnType": "TIMESTAMP"
955
+ }
956
+ ],
957
+ "relationships": [
958
+ {
959
+ "name": "createdByProfileId",
960
+ "type": "crossPackageRef",
961
+ "required": false,
962
+ "related": "@happyvertical/smrt-profiles:Profile",
963
+ "columnType": "UUID"
964
+ }
965
+ ],
966
+ "methods": [
967
+ "archive",
968
+ "getMetadata",
969
+ "isActive",
970
+ "isAgentRoom",
971
+ "isDM",
972
+ "isPublic",
973
+ "setMetadata",
974
+ "unarchive",
975
+ "updateMetadata"
976
+ ],
977
+ "surfaces": [
978
+ {
979
+ "kind": "api",
980
+ "name": "chatrooms.list",
981
+ "operation": "list",
982
+ "objectName": "@happyvertical/smrt-chat:ChatRoom",
983
+ "path": "/chatrooms",
984
+ "method": "GET"
985
+ },
986
+ {
987
+ "kind": "api",
988
+ "name": "chatrooms.get",
989
+ "operation": "get",
990
+ "objectName": "@happyvertical/smrt-chat:ChatRoom",
991
+ "path": "/chatrooms/[id]",
992
+ "method": "GET"
993
+ },
994
+ {
995
+ "kind": "cli",
996
+ "name": "chatroom_list",
997
+ "operation": "list",
998
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
999
+ },
1000
+ {
1001
+ "kind": "cli",
1002
+ "name": "chatroom_get",
1003
+ "operation": "get",
1004
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1005
+ },
1006
+ {
1007
+ "kind": "cli",
1008
+ "name": "chatroom_create",
1009
+ "operation": "create",
1010
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1011
+ },
1012
+ {
1013
+ "kind": "cli",
1014
+ "name": "chatroom_update",
1015
+ "operation": "update",
1016
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1017
+ },
1018
+ {
1019
+ "kind": "cli",
1020
+ "name": "chatroom_delete",
1021
+ "operation": "delete",
1022
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1023
+ },
1024
+ {
1025
+ "kind": "mcp",
1026
+ "name": "chatroom_list",
1027
+ "operation": "list",
1028
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1029
+ },
1030
+ {
1031
+ "kind": "mcp",
1032
+ "name": "chatroom_get",
1033
+ "operation": "get",
1034
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1035
+ }
1036
+ ],
1037
+ "relationshipFeatures": [
1038
+ "crossPackageRef",
1039
+ "uuidColumns"
1040
+ ],
1041
+ "tags": [],
1042
+ "risks": []
1043
+ },
1044
+ {
1045
+ "name": "ChatThread",
1046
+ "qualifiedName": "@happyvertical/smrt-chat:ChatThread",
1047
+ "collection": "chatthreads",
1048
+ "tableName": "chat_threads",
1049
+ "packageName": "@happyvertical/smrt-chat",
1050
+ "extends": "SmrtObject",
1051
+ "fields": [
1052
+ {
1053
+ "name": "tenantId",
1054
+ "type": "text",
1055
+ "required": true,
1056
+ "columnType": "UUID"
1057
+ },
1058
+ {
1059
+ "name": "roomId",
1060
+ "type": "foreignKey",
1061
+ "required": true,
1062
+ "related": "ChatRoom",
1063
+ "columnType": "UUID"
1064
+ },
1065
+ {
1066
+ "name": "rootMessageId",
1067
+ "type": "foreignKey",
1068
+ "required": false,
1069
+ "related": "ChatMessage",
1070
+ "columnType": "UUID"
1071
+ },
1072
+ {
1073
+ "name": "title",
1074
+ "type": "text",
1075
+ "required": false,
1076
+ "columnType": "TEXT"
1077
+ },
1078
+ {
1079
+ "name": "isResolved",
1080
+ "type": "boolean",
1081
+ "required": false,
1082
+ "columnType": "BOOLEAN"
1083
+ },
1084
+ {
1085
+ "name": "messageCount",
1086
+ "type": "integer",
1087
+ "required": false,
1088
+ "columnType": "INTEGER"
1089
+ },
1090
+ {
1091
+ "name": "lastMessageAt",
1092
+ "type": "datetime",
1093
+ "required": false,
1094
+ "columnType": "TIMESTAMP"
1095
+ },
1096
+ {
1097
+ "name": "participantCount",
1098
+ "type": "integer",
1099
+ "required": false,
1100
+ "columnType": "INTEGER"
1101
+ }
1102
+ ],
1103
+ "relationships": [
1104
+ {
1105
+ "name": "roomId",
1106
+ "type": "foreignKey",
1107
+ "required": true,
1108
+ "related": "ChatRoom",
1109
+ "columnType": "UUID"
1110
+ },
1111
+ {
1112
+ "name": "rootMessageId",
1113
+ "type": "foreignKey",
1114
+ "required": false,
1115
+ "related": "ChatMessage",
1116
+ "columnType": "UUID"
1117
+ }
1118
+ ],
1119
+ "methods": [
1120
+ "reopen",
1121
+ "resolve"
1122
+ ],
1123
+ "surfaces": [
1124
+ {
1125
+ "kind": "api",
1126
+ "name": "chatthreads.list",
1127
+ "operation": "list",
1128
+ "objectName": "@happyvertical/smrt-chat:ChatThread",
1129
+ "path": "/chatthreads",
1130
+ "method": "GET"
1131
+ },
1132
+ {
1133
+ "kind": "api",
1134
+ "name": "chatthreads.get",
1135
+ "operation": "get",
1136
+ "objectName": "@happyvertical/smrt-chat:ChatThread",
1137
+ "path": "/chatthreads/[id]",
1138
+ "method": "GET"
1139
+ },
1140
+ {
1141
+ "kind": "cli",
1142
+ "name": "chatthread_list",
1143
+ "operation": "list",
1144
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1145
+ },
1146
+ {
1147
+ "kind": "cli",
1148
+ "name": "chatthread_get",
1149
+ "operation": "get",
1150
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1151
+ },
1152
+ {
1153
+ "kind": "cli",
1154
+ "name": "chatthread_create",
1155
+ "operation": "create",
1156
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1157
+ },
1158
+ {
1159
+ "kind": "cli",
1160
+ "name": "chatthread_update",
1161
+ "operation": "update",
1162
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1163
+ },
1164
+ {
1165
+ "kind": "cli",
1166
+ "name": "chatthread_delete",
1167
+ "operation": "delete",
1168
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1169
+ },
1170
+ {
1171
+ "kind": "mcp",
1172
+ "name": "chatthread_list",
1173
+ "operation": "list",
1174
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1175
+ },
1176
+ {
1177
+ "kind": "mcp",
1178
+ "name": "chatthread_get",
1179
+ "operation": "get",
1180
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1181
+ }
1182
+ ],
1183
+ "relationshipFeatures": [
1184
+ "foreignKey",
1185
+ "uuidColumns"
1186
+ ],
1187
+ "tags": [],
1188
+ "risks": []
1189
+ }
1190
+ ],
1191
+ "surfaces": [
1192
+ {
1193
+ "kind": "api",
1194
+ "name": "agentsessions.list",
1195
+ "operation": "list",
1196
+ "objectName": "@happyvertical/smrt-chat:AgentSession",
1197
+ "path": "/agentsessions",
1198
+ "method": "GET"
1199
+ },
1200
+ {
1201
+ "kind": "api",
1202
+ "name": "agentsessions.get",
1203
+ "operation": "get",
1204
+ "objectName": "@happyvertical/smrt-chat:AgentSession",
1205
+ "path": "/agentsessions/[id]",
1206
+ "method": "GET"
1207
+ },
1208
+ {
1209
+ "kind": "cli",
1210
+ "name": "agentsession_list",
1211
+ "operation": "list",
1212
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1213
+ },
1214
+ {
1215
+ "kind": "cli",
1216
+ "name": "agentsession_get",
1217
+ "operation": "get",
1218
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1219
+ },
1220
+ {
1221
+ "kind": "cli",
1222
+ "name": "agentsession_create",
1223
+ "operation": "create",
1224
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1225
+ },
1226
+ {
1227
+ "kind": "cli",
1228
+ "name": "agentsession_update",
1229
+ "operation": "update",
1230
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1231
+ },
1232
+ {
1233
+ "kind": "cli",
1234
+ "name": "agentsession_delete",
1235
+ "operation": "delete",
1236
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1237
+ },
1238
+ {
1239
+ "kind": "mcp",
1240
+ "name": "agentsession_list",
1241
+ "operation": "list",
1242
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1243
+ },
1244
+ {
1245
+ "kind": "mcp",
1246
+ "name": "agentsession_get",
1247
+ "operation": "get",
1248
+ "objectName": "@happyvertical/smrt-chat:AgentSession"
1249
+ },
1250
+ {
1251
+ "kind": "api",
1252
+ "name": "chatmessages.list",
1253
+ "operation": "list",
1254
+ "objectName": "@happyvertical/smrt-chat:ChatMessage",
1255
+ "path": "/chatmessages",
1256
+ "method": "GET"
1257
+ },
1258
+ {
1259
+ "kind": "api",
1260
+ "name": "chatmessages.get",
1261
+ "operation": "get",
1262
+ "objectName": "@happyvertical/smrt-chat:ChatMessage",
1263
+ "path": "/chatmessages/[id]",
1264
+ "method": "GET"
1265
+ },
1266
+ {
1267
+ "kind": "cli",
1268
+ "name": "chatmessage_list",
1269
+ "operation": "list",
1270
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1271
+ },
1272
+ {
1273
+ "kind": "cli",
1274
+ "name": "chatmessage_get",
1275
+ "operation": "get",
1276
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1277
+ },
1278
+ {
1279
+ "kind": "cli",
1280
+ "name": "chatmessage_create",
1281
+ "operation": "create",
1282
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1283
+ },
1284
+ {
1285
+ "kind": "cli",
1286
+ "name": "chatmessage_update",
1287
+ "operation": "update",
1288
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1289
+ },
1290
+ {
1291
+ "kind": "cli",
1292
+ "name": "chatmessage_delete",
1293
+ "operation": "delete",
1294
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1295
+ },
1296
+ {
1297
+ "kind": "mcp",
1298
+ "name": "chatmessage_list",
1299
+ "operation": "list",
1300
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1301
+ },
1302
+ {
1303
+ "kind": "mcp",
1304
+ "name": "chatmessage_get",
1305
+ "operation": "get",
1306
+ "objectName": "@happyvertical/smrt-chat:ChatMessage"
1307
+ },
1308
+ {
1309
+ "kind": "api",
1310
+ "name": "chatparticipants.list",
1311
+ "operation": "list",
1312
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant",
1313
+ "path": "/chatparticipants",
1314
+ "method": "GET"
1315
+ },
1316
+ {
1317
+ "kind": "api",
1318
+ "name": "chatparticipants.get",
1319
+ "operation": "get",
1320
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant",
1321
+ "path": "/chatparticipants/[id]",
1322
+ "method": "GET"
1323
+ },
1324
+ {
1325
+ "kind": "cli",
1326
+ "name": "chatparticipant_list",
1327
+ "operation": "list",
1328
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1329
+ },
1330
+ {
1331
+ "kind": "cli",
1332
+ "name": "chatparticipant_get",
1333
+ "operation": "get",
1334
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1335
+ },
1336
+ {
1337
+ "kind": "cli",
1338
+ "name": "chatparticipant_create",
1339
+ "operation": "create",
1340
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1341
+ },
1342
+ {
1343
+ "kind": "cli",
1344
+ "name": "chatparticipant_update",
1345
+ "operation": "update",
1346
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1347
+ },
1348
+ {
1349
+ "kind": "cli",
1350
+ "name": "chatparticipant_delete",
1351
+ "operation": "delete",
1352
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1353
+ },
1354
+ {
1355
+ "kind": "mcp",
1356
+ "name": "chatparticipant_list",
1357
+ "operation": "list",
1358
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1359
+ },
1360
+ {
1361
+ "kind": "mcp",
1362
+ "name": "chatparticipant_get",
1363
+ "operation": "get",
1364
+ "objectName": "@happyvertical/smrt-chat:ChatParticipant"
1365
+ },
1366
+ {
1367
+ "kind": "api",
1368
+ "name": "chatreactions.list",
1369
+ "operation": "list",
1370
+ "objectName": "@happyvertical/smrt-chat:ChatReaction",
1371
+ "path": "/chatreactions",
1372
+ "method": "GET"
1373
+ },
1374
+ {
1375
+ "kind": "mcp",
1376
+ "name": "chatreaction_list",
1377
+ "operation": "list",
1378
+ "objectName": "@happyvertical/smrt-chat:ChatReaction"
1379
+ },
1380
+ {
1381
+ "kind": "api",
1382
+ "name": "chatrooms.list",
1383
+ "operation": "list",
1384
+ "objectName": "@happyvertical/smrt-chat:ChatRoom",
1385
+ "path": "/chatrooms",
1386
+ "method": "GET"
1387
+ },
1388
+ {
1389
+ "kind": "api",
1390
+ "name": "chatrooms.get",
1391
+ "operation": "get",
1392
+ "objectName": "@happyvertical/smrt-chat:ChatRoom",
1393
+ "path": "/chatrooms/[id]",
1394
+ "method": "GET"
1395
+ },
1396
+ {
1397
+ "kind": "cli",
1398
+ "name": "chatroom_list",
1399
+ "operation": "list",
1400
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1401
+ },
1402
+ {
1403
+ "kind": "cli",
1404
+ "name": "chatroom_get",
1405
+ "operation": "get",
1406
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1407
+ },
1408
+ {
1409
+ "kind": "cli",
1410
+ "name": "chatroom_create",
1411
+ "operation": "create",
1412
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1413
+ },
1414
+ {
1415
+ "kind": "cli",
1416
+ "name": "chatroom_update",
1417
+ "operation": "update",
1418
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1419
+ },
1420
+ {
1421
+ "kind": "cli",
1422
+ "name": "chatroom_delete",
1423
+ "operation": "delete",
1424
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1425
+ },
1426
+ {
1427
+ "kind": "mcp",
1428
+ "name": "chatroom_list",
1429
+ "operation": "list",
1430
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1431
+ },
1432
+ {
1433
+ "kind": "mcp",
1434
+ "name": "chatroom_get",
1435
+ "operation": "get",
1436
+ "objectName": "@happyvertical/smrt-chat:ChatRoom"
1437
+ },
1438
+ {
1439
+ "kind": "api",
1440
+ "name": "chatthreads.list",
1441
+ "operation": "list",
1442
+ "objectName": "@happyvertical/smrt-chat:ChatThread",
1443
+ "path": "/chatthreads",
1444
+ "method": "GET"
1445
+ },
1446
+ {
1447
+ "kind": "api",
1448
+ "name": "chatthreads.get",
1449
+ "operation": "get",
1450
+ "objectName": "@happyvertical/smrt-chat:ChatThread",
1451
+ "path": "/chatthreads/[id]",
1452
+ "method": "GET"
1453
+ },
1454
+ {
1455
+ "kind": "cli",
1456
+ "name": "chatthread_list",
1457
+ "operation": "list",
1458
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1459
+ },
1460
+ {
1461
+ "kind": "cli",
1462
+ "name": "chatthread_get",
1463
+ "operation": "get",
1464
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1465
+ },
1466
+ {
1467
+ "kind": "cli",
1468
+ "name": "chatthread_create",
1469
+ "operation": "create",
1470
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1471
+ },
1472
+ {
1473
+ "kind": "cli",
1474
+ "name": "chatthread_update",
1475
+ "operation": "update",
1476
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1477
+ },
1478
+ {
1479
+ "kind": "cli",
1480
+ "name": "chatthread_delete",
1481
+ "operation": "delete",
1482
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1483
+ },
1484
+ {
1485
+ "kind": "mcp",
1486
+ "name": "chatthread_list",
1487
+ "operation": "list",
1488
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1489
+ },
1490
+ {
1491
+ "kind": "mcp",
1492
+ "name": "chatthread_get",
1493
+ "operation": "get",
1494
+ "objectName": "@happyvertical/smrt-chat:ChatThread"
1495
+ }
1496
+ ],
1497
+ "prompts": [],
1498
+ "relationshipsV2": {
1499
+ "foreignKeyFields": 10,
1500
+ "crossPackageRefFields": 5,
1501
+ "junctionCollections": 0,
1502
+ "hierarchicalObjects": 0,
1503
+ "polymorphicAssociations": 0,
1504
+ "uuidColumns": 33
1505
+ },
1506
+ "agentDoc": "# @happyvertical/smrt-chat\n\nChat rooms, threads, and agent sessions with app-controlled tool whitelisting.\n\n## Models\n\nInternal models — all mutations go through the membership/owner-checked `ChatService` (S5 #1392). EVERY `@smrt()` model in this package (ChatRoom, ChatMessage, ChatParticipant, ChatThread, ChatReaction, AgentSession) has a READ-ONLY generated REST/MCP surface (`list`/`get` only); `create`/`update`/`delete` are intentionally NOT generated so the raw collection routes cannot skip the service-layer authorization. A structural regression test enumerates the registry to assert no chat model exposes a mutating op.\n\n`ChatService` is a CLOSED FACADE (S5 #1392). The raw collections (`rooms`, `messages`, `participants`, `threads`, `agentSessions`, `reactions`) are ES `#private` fields — they are NOT on the public `ChatService` type and the package index does NOT export the collection classes, so a consumer cannot do `chat.messages.create({senderProfileId, role})` / `new ChatParticipantCollection(...)` to mutate around the authorization. The security-sensitive internals (`#writeMessage`, `#emitAgentReply`, `#enrollParticipant`, `#loadActiveSession`, `#requireActiveMembership`, `#requireRoomAdmin`, `#extractToolName`) are ES `#private` too, so they are unreachable at runtime — TypeScript `private` alone is erased and would leave them callable on the prototype. The agent-reply bridge is a `Symbol`-keyed static (not the old enumerable `_runAgentReply`), reachable only by the module-local `sendAgentReply` that holds the non-exported symbol.\n\n- **ChatRoom**: `roomType` (public/private/dm/agent), `status`, `topic`, `maxParticipants`, `lastMessageAt`. Tenant-scoped (required).\n- **ChatMessage**: shared by users + agents. `role` (user/assistant/system/tool), `messageType` (text/system/action/file/tool_call/tool_result), `toolCallData` JSON. Unified model — no separate agent message type. Tenant-scoped (required).\n- **ChatParticipant**: `role` (owner/admin/member/viewer), `onlineStatus`, `lastReadMessageId`, `isMuted`. Tenant-scoped (required).\n- **ChatThread**: `rootMessageId`, `isResolved`, `messageCount`. Created via `ChatService.startThread()` (member-checked). Tenant-scoped (required).\n- **ChatReaction**: `messageId`, `profileId`, `emoji`. Added/removed via `ChatService.addReaction()`/`removeReaction()` (member-checked, self-keyed). Tenant-scoped (required).\n- **AgentSession**: `agentId` (string ref, not FK), `allowedTools` (JSON string array), `sessionContext` (JSON), `systemPrompt`, limits (`maxTokens`/`maxMessages`/`expiresAt`). Optional tenancy.\n\n## ChatService\n\nEvery public write takes an explicit server-supplied `actorProfileId` (the authenticated principal the route injects) — never a caller-controlled `senderProfileId`/`role` (S5 #1392).\n\nFacade: `sendMessage()` (authors as the actor with `role: 'user'`; room-membership-checked; no caller-supplied sender/role and no public membership-skip), `createRoom()` (acting actor becomes owner — no caller-supplied `createdByProfileId`), `startThread()` (member-checked; optional `rootMessageId` bound to the same room+tenant), `addParticipant()`/`removeParticipant()` (owner/admin-checked; self-leave allowed), `updateRoom()` (owner/admin-checked), `addReaction()`/`removeReaction()` (member-checked, self-keyed), `getOrCreateDM()` (actor must be a DM participant), `createAgentSession()` (acting actor becomes the session participant — no caller-supplied `participantProfileId`; the existing-session room lookup is tenant-bound; optional `sessionKey` scopes session identity to a conversation subject so distinct keys get distinct sessions/rooms and a session opened for one subject is never reused/rewritten for another). Tenant-bound read facade (replaces raw-collection reach-ins; consumers apply their own ownership/context checks on the returned rows): `getAgentSession({agentSessionId, tenantId})`, `findActiveAgentSessions({tenantId, agentId, participantProfileId})`, `getThread({threadId, tenantId})`, `listRoomThreads({roomId, actorProfileId, tenantId})` (membership-gated), `getThreadMessages({threadId, actorProfileId, tenantId, limit?})` (membership-gated, chronological), `getRoomMessages({roomId, actorProfileId, tenantId})`/`getRoomForMember(roomId, actorProfileId, tenantId)` (membership-checked reads gated on the server-supplied `actorProfileId`, never a caller-controlled subject id — confused-deputy avoidance; `tenantId` required), `updateAgentSessionConfig()` (owner-checked; `tenantId` mandatory and bound into the lookup). Agent session messaging is split by authority: `sendAgentUserMessage()` (caller `actorProfileId` must be the session participant; always authored as the participant). The agent-authored reply path `sendAgentReply(service, params)` is an exported **function — NOT a `ChatService` method and NOT on the package index**; it is reachable only via the dedicated `@happyvertical/smrt-chat/internal/agent-runtime` subpath (S5 #1392), so only trusted in-process agent-runtime code that explicitly opts into that subpath can author as the agent. It authors as `session.agentId`, accepts an optional same-room/tenant `threadId`, and gates tool calls fail-closed against `allowedTools`. The shared internal persistence path (`writeMessage`) is private — it alone may author an arbitrary profile/role or skip the membership check, and is unreachable from any route; it also validates every supplied `threadId`/`agentSessionId`/`replyToMessageId` belongs to the SAME room AND tenant (tenant/room-bound lookups) before use, rejecting cross-room/cross-tenant references. Auto-creates rooms/sessions/participants via an internal `enrollParticipant`.\n\n## Agent Tool Whitelisting\n\n`allowedTools` is a JSON array controlled by the consuming app. Fail-closed: an empty/unparseable whitelist permits NO tools. The internal `sendAgentReply(service, params)` function enforces the whitelist before emitting any `tool`/`tool_call` message; a caller cannot supply a `senderProfileId`/`role` to post as the agent, and the function is not reachable from the package index.\n\n## Gotchas\n\n- **sessionContext, not context**: `context` is reserved for slug scoping. Use `getSessionContext()`/`updateSessionContext()` for agent memory.\n- **Agent rooms auto-created**: `roomType: 'agent'`, `maxParticipants` defaults to 2; the agent is enrolled as a member so its replies pass the membership check. `createAgentSession()` re-enrolls the participant AND the agent on the existing-session path, so legacy sessions created before the agent was enrolled self-heal.\n- **Per-subject sessions need `sessionKey`**: `createAgentSession()` reuses ANY active session for the same `(agentId, participantProfileId, tenantId)`. Callers that open separate conversations per subject (e.g. one content-editor session per content id) MUST pass a stable `sessionKey` (stored in `sessionContext.__sessionKey`, read via `AgentSession.getSessionKey()`); otherwise a session opened for one subject is reused and its context overwritten for another, surfacing the wrong room/threads (S5 #1392). A keyed create never reuses a keyless/legacy session.\n- **Session expiry**: check `isActive()` before allowing messages (expiresAt or limit-based)\n- **DM identity**: derived from the deterministic per-tenant `canonicalDmRoomId()` and the authoritative `chat_participants` join, not client metadata; concurrent creates upsert onto one row.\n- **Tenant-bound lookups**: membership/session/DM lookups REQUIRE `tenantId` and always bind it into the WHERE clause (`findActiveMembership`/`isActiveMember`/`findActiveSession` take a required `tenantId`; AgentSession's `null` tenant is an explicit bound scope, not \"any tenant\") so they can never resolve a row from another tenant.\n"
1507
+ }