@agentshouse/mdruntime 0.1.0-cf890bb538119 → 0.1.0-cf9a84afc6def

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 (196) hide show
  1. package/README.md +10 -8
  2. package/dist/adapter.d.ts +59 -59
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +16 -8
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +142 -94
  13. package/dist/client.d.ts +8 -10
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +54 -8
  16. package/dist/collection.d.ts +5 -3
  17. package/dist/collection.d.ts.map +1 -1
  18. package/dist/collection.js +24 -19
  19. package/dist/compile.d.ts.map +1 -1
  20. package/dist/compile.js +95 -30
  21. package/dist/connection.d.ts +8 -8
  22. package/dist/connection.d.ts.map +1 -1
  23. package/dist/connection.js +1242 -1064
  24. package/dist/conversation.d.ts +12 -11
  25. package/dist/conversation.d.ts.map +1 -1
  26. package/dist/conversation.js +201 -131
  27. package/dist/durability.d.ts +1 -5
  28. package/dist/durability.d.ts.map +1 -1
  29. package/dist/durability.js +5 -0
  30. package/dist/entry.d.ts +1 -0
  31. package/dist/entry.d.ts.map +1 -1
  32. package/dist/entry.js +1 -1
  33. package/dist/file.d.ts +2 -11
  34. package/dist/file.d.ts.map +1 -1
  35. package/dist/file.js +6 -4
  36. package/dist/fulltext.d.ts.map +1 -1
  37. package/dist/fulltext.js +8 -6
  38. package/dist/host.d.ts +3 -4
  39. package/dist/host.d.ts.map +1 -1
  40. package/dist/host.js +40 -20
  41. package/dist/index.d.ts +10 -10
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -3
  44. package/dist/media.d.ts +8 -0
  45. package/dist/media.d.ts.map +1 -0
  46. package/dist/media.js +218 -0
  47. package/dist/memory.d.ts +8 -6
  48. package/dist/memory.d.ts.map +1 -1
  49. package/dist/memory.js +165 -96
  50. package/dist/model.d.ts +6 -1
  51. package/dist/model.d.ts.map +1 -1
  52. package/dist/model.js +7 -10
  53. package/dist/observation.d.ts +1 -0
  54. package/dist/observation.d.ts.map +1 -1
  55. package/dist/observation.js +1 -1
  56. package/dist/outcome.d.ts +13 -6
  57. package/dist/outcome.d.ts.map +1 -1
  58. package/dist/outcome.js +16 -5
  59. package/dist/overlay.js +1 -1
  60. package/dist/paths.d.ts +1 -0
  61. package/dist/paths.d.ts.map +1 -1
  62. package/dist/paths.js +4 -0
  63. package/dist/query.d.ts +6 -0
  64. package/dist/query.d.ts.map +1 -1
  65. package/dist/reach.d.ts +8 -3
  66. package/dist/reach.d.ts.map +1 -1
  67. package/dist/reach.js +66 -50
  68. package/dist/readiness.d.ts +13 -14
  69. package/dist/readiness.d.ts.map +1 -1
  70. package/dist/readiness.js +2 -8
  71. package/dist/recovery.d.ts +1 -0
  72. package/dist/recovery.d.ts.map +1 -1
  73. package/dist/recovery.js +26 -0
  74. package/dist/refresh.d.ts +9 -4
  75. package/dist/refresh.d.ts.map +1 -1
  76. package/dist/refresh.js +64 -30
  77. package/dist/replica.d.ts +5 -5
  78. package/dist/replica.d.ts.map +1 -1
  79. package/dist/replica.js +4 -7
  80. package/dist/room-draft.d.ts +18 -2
  81. package/dist/room-draft.d.ts.map +1 -1
  82. package/dist/room-draft.js +73 -6
  83. package/dist/rows.d.ts +15 -6
  84. package/dist/rows.d.ts.map +1 -1
  85. package/dist/rows.js +102 -74
  86. package/dist/save.d.ts +2 -0
  87. package/dist/save.d.ts.map +1 -1
  88. package/dist/save.js +13 -7
  89. package/dist/shared.d.ts +0 -1
  90. package/dist/shared.d.ts.map +1 -1
  91. package/dist/shared.js +0 -10
  92. package/dist/status.d.ts +4 -3
  93. package/dist/status.d.ts.map +1 -1
  94. package/dist/status.js +3 -1
  95. package/dist/store.d.ts +19 -26
  96. package/dist/store.d.ts.map +1 -1
  97. package/dist/store.js +26 -51
  98. package/dist/stored.d.ts +10 -18
  99. package/dist/stored.d.ts.map +1 -1
  100. package/dist/stored.js +209 -193
  101. package/dist/tables.d.ts +28 -35
  102. package/dist/tables.d.ts.map +1 -1
  103. package/dist/tables.js +58 -50
  104. package/dist/transfer.d.ts +0 -5
  105. package/dist/transfer.d.ts.map +1 -1
  106. package/dist/validation.d.ts +3 -4
  107. package/dist/validation.d.ts.map +1 -1
  108. package/dist/validation.js +35 -96
  109. package/dist/wire.d.ts +5 -9
  110. package/dist/wire.d.ts.map +1 -1
  111. package/dist/wire.js +2 -3
  112. package/dist/words.d.ts.map +1 -1
  113. package/dist/words.js +8 -2
  114. package/package.json +11 -18
  115. package/AGENTS.md +0 -319
  116. package/dist/chat/acts.d.ts +0 -33
  117. package/dist/chat/acts.d.ts.map +0 -1
  118. package/dist/chat/acts.js +0 -36
  119. package/dist/chat/context.d.ts +0 -3
  120. package/dist/chat/context.d.ts.map +0 -1
  121. package/dist/chat/context.js +0 -10
  122. package/dist/chat/earlier.d.ts +0 -10
  123. package/dist/chat/earlier.d.ts.map +0 -1
  124. package/dist/chat/earlier.js +0 -54
  125. package/dist/chat/house.d.ts +0 -25
  126. package/dist/chat/house.d.ts.map +0 -1
  127. package/dist/chat/house.js +0 -38
  128. package/dist/chat/input.d.ts +0 -11
  129. package/dist/chat/input.d.ts.map +0 -1
  130. package/dist/chat/input.js +0 -92
  131. package/dist/chat/kit.d.ts +0 -61
  132. package/dist/chat/kit.d.ts.map +0 -1
  133. package/dist/chat/kit.js +0 -123
  134. package/dist/chat/lasting.d.ts +0 -6
  135. package/dist/chat/lasting.d.ts.map +0 -1
  136. package/dist/chat/lasting.js +0 -19
  137. package/dist/chat/list.d.ts +0 -28
  138. package/dist/chat/list.d.ts.map +0 -1
  139. package/dist/chat/list.js +0 -103
  140. package/dist/chat/markdown.d.ts +0 -21
  141. package/dist/chat/markdown.d.ts.map +0 -1
  142. package/dist/chat/markdown.js +0 -246
  143. package/dist/chat/message.d.ts +0 -7
  144. package/dist/chat/message.d.ts.map +0 -1
  145. package/dist/chat/message.js +0 -254
  146. package/dist/chat/messages.d.ts +0 -35
  147. package/dist/chat/messages.d.ts.map +0 -1
  148. package/dist/chat/messages.js +0 -210
  149. package/dist/chat/name.d.ts +0 -7
  150. package/dist/chat/name.d.ts.map +0 -1
  151. package/dist/chat/name.js +0 -37
  152. package/dist/chat/opened.d.ts +0 -12
  153. package/dist/chat/opened.d.ts.map +0 -1
  154. package/dist/chat/opened.js +0 -19
  155. package/dist/chat/overlay.d.ts +0 -32
  156. package/dist/chat/overlay.d.ts.map +0 -1
  157. package/dist/chat/overlay.js +0 -103
  158. package/dist/chat/parts.d.ts +0 -58
  159. package/dist/chat/parts.d.ts.map +0 -1
  160. package/dist/chat/parts.js +0 -120
  161. package/dist/chat/pieces.d.ts +0 -62
  162. package/dist/chat/pieces.d.ts.map +0 -1
  163. package/dist/chat/pieces.js +0 -1110
  164. package/dist/chat/process.d.ts +0 -20
  165. package/dist/chat/process.d.ts.map +0 -1
  166. package/dist/chat/process.js +0 -32
  167. package/dist/chat/provider.d.ts +0 -70
  168. package/dist/chat/provider.d.ts.map +0 -1
  169. package/dist/chat/provider.js +0 -635
  170. package/dist/chat/question.d.ts +0 -9
  171. package/dist/chat/question.d.ts.map +0 -1
  172. package/dist/chat/question.js +0 -69
  173. package/dist/chat/questions.d.ts +0 -31
  174. package/dist/chat/questions.d.ts.map +0 -1
  175. package/dist/chat/questions.js +0 -111
  176. package/dist/chat/read.d.ts +0 -5
  177. package/dist/chat/read.d.ts.map +0 -1
  178. package/dist/chat/read.js +0 -13
  179. package/dist/chat/ready.d.ts +0 -37
  180. package/dist/chat/ready.d.ts.map +0 -1
  181. package/dist/chat/ready.js +0 -93
  182. package/dist/chat/room-file.d.ts +0 -8
  183. package/dist/chat/room-file.d.ts.map +0 -1
  184. package/dist/chat/room-file.js +0 -72
  185. package/dist/chat/steady.d.ts +0 -3
  186. package/dist/chat/steady.d.ts.map +0 -1
  187. package/dist/chat/steady.js +0 -26
  188. package/dist/chat/style.d.ts +0 -4
  189. package/dist/chat/style.d.ts.map +0 -1
  190. package/dist/chat/style.js +0 -307
  191. package/dist/chat.d.ts +0 -15
  192. package/dist/chat.d.ts.map +0 -1
  193. package/dist/chat.js +0 -8
  194. package/dist/reads.d.ts +0 -11
  195. package/dist/reads.d.ts.map +0 -1
  196. package/dist/reads.js +0 -98
@@ -1,9 +1,7 @@
1
- import type { ConversationAction, ConversationAgents, ConversationEvent, ConversationMessage, ConversationStream, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
1
+ import type { ConversationAction, ConversationEvent, ConversationHistoryRequest, ConversationMessage, ConversationStream, ListedConversation, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
2
2
  import { type ChangeSet } from './change-set.js';
3
- import { type ChosenFile } from './file.js';
4
3
  import type { Open } from './open.js';
5
4
  import { type CallResult, type Offline } from './outcome.js';
6
- import type { DocumentResult, PendingResult } from './query.js';
7
5
  import type { CycleProgress } from './status.js';
8
6
  import type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';
9
7
  export type ConversationState = Open<'working' | 'asking' | 'idle'>;
@@ -11,7 +9,7 @@ export type ConversationEntry = {
11
9
  conversation: string;
12
10
  agent: {
13
11
  identity: string;
14
- name: string | null;
12
+ name: string;
15
13
  };
16
14
  name: string;
17
15
  created: string;
@@ -65,26 +63,28 @@ export type ConversationSurface = {
65
63
  read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
66
64
  create(input: unknown): Promise<CallResult>;
67
65
  send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
68
- attach(room: string, file: ChosenFile): Promise<CallResult | Offline>;
69
- answer(conversation: string, answer: unknown): Promise<CallResult>;
66
+ answer(conversation: string, answer: ConversationAnswer): Promise<CallResult>;
70
67
  interrupt(conversation: string): Promise<CallResult>;
71
68
  kill(conversation: string): Promise<CallResult>;
72
- cancel(conversation: string, turn: string): Promise<CallResult>;
73
69
  delete(conversation: string): Promise<CallResult>;
74
70
  };
71
+ export type ConversationAnswer = {
72
+ interaction_id: string;
73
+ response: unknown;
74
+ };
75
75
  export type ChatDraftSurface = {
76
76
  write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
77
77
  prepend(conversation: string, draft: ChatDraft): Promise<void>;
78
78
  discard(conversation: string): Promise<void>;
79
79
  };
80
80
  export type ConversationDependencies = {
81
- agents(): ConversationAgents | undefined;
82
- documents(agents: ConversationAgents, after: string | undefined): Promise<DocumentResult | PendingResult>;
83
81
  call(name: ConversationAction, input: unknown): Promise<CallResult>;
82
+ history(request: ConversationHistoryRequest): Promise<CallResult>;
84
83
  durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
85
84
  stream(): ConversationStream | undefined;
86
85
  publish(set: ChangeSet): void;
87
86
  online(): boolean;
87
+ full(): boolean;
88
88
  closed(): boolean;
89
89
  unanswered(): void;
90
90
  expired(operation: string): boolean;
@@ -92,13 +92,13 @@ export type ConversationDependencies = {
92
92
  export type ConversationStore = {
93
93
  surface: ConversationSurface;
94
94
  chatDraft: ChatDraftSurface;
95
- hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;
95
+ hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[], list: readonly ListedConversation[] | null): void;
96
96
  reconcile(): Promise<void>;
97
97
  catchUp(progress: CycleProgress): Promise<void>;
98
98
  resend(progress: CycleProgress): Promise<void>;
99
99
  current(): boolean;
100
100
  known(): boolean;
101
- reconnected(): void;
101
+ learned(): void;
102
102
  reopened(): void;
103
103
  lost(): void;
104
104
  watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
@@ -112,6 +112,7 @@ export type ConversationStore = {
112
112
  };
113
113
  export declare function unheldView(conversation: string): ConversationView;
114
114
  export declare const SESSION_STARTED = "Session started";
115
+ export declare const HISTORY_CONVERSATIONS = 64;
115
116
  export declare function newChat(agent: string): string;
116
117
  export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
117
118
  //# sourceMappingURL=conversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EAEjB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAElB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,WAAW,EAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlG,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE,CAAC,SAAS,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IACjG,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9E,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpE,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,IAAI,OAAO,CAAC;IAChB,MAAM,IAAI,OAAO,CAAC;IAClB,UAAU,IAAI,IAAI,CAAC;IACnB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CACL,IAAI,EAAE,SAAS,gBAAgB,EAAE,EACjC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,GACzC,IAAI,CAAC;IACR,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,OAAO,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC;IACjB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CACH,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GACxC,MAAM,IAAI,CAAC;IACd,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChF,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACjF,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAC3C,UAAU,IAAI,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAyCF,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAcjE;AAED,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAIjD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAoQD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CA66BzF"}
@@ -1,8 +1,9 @@
1
1
  import { conversationChangeSet } from './change-set.js';
2
2
  import { runtimeError } from './failure.js';
3
- import { declaredFile } from './file.js';
3
+ import { refusedForSpace } from './durability.js';
4
4
  import { changeBatchIdentity, chatDraftRevision } from './identity.js';
5
5
  import { OFFLINE } from './outcome.js';
6
+ import { untilAnswered } from './recovery.js';
6
7
  import { capped, cursorOf, decodedCursor, FROM_START, messageOrder, precedes } from './windows.js';
7
8
  const QUIET = {
8
9
  turn: null,
@@ -40,6 +41,7 @@ export function unheldView(conversation) {
40
41
  }
41
42
  export const SESSION_STARTED = 'Session started';
42
43
  const NEW_CHAT = 'new:';
44
+ export const HISTORY_CONVERSATIONS = 64;
43
45
  export function newChat(agent) {
44
46
  return `${NEW_CHAT}${agent}`;
45
47
  }
@@ -209,6 +211,12 @@ function askedOf(options) {
209
211
  return { limit: capped(limit), after, before: beforeOf(after), total: total === true };
210
212
  }
211
213
  const EXPIRED = { kind: 'rejected', code: 'expired', fields: {}, retryable: false };
214
+ const DURABLE_WRITE = {
215
+ kind: 'rejected',
216
+ code: 'durable-write',
217
+ fields: {},
218
+ retryable: true,
219
+ };
212
220
  function unwritten(draft) {
213
221
  return draft.text === '';
214
222
  }
@@ -250,11 +258,15 @@ export function createConversationStore(deps) {
250
258
  const listing = new Map();
251
259
  const creations = new Set();
252
260
  const listWatchers = new Set();
261
+ const unlisted = new Set();
253
262
  let listKnown = false;
263
+ let listHeld = false;
264
+ let listKept = false;
254
265
  const agentWatchers = new Set();
255
- let agentNames = new Map();
256
- let retiredAgents = new Set();
257
- let agentsRead = null;
266
+ const unnamed = new Set();
267
+ let agentsShown = null;
268
+ let listedAgents = null;
269
+ let agentsReading = false;
258
270
  let replicated = new Set();
259
271
  let handedReplicated;
260
272
  function liveOf(conversation) {
@@ -333,7 +345,7 @@ export function createConversationStore(deps) {
333
345
  function entries() {
334
346
  return [...listing.values()].map((entry) => ({
335
347
  conversation: entry.conversation,
336
- agent: { identity: entry.agent, name: agentNames.get(entry.agent) ?? null },
348
+ agent: { identity: entry.agent, name: entry.agentName },
337
349
  name: entry.name,
338
350
  created: entry.created,
339
351
  finished: entry.finished,
@@ -343,25 +355,90 @@ export function createConversationStore(deps) {
343
355
  started: lives.get(entry.conversation)?.turn?.started ?? null,
344
356
  }));
345
357
  }
358
+ function keepList() {
359
+ if (!listKnown || listKept)
360
+ return;
361
+ listKept = true;
362
+ queueMicrotask(() => {
363
+ listKept = false;
364
+ if (deps.closed())
365
+ return;
366
+ const entries = [...listing.values()];
367
+ void deps.durably((local) => local.fact('conversationList', entries)).catch(() => { });
368
+ });
369
+ }
346
370
  function emitList() {
347
- if (deps.closed() || listWatchers.size === 0)
371
+ if (deps.closed())
348
372
  return;
349
- const value = entries();
350
- for (const watcher of listWatchers)
351
- watcher(value);
373
+ if (listWatchers.size > 0) {
374
+ const value = entries();
375
+ for (const watcher of listWatchers)
376
+ watcher(value);
377
+ }
378
+ emitAgents();
379
+ learned();
380
+ }
381
+ function learned() {
382
+ if (deps.closed())
383
+ return;
384
+ if (!listKnown && !listHeld && deps.stream() !== undefined && deps.online())
385
+ return;
386
+ if (unlisted.size > 0) {
387
+ const value = entries();
388
+ for (const watcher of [...unlisted]) {
389
+ unlisted.delete(watcher);
390
+ listWatchers.add(watcher);
391
+ watcher(value);
392
+ }
393
+ }
394
+ if (unnamed.size > 0) {
395
+ const value = agents();
396
+ for (const watcher of [...unnamed]) {
397
+ unnamed.delete(watcher);
398
+ agentWatchers.add(watcher);
399
+ watcher(value);
400
+ }
401
+ }
352
402
  }
353
403
  function agents() {
354
- return [...agentNames]
355
- .filter(([identity]) => !retiredAgents.has(identity))
356
- .map(([identity, name]) => ({ identity, name }))
404
+ const named = new Map();
405
+ for (const agent of listedAgents ?? [])
406
+ named.set(agent.agent, agent);
407
+ for (const entry of listing.values()) {
408
+ named.set(entry.agent, { name: entry.agentName, retired: entry.agentRetired });
409
+ }
410
+ return [...named]
411
+ .filter(([, agent]) => !agent.retired)
412
+ .map(([identity, agent]) => ({ identity, name: agent.name }))
357
413
  .sort((left, right) => left.name === right.name
358
414
  ? left.identity.localeCompare(right.identity)
359
415
  : left.name.localeCompare(right.name));
360
416
  }
417
+ function readAgents() {
418
+ const stream = deps.stream();
419
+ if (stream?.agents === undefined || !deps.online() || agentsReading)
420
+ return;
421
+ agentsReading = true;
422
+ void stream
423
+ .agents()
424
+ .then((read) => {
425
+ if (read === null)
426
+ return;
427
+ listedAgents = read;
428
+ emitAgents();
429
+ }, () => { })
430
+ .finally(() => {
431
+ agentsReading = false;
432
+ });
433
+ }
361
434
  function emitAgents() {
362
435
  if (deps.closed() || agentWatchers.size === 0)
363
436
  return;
364
437
  const value = agents();
438
+ const shown = JSON.stringify(value);
439
+ if (shown === agentsShown)
440
+ return;
441
+ agentsShown = shown;
365
442
  for (const watcher of agentWatchers)
366
443
  watcher(value);
367
444
  }
@@ -377,55 +454,11 @@ export function createConversationStore(deps) {
377
454
  if (stateOf(conversation) !== before || next?.turn?.started !== began)
378
455
  emitList();
379
456
  }
380
- async function readAgents() {
381
- const declaration = deps.agents();
382
- if (declaration === undefined)
383
- return;
384
- const names = new Map();
385
- const retired = new Set();
386
- let covered = null;
387
- for (let after;;) {
388
- const read = await deps.documents(declaration, after);
389
- if ('pending' in read)
390
- return;
391
- const coverage = JSON.stringify(read.coverage);
392
- if (covered !== null && coverage !== covered)
393
- return readAgents();
394
- covered = coverage;
395
- for (const document of read.documents) {
396
- const identity = document.fields?.[declaration.identity];
397
- const name = document.fields?.[declaration.name];
398
- if (typeof identity !== 'string' || typeof name !== 'string')
399
- continue;
400
- names.set(identity, name);
401
- const ended = declaration.retired === undefined ? null : document.fields?.[declaration.retired];
402
- if (ended !== undefined && ended !== null)
403
- retired.add(identity);
404
- }
405
- if (read.next === undefined)
406
- break;
407
- after = read.next;
408
- }
409
- const named = JSON.stringify([...names]) !== JSON.stringify([...agentNames]);
410
- if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents]))
411
- return;
412
- agentNames = names;
413
- retiredAgents = retired;
414
- if (named)
415
- emitList();
416
- emitAgents();
417
- const ended = [...drafts.keys()].filter(retiredChat);
418
- if (ended.length > 0)
419
- await remove(ended);
420
- }
421
457
  function retiredChat(conversation) {
422
- return (conversation.startsWith(NEW_CHAT) && retiredAgents.has(conversation.slice(NEW_CHAT.length)));
423
- }
424
- function agentsReady() {
425
- agentsRead ??= readAgents().catch(() => {
426
- agentsRead = null;
427
- });
428
- return agentsRead;
458
+ if (!conversation.startsWith(NEW_CHAT))
459
+ return false;
460
+ const agent = conversation.slice(NEW_CHAT.length);
461
+ return [...listing.values()].some((entry) => entry.agent === agent && entry.agentRetired);
429
462
  }
430
463
  function live(conversation, change) {
431
464
  const owed = unsent.get(conversation);
@@ -501,6 +534,20 @@ export function createConversationStore(deps) {
501
534
  deps.publish(conversationChangeSet(changed));
502
535
  });
503
536
  }
537
+ function missed(conversation) {
538
+ const read = reads.get(conversation);
539
+ const newest = listing.get(conversation)?.newest;
540
+ return (read === undefined ||
541
+ newest === undefined ||
542
+ partials.has(conversation) ||
543
+ (newest !== null && (read === null || newest > read)));
544
+ }
545
+ function noted(conversation, message) {
546
+ const entry = listing.get(conversation);
547
+ if (entry === undefined || (entry.newest !== null && entry.newest >= message.position))
548
+ return;
549
+ listing.set(conversation, { ...entry, newest: message.position });
550
+ }
504
551
  function gap(conversation) {
505
552
  gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);
506
553
  behind.add(conversation);
@@ -529,12 +576,13 @@ export function createConversationStore(deps) {
529
576
  }
530
577
  async function readHistories(conversations, ended) {
531
578
  const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));
532
- let asking = conversations.map((conversation) => ({
579
+ let waiting = conversations.map((conversation) => ({
533
580
  conversation,
534
581
  after: reads.get(conversation) ?? undefined,
535
582
  }));
536
- while (asking.length > 0) {
537
- const result = await deps.call('conversation.history', {
583
+ while (waiting.length > 0) {
584
+ const asking = waiting.slice(0, HISTORY_CONVERSATIONS);
585
+ const result = await deps.history({
538
586
  conversations: asking.map(({ conversation, after }) => ({
539
587
  conversation,
540
588
  ...(after === undefined ? {} : { after }),
@@ -557,7 +605,7 @@ export function createConversationStore(deps) {
557
605
  if (!following.some((next) => next.conversation === conversation))
558
606
  ended(conversation);
559
607
  }
560
- asking = following;
608
+ waiting = [...waiting.slice(HISTORY_CONVERSATIONS), ...following];
561
609
  }
562
610
  return null;
563
611
  }
@@ -648,8 +696,16 @@ export function createConversationStore(deps) {
648
696
  const arriving = acceptedMessage(event.message);
649
697
  if (arriving === null)
650
698
  return;
699
+ noted(conversation, arriving);
651
700
  if (replicated.has(conversation)) {
652
- void keep(conversation, arriving).catch(() => { });
701
+ if (deps.full()) {
702
+ gap(conversation);
703
+ return;
704
+ }
705
+ void keep(conversation, arriving).catch((error) => {
706
+ if (refusedForSpace(error))
707
+ gap(conversation);
708
+ });
653
709
  return;
654
710
  }
655
711
  if (sealTurns(conversation, new Set([arriving.turn])))
@@ -734,20 +790,21 @@ export function createConversationStore(deps) {
734
790
  });
735
791
  }
736
792
  async function dispatched(conversation, submission) {
737
- const dispatch = {};
793
+ const dispatch = { answered: false };
738
794
  sending.set(submission.operation, dispatch);
739
795
  try {
740
- const result = await invoke('conversation.send', conversation, {
741
- text: submission.text,
796
+ const result = await invoke('conversations/send', conversation, {
742
797
  operation_id: submission.operation,
798
+ text: submission.text,
743
799
  });
800
+ dispatch.answered = result.kind !== 'transport-uncertainty';
744
801
  if (result.kind === 'revoked-authorization')
745
802
  return result;
746
803
  if (result.kind !== 'action' && result.retryable) {
747
804
  deps.unanswered();
748
805
  return result;
749
806
  }
750
- const turn = answered(result, 'turn');
807
+ const turn = answered(result, 'message_id');
751
808
  await withDraft(conversation, async (current, local) => {
752
809
  const held = current?.submitted?.find((one) => one.operation === submission.operation);
753
810
  if (current === undefined || held === undefined || held.turn !== null)
@@ -767,13 +824,20 @@ export function createConversationStore(deps) {
767
824
  sending.delete(submission.operation);
768
825
  }
769
826
  }
770
- function invoke(name, conversation, extra = {}) {
771
- return deps.call(name, { conversation, ...extra });
827
+ function invoke(name, conversation, extra = { operation_id: changeBatchIdentity() }) {
828
+ return deps.call(name, { conversation_id: conversation, ...extra });
772
829
  }
773
830
  const surface = {
774
- async list() {
775
- await agentsReady();
776
- return entries();
831
+ list() {
832
+ return new Promise((settle) => {
833
+ const answer = (listed) => {
834
+ unlisted.delete(answer);
835
+ listWatchers.delete(answer);
836
+ settle(listed);
837
+ };
838
+ unlisted.add(answer);
839
+ learned();
840
+ });
777
841
  },
778
842
  async read(conversation, options = {}) {
779
843
  const asked = askedOf(options);
@@ -784,8 +848,8 @@ export function createConversationStore(deps) {
784
848
  });
785
849
  },
786
850
  async create(input) {
787
- const result = await deps.call('conversation.create', input);
788
- const conversation = answered(result, 'conversation');
851
+ const result = await deps.call('conversations/create', input);
852
+ const conversation = answered(result, 'conversation_id');
789
853
  if (conversation === null)
790
854
  return result;
791
855
  if (!listing.has(conversation))
@@ -796,8 +860,17 @@ export function createConversationStore(deps) {
796
860
  return result;
797
861
  },
798
862
  async send(conversation, operation = changeBatchIdentity(), draft) {
863
+ if (deps.full())
864
+ return DURABLE_WRITE;
799
865
  if (deps.online()) {
800
- const { submission, earlier } = await submitted(conversation, operation, draft);
866
+ const held = await submitted(conversation, operation, draft).catch((error) => {
867
+ if (refusedForSpace(error))
868
+ return null;
869
+ throw error;
870
+ });
871
+ if (held === null)
872
+ return DURABLE_WRITE;
873
+ const { submission, earlier } = held;
801
874
  if (!earlier || !deps.expired(operation))
802
875
  return dispatched(conversation, submission);
803
876
  await forgotten(conversation, submission);
@@ -810,38 +883,20 @@ export function createConversationStore(deps) {
810
883
  }
811
884
  return OFFLINE;
812
885
  },
813
- async attach(room, file) {
814
- if (!deps.online())
815
- return OFFLINE;
816
- return deps.call('conversation.attach', {
817
- room,
818
- ...(await declaredFile(file)),
819
- blob: file.blob,
820
- });
821
- },
822
886
  answer(conversation, answer) {
823
- return invoke('conversation.answer', conversation, { answer });
887
+ return invoke('conversations/interaction/answer', conversation, {
888
+ operation_id: changeBatchIdentity(),
889
+ ...answer,
890
+ });
824
891
  },
825
892
  interrupt(conversation) {
826
- return invoke('conversation.interrupt', conversation);
893
+ return invoke('conversations/interrupt', conversation);
827
894
  },
828
895
  kill(conversation) {
829
- return invoke('conversation.kill', conversation);
830
- },
831
- async cancel(conversation, turn) {
832
- const result = await invoke('conversation.cancel', conversation, { turn });
833
- if (result.kind !== 'action')
834
- return result;
835
- await withDraft(conversation, (current) => {
836
- const held = current?.submitted?.find((one) => one.turn === turn);
837
- if (current === undefined || held === undefined)
838
- return undefined;
839
- return returned(current, held, current.submitted.filter((one) => one !== held));
840
- });
841
- return result;
896
+ return invoke('conversations/kill', conversation);
842
897
  },
843
898
  delete(conversation) {
844
- return invoke('conversation.delete', conversation);
899
+ return invoke('conversations/delete', conversation);
845
900
  },
846
901
  };
847
902
  const chatDraft = {
@@ -870,7 +925,13 @@ export function createConversationStore(deps) {
870
925
  return {
871
926
  surface,
872
927
  chatDraft,
873
- hydrate(held, kept) {
928
+ hydrate(held, kept, list) {
929
+ if (list !== null && !listKnown) {
930
+ listing.clear();
931
+ for (const entry of list)
932
+ listing.set(entry.conversation, { ...entry });
933
+ listHeld = true;
934
+ }
874
935
  stored.clear();
875
936
  reads.clear();
876
937
  partials.clear();
@@ -884,6 +945,8 @@ export function createConversationStore(deps) {
884
945
  drafts.clear();
885
946
  for (const record of kept)
886
947
  drafts.set(record.conversation, record);
948
+ if (listHeld)
949
+ learned();
887
950
  },
888
951
  async reconcile() {
889
952
  if (!listKnown)
@@ -895,7 +958,7 @@ export function createConversationStore(deps) {
895
958
  !creations.has(conversation) &&
896
959
  (!conversation.startsWith(NEW_CHAT) || retiredChat(conversation)));
897
960
  for (const conversation of named) {
898
- if (!replicated.has(conversation))
961
+ if (!replicated.has(conversation) && missed(conversation))
899
962
  behind.add(conversation);
900
963
  }
901
964
  replicated = named;
@@ -904,6 +967,11 @@ export function createConversationStore(deps) {
904
967
  await remove(leaving);
905
968
  },
906
969
  async catchUp(progress) {
970
+ if (deps.full()) {
971
+ if (behind.size > 0)
972
+ progress.complete = false;
973
+ return;
974
+ }
907
975
  const owed = (conversation) => behind.has(conversation) && replicated.has(conversation);
908
976
  const read = async (conversations) => {
909
977
  if (conversations.length === 0 || deps.closed())
@@ -952,12 +1020,10 @@ export function createConversationStore(deps) {
952
1020
  known() {
953
1021
  return listKnown;
954
1022
  },
955
- reconnected() {
956
- for (const conversation of replicated)
957
- gap(conversation);
958
- },
959
1023
  reopened() {
960
- sending.clear();
1024
+ for (const [operation, dispatch] of sending)
1025
+ if (!dispatch.answered)
1026
+ sending.delete(operation);
961
1027
  },
962
1028
  lost() {
963
1029
  catching.clear();
@@ -976,15 +1042,15 @@ export function createConversationStore(deps) {
976
1042
  views.set(key, view);
977
1043
  const watcher = { notify: deliver, ready: false };
978
1044
  view.watchers.add(watcher);
979
- void deps
980
- .durably(async (local) => {
1045
+ const reading = new AbortController();
1046
+ void untilAnswered(() => deps.durably(async (local) => {
981
1047
  if (view.window !== null)
982
1048
  return;
983
1049
  const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
984
1050
  view.window = messages;
985
1051
  view.more = more;
986
1052
  view.total = asked.total ? await local.messageCount(conversation) : null;
987
- })
1053
+ }), reading.signal)
988
1054
  .then(() => {
989
1055
  if (deps.closed() || !view.watchers.has(watcher))
990
1056
  return;
@@ -994,6 +1060,7 @@ export function createConversationStore(deps) {
994
1060
  })
995
1061
  .catch(() => { });
996
1062
  return () => {
1063
+ reading.abort();
997
1064
  if (!view.watchers.delete(watcher))
998
1065
  return;
999
1066
  if (view.watchers.size === 0)
@@ -1001,35 +1068,26 @@ export function createConversationStore(deps) {
1001
1068
  };
1002
1069
  },
1003
1070
  watchList(deliver) {
1004
- listWatchers.add(deliver);
1005
- void agentsReady().then(() => {
1006
- if (!deps.closed() && listWatchers.has(deliver))
1007
- deliver(entries());
1008
- });
1071
+ unlisted.add(deliver);
1072
+ learned();
1009
1073
  return () => {
1074
+ unlisted.delete(deliver);
1010
1075
  listWatchers.delete(deliver);
1011
1076
  };
1012
1077
  },
1013
1078
  watchAgents(deliver) {
1014
- agentWatchers.add(deliver);
1015
- void agentsReady().then(() => {
1016
- if (!deps.closed() && agentWatchers.has(deliver))
1017
- deliver(agents());
1018
- });
1079
+ unnamed.add(deliver);
1080
+ learned();
1081
+ readAgents();
1019
1082
  return () => {
1083
+ unnamed.delete(deliver);
1020
1084
  agentWatchers.delete(deliver);
1021
1085
  };
1022
1086
  },
1087
+ learned,
1023
1088
  changed(set) {
1024
1089
  for (const conversation of set.conversations)
1025
1090
  emit(conversation);
1026
- const declaration = deps.agents();
1027
- if (declaration !== undefined &&
1028
- set.documents.some((change) => change.locator === declaration.locator)) {
1029
- agentsRead = readAgents().catch(() => {
1030
- agentsRead = null;
1031
- });
1032
- }
1033
1091
  },
1034
1092
  receive(event) {
1035
1093
  if (deps.closed())
@@ -1042,6 +1100,14 @@ export function createConversationStore(deps) {
1042
1100
  creations.delete(entry.conversation);
1043
1101
  }
1044
1102
  listKnown = true;
1103
+ for (const conversation of replicated) {
1104
+ if (!listing.has(conversation))
1105
+ continue;
1106
+ if (!missed(conversation))
1107
+ behind.delete(conversation);
1108
+ else if (!behind.has(conversation))
1109
+ gap(conversation);
1110
+ }
1045
1111
  openingEnded();
1046
1112
  }
1047
1113
  else if (event.kind === 'listed') {
@@ -1051,11 +1117,13 @@ export function createConversationStore(deps) {
1051
1117
  else {
1052
1118
  listing.delete(event.conversation);
1053
1119
  }
1120
+ keepList();
1054
1121
  emitList();
1055
- return (event.kind !== 'list' &&
1122
+ return ((event.kind !== 'list' &&
1056
1123
  listKnown &&
1057
1124
  (listing.size !== replicated.size ||
1058
- [...listing.keys()].some((conversation) => !replicated.has(conversation))));
1125
+ [...listing.keys()].some((conversation) => !replicated.has(conversation)))) ||
1126
+ (listKnown && [...drafts.keys()].some(retiredChat)));
1059
1127
  }
1060
1128
  heard(event);
1061
1129
  return false;
@@ -1071,7 +1139,9 @@ export function createConversationStore(deps) {
1071
1139
  lives.clear();
1072
1140
  unsent.clear();
1073
1141
  listWatchers.clear();
1142
+ unlisted.clear();
1074
1143
  agentWatchers.clear();
1144
+ unnamed.clear();
1075
1145
  },
1076
1146
  };
1077
1147
  }