@mx-space/cli 0.15.0 → 0.15.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.
- package/README.md +1 -1
- package/dist/{Lexical.dev-Cck4n26y.mjs → Lexical.dev-BSvx45_E.mjs} +127 -94
- package/dist/{Lexical.node-D6wf2D5M.mjs → Lexical.node-kAh5GM2n.mjs} +1 -1
- package/dist/{Lexical.prod-DCwS1oTq.mjs → Lexical.prod-Bqwgb3ez.mjs} +4 -2
- package/dist/{LexicalClipboard.dev-CMkPHV7O.mjs → LexicalClipboard.dev-BWU3KXIa.mjs} +18 -14
- package/dist/{LexicalClipboard.node-m4nZ7IYw.mjs → LexicalClipboard.node-BygAdNdF.mjs} +1 -1
- package/dist/{LexicalClipboard.prod-B_rN1vE1.mjs → LexicalClipboard.prod-BtMuKNyT.mjs} +10 -10
- package/dist/{LexicalCodeCore.dev-DyJw3i8V.mjs → LexicalCodeCore.dev-CD2xgvDs.mjs} +43 -25
- package/dist/{LexicalCodeCore.prod-DPXLHQLF.mjs → LexicalCodeCore.prod-Bl6FFMc7.mjs} +6 -6
- package/dist/{LexicalDragon.dev-ZkNfMwrE.mjs → LexicalDragon.dev-BwdYhm4K.mjs} +2 -2
- package/dist/{LexicalDragon.node-Ds9oLUFh.mjs → LexicalDragon.node-CpJhkCVV.mjs} +1 -1
- package/dist/{LexicalDragon.prod-B58ic2av.mjs → LexicalDragon.prod-CvXmWwo1.mjs} +2 -2
- package/dist/{LexicalExtension.dev-DvwHs1Xv.mjs → LexicalExtension.dev-LcRLXI5Z.mjs} +25 -13
- package/dist/{LexicalExtension.node-5OymZQfy.mjs → LexicalExtension.node-BwJt2LXV.mjs} +1 -1
- package/dist/{LexicalExtension.prod-Ce0T5smQ.mjs → LexicalExtension.prod-lg8_33-H.mjs} +16 -13
- package/dist/{LexicalHeadless.dev-DA0WldSR.mjs → LexicalHeadless.dev-BeUbKBes.mjs} +1 -1
- package/dist/{LexicalHeadless.prod-1kQgKB6c.mjs → LexicalHeadless.prod-4gbIA8HM.mjs} +1 -1
- package/dist/{LexicalHtml.dev-BDB7CUrx.mjs → LexicalHtml.dev-BLdZWTCJ.mjs} +20 -14
- package/dist/{LexicalHtml.node-DpVNt7It.mjs → LexicalHtml.node-BeuJMvvt.mjs} +1 -1
- package/dist/{LexicalHtml.prod-HkxM5scw.mjs → LexicalHtml.prod-CHUyCocN.mjs} +4 -4
- package/dist/{LexicalLink.dev-C5zNJlrm.mjs → LexicalLink.dev-DgsFRqw0.mjs} +28 -21
- package/dist/{LexicalLink.prod-Bkt9hQAt.mjs → LexicalLink.prod-CkXkeKY2.mjs} +6 -5
- package/dist/{LexicalList.dev-B7VgME-m.mjs → LexicalList.dev-OOms3kQi.mjs} +4 -4
- package/dist/{LexicalList.prod-B8c7TDjH.mjs → LexicalList.prod-DzMBeqHn.mjs} +4 -4
- package/dist/{LexicalMarkdown.dev-B5z9kLbV.mjs → LexicalMarkdown.dev-DJLKbZtD.mjs} +40 -29
- package/dist/{LexicalMarkdown.prod-wKzw7FFH.mjs → LexicalMarkdown.prod-Cp21kDCU.mjs} +10 -7
- package/dist/{LexicalRichText.dev-CUd6Li5F.mjs → LexicalRichText.dev-0rkAGjUf.mjs} +15 -11
- package/dist/{LexicalRichText.node-BKfaQ-CH.mjs → LexicalRichText.node-Cd-BySPE.mjs} +4 -4
- package/dist/{LexicalRichText.prod-SBewjJHx.mjs → LexicalRichText.prod-DTQiEr8C.mjs} +17 -11
- package/dist/{LexicalSelection.dev-D27JOCqj.mjs → LexicalSelection.dev-Bi0VlUEv.mjs} +28 -24
- package/dist/{LexicalSelection.node-DBEwPjBu.mjs → LexicalSelection.node-t2U46EF_.mjs} +1 -1
- package/dist/{LexicalSelection.prod-OaYhXHOL.mjs → LexicalSelection.prod-CrFG111g.mjs} +2 -2
- package/dist/{LexicalTable.dev-6IFFOAE0.mjs → LexicalTable.dev-D-sFhO-o.mjs} +33 -28
- package/dist/{LexicalTable.prod-2CaLZ7fH.mjs → LexicalTable.prod-DwYaa_dN.mjs} +10 -9
- package/dist/{LexicalUtils.dev-DJA7J_7v.mjs → LexicalUtils.dev-Q2q3-UDM.mjs} +8 -5
- package/dist/{LexicalUtils.node-Df9oPTlA.mjs → LexicalUtils.node-Dl7OvqJV.mjs} +1 -1
- package/dist/{LexicalUtils.prod-Bb7V4Ewg.mjs → LexicalUtils.prod-CBnq_iEV.mjs} +7 -6
- package/dist/bin/mxs.mjs +1 -1
- package/dist/esm-CNZ7kdTg.mjs +2 -0
- package/dist/{esm-DLzrv7gD.mjs → esm-ZXjJmLEC.mjs} +257 -260
- package/dist/index.mjs +1 -1
- package/dist/{mxs-BIRW5Axj.mjs → mxs-DC9zR3f2.mjs} +759 -539
- package/dist/{rolldown-runtime-JspESFgx.mjs → rolldown-runtime-B4iAMlE-.mjs} +1 -1
- package/dist/src/bin/mxs.d.ts +2 -0
- package/dist/src/bin/mxs.js +310 -0
- package/dist/src/cli/ai/_poll.d.ts +12 -0
- package/dist/src/cli/ai/_poll.js +38 -0
- package/dist/src/cli/ai/_resolve.d.ts +8 -0
- package/dist/src/cli/ai/_resolve.js +27 -0
- package/dist/src/cli/ai/index.d.ts +127 -0
- package/dist/src/cli/ai/index.js +46 -0
- package/dist/src/cli/ai/insights/by-article.d.ts +10 -0
- package/dist/src/cli/ai/insights/by-article.js +21 -0
- package/dist/src/cli/ai/insights/delete.d.ts +7 -0
- package/dist/src/cli/ai/insights/delete.js +18 -0
- package/dist/src/cli/ai/insights/edit.d.ts +8 -0
- package/dist/src/cli/ai/insights/edit.js +54 -0
- package/dist/src/cli/ai/insights/get.d.ts +6 -0
- package/dist/src/cli/ai/insights/get.js +11 -0
- package/dist/src/cli/ai/insights/index.d.ts +30 -0
- package/dist/src/cli/ai/insights/index.js +17 -0
- package/dist/src/cli/ai/insights/list.d.ts +10 -0
- package/dist/src/cli/ai/insights/list.js +20 -0
- package/dist/src/cli/ai/insights/refresh.d.ts +10 -0
- package/dist/src/cli/ai/insights/refresh.js +25 -0
- package/dist/src/cli/ai/insights/translate.d.ts +10 -0
- package/dist/src/cli/ai/insights/translate.js +25 -0
- package/dist/src/cli/ai/overview/by-article.d.ts +7 -0
- package/dist/src/cli/ai/overview/by-article.js +15 -0
- package/dist/src/cli/ai/overview/index.d.ts +11 -0
- package/dist/src/cli/ai/overview/index.js +4 -0
- package/dist/src/cli/ai/overview/list.d.ts +10 -0
- package/dist/src/cli/ai/overview/list.js +20 -0
- package/dist/src/cli/ai/summary/by-article.d.ts +10 -0
- package/dist/src/cli/ai/summary/by-article.js +21 -0
- package/dist/src/cli/ai/summary/delete.d.ts +7 -0
- package/dist/src/cli/ai/summary/delete.js +18 -0
- package/dist/src/cli/ai/summary/edit.d.ts +8 -0
- package/dist/src/cli/ai/summary/edit.js +54 -0
- package/dist/src/cli/ai/summary/get.d.ts +6 -0
- package/dist/src/cli/ai/summary/get.js +11 -0
- package/dist/src/cli/ai/summary/index.d.ts +30 -0
- package/dist/src/cli/ai/summary/index.js +9 -0
- package/dist/src/cli/ai/summary/list.d.ts +10 -0
- package/dist/src/cli/ai/summary/list.js +20 -0
- package/dist/src/cli/ai/summary/regen.d.ts +10 -0
- package/dist/src/cli/ai/summary/regen.js +25 -0
- package/dist/src/cli/ai/summary/translate.d.ts +10 -0
- package/dist/src/cli/ai/summary/translate.js +25 -0
- package/dist/src/cli/ai/translate/by-article.d.ts +9 -0
- package/dist/src/cli/ai/translate/by-article.js +19 -0
- package/dist/src/cli/ai/translate/delete.d.ts +7 -0
- package/dist/src/cli/ai/translate/delete.js +18 -0
- package/dist/src/cli/ai/translate/edit.d.ts +8 -0
- package/dist/src/cli/ai/translate/edit.js +97 -0
- package/dist/src/cli/ai/translate/entries/delete.d.ts +7 -0
- package/dist/src/cli/ai/translate/entries/delete.js +18 -0
- package/dist/src/cli/ai/translate/entries/edit.d.ts +8 -0
- package/dist/src/cli/ai/translate/entries/edit.js +73 -0
- package/dist/src/cli/ai/translate/entries/generate.d.ts +7 -0
- package/dist/src/cli/ai/translate/entries/generate.js +15 -0
- package/dist/src/cli/ai/translate/entries/index.d.ts +17 -0
- package/dist/src/cli/ai/translate/entries/index.js +6 -0
- package/dist/src/cli/ai/translate/entries/list.d.ts +10 -0
- package/dist/src/cli/ai/translate/entries/list.js +20 -0
- package/dist/src/cli/ai/translate/get.d.ts +6 -0
- package/dist/src/cli/ai/translate/get.js +11 -0
- package/dist/src/cli/ai/translate/index.d.ts +40 -0
- package/dist/src/cli/ai/translate/index.js +19 -0
- package/dist/src/cli/ai/translate/languages.d.ts +7 -0
- package/dist/src/cli/ai/translate/languages.js +15 -0
- package/dist/src/cli/ai/translate/list.d.ts +9 -0
- package/dist/src/cli/ai/translate/list.js +19 -0
- package/dist/src/cli/ai/translate/run.d.ts +10 -0
- package/dist/src/cli/ai/translate/run.js +31 -0
- package/dist/src/cli/ai/tts/by-article.d.ts +7 -0
- package/dist/src/cli/ai/tts/by-article.js +15 -0
- package/dist/src/cli/ai/tts/delete.d.ts +7 -0
- package/dist/src/cli/ai/tts/delete.js +18 -0
- package/dist/src/cli/ai/tts/index.d.ts +22 -0
- package/dist/src/cli/ai/tts/index.js +7 -0
- package/dist/src/cli/ai/tts/list.d.ts +10 -0
- package/dist/src/cli/ai/tts/list.js +20 -0
- package/dist/src/cli/ai/tts/run.d.ts +10 -0
- package/dist/src/cli/ai/tts/run.js +25 -0
- package/dist/src/cli/ai/tts/voices.d.ts +7 -0
- package/dist/src/cli/ai/tts/voices.js +12 -0
- package/dist/src/cli/ai/views.d.ts +3 -0
- package/dist/src/cli/ai/views.js +45 -0
- package/dist/src/cli/auth/index.d.ts +6 -0
- package/dist/src/cli/auth/index.js +22 -0
- package/dist/src/cli/auth/login.d.ts +11 -0
- package/dist/src/cli/auth/login.js +168 -0
- package/dist/src/cli/auth/logout.d.ts +6 -0
- package/dist/src/cli/auth/logout.js +21 -0
- package/dist/src/cli/auth/status.d.ts +4 -0
- package/dist/src/cli/auth/status.js +31 -0
- package/dist/src/cli/auth/view.d.ts +25 -0
- package/dist/src/cli/auth/view.js +46 -0
- package/dist/src/cli/auth/whoami.d.ts +7 -0
- package/dist/src/cli/auth/whoami.js +44 -0
- package/dist/src/cli/category/create.d.ts +10 -0
- package/dist/src/cli/category/create.js +24 -0
- package/dist/src/cli/category/delete.d.ts +8 -0
- package/dist/src/cli/category/delete.js +21 -0
- package/dist/src/cli/category/get.d.ts +6 -0
- package/dist/src/cli/category/get.js +11 -0
- package/dist/src/cli/category/index.d.ts +20 -0
- package/dist/src/cli/category/index.js +41 -0
- package/dist/src/cli/category/list.d.ts +4 -0
- package/dist/src/cli/category/list.js +10 -0
- package/dist/src/cli/category/update.d.ts +12 -0
- package/dist/src/cli/category/update.js +34 -0
- package/dist/src/cli/comment/_flags.d.ts +28 -0
- package/dist/src/cli/comment/_flags.js +48 -0
- package/dist/src/cli/comment/approve.d.ts +9 -0
- package/dist/src/cli/comment/approve.js +23 -0
- package/dist/src/cli/comment/delete.d.ts +9 -0
- package/dist/src/cli/comment/delete.js +24 -0
- package/dist/src/cli/comment/get.d.ts +6 -0
- package/dist/src/cli/comment/get.js +12 -0
- package/dist/src/cli/comment/index.d.ts +34 -0
- package/dist/src/cli/comment/index.js +53 -0
- package/dist/src/cli/comment/list.d.ts +9 -0
- package/dist/src/cli/comment/list.js +20 -0
- package/dist/src/cli/comment/reject.d.ts +9 -0
- package/dist/src/cli/comment/reject.js +23 -0
- package/dist/src/cli/comment/reply.d.ts +9 -0
- package/dist/src/cli/comment/reply.js +31 -0
- package/dist/src/cli/comment/unread.d.ts +7 -0
- package/dist/src/cli/comment/unread.js +21 -0
- package/dist/src/cli/comment/view.d.ts +3 -0
- package/dist/src/cli/comment/view.js +197 -0
- package/dist/src/cli/config/edit.d.ts +5 -0
- package/dist/src/cli/config/edit.js +36 -0
- package/dist/src/cli/config/get.d.ts +6 -0
- package/dist/src/cli/config/get.js +11 -0
- package/dist/src/cli/config/index.d.ts +10 -0
- package/dist/src/cli/config/index.js +22 -0
- package/dist/src/cli/config/list.d.ts +4 -0
- package/dist/src/cli/config/list.js +10 -0
- package/dist/src/cli/config/set.d.ts +9 -0
- package/dist/src/cli/config/set.js +48 -0
- package/dist/src/cli/draft/_shared.d.ts +27 -0
- package/dist/src/cli/draft/_shared.js +85 -0
- package/dist/src/cli/draft/create.d.ts +21 -0
- package/dist/src/cli/draft/create.js +34 -0
- package/dist/src/cli/draft/delete.d.ts +7 -0
- package/dist/src/cli/draft/delete.js +20 -0
- package/dist/src/cli/draft/get.d.ts +6 -0
- package/dist/src/cli/draft/get.js +11 -0
- package/dist/src/cli/draft/index.d.ts +54 -0
- package/dist/src/cli/draft/index.js +42 -0
- package/dist/src/cli/draft/list.d.ts +11 -0
- package/dist/src/cli/draft/list.js +23 -0
- package/dist/src/cli/draft/publish.d.ts +8 -0
- package/dist/src/cli/draft/publish.js +64 -0
- package/dist/src/cli/draft/update.d.ts +22 -0
- package/dist/src/cli/draft/update.js +29 -0
- package/dist/src/cli/file/_shared.d.ts +6 -0
- package/dist/src/cli/file/_shared.js +5 -0
- package/dist/src/cli/file/delete.d.ts +8 -0
- package/dist/src/cli/file/delete.js +21 -0
- package/dist/src/cli/file/index.d.ts +19 -0
- package/dist/src/cli/file/index.js +33 -0
- package/dist/src/cli/file/list.d.ts +6 -0
- package/dist/src/cli/file/list.js +11 -0
- package/dist/src/cli/file/rename.d.ts +8 -0
- package/dist/src/cli/file/rename.js +16 -0
- package/dist/src/cli/file/upload.d.ts +9 -0
- package/dist/src/cli/file/upload.js +32 -0
- package/dist/src/cli/help/index.d.ts +62 -0
- package/dist/src/cli/help/index.js +276 -0
- package/dist/src/cli/help/registry.d.ts +28 -0
- package/dist/src/cli/help/registry.js +29 -0
- package/dist/src/cli/note/_flags.d.ts +66 -0
- package/dist/src/cli/note/_flags.js +73 -0
- package/dist/src/cli/note/create.d.ts +23 -0
- package/dist/src/cli/note/create.js +25 -0
- package/dist/src/cli/note/delete.d.ts +8 -0
- package/dist/src/cli/note/delete.js +21 -0
- package/dist/src/cli/note/edit.d.ts +28 -0
- package/dist/src/cli/note/edit.js +114 -0
- package/dist/src/cli/note/get.d.ts +6 -0
- package/dist/src/cli/note/get.js +29 -0
- package/dist/src/cli/note/index.d.ts +77 -0
- package/dist/src/cli/note/index.js +63 -0
- package/dist/src/cli/note/list.d.ts +10 -0
- package/dist/src/cli/note/list.js +22 -0
- package/dist/src/cli/note/publish.d.ts +7 -0
- package/dist/src/cli/note/publish.js +17 -0
- package/dist/src/cli/note/unpublish.d.ts +7 -0
- package/dist/src/cli/note/unpublish.js +17 -0
- package/dist/src/cli/note/update.d.ts +25 -0
- package/dist/src/cli/note/update.js +36 -0
- package/dist/src/cli/note/view.d.ts +3 -0
- package/dist/src/cli/note/view.js +162 -0
- package/dist/src/cli/page/create.d.ts +41 -0
- package/dist/src/cli/page/create.js +56 -0
- package/dist/src/cli/page/delete.d.ts +7 -0
- package/dist/src/cli/page/delete.js +37 -0
- package/dist/src/cli/page/edit.d.ts +19 -0
- package/dist/src/cli/page/edit.js +117 -0
- package/dist/src/cli/page/get.d.ts +6 -0
- package/dist/src/cli/page/get.js +16 -0
- package/dist/src/cli/page/index.d.ts +44 -0
- package/dist/src/cli/page/index.js +38 -0
- package/dist/src/cli/page/list.d.ts +4 -0
- package/dist/src/cli/page/list.js +10 -0
- package/dist/src/cli/page/update.d.ts +16 -0
- package/dist/src/cli/page/update.js +48 -0
- package/dist/src/cli/page/view.d.ts +2 -0
- package/dist/src/cli/page/view.js +79 -0
- package/dist/src/cli/post/_flags.d.ts +66 -0
- package/dist/src/cli/post/_flags.js +96 -0
- package/dist/src/cli/post/apply.d.ts +7 -0
- package/dist/src/cli/post/apply.js +70 -0
- package/dist/src/cli/post/create.d.ts +21 -0
- package/dist/src/cli/post/create.js +24 -0
- package/dist/src/cli/post/delete.d.ts +8 -0
- package/dist/src/cli/post/delete.js +21 -0
- package/dist/src/cli/post/edit.d.ts +26 -0
- package/dist/src/cli/post/edit.js +115 -0
- package/dist/src/cli/post/get.d.ts +7 -0
- package/dist/src/cli/post/get.js +15 -0
- package/dist/src/cli/post/index.d.ts +91 -0
- package/dist/src/cli/post/index.js +73 -0
- package/dist/src/cli/post/list.d.ts +10 -0
- package/dist/src/cli/post/list.js +23 -0
- package/dist/src/cli/post/publish.d.ts +7 -0
- package/dist/src/cli/post/publish.js +17 -0
- package/dist/src/cli/post/stage.d.ts +23 -0
- package/dist/src/cli/post/stage.js +55 -0
- package/dist/src/cli/post/unpublish.d.ts +7 -0
- package/dist/src/cli/post/unpublish.js +17 -0
- package/dist/src/cli/post/update.d.ts +23 -0
- package/dist/src/cli/post/update.js +38 -0
- package/dist/src/cli/post/view.d.ts +3 -0
- package/dist/src/cli/post/view.js +150 -0
- package/dist/src/cli/preview/index.d.ts +13 -0
- package/dist/src/cli/preview/index.js +226 -0
- package/dist/src/cli/profile/index.d.ts +14 -0
- package/dist/src/cli/profile/index.js +36 -0
- package/dist/src/cli/profile/ls.d.ts +5 -0
- package/dist/src/cli/profile/ls.js +26 -0
- package/dist/src/cli/profile/mark.d.ts +9 -0
- package/dist/src/cli/profile/mark.js +23 -0
- package/dist/src/cli/profile/rm.d.ts +12 -0
- package/dist/src/cli/profile/rm.js +50 -0
- package/dist/src/cli/profile/show.d.ts +9 -0
- package/dist/src/cli/profile/show.js +40 -0
- package/dist/src/cli/profile/use.d.ts +6 -0
- package/dist/src/cli/profile/use.js +11 -0
- package/dist/src/cli/profile/view.d.ts +8 -0
- package/dist/src/cli/profile/view.js +21 -0
- package/dist/src/cli/project/_flags.d.ts +56 -0
- package/dist/src/cli/project/_flags.js +130 -0
- package/dist/src/cli/project/create.d.ts +17 -0
- package/dist/src/cli/project/create.js +25 -0
- package/dist/src/cli/project/delete.d.ts +8 -0
- package/dist/src/cli/project/delete.js +22 -0
- package/dist/src/cli/project/edit.d.ts +11 -0
- package/dist/src/cli/project/edit.js +61 -0
- package/dist/src/cli/project/get.d.ts +7 -0
- package/dist/src/cli/project/get.js +14 -0
- package/dist/src/cli/project/index.d.ts +43 -0
- package/dist/src/cli/project/index.js +52 -0
- package/dist/src/cli/project/list.d.ts +8 -0
- package/dist/src/cli/project/list.js +19 -0
- package/dist/src/cli/project/update.d.ts +18 -0
- package/dist/src/cli/project/update.js +24 -0
- package/dist/src/cli/project/view-cmd.d.ts +7 -0
- package/dist/src/cli/project/view-cmd.js +15 -0
- package/dist/src/cli/project/view.d.ts +3 -0
- package/dist/src/cli/project/view.js +102 -0
- package/dist/src/cli/render/codehighlight.d.ts +8 -0
- package/dist/src/cli/render/codehighlight.js +264 -0
- package/dist/src/cli/render/envelope.d.ts +7 -0
- package/dist/src/cli/render/envelope.js +23 -0
- package/dist/src/cli/render/frontmatter.d.ts +8 -0
- package/dist/src/cli/render/frontmatter.js +50 -0
- package/dist/src/cli/render/helpers.d.ts +2 -0
- package/dist/src/cli/render/helpers.js +11 -0
- package/dist/src/cli/render/index.d.ts +7 -0
- package/dist/src/cli/render/index.js +10 -0
- package/dist/src/cli/render/lexical/blocks.d.ts +19 -0
- package/dist/src/cli/render/lexical/blocks.js +208 -0
- package/dist/src/cli/render/lexical/code.d.ts +2 -0
- package/dist/src/cli/render/lexical/code.js +22 -0
- package/dist/src/cli/render/lexical/embeds.d.ts +6 -0
- package/dist/src/cli/render/lexical/embeds.js +51 -0
- package/dist/src/cli/render/lexical/index.d.ts +9 -0
- package/dist/src/cli/render/lexical/index.js +25 -0
- package/dist/src/cli/render/lexical/inlines.d.ts +17 -0
- package/dist/src/cli/render/lexical/inlines.js +76 -0
- package/dist/src/cli/render/lexical/parser.d.ts +10 -0
- package/dist/src/cli/render/lexical/parser.js +64 -0
- package/dist/src/cli/render/lexical/walker.d.ts +21 -0
- package/dist/src/cli/render/lexical/walker.js +51 -0
- package/dist/src/cli/render/markdown.d.ts +18 -0
- package/dist/src/cli/render/markdown.js +196 -0
- package/dist/src/cli/render/metadata-block.d.ts +14 -0
- package/dist/src/cli/render/metadata-block.js +50 -0
- package/dist/src/cli/skill/all.d.ts +4 -0
- package/dist/src/cli/skill/all.js +11 -0
- package/dist/src/cli/skill/get.d.ts +6 -0
- package/dist/src/cli/skill/get.js +12 -0
- package/dist/src/cli/skill/index.d.ts +10 -0
- package/dist/src/cli/skill/index.js +34 -0
- package/dist/src/cli/skill/list.d.ts +4 -0
- package/dist/src/cli/skill/list.js +11 -0
- package/dist/src/cli/skill/search.d.ts +6 -0
- package/dist/src/cli/skill/search.js +12 -0
- package/dist/src/cli/skill/views.d.ts +6 -0
- package/dist/src/cli/skill/views.js +90 -0
- package/dist/src/cli/snippet/_flags.d.ts +57 -0
- package/dist/src/cli/snippet/_flags.js +123 -0
- package/dist/src/cli/snippet/_resolve.d.ts +4 -0
- package/dist/src/cli/snippet/_resolve.js +32 -0
- package/dist/src/cli/snippet/_sync.d.ts +5 -0
- package/dist/src/cli/snippet/_sync.js +54 -0
- package/dist/src/cli/snippet/create.d.ts +19 -0
- package/dist/src/cli/snippet/create.js +35 -0
- package/dist/src/cli/snippet/delete.d.ts +8 -0
- package/dist/src/cli/snippet/delete.js +28 -0
- package/dist/src/cli/snippet/edit.d.ts +7 -0
- package/dist/src/cli/snippet/edit.js +29 -0
- package/dist/src/cli/snippet/get.d.ts +6 -0
- package/dist/src/cli/snippet/get.js +12 -0
- package/dist/src/cli/snippet/index.d.ts +43 -0
- package/dist/src/cli/snippet/index.js +58 -0
- package/dist/src/cli/snippet/list.d.ts +9 -0
- package/dist/src/cli/snippet/list.js +20 -0
- package/dist/src/cli/snippet/pull.d.ts +8 -0
- package/dist/src/cli/snippet/pull.js +33 -0
- package/dist/src/cli/snippet/push.d.ts +10 -0
- package/dist/src/cli/snippet/push.js +31 -0
- package/dist/src/cli/snippet/update.d.ts +8 -0
- package/dist/src/cli/snippet/update.js +16 -0
- package/dist/src/cli/topic/create.d.ts +10 -0
- package/dist/src/cli/topic/create.js +24 -0
- package/dist/src/cli/topic/delete.d.ts +7 -0
- package/dist/src/cli/topic/delete.js +37 -0
- package/dist/src/cli/topic/get.d.ts +6 -0
- package/dist/src/cli/topic/get.js +15 -0
- package/dist/src/cli/topic/index.d.ts +20 -0
- package/dist/src/cli/topic/index.js +32 -0
- package/dist/src/cli/topic/list.d.ts +4 -0
- package/dist/src/cli/topic/list.js +10 -0
- package/dist/src/cli/topic/update.d.ts +11 -0
- package/dist/src/cli/topic/update.js +51 -0
- package/dist/src/cli/ui/index.d.ts +24 -0
- package/dist/src/cli/ui/index.js +83 -0
- package/dist/src/cli/update/index.d.ts +10 -0
- package/dist/src/cli/update/index.js +142 -0
- package/dist/src/domain/admin-link.d.ts +12 -0
- package/dist/src/domain/admin-link.js +45 -0
- package/dist/src/domain/content-spec.d.ts +20 -0
- package/dist/src/domain/content-spec.js +78 -0
- package/dist/src/domain/envelope-compat.d.ts +68 -0
- package/dist/src/domain/envelope-compat.js +121 -0
- package/dist/src/domain/envelope.d.ts +34 -0
- package/dist/src/domain/envelope.js +355 -0
- package/dist/src/domain/errors.d.ts +336 -0
- package/dist/src/domain/errors.js +239 -0
- package/dist/src/domain/gate.d.ts +14 -0
- package/dist/src/domain/gate.js +18 -0
- package/dist/src/domain/payload.d.ts +64 -0
- package/dist/src/domain/payload.js +237 -0
- package/dist/src/domain/preflight-guards.d.ts +54 -0
- package/dist/src/domain/preflight-guards.js +130 -0
- package/dist/src/domain/runtime-flags.d.ts +33 -0
- package/dist/src/domain/runtime-flags.js +166 -0
- package/dist/src/domain/schema/api-envelope.d.ts +67 -0
- package/dist/src/domain/schema/api-envelope.js +65 -0
- package/dist/src/domain/schema/category.d.ts +23 -0
- package/dist/src/domain/schema/category.js +19 -0
- package/dist/src/domain/schema/config.d.ts +13 -0
- package/dist/src/domain/schema/config.js +18 -0
- package/dist/src/domain/schema/note.d.ts +76 -0
- package/dist/src/domain/schema/note.js +35 -0
- package/dist/src/domain/schema/page.d.ts +40 -0
- package/dist/src/domain/schema/page.js +22 -0
- package/dist/src/domain/schema/post.d.ts +68 -0
- package/dist/src/domain/schema/post.js +35 -0
- package/dist/src/domain/schema/profile.d.ts +14 -0
- package/dist/src/domain/schema/profile.js +22 -0
- package/dist/src/domain/schema/topic.d.ts +24 -0
- package/dist/src/domain/schema/topic.js +16 -0
- package/dist/src/domain/version.d.ts +15 -0
- package/dist/src/domain/version.js +43 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +8 -0
- package/dist/src/layers/App.d.ts +30 -0
- package/dist/src/layers/App.js +39 -0
- package/dist/src/services/Ai/index.d.ts +13 -0
- package/dist/src/services/Ai/index.js +127 -0
- package/dist/src/services/Ai/overview.d.ts +7 -0
- package/dist/src/services/Ai/overview.js +11 -0
- package/dist/src/services/Ai/resources.d.ts +7 -0
- package/dist/src/services/Ai/resources.js +59 -0
- package/dist/src/services/Ai/shared.d.ts +2 -0
- package/dist/src/services/Ai/shared.js +11 -0
- package/dist/src/services/Ai/tasks.d.ts +8 -0
- package/dist/src/services/Ai/tasks.js +144 -0
- package/dist/src/services/Ai/types.d.ts +130 -0
- package/dist/src/services/Ai/types.js +1 -0
- package/dist/src/services/Api.d.ts +67 -0
- package/dist/src/services/Api.js +348 -0
- package/dist/src/services/Auth.d.ts +101 -0
- package/dist/src/services/Auth.js +402 -0
- package/dist/src/services/Backup.d.ts +8 -0
- package/dist/src/services/Backup.js +4 -0
- package/dist/src/services/Cache.d.ts +8 -0
- package/dist/src/services/Cache.js +4 -0
- package/dist/src/services/Comment.d.ts +48 -0
- package/dist/src/services/Comment.js +102 -0
- package/dist/src/services/Config.d.ts +95 -0
- package/dist/src/services/Config.js +359 -0
- package/dist/src/services/Editor.d.ts +28 -0
- package/dist/src/services/Editor.js +95 -0
- package/dist/src/services/Lexical.d.ts +27 -0
- package/dist/src/services/Lexical.js +56 -0
- package/dist/src/services/Migration.d.ts +31 -0
- package/dist/src/services/Migration.js +177 -0
- package/dist/src/services/Profile.d.ts +29 -0
- package/dist/src/services/Profile.js +115 -0
- package/dist/src/services/Renderer/content.d.ts +16 -0
- package/dist/src/services/Renderer/content.js +110 -0
- package/dist/src/services/Renderer/datetime.d.ts +38 -0
- package/dist/src/services/Renderer/datetime.js +147 -0
- package/dist/src/services/Renderer/errors.d.ts +3 -0
- package/dist/src/services/Renderer/errors.js +59 -0
- package/dist/src/services/Renderer/index.d.ts +13 -0
- package/dist/src/services/Renderer/index.js +11 -0
- package/dist/src/services/Renderer/lists.d.ts +1 -0
- package/dist/src/services/Renderer/lists.js +101 -0
- package/dist/src/services/Renderer/options.d.ts +10 -0
- package/dist/src/services/Renderer/options.js +13 -0
- package/dist/src/services/Renderer/primitives.d.ts +4 -0
- package/dist/src/services/Renderer/primitives.js +12 -0
- package/dist/src/services/Renderer/service.d.ts +35 -0
- package/dist/src/services/Renderer/service.js +123 -0
- package/dist/src/services/Renderer/view.d.ts +16 -0
- package/dist/src/services/Renderer/view.js +1 -0
- package/dist/src/services/Resolver.d.ts +47 -0
- package/dist/src/services/Resolver.js +269 -0
- package/dist/src/services/Skill.d.ts +29 -0
- package/dist/src/services/Skill.js +421 -0
- package/dist/src/services/UpdateNotifier.d.ts +162 -0
- package/dist/src/services/UpdateNotifier.js +572 -0
- package/dist/test/cli/ai/ai.test.d.ts +1 -0
- package/dist/test/cli/ai/ai.test.js +507 -0
- package/dist/test/cli/ai/verbs.test.d.ts +1 -0
- package/dist/test/cli/ai/verbs.test.js +235 -0
- package/dist/test/cli/auth/login.test.d.ts +1 -0
- package/dist/test/cli/auth/login.test.js +236 -0
- package/dist/test/cli/auth/logout-whoami.test.d.ts +1 -0
- package/dist/test/cli/auth/logout-whoami.test.js +124 -0
- package/dist/test/cli/auth/status.test.d.ts +1 -0
- package/dist/test/cli/auth/status.test.js +90 -0
- package/dist/test/cli/category/category.test.d.ts +1 -0
- package/dist/test/cli/category/category.test.js +175 -0
- package/dist/test/cli/comment/comment.test.d.ts +1 -0
- package/dist/test/cli/comment/comment.test.js +445 -0
- package/dist/test/cli/config/config.test.d.ts +1 -0
- package/dist/test/cli/config/config.test.js +281 -0
- package/dist/test/cli/edit-roundtrip.test.d.ts +1 -0
- package/dist/test/cli/edit-roundtrip.test.js +259 -0
- package/dist/test/cli/file/file.test.d.ts +1 -0
- package/dist/test/cli/file/file.test.js +185 -0
- package/dist/test/cli/help.test.d.ts +1 -0
- package/dist/test/cli/help.test.js +289 -0
- package/dist/test/cli/note/create.test.d.ts +1 -0
- package/dist/test/cli/note/create.test.js +155 -0
- package/dist/test/cli/note/list.test.d.ts +1 -0
- package/dist/test/cli/note/list.test.js +115 -0
- package/dist/test/cli/note/publish.test.d.ts +1 -0
- package/dist/test/cli/note/publish.test.js +123 -0
- package/dist/test/cli/page/page.test.d.ts +1 -0
- package/dist/test/cli/page/page.test.js +185 -0
- package/dist/test/cli/post/create.test.d.ts +1 -0
- package/dist/test/cli/post/create.test.js +172 -0
- package/dist/test/cli/post/list.test.d.ts +1 -0
- package/dist/test/cli/post/list.test.js +133 -0
- package/dist/test/cli/post/publish.test.d.ts +1 -0
- package/dist/test/cli/post/publish.test.js +139 -0
- package/dist/test/cli/post/stage-apply.test.d.ts +1 -0
- package/dist/test/cli/post/stage-apply.test.js +215 -0
- package/dist/test/cli/post/update.test.d.ts +1 -0
- package/dist/test/cli/post/update.test.js +160 -0
- package/dist/test/cli/post-note-crud.test.d.ts +1 -0
- package/dist/test/cli/post-note-crud.test.js +362 -0
- package/dist/test/cli/profile/ls.test.d.ts +1 -0
- package/dist/test/cli/profile/ls.test.js +93 -0
- package/dist/test/cli/profile/mark-use.test.d.ts +1 -0
- package/dist/test/cli/profile/mark-use.test.js +216 -0
- package/dist/test/cli/project-crud.test.d.ts +1 -0
- package/dist/test/cli/project-crud.test.js +315 -0
- package/dist/test/cli/render/lexical.test.d.ts +1 -0
- package/dist/test/cli/render/lexical.test.js +216 -0
- package/dist/test/cli/render/markdown.test.d.ts +1 -0
- package/dist/test/cli/render/markdown.test.js +39 -0
- package/dist/test/cli/snippet-crud.test.d.ts +1 -0
- package/dist/test/cli/snippet-crud.test.js +293 -0
- package/dist/test/cli/topic/topic.test.d.ts +1 -0
- package/dist/test/cli/topic/topic.test.js +181 -0
- package/dist/test/cli/update.test.d.ts +1 -0
- package/dist/test/cli/update.test.js +395 -0
- package/dist/test/domain/content-spec.test.d.ts +1 -0
- package/dist/test/domain/content-spec.test.js +126 -0
- package/dist/test/domain/envelope-compat.test.d.ts +1 -0
- package/dist/test/domain/envelope-compat.test.js +126 -0
- package/dist/test/domain/envelope.test.d.ts +1 -0
- package/dist/test/domain/envelope.test.js +149 -0
- package/dist/test/domain/errors.test.d.ts +1 -0
- package/dist/test/domain/errors.test.js +127 -0
- package/dist/test/domain/gate.test.d.ts +1 -0
- package/dist/test/domain/gate.test.js +128 -0
- package/dist/test/domain/payload.test.d.ts +1 -0
- package/dist/test/domain/payload.test.js +259 -0
- package/dist/test/helper/test-fs.d.ts +24 -0
- package/dist/test/helper/test-fs.js +161 -0
- package/dist/test/helper/test-http.d.ts +31 -0
- package/dist/test/helper/test-http.js +66 -0
- package/dist/test/integration/_helpers.d.ts +5 -0
- package/dist/test/integration/_helpers.js +24 -0
- package/dist/test/integration/cli-error-envelope.test.d.ts +1 -0
- package/dist/test/integration/cli-error-envelope.test.js +137 -0
- package/dist/test/integration/cli-help-render.test.d.ts +1 -0
- package/dist/test/integration/cli-help-render.test.js +149 -0
- package/dist/test/integration/cli-help.test.d.ts +1 -0
- package/dist/test/integration/cli-help.test.js +67 -0
- package/dist/test/integration/cli-post-list.test.d.ts +1 -0
- package/dist/test/integration/cli-post-list.test.js +140 -0
- package/dist/test/integration/cli-skill.test.d.ts +1 -0
- package/dist/test/integration/cli-skill.test.js +74 -0
- package/dist/test/integration/cli-version.test.d.ts +1 -0
- package/dist/test/integration/cli-version.test.js +37 -0
- package/dist/test/services/Api.test.d.ts +1 -0
- package/dist/test/services/Api.test.js +553 -0
- package/dist/test/services/Auth.test.d.ts +1 -0
- package/dist/test/services/Auth.test.js +650 -0
- package/dist/test/services/Config.test.d.ts +1 -0
- package/dist/test/services/Config.test.js +510 -0
- package/dist/test/services/Datetime.test.d.ts +1 -0
- package/dist/test/services/Datetime.test.js +113 -0
- package/dist/test/services/Editor.test.d.ts +1 -0
- package/dist/test/services/Editor.test.js +205 -0
- package/dist/test/services/Lexical.errors.test.d.ts +1 -0
- package/dist/test/services/Lexical.errors.test.js +60 -0
- package/dist/test/services/Lexical.test.d.ts +1 -0
- package/dist/test/services/Lexical.test.js +68 -0
- package/dist/test/services/Migration.test.d.ts +1 -0
- package/dist/test/services/Migration.test.js +376 -0
- package/dist/test/services/Profile.test.d.ts +1 -0
- package/dist/test/services/Profile.test.js +277 -0
- package/dist/test/services/Renderer.test.d.ts +1 -0
- package/dist/test/services/Renderer.test.js +538 -0
- package/dist/test/services/Resolver.test.d.ts +1 -0
- package/dist/test/services/Resolver.test.js +320 -0
- package/dist/test/services/Skill.test.d.ts +1 -0
- package/dist/test/services/Skill.test.js +261 -0
- package/dist/test/services/UpdateNotifier.spawn.test.d.ts +1 -0
- package/dist/test/services/UpdateNotifier.spawn.test.js +73 -0
- package/dist/test/services/UpdateNotifier.test.d.ts +1 -0
- package/dist/test/services/UpdateNotifier.test.js +912 -0
- package/dist/vendor/litexml/cli.mjs +19 -4
- package/dist/vendor/litexml/litexml-html-preview-client.css +98 -13
- package/dist/vendor/litexml/litexml-html-preview-client.js +5794 -4976
- package/dist/vendor/litexml/style.css +5 -5
- package/package.json +29 -26
- package/skills/safety.md +1 -1
- package/LICENSE +0 -33
- package/dist/esm-CDcJmHkG.mjs +0 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Context, Layer } from 'effect';
|
|
2
|
+
import type { Generic } from '../../domain/errors';
|
|
3
|
+
import { Api, type ApiService } from '../Api';
|
|
4
|
+
import type { AiService } from './types';
|
|
5
|
+
export type * from './types';
|
|
6
|
+
export declare const make: (api: ApiService) => AiService;
|
|
7
|
+
export type _Generic = Generic;
|
|
8
|
+
declare const Ai_base: Context.TagClass<Ai, "Ai", AiService>;
|
|
9
|
+
export declare class Ai extends Ai_base {
|
|
10
|
+
static Default: Layer.Layer<Ai, never, Api>;
|
|
11
|
+
}
|
|
12
|
+
/** Build an Ai layer from an explicit ApiService (tests). */
|
|
13
|
+
export declare const layer: (api: ApiService) => Layer.Layer<Ai>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from 'effect';
|
|
2
|
+
import { Api } from '../Api';
|
|
3
|
+
import { makeOverview } from './overview';
|
|
4
|
+
import { makeByArticle, makeList, makeMatchById } from './resources';
|
|
5
|
+
import { makeCreateTask, makeWaitForTask } from './tasks';
|
|
6
|
+
export const make = (api) => {
|
|
7
|
+
const createTask = makeCreateTask(api);
|
|
8
|
+
const list = makeList(api);
|
|
9
|
+
const matchById = makeMatchById(api);
|
|
10
|
+
const byArticle = makeByArticle(api);
|
|
11
|
+
const translationsByArticle = (refId, opts) => opts?.lang
|
|
12
|
+
? api.request(`/ai/translations/article/${refId}`, {
|
|
13
|
+
query: { lang: opts.lang },
|
|
14
|
+
})
|
|
15
|
+
: api.request(`/ai/translations/ref/${refId}`);
|
|
16
|
+
return {
|
|
17
|
+
// -- generate
|
|
18
|
+
regenSummary: (input) => createTask('summary', '/ai/summaries/task', {
|
|
19
|
+
refId: input.refId,
|
|
20
|
+
...(input.targetLanguages?.length
|
|
21
|
+
? { targetLanguages: [...input.targetLanguages] }
|
|
22
|
+
: {}),
|
|
23
|
+
...(input.force ? { force: true } : {}),
|
|
24
|
+
}),
|
|
25
|
+
translate: (input) => createTask('translation', '/ai/translations/task', {
|
|
26
|
+
refId: input.refId,
|
|
27
|
+
targetLanguages: [...input.targetLanguages],
|
|
28
|
+
...(input.force ? { force: true } : {}),
|
|
29
|
+
}),
|
|
30
|
+
refreshInsights: (input) => createTask('insights', '/ai/insights/task', {
|
|
31
|
+
refId: input.refId,
|
|
32
|
+
...(input.targetLanguages?.length
|
|
33
|
+
? { targetLanguages: [...input.targetLanguages] }
|
|
34
|
+
: {}),
|
|
35
|
+
...(input.force ? { force: true } : {}),
|
|
36
|
+
}),
|
|
37
|
+
translateSummary: (input) => createTask('summary_translation', '/ai/summaries/task/translate', {
|
|
38
|
+
refId: input.refId,
|
|
39
|
+
targetLang: input.targetLang,
|
|
40
|
+
...(input.force ? { force: true } : {}),
|
|
41
|
+
}, {
|
|
42
|
+
sourceMissingHint: 'no base summary to translate — run `mxs ai summary regen` first',
|
|
43
|
+
}),
|
|
44
|
+
translateInsights: (input) => createTask('insights_translation', '/ai/insights/task/translate', {
|
|
45
|
+
refId: input.refId,
|
|
46
|
+
targetLang: input.targetLang,
|
|
47
|
+
...(input.force ? { force: true } : {}),
|
|
48
|
+
}, {
|
|
49
|
+
sourceMissingHint: 'no base insights to translate — run `mxs ai insights refresh` first',
|
|
50
|
+
}),
|
|
51
|
+
runTts: (input) => createTask('tts', '/ai/tts/task', {
|
|
52
|
+
refId: input.refId,
|
|
53
|
+
...(input.targetLanguages?.length
|
|
54
|
+
? { langs: [...input.targetLanguages] }
|
|
55
|
+
: {}),
|
|
56
|
+
...(input.force ? { force: true } : {}),
|
|
57
|
+
}),
|
|
58
|
+
waitForTask: makeWaitForTask(api),
|
|
59
|
+
// -- tts
|
|
60
|
+
listTts: list('/ai/tts', '/', '/grouped'),
|
|
61
|
+
getTtsByArticle: (refId) => api.request(`/ai/tts/ref/${refId}`),
|
|
62
|
+
discoverTtsVoices: (q) => api.request('/ai/tts/voices', {
|
|
63
|
+
query: { providerId: q.providerId, model: q.model },
|
|
64
|
+
}),
|
|
65
|
+
deleteTts: (id) => api.request(`/ai/tts/${id}`, { method: 'DELETE' }).pipe(Effect.asVoid),
|
|
66
|
+
// -- overview
|
|
67
|
+
...makeOverview(api),
|
|
68
|
+
// -- summary
|
|
69
|
+
listSummaries: list('/ai/summaries', '/', '/grouped'),
|
|
70
|
+
getSummary: (id) => matchById('/ai/summaries', id, ['summaries']),
|
|
71
|
+
getSummariesByArticle: byArticle('/ai/summaries'),
|
|
72
|
+
updateSummary: (id, patch) => api.request(`/ai/summaries/${id}`, { method: 'PATCH', body: patch }),
|
|
73
|
+
deleteSummary: (id) => api
|
|
74
|
+
.request(`/ai/summaries/${id}`, { method: 'DELETE' })
|
|
75
|
+
.pipe(Effect.asVoid),
|
|
76
|
+
// -- translation
|
|
77
|
+
listTranslations: list('/ai/translations', null, '/grouped'),
|
|
78
|
+
getTranslation: (id) => matchById('/ai/translations', id, ['translations']),
|
|
79
|
+
getTranslationsByArticle: translationsByArticle,
|
|
80
|
+
getTranslationLanguages: (refId) => api.request(`/ai/translations/article/${refId}/languages`),
|
|
81
|
+
updateTranslation: (id, patch) => api.request(`/ai/translations/${id}`, { method: 'PATCH', body: patch }),
|
|
82
|
+
deleteTranslation: (id) => api
|
|
83
|
+
.request(`/ai/translations/${id}`, { method: 'DELETE' })
|
|
84
|
+
.pipe(Effect.asVoid),
|
|
85
|
+
// -- insights
|
|
86
|
+
listInsights: list('/ai/insights', '/', '/grouped'),
|
|
87
|
+
getInsights: (id) => matchById('/ai/insights', id, ['insights']),
|
|
88
|
+
getInsightsByArticle: byArticle('/ai/insights'),
|
|
89
|
+
updateInsights: (id, patch) => api.request(`/ai/insights/${id}`, { method: 'PATCH', body: patch }),
|
|
90
|
+
deleteInsights: (id) => api
|
|
91
|
+
.request(`/ai/insights/${id}`, { method: 'DELETE' })
|
|
92
|
+
.pipe(Effect.asVoid),
|
|
93
|
+
// -- entries
|
|
94
|
+
listEntries: (q) => api.request('/ai/translations/entries', {
|
|
95
|
+
query: {
|
|
96
|
+
page: q.page,
|
|
97
|
+
size: q.size,
|
|
98
|
+
keyPath: q.keyPath,
|
|
99
|
+
lang: q.lang,
|
|
100
|
+
},
|
|
101
|
+
}),
|
|
102
|
+
generateEntries: (input) => api.request('/ai/translations/entries/generate', {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
body: {
|
|
105
|
+
...(input.keyPaths?.length ? { keyPaths: [...input.keyPaths] } : {}),
|
|
106
|
+
...(input.targetLangs?.length
|
|
107
|
+
? { targetLangs: [...input.targetLangs] }
|
|
108
|
+
: {}),
|
|
109
|
+
},
|
|
110
|
+
}),
|
|
111
|
+
updateEntry: (id, patch) => api.request(`/ai/translations/entries/${id}`, {
|
|
112
|
+
method: 'PATCH',
|
|
113
|
+
body: patch,
|
|
114
|
+
}),
|
|
115
|
+
deleteEntry: (id) => api
|
|
116
|
+
.request(`/ai/translations/entries/${id}`, { method: 'DELETE' })
|
|
117
|
+
.pipe(Effect.asVoid),
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
export class Ai extends Context.Tag('Ai')() {
|
|
121
|
+
static Default = Layer.effect(Ai, Effect.gen(function* () {
|
|
122
|
+
const api = yield* Api;
|
|
123
|
+
return make(api);
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/** Build an Ai layer from an explicit ApiService (tests). */
|
|
127
|
+
export const layer = (api) => Layer.succeed(Ai, make(api));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Effect } from 'effect';
|
|
2
|
+
import type { ApiError, ApiService } from '../Api';
|
|
3
|
+
import type { AiOverviewListQuery } from './types';
|
|
4
|
+
export declare const makeOverview: (api: ApiService) => {
|
|
5
|
+
listOverview: (q: AiOverviewListQuery) => Effect.Effect<unknown, ApiError>;
|
|
6
|
+
getOverviewByArticle: (refId: string) => Effect.Effect<unknown, ApiError>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const makeOverview = (api) => ({
|
|
2
|
+
listOverview: (q) => api.request('/ai/overview/grouped', {
|
|
3
|
+
query: {
|
|
4
|
+
page: q.page,
|
|
5
|
+
size: q.size,
|
|
6
|
+
search: q.search,
|
|
7
|
+
type: q.type,
|
|
8
|
+
},
|
|
9
|
+
}),
|
|
10
|
+
getOverviewByArticle: (refId) => api.request(`/ai/overview/article/${refId}`),
|
|
11
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { AiRecordNotFound } from '../../domain/errors';
|
|
3
|
+
import type { ApiError, ApiService } from '../Api';
|
|
4
|
+
import type { AiByArticleOptions, AiListQuery } from './types';
|
|
5
|
+
export declare const makeList: (api: ApiService) => <Q extends AiListQuery>(base: string, flatPath: string | null, groupedPath: string) => (q: Q) => Effect.Effect<unknown, ApiError>;
|
|
6
|
+
export declare const makeMatchById: (api: ApiService) => (base: string, id: string, itemKeys: ReadonlyArray<string>) => Effect.Effect<unknown, AiRecordNotFound | ApiError>;
|
|
7
|
+
export declare const makeByArticle: (api: ApiService) => (base: string) => (refId: string, opts?: AiByArticleOptions) => Effect.Effect<unknown, ApiError>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { AiRecordNotFound } from '../../domain/errors';
|
|
3
|
+
import { asRecord, unwrapData } from './shared';
|
|
4
|
+
export const makeList = (api) => (base, flatPath, groupedPath) => (q) => api.request(q.grouped || flatPath === null
|
|
5
|
+
? `${base}${groupedPath}`
|
|
6
|
+
: `${base}${flatPath}`, {
|
|
7
|
+
query: {
|
|
8
|
+
page: q.page,
|
|
9
|
+
size: q.size,
|
|
10
|
+
search: q.search,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
const groupedItems = (group, itemKeys) => {
|
|
14
|
+
const record = asRecord(group);
|
|
15
|
+
for (const key of itemKeys) {
|
|
16
|
+
const value = record[key];
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
};
|
|
22
|
+
export const makeMatchById = (api) => (base, id, itemKeys) => Effect.gen(function* () {
|
|
23
|
+
// Try grouped pagination; flatten and match by id. Capped scan to avoid
|
|
24
|
+
// unbounded pagination on enormous datasets.
|
|
25
|
+
const MAX_PAGES = 50;
|
|
26
|
+
const SIZE = 50;
|
|
27
|
+
for (let page = 1; page <= MAX_PAGES; page++) {
|
|
28
|
+
const raw = yield* api.request(`${base}/grouped`, {
|
|
29
|
+
query: { page, size: SIZE },
|
|
30
|
+
});
|
|
31
|
+
const data = unwrapData(raw);
|
|
32
|
+
const groups = Array.isArray(data) ? data : [];
|
|
33
|
+
for (const group of groups) {
|
|
34
|
+
for (const item of groupedItems(group, itemKeys)) {
|
|
35
|
+
const r = asRecord(item);
|
|
36
|
+
if (typeof r.id === 'string' && r.id === id)
|
|
37
|
+
return item;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const pagination = asRecord(asRecord(asRecord(raw).meta).pagination);
|
|
41
|
+
const totalPages = typeof pagination.totalPages === 'number'
|
|
42
|
+
? pagination.totalPages
|
|
43
|
+
: groups.length < SIZE
|
|
44
|
+
? page
|
|
45
|
+
: page + 1;
|
|
46
|
+
if (page >= totalPages)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
return yield* Effect.fail(new AiRecordNotFound({
|
|
50
|
+
message: `AI record not found: ${id}`,
|
|
51
|
+
ref: id,
|
|
52
|
+
}));
|
|
53
|
+
});
|
|
54
|
+
export const makeByArticle = (api) => (base) => (refId, opts) => api.request(`${base}/article/${refId}`, {
|
|
55
|
+
query: {
|
|
56
|
+
lang: opts?.lang,
|
|
57
|
+
onlyDb: opts?.onlyDb,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const unwrapData = (raw) => {
|
|
2
|
+
if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
|
|
3
|
+
const env = raw;
|
|
4
|
+
if ('data' in env)
|
|
5
|
+
return env.data;
|
|
6
|
+
}
|
|
7
|
+
return raw;
|
|
8
|
+
};
|
|
9
|
+
export const asRecord = (value) => value && typeof value === 'object' && !Array.isArray(value)
|
|
10
|
+
? value
|
|
11
|
+
: {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { AiTaskCreateFailed, AiTaskFailed } from '../../domain/errors';
|
|
3
|
+
import type { ApiError, ApiService } from '../Api';
|
|
4
|
+
import type { AiTaskCreateResult, AiTaskFinalView, AiTaskType, AiWaitOptions } from './types';
|
|
5
|
+
export declare const makeCreateTask: (api: ApiService) => (type: AiTaskType, path: string, body: Record<string, unknown>, opts?: {
|
|
6
|
+
sourceMissingHint?: string;
|
|
7
|
+
}) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
8
|
+
export declare const makeWaitForTask: (api: ApiService) => (taskId: string, options: AiWaitOptions) => Effect.Effect<AiTaskFinalView, AiTaskFailed | ApiError>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { AiTaskCreateFailed, AiTaskFailed } from '../../domain/errors';
|
|
3
|
+
import { asRecord, unwrapData } from './shared';
|
|
4
|
+
const readCreateTask = (raw) => {
|
|
5
|
+
const inner = asRecord(unwrapData(raw));
|
|
6
|
+
return {
|
|
7
|
+
taskId: typeof inner.taskId === 'string' ? inner.taskId : undefined,
|
|
8
|
+
created: typeof inner.created === 'boolean' ? inner.created : undefined,
|
|
9
|
+
reason: typeof inner.reason === 'string' ? inner.reason : undefined,
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
const readTaskRecord = (raw) => {
|
|
13
|
+
const inner = asRecord(unwrapData(raw));
|
|
14
|
+
const result = asRecord(inner.result);
|
|
15
|
+
const payload = asRecord(inner.payload);
|
|
16
|
+
const errField = inner.error;
|
|
17
|
+
return {
|
|
18
|
+
status: typeof inner.status === 'string'
|
|
19
|
+
? inner.status
|
|
20
|
+
: undefined,
|
|
21
|
+
totalCost: typeof inner.totalCost === 'number' || typeof inner.totalCost === 'string'
|
|
22
|
+
? inner.totalCost
|
|
23
|
+
: undefined,
|
|
24
|
+
totalTokens: typeof inner.totalTokens === 'number' ||
|
|
25
|
+
typeof inner.totalTokens === 'string'
|
|
26
|
+
? inner.totalTokens
|
|
27
|
+
: undefined,
|
|
28
|
+
resultIds: Array.isArray(inner.resultIds)
|
|
29
|
+
? inner.resultIds
|
|
30
|
+
: Array.isArray(result.resultIds)
|
|
31
|
+
? result.resultIds
|
|
32
|
+
: undefined,
|
|
33
|
+
payload: {
|
|
34
|
+
refId: typeof payload.refId === 'string' ? payload.refId : undefined,
|
|
35
|
+
targetLanguages: Array.isArray(payload.targetLanguages)
|
|
36
|
+
? payload.targetLanguages
|
|
37
|
+
: undefined,
|
|
38
|
+
},
|
|
39
|
+
error: typeof errField === 'string'
|
|
40
|
+
? { message: errField }
|
|
41
|
+
: errField && typeof errField === 'object'
|
|
42
|
+
? errField
|
|
43
|
+
: undefined,
|
|
44
|
+
errorMessage: typeof inner.errorMessage === 'string' ? inner.errorMessage : undefined,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const toNumber = (v) => {
|
|
48
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
49
|
+
return v;
|
|
50
|
+
if (typeof v === 'string' && v.trim() !== '') {
|
|
51
|
+
const n = Number(v);
|
|
52
|
+
if (Number.isFinite(n))
|
|
53
|
+
return n;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
};
|
|
57
|
+
const TERMINAL = new Set([
|
|
58
|
+
'completed',
|
|
59
|
+
'partial_failed',
|
|
60
|
+
'succeeded',
|
|
61
|
+
'failed',
|
|
62
|
+
'cancelled',
|
|
63
|
+
]);
|
|
64
|
+
const DEFAULT_POLL_MS = 1000;
|
|
65
|
+
const resolvePollMs = (override) => {
|
|
66
|
+
const envRaw = process.env.MXS_AI_POLL_MS;
|
|
67
|
+
if (override && override > 0)
|
|
68
|
+
return override;
|
|
69
|
+
if (envRaw) {
|
|
70
|
+
const n = Number(envRaw);
|
|
71
|
+
if (Number.isFinite(n) && n > 0)
|
|
72
|
+
return n;
|
|
73
|
+
}
|
|
74
|
+
return DEFAULT_POLL_MS;
|
|
75
|
+
};
|
|
76
|
+
export const makeCreateTask = (api) => (type, path, body, opts) => Effect.gen(function* () {
|
|
77
|
+
const raw = yield* api.request(path, { method: 'POST', body });
|
|
78
|
+
const env = readCreateTask(raw);
|
|
79
|
+
if (!env.taskId) {
|
|
80
|
+
return yield* Effect.fail(new AiTaskCreateFailed({
|
|
81
|
+
message: env.reason === 'source-missing' && opts?.sourceMissingHint
|
|
82
|
+
? opts.sourceMissingHint
|
|
83
|
+
: 'server returned no taskId',
|
|
84
|
+
details: raw,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
taskId: env.taskId,
|
|
89
|
+
created: env.created ?? true,
|
|
90
|
+
type,
|
|
91
|
+
refId: typeof body.refId === 'string' ? body.refId : '',
|
|
92
|
+
targetLanguages: Array.isArray(body.targetLanguages)
|
|
93
|
+
? body.targetLanguages
|
|
94
|
+
: Array.isArray(body.langs)
|
|
95
|
+
? body.langs
|
|
96
|
+
: typeof body.targetLang === 'string'
|
|
97
|
+
? [body.targetLang]
|
|
98
|
+
: undefined,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
export const makeWaitForTask = (api) => (taskId, options) => Effect.gen(function* () {
|
|
102
|
+
const pollMs = resolvePollMs(options.pollMs);
|
|
103
|
+
let lastStatus;
|
|
104
|
+
const pollOnce = () => api.request(`/tasks/${taskId}`).pipe(Effect.flatMap((raw) => {
|
|
105
|
+
const rec = readTaskRecord(raw);
|
|
106
|
+
const status = (rec.status ?? 'pending');
|
|
107
|
+
if (status !== lastStatus) {
|
|
108
|
+
lastStatus = status;
|
|
109
|
+
options.onProgress?.(`[ai] task ${status}…`);
|
|
110
|
+
}
|
|
111
|
+
if (TERMINAL.has(status))
|
|
112
|
+
return Effect.succeed({ rec, status });
|
|
113
|
+
return Effect.sleep(`${pollMs} millis`).pipe(Effect.flatMap(() => pollOnce()));
|
|
114
|
+
}));
|
|
115
|
+
const { rec, status } = yield* pollOnce();
|
|
116
|
+
const final = {
|
|
117
|
+
type: options.type,
|
|
118
|
+
taskId,
|
|
119
|
+
status,
|
|
120
|
+
refId: rec.payload?.refId,
|
|
121
|
+
targetLanguages: rec.payload?.targetLanguages,
|
|
122
|
+
totalTokens: toNumber(rec.totalTokens),
|
|
123
|
+
totalCost: toNumber(rec.totalCost),
|
|
124
|
+
resultIds: rec.resultIds,
|
|
125
|
+
error: typeof rec.error === 'object'
|
|
126
|
+
? rec.error.message
|
|
127
|
+
? { message: rec.error.message }
|
|
128
|
+
: undefined
|
|
129
|
+
: rec.errorMessage
|
|
130
|
+
? { message: rec.errorMessage }
|
|
131
|
+
: undefined,
|
|
132
|
+
};
|
|
133
|
+
if (status === 'failed' ||
|
|
134
|
+
status === 'cancelled' ||
|
|
135
|
+
status === 'partial_failed') {
|
|
136
|
+
return yield* Effect.fail(new AiTaskFailed({
|
|
137
|
+
taskId,
|
|
138
|
+
status,
|
|
139
|
+
message: final.error?.message ?? `AI task ${status} (id=${taskId})`,
|
|
140
|
+
details: final,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
return final;
|
|
144
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { Effect } from 'effect';
|
|
2
|
+
import type { AiRecordNotFound, AiTaskCreateFailed, AiTaskFailed } from '../../domain/errors';
|
|
3
|
+
import type { ApiError } from '../Api';
|
|
4
|
+
export type AiTaskType = 'summary' | 'summary_translation' | 'translation' | 'insights' | 'insights_translation' | 'tts';
|
|
5
|
+
export type AiTaskStatus = 'pending' | 'queued' | 'running' | 'completed' | 'partial_failed' | 'succeeded' | 'failed' | 'cancelled';
|
|
6
|
+
export interface AiTaskCreateResult {
|
|
7
|
+
readonly taskId: string;
|
|
8
|
+
readonly created: boolean;
|
|
9
|
+
readonly type: AiTaskType;
|
|
10
|
+
readonly refId: string;
|
|
11
|
+
readonly targetLanguages?: ReadonlyArray<string>;
|
|
12
|
+
}
|
|
13
|
+
export interface AiTaskFinalView {
|
|
14
|
+
readonly type: AiTaskType;
|
|
15
|
+
readonly taskId: string;
|
|
16
|
+
readonly status: AiTaskStatus;
|
|
17
|
+
readonly refId?: string;
|
|
18
|
+
readonly targetLanguages?: ReadonlyArray<string>;
|
|
19
|
+
readonly totalTokens?: number;
|
|
20
|
+
readonly totalCost?: number;
|
|
21
|
+
readonly resultIds?: ReadonlyArray<string>;
|
|
22
|
+
readonly error?: {
|
|
23
|
+
readonly message: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface AiTaskCreateInput {
|
|
27
|
+
readonly refId: string;
|
|
28
|
+
readonly targetLanguages?: ReadonlyArray<string>;
|
|
29
|
+
readonly force?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface AiTaskTranslateInput {
|
|
32
|
+
readonly refId: string;
|
|
33
|
+
readonly targetLanguages: ReadonlyArray<string>;
|
|
34
|
+
readonly force?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface AiSingleTranslateInput {
|
|
37
|
+
readonly refId: string;
|
|
38
|
+
readonly targetLang: string;
|
|
39
|
+
readonly force?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface AiWaitOptions {
|
|
42
|
+
readonly type: AiTaskType;
|
|
43
|
+
readonly pollMs?: number;
|
|
44
|
+
/** Stderr progress emitter; receives a transition message per state change. */
|
|
45
|
+
readonly onProgress?: (message: string) => void;
|
|
46
|
+
}
|
|
47
|
+
export interface AiListQuery {
|
|
48
|
+
readonly page?: number;
|
|
49
|
+
readonly size?: number;
|
|
50
|
+
readonly grouped?: boolean;
|
|
51
|
+
readonly search?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface AiVoicesQuery {
|
|
54
|
+
readonly providerId: string;
|
|
55
|
+
readonly model: string;
|
|
56
|
+
}
|
|
57
|
+
export type AiOverviewType = 'post' | 'note' | 'page';
|
|
58
|
+
export interface AiOverviewListQuery {
|
|
59
|
+
readonly page?: number;
|
|
60
|
+
readonly size?: number;
|
|
61
|
+
readonly search?: string;
|
|
62
|
+
readonly type?: AiOverviewType;
|
|
63
|
+
}
|
|
64
|
+
export interface AiEntryListQuery {
|
|
65
|
+
readonly page?: number;
|
|
66
|
+
readonly size?: number;
|
|
67
|
+
readonly keyPath?: string;
|
|
68
|
+
readonly lang?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface AiEntryGenerateInput {
|
|
71
|
+
readonly keyPaths?: ReadonlyArray<string>;
|
|
72
|
+
readonly targetLangs?: ReadonlyArray<string>;
|
|
73
|
+
}
|
|
74
|
+
export interface AiSummaryPatch {
|
|
75
|
+
readonly summary: string;
|
|
76
|
+
}
|
|
77
|
+
export interface AiInsightsPatch {
|
|
78
|
+
readonly content: string;
|
|
79
|
+
}
|
|
80
|
+
export interface AiTranslationPatch {
|
|
81
|
+
title?: string;
|
|
82
|
+
text?: string;
|
|
83
|
+
subtitle?: string | null;
|
|
84
|
+
summary?: string;
|
|
85
|
+
tags?: ReadonlyArray<string>;
|
|
86
|
+
content?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface AiEntryPatch {
|
|
89
|
+
readonly translatedText: string;
|
|
90
|
+
}
|
|
91
|
+
export interface AiByArticleOptions {
|
|
92
|
+
readonly lang?: string;
|
|
93
|
+
readonly onlyDb?: boolean;
|
|
94
|
+
}
|
|
95
|
+
export type AiServiceError = ApiError | AiTaskCreateFailed | AiTaskFailed | AiRecordNotFound;
|
|
96
|
+
export interface AiService {
|
|
97
|
+
readonly regenSummary: (input: AiTaskCreateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
98
|
+
readonly translate: (input: AiTaskTranslateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
99
|
+
readonly refreshInsights: (input: AiTaskCreateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
100
|
+
readonly translateSummary: (input: AiSingleTranslateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
101
|
+
readonly translateInsights: (input: AiSingleTranslateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
102
|
+
readonly runTts: (input: AiTaskCreateInput) => Effect.Effect<AiTaskCreateResult, AiTaskCreateFailed | ApiError>;
|
|
103
|
+
readonly waitForTask: (taskId: string, options: AiWaitOptions) => Effect.Effect<AiTaskFinalView, AiTaskFailed | ApiError>;
|
|
104
|
+
readonly listSummaries: (q: AiListQuery) => Effect.Effect<unknown, ApiError>;
|
|
105
|
+
readonly getSummary: (id: string) => Effect.Effect<unknown, AiRecordNotFound | ApiError>;
|
|
106
|
+
readonly getSummariesByArticle: (refId: string, opts?: AiByArticleOptions) => Effect.Effect<unknown, ApiError>;
|
|
107
|
+
readonly updateSummary: (id: string, patch: AiSummaryPatch) => Effect.Effect<unknown, ApiError>;
|
|
108
|
+
readonly deleteSummary: (id: string) => Effect.Effect<void, ApiError>;
|
|
109
|
+
readonly listTranslations: (q: AiListQuery) => Effect.Effect<unknown, ApiError>;
|
|
110
|
+
readonly getTranslation: (id: string) => Effect.Effect<unknown, AiRecordNotFound | ApiError>;
|
|
111
|
+
readonly getTranslationsByArticle: (refId: string, opts?: AiByArticleOptions) => Effect.Effect<unknown, ApiError>;
|
|
112
|
+
readonly getTranslationLanguages: (refId: string) => Effect.Effect<unknown, ApiError>;
|
|
113
|
+
readonly updateTranslation: (id: string, patch: AiTranslationPatch) => Effect.Effect<unknown, ApiError>;
|
|
114
|
+
readonly deleteTranslation: (id: string) => Effect.Effect<void, ApiError>;
|
|
115
|
+
readonly listInsights: (q: AiListQuery) => Effect.Effect<unknown, ApiError>;
|
|
116
|
+
readonly getInsights: (id: string) => Effect.Effect<unknown, AiRecordNotFound | ApiError>;
|
|
117
|
+
readonly getInsightsByArticle: (refId: string, opts?: AiByArticleOptions) => Effect.Effect<unknown, ApiError>;
|
|
118
|
+
readonly updateInsights: (id: string, patch: AiInsightsPatch) => Effect.Effect<unknown, ApiError>;
|
|
119
|
+
readonly deleteInsights: (id: string) => Effect.Effect<void, ApiError>;
|
|
120
|
+
readonly listTts: (q: AiListQuery) => Effect.Effect<unknown, ApiError>;
|
|
121
|
+
readonly getTtsByArticle: (refId: string) => Effect.Effect<unknown, ApiError>;
|
|
122
|
+
readonly discoverTtsVoices: (q: AiVoicesQuery) => Effect.Effect<unknown, ApiError>;
|
|
123
|
+
readonly deleteTts: (id: string) => Effect.Effect<void, ApiError>;
|
|
124
|
+
readonly listOverview: (q: AiOverviewListQuery) => Effect.Effect<unknown, ApiError>;
|
|
125
|
+
readonly getOverviewByArticle: (refId: string) => Effect.Effect<unknown, ApiError>;
|
|
126
|
+
readonly listEntries: (q: AiEntryListQuery) => Effect.Effect<unknown, ApiError>;
|
|
127
|
+
readonly generateEntries: (input: AiEntryGenerateInput) => Effect.Effect<unknown, ApiError>;
|
|
128
|
+
readonly updateEntry: (id: string, patch: AiEntryPatch) => Effect.Effect<unknown, ApiError>;
|
|
129
|
+
readonly deleteEntry: (id: string) => Effect.Effect<void, ApiError>;
|
|
130
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { HttpClient } from '@effect/platform';
|
|
2
|
+
import type { Schema } from 'effect';
|
|
3
|
+
import { Context, Effect, Layer } from 'effect';
|
|
4
|
+
import { AuthDenied, AuthExpired, Generic, NetworkDns, NetworkRefused, NetworkTimeout, ResourceNotFound, ServerError, ValidationFailed, WriteRequiresExplicit } from '../domain/errors';
|
|
5
|
+
import { Auth } from './Auth';
|
|
6
|
+
import { Config, type StoreOverrides } from './Config';
|
|
7
|
+
export type ApiMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
|
|
8
|
+
export interface ApiRequestOptions<A = unknown, I = unknown> {
|
|
9
|
+
readonly method?: ApiMethod;
|
|
10
|
+
readonly body?: unknown;
|
|
11
|
+
readonly query?: Readonly<Record<string, unknown>>;
|
|
12
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
13
|
+
readonly signal?: AbortSignal;
|
|
14
|
+
/**
|
|
15
|
+
* Decoder for the response payload. When omitted, the raw parsed body is
|
|
16
|
+
* returned (likely an object or string, never undefined for non-204
|
|
17
|
+
* responses).
|
|
18
|
+
*/
|
|
19
|
+
readonly schema?: Schema.Schema<A, I>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Per-run overrides + UX flags that Wave 2 command code can supply when
|
|
23
|
+
* instantiating the Api layer via `Api.layer(...)`.
|
|
24
|
+
*
|
|
25
|
+
* - `overrides`: passed straight to `Config.resolve` — supports the global
|
|
26
|
+
* flags `--api-url`, `--token`, `--api-key`, `--profile` and their env
|
|
27
|
+
* equivalents.
|
|
28
|
+
* - `verbose` / `quiet`: control the production banner and `METHOD URL →
|
|
29
|
+
* STATUS (Xms)` verbose log lines; they match the today's CLI behavior.
|
|
30
|
+
*/
|
|
31
|
+
export interface ApiOptions {
|
|
32
|
+
readonly overrides?: StoreOverrides;
|
|
33
|
+
readonly verbose?: boolean;
|
|
34
|
+
readonly quiet?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* When true, short-circuit writes (POST / PATCH / PUT / DELETE) BEFORE any
|
|
37
|
+
* network call. The body that would have been sent is surfaced via the
|
|
38
|
+
* returned value (`{ ok: true, dryRun: true, ... }`); reads pass through
|
|
39
|
+
* unchanged. Mirrors the v0.2.x `--dry-run` global flag.
|
|
40
|
+
*/
|
|
41
|
+
readonly dryRun?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* When set, append `?lang=<code>` to GET / read-only requests so the server
|
|
44
|
+
* returns the localized variant. Writes are untouched. Mirrors the v0.2.x
|
|
45
|
+
* `--lang <code>` flag.
|
|
46
|
+
*/
|
|
47
|
+
readonly lang?: string;
|
|
48
|
+
}
|
|
49
|
+
export type ApiError = AuthExpired | AuthDenied | ValidationFailed | ResourceNotFound | ServerError | NetworkTimeout | NetworkDns | NetworkRefused | WriteRequiresExplicit | Generic;
|
|
50
|
+
export interface ApiService {
|
|
51
|
+
/** Issue a request against the active profile's `apiBase`. */
|
|
52
|
+
readonly request: <A = unknown, I = unknown>(path: string, options?: ApiRequestOptions<A, I>) => Effect.Effect<A, ApiError>;
|
|
53
|
+
/** Lower-level helper returning the raw parsed body without schema decoding. */
|
|
54
|
+
readonly raw: (path: string, options?: Omit<ApiRequestOptions, 'schema'>) => Effect.Effect<unknown, ApiError>;
|
|
55
|
+
}
|
|
56
|
+
declare const Api_base: Context.TagClass<Api, "Api", ApiService>;
|
|
57
|
+
export declare class Api extends Api_base {
|
|
58
|
+
/**
|
|
59
|
+
* Default Layer: no overrides, banner + verbose enabled per env / config.
|
|
60
|
+
* Wave 2 entry-point (`bin/mxs.ts`) should use `Api.layer({...})` to wire
|
|
61
|
+
* flag-derived overrides through.
|
|
62
|
+
*/
|
|
63
|
+
static Default: Layer.Layer<Api, never, Config | Auth | HttpClient.HttpClient>;
|
|
64
|
+
/** Build an Api Layer with command-specified overrides + UX flags. */
|
|
65
|
+
static layer(opts: ApiOptions): Layer.Layer<Api, never, Config | Auth | HttpClient.HttpClient>;
|
|
66
|
+
}
|
|
67
|
+
export {};
|