@gird/ccli 2.14.0 → 2.17.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 (81) hide show
  1. package/README.md +46 -2
  2. package/dist/agent/ai.js +50 -277
  3. package/dist/agent/ai.js.map +1 -1
  4. package/dist/agent/providers/anthropic.js +207 -0
  5. package/dist/agent/providers/anthropic.js.map +1 -0
  6. package/dist/agent/providers/gemini.js +97 -0
  7. package/dist/agent/providers/gemini.js.map +1 -0
  8. package/dist/agent/providers/openai.js +102 -0
  9. package/dist/agent/providers/openai.js.map +1 -0
  10. package/dist/cli/args/index.js +4 -0
  11. package/dist/cli/args/index.js.map +1 -1
  12. package/dist/cli/repl/index.js +62 -56
  13. package/dist/cli/repl/index.js.map +1 -1
  14. package/dist/cli/run/event-renderer.js +57 -0
  15. package/dist/cli/run/event-renderer.js.map +1 -0
  16. package/dist/cli/run/format.js +8 -2
  17. package/dist/cli/run/format.js.map +1 -1
  18. package/dist/cli/run/hooks.js +173 -0
  19. package/dist/cli/run/hooks.js.map +1 -0
  20. package/dist/cli/run/index.js +233 -12
  21. package/dist/cli/run/index.js.map +1 -1
  22. package/dist/cli/run/task.js +51 -5
  23. package/dist/cli/run/task.js.map +1 -1
  24. package/dist/cli/run/todo-panel.js +13 -0
  25. package/dist/cli/run/todo-panel.js.map +1 -1
  26. package/dist/cli/session/checkpoint.js +252 -0
  27. package/dist/cli/session/checkpoint.js.map +1 -0
  28. package/dist/cli/session/index.js +1 -1
  29. package/dist/cli/session/index.js.map +1 -1
  30. package/dist/cli/slash/index.js +12 -2
  31. package/dist/cli/slash/index.js.map +1 -1
  32. package/dist/cli/slash/session/load.js +3 -0
  33. package/dist/cli/slash/session/load.js.map +1 -1
  34. package/dist/cli/slash/session/save.js +1 -0
  35. package/dist/cli/slash/session/save.js.map +1 -1
  36. package/dist/cli/slash/system/agent.js +37 -103
  37. package/dist/cli/slash/system/agent.js.map +1 -1
  38. package/dist/cli/slash/system/compact.js +26 -5
  39. package/dist/cli/slash/system/compact.js.map +1 -1
  40. package/dist/cli/slash/system/goal.js +33 -33
  41. package/dist/cli/slash/system/goal.js.map +1 -1
  42. package/dist/cli/slash/system/help.js +2 -0
  43. package/dist/cli/slash/system/help.js.map +1 -1
  44. package/dist/cli/slash/system/plan.js +137 -0
  45. package/dist/cli/slash/system/plan.js.map +1 -0
  46. package/dist/cli/slash/system/revert.js +133 -0
  47. package/dist/cli/slash/system/revert.js.map +1 -0
  48. package/dist/config/config.js +110 -14
  49. package/dist/config/config.js.map +1 -1
  50. package/dist/config/skills.js +65 -26
  51. package/dist/config/skills.js.map +1 -1
  52. package/dist/harness/index.js +312 -0
  53. package/dist/harness/index.js.map +1 -0
  54. package/dist/index.js +35 -41
  55. package/dist/index.js.map +1 -1
  56. package/dist/tools/bash-background.js +2 -2
  57. package/dist/tools/bash-background.js.map +1 -1
  58. package/dist/tools/bash.js +3 -2
  59. package/dist/tools/bash.js.map +1 -1
  60. package/dist/tools/edit-file.js +36 -4
  61. package/dist/tools/edit-file.js.map +1 -1
  62. package/dist/tools/glob.js +112 -0
  63. package/dist/tools/glob.js.map +1 -0
  64. package/dist/tools/grep.js +4 -3
  65. package/dist/tools/grep.js.map +1 -1
  66. package/dist/tools/index.js +45 -6
  67. package/dist/tools/index.js.map +1 -1
  68. package/dist/tools/list-dir.js +3 -2
  69. package/dist/tools/list-dir.js.map +1 -1
  70. package/dist/tools/read-file.js +3 -2
  71. package/dist/tools/read-file.js.map +1 -1
  72. package/dist/tools/shared.js.map +1 -1
  73. package/dist/tools/skill-tool.js +24 -5
  74. package/dist/tools/skill-tool.js.map +1 -1
  75. package/dist/tools/todo.js +17 -5
  76. package/dist/tools/todo.js.map +1 -1
  77. package/dist/tools/web-fetch.js +95 -0
  78. package/dist/tools/web-fetch.js.map +1 -0
  79. package/dist/tools/write-file.js +8 -2
  80. package/dist/tools/write-file.js.map +1 -1
  81. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/run/format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,SAAS,SAAS,CAAC,QAAgB;IAC/B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,yBAAyB;AACzB,SAAS,OAAO,CAAC,CAAS;IACtB,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS;IAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IACxB,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAChC,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,cAAc,CAAC,EAAY;IACvC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU;YACX,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,MAAM;YACP,OAAO,UAAU,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAClF,KAAK,YAAY,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,eAAe,IAAI,CAAC,IAAI,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;QAC1D,CAAC;QACD,KAAK,WAAW;YACZ,OAAO,cAAc,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM;YACP,OAAO,SAAS,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5D,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACZ,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACN,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7C,OAAO,QAAQ,MAAM,IAAI,IAAI,EAAE,CAAC;YACpC,CAAC;YACD,OAAO,GAAG,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC;QACpD,CAAC;IACL,CAAC;AACL,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,MAAc;IACzD,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAE9C,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI;YAChB,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1F,CAAC,CAAC,OAAO,CAAC;QACd,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACzG,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAED;;;;;;wEAMwE;AAExE,oCAAoC;AACpC,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,8BAA8B;AAC9B,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,gCAAgC;AAChC,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,sCAAsC;AACtC,SAAS,UAAU,CAAC,CAAS;IACzB,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,cAAc;QAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,YAAY;QAC9C,CAAC,CAAC,IAAI,CAAC;AACf,CAAC;AAED,0CAA0C;AAC1C,SAAS,MAAM,CAAC,GAAW,EAAE,KAAa;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAC9B,OAAe,EACf,IAA4B;IAE5B,MAAM,GAAG,GAAG,IAAI,EAAE,QAAQ,IAAI,eAAe,CAAC;IAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CACjB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,GAAG,CAAC,IAAI,CACJ,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,CACxD,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC;AAOD,2CAA2C;AAC3C,SAAS,SAAS,CAAC,CAAW,EAAE,CAAW;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CACtD,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACT,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC,EAAE,CAAC;QACR,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,EAAE,CAAC;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC1B,OAAe,EACf,OAAe,EACf,IAA4B;IAE5B,MAAM,GAAG,GAAG,IAAI,EAAE,QAAQ,IAAI,cAAc,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3E,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACnB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACV,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CACJ,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;YACF,KAAK,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CACJ,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;YACF,KAAK,EAAE,CAAC;QACZ,CAAC;IACL,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAY;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,cAAc,CACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAC9B,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;wEAKwE;AAExE,yCAAyC;AACzC,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,OAAO,KAAK,CAAC,GAAG,CACZ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;AACN,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3E,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACnB,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CACJ,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;YACF,KAAK,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CACJ,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;YACF,KAAK,EAAE,CAAC;QACZ,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAY;IACtC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,aAAa,CAChB,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAC9B,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/run/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * 生命周期钩子(hooks)运行器。
3
+ *
4
+ * 支持的事件:
5
+ * - PreToolUse:工具执行前触发,可拦截(退出码 2)
6
+ * - PostToolUse / PostToolUseFailure:工具成功 / 失败后触发,只观察
7
+ * - UserPromptSubmit:用户输入发送给模型前,可拦截;stdout 作为补充上下文注入
8
+ * - SessionStart / SessionEnd:会话开始 / 结束,只观察
9
+ * - Stop:代理回合结束(最终回答 / 轮数触顶),只观察
10
+ * - PreCompact:上下文压缩前(手动 /compact 或自动),只观察
11
+ * - SubagentStart / SubagentStop:task 子代理开始 / 结束,只观察
12
+ *
13
+ * 协议(对齐 Claude Code):
14
+ * - 通过 stdin 给 hook 进程喂 JSON:{ hook_event_name, cwd, ...事件特有字段 }
15
+ * - 退出码 0 = 放行(stdout 汇总到 result.output,由调用方决定打印还是注入);
16
+ * 2 = 拦截(仅可拦截事件生效;stderr 作为原因);
17
+ * 其它非零 / 超时 / 启动失败 = fail open:打印警告但放行。
18
+ * - 同一事件配了多个 hook 时按声明顺序执行;拦截后短路,后续不再执行。
19
+ * - matcher 只对工具事件(PreToolUse / PostToolUse*)生效,其余事件忽略 matcher。
20
+ *
21
+ * 安全底线:每次执行都打印一行透明日志(命令可见),让 hook 行为对用户可观测。
22
+ */
23
+ import { spawn } from 'node:child_process';
24
+ import { style } from '../style.js';
25
+ /** 可拦截的事件(退出码 2 有意义);其余事件的退出码 2 按出错处理(fail open)。 */
26
+ const BLOCKABLE_EVENTS = new Set([
27
+ 'PreToolUse',
28
+ 'UserPromptSubmit',
29
+ ]);
30
+ const DEFAULT_TIMEOUT_SEC = 10;
31
+ /**
32
+ * matcher 匹配规则:
33
+ * - 省略或 `*`:匹配全部工具
34
+ * - 精确名:`bash` 只匹配 bash
35
+ * - `a|b`:匹配其中任意一个
36
+ * - 末尾带 `*`:前缀匹配,如 `mcp__*` 匹配所有 MCP 工具
37
+ */
38
+ export function matchHook(matcher, toolName) {
39
+ if (!matcher || matcher === '*')
40
+ return true;
41
+ return matcher.split('|').some((part) => {
42
+ const p = part.trim();
43
+ if (!p)
44
+ return false;
45
+ if (p.endsWith('*'))
46
+ return toolName.startsWith(p.slice(0, -1));
47
+ return p === toolName;
48
+ });
49
+ }
50
+ /** 执行单个 hook:spawn shell,喂 stdin JSON,按退出码判定结果。 */
51
+ function runOneHook(def, payload, blockable) {
52
+ return new Promise((resolve) => {
53
+ const timeoutSec = def.timeout ?? DEFAULT_TIMEOUT_SEC;
54
+ const shell = process.env.SHELL || '/bin/bash';
55
+ let child;
56
+ try {
57
+ child = spawn(shell, ['-c', def.command], {
58
+ cwd: payload.cwd,
59
+ stdio: ['pipe', 'pipe', 'pipe'],
60
+ });
61
+ }
62
+ catch (e) {
63
+ resolve({ action: 'error', message: `启动失败:${e?.message ?? e}` });
64
+ return;
65
+ }
66
+ let stdout = '';
67
+ let stderr = '';
68
+ let settled = false;
69
+ const finish = (outcome) => {
70
+ if (settled)
71
+ return;
72
+ settled = true;
73
+ clearTimeout(timer);
74
+ resolve(outcome);
75
+ };
76
+ const timer = setTimeout(() => {
77
+ child.kill('SIGKILL');
78
+ finish({ action: 'error', message: `超时(${timeoutSec}s)` });
79
+ }, timeoutSec * 1000);
80
+ child.stdout.on('data', (d) => {
81
+ stdout += d;
82
+ });
83
+ child.stderr.on('data', (d) => {
84
+ stderr += d;
85
+ });
86
+ child.on('error', (e) => {
87
+ finish({ action: 'error', message: `启动失败:${e.message}` });
88
+ });
89
+ child.on('close', (code) => {
90
+ if (code === 0) {
91
+ finish({ action: 'allow', message: stdout.trim() || undefined });
92
+ }
93
+ else if (code === 2 && blockable) {
94
+ finish({
95
+ action: 'block',
96
+ message: stderr.trim() || '(hook 未给出原因)',
97
+ });
98
+ }
99
+ else {
100
+ // 不可拦截事件的退出码 2、以及其它非零码,统一按出错 fail open
101
+ const detail = stderr.trim();
102
+ finish({
103
+ action: 'error',
104
+ message: `退出码 ${code}${detail ? `:${detail}` : ''}`,
105
+ });
106
+ }
107
+ });
108
+ // 喂 stdin 载荷;进程若提前退出会触发 EPIPE,忽略即可
109
+ child.stdin.on('error', () => { });
110
+ child.stdin.end(JSON.stringify(payload));
111
+ });
112
+ }
113
+ /**
114
+ * 执行某个事件下所有匹配的 hook。
115
+ * @param defs 配置中的全部 hook(内部按 event 过滤;工具事件再按 matcher 过滤)
116
+ * @param event 触发事件
117
+ * @param payload 事件载荷(不含 hook_event_name)
118
+ * @param print 输出回调(子代理场景传缩进 print)
119
+ */
120
+ export async function runHooks(defs, event, payload, print = (c) => process.stdout.write(c)) {
121
+ if (!defs || defs.length === 0)
122
+ return { blocked: false };
123
+ const matched = defs.filter((d) => d.event === event &&
124
+ (payload.tool_name === undefined ||
125
+ matchHook(d.matcher, payload.tool_name)));
126
+ const blockable = BLOCKABLE_EVENTS.has(event);
127
+ const outputs = [];
128
+ const collect = () => ({
129
+ blocked: false,
130
+ output: outputs.length > 0 ? outputs.join('\n') : undefined,
131
+ });
132
+ for (const def of matched) {
133
+ print(style.muted(`\n⏎ [hook] ${event} ← ${def.command}\n`));
134
+ const outcome = await runOneHook(def, { hook_event_name: event, ...payload }, blockable);
135
+ if (outcome.action === 'allow') {
136
+ if (outcome.message)
137
+ outputs.push(outcome.message);
138
+ continue;
139
+ }
140
+ if (outcome.action === 'error') {
141
+ print(style.warn(`[hook] 执行失败(已放行):${outcome.message}\n`));
142
+ continue;
143
+ }
144
+ // 拦截:告知用户并短路,原因由调用方处理(喂回模型或拒绝输入)
145
+ const target = payload.tool_name ?? event;
146
+ print(style.warn(`[hook] 已拦截 ${target}:${outcome.message}\n`));
147
+ return {
148
+ blocked: true,
149
+ reason: outcome.message,
150
+ output: outputs.length > 0 ? outputs.join('\n') : undefined,
151
+ };
152
+ }
153
+ return collect();
154
+ }
155
+ /**
156
+ * 用户输入提交钩子(UserPromptSubmit)。
157
+ * - 被拦截:返回 blocked,调用方应放弃本次输入(REPL 回到提示符、非交互退出);
158
+ * - 放行:把所有 hook 的 stdout 作为补充上下文追加到 prompt 末尾返回。
159
+ */
160
+ export async function runUserPromptHooks(defs, cwd, prompt, print) {
161
+ const res = await runHooks(defs, 'UserPromptSubmit', { cwd, prompt }, print);
162
+ if (res.blocked) {
163
+ return { blocked: true, reason: res.reason, prompt };
164
+ }
165
+ if (res.output) {
166
+ return {
167
+ blocked: false,
168
+ prompt: `${prompt}\n\n[hook 补充上下文]\n${res.output}`,
169
+ };
170
+ }
171
+ return { blocked: false, prompt };
172
+ }
173
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/run/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  import { style } from '../style.js';
2
- import { executeTool, getTool, registerMcpTools, registerTool, } from '../../tools/index.js';
2
+ import { executeTool, getTool, registerMcpTools, registerTool, textToolResult, } from '../../tools/index.js';
3
3
  import { createTaskTool } from './task.js';
4
- import { renderTodoPanel } from '../../tools/todo.js';
4
+ import { getTodos, renderTodoPanel, resetTodos } from '../../tools/todo.js';
5
5
  import { ruleKeyFor } from './permissions.js';
6
6
  import { formatToolCall, formatToolResult, toolCallLines, } from './format.js';
7
7
  import { LineFoldPrinter, renderWithFold } from './fold.js';
8
8
  import { WriteFileStreamPrinter } from './stream-write.js';
9
9
  import { estimatePromptTokens, estimateTokens, } from '../stats/index.js';
10
+ import { DEFAULT_SYSTEM_PROMPT } from '../../config/config.js';
11
+ import { runHooks } from './hooks.js';
10
12
  /** 单个用户回合内的默认最大工具调用轮数(未配置 maxStepsPerTurn 时)。
11
13
  * 用户可在 config 设 maxStepsPerTurn 调整;0 或负数表示不限。 */
12
14
  const DEFAULT_MAX_STEPS = 50;
@@ -21,32 +23,123 @@ function safeParse(argsJson) {
21
23
  return {};
22
24
  }
23
25
  }
26
+ const TOOL_ERROR_STATUS = '<system>ERROR: Tool execution failed.</system>';
27
+ const REPEAT_TOOL_REMINDER = '\n\n<system-reminder>\n' +
28
+ '你正在连续重复同一个工具调用和完全相同的参数。请仔细阅读上一条工具结果;如果任务尚未完成,请换一种方式、调整参数,或先读取/搜索最新信息,而不是原样重试。\n' +
29
+ '</system-reminder>';
30
+ const REPEAT_TOOL_STOP_REMINDER = '\n\n<system-reminder>\n' +
31
+ '你已经多次重复同一个工具调用且没有取得进展。下一步不要继续调用这个完全相同的工具参数;请总结当前卡点,或改用不同工具/参数继续。\n' +
32
+ '</system-reminder>';
33
+ /** 连续多少轮没写 todo(且还有未完成项)后,往工具结果里追加待办更新提醒。 */
34
+ const TODO_STALE_ROUNDS = 8;
35
+ const TODO_STALE_REMINDER = '\n\n<system-reminder>\n' +
36
+ '待办清单已多轮未更新。请用 todo 工具刷新进度:完成的项标 done,下一项标 in_progress,同时只保留一项 in_progress。' +
37
+ '若清单已与当前工作不符,请重写或清空它。\n' +
38
+ '</system-reminder>';
39
+ /**
40
+ * 生成工具调用的稳定指纹。
41
+ *
42
+ * 模型有时会把 JSON 参数键顺序换一下;这里先排序再 stringify,
43
+ * 让“同一个工具 + 同一组参数”能被可靠识别,用于重复调用提醒。
44
+ */
45
+ function canonicalToolArgs(argsJson) {
46
+ try {
47
+ return JSON.stringify(sortJson(JSON.parse(argsJson || '{}')));
48
+ }
49
+ catch {
50
+ return argsJson;
51
+ }
52
+ }
53
+ /**
54
+ * 递归排序 JSON 对象的 key。
55
+ *
56
+ * 只改变对象键顺序,不改变数组顺序和值本身;这样既能稳定比较,
57
+ * 又不会误把语义不同的数组参数视为相同。
58
+ */
59
+ function sortJson(value) {
60
+ if (Array.isArray(value))
61
+ return value.map(sortJson);
62
+ if (value && typeof value === 'object') {
63
+ const out = {};
64
+ for (const key of Object.keys(value).sort()) {
65
+ out[key] = sortJson(value[key]);
66
+ }
67
+ return out;
68
+ }
69
+ return value;
70
+ }
71
+ /**
72
+ * 根据连续重复次数选择给模型的提醒文案。
73
+ *
74
+ * 3 次开始轻提醒,5 次升级为强提醒;提醒只写入 tool result 给模型看,
75
+ * 不改变用户侧的工具输出。
76
+ */
77
+ function repeatedToolReminder(repeatCount) {
78
+ if (repeatCount >= 5)
79
+ return REPEAT_TOOL_STOP_REMINDER;
80
+ if (repeatCount >= 3)
81
+ return REPEAT_TOOL_REMINDER;
82
+ return '';
83
+ }
84
+ /**
85
+ * 把结构化工具结果转换成喂给模型的文本。
86
+ *
87
+ * 失败结果会加一个显式 system 标记,帮助模型区分“命令正常输出了一段错误文本”
88
+ * 和“工具执行真的失败了”,从而更容易自动修正下一步。
89
+ */
90
+ function toolResultForModel(result, repeatCount) {
91
+ const prefix = result.isError ? `${TOOL_ERROR_STATUS}\n` : '';
92
+ return `${prefix}${result.output}${repeatedToolReminder(repeatCount)}`;
93
+ }
24
94
  /**
25
95
  * 驱动一个用户回合:请求模型 → 若它要调用工具则(必要时确认后)执行并回传 → 再请求 …
26
96
  * 直到模型不再调用工具(给出最终回答)或达到轮数上限。
27
97
  */
28
98
  export async function runAgentTurn(options) {
29
- const { ai, history, confirm, stats, print = process.stdout.write.bind(process.stdout), maxRounds, requireToolsFirstRound, onToolCall, onToolResult, permission, configMaxSteps, todoPanel = true, endPanel = true, } = options;
99
+ const { ai, history, confirm, stats, print = process.stdout.write.bind(process.stdout), cwd = process.cwd(), maxRounds, requireToolsFirstRound, continueOnPendingTodos, allowedTools, onReasoning, onHookOutput, onPermissionRequest, onToolCall, onToolResult, permission, configMaxSteps, todoPanel = true, endPanel = true, hooks, sessionId, checkpointsDir, } = options;
30
100
  // 上限优先级:显式 maxRounds(/agent、/goal)> configMaxSteps(config 解析)> 默认 50。
31
101
  // limit <= 0 表示不限(跳过检查),对齐 config maxStepsPerTurn=0 语义。
32
102
  const limit = maxRounds ?? configMaxSteps ?? DEFAULT_MAX_STEPS;
103
+ // hook 输出:事件模式交给 onHookOutput(独立事件),否则内联 print(CLI 行为不变)
104
+ const emitHookOutput = (text) => {
105
+ if (onHookOutput)
106
+ onHookOutput(text);
107
+ else
108
+ print(text + '\n');
109
+ };
33
110
  /** 工具执行上下文(供 task 等需要反向调用 AI / 复用会话的工具)。 */
34
111
  const toolCtx = {
112
+ sessionId,
113
+ checkpointsDir,
35
114
  ai,
36
115
  confirm,
37
116
  permission,
38
117
  stats,
39
118
  print,
40
- cwd: process.cwd(),
119
+ cwd,
41
120
  maxSteps: configMaxSteps,
42
121
  todoPanel,
122
+ hooks,
43
123
  };
44
124
  // 注册 task 子代理工具(每回合注册一次,registerTool 同名替换幂等)。
45
125
  registerTool(createTaskTool(toolCtx));
126
+ let lastToolKey = null;
127
+ let repeatCount = 0;
128
+ // 待办未完成时的续跑提醒计数:连续空转达到上限就放弃,避免死循环
129
+ let nudgeCount = 0;
130
+ const MAX_TODO_NUDGES = 3;
131
+ // 距离上次写 todo 的轮数:太久不更新(且还有未完成项)就提醒模型刷新
132
+ let roundsSinceTodoWrite = 0;
46
133
  for (let round = 0; limit <= 0 || round < limit; round++) {
47
134
  let reasoningStarted = false;
48
135
  let reasoningEnded = false;
49
136
  const onReasoningDelta = (text) => {
137
+ // 事件模式:把思考流作为独立信号交给调用方,不混入正文渲染
138
+ if (onReasoning) {
139
+ onReasoning(text);
140
+ return;
141
+ }
142
+ // CLI 默认:灰色内联渲染(行为不变)
50
143
  if (!reasoningStarted) {
51
144
  print(style.muted('思考中…\n'));
52
145
  reasoningStarted = true;
@@ -65,7 +158,12 @@ export async function runAgentTurn(options) {
65
158
  // 与子代理共用 WriteFileStreamPrinter,行为一致。
66
159
  const writePrinter = new WriteFileStreamPrinter();
67
160
  const onToolArgumentDelta = (index, name, argsSoFar) => writePrinter.handleDelta(index, name, argsSoFar, print);
68
- const turn = await ai.chat(history, onDelta, round === 0 && requireToolsFirstRound ? { requireTools: true } : undefined, onReasoningDelta, onToolArgumentDelta);
161
+ const chatOptions = {};
162
+ if (round === 0 && requireToolsFirstRound)
163
+ chatOptions.requireTools = true;
164
+ if (allowedTools)
165
+ chatOptions.allowedTools = allowedTools;
166
+ const turn = await ai.chat(history, onDelta, Object.keys(chatOptions).length > 0 ? chatOptions : undefined, onReasoningDelta, onToolArgumentDelta);
69
167
  // 优先使用后端返回的真实 usage;不支持时降级为字符估算
70
168
  if (turn.usage) {
71
169
  stats.promptTokens += turn.usage.promptTokens;
@@ -81,7 +179,39 @@ export async function runAgentTurn(options) {
81
179
  }
82
180
  // 没有工具调用 → 这是最终回答,收尾退出
83
181
  if (turn.toolCalls.length === 0) {
182
+ // /agent、/goal:待办列表还有未完成项时,模型的过渡性回答不算收尾,
183
+ // 补一条提醒消息让它继续执行(连续空转上限 MAX_TODO_NUDGES 次兜底)
184
+ if (continueOnPendingTodos && nudgeCount < MAX_TODO_NUDGES) {
185
+ const pending = getTodos().filter((t) => t.status !== 'done');
186
+ if (pending.length > 0) {
187
+ print('\n');
188
+ nudgeCount++;
189
+ history.push({
190
+ role: 'assistant',
191
+ content: turn.content,
192
+ });
193
+ const list = pending
194
+ .map((t) => `- ${t.content}`)
195
+ .join('\n');
196
+ history.push({
197
+ role: 'user',
198
+ content: `还有 ${pending.length} 项待办未完成:\n${list}\n` +
199
+ '请继续执行(先更新待办状态),直到全部完成。',
200
+ });
201
+ print(style.muted(`(待办未完成,继续执行 ${nudgeCount}/${MAX_TODO_NUDGES}…)\n`));
202
+ continue;
203
+ }
204
+ }
84
205
  print('\n');
206
+ // 待办全部完成:回合结束自动清空,面板不残留已完成清单
207
+ const todos = getTodos();
208
+ if (todos.length > 0 && todos.every((t) => t.status === 'done')) {
209
+ resetTodos();
210
+ }
211
+ // Stop hook:回合正常收尾(模型给出最终回答),仅观察
212
+ const stop = await runHooks(hooks, 'Stop', { cwd, stop_reason: 'final' }, print);
213
+ if (stop.output)
214
+ emitHookOutput(stop.output);
85
215
  // 回合结束:渲染待办面板(提示符上方常驻),无待办时为空串
86
216
  const panel = todoPanel && endPanel ? renderTodoPanel() : '';
87
217
  if (panel)
@@ -89,6 +219,8 @@ export async function runAgentTurn(options) {
89
219
  history.push({ role: 'assistant', content: turn.content });
90
220
  return;
91
221
  }
222
+ // 本轮有工具调用,说明还在推进,重置空转计数
223
+ nudgeCount = 0;
92
224
  // 有工具调用:先把带 tool_calls 的 assistant 消息入历史
93
225
  history.push({
94
226
  role: 'assistant',
@@ -102,9 +234,35 @@ export async function runAgentTurn(options) {
102
234
  // 逐个执行工具,结果以 role:'tool' 消息回传
103
235
  for (const tc of turn.toolCalls) {
104
236
  const tool = getTool(tc.name);
237
+ const args = safeParse(tc.arguments);
238
+ // 只读护栏:allowedTools 之外的工具一律拒绝执行(plan mode 硬边界)
239
+ if (allowedTools && !allowedTools.includes(tc.name)) {
240
+ const denied = textToolResult(`当前为只读模式,工具 ${tc.name} 不可用。请只用只读工具(${allowedTools.join(' / ')})研究,完成后给出计划文本。`, true);
241
+ history.push({
242
+ role: 'tool',
243
+ tool_call_id: tc.id,
244
+ content: toolResultForModel(denied, 1),
245
+ });
246
+ onToolResult?.(tc, denied);
247
+ continue;
248
+ }
249
+ const toolKey = `${tc.name} ${canonicalToolArgs(tc.arguments)}`;
250
+ // PreToolUse hook:在「始终允许 / 用户确认」之前触发,对所有工具生效;
251
+ // 被拦截则短路——不弹确认、不执行,原因喂回模型。
252
+ const pre = await runHooks(hooks, 'PreToolUse', { cwd: toolCtx.cwd, tool_name: tc.name, tool_input: args }, print);
253
+ if (pre.output)
254
+ emitHookOutput(pre.output);
255
+ if (pre.blocked) {
256
+ const blocked = textToolResult(`操作被 PreToolUse hook 拦截:${pre.reason ?? ''}。请勿重试,可询问用户希望如何继续。`, true);
257
+ history.push({
258
+ role: 'tool',
259
+ tool_call_id: tc.id,
260
+ content: toolResultForModel(blocked, 1),
261
+ });
262
+ continue;
263
+ }
105
264
  // 破坏性工具:执行前展示预览并请用户确认
106
265
  if (tool?.needsConfirm) {
107
- const args = safeParse(tc.arguments);
108
266
  const preview = tc.name === 'write_file' && writePrinter.anyStreamed
109
267
  ? `写入文件:${args.path ?? ''}(内容已在上方流式展示)`
110
268
  : tool.preview
@@ -116,13 +274,20 @@ export async function runAgentTurn(options) {
116
274
  print(style.tool(`\n✓ 已自动允许(${ruleKey})\n`));
117
275
  }
118
276
  else {
277
+ // 事件模式:先通知「正在请求确认」(决定仍由 confirm 返回)
278
+ onPermissionRequest?.({
279
+ tool: tc.name,
280
+ preview,
281
+ ruleKey: ruleKey ?? undefined,
282
+ });
119
283
  const choice = await confirm(preview, ruleKey ? { ruleKey } : undefined);
120
284
  if (choice === 'no') {
121
285
  print('\n已取消。\n');
286
+ const rejected = textToolResult('用户拒绝执行此操作。请勿重试,可询问用户希望如何继续。', true);
122
287
  history.push({
123
288
  role: 'tool',
124
289
  tool_call_id: tc.id,
125
- content: '用户拒绝执行此操作。请勿重试,可询问用户希望如何继续。',
290
+ content: toolResultForModel(rejected, 1),
126
291
  });
127
292
  continue; // 不执行,继续下一个工具调用
128
293
  }
@@ -146,29 +311,81 @@ export async function runAgentTurn(options) {
146
311
  }
147
312
  // bash 输出实时流式打印:包一层按行折叠(超 40 行停打 + ctrl+o 展开)
148
313
  const bashFold = tc.name === 'bash' ? new LineFoldPrinter(print) : null;
149
- const execCtx = bashFold
150
- ? { ...toolCtx, print: (c) => bashFold.write(c) }
151
- : toolCtx;
314
+ const execCtx = {
315
+ ...toolCtx,
316
+ stepIndex: round + 1,
317
+ print: bashFold
318
+ ? (c) => bashFold.write(c)
319
+ : toolCtx.print,
320
+ };
152
321
  const result = await executeTool(tc.name, tc.arguments, execCtx);
153
322
  bashFold?.finish();
323
+ if (toolKey === lastToolKey) {
324
+ repeatCount++;
325
+ }
326
+ else {
327
+ lastToolKey = toolKey;
328
+ repeatCount = 1;
329
+ }
154
330
  if (onToolResult) {
155
331
  onToolResult(tc, result);
156
332
  }
157
333
  else {
158
334
  print(style.muted(` → ${formatToolResult(tc, result)}\n`));
159
335
  }
336
+ // PostToolUse / PostToolUseFailure hook:只观察(stdout 仅打印给用户,不喂回模型)
337
+ const post = await runHooks(hooks, result.isError ? 'PostToolUseFailure' : 'PostToolUse', {
338
+ cwd: toolCtx.cwd,
339
+ tool_name: tc.name,
340
+ tool_input: args,
341
+ tool_response: result.output,
342
+ }, print);
343
+ if (post.output)
344
+ emitHookOutput(post.output);
160
345
  history.push({
161
346
  role: 'tool',
162
347
  tool_call_id: tc.id,
163
- content: result,
348
+ content: toolResultForModel(result, repeatCount),
164
349
  });
165
350
  }
351
+ // 待办维护提醒:本轮写了 todo 则计数归零;连续多轮没写且还有未完成项时,
352
+ // 往最后一条工具结果后追加提醒(只进模型上下文,不影响用户侧输出)
353
+ if (turn.toolCalls.some((tc) => tc.name === 'todo')) {
354
+ roundsSinceTodoWrite = 0;
355
+ }
356
+ else {
357
+ roundsSinceTodoWrite++;
358
+ const pending = getTodos().filter((t) => t.status !== 'done');
359
+ if (roundsSinceTodoWrite >= TODO_STALE_ROUNDS && pending.length > 0) {
360
+ roundsSinceTodoWrite = 0;
361
+ const last = history[history.length - 1];
362
+ if (last?.role === 'tool' && typeof last.content === 'string') {
363
+ last.content += TODO_STALE_REMINDER;
364
+ }
365
+ }
366
+ }
166
367
  // 继续下一轮,让模型基于工具结果接着回答
167
368
  }
168
369
  // 仅在上限生效(limit > 0)时才会跑到这里;不限(limit<=0)靠模型自己停止。
169
370
  if (limit > 0) {
170
371
  print(style.warn(`\n(已达到工具调用轮数上限 ${limit}。如需更高,请在 config 设 maxStepsPerTurn,或设 0 为不限。)\n`));
372
+ // 历史此时以 tool 结果收尾,模型不知道自己为什么停了;
373
+ // 补一条说明,下一轮对话才能讲清「做到哪、为什么停」
374
+ history.push({
375
+ role: 'user',
376
+ content: `(系统提示:已达到工具调用轮数上限 ${limit},本轮执行被暂停。` +
377
+ '如任务未完成,下次回复请先说明当前进度和剩余工作。)',
378
+ });
379
+ }
380
+ // 待办全部完成:回合结束自动清空(触顶收尾同样处理)
381
+ const tailTodos = getTodos();
382
+ if (tailTodos.length > 0 && tailTodos.every((t) => t.status === 'done')) {
383
+ resetTodos();
171
384
  }
385
+ // Stop hook:轮数触顶收尾,仅观察
386
+ const tailStop = await runHooks(hooks, 'Stop', { cwd, stop_reason: 'round_limit' }, print);
387
+ if (tailStop.output)
388
+ emitHookOutput(tailStop.output);
172
389
  // 触顶收尾同样渲染待办面板
173
390
  const tailPanel = todoPanel && endPanel ? renderTodoPanel() : '';
174
391
  if (tailPanel)
@@ -179,7 +396,7 @@ export async function runAgentTurn(options) {
179
396
  * 以 systemPrompt 开场,把 prompt 作为 user 消息发送,执行一轮后返回。
180
397
  */
181
398
  export async function runOnce(options) {
182
- const { ai, prompt, confirm, print = process.stdout.write.bind(process.stdout), systemPrompt = '你是 CCLI,一个运行在终端里的 AI 助手。回答简洁、准确,使用中文。', mcpManager, configMaxSteps, } = options;
399
+ const { ai, prompt, confirm, print = process.stdout.write.bind(process.stdout), cwd = process.cwd(), systemPrompt = DEFAULT_SYSTEM_PROMPT, mcpManager, configMaxSteps, hooks, sessionId, checkpointsDir, } = options;
183
400
  if (mcpManager) {
184
401
  await registerMcpTools(mcpManager);
185
402
  }
@@ -191,12 +408,16 @@ export async function runOnce(options) {
191
408
  print(chunk);
192
409
  };
193
410
  await runAgentTurn({
411
+ sessionId,
412
+ checkpointsDir,
194
413
  ai,
195
414
  history,
196
415
  confirm,
197
416
  stats: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
198
417
  print: capturePrint,
418
+ cwd,
199
419
  configMaxSteps,
420
+ hooks,
200
421
  });
201
422
  return output;
202
423
  }