@undefineds.co/xpod 0.2.44 → 0.3.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 (431) hide show
  1. package/dist/agents/AgentExecutorFactory.js +12 -13
  2. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  3. package/dist/agents/config/agent-meta-schema.d.ts +31 -3
  4. package/dist/agents/config/agent-meta-schema.js +37 -3
  5. package/dist/agents/config/agent-meta-schema.js.map +1 -1
  6. package/dist/agents/config/index.d.ts +5 -5
  7. package/dist/agents/config/index.js +7 -6
  8. package/dist/agents/config/index.js.map +1 -1
  9. package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
  10. package/dist/agents/config/parse-agent-instructions.js +23 -0
  11. package/dist/agents/config/parse-agent-instructions.js.map +1 -0
  12. package/dist/agents/config/resolve.d.ts +7 -12
  13. package/dist/agents/config/resolve.js +272 -156
  14. package/dist/agents/config/resolve.js.map +1 -1
  15. package/dist/agents/config/types.d.ts +33 -36
  16. package/dist/agents/config/types.js +4 -4
  17. package/dist/agents/config/types.js.map +1 -1
  18. package/dist/agents/index.d.ts +2 -7
  19. package/dist/agents/index.js +4 -14
  20. package/dist/agents/index.js.map +1 -1
  21. package/dist/agents/types.d.ts +2 -2
  22. package/dist/agents/types.js.map +1 -1
  23. package/dist/ai/service/CredentialReaderImpl.js +9 -14
  24. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  25. package/dist/api/ApiServer.d.ts +7 -0
  26. package/dist/api/ApiServer.js +5 -1
  27. package/dist/api/ApiServer.js.map +1 -1
  28. package/dist/api/chatkit/default-agent.js +1 -1
  29. package/dist/api/chatkit/default-agent.js.map +1 -1
  30. package/dist/api/chatkit/index.d.ts +8 -0
  31. package/dist/api/chatkit/index.js +15 -1
  32. package/dist/api/chatkit/index.js.map +1 -1
  33. package/dist/api/chatkit/pod-store.d.ts +80 -17
  34. package/dist/api/chatkit/pod-store.js +816 -162
  35. package/dist/api/chatkit/pod-store.js.map +1 -1
  36. package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
  37. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
  38. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
  39. package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
  40. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
  41. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
  42. package/dist/api/chatkit/schema.d.ts +53 -133
  43. package/dist/api/chatkit/schema.js +11 -175
  44. package/dist/api/chatkit/schema.js.map +1 -1
  45. package/dist/api/chatkit/service.d.ts +15 -9
  46. package/dist/api/chatkit/service.js +82 -234
  47. package/dist/api/chatkit/service.js.map +1 -1
  48. package/dist/api/chatkit/store.d.ts +35 -3
  49. package/dist/api/chatkit/store.js +157 -3
  50. package/dist/api/chatkit/store.js.map +1 -1
  51. package/dist/api/chatkit/types.d.ts +16 -2
  52. package/dist/api/chatkit/types.js +24 -5
  53. package/dist/api/chatkit/types.js.map +1 -1
  54. package/dist/api/container/common.js +59 -2
  55. package/dist/api/container/common.js.map +1 -1
  56. package/dist/api/container/index.js +15 -0
  57. package/dist/api/container/index.js.map +1 -1
  58. package/dist/api/container/routes.js +11 -0
  59. package/dist/api/container/routes.js.map +1 -1
  60. package/dist/api/container/types.d.ts +26 -0
  61. package/dist/api/container/types.js.map +1 -1
  62. package/dist/api/handlers/InngestHandler.d.ts +11 -0
  63. package/dist/api/handlers/InngestHandler.js +19 -0
  64. package/dist/api/handlers/InngestHandler.js.map +1 -0
  65. package/dist/api/handlers/RunHandler.d.ts +7 -0
  66. package/dist/api/handlers/RunHandler.js +169 -0
  67. package/dist/api/handlers/RunHandler.js.map +1 -0
  68. package/dist/api/handlers/index.d.ts +1 -0
  69. package/dist/api/handlers/index.js +1 -0
  70. package/dist/api/handlers/index.js.map +1 -1
  71. package/dist/api/models/namespaces.d.ts +2 -2
  72. package/dist/api/models/namespaces.js +1 -4
  73. package/dist/api/models/namespaces.js.map +1 -1
  74. package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
  75. package/dist/api/runs/AgentRuntimeTypes.js +3 -0
  76. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
  77. package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
  78. package/dist/api/runs/EmbeddedInngestService.js +203 -0
  79. package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
  80. package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
  81. package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
  82. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
  83. package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
  84. package/dist/api/runs/ManagedRunWorker.js +452 -0
  85. package/dist/api/runs/ManagedRunWorker.js.map +1 -0
  86. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
  87. package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
  88. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
  89. package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
  90. package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
  91. package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
  92. package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
  93. package/dist/api/runs/RunAuthContextRegistry.js +59 -0
  94. package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
  95. package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
  96. package/dist/api/runs/RunExecutionBackend.js +3 -0
  97. package/dist/api/runs/RunExecutionBackend.js.map +1 -0
  98. package/dist/api/runs/RunStateCenter.d.ts +82 -0
  99. package/dist/api/runs/RunStateCenter.js +665 -0
  100. package/dist/api/runs/RunStateCenter.js.map +1 -0
  101. package/dist/api/runs/schema.d.ts +55 -0
  102. package/dist/api/runs/schema.js +14 -0
  103. package/dist/api/runs/schema.js.map +1 -0
  104. package/dist/api/runs/store.d.ts +105 -0
  105. package/dist/api/runs/store.js +116 -0
  106. package/dist/api/runs/store.js.map +1 -0
  107. package/dist/api/runtime.d.ts +2 -0
  108. package/dist/api/runtime.js +40 -1
  109. package/dist/api/runtime.js.map +1 -1
  110. package/dist/api/service/VectorStoreService.d.ts +1 -0
  111. package/dist/api/service/VectorStoreService.js +27 -34
  112. package/dist/api/service/VectorStoreService.js.map +1 -1
  113. package/dist/api/service/provider-registry.d.ts +1 -1
  114. package/dist/api/service/provider-registry.js +1 -1
  115. package/dist/api/service/provider-registry.js.map +1 -1
  116. package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
  117. package/dist/api/tasks/InngestTaskScheduler.js +209 -0
  118. package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
  119. package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
  120. package/dist/api/tasks/TaskAuthBinding.js +162 -0
  121. package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
  122. package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
  123. package/dist/api/tasks/TaskMaterializer.js +452 -0
  124. package/dist/api/tasks/TaskMaterializer.js.map +1 -0
  125. package/dist/api/tasks/TaskService.d.ts +57 -0
  126. package/dist/api/tasks/TaskService.js +235 -0
  127. package/dist/api/tasks/TaskService.js.map +1 -0
  128. package/dist/api/tasks/index.d.ts +6 -0
  129. package/dist/api/tasks/index.js +25 -0
  130. package/dist/api/tasks/index.js.map +1 -0
  131. package/dist/api/tasks/schema.d.ts +23 -0
  132. package/dist/api/tasks/schema.js +8 -0
  133. package/dist/api/tasks/schema.js.map +1 -0
  134. package/dist/api/tasks/store.d.ts +40 -0
  135. package/dist/api/tasks/store.js +34 -0
  136. package/dist/api/tasks/store.js.map +1 -0
  137. package/dist/api/workspace/types.d.ts +3 -0
  138. package/dist/api/workspace/types.js +23 -0
  139. package/dist/api/workspace/types.js.map +1 -0
  140. package/dist/cli/commands/config.d.ts +8 -7
  141. package/dist/cli/commands/config.js +72 -48
  142. package/dist/cli/commands/config.js.map +1 -1
  143. package/dist/cli/commands/login.d.ts +10 -8
  144. package/dist/cli/commands/login.js +84 -84
  145. package/dist/cli/commands/login.js.map +1 -1
  146. package/dist/cli/index.js +3 -124
  147. package/dist/cli/index.js.map +1 -1
  148. package/dist/http/search/SearchHttpHandler.js +13 -18
  149. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  150. package/dist/runtime/configure-drizzle-solid.js +52 -0
  151. package/dist/runtime/configure-drizzle-solid.js.map +1 -1
  152. package/dist/storage/quint/PgQuintStore.d.ts +6 -0
  153. package/dist/storage/quint/PgQuintStore.js +83 -5
  154. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  155. package/dist/storage/quint/PgQuintStore.jsonld +24 -0
  156. package/dist/storage/quint/SqliteQuintStore.d.ts +1 -0
  157. package/dist/storage/quint/SqliteQuintStore.js +52 -0
  158. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  159. package/dist/storage/quint/SqliteQuintStore.jsonld +4 -0
  160. package/dist/storage/quint/types.d.ts +6 -0
  161. package/dist/storage/quint/types.js.map +1 -1
  162. package/dist/storage/sparql/FilterPushdownExtractor.js +23 -11
  163. package/dist/storage/sparql/FilterPushdownExtractor.js.map +1 -1
  164. package/dist/storage/vector/VectorIndexingListener.js +13 -18
  165. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  166. package/dist/util/identifiers/ClusterIdentifierStrategy.js +29 -1
  167. package/dist/util/identifiers/ClusterIdentifierStrategy.js.map +1 -1
  168. package/dist/vocab/index.d.ts +2 -6
  169. package/dist/vocab/index.js +2 -6
  170. package/dist/vocab/index.js.map +1 -1
  171. package/dist/vocab/udfs.d.ts +12 -0
  172. package/dist/vocab/udfs.js +12 -0
  173. package/dist/vocab/udfs.js.map +1 -1
  174. package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
  175. package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
  176. package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
  177. package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
  178. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
  179. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
  180. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +43 -10
  181. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
  182. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.d.ts.map +1 -1
  183. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
  184. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
  185. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
  186. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
  187. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
  188. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
  189. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
  190. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
  191. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +21 -2
  192. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
  193. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts +1 -0
  194. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
  195. package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
  196. package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
  197. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
  198. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
  199. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
  200. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
  201. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
  202. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
  203. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
  204. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
  205. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
  206. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
  207. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
  208. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
  209. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
  210. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
  211. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
  212. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
  213. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
  214. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  215. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -51
  216. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
  217. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts +1 -0
  218. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
  219. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
  220. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
  221. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
  222. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
  223. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +4 -4
  224. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
  225. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
  226. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
  227. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
  228. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
  229. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
  230. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
  231. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
  232. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
  233. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
  234. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
  235. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
  236. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
  237. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
  238. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
  239. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
  240. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
  241. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
  242. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
  243. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
  244. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
  245. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
  246. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
  247. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
  248. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
  249. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
  250. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
  251. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
  252. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
  253. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
  254. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
  255. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
  256. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
  257. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
  258. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
  259. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
  260. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
  261. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
  262. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
  263. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
  264. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
  265. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
  266. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
  267. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
  268. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.map +1 -1
  269. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
  270. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
  271. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +43 -10
  272. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
  273. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -1
  274. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
  275. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
  276. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
  277. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
  278. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
  279. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
  280. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
  281. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
  282. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +21 -2
  283. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
  284. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +1 -0
  285. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
  286. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
  287. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
  288. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
  289. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
  290. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
  291. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
  292. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +28 -1
  293. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
  294. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
  295. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
  296. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
  297. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
  298. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
  299. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
  300. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
  301. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
  302. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
  303. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
  304. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
  305. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  306. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -51
  307. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  308. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +1 -0
  309. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
  310. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
  311. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
  312. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
  313. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
  314. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +4 -4
  315. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
  316. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
  317. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
  318. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
  319. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
  320. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
  321. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
  322. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
  323. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
  324. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
  325. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
  326. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
  327. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
  328. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
  329. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
  330. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
  331. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
  332. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
  333. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
  334. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
  335. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
  336. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
  337. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
  338. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
  339. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
  340. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
  341. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
  342. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
  343. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
  344. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
  345. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
  346. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
  347. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
  348. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
  349. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
  350. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
  351. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
  352. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
  353. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
  354. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
  355. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
  356. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
  357. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
  358. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
  359. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
  360. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
  361. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
  362. package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
  363. package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
  364. package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
  365. package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
  366. package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
  367. package/package.json +5 -3
  368. package/scripts/patch-jose.js +62 -12
  369. package/dist/agents/AgentManager.d.ts +0 -116
  370. package/dist/agents/AgentManager.js +0 -290
  371. package/dist/agents/AgentManager.js.map +0 -1
  372. package/dist/agents/IndexAgent.d.ts +0 -70
  373. package/dist/agents/IndexAgent.js +0 -417
  374. package/dist/agents/IndexAgent.js.map +0 -1
  375. package/dist/agents/config/parse-agent-md.d.ts +0 -33
  376. package/dist/agents/config/parse-agent-md.js +0 -75
  377. package/dist/agents/config/parse-agent-md.js.map +0 -1
  378. package/dist/agents/schema/agent-config.d.ts +0 -2
  379. package/dist/agents/schema/agent-config.js +0 -32
  380. package/dist/agents/schema/agent-config.js.map +0 -1
  381. package/dist/agents/schema/create-agent-schema.d.ts +0 -25
  382. package/dist/agents/schema/create-agent-schema.js +0 -35
  383. package/dist/agents/schema/create-agent-schema.js.map +0 -1
  384. package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
  385. package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
  386. package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
  387. package/dist/cli/lib/agent-session.d.ts +0 -37
  388. package/dist/cli/lib/agent-session.js +0 -211
  389. package/dist/cli/lib/agent-session.js.map +0 -1
  390. package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
  391. package/dist/cli/lib/ensure-ai-credentials.js +0 -40
  392. package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
  393. package/dist/cli/lib/model-manager.d.ts +0 -37
  394. package/dist/cli/lib/model-manager.js +0 -251
  395. package/dist/cli/lib/model-manager.js.map +0 -1
  396. package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
  397. package/dist/cli/lib/oauth-credential-manager.js +0 -129
  398. package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
  399. package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
  400. package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
  401. package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
  402. package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
  403. package/dist/cli/lib/oauth-providers/index.js +0 -23
  404. package/dist/cli/lib/oauth-providers/index.js.map +0 -1
  405. package/dist/cli/lib/pi-optional.d.ts +0 -84
  406. package/dist/cli/lib/pi-optional.js +0 -35
  407. package/dist/cli/lib/pi-optional.js.map +0 -1
  408. package/dist/cli/lib/pod-ai-config.d.ts +0 -26
  409. package/dist/cli/lib/pod-ai-config.js +0 -99
  410. package/dist/cli/lib/pod-ai-config.js.map +0 -1
  411. package/dist/cli/lib/pod-thread-store.d.ts +0 -57
  412. package/dist/cli/lib/pod-thread-store.js +0 -312
  413. package/dist/cli/lib/pod-thread-store.js.map +0 -1
  414. package/dist/cli/lib/secretary-prompt.d.ts +0 -6
  415. package/dist/cli/lib/secretary-prompt.js +0 -85
  416. package/dist/cli/lib/secretary-prompt.js.map +0 -1
  417. package/dist/task/DrizzleTaskQueue.d.ts +0 -56
  418. package/dist/task/DrizzleTaskQueue.js +0 -171
  419. package/dist/task/DrizzleTaskQueue.js.map +0 -1
  420. package/dist/task/TaskExecutor.d.ts +0 -82
  421. package/dist/task/TaskExecutor.js +0 -198
  422. package/dist/task/TaskExecutor.js.map +0 -1
  423. package/dist/task/index.d.ts +0 -10
  424. package/dist/task/index.js +0 -20
  425. package/dist/task/index.js.map +0 -1
  426. package/dist/task/schema.d.ts +0 -53
  427. package/dist/task/schema.js +0 -71
  428. package/dist/task/schema.js.map +0 -1
  429. package/dist/task/types.d.ts +0 -186
  430. package/dist/task/types.js +0 -12
  431. package/dist/task/types.js.map +0 -1
@@ -5,6 +5,9 @@
5
5
  * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/store.py
6
6
  */
7
7
  import type { ThreadMetadata, ThreadRef, ThreadItem, Attachment, Page, StoreItemType } from './types';
8
+ import { type RunListOptions, type RunRecordData, type RunStepRecordData, type RunStore } from '../runs/store';
9
+ import { type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';
10
+ import { type TaskAuthBindingRepository, type TaskAuthCredentialRecord } from '../tasks/TaskAuthBinding';
8
11
  /**
9
12
  * Context type for store operations (generic)
10
13
  */
@@ -12,7 +15,7 @@ export type StoreContext = Record<string, unknown>;
12
15
  /**
13
16
  * Abstract Store interface
14
17
  */
15
- export interface ChatKitStore<TContext = StoreContext> {
18
+ export interface ChatKitStore<TContext = StoreContext> extends Partial<RunStore<TContext>> {
16
19
  generateThreadId(context: TContext): string;
17
20
  generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;
18
21
  loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;
@@ -34,15 +37,19 @@ export interface ChatKitStore<TContext = StoreContext> {
34
37
  * Simple in-memory store for development and testing.
35
38
  * Data is lost when the server restarts.
36
39
  */
37
- export declare class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext> {
40
+ export declare class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext>, TaskStore<TContext>, TaskAuthBindingRepository<TContext & StoreContext> {
38
41
  private threads;
39
42
  private items;
40
43
  private attachments;
44
+ private runs;
45
+ private runSteps;
46
+ private tasks;
47
+ private taskAuthCredentials;
41
48
  private getUserKey;
42
49
  private getThreadKey;
43
50
  private normalizeThreadId;
44
51
  generateThreadId(_context: TContext): string;
45
- generateItemId(itemType: StoreItemType, _thread: ThreadMetadata, _context: TContext): string;
52
+ generateItemId(itemType: StoreItemType, thread: ThreadMetadata, _context: TContext): string;
46
53
  loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;
47
54
  saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;
48
55
  loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>>;
@@ -55,10 +62,35 @@ export declare class InMemoryStore<TContext = StoreContext> implements ChatKitSt
55
62
  saveAttachment(attachment: Attachment, _context: TContext): Promise<void>;
56
63
  loadAttachment(attachmentId: string, _context: TContext): Promise<Attachment>;
57
64
  deleteAttachment(attachmentId: string, _context: TContext): Promise<void>;
65
+ saveRun(run: RunRecordData, context: TContext): Promise<void>;
66
+ loadRun(runId: string, context: TContext): Promise<RunRecordData>;
67
+ listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]>;
68
+ appendRunStep(event: RunStepRecordData, context: TContext): Promise<void>;
69
+ loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]>;
70
+ claimRun(input: {
71
+ runId: string;
72
+ leaseOwner: string;
73
+ leaseExpiresAt: number;
74
+ now: number;
75
+ }, context: TContext): Promise<RunRecordData | undefined>;
76
+ saveTask(task: TaskRecordData, context: TContext): Promise<void>;
77
+ loadTask(taskId: string, context: TContext): Promise<TaskRecordData>;
78
+ listTasks(options: TaskListOptions, context: TContext): Promise<TaskRecordData[]>;
79
+ saveTaskAuthCredential(input: {
80
+ id: string;
81
+ apiKey: string;
82
+ displayName?: string;
83
+ expiresAt?: number;
84
+ }, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord>;
85
+ loadTaskAuthCredential(id: string, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord | undefined>;
86
+ private withAuthBindingMetadata;
58
87
  getStats(): {
59
88
  threads: number;
60
89
  items: number;
61
90
  attachments: number;
62
91
  };
63
92
  clear(): void;
93
+ private getRunKey;
94
+ private getTaskKey;
95
+ private getTaskAuthCredentialKey;
64
96
  }
@@ -8,6 +8,9 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.InMemoryStore = void 0;
10
10
  const types_1 = require("./types");
11
+ const store_1 = require("../runs/store");
12
+ const store_2 = require("../tasks/store");
13
+ const TaskAuthBinding_1 = require("../tasks/TaskAuthBinding");
11
14
  /**
12
15
  * In-Memory Store Implementation
13
16
  *
@@ -19,6 +22,10 @@ class InMemoryStore {
19
22
  this.threads = new Map();
20
23
  this.items = new Map(); // threadId -> (itemId -> item)
21
24
  this.attachments = new Map();
25
+ this.runs = new Map();
26
+ this.runSteps = new Map();
27
+ this.tasks = new Map();
28
+ this.taskAuthCredentials = new Map();
22
29
  }
23
30
  // Store per-user data using a key from context
24
31
  getUserKey(context) {
@@ -33,10 +40,18 @@ class InMemoryStore {
33
40
  }
34
41
  // ID Generation
35
42
  generateThreadId(_context) {
36
- return (0, types_1.generateId)('thread');
43
+ return `chat/default/index.ttl#${(0, types_1.generateId)('thread')}`;
37
44
  }
38
- generateItemId(itemType, _thread, _context) {
39
- return (0, types_1.generateId)(itemType);
45
+ generateItemId(itemType, thread, _context) {
46
+ const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';
47
+ const surfaceId = typeof thread.metadata?.surface_id === 'string'
48
+ ? thread.metadata.surface_id
49
+ : (typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : 'default');
50
+ const date = new Date();
51
+ const yyyy = String(date.getUTCFullYear());
52
+ const MM = String(date.getUTCMonth() + 1).padStart(2, '0');
53
+ const dd = String(date.getUTCDate()).padStart(2, '0');
54
+ return `${commandKind}/${surfaceId}/${yyyy}/${MM}/${dd}/messages.ttl#${(0, types_1.generateId)(itemType)}`;
40
55
  }
41
56
  // Thread operations
42
57
  async loadThread(thread, context) {
@@ -165,6 +180,132 @@ class InMemoryStore {
165
180
  async deleteAttachment(attachmentId, _context) {
166
181
  this.attachments.delete(attachmentId);
167
182
  }
183
+ async saveRun(run, context) {
184
+ run.id = (0, store_1.buildRunResourceId)(run);
185
+ this.runs.set(this.getRunKey(run.id, context), { ...run });
186
+ }
187
+ async loadRun(runId, context) {
188
+ const run = this.runs.get(this.getRunKey(runId, context));
189
+ if (!run) {
190
+ throw new Error(`Run not found: ${runId}`);
191
+ }
192
+ return { ...run };
193
+ }
194
+ async listRuns(options, context) {
195
+ const userKey = this.getUserKey(context);
196
+ const prefix = `${userKey}:`;
197
+ let runs = Array.from(this.runs.entries())
198
+ .filter(([key]) => key.startsWith(prefix))
199
+ .map(([, run]) => ({ ...run }));
200
+ if (options.task) {
201
+ runs = runs.filter((run) => run.task === options.task);
202
+ }
203
+ if (options.thread) {
204
+ runs = runs.filter((run) => run.thread === options.thread);
205
+ }
206
+ if (options.workspace) {
207
+ runs = runs.filter((run) => run.workspace === options.workspace);
208
+ }
209
+ if (options.commandKind) {
210
+ runs = runs.filter((run) => run.commandKind === options.commandKind);
211
+ }
212
+ if (options.status) {
213
+ runs = runs.filter((run) => run.status === options.status);
214
+ }
215
+ runs.sort((a, b) => b.createdAt - a.createdAt || b.id.localeCompare(a.id));
216
+ return runs.slice(0, options.limit ?? runs.length);
217
+ }
218
+ async appendRunStep(event, context) {
219
+ if (!(0, store_1.isRunResourceId)(event.runId)) {
220
+ throw new Error(`RunStep runId must be a complete Run resource id: ${event.runId}`);
221
+ }
222
+ event.id = (0, store_1.buildRunStepResourceId)(event);
223
+ const key = this.getRunKey(event.runId, context);
224
+ const events = this.runSteps.get(key) ?? [];
225
+ events.push({ ...event });
226
+ this.runSteps.set(key, events);
227
+ }
228
+ async loadRunSteps(runId, context) {
229
+ return [...(this.runSteps.get(this.getRunKey(runId, context)) ?? [])];
230
+ }
231
+ async claimRun(input, context) {
232
+ const key = this.getRunKey(input.runId, context);
233
+ const run = this.runs.get(key);
234
+ if (!run || !(0, store_1.canClaimRun)(run, input)) {
235
+ return undefined;
236
+ }
237
+ const claimed = {
238
+ ...run,
239
+ leaseOwner: input.leaseOwner,
240
+ leaseExpiresAt: input.leaseExpiresAt,
241
+ heartbeatAt: input.now,
242
+ updatedAt: input.now,
243
+ };
244
+ this.runs.set(key, claimed);
245
+ return { ...claimed };
246
+ }
247
+ async saveTask(task, context) {
248
+ task.id = (0, store_2.buildTaskResourceId)(task.id);
249
+ this.tasks.set(this.getTaskKey(task.id, context), {
250
+ ...task,
251
+ metadata: this.withAuthBindingMetadata(task.metadata, task.authBinding),
252
+ });
253
+ }
254
+ async loadTask(taskId, context) {
255
+ const task = this.tasks.get(this.getTaskKey(taskId, context));
256
+ if (!task) {
257
+ throw new Error(`Task not found: ${taskId}`);
258
+ }
259
+ return { ...task };
260
+ }
261
+ async listTasks(options, context) {
262
+ const userKey = this.getUserKey(context);
263
+ const prefix = `${userKey}:`;
264
+ const dueAt = options.dueAt ?? (0, types_1.nowTimestamp)();
265
+ let tasks = Array.from(this.tasks.entries())
266
+ .filter(([key]) => key.startsWith(prefix))
267
+ .map(([, task]) => ({ ...task }));
268
+ if (options.status) {
269
+ tasks = tasks.filter((task) => task.status === options.status);
270
+ }
271
+ if (options.triggerKind) {
272
+ tasks = tasks.filter((task) => task.triggerKind === options.triggerKind);
273
+ }
274
+ if (options.eventName) {
275
+ tasks = tasks.filter((task) => task.eventName === options.eventName);
276
+ }
277
+ if (typeof options.dueAt === 'number') {
278
+ tasks = tasks.filter((task) => typeof task.nextRunAt === 'number' && task.nextRunAt <= dueAt);
279
+ }
280
+ tasks.sort((a, b) => (a.nextRunAt ?? a.createdAt) - (b.nextRunAt ?? b.createdAt) || a.id.localeCompare(b.id));
281
+ return tasks.slice(0, options.limit ?? tasks.length);
282
+ }
283
+ async saveTaskAuthCredential(input, context) {
284
+ const record = {
285
+ id: input.id,
286
+ service: TaskAuthBinding_1.TASK_AUTH_CREDENTIAL_SERVICE,
287
+ status: 'active',
288
+ apiKey: input.apiKey,
289
+ label: input.displayName,
290
+ oauthExpiresAt: input.expiresAt ? new Date(input.expiresAt * 1000).toISOString() : undefined,
291
+ createdAt: new Date().toISOString(),
292
+ };
293
+ this.taskAuthCredentials.set(this.getTaskAuthCredentialKey(input.id, context), record);
294
+ return { ...record };
295
+ }
296
+ async loadTaskAuthCredential(id, context) {
297
+ const record = this.taskAuthCredentials.get(this.getTaskAuthCredentialKey(id, context));
298
+ return record ? { ...record } : undefined;
299
+ }
300
+ withAuthBindingMetadata(metadata, authBinding) {
301
+ if (!authBinding) {
302
+ return metadata;
303
+ }
304
+ return {
305
+ ...(metadata ?? {}),
306
+ authBinding,
307
+ };
308
+ }
168
309
  // Utility methods for debugging
169
310
  getStats() {
170
311
  let totalItems = 0;
@@ -181,6 +322,19 @@ class InMemoryStore {
181
322
  this.threads.clear();
182
323
  this.items.clear();
183
324
  this.attachments.clear();
325
+ this.runs.clear();
326
+ this.runSteps.clear();
327
+ this.tasks.clear();
328
+ this.taskAuthCredentials.clear();
329
+ }
330
+ getRunKey(runId, context) {
331
+ return `${this.getUserKey(context)}:${runId}`;
332
+ }
333
+ getTaskKey(taskId, context) {
334
+ return `${this.getUserKey(context)}:${taskId}`;
335
+ }
336
+ getTaskAuthCredentialKey(id, context) {
337
+ return `${this.getUserKey(context)}:${id}`;
184
338
  }
185
339
  }
186
340
  exports.InMemoryStore = InMemoryStore;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/chatkit/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Store Interface\n * \n * Abstract interface for persisting threads and items.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/store.py\n */\n\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n} from './types';\nimport { generateId, getThreadIdFromRef, nowTimestamp } from './types';\n\n/**\n * Context type for store operations (generic)\n */\nexport type StoreContext = Record<string, unknown>;\n\n/**\n * Abstract Store interface\n */\nexport interface ChatKitStore<TContext = StoreContext> {\n // ID Generation\n generateThreadId(context: TContext): string;\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;\n\n // Thread operations\n loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;\n saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;\n loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>>;\n deleteThread(thread: ThreadRef, context: TContext): Promise<void>;\n\n // Thread Item operations\n loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>>;\n addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem>;\n deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void>;\n\n // Attachment operations (optional)\n saveAttachment?(attachment: Attachment, context: TContext): Promise<void>;\n loadAttachment?(attachmentId: string, context: TContext): Promise<Attachment>;\n deleteAttachment?(attachmentId: string, context: TContext): Promise<void>;\n}\n\n/**\n * In-Memory Store Implementation\n * \n * Simple in-memory store for development and testing.\n * Data is lost when the server restarts.\n */\nexport class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext> {\n private threads: Map<string, ThreadMetadata> = new Map();\n private items: Map<string, Map<string, ThreadItem>> = new Map(); // threadId -> (itemId -> item)\n private attachments: Map<string, Attachment> = new Map();\n\n // Store per-user data using a key from context\n private getUserKey(context: TContext): string {\n const userId = (context as Record<string, unknown>).userId;\n return typeof userId === 'string' ? userId : 'default';\n }\n\n private getThreadKey(threadId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${threadId}`;\n }\n\n private normalizeThreadId(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n // ID Generation\n generateThreadId(_context: TContext): string {\n return generateId('thread');\n }\n\n generateItemId(itemType: StoreItemType, _thread: ThreadMetadata, _context: TContext): string {\n return generateId(itemType);\n }\n\n // Thread operations\n async loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadData = this.threads.get(key);\n if (!threadData) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n return threadData;\n }\n\n async saveThread(thread: ThreadMetadata, context: TContext): Promise<void> {\n const key = this.getThreadKey(thread.id, context);\n this.threads.set(key, { ...thread, updated_at: nowTimestamp() });\n }\n\n async loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n \n // Get all threads for this user\n const userThreads: ThreadMetadata[] = [];\n for (const [key, thread] of this.threads) {\n if (key.startsWith(prefix)) {\n userThreads.push(thread);\n }\n }\n\n // Sort by created_at\n userThreads.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = userThreads.findIndex((t) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = userThreads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < userThreads.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async deleteThread(thread: ThreadRef, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n this.threads.delete(key);\n this.items.delete(key);\n }\n\n // Thread Item operations\n async loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n \n if (!threadItems) {\n return { data: [], has_more: false };\n }\n\n const itemList = Array.from(threadItems.values());\n \n // Sort by created_at\n itemList.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = itemList.findIndex((item) => item.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = itemList.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < itemList.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n let threadItems = this.items.get(key);\n if (!threadItems) {\n threadItems = new Map();\n this.items.set(key, threadItems);\n }\n threadItems.set(item.id, item);\n }\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n await this.addThreadItem(thread, item, context);\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (!threadItems) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const item = threadItems.get(itemId);\n if (!item) {\n throw new Error(`Item not found: ${itemId}`);\n }\n return item;\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (threadItems) {\n threadItems.delete(itemId);\n }\n }\n\n // Attachment operations\n async saveAttachment(attachment: Attachment, _context: TContext): Promise<void> {\n this.attachments.set(attachment.id, attachment);\n }\n\n async loadAttachment(attachmentId: string, _context: TContext): Promise<Attachment> {\n const attachment = this.attachments.get(attachmentId);\n if (!attachment) {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n return attachment;\n }\n\n async deleteAttachment(attachmentId: string, _context: TContext): Promise<void> {\n this.attachments.delete(attachmentId);\n }\n\n // Utility methods for debugging\n getStats(): { threads: number; items: number; attachments: number } {\n let totalItems = 0;\n for (const threadItems of this.items.values()) {\n totalItems += threadItems.size;\n }\n return {\n threads: this.threads.size,\n items: totalItems,\n attachments: this.attachments.size,\n };\n }\n\n clear(): void {\n this.threads.clear();\n this.items.clear();\n this.attachments.clear();\n }\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/chatkit/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Store Interface\n * \n * Abstract interface for persisting threads and items.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/store.py\n */\n\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n} from './types';\nimport { generateId, getThreadIdFromRef, nowTimestamp } from './types';\nimport {\n buildRunResourceId,\n buildRunStepResourceId,\n canClaimRun,\n isRunResourceId,\n type RunListOptions,\n type RunRecordData,\n type RunStepRecordData,\n type RunStore,\n} from '../runs/store';\nimport { buildTaskResourceId, type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';\nimport {\n TASK_AUTH_CREDENTIAL_SERVICE,\n type TaskAuthBindingRepository,\n type TaskAuthCredentialRecord,\n} from '../tasks/TaskAuthBinding';\n\n/**\n * Context type for store operations (generic)\n */\nexport type StoreContext = Record<string, unknown>;\n\n/**\n * Abstract Store interface\n */\nexport interface ChatKitStore<TContext = StoreContext> extends Partial<RunStore<TContext>> {\n // ID Generation\n generateThreadId(context: TContext): string;\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;\n\n // Thread operations\n loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;\n saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;\n loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>>;\n deleteThread(thread: ThreadRef, context: TContext): Promise<void>;\n\n // Thread Item operations\n loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>>;\n addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem>;\n deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void>;\n\n // Attachment operations (optional)\n saveAttachment?(attachment: Attachment, context: TContext): Promise<void>;\n loadAttachment?(attachmentId: string, context: TContext): Promise<Attachment>;\n deleteAttachment?(attachmentId: string, context: TContext): Promise<void>;\n}\n\n/**\n * In-Memory Store Implementation\n * \n * Simple in-memory store for development and testing.\n * Data is lost when the server restarts.\n */\nexport class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext>, TaskStore<TContext>, TaskAuthBindingRepository<TContext & StoreContext> {\n private threads: Map<string, ThreadMetadata> = new Map();\n private items: Map<string, Map<string, ThreadItem>> = new Map(); // threadId -> (itemId -> item)\n private attachments: Map<string, Attachment> = new Map();\n private runs: Map<string, RunRecordData> = new Map();\n private runSteps: Map<string, RunStepRecordData[]> = new Map();\n private tasks: Map<string, TaskRecordData> = new Map();\n private taskAuthCredentials: Map<string, TaskAuthCredentialRecord> = new Map();\n\n // Store per-user data using a key from context\n private getUserKey(context: TContext): string {\n const userId = (context as Record<string, unknown>).userId;\n return typeof userId === 'string' ? userId : 'default';\n }\n\n private getThreadKey(threadId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${threadId}`;\n }\n\n private normalizeThreadId(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n // ID Generation\n generateThreadId(_context: TContext): string {\n return `chat/default/index.ttl#${generateId('thread')}`;\n }\n\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, _context: TContext): string {\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = typeof thread.metadata?.surface_id === 'string'\n ? thread.metadata.surface_id\n : (typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : 'default');\n const date = new Date();\n const yyyy = String(date.getUTCFullYear());\n const MM = String(date.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(date.getUTCDate()).padStart(2, '0');\n return `${commandKind}/${surfaceId}/${yyyy}/${MM}/${dd}/messages.ttl#${generateId(itemType)}`;\n }\n\n // Thread operations\n async loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadData = this.threads.get(key);\n if (!threadData) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n return threadData;\n }\n\n async saveThread(thread: ThreadMetadata, context: TContext): Promise<void> {\n const key = this.getThreadKey(thread.id, context);\n this.threads.set(key, { ...thread, updated_at: nowTimestamp() });\n }\n\n async loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n \n // Get all threads for this user\n const userThreads: ThreadMetadata[] = [];\n for (const [key, thread] of this.threads) {\n if (key.startsWith(prefix)) {\n userThreads.push(thread);\n }\n }\n\n // Sort by created_at\n userThreads.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = userThreads.findIndex((t) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = userThreads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < userThreads.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async deleteThread(thread: ThreadRef, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n this.threads.delete(key);\n this.items.delete(key);\n }\n\n // Thread Item operations\n async loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n \n if (!threadItems) {\n return { data: [], has_more: false };\n }\n\n const itemList = Array.from(threadItems.values());\n \n // Sort by created_at\n itemList.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = itemList.findIndex((item) => item.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = itemList.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < itemList.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n let threadItems = this.items.get(key);\n if (!threadItems) {\n threadItems = new Map();\n this.items.set(key, threadItems);\n }\n threadItems.set(item.id, item);\n }\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n await this.addThreadItem(thread, item, context);\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (!threadItems) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const item = threadItems.get(itemId);\n if (!item) {\n throw new Error(`Item not found: ${itemId}`);\n }\n return item;\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (threadItems) {\n threadItems.delete(itemId);\n }\n }\n\n // Attachment operations\n async saveAttachment(attachment: Attachment, _context: TContext): Promise<void> {\n this.attachments.set(attachment.id, attachment);\n }\n\n async loadAttachment(attachmentId: string, _context: TContext): Promise<Attachment> {\n const attachment = this.attachments.get(attachmentId);\n if (!attachment) {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n return attachment;\n }\n\n async deleteAttachment(attachmentId: string, _context: TContext): Promise<void> {\n this.attachments.delete(attachmentId);\n }\n\n async saveRun(run: RunRecordData, context: TContext): Promise<void> {\n run.id = buildRunResourceId(run);\n this.runs.set(this.getRunKey(run.id, context), { ...run });\n }\n\n async loadRun(runId: string, context: TContext): Promise<RunRecordData> {\n const run = this.runs.get(this.getRunKey(runId, context));\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n return { ...run };\n }\n\n async listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n let runs = Array.from(this.runs.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, run]) => ({ ...run }));\n\n if (options.task) {\n runs = runs.filter((run) => run.task === options.task);\n }\n if (options.thread) {\n runs = runs.filter((run) => run.thread === options.thread);\n }\n if (options.workspace) {\n runs = runs.filter((run) => run.workspace === options.workspace);\n }\n if (options.commandKind) {\n runs = runs.filter((run) => run.commandKind === options.commandKind);\n }\n if (options.status) {\n runs = runs.filter((run) => run.status === options.status);\n }\n\n runs.sort((a, b) => b.createdAt - a.createdAt || b.id.localeCompare(a.id));\n return runs.slice(0, options.limit ?? runs.length);\n }\n\n async appendRunStep(event: RunStepRecordData, context: TContext): Promise<void> {\n if (!isRunResourceId(event.runId)) {\n throw new Error(`RunStep runId must be a complete Run resource id: ${event.runId}`);\n }\n event.id = buildRunStepResourceId(event);\n const key = this.getRunKey(event.runId, context);\n const events = this.runSteps.get(key) ?? [];\n events.push({ ...event });\n this.runSteps.set(key, events);\n }\n\n async loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]> {\n return [...(this.runSteps.get(this.getRunKey(runId, context)) ?? [])];\n }\n\n async claimRun(input: {\n runId: string;\n leaseOwner: string;\n leaseExpiresAt: number;\n now: number;\n }, context: TContext): Promise<RunRecordData | undefined> {\n const key = this.getRunKey(input.runId, context);\n const run = this.runs.get(key);\n if (!run || !canClaimRun(run, input)) {\n return undefined;\n }\n const claimed = {\n ...run,\n leaseOwner: input.leaseOwner,\n leaseExpiresAt: input.leaseExpiresAt,\n heartbeatAt: input.now,\n updatedAt: input.now,\n };\n this.runs.set(key, claimed);\n return { ...claimed };\n }\n\n async saveTask(task: TaskRecordData, context: TContext): Promise<void> {\n task.id = buildTaskResourceId(task.id);\n this.tasks.set(this.getTaskKey(task.id, context), {\n ...task,\n metadata: this.withAuthBindingMetadata(task.metadata, task.authBinding),\n });\n }\n\n async loadTask(taskId: string, context: TContext): Promise<TaskRecordData> {\n const task = this.tasks.get(this.getTaskKey(taskId, context));\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return { ...task };\n }\n\n async listTasks(options: TaskListOptions, context: TContext): Promise<TaskRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n const dueAt = options.dueAt ?? nowTimestamp();\n let tasks = Array.from(this.tasks.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, task]) => ({ ...task }));\n\n if (options.status) {\n tasks = tasks.filter((task) => task.status === options.status);\n }\n if (options.triggerKind) {\n tasks = tasks.filter((task) => task.triggerKind === options.triggerKind);\n }\n if (options.eventName) {\n tasks = tasks.filter((task) => task.eventName === options.eventName);\n }\n if (typeof options.dueAt === 'number') {\n tasks = tasks.filter((task) => typeof task.nextRunAt === 'number' && task.nextRunAt <= dueAt);\n }\n\n tasks.sort((a, b) => (a.nextRunAt ?? a.createdAt) - (b.nextRunAt ?? b.createdAt) || a.id.localeCompare(b.id));\n return tasks.slice(0, options.limit ?? tasks.length);\n }\n\n async saveTaskAuthCredential(input: {\n id: string;\n apiKey: string;\n displayName?: string;\n expiresAt?: number;\n }, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord> {\n const record: TaskAuthCredentialRecord = {\n id: input.id,\n service: TASK_AUTH_CREDENTIAL_SERVICE,\n status: 'active',\n apiKey: input.apiKey,\n label: input.displayName,\n oauthExpiresAt: input.expiresAt ? new Date(input.expiresAt * 1000).toISOString() : undefined,\n createdAt: new Date().toISOString(),\n };\n this.taskAuthCredentials.set(this.getTaskAuthCredentialKey(input.id, context), record);\n return { ...record };\n }\n\n async loadTaskAuthCredential(id: string, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord | undefined> {\n const record = this.taskAuthCredentials.get(this.getTaskAuthCredentialKey(id, context));\n return record ? { ...record } : undefined;\n }\n\n private withAuthBindingMetadata(\n metadata: Record<string, unknown> | undefined,\n authBinding: TaskRecordData['authBinding'],\n ): Record<string, unknown> | undefined {\n if (!authBinding) {\n return metadata;\n }\n return {\n ...(metadata ?? {}),\n authBinding,\n };\n }\n\n // Utility methods for debugging\n getStats(): { threads: number; items: number; attachments: number } {\n let totalItems = 0;\n for (const threadItems of this.items.values()) {\n totalItems += threadItems.size;\n }\n return {\n threads: this.threads.size,\n items: totalItems,\n attachments: this.attachments.size,\n };\n }\n\n clear(): void {\n this.threads.clear();\n this.items.clear();\n this.attachments.clear();\n this.runs.clear();\n this.runSteps.clear();\n this.tasks.clear();\n this.taskAuthCredentials.clear();\n }\n\n private getRunKey(runId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${runId}`;\n }\n\n private getTaskKey(taskId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${taskId}`;\n }\n\n private getTaskAuthCredentialKey(id: string, context: TContext): string {\n return `${this.getUserKey(context)}:${id}`;\n }\n}\n"]}
@@ -4,6 +4,7 @@
4
4
  * Type definitions for OpenAI ChatKit protocol.
5
5
  * Based on https://github.com/openai/chatkit-python
6
6
  */
7
+ import type { WorkspaceUri } from '../workspace/types';
7
8
  export interface Page<T> {
8
9
  data: T[];
9
10
  has_more: boolean;
@@ -25,6 +26,11 @@ export interface ThreadMetadata {
25
26
  id: string;
26
27
  title?: string;
27
28
  status: ThreadStatus;
29
+ /**
30
+ * Workspace Container URI selected for this thread.
31
+ * The Solid schema stores this as an RDF URI relation.
32
+ */
33
+ workspace?: WorkspaceUri;
28
34
  created_at: number;
29
35
  updated_at: number;
30
36
  metadata?: Record<string, unknown>;
@@ -34,7 +40,7 @@ export interface Thread extends ThreadMetadata {
34
40
  }
35
41
  export declare const DEFAULT_THREAD_CHAT_ID = "default";
36
42
  export type HttpIri = `http://${string}` | `https://${string}`;
37
- export interface ThreadLocatorRef {
43
+ export interface ThreadSurfaceRef {
38
44
  thread_id: string;
39
45
  chat_id: string;
40
46
  }
@@ -42,8 +48,9 @@ export interface ThreadIriRef {
42
48
  thread_id: HttpIri;
43
49
  chat_id?: never;
44
50
  }
45
- export type ThreadRef = ThreadLocatorRef | ThreadIriRef;
51
+ export type ThreadRef = ThreadSurfaceRef | ThreadIriRef;
46
52
  export declare function isHttpIri(value: string): value is HttpIri;
53
+ export declare function isBaseRelativeThreadResourceId(value: string): boolean;
47
54
  export declare function toThreadRef(params: {
48
55
  thread_id: string;
49
56
  chat_id?: string;
@@ -117,6 +124,7 @@ export interface ClientToolCallItem extends ThreadItemBase {
117
124
  call_id: string;
118
125
  status?: 'pending' | 'completed';
119
126
  output?: string;
127
+ metadata?: Record<string, unknown>;
120
128
  }
121
129
  export interface WidgetItem extends ThreadItemBase {
122
130
  type: 'widget';
@@ -229,6 +237,7 @@ export interface ThreadsGetByIdReq extends BaseReq {
229
237
  }
230
238
  export interface ThreadCreateParams {
231
239
  chat_id?: string;
240
+ workspace?: WorkspaceUri;
232
241
  input?: UserMessageInput;
233
242
  }
234
243
  export interface UserMessageInput {
@@ -282,6 +291,7 @@ export interface ThreadsRetryAfterItemReq extends BaseReq {
282
291
  }
283
292
  export type ThreadUpdateParams = ThreadRef & {
284
293
  title?: string;
294
+ workspace?: WorkspaceUri;
285
295
  };
286
296
  export interface ThreadsUpdateReq extends BaseReq {
287
297
  type: 'threads.update';
@@ -467,3 +477,7 @@ export declare function nowTimestamp(): number;
467
477
  * Extract text content from user message
468
478
  */
469
479
  export declare function extractUserMessageText(content: UserMessageContent[]): string;
480
+ /**
481
+ * Extract text content from assistant message
482
+ */
483
+ export declare function extractAssistantMessageText(content: AssistantMessageContent[]): string;
@@ -8,6 +8,7 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.DEFAULT_THREAD_CHAT_ID = void 0;
10
10
  exports.isHttpIri = isHttpIri;
11
+ exports.isBaseRelativeThreadResourceId = isBaseRelativeThreadResourceId;
11
12
  exports.toThreadRef = toThreadRef;
12
13
  exports.getThreadIdFromRef = getThreadIdFromRef;
13
14
  exports.getChatIdFromThreadMetadata = getChatIdFromThreadMetadata;
@@ -16,28 +17,37 @@ exports.isNonStreamingReq = isNonStreamingReq;
16
17
  exports.generateId = generateId;
17
18
  exports.nowTimestamp = nowTimestamp;
18
19
  exports.extractUserMessageText = extractUserMessageText;
20
+ exports.extractAssistantMessageText = extractAssistantMessageText;
19
21
  exports.DEFAULT_THREAD_CHAT_ID = 'default';
20
22
  function isHttpIri(value) {
21
23
  return value.startsWith('http://') || value.startsWith('https://');
22
24
  }
25
+ function isBaseRelativeThreadResourceId(value) {
26
+ return /^(chat|task)\/[^/]+\/index\.ttl#[^#]+$/.test(value);
27
+ }
23
28
  function toThreadRef(params) {
24
29
  if (isHttpIri(params.thread_id)) {
25
30
  return { thread_id: params.thread_id };
26
31
  }
32
+ if (isBaseRelativeThreadResourceId(params.thread_id)) {
33
+ return { thread_id: params.thread_id, chat_id: params.chat_id ?? exports.DEFAULT_THREAD_CHAT_ID };
34
+ }
27
35
  if (params.chat_id) {
28
36
  return { thread_id: params.thread_id, chat_id: params.chat_id };
29
37
  }
30
- throw new Error(`chat_id is required when thread_id "${params.thread_id}" is not a full thread IRI`);
38
+ throw new Error(`chat_id is required when thread_id "${params.thread_id}" is not a full thread resource id`);
31
39
  }
32
40
  function getThreadIdFromRef(thread) {
33
- if ('chat_id' in thread) {
41
+ if ('chat_id' in thread || isBaseRelativeThreadResourceId(thread.thread_id)) {
34
42
  return thread.thread_id;
35
43
  }
36
44
  try {
37
45
  const url = new URL(thread.thread_id);
38
- return url.hash.startsWith('#')
39
- ? decodeURIComponent(url.hash.slice(1))
40
- : thread.thread_id;
46
+ const dataIndex = url.pathname.indexOf('/.data/');
47
+ if (dataIndex >= 0 && url.hash) {
48
+ return `${url.pathname.slice(dataIndex + '/.data/'.length)}${url.hash}`;
49
+ }
50
+ return url.hash.startsWith('#') ? decodeURIComponent(url.hash.slice(1)) : thread.thread_id;
41
51
  }
42
52
  catch {
43
53
  return thread.thread_id;
@@ -85,4 +95,13 @@ function extractUserMessageText(content) {
85
95
  .map((c) => c.text)
86
96
  .join('\n');
87
97
  }
98
+ /**
99
+ * Extract text content from assistant message
100
+ */
101
+ function extractAssistantMessageText(content) {
102
+ return content
103
+ .filter((c) => c.type === 'output_text')
104
+ .map((c) => c.text)
105
+ .join('\n');
106
+ }
88
107
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/chatkit/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA8DH,8BAEC;AAED,kCAQC;AAED,gDAYC;AAED,kEAKC;AA+kBD,wCAQC;AAED,8CAEC;AAKD,gCAIC;AAKD,oCAEC;AAKD,wDAKC;AAtqBY,QAAA,sBAAsB,GAAG,SAAS,CAAC;AAgBhD,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,WAAW,CAAC,MAA+C;IACzE,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,SAAS,4BAA4B,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAiB;IAClD,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAC7B,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAgB,2BAA2B,CAAC,MAAsB;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IACxC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QACpD,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,8BAAsB,CAAC;AAC7B,CAAC;AA2kBD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAgB,cAAc,CAAC,GAAe;IAC5C,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,gBAAgB;QAC7B,GAAG,CAAC,IAAI,KAAK,0BAA0B;QACvC,GAAG,CAAC,IAAI,KAAK,gCAAgC;QAC7C,GAAG,CAAC,IAAI,KAAK,0BAA0B;QACvC,GAAG,CAAC,IAAI,KAAK,uBAAuB,CACrC,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAe;IAC/C,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,MAAc;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,MAAM,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAA6B;IAClE,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAA+B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;SACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","sourcesContent":["/**\n * ChatKit Types\n * \n * Type definitions for OpenAI ChatKit protocol.\n * Based on https://github.com/openai/chatkit-python\n */\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\nexport interface Page<T> {\n data: T[];\n has_more: boolean;\n after?: string;\n}\n\n// ============================================================================\n// Thread Types\n// ============================================================================\n\nexport type ThreadStatusType = 'active' | 'locked' | 'closed';\n\nexport interface ActiveStatus {\n type: 'active';\n}\n\nexport interface LockedStatus {\n type: 'locked';\n reason?: string;\n}\n\nexport interface ClosedStatus {\n type: 'closed';\n}\n\nexport type ThreadStatus = ActiveStatus | LockedStatus | ClosedStatus;\n\nexport interface ThreadMetadata {\n id: string;\n title?: string;\n status: ThreadStatus;\n created_at: number;\n updated_at: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Thread extends ThreadMetadata {\n items: Page<ThreadItem>;\n}\n\nexport const DEFAULT_THREAD_CHAT_ID = 'default';\n\nexport type HttpIri = `http://${string}` | `https://${string}`;\n\nexport interface ThreadLocatorRef {\n thread_id: string;\n chat_id: string;\n}\n\nexport interface ThreadIriRef {\n thread_id: HttpIri;\n chat_id?: never;\n}\n\nexport type ThreadRef = ThreadLocatorRef | ThreadIriRef;\n\nexport function isHttpIri(value: string): value is HttpIri {\n return value.startsWith('http://') || value.startsWith('https://');\n}\n\nexport function toThreadRef(params: { thread_id: string; chat_id?: string }): ThreadRef {\n if (isHttpIri(params.thread_id)) {\n return { thread_id: params.thread_id };\n }\n if (params.chat_id) {\n return { thread_id: params.thread_id, chat_id: params.chat_id };\n }\n throw new Error(`chat_id is required when thread_id \"${params.thread_id}\" is not a full thread IRI`);\n}\n\nexport function getThreadIdFromRef(thread: ThreadRef): string {\n if ('chat_id' in thread) {\n return thread.thread_id;\n }\n try {\n const url = new URL(thread.thread_id);\n return url.hash.startsWith('#')\n ? decodeURIComponent(url.hash.slice(1))\n : thread.thread_id;\n } catch {\n return thread.thread_id;\n }\n}\n\nexport function getChatIdFromThreadMetadata(thread: ThreadMetadata): string {\n const chatId = thread.metadata?.chat_id;\n return typeof chatId === 'string' && chatId.length > 0\n ? chatId\n : DEFAULT_THREAD_CHAT_ID;\n}\n\n// ============================================================================\n// Thread Item Types\n// ============================================================================\n\nexport interface ThreadItemBase {\n id: string;\n thread_id: string;\n created_at: number;\n}\n\n// User Message\nexport interface UserMessageTextContent {\n type: 'input_text';\n text: string;\n}\n\nexport interface UserMessageTagContent {\n type: 'input_tag';\n tag: string;\n label?: string;\n}\n\nexport type UserMessageContent = UserMessageTextContent | UserMessageTagContent;\n\nexport interface InferenceOptions {\n model?: string;\n temperature?: number;\n max_tokens?: number;\n tools?: unknown[];\n tool_choice?: ToolChoice;\n}\n\nexport interface ToolChoice {\n type: 'function';\n function: {\n name: string;\n };\n}\n\nexport interface UserMessageItem extends ThreadItemBase {\n type: 'user_message';\n content: UserMessageContent[];\n inference_options?: InferenceOptions;\n}\n\n// Assistant Message\nexport interface Annotation {\n type: string;\n text: string;\n start_index?: number;\n end_index?: number;\n file_citation?: {\n file_id: string;\n quote?: string;\n };\n file_path?: {\n file_id: string;\n };\n url_citation?: {\n url: string;\n title?: string;\n };\n}\n\nexport interface AssistantMessageContent {\n type: 'output_text';\n text: string;\n annotations?: Annotation[];\n}\n\nexport interface AssistantMessageItem extends ThreadItemBase {\n type: 'assistant_message';\n content: AssistantMessageContent[];\n status?: 'in_progress' | 'completed' | 'incomplete';\n}\n\n// Client Tool Call\nexport interface ClientToolCallItem extends ThreadItemBase {\n type: 'client_tool_call';\n name: string;\n arguments: string;\n call_id: string;\n status?: 'pending' | 'completed';\n output?: string;\n}\n\n// Widget\nexport interface WidgetItem extends ThreadItemBase {\n type: 'widget';\n widget_type: string;\n data: unknown;\n}\n\n// Generated Image\nexport interface GeneratedImage {\n id: string;\n url?: string;\n b64_json?: string;\n}\n\nexport interface GeneratedImageItem extends ThreadItemBase {\n type: 'generated_image';\n image: GeneratedImage;\n prompt?: string;\n status?: 'in_progress' | 'completed' | 'failed';\n}\n\n// Task\nexport interface BaseTask {\n id: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\n}\n\nexport interface CustomTask extends BaseTask {\n type: 'custom';\n title: string;\n description?: string;\n}\n\nexport interface SearchTask extends BaseTask {\n type: 'web_search';\n query: string;\n}\n\nexport interface ThoughtTask extends BaseTask {\n type: 'thought';\n content: string;\n}\n\nexport interface FileTask extends BaseTask {\n type: 'file';\n file_id: string;\n filename?: string;\n}\n\nexport interface ImageTask extends BaseTask {\n type: 'image';\n image_id: string;\n}\n\nexport type Task = CustomTask | SearchTask | ThoughtTask | FileTask | ImageTask;\n\nexport interface TaskItem extends ThreadItemBase {\n type: 'task';\n task: Task;\n}\n\n// Workflow\nexport interface CustomSummary {\n type: 'custom';\n title: string;\n icon?: string;\n}\n\nexport interface DurationSummary {\n type: 'duration';\n duration_ms: number;\n}\n\nexport type WorkflowSummary = CustomSummary | DurationSummary;\n\nexport interface Workflow {\n tasks: Task[];\n summary?: WorkflowSummary;\n}\n\nexport interface WorkflowItem extends ThreadItemBase {\n type: 'workflow';\n workflow: Workflow;\n}\n\n// End of Turn\nexport interface EndOfTurnItem extends ThreadItemBase {\n type: 'end_of_turn';\n}\n\n// Hidden Context\nexport interface HiddenContextItem extends ThreadItemBase {\n type: 'hidden_context_item';\n context: unknown;\n}\n\nexport interface SDKHiddenContextItem extends ThreadItemBase {\n type: 'sdk_hidden_context';\n data: unknown;\n}\n\n// Union of all thread items\nexport type ThreadItem =\n | UserMessageItem\n | AssistantMessageItem\n | ClientToolCallItem\n | WidgetItem\n | GeneratedImageItem\n | TaskItem\n | WorkflowItem\n | EndOfTurnItem\n | HiddenContextItem\n | SDKHiddenContextItem;\n\nexport type StoreItemType = ThreadItem['type'];\n\n// ============================================================================\n// Attachment Types\n// ============================================================================\n\nexport interface AttachmentBase {\n id: string;\n name: string;\n size: number;\n mime_type: string;\n created_at: number;\n}\n\nexport interface FileAttachment extends AttachmentBase {\n type: 'file';\n url?: string;\n}\n\nexport interface ImageAttachment extends AttachmentBase {\n type: 'image';\n url?: string;\n width?: number;\n height?: number;\n}\n\nexport type Attachment = FileAttachment | ImageAttachment;\n\nexport interface AttachmentUploadDescriptor {\n attachment_id: string;\n upload_url: string;\n upload_headers?: Record<string, string>;\n}\n\n// ============================================================================\n// Request Types\n// ============================================================================\n\nexport interface BaseReq {\n metadata?: Record<string, unknown>;\n}\n\n// Thread Requests\nexport type ThreadGetByIdParams = ThreadRef;\n\nexport interface ThreadsGetByIdReq extends BaseReq {\n type: 'threads.get_by_id';\n params: ThreadGetByIdParams;\n}\n\nexport interface ThreadCreateParams {\n chat_id?: string;\n input?: UserMessageInput;\n}\n\nexport interface UserMessageInput {\n content: UserMessageContent[];\n inference_options?: InferenceOptions;\n attachments?: string[];\n}\n\nexport interface ThreadsCreateReq extends BaseReq {\n type: 'threads.create';\n params: ThreadCreateParams;\n}\n\nexport interface ThreadListParams {\n limit?: number;\n order?: 'asc' | 'desc';\n after?: string;\n}\n\nexport interface ThreadsListReq extends BaseReq {\n type: 'threads.list';\n params: ThreadListParams;\n}\n\nexport type ThreadAddUserMessageParams = ThreadRef & {\n input: UserMessageInput;\n};\n\nexport interface ThreadsAddUserMessageReq extends BaseReq {\n type: 'threads.add_user_message';\n params: ThreadAddUserMessageParams;\n}\n\nexport type ThreadAddClientToolOutputParams = ThreadRef & {\n item_id: string;\n output: string;\n};\n\nexport interface ThreadsAddClientToolOutputReq extends BaseReq {\n type: 'threads.add_client_tool_output';\n params: ThreadAddClientToolOutputParams;\n}\n\nexport type ThreadCustomActionParams = ThreadRef & {\n item_id: string;\n action: string;\n data?: unknown;\n};\n\nexport interface ThreadsCustomActionReq extends BaseReq {\n type: 'threads.custom_action';\n params: ThreadCustomActionParams;\n}\n\nexport type ThreadRetryAfterItemParams = ThreadRef & {\n item_id: string;\n};\n\nexport interface ThreadsRetryAfterItemReq extends BaseReq {\n type: 'threads.retry_after_item';\n params: ThreadRetryAfterItemParams;\n}\n\nexport type ThreadUpdateParams = ThreadRef & {\n title?: string;\n};\n\nexport interface ThreadsUpdateReq extends BaseReq {\n type: 'threads.update';\n params: ThreadUpdateParams;\n}\n\nexport type ThreadDeleteParams = ThreadRef;\n\nexport interface ThreadsDeleteReq extends BaseReq {\n type: 'threads.delete';\n params: ThreadDeleteParams;\n}\n\n// Items Requests\nexport type ItemsListParams = ThreadRef & {\n limit?: number;\n order?: 'asc' | 'desc';\n after?: string;\n};\n\nexport interface ItemsListReq extends BaseReq {\n type: 'items.list';\n params: ItemsListParams;\n}\n\nexport type ItemFeedbackParams = ThreadRef & {\n item_ids: string[];\n feedback: FeedbackKind;\n};\n\nexport type FeedbackKind = 'positive' | 'negative';\n\nexport interface ItemsFeedbackReq extends BaseReq {\n type: 'items.feedback';\n params: ItemFeedbackParams;\n}\n\n// Attachment Requests\nexport interface AttachmentCreateParams {\n name: string;\n size: number;\n mime_type: string;\n}\n\nexport interface AttachmentsCreateReq extends BaseReq {\n type: 'attachments.create';\n params: AttachmentCreateParams;\n}\n\nexport interface AttachmentDeleteParams {\n attachment_id: string;\n}\n\nexport interface AttachmentsDeleteReq extends BaseReq {\n type: 'attachments.delete';\n params: AttachmentDeleteParams;\n}\n\n// Request Union Types\nexport type StreamingReq =\n | ThreadsCreateReq\n | ThreadsAddUserMessageReq\n | ThreadsAddClientToolOutputReq\n | ThreadsRetryAfterItemReq\n | ThreadsCustomActionReq;\n\nexport type NonStreamingReq =\n | ThreadsGetByIdReq\n | ThreadsListReq\n | ItemsListReq\n | ItemsFeedbackReq\n | AttachmentsCreateReq\n | AttachmentsDeleteReq\n | ThreadsUpdateReq\n | ThreadsDeleteReq;\n\nexport type ChatKitReq = StreamingReq | NonStreamingReq;\n\n// ============================================================================\n// Stream Event Types\n// ============================================================================\n\nexport interface ThreadCreatedEvent {\n type: 'thread.created';\n thread: ThreadMetadata;\n}\n\nexport interface ThreadUpdatedEvent {\n type: 'thread.updated';\n thread: ThreadMetadata;\n}\n\nexport interface ThreadItemAddedEvent {\n type: 'thread.item.added';\n item: ThreadItem;\n}\n\nexport interface ThreadItemUpdatedEvent {\n type: 'thread.item.updated';\n item_id: string;\n update: ThreadItemUpdate;\n}\n\nexport interface ThreadItemDoneEvent {\n type: 'thread.item.done';\n item: ThreadItem;\n}\n\nexport interface ThreadItemRemovedEvent {\n type: 'thread.item.removed';\n item_id: string;\n}\n\nexport interface ThreadItemReplacedEvent {\n type: 'thread.item.replaced';\n item: ThreadItem;\n}\n\nexport interface StreamOptions {\n allow_cancel?: boolean;\n}\n\nexport interface StreamOptionsEvent {\n type: 'stream_options';\n options: StreamOptions;\n}\n\nexport interface ProgressUpdate {\n progress: number;\n message?: string;\n}\n\nexport interface ProgressUpdateEvent {\n type: 'progress_update';\n update: ProgressUpdate;\n}\n\nexport interface ClientEffect {\n effect_type: string;\n data?: unknown;\n}\n\nexport interface ClientEffectEvent {\n type: 'client_effect';\n effect: ClientEffect;\n}\n\nexport interface ErrorEvent {\n type: 'error';\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\nexport interface NoticeEvent {\n type: 'notice';\n notice: {\n level: 'info' | 'warning' | 'error';\n message: string;\n };\n}\n\nexport type ThreadStreamEvent =\n | ThreadCreatedEvent\n | ThreadUpdatedEvent\n | ThreadItemAddedEvent\n | ThreadItemUpdatedEvent\n | ThreadItemDoneEvent\n | ThreadItemRemovedEvent\n | ThreadItemReplacedEvent\n | StreamOptionsEvent\n | ProgressUpdateEvent\n | ClientEffectEvent\n | ErrorEvent\n | NoticeEvent;\n\n// ============================================================================\n// Thread Item Update Types (for streaming)\n// ============================================================================\n\nexport interface AssistantMessageContentPartAdded {\n type: 'assistant_message.content_part.added';\n part_index: number;\n part: AssistantMessageContent;\n}\n\nexport interface AssistantMessageContentPartTextDelta {\n type: 'assistant_message.content_part.text_delta';\n part_index: number;\n delta: string;\n}\n\nexport interface AssistantMessageContentPartAnnotationAdded {\n type: 'assistant_message.content_part.annotation_added';\n part_index: number;\n annotation: Annotation;\n}\n\nexport interface AssistantMessageContentPartDone {\n type: 'assistant_message.content_part.done';\n part_index: number;\n}\n\nexport interface WidgetStreamingTextValueDelta {\n type: 'widget.streaming_text.value_delta';\n path: string;\n delta: string;\n}\n\nexport interface WidgetRootUpdated {\n type: 'widget.root.updated';\n data: unknown;\n}\n\nexport interface WidgetComponentUpdated {\n type: 'widget.component.updated';\n component_id: string;\n data: unknown;\n}\n\nexport interface WorkflowTaskAdded {\n type: 'workflow.task.added';\n task: Task;\n}\n\nexport interface WorkflowTaskUpdated {\n type: 'workflow.task.updated';\n task_id: string;\n task: Partial<Task>;\n}\n\nexport interface GeneratedImageUpdated {\n type: 'generated_image.updated';\n image: GeneratedImage;\n}\n\nexport type ThreadItemUpdate =\n | AssistantMessageContentPartAdded\n | AssistantMessageContentPartTextDelta\n | AssistantMessageContentPartAnnotationAdded\n | AssistantMessageContentPartDone\n | WidgetStreamingTextValueDelta\n | WidgetRootUpdated\n | WidgetComponentUpdated\n | WorkflowTaskAdded\n | WorkflowTaskUpdated\n | GeneratedImageUpdated;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\nexport interface StreamingResult {\n type: 'streaming';\n stream: AsyncIterable<ThreadStreamEvent>;\n}\n\nexport interface NonStreamingResult {\n type: 'non_streaming';\n data: unknown;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function isStreamingReq(req: ChatKitReq): req is StreamingReq {\n return (\n req.type === 'threads.create' ||\n req.type === 'threads.add_user_message' ||\n req.type === 'threads.add_client_tool_output' ||\n req.type === 'threads.retry_after_item' ||\n req.type === 'threads.custom_action'\n );\n}\n\nexport function isNonStreamingReq(req: ChatKitReq): req is NonStreamingReq {\n return !isStreamingReq(req);\n}\n\n/**\n * Generate a unique ID with prefix\n */\nexport function generateId(prefix: string): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${prefix}_${timestamp}${random}`;\n}\n\n/**\n * Get current timestamp in seconds\n */\nexport function nowTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Extract text content from user message\n */\nexport function extractUserMessageText(content: UserMessageContent[]): string {\n return content\n .filter((c): c is UserMessageTextContent => c.type === 'input_text')\n .map((c) => c.text)\n .join('\\n');\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/chatkit/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAqEH,8BAEC;AAED,wEAEC;AAED,kCAWC;AAED,gDAcC;AAED,kEAKC;AAklBD,wCAQC;AAED,8CAEC;AAKD,gCAIC;AAKD,oCAEC;AAKD,wDAKC;AAKD,kEAKC;AA5rBY,QAAA,sBAAsB,GAAG,SAAS,CAAC;AAgBhD,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,8BAA8B,CAAC,KAAa;IAC1D,OAAO,wCAAwC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,WAAW,CAAC,MAA+C;IACzE,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,8BAA8B,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,8BAAsB,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,SAAS,oCAAoC,CAAC,CAAC;AAC/G,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAiB;IAClD,IAAI,SAAS,IAAI,MAAM,IAAI,8BAA8B,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAgB,2BAA2B,CAAC,MAAsB;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IACxC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QACpD,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,8BAAsB,CAAC;AAC7B,CAAC;AA8kBD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAgB,cAAc,CAAC,GAAe;IAC5C,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,gBAAgB;QAC7B,GAAG,CAAC,IAAI,KAAK,0BAA0B;QACvC,GAAG,CAAC,IAAI,KAAK,gCAAgC;QAC7C,GAAG,CAAC,IAAI,KAAK,0BAA0B;QACvC,GAAG,CAAC,IAAI,KAAK,uBAAuB,CACrC,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAe;IAC/C,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,MAAc;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,MAAM,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAA6B;IAClE,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAA+B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;SACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B,CAAC,OAAkC;IAC5E,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;SACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","sourcesContent":["/**\n * ChatKit Types\n * \n * Type definitions for OpenAI ChatKit protocol.\n * Based on https://github.com/openai/chatkit-python\n */\n\nimport type { WorkspaceUri } from '../workspace/types';\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\nexport interface Page<T> {\n data: T[];\n has_more: boolean;\n after?: string;\n}\n\n// ============================================================================\n// Thread Types\n// ============================================================================\n\nexport type ThreadStatusType = 'active' | 'locked' | 'closed';\n\nexport interface ActiveStatus {\n type: 'active';\n}\n\nexport interface LockedStatus {\n type: 'locked';\n reason?: string;\n}\n\nexport interface ClosedStatus {\n type: 'closed';\n}\n\nexport type ThreadStatus = ActiveStatus | LockedStatus | ClosedStatus;\n\nexport interface ThreadMetadata {\n id: string;\n title?: string;\n status: ThreadStatus;\n /**\n * Workspace Container URI selected for this thread.\n * The Solid schema stores this as an RDF URI relation.\n */\n workspace?: WorkspaceUri;\n created_at: number;\n updated_at: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Thread extends ThreadMetadata {\n items: Page<ThreadItem>;\n}\n\nexport const DEFAULT_THREAD_CHAT_ID = 'default';\n\nexport type HttpIri = `http://${string}` | `https://${string}`;\n\nexport interface ThreadSurfaceRef {\n thread_id: string;\n chat_id: string;\n}\n\nexport interface ThreadIriRef {\n thread_id: HttpIri;\n chat_id?: never;\n}\n\nexport type ThreadRef = ThreadSurfaceRef | ThreadIriRef;\n\nexport function isHttpIri(value: string): value is HttpIri {\n return value.startsWith('http://') || value.startsWith('https://');\n}\n\nexport function isBaseRelativeThreadResourceId(value: string): boolean {\n return /^(chat|task)\\/[^/]+\\/index\\.ttl#[^#]+$/.test(value);\n}\n\nexport function toThreadRef(params: { thread_id: string; chat_id?: string }): ThreadRef {\n if (isHttpIri(params.thread_id)) {\n return { thread_id: params.thread_id };\n }\n if (isBaseRelativeThreadResourceId(params.thread_id)) {\n return { thread_id: params.thread_id, chat_id: params.chat_id ?? DEFAULT_THREAD_CHAT_ID };\n }\n if (params.chat_id) {\n return { thread_id: params.thread_id, chat_id: params.chat_id };\n }\n throw new Error(`chat_id is required when thread_id \"${params.thread_id}\" is not a full thread resource id`);\n}\n\nexport function getThreadIdFromRef(thread: ThreadRef): string {\n if ('chat_id' in thread || isBaseRelativeThreadResourceId(thread.thread_id)) {\n return thread.thread_id;\n }\n try {\n const url = new URL(thread.thread_id);\n const dataIndex = url.pathname.indexOf('/.data/');\n if (dataIndex >= 0 && url.hash) {\n return `${url.pathname.slice(dataIndex + '/.data/'.length)}${url.hash}`;\n }\n return url.hash.startsWith('#') ? decodeURIComponent(url.hash.slice(1)) : thread.thread_id;\n } catch {\n return thread.thread_id;\n }\n}\n\nexport function getChatIdFromThreadMetadata(thread: ThreadMetadata): string {\n const chatId = thread.metadata?.chat_id;\n return typeof chatId === 'string' && chatId.length > 0\n ? chatId\n : DEFAULT_THREAD_CHAT_ID;\n}\n\n// ============================================================================\n// Thread Item Types\n// ============================================================================\n\nexport interface ThreadItemBase {\n id: string;\n thread_id: string;\n created_at: number;\n}\n\n// User Message\nexport interface UserMessageTextContent {\n type: 'input_text';\n text: string;\n}\n\nexport interface UserMessageTagContent {\n type: 'input_tag';\n tag: string;\n label?: string;\n}\n\nexport type UserMessageContent = UserMessageTextContent | UserMessageTagContent;\n\nexport interface InferenceOptions {\n model?: string;\n temperature?: number;\n max_tokens?: number;\n tools?: unknown[];\n tool_choice?: ToolChoice;\n}\n\nexport interface ToolChoice {\n type: 'function';\n function: {\n name: string;\n };\n}\n\nexport interface UserMessageItem extends ThreadItemBase {\n type: 'user_message';\n content: UserMessageContent[];\n inference_options?: InferenceOptions;\n}\n\n// Assistant Message\nexport interface Annotation {\n type: string;\n text: string;\n start_index?: number;\n end_index?: number;\n file_citation?: {\n file_id: string;\n quote?: string;\n };\n file_path?: {\n file_id: string;\n };\n url_citation?: {\n url: string;\n title?: string;\n };\n}\n\nexport interface AssistantMessageContent {\n type: 'output_text';\n text: string;\n annotations?: Annotation[];\n}\n\nexport interface AssistantMessageItem extends ThreadItemBase {\n type: 'assistant_message';\n content: AssistantMessageContent[];\n status?: 'in_progress' | 'completed' | 'incomplete';\n}\n\n// Client Tool Call\nexport interface ClientToolCallItem extends ThreadItemBase {\n type: 'client_tool_call';\n name: string;\n arguments: string;\n call_id: string;\n status?: 'pending' | 'completed';\n output?: string;\n metadata?: Record<string, unknown>;\n}\n\n// Widget\nexport interface WidgetItem extends ThreadItemBase {\n type: 'widget';\n widget_type: string;\n data: unknown;\n}\n\n// Generated Image\nexport interface GeneratedImage {\n id: string;\n url?: string;\n b64_json?: string;\n}\n\nexport interface GeneratedImageItem extends ThreadItemBase {\n type: 'generated_image';\n image: GeneratedImage;\n prompt?: string;\n status?: 'in_progress' | 'completed' | 'failed';\n}\n\n// Task\nexport interface BaseTask {\n id: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\n}\n\nexport interface CustomTask extends BaseTask {\n type: 'custom';\n title: string;\n description?: string;\n}\n\nexport interface SearchTask extends BaseTask {\n type: 'web_search';\n query: string;\n}\n\nexport interface ThoughtTask extends BaseTask {\n type: 'thought';\n content: string;\n}\n\nexport interface FileTask extends BaseTask {\n type: 'file';\n file_id: string;\n filename?: string;\n}\n\nexport interface ImageTask extends BaseTask {\n type: 'image';\n image_id: string;\n}\n\nexport type Task = CustomTask | SearchTask | ThoughtTask | FileTask | ImageTask;\n\nexport interface TaskItem extends ThreadItemBase {\n type: 'task';\n task: Task;\n}\n\n// Workflow\nexport interface CustomSummary {\n type: 'custom';\n title: string;\n icon?: string;\n}\n\nexport interface DurationSummary {\n type: 'duration';\n duration_ms: number;\n}\n\nexport type WorkflowSummary = CustomSummary | DurationSummary;\n\nexport interface Workflow {\n tasks: Task[];\n summary?: WorkflowSummary;\n}\n\nexport interface WorkflowItem extends ThreadItemBase {\n type: 'workflow';\n workflow: Workflow;\n}\n\n// End of Turn\nexport interface EndOfTurnItem extends ThreadItemBase {\n type: 'end_of_turn';\n}\n\n// Hidden Context\nexport interface HiddenContextItem extends ThreadItemBase {\n type: 'hidden_context_item';\n context: unknown;\n}\n\nexport interface SDKHiddenContextItem extends ThreadItemBase {\n type: 'sdk_hidden_context';\n data: unknown;\n}\n\n// Union of all thread items\nexport type ThreadItem =\n | UserMessageItem\n | AssistantMessageItem\n | ClientToolCallItem\n | WidgetItem\n | GeneratedImageItem\n | TaskItem\n | WorkflowItem\n | EndOfTurnItem\n | HiddenContextItem\n | SDKHiddenContextItem;\n\nexport type StoreItemType = ThreadItem['type'];\n\n// ============================================================================\n// Attachment Types\n// ============================================================================\n\nexport interface AttachmentBase {\n id: string;\n name: string;\n size: number;\n mime_type: string;\n created_at: number;\n}\n\nexport interface FileAttachment extends AttachmentBase {\n type: 'file';\n url?: string;\n}\n\nexport interface ImageAttachment extends AttachmentBase {\n type: 'image';\n url?: string;\n width?: number;\n height?: number;\n}\n\nexport type Attachment = FileAttachment | ImageAttachment;\n\nexport interface AttachmentUploadDescriptor {\n attachment_id: string;\n upload_url: string;\n upload_headers?: Record<string, string>;\n}\n\n// ============================================================================\n// Request Types\n// ============================================================================\n\nexport interface BaseReq {\n metadata?: Record<string, unknown>;\n}\n\n// Thread Requests\nexport type ThreadGetByIdParams = ThreadRef;\n\nexport interface ThreadsGetByIdReq extends BaseReq {\n type: 'threads.get_by_id';\n params: ThreadGetByIdParams;\n}\n\nexport interface ThreadCreateParams {\n chat_id?: string;\n workspace?: WorkspaceUri;\n input?: UserMessageInput;\n}\n\nexport interface UserMessageInput {\n content: UserMessageContent[];\n inference_options?: InferenceOptions;\n attachments?: string[];\n}\n\nexport interface ThreadsCreateReq extends BaseReq {\n type: 'threads.create';\n params: ThreadCreateParams;\n}\n\nexport interface ThreadListParams {\n limit?: number;\n order?: 'asc' | 'desc';\n after?: string;\n}\n\nexport interface ThreadsListReq extends BaseReq {\n type: 'threads.list';\n params: ThreadListParams;\n}\n\nexport type ThreadAddUserMessageParams = ThreadRef & {\n input: UserMessageInput;\n};\n\nexport interface ThreadsAddUserMessageReq extends BaseReq {\n type: 'threads.add_user_message';\n params: ThreadAddUserMessageParams;\n}\n\nexport type ThreadAddClientToolOutputParams = ThreadRef & {\n item_id: string;\n output: string;\n};\n\nexport interface ThreadsAddClientToolOutputReq extends BaseReq {\n type: 'threads.add_client_tool_output';\n params: ThreadAddClientToolOutputParams;\n}\n\nexport type ThreadCustomActionParams = ThreadRef & {\n item_id: string;\n action: string;\n data?: unknown;\n};\n\nexport interface ThreadsCustomActionReq extends BaseReq {\n type: 'threads.custom_action';\n params: ThreadCustomActionParams;\n}\n\nexport type ThreadRetryAfterItemParams = ThreadRef & {\n item_id: string;\n};\n\nexport interface ThreadsRetryAfterItemReq extends BaseReq {\n type: 'threads.retry_after_item';\n params: ThreadRetryAfterItemParams;\n}\n\nexport type ThreadUpdateParams = ThreadRef & {\n title?: string;\n workspace?: WorkspaceUri;\n};\n\nexport interface ThreadsUpdateReq extends BaseReq {\n type: 'threads.update';\n params: ThreadUpdateParams;\n}\n\nexport type ThreadDeleteParams = ThreadRef;\n\nexport interface ThreadsDeleteReq extends BaseReq {\n type: 'threads.delete';\n params: ThreadDeleteParams;\n}\n\n// Items Requests\nexport type ItemsListParams = ThreadRef & {\n limit?: number;\n order?: 'asc' | 'desc';\n after?: string;\n};\n\nexport interface ItemsListReq extends BaseReq {\n type: 'items.list';\n params: ItemsListParams;\n}\n\nexport type ItemFeedbackParams = ThreadRef & {\n item_ids: string[];\n feedback: FeedbackKind;\n};\n\nexport type FeedbackKind = 'positive' | 'negative';\n\nexport interface ItemsFeedbackReq extends BaseReq {\n type: 'items.feedback';\n params: ItemFeedbackParams;\n}\n\n// Attachment Requests\nexport interface AttachmentCreateParams {\n name: string;\n size: number;\n mime_type: string;\n}\n\nexport interface AttachmentsCreateReq extends BaseReq {\n type: 'attachments.create';\n params: AttachmentCreateParams;\n}\n\nexport interface AttachmentDeleteParams {\n attachment_id: string;\n}\n\nexport interface AttachmentsDeleteReq extends BaseReq {\n type: 'attachments.delete';\n params: AttachmentDeleteParams;\n}\n\n// Request Union Types\nexport type StreamingReq =\n | ThreadsCreateReq\n | ThreadsAddUserMessageReq\n | ThreadsAddClientToolOutputReq\n | ThreadsRetryAfterItemReq\n | ThreadsCustomActionReq;\n\nexport type NonStreamingReq =\n | ThreadsGetByIdReq\n | ThreadsListReq\n | ItemsListReq\n | ItemsFeedbackReq\n | AttachmentsCreateReq\n | AttachmentsDeleteReq\n | ThreadsUpdateReq\n | ThreadsDeleteReq;\n\nexport type ChatKitReq = StreamingReq | NonStreamingReq;\n\n// ============================================================================\n// Stream Event Types\n// ============================================================================\n\nexport interface ThreadCreatedEvent {\n type: 'thread.created';\n thread: ThreadMetadata;\n}\n\nexport interface ThreadUpdatedEvent {\n type: 'thread.updated';\n thread: ThreadMetadata;\n}\n\nexport interface ThreadItemAddedEvent {\n type: 'thread.item.added';\n item: ThreadItem;\n}\n\nexport interface ThreadItemUpdatedEvent {\n type: 'thread.item.updated';\n item_id: string;\n update: ThreadItemUpdate;\n}\n\nexport interface ThreadItemDoneEvent {\n type: 'thread.item.done';\n item: ThreadItem;\n}\n\nexport interface ThreadItemRemovedEvent {\n type: 'thread.item.removed';\n item_id: string;\n}\n\nexport interface ThreadItemReplacedEvent {\n type: 'thread.item.replaced';\n item: ThreadItem;\n}\n\nexport interface StreamOptions {\n allow_cancel?: boolean;\n}\n\nexport interface StreamOptionsEvent {\n type: 'stream_options';\n options: StreamOptions;\n}\n\nexport interface ProgressUpdate {\n progress: number;\n message?: string;\n}\n\nexport interface ProgressUpdateEvent {\n type: 'progress_update';\n update: ProgressUpdate;\n}\n\nexport interface ClientEffect {\n effect_type: string;\n data?: unknown;\n}\n\nexport interface ClientEffectEvent {\n type: 'client_effect';\n effect: ClientEffect;\n}\n\nexport interface ErrorEvent {\n type: 'error';\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\nexport interface NoticeEvent {\n type: 'notice';\n notice: {\n level: 'info' | 'warning' | 'error';\n message: string;\n };\n}\n\nexport type ThreadStreamEvent =\n | ThreadCreatedEvent\n | ThreadUpdatedEvent\n | ThreadItemAddedEvent\n | ThreadItemUpdatedEvent\n | ThreadItemDoneEvent\n | ThreadItemRemovedEvent\n | ThreadItemReplacedEvent\n | StreamOptionsEvent\n | ProgressUpdateEvent\n | ClientEffectEvent\n | ErrorEvent\n | NoticeEvent;\n\n// ============================================================================\n// Thread Item Update Types (for streaming)\n// ============================================================================\n\nexport interface AssistantMessageContentPartAdded {\n type: 'assistant_message.content_part.added';\n part_index: number;\n part: AssistantMessageContent;\n}\n\nexport interface AssistantMessageContentPartTextDelta {\n type: 'assistant_message.content_part.text_delta';\n part_index: number;\n delta: string;\n}\n\nexport interface AssistantMessageContentPartAnnotationAdded {\n type: 'assistant_message.content_part.annotation_added';\n part_index: number;\n annotation: Annotation;\n}\n\nexport interface AssistantMessageContentPartDone {\n type: 'assistant_message.content_part.done';\n part_index: number;\n}\n\nexport interface WidgetStreamingTextValueDelta {\n type: 'widget.streaming_text.value_delta';\n path: string;\n delta: string;\n}\n\nexport interface WidgetRootUpdated {\n type: 'widget.root.updated';\n data: unknown;\n}\n\nexport interface WidgetComponentUpdated {\n type: 'widget.component.updated';\n component_id: string;\n data: unknown;\n}\n\nexport interface WorkflowTaskAdded {\n type: 'workflow.task.added';\n task: Task;\n}\n\nexport interface WorkflowTaskUpdated {\n type: 'workflow.task.updated';\n task_id: string;\n task: Partial<Task>;\n}\n\nexport interface GeneratedImageUpdated {\n type: 'generated_image.updated';\n image: GeneratedImage;\n}\n\nexport type ThreadItemUpdate =\n | AssistantMessageContentPartAdded\n | AssistantMessageContentPartTextDelta\n | AssistantMessageContentPartAnnotationAdded\n | AssistantMessageContentPartDone\n | WidgetStreamingTextValueDelta\n | WidgetRootUpdated\n | WidgetComponentUpdated\n | WorkflowTaskAdded\n | WorkflowTaskUpdated\n | GeneratedImageUpdated;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\nexport interface StreamingResult {\n type: 'streaming';\n stream: AsyncIterable<ThreadStreamEvent>;\n}\n\nexport interface NonStreamingResult {\n type: 'non_streaming';\n data: unknown;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function isStreamingReq(req: ChatKitReq): req is StreamingReq {\n return (\n req.type === 'threads.create' ||\n req.type === 'threads.add_user_message' ||\n req.type === 'threads.add_client_tool_output' ||\n req.type === 'threads.retry_after_item' ||\n req.type === 'threads.custom_action'\n );\n}\n\nexport function isNonStreamingReq(req: ChatKitReq): req is NonStreamingReq {\n return !isStreamingReq(req);\n}\n\n/**\n * Generate a unique ID with prefix\n */\nexport function generateId(prefix: string): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${prefix}_${timestamp}${random}`;\n}\n\n/**\n * Get current timestamp in seconds\n */\nexport function nowTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Extract text content from user message\n */\nexport function extractUserMessageText(content: UserMessageContent[]): string {\n return content\n .filter((c): c is UserMessageTextContent => c.type === 'input_text')\n .map((c) => c.text)\n .join('\\n');\n}\n\n/**\n * Extract text content from assistant message\n */\nexport function extractAssistantMessageText(content: AssistantMessageContent[]): string {\n return content\n .filter((c): c is AssistantMessageContent => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n}\n"]}