wednesdayai 0.4.12-dev.715 → 0.4.12-dev.717

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 (456) hide show
  1. package/dist/{agent-turn-enqueue-Dwz_R_DW.js → agent-turn-enqueue-Cqo34Swm.js} +4 -4
  2. package/dist/{agent-turn-enqueue-Da7B-J9y.js → agent-turn-enqueue-N-q0v3mc.js} +4 -4
  3. package/dist/{agent-turn-execute-DvP2nf2J.js → agent-turn-execute-Bw9hhkAP.js} +69 -24
  4. package/dist/{agent-turn-recovery-adapter-SdyNUgzD.js → agent-turn-recovery-adapter-BkIal4FW.js} +1 -1
  5. package/dist/{agent-turn-recovery-adapter-DF3vdyE5.js → agent-turn-recovery-adapter-CLY2Dn04.js} +1 -1
  6. package/dist/{agent-turn-runner-D20dK54z.js → agent-turn-runner-BsdyAURQ.js} +1 -1
  7. package/dist/{agent-turn-runner-CzcuyJfX.js → agent-turn-runner-CImqp_RN.js} +1 -1
  8. package/dist/{agent-turn-runner-PbFFnq5P.js → agent-turn-runner-CUCOdxhH.js} +1 -1
  9. package/dist/{agent-turn-runner-DFZxbjaC.js → agent-turn-runner-Vd3aTCni.js} +1 -1
  10. package/dist/{agents-D7wjsCEZ.js → agents-BBoIqOw6.js} +4 -4
  11. package/dist/{agents.config-iUjxdoPw.js → agents.config-C8RJrfbr.js} +1 -1
  12. package/dist/{agents.config-C-pTu-0T.js → agents.config-Ctnm8o8d.js} +1 -1
  13. package/dist/{audio-preflight-nrbQcAOS.js → audio-preflight-BKQpd1eU.js} +6 -6
  14. package/dist/{audio-preflight-BZFphz4E.js → audio-preflight-bEi-KkBn.js} +6 -6
  15. package/dist/{audio-transcription-runner-C2Q9mEhB.js → audio-transcription-runner-BD7UgbNj.js} +1 -1
  16. package/dist/{audio-transcription-runner-D-d42kdt.js → audio-transcription-runner-CGTNNwbm.js} +1 -1
  17. package/dist/{audit-BlUclRcb.js → audit-BM8WZyx6.js} +3 -3
  18. package/dist/{audit-C_g-UVNn.js → audit-CcNEpaG6.js} +3 -3
  19. package/dist/{auth-choice-ZsDU-57A.js → auth-choice-DTg-b2da.js} +1 -1
  20. package/dist/{auth-choice-D9ydQCkO.js → auth-choice-VnJYar-i.js} +1 -1
  21. package/dist/{banner-U4ziIXHD.js → banner-_g-nCJoZ.js} +1 -1
  22. package/dist/build-info.json +3 -3
  23. package/dist/bundled/boot-md/handler.js +2 -2
  24. package/dist/bundled/session-journal/handler.js +2 -2
  25. package/dist/bundled/session-memory/handler.js +2 -2
  26. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  27. package/dist/{channel-options-IkZTBShY.js → channel-options-BX8MFfPW.js} +1 -1
  28. package/dist/{channel-options-CdXOmeJN.js → channel-options-Dod3uWTl.js} +1 -1
  29. package/dist/{channels-cli-CUTJf_vC.js → channels-cli-DyfFtAZa.js} +23 -23
  30. package/dist/{channels-cli-CBBGSlVe.js → channels-cli-MbAArXF1.js} +23 -23
  31. package/dist/cli/daemon-cli.js +1 -1
  32. package/dist/{cli-DCyFadMx.js → cli-CdrO5h4P.js} +17 -17
  33. package/dist/{cli-BtY_juql.js → cli-DF91S8Cf.js} +17 -17
  34. package/dist/{command-queue-B1RxJ6bM.js → command-queue-DmXWCoY0.js} +1 -1
  35. package/dist/{command-queue-6Jucg1io.js → command-queue-URs9pYSC.js} +1 -1
  36. package/dist/{command-registry-BMq2CUSD.js → command-registry-C7nkhshN.js} +9 -9
  37. package/dist/{completion-cli-CATJLvVa.js → completion-cli-CjPs9az4.js} +2 -2
  38. package/dist/{completion-cli-Dbszfn8D.js → completion-cli-DozvikmZ.js} +1 -1
  39. package/dist/{config-cli-3a-9iNyI.js → config-cli-Dagtz6FG.js} +1 -1
  40. package/dist/{config-cli-O9P0EpgL.js → config-cli-Dv1Dad57.js} +1 -1
  41. package/dist/config.js +9 -9
  42. package/dist/{configure-DAA_ncD3.js → configure-BbKf530X.js} +5 -5
  43. package/dist/{configure-Dld8IaT8.js → configure-CBJSHejz.js} +5 -5
  44. package/dist/{daemon-cli-B3Q460ai.js → daemon-cli-CiPY543O.js} +5 -5
  45. package/dist/{daemon-cli-C5cAb15Z.js → daemon-cli-YmPcKhvo.js} +5 -5
  46. package/dist/daemon-cli.js +44 -3
  47. package/dist/{daemon-install-DGU1qIIK.js → daemon-install-BuETscSF.js} +3 -3
  48. package/dist/{daemon-install-CBIxgo4p.js → daemon-install-CGg5r1wy.js} +3 -3
  49. package/dist/{deliver-Bhlx9VG9.js → deliver-8xg5ISEI.js} +1 -1
  50. package/dist/{deliver-DT4v-Go0.js → deliver-C5SDo7TP.js} +1 -1
  51. package/dist/{diagnostic-BTSirPP0.js → diagnostic-D7DvV7NT.js} +1 -1
  52. package/dist/{diagnostic-DRvqMPW7.js → diagnostic-Dv8UWiI0.js} +1 -1
  53. package/dist/{diagnostics-C4-TUVnm.js → diagnostics-C6ntZHc3.js} +1 -1
  54. package/dist/{diagnostics-FIcvxigK.js → diagnostics-Ds3p_NPY.js} +1 -1
  55. package/dist/{dm-policy-shared-BE04dZam.js → dm-policy-shared-BLJbsZzf.js} +1 -1
  56. package/dist/{doctor-completion-BJpzpRx6.js → doctor-completion-CJYV2FQ5.js} +1 -1
  57. package/dist/{doctor-completion-Ca_SREXp.js → doctor-completion-D4T2GzR7.js} +1 -1
  58. package/dist/entry.js +2 -2
  59. package/dist/{exec-approvals-cli-t7rAulRf.js → exec-approvals-cli-BAJ3sxzP.js} +3 -3
  60. package/dist/{exec-approvals-cli-DsXabPF_.js → exec-approvals-cli-DIUYxvM0.js} +3 -3
  61. package/dist/extensionAPI.js +2 -2
  62. package/dist/{gateway-cli-BTuK5wC4.js → gateway-cli-Cyivh-5T.js} +121 -84
  63. package/dist/{gateway-cli-BYqWX_fq.js → gateway-cli-DtFDQj5d.js} +121 -84
  64. package/dist/{health-fB9rLTPD.js → health-Cooqit6V.js} +2 -2
  65. package/dist/{health-DFWpyp9O.js → health-DFat5vO5.js} +2 -2
  66. package/dist/{hooks-cli-DKZeKlmX.js → hooks-cli-CB-96Su8.js} +19 -19
  67. package/dist/{hooks-cli-CriP6g_q.js → hooks-cli-yNAgxRQS.js} +19 -19
  68. package/dist/index.js +21 -21
  69. package/dist/{inspect-DVHAPbcZ.js → inspect-BXlZnWkg.js} +1 -1
  70. package/dist/{inspect-gvjq38z1.js → inspect-LfUprDjx.js} +1 -1
  71. package/dist/{installs-CBHXvqKf.js → installs-CdLdL1gD.js} +1 -1
  72. package/dist/{installs-CnAcm0ba.js → installs-CpnJwZZ_.js} +1 -1
  73. package/dist/{lifecycle-core-BdCcww82.js → lifecycle-core-CuMY0U_8.js} +3 -3
  74. package/dist/{lifecycle-core-B3-ezmTx.js → lifecycle-core-M-5Z8Xml.js} +3 -3
  75. package/dist/llm-slug-generator.js +2 -2
  76. package/dist/{models-DXRXVywP.js → models-Dlat36jl.js} +1 -1
  77. package/dist/{models-cli-C7bSvLGL.js → models-cli-DMjHkAqq.js} +17 -17
  78. package/dist/{models-cli-h6ejcNF7.js → models-cli-vjFaOcNS.js} +18 -18
  79. package/dist/{node-cli-CS8E71Vc.js → node-cli-Csimlxec.js} +8 -8
  80. package/dist/{node-cli-CPo0jR3t.js → node-cli-dh4qWKpT.js} +8 -8
  81. package/dist/{node-service-BnwLXY5x.js → node-service-BnyKZNqa.js} +1 -1
  82. package/dist/{node-service-r64yexlb.js → node-service-Ys7JZFz-.js} +1 -1
  83. package/dist/{npm-pack-install-CFiN84Qw.js → npm-pack-install-B7wQANiM.js} +1 -1
  84. package/dist/{npm-pack-install-bdyXL1bZ.js → npm-pack-install-DcBobJp3.js} +1 -1
  85. package/dist/{npm-resolution-CaEc_FBL.js → npm-resolution-B0rqOBgy.js} +2 -2
  86. package/dist/{npm-resolution-B7regLLc.js → npm-resolution-SdoNL0ud.js} +2 -2
  87. package/dist/{onboard-B1WwaAdf.js → onboard-DuNuHUvh.js} +3 -3
  88. package/dist/{onboard-B_6H9HpS.js → onboard-_pVU_O8s.js} +3 -3
  89. package/dist/{onboard-channels-BWrbGzK9.js → onboard-channels-28JqVvAv.js} +2 -2
  90. package/dist/{onboard-channels-CxiuviBR.js → onboard-channels-P7F-dNwm.js} +2 -2
  91. package/dist/{onboarding-DemzhSFH.js → onboarding-BBb8ZbfX.js} +3 -3
  92. package/dist/{onboarding-D9VO9_5U.js → onboarding-BcI8N4WK.js} +3 -3
  93. package/dist/{onboarding.finalize-C8Pqseaq.js → onboarding.finalize-BXkz7oPa.js} +26 -26
  94. package/dist/{onboarding.finalize-DeJ35Prz.js → onboarding.finalize-D9fyrhAS.js} +25 -25
  95. package/dist/{operator-commands-Dwtv8SyF.js → operator-commands-CIz47IKl.js} +2 -2
  96. package/dist/{operator-commands-BRKxpjt9.js → operator-commands-CtYCnspr.js} +2 -2
  97. package/dist/{pi-embedded-BcRvgwKi.js → pi-embedded-Qyba-Rws.js} +22 -1
  98. package/dist/{pi-embedded-helpers-D19zTumt.js → pi-embedded-helpers-BU47jdPO.js} +1 -1
  99. package/dist/{pi-embedded-helpers-DEHXX7Dr.js → pi-embedded-helpers-i0-tPaxH.js} +1 -1
  100. package/dist/{pi-embedded-recovery-adapter-MaU4SQ3X.js → pi-embedded-recovery-adapter-1Lgt8q1h.js} +2 -2
  101. package/dist/{pi-embedded-recovery-adapter-licel-RD.js → pi-embedded-recovery-adapter-B2AFWrYt.js} +2 -2
  102. package/dist/{pi-embedded-recovery-adapter-ZV9u5snz.js → pi-embedded-recovery-adapter-CNdSU-s7.js} +8 -8
  103. package/dist/{pi-embedded-recovery-adapter-DB4blfKA.js → pi-embedded-recovery-adapter-DL78oCTf.js} +8 -8
  104. package/dist/{pi-embedded-utils-oIHgFob3.js → pi-embedded-utils-8OzPnJMh.js} +1 -1
  105. package/dist/{pi-embedded-utils-BhOMYPQU.js → pi-embedded-utils-BtOzugyp.js} +1 -1
  106. package/dist/{pi-embedded-DsDG-ETP.js → pi-embedded-wjGM_bNN.js} +22 -1
  107. package/dist/{pi-tools.policy-4GqIom7_.js → pi-tools.policy-DPm2eos4.js} +1 -1
  108. package/dist/{plugin-registry-CxDNClOG.js → plugin-registry-CC8YsXPr.js} +1 -1
  109. package/dist/{plugin-registry-alYBvHFE.js → plugin-registry-CPS5bO_-.js} +1 -1
  110. package/dist/plugin-sdk/{agent-scope-BLF4nZUv.js → agent-scope-BYp_CjdU.js} +2 -2
  111. package/dist/plugin-sdk/{agent-scope-BQYVQxfQ.js → agent-scope-DU8uJiiv.js} +2 -2
  112. package/dist/plugin-sdk/agent-turn-execute-BCE3FS2s.js +61 -0
  113. package/dist/plugin-sdk/agent-turn-execute-DIrSWfHZ.js +61 -0
  114. package/dist/plugin-sdk/{agent-turn-runner-YBWX_qXk.js → agent-turn-runner-B9_FKVSu.js} +6 -6
  115. package/dist/plugin-sdk/{agent-turn-runner-CDA8JPSH.js → agent-turn-runner-CmDXH4Z8.js} +6 -6
  116. package/dist/plugin-sdk/agent-turn-runner-gf0ARmuP.js +11 -0
  117. package/dist/plugin-sdk/{api-key-rotation-XDUKz2gd.js → api-key-rotation-CDNf_4cI.js} +2 -2
  118. package/dist/plugin-sdk/{api-key-rotation-BW3rq9Tg.js → api-key-rotation-Oe0hkmVQ.js} +2 -2
  119. package/dist/plugin-sdk/{artifacts-HAYpGlG1.js → artifacts-BMLMg3MG.js} +1 -1
  120. package/dist/plugin-sdk/{artifacts-C8xK4Y3e.js → artifacts-Dk-7TtTn.js} +1 -1
  121. package/dist/plugin-sdk/{audio-preflight-Bi8RI9zM.js → audio-preflight-8hRbl8Io.js} +22 -22
  122. package/dist/plugin-sdk/{audio-preflight-BS29OWk3.js → audio-preflight-BmKL6FNP.js} +2 -2
  123. package/dist/plugin-sdk/audio-preflight-DlGohKMs.js +28 -0
  124. package/dist/plugin-sdk/{audio-transcription-runner-CGgNZVZv.js → audio-transcription-runner-CUsZFiEA.js} +11 -11
  125. package/dist/plugin-sdk/{audio-transcription-runner-BNafitZj.js → audio-transcription-runner-TBjJv_mZ.js} +10 -10
  126. package/dist/plugin-sdk/{auth-profiles-CCJQoedi.js → auth-profiles-DHZjW8Vk.js} +5 -5
  127. package/dist/plugin-sdk/{auth-profiles-CIKTWees.js → auth-profiles-OgKl-vr-.js} +5 -5
  128. package/dist/plugin-sdk/{channel-activity-BKwRzYJb.js → channel-activity-Dr4PYej7.js} +3 -3
  129. package/dist/plugin-sdk/{channel-activity-Ck83U_es.js → channel-activity-OIauZrkN.js} +3 -3
  130. package/dist/plugin-sdk/{chrome-D0eLSqkP.js → chrome-BDy1zYAr.js} +4 -4
  131. package/dist/plugin-sdk/{chrome-CT_6RvJg.js → chrome-VZ0Zuu2w.js} +4 -4
  132. package/dist/plugin-sdk/{chunk-DI-5pBck.js → chunk-BTSnO1wn.js} +6 -6
  133. package/dist/plugin-sdk/{chunk-D6yDhUpF.js → chunk-BWz-lIzS.js} +4 -4
  134. package/dist/plugin-sdk/{chunk-CDvvv9SU.js → chunk-DGQdf0JN.js} +3 -3
  135. package/dist/plugin-sdk/{command-detection-B3xgM_Na.js → command-detection-DdTnFMU3.js} +106 -85
  136. package/dist/plugin-sdk/{command-queue-BnJsJc_w.js → command-queue-CeaLVs8O.js} +8 -8
  137. package/dist/plugin-sdk/{command-queue-CHiQj9Ji.js → command-queue-DFSOdqCK.js} +1 -1
  138. package/dist/plugin-sdk/{command-queue-DH8k55DC.js → command-queue-D_UFlrwC.js} +2 -2
  139. package/dist/plugin-sdk/{commands-registry-Do_g2It_.js → commands-registry-8sy0wsK_.js} +6 -6
  140. package/dist/plugin-sdk/{commands-registry-DpLk11E7.js → commands-registry-N6f_lsxF.js} +2 -2
  141. package/dist/plugin-sdk/{commands-registry-DuwlD_aI.js → commands-registry-XW2hmbAE.js} +3 -3
  142. package/dist/plugin-sdk/{config-CQNfmIC8.js → config-Biusjzx-.js} +7 -7
  143. package/dist/plugin-sdk/{deliver-_UyigkEK.js → deliver-B7W4NNsR.js} +11 -11
  144. package/dist/plugin-sdk/{deliver-L6eu6zyG.js → deliver-BgHA8c9F.js} +11 -11
  145. package/dist/plugin-sdk/deliver-CJP9TznW.js +32 -0
  146. package/dist/plugin-sdk/deliver-DBCz1GqU.js +32 -0
  147. package/dist/plugin-sdk/{diagnostic-Dk57KVjE.js → diagnostic-BRUM6uNI.js} +7 -7
  148. package/dist/plugin-sdk/{diagnostic-DfxuMWHd.js → diagnostic-Bni_8VyY.js} +7 -7
  149. package/dist/plugin-sdk/{diagnostic-C7lPoqyv.js → diagnostic-D6hSjxiv.js} +5 -5
  150. package/dist/plugin-sdk/{diagnostic-session-state-BjuWxrAM.js → diagnostic-session-state-BsHrQ7U3.js} +1 -1
  151. package/dist/plugin-sdk/{fetch-D1jXg-ju.js → fetch-C1vgNaXJ.js} +1 -1
  152. package/dist/plugin-sdk/{fetch-guard-DnwfMurj.js → fetch-guard-B2Wnl9Vi.js} +4 -4
  153. package/dist/plugin-sdk/{fetch-guard-CZT8FU1i.js → fetch-guard-C1a1KfEb.js} +3 -3
  154. package/dist/plugin-sdk/{fetch-DFZXuu3W.js → fetch-hEreHolP.js} +7 -7
  155. package/dist/plugin-sdk/{fetch-timeout-D7XVWfxj.js → fetch-timeout-A1m6BOhm.js} +1 -1
  156. package/dist/plugin-sdk/{fs-safe-B0JgGdXa.js → fs-safe-CbZ6uRVv.js} +3 -3
  157. package/dist/plugin-sdk/{fs-safe-BQ5cHy9G.js → fs-safe-ClebEeLz.js} +3 -3
  158. package/dist/plugin-sdk/{hook-runner-global-WRI53ibi.js → hook-runner-global-BvxlnAyu.js} +3 -3
  159. package/dist/plugin-sdk/{image-ops-0TjWNKUx.js → image-ops-Bm03YsK2.js} +1 -1
  160. package/dist/plugin-sdk/{image-ops-kuILYHZv.js → image-ops-DY_SZfXk.js} +1 -1
  161. package/dist/plugin-sdk/{inbound-context-Bfr5DkdO.js → inbound-context-Cmgtf5my.js} +1 -1
  162. package/dist/plugin-sdk/index.js +54 -54
  163. package/dist/plugin-sdk/{ir-CbL0sVL2.js → ir-1CthVxHv.js} +5 -5
  164. package/dist/plugin-sdk/{ir-Bm7oqkwT.js → ir-BNohi6ZW.js} +5 -5
  165. package/dist/plugin-sdk/{local-roots-D-CHzVr1.js → local-roots-Bm7nDW20.js} +7 -7
  166. package/dist/plugin-sdk/{logger-D5s3kiib.js → logger-BkzoyfHW.js} +1 -1
  167. package/dist/plugin-sdk/{logger-BSK-0Yjx.js → logger-D6KsqbNW.js} +1 -1
  168. package/dist/plugin-sdk/{manager-D2jffdjH.js → manager-B_vK9MbM.js} +8 -8
  169. package/dist/plugin-sdk/manager-ByaW_O4Y.js +16 -0
  170. package/dist/plugin-sdk/{manager-CHBt3PC-.js → manager-C4CJpRd9.js} +8 -8
  171. package/dist/plugin-sdk/manager-CPcI0Fhz.js +16 -0
  172. package/dist/plugin-sdk/{markdown-tables-CBGsimjo.js → markdown-tables-DZM4NfLU.js} +3 -3
  173. package/dist/plugin-sdk/{markdown-tables-DIWQQ2W1.js → markdown-tables-G4vK24xc.js} +2 -2
  174. package/dist/plugin-sdk/markdown-tables-J4hZ7eWU.js +10 -0
  175. package/dist/plugin-sdk/{outbound-attachment-CtKKNyms.js → outbound-attachment-Cw7T2Mrt.js} +2 -2
  176. package/dist/plugin-sdk/{outbound-attachment-C5x2htXW.js → outbound-attachment-GMgXpDQm.js} +2 -2
  177. package/dist/plugin-sdk/{outbound-message-hooks-2YmJP9k-.js → outbound-message-hooks-BUHUdpjM.js} +3 -3
  178. package/dist/plugin-sdk/{path-alias-guards-CHfCMaeX.js → path-alias-guards-CVybi_GQ.js} +1 -1
  179. package/dist/plugin-sdk/{path-alias-guards-BIPHhakQ.js → path-alias-guards-Dft7g-_v.js} +1 -1
  180. package/dist/plugin-sdk/{pi-embedded-helpers-CELD3Ns3.js → pi-embedded-helpers-B-OOYT64.js} +11 -11
  181. package/dist/plugin-sdk/{pi-embedded-helpers-BRymkO_1.js → pi-embedded-helpers-B_jgacW8.js} +11 -11
  182. package/dist/plugin-sdk/{pi-embedded-utils-AFQ-oCFM.js → pi-embedded-utils-BoSGTbYO.js} +3 -3
  183. package/dist/plugin-sdk/{pi-embedded-utils-BHmc3RVS.js → pi-embedded-utils-DOXEm_H8.js} +3 -3
  184. package/dist/plugin-sdk/{pi-model-discovery-C37z3zkx.js → pi-model-discovery-DF6l-F8s.js} +2 -2
  185. package/dist/plugin-sdk/{pi-model-discovery-6BBajZds.js → pi-model-discovery-DWUrLRLg.js} +1 -1
  186. package/dist/plugin-sdk/{pi-model-discovery-4X7_2_nP.js → pi-model-discovery-DWw1ReX-.js} +6 -6
  187. package/dist/plugin-sdk/provider-dispatcher-Byy-KtUn.js +61 -0
  188. package/dist/plugin-sdk/provider-dispatcher-CAfyX0H-.js +61 -0
  189. package/dist/plugin-sdk/provider-image-B_dJDOl5.js +22 -0
  190. package/dist/plugin-sdk/{provider-image-DBye3Ln5.js → provider-image-CEQrHWYz.js} +5 -5
  191. package/dist/plugin-sdk/provider-image-L_SRDPHU.js +22 -0
  192. package/dist/plugin-sdk/{provider-image-CbZOYl0b.js → provider-image-zNa1Cccq.js} +5 -5
  193. package/dist/plugin-sdk/{proxy-DJ2nskkh.js → proxy-BWc9guJs.js} +1 -1
  194. package/dist/plugin-sdk/{proxy-CjNR_U3u.js → proxy-CXI1ycJj.js} +2 -2
  195. package/dist/plugin-sdk/proxy-DwbYzxBy.js +7 -0
  196. package/dist/plugin-sdk/{proxy-env-ubutfW07.js → proxy-env-B3rQCyUO.js} +2 -2
  197. package/dist/plugin-sdk/{proxy-fetch-CuQpjpkI.js → proxy-fetch-BYkGxQnh.js} +1 -1
  198. package/dist/plugin-sdk/{proxy-fetch-Cv4b428x.js → proxy-fetch-CNBkczcW.js} +1 -1
  199. package/dist/plugin-sdk/{pw-ai-BJrhPMHJ.js → pw-ai-DQv6Xhce.js} +10 -10
  200. package/dist/plugin-sdk/{pw-ai-hVucoF_I.js → pw-ai-JJrE-B1e.js} +10 -10
  201. package/dist/plugin-sdk/{qmd-manager-Bv5B9pi9.js → qmd-manager-CkQhKIXI.js} +8 -8
  202. package/dist/plugin-sdk/{qmd-manager-DhW_frb3.js → qmd-manager-CpV0SFnY.js} +8 -8
  203. package/dist/plugin-sdk/{query-expansion-NpBeKA8F.js → query-expansion-CwmHvvV_.js} +3 -3
  204. package/dist/plugin-sdk/{query-expansion-CWwH9pqd.js → query-expansion-DjZsVofz.js} +3 -3
  205. package/dist/plugin-sdk/{recorder-C3qdhG-p.js → recorder-BU_faNrp.js} +4 -4
  206. package/dist/plugin-sdk/{recorder-DdbAQ2HO.js → recorder-BXZMRSjO.js} +4 -4
  207. package/dist/plugin-sdk/{redact-CUjmZn2Y.js → redact-C88Ryyfs.js} +1 -1
  208. package/dist/plugin-sdk/{redact-BEcZiZI1.js → redact-CdcLrd0n.js} +1 -1
  209. package/dist/plugin-sdk/{registry-BXmLBUZj.js → registry-tm0HFWKN.js} +7 -7
  210. package/dist/plugin-sdk/replies-B9uDLFOE.js +25 -0
  211. package/dist/plugin-sdk/replies-BFjGWAPs.js +25 -0
  212. package/dist/plugin-sdk/{replies-CjeAGcJx.js → replies-CS2GXrd-.js} +4 -4
  213. package/dist/plugin-sdk/{replies-Dw3jvqpR.js → replies-l2hZAzbt.js} +4 -4
  214. package/dist/plugin-sdk/{reply-directives-BS8Ge06Z.js → reply-directives-BwxzQXmX.js} +2 -2
  215. package/dist/plugin-sdk/{reply-directives-OuX5Mba_.js → reply-directives-hfOVgXpA.js} +2 -2
  216. package/dist/plugin-sdk/{reply-prefix-C83iSHUo.js → reply-prefix-BKQgC6Vj.js} +2 -2
  217. package/dist/plugin-sdk/reply-prefix-BQMEQam1.js +7 -0
  218. package/dist/plugin-sdk/{reply-prefix-Dt1hESHJ.js → reply-prefix-qLQRxqrf.js} +1 -1
  219. package/dist/plugin-sdk/{resolve-route-BpLuk-wC.js → resolve-route-50KoArP9.js} +4 -4
  220. package/dist/plugin-sdk/{resolve-route-DiQTL1qI.js → resolve-route-6v1HVvWk.js} +6 -6
  221. package/dist/plugin-sdk/{resolve-route-BLBv69wV.js → resolve-route-tqQv32nr.js} +5 -5
  222. package/dist/plugin-sdk/runs-BQhYekhr.js +25 -0
  223. package/dist/plugin-sdk/runs-CPA1-H-2.js +25 -0
  224. package/dist/plugin-sdk/{runs-D6fAvItC.js → runs-CiohhBb8.js} +7 -7
  225. package/dist/plugin-sdk/{runs-CPWQbljV.js → runs-H2FY7UEk.js} +8 -8
  226. package/dist/plugin-sdk/{send-CpXGZgrS.js → send-BMSqETcU.js} +6 -6
  227. package/dist/plugin-sdk/{send-BwoWjRrJ.js → send-BMhuEEtY.js} +9 -9
  228. package/dist/plugin-sdk/{send-BUAw8fe4.js → send-BjR1QHnz.js} +7 -7
  229. package/dist/plugin-sdk/{send-B2Kip2qd.js → send-CEtGyK32.js} +8 -8
  230. package/dist/plugin-sdk/{send-DE9YP1gQ.js → send-CF3PEjRy.js} +14 -14
  231. package/dist/plugin-sdk/send-CRtSAH8I.js +25 -0
  232. package/dist/plugin-sdk/send-CeWqZTK0.js +23 -0
  233. package/dist/plugin-sdk/{send-BDwTyH6I.js → send-Cv2CGnsK.js} +8 -8
  234. package/dist/plugin-sdk/{send-Ce2XBaKF.js → send-Cx6gHjnA.js} +6 -6
  235. package/dist/plugin-sdk/send-CzcKgBBf.js +25 -0
  236. package/dist/plugin-sdk/send-CzxwgKvR.js +27 -0
  237. package/dist/plugin-sdk/{send-R0HB1-l-.js → send-DG4MQPPm.js} +13 -13
  238. package/dist/plugin-sdk/{send-CE_6VOiQ.js → send-DM6RpDCL.js} +7 -7
  239. package/dist/plugin-sdk/{send-GMYUhBtJ.js → send-DO0C4Uva.js} +19 -19
  240. package/dist/plugin-sdk/{send-D_2cxLLi.js → send-DUJMd2d7.js} +20 -20
  241. package/dist/plugin-sdk/{send-CfSEKKlU.js → send-DdPdUcD0.js} +6 -6
  242. package/dist/plugin-sdk/send-DuCB2xbl.js +23 -0
  243. package/dist/plugin-sdk/send-Dvna5ey-.js +27 -0
  244. package/dist/plugin-sdk/send-DyYaWr3E.js +24 -0
  245. package/dist/plugin-sdk/send-xPV0QIjh.js +24 -0
  246. package/dist/plugin-sdk/{session-meta-BU2WXD0N.js → session-meta-CiqJP0pO.js} +2 -2
  247. package/dist/plugin-sdk/session-meta-n4SCcAbJ.js +10 -0
  248. package/dist/plugin-sdk/{session-meta-D3W538Wj.js → session-meta-oR-S9C5J.js} +3 -3
  249. package/dist/plugin-sdk/skill-commands-BOV3NIbU.js +14 -0
  250. package/dist/plugin-sdk/{skill-commands-ByVQek_m.js → skill-commands-Bh43SlDc.js} +6 -6
  251. package/dist/plugin-sdk/{skill-commands-BYfWIPfV.js → skill-commands-CE_SkRQk.js} +5 -5
  252. package/dist/plugin-sdk/{skills-BGgry_YW.js → skills-CatBv8W4.js} +6 -6
  253. package/dist/plugin-sdk/{skills-BuJjEYto.js → skills-CjW6uGTa.js} +6 -6
  254. package/dist/plugin-sdk/src/config/sessions/run-pending-writes.d.ts +22 -0
  255. package/dist/plugin-sdk/{ssrf-DiAz1Z_z.js → ssrf-BUCEDxp5.js} +2 -2
  256. package/dist/plugin-sdk/{store-C6ZLKWUS.js → store-6JKvp2Zu.js} +2 -2
  257. package/dist/plugin-sdk/{store-Bl3Yjf_w.js → store-yBNTHg3N.js} +2 -2
  258. package/dist/plugin-sdk/subagent-registry-CZBK6615.js +61 -0
  259. package/dist/plugin-sdk/subagent-registry-DwnBzoKn.js +61 -0
  260. package/dist/plugin-sdk/{subsystem-B2x33s9h.js → subsystem-CUUKL6Fr.js} +4 -4
  261. package/dist/plugin-sdk/{subsystem-0F3fEqJW.js → subsystem-CchgWuXK.js} +4 -4
  262. package/dist/plugin-sdk/{tables-BCSRuiq_.js → tables-BPCP4CpE.js} +1 -1
  263. package/dist/plugin-sdk/{tables-CTmQQyfU.js → tables-DKYi6grj.js} +1 -1
  264. package/dist/plugin-sdk/testing.js +55 -55
  265. package/dist/plugin-sdk/{tokens-O0pGqOuf.js → tokens-Cioh8xR5.js} +1 -1
  266. package/dist/plugin-sdk/{tokens-DxJSOoJn.js → tokens-ysZUkYZZ.js} +1 -1
  267. package/dist/plugin-sdk/{tool-loop-detection-BG8uP1aD.js → tool-loop-detection-BN0lIxLx.js} +1 -1
  268. package/dist/plugin-sdk/{tool-loop-detection-Buouaxew.js → tool-loop-detection-LsvZ1dIY.js} +1 -1
  269. package/dist/plugin-sdk/{tools-CmHC6oYK.js → tools-4rcPGSNh.js} +114 -93
  270. package/dist/plugin-sdk/{user-run-recording-juCW_uQ-.js → user-run-recording-BMaK7jNR.js} +2 -2
  271. package/dist/plugin-sdk/user-run-recording-DiKcNdjn.js +11 -0
  272. package/dist/plugin-sdk/{user-run-recording-iS-qLIN9.js → user-run-recording-DlpzQk0X.js} +3 -3
  273. package/dist/{plugins-cli-DRuMDJWf.js → plugins-cli-Cpq4XXoA.js} +22 -22
  274. package/dist/{plugins-cli-DnMc_Sn3.js → plugins-cli-yjyVyPjc.js} +22 -22
  275. package/dist/{program-Gb3aULCK.js → program-CB5O-AyY.js} +23 -23
  276. package/dist/{program-context-CJuzphrY.js → program-context-DxwZAeg4.js} +24 -24
  277. package/dist/{prompt-select-styled-Db6swA6j.js → prompt-select-styled-1UYyuvWX.js} +12 -12
  278. package/dist/{prompt-select-styled-C-FwsHQX.js → prompt-select-styled-CfTLn2TL.js} +12 -12
  279. package/dist/{provider-image-RxbXQIow.js → provider-image-CZlpEJVI.js} +1 -1
  280. package/dist/{provider-image-XyDuLsir.js → provider-image-UXLX6qTH.js} +1 -1
  281. package/dist/{push-apns-BGOaVxug.js → push-apns-DYlVj3Sd.js} +2 -2
  282. package/dist/{push-apns-Mp5OOpUH.js → push-apns-uBiZYT2e.js} +2 -2
  283. package/dist/{pw-ai-DmE1ofBV.js → pw-ai-2o8dgziH.js} +1 -1
  284. package/dist/{pw-ai-QjFlAu_X.js → pw-ai-CZJk6UyG.js} +1 -1
  285. package/dist/{reconcile-bundled-jiPnEB1a.js → reconcile-bundled-Dx64x8xr.js} +1 -1
  286. package/dist/{reconcile-bundled-BMWDZl32.js → reconcile-bundled-oQwTCU_A.js} +1 -1
  287. package/dist/{recovery-adapter-BMqm3Nm4.js → recovery-adapter-BT7EyQzh.js} +8 -8
  288. package/dist/{recovery-adapter-NtvPZ47M.js → recovery-adapter-BcPtMfaC.js} +1 -1
  289. package/dist/{recovery-adapter-DvFGPqmC.js → recovery-adapter-BvRiQZIb.js} +8 -8
  290. package/dist/{recovery-adapter-B_wvSNpI.js → recovery-adapter-CTqGLqLj.js} +1 -1
  291. package/dist/{register.agent-B5_L0CjL.js → register.agent-DpYKNZhv.js} +22 -22
  292. package/dist/{register.agent-kUHQvJ5-.js → register.agent-DxsC-Szl.js} +23 -23
  293. package/dist/{register.configure-BbDac1C1.js → register.configure-DUg0MNnJ.js} +26 -26
  294. package/dist/{register.configure-CgSKgJn_.js → register.configure-PJZ3F6Y4.js} +26 -26
  295. package/dist/{register.maintenance-YmHWu7iX.js → register.maintenance-9XyX4HYf.js} +29 -29
  296. package/dist/{register.maintenance-Co2DeyQ1.js → register.maintenance-BBM-rluy.js} +28 -28
  297. package/dist/{register.message-8tfreZAx.js → register.message-B3NWvxgd.js} +18 -18
  298. package/dist/{register.message-BWeca9Pc.js → register.message-D-e6_UXf.js} +18 -18
  299. package/dist/{register.onboard-Cs4xO4E5.js → register.onboard-CEzQdSxa.js} +2 -2
  300. package/dist/{register.onboard-4mSx6LtC.js → register.onboard-id-BqwSw.js} +2 -2
  301. package/dist/{register.setup-BkZyVbO-.js → register.setup-BKBe-Sjp.js} +2 -2
  302. package/dist/{register.setup-DCRrXbdT.js → register.setup-BiOdr528.js} +2 -2
  303. package/dist/{register.status-health-sessions-CgAKAaPq.js → register.status-health-sessions-BVIHCaPP.js} +24 -24
  304. package/dist/{register.status-health-sessions-DK12_BeX.js → register.status-health-sessions-CeRiMlKm.js} +24 -24
  305. package/dist/{register.subclis-CKq7CiVv.js → register.subclis-IXr-WEhq.js} +16 -16
  306. package/dist/{reply-BIZ2zaUq.js → reply-BzUdF5qW.js} +69 -24
  307. package/dist/{run-main-Bjfr1wYn.js → run-main-CsSM1uCJ.js} +30 -30
  308. package/dist/{runs-Yajg-SST.js → runs-DVNBpgv0.js} +3 -3
  309. package/dist/{runs-CUs5xDZ_.js → runs-i5IuTzQX.js} +3 -3
  310. package/dist/{sandbox-DfzTmaAX.js → sandbox-QsMPF2u6.js} +1 -1
  311. package/dist/{sandbox-Ft7cM-PQ.js → sandbox-bbN1dfIo.js} +1 -1
  312. package/dist/{sandbox-cli-DvMqiG0-.js → sandbox-cli-CuG1HCrw.js} +2 -2
  313. package/dist/{sandbox-cli-DyRvKmR5.js → sandbox-cli-nx3ctiYX.js} +2 -2
  314. package/dist/{security-cli-p_5UwabW.js → security-cli-BfZEQFxV.js} +4 -4
  315. package/dist/{security-cli-Brok3WFE.js → security-cli-BmfAwh-0.js} +4 -4
  316. package/dist/{send-DzSRMjOr.js → send-BKkvuHI9.js} +1 -1
  317. package/dist/{send-Cy2xiH02.js → send-CvkM5xAx.js} +1 -1
  318. package/dist/{server-l9oy68N_.js → server-BMSgu_SV.js} +4 -4
  319. package/dist/{server-CywvGQHz.js → server-DRVR_pkr.js} +4 -4
  320. package/dist/{server-context-Dezs5R_M.js → server-context-Bbi-nqKD.js} +2 -2
  321. package/dist/{server-context-97Vej0yV.js → server-context-CTilcbO4.js} +2 -2
  322. package/dist/{server-lifecycle-CHhQugi7.js → server-lifecycle-BIOS9ErD.js} +1 -1
  323. package/dist/{server-lifecycle-DcVZS1ln.js → server-lifecycle-DrAGY_SC.js} +1 -1
  324. package/dist/{server-node-events-BG6KvV6u.js → server-node-events-B3c2ctcO.js} +18 -18
  325. package/dist/{server-node-events-BaFY8QcO.js → server-node-events-lwnuZDvV.js} +18 -18
  326. package/dist/{service-Hy5BSgmp.js → service-C_LTJsJU.js} +1 -1
  327. package/dist/{service-RnhuB5cG.js → service-Dkcqg-rd.js} +1 -1
  328. package/dist/{sessions-BQYQBpX0.js → sessions-Cy_VVMEN.js} +4 -4
  329. package/dist/{sessions-CuDbhYmU.js → sessions-DCXadUdD.js} +4 -4
  330. package/dist/{shared-Bc-7t0_-.js → shared-6Uo_6p6X.js} +1 -1
  331. package/dist/{shared-CJd0QML9.js → shared-Cj18nzyW.js} +1 -1
  332. package/dist/{status-BYesh62t.js → status-Czr0TmiN.js} +7 -7
  333. package/dist/{status-DlD1uBWJ.js → status-DJsk1JjI.js} +7 -7
  334. package/dist/{systemd-B5tdOLBg.js → systemd-BJqlwupF.js} +1 -1
  335. package/dist/{systemd-DsBMxUv1.js → systemd-D6tSdsgx.js} +1 -1
  336. package/dist/{systemd-hints-DH86kn6U.js → systemd-hints-Cp0IfOPD.js} +45 -4
  337. package/dist/{systemd-hints-WHzM5Tf8.js → systemd-hints-DzBfweRH.js} +45 -4
  338. package/dist/{systemd-linger-BPzLwumk.js → systemd-linger-Dk1GWduD.js} +1 -1
  339. package/dist/{systemd-linger-EvpJ4ZxF.js → systemd-linger-NvIOU-Ez.js} +1 -1
  340. package/dist/{task-pipeline-boot-D9T_Earg.js → task-pipeline-boot-CcSZVGUe.js} +17 -17
  341. package/dist/{task-pipeline-boot-CaVeITev.js → task-pipeline-boot-UcskPjY2.js} +17 -17
  342. package/dist/{tui-naozJ5Qh.js → tui-WSQKUD4o.js} +1 -1
  343. package/dist/{tui-cli-hVvCHoLU.js → tui-cli-C3Sopj4_.js} +4 -4
  344. package/dist/{tui-cli-Dn_Is1pu.js → tui-cli-CpRsjtOO.js} +4 -4
  345. package/dist/{tui-Bo4LZvgz.js → tui-dccCFhet.js} +1 -1
  346. package/dist/{update-CXf5cJ0D.js → update-D86-cS_v.js} +1 -1
  347. package/dist/{update-CAXQiGSa.js → update-DJaR3w6x.js} +1 -1
  348. package/dist/{update-cli-BB7ybH-w.js → update-cli-B4_xRNut.js} +33 -33
  349. package/dist/{update-cli-BYDYDEO5.js → update-cli-DDmfG1gm.js} +34 -34
  350. package/dist/{update-runner-BYv_ec3N.js → update-runner-DqE_9Axt.js} +1 -1
  351. package/dist/{update-runner-JoI-EXBr.js → update-runner-DwM4xj8C.js} +1 -1
  352. package/dist/{validation-cli-ZFUB2tzh.js → validation-cli-C8XHeLjI.js} +18 -18
  353. package/dist/{validation-cli-CGimO4ZJ.js → validation-cli-jSmCMkkm.js} +18 -18
  354. package/dist/{with-timeout-Cl_OttOS.js → with-timeout-BvxLQUTs.js} +2 -2
  355. package/dist/{with-timeout-NhJMC1fC.js → with-timeout-CII3PkDO.js} +2 -2
  356. package/extensions/acpx/package.json +1 -1
  357. package/extensions/anthropic/package.json +1 -1
  358. package/extensions/bifrost/package.json +1 -1
  359. package/extensions/bluebubbles/package.json +1 -1
  360. package/extensions/copilot-proxy/package.json +1 -1
  361. package/extensions/deepgram/package.json +1 -1
  362. package/extensions/deepinfra/package.json +1 -1
  363. package/extensions/diagnostics-otel/package.json +1 -1
  364. package/extensions/diffs/package.json +1 -1
  365. package/extensions/discord/package.json +1 -1
  366. package/extensions/dream-cycle/package.json +1 -1
  367. package/extensions/elevenlabs/package.json +1 -1
  368. package/extensions/feishu/package.json +1 -1
  369. package/extensions/gemini-search/package.json +1 -1
  370. package/extensions/google/package.json +1 -1
  371. package/extensions/google-gemini-cli-auth/package.json +1 -1
  372. package/extensions/googlechat/package.json +1 -1
  373. package/extensions/grok-search/package.json +1 -1
  374. package/extensions/groq/package.json +1 -1
  375. package/extensions/imessage/package.json +1 -1
  376. package/extensions/irc/package.json +1 -1
  377. package/extensions/kimi-search/package.json +1 -1
  378. package/extensions/learning-core/package.json +1 -1
  379. package/extensions/learning-core/src/bounded-store-reads.conformance.test.ts +23 -411
  380. package/extensions/learning-core/src/bounded-store-reads.pg.integration.test.ts +52 -0
  381. package/extensions/learning-core/src/bounded-store-reads.test-helpers.ts +387 -0
  382. package/extensions/learning-core/src/lesson-store-conformance.pg.integration.test.ts +77 -0
  383. package/extensions/learning-core/src/lesson-store-conformance.test-helpers.ts +1406 -0
  384. package/extensions/learning-core/src/lesson-store-conformance.test.ts +27 -1509
  385. package/extensions/learning-core/src/lesson-store-postgres.test.ts +9 -7
  386. package/extensions/line/package.json +1 -1
  387. package/extensions/llm-task/package.json +1 -1
  388. package/extensions/lobster/package.json +1 -1
  389. package/extensions/matrix/CHANGELOG.md +1 -1
  390. package/extensions/matrix/package.json +1 -1
  391. package/extensions/mattermost/package.json +1 -1
  392. package/extensions/memory-core/package.json +1 -1
  393. package/extensions/memory-lancedb/package.json +1 -1
  394. package/extensions/minimax/package.json +1 -1
  395. package/extensions/minimax-portal-auth/package.json +1 -1
  396. package/extensions/mistral/package.json +1 -1
  397. package/extensions/moonshot/package.json +1 -1
  398. package/extensions/msteams/CHANGELOG.md +1 -1
  399. package/extensions/msteams/package.json +1 -1
  400. package/extensions/nextcloud-talk/package.json +1 -1
  401. package/extensions/nostr/CHANGELOG.md +1 -1
  402. package/extensions/nostr/package.json +1 -1
  403. package/extensions/open-prose/package.json +1 -1
  404. package/extensions/openai/package.json +1 -1
  405. package/extensions/openai-realtime/package.json +1 -1
  406. package/extensions/openrouter/package.json +1 -1
  407. package/extensions/perplexity-search/package.json +1 -1
  408. package/extensions/searxng-search/package.json +1 -1
  409. package/extensions/signal/package.json +1 -1
  410. package/extensions/slack/package.json +1 -1
  411. package/extensions/synology-chat/package.json +1 -1
  412. package/extensions/telegram/package.json +1 -1
  413. package/extensions/tlon/package.json +1 -1
  414. package/extensions/twitch/CHANGELOG.md +1 -1
  415. package/extensions/twitch/package.json +1 -1
  416. package/extensions/voice-call/CHANGELOG.md +1 -1
  417. package/extensions/voice-call/package.json +1 -1
  418. package/extensions/whatsapp/package.json +1 -1
  419. package/extensions/zai/package.json +1 -1
  420. package/extensions/zalo/CHANGELOG.md +1 -1
  421. package/extensions/zalo/package.json +1 -1
  422. package/extensions/zalouser/CHANGELOG.md +1 -1
  423. package/extensions/zalouser/package.json +1 -1
  424. package/package.json +1 -1
  425. package/dist/plugin-sdk/agent-turn-execute-C4MQxaT2.js +0 -61
  426. package/dist/plugin-sdk/agent-turn-execute-Cjl_kBtQ.js +0 -61
  427. package/dist/plugin-sdk/agent-turn-runner-e_lJzDgA.js +0 -11
  428. package/dist/plugin-sdk/audio-preflight-DE04bi4M.js +0 -28
  429. package/dist/plugin-sdk/deliver-D4fWK65M.js +0 -32
  430. package/dist/plugin-sdk/deliver-DuDcszu1.js +0 -32
  431. package/dist/plugin-sdk/manager-BlYRVNJI.js +0 -16
  432. package/dist/plugin-sdk/manager-Bqpqu2GS.js +0 -16
  433. package/dist/plugin-sdk/markdown-tables-cZSKCBuW.js +0 -10
  434. package/dist/plugin-sdk/provider-dispatcher-D7HHFW68.js +0 -61
  435. package/dist/plugin-sdk/provider-dispatcher-D7bchiJq.js +0 -61
  436. package/dist/plugin-sdk/provider-image-Bumd1GBG.js +0 -22
  437. package/dist/plugin-sdk/provider-image-CNlYbRab.js +0 -22
  438. package/dist/plugin-sdk/proxy-D2uiu68M.js +0 -7
  439. package/dist/plugin-sdk/replies-0gHRQjbA.js +0 -25
  440. package/dist/plugin-sdk/replies-XUkqz_7S.js +0 -25
  441. package/dist/plugin-sdk/reply-prefix-MU3uY52y.js +0 -7
  442. package/dist/plugin-sdk/runs-B3DB63tB.js +0 -25
  443. package/dist/plugin-sdk/runs-R28wdt7j.js +0 -25
  444. package/dist/plugin-sdk/send-C28pxKhC.js +0 -27
  445. package/dist/plugin-sdk/send-COofA0BG.js +0 -23
  446. package/dist/plugin-sdk/send-Cg2VXcO0.js +0 -27
  447. package/dist/plugin-sdk/send-DAs6FmWB.js +0 -23
  448. package/dist/plugin-sdk/send-NUHfC-G_.js +0 -25
  449. package/dist/plugin-sdk/send-Tm5-7bLz.js +0 -24
  450. package/dist/plugin-sdk/send-UIQH_kN6.js +0 -25
  451. package/dist/plugin-sdk/send-tASIQF-Q.js +0 -24
  452. package/dist/plugin-sdk/session-meta-Dd1ZONel.js +0 -10
  453. package/dist/plugin-sdk/skill-commands-C7ZE3rKj.js +0 -14
  454. package/dist/plugin-sdk/subagent-registry-2P8D5Trx.js +0 -61
  455. package/dist/plugin-sdk/subagent-registry-DxZN7H_j.js +0 -61
  456. package/dist/plugin-sdk/user-run-recording-BMikDBXR.js +0 -11
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "description": "OpenClaw Discord channel plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/dream-cycle",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "WednesdayAI dream-cycle engine — idle-time sleep stages, contemplation, adaptation, crystallisation",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/elevenlabs",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "ElevenLabs media understanding: scribe_v2 audio transcription.",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/gemini-search",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "WednesdayAI Google Gemini web search provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/google",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "Google Gemini media understanding: audio transcription, image and video description.",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-gemini-cli-auth",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "OpenClaw Gemini CLI OAuth provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/googlechat",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "OpenClaw Google Chat channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/grok-search",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "WednesdayAI xAI Grok web search provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/groq",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "Groq media understanding: whisper-large-v3-turbo audio transcription.",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/imessage",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "OpenClaw iMessage channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "description": "OpenClaw IRC channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wednesdayai/kimi-search",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "WednesdayAI Kimi by Moonshot web search provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/learning-core",
3
- "version": "0.4.12-dev.715+3d87ba832",
3
+ "version": "0.4.12-dev.717+16de7e104",
4
4
  "private": true,
5
5
  "description": "OpenClaw lesson-first learning plugin",
6
6
  "type": "module",
@@ -1,5 +1,4 @@
1
1
  import { execFile } from "node:child_process";
2
- import crypto from "node:crypto";
3
2
  import fs from "node:fs/promises";
4
3
  import os from "node:os";
5
4
  import path from "node:path";
@@ -8,456 +7,69 @@ import { promisify } from "node:util";
8
7
  import v8 from "node:v8";
9
8
  import vm from "node:vm";
10
9
  import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
11
- import { readRankingPool, RANKING_SCAN_MAX_ROWS } from "./consolidation-judge.js";
12
- import { withCandidateDefaults } from "./extraction-candidate.js";
13
- import { createLearningOverview } from "./gateway-methods.js";
14
- import { withLessonDefaults } from "./lesson-record.js";
15
10
  import {
16
- createDefaultLearningPgPool,
17
- PostgresLessonStore,
18
- type PgClientLike,
19
- type PgPoolLike,
20
- } from "./lesson-store-postgres.js";
11
+ candidate,
12
+ lesson,
13
+ meteredPool,
14
+ meteredSqlite,
15
+ metering,
16
+ NOW,
17
+ PAST,
18
+ proposal,
19
+ registerBoundedSqlLegSuite,
20
+ TEST_SCHEMA,
21
+ type SqlLeg,
22
+ } from "./bounded-store-reads.test-helpers.js";
23
+ import { createLearningOverview } from "./gateway-methods.js";
24
+ import { PostgresLessonStore, type PgPoolLike } from "./lesson-store-postgres.js";
21
25
  import { createInMemoryPgPool } from "./lesson-store-postgres.test-helpers.js";
22
26
  import { type SqliteDatabaseLike, SqliteLessonStore } from "./lesson-store-sqlite.js";
23
27
  import type { LogScanStats } from "./log-scan.js";
24
28
  import { FileLearningStore, FS_OVERVIEW_MAX_BYTES } from "./store.js";
25
- import {
26
- LESSON_EXCERPT_MAX_BYTES,
27
- LESSON_PAGE_MAX_BYTES,
28
- type ExtractionCandidate,
29
- type LearningLesson,
30
- type LessonStore,
31
- type SkillProposal,
32
- } from "./types.js";
33
-
34
- // Spec "Bounded store reads, scans, and success evidence": verification asserts rows AND bytes
35
- // read, not just result length. Every SQL leg runs through a meter that counts the rows the
36
- // database handed back and the payload bytes among them, so a materialize-then-filter read (the
37
- // pre-change readPayloads path) fails here even when its result is correct.
38
-
39
- type Meter = { rows: number; payloadBytes: number; excerptBytes: number };
40
-
41
- function newMeter(): Meter {
42
- return { rows: 0, payloadBytes: 0, excerptBytes: 0 };
43
- }
44
-
45
- // One wrapped handle per test (the stores memoise schema init on the handle), metering into
46
- // whichever meter the last make() installed.
47
- let activeMeter: Meter = newMeter();
48
-
49
- function countRows(rows: unknown[]): void {
50
- const meter = activeMeter;
51
- for (const row of rows) {
52
- meter.rows += 1;
53
- for (const [column, value] of Object.entries(row as Record<string, unknown>)) {
54
- if (column === "payload_json") {
55
- meter.payloadBytes += Buffer.byteLength(
56
- typeof value === "string" ? value : JSON.stringify(value),
57
- );
58
- } else if (column === "excerpt" && value instanceof Uint8Array) {
59
- meter.excerptBytes += value.length;
60
- }
61
- }
62
- }
63
- }
64
-
65
- function meteredSqlite(db: DatabaseSync): SqliteDatabaseLike {
66
- return {
67
- exec: (sql) => db.exec(sql),
68
- prepare(sql) {
69
- const statement = db.prepare(sql);
70
- return {
71
- run: (...params) => statement.run(...(params as never[])),
72
- get: (...params) => {
73
- const row = statement.get(...(params as never[]));
74
- countRows(row === undefined ? [] : [row]);
75
- return row;
76
- },
77
- all: (...params) => {
78
- const rows = statement.all(...(params as never[]));
79
- countRows(rows);
80
- return rows;
81
- },
82
- };
83
- },
84
- };
85
- }
86
-
87
- function meteredPool(pool: PgPoolLike): PgPoolLike {
88
- const wrap = async (result: Promise<{ rows: Record<string, unknown>[] }>) => {
89
- const settled = await result;
90
- countRows(settled.rows);
91
- return settled;
92
- };
93
- return {
94
- query: (sql, values) => wrap(pool.query(sql, values)),
95
- async connect(): Promise<PgClientLike> {
96
- const client = await pool.connect();
97
- return {
98
- query: (sql, values) => wrap(client.query(sql, values)),
99
- release: () => client.release(),
100
- };
101
- },
102
- };
103
- }
104
-
105
- const RUN_TOKEN = crypto.randomUUID().replaceAll("-", "");
106
- const TEST_SCHEMA = `plugin_learning_core_bounded_${RUN_TOKEN}`;
107
- const NOW = "2026-06-01T00:00:00.000Z";
108
- const PAST = "2026-05-01T00:00:00.000Z";
109
- const FUTURE = "2027-01-01T00:00:00.000Z";
29
+ import type { ExtractionCandidate, LearningLesson } from "./types.js";
110
30
 
111
- type SqlLeg = {
112
- label: string;
113
- available: boolean;
114
- /** Fixture sizes; the live leg is smaller only to keep a shared server fast. */
115
- scale: number;
116
- make: (meter: Meter) => LessonStore;
117
- };
31
+ // The sqlite and in-memory-double legs of the metered SQL suite in
32
+ // bounded-store-reads.test-helpers.ts. Its live-server leg is
33
+ // bounded-store-reads.pg.integration.test.ts (`pnpm test:pg`).
118
34
 
119
35
  let db: DatabaseSync;
120
36
  let memPool: ReturnType<typeof createInMemoryPgPool>;
121
- let livePool: (PgPoolLike & { end?: () => Promise<void> }) | undefined;
122
- let handles: { sqlite: SqliteDatabaseLike; mem: PgPoolLike; live?: PgPoolLike };
123
-
124
- function metering<T>(meter: Meter, value: T): T {
125
- activeMeter = meter;
126
- return value;
127
- }
37
+ let handles: { sqlite: SqliteDatabaseLike; mem: PgPoolLike };
128
38
 
129
39
  const SQL_LEGS: SqlLeg[] = [
130
40
  {
131
41
  label: "sqlite",
132
- available: true,
133
42
  scale: 1,
134
43
  make: (meter) => metering(meter, new SqliteLessonStore({ db: handles.sqlite, scope: {} })),
44
+ writer: (scope) => new SqliteLessonStore({ db: handles.sqlite, scope }),
135
45
  },
136
46
  {
137
47
  label: "postgres (in-memory double)",
138
- available: true,
139
48
  scale: 1,
140
49
  make: (meter) =>
141
50
  metering(
142
51
  meter,
143
52
  new PostgresLessonStore({ pool: handles.mem, schema: TEST_SCHEMA, scope: {} }),
144
53
  ),
145
- },
146
- {
147
- label: "postgres (live server)",
148
- available: Boolean(process.env.OPENCLAW_DB_URL),
149
- scale: 0.5,
150
- make: (meter) =>
151
- metering(
152
- meter,
153
- new PostgresLessonStore({ pool: handles.live!, schema: TEST_SCHEMA, scope: {} }),
154
- ),
54
+ writer: (scope) => new PostgresLessonStore({ pool: handles.mem, schema: TEST_SCHEMA, scope }),
155
55
  },
156
56
  ];
157
57
 
158
- beforeAll(() => {
159
- if (process.env.OPENCLAW_DB_URL) {
160
- livePool = createDefaultLearningPgPool(process.env.OPENCLAW_DB_URL);
161
- }
162
- });
163
-
164
58
  beforeEach(() => {
165
59
  db = new DatabaseSync(":memory:");
166
60
  memPool = createInMemoryPgPool();
167
61
  handles = {
168
62
  sqlite: meteredSqlite(db),
169
63
  mem: meteredPool(memPool),
170
- ...(livePool ? { live: meteredPool(livePool) } : {}),
171
64
  };
172
65
  });
173
66
 
174
- afterEach(async () => {
67
+ afterEach(() => {
175
68
  db.close();
176
- if (livePool) {
177
- await livePool.query(`DROP SCHEMA IF EXISTS ${TEST_SCHEMA} CASCADE`);
178
- }
179
- });
180
-
181
- afterAll(async () => {
182
- await livePool?.end?.();
183
69
  });
184
70
 
185
- function iso(ms: number): string {
186
- return new Date(Date.parse(PAST) + ms).toISOString();
187
- }
188
-
189
- function candidate(index: number, status: ExtractionCandidate["status"]): ExtractionCandidate {
190
- return withCandidateDefaults(
191
- {
192
- sessionId: `session-${String(index).padStart(6, "0")}`,
193
- agentId: `agent-${index % 3}`,
194
- workspaceId: `ws-${index % 2}`,
195
- excerpt: `candidate ${index} ${"x".repeat(900)}`,
196
- tags: index % 2 === 0 ? ["correction"] : ["failure"],
197
- status,
198
- },
199
- iso(index * 1000),
200
- );
201
- }
202
-
203
- function lesson(index: number, text: string, opts?: { invalidAt?: string; validFrom?: string }) {
204
- const at = iso(index * 1000);
205
- return withLessonDefaults(
206
- {
207
- id: `lesson-${String(index).padStart(6, "0")}`,
208
- scope: { agentId: `agent-${index % 3}`, workspaceId: `ws-${index % 2}` },
209
- kind: "procedure" as const,
210
- text,
211
- confidence: 0.9,
212
- occurrences: 1,
213
- distinctSessionIds: [`s-${index}`],
214
- evidence: [],
215
- createdAt: at,
216
- updatedAt: at,
217
- ...(opts?.validFrom ? { validFrom: opts.validFrom } : {}),
218
- ...(opts?.invalidAt ? { invalidAt: opts.invalidAt } : {}),
219
- },
220
- at,
221
- );
222
- }
223
-
224
- function proposal(index: number, status: SkillProposal["status"]): SkillProposal {
225
- return {
226
- id: `proposal-${index}`,
227
- lessonIds: [`lesson-${String(index).padStart(6, "0")}`],
228
- status,
229
- skillName: `skill-${index}`,
230
- title: `Proposal ${index}`,
231
- body: "b".repeat(4000),
232
- scannerFindings: [],
233
- createdAt: iso(index),
234
- updatedAt: iso(index),
235
- };
236
- }
237
-
238
- // Mixed 1-, 2- and 3-byte characters, so a byte cut can land inside a character.
239
- const LONG_TEXT = `${"é".repeat(3000)}${"界".repeat(2000)} tail`;
240
-
241
- async function seedScoped(
242
- writer: (scope: { workspaceId: string; agentId: string }) => LessonStore,
243
- items: Array<{
244
- scope: { workspaceId: string; agentId: string };
245
- write: (store: LessonStore) => Promise<void>;
246
- }>,
247
- ): Promise<void> {
248
- for (const item of items) {
249
- await item.write(writer(item.scope));
250
- }
251
- }
252
-
253
71
  for (const leg of SQL_LEGS) {
254
- const d = leg.available ? describe : describe.skip;
255
- d(`bounded SQL store reads — ${leg.label}`, () => {
256
- // Writes go through a store scoped to the row's own scope (as production capture does), reads
257
- // through the unscoped store the gateway and the passes use.
258
- const scopedWriter = (meter: Meter) => (scope: { workspaceId: string; agentId: string }) => {
259
- activeMeter = meter;
260
- if (leg.label === "sqlite") {
261
- return new SqliteLessonStore({ db: handles.sqlite, scope });
262
- }
263
- const pool = leg.label.includes("live") ? handles.live! : handles.mem;
264
- return new PostgresLessonStore({ pool, schema: TEST_SCHEMA, scope });
265
- };
266
- const scopeOf = (index: number) => ({
267
- agentId: `agent-${index % 3}`,
268
- workspaceId: `ws-${index % 2}`,
269
- });
270
-
271
- it("pending candidates: rows and payload bytes read are the pending set only, keyset-paged", async () => {
272
- const total = Math.round(2000 * leg.scale);
273
- const pendingEvery = 100;
274
- const seedMeter = newMeter();
275
- const writer = scopedWriter(seedMeter);
276
- const all: ExtractionCandidate[] = [];
277
- for (let index = 0; index < total; index += 1) {
278
- const entry = candidate(index, index % pendingEvery === 0 ? "pending" : "processed");
279
- all.push(entry);
280
- await writer(scopeOf(index)).upsertCandidate(entry);
281
- }
282
- const expected = all.filter((entry) => entry.status === "pending");
283
- const pendingBytes = expected.reduce(
284
- (sum, entry) => sum + Buffer.byteLength(JSON.stringify(entry)),
285
- 0,
286
- );
287
- const allBytes = all.reduce(
288
- (sum, entry) => sum + Buffer.byteLength(JSON.stringify(entry)),
289
- 0,
290
- );
291
-
292
- const meter = newMeter();
293
- const store = leg.make(meter);
294
- const pending = await store.listPendingCandidates();
295
- expect(pending.map((entry) => entry.sessionId)).toEqual(
296
- expected.map((entry) => entry.sessionId),
297
- );
298
- expect(meter.rows, "rows read must be the pending rows, not every candidate").toBe(
299
- expected.length,
300
- );
301
- // jsonb re-serialization may reorder keys but never grows a row by more than its key quotes.
302
- expect(meter.payloadBytes).toBeLessThanOrEqual(pendingBytes * 1.1);
303
- expect(meter.payloadBytes).toBeLessThan(allBytes / 20);
304
-
305
- // Keyset pages: LIMIT applies in SQL, pages chain without gaps or repeats, tags filter.
306
- const pageMeter = newMeter();
307
- const paged = leg.make(pageMeter);
308
- const first = await paged.listPendingCandidatesPage({ limit: 7 });
309
- expect(pageMeter.rows).toBe(7);
310
- const seen = [...first.candidates];
311
- let cursor = first.nextCursor;
312
- while (cursor) {
313
- const page = await paged.listPendingCandidatesPage({ after: cursor, limit: 7 });
314
- seen.push(...page.candidates);
315
- cursor = page.nextCursor;
316
- }
317
- expect(seen.map((entry) => entry.sessionId)).toEqual(
318
- expected.map((entry) => entry.sessionId),
319
- );
320
- const tagged = await paged.listPendingCandidates({ tags: ["failure"] });
321
- expect(tagged.map((entry) => entry.sessionId)).toEqual(
322
- expected.filter((entry) => entry.tags.includes("failure")).map((entry) => entry.sessionId),
323
- );
324
- const limited = await paged.listPendingCandidates({ limit: 3 });
325
- expect(limited.map((entry) => entry.sessionId)).toEqual(
326
- expected.slice(0, 3).map((entry) => entry.sessionId),
327
- );
328
- });
329
-
330
- it("similar-lesson ranking reads { id, excerpt } pages: no payload bytes, 2 KiB rows, 256 KiB pages", async () => {
331
- const activeCount = Math.round(450 * leg.scale);
332
- const seedMeter = newMeter();
333
- const writer = scopedWriter(seedMeter);
334
- const activeIds: string[] = [];
335
- for (let index = 0; index < activeCount; index += 1) {
336
- const entry = lesson(index, index % 5 === 0 ? `short ${index}` : `${LONG_TEXT} ${index}`);
337
- activeIds.push(entry.id);
338
- await writer(scopeOf(index)).upsertLesson(entry);
339
- }
340
- // Inactive rows the SQL predicate must drop: invalidated, and not yet valid.
341
- for (let index = activeCount; index < activeCount + 40; index += 1) {
342
- await writer(scopeOf(index)).upsertLesson(
343
- lesson(index, LONG_TEXT, index % 2 === 0 ? { invalidAt: PAST } : { validFrom: FUTURE }),
344
- );
345
- }
346
-
347
- const meter = newMeter();
348
- const store = leg.make(meter);
349
- const first = await store.listActiveLessonsPage({ now: NOW, limit: 200 });
350
- expect(meter.payloadBytes, "no payload_json may leave the database").toBe(0);
351
- expect(first.lessons.length).toBeLessThanOrEqual(200);
352
- expect(first.nextCursor).toBeDefined();
353
- const firstBytes = first.lessons.reduce(
354
- (sum, entry) => sum + Buffer.byteLength(entry.excerpt),
355
- 0,
356
- );
357
- expect(firstBytes).toBeLessThanOrEqual(LESSON_PAGE_MAX_BYTES);
358
- expect(
359
- meter.excerptBytes,
360
- "the database returned at most one page of excerpts",
361
- ).toBeLessThanOrEqual(LESSON_PAGE_MAX_BYTES);
362
- for (const entry of first.lessons) {
363
- expect(Buffer.byteLength(entry.excerpt)).toBeLessThanOrEqual(LESSON_EXCERPT_MAX_BYTES);
364
- expect(entry.excerpt).not.toContain("�");
365
- }
366
-
367
- const walkMeter = newMeter();
368
- const walker = leg.make(walkMeter);
369
- const pool = await readRankingPool(walker, NOW);
370
- expect(pool.truncated).toBe(false);
371
- expect(pool.lessons.map((entry) => entry.id).toSorted()).toEqual(activeIds.toSorted());
372
- expect(walkMeter.rows, "every active row read exactly once, inactive never").toBe(
373
- activeCount,
374
- );
375
- expect(walkMeter.payloadBytes).toBe(0);
376
- });
377
-
378
- it("the ranking scan stops at its 2,000-row ceiling", async () => {
379
- if (leg.label.includes("live")) {
380
- return;
381
- }
382
- const writer = scopedWriter(newMeter());
383
- for (let index = 0; index < RANKING_SCAN_MAX_ROWS + 50; index += 1) {
384
- await writer(scopeOf(index)).upsertLesson(lesson(index, `tiny ${index}`));
385
- }
386
- const meter = newMeter();
387
- const pool = await readRankingPool(leg.make(meter), NOW);
388
- expect(pool.truncated).toBe(true);
389
- expect(pool.lessons).toHaveLength(RANKING_SCAN_MAX_ROWS);
390
- expect(meter.rows).toBe(RANKING_SCAN_MAX_ROWS);
391
- });
392
-
393
- it("overview counts are SQL aggregates: a handful of rows, no payload bytes", async () => {
394
- const seedMeter = newMeter();
395
- const writer = scopedWriter(seedMeter);
396
- const lessons = Math.round(300 * leg.scale);
397
- const items: Parameters<typeof seedScoped>[1] = [];
398
- for (let index = 0; index < lessons; index += 1) {
399
- items.push({
400
- scope: scopeOf(index),
401
- write: (store) =>
402
- store.upsertLesson(
403
- lesson(index, "t", index % 10 === 0 ? { invalidAt: PAST } : undefined),
404
- ),
405
- });
406
- }
407
- const statuses: SkillProposal["status"][] = ["pending", "applied", "rejected", "quarantined"];
408
- for (let index = 0; index < 40; index += 1) {
409
- items.push({
410
- scope: scopeOf(index),
411
- write: (store) => store.upsertProposal(proposal(index, statuses[index % 4])),
412
- });
413
- }
414
- await seedScoped(writer, items);
415
-
416
- const meter = newMeter();
417
- const store = leg.make(meter);
418
- const counts = await store.countOverview({ now: NOW });
419
- expect(counts).toEqual({
420
- proposals: { pending: 10, applied: 10, rejected: 10, quarantined: 10 },
421
- lessons: lessons - lessons / 10,
422
- scopes: 6,
423
- truncated: false,
424
- });
425
- expect(meter.payloadBytes).toBe(0);
426
- expect(meter.rows).toBeLessThanOrEqual(8);
427
-
428
- // The real entry point: learning.overview over the same store.
429
- const calls: Array<{ ok: boolean; payload?: unknown }> = [];
430
- const handlerMeter = newMeter();
431
- await createLearningOverview({
432
- readResolution: async () => ({}),
433
- lessonStore: () => leg.make(handlerMeter),
434
- now: () => NOW,
435
- })({
436
- params: {},
437
- respond: (ok: boolean, payload?: unknown) => calls.push({ ok, payload }),
438
- } as never);
439
- expect(calls[0]).toMatchObject({
440
- ok: true,
441
- payload: { lessons: counts.lessons, scopes: 6, truncated: false },
442
- });
443
- expect(handlerMeter.payloadBytes).toBe(0);
444
- });
445
-
446
- it("getLesson and getLessonsByIds read only the named rows", async () => {
447
- const writer = scopedWriter(newMeter());
448
- for (let index = 0; index < 200; index += 1) {
449
- await writer(scopeOf(index)).upsertLesson(lesson(index, LONG_TEXT));
450
- }
451
- const meter = newMeter();
452
- const store = leg.make(meter);
453
- const found = await store.getLessonsByIds(["lesson-000003", "lesson-000150", "missing"]);
454
- expect(found.map((entry) => entry.id).toSorted()).toEqual(["lesson-000003", "lesson-000150"]);
455
- expect(meter.rows).toBe(2);
456
- const one = newMeter();
457
- expect((await leg.make(one).getLesson("lesson-000007"))?.id).toBe("lesson-000007");
458
- expect(one.rows).toBe(1);
459
- });
460
- });
72
+ registerBoundedSqlLegSuite(leg);
461
73
  }
462
74
 
463
75
  // --- fs-jsonl: a large log under a memory ceiling ---
@@ -0,0 +1,52 @@
1
+ import { afterAll, afterEach, beforeAll, beforeEach, describe } from "vitest";
2
+ import {
3
+ meteredPool,
4
+ metering,
5
+ registerBoundedSqlLegSuite,
6
+ TEST_SCHEMA,
7
+ type SqlLeg,
8
+ } from "./bounded-store-reads.test-helpers.js";
9
+ import {
10
+ createDefaultLearningPgPool,
11
+ PostgresLessonStore,
12
+ type PgPoolLike,
13
+ } from "./lesson-store-postgres.js";
14
+
15
+ // Live-server leg of the bounded store reads suite (`pnpm test:pg`): the metered SQL contract the
16
+ // sqlite and in-memory-double legs run in bounded-store-reads.conformance.test.ts, against a real
17
+ // Postgres.
18
+ const databaseUrl = process.env.OPENCLAW_DATABASE_URL;
19
+ const live = process.env.OPENCLAW_LIVE_PG_TEST === "1" && Boolean(databaseUrl);
20
+
21
+ let livePool: PgPoolLike & { end?: () => Promise<void> };
22
+ // A fresh metered handle per test: the stores memoise schema init on the handle, and every test
23
+ // ends by dropping the schema.
24
+ let liveHandle: PgPoolLike;
25
+
26
+ const liveLeg: SqlLeg = {
27
+ label: "postgres (live server)",
28
+ scale: 0.5,
29
+ make: (meter) =>
30
+ metering(meter, new PostgresLessonStore({ pool: liveHandle, schema: TEST_SCHEMA, scope: {} })),
31
+ writer: (scope) => new PostgresLessonStore({ pool: liveHandle, schema: TEST_SCHEMA, scope }),
32
+ };
33
+
34
+ describe.skipIf(!live)("live postgres", () => {
35
+ beforeAll(() => {
36
+ livePool = createDefaultLearningPgPool(databaseUrl!);
37
+ });
38
+
39
+ beforeEach(() => {
40
+ liveHandle = meteredPool(livePool);
41
+ });
42
+
43
+ afterEach(async () => {
44
+ await livePool.query(`DROP SCHEMA IF EXISTS ${TEST_SCHEMA} CASCADE`);
45
+ });
46
+
47
+ afterAll(async () => {
48
+ await livePool.end?.();
49
+ });
50
+
51
+ registerBoundedSqlLegSuite(liveLeg);
52
+ });