@agentshouse/mdruntime 0.1.0-cede5a74284be → 0.1.0-cee9c8aa4cd86

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 (223) hide show
  1. package/AGENTS.md +294 -292
  2. package/README.md +9 -8
  3. package/dist/adapter.d.ts +91 -23
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attached-model.d.ts +4 -1
  6. package/dist/attached-model.d.ts.map +1 -1
  7. package/dist/attached-model.js +13 -3
  8. package/dist/attempt.d.ts.map +1 -1
  9. package/dist/attempt.js +14 -1
  10. package/dist/bootstrap.d.ts +16 -8
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +102 -47
  13. package/dist/chain.d.ts +11 -0
  14. package/dist/chain.d.ts.map +1 -0
  15. package/dist/chain.js +64 -0
  16. package/dist/change-set.d.ts +9 -14
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +11 -63
  19. package/dist/change.d.ts +31 -1
  20. package/dist/change.d.ts.map +1 -1
  21. package/dist/change.js +10 -1
  22. package/dist/chat/acts.d.ts +3 -4
  23. package/dist/chat/acts.d.ts.map +1 -1
  24. package/dist/chat/acts.js +10 -10
  25. package/dist/chat/earlier.d.ts +10 -0
  26. package/dist/chat/earlier.d.ts.map +1 -0
  27. package/dist/chat/earlier.js +54 -0
  28. package/dist/chat/house.d.ts +25 -0
  29. package/dist/chat/house.d.ts.map +1 -0
  30. package/dist/chat/house.js +38 -0
  31. package/dist/chat/input.d.ts +3 -1
  32. package/dist/chat/input.d.ts.map +1 -1
  33. package/dist/chat/input.js +11 -18
  34. package/dist/chat/kit.d.ts +2 -1
  35. package/dist/chat/kit.d.ts.map +1 -1
  36. package/dist/chat/kit.js +3 -3
  37. package/dist/chat/list.d.ts +9 -1
  38. package/dist/chat/list.d.ts.map +1 -1
  39. package/dist/chat/list.js +53 -9
  40. package/dist/chat/markdown.d.ts +3 -1
  41. package/dist/chat/markdown.d.ts.map +1 -1
  42. package/dist/chat/markdown.js +85 -26
  43. package/dist/chat/message.d.ts +1 -0
  44. package/dist/chat/message.d.ts.map +1 -1
  45. package/dist/chat/message.js +75 -13
  46. package/dist/chat/messages.d.ts +15 -1
  47. package/dist/chat/messages.d.ts.map +1 -1
  48. package/dist/chat/messages.js +82 -23
  49. package/dist/chat/name.d.ts +1 -0
  50. package/dist/chat/name.d.ts.map +1 -1
  51. package/dist/chat/name.js +1 -1
  52. package/dist/chat/opened.d.ts +1 -0
  53. package/dist/chat/opened.d.ts.map +1 -1
  54. package/dist/chat/opened.js +2 -0
  55. package/dist/chat/overlay.d.ts +1 -0
  56. package/dist/chat/overlay.d.ts.map +1 -1
  57. package/dist/chat/overlay.js +11 -5
  58. package/dist/chat/parts.d.ts +1 -0
  59. package/dist/chat/parts.d.ts.map +1 -1
  60. package/dist/chat/parts.js +3 -2
  61. package/dist/chat/pieces.d.ts +62 -0
  62. package/dist/chat/pieces.d.ts.map +1 -0
  63. package/dist/chat/pieces.js +1110 -0
  64. package/dist/chat/provider.d.ts +9 -2
  65. package/dist/chat/provider.d.ts.map +1 -1
  66. package/dist/chat/provider.js +146 -156
  67. package/dist/chat/question.d.ts +1 -1
  68. package/dist/chat/question.d.ts.map +1 -1
  69. package/dist/chat/question.js +7 -18
  70. package/dist/chat/ready.d.ts +5 -1
  71. package/dist/chat/ready.d.ts.map +1 -1
  72. package/dist/chat/ready.js +9 -7
  73. package/dist/chat/room-file.d.ts +8 -0
  74. package/dist/chat/room-file.d.ts.map +1 -0
  75. package/dist/chat/room-file.js +72 -0
  76. package/dist/chat/steady.d.ts +3 -0
  77. package/dist/chat/steady.d.ts.map +1 -0
  78. package/dist/chat/steady.js +26 -0
  79. package/dist/chat/style.d.ts.map +1 -1
  80. package/dist/chat/style.js +9 -4
  81. package/dist/chat.d.ts +3 -2
  82. package/dist/chat.d.ts.map +1 -1
  83. package/dist/chat.js +2 -2
  84. package/dist/client.d.ts +22 -9
  85. package/dist/client.d.ts.map +1 -1
  86. package/dist/client.js +48 -8
  87. package/dist/collection.d.ts +7 -6
  88. package/dist/collection.d.ts.map +1 -1
  89. package/dist/collection.js +31 -77
  90. package/dist/compile.d.ts +16 -0
  91. package/dist/compile.d.ts.map +1 -0
  92. package/dist/compile.js +718 -0
  93. package/dist/connection.d.ts +41 -13
  94. package/dist/connection.d.ts.map +1 -1
  95. package/dist/connection.js +3120 -702
  96. package/dist/conversation.d.ts +28 -9
  97. package/dist/conversation.d.ts.map +1 -1
  98. package/dist/conversation.js +513 -178
  99. package/dist/digest.d.ts +7 -0
  100. package/dist/digest.d.ts.map +1 -0
  101. package/dist/digest.js +113 -0
  102. package/dist/durability.d.ts +8 -1
  103. package/dist/durability.d.ts.map +1 -1
  104. package/dist/entry.d.ts +19 -0
  105. package/dist/entry.d.ts.map +1 -0
  106. package/dist/entry.js +151 -0
  107. package/dist/fence.d.ts +6 -0
  108. package/dist/fence.d.ts.map +1 -0
  109. package/dist/fence.js +10 -0
  110. package/dist/file.d.ts +2 -10
  111. package/dist/file.d.ts.map +1 -1
  112. package/dist/file.js +3 -120
  113. package/dist/fulltext.d.ts +27 -0
  114. package/dist/fulltext.d.ts.map +1 -0
  115. package/dist/fulltext.js +368 -0
  116. package/dist/host.d.ts +14 -3
  117. package/dist/host.d.ts.map +1 -1
  118. package/dist/host.js +102 -13
  119. package/dist/identity.d.ts +1 -0
  120. package/dist/identity.d.ts.map +1 -1
  121. package/dist/identity.js +3 -0
  122. package/dist/index.d.ts +15 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +5 -0
  125. package/dist/live.d.ts +22 -0
  126. package/dist/live.d.ts.map +1 -0
  127. package/dist/live.js +123 -0
  128. package/dist/memory.d.ts +9 -2
  129. package/dist/memory.d.ts.map +1 -1
  130. package/dist/memory.js +55 -12
  131. package/dist/messages.d.ts +28 -0
  132. package/dist/messages.d.ts.map +1 -0
  133. package/dist/messages.js +90 -0
  134. package/dist/model.d.ts +4 -2
  135. package/dist/model.d.ts.map +1 -1
  136. package/dist/model.js +10 -1
  137. package/dist/name.d.ts +4 -0
  138. package/dist/name.d.ts.map +1 -0
  139. package/dist/name.js +122 -0
  140. package/dist/observation.d.ts +19 -2
  141. package/dist/observation.d.ts.map +1 -1
  142. package/dist/observation.js +113 -12
  143. package/dist/opened.d.ts +22 -0
  144. package/dist/opened.d.ts.map +1 -0
  145. package/dist/opened.js +107 -0
  146. package/dist/outcome.d.ts +39 -4
  147. package/dist/outcome.d.ts.map +1 -1
  148. package/dist/outcome.js +29 -0
  149. package/dist/overlay.d.ts +3 -4
  150. package/dist/overlay.d.ts.map +1 -1
  151. package/dist/overlay.js +99 -181
  152. package/dist/query.d.ts +57 -4
  153. package/dist/query.d.ts.map +1 -1
  154. package/dist/query.js +37 -7
  155. package/dist/reach.d.ts +11 -4
  156. package/dist/reach.d.ts.map +1 -1
  157. package/dist/reach.js +182 -51
  158. package/dist/react.d.ts +8 -6
  159. package/dist/react.d.ts.map +1 -1
  160. package/dist/react.js +7 -17
  161. package/dist/readiness.d.ts +53 -0
  162. package/dist/readiness.d.ts.map +1 -0
  163. package/dist/readiness.js +33 -0
  164. package/dist/reads.d.ts +11 -0
  165. package/dist/reads.d.ts.map +1 -0
  166. package/dist/reads.js +98 -0
  167. package/dist/recovery.d.ts +25 -0
  168. package/dist/recovery.d.ts.map +1 -0
  169. package/dist/recovery.js +198 -0
  170. package/dist/refresh.d.ts +12 -15
  171. package/dist/refresh.d.ts.map +1 -1
  172. package/dist/refresh.js +74 -44
  173. package/dist/replica.d.ts +55 -33
  174. package/dist/replica.d.ts.map +1 -1
  175. package/dist/replica.js +295 -149
  176. package/dist/room-draft.d.ts +16 -2
  177. package/dist/room-draft.d.ts.map +1 -1
  178. package/dist/room-draft.js +32 -25
  179. package/dist/rows.d.ts +28 -37
  180. package/dist/rows.d.ts.map +1 -1
  181. package/dist/rows.js +113 -72
  182. package/dist/save.d.ts +50 -9
  183. package/dist/save.d.ts.map +1 -1
  184. package/dist/save.js +528 -166
  185. package/dist/search.d.ts +39 -28
  186. package/dist/search.d.ts.map +1 -1
  187. package/dist/search.js +37 -105
  188. package/dist/seed.d.ts +16 -0
  189. package/dist/seed.d.ts.map +1 -0
  190. package/dist/seed.js +75 -0
  191. package/dist/shared.d.ts +16 -0
  192. package/dist/shared.d.ts.map +1 -0
  193. package/dist/shared.js +431 -0
  194. package/dist/status.d.ts +4 -0
  195. package/dist/status.d.ts.map +1 -1
  196. package/dist/store.d.ts +108 -75
  197. package/dist/store.d.ts.map +1 -1
  198. package/dist/store.js +345 -450
  199. package/dist/stored.d.ts +138 -0
  200. package/dist/stored.d.ts.map +1 -0
  201. package/dist/stored.js +544 -0
  202. package/dist/tables.d.ts +332 -0
  203. package/dist/tables.d.ts.map +1 -0
  204. package/dist/tables.js +570 -0
  205. package/dist/turn.d.ts +9 -0
  206. package/dist/turn.d.ts.map +1 -0
  207. package/dist/turn.js +75 -0
  208. package/dist/validation.d.ts +30 -0
  209. package/dist/validation.d.ts.map +1 -0
  210. package/dist/validation.js +162 -0
  211. package/dist/windows.d.ts +22 -0
  212. package/dist/windows.d.ts.map +1 -0
  213. package/dist/windows.js +89 -0
  214. package/dist/wire.d.ts +168 -32
  215. package/dist/wire.d.ts.map +1 -1
  216. package/dist/wire.js +56 -31
  217. package/dist/words.d.ts +19 -0
  218. package/dist/words.d.ts.map +1 -0
  219. package/dist/words.js +150 -0
  220. package/package.json +14 -4
  221. package/dist/read-side.d.ts +0 -18
  222. package/dist/read-side.d.ts.map +0 -1
  223. package/dist/read-side.js +0 -440
@@ -1,8 +1,9 @@
1
1
  import { type ReactElement, type ReactNode } from 'react';
2
2
  import type { TurnContext } from '../adapter.js';
3
3
  import type { MdRuntimeClient } from '../client.js';
4
- import type { ChatDraft, ConversationAgent, ConversationEntry, ConversationView } from '../conversation.js';
4
+ import { type ChatDraft, type ConversationAgent, type ConversationEntry, type ConversationView } from '../conversation.js';
5
5
  import { type ChatOutcome } from './acts.js';
6
+ import type { ChatRequest } from './house.js';
6
7
  import { type ChatCommand, type ChatOption } from './process.js';
7
8
  import { type ChatLone, type ChatQuestion } from './questions.js';
8
9
  export type ChatOpened = {
@@ -21,6 +22,7 @@ export type ChatState = ChatOpened & {
21
22
  readonly conversations: readonly ConversationEntry[];
22
23
  readonly agents: readonly ConversationAgent[];
23
24
  readonly view: ConversationView | null;
25
+ readonly waiting: ChatRequest | null;
24
26
  readonly running: boolean;
25
27
  readonly questions: readonly ChatQuestion[];
26
28
  readonly lone: ChatLone | null;
@@ -32,13 +34,17 @@ export type ChatState = ChatOpened & {
32
34
  readonly again: (() => void) | null;
33
35
  };
34
36
  readonly acting: ChatActing;
37
+ readonly renewed: boolean;
35
38
  open(conversation: string): void;
36
39
  start(agent: string): void;
37
40
  send(draft: ChatDraft): void;
41
+ attach: ((files: readonly File[]) => Promise<boolean>) | null;
38
42
  answer(question: ChatQuestion, response: unknown): Promise<boolean>;
39
43
  choose(option: string, value: string): Promise<boolean>;
40
44
  stop(): Promise<boolean>;
41
45
  kill(): Promise<boolean>;
46
+ retry(message: string): Promise<boolean>;
47
+ renew(): Promise<boolean>;
42
48
  done(): Promise<boolean>;
43
49
  rename(name: string): Promise<boolean>;
44
50
  remove(): Promise<boolean>;
@@ -49,6 +55,7 @@ export type ChatProviderProps = {
49
55
  readonly client: MdRuntimeClient;
50
56
  readonly conversation?: string | null;
51
57
  readonly agent?: string | null;
58
+ readonly attachTo?: string | null;
52
59
  readonly onOpen?: (opened: ChatOpened) => void;
53
60
  readonly children?: ReactNode;
54
61
  };
@@ -58,6 +65,6 @@ type Scope = {
58
65
  };
59
66
  export declare function useChatScope(): Scope;
60
67
  export declare function useChat(): ChatState;
61
- export declare function ChatProvider({ client, conversation, agent, onOpen, children, }: ChatProviderProps): ReactElement;
68
+ export declare function ChatProvider({ client, conversation, agent, attachTo, onOpen, children, }: ChatProviderProps): ReactElement;
62
69
  export {};
63
70
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.ts"],"names":[],"mappings":"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"}
@@ -1,71 +1,40 @@
1
1
  import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore, } from 'react';
2
- import { AssistantRuntimeProvider, createMessageQueue, generateId, useExternalStoreRuntime, } from '@assistant-ui/react';
2
+ import { AssistantRuntimeProvider, createMessageQueue, useExternalStoreRuntime, } from '@assistant-ui/react';
3
3
  import { attempts } from '../attempt.js';
4
+ import { newChat, } from '../conversation.js';
4
5
  import { expectedList } from '../expectation.js';
5
6
  import { chatDraftRevision } from '../identity.js';
6
7
  import { useObserve } from '../react.js';
7
8
  import { accepted, answeredOf, outcomeOf, sender, unanswered, } from './acts.js';
8
- import { askedBefore, chatMessages, contextOf } from './messages.js';
9
- import { conversationChanged, conversationGone, conversationListed, optionChosen, overlay, questionAnswered, sentMessage, } from './overlay.js';
9
+ import { CHAT_WINDOW, useEarlier } from './earlier.js';
10
+ import { askedBefore, chatMessages, contextOf, requestIn } from './messages.js';
11
+ import { useSteady } from './steady.js';
12
+ import { conversationChanged, conversationGone, conversationListed, deliveryRetried, optionChosen, overlay, questionAnswered, sentMessage, } from './overlay.js';
10
13
  import { commandIn, commandsOf, optionsOf } from './process.js';
11
14
  import { loneOf, questionsOf } from './questions.js';
12
15
  import { record, text } from './read.js';
13
16
  const SHARED = new WeakMap();
17
+ const LATEST = { limit: CHAT_WINDOW };
14
18
  function sharedOf(client) {
15
19
  const held = SHARED.get(client);
16
20
  if (held !== undefined)
17
21
  return held;
18
- const fresh = { overlay: overlay(), created: new Map(), sends: 0 };
22
+ const fresh = { overlay: overlay(), created: new Map(), renewed: new Set(), sends: 0 };
19
23
  SHARED.set(client, fresh);
20
24
  return fresh;
21
25
  }
22
- function newChat(agent) {
23
- return `new:${agent}`;
24
- }
25
26
  function ready(observed) {
26
27
  return observed.state === 'ready' ? observed.value : null;
27
28
  }
28
- async function alike(one, other) {
29
- if (one.type !== other.type || one.size !== other.size)
30
- return false;
31
- const [mine, theirs] = await Promise.all([one.arrayBuffer(), other.arrayBuffer()]);
32
- const bytes = new Uint8Array(theirs);
33
- return new Uint8Array(mine).every((byte, at) => byte === bytes[at]);
34
- }
35
- async function same(one, other) {
36
- if (one.text !== other.text || one.files.length !== other.files.length)
37
- return false;
38
- const files = await Promise.all(one.files.map(async (file, at) => {
39
- const twin = other.files[at];
40
- return twin !== undefined && file.name === twin.name && (await alike(file.blob, twin.blob));
41
- }));
42
- return files.every(Boolean);
43
- }
44
29
  function turnOf(result) {
45
30
  return accepted(result) ? text(record(result.result), 'turn') : null;
46
31
  }
47
- async function deliver(client, send, conversation, said, key, refused, noted) {
48
- const typed = (await client.conversation.read(conversation)).chatDraft;
49
- const kept = chatDraftRevision();
50
- noted(conversation, kept);
51
- await client.chatDraft.write(conversation, said, kept);
52
- const result = await send.carried('conversation.send', { conversation, key }, () => {
53
- noted(conversation, null);
54
- noted(conversation, kept);
55
- return client.conversation.send(conversation);
56
- });
57
- if (typed !== null && !(await same(typed, said))) {
58
- const now = (await client.conversation.read(conversation)).chatDraft;
59
- if (now === null || now.revision === kept) {
60
- const back = chatDraftRevision();
61
- noted(conversation, back);
62
- await client.chatDraft.write(conversation, typed, back);
63
- }
64
- }
32
+ async function deliver(client, send, conversation, said, key, idle) {
33
+ const result = await send.numbered('conversation.send', { conversation, key }, (operation) => client.conversation.send(conversation, operation, said));
65
34
  if (accepted(result))
66
35
  send.expect(sentMessage(key, [conversation], said, turnOf(result)));
67
36
  else if (!unanswered(result))
68
- refused();
37
+ idle();
69
38
  return result;
70
39
  }
71
40
  const IDLE = { busy: false, outcome: null };
@@ -122,46 +91,21 @@ function useActs(overlay, online) {
122
91
  }, [overlay, online, tried]);
123
92
  return { ...running, call, clear };
124
93
  }
125
- const ATTACHMENTS = {
126
- accept: '*',
127
- add: ({ file }) => Promise.resolve({
128
- id: generateId(),
129
- type: 'file',
130
- name: file.name,
131
- contentType: file.type,
132
- file,
133
- status: { type: 'requires-action', reason: 'composer-send' },
134
- }),
135
- send: (attachment) => Promise.resolve({ ...attachment, status: { type: 'complete' }, content: [] }),
136
- remove: () => Promise.resolve(),
137
- };
138
- function filesOf(attachments) {
139
- return attachments.flatMap((one) => one.file === undefined ? [] : [{ name: one.name, blob: one.file }]);
140
- }
141
- function fileOf(file) {
142
- return file.blob instanceof File && file.blob.name === file.name
143
- ? file.blob
144
- : new File([file.blob], file.name, { type: file.blob.type });
145
- }
94
+ const AS_IT_IS = (message) => message;
146
95
  function textOf(parts) {
147
96
  return parts.map((part) => (part.type === 'text' ? (part.text ?? '') : '')).join('');
148
97
  }
149
98
  function draftOf(message) {
150
- return { text: textOf(message.content), files: filesOf(message.attachments ?? []) };
99
+ return { text: textOf(message.content) };
100
+ }
101
+ function linkOf(path) {
102
+ return `[${path.slice(path.lastIndexOf('/') + 1)}](${path})`;
151
103
  }
152
104
  function appended(draft) {
153
105
  return {
154
106
  role: 'user',
155
107
  content: [{ type: 'text', text: draft.text }],
156
- attachments: draft.files.map((file) => ({
157
- id: generateId(),
158
- type: 'file',
159
- name: file.name,
160
- contentType: file.blob.type,
161
- file: fileOf(file),
162
- status: { type: 'complete' },
163
- content: [],
164
- })),
108
+ attachments: [],
165
109
  metadata: { custom: {} },
166
110
  createdAt: new Date(),
167
111
  parentId: null,
@@ -169,9 +113,6 @@ function appended(draft) {
169
113
  runConfig: undefined,
170
114
  };
171
115
  }
172
- function composed(state) {
173
- return JSON.stringify([state.text, state.attachments.map((one) => one.id)]);
174
- }
175
116
  const ChatContext = createContext(null);
176
117
  const ScopeContext = createContext(null);
177
118
  export function useChatScope() {
@@ -186,7 +127,7 @@ export function useChat() {
186
127
  throw new Error('useChat is called outside a ChatProvider');
187
128
  return chat;
188
129
  }
189
- export function ChatProvider({ client, conversation = null, agent = null, onOpen, children, }) {
130
+ export function ChatProvider({ client, conversation = null, agent = null, attachTo = null, onOpen, children, }) {
190
131
  const shared = sharedOf(client);
191
132
  const asked = JSON.stringify([conversation, agent]);
192
133
  const [followed, setFollowed] = useState(asked);
@@ -206,11 +147,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
206
147
  }, []);
207
148
  const listedHeld = ready(useObserve(client, 'conversations'));
208
149
  const agentsHeld = ready(useObserve(client, 'agents'));
209
- const sync = ready(useObserve(client, 'sync-status'));
150
+ const readiness = ready(useObserve(client, 'readiness'));
210
151
  const refusal = ready(useObserve(client, 'connection-refusal'));
211
- const online = sync !== null && !sync.providerUnreachable && refusal === null;
212
- const thread = open.conversation ?? (open.agent === null ? null : newChat(open.agent));
213
- const held = ready(useObserve(thread === null ? null : client, 'conversation', thread ?? '', {}));
152
+ const online = readiness?.connection !== 'unreachable' && refusal === null;
153
+ const thread = open.conversation ??
154
+ (open.agent === null ? null : (shared.created.get(open.agent) ?? newChat(open.agent)));
155
+ const observed = ready(useObserve(thread === null ? null : client, 'conversation', thread ?? '', LATEST));
156
+ const held = observed !== null && observed.conversation === thread ? observed : null;
157
+ const paged = useEarlier(client, thread, useSteady(held));
214
158
  const version = useSyncExternalStore(shared.overlay.subscribe, shared.overlay.version);
215
159
  useEffect(() => {
216
160
  if (listedHeld !== null)
@@ -221,7 +165,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
221
165
  shared.overlay.heard(held);
222
166
  }, [shared, held, version]);
223
167
  const conversations = useMemo(() => shared.overlay.conversations(listedHeld ?? []), [shared, listedHeld, version]);
224
- const view = useMemo(() => held === null || held.conversation !== thread ? null : shared.overlay.conversation(held), [shared, held, thread, version]);
168
+ const view = useMemo(() => (paged.view === null ? null : shared.overlay.conversation(paged.view)), [shared, paged.view, version]);
225
169
  const agents = agentsHeld ?? [];
226
170
  const known = useRef(agents);
227
171
  known.current = agents;
@@ -231,6 +175,10 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
231
175
  const lone = loneOf(questions);
232
176
  const commands = useMemo(() => commandsOf(view), [view]);
233
177
  const messages = useMemo(() => chatMessages(view), [view]);
178
+ const awaiting = useMemo(() => {
179
+ const held = requestIn(view);
180
+ return held?.waiting === true ? held.request : null;
181
+ }, [view]);
234
182
  const sending = useActs(shared.overlay, online);
235
183
  const behind = useActs(shared.overlay, online);
236
184
  const acting = useActs(shared.overlay, online);
@@ -238,6 +186,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
238
186
  const current = useRef(thread);
239
187
  current.current = thread;
240
188
  const seeding = useRef(false);
189
+ const mounted = useRef(true);
190
+ useEffect(() => {
191
+ mounted.current = true;
192
+ return () => {
193
+ mounted.current = false;
194
+ };
195
+ }, []);
196
+ const was = useRef(null);
241
197
  const heard = useRef('');
242
198
  const shown = useRef('');
243
199
  const own = useRef([]);
@@ -245,7 +201,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
245
201
  own.current = [...own.current, `${to}\u0000${revision ?? ''}`];
246
202
  }, []);
247
203
  const keep = useCallback((to, draft) => {
248
- const revision = draft.text === '' && draft.files.length === 0 ? null : chatDraftRevision();
204
+ const revision = draft.text === '' ? null : chatDraftRevision();
249
205
  noted(to, revision);
250
206
  void (revision === null
251
207
  ? client.chatDraft.discard(to)
@@ -255,21 +211,26 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
255
211
  heard.current = '';
256
212
  shown.current = '';
257
213
  own.current = own.current.filter((one) => one.startsWith(`${thread}\u0000`));
214
+ const created = was.current === open;
215
+ was.current = open;
216
+ if (created)
217
+ return;
258
218
  sending.clear();
259
219
  acting.clear();
260
220
  setAgain(null);
261
221
  }, [thread, sending.clear, acting.clear]);
262
- const sendTo = (to, said, key, refused, acts = sending) => acts.call((send) => deliver(client, send, to, said, key, refused, noted), sentMessage(key, [to], said, null));
263
- const first = (to, said, key, refused) => {
222
+ const sendTo = (to, said, key, idle, acts = sending) => acts.call((send) => deliver(client, send, to, said, key, idle), sentMessage(key, [to], said, null));
223
+ const first = (to, said, key, returning, idle) => {
264
224
  const drafted = [newChat(to)];
265
- let made = null;
266
225
  return sending.call(async (send) => {
267
226
  let conversation = shared.created.get(to);
268
227
  if (conversation === undefined) {
269
228
  const answer = await send.carried('conversation.create', { agent: to }, (operation) => client.conversation.create({ agent_id: to, operation_id: operation }));
270
229
  if (!accepted(answer)) {
271
- if (!unanswered(answer))
272
- refused();
230
+ if (!unanswered(answer)) {
231
+ returning();
232
+ idle();
233
+ }
273
234
  return answer;
274
235
  }
275
236
  const named = text(record(answer.result), 'conversation');
@@ -285,43 +246,34 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
285
246
  created: new Date().toISOString(),
286
247
  finished: null,
287
248
  outcome: null,
249
+ waiting: false,
288
250
  state: 'idle',
289
251
  started: null,
290
252
  }));
291
253
  }
292
- made = conversation;
293
254
  send.draw(sentMessage(key, [...drafted, conversation], said, null));
294
- const result = await deliver(client, send, conversation, said, key, refused, noted);
295
- if (accepted(result))
296
- shared.created.delete(to);
297
- return result;
298
- }, sentMessage(key, drafted, said, null), () => {
299
- if (made === null)
300
- return;
301
- void client.chatDraft.discard(newChat(to));
255
+ const result = await deliver(client, send, conversation, said, key, idle);
256
+ if (!accepted(result))
257
+ return result;
258
+ shared.created.delete(to);
302
259
  const now = opened.current;
303
- if (now.conversation === null && now.agent === to)
304
- go({ conversation: made, agent: to });
305
- });
306
- };
307
- const returned = async (to, one) => {
308
- const now = (await client.conversation.read(to)).chatDraft;
309
- await client.chatDraft.write(to, {
310
- text: now === null || now.text === '' ? one.text : `${one.text}\n${now.text}`,
311
- files: [...one.files, ...(now?.files ?? [])],
312
- });
260
+ if (mounted.current && now.conversation === null && now.agent === to) {
261
+ go({ conversation, agent: to });
262
+ }
263
+ return result;
264
+ }, sentMessage(key, drafted, said, null));
313
265
  };
314
266
  const sent = () => {
315
267
  shared.sends += 1;
316
268
  return `sent ${shared.sends}`;
317
269
  };
318
- const deliverDraft = (said, refused) => {
270
+ const deliverDraft = (said, returning, idle) => {
319
271
  const key = sent();
320
272
  const { conversation: to, agent: by } = opened.current;
321
273
  const attempt = to !== null
322
- ? () => void sendTo(to, said, key, refused)
274
+ ? () => void sendTo(to, said, key, idle)
323
275
  : by !== null
324
- ? () => void first(by, said, key, refused)
276
+ ? () => void first(by, said, key, returning, idle)
325
277
  : null;
326
278
  if (attempt === null)
327
279
  return;
@@ -349,6 +301,26 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
349
301
  return Promise.resolve(false);
350
302
  return control('conversation.setOption', { conversation_id: to, option, value }, optionChosen(to, option, value));
351
303
  };
304
+ const retry = (message) => {
305
+ const to = opened.current.conversation;
306
+ if (to === null)
307
+ return Promise.resolve(false);
308
+ return control('conversation.retry', { conversation_id: to, message_id: message }, deliveryRetried(to, message));
309
+ };
310
+ const renew = () => {
311
+ const from = opened.current.conversation;
312
+ const by = conversations.find((one) => one.conversation === from)?.agent.identity ??
313
+ opened.current.agent;
314
+ if (from === null || by === null)
315
+ return Promise.resolve(false);
316
+ return acting.call((send) => send.carried('conversation.create', { agent: by, replaces: from }, (operation) => client.conversation.create({ agent_id: by, operation_id: operation, replaces: from })), null, (result) => {
317
+ const conversation = text(record(result), 'conversation');
318
+ if (conversation === null)
319
+ return;
320
+ shared.renewed.add(conversation);
321
+ go({ conversation, agent: by });
322
+ });
323
+ };
352
324
  const done = (to = opened.current.conversation) => to === null
353
325
  ? Promise.resolve(false)
354
326
  : control('conversation.markDone', { conversation_id: to }, conversationChanged(to, { finished: new Date().toISOString() }, (one) => one.finished !== null));
@@ -424,7 +396,9 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
424
396
  const aui = useExternalStoreRuntime({
425
397
  messages,
426
398
  isRunning: running,
427
- convertMessage: (message) => message,
399
+ hasEarlier: paged.hasEarlier,
400
+ onLoadEarlier: paged.loadEarlier,
401
+ convertMessage: AS_IT_IS,
428
402
  queue: lined(),
429
403
  onNew: async (message) => lined().enqueue(message),
430
404
  onCancel: async () => {
@@ -436,12 +410,11 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
436
410
  const said = askedBefore(view, parent);
437
411
  if (said === null)
438
412
  return;
439
- const draft = { text: said, files: [] };
413
+ const draft = { text: said };
440
414
  const into = thread;
441
- deliverDraft(draft, () => back(draft, into));
415
+ deliverDraft(draft, () => back(draft, into), () => undefined);
442
416
  },
443
417
  adapters: {
444
- attachments: ATTACHMENTS,
445
418
  threadList: {
446
419
  ...(thread === null ? {} : { threadId: thread }),
447
420
  threads: threads.regular,
@@ -466,15 +439,39 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
466
439
  });
467
440
  function back(one, into) {
468
441
  if (current.current !== into) {
469
- void returned(into, one);
442
+ void client.chatDraft.prepend(into, one);
470
443
  return;
471
444
  }
472
445
  const composer = aui.thread.composer;
473
446
  const now = composer.getState().text;
474
447
  composer.setText(now === '' ? one.text : `${one.text}\n${now}`);
475
- for (const file of one.files)
476
- void composer.addAttachment(fileOf(file));
477
448
  }
449
+ function linked(path, into) {
450
+ if (current.current !== into) {
451
+ void client.chatDraft.prepend(into, { text: linkOf(path) });
452
+ return;
453
+ }
454
+ const composer = aui.thread.composer;
455
+ const now = composer.getState().text;
456
+ composer.setText(now === '' ? linkOf(path) : `${now}\n${linkOf(path)}`);
457
+ }
458
+ const attach = (room, files) => {
459
+ const into = thread;
460
+ if (into === null || files.length === 0)
461
+ return Promise.resolve(false);
462
+ return acting.call(async (send) => {
463
+ let result = { kind: 'offline' };
464
+ for (const file of files) {
465
+ result = await send.numbered('conversation.attach', { room, name: file.name }, () => client.conversation.attach(room, { name: file.name, blob: file }));
466
+ if (!accepted(result))
467
+ return result;
468
+ const path = text(record(result.result), 'path');
469
+ if (path !== null)
470
+ linked(path, into);
471
+ }
472
+ return result;
473
+ });
474
+ };
478
475
  function taken(message) {
479
476
  const said = textOf(message.content);
480
477
  if (lone === null || commandIn(said, commands))
@@ -486,6 +483,15 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
486
483
  const holding = (put) => (message) => {
487
484
  if (taken(message))
488
485
  return;
486
+ if (!online) {
487
+ const draft = draftOf(message);
488
+ const at = current.current;
489
+ deliverDraft(draft, () => {
490
+ if (at !== null)
491
+ back(draft, at);
492
+ }, () => undefined);
493
+ return;
494
+ }
489
495
  const known = new Set(lanes().map((one) => one.id));
490
496
  if (!lane.running)
491
497
  queue.notifyIdle();
@@ -513,18 +519,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
513
519
  const draft = draftOf(message);
514
520
  const idle = () => queues.current.get(key)?.queue.notifyIdle();
515
521
  if (key !== (current.current ?? '')) {
516
- void sendTo(key, draft, sent(), () => {
517
- back(draft, key);
518
- idle();
519
- }, behind);
522
+ void sendTo(key, draft, sent(), idle, behind);
520
523
  return;
521
524
  }
522
525
  const into = current.current;
523
526
  deliverDraft(draft, () => {
524
527
  if (into !== null)
525
528
  back(draft, into);
526
- idle();
527
- });
529
+ }, idle);
528
530
  };
529
531
  const unqueue = (id) => {
530
532
  const message = waiting.current.get(id);
@@ -537,7 +539,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
537
539
  const message = unqueue(id);
538
540
  if (thread === null || item === undefined)
539
541
  return;
540
- back(message === undefined ? { text: textOf(item.parts), files: [] } : draftOf(message), thread);
542
+ back(message === undefined ? { text: textOf(item.parts) } : draftOf(message), thread);
541
543
  };
542
544
  const reconcile = useRef(() => undefined);
543
545
  reconcile.current = () => {
@@ -556,42 +558,25 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
556
558
  }
557
559
  own.current = own.current.filter((one) => !one.startsWith(at));
558
560
  const composer = aui.thread.composer;
559
- const state = composer.getState();
561
+ const typed = composer.getState().text;
560
562
  const stored = view.chatDraft;
561
- const typed = { text: state.text, files: filesOf(state.attachments) };
562
- const kept = !known && (typed.text !== '' || typed.files.length > 0);
563
+ const kept = !known && typed !== '';
563
564
  if (kept && stored === null) {
564
- shown.current = `${at}${composed(state)}`;
565
- keep(thread, typed);
565
+ shown.current = `${at}${typed}`;
566
+ keep(thread, { text: typed });
566
567
  return;
567
568
  }
568
569
  const draft = kept
569
- ? {
570
- text: [stored?.text ?? '', typed.text].filter((one) => one !== '').join('\n'),
571
- files: [...(stored?.files ?? []), ...typed.files],
572
- }
573
- : stored;
574
- if (state.text === (draft?.text ?? '') &&
575
- state.attachments.length === 0 &&
576
- (draft?.files.length ?? 0) === 0) {
577
- shown.current = `${at}${composed(state)}`;
570
+ ? [stored?.text ?? '', typed].filter((one) => one !== '').join('\n')
571
+ : (stored?.text ?? '');
572
+ shown.current = `${at}${draft}`;
573
+ if (typed === draft)
578
574
  return;
579
- }
580
575
  seeding.current = true;
581
- composer.setText(draft?.text ?? '');
582
- void composer
583
- .clearAttachments()
584
- .then(() => Promise.all((draft?.files ?? []).map((file) => composer.addAttachment(fileOf(file)))))
585
- .finally(() => {
586
- seeding.current = false;
587
- if (current.current !== thread)
588
- return;
589
- const seeded = composer.getState();
590
- shown.current = `${at}${composed(seeded)}`;
591
- if (kept)
592
- keep(thread, { text: seeded.text, files: filesOf(seeded.attachments) });
593
- reconcile.current();
594
- });
576
+ composer.setText(draft);
577
+ seeding.current = false;
578
+ if (kept)
579
+ keep(thread, { text: draft });
595
580
  };
596
581
  useEffect(() => reconcile.current(), [aui, thread, view]);
597
582
  useEffect(() => {
@@ -602,12 +587,12 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
602
587
  return composer.subscribe(() => {
603
588
  if (seeding.current || !heard.current.startsWith(at))
604
589
  return;
605
- const state = composer.getState();
606
- const next = `${at}${composed(state)}`;
590
+ const typed = composer.getState().text;
591
+ const next = `${at}${typed}`;
607
592
  if (next === shown.current)
608
593
  return;
609
594
  shown.current = next;
610
- keep(thread, { text: state.text, files: filesOf(state.attachments) });
595
+ keep(thread, { text: typed });
611
596
  });
612
597
  }, [aui, thread, keep]);
613
598
  const queued = lanes().map((item) => ({ id: item.id, text: textOf(item.parts) }));
@@ -616,6 +601,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
616
601
  conversations,
617
602
  agents,
618
603
  view,
604
+ waiting: awaiting,
619
605
  running,
620
606
  questions,
621
607
  lone,
@@ -625,13 +611,17 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
625
611
  queued,
626
612
  sending: { busy: sending.busy, outcome: sending.outcome, again },
627
613
  acting: { busy: acting.busy, outcome: acting.outcome },
614
+ renewed: open.conversation !== null && shared.renewed.has(open.conversation),
628
615
  open: openConversation,
629
616
  start,
630
617
  send: (draft) => lined().enqueue(appended(draft)),
618
+ attach: attachTo === null ? null : (files) => attach(attachTo, files),
631
619
  answer,
632
620
  choose,
633
621
  stop,
634
622
  kill,
623
+ retry,
624
+ renew,
635
625
  done: () => done(),
636
626
  rename: (name) => rename(name),
637
627
  remove: () => remove(),
@@ -1,5 +1,5 @@
1
1
  import { type ReactElement } from 'react';
2
- import { type MdRuntimeClient } from '../client.js';
2
+ import type { MdRuntimeClient } from '../client.js';
3
3
  import type { ChatQuestion } from './questions.js';
4
4
  export declare function forgetAnswers(client: MdRuntimeClient, conversation: string, interaction?: string): Promise<void>;
5
5
  export type ChatQuestionCardProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAM5D,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoB9D,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAeD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAmHlF"}
1
+ {"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9D,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAeD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAmHlF"}