@loicngr/kobo 1.6.14 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/README.md +4 -3
  2. package/dist/mcp-server/kobo-tasks-server.js +51 -0
  3. package/dist/server/db/migrations.js +40 -0
  4. package/dist/server/db/schema.js +7 -5
  5. package/dist/server/index.js +12 -11
  6. package/dist/server/routes/workspaces.js +207 -26
  7. package/dist/server/services/agent/engines/claude-code/capabilities.js +1 -1
  8. package/dist/server/services/agent/engines/claude-code/engine.js +237 -132
  9. package/dist/server/services/agent/engines/claude-code/event-mapper.js +234 -0
  10. package/dist/server/services/agent/engines/claude-code/options-builder.js +68 -0
  11. package/dist/server/services/agent/engines/claude-code/precompact-hook.js +27 -0
  12. package/dist/server/services/agent/engines/types.js +1 -0
  13. package/dist/server/services/agent/orchestrator.js +536 -94
  14. package/dist/server/services/agent/session-controller.js +14 -43
  15. package/dist/server/services/auto-loop-service.js +17 -6
  16. package/dist/server/services/content-migration-service.js +24 -94
  17. package/dist/server/services/usage/poller.js +4 -1
  18. package/dist/server/services/wakeup-service.js +8 -9
  19. package/dist/server/services/workspace-service.js +40 -36
  20. package/dist/server/utils/git-ops.js +67 -5
  21. package/package.json +2 -1
  22. package/src/client/dist/spa/assets/ActivityFeed-CIJPN8TH.js +7 -0
  23. package/src/client/dist/spa/assets/ActivityFeed-LXnbg3ff.css +1 -0
  24. package/src/client/dist/spa/assets/ClosePopup-DzB3mDtj.js +1 -0
  25. package/src/client/dist/spa/assets/CreatePage-BE3xfQsC.css +1 -0
  26. package/src/client/dist/spa/assets/CreatePage-U6TtJzNe.js +2 -0
  27. package/src/client/dist/spa/assets/DiffViewer-D1Sdu307.css +1 -0
  28. package/src/client/dist/spa/assets/DiffViewer-Di85TBIi.js +7 -0
  29. package/src/client/dist/spa/assets/HealthPage-B7aWFxAZ.js +1 -0
  30. package/src/client/dist/spa/assets/{MainLayout-C3TUaYvQ.js → MainLayout-BHBrz4c9.js} +17 -17
  31. package/src/client/dist/spa/assets/MainLayout-Dba6SdpU.css +1 -0
  32. package/src/client/dist/spa/assets/QCheckbox-CcY7ZSk9.js +1 -0
  33. package/src/client/dist/spa/assets/QChip-BhT0W2Dg.js +1 -0
  34. package/src/client/dist/spa/assets/QExpansionItem-VS4b4eY6.js +1 -0
  35. package/src/client/dist/spa/assets/QInput-D4WJro4e.js +1 -0
  36. package/src/client/dist/spa/assets/QMenu-CchbRXbp.js +1 -0
  37. package/src/client/dist/spa/assets/{QPage-yqdKDG7-.js → QPage-Cu7zkfc6.js} +1 -1
  38. package/src/client/dist/spa/assets/QRadio-DaZhdLCg.js +1 -0
  39. package/src/client/dist/spa/assets/QResizeObserver-Cf79V-VZ.js +1 -0
  40. package/src/client/dist/spa/assets/QScrollArea-DrVTDLU0.js +1 -0
  41. package/src/client/dist/spa/assets/QTabPanels-HXz-evuj.js +1 -0
  42. package/src/client/dist/spa/assets/QToggle-CGpiJLDJ.js +1 -0
  43. package/src/client/dist/spa/assets/QTooltip-DjJYMTkN.js +1 -0
  44. package/src/client/dist/spa/assets/SearchPage-CVm-sqxH.js +1 -0
  45. package/src/client/dist/spa/assets/SettingsPage-ayDKGo9H.js +1 -0
  46. package/src/client/dist/spa/assets/SettingsPage-wTBCvK6t.css +1 -0
  47. package/src/client/dist/spa/assets/WorkspacePage-DQxGe62K.css +1 -0
  48. package/src/client/dist/spa/assets/WorkspacePage-xaVy8s5i.js +4 -0
  49. package/src/client/dist/spa/assets/build-path-tree-CdY1A6aP.js +1 -0
  50. package/src/client/dist/spa/assets/{cssMode-wNaxOrgG.js → cssMode-BVNBMOxh.js} +1 -1
  51. package/src/client/dist/spa/assets/documents-D6A3wRry.js +1 -0
  52. package/src/client/dist/spa/assets/{editor.api-CcDntllS.js → editor.api-D6Vfp5yv.js} +1 -1
  53. package/src/client/dist/spa/assets/{editor.main-Chu4hc0J.js → editor.main-CTCYF6V4.js} +3 -3
  54. package/src/client/dist/spa/assets/{expand-template-CcQus77v.js → expand-template-vHV2iwXf.js} +1 -1
  55. package/src/client/dist/spa/assets/{formatters-CX2gvLFv.js → formatters-ejxELb0M.js} +1 -1
  56. package/src/client/dist/spa/assets/{freemarker2-CO_b202E.js → freemarker2-nmzwPmzi.js} +1 -1
  57. package/src/client/dist/spa/assets/{handlebars-CJnTWNLs.js → handlebars-CI9lR7Ef.js} +1 -1
  58. package/src/client/dist/spa/assets/{html-DeArYseI.js → html-BQ21REnv.js} +1 -1
  59. package/src/client/dist/spa/assets/{htmlMode-BnNgEgdx.js → htmlMode-io5J5Qr1.js} +1 -1
  60. package/src/client/dist/spa/assets/i18n-Do8Kn8n0.js +1 -0
  61. package/src/client/dist/spa/assets/index-C_e7KOYh.js +2 -0
  62. package/src/client/dist/spa/assets/{javascript-C0pxfNu4.js → javascript--u9PDBCv.js} +1 -1
  63. package/src/client/dist/spa/assets/{jsonMode-ety87201.js → jsonMode-DBG5llk4.js} +1 -1
  64. package/src/client/dist/spa/assets/{kobo-commands-Cpl4IFon.js → kobo-commands-DiUm1Y34.js} +1 -1
  65. package/src/client/dist/spa/assets/{liquid-kanevKvC.js → liquid-DxAS4nYF.js} +1 -1
  66. package/src/client/dist/spa/assets/marked.esm-DuOsJx63.js +60 -0
  67. package/src/client/dist/spa/assets/{mdx-DkmtbRD7.js → mdx-BNXTiODW.js} +1 -1
  68. package/src/client/dist/spa/assets/models-DNYEhFF7.js +1 -0
  69. package/src/client/dist/spa/assets/{monaco.contribution-DsZsua59.js → monaco.contribution-CT3LAK0J.js} +2 -2
  70. package/src/client/dist/spa/assets/{python-DrxH1xl7.js → python-DztNww13.js} +1 -1
  71. package/src/client/dist/spa/assets/{razor-CU4khv8N.js → razor-Cyr82NZF.js} +1 -1
  72. package/src/client/dist/spa/assets/settings-Dbx1_ksA.js +1 -0
  73. package/src/client/dist/spa/assets/symbols-BVRrMH2r.js +1 -0
  74. package/src/client/dist/spa/assets/touch-Co9pfjUU.js +1 -0
  75. package/src/client/dist/spa/assets/{tsMode-CQ5yxoz_.js → tsMode-CbQVgsIP.js} +1 -1
  76. package/src/client/dist/spa/assets/{typescript-CSwKmP7l.js → typescript-UHOe4d1S.js} +1 -1
  77. package/src/client/dist/spa/assets/use-checkbox-DzHmcu7s.js +1 -0
  78. package/src/client/dist/spa/assets/use-id-CDuXkR0Z.js +1 -0
  79. package/src/client/dist/spa/assets/use-panel-Br8QNRMk.js +1 -0
  80. package/src/client/dist/spa/assets/{xml-9bnWANPJ.js → xml-DC88eFpV.js} +1 -1
  81. package/src/client/dist/spa/assets/{yaml-sUtDJGxo.js → yaml-DSTsIRJr.js} +1 -1
  82. package/src/client/dist/spa/index.html +11 -10
  83. package/src/mcp-server/kobo-tasks-server.ts +60 -1
  84. package/dist/server/services/agent/engines/claude-code/args-builder.js +0 -57
  85. package/dist/server/services/agent/engines/claude-code/mcp-config.js +0 -23
  86. package/dist/server/services/agent/engines/claude-code/stream-parser.js +0 -386
  87. package/src/client/dist/spa/assets/ActivityFeed-Be0QQryJ.css +0 -1
  88. package/src/client/dist/spa/assets/ActivityFeed-BtIOkIy6.js +0 -8
  89. package/src/client/dist/spa/assets/ClosePopup-DkLittac.js +0 -1
  90. package/src/client/dist/spa/assets/CreatePage-D6Q3nxkX.js +0 -2
  91. package/src/client/dist/spa/assets/CreatePage-DJbZH8wp.css +0 -1
  92. package/src/client/dist/spa/assets/DiffViewer-1s165rFm.css +0 -1
  93. package/src/client/dist/spa/assets/DiffViewer-D5u9p7il.js +0 -2
  94. package/src/client/dist/spa/assets/HealthPage-Cr7aAUy6.js +0 -1
  95. package/src/client/dist/spa/assets/MainLayout-CBnSwSfy.css +0 -1
  96. package/src/client/dist/spa/assets/QChip-bl3YRhax.js +0 -1
  97. package/src/client/dist/spa/assets/QExpansionItem-CWw6ZujM.js +0 -1
  98. package/src/client/dist/spa/assets/QScrollArea-DpCqRRE0.js +0 -1
  99. package/src/client/dist/spa/assets/QSeparator-DNSiXYrN.js +0 -1
  100. package/src/client/dist/spa/assets/QSlideTransition-BQxI8l5r.js +0 -1
  101. package/src/client/dist/spa/assets/QTabPanels-C4bZGqml.js +0 -1
  102. package/src/client/dist/spa/assets/QTooltip-BIDjo2hJ.js +0 -1
  103. package/src/client/dist/spa/assets/SearchPage-CavRaij6.js +0 -1
  104. package/src/client/dist/spa/assets/SettingsPage-B8DhSZw7.css +0 -1
  105. package/src/client/dist/spa/assets/SettingsPage-C13T1l_t.js +0 -1
  106. package/src/client/dist/spa/assets/TouchPan-vsl78kxF.js +0 -1
  107. package/src/client/dist/spa/assets/WorkspacePage-BEqEuPrb.js +0 -4
  108. package/src/client/dist/spa/assets/WorkspacePage-k2pgeRoy.css +0 -1
  109. package/src/client/dist/spa/assets/build-path-tree-BeAS10oa.js +0 -1
  110. package/src/client/dist/spa/assets/documents-Cw05r3zs.js +0 -60
  111. package/src/client/dist/spa/assets/i18n-CuT4b7ns.js +0 -1
  112. package/src/client/dist/spa/assets/index-CZA4BFN5.js +0 -2
  113. package/src/client/dist/spa/assets/models-CPFeBEQS.js +0 -1
  114. package/src/client/dist/spa/assets/private.use-form-Dlb0iQZh.js +0 -1
  115. package/src/client/dist/spa/assets/scroll-CYWyxBdv.js +0 -1
  116. package/src/client/dist/spa/assets/settings-CAILUJXO.js +0 -1
  117. package/src/client/dist/spa/assets/stats-C3n1k51k.js +0 -1
  118. package/src/client/dist/spa/assets/symbols-DCYodwb2.js +0 -1
  119. package/src/client/dist/spa/assets/touch-Bj_Fr4kC.js +0 -1
  120. package/src/client/dist/spa/assets/use-checkbox-B_o-iLG2.js +0 -1
  121. package/src/client/dist/spa/assets/use-id-C93QQwrt.js +0 -1
  122. /package/src/client/dist/spa/assets/{QBadge-DqtcDv8D.js → QBadge-fsQ2AokU.js} +0 -0
  123. /package/src/client/dist/spa/assets/{QItemLabel-Codqjisk.js → QItemLabel-DWwenW2S.js} +0 -0
  124. /package/src/client/dist/spa/assets/{QItemSection-CiY_LK5Y.js → QItemSection-KFAnxzMK.js} +0 -0
  125. /package/src/client/dist/spa/assets/{QList-Bl9824vi.js → QList-NmIE6Rd9.js} +0 -0
  126. /package/src/client/dist/spa/assets/{QSpace-BNr0AftG.js → QSpace-COlmM_4F.js} +0 -0
  127. /package/src/client/dist/spa/assets/{QSpinnerDots-DEiRooBD.js → QSpinnerDots-DwtnRN2r.js} +0 -0
  128. /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-r4mAJOHR.js → _plugin-vue_export-helper-B8bB5DBd.js} +0 -0
  129. /package/src/client/dist/spa/assets/{abap-Bgec7Keq.js → abap-DzK-OTGh.js} +0 -0
  130. /package/src/client/dist/spa/assets/{apex-VBlPwEoQ.js → apex-Bj60_dRt.js} +0 -0
  131. /package/src/client/dist/spa/assets/{azcli-DKqrEFBx.js → azcli-B6NwaBAZ.js} +0 -0
  132. /package/src/client/dist/spa/assets/{bat-DdgQWy_0.js → bat-bf7wXV68.js} +0 -0
  133. /package/src/client/dist/spa/assets/{bicep-CRMM43EB.js → bicep-C_bg8UgA.js} +0 -0
  134. /package/src/client/dist/spa/assets/{cameligo-UatALtML.js → cameligo-CTWw4D4B.js} +0 -0
  135. /package/src/client/dist/spa/assets/{clojure-D8JU08RA.js → clojure-CgdPoH0r.js} +0 -0
  136. /package/src/client/dist/spa/assets/{coffee-C56wu358.js → coffee-gHQfdA5M.js} +0 -0
  137. /package/src/client/dist/spa/assets/{cpp-CyZLvhJG.js → cpp-BM4Jj4aW.js} +0 -0
  138. /package/src/client/dist/spa/assets/{csharp-BJl3ixva.js → csharp-D8-bh4Cd.js} +0 -0
  139. /package/src/client/dist/spa/assets/{csp-CxEKxmO-.js → csp-CXBxRx0n.js} +0 -0
  140. /package/src/client/dist/spa/assets/{css-B0t_muXd.js → css-DKjIxrmY.js} +0 -0
  141. /package/src/client/dist/spa/assets/{cypher-D1hqiMFD.js → cypher-C5e5inIh.js} +0 -0
  142. /package/src/client/dist/spa/assets/{dart-Bz550Pyv.js → dart-BhRHHm4x.js} +0 -0
  143. /package/src/client/dist/spa/assets/{dockerfile-CIXgVAuA.js → dockerfile-DW5REF8E.js} +0 -0
  144. /package/src/client/dist/spa/assets/{ecl-D9qbvZoA.js → ecl-Bw4Hg3n_.js} +0 -0
  145. /package/src/client/dist/spa/assets/{elixir-b2M38fAy.js → elixir-DHmoBvpZ.js} +0 -0
  146. /package/src/client/dist/spa/assets/{flow9-Dq1UYMkt.js → flow9-BsFExz3v.js} +0 -0
  147. /package/src/client/dist/spa/assets/{fsharp-CFNadkg7.js → fsharp-BaeLhgfq.js} +0 -0
  148. /package/src/client/dist/spa/assets/{go-dSur1iB2.js → go-Bd-NFKIC.js} +0 -0
  149. /package/src/client/dist/spa/assets/{graphql-qyhAo11d.js → graphql-DZVerJfy.js} +0 -0
  150. /package/src/client/dist/spa/assets/{hcl-DFzjMyzm.js → hcl-CAVzrZfH.js} +0 -0
  151. /package/src/client/dist/spa/assets/{ini-TdzA8TIl.js → ini-CyXdX58t.js} +0 -0
  152. /package/src/client/dist/spa/assets/{is-DUKatk8N.js → is-BbsvEMaT.js} +0 -0
  153. /package/src/client/dist/spa/assets/{java-CSGA9pkE.js → java-B5pNgvhy.js} +0 -0
  154. /package/src/client/dist/spa/assets/{julia-9izz5OsY.js → julia-XRhmV3AN.js} +0 -0
  155. /package/src/client/dist/spa/assets/{kotlin-DuPK7AtF.js → kotlin-DOd3J5vr.js} +0 -0
  156. /package/src/client/dist/spa/assets/{less-B8d93iCg.js → less-veZSnyw6.js} +0 -0
  157. /package/src/client/dist/spa/assets/{lexon-DWtEIyu7.js → lexon-QWGkuK0H.js} +0 -0
  158. /package/src/client/dist/spa/assets/{lua-Ciq0OGgt.js → lua-CYGpjuO5.js} +0 -0
  159. /package/src/client/dist/spa/assets/{m3-Cki6JWj_.js → m3-yNnrZkdc.js} +0 -0
  160. /package/src/client/dist/spa/assets/{markdown-Cu47xwU0.js → markdown-BCSWEPSX.js} +0 -0
  161. /package/src/client/dist/spa/assets/{mips-BM8ui995.js → mips-OpYmcC30.js} +0 -0
  162. /package/src/client/dist/spa/assets/{msdax-DqLio0_c.js → msdax-2oxoTO9Z.js} +0 -0
  163. /package/src/client/dist/spa/assets/{mysql-v1wbjJOq.js → mysql-5KlC-K_9.js} +0 -0
  164. /package/src/client/dist/spa/assets/{objective-c-CQl3PGSB.js → objective-c-CcDCgtLx.js} +0 -0
  165. /package/src/client/dist/spa/assets/{pascal-D4iW0ZtD.js → pascal-BZGsbaEV.js} +0 -0
  166. /package/src/client/dist/spa/assets/{pascaligo-BdC9CZdj.js → pascaligo-DtD5qU3G.js} +0 -0
  167. /package/src/client/dist/spa/assets/{perl-BL10m4XD.js → perl-C1jNNS3E.js} +0 -0
  168. /package/src/client/dist/spa/assets/{pgsql-Be_oqVo3.js → pgsql-CT0fhiZa.js} +0 -0
  169. /package/src/client/dist/spa/assets/{php-BtvXSFRI.js → php-D6DrXoPM.js} +0 -0
  170. /package/src/client/dist/spa/assets/{pla-B2vUy15C.js → pla-b3-HN2pF.js} +0 -0
  171. /package/src/client/dist/spa/assets/{postiats-CbmTTfXr.js → postiats-Bin2ApVS.js} +0 -0
  172. /package/src/client/dist/spa/assets/{powerquery-DszLhJGx.js → powerquery-7ASnn-ZG.js} +0 -0
  173. /package/src/client/dist/spa/assets/{powershell-B0dYktF6.js → powershell-t4p7sU1H.js} +0 -0
  174. /package/src/client/dist/spa/assets/{protobuf-CZvaj1VX.js → protobuf-BUGeWa_j.js} +0 -0
  175. /package/src/client/dist/spa/assets/{pug-CPDx1B3S.js → pug-BuKcgC9s.js} +0 -0
  176. /package/src/client/dist/spa/assets/{qsharp-CDP9TFLl.js → qsharp-DSMtI_O7.js} +0 -0
  177. /package/src/client/dist/spa/assets/{r-8DbbFX2l.js → r-DMlFgn7A.js} +0 -0
  178. /package/src/client/dist/spa/assets/{redis-DRWj9MtJ.js → redis-cXItkC5u.js} +0 -0
  179. /package/src/client/dist/spa/assets/{redshift-C6cElE_5.js → redshift-BZVbW7HE.js} +0 -0
  180. /package/src/client/dist/spa/assets/{restructuredtext-W9pS9n3m.js → restructuredtext-BzjxwS8h.js} +0 -0
  181. /package/src/client/dist/spa/assets/{ruby-BKnzWnk-.js → ruby-C5nyLV4l.js} +0 -0
  182. /package/src/client/dist/spa/assets/{rust-YPCclWwe.js → rust-BcmMsHdf.js} +0 -0
  183. /package/src/client/dist/spa/assets/{sb-BgM4DTFb.js → sb-Dnb1iy6B.js} +0 -0
  184. /package/src/client/dist/spa/assets/{scala-fz1OPLMl.js → scala-anMIFYpA.js} +0 -0
  185. /package/src/client/dist/spa/assets/{scheme-8Uz1RIbu.js → scheme-BItQTe08.js} +0 -0
  186. /package/src/client/dist/spa/assets/{scss-Djo3IYXr.js → scss-BOv51BJ5.js} +0 -0
  187. /package/src/client/dist/spa/assets/{shell-CINF5Tx_.js → shell-BsRYRTNN.js} +0 -0
  188. /package/src/client/dist/spa/assets/{solidity-GgiNEuUm.js → solidity-BtuLgGDx.js} +0 -0
  189. /package/src/client/dist/spa/assets/{sophia-Culj97P9.js → sophia-B0Vkc5MF.js} +0 -0
  190. /package/src/client/dist/spa/assets/{sparql-C2ZlpxOY.js → sparql-B7lvkZQM.js} +0 -0
  191. /package/src/client/dist/spa/assets/{sql-BEf5Pg7Y.js → sql-DvP5MpA3.js} +0 -0
  192. /package/src/client/dist/spa/assets/{st-CT6UUoeH.js → st-GVUeyB3U.js} +0 -0
  193. /package/src/client/dist/spa/assets/{swift-B5g0xTG3.js → swift-DSPIoCjm.js} +0 -0
  194. /package/src/client/dist/spa/assets/{systemverilog-CEgQz9DR.js → systemverilog-Icj2-k23.js} +0 -0
  195. /package/src/client/dist/spa/assets/{tcl-D0qL2L0I.js → tcl-Cd8KQcm-.js} +0 -0
  196. /package/src/client/dist/spa/assets/{twig-BFUAVf1E.js → twig-CBHmt8z3.js} +0 -0
  197. /package/src/client/dist/spa/assets/{typespec-CjVVcNKm.js → typespec-Ckc037mq.js} +0 -0
  198. /package/src/client/dist/spa/assets/{vb-CZJr-DQz.js → vb-B97GW9Wb.js} +0 -0
  199. /package/src/client/dist/spa/assets/{vue-i18n-BJlZEYnA.js → vue-i18n-eUDnMrPl.js} +0 -0
  200. /package/src/client/dist/spa/assets/{wgsl-ivoXUo2e.js → wgsl-DIKmb3YH.js} +0 -0
@@ -0,0 +1,68 @@
1
+ const KOBO_MCP_BRIEF = [
2
+ '[Kōbō MCP] This workspace exposes a dedicated MCP server with tools prefixed `kobo__`.',
3
+ 'Non-interactive mode: this session runs via the Claude Agent SDK in single-shot mode. To ask the user a question, call the `AskUserQuestion` tool — Kōbō will pause the session, collect the answer asynchronously, and resume.',
4
+ '⚠️ HARD RULE — emit AT MOST ONE `AskUserQuestion` tool call per turn, and emit it ALONE (no other tool calls in the same response). The Claude Agent SDK rejects parallel defers: a second `AskUserQuestion` in the same turn breaks the pause mechanism, makes both calls fail with "AskUserQuestion fails", and the user sees the panel arrive only at the end of the turn (if at all). If you have N questions, group them as a multi-question array inside ONE call: `AskUserQuestion({ questions: [{ question: "Q1", options: [...] }, { question: "Q2", options: [...] }] })`. After invoking it, STOP — do not emit any other tool call. Wait for the resume.',
5
+ 'Plan mode: when running with `permissionMode: plan`, the read-only restriction applies to MCP tools too. For Kōbō: `kobo__list_*`, `kobo__read_document`, `kobo__search_codebase`, `kobo__get_*` are fine; `kobo__mark_task_done`, `kobo__log_thought`, `kobo__set_workspace_status` are mutations and must wait until the plan is approved.',
6
+ 'Conventions — read these BEFORE starting work, not as a fallback:',
7
+ '• `kobo__list_tasks` first on any non-trivial turn, then `kobo__mark_task_done` as each item completes.',
8
+ '• `kobo__list_documents` / `kobo__read_document` to discover existing plans and specs under docs/ and .ai/thoughts/ before writing new ones.',
9
+ '• `kobo__log_thought` to persist notable decisions to `.ai/thoughts/<date>-<slug>.md`.',
10
+ '• `kobo__search_codebase` to recall prior chat history (conversations, not source — use Grep for source).',
11
+ '• `kobo__get_workspace_info` / `kobo__get_git_info` / `kobo__get_notion_ticket` for context.',
12
+ '• `kobo__set_workspace_status` when the mission is done / blocked / idle.',
13
+ '• `kobo__schedule_wakeup` / `kobo__cancel_wakeup` to schedule (or cancel) a follow-up session — prefer these over the built-in `ScheduleWakeup` tool.',
14
+ 'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
15
+ ].join('\n');
16
+ export function buildClaudeOptions(input) {
17
+ const options = {
18
+ cwd: input.workingDir,
19
+ systemPrompt: { type: 'preset', preset: 'claude_code' },
20
+ // Leave `tools` undefined: the `claude_code` preset EXCLUDES MCP tools, so
21
+ // under bypassPermissions MCP tools surface as "haven't granted it yet"
22
+ // even when the user chose bypass. Undefined → full toolbox (built-ins +
23
+ // MCP), matching pre-SDK CLI behaviour.
24
+ //
25
+ // `settingSources` defaults to [] in the SDK; we must opt in to all three
26
+ // levels. Restricting to ['project'] makes the SDK skip the user-level
27
+ // `~/.claude/settings.json` (where `skipDangerousModePermissionPrompt`
28
+ // lives), breaking bypass for MCP tools.
29
+ settingSources: ['user', 'project', 'local'],
30
+ };
31
+ switch (input.agentPermissionMode) {
32
+ case 'plan':
33
+ options.permissionMode = 'plan';
34
+ break;
35
+ case 'bypass':
36
+ options.permissionMode = 'bypassPermissions';
37
+ options.allowDangerouslySkipPermissions = true;
38
+ break;
39
+ case 'strict':
40
+ options.permissionMode = 'acceptEdits';
41
+ break;
42
+ case 'interactive':
43
+ // SDK 'default' + our canUseTool hook → every tool that would prompt is
44
+ // deferred to the user via a workspace-level permission request.
45
+ options.permissionMode = 'default';
46
+ break;
47
+ }
48
+ let prompt = input.prompt;
49
+ if (!input.resumeFromEngineSessionId) {
50
+ prompt = `${KOBO_MCP_BRIEF}\n\n${prompt}`;
51
+ }
52
+ if (input.model && input.model !== 'auto')
53
+ options.model = input.model;
54
+ if (input.effort && input.effort !== 'auto')
55
+ options.extraArgs = { effort: input.effort };
56
+ if (input.mcpServers && Object.keys(input.mcpServers).length > 0) {
57
+ options.mcpServers = input.mcpServers;
58
+ }
59
+ if (input.resumeFromEngineSessionId)
60
+ options.resume = input.resumeFromEngineSessionId;
61
+ if (input.hooks)
62
+ options.hooks = input.hooks;
63
+ if (input.canUseTool)
64
+ options.canUseTool = input.canUseTool;
65
+ if (input.stderr)
66
+ options.stderr = input.stderr;
67
+ return { options, effectivePrompt: prompt };
68
+ }
@@ -0,0 +1,27 @@
1
+ import { getWorkspace, listTasks } from '../../../workspace-service.js';
2
+ /**
3
+ * Build the reminder text injected back into the agent at compaction time.
4
+ * Returns an empty string if the workspace has neither tasks nor acceptance
5
+ * criteria — the caller should treat that as "nothing to inject".
6
+ *
7
+ * Pure with respect to its inputs other than the SQLite reads done via
8
+ * getWorkspace / listTasks, which keeps it trivially unit-testable.
9
+ */
10
+ export function buildPreCompactCustomInstructions(workspaceId) {
11
+ const ws = getWorkspace(workspaceId);
12
+ const tasks = listTasks(workspaceId);
13
+ const criteria = tasks.filter((t) => t.isAcceptanceCriterion);
14
+ const todos = tasks.filter((t) => !t.isAcceptanceCriterion);
15
+ if (criteria.length === 0 && todos.length === 0)
16
+ return '';
17
+ let out = `Context reminder for the next session segment.\n`;
18
+ out += `Task: ${ws?.name ?? workspaceId}\n`;
19
+ if (todos.length > 0) {
20
+ out += `\nTasks:\n${todos.map((t) => `- [${t.status === 'done' ? 'x' : ' '}] ${t.title}`).join('\n')}\n`;
21
+ }
22
+ if (criteria.length > 0) {
23
+ out += `\nAcceptance criteria:\n${criteria.map((t) => `- [${t.status === 'done' ? 'x' : ' '}] ${t.title}`).join('\n')}\n`;
24
+ out += `\nWhen you complete a criterion, tell the user which one so it can be marked as done.\n`;
25
+ }
26
+ return out;
27
+ }
@@ -2,6 +2,7 @@
2
2
  export const ALL_AGENT_EVENT_KINDS = [
3
3
  'session:started',
4
4
  'session:ended',
5
+ 'session:user-input-requested',
5
6
  'session:compacted',
6
7
  'session:brainstorm-complete',
7
8
  'message:text',