@ggui-ai/mcp-server-handlers 0.1.0-rc.1

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 (339) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +32 -0
  3. package/dist/app-discovery/errors.d.ts +23 -0
  4. package/dist/app-discovery/errors.d.ts.map +1 -0
  5. package/dist/app-discovery/errors.js +26 -0
  6. package/dist/app-discovery/index.d.ts +19 -0
  7. package/dist/app-discovery/index.d.ts.map +1 -0
  8. package/dist/app-discovery/index.js +18 -0
  9. package/dist/app-discovery/list-gadgets.d.ts +93 -0
  10. package/dist/app-discovery/list-gadgets.d.ts.map +1 -0
  11. package/dist/app-discovery/list-gadgets.js +93 -0
  12. package/dist/app-discovery/list-themes.d.ts +70 -0
  13. package/dist/app-discovery/list-themes.d.ts.map +1 -0
  14. package/dist/app-discovery/list-themes.js +80 -0
  15. package/dist/blueprints/describe-blueprint-format.d.ts +25 -0
  16. package/dist/blueprints/describe-blueprint-format.d.ts.map +1 -0
  17. package/dist/blueprints/describe-blueprint-format.js +138 -0
  18. package/dist/blueprints/describe-data-contract-format.d.ts +31 -0
  19. package/dist/blueprints/describe-data-contract-format.d.ts.map +1 -0
  20. package/dist/blueprints/describe-data-contract-format.js +292 -0
  21. package/dist/blueprints/get-blueprint-boilerplate.d.ts +45 -0
  22. package/dist/blueprints/get-blueprint-boilerplate.d.ts.map +1 -0
  23. package/dist/blueprints/get-blueprint-boilerplate.js +57 -0
  24. package/dist/blueprints/get-example-blueprints.d.ts +67 -0
  25. package/dist/blueprints/get-example-blueprints.d.ts.map +1 -0
  26. package/dist/blueprints/get-example-blueprints.js +315 -0
  27. package/dist/blueprints/index.d.ts +38 -0
  28. package/dist/blueprints/index.d.ts.map +1 -0
  29. package/dist/blueprints/index.js +34 -0
  30. package/dist/blueprints/list-available-primitives.d.ts +31 -0
  31. package/dist/blueprints/list-available-primitives.d.ts.map +1 -0
  32. package/dist/blueprints/list-available-primitives.js +44 -0
  33. package/dist/blueprints/list-featured-blueprints.d.ts +45 -0
  34. package/dist/blueprints/list-featured-blueprints.d.ts.map +1 -0
  35. package/dist/blueprints/list-featured-blueprints.js +47 -0
  36. package/dist/blueprints/render-blueprint.d.ts +80 -0
  37. package/dist/blueprints/render-blueprint.d.ts.map +1 -0
  38. package/dist/blueprints/render-blueprint.js +129 -0
  39. package/dist/blueprints/search-blueprints.d.ts +103 -0
  40. package/dist/blueprints/search-blueprints.d.ts.map +1 -0
  41. package/dist/blueprints/search-blueprints.js +225 -0
  42. package/dist/blueprints/validate-blueprint.d.ts +56 -0
  43. package/dist/blueprints/validate-blueprint.d.ts.map +1 -0
  44. package/dist/blueprints/validate-blueprint.js +69 -0
  45. package/dist/contract-tests/index.d.ts +20 -0
  46. package/dist/contract-tests/index.d.ts.map +1 -0
  47. package/dist/contract-tests/index.js +19 -0
  48. package/dist/contract-tests/push-handler.contract.d.ts +31 -0
  49. package/dist/contract-tests/push-handler.contract.d.ts.map +1 -0
  50. package/dist/contract-tests/push-handler.contract.js +378 -0
  51. package/dist/credits/get-credit-balance.d.ts +70 -0
  52. package/dist/credits/get-credit-balance.d.ts.map +1 -0
  53. package/dist/credits/get-credit-balance.js +69 -0
  54. package/dist/credits/index.d.ts +30 -0
  55. package/dist/credits/index.d.ts.map +1 -0
  56. package/dist/credits/index.js +27 -0
  57. package/dist/credits/list-credit-transactions.d.ts +79 -0
  58. package/dist/credits/list-credit-transactions.d.ts.map +1 -0
  59. package/dist/credits/list-credit-transactions.js +67 -0
  60. package/dist/index.d.ts +28 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +43 -0
  63. package/dist/ops-apps/create-app.d.ts +40 -0
  64. package/dist/ops-apps/create-app.d.ts.map +1 -0
  65. package/dist/ops-apps/create-app.js +60 -0
  66. package/dist/ops-apps/delete-app.d.ts +35 -0
  67. package/dist/ops-apps/delete-app.d.ts.map +1 -0
  68. package/dist/ops-apps/delete-app.js +55 -0
  69. package/dist/ops-apps/identity.d.ts +18 -0
  70. package/dist/ops-apps/identity.d.ts.map +1 -0
  71. package/dist/ops-apps/identity.js +13 -0
  72. package/dist/ops-apps/in-memory-fake.test-util.d.ts +48 -0
  73. package/dist/ops-apps/in-memory-fake.test-util.d.ts.map +1 -0
  74. package/dist/ops-apps/in-memory-fake.test-util.js +90 -0
  75. package/dist/ops-apps/index.d.ts +31 -0
  76. package/dist/ops-apps/index.d.ts.map +1 -0
  77. package/dist/ops-apps/index.js +23 -0
  78. package/dist/ops-apps/list-apps.d.ts +35 -0
  79. package/dist/ops-apps/list-apps.d.ts.map +1 -0
  80. package/dist/ops-apps/list-apps.js +40 -0
  81. package/dist/ops-apps/rename-app.d.ts +45 -0
  82. package/dist/ops-apps/rename-app.d.ts.map +1 -0
  83. package/dist/ops-apps/rename-app.js +76 -0
  84. package/dist/ops-apps/set-default-app.d.ts +32 -0
  85. package/dist/ops-apps/set-default-app.d.ts.map +1 -0
  86. package/dist/ops-apps/set-default-app.js +51 -0
  87. package/dist/ops-apps/types.d.ts +112 -0
  88. package/dist/ops-apps/types.d.ts.map +1 -0
  89. package/dist/ops-apps/types.js +27 -0
  90. package/dist/ops-apps/update-app-system-prompt.d.ts +41 -0
  91. package/dist/ops-apps/update-app-system-prompt.d.ts.map +1 -0
  92. package/dist/ops-apps/update-app-system-prompt.js +69 -0
  93. package/dist/ops-blueprint/delete.d.ts +39 -0
  94. package/dist/ops-blueprint/delete.d.ts.map +1 -0
  95. package/dist/ops-blueprint/delete.js +56 -0
  96. package/dist/ops-blueprint/errors.d.ts +55 -0
  97. package/dist/ops-blueprint/errors.d.ts.map +1 -0
  98. package/dist/ops-blueprint/errors.js +65 -0
  99. package/dist/ops-blueprint/generate.d.ts +173 -0
  100. package/dist/ops-blueprint/generate.d.ts.map +1 -0
  101. package/dist/ops-blueprint/generate.js +322 -0
  102. package/dist/ops-blueprint/index.d.ts +26 -0
  103. package/dist/ops-blueprint/index.d.ts.map +1 -0
  104. package/dist/ops-blueprint/index.js +25 -0
  105. package/dist/ops-blueprint/list.d.ts +65 -0
  106. package/dist/ops-blueprint/list.d.ts.map +1 -0
  107. package/dist/ops-blueprint/list.js +121 -0
  108. package/dist/ops-blueprint/persona-normalization.d.ts +85 -0
  109. package/dist/ops-blueprint/persona-normalization.d.ts.map +1 -0
  110. package/dist/ops-blueprint/persona-normalization.js +134 -0
  111. package/dist/ops-blueprint/register.d.ts +126 -0
  112. package/dist/ops-blueprint/register.d.ts.map +1 -0
  113. package/dist/ops-blueprint/register.js +227 -0
  114. package/dist/ops-blueprint/update.d.ts +61 -0
  115. package/dist/ops-blueprint/update.d.ts.map +1 -0
  116. package/dist/ops-blueprint/update.js +138 -0
  117. package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts +26 -0
  118. package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts.map +1 -0
  119. package/dist/ops-connector-keys/in-memory-fake.test-util.js +60 -0
  120. package/dist/ops-connector-keys/index.d.ts +19 -0
  121. package/dist/ops-connector-keys/index.d.ts.map +1 -0
  122. package/dist/ops-connector-keys/index.js +14 -0
  123. package/dist/ops-connector-keys/issue-connector-key.d.ts +57 -0
  124. package/dist/ops-connector-keys/issue-connector-key.d.ts.map +1 -0
  125. package/dist/ops-connector-keys/issue-connector-key.js +83 -0
  126. package/dist/ops-connector-keys/list-connector-keys.d.ts +35 -0
  127. package/dist/ops-connector-keys/list-connector-keys.d.ts.map +1 -0
  128. package/dist/ops-connector-keys/list-connector-keys.js +37 -0
  129. package/dist/ops-connector-keys/revoke-connector-key.d.ts +36 -0
  130. package/dist/ops-connector-keys/revoke-connector-key.d.ts.map +1 -0
  131. package/dist/ops-connector-keys/revoke-connector-key.js +48 -0
  132. package/dist/ops-connector-keys/types.d.ts +85 -0
  133. package/dist/ops-connector-keys/types.d.ts.map +1 -0
  134. package/dist/ops-connector-keys/types.js +24 -0
  135. package/dist/ops-coupon/in-memory-fake.test-util.d.ts +28 -0
  136. package/dist/ops-coupon/in-memory-fake.test-util.d.ts.map +1 -0
  137. package/dist/ops-coupon/in-memory-fake.test-util.js +66 -0
  138. package/dist/ops-coupon/index.d.ts +15 -0
  139. package/dist/ops-coupon/index.d.ts.map +1 -0
  140. package/dist/ops-coupon/index.js +12 -0
  141. package/dist/ops-coupon/redeem-coupon.d.ts +42 -0
  142. package/dist/ops-coupon/redeem-coupon.d.ts.map +1 -0
  143. package/dist/ops-coupon/redeem-coupon.js +60 -0
  144. package/dist/ops-coupon/types.d.ts +59 -0
  145. package/dist/ops-coupon/types.d.ts.map +1 -0
  146. package/dist/ops-coupon/types.js +38 -0
  147. package/dist/ops-orgs/create-org.d.ts +39 -0
  148. package/dist/ops-orgs/create-org.d.ts.map +1 -0
  149. package/dist/ops-orgs/create-org.js +54 -0
  150. package/dist/ops-orgs/in-memory-fake.test-util.d.ts +59 -0
  151. package/dist/ops-orgs/in-memory-fake.test-util.d.ts.map +1 -0
  152. package/dist/ops-orgs/in-memory-fake.test-util.js +129 -0
  153. package/dist/ops-orgs/index.d.ts +24 -0
  154. package/dist/ops-orgs/index.d.ts.map +1 -0
  155. package/dist/ops-orgs/index.js +18 -0
  156. package/dist/ops-orgs/invite-to-org.d.ts +60 -0
  157. package/dist/ops-orgs/invite-to-org.d.ts.map +1 -0
  158. package/dist/ops-orgs/invite-to-org.js +71 -0
  159. package/dist/ops-orgs/list-orgs.d.ts +35 -0
  160. package/dist/ops-orgs/list-orgs.d.ts.map +1 -0
  161. package/dist/ops-orgs/list-orgs.js +36 -0
  162. package/dist/ops-orgs/revoke-invite.d.ts +42 -0
  163. package/dist/ops-orgs/revoke-invite.d.ts.map +1 -0
  164. package/dist/ops-orgs/revoke-invite.js +52 -0
  165. package/dist/ops-orgs/types.d.ts +116 -0
  166. package/dist/ops-orgs/types.d.ts.map +1 -0
  167. package/dist/ops-orgs/types.js +22 -0
  168. package/dist/provider-keys/index.d.ts +20 -0
  169. package/dist/provider-keys/index.d.ts.map +1 -0
  170. package/dist/provider-keys/index.js +15 -0
  171. package/dist/provider-keys/list-provider-keys.d.ts +42 -0
  172. package/dist/provider-keys/list-provider-keys.d.ts.map +1 -0
  173. package/dist/provider-keys/list-provider-keys.js +46 -0
  174. package/dist/provider-keys/remove-provider-key.d.ts +34 -0
  175. package/dist/provider-keys/remove-provider-key.d.ts.map +1 -0
  176. package/dist/provider-keys/remove-provider-key.js +47 -0
  177. package/dist/provider-keys/set-provider-key.d.ts +46 -0
  178. package/dist/provider-keys/set-provider-key.d.ts.map +1 -0
  179. package/dist/provider-keys/set-provider-key.js +68 -0
  180. package/dist/provider-keys/types.d.ts +66 -0
  181. package/dist/provider-keys/types.d.ts.map +1 -0
  182. package/dist/provider-keys/types.js +20 -0
  183. package/dist/session-mutations/apply-stack-item-patch.d.ts +79 -0
  184. package/dist/session-mutations/apply-stack-item-patch.d.ts.map +1 -0
  185. package/dist/session-mutations/apply-stack-item-patch.js +74 -0
  186. package/dist/session-mutations/assert-action-contract.d.ts +20 -0
  187. package/dist/session-mutations/assert-action-contract.d.ts.map +1 -0
  188. package/dist/session-mutations/assert-action-contract.js +29 -0
  189. package/dist/session-mutations/assert-contract-no-retired-fields.d.ts +31 -0
  190. package/dist/session-mutations/assert-contract-no-retired-fields.d.ts.map +1 -0
  191. package/dist/session-mutations/assert-contract-no-retired-fields.js +47 -0
  192. package/dist/session-mutations/assert-event-allowed.d.ts +29 -0
  193. package/dist/session-mutations/assert-event-allowed.d.ts.map +1 -0
  194. package/dist/session-mutations/assert-event-allowed.js +34 -0
  195. package/dist/session-mutations/assert-gadgets.d.ts +164 -0
  196. package/dist/session-mutations/assert-gadgets.d.ts.map +1 -0
  197. package/dist/session-mutations/assert-gadgets.js +245 -0
  198. package/dist/session-mutations/assert-generator.d.ts +35 -0
  199. package/dist/session-mutations/assert-generator.d.ts.map +1 -0
  200. package/dist/session-mutations/assert-generator.js +43 -0
  201. package/dist/session-mutations/assert-no-duplicate-gadget-hooks.d.ts +43 -0
  202. package/dist/session-mutations/assert-no-duplicate-gadget-hooks.d.ts.map +1 -0
  203. package/dist/session-mutations/assert-no-duplicate-gadget-hooks.js +57 -0
  204. package/dist/session-mutations/assert-props-contract.d.ts +19 -0
  205. package/dist/session-mutations/assert-props-contract.d.ts.map +1 -0
  206. package/dist/session-mutations/assert-props-contract.js +28 -0
  207. package/dist/session-mutations/assert-public-env.d.ts +100 -0
  208. package/dist/session-mutations/assert-public-env.d.ts.map +1 -0
  209. package/dist/session-mutations/assert-public-env.js +145 -0
  210. package/dist/session-mutations/assert-stream-contract.d.ts +27 -0
  211. package/dist/session-mutations/assert-stream-contract.d.ts.map +1 -0
  212. package/dist/session-mutations/assert-stream-contract.js +52 -0
  213. package/dist/session-mutations/blueprint-matcher.d.ts +124 -0
  214. package/dist/session-mutations/blueprint-matcher.d.ts.map +1 -0
  215. package/dist/session-mutations/blueprint-matcher.js +277 -0
  216. package/dist/session-mutations/blueprint-registry.d.ts +286 -0
  217. package/dist/session-mutations/blueprint-registry.d.ts.map +1 -0
  218. package/dist/session-mutations/blueprint-registry.js +425 -0
  219. package/dist/session-mutations/bootstrap-meta-derivation.d.ts +429 -0
  220. package/dist/session-mutations/bootstrap-meta-derivation.d.ts.map +1 -0
  221. package/dist/session-mutations/bootstrap-meta-derivation.js +657 -0
  222. package/dist/session-mutations/cache-trace-sink.d.ts +326 -0
  223. package/dist/session-mutations/cache-trace-sink.d.ts.map +1 -0
  224. package/dist/session-mutations/cache-trace-sink.js +92 -0
  225. package/dist/session-mutations/canvas-lifecycle.d.ts +33 -0
  226. package/dist/session-mutations/canvas-lifecycle.d.ts.map +1 -0
  227. package/dist/session-mutations/canvas-lifecycle.js +20 -0
  228. package/dist/session-mutations/client-observations.d.ts +79 -0
  229. package/dist/session-mutations/client-observations.d.ts.map +1 -0
  230. package/dist/session-mutations/client-observations.js +48 -0
  231. package/dist/session-mutations/close.d.ts +70 -0
  232. package/dist/session-mutations/close.d.ts.map +1 -0
  233. package/dist/session-mutations/close.js +127 -0
  234. package/dist/session-mutations/consume.d.ts +183 -0
  235. package/dist/session-mutations/consume.d.ts.map +1 -0
  236. package/dist/session-mutations/consume.js +302 -0
  237. package/dist/session-mutations/errors.d.ts +180 -0
  238. package/dist/session-mutations/errors.d.ts.map +1 -0
  239. package/dist/session-mutations/errors.js +187 -0
  240. package/dist/session-mutations/fetch-gadget-types.d.ts +60 -0
  241. package/dist/session-mutations/fetch-gadget-types.d.ts.map +1 -0
  242. package/dist/session-mutations/fetch-gadget-types.js +119 -0
  243. package/dist/session-mutations/generation-cache.d.ts +147 -0
  244. package/dist/session-mutations/generation-cache.d.ts.map +1 -0
  245. package/dist/session-mutations/generation-cache.js +151 -0
  246. package/dist/session-mutations/get-session.d.ts +71 -0
  247. package/dist/session-mutations/get-session.d.ts.map +1 -0
  248. package/dist/session-mutations/get-session.js +153 -0
  249. package/dist/session-mutations/get-stack.d.ts +32 -0
  250. package/dist/session-mutations/get-stack.d.ts.map +1 -0
  251. package/dist/session-mutations/get-stack.js +85 -0
  252. package/dist/session-mutations/handle-stream.d.ts +121 -0
  253. package/dist/session-mutations/handle-stream.d.ts.map +1 -0
  254. package/dist/session-mutations/handle-stream.js +67 -0
  255. package/dist/session-mutations/handshake.d.ts +464 -0
  256. package/dist/session-mutations/handshake.d.ts.map +1 -0
  257. package/dist/session-mutations/handshake.js +550 -0
  258. package/dist/session-mutations/index.d.ts +85 -0
  259. package/dist/session-mutations/index.d.ts.map +1 -0
  260. package/dist/session-mutations/index.js +93 -0
  261. package/dist/session-mutations/install-to-cache.d.ts +114 -0
  262. package/dist/session-mutations/install-to-cache.d.ts.map +1 -0
  263. package/dist/session-mutations/install-to-cache.js +87 -0
  264. package/dist/session-mutations/installed-blueprints-provider.d.ts +151 -0
  265. package/dist/session-mutations/installed-blueprints-provider.d.ts.map +1 -0
  266. package/dist/session-mutations/installed-blueprints-provider.js +0 -0
  267. package/dist/session-mutations/new-session.d.ts +108 -0
  268. package/dist/session-mutations/new-session.d.ts.map +1 -0
  269. package/dist/session-mutations/new-session.js +248 -0
  270. package/dist/session-mutations/no-credentials-card.d.ts +45 -0
  271. package/dist/session-mutations/no-credentials-card.d.ts.map +1 -0
  272. package/dist/session-mutations/no-credentials-card.js +30 -0
  273. package/dist/session-mutations/payload-trace-sink.d.ts +105 -0
  274. package/dist/session-mutations/payload-trace-sink.d.ts.map +1 -0
  275. package/dist/session-mutations/payload-trace-sink.js +97 -0
  276. package/dist/session-mutations/pop.d.ts +41 -0
  277. package/dist/session-mutations/pop.d.ts.map +1 -0
  278. package/dist/session-mutations/pop.js +62 -0
  279. package/dist/session-mutations/provisional-preview.d.ts +443 -0
  280. package/dist/session-mutations/provisional-preview.d.ts.map +1 -0
  281. package/dist/session-mutations/provisional-preview.js +369 -0
  282. package/dist/session-mutations/push.d.ts +839 -0
  283. package/dist/session-mutations/push.d.ts.map +1 -0
  284. package/dist/session-mutations/push.js +1908 -0
  285. package/dist/session-mutations/refresh-bootstrap.d.ts +133 -0
  286. package/dist/session-mutations/refresh-bootstrap.d.ts.map +1 -0
  287. package/dist/session-mutations/refresh-bootstrap.js +148 -0
  288. package/dist/session-mutations/stream-replay-ops.d.ts +240 -0
  289. package/dist/session-mutations/stream-replay-ops.d.ts.map +1 -0
  290. package/dist/session-mutations/stream-replay-ops.js +273 -0
  291. package/dist/session-mutations/stream.d.ts +57 -0
  292. package/dist/session-mutations/stream.d.ts.map +1 -0
  293. package/dist/session-mutations/stream.js +80 -0
  294. package/dist/session-mutations/submit-action.d.ts +155 -0
  295. package/dist/session-mutations/submit-action.d.ts.map +1 -0
  296. package/dist/session-mutations/submit-action.js +273 -0
  297. package/dist/session-mutations/sync-context.d.ts +90 -0
  298. package/dist/session-mutations/sync-context.d.ts.map +1 -0
  299. package/dist/session-mutations/sync-context.js +273 -0
  300. package/dist/session-mutations/update.d.ts +267 -0
  301. package/dist/session-mutations/update.d.ts.map +1 -0
  302. package/dist/session-mutations/update.js +397 -0
  303. package/dist/threads/append-message.d.ts +26 -0
  304. package/dist/threads/append-message.d.ts.map +1 -0
  305. package/dist/threads/append-message.js +5 -0
  306. package/dist/threads/apply-thread-action.d.ts +36 -0
  307. package/dist/threads/apply-thread-action.d.ts.map +1 -0
  308. package/dist/threads/apply-thread-action.js +5 -0
  309. package/dist/threads/context.d.ts +25 -0
  310. package/dist/threads/context.d.ts.map +1 -0
  311. package/dist/threads/context.js +1 -0
  312. package/dist/threads/create-thread.d.ts +19 -0
  313. package/dist/threads/create-thread.d.ts.map +1 -0
  314. package/dist/threads/create-thread.js +5 -0
  315. package/dist/threads/errors.d.ts +38 -0
  316. package/dist/threads/errors.d.ts.map +1 -0
  317. package/dist/threads/errors.js +41 -0
  318. package/dist/threads/get-thread.d.ts +23 -0
  319. package/dist/threads/get-thread.d.ts.map +1 -0
  320. package/dist/threads/get-thread.js +7 -0
  321. package/dist/threads/index.d.ts +34 -0
  322. package/dist/threads/index.d.ts.map +1 -0
  323. package/dist/threads/index.js +25 -0
  324. package/dist/threads/list-messages.d.ts +25 -0
  325. package/dist/threads/list-messages.d.ts.map +1 -0
  326. package/dist/threads/list-messages.js +5 -0
  327. package/dist/threads/list-threads.d.ts +18 -0
  328. package/dist/threads/list-threads.d.ts.map +1 -0
  329. package/dist/threads/list-threads.js +5 -0
  330. package/dist/threads/observe-messages.d.ts +31 -0
  331. package/dist/threads/observe-messages.d.ts.map +1 -0
  332. package/dist/threads/observe-messages.js +5 -0
  333. package/dist/threads/schemas.d.ts +73 -0
  334. package/dist/threads/schemas.d.ts.map +1 -0
  335. package/dist/threads/schemas.js +86 -0
  336. package/dist/types.d.ts +244 -0
  337. package/dist/types.d.ts.map +1 -0
  338. package/dist/types.js +24 -0
  339. package/package.json +121 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `appendMessage` — persist a message idempotently on (threadId, key).
3
+ *
4
+ * Thin over {@link ThreadStore.appendMessage}. The store owns:
5
+ * - idempotency (first-write-wins on (threadId, key))
6
+ * - seq assignment (monotonic, gap-free, from 1)
7
+ * - unread counter (bumps only on non-user authors)
8
+ * - ownership enforcement
9
+ *
10
+ * Handlers MUST NOT re-implement any of the above. A retry that
11
+ * returns the originally stored message (with stable seq/at) is the
12
+ * contract — transports surface it as a normal 200/201, not a
13
+ * conflict.
14
+ *
15
+ * Failure modes:
16
+ * - {@link InvalidThreadRequestError} — malformed body.
17
+ * - {@link ThreadNotFoundError} — thread missing or wrong owner.
18
+ */
19
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
20
+ import type { ThreadMessage } from '@ggui-ai/protocol';
21
+ import type { ThreadHandlerContext } from './context.js';
22
+ export interface AppendMessageDeps {
23
+ readonly threads: ThreadStore;
24
+ }
25
+ export declare function appendMessage(deps: AppendMessageDeps, input: unknown, ctx: ThreadHandlerContext): Promise<ThreadMessage>;
26
+ //# sourceMappingURL=append-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append-message.d.ts","sourceRoot":"","sources":["../../src/threads/append-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAMzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,aAAa,CAAC,CAOxB"}
@@ -0,0 +1,5 @@
1
+ import { appendThreadMessageInputSchema, parseWithSchema, } from './schemas.js';
2
+ export async function appendMessage(deps, input, ctx) {
3
+ const parsed = parseWithSchema(appendThreadMessageInputSchema, input, 'append-message request');
4
+ return deps.threads.appendMessage(ctx.ownerId, parsed);
5
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * `applyThreadAction` — mutate thread-level state (pin/archive/…).
3
+ *
4
+ * Thin over {@link ThreadStore.applyAction}. The store owns the full
5
+ * action state-machine:
6
+ * - 9-action vocabulary (pin/unpin/mute/unmute/archive/unarchive/
7
+ * mark_read/request_delete/restore)
8
+ * - `restore` requires `status === 'pending_delete'`
9
+ * - `archive`/`unarchive` reject on `pending_delete`
10
+ * - idempotent no-ops leave `updatedAt` stable
11
+ *
12
+ * Handlers MUST NOT re-implement any of those checks — duplicating
13
+ * state-machine rules is how they drift.
14
+ *
15
+ * Failure modes:
16
+ * - {@link InvalidThreadRequestError} — malformed body OR unknown
17
+ * action value (the request-shape rejection path).
18
+ * - {@link InvalidThreadActionError} — reachable only when the
19
+ * store's own validator catches a bypass; normally the request
20
+ * shape parser rejects first.
21
+ * - {@link ThreadActionInvalidStateError} — action valid but
22
+ * not permitted from the current status.
23
+ * - {@link ThreadNotFoundError} — thread missing or wrong owner.
24
+ */
25
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
26
+ import type { Thread } from '@ggui-ai/protocol';
27
+ import type { ThreadHandlerContext } from './context.js';
28
+ export interface ApplyThreadActionDeps {
29
+ readonly threads: ThreadStore;
30
+ }
31
+ export interface ApplyThreadActionInput {
32
+ readonly threadId: string;
33
+ readonly body: unknown;
34
+ }
35
+ export declare function applyThreadAction(deps: ApplyThreadActionDeps, input: ApplyThreadActionInput, ctx: ThreadHandlerContext): Promise<Thread>;
36
+ //# sourceMappingURL=apply-thread-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-thread-action.d.ts","sourceRoot":"","sources":["../../src/threads/apply-thread-action.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,sBAAsB,EAC7B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,5 @@
1
+ import { applyThreadActionInputSchema, parseWithSchema } from './schemas.js';
2
+ export async function applyThreadAction(deps, input, ctx) {
3
+ const parsed = parseWithSchema(applyThreadActionInputSchema, input.body, 'apply-thread-action request');
4
+ return deps.threads.applyAction(ctx.ownerId, input.threadId, parsed.action);
5
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Per-request context threaded through every thread handler.
3
+ *
4
+ * Narrower than the tool-shaped {@link HandlerContext} in this package's
5
+ * root: thread handlers are partition-scoped by `ownerId` (the identity
6
+ * the auth layer resolved upstream), not by `appId`. `appId` is still
7
+ * present on individual `Thread` rows but it's carried as data through
8
+ * request shapes (e.g. {@link CreateThreadInput}), not through handler
9
+ * context.
10
+ */
11
+ import type { ThreadOwnerId } from '@ggui-ai/protocol';
12
+ export interface ThreadHandlerContext {
13
+ /**
14
+ * Resolved owner id — the thread-partition key. Upstream auth proves
15
+ * this; handlers forward it verbatim to {@link ThreadStore}. Tests
16
+ * that bypass auth inject it directly.
17
+ *
18
+ * Wrong-owner + missing-thread both surface as
19
+ * {@link ThreadNotFoundError}; handlers never distinguish them.
20
+ */
21
+ readonly ownerId: ThreadOwnerId;
22
+ /** Per-request correlation id. Used for log lines; transport-owned. */
23
+ readonly requestId: string;
24
+ }
25
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/threads/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `createThread` — open a new persistent chat.
3
+ *
4
+ * Thin over {@link ThreadStore.createThread}. The store owns id
5
+ * generation, initial field seeding (lastSeq=0, unreadCount=0,
6
+ * status='active'), title-hint truncation, and metadata cloning.
7
+ *
8
+ * Failure modes:
9
+ * - {@link InvalidThreadRequestError} — malformed body (missing
10
+ * appId, extra unknown fields, wrong type).
11
+ */
12
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
13
+ import type { Thread } from '@ggui-ai/protocol';
14
+ import type { ThreadHandlerContext } from './context.js';
15
+ export interface CreateThreadDeps {
16
+ readonly threads: ThreadStore;
17
+ }
18
+ export declare function createThread(deps: CreateThreadDeps, input: unknown, ctx: ThreadHandlerContext): Promise<Thread>;
19
+ //# sourceMappingURL=create-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-thread.d.ts","sourceRoot":"","sources":["../../src/threads/create-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,5 @@
1
+ import { createThreadInputSchema, parseWithSchema } from './schemas.js';
2
+ export async function createThread(deps, input, ctx) {
3
+ const parsed = parseWithSchema(createThreadInputSchema, input, 'create-thread request');
4
+ return deps.threads.createThread(ctx.ownerId, parsed);
5
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Handler-level error classes for the threads/ family.
3
+ *
4
+ * The two error tiers kept deliberately separate:
5
+ *
6
+ * - **Request-shape errors** ({@link InvalidThreadRequestError}).
7
+ * Raised by the handlers themselves when input fails schema
8
+ * validation — transport returns 400 Bad Request.
9
+ *
10
+ * - **Store errors** — re-exported from `@ggui-ai/mcp-server-core`
11
+ * and surfaced verbatim by the handlers. Transport maps them to
12
+ * HTTP status codes (`ThreadNotFoundError` → 404,
13
+ * `InvalidThreadActionError` → 400,
14
+ * `ThreadActionInvalidStateError` → 409).
15
+ *
16
+ * Handlers MUST NOT invent new semantic error classes. Every new
17
+ * failure case either maps back to one of the three store errors or
18
+ * is a request-shape error. Anything else implies the store boundary
19
+ * is leaking concerns it shouldn't own — fix there, not here.
20
+ */
21
+ export { InvalidThreadActionError, ThreadActionInvalidStateError, ThreadNotFoundError, } from '@ggui-ai/mcp-server-core';
22
+ /**
23
+ * Raised when a thread handler receives malformed input — unknown
24
+ * fields are fine (the schemas use `.strict()` only where ambiguity
25
+ * would be dangerous; otherwise we pass extras through for forward-
26
+ * compatibility), but missing/wrong-typed required fields fail here.
27
+ *
28
+ * `issues` is a machine-readable snapshot of the zod error's
29
+ * `issues[]`. Transports that want to return structured 400s use it;
30
+ * transports that return a flat `{ error: string }` just read
31
+ * `message`.
32
+ */
33
+ export declare class InvalidThreadRequestError extends Error {
34
+ readonly code = "INVALID_THREAD_REQUEST";
35
+ readonly issues: readonly unknown[];
36
+ constructor(message: string, issues?: readonly unknown[]);
37
+ }
38
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/threads/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;GAUG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,OAAO,EAAO;CAK7D"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Handler-level error classes for the threads/ family.
3
+ *
4
+ * The two error tiers kept deliberately separate:
5
+ *
6
+ * - **Request-shape errors** ({@link InvalidThreadRequestError}).
7
+ * Raised by the handlers themselves when input fails schema
8
+ * validation — transport returns 400 Bad Request.
9
+ *
10
+ * - **Store errors** — re-exported from `@ggui-ai/mcp-server-core`
11
+ * and surfaced verbatim by the handlers. Transport maps them to
12
+ * HTTP status codes (`ThreadNotFoundError` → 404,
13
+ * `InvalidThreadActionError` → 400,
14
+ * `ThreadActionInvalidStateError` → 409).
15
+ *
16
+ * Handlers MUST NOT invent new semantic error classes. Every new
17
+ * failure case either maps back to one of the three store errors or
18
+ * is a request-shape error. Anything else implies the store boundary
19
+ * is leaking concerns it shouldn't own — fix there, not here.
20
+ */
21
+ export { InvalidThreadActionError, ThreadActionInvalidStateError, ThreadNotFoundError, } from '@ggui-ai/mcp-server-core';
22
+ /**
23
+ * Raised when a thread handler receives malformed input — unknown
24
+ * fields are fine (the schemas use `.strict()` only where ambiguity
25
+ * would be dangerous; otherwise we pass extras through for forward-
26
+ * compatibility), but missing/wrong-typed required fields fail here.
27
+ *
28
+ * `issues` is a machine-readable snapshot of the zod error's
29
+ * `issues[]`. Transports that want to return structured 400s use it;
30
+ * transports that return a flat `{ error: string }` just read
31
+ * `message`.
32
+ */
33
+ export class InvalidThreadRequestError extends Error {
34
+ code = 'INVALID_THREAD_REQUEST';
35
+ issues;
36
+ constructor(message, issues = []) {
37
+ super(message);
38
+ this.name = 'InvalidThreadRequestError';
39
+ this.issues = issues;
40
+ }
41
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `getThread` — fetch a single thread by id, owner-scoped.
3
+ *
4
+ * Thin over {@link ThreadStore.getThread}. The store already partitions
5
+ * by ownerId (wrong-owner → null, same surface as missing). This
6
+ * handler promotes `null` to a typed {@link ThreadNotFoundError} so
7
+ * transports have exactly one "thread not found" mapping to 404 —
8
+ * no optional-return logic branches at the HTTP layer.
9
+ *
10
+ * Failure modes:
11
+ * - {@link ThreadNotFoundError} — thread missing or wrong owner.
12
+ */
13
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
14
+ import type { Thread } from '@ggui-ai/protocol';
15
+ import type { ThreadHandlerContext } from './context.js';
16
+ export interface GetThreadDeps {
17
+ readonly threads: ThreadStore;
18
+ }
19
+ export interface GetThreadInput {
20
+ readonly threadId: string;
21
+ }
22
+ export declare function getThread(deps: GetThreadDeps, input: GetThreadInput, ctx: ThreadHandlerContext): Promise<Thread>;
23
+ //# sourceMappingURL=get-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-thread.d.ts","sourceRoot":"","sources":["../../src/threads/get-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -0,0 +1,7 @@
1
+ import { ThreadNotFoundError } from './errors.js';
2
+ export async function getThread(deps, input, ctx) {
3
+ const thread = await deps.threads.getThread(ctx.ownerId, input.threadId);
4
+ if (!thread)
5
+ throw new ThreadNotFoundError(input.threadId);
6
+ return thread;
7
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Persistent-chat handler family (`@ggui-ai/mcp-server-handlers/threads`).
3
+ *
4
+ * Thin functional layer over {@link ThreadStore}. Every handler:
5
+ * - takes `(deps, input, ctx)` where `deps.threads` is a store impl.
6
+ * - parses request shape and throws
7
+ * {@link InvalidThreadRequestError} on failure.
8
+ * - delegates the load-bearing work to the store, which enforces
9
+ * ownership, idempotency, sequencing, and state-machine rules.
10
+ * - surfaces the store's typed errors ({@link ThreadNotFoundError},
11
+ * {@link InvalidThreadActionError},
12
+ * {@link ThreadActionInvalidStateError}) without re-wrapping.
13
+ *
14
+ * Pure functions, no transport coupling. HTTP routing (Step 4) and SSE
15
+ * (Step 5) mount these directly; non-HTTP transports (e.g. a future
16
+ * MCP resource) can reuse them identically.
17
+ */
18
+ export { createThread } from './create-thread.js';
19
+ export type { CreateThreadDeps } from './create-thread.js';
20
+ export { getThread } from './get-thread.js';
21
+ export type { GetThreadDeps, GetThreadInput } from './get-thread.js';
22
+ export { listThreads } from './list-threads.js';
23
+ export type { ListThreadsDeps } from './list-threads.js';
24
+ export { appendMessage } from './append-message.js';
25
+ export type { AppendMessageDeps } from './append-message.js';
26
+ export { listMessages } from './list-messages.js';
27
+ export type { ListMessagesDeps, ListMessagesInput, } from './list-messages.js';
28
+ export { applyThreadAction } from './apply-thread-action.js';
29
+ export type { ApplyThreadActionDeps, ApplyThreadActionInput, } from './apply-thread-action.js';
30
+ export { observeMessages } from './observe-messages.js';
31
+ export type { ObserveMessagesDeps, ObserveMessagesInput, } from './observe-messages.js';
32
+ export type { ThreadHandlerContext } from './context.js';
33
+ export { InvalidThreadActionError, InvalidThreadRequestError, ThreadActionInvalidStateError, ThreadNotFoundError, } from './errors.js';
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/threads/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Persistent-chat handler family (`@ggui-ai/mcp-server-handlers/threads`).
3
+ *
4
+ * Thin functional layer over {@link ThreadStore}. Every handler:
5
+ * - takes `(deps, input, ctx)` where `deps.threads` is a store impl.
6
+ * - parses request shape and throws
7
+ * {@link InvalidThreadRequestError} on failure.
8
+ * - delegates the load-bearing work to the store, which enforces
9
+ * ownership, idempotency, sequencing, and state-machine rules.
10
+ * - surfaces the store's typed errors ({@link ThreadNotFoundError},
11
+ * {@link InvalidThreadActionError},
12
+ * {@link ThreadActionInvalidStateError}) without re-wrapping.
13
+ *
14
+ * Pure functions, no transport coupling. HTTP routing (Step 4) and SSE
15
+ * (Step 5) mount these directly; non-HTTP transports (e.g. a future
16
+ * MCP resource) can reuse them identically.
17
+ */
18
+ export { createThread } from './create-thread.js';
19
+ export { getThread } from './get-thread.js';
20
+ export { listThreads } from './list-threads.js';
21
+ export { appendMessage } from './append-message.js';
22
+ export { listMessages } from './list-messages.js';
23
+ export { applyThreadAction } from './apply-thread-action.js';
24
+ export { observeMessages } from './observe-messages.js';
25
+ export { InvalidThreadActionError, InvalidThreadRequestError, ThreadActionInvalidStateError, ThreadNotFoundError, } from './errors.js';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `listMessages` — read a thread's messages in seq-ASC order.
3
+ *
4
+ * Thin over {@link ThreadStore.listMessages}. The store enforces
5
+ * ordering, ownership, and fromSeq/cursor paging. This handler splits
6
+ * the `threadId` path parameter from the query-string-shaped options
7
+ * so transports (Step 4) can wire them directly from URL segments +
8
+ * query params without bespoke parsing.
9
+ *
10
+ * Failure modes:
11
+ * - {@link InvalidThreadRequestError} — malformed options.
12
+ * - {@link ThreadNotFoundError} — thread missing or wrong owner.
13
+ */
14
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
15
+ import type { ListMessagesResult } from '@ggui-ai/protocol';
16
+ import type { ThreadHandlerContext } from './context.js';
17
+ export interface ListMessagesDeps {
18
+ readonly threads: ThreadStore;
19
+ }
20
+ export interface ListMessagesInput {
21
+ readonly threadId: string;
22
+ readonly options?: unknown;
23
+ }
24
+ export declare function listMessages(deps: ListMessagesDeps, input: ListMessagesInput, ctx: ThreadHandlerContext): Promise<ListMessagesResult>;
25
+ //# sourceMappingURL=list-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-messages.d.ts","sourceRoot":"","sources":["../../src/threads/list-messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAO7B"}
@@ -0,0 +1,5 @@
1
+ import { listMessagesOptionsSchema, parseWithSchema } from './schemas.js';
2
+ export async function listMessages(deps, input, ctx) {
3
+ const options = parseWithSchema(listMessagesOptionsSchema, input.options ?? {}, 'list-messages options');
4
+ return deps.threads.listMessages(ctx.ownerId, input.threadId, options);
5
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `listThreads` — enumerate the caller's threads, owner-scoped.
3
+ *
4
+ * Thin over {@link ThreadStore.listThreads}. The store enforces
5
+ * partitioning by ownerId, ordering (most-recent-first), and
6
+ * limit/cursor semantics. This handler only validates request shape.
7
+ *
8
+ * Failure modes:
9
+ * - {@link InvalidThreadRequestError} — malformed filter.
10
+ */
11
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
12
+ import type { ListThreadsResult } from '@ggui-ai/protocol';
13
+ import type { ThreadHandlerContext } from './context.js';
14
+ export interface ListThreadsDeps {
15
+ readonly threads: ThreadStore;
16
+ }
17
+ export declare function listThreads(deps: ListThreadsDeps, input: unknown, ctx: ThreadHandlerContext): Promise<ListThreadsResult>;
18
+ //# sourceMappingURL=list-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-threads.d.ts","sourceRoot":"","sources":["../../src/threads/list-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAO5B"}
@@ -0,0 +1,5 @@
1
+ import { listThreadsFilterSchema, parseWithSchema } from './schemas.js';
2
+ export async function listThreads(deps, input, ctx) {
3
+ const filter = parseWithSchema(listThreadsFilterSchema, input ?? {}, 'list-threads filter');
4
+ return deps.threads.listThreads(ctx.ownerId, filter);
5
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `observeMessages` — subscribe to appended messages on a thread.
3
+ *
4
+ * Thin over {@link ThreadStore.observeMessages}. The store owns
5
+ * snapshot+tail semantics, ordering, fromSeq skip, and
6
+ * throw-on-wrong-owner (from the iterator's first pull). This
7
+ * handler only parses options + forwards.
8
+ *
9
+ * Returns an `AsyncIterable<ThreadMessage>` — the SSE transport
10
+ * (Step 5) iterates it and serializes each message as a
11
+ * {@link ThreadStreamEvent}. Non-SSE consumers (tests, future
12
+ * WebSocket transports) iterate it the same way.
13
+ *
14
+ * Failure modes:
15
+ * - {@link InvalidThreadRequestError} — malformed options.
16
+ * - {@link ThreadNotFoundError} — thrown from the iterator's
17
+ * first `next()`, NOT from this function synchronously. Callers
18
+ * MUST handle the rejection on the first pull.
19
+ */
20
+ import type { ThreadStore } from '@ggui-ai/mcp-server-core';
21
+ import type { ThreadMessage } from '@ggui-ai/protocol';
22
+ import type { ThreadHandlerContext } from './context.js';
23
+ export interface ObserveMessagesDeps {
24
+ readonly threads: ThreadStore;
25
+ }
26
+ export interface ObserveMessagesInput {
27
+ readonly threadId: string;
28
+ readonly options?: unknown;
29
+ }
30
+ export declare function observeMessages(deps: ObserveMessagesDeps, input: ObserveMessagesInput, ctx: ThreadHandlerContext): AsyncIterable<ThreadMessage>;
31
+ //# sourceMappingURL=observe-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe-messages.d.ts","sourceRoot":"","sources":["../../src/threads/observe-messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAMzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,oBAAoB,EAC3B,GAAG,EAAE,oBAAoB,GACxB,aAAa,CAAC,aAAa,CAAC,CAO9B"}
@@ -0,0 +1,5 @@
1
+ import { observeMessagesOptionsSchema, parseWithSchema, } from './schemas.js';
2
+ export function observeMessages(deps, input, ctx) {
3
+ const options = parseWithSchema(observeMessagesOptionsSchema, input.options ?? {}, 'observe-messages options');
4
+ return deps.threads.observeMessages(ctx.ownerId, input.threadId, options);
5
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Shared zod schemas for thread-handler request parsing.
3
+ *
4
+ * Each schema mirrors exactly one request shape from
5
+ * `@ggui-ai/protocol/types/thread.ts` — kept in lockstep by tests, not
6
+ * by shared code, because the protocol types are the source of truth.
7
+ * A schema that drifts from the protocol shape is a bug in THIS file,
8
+ * not a need for a new protocol type.
9
+ *
10
+ * Handlers import `parseWithSchema` to convert zod errors into
11
+ * {@link InvalidThreadRequestError} uniformly, so transports see one
12
+ * error class for every shape-level rejection.
13
+ */
14
+ import { z, type ZodType } from 'zod';
15
+ export declare const createThreadInputSchema: z.ZodObject<{
16
+ appId: z.ZodString;
17
+ firstMessageHint: z.ZodOptional<z.ZodString>;
18
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
19
+ }, z.core.$strict>;
20
+ export declare const appendThreadMessageInputSchema: z.ZodObject<{
21
+ threadId: z.ZodString;
22
+ key: z.ZodString;
23
+ authorRole: z.ZodEnum<{
24
+ agent: "agent";
25
+ user: "user";
26
+ system: "system";
27
+ }>;
28
+ kind: z.ZodEnum<{
29
+ text: "text";
30
+ card: "card";
31
+ event: "event";
32
+ }>;
33
+ blocks: z.ZodArray<z.ZodUnknown>;
34
+ cardSnapshot: z.ZodOptional<z.ZodUnknown>;
35
+ textPreview: z.ZodString;
36
+ aiContext: z.ZodOptional<z.ZodUnknown>;
37
+ }, z.core.$strict>;
38
+ export declare const listMessagesOptionsSchema: z.ZodObject<{
39
+ fromSeq: z.ZodOptional<z.ZodNumber>;
40
+ limit: z.ZodOptional<z.ZodNumber>;
41
+ cursor: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strict>;
43
+ export declare const listThreadsFilterSchema: z.ZodObject<{
44
+ status: z.ZodOptional<z.ZodEnum<{
45
+ active: "active";
46
+ archived: "archived";
47
+ pending_delete: "pending_delete";
48
+ }>>;
49
+ appId: z.ZodOptional<z.ZodString>;
50
+ limit: z.ZodOptional<z.ZodNumber>;
51
+ cursor: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strict>;
53
+ /**
54
+ * A ThreadStateAction string. Derived from the canonical array on the
55
+ * protocol so any future action addition surfaces here automatically —
56
+ * no duplicate literal list.
57
+ */
58
+ export declare const threadStateActionSchema: z.ZodCustom<"pin" | "unpin" | "mute" | "unmute" | "archive" | "unarchive" | "mark_read" | "request_delete" | "restore", "pin" | "unpin" | "mute" | "unmute" | "archive" | "unarchive" | "mark_read" | "request_delete" | "restore">;
59
+ export declare const applyThreadActionInputSchema: z.ZodObject<{
60
+ action: z.ZodCustom<"pin" | "unpin" | "mute" | "unmute" | "archive" | "unarchive" | "mark_read" | "request_delete" | "restore", "pin" | "unpin" | "mute" | "unmute" | "archive" | "unarchive" | "mark_read" | "request_delete" | "restore">;
61
+ }, z.core.$strict>;
62
+ export declare const observeMessagesOptionsSchema: z.ZodObject<{
63
+ fromSeq: z.ZodOptional<z.ZodNumber>;
64
+ tail: z.ZodOptional<z.ZodBoolean>;
65
+ }, z.core.$strict>;
66
+ /**
67
+ * Parse `input` against `schema`; throw {@link InvalidThreadRequestError}
68
+ * on failure (carrying zod's `issues` verbatim for transports that want
69
+ * to surface them). Success returns the parsed value with full type
70
+ * inference — the caller doesn't need its own cast.
71
+ */
72
+ export declare function parseWithSchema<T>(schema: ZodType<T>, input: unknown, contextLabel: string): T;
73
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/threads/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAYtC,eAAO,MAAM,uBAAuB;;;;kBAMzB,CAAC;AAEZ,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;kBAWhC,CAAC;AAEZ,eAAO,MAAM,yBAAyB;;;;kBAM3B,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;;;;;kBAOzB,CAAC;AAEZ;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,qOAOnC,CAAC;AAEF,eAAO,MAAM,4BAA4B;;kBAI9B,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;;kBAK9B,CAAC;AAEZ;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,MAAM,GACnB,CAAC,CASH"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Shared zod schemas for thread-handler request parsing.
3
+ *
4
+ * Each schema mirrors exactly one request shape from
5
+ * `@ggui-ai/protocol/types/thread.ts` — kept in lockstep by tests, not
6
+ * by shared code, because the protocol types are the source of truth.
7
+ * A schema that drifts from the protocol shape is a bug in THIS file,
8
+ * not a need for a new protocol type.
9
+ *
10
+ * Handlers import `parseWithSchema` to convert zod errors into
11
+ * {@link InvalidThreadRequestError} uniformly, so transports see one
12
+ * error class for every shape-level rejection.
13
+ */
14
+ import { z } from 'zod';
15
+ import { isThreadStateAction, THREAD_STATE_ACTIONS, } from '@ggui-ai/protocol';
16
+ import { InvalidThreadRequestError } from './errors.js';
17
+ const threadStatusSchema = z.enum(['active', 'archived', 'pending_delete']);
18
+ const authorRoleSchema = z.enum(['user', 'agent', 'system']);
19
+ const messageKindSchema = z.enum(['text', 'card', 'event']);
20
+ export const createThreadInputSchema = z
21
+ .object({
22
+ appId: z.string().min(1, 'appId is required'),
23
+ firstMessageHint: z.string().optional(),
24
+ metadata: z.record(z.string(), z.unknown()).optional(),
25
+ })
26
+ .strict();
27
+ export const appendThreadMessageInputSchema = z
28
+ .object({
29
+ threadId: z.string().min(1, 'threadId is required'),
30
+ key: z.string().min(1, 'key is required'),
31
+ authorRole: authorRoleSchema,
32
+ kind: messageKindSchema,
33
+ blocks: z.array(z.unknown()),
34
+ cardSnapshot: z.unknown().optional(),
35
+ textPreview: z.string(),
36
+ aiContext: z.unknown().optional(),
37
+ })
38
+ .strict();
39
+ export const listMessagesOptionsSchema = z
40
+ .object({
41
+ fromSeq: z.number().int().positive().optional(),
42
+ limit: z.number().int().positive().max(500).optional(),
43
+ cursor: z.string().optional(),
44
+ })
45
+ .strict();
46
+ export const listThreadsFilterSchema = z
47
+ .object({
48
+ status: threadStatusSchema.optional(),
49
+ appId: z.string().min(1).optional(),
50
+ limit: z.number().int().positive().max(500).optional(),
51
+ cursor: z.string().optional(),
52
+ })
53
+ .strict();
54
+ /**
55
+ * A ThreadStateAction string. Derived from the canonical array on the
56
+ * protocol so any future action addition surfaces here automatically —
57
+ * no duplicate literal list.
58
+ */
59
+ export const threadStateActionSchema = z.custom((value) => isThreadStateAction(value), {
60
+ message: `must be one of: ${THREAD_STATE_ACTIONS.join(', ')}`,
61
+ });
62
+ export const applyThreadActionInputSchema = z
63
+ .object({
64
+ action: threadStateActionSchema,
65
+ })
66
+ .strict();
67
+ export const observeMessagesOptionsSchema = z
68
+ .object({
69
+ fromSeq: z.number().int().positive().optional(),
70
+ tail: z.boolean().optional(),
71
+ })
72
+ .strict();
73
+ /**
74
+ * Parse `input` against `schema`; throw {@link InvalidThreadRequestError}
75
+ * on failure (carrying zod's `issues` verbatim for transports that want
76
+ * to surface them). Success returns the parsed value with full type
77
+ * inference — the caller doesn't need its own cast.
78
+ */
79
+ export function parseWithSchema(schema, input, contextLabel) {
80
+ const result = schema.safeParse(input);
81
+ if (result.success)
82
+ return result.data;
83
+ throw new InvalidThreadRequestError(`Invalid ${contextLabel}: ${result.error.issues
84
+ .map((i) => `${i.path.join('.') || '(root)'} — ${i.message}`)
85
+ .join('; ')}`, result.error.issues);
86
+ }