neoctl 0.2.44 → 0.2.46

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 (75) hide show
  1. package/dist/context/compaction.d.ts +5 -0
  2. package/dist/context/compaction.js +4 -3
  3. package/dist/context/compaction.js.map +1 -1
  4. package/dist/context/prompts.js +2 -0
  5. package/dist/context/prompts.js.map +1 -1
  6. package/dist/core/abortable-stream.d.ts +2 -0
  7. package/dist/core/abortable-stream.js +35 -0
  8. package/dist/core/abortable-stream.js.map +1 -0
  9. package/dist/core/compaction-progress.d.ts +5 -0
  10. package/dist/core/compaction-progress.js +36 -0
  11. package/dist/core/compaction-progress.js.map +1 -0
  12. package/dist/core/execution-state.d.ts +10 -0
  13. package/dist/core/execution-state.js +18 -0
  14. package/dist/core/execution-state.js.map +1 -0
  15. package/dist/core/image-registry.d.ts +4 -2
  16. package/dist/core/image-registry.js +32 -7
  17. package/dist/core/image-registry.js.map +1 -1
  18. package/dist/core/image-storage.js +4 -0
  19. package/dist/core/image-storage.js.map +1 -1
  20. package/dist/core/query-engine.d.ts +25 -0
  21. package/dist/core/query-engine.js +142 -61
  22. package/dist/core/query-engine.js.map +1 -1
  23. package/dist/core/query.d.ts +5 -1
  24. package/dist/core/query.js +35 -20
  25. package/dist/core/query.js.map +1 -1
  26. package/dist/core/session-images.d.ts +52 -0
  27. package/dist/core/session-images.js +395 -0
  28. package/dist/core/session-images.js.map +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +1 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/model/model-metadata.json +41 -1
  33. package/dist/model/openai-mappers.js +0 -2
  34. package/dist/model/openai-mappers.js.map +1 -1
  35. package/dist/repl/index.js +2 -0
  36. package/dist/repl/index.js.map +1 -1
  37. package/dist/session/session-store.d.ts +9 -0
  38. package/dist/session/session-store.js +18 -2
  39. package/dist/session/session-store.js.map +1 -1
  40. package/dist/tools/builtins/exec-process-manager.d.ts +2 -0
  41. package/dist/tools/builtins/exec-process-manager.js +24 -1
  42. package/dist/tools/builtins/exec-process-manager.js.map +1 -1
  43. package/dist/tools/builtins/framework-feedback-tool.d.ts +26 -0
  44. package/dist/tools/builtins/framework-feedback-tool.js +97 -0
  45. package/dist/tools/builtins/framework-feedback-tool.js.map +1 -0
  46. package/dist/tools/builtins/image-generation-tool.d.ts +2 -0
  47. package/dist/tools/builtins/image-generation-tool.js +31 -141
  48. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  49. package/dist/tools/builtins/image-loader-tool.d.ts +6 -1
  50. package/dist/tools/builtins/image-loader-tool.js +48 -26
  51. package/dist/tools/builtins/image-loader-tool.js.map +1 -1
  52. package/dist/tools/builtins/image-note-tool.js +2 -2
  53. package/dist/tools/builtins/image-note-tool.js.map +1 -1
  54. package/dist/tools/run-tool-use.js +3 -2
  55. package/dist/tools/run-tool-use.js.map +1 -1
  56. package/dist/tools/tool-catalog.d.ts +1 -0
  57. package/dist/tools/tool-catalog.js +2 -0
  58. package/dist/tools/tool-catalog.js.map +1 -1
  59. package/dist/tools/tool.d.ts +1 -0
  60. package/dist/tools/tool.js.map +1 -1
  61. package/dist/types/messages.d.ts +3 -1
  62. package/dist/types/messages.js.map +1 -1
  63. package/dist/web/demo-mode.d.ts +37 -0
  64. package/dist/web/demo-mode.js +141 -0
  65. package/dist/web/demo-mode.js.map +1 -0
  66. package/dist/web/demo-tools.d.ts +37 -0
  67. package/dist/web/demo-tools.js +259 -0
  68. package/dist/web/demo-tools.js.map +1 -0
  69. package/dist/web/demo-video.d.ts +1 -0
  70. package/dist/web/demo-video.js +3 -0
  71. package/dist/web/demo-video.js.map +1 -0
  72. package/dist/web/index.d.ts +43 -2
  73. package/dist/web/index.js +269 -9
  74. package/dist/web/index.js.map +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"image-storage.js","sourceRoot":"","sources":["../../src/core/image-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"image-storage.js","sourceRoot":"","sources":["../../src/core/image-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAqB,MAAM,sBAAsB,CAAC;AAcxE,MAAM,UAAU,0BAA0B,CAAC,OAAqC;IAC9E,MAAM,QAAQ,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAqC;IACpF,IAAI,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC1E,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QACjG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACnE,IAAI,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAmD;IAC3F,MAAM,QAAQ,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAmD;IACjG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,gCAAgC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEnE,MAAM,MAAM,GAAG,gCAAgC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACxF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAmD;IACjG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAA+B,EAAE,UAAuC,EAAE;IACnH,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAiB,EAAE,OAAoC;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,EAAE,CAAC,CAAC;QACjJ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;QACvJ,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtE,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;QAC9H,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,KAAK,OAAO;eACtC,CAAC,MAAM;eACP,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,WAAW;eACzC,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,WAAW,CAAC;QAC/C,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC;QAC5B,OAAO;YACL,GAAG,KAAK;YACR,OAAO;YACP,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;SACxD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU;QAClC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC;QACxD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;IACxG,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,WAAW,EAAE,CAAC;YACvG,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,OAAO;QACP,IAAI,EAAE,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW;YACX,WAAW;SACZ;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,IAAY;IACxD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACtC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY,EAAE,gBAAwB;IACtE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACnF,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,gBAAgB,EAAE,CAAC,CAAC;IAC1H,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;QACxF,MAAM,IAAI,KAAK,CAAC,mCAAmC,gBAAgB,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GAAG,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACvG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACpH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type ExecutionState } from "./execution-state.js";
1
2
  import type { TimingRecord, TimingClock } from "./query-timing.js";
2
3
  import { type AppPromptInput, type AppPromptSnapshot, type AppPromptStore } from "../app/app-prompt.js";
3
4
  import { type ContextManager } from "../context/context-manager.js";
@@ -61,15 +62,33 @@ export interface QueryEngineOptions {
61
62
  toolResultThresholdChars?: number;
62
63
  };
63
64
  }
65
+ export interface QuerySimulation {
66
+ modelGateway: ModelGateway;
67
+ tools: ToolRegistry;
68
+ compactor: Compactor;
69
+ }
64
70
  export declare class QueryEngine {
65
71
  private readonly options;
72
+ private simulation?;
73
+ private readonly displayOnlyMessages;
74
+ /** Instance-local execution boundary; never inherited by forkForSession or written to provider settings. */
75
+ setSimulation(simulation: QuerySimulation): void;
76
+ /** Persist a visible message without submitting it to a model or changing an in-flight context. */
77
+ recordDisplayMessage(message: Message): Promise<Message>;
66
78
  private readonly agentId;
67
79
  private readonly history;
68
80
  private readonly titleTimers;
69
81
  private lastTerminalReason?;
82
+ private executionState?;
83
+ private executionStartedAt?;
84
+ private executionNow;
85
+ getExecutionState(): ExecutionState | undefined;
86
+ markExecutionPaused(): void;
87
+ private setExecutionState;
70
88
  private queryTiming?;
71
89
  private readonly timingRecords;
72
90
  private sessionStore?;
91
+ private imageStore?;
73
92
  private currentModel?;
74
93
  private currentReasoning?;
75
94
  private currentFastMode;
@@ -107,6 +126,12 @@ export declare class QueryEngine {
107
126
  displayText?: string;
108
127
  stopAfterTurn?: QueryOptions["stopAfterTurn"];
109
128
  }): AsyncGenerator<AgentEvent>;
129
+ /** A UI continuation is a runtime action, not an invented user utterance. */
130
+ continueExecution(options?: {
131
+ abortSignal?: AbortSignal;
132
+ stopAfterTurn?: QueryOptions["stopAfterTurn"];
133
+ }): AsyncGenerator<AgentEvent>;
134
+ private runQuery;
110
135
  /** Queue instance-local settings; no prompt messages or provider-global mutation. */
111
136
  updateSessionSettings(patch: SessionSettingsPatch): Promise<{
112
137
  deferred: boolean;
@@ -1,4 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { performance } from "node:perf_hooks";
3
+ import { executionRecoveryHint, isResumableExecution } from "./execution-state.js";
2
4
  import { InMemoryAppState } from "../app/app-state.js";
3
5
  import { InMemoryAppPromptStore } from "../app/app-prompt.js";
4
6
  import { AppPromptContextManager, DefaultContextManager, readProjectMemoryDocuments } from "../context/context-manager.js";
@@ -8,7 +10,7 @@ import { ToolRegistry } from "../tools/registry.js";
8
10
  import { createSystemInitMessage, createTextMessage } from "../types/messages.js";
9
11
  import { buildContextMetrics } from "./context-metrics.js";
10
12
  import { applyRuntimeContextForPromptCache } from "./message-pipeline.js";
11
- import { persistMessageImages } from "./image-storage.js";
13
+ import { SessionImageStore } from "./session-images.js";
12
14
  import { query } from "./query.js";
13
15
  import { runAgent } from "./run-agent.js";
14
16
  import { GENERAL_PURPOSE_AGENT } from "../agents/agent-definition.js";
@@ -19,13 +21,58 @@ import { applySessionPrompt, sessionPromptMode, createSessionPromptSnapshot, par
19
21
  const DEFAULT_SESSION_TITLE_DELAY_MS = 5000;
20
22
  export class QueryEngine {
21
23
  options;
24
+ simulation;
25
+ displayOnlyMessages = [];
26
+ /** Instance-local execution boundary; never inherited by forkForSession or written to provider settings. */
27
+ setSimulation(simulation) {
28
+ if (this.running)
29
+ throw new Error("cannot replace execution while a query is running");
30
+ this.cancelPendingTitleWork();
31
+ this.simulation = simulation;
32
+ }
33
+ /** Persist a visible message without submitting it to a model or changing an in-flight context. */
34
+ async recordDisplayMessage(message) {
35
+ await this.initialize();
36
+ const store = this.sessionStore;
37
+ const windowId = store?.snapshot().firstWindowId;
38
+ const stored = await this.imageStore.persistMessage({ ...message, metadata: { ...message.metadata, displayOnly: true } });
39
+ if (store !== this.sessionStore || windowId !== store?.snapshot().firstWindowId)
40
+ throw new Error("Session changed while recording message");
41
+ if (store)
42
+ store.recordMessage(stored);
43
+ else
44
+ this.displayOnlyMessages.push(stored);
45
+ return stored;
46
+ }
22
47
  agentId;
23
48
  history = [];
24
49
  titleTimers = new Set();
25
50
  lastTerminalReason;
51
+ executionState;
52
+ executionStartedAt;
53
+ executionNow() {
54
+ return this.options.timingClock?.monotonicNow() ?? performance.now();
55
+ }
56
+ getExecutionState() {
57
+ if (!this.executionState)
58
+ return undefined;
59
+ const elapsedMs = (this.executionState.elapsedMs ?? 0) + (this.executionStartedAt === undefined
60
+ ? 0 : Math.max(0, this.executionNow() - this.executionStartedAt));
61
+ return { ...this.executionState, elapsedMs: Math.floor(elapsedMs) };
62
+ }
63
+ markExecutionPaused() {
64
+ this.setExecutionState({ status: "paused", reason: "user_pause" });
65
+ }
66
+ setExecutionState(state) {
67
+ const elapsedMs = state.elapsedMs ?? this.getExecutionState()?.elapsedMs ?? 0;
68
+ this.executionState = { ...state, elapsedMs };
69
+ this.executionStartedAt = state.status === "running" ? this.executionNow() : undefined;
70
+ this.sessionStore?.recordExecutionState(this.executionState);
71
+ }
26
72
  queryTiming;
27
73
  timingRecords = new Map();
28
74
  sessionStore;
75
+ imageStore;
29
76
  currentModel;
30
77
  currentReasoning;
31
78
  currentFastMode = false;
@@ -103,6 +150,7 @@ export class QueryEngine {
103
150
  if (this.options.session?.enabled !== false && this.options.session) {
104
151
  await this.openSession({ sessionId: this.options.session.sessionId, resume: this.options.session.resume });
105
152
  }
153
+ this.imageStore ??= await SessionImageStore.open(undefined, this.agentId);
106
154
  this.sessionInitialized = true;
107
155
  })();
108
156
  this.sessionInitialization = initialization;
@@ -152,13 +200,35 @@ export class QueryEngine {
152
200
  rootDir: this.options.session.rootDir,
153
201
  });
154
202
  }
155
- async *sendUserText(text, options = {}) {
203
+ sendUserText(text, options = {}) {
204
+ return this.runQuery(text, options);
205
+ }
206
+ /** A UI continuation is a runtime action, not an invented user utterance. */
207
+ continueExecution(options = {}) {
208
+ return this.runQuery(undefined, options);
209
+ }
210
+ async *runQuery(text, options = {}) {
156
211
  if (this.running)
157
212
  throw new Error("query engine is already running");
158
213
  this.running = true;
214
+ let terminalReceived = false;
215
+ let queryAccepted = text !== undefined;
159
216
  try {
160
217
  await this.settingsMutation;
161
218
  await this.initialize();
219
+ const recovery = isResumableExecution(this.executionState) ? this.executionState : undefined;
220
+ if (text === undefined && !recovery)
221
+ throw new Error("No interrupted execution to continue");
222
+ queryAccepted = true;
223
+ if (recovery) {
224
+ this.pendingRequestContext = { ...this.pendingRequestContext,
225
+ executionRecovery: executionRecoveryHint(recovery),
226
+ ...(text === undefined ? { continuationAction: "用户点击了继续按钮,请继续尚未完成的任务。这是运行时动作,不是用户发送的新消息。" } : {}),
227
+ };
228
+ }
229
+ const elapsedMs = recovery?.elapsedMs ?? 0;
230
+ this.setExecutionState(options.abortSignal?.aborted
231
+ ? { status: "paused", reason: "user_pause", elapsedMs } : { status: "running", elapsedMs });
162
232
  const cwdTransitionPaths = this.pendingCwdTransitionPaths;
163
233
  const pendingRequestContext = this.pendingRequestContext;
164
234
  const pendingRequestContextConsumed = this.pendingRequestContextConsumed;
@@ -166,18 +236,20 @@ export class QueryEngine {
166
236
  this.options.cwdTransitionPaths = undefined;
167
237
  if (cwdTransitionPaths?.length)
168
238
  void this.options.onCwdTransitionConsumed?.();
169
- const userMessage = options.blocks
170
- ? await this.persistMessageImages({
171
- ...createTextMessage("user", options.displayText ?? text),
172
- blocks: options.blocks,
173
- })
174
- : createTextMessage("user", text);
175
- this.history.push(userMessage);
176
- this.sessionStore?.recordMessage(userMessage);
177
- this.scheduleSessionTitleCheck();
239
+ if (text !== undefined) {
240
+ const userMessage = options.blocks
241
+ ? await this.persistMessageImages({
242
+ ...createTextMessage("user", options.displayText ?? text),
243
+ blocks: options.blocks,
244
+ })
245
+ : createTextMessage("user", text);
246
+ this.history.push(userMessage);
247
+ this.sessionStore?.recordMessage(userMessage);
248
+ this.scheduleSessionTitleCheck();
249
+ }
178
250
  const initMessage = createSystemInitMessage({
179
251
  agentId: this.agentId,
180
- tools: this.options.tools.names(),
252
+ tools: (this.simulation?.tools ?? this.options.tools).names(),
181
253
  model: this.currentModel,
182
254
  commands: [...(this.options.commands ?? [])],
183
255
  agents: [...(this.options.agents ?? [])],
@@ -220,22 +292,26 @@ export class QueryEngine {
220
292
  } : undefined,
221
293
  abortSignal: options.abortSignal,
222
294
  stopAfterTurn: options.stopAfterTurn,
223
- beforeTurn: (messages) => {
224
- this.options.refreshTools?.(this);
225
- return this.consumeSessionSettings(messages);
295
+ beforeTurn: (messages, started) => {
296
+ if (!this.simulation)
297
+ this.options.refreshTools?.(this);
298
+ return this.consumeSessionSettings(messages, started);
226
299
  },
227
300
  };
228
301
  const stream = query(this.history, {
229
302
  ...this.options,
230
- acquireTurnResources: this.options.acquireTurnResources ? () => this.options.acquireTurnResources(this) : undefined,
303
+ acquireTurnResources: this.simulation ? undefined : this.options.acquireTurnResources ? () => this.options.acquireTurnResources(this) : undefined,
304
+ tools: this.simulation?.tools ?? this.options.tools,
305
+ compactor: this.simulation?.compactor ?? this.options.compactor,
231
306
  onTimingState: timing => { this.queryTiming = timing; },
232
307
  onTiming: record => {
233
308
  this.timingRecords.set(record.id, { ...record });
234
309
  this.sessionStore?.recordTiming(record);
235
310
  },
236
311
  contextManager: this.contextManager,
237
- modelGateway: this.currentModelGateway,
312
+ modelGateway: this.simulation?.modelGateway ?? this.currentModelGateway,
238
313
  taskNotificationSource: this.options.taskNotificationSource,
314
+ imageStore: this.imageStore,
239
315
  toolResultMemory: this.sessionStore?.toolResultMemory,
240
316
  session: this.sessionStore ? { sessionId: this.sessionStore.sessionId, sessionDir: this.sessionStore.sessionDir, rootDir: this.options.session?.rootDir } : undefined,
241
317
  recordContentReplacements: (records) => this.sessionStore?.recordContentReplacements(records),
@@ -253,13 +329,17 @@ export class QueryEngine {
253
329
  continue;
254
330
  }
255
331
  if (event.type === "terminal") {
332
+ terminalReceived = true;
256
333
  this.lastTerminalReason = event.reason;
257
- // The final assistant/tool messages have already been recorded by this wrapper.
258
- const hadPending = Object.keys(this.pendingSessionSettings).length > 0;
259
- for (const result of await this.flushSessionSettings()) {
260
- if (result.report)
261
- yield { type: "context.compacted", compaction: result.report };
334
+ if (this.executionState?.status !== "paused") {
335
+ this.setExecutionState({
336
+ status: event.reason === "completed" || event.reason === "turn_yielded" ? "completed" : "interrupted",
337
+ reason: event.reason,
338
+ });
262
339
  }
340
+ // Settle ordinary settings only; pending compact waits for the next model call.
341
+ const hadPending = Object.keys(this.pendingSessionSettings).length > 0;
342
+ await this.flushSessionSettings();
263
343
  if (hadPending)
264
344
  yield { type: "context.metrics", metrics: await this.contextMetrics() };
265
345
  }
@@ -267,12 +347,12 @@ export class QueryEngine {
267
347
  }
268
348
  }
269
349
  finally {
270
- // Covers initialization errors, aborts, exceptions and consumer generator.return().
271
- // Do not yield in finally: a closing consumer may never resume the generator.
350
+ // Even a failed journal write must release the engine run lock.
272
351
  try {
273
- do {
274
- await this.flushSessionSettings();
275
- } while (Object.keys(this.pendingSessionSettings).length);
352
+ if (queryAccepted && !terminalReceived && this.executionState?.status !== "paused") {
353
+ this.setExecutionState({ status: "interrupted", reason: "unexpected_termination" });
354
+ }
355
+ await this.flushSessionSettings();
276
356
  }
277
357
  finally {
278
358
  this.running = false;
@@ -302,6 +382,8 @@ export class QueryEngine {
302
382
  }
303
383
  const mutation = this.settingsMutation.then(async () => {
304
384
  await this.initialize();
385
+ if (normalized.compact)
386
+ delete this.pendingSessionSettings.compact;
305
387
  const update = await this.applySessionSettings(normalized, this.getHistoryMessages());
306
388
  if (update?.compaction)
307
389
  this.applyCompactionResult(update.compaction);
@@ -357,14 +439,14 @@ export class QueryEngine {
357
439
  patch.sessionPrompt = { ...patch.sessionPrompt };
358
440
  return patch;
359
441
  }
360
- async consumeSessionSettings(messages) {
442
+ async consumeSessionSettings(messages, started) {
361
443
  const patch = this.pendingSessionSettings;
362
444
  if (!Object.keys(patch).length)
363
445
  return undefined;
364
446
  this.pendingSessionSettings = {};
365
- return this.applySessionSettings(patch, messages);
447
+ return this.applySessionSettings(patch, messages, started);
366
448
  }
367
- async applySessionSettings(patch, messages) {
449
+ async applySessionSettings(patch, messages, started) {
368
450
  const changed = {};
369
451
  if (Object.hasOwn(patch, "sessionPrompt"))
370
452
  this.activeSessionPrompt = patch.sessionPrompt ?? null;
@@ -388,23 +470,21 @@ export class QueryEngine {
388
470
  }
389
471
  let compaction;
390
472
  if (patch.compact) {
391
- const compactor = this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
392
- const budget = { ...this.options.contextBudget, contextWindowTokens: this.currentContextWindowTokens ?? this.options.contextBudget?.contextWindowTokens };
473
+ started?.("manualcompact");
474
+ const compactor = this.simulation?.compactor ?? this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
475
+ const budget = { ...this.options.contextBudget, imageRegistry: this.imageStore?.snapshot(), contextWindowTokens: this.currentContextWindowTokens ?? this.options.contextBudget?.contextWindowTokens };
393
476
  compaction = withCompactionReport(await (compactor.manualCompact?.(messages, budget) ?? compactor.compact(messages, budget)), messages.length);
394
477
  }
395
478
  return Object.keys(changed).length || compaction ? { settings: changed, compaction } : undefined;
396
479
  }
397
480
  async flushSessionSettings() {
398
- const results = [];
399
- while (Object.keys(this.pendingSessionSettings).length) {
400
- const update = await this.consumeSessionSettings(this.getHistoryMessages());
401
- if (update?.compaction) {
402
- this.applyCompactionResult(update.compaction);
403
- if (update.compaction.changed)
404
- results.push(update.compaction);
405
- }
481
+ // Ordinary settings can settle at the terminal boundary. A busy compact request
482
+ // must wait for the next model call, including when the current query ends/aborts.
483
+ while (Object.keys(this.pendingSessionSettings).some(key => key !== "compact")) {
484
+ const { compact, ...patch } = this.pendingSessionSettings;
485
+ this.pendingSessionSettings = compact ? { compact: true } : {};
486
+ await this.applySessionSettings(patch, this.getHistoryMessages());
406
487
  }
407
- return results;
408
488
  }
409
489
  setModel(model, reasoning, updateReasoning = false) {
410
490
  this.currentModel = model?.trim() || undefined;
@@ -464,9 +544,13 @@ export class QueryEngine {
464
544
  reset() {
465
545
  if (this.running)
466
546
  throw new Error("cannot reset while query engine is running");
547
+ this.simulation = undefined;
548
+ this.displayOnlyMessages.length = 0;
467
549
  this.pendingSessionSettings = {};
468
550
  this.history.length = 0;
469
551
  this.lastTerminalReason = undefined;
552
+ this.executionState = undefined;
553
+ this.executionStartedAt = undefined;
470
554
  this.cancelPendingTitleWork();
471
555
  this.sessionStore?.reset();
472
556
  this.queryTiming = undefined;
@@ -483,9 +567,10 @@ export class QueryEngine {
483
567
  await this.initialize();
484
568
  if (options.abortSignal?.aborted)
485
569
  return { messages: this.getHistoryMessages(), changed: false, reason: "none" };
486
- const compactor = this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
570
+ const compactor = this.simulation?.compactor ?? this.options.compactor ?? new ModelDrivenCompactor(this.currentModelGateway);
487
571
  const contextBudget = {
488
572
  ...this.options.contextBudget,
573
+ imageRegistry: this.imageStore?.snapshot(),
489
574
  contextWindowTokens: this.currentContextWindowTokens ?? this.options.contextBudget?.contextWindowTokens,
490
575
  };
491
576
  const result = withCompactionReport(await (compactor.pureCompact?.(this.history, contextBudget) ?? { messages: this.getHistoryMessages(), changed: false, reason: "none" }), this.history.length);
@@ -521,7 +606,7 @@ export class QueryEngine {
521
606
  return [...records.values()].map(record => ({ ...record }));
522
607
  }
523
608
  getDisplayEntries() {
524
- return this.sessionStore?.getDisplayEntries() ?? this.history.map((message) => ({ type: "message", message: cloneMessage(message) }));
609
+ return this.sessionStore?.getDisplayEntries() ?? [...this.history, ...this.displayOnlyMessages].map((message) => ({ type: "message", message: cloneMessage(message) }));
525
610
  }
526
611
  applyCompactionResult(result) {
527
612
  if (!result.changed)
@@ -559,14 +644,14 @@ export class QueryEngine {
559
644
  return this.buildPromptExportSnapshot(this.getHistoryMessages());
560
645
  }
561
646
  refreshToolsIfIdle() {
562
- if (!this.running)
647
+ if (!this.running && !this.simulation)
563
648
  this.options.refreshTools?.(this);
564
649
  }
565
650
  async buildPromptExportSnapshot(messages, desiredState = this.sessionPromptState) {
566
651
  this.refreshToolsIfIdle();
567
652
  const toolContext = {
568
653
  agentId: this.agentId,
569
- tools: this.options.tools,
654
+ tools: this.simulation?.tools ?? this.options.tools,
570
655
  appState: new InMemoryAppState(this.agentId, this.options.cwd),
571
656
  toolResultMemory: this.sessionStore?.toolResultMemory,
572
657
  session: this.sessionStore ? {
@@ -585,7 +670,7 @@ export class QueryEngine {
585
670
  },
586
671
  emit: () => undefined,
587
672
  };
588
- const initialToolDefinitions = this.options.tools.definitions(toolContext);
673
+ const initialToolDefinitions = (this.simulation?.tools ?? this.options.tools).definitions(toolContext);
589
674
  const activePrompt = this.activeSessionPrompt;
590
675
  const baseline = await this.baselineContextManager.build({
591
676
  agentId: this.agentId,
@@ -630,24 +715,15 @@ export class QueryEngine {
630
715
  };
631
716
  }
632
717
  async persistMessageImages(message) {
633
- if (!message.blocks.some((block) => block.type === "image"))
634
- return message;
635
- const persistedBlocks = await persistMessageImages(message.blocks, { sessionDir: this.sessionStore?.sessionDir, agentId: this.agentId });
636
- const hasRetention = typeof message.metadata?.imageRetention === "string";
637
- return {
638
- ...message,
639
- blocks: persistedBlocks,
640
- metadata: message.role === "user"
641
- ? { ...message.metadata, imageRetention: "pinned", imageTtlTurns: undefined }
642
- : hasRetention
643
- ? message.metadata
644
- : { ...message.metadata, imageRetention: "while_relevant", imageTtlTurns: 4 },
645
- };
718
+ this.imageStore ??= await SessionImageStore.open(this.sessionStore?.sessionDir, this.agentId);
719
+ return this.imageStore.persistMessage(message);
646
720
  }
647
721
  async openSession(options) {
648
722
  if (this.options.session?.enabled === false || !this.options.session)
649
723
  return;
650
724
  this.cancelPendingTitleWork();
725
+ this.simulation = undefined;
726
+ this.displayOnlyMessages.length = 0;
651
727
  this.sessionStore = await SessionStore.open({
652
728
  agentId: this.agentId,
653
729
  cwd: this.options.cwd ?? process.cwd(),
@@ -656,6 +732,11 @@ export class QueryEngine {
656
732
  resume: options.resume,
657
733
  toolResultThresholdChars: this.options.session.toolResultThresholdChars,
658
734
  });
735
+ this.imageStore = await SessionImageStore.open(this.sessionStore.sessionDir, this.agentId);
736
+ const execution = this.sessionStore.getExecutionState();
737
+ this.executionState = execution?.status === "running"
738
+ ? { ...execution, status: "interrupted", reason: "runtime_terminated" } : execution;
739
+ this.executionStartedAt = undefined;
659
740
  this.pendingSessionSettings = {};
660
741
  this.sessionPromptState = this.sessionStore.getSessionPrompt();
661
742
  this.activeSessionPrompt = this.sessionPromptState ?? null;
@@ -674,7 +755,7 @@ export class QueryEngine {
674
755
  }
675
756
  scheduleSessionTitleCheck() {
676
757
  const store = this.sessionStore;
677
- if (!store || titleWorkComplete(store))
758
+ if (this.simulation || !store || titleWorkComplete(store))
678
759
  return;
679
760
  const version = this.titleSchedulerVersion;
680
761
  const timer = setTimeout(() => {
@@ -689,7 +770,7 @@ export class QueryEngine {
689
770
  if (version !== this.titleSchedulerVersion)
690
771
  return;
691
772
  const store = this.sessionStore;
692
- if (!store || titleWorkComplete(store))
773
+ if (this.simulation || !store || titleWorkComplete(store))
693
774
  return;
694
775
  if (this.titleAgentRun?.version === version)
695
776
  return;