@cjhyy/code-shell-core 0.7.0 → 0.8.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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,58 @@
1
+ import { type SessionBundle, type SessionStateFieldPatch } from "../session/session-manager.js";
2
+ import { type CumulativeUsageCounters } from "../session/usage.js";
3
+ import type { GoalTerminationReason } from "../goal/lifecycle.js";
4
+ import type { Message, TokenUsage } from "../types.js";
5
+ import type { LLMUsageTracker } from "../llm/types.js";
6
+ import type { LLMClientBase } from "../llm/client-base.js";
7
+ import type { HookEventName, HookResult } from "../hooks/events.js";
8
+ import type { TurnLoop } from "./turn-loop.js";
9
+ import type { EngineResult } from "./types.js";
10
+ import type { EngineRunOptions, RunBehaviorProfile } from "./run-types.js";
11
+ type TurnLoopRunResult = Awaited<ReturnType<TurnLoop["run"]>>;
12
+ /** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
13
+ export declare function drainHeadlessBackgroundAgents(args: {
14
+ sid: string;
15
+ session: SessionBundle;
16
+ signal: AbortSignal | undefined;
17
+ initialResult: TurnLoopRunResult;
18
+ runTurnLoop: (messages: Message[]) => Promise<TurnLoopRunResult>;
19
+ applyGoalTermination: (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
20
+ waitForBackgroundAgentChange: (sid: string, signal?: AbortSignal) => Promise<boolean>;
21
+ waitForBackgroundAgentChangeOrTimeout: (sid: string, ms: number) => Promise<boolean>;
22
+ getFirstGoalTermination: () => GoalTerminationReason | undefined;
23
+ setFirstGoalTermination: (t: GoalTerminationReason | undefined) => void;
24
+ }): Promise<TurnLoopRunResult>;
25
+ /** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
26
+ export declare function finalizeRunSuccess(args: {
27
+ session: SessionBundle;
28
+ result: TurnLoopRunResult;
29
+ firstGoalTermination: GoalTerminationReason | undefined;
30
+ turnCount: number;
31
+ getRunUsage: () => LLMUsageTracker;
32
+ usageBaseline: TokenUsage;
33
+ userContextMsg: Message | null;
34
+ dynamicContextMsg: Message | null;
35
+ setCompactedMessages: (sid: string, messages: Message[]) => void;
36
+ setLastMessages: (messages: Message[]) => void;
37
+ options: EngineRunOptions | undefined;
38
+ emitHook: (event: HookEventName, payload: Record<string, unknown>, signal?: AbortSignal) => Promise<HookResult>;
39
+ cwd: string;
40
+ llmClient: LLMClientBase;
41
+ auxSummaryClient: LLMClientBase;
42
+ recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters;
43
+ runMemoryPipeline: (transcript: SessionBundle["transcript"], sessionId: string, cwd: string, llmClient: LLMClientBase, recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters) => Promise<void> | void;
44
+ updatePersistedSessionState: (sid: string, patch: SessionStateFieldPatch) => void;
45
+ persistFinalRunState: (state: SessionBundle["state"]) => void;
46
+ markRunAccountingFinalized: () => void;
47
+ costStoreSerialize: (() => Record<string, unknown>) | undefined;
48
+ profile: RunBehaviorProfile | undefined;
49
+ getProfileReportedResults: () => Record<string, unknown> | undefined;
50
+ }): Promise<EngineResult>;
51
+ /** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
52
+ export declare function buildRunFailureResult(args: {
53
+ err: unknown;
54
+ session: SessionBundle;
55
+ options: EngineRunOptions | undefined;
56
+ persistFinalRunState: (state: SessionBundle["state"]) => void;
57
+ }): EngineResult;
58
+ export {};
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Run finalize — the headless background-agent drain loop, the success-path
3
+ * epilogue (persistence, hooks, memory pipeline trigger, session title,
4
+ * result assembly) and the initialization-failure terminal result.
5
+ */
6
+ import { asyncAgentRegistry } from "../tool-system/builtin/agent-registry.js";
7
+ import { buildNotificationMessage, notificationQueue, } from "../tool-system/builtin/agent-notifications.js";
8
+ import { logger } from "../logging/logger.js";
9
+ import { recordSessionEnd } from "../logging/session-recorder.js";
10
+ import { isEphemeralSessionState, } from "../session/session-manager.js";
11
+ import { foldRunUsage } from "../session/usage.js";
12
+ import { buildSessionTitle } from "./session-title.js";
13
+ import { formatFriendlyError } from "./friendly-error.js";
14
+ import { stripInjectedContextMessages } from "./injected-context-cache.js";
15
+ /** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
16
+ export async function drainHeadlessBackgroundAgents(args) {
17
+ const { sid, session } = args;
18
+ let result = args.initialResult;
19
+ let aborted = args.signal?.aborted === true;
20
+ // Loop: a summarize turn can spawn a NEW background sub-agent; keep
21
+ // draining + summarizing until none remain. turnCount accumulates, so
22
+ // the turn-loop's maxTurns still bounds runaway re-summarization.
23
+ for (;;) {
24
+ while (!aborted && asyncAgentRegistry.hasRunningForSession(sid)) {
25
+ aborted = await args.waitForBackgroundAgentChange(sid, args.signal);
26
+ }
27
+ let pending = notificationQueue.drainAll(sid);
28
+ if (aborted && pending.length === 0) {
29
+ // Abort race: an agent calls markCompleted (registry notify) and only
30
+ // THEN enqueue (queue notify) as two separate statements. If the abort
31
+ // fired before that agent's completion `.then` ran, the while above
32
+ // exited on `aborted`, this drainAll caught nothing, and a naive
33
+ // `break` here would drop the agent's output. Give still-settling
34
+ // agents a bounded window to finish enqueuing, then drain once more.
35
+ // Each wait is timeout-bounded so a genuinely stuck (never-completing)
36
+ // agent can't hang abort cleanup forever — we'd rather lose nothing in
37
+ // the common case and not hang in the pathological one.
38
+ for (let i = 0; i < 20 && asyncAgentRegistry.hasRunningForSession(sid); i++) {
39
+ const changed = await args.waitForBackgroundAgentChangeOrTimeout(sid, 25);
40
+ if (!changed)
41
+ break; // timed out with no state change → stop waiting
42
+ }
43
+ pending = notificationQueue.drainAll(sid);
44
+ if (pending.length === 0)
45
+ break;
46
+ }
47
+ else if (pending.length === 0) {
48
+ break;
49
+ }
50
+ const injected = {
51
+ role: "user",
52
+ content: `<system-reminder>\n${buildNotificationMessage(pending)}\n</system-reminder>`,
53
+ };
54
+ if (aborted || args.getFirstGoalTermination()) {
55
+ // Mark injected: a synthetic notification, not the user's own input —
56
+ // the disk reader drops it on replay so no phantom user bubble.
57
+ // A goal termination is also a hard boundary: retain the notification
58
+ // for recovery, but never re-enter TurnLoop (which would reset its
59
+ // run-scoped goal budget tracker and could overwrite the first reason).
60
+ session.transcript.appendMessage(injected.role, injected.content, { injected: true });
61
+ result = { ...result, messages: [...result.messages, injected] };
62
+ break;
63
+ }
64
+ result = await args.runTurnLoop([...result.messages, injected]);
65
+ args.setFirstGoalTermination(args.getFirstGoalTermination() ?? result.goalTermination);
66
+ args.applyGoalTermination(result.goalTermination, result.goalTerminationRound);
67
+ }
68
+ return result;
69
+ }
70
+ /** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
71
+ export async function finalizeRunSuccess(args) {
72
+ const { session, result, firstGoalTermination, turnCount, getRunUsage, usageBaseline, userContextMsg, dynamicContextMsg, options, cwd, llmClient, auxSummaryClient, recordExternalBilledUsage, profile, } = args;
73
+ args.setLastMessages(result.messages);
74
+ const cachedMessages = stripInjectedContextMessages(result.messages, userContextMsg, dynamicContextMsg);
75
+ args.setCompactedMessages(session.state.sessionId, cachedMessages);
76
+ logger.info("engine.done", {
77
+ sessionId: session.state.sessionId,
78
+ reason: result.reason,
79
+ turns: turnCount,
80
+ tokens: getRunUsage().totalTokens,
81
+ });
82
+ recordSessionEnd(session.state.sessionId, {
83
+ reason: result.reason,
84
+ turns: turnCount,
85
+ cost: getRunUsage(),
86
+ });
87
+ // Session-level hook: fired symmetrically with on_session_start once
88
+ // the turn loop has resolved (completion, error, or abort). Handlers
89
+ // are notify-only — any returned messages are dropped because the run
90
+ // is already over and there's no next turn to inject into.
91
+ await args.emitHook("on_session_end", {
92
+ sessionId: session.state.sessionId,
93
+ reason: result.reason,
94
+ turnCount,
95
+ }, options?.signal);
96
+ // Ephemeral side chats must never leak into durable memory, even after
97
+ // the user explicitly elevates tool permissions for a turn. Lifecycle
98
+ // isolation is independent of the run-scoped behavior/permission mode.
99
+ if (!isEphemeralSessionState(session.state)) {
100
+ // Fire-and-forget memory pipeline: extract durable memories from the
101
+ // transcript, save a session summary, and conditionally trigger
102
+ // auto-dream consolidation. Doesn't block the Engine result.
103
+ void args.runMemoryPipeline(session.transcript, session.state.sessionId, cwd, llmClient, recordExternalBilledUsage);
104
+ }
105
+ // Fire-and-forget session title generation — only after the FIRST turn.
106
+ // Reuses the already-resolved auxSummaryClient (aux model, cheap). Best-
107
+ // effort: failures never touch the run result. The renderer writes the
108
+ // title into the sidebar on receipt of the session_title stream event.
109
+ {
110
+ const messageEvents = session.transcript.getEvents("message");
111
+ const userMsgEvents = messageEvents.filter((e) => e.data.role === "user");
112
+ const userMsgCount = userMsgEvents.length;
113
+ const onStream = options?.onStream;
114
+ if (userMsgCount === 1 && onStream && result.text) {
115
+ const sessionId = session.state.sessionId;
116
+ const rawContent = userMsgEvents[0]?.data?.content;
117
+ const firstUserText = typeof rawContent === "string" ? rawContent : JSON.stringify(rawContent ?? "");
118
+ void buildSessionTitle(auxSummaryClient, firstUserText, result.text, recordExternalBilledUsage)
119
+ .then((title) => {
120
+ if (title) {
121
+ // Persist the title so it survives a localStorage wipe / disk
122
+ // rebuild — it used to live only in the renderer's localStorage
123
+ // index. Read the latest persisted state at callback time and
124
+ // merge only title; the completed run's session.state snapshot
125
+ // may already be stale after later serial session updates.
126
+ args.updatePersistedSessionState(sessionId, { title });
127
+ onStream({
128
+ type: "session_title",
129
+ sessionId,
130
+ title,
131
+ });
132
+ }
133
+ })
134
+ .catch(() => { });
135
+ }
136
+ }
137
+ // Update session state. Persist the raw terminal reason as the status so
138
+ // callers can distinguish user-cancelled (aborted_streaming) from real
139
+ // failures (model_error, prompt_too_long, ...) — previously every
140
+ // non-completed outcome collapsed to "errored", which threw away the
141
+ // distinction and misled anyone reading state.json.
142
+ const transcriptFlushFailed = session.transcript.flushFailed();
143
+ if (transcriptFlushFailed) {
144
+ const failure = session.transcript.getFlushFailure();
145
+ logger.error("engine.transcript_persistence_failed", {
146
+ sessionId: session.state.sessionId,
147
+ terminalReason: result.reason,
148
+ degraded: true,
149
+ ...failure,
150
+ });
151
+ }
152
+ options?.onAgentProgress?.({ type: "phase", phase: "finalizing" });
153
+ session.state.turnCount = turnCount;
154
+ session.state.status = result.reason;
155
+ if (result.reason === "completed" && result.completionKind) {
156
+ session.state.lastCompletionKind = result.completionKind;
157
+ }
158
+ else {
159
+ delete session.state.lastCompletionKind;
160
+ }
161
+ if (result.reason === "completed") {
162
+ session.state.completedSnapshotVersion = 1;
163
+ if (!transcriptFlushFailed) {
164
+ session.state.completedThroughEventId = session.transcript.getEvents().at(-1)?.id;
165
+ }
166
+ }
167
+ // Session-cumulative (baseline + this run) for persistence...
168
+ const usage = getRunUsage();
169
+ session.state.tokenUsage = foldRunUsage(usageBaseline, usage);
170
+ if (args.costStoreSerialize) {
171
+ session.state.costState = args.costStoreSerialize();
172
+ }
173
+ args.persistFinalRunState(session.state);
174
+ args.markRunAccountingFinalized();
175
+ // Hook: agent end
176
+ await args.emitHook("on_agent_end", {
177
+ sessionId: session.state.sessionId,
178
+ reason: result.reason,
179
+ turnCount,
180
+ }, options?.signal);
181
+ // Emit completion
182
+ options?.onStream?.({
183
+ type: "turn_complete",
184
+ reason: result.reason,
185
+ ...(result.completionKind ? { completionKind: result.completionKind } : {}),
186
+ });
187
+ // Structured results the active profile's run services reported, keyed
188
+ // by profile id. petWorkDelegation stays as a compat mirror of
189
+ // extensions.pet?.workDelegation until pet-aware hosts migrate.
190
+ const profileReportedResults = args.getProfileReportedResults();
191
+ const runExtensions = profile && profileReportedResults ? { [profile.id]: profileReportedResults } : undefined;
192
+ const petWorkDelegationMirror = runExtensions?.pet?.workDelegation;
193
+ return {
194
+ text: result.text,
195
+ reason: result.reason,
196
+ goalTermination: firstGoalTermination,
197
+ sessionId: session.state.sessionId,
198
+ turnCount,
199
+ usage: {
200
+ promptTokens: usage.totalPromptTokens,
201
+ completionTokens: usage.totalCompletionTokens,
202
+ totalTokens: usage.totalTokens,
203
+ cacheReadTokens: usage.totalCacheReadTokens,
204
+ cacheCreationTokens: usage.totalCacheCreationTokens,
205
+ },
206
+ ...(runExtensions ? { extensions: runExtensions } : {}),
207
+ ...(petWorkDelegationMirror ? { petWorkDelegation: petWorkDelegationMirror } : {}),
208
+ };
209
+ }
210
+ /** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
211
+ export function buildRunFailureResult(args) {
212
+ const { err, session, options } = args;
213
+ // The session is already persisted as active before runWithSid starts.
214
+ // Initialization failures (client creation, MCP connection, prompt/hooks)
215
+ // therefore need the same terminal lifecycle treatment as turn-loop errors.
216
+ const error = formatFriendlyError(err);
217
+ session.state.status = "model_error";
218
+ delete session.state.lastCompletionKind;
219
+ args.persistFinalRunState(session.state);
220
+ session.transcript.appendError(error, { phase: "initialization" });
221
+ logger.error("engine.run_lifecycle_failed", {
222
+ sessionId: session.state.sessionId,
223
+ error: err instanceof Error ? err.message : String(err),
224
+ });
225
+ recordSessionEnd(session.state.sessionId, {
226
+ reason: "model_error",
227
+ turns: session.state.turnCount,
228
+ });
229
+ options?.onStream?.({ type: "error", error });
230
+ options?.onStream?.({ type: "turn_complete", reason: "model_error" });
231
+ const usage = session.state.tokenUsage;
232
+ return {
233
+ text: `ERROR: ${error}`,
234
+ reason: "model_error",
235
+ sessionId: session.state.sessionId,
236
+ turnCount: session.state.turnCount,
237
+ usage: {
238
+ promptTokens: usage.promptTokens ?? 0,
239
+ completionTokens: usage.completionTokens ?? 0,
240
+ totalTokens: usage.totalTokens ?? 0,
241
+ cacheReadTokens: usage.cacheReadTokens ?? 0,
242
+ cacheCreationTokens: usage.cacheCreationTokens ?? 0,
243
+ },
244
+ };
245
+ }
@@ -0,0 +1,58 @@
1
+ import type { StreamCallback, TokenUsage } from "../types.js";
2
+ import { type GoalConfig, type GoalTerminationReason, type PersistedGoalTerminationReason } from "../goal/lifecycle.js";
3
+ import { createGoalStopHook, type GoalJudgeRuntimeContext } from "../hooks/goal-stop-hook.js";
4
+ import type { HookRegistry } from "../hooks/registry.js";
5
+ import type { LLMClientBase } from "../llm/client-base.js";
6
+ import type { GoalTerminalSaveOutcome, SessionBundle, SessionManager } from "../session/session-manager.js";
7
+ import type { TurnLoop } from "./turn-loop.js";
8
+ import type { EngineConfig } from "./types.js";
9
+ import type { EngineRunOptions } from "./run-types.js";
10
+ export type GoalStopHookHandler = ReturnType<typeof createGoalStopHook>;
11
+ export interface GoalRunSlots {
12
+ getActiveRuntimeGoal(): GoalConfig | null;
13
+ setActiveRuntimeGoal(goal: GoalConfig | null): void;
14
+ getActivePersistedRunGoal(): GoalConfig | null;
15
+ setActivePersistedRunGoal(goal: GoalConfig | null): void;
16
+ getActiveGoalHook(): GoalStopHookHandler | null;
17
+ setActiveGoalHook(hook: GoalStopHookHandler | null): void;
18
+ setActiveGoalHookAttached(attached: boolean): void;
19
+ }
20
+ /** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
21
+ export declare function resolveRunGoal(args: {
22
+ options: EngineRunOptions | undefined;
23
+ session: SessionBundle;
24
+ sessionManager: Pick<SessionManager, "saveActiveGoal">;
25
+ configGoal: EngineConfig["goal"];
26
+ isSubAgent: boolean;
27
+ sid: string;
28
+ onStream: StreamCallback | undefined;
29
+ }): {
30
+ normalizedGoal: GoalConfig | undefined;
31
+ persistedRunGoal: GoalConfig | undefined;
32
+ };
33
+ /** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
34
+ export declare function armRunGoalHook(args: {
35
+ slots: GoalRunSlots;
36
+ hooks: HookRegistry;
37
+ llmClient: LLMClientBase;
38
+ isSubAgent: boolean;
39
+ normalizedGoal: GoalConfig | undefined;
40
+ persistedRunGoal: GoalConfig | undefined;
41
+ session: SessionBundle;
42
+ sessionManager: Pick<SessionManager, "markGoalWaiting" | "readActiveGoal">;
43
+ persistGoalTerminal: (state: SessionBundle["state"], goal: GoalConfig, reason: PersistedGoalTerminationReason) => boolean;
44
+ getJudgeContext: () => GoalJudgeRuntimeContext | undefined;
45
+ recordCumulativeUsage: (usage: TokenUsage) => unknown;
46
+ recordGoalJudgeUsage: (usage: TokenUsage | undefined) => ReturnType<TurnLoop["recordGoalJudgeUsage"]>;
47
+ }): GoalStopHookHandler | null;
48
+ /** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
49
+ export declare function createGoalTerminationApplier(args: {
50
+ slots: GoalRunSlots;
51
+ hooks: HookRegistry;
52
+ session: SessionBundle;
53
+ persistedRunGoal: GoalConfig | undefined;
54
+ goalHookHandler: GoalStopHookHandler | null;
55
+ persistGoalTerminalOutcome: (state: SessionBundle["state"], goal: GoalConfig, termination: PersistedGoalTerminationReason) => GoalTerminalSaveOutcome;
56
+ readActiveGoal: (sid: string) => GoalConfig | undefined | null;
57
+ onStream: StreamCallback | undefined;
58
+ }): (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Run goal — persistent-goal resolution (explicit > stored > config default),
3
+ * arming the GoalStopHook for the run, and the terminal-outcome applier.
4
+ * Engine keeps ownership of its active-goal slots via GoalRunSlots.
5
+ */
6
+ import { randomUUID } from "node:crypto";
7
+ import { normalizeGoal, resolveGoalSetAt, goalConfigFromLifecycle, isGoalLifecycleCurrent, isSameGoalVersion, } from "../goal/lifecycle.js";
8
+ import { createGoalStopHook } from "../hooks/goal-stop-hook.js";
9
+ import { logger } from "../logging/logger.js";
10
+ /** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
11
+ export function resolveRunGoal(args) {
12
+ const { options, session, sessionManager, configGoal, isSubAgent, sid, onStream } = args;
13
+ const explicitGoal = normalizeGoal(options?.goal);
14
+ const storedLifecycle = session.state.goalLifecycle;
15
+ const storedGoal = isSubAgent !== true && storedLifecycle && isGoalLifecycleCurrent(storedLifecycle)
16
+ ? goalConfigFromLifecycle(storedLifecycle)
17
+ : undefined;
18
+ if (storedGoal &&
19
+ !explicitGoal &&
20
+ session.state.goalLifecycle?.phase === "waiting" &&
21
+ !sessionManager.saveActiveGoal(session.state, storedGoal)) {
22
+ throw new Error(`Failed to arm waiting goal for session ${sid}`);
23
+ }
24
+ if (explicitGoal && isSubAgent !== true) {
25
+ // Supplying a goal on a run is an explicit arm/resume operation.
26
+ delete explicitGoal.paused;
27
+ const replaced = !!storedGoal && storedGoal.objective !== explicitGoal.objective;
28
+ // Stamp WHEN this goal was set so the judge can anchor relative deadlines
29
+ // ("做到3点") to the set time, not "now" — else once the clock passes the
30
+ // deadline the judge could read "3点" as tomorrow's and never stop. A new
31
+ // or changed objective gets a fresh stamp; re-sending the SAME objective
32
+ // keeps the original anchor (the goal continues, the user didn't restate a
33
+ // new deadline). User input never carries setAtMs, so we set it here.
34
+ const resolvedSetAt = resolveGoalSetAt(explicitGoal.objective, storedGoal, Date.now());
35
+ explicitGoal.setAtMs = resolvedSetAt;
36
+ explicitGoal.goalId = randomUUID();
37
+ explicitGoal.revision = 1;
38
+ if (!sessionManager.saveActiveGoal(session.state, explicitGoal, {
39
+ replaceCurrent: storedGoal !== undefined,
40
+ })) {
41
+ throw new Error(`Failed to persist active goal for session ${sid}`);
42
+ }
43
+ onStream?.({
44
+ type: "goal_set",
45
+ goalId: explicitGoal.goalId,
46
+ revision: explicitGoal.revision,
47
+ objective: explicitGoal.objective,
48
+ replaced,
49
+ });
50
+ }
51
+ const fallbackGoal = normalizeGoal(configGoal);
52
+ if (fallbackGoal && !fallbackGoal.goalId)
53
+ fallbackGoal.goalId = randomUUID();
54
+ if (fallbackGoal && !fallbackGoal.revision)
55
+ fallbackGoal.revision = 1;
56
+ const normalizedGoal = explicitGoal ??
57
+ (storedGoal?.paused === true ? undefined : storedGoal) ??
58
+ (fallbackGoal?.paused === true ? undefined : fallbackGoal);
59
+ // Snapshot the persisted goal identity owned by THIS run. Terminal
60
+ // cleanup compares against this immutable copy so an old run cannot
61
+ // delete a replacement goal installed while it was finishing.
62
+ const persistedRunGoal = normalizedGoal &&
63
+ session.state.goalLifecycle &&
64
+ isGoalLifecycleCurrent(session.state.goalLifecycle) &&
65
+ isSameGoalVersion(goalConfigFromLifecycle(session.state.goalLifecycle), normalizedGoal)
66
+ ? { ...normalizedGoal }
67
+ : undefined;
68
+ return { normalizedGoal, persistedRunGoal };
69
+ }
70
+ /** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
71
+ export function armRunGoalHook(args) {
72
+ const { slots, hooks, llmClient, isSubAgent, normalizedGoal, persistedRunGoal, session, sessionManager, persistGoalTerminal, getJudgeContext, recordCumulativeUsage, recordGoalJudgeUsage, } = args;
73
+ let goalHookHandler = null;
74
+ if (isSubAgent !== true) {
75
+ // Keep a dormant hook even when this ordinary run inherited a paused
76
+ // persisted goal. A mid-run Resume can then arm Goal mode at the same
77
+ // safe step boundary as Steer instead of waiting for another submit.
78
+ slots.setActiveRuntimeGoal(normalizedGoal ?? null);
79
+ slots.setActivePersistedRunGoal(persistedRunGoal ?? null);
80
+ goalHookHandler = createGoalStopHook({
81
+ goal: normalizedGoal,
82
+ getGoal: () => slots.getActiveRuntimeGoal() ?? undefined,
83
+ llm: llmClient,
84
+ log: logger,
85
+ getJudgeContext: () => getJudgeContext(),
86
+ onJudgeUsage: (usage) => {
87
+ // The provider records this request into llmClient.getUsage() and the
88
+ // process-wide CostTracker. This separate callback feeds the session
89
+ // cumulative cache counters and the live Goal hard-budget tracker.
90
+ if (usage)
91
+ recordCumulativeUsage(usage);
92
+ // Charge the request even if an edit landed while the judge was
93
+ // awaiting its response. Revision fencing suppresses the old
94
+ // verdict, not the provider cost; otherwise repeated edits can
95
+ // bypass the Goal hard budget.
96
+ return recordGoalJudgeUsage(usage);
97
+ },
98
+ // Clear the persisted active goal the moment the judge says it's met,
99
+ // so a later bare send doesn't re-inherit a satisfied goal. The hook
100
+ // calls this from inside its met branch (single source of truth for
101
+ // "goal achieved"); engine owns the persistence side-effect.
102
+ onMet: () => {
103
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
104
+ return runGoal ? persistGoalTerminal(session.state, runGoal, "completed") : true;
105
+ },
106
+ onWaiting: () => {
107
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
108
+ return runGoal ? sessionManager.markGoalWaiting(session.state, runGoal) : true;
109
+ },
110
+ // Re-read the persisted goal each turn so a mid-run 清除 (clearGoal
111
+ // wrote state.json but this hook's frozen goal copy + the closure's
112
+ // in-RAM session are untouched) actually stops the judge. Reads disk
113
+ // via readActiveGoal — authoritative and independent of which session
114
+ // instance the run closure holds.
115
+ isGoalActive: (sid) => {
116
+ const runtimeGoal = slots.getActiveRuntimeGoal();
117
+ if (!runtimeGoal)
118
+ return false;
119
+ // A config-only Goal has no disk record to re-check.
120
+ if (!slots.getActivePersistedRunGoal())
121
+ return true;
122
+ const liveGoal = sessionManager.readActiveGoal(sid);
123
+ return liveGoal?.paused !== true && isSameGoalVersion(liveGoal, runtimeGoal);
124
+ },
125
+ });
126
+ if (normalizedGoal) {
127
+ hooks.register("on_stop", goalHookHandler, 0, "goal-stop");
128
+ slots.setActiveGoalHookAttached(true);
129
+ }
130
+ else {
131
+ slots.setActiveGoalHookAttached(false);
132
+ }
133
+ // Expose for edit/pause/resume/delete mid-run. Already guarded by
134
+ // isSubAgent above.
135
+ slots.setActiveGoalHook(goalHookHandler);
136
+ }
137
+ return goalHookHandler;
138
+ }
139
+ /** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
140
+ export function createGoalTerminationApplier(args) {
141
+ const { slots, hooks, session, persistedRunGoal, goalHookHandler, persistGoalTerminalOutcome, readActiveGoal, onStream, } = args;
142
+ return (termination, round) => {
143
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
144
+ if (!termination || !runGoal)
145
+ return;
146
+ // Judge prompt overflow ends only this run. The objective is unfinished
147
+ // and may be resumed after the user reduces fixed judge context, so it
148
+ // must not get a terminal tombstone or be cleared from activeGoal.
149
+ if (termination === "judge_prompt_too_large")
150
+ return;
151
+ const outcome = persistGoalTerminalOutcome(session.state, runGoal, termination);
152
+ if (outcome === "failed") {
153
+ // No terminal event has been published. Re-assert the authoritative
154
+ // active Goal in case another optimistic control changed the client.
155
+ const authoritative = readActiveGoal(session.state.sessionId);
156
+ if (authoritative) {
157
+ onStream?.({
158
+ type: "goal_updated",
159
+ goalId: authoritative.goalId,
160
+ revision: authoritative.revision,
161
+ objective: authoritative.objective,
162
+ paused: authoritative.paused === true,
163
+ });
164
+ }
165
+ return;
166
+ }
167
+ if (outcome === "persisted") {
168
+ // The durable terminal transition is the publication barrier: clients
169
+ // must never observe an exhausted Goal that does not exist on disk.
170
+ onStream?.({
171
+ type: "goal_progress",
172
+ goalId: runGoal.goalId,
173
+ revision: runGoal.revision,
174
+ status: "exhausted",
175
+ round: round ?? 0,
176
+ });
177
+ }
178
+ if (goalHookHandler) {
179
+ hooks.unregister("on_stop", goalHookHandler);
180
+ if (slots.getActiveGoalHook() === goalHookHandler) {
181
+ slots.setActiveGoalHook(null);
182
+ slots.setActiveGoalHookAttached(false);
183
+ slots.setActiveRuntimeGoal(null);
184
+ slots.setActivePersistedRunGoal(null);
185
+ }
186
+ }
187
+ };
188
+ }
@@ -1,4 +1,4 @@
1
- import type { InputAttachmentMeta } from "../protocol/types.js";
1
+ import type { InputAttachmentMeta } from "../types.js";
2
2
  import type { ContentBlock, LLMConfig } from "../types.js";
3
3
  import { type ParsedTask } from "./parse-task.js";
4
4
  import type { EngineResult } from "./types.js";
@@ -76,9 +76,11 @@ export async function prepareRunImageInput(args) {
76
76
  parsedTask = {
77
77
  text: [parsedTask.text, attachmentContext.text].filter(Boolean).join("\n\n"),
78
78
  images: [...parsedTask.images, ...attachmentContext.images],
79
- hasImages: parsedTask.hasImages ||
80
- attachmentContext.images.length > 0 ||
81
- attachmentContext.hasStructuredImageAttachments,
79
+ // A structured image attachment can intentionally degrade to textual
80
+ // metadata when the selected model has no vision support. Only actual
81
+ // image bytes require the vision gate below; the on-disk path remains
82
+ // useful to file-oriented tools and delegated Work Sessions.
83
+ hasImages: parsedTask.hasImages || attachmentContext.images.length > 0,
82
84
  };
83
85
  }
84
86
  if (parsedTask.hasImages) {
@@ -0,0 +1,41 @@
1
+ import type { Message, SessionKind } from "../types.js";
2
+ import type { SessionBundle, SessionManager } from "../session/session-manager.js";
3
+ import type { ParsedTask } from "./parse-task.js";
4
+ import type { buildRunUserMessageContent } from "./run-image-input.js";
5
+ import type { EngineConfig, EngineResult } from "./types.js";
6
+ import type { EngineRunOptions } from "./run-types.js";
7
+ export interface OpenRunSessionArgs {
8
+ sessionManager: SessionManager;
9
+ options: EngineRunOptions | undefined;
10
+ parsedTask: ParsedTask;
11
+ taskText: string;
12
+ userMessageContent: ReturnType<typeof buildRunUserMessageContent>;
13
+ cwd: string;
14
+ sessionKind: SessionKind;
15
+ sessionWorkspaceProfile: string | undefined;
16
+ /** Standing brief resent by the host each turn until the Session persists it. */
17
+ sessionBrief?: string;
18
+ llmModel: string;
19
+ llmProvider: string;
20
+ isSubAgent: boolean;
21
+ origin: EngineConfig["origin"];
22
+ costStore: EngineConfig["costStore"];
23
+ cachedCompactedMessages: Message[] | undefined;
24
+ onAgentDirectionsDelivered: ((envelopeIds: NonNullable<EngineRunOptions["agentDirection"]>["envelopeIds"]) => void) | undefined;
25
+ }
26
+ export interface OpenedRunSession {
27
+ session: SessionBundle;
28
+ messages: Message[];
29
+ freshImageMessage: Message | undefined;
30
+ resumedFromDisk: boolean;
31
+ claimClientMessageId: (bundle: SessionBundle, clientMessageId: string | undefined, source: "submit" | "steer") => boolean;
32
+ releaseClientMessageId: (clientMessageId: string) => void;
33
+ }
34
+ export type OpenRunSessionResult = {
35
+ ok: true;
36
+ opened: OpenedRunSession;
37
+ } | {
38
+ ok: false;
39
+ result: EngineResult;
40
+ };
41
+ export declare function openRunSession(args: OpenRunSessionArgs): OpenRunSessionResult;