@base44/superagent-native 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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -20
  3. package/lib/commonjs/AgentSettingsPanel.js +32 -15
  4. package/lib/commonjs/AgentSettingsPanel.js.map +1 -1
  5. package/lib/commonjs/AttachmentPickerStatusModal.js +2 -2
  6. package/lib/commonjs/AttachmentPickerStatusModal.js.map +1 -1
  7. package/lib/commonjs/ConversationChat.js +27 -11
  8. package/lib/commonjs/ConversationChat.js.map +1 -1
  9. package/lib/commonjs/ConversationComposer.js +10 -6
  10. package/lib/commonjs/ConversationComposer.js.map +1 -1
  11. package/lib/commonjs/ConversationScreen.js +2 -0
  12. package/lib/commonjs/ConversationScreen.js.map +1 -1
  13. package/lib/commonjs/MarkdownText.js +1 -1
  14. package/lib/commonjs/MarkdownText.js.map +1 -1
  15. package/lib/commonjs/MessageActionBar.js +10 -3
  16. package/lib/commonjs/MessageActionBar.js.map +1 -1
  17. package/lib/commonjs/SuperagentHomeScreen.js +17 -3
  18. package/lib/commonjs/SuperagentHomeScreen.js.map +1 -1
  19. package/lib/commonjs/ToolApprovalCard.js +1 -1
  20. package/lib/commonjs/ToolApprovalCard.js.map +1 -1
  21. package/lib/commonjs/ToolCallSummary.js +5 -1
  22. package/lib/commonjs/ToolCallSummary.js.map +1 -1
  23. package/lib/commonjs/attachmentUpload.js +2 -1
  24. package/lib/commonjs/attachmentUpload.js.map +1 -1
  25. package/lib/commonjs/conversationRuntime.js +37 -2
  26. package/lib/commonjs/conversationRuntime.js.map +1 -1
  27. package/lib/commonjs/fileTreeUtils.js +7 -0
  28. package/lib/commonjs/fileTreeUtils.js.map +1 -1
  29. package/lib/commonjs/screenParts.js +3 -3
  30. package/lib/commonjs/styles.js +43 -43
  31. package/lib/commonjs/useSuperagentConversation.js +117 -34
  32. package/lib/commonjs/useSuperagentConversation.js.map +1 -1
  33. package/lib/commonjs/useSuperagentRuntime.js +79 -24
  34. package/lib/commonjs/useSuperagentRuntime.js.map +1 -1
  35. package/lib/module/AgentSettingsPanel.js +32 -15
  36. package/lib/module/AgentSettingsPanel.js.map +1 -1
  37. package/lib/module/AttachmentPickerStatusModal.js +2 -2
  38. package/lib/module/AttachmentPickerStatusModal.js.map +1 -1
  39. package/lib/module/ConversationChat.js +27 -11
  40. package/lib/module/ConversationChat.js.map +1 -1
  41. package/lib/module/ConversationComposer.js +10 -6
  42. package/lib/module/ConversationComposer.js.map +1 -1
  43. package/lib/module/ConversationScreen.js +2 -0
  44. package/lib/module/ConversationScreen.js.map +1 -1
  45. package/lib/module/MarkdownText.js +1 -1
  46. package/lib/module/MarkdownText.js.map +1 -1
  47. package/lib/module/MessageActionBar.js +10 -3
  48. package/lib/module/MessageActionBar.js.map +1 -1
  49. package/lib/module/SuperagentHomeScreen.js +18 -4
  50. package/lib/module/SuperagentHomeScreen.js.map +1 -1
  51. package/lib/module/ToolApprovalCard.js +1 -1
  52. package/lib/module/ToolApprovalCard.js.map +1 -1
  53. package/lib/module/ToolCallSummary.js +5 -1
  54. package/lib/module/ToolCallSummary.js.map +1 -1
  55. package/lib/module/attachmentUpload.js +2 -1
  56. package/lib/module/attachmentUpload.js.map +1 -1
  57. package/lib/module/conversationRuntime.js +36 -2
  58. package/lib/module/conversationRuntime.js.map +1 -1
  59. package/lib/module/fileTreeUtils.js +6 -0
  60. package/lib/module/fileTreeUtils.js.map +1 -1
  61. package/lib/module/screenParts.js +3 -3
  62. package/lib/module/styles.js +43 -43
  63. package/lib/module/useSuperagentConversation.js +118 -35
  64. package/lib/module/useSuperagentConversation.js.map +1 -1
  65. package/lib/module/useSuperagentRuntime.js +80 -25
  66. package/lib/module/useSuperagentRuntime.js.map +1 -1
  67. package/lib/typescript/commonjs/AgentSettingsPanel.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/ConversationChat.d.ts.map +1 -1
  69. package/lib/typescript/commonjs/ConversationComposer.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/ConversationScreen.d.ts +1 -1
  71. package/lib/typescript/commonjs/ConversationScreen.d.ts.map +1 -1
  72. package/lib/typescript/commonjs/SuperagentHomeScreen.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/conversationRuntime.d.ts +3 -2
  74. package/lib/typescript/commonjs/conversationRuntime.d.ts.map +1 -1
  75. package/lib/typescript/commonjs/fileTreeUtils.d.ts +1 -0
  76. package/lib/typescript/commonjs/fileTreeUtils.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/types.d.ts +1 -0
  78. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/useSuperagentConversation.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/useSuperagentRuntime.d.ts +3 -1
  81. package/lib/typescript/commonjs/useSuperagentRuntime.d.ts.map +1 -1
  82. package/lib/typescript/module/AgentSettingsPanel.d.ts.map +1 -1
  83. package/lib/typescript/module/ConversationChat.d.ts.map +1 -1
  84. package/lib/typescript/module/ConversationComposer.d.ts.map +1 -1
  85. package/lib/typescript/module/ConversationScreen.d.ts +1 -1
  86. package/lib/typescript/module/ConversationScreen.d.ts.map +1 -1
  87. package/lib/typescript/module/SuperagentHomeScreen.d.ts.map +1 -1
  88. package/lib/typescript/module/conversationRuntime.d.ts +3 -2
  89. package/lib/typescript/module/conversationRuntime.d.ts.map +1 -1
  90. package/lib/typescript/module/fileTreeUtils.d.ts +1 -0
  91. package/lib/typescript/module/fileTreeUtils.d.ts.map +1 -1
  92. package/lib/typescript/module/types.d.ts +1 -0
  93. package/lib/typescript/module/types.d.ts.map +1 -1
  94. package/lib/typescript/module/useSuperagentConversation.d.ts.map +1 -1
  95. package/lib/typescript/module/useSuperagentRuntime.d.ts +3 -1
  96. package/lib/typescript/module/useSuperagentRuntime.d.ts.map +1 -1
  97. package/package.json +13 -11
  98. package/src/AgentSettingsPanel.tsx +28 -9
  99. package/src/AttachmentPickerStatusModal.tsx +2 -2
  100. package/src/ConversationChat.tsx +37 -9
  101. package/src/ConversationComposer.tsx +11 -6
  102. package/src/ConversationScreen.tsx +2 -0
  103. package/src/MarkdownText.tsx +1 -1
  104. package/src/MessageActionBar.tsx +9 -3
  105. package/src/SuperagentHomeScreen.tsx +18 -3
  106. package/src/ToolApprovalCard.tsx +1 -1
  107. package/src/ToolCallSummary.tsx +4 -1
  108. package/src/attachmentUpload.ts +2 -1
  109. package/src/conversationRuntime.ts +48 -4
  110. package/src/fileTreeUtils.ts +13 -0
  111. package/src/screenParts.tsx +3 -3
  112. package/src/styles.ts +43 -43
  113. package/src/types.ts +1 -0
  114. package/src/useSuperagentConversation.ts +116 -31
  115. package/src/useSuperagentRuntime.ts +80 -24
@@ -1 +1 @@
1
- {"version":3,"names":["AUTO_GREET_MESSAGE","nextMessageId","normalizeMessages","messages","map","message","content","normalizeContent","createdAt","getMessageCursor","mergeMessage","nextMessage","normalized","created_at","Date","now","id","existingIndex","findIndex","index","isVisibleMessage","hidden","role","createUserMessage","options","fileUrls","filter","Boolean","replyTo","toISOString","length","file_urls","additional_message_params","reply_to","message_id","messageId","createErrorMessage","error","Error","isQueuedResponse","response","queued","countAssistantResponses","trim","hasNewAssistantResponse","assistantCountBefore","refreshConversation","apiClient","conversationId","setMessages","refreshed","getConversation","normalizedMessages","sendWithFallback","agentId","onSendMessage","setIsSending","responseMessages","Array","isArray","current","some","errorMessage","pollConversation","onComplete","onAgentMessageDone","attempts","interval","setInterval","shouldStop","foundAssistantResponse","refreshedMessages","clearInterval","undefined","normalizeDate","metadata","created_date","value","date","Number","isNaN","getTime","JSON","stringify","String"],"sourceRoot":"../../src","sources":["conversationRuntime.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["AUTO_GREET_MESSAGE","nextMessageId","normalizeMessages","messages","map","message","content","normalizeContent","createdAt","getMessageCursor","mergeMessage","nextMessage","normalized","created_at","Date","now","id","existingIndex","findIndex","index","role","length","isVisibleMessage","hidden","createUserMessage","options","fileUrls","filter","Boolean","replyTo","toISOString","file_urls","additional_message_params","reply_to","message_id","messageId","createErrorMessage","error","Error","isQueuedResponse","response","queued","countAssistantResponses","trim","hasNewAssistantResponse","assistantCountBefore","mergeConversationSnapshot","current","incoming","currentById","Map","incomingIds","Set","incomingUserContents","merged","local","get","undefined","pendingLocal","has","refreshConversation","apiClient","conversationId","setMessages","refreshed","getConversation","normalizedMessages","sendWithFallback","agentId","onSendMessage","setIsSending","responseMessages","Array","isArray","some","errorMessage","pollConversation","onComplete","onAgentMessageDone","attempts","interval","setInterval","shouldStop","foundAssistantResponse","refreshedMessages","clearInterval","normalizeDate","metadata","created_date","value","date","Number","isNaN","getTime","JSON","stringify","String"],"sourceRoot":"../../src","sources":["conversationRuntime.ts"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,12 @@
2
2
 
3
3
  const HIDDEN_FILE_NAMES = new Set(['.gitignore', '.gitkeep', 'BOOTSTRAP.md', 'bootstrap.md']);
4
4
  export const DEFAULT_SANDBOX_FILE_PATHS = ['.agents/', '.agents/rules/', '.agents/skills/', '.agents/mcps/', '.agents/hooks/', '.agents/cron/', '.agents/memory/', 'incoming_files/'];
5
+ export function sanitizeSandboxFilePath(path) {
6
+ // Strip absolute / `..` / `.` segments and null bytes so a picked file name can't
7
+ // write outside the sandbox via path traversal (defense in depth, not a substitute
8
+ // for the backend's own validation).
9
+ return path.replace(/\\/g, '/').replace(/\0/g, '').split('/').map(segment => segment.trim()).filter(segment => segment && segment !== '.' && segment !== '..').join('/');
10
+ }
5
11
  export function normalizeFilePaths(paths = []) {
6
12
  return paths.filter(path => typeof path === 'string' && path.trim().length > 0).map(path => path.replace(/^\/+/, '')).filter(path => !path.includes('\0')).filter(path => !HIDDEN_FILE_NAMES.has(getFileName(path)));
7
13
  }
@@ -1 +1 @@
1
- {"version":3,"names":["HIDDEN_FILE_NAMES","Set","DEFAULT_SANDBOX_FILE_PATHS","normalizeFilePaths","paths","filter","path","trim","length","map","replace","includes","has","getFileName","buildFileTree","root","fileCount","folderCount","parts","split","Boolean","current","index","part","isFile","endsWith","toNodes","value","Object","entries","name","children","type","sort","first","second","localeCompare","tree","flattenFileTree","nodes","parentPath","node","push","getFileCategory","filePath","extension","getFileExtension","isEditableFile","category","pop","getFolderPath","join","fileName","toLowerCase","dotIndex","lastIndexOf","slice","getImageMimeType"],"sourceRoot":"../../src","sources":["fileTreeUtils.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["HIDDEN_FILE_NAMES","Set","DEFAULT_SANDBOX_FILE_PATHS","sanitizeSandboxFilePath","path","replace","split","map","segment","trim","filter","join","normalizeFilePaths","paths","length","includes","has","getFileName","buildFileTree","root","fileCount","folderCount","parts","Boolean","current","index","part","isFile","endsWith","toNodes","value","Object","entries","name","children","type","sort","first","second","localeCompare","tree","flattenFileTree","nodes","parentPath","node","push","getFileCategory","filePath","extension","getFileExtension","isEditableFile","category","pop","getFolderPath","fileName","toLowerCase","dotIndex","lastIndexOf","slice","getImageMimeType"],"sourceRoot":"../../src","sources":["fileTreeUtils.ts"],"mappings":"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","ignoreList":[]}
@@ -47,7 +47,7 @@ export function AgentCard({
47
47
  children: preview || agent.description || 'Open your latest Superagent conversation.'
48
48
  })]
49
49
  }), /*#__PURE__*/_jsx(ChevronRight, {
50
- color: "#8E8E93",
50
+ color: "#A1A1AA",
51
51
  size: 24,
52
52
  strokeWidth: 2.5
53
53
  })]
@@ -133,7 +133,7 @@ export function AgentRow({
133
133
  children: preview || agent.description || 'Ready for the next instruction.'
134
134
  })]
135
135
  }), /*#__PURE__*/_jsx(ChevronRight, {
136
- color: "#73737A",
136
+ color: "#A1A1AA",
137
137
  size: 21,
138
138
  strokeWidth: 2.5
139
139
  })]
@@ -163,7 +163,7 @@ export function CreateAgentButton({
163
163
  pressed
164
164
  }) => [styles.secondaryButton, pressed && styles.pressed],
165
165
  children: [/*#__PURE__*/_jsx(Plus, {
166
- color: "#F4F4F5",
166
+ color: "#18181B",
167
167
  size: 18,
168
168
  strokeWidth: 2.6
169
169
  }), /*#__PURE__*/_jsx(Text, {
@@ -4,7 +4,7 @@ import { StyleSheet } from 'react-native';
4
4
  export const styles = StyleSheet.create({
5
5
  safeArea: {
6
6
  flex: 1,
7
- backgroundColor: '#000000'
7
+ backgroundColor: '#F7F7F8'
8
8
  },
9
9
  container: {
10
10
  paddingBottom: 34,
@@ -13,7 +13,7 @@ export const styles = StyleSheet.create({
13
13
  },
14
14
  homeTopBar: {
15
15
  alignItems: 'center',
16
- borderBottomColor: '#101012',
16
+ borderBottomColor: '#E4E4E7',
17
17
  borderBottomWidth: 1,
18
18
  flexDirection: 'row',
19
19
  minHeight: 62,
@@ -35,7 +35,7 @@ export const styles = StyleSheet.create({
35
35
  minWidth: 0
36
36
  },
37
37
  topBarTitle: {
38
- color: '#F7F7F7',
38
+ color: '#18181B',
39
39
  fontSize: 17,
40
40
  fontWeight: '900',
41
41
  letterSpacing: 0,
@@ -58,20 +58,20 @@ export const styles = StyleSheet.create({
58
58
  marginLeft: 12
59
59
  },
60
60
  eyebrow: {
61
- color: '#8E8E93',
61
+ color: '#71717A',
62
62
  fontSize: 12,
63
63
  fontWeight: '800',
64
64
  marginTop: 2
65
65
  },
66
66
  title: {
67
- color: '#F7F7F7',
67
+ color: '#18181B',
68
68
  fontSize: 24,
69
69
  fontWeight: '900',
70
70
  letterSpacing: 0,
71
71
  lineHeight: 29
72
72
  },
73
73
  subtitle: {
74
- color: '#A1A1AA',
74
+ color: '#52525B',
75
75
  fontSize: 14,
76
76
  fontWeight: '600',
77
77
  lineHeight: 20,
@@ -79,8 +79,8 @@ export const styles = StyleSheet.create({
79
79
  },
80
80
  headerAvatar: {
81
81
  alignItems: 'center',
82
- backgroundColor: '#151515',
83
- borderColor: '#2A2A2A',
82
+ backgroundColor: '#FFFFFF',
83
+ borderColor: '#E4E4E7',
84
84
  borderRadius: 22,
85
85
  borderWidth: 1,
86
86
  height: 44,
@@ -89,15 +89,15 @@ export const styles = StyleSheet.create({
89
89
  },
90
90
  loadingPanel: {
91
91
  alignItems: 'center',
92
- backgroundColor: '#0B0B0C',
93
- borderColor: '#242427',
92
+ backgroundColor: '#FFFFFF',
93
+ borderColor: '#E4E4E7',
94
94
  borderRadius: 18,
95
95
  borderWidth: 1,
96
96
  padding: 32
97
97
  },
98
98
  heroPanel: {
99
- backgroundColor: '#0B0B0C',
100
- borderColor: '#242427',
99
+ backgroundColor: '#FFFFFF',
100
+ borderColor: '#E4E4E7',
101
101
  borderRadius: 22,
102
102
  borderWidth: 1,
103
103
  overflow: 'hidden',
@@ -110,7 +110,7 @@ export const styles = StyleSheet.create({
110
110
  marginBottom: 16
111
111
  },
112
112
  heroLabel: {
113
- color: '#8E8E93',
113
+ color: '#71717A',
114
114
  fontSize: 11,
115
115
  fontWeight: '900',
116
116
  textTransform: 'uppercase'
@@ -122,8 +122,8 @@ export const styles = StyleSheet.create({
122
122
  },
123
123
  avatar: {
124
124
  alignItems: 'center',
125
- backgroundColor: '#111111',
126
- borderColor: '#2A2A2A',
125
+ backgroundColor: '#F4F4F5',
126
+ borderColor: '#E4E4E7',
127
127
  borderRadius: 24,
128
128
  borderWidth: 1,
129
129
  height: 52,
@@ -131,7 +131,7 @@ export const styles = StyleSheet.create({
131
131
  width: 52
132
132
  },
133
133
  avatarText: {
134
- color: '#F7F7F7',
134
+ color: '#18181B',
135
135
  fontSize: 18,
136
136
  fontWeight: '900'
137
137
  },
@@ -141,20 +141,20 @@ export const styles = StyleSheet.create({
141
141
  minWidth: 0
142
142
  },
143
143
  agentName: {
144
- color: '#F7F7F7',
144
+ color: '#18181B',
145
145
  fontSize: 21,
146
146
  fontWeight: '900',
147
147
  lineHeight: 25
148
148
  },
149
149
  agentDescription: {
150
- color: '#BDBDC2',
150
+ color: '#52525B',
151
151
  fontSize: 14,
152
152
  fontWeight: '600',
153
153
  lineHeight: 20,
154
154
  marginTop: 7
155
155
  },
156
156
  chevron: {
157
- color: '#8E8E93',
157
+ color: '#A1A1AA',
158
158
  fontSize: 20,
159
159
  fontWeight: '900'
160
160
  },
@@ -165,8 +165,8 @@ export const styles = StyleSheet.create({
165
165
  marginTop: 14
166
166
  },
167
167
  agentMetaPill: {
168
- backgroundColor: '#151515',
169
- borderColor: '#2A2A2A',
168
+ backgroundColor: '#F4F4F5',
169
+ borderColor: '#E4E4E7',
170
170
  borderRadius: 13,
171
171
  borderWidth: 1,
172
172
  marginRight: 7,
@@ -175,26 +175,26 @@ export const styles = StyleSheet.create({
175
175
  paddingVertical: 6
176
176
  },
177
177
  agentMetaText: {
178
- color: '#D4D4D8',
178
+ color: '#3F3F46',
179
179
  fontSize: 12,
180
180
  fontWeight: '800'
181
181
  },
182
182
  emptyPanel: {
183
- backgroundColor: '#0B0B0C',
184
- borderColor: '#242427',
183
+ backgroundColor: '#FFFFFF',
184
+ borderColor: '#E4E4E7',
185
185
  borderRadius: 22,
186
186
  borderWidth: 1,
187
187
  padding: 16
188
188
  },
189
189
  emptyTitle: {
190
- color: '#F7F7F7',
190
+ color: '#18181B',
191
191
  fontSize: 23,
192
192
  fontWeight: '900',
193
193
  lineHeight: 28,
194
194
  marginTop: 15
195
195
  },
196
196
  emptyBody: {
197
- color: '#BDBDC2',
197
+ color: '#52525B',
198
198
  fontSize: 14,
199
199
  fontWeight: '600',
200
200
  lineHeight: 21,
@@ -206,8 +206,8 @@ export const styles = StyleSheet.create({
206
206
  marginTop: 14
207
207
  },
208
208
  emptyChip: {
209
- backgroundColor: '#151515',
210
- borderColor: '#2A2A2A',
209
+ backgroundColor: '#F4F4F5',
210
+ borderColor: '#E4E4E7',
211
211
  borderRadius: 15,
212
212
  borderWidth: 1,
213
213
  marginRight: 7,
@@ -216,13 +216,13 @@ export const styles = StyleSheet.create({
216
216
  paddingVertical: 7
217
217
  },
218
218
  emptyChipText: {
219
- color: '#D4D4D8',
219
+ color: '#3F3F46',
220
220
  fontSize: 12,
221
221
  fontWeight: '800'
222
222
  },
223
223
  primaryButton: {
224
224
  alignItems: 'center',
225
- backgroundColor: '#F4F4F5',
225
+ backgroundColor: '#18181B',
226
226
  borderRadius: 17,
227
227
  justifyContent: 'center',
228
228
  marginTop: 20,
@@ -230,14 +230,14 @@ export const styles = StyleSheet.create({
230
230
  paddingHorizontal: 18
231
231
  },
232
232
  primaryButtonText: {
233
- color: '#111111',
233
+ color: '#FFFFFF',
234
234
  fontSize: 16,
235
235
  fontWeight: '900'
236
236
  },
237
237
  secondaryButton: {
238
238
  alignItems: 'center',
239
- backgroundColor: '#151515',
240
- borderColor: '#2A2A2A',
239
+ backgroundColor: '#FFFFFF',
240
+ borderColor: '#E4E4E7',
241
241
  borderRadius: 16,
242
242
  borderWidth: 1,
243
243
  flexDirection: 'row',
@@ -247,7 +247,7 @@ export const styles = StyleSheet.create({
247
247
  paddingHorizontal: 16
248
248
  },
249
249
  secondaryButtonText: {
250
- color: '#F4F4F5',
250
+ color: '#18181B',
251
251
  fontSize: 14,
252
252
  fontWeight: '900',
253
253
  marginLeft: 7
@@ -262,19 +262,19 @@ export const styles = StyleSheet.create({
262
262
  marginBottom: 10
263
263
  },
264
264
  sectionTitle: {
265
- color: '#F4F4F5',
265
+ color: '#18181B',
266
266
  fontSize: 17,
267
267
  fontWeight: '900'
268
268
  },
269
269
  sectionCount: {
270
- color: '#73737A',
270
+ color: '#A1A1AA',
271
271
  fontSize: 12,
272
272
  fontWeight: '900'
273
273
  },
274
274
  agentRow: {
275
275
  alignItems: 'center',
276
- backgroundColor: '#0B0B0C',
277
- borderColor: '#242427',
276
+ backgroundColor: '#FFFFFF',
277
+ borderColor: '#E4E4E7',
278
278
  borderRadius: 17,
279
279
  borderWidth: 1,
280
280
  flexDirection: 'row',
@@ -290,12 +290,12 @@ export const styles = StyleSheet.create({
290
290
  minWidth: 0
291
291
  },
292
292
  agentRowName: {
293
- color: '#F4F4F5',
293
+ color: '#18181B',
294
294
  fontSize: 15,
295
295
  fontWeight: '900'
296
296
  },
297
297
  agentRowDescription: {
298
- color: '#8E8E93',
298
+ color: '#71717A',
299
299
  fontSize: 12,
300
300
  fontWeight: '600',
301
301
  lineHeight: 17,
@@ -303,8 +303,8 @@ export const styles = StyleSheet.create({
303
303
  },
304
304
  compactAvatar: {
305
305
  alignItems: 'center',
306
- backgroundColor: '#111111',
307
- borderColor: '#2A2A2A',
306
+ backgroundColor: '#F4F4F5',
307
+ borderColor: '#E4E4E7',
308
308
  borderRadius: 15,
309
309
  borderWidth: 1,
310
310
  height: 38,
@@ -326,7 +326,7 @@ export const styles = StyleSheet.create({
326
326
  fontWeight: '700'
327
327
  },
328
328
  helperText: {
329
- color: '#73737A',
329
+ color: '#A1A1AA',
330
330
  fontSize: 12,
331
331
  fontWeight: '700',
332
332
  lineHeight: 18,
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { AUTO_GREET_MESSAGE, MESSAGES_PAGE_SIZE } from "./constants.js";
5
- import { countAssistantResponses, createErrorMessage, createUserMessage, getMessageCursor, hasNewAssistantResponse, isQueuedResponse, isVisibleMessage, mergeMessage, normalizeMessages, pollConversation, refreshConversation, sendWithFallback } from "./conversationRuntime.js";
5
+ import { countAssistantResponses, createErrorMessage, createUserMessage, getMessageCursor, hasNewAssistantResponse, isQueuedResponse, isVisibleMessage, mergeConversationSnapshot, mergeMessage, normalizeMessages, pollConversation, refreshConversation, sendWithFallback } from "./conversationRuntime.js";
6
6
  export function useSuperagentConversation({
7
7
  agentId,
8
8
  apiClient,
@@ -21,6 +21,36 @@ export function useSuperagentConversation({
21
21
  const [initError, setInitError] = useState(null);
22
22
  const [hasMoreMessages, setHasMoreMessages] = useState(false);
23
23
  const sendGenerationRef = useRef(0);
24
+ const pollIntervalRef = useRef(null);
25
+ const loadingPreviousRef = useRef(false);
26
+ const settleTimeoutRef = useRef(null);
27
+ const messagesRef = useRef(messages);
28
+ const onAgentMessageDoneRef = useRef(onAgentMessageDone);
29
+ const onConversationSettledRef = useRef(onConversationSettled);
30
+ useEffect(() => {
31
+ messagesRef.current = messages;
32
+ }, [messages]);
33
+ useEffect(() => {
34
+ onAgentMessageDoneRef.current = onAgentMessageDone;
35
+ onConversationSettledRef.current = onConversationSettled;
36
+ }, [onAgentMessageDone, onConversationSettled]);
37
+
38
+ // Cancel any in-flight poll/settle timers — called on each new send and on unmount.
39
+ const clearPendingSettlers = useCallback(() => {
40
+ if (pollIntervalRef.current) {
41
+ clearInterval(pollIntervalRef.current);
42
+ pollIntervalRef.current = null;
43
+ }
44
+ if (settleTimeoutRef.current) {
45
+ clearTimeout(settleTimeoutRef.current);
46
+ settleTimeoutRef.current = null;
47
+ }
48
+ }, []);
49
+
50
+ // Clear any active poll interval / settle timeout when the hook unmounts.
51
+ useEffect(() => {
52
+ return () => clearPendingSettlers();
53
+ }, [clearPendingSettlers]);
24
54
  useEffect(() => {
25
55
  if (!apiClient) setMessages(fallbackMessages);
26
56
  }, [apiClient, fallbackMessages]);
@@ -65,45 +95,64 @@ export function useSuperagentConversation({
65
95
  if (!realtimeClient || !conversationId) return undefined;
66
96
  return realtimeClient.subscribeToConversation(conversationId, {
67
97
  onMessage(message) {
98
+ // Don't clear the sending/stop state on intermediate assistant messages
99
+ // (tool-call steps or streamed content arrive before the turn is done).
100
+ // The turn ends on `agent_done` (onAgentDone) or the 5s settle fallback.
68
101
  setMessages(current => mergeMessage(current, message));
69
- if (message.role === 'assistant' && (message.content || message.toolCalls?.length || message.tool_calls?.length)) {
70
- setIsSending(false);
71
- }
72
102
  },
73
103
  onConversation(conversation) {
74
104
  if (conversation.id !== conversationId) return;
75
- setMessages(normalizeMessages(conversation.messages ?? []));
105
+ const incoming = normalizeMessages(conversation.messages ?? []);
106
+ setMessages(current => mergeConversationSnapshot(current, incoming));
76
107
  },
77
108
  onAgentDone() {
109
+ // Agent finished via realtime — cancel the 5s settle fallback so
110
+ // onConversationSettled doesn't also fire when the timer elapses.
111
+ if (settleTimeoutRef.current) {
112
+ clearTimeout(settleTimeoutRef.current);
113
+ settleTimeoutRef.current = null;
114
+ }
78
115
  setIsSending(false);
79
- onAgentMessageDone?.();
116
+ setQueuedMessages([]);
117
+ onAgentMessageDoneRef.current?.();
80
118
  if (apiClient) {
81
- refreshConversation(apiClient, conversationId, setMessages).then(() => onConversationSettled?.()).catch(() => {});
119
+ refreshConversation(apiClient, conversationId, setMessages).then(() => onConversationSettledRef.current?.()).catch(() => {});
82
120
  } else {
83
- onConversationSettled?.();
121
+ onConversationSettledRef.current?.();
84
122
  }
85
123
  },
86
124
  onReconnect() {
125
+ // A reconnect means the transient socket error cleared — drop the
126
+ // "something went wrong" state so it doesn't linger as a failed load.
127
+ setInitError(null);
87
128
  if (apiClient) refreshConversation(apiClient, conversationId, setMessages).catch(() => {});
88
129
  },
89
130
  onError(error) {
90
131
  setInitError(error instanceof Error ? error.message : 'Realtime connection failed');
91
132
  }
92
133
  });
93
- }, [apiClient, conversationId, onAgentMessageDone, onConversationSettled, realtimeClient]);
134
+ }, [apiClient, conversationId, realtimeClient]);
94
135
  const visibleMessages = useMemo(() => messages.filter((message, index) => isVisibleMessage(message, index)), [messages]);
95
136
  const sendMessage = useCallback(async (content, options = {}) => {
96
137
  const trimmedContent = content.trim();
97
138
  const fileUrls = options.fileUrls?.filter(Boolean) ?? [];
98
139
  if (!trimmedContent && fileUrls.length === 0) return;
99
- const assistantCountBefore = countAssistantResponses(messages);
140
+
141
+ // A new send supersedes any pending poll/settle timers from the previous one.
142
+ clearPendingSettlers();
143
+ const assistantCountBefore = countAssistantResponses(messagesRef.current);
100
144
  const userMessage = createUserMessage(trimmedContent, {
101
145
  fileUrls,
102
146
  replyTo: options.replyTo
103
147
  });
104
148
  setMessages(current => [...current, userMessage]);
105
149
  if (!apiClient || !conversationId) {
106
- if (!onSendMessage) return;
150
+ if (!onSendMessage) {
151
+ // No send path yet (no fallback handler, or the conversation is still
152
+ // loading) — drop the optimistic bubble so the turn doesn't look sent.
153
+ setMessages(current => current.filter(message => message.id !== userMessage.id));
154
+ return;
155
+ }
107
156
  const sendGeneration = sendGenerationRef.current + 1;
108
157
  sendGenerationRef.current = sendGeneration;
109
158
  const setSendingForCurrentSend = value => {
@@ -111,7 +160,7 @@ export function useSuperagentConversation({
111
160
  };
112
161
  setIsSending(true);
113
162
  const hasAssistantResponse = await sendWithFallback(agentId, trimmedContent, fileUrls, options.replyTo, onSendMessage, setMessages, setSendingForCurrentSend);
114
- if (hasAssistantResponse) onAgentMessageDone?.();
163
+ if (hasAssistantResponse) onAgentMessageDoneRef.current?.();
115
164
  return;
116
165
  }
117
166
  const sendGeneration = sendGenerationRef.current + 1;
@@ -121,6 +170,25 @@ export function useSuperagentConversation({
121
170
  };
122
171
  setIsSending(true);
123
172
  try {
173
+ // Wait for the turn to complete: poll without realtime, otherwise a 5s
174
+ // fallback in case agent_done never arrives.
175
+ const armSettleFallback = () => {
176
+ if (!realtimeClient) {
177
+ pollIntervalRef.current = pollConversation(apiClient, conversationId, setMessages, setSendingForCurrentSend, assistantCountBefore, () => {
178
+ setQueuedMessages([]);
179
+ onConversationSettledRef.current?.();
180
+ }, () => onAgentMessageDoneRef.current?.());
181
+ } else {
182
+ settleTimeoutRef.current = setTimeout(() => {
183
+ settleTimeoutRef.current = null;
184
+ refreshConversation(apiClient, conversationId, setMessages).catch(() => {});
185
+ setSendingForCurrentSend(false);
186
+ setQueuedMessages([]);
187
+ onAgentMessageDoneRef.current?.();
188
+ onConversationSettledRef.current?.();
189
+ }, 5000);
190
+ }
191
+ };
124
192
  const response = await apiClient.addMessage(conversationId, userMessage);
125
193
  if (isQueuedResponse(response)) {
126
194
  setQueuedMessages(current => [...current, {
@@ -128,21 +196,17 @@ export function useSuperagentConversation({
128
196
  content: userMessage.content,
129
197
  position: current.length
130
198
  }]);
199
+ // A queued send still needs a settle path, or isSending / the queued strip stick.
200
+ armSettleFallback();
131
201
  } else {
132
202
  const refreshedMessages = await refreshConversation(apiClient, conversationId, setMessages);
133
- if (!realtimeClient) {
134
- if (hasNewAssistantResponse(refreshedMessages, assistantCountBefore)) {
135
- setSendingForCurrentSend(false);
136
- onAgentMessageDone?.();
137
- onConversationSettled?.();
138
- } else {
139
- pollConversation(apiClient, conversationId, setMessages, setSendingForCurrentSend, assistantCountBefore, onConversationSettled, onAgentMessageDone);
140
- }
203
+ if (!realtimeClient && hasNewAssistantResponse(refreshedMessages, assistantCountBefore)) {
204
+ setSendingForCurrentSend(false);
205
+ setQueuedMessages([]);
206
+ onAgentMessageDoneRef.current?.();
207
+ onConversationSettledRef.current?.();
141
208
  } else {
142
- setTimeout(() => {
143
- setSendingForCurrentSend(false);
144
- onConversationSettled?.();
145
- }, 5000);
209
+ armSettleFallback();
146
210
  }
147
211
  }
148
212
  } catch (error) {
@@ -150,7 +214,7 @@ export function useSuperagentConversation({
150
214
  setMessages(current => [...current, errorMessage]);
151
215
  setSendingForCurrentSend(false);
152
216
  }
153
- }, [agentId, apiClient, conversationId, messages, onAgentMessageDone, onConversationSettled, onSendMessage, realtimeClient]);
217
+ }, [agentId, apiClient, clearPendingSettlers, conversationId, onSendMessage, realtimeClient]);
154
218
  const deleteMessage = useCallback(async messageId => {
155
219
  if (!messageId || messageId === 'welcome') return false;
156
220
  if (!apiClient || !conversationId) {
@@ -159,15 +223,22 @@ export function useSuperagentConversation({
159
223
  }
160
224
  try {
161
225
  await apiClient.deleteMessage(conversationId, messageId);
226
+ // Remove locally before refreshing: mergeConversationSnapshot keeps rows
227
+ // missing from the server snapshot, so without this the just-deleted
228
+ // message would be resurrected.
229
+ setMessages(current => current.filter(message => message.id !== messageId));
162
230
  await refreshConversation(apiClient, conversationId, setMessages);
163
231
  return true;
164
- } catch (error) {
165
- setInitError(error instanceof Error ? error.message : 'Failed to delete message');
232
+ } catch {
233
+ // A failed delete is not a load failure — don't drive the "something went
234
+ // wrong" panel (it would persist). Signal failure via the return value so
235
+ // the caller can surface it.
166
236
  return false;
167
237
  }
168
238
  }, [apiClient, conversationId]);
169
239
  const stop = useCallback(async () => {
170
240
  sendGenerationRef.current += 1;
241
+ clearPendingSettlers();
171
242
  if (!apiClient || !conversationId) {
172
243
  setIsSending(false);
173
244
  return;
@@ -176,21 +247,33 @@ export function useSuperagentConversation({
176
247
  setQueuedMessages([]);
177
248
  await apiClient.stopConversation(conversationId);
178
249
  await refreshConversation(apiClient, conversationId, setMessages);
179
- }, [apiClient, conversationId]);
250
+ }, [apiClient, clearPendingSettlers, conversationId]);
180
251
  const loadPrevious = useCallback(async () => {
252
+ if (loadingPreviousRef.current) return;
181
253
  const before = getMessageCursor(messages[0]);
182
254
  if (!apiClient || !conversationId || !before) return;
183
- const page = await apiClient.getMessages(conversationId, {
184
- limit: MESSAGES_PAGE_SIZE,
185
- before
186
- });
187
- setMessages(current => [...normalizeMessages(page.messages), ...current]);
188
- setHasMoreMessages(Boolean(page.has_more ?? page.hasMore));
255
+ loadingPreviousRef.current = true;
256
+ try {
257
+ const page = await apiClient.getMessages(conversationId, {
258
+ limit: MESSAGES_PAGE_SIZE,
259
+ before
260
+ });
261
+ setMessages(current => [...normalizeMessages(page.messages), ...current]);
262
+ setHasMoreMessages(Boolean(page.has_more ?? page.hasMore));
263
+ } catch {
264
+ // Pagination failed — swallow so it isn't an unhandled rejection from the
265
+ // button, and leave hasMoreMessages as-is so the user can retry.
266
+ } finally {
267
+ loadingPreviousRef.current = false;
268
+ }
189
269
  }, [apiClient, conversationId, messages]);
190
270
  const submitToolCallInput = useCallback(async (toolCallId, approve, extraUserInput, originRequestId) => {
191
271
  if (!apiClient || !conversationId) return null;
192
272
  const updated = await apiClient.submitToolCallInput(conversationId, toolCallId, approve, extraUserInput, originRequestId);
193
- if (updated.messages) setMessages(normalizeMessages(updated.messages));
273
+ if (updated.messages) {
274
+ const incoming = normalizeMessages(updated.messages);
275
+ setMessages(current => mergeConversationSnapshot(current, incoming));
276
+ }
194
277
  onConversationSettled?.();
195
278
  return updated;
196
279
  }, [apiClient, conversationId, onConversationSettled]);