memeloop 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/README.md +63 -0
  2. package/dist/browser.cjs +1413 -0
  3. package/dist/browser.cjs.map +1 -0
  4. package/dist/browser.d.cts +3066 -0
  5. package/dist/browser.d.ts +3066 -0
  6. package/dist/browser.js +43 -0
  7. package/dist/chunk-426CJUZP.js +630 -0
  8. package/dist/chunk-426CJUZP.js.map +1 -0
  9. package/dist/chunk-44YHBKDL.js +382 -0
  10. package/dist/chunk-44YHBKDL.js.map +1 -0
  11. package/dist/chunk-7ZDTB4VZ.js +63 -0
  12. package/dist/chunk-7ZDTB4VZ.js.map +1 -0
  13. package/dist/chunk-AZFYDWIN.js +98 -0
  14. package/dist/chunk-AZFYDWIN.js.map +1 -0
  15. package/dist/chunk-BGPU4RR7.js +367 -0
  16. package/dist/chunk-BGPU4RR7.js.map +1 -0
  17. package/dist/chunk-CCEFAOSH.js +496 -0
  18. package/dist/chunk-CCEFAOSH.js.map +1 -0
  19. package/dist/chunk-FWSY5HOA.js +63 -0
  20. package/dist/chunk-FWSY5HOA.js.map +1 -0
  21. package/dist/chunk-GYIOMQMY.js +8726 -0
  22. package/dist/chunk-GYIOMQMY.js.map +1 -0
  23. package/dist/chunk-HVB2BR3H.js +42 -0
  24. package/dist/chunk-HVB2BR3H.js.map +1 -0
  25. package/dist/chunk-K6P63KD4.js +68 -0
  26. package/dist/chunk-K6P63KD4.js.map +1 -0
  27. package/dist/chunk-MRKY4HGF.js +205 -0
  28. package/dist/chunk-MRKY4HGF.js.map +1 -0
  29. package/dist/chunk-QFHAAIIM.js +2657 -0
  30. package/dist/chunk-QFHAAIIM.js.map +1 -0
  31. package/dist/chunk-VZKQX5PP.js +1 -0
  32. package/dist/chunk-VZKQX5PP.js.map +1 -0
  33. package/dist/chunk-WAI6BODI.js +175 -0
  34. package/dist/chunk-WAI6BODI.js.map +1 -0
  35. package/dist/chunk-XHRBV6I3.js +3637 -0
  36. package/dist/chunk-XHRBV6I3.js.map +1 -0
  37. package/dist/chunk-YMNXDNDW.js +798 -0
  38. package/dist/chunk-YMNXDNDW.js.map +1 -0
  39. package/dist/conversation.cjs +208 -0
  40. package/dist/conversation.cjs.map +1 -0
  41. package/dist/conversation.d.cts +100 -0
  42. package/dist/conversation.d.ts +100 -0
  43. package/dist/conversation.js +21 -0
  44. package/dist/conversation.js.map +1 -0
  45. package/dist/device-network-portable.cjs +702 -0
  46. package/dist/device-network-portable.cjs.map +1 -0
  47. package/dist/device-network-portable.d.cts +110 -0
  48. package/dist/device-network-portable.d.ts +110 -0
  49. package/dist/device-network-portable.js +53 -0
  50. package/dist/device-network-portable.js.map +1 -0
  51. package/dist/device-network.cjs +906 -0
  52. package/dist/device-network.cjs.map +1 -0
  53. package/dist/device-network.d.cts +6 -0
  54. package/dist/device-network.d.ts +6 -0
  55. package/dist/device-network.js +59 -0
  56. package/dist/device-network.js.map +1 -0
  57. package/dist/fetchProvider-BpcGVSOG.d.cts +91 -0
  58. package/dist/fetchProvider-Cm0sO4Tl.d.ts +91 -0
  59. package/dist/index.cjs +27957 -5459
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +94 -1320
  62. package/dist/index.d.ts +94 -1320
  63. package/dist/index.js +10576 -2386
  64. package/dist/index.js.map +1 -1
  65. package/dist/interface-IrKBFtL1.d.cts +493 -0
  66. package/dist/interface-IrKBFtL1.d.ts +493 -0
  67. package/dist/llm-providers.cjs +43 -8
  68. package/dist/llm-providers.cjs.map +1 -1
  69. package/dist/llm-providers.d.cts +2 -1
  70. package/dist/llm-providers.d.ts +2 -1
  71. package/dist/llm-providers.js +4 -2
  72. package/dist/llm-providers.js.map +1 -1
  73. package/dist/loop-api.cjs +5177 -2050
  74. package/dist/loop-api.cjs.map +1 -1
  75. package/dist/loop-api.d.cts +11 -5
  76. package/dist/loop-api.d.ts +11 -5
  77. package/dist/loop-api.js +84 -49
  78. package/dist/mobile.cjs +2625 -0
  79. package/dist/mobile.cjs.map +1 -0
  80. package/dist/mobile.d.cts +6 -0
  81. package/dist/mobile.d.ts +6 -0
  82. package/dist/mobile.js +22 -0
  83. package/dist/mobile.js.map +1 -0
  84. package/dist/orchestration-portable-Bsf8YRfp.d.cts +2192 -0
  85. package/dist/orchestration-portable-Zw0g5tbj.d.ts +2192 -0
  86. package/dist/orchestration-portable.cjs +9553 -0
  87. package/dist/orchestration-portable.cjs.map +1 -0
  88. package/dist/orchestration-portable.d.cts +5 -0
  89. package/dist/orchestration-portable.d.ts +5 -0
  90. package/dist/orchestration-portable.js +290 -0
  91. package/dist/orchestration-portable.js.map +1 -0
  92. package/dist/pairingInvite-BXPWY3aM.d.cts +149 -0
  93. package/dist/pairingInvite-Cuz0wuq9.d.ts +149 -0
  94. package/dist/promptConcat-WTN-uHcz.d.cts +516 -0
  95. package/dist/promptConcat-deDSWZE3.d.ts +516 -0
  96. package/dist/providerRegistry-9trr5aoK.d.ts +86 -0
  97. package/dist/providerRegistry-xk_B1Ekv.d.cts +86 -0
  98. package/dist/registry-8eztoD_r.d.cts +393 -0
  99. package/dist/registry-DV24sI-3.d.ts +393 -0
  100. package/dist/remoteClient-B_spK019.d.ts +87 -0
  101. package/dist/remoteClient-CBggnRy3.d.cts +87 -0
  102. package/dist/runtime-SKSXVYIM.js +18 -0
  103. package/dist/runtime-SKSXVYIM.js.map +1 -0
  104. package/dist/scriptDeploymentPipeline-BAeo1dPb.d.cts +2463 -0
  105. package/dist/scriptDeploymentPipeline-DsnT0AG6.d.ts +2463 -0
  106. package/dist/syncCloudDevices-BEqwgrhD.d.ts +49 -0
  107. package/dist/syncCloudDevices-Ds_Kcgrv.d.cts +49 -0
  108. package/dist/types-7pYti-k9.d.cts +255 -0
  109. package/dist/types-CdFVSntj.d.ts +255 -0
  110. package/package.json +110 -35
  111. package/dist/anthropic.cjs +0 -72
  112. package/dist/anthropic.cjs.map +0 -1
  113. package/dist/anthropic.d.cts +0 -21
  114. package/dist/anthropic.d.ts +0 -21
  115. package/dist/anthropic.js +0 -21
  116. package/dist/anthropic.js.map +0 -1
  117. package/dist/azure.cjs +0 -72
  118. package/dist/azure.cjs.map +0 -1
  119. package/dist/azure.d.cts +0 -21
  120. package/dist/azure.d.ts +0 -21
  121. package/dist/azure.js +0 -21
  122. package/dist/azure.js.map +0 -1
  123. package/dist/chunk-3CN7DFBL.js +0 -4894
  124. package/dist/chunk-3CN7DFBL.js.map +0 -1
  125. package/dist/chunk-4AZ4D7U5.js +0 -32
  126. package/dist/chunk-4AZ4D7U5.js.map +0 -1
  127. package/dist/chunk-6ON4XSOV.js +0 -63
  128. package/dist/chunk-6ON4XSOV.js.map +0 -1
  129. package/dist/chunk-DJQNGIXX.js +0 -4793
  130. package/dist/chunk-DJQNGIXX.js.map +0 -1
  131. package/dist/chunk-FKQP6AOQ.js +0 -32
  132. package/dist/chunk-FKQP6AOQ.js.map +0 -1
  133. package/dist/chunk-OVJ7JJBA.js +0 -35
  134. package/dist/chunk-OVJ7JJBA.js.map +0 -1
  135. package/dist/chunk-P4UZ7IXC.js +0 -42
  136. package/dist/chunk-YHJ2AEFR.js +0 -4933
  137. package/dist/chunk-YHJ2AEFR.js.map +0 -1
  138. package/dist/chunk-YVK7RYRO.js +0 -4973
  139. package/dist/chunk-YVK7RYRO.js.map +0 -1
  140. package/dist/code-assistant.json +0 -114
  141. package/dist/cohere.cjs +0 -72
  142. package/dist/cohere.cjs.map +0 -1
  143. package/dist/cohere.d.cts +0 -21
  144. package/dist/cohere.d.ts +0 -21
  145. package/dist/cohere.js +0 -21
  146. package/dist/cohere.js.map +0 -1
  147. package/dist/deepseek.cjs +0 -72
  148. package/dist/deepseek.cjs.map +0 -1
  149. package/dist/deepseek.d.cts +0 -21
  150. package/dist/deepseek.d.ts +0 -21
  151. package/dist/deepseek.js +0 -21
  152. package/dist/deepseek.js.map +0 -1
  153. package/dist/dist-65U7OYRG.js +0 -1257
  154. package/dist/dist-65U7OYRG.js.map +0 -1
  155. package/dist/fetchProvider-Cu4WkU5O.d.cts +0 -819
  156. package/dist/fetchProvider-Cu4WkU5O.d.ts +0 -819
  157. package/dist/frontend-ui-ux.json +0 -105
  158. package/dist/general-assistant.json +0 -95
  159. package/dist/git-master.json +0 -51
  160. package/dist/google-vertex.cjs +0 -72
  161. package/dist/google-vertex.cjs.map +0 -1
  162. package/dist/google-vertex.d.cts +0 -21
  163. package/dist/google-vertex.d.ts +0 -21
  164. package/dist/google-vertex.js +0 -21
  165. package/dist/google-vertex.js.map +0 -1
  166. package/dist/google.cjs +0 -72
  167. package/dist/google.cjs.map +0 -1
  168. package/dist/google.d.cts +0 -21
  169. package/dist/google.d.ts +0 -21
  170. package/dist/google.js +0 -21
  171. package/dist/google.js.map +0 -1
  172. package/dist/groq.cjs +0 -72
  173. package/dist/groq.cjs.map +0 -1
  174. package/dist/groq.d.cts +0 -21
  175. package/dist/groq.d.ts +0 -21
  176. package/dist/groq.js +0 -21
  177. package/dist/groq.js.map +0 -1
  178. package/dist/index.d.mts +0 -3203
  179. package/dist/index.mjs +0 -7064
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/mistral.cjs +0 -72
  182. package/dist/mistral.cjs.map +0 -1
  183. package/dist/mistral.d.cts +0 -21
  184. package/dist/mistral.d.ts +0 -21
  185. package/dist/mistral.js +0 -21
  186. package/dist/mistral.js.map +0 -1
  187. package/dist/multipart-parser-EJCXIUHC.js +0 -372
  188. package/dist/multipart-parser-EJCXIUHC.js.map +0 -1
  189. package/dist/openai.cjs +0 -72
  190. package/dist/openai.cjs.map +0 -1
  191. package/dist/openai.d.cts +0 -21
  192. package/dist/openai.d.ts +0 -21
  193. package/dist/openai.js +0 -21
  194. package/dist/openai.js.map +0 -1
  195. package/dist/perplexity.cjs +0 -72
  196. package/dist/perplexity.cjs.map +0 -1
  197. package/dist/perplexity.d.cts +0 -21
  198. package/dist/perplexity.d.ts +0 -21
  199. package/dist/perplexity.js +0 -21
  200. package/dist/perplexity.js.map +0 -1
  201. package/dist/playwright.json +0 -52
  202. package/dist/promptConcat-BJdazTg5.d.cts +0 -1832
  203. package/dist/promptConcat-BJdazTg5.d.ts +0 -1832
  204. package/dist/promptConcat-CAkpni_8.d.cts +0 -1834
  205. package/dist/promptConcat-CAkpni_8.d.ts +0 -1834
  206. package/dist/promptConcat-CfH5-GAE.d.cts +0 -1036
  207. package/dist/promptConcat-ChcAZOOL.d.ts +0 -1036
  208. package/dist/promptConcat-G5TnJVRy.d.cts +0 -1800
  209. package/dist/promptConcat-G5TnJVRy.d.ts +0 -1800
  210. package/dist/promptConcat-L72eowzp.d.ts +0 -1090
  211. package/dist/promptConcat-eLHdN7K8.d.cts +0 -1090
  212. package/dist/src-VTSXKG72.js +0 -1409
  213. package/dist/src-VTSXKG72.js.map +0 -1
  214. package/dist/togetherai.cjs +0 -72
  215. package/dist/togetherai.cjs.map +0 -1
  216. package/dist/togetherai.d.cts +0 -21
  217. package/dist/togetherai.d.ts +0 -21
  218. package/dist/togetherai.js +0 -21
  219. package/dist/togetherai.js.map +0 -1
  220. package/dist/types-B0Jm2l38.d.cts +0 -767
  221. package/dist/types-B0Jm2l38.d.ts +0 -767
  222. package/dist/xai.cjs +0 -72
  223. package/dist/xai.cjs.map +0 -1
  224. package/dist/xai.d.cts +0 -21
  225. package/dist/xai.d.ts +0 -21
  226. package/dist/xai.js +0 -21
  227. package/dist/xai.js.map +0 -1
  228. /package/dist/{chunk-P4UZ7IXC.js.map → browser.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/tiddlyWikiHttpStorage.ts","../src/agent-management/AgentSessionController.ts","../src/agent-management/AgentDefinitionEditorController.ts","../src/agent-management/AgentCreationController.ts","../src/agent-management/PromptPreviewController.ts"],"sourcesContent":["import type { AgentDefinition, AgentInstanceMeta } from '../agent/types.js';\nimport type { AttachmentReference, ChatMessage } from '../conversation/index.js';\nimport type { IMChannelBinding } from '../im/protocol.js';\nimport { OrchestrationError } from '../orchestration/errors.js';\nimport type { ConversationMeta } from '../sync/protocol.js';\n\nimport type { FullAgentStorage, GetMessagesOptions, ListConversationsOptions } from './ports.js';\n\n/**\n * TiddlyWiki HTTP storage driver (plan 24.44).\n *\n * Portable: depends only on an injectable `fetch` (browser and Node 18+).\n * Every tiddler write is a compare-and-swap: the driver reads the current\n * ETag, writes with `If-Match`, and retries a bounded number of times on\n * 412/409 before failing with CONFLICT. Blobs are stored inline as base64 up\n * to `maxInlineBlobBytes`; larger payloads are rejected with guidance to use\n * an external BlobStore, keeping tiddlers small.\n *\n * Credentials are materialized per request by a trusted resolver from an\n * opaque handle. Raw credentials never enter this portable driver.\n */\n\nexport interface TiddlyWikiCredentialResolver {\n resolveHeaders(handle: string, request: { url: string; method: string }): Promise<Record<string, string>>;\n}\n\nexport interface TiddlyWikiHttpStorageOptions {\n /** Wiki base URL, e.g. `http://localhost:8080`. */\n baseUrl: string;\n /** TiddlyWeb recipe (default `default`). */\n recipe?: string;\n /** Injectable fetch implementation. */\n fetchImpl?: typeof fetch;\n /** Opaque CredentialGrant handle and trusted materialization port. */\n credentialHandle?: string;\n credentialResolver?: TiddlyWikiCredentialResolver;\n /** Maximum inline blob size in bytes (default 256 KiB). */\n maxInlineBlobBytes?: number;\n /** CAS retry budget per write (default 3). */\n maxCasAttempts?: number;\n}\n\nconst PREFIX = '$:/memeloop';\nconst DEFAULT_MAX_INLINE_BLOB = 256 * 1024;\nconst DEFAULT_CAS_ATTEMPTS = 3;\n\ninterface Tiddler {\n title: string;\n text?: string;\n type?: string;\n revision?: string;\n fields?: Record<string, string>;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return bytes;\n}\n\nfunction escapeFilterValue(value: string): string {\n return value.replace(/[\"\\\\[\\]]/g, (character) => `\\\\${character}`);\n}\n\nexport class TiddlyWikiHttpStorage implements FullAgentStorage {\n private readonly baseUrl: string;\n private readonly recipe: string;\n private readonly fetchImpl: typeof fetch;\n private readonly credentialHandle?: string;\n private readonly credentialResolver?: TiddlyWikiCredentialResolver;\n private readonly maxInlineBlobBytes: number;\n private readonly maxCasAttempts: number;\n\n constructor(options: TiddlyWikiHttpStorageOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.recipe = options.recipe ?? 'default';\n this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.maxInlineBlobBytes = options.maxInlineBlobBytes ?? DEFAULT_MAX_INLINE_BLOB;\n this.maxCasAttempts = options.maxCasAttempts ?? DEFAULT_CAS_ATTEMPTS;\n if ((options.credentialHandle === undefined) !== (options.credentialResolver === undefined)) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: 'credentialHandle and credentialResolver must be provided together',\n retryable: false,\n });\n }\n this.credentialHandle = options.credentialHandle;\n this.credentialResolver = options.credentialResolver;\n }\n\n private eventTitle(conversationId: string, messageId: string): string {\n return `${PREFIX}/e/${conversationId}/${messageId}`;\n }\n\n private metaTitle(conversationId: string): string {\n return `${PREFIX}/meta/${conversationId}`;\n }\n\n private blobTitle(contentHash: string): string {\n return `${PREFIX}/blob/${contentHash}`;\n }\n\n private definitionTitle(id: string): string {\n return `${PREFIX}/def/${id}`;\n }\n\n private instanceTitle(id: string): string {\n return `${PREFIX}/inst/${id}`;\n }\n\n private imTitle(channelId: string, imUserId: string): string {\n return `${PREFIX}/im/${channelId}/${imUserId}`;\n }\n\n private tiddlerUrl(title: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers/${encodeURIComponent(title)}`;\n }\n\n private filterUrl(filter: string): string {\n return `${this.baseUrl}/recipes/${encodeURIComponent(this.recipe)}/tiddlers.json?filter=${encodeURIComponent(filter)}`;\n }\n\n private async headers(url: string, method: string, extra: Record<string, string> = {}): Promise<Record<string, string>> {\n const credentialHeaders = this.credentialHandle && this.credentialResolver\n ? await this.credentialResolver.resolveHeaders(this.credentialHandle, { url, method })\n : {};\n return {\n 'content-type': 'application/json',\n 'x-requested-with': 'TiddlyWiki',\n ...credentialHeaders,\n ...extra,\n };\n }\n\n /** GET a tiddler; returns null on 404. Includes the ETag when the server sends one. */\n private async readTiddler(title: string): Promise<{ tiddler: Tiddler; etag?: string } | null> {\n const url = this.tiddlerUrl(title);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (response.status === 404) return null;\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler read failed: HTTP ${response.status}`, retryable: true });\n }\n const tiddler = (await response.json()) as Tiddler;\n const etag = response.headers.get('etag') ?? undefined;\n return { tiddler, ...(etag ? { etag } : {}) };\n }\n\n /** CAS write: If-Match when an ETag is known; bounded retries on 412/409. */\n private async writeTiddler(title: string, build: (current: Tiddler | null) => Tiddler): Promise<void> {\n for (let attempt = 1; attempt <= this.maxCasAttempts; attempt += 1) {\n const current = await this.readTiddler(title);\n if (current && !current.etag) {\n throw new OrchestrationError({ code: 'CONFLICT', message: `tiddler '${title}' has no ETag for a safe update`, retryable: false });\n }\n const next = build(current?.tiddler ?? null);\n const url = this.tiddlerUrl(title);\n const precondition: Record<string, string> = current ? { 'if-match': current.etag! } : { 'if-none-match': '*' };\n const response = await this.fetchImpl(url, {\n method: 'PUT',\n headers: await this.headers(url, 'PUT', precondition),\n body: JSON.stringify(next),\n });\n if (response.ok) return;\n if (response.status === 412 || response.status === 409) {\n if (attempt === this.maxCasAttempts) {\n throw new OrchestrationError({\n code: 'CONFLICT',\n message: `tiddler '${title}' was modified concurrently after ${attempt} CAS attempts`,\n retryable: true,\n });\n }\n continue;\n }\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler write failed: HTTP ${response.status}`, retryable: true });\n }\n }\n\n private async listByPrefix(prefix: string): Promise<Tiddler[]> {\n const filter = `[prefix[\"${escapeFilterValue(prefix)}\"]]`;\n const url = this.filterUrl(filter);\n const response = await this.fetchImpl(url, { headers: await this.headers(url, 'GET') });\n if (!response.ok) {\n throw new OrchestrationError({ code: 'UNAVAILABLE', message: `tiddler list failed: HTTP ${response.status}`, retryable: true });\n }\n return (await response.json()) as Tiddler[];\n }\n\n private parsePayload(tiddler: Tiddler): unknown {\n return JSON.parse(tiddler.text ?? '{}');\n }\n\n async listConversations(options: ListConversationsOptions = {}): Promise<ConversationMeta[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/meta/`);\n const metas = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ConversationMeta);\n metas.sort((a, b) => (b.lastMessageTimestamp ?? 0) - (a.lastMessageTimestamp ?? 0));\n const offset = options.offset ?? 0;\n const limit = options.limit ?? metas.length;\n return metas.slice(offset, offset + limit);\n }\n\n async getMessages(conversationId: string, _options: GetMessagesOptions = {}): Promise<ChatMessage[]> {\n const tiddlers = await this.listByPrefix(`${PREFIX}/e/${conversationId}/`);\n const messages = tiddlers.map((tiddler) => this.parsePayload(tiddler) as ChatMessage);\n messages.sort((a, b) => (a.lamportClock ?? 0) - (b.lamportClock ?? 0));\n return messages;\n }\n\n async appendMessage(message: ChatMessage): Promise<void> {\n await this.writeTiddler(this.eventTitle(message.conversationId, message.messageId), () => ({\n title: this.eventTitle(message.conversationId, message.messageId),\n text: JSON.stringify(message),\n }));\n }\n\n async insertMessagesIfAbsent(messages: ChatMessage[]): Promise<void> {\n for (const message of messages) {\n const title = this.eventTitle(message.conversationId, message.messageId);\n const existing = await this.readTiddler(title);\n if (!existing) {\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(message) }));\n }\n }\n }\n\n async getMaxLamportClockForConversation(conversationId: string): Promise<number> {\n const messages = await this.getMessages(conversationId);\n return messages.reduce((max, message) => Math.max(max, message.lamportClock ?? 0), 0);\n }\n\n async upsertConversationMetadata(meta: ConversationMeta): Promise<void> {\n const title = this.metaTitle(meta.conversationId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getConversationMeta(conversationId: string): Promise<ConversationMeta | null> {\n const result = await this.readTiddler(this.metaTitle(conversationId));\n return result ? this.parsePayload(result.tiddler) as ConversationMeta : null;\n }\n\n async saveAttachment(reference: AttachmentReference, data: Uint8Array): Promise<void> {\n if (data.byteLength > this.maxInlineBlobBytes) {\n throw new OrchestrationError({\n code: 'INVALID',\n message: `blob of ${data.byteLength} bytes exceeds the inline limit ${this.maxInlineBlobBytes}; store it in an external BlobStore and keep the reference`,\n retryable: false,\n details: { maxInlineBlobBytes: this.maxInlineBlobBytes },\n });\n }\n const title = this.blobTitle(reference.contentHash);\n await this.writeTiddler(title, () => ({\n title,\n text: JSON.stringify({ reference, dataBase64: bytesToBase64(data) }),\n }));\n }\n\n async getAttachment(contentHash: string): Promise<AttachmentReference | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return (this.parsePayload(result.tiddler) as { reference: AttachmentReference }).reference;\n }\n\n async readAttachmentData(contentHash: string): Promise<Uint8Array | null> {\n const result = await this.readTiddler(this.blobTitle(contentHash));\n if (!result) return null;\n return base64ToBytes((this.parsePayload(result.tiddler) as { dataBase64: string }).dataBase64);\n }\n\n async getAgentDefinition(id: string): Promise<AgentDefinition | null> {\n const result = await this.readTiddler(this.definitionTitle(id));\n return result ? this.parsePayload(result.tiddler) as AgentDefinition : null;\n }\n\n async saveAgentDefinition(definition: AgentDefinition & { id: string }): Promise<void> {\n const title = this.definitionTitle(definition.id);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(definition) }));\n }\n\n async saveAgentInstance(meta: AgentInstanceMeta): Promise<void> {\n const title = this.instanceTitle(meta.instanceId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(meta) }));\n }\n\n async getImBinding(channelId: string, imUserId: string): Promise<IMChannelBinding | null> {\n const result = await this.readTiddler(this.imTitle(channelId, imUserId));\n return result ? this.parsePayload(result.tiddler) as IMChannelBinding : null;\n }\n\n async setImBinding(record: IMChannelBinding): Promise<void> {\n const title = this.imTitle(record.channelId, record.imUserId);\n await this.writeTiddler(title, () => ({ title, text: JSON.stringify(record) }));\n }\n}\n","/**\n * AgentSessionController — headless controller for an active agent conversation session.\n *\n * Manages agent runtime state, message sending, streaming, delete/retry turns,\n * and subscription to live agent updates.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentConversationClient, AgentInstanceClient, AgentRuntimeView, WikiTiddlerAttachment } from './types.js';\n\n/** Read-only snapshot of the session state. */\nexport interface AgentSessionSnapshot {\n agent: AgentRuntimeView | null;\n loading: boolean;\n error: Error | null;\n messages: ChatMessage[];\n orderedMessageIds: string[];\n streamingMessageIds: Set<string>;\n}\n\n/** Listener for snapshot changes. */\nexport type AgentSessionListener = (snapshot: AgentSessionSnapshot) => void;\n\n/** Options for creating an AgentSessionController. */\nexport interface AgentSessionControllerOptions {\n agentInstanceClient: AgentInstanceClient;\n conversationClient: AgentConversationClient;\n /** Polling interval in ms for agent status updates. Default 500. */\n pollInterval?: number;\n}\n\n/**\n * Headless controller for an agent conversation session.\n *\n * Call {@link start} to load an agent, then {@link subscribe} to receive snapshot\n * updates. Use {@link sendMessage}, {@link deleteTurn}, {@link retryTurn}, {@link cancel}\n * to drive the conversation.\n *\n * Host UI frameworks (React, Ink) subscribe via {@link subscribe} and render\n * the snapshot.\n */\nexport class AgentSessionController {\n private readonly options: Required<AgentSessionControllerOptions>;\n private listener: AgentSessionListener | null = null;\n private snapshot: AgentSessionSnapshot = {\n agent: null,\n loading: false,\n error: null,\n messages: [],\n orderedMessageIds: [],\n streamingMessageIds: new Set(),\n };\n private unsubAgentUpdates: (() => void) | null = null;\n private unsubMessages: (() => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private agentId: string | null = null;\n\n constructor(options: AgentSessionControllerOptions) {\n this.options = {\n pollInterval: 500,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /**\n * Start a session for the given agent ID.\n * Fetches the agent, subscribes to live updates, and loads messages.\n */\n async start(agentId: string): Promise<void> {\n this.agentId = agentId;\n this.emitPartial({ loading: true, error: null });\n\n try {\n const [agent, rawMessages] = await Promise.all([\n this.options.agentInstanceClient.fetchAgent(agentId),\n this.options.conversationClient.getMessages(agentId),\n ]);\n\n const orderedMessageIds = rawMessages.map((m) => m.messageId);\n const messagesMap = new Map<string, ChatMessage>();\n for (const m of rawMessages) messagesMap.set(m.messageId, m);\n\n this.emitPartial({\n agent,\n loading: false,\n messages: rawMessages,\n orderedMessageIds,\n streamingMessageIds: new Set(),\n });\n\n // Subscribe to live agent updates\n this.unsubAgentUpdates = this.options.agentInstanceClient.subscribeToUpdates(\n agentId,\n this.handleAgentUpdate,\n );\n\n // Subscribe to new messages\n this.unsubMessages = this.options.conversationClient.subscribeToMessages(\n agentId,\n this.handleNewMessage,\n );\n\n // Poll for status changes\n this.startPolling(agentId);\n } catch (error_) {\n this.emitPartial({\n loading: false,\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Stop the session and clean up subscriptions. */\n stop(): void {\n this.stopPolling();\n this.unsubAgentUpdates?.();\n this.unsubAgentUpdates = null;\n this.unsubMessages?.();\n this.unsubMessages = null;\n this.agentId = null;\n }\n\n // ── Actions ───────────────────────────────────────────────────\n\n /** Send a user message. */\n async sendMessage(\n content: string,\n file?: File,\n wikiTiddlers?: WikiTiddlerAttachment[],\n ): Promise<void> {\n if (!this.agentId) return;\n this.emitPartial({ error: null });\n try {\n await this.options.conversationClient.sendMessage(this.agentId, content, file, wikiTiddlers);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Cancel the current agent operation. */\n async cancel(): Promise<void> {\n if (!this.agentId) return;\n try {\n await this.options.agentInstanceClient.cancelAgent(this.agentId);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Delete a turn starting at the given user message ID. */\n async deleteTurn(userMessageId: string): Promise<string | undefined> {\n return this.options.conversationClient.deleteTurn(userMessageId);\n }\n\n /** Retry a turn starting at the given user message ID. */\n async retryTurn(userMessageId: string): Promise<void> {\n return this.options.conversationClient.retryTurn(userMessageId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe(listener: AgentSessionListener): () => void {\n this.listener = listener;\n // Immediately emit current state\n listener({ ...this.snapshot, streamingMessageIds: new Set(this.snapshot.streamingMessageIds) });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n /** Get current snapshot without subscribing. */\n getSnapshot(): AgentSessionSnapshot {\n return this.snapshot;\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n private emitPartial(partial: Partial<AgentSessionSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...partial };\n if (this.listener) {\n this.listener({\n ...this.snapshot,\n streamingMessageIds: new Set(this.snapshot.streamingMessageIds),\n });\n }\n }\n\n private handleAgentUpdate = (update: Partial<AgentRuntimeView>): void => {\n if (this.snapshot.agent) {\n this.emitPartial({ agent: { ...this.snapshot.agent, ...update } });\n }\n };\n\n private handleNewMessage = (message: ChatMessage): void => {\n const messages = [...this.snapshot.messages.filter((m) => m.messageId !== message.messageId), message];\n const orderedMessageIds = [...new Set([...this.snapshot.orderedMessageIds, message.messageId])];\n this.emitPartial({ messages, orderedMessageIds });\n };\n\n private startPolling(agentId: string): void {\n this.stopPolling();\n this.pollingTimer = setInterval(async () => {\n try {\n const agent = await this.options.agentInstanceClient.fetchAgent(agentId);\n this.emitPartial({ agent });\n } catch {\n // Silently retry on next poll\n }\n }, this.options.pollInterval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","/**\n * AgentDefinitionEditorController — headless controller for editing an agent definition.\n *\n * Manages definition loading, autosave, schema loading, preview agent lifecycle,\n * and scheduled task CRUD.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentDefinitionEditorState, AgentDefinitionRepository, AgentInstanceClient, CreateScheduledTaskInput, ScheduledTask, ScheduledTaskClient } from './types.js';\n\n/** Partial state emitted to the listener. */\nexport type EditorStateChange = Partial<AgentDefinitionEditorState>;\n\n/** Listener for editor state changes. */\nexport type EditorStateListener = (change: EditorStateChange) => void;\n\n/** Schedule editor sub-state for the UI layer. */\nexport interface ScheduleEditorState {\n mode: 'none' | 'interval' | 'daily' | 'cron';\n intervalValue: number;\n intervalUnit: 's' | 'min' | 'h';\n dailyTime: string;\n activeHoursStart: string;\n activeHoursEnd: string;\n cronExpression: string;\n timezone: string;\n message: string;\n existingTaskId?: string;\n}\n\n/** Options for creating an AgentDefinitionEditorController. */\nexport interface AgentDefinitionEditorControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n scheduledTaskClient: ScheduledTaskClient;\n /** Debounce interval for autosave in ms. Default 1000. */\n autosaveDebounceMs?: number;\n}\n\n/**\n * Headless controller for editing an agent definition.\n *\n * Call {@link loadDefinition} to start, then {@link subscribe} for state updates.\n */\nexport class AgentDefinitionEditorController {\n private readonly options: Required<AgentDefinitionEditorControllerOptions>;\n private listener: EditorStateListener | null = null;\n private state: AgentDefinitionEditorState = {\n agentDefinition: null,\n agentName: '',\n previewAgentId: null,\n isLoading: false,\n isSaving: false,\n promptSchema: null,\n };\n private autosaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: AgentDefinitionEditorControllerOptions) {\n this.options = {\n autosaveDebounceMs: 1_000,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /** Load an agent definition and its prompt schema. */\n async loadDefinition(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n const [definition, previewAgentId] = await Promise.all([\n this.options.definitionRepository.getAgentDef(definitionId),\n this.findOrCreatePreviewAgent(definitionId),\n ]);\n\n if (!definition) {\n this.emit({ isLoading: false });\n return;\n }\n\n let promptSchema: Record<string, unknown> | null = null;\n if (definition.agentFrameworkID) {\n try {\n promptSchema = await this.options.agentInstanceClient.getFrameworkConfigSchema(\n definition.agentFrameworkID,\n );\n } catch {\n promptSchema = null;\n }\n }\n\n this.state = {\n agentDefinition: definition,\n agentName: definition.name ?? '',\n previewAgentId,\n isLoading: false,\n isSaving: false,\n promptSchema,\n };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Update the agent definition field. Triggers debounced autosave. */\n updateDefinition(change: Partial<AgentDefinition> & { id: string }): void {\n if (!this.state.agentDefinition) return;\n const updated = { ...this.state.agentDefinition, ...change };\n this.state = { ...this.state, agentDefinition: updated, agentName: updated.name ?? '' };\n this.emit({ agentDefinition: updated, agentName: this.state.agentName });\n this.scheduleAutosave(updated);\n }\n\n /** Force an immediate save to the repository. */\n async saveNow(): Promise<void> {\n if (!this.state.agentDefinition) return;\n this.emit({ isSaving: true });\n try {\n await this.options.definitionRepository.updateAgentDef({\n id: this.state.agentDefinition.id,\n name: this.state.agentName,\n description: this.state.agentDefinition.description,\n agentFrameworkConfig: this.state.agentDefinition.agentFrameworkConfig,\n aiApiConfig: this.state.agentDefinition.aiApiConfig,\n agentTools: this.state.agentDefinition.agentTools,\n heartbeat: this.state.agentDefinition.heartbeat,\n });\n } catch {\n // Host should surface errors via its UI layer\n } finally {\n this.emit({ isSaving: false });\n }\n }\n\n /** Reload the prompt schema for a framework ID. */\n async reloadSchema(frameworkId: string): Promise<void> {\n try {\n const schema = await this.options.agentInstanceClient.getFrameworkConfigSchema(frameworkId);\n this.emit({ promptSchema: schema });\n } catch {\n this.emit({ promptSchema: null });\n }\n }\n\n // ── Preview agent lifecycle ───────────────────────────────────\n\n /** Get or create a preview agent instance tied to this definition. */\n private async findOrCreatePreviewAgent(definitionId: string): Promise<string | null> {\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n return result.id;\n } catch {\n return null;\n }\n }\n\n // ── Scheduled tasks ───────────────────────────────────────────\n\n async loadScheduledTasks(): Promise<ScheduledTask[]> {\n if (!this.state.previewAgentId) return [];\n return this.options.scheduledTaskClient.listScheduledTasksForAgent(\n this.state.previewAgentId,\n );\n }\n\n async saveScheduledTask(input: CreateScheduledTaskInput): Promise<ScheduledTask> {\n return this.options.scheduledTaskClient.createScheduledTask(input);\n }\n\n async deleteScheduledTask(taskId: string): Promise<void> {\n return this.options.scheduledTaskClient.deleteScheduledTask(taskId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: EditorStateListener): () => void {\n this.listener = listener;\n listener(this.state);\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentDefinitionEditorState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: EditorStateChange): void {\n this.listener?.(change);\n }\n\n private scheduleAutosave(definition: AgentDefinition): void {\n if (this.autosaveTimer !== null) clearTimeout(this.autosaveTimer);\n this.autosaveTimer = setTimeout(() => {\n this.options.definitionRepository.updateAgentDef({\n id: definition.id,\n name: definition.name,\n description: definition.description,\n agentFrameworkConfig: definition.agentFrameworkConfig,\n aiApiConfig: definition.aiApiConfig,\n agentTools: definition.agentTools,\n heartbeat: definition.heartbeat,\n }).catch(() => {});\n }, this.options.autosaveDebounceMs);\n }\n}\n","/**\n * AgentCreationController — headless controller for the \"Create New Agent\" wizard.\n *\n * Manages creation wizard state: current step, template selection, temporary\n * agent definition lifecycle, and preview agent setup.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentCreationState, AgentDefinitionRepository, AgentInstanceClient } from './types.js';\n\n/** Listener for creation state changes. */\nexport type CreationStateListener = (state: AgentCreationState) => void;\n\n/** Options for creating an AgentCreationController. */\nexport interface AgentCreationControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n /** Default framework ID for new agents. */\n defaultFrameworkId?: string;\n}\n\n/**\n * Headless controller for the agent creation wizard.\n *\n * Call {@link start}, {@link selectTemplate}, {@link nextStep}, etc. to drive\n * the wizard. Subscribe via {@link subscribe} for state updates.\n */\nexport class AgentCreationController {\n private readonly options: Required<AgentCreationControllerOptions>;\n private listener: CreationStateListener | null = null;\n private state: AgentCreationState = {\n currentStep: 0,\n agentName: '',\n selectedTemplate: null,\n temporaryAgentDefinition: null,\n previewAgentId: null,\n isLoading: false,\n promptSchema: null,\n };\n\n constructor(options: AgentCreationControllerOptions) {\n this.options = {\n defaultFrameworkId: 'memeloopAgentToolLoop',\n ...options,\n };\n }\n\n /** Initialize the creation wizard, optionally from a saved tab state. */\n async start(definitionId?: string, templateDefinitionId?: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n if (definitionId) {\n // Restore existing temporary definition\n const temporaryDefinition = await this.options.definitionRepository.getAgentDef(definitionId);\n if (temporaryDefinition) {\n this.state = {\n ...this.state,\n temporaryAgentDefinition: temporaryDefinition,\n agentName: temporaryDefinition.name ?? '',\n isLoading: false,\n };\n this.emit(this.state);\n // Load template if available\n if (templateDefinitionId) {\n const template = await this.options.definitionRepository.getAgentDef(templateDefinitionId);\n if (template) {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n }\n return;\n }\n }\n\n this.emit({ isLoading: false });\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Select a template for the new agent. */\n selectTemplate(template: AgentDefinition): void {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n\n /** Update the agent name. */\n setAgentName(name: string): void {\n this.state = { ...this.state, agentName: name };\n this.emit(this.state);\n }\n\n /** Advance to the next wizard step. */\n nextStep(): void {\n this.state = { ...this.state, currentStep: Math.min(this.state.currentStep + 1, 2) };\n this.emit(this.state);\n }\n\n /** Go back to the previous wizard step. */\n previousStep(): void {\n this.state = { ...this.state, currentStep: Math.max(this.state.currentStep - 1, 0) };\n this.emit(this.state);\n }\n\n /** Set the current wizard step directly. */\n setStep(step: number): void {\n this.state = { ...this.state, currentStep: Math.max(0, Math.min(step, 2)) };\n this.emit(this.state);\n }\n\n /** Update the temporary agent definition. */\n updateTemporaryDefinition(change: Partial<AgentDefinition>): void {\n const updated = this.state.temporaryAgentDefinition\n ? { ...this.state.temporaryAgentDefinition, ...change }\n : null;\n this.state = { ...this.state, temporaryAgentDefinition: updated };\n this.emit(this.state);\n }\n\n /** Set the prompt schema for the selected framework. */\n setPromptSchema(schema: Record<string, unknown> | null): void {\n this.state = { ...this.state, promptSchema: schema };\n this.emit(this.state);\n }\n\n /**\n * Create a preview agent instance for the chat-preview step.\n * Should be called when entering step 2 (or the chat preview step).\n */\n async createPreviewAgent(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n this.state = { ...this.state, previewAgentId: result.id, isLoading: false };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /**\n * Finalize creation: persist the temporary definition and create the actual\n * agent instance. Returns the final agent instance ID, or null on failure.\n */\n async finalize(): Promise<string | null> {\n if (!this.state.temporaryAgentDefinition) return null;\n try {\n const definition = await this.options.definitionRepository.createAgentDef(\n this.state.temporaryAgentDefinition,\n );\n const instance = await this.options.agentInstanceClient.createAgent(definition.id);\n return instance.id;\n } catch {\n return null;\n }\n }\n\n /** Clean up temporary resources. */\n async cleanup(): Promise<void> {\n if (this.state.previewAgentId) {\n try {\n await this.options.agentInstanceClient.deleteAgent(this.state.previewAgentId);\n } catch {\n // Best-effort cleanup\n }\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: CreationStateListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentCreationState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: AgentCreationState | Partial<AgentCreationState>): void {\n this.state = { ...this.state, ...change };\n this.listener?.({ ...this.state });\n }\n}\n","/**\n * PromptPreviewController — headless controller for generating prompt previews.\n *\n * Manages preview dialog state, progress tracking, and result accumulation.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { PromptPreviewClient, PromptPreviewDialogState, PromptPreviewResult } from './types.js';\n\n/** Listener for preview dialog state changes. */\nexport type PreviewDialogListener = (state: PromptPreviewDialogState) => void;\n\n/** Options for creating a PromptPreviewController. */\nexport interface PromptPreviewControllerOptions {\n previewClient: PromptPreviewClient;\n}\n\n/**\n * Headless controller for the prompt preview/edit dialog.\n *\n * Call {@link open}, {@link close}, {@link generate} to drive the dialog.\n * Subscribe via {@link subscribe} for state updates.\n */\nexport class PromptPreviewController {\n private readonly options: PromptPreviewControllerOptions;\n private listener: PreviewDialogListener | null = null;\n private state: PromptPreviewDialogState = {\n open: false,\n baseMode: 'preview',\n activeTab: 'tree',\n loading: false,\n progress: 0,\n currentStep: '',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n\n constructor(options: PromptPreviewControllerOptions) {\n this.options = options;\n }\n\n /** Open the dialog with an optional base mode. */\n open(baseMode?: 'preview' | 'edit'): void {\n this.state = {\n ...this.state,\n open: true,\n baseMode: baseMode ?? 'preview',\n loading: false,\n progress: 0,\n currentStep: 'Starting...',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Close the dialog. */\n close(): void {\n this.state = {\n ...this.state,\n open: false,\n baseMode: 'preview',\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Set the active tab in the dialog. */\n setActiveTab(tab: 'flat' | 'tree'): void {\n this.state = { ...this.state, activeTab: tab };\n this.emit();\n }\n\n /** Set form fields to scroll to (for edit mode navigation). */\n setFormFieldsToScrollTo(fieldPaths: string[]): void {\n this.state = { ...this.state, formFieldsToScrollTo: fieldPaths };\n this.emit();\n }\n\n /**\n * Generate a preview of the prompt tree.\n * @param agentFrameworkConfig The agent's framework configuration\n * @param messages Current conversation messages\n * @param inputText Optional input text to include in the preview\n */\n async generate(\n agentFrameworkConfig: AgentFrameworkConfig,\n messages: ChatMessage[],\n inputText?: string,\n ): Promise<PromptPreviewResult | null> {\n this.state = {\n ...this.state,\n loading: true,\n progress: 0,\n currentStep: 'Preparing...',\n };\n this.emit();\n\n try {\n const result = await this.options.previewClient.generatePreview(\n agentFrameworkConfig,\n messages,\n inputText,\n (progress) => {\n this.state = {\n ...this.state,\n progress: progress.progress,\n currentStep: progress.step,\n currentPlugin: progress.currentPlugin ?? null,\n };\n this.emit();\n },\n );\n\n this.state = {\n ...this.state,\n loading: false,\n progress: 1,\n currentStep: 'Complete',\n currentPlugin: null,\n result,\n lastUpdated: new Date(),\n };\n this.emit();\n return result;\n } catch {\n this.state = {\n ...this.state,\n loading: false,\n progress: 0,\n currentStep: 'Error occurred',\n currentPlugin: null,\n result: null,\n };\n this.emit();\n return null;\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: PreviewDialogListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): PromptPreviewDialogState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(): void {\n this.listener?.({ ...this.state });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/conversation/index.ts
21
+ var conversation_exports = {};
22
+ __export(conversation_exports, {
23
+ buildLegacyChatMessageParts: () => buildLegacyChatMessageParts,
24
+ buildToolResultSummary: () => buildToolResultSummary,
25
+ createAgentInstanceFromDefinition: () => createAgentInstanceFromDefinition,
26
+ createChatMessage: () => createChatMessage,
27
+ getChatMessageParts: () => getChatMessageParts,
28
+ isToolResultPart: () => isToolResultPart,
29
+ parseLegacyToolResultContent: () => parseLegacyToolResultContent,
30
+ projectChatMessageParts: () => projectChatMessageParts
31
+ });
32
+ module.exports = __toCommonJS(conversation_exports);
33
+
34
+ // src/conversation/parts.ts
35
+ function tryParseJson(value) {
36
+ try {
37
+ return JSON.parse(value);
38
+ } catch {
39
+ return void 0;
40
+ }
41
+ }
42
+ function parseLegacyToolResultContent(content) {
43
+ const match = /(?:<functions_result>\s*)?Tool:\s*(.+?)\nParameters:\s*(.+?)\n(Error|Result):\s*([\s\S]*?)\s*(?:<\/functions_result>|$)/su.exec(content.trim());
44
+ if (!match) return null;
45
+ const [, rawToolName, rawParameters, kind, rawBody] = match;
46
+ const parsedParameters = tryParseJson(rawParameters.trim());
47
+ const result = rawBody.trim();
48
+ return {
49
+ type: "tool-result",
50
+ toolName: rawToolName.trim(),
51
+ parameters: parsedParameters,
52
+ result,
53
+ isError: kind === "Error",
54
+ payload: tryParseJson(result)
55
+ };
56
+ }
57
+ function isTextPart(part) {
58
+ return part.type === "text";
59
+ }
60
+ function isReasoningPart(part) {
61
+ return part.type === "reasoning";
62
+ }
63
+ function isToolCallPart(part) {
64
+ return part.type === "tool-call";
65
+ }
66
+ function isAttachmentPart(part) {
67
+ return part.type === "attachment";
68
+ }
69
+ function isToolResultPart(part) {
70
+ return part.type === "tool-result";
71
+ }
72
+ function buildToolResultSummary(part) {
73
+ const prefix = part.isError ? "Error" : "Result";
74
+ const suffix = part.result.trim();
75
+ if (suffix.length === 0) return `${prefix} from ${part.toolName}`;
76
+ return `${prefix} from ${part.toolName}: ${suffix}`;
77
+ }
78
+ function projectChatMessageParts(parts) {
79
+ const text = parts.filter(isTextPart).map((part) => part.text.trim()).filter(Boolean);
80
+ const reasoning = parts.filter(isReasoningPart).map((part) => part.text.trim()).filter(Boolean);
81
+ const toolCalls = parts.filter(isToolCallPart).map((part) => ({ id: part.toolCallId, toolName: part.toolName, arguments: part.arguments }));
82
+ const attachments = parts.filter(isAttachmentPart).map((part) => part.attachment);
83
+ const toolResults = parts.filter(isToolResultPart);
84
+ let content = text.join("\n\n");
85
+ if (content.length === 0 && toolResults.length > 0) {
86
+ content = toolResults.map(buildToolResultSummary).join("\n\n");
87
+ }
88
+ if (content.length === 0 && toolCalls.length > 0) {
89
+ content = toolCalls.map((part) => `Tool call: ${part.toolName}`).join("\n\n");
90
+ }
91
+ return {
92
+ content,
93
+ reasoning_content: reasoning.length > 0 ? reasoning.join("\n\n") : void 0,
94
+ toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
95
+ attachments: attachments.length > 0 ? attachments : void 0
96
+ };
97
+ }
98
+ function buildLegacyChatMessageParts(input) {
99
+ const parts = [];
100
+ if (input.role !== "tool" && typeof input.content === "string" && input.content.trim().length > 0) {
101
+ parts.push({ type: "text", text: input.content });
102
+ }
103
+ if (typeof input.reasoning_content === "string" && input.reasoning_content.trim().length > 0) {
104
+ parts.push({ type: "reasoning", text: input.reasoning_content });
105
+ }
106
+ if (input.toolCalls) {
107
+ for (const toolCall of input.toolCalls) {
108
+ parts.push({
109
+ type: "tool-call",
110
+ toolCallId: toolCall.id,
111
+ toolName: toolCall.toolName,
112
+ arguments: toolCall.arguments
113
+ });
114
+ }
115
+ }
116
+ if (input.attachments) {
117
+ for (const attachment of input.attachments) {
118
+ parts.push({ type: "attachment", attachment });
119
+ }
120
+ }
121
+ if (input.role === "tool") {
122
+ const metadata = input.metadata ?? {};
123
+ const parsed = typeof input.content === "string" ? parseLegacyToolResultContent(input.content) : null;
124
+ const toolName = typeof metadata.toolId === "string" && metadata.toolId.length > 0 ? metadata.toolId : parsed?.toolName ?? "tool";
125
+ const result = parsed?.result ?? (typeof input.content === "string" ? input.content : "");
126
+ const payload = parsed?.payload ?? tryParseJson(result);
127
+ parts.push({
128
+ type: "tool-result",
129
+ toolName,
130
+ parameters: metadata.toolParameters ?? parsed?.parameters,
131
+ result,
132
+ isError: metadata.isError === true || parsed?.isError === true,
133
+ payload,
134
+ detailRef: input.detailRef
135
+ });
136
+ }
137
+ return parts;
138
+ }
139
+ function getChatMessageParts(message) {
140
+ return message.parts ?? buildLegacyChatMessageParts(message);
141
+ }
142
+
143
+ // src/conversation/factory.ts
144
+ function createChatMessage(input) {
145
+ const now = Date.now();
146
+ const parts = input.parts ?? buildLegacyChatMessageParts({
147
+ role: input.role,
148
+ content: input.content,
149
+ reasoning_content: input.reasoning_content,
150
+ toolCalls: input.toolCalls,
151
+ attachments: input.attachments,
152
+ detailRef: input.detailRef,
153
+ metadata: input.metadata
154
+ });
155
+ const projection = projectChatMessageParts(parts);
156
+ return {
157
+ messageId: input.messageId,
158
+ conversationId: input.conversationId,
159
+ originNodeId: input.originNodeId ?? "unknown",
160
+ timestamp: now,
161
+ lamportClock: input.lamportClock ?? now,
162
+ role: input.role,
163
+ parts: parts.length > 0 ? parts : void 0,
164
+ content: input.content ?? projection.content,
165
+ contentType: input.contentType ?? "text/plain",
166
+ metadata: input.metadata,
167
+ duration: input.duration,
168
+ toolCalls: input.toolCalls ?? projection.toolCalls,
169
+ reasoning_content: input.reasoning_content ?? projection.reasoning_content,
170
+ hidden: input.hidden,
171
+ attachments: input.attachments ?? projection.attachments,
172
+ detailRef: input.detailRef
173
+ };
174
+ }
175
+ var DEFAULT_INSTANCE_STATUS = {
176
+ state: "completed",
177
+ modified: /* @__PURE__ */ new Date()
178
+ };
179
+ function createAgentInstanceFromDefinition(definition, overrides) {
180
+ const now = /* @__PURE__ */ new Date();
181
+ return {
182
+ ...definition,
183
+ id: overrides.id,
184
+ agentDefId: definition.id,
185
+ name: overrides.name ?? definition.name,
186
+ status: overrides.status ?? DEFAULT_INSTANCE_STATUS,
187
+ messages: [],
188
+ created: now,
189
+ modified: now,
190
+ closed: overrides.closed ?? false,
191
+ volatile: overrides.volatile ?? false,
192
+ isDelegatedAgentRun: overrides.isDelegatedAgentRun,
193
+ parentAgentRunId: overrides.parentAgentRunId,
194
+ agentFrameworkConfig: overrides.agentFrameworkConfig
195
+ };
196
+ }
197
+ // Annotate the CommonJS export names for ESM import in node:
198
+ 0 && (module.exports = {
199
+ buildLegacyChatMessageParts,
200
+ buildToolResultSummary,
201
+ createAgentInstanceFromDefinition,
202
+ createChatMessage,
203
+ getChatMessageParts,
204
+ isToolResultPart,
205
+ parseLegacyToolResultContent,
206
+ projectChatMessageParts
207
+ });
208
+ //# sourceMappingURL=conversation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/conversation/index.ts","../src/conversation/parts.ts","../src/conversation/factory.ts"],"sourcesContent":["export { createAgentInstanceFromDefinition, createChatMessage } from './factory.js';\nexport * from './parts.js';\nexport * from './types.js';\n","import type { AttachmentReference, ChatAttachmentPart, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatToolCallPart, ChatToolResultPart, ToolCall } from './types.js';\n\nexport interface ChatMessageProjection {\n content: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n}\n\nfunction tryParseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nexport function parseLegacyToolResultContent(content: string): ChatToolResultPart | null {\n const match = /(?:<functions_result>\\s*)?Tool:\\s*(.+?)\\nParameters:\\s*(.+?)\\n(Error|Result):\\s*([\\s\\S]*?)\\s*(?:<\\/functions_result>|$)/su.exec(content.trim());\n if (!match) return null;\n\n const [, rawToolName, rawParameters, kind, rawBody] = match;\n const parsedParameters = tryParseJson(rawParameters.trim());\n const result = rawBody.trim();\n return {\n type: 'tool-result',\n toolName: rawToolName.trim(),\n parameters: parsedParameters,\n result,\n isError: kind === 'Error',\n payload: tryParseJson(result),\n };\n}\n\nfunction isTextPart(part: ChatMessagePart): part is Extract<ChatMessagePart, { type: 'text' }> {\n return part.type === 'text';\n}\n\nfunction isReasoningPart(part: ChatMessagePart): part is ChatReasoningPart {\n return part.type === 'reasoning';\n}\n\nfunction isToolCallPart(part: ChatMessagePart): part is ChatToolCallPart {\n return part.type === 'tool-call';\n}\n\nfunction isAttachmentPart(part: ChatMessagePart): part is ChatAttachmentPart {\n return part.type === 'attachment';\n}\n\nexport function isToolResultPart(part: ChatMessagePart): part is ChatToolResultPart {\n return part.type === 'tool-result';\n}\n\nexport function buildToolResultSummary(part: ChatToolResultPart): string {\n const prefix = part.isError ? 'Error' : 'Result';\n const suffix = part.result.trim();\n if (suffix.length === 0) return `${prefix} from ${part.toolName}`;\n return `${prefix} from ${part.toolName}: ${suffix}`;\n}\n\nexport function projectChatMessageParts(parts: readonly ChatMessagePart[]): ChatMessageProjection {\n const text = parts.filter(isTextPart).map((part) => part.text.trim()).filter(Boolean);\n const reasoning = parts.filter(isReasoningPart).map((part) => part.text.trim()).filter(Boolean);\n const toolCalls = parts\n .filter(isToolCallPart)\n .map((part) => ({ id: part.toolCallId, toolName: part.toolName, arguments: part.arguments }));\n const attachments = parts.filter(isAttachmentPart).map((part) => part.attachment);\n const toolResults = parts.filter(isToolResultPart);\n\n let content = text.join('\\n\\n');\n if (content.length === 0 && toolResults.length > 0) {\n content = toolResults.map(buildToolResultSummary).join('\\n\\n');\n }\n if (content.length === 0 && toolCalls.length > 0) {\n content = toolCalls.map((part) => `Tool call: ${part.toolName}`).join('\\n\\n');\n }\n\n return {\n content,\n reasoning_content: reasoning.length > 0 ? reasoning.join('\\n\\n') : undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n attachments: attachments.length > 0 ? attachments : undefined,\n };\n}\n\nexport function buildLegacyChatMessageParts(input: {\n role: string;\n content?: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n detailRef?: ChatToolResultPart['detailRef'];\n metadata?: Record<string, unknown>;\n}): ChatMessagePart[] {\n const parts: ChatMessagePart[] = [];\n\n if (input.role !== 'tool' && typeof input.content === 'string' && input.content.trim().length > 0) {\n parts.push({ type: 'text', text: input.content });\n }\n\n if (typeof input.reasoning_content === 'string' && input.reasoning_content.trim().length > 0) {\n parts.push({ type: 'reasoning', text: input.reasoning_content });\n }\n\n if (input.toolCalls) {\n for (const toolCall of input.toolCalls) {\n parts.push({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.toolName,\n arguments: toolCall.arguments,\n });\n }\n }\n\n if (input.attachments) {\n for (const attachment of input.attachments) {\n parts.push({ type: 'attachment', attachment });\n }\n }\n\n if (input.role === 'tool') {\n const metadata = input.metadata ?? {};\n const parsed = typeof input.content === 'string' ? parseLegacyToolResultContent(input.content) : null;\n const toolName = typeof metadata.toolId === 'string' && metadata.toolId.length > 0\n ? metadata.toolId\n : parsed?.toolName ?? 'tool';\n const result = parsed?.result ?? (typeof input.content === 'string' ? input.content : '');\n const payload = parsed?.payload ?? tryParseJson(result);\n parts.push({\n type: 'tool-result',\n toolName,\n parameters: metadata.toolParameters ?? parsed?.parameters,\n result,\n isError: metadata.isError === true || parsed?.isError === true,\n payload,\n detailRef: input.detailRef,\n });\n }\n\n return parts;\n}\n\nexport function getChatMessageParts(\n message: Pick<\n ChatMessage,\n 'role' | 'parts' | 'content' | 'reasoning_content' | 'toolCalls' | 'attachments' | 'detailRef' | 'metadata'\n >,\n): ChatMessagePart[] {\n return message.parts ?? buildLegacyChatMessageParts(message);\n}\n","/**\n * Domain factories for creating canonical ChatMessage and AgentInstance objects.\n *\n * These factories ensure that every host (Desktop, Mobile, CLI, Cloud)\n * constructs messages and instances with the same required fields,\n * default values, and clock behavior.\n *\n * Hosts that need a different originNodeId, message ID scheme, or lamport\n * clock source should pass those values explicitly rather than creating\n * their own factory.\n */\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { AgentInstance, AgentInstanceLatestStatus } from '../types.js';\nimport { buildLegacyChatMessageParts, projectChatMessageParts } from './parts.js';\nimport type { ChatMessage, ChatRole } from './types.js';\n\n/**\n * Create a canonical ChatMessage with required defaults.\n *\n * @param input.messageId - Unique message identifier. Use nanoid or equivalent.\n * @param input.conversationId - The conversation/agent-instance this message belongs to.\n * @param input.role - Message role (user, assistant, tool, agent, error).\n * @param input.content - Message text content.\n * @param input.originNodeId - Node that originated this message. Core default is \"unknown\";\n * hosts should pass their own identifier (e.g. \"tidgi-desktop\", \"memeloop-cli\").\n * @param input.contentType - MIME type override (default \"text/plain\").\n * @param input.metadata - Optional metadata map.\n * @param input.duration - Processing duration in ms.\n * @param input.lamportClock - Lamport clock value. Defaults to `Date.now()`.\n * @param input.toolCalls - Tool calls associated with assistant messages.\n * @param input.reasoning_content - Reasoning/thinking content.\n * @param input.hidden - Whether the message is hidden from the UI.\n * @param input.detailRef - Reference to large tool output stored elsewhere.\n */\nexport function createChatMessage(input: {\n messageId: string;\n conversationId: string;\n role: ChatRole;\n content?: string;\n originNodeId?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n duration?: number | null;\n lamportClock?: number;\n parts?: ChatMessage['parts'];\n toolCalls?: ChatMessage['toolCalls'];\n reasoning_content?: string;\n hidden?: boolean;\n attachments?: ChatMessage['attachments'];\n detailRef?: ChatMessage['detailRef'];\n}): ChatMessage {\n const now = Date.now();\n const parts = input.parts ?? buildLegacyChatMessageParts({\n role: input.role,\n content: input.content,\n reasoning_content: input.reasoning_content,\n toolCalls: input.toolCalls,\n attachments: input.attachments,\n detailRef: input.detailRef,\n metadata: input.metadata,\n });\n const projection = projectChatMessageParts(parts);\n return {\n messageId: input.messageId,\n conversationId: input.conversationId,\n originNodeId: input.originNodeId ?? 'unknown',\n timestamp: now,\n lamportClock: input.lamportClock ?? now,\n role: input.role,\n parts: parts.length > 0 ? parts : undefined,\n content: input.content ?? projection.content,\n contentType: input.contentType ?? 'text/plain',\n metadata: input.metadata,\n duration: input.duration,\n toolCalls: input.toolCalls ?? projection.toolCalls,\n reasoning_content: input.reasoning_content ?? projection.reasoning_content,\n hidden: input.hidden,\n attachments: input.attachments ?? projection.attachments,\n detailRef: input.detailRef,\n };\n}\n\n/**\n * Default status applied to newly created agent instances.\n */\nconst DEFAULT_INSTANCE_STATUS: AgentInstanceLatestStatus = {\n state: 'completed',\n modified: new Date(),\n};\n\n/**\n * Create an AgentInstance from an AgentDefinition.\n *\n * The returned instance has an empty message list, a default \"completed\"\n * status, and copies all definition-level fields as instance defaults.\n *\n * @param definition - The AgentDefinition to base the instance on.\n * @param overrides - Optional overrides for instance-specific fields:\n * - `id`: Instance ID (default: nanoid-equivalent, must be provided by host)\n * - `name`: Display name (default: definition.name)\n * - `status`: Initial status\n * - `volatile`: Whether the instance is ephemeral\n * - `closed`: Whether closed on creation\n * - `isDelegatedAgentRun`, `parentAgentRunId`: Delegated agent relationship\n * - `agentFrameworkConfig`: Per-instance framework config override\n */\nexport function createAgentInstanceFromDefinition(\n definition: AgentDefinition,\n overrides: {\n id: string;\n name?: string;\n status?: AgentInstanceLatestStatus;\n volatile?: boolean;\n closed?: boolean;\n isDelegatedAgentRun?: boolean;\n parentAgentRunId?: string;\n agentFrameworkConfig?: AgentFrameworkConfig;\n },\n): AgentInstance {\n const now = new Date();\n return {\n ...definition,\n id: overrides.id,\n agentDefId: definition.id,\n name: overrides.name ?? definition.name,\n status: overrides.status ?? DEFAULT_INSTANCE_STATUS,\n messages: [],\n created: now,\n modified: now,\n closed: overrides.closed ?? false,\n volatile: overrides.volatile ?? false,\n isDelegatedAgentRun: overrides.isDelegatedAgentRun,\n parentAgentRunId: overrides.parentAgentRunId,\n agentFrameworkConfig: overrides.agentFrameworkConfig,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,100 @@
1
+ import { m as AgentDefinition, S as AgentFrameworkConfig, e as ChatRole, b as ChatMessage, T as ToolCall, A as AttachmentReference, h as ChatToolResultPart, c as ChatMessagePart } from './interface-IrKBFtL1.cjs';
2
+ export { a as ChatAttachmentPart, d as ChatReasoningPart, f as ChatTextPart, g as ChatToolCallPart, D as DetailRefType, k as DetailReference } from './interface-IrKBFtL1.cjs';
3
+ import { b as AgentInstanceLatestStatus, a as AgentInstanceModel } from './scriptDeploymentPipeline-BAeo1dPb.cjs';
4
+
5
+ /**
6
+ * Domain factories for creating canonical ChatMessage and AgentInstance objects.
7
+ *
8
+ * These factories ensure that every host (Desktop, Mobile, CLI, Cloud)
9
+ * constructs messages and instances with the same required fields,
10
+ * default values, and clock behavior.
11
+ *
12
+ * Hosts that need a different originNodeId, message ID scheme, or lamport
13
+ * clock source should pass those values explicitly rather than creating
14
+ * their own factory.
15
+ */
16
+
17
+ /**
18
+ * Create a canonical ChatMessage with required defaults.
19
+ *
20
+ * @param input.messageId - Unique message identifier. Use nanoid or equivalent.
21
+ * @param input.conversationId - The conversation/agent-instance this message belongs to.
22
+ * @param input.role - Message role (user, assistant, tool, agent, error).
23
+ * @param input.content - Message text content.
24
+ * @param input.originNodeId - Node that originated this message. Core default is "unknown";
25
+ * hosts should pass their own identifier (e.g. "tidgi-desktop", "memeloop-cli").
26
+ * @param input.contentType - MIME type override (default "text/plain").
27
+ * @param input.metadata - Optional metadata map.
28
+ * @param input.duration - Processing duration in ms.
29
+ * @param input.lamportClock - Lamport clock value. Defaults to `Date.now()`.
30
+ * @param input.toolCalls - Tool calls associated with assistant messages.
31
+ * @param input.reasoning_content - Reasoning/thinking content.
32
+ * @param input.hidden - Whether the message is hidden from the UI.
33
+ * @param input.detailRef - Reference to large tool output stored elsewhere.
34
+ */
35
+ declare function createChatMessage(input: {
36
+ messageId: string;
37
+ conversationId: string;
38
+ role: ChatRole;
39
+ content?: string;
40
+ originNodeId?: string;
41
+ contentType?: string;
42
+ metadata?: Record<string, unknown>;
43
+ duration?: number | null;
44
+ lamportClock?: number;
45
+ parts?: ChatMessage['parts'];
46
+ toolCalls?: ChatMessage['toolCalls'];
47
+ reasoning_content?: string;
48
+ hidden?: boolean;
49
+ attachments?: ChatMessage['attachments'];
50
+ detailRef?: ChatMessage['detailRef'];
51
+ }): ChatMessage;
52
+ /**
53
+ * Create an AgentInstance from an AgentDefinition.
54
+ *
55
+ * The returned instance has an empty message list, a default "completed"
56
+ * status, and copies all definition-level fields as instance defaults.
57
+ *
58
+ * @param definition - The AgentDefinition to base the instance on.
59
+ * @param overrides - Optional overrides for instance-specific fields:
60
+ * - `id`: Instance ID (default: nanoid-equivalent, must be provided by host)
61
+ * - `name`: Display name (default: definition.name)
62
+ * - `status`: Initial status
63
+ * - `volatile`: Whether the instance is ephemeral
64
+ * - `closed`: Whether closed on creation
65
+ * - `isDelegatedAgentRun`, `parentAgentRunId`: Delegated agent relationship
66
+ * - `agentFrameworkConfig`: Per-instance framework config override
67
+ */
68
+ declare function createAgentInstanceFromDefinition(definition: AgentDefinition, overrides: {
69
+ id: string;
70
+ name?: string;
71
+ status?: AgentInstanceLatestStatus;
72
+ volatile?: boolean;
73
+ closed?: boolean;
74
+ isDelegatedAgentRun?: boolean;
75
+ parentAgentRunId?: string;
76
+ agentFrameworkConfig?: AgentFrameworkConfig;
77
+ }): AgentInstanceModel;
78
+
79
+ interface ChatMessageProjection {
80
+ content: string;
81
+ reasoning_content?: string;
82
+ toolCalls?: ToolCall[];
83
+ attachments?: AttachmentReference[];
84
+ }
85
+ declare function parseLegacyToolResultContent(content: string): ChatToolResultPart | null;
86
+ declare function isToolResultPart(part: ChatMessagePart): part is ChatToolResultPart;
87
+ declare function buildToolResultSummary(part: ChatToolResultPart): string;
88
+ declare function projectChatMessageParts(parts: readonly ChatMessagePart[]): ChatMessageProjection;
89
+ declare function buildLegacyChatMessageParts(input: {
90
+ role: string;
91
+ content?: string;
92
+ reasoning_content?: string;
93
+ toolCalls?: ToolCall[];
94
+ attachments?: AttachmentReference[];
95
+ detailRef?: ChatToolResultPart['detailRef'];
96
+ metadata?: Record<string, unknown>;
97
+ }): ChatMessagePart[];
98
+ declare function getChatMessageParts(message: Pick<ChatMessage, 'role' | 'parts' | 'content' | 'reasoning_content' | 'toolCalls' | 'attachments' | 'detailRef' | 'metadata'>): ChatMessagePart[];
99
+
100
+ export { AttachmentReference, ChatMessage, ChatMessagePart, type ChatMessageProjection, ChatRole, ChatToolResultPart, ToolCall, buildLegacyChatMessageParts, buildToolResultSummary, createAgentInstanceFromDefinition, createChatMessage, getChatMessageParts, isToolResultPart, parseLegacyToolResultContent, projectChatMessageParts };
@@ -0,0 +1,100 @@
1
+ import { m as AgentDefinition, S as AgentFrameworkConfig, e as ChatRole, b as ChatMessage, T as ToolCall, A as AttachmentReference, h as ChatToolResultPart, c as ChatMessagePart } from './interface-IrKBFtL1.js';
2
+ export { a as ChatAttachmentPart, d as ChatReasoningPart, f as ChatTextPart, g as ChatToolCallPart, D as DetailRefType, k as DetailReference } from './interface-IrKBFtL1.js';
3
+ import { b as AgentInstanceLatestStatus, a as AgentInstanceModel } from './scriptDeploymentPipeline-DsnT0AG6.js';
4
+
5
+ /**
6
+ * Domain factories for creating canonical ChatMessage and AgentInstance objects.
7
+ *
8
+ * These factories ensure that every host (Desktop, Mobile, CLI, Cloud)
9
+ * constructs messages and instances with the same required fields,
10
+ * default values, and clock behavior.
11
+ *
12
+ * Hosts that need a different originNodeId, message ID scheme, or lamport
13
+ * clock source should pass those values explicitly rather than creating
14
+ * their own factory.
15
+ */
16
+
17
+ /**
18
+ * Create a canonical ChatMessage with required defaults.
19
+ *
20
+ * @param input.messageId - Unique message identifier. Use nanoid or equivalent.
21
+ * @param input.conversationId - The conversation/agent-instance this message belongs to.
22
+ * @param input.role - Message role (user, assistant, tool, agent, error).
23
+ * @param input.content - Message text content.
24
+ * @param input.originNodeId - Node that originated this message. Core default is "unknown";
25
+ * hosts should pass their own identifier (e.g. "tidgi-desktop", "memeloop-cli").
26
+ * @param input.contentType - MIME type override (default "text/plain").
27
+ * @param input.metadata - Optional metadata map.
28
+ * @param input.duration - Processing duration in ms.
29
+ * @param input.lamportClock - Lamport clock value. Defaults to `Date.now()`.
30
+ * @param input.toolCalls - Tool calls associated with assistant messages.
31
+ * @param input.reasoning_content - Reasoning/thinking content.
32
+ * @param input.hidden - Whether the message is hidden from the UI.
33
+ * @param input.detailRef - Reference to large tool output stored elsewhere.
34
+ */
35
+ declare function createChatMessage(input: {
36
+ messageId: string;
37
+ conversationId: string;
38
+ role: ChatRole;
39
+ content?: string;
40
+ originNodeId?: string;
41
+ contentType?: string;
42
+ metadata?: Record<string, unknown>;
43
+ duration?: number | null;
44
+ lamportClock?: number;
45
+ parts?: ChatMessage['parts'];
46
+ toolCalls?: ChatMessage['toolCalls'];
47
+ reasoning_content?: string;
48
+ hidden?: boolean;
49
+ attachments?: ChatMessage['attachments'];
50
+ detailRef?: ChatMessage['detailRef'];
51
+ }): ChatMessage;
52
+ /**
53
+ * Create an AgentInstance from an AgentDefinition.
54
+ *
55
+ * The returned instance has an empty message list, a default "completed"
56
+ * status, and copies all definition-level fields as instance defaults.
57
+ *
58
+ * @param definition - The AgentDefinition to base the instance on.
59
+ * @param overrides - Optional overrides for instance-specific fields:
60
+ * - `id`: Instance ID (default: nanoid-equivalent, must be provided by host)
61
+ * - `name`: Display name (default: definition.name)
62
+ * - `status`: Initial status
63
+ * - `volatile`: Whether the instance is ephemeral
64
+ * - `closed`: Whether closed on creation
65
+ * - `isDelegatedAgentRun`, `parentAgentRunId`: Delegated agent relationship
66
+ * - `agentFrameworkConfig`: Per-instance framework config override
67
+ */
68
+ declare function createAgentInstanceFromDefinition(definition: AgentDefinition, overrides: {
69
+ id: string;
70
+ name?: string;
71
+ status?: AgentInstanceLatestStatus;
72
+ volatile?: boolean;
73
+ closed?: boolean;
74
+ isDelegatedAgentRun?: boolean;
75
+ parentAgentRunId?: string;
76
+ agentFrameworkConfig?: AgentFrameworkConfig;
77
+ }): AgentInstanceModel;
78
+
79
+ interface ChatMessageProjection {
80
+ content: string;
81
+ reasoning_content?: string;
82
+ toolCalls?: ToolCall[];
83
+ attachments?: AttachmentReference[];
84
+ }
85
+ declare function parseLegacyToolResultContent(content: string): ChatToolResultPart | null;
86
+ declare function isToolResultPart(part: ChatMessagePart): part is ChatToolResultPart;
87
+ declare function buildToolResultSummary(part: ChatToolResultPart): string;
88
+ declare function projectChatMessageParts(parts: readonly ChatMessagePart[]): ChatMessageProjection;
89
+ declare function buildLegacyChatMessageParts(input: {
90
+ role: string;
91
+ content?: string;
92
+ reasoning_content?: string;
93
+ toolCalls?: ToolCall[];
94
+ attachments?: AttachmentReference[];
95
+ detailRef?: ChatToolResultPart['detailRef'];
96
+ metadata?: Record<string, unknown>;
97
+ }): ChatMessagePart[];
98
+ declare function getChatMessageParts(message: Pick<ChatMessage, 'role' | 'parts' | 'content' | 'reasoning_content' | 'toolCalls' | 'attachments' | 'detailRef' | 'metadata'>): ChatMessagePart[];
99
+
100
+ export { AttachmentReference, ChatMessage, ChatMessagePart, type ChatMessageProjection, ChatRole, ChatToolResultPart, ToolCall, buildLegacyChatMessageParts, buildToolResultSummary, createAgentInstanceFromDefinition, createChatMessage, getChatMessageParts, isToolResultPart, parseLegacyToolResultContent, projectChatMessageParts };
@@ -0,0 +1,21 @@
1
+ import {
2
+ buildLegacyChatMessageParts,
3
+ buildToolResultSummary,
4
+ createAgentInstanceFromDefinition,
5
+ createChatMessage,
6
+ getChatMessageParts,
7
+ isToolResultPart,
8
+ parseLegacyToolResultContent,
9
+ projectChatMessageParts
10
+ } from "./chunk-WAI6BODI.js";
11
+ export {
12
+ buildLegacyChatMessageParts,
13
+ buildToolResultSummary,
14
+ createAgentInstanceFromDefinition,
15
+ createChatMessage,
16
+ getChatMessageParts,
17
+ isToolResultPart,
18
+ parseLegacyToolResultContent,
19
+ projectChatMessageParts
20
+ };
21
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}