@xopcai/xopc 0.0.82 → 0.0.83

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 (704) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-Y-iqo-gL.js} +94 -85
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +122 -168
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +5 -53
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +89 -126
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  403. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  404. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  407. package/dist/src/gateway/hono/oauth.js +1 -1
  408. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  411. package/dist/src/gateway/hono/routes/browser.js +626 -0
  412. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  413. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  414. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  416. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  418. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  421. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  426. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  429. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  432. package/dist/src/gateway/hono/routes/config.js +20 -1764
  433. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  434. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  435. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  436. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  437. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  438. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  440. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  441. package/dist/src/gateway/hono/routes/models.js +1 -1
  442. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  443. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/shares.js +4 -4
  445. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  446. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  447. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  448. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  449. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  450. package/dist/src/gateway/hono/sse.js +2 -2
  451. package/dist/src/gateway/index.d.ts +1 -1
  452. package/dist/src/gateway/index.js +4 -2
  453. package/dist/src/gateway/lock.js +3 -3
  454. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  455. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  456. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  457. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  458. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  459. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  460. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  461. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  462. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  463. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  464. package/dist/src/gateway/rate-limit/index.js +4 -0
  465. package/dist/src/gateway/run-loop.d.ts +1 -1
  466. package/dist/src/gateway/run-loop.js +24 -4
  467. package/dist/src/gateway/run-loop.js.map +1 -1
  468. package/dist/src/gateway/runtime-config.js +2 -1
  469. package/dist/src/gateway/runtime-config.js.map +1 -1
  470. package/dist/src/gateway/security/audit.js +2 -1
  471. package/dist/src/gateway/security/audit.js.map +1 -1
  472. package/dist/src/gateway/security/index.d.ts +0 -1
  473. package/dist/src/gateway/security/index.js +1 -2
  474. package/dist/src/gateway/security/loopback.d.ts +13 -0
  475. package/dist/src/gateway/security/loopback.js +45 -0
  476. package/dist/src/gateway/security/loopback.js.map +1 -0
  477. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  478. package/dist/src/gateway/service/agent-runner.js +184 -0
  479. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  480. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  481. package/dist/src/gateway/service/config-coordinator.js +351 -0
  482. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  483. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  484. package/dist/src/gateway/service/marketplace-service.js +239 -0
  485. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  486. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  487. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  488. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  489. package/dist/src/gateway/service/sessions-api.js +135 -0
  490. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  491. package/dist/src/gateway/service.d.ts +30 -360
  492. package/dist/src/gateway/service.js +121 -903
  493. package/dist/src/gateway/service.js.map +1 -1
  494. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  495. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  496. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  497. package/dist/src/heartbeat/index.js +1 -1
  498. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  499. package/dist/src/infra/gateway-process-argv.js +26 -0
  500. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  501. package/dist/src/infra/gateway-processes.d.ts +5 -0
  502. package/dist/src/infra/gateway-processes.js +65 -0
  503. package/dist/src/infra/gateway-processes.js.map +1 -0
  504. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  505. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  506. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  507. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  508. package/dist/src/infra/rate-limit/index.js +3 -0
  509. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  510. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  511. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  512. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  513. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  514. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  515. package/dist/src/infra/restart.d.ts +21 -0
  516. package/dist/src/infra/restart.js +122 -0
  517. package/dist/src/infra/restart.js.map +1 -0
  518. package/dist/src/infra/update-check.js +1 -1
  519. package/dist/src/infra/update-lock.js +3 -3
  520. package/dist/src/infra/update-runner.js +1 -1
  521. package/dist/src/infra/update-startup.js +2 -2
  522. package/dist/src/infra/write-file-atomic.js +2 -2
  523. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  524. package/dist/src/mcp/channel-bridge.js +1 -5
  525. package/dist/src/mcp/channel-bridge.js.map +1 -1
  526. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  527. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  528. package/dist/src/providers/index.js +2 -2
  529. package/dist/src/providers/model-registry.js +1 -1
  530. package/dist/src/session/config-store.js +2 -2
  531. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  532. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  533. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  534. package/dist/src/session/parity/sessions-json-file.js +1 -1
  535. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  536. package/dist/src/session/parity/transcript-paths.js +1 -1
  537. package/dist/src/session/search-index-cache.js +1 -1
  538. package/dist/src/session/search-index.js +1 -1
  539. package/dist/src/session/session-title.js +1 -1
  540. package/dist/src/session/store.js +5 -5
  541. package/dist/src/share/share-rate-limit.d.ts +10 -2
  542. package/dist/src/share/share-rate-limit.js +33 -42
  543. package/dist/src/share/share-rate-limit.js.map +1 -1
  544. package/dist/src/share/share-store.js +3 -3
  545. package/dist/src/tui/backends/embedded-backend.js +16 -12
  546. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  547. package/dist/src/tui/clipboard-image.js +2 -2
  548. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  549. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  550. package/dist/src/tui/theme-manager.js +1 -1
  551. package/dist/src/tui/tui-keybindings-file.js +1 -1
  552. package/dist/src/tui/tui-scoped-models.js +1 -1
  553. package/dist/src/tui/tui-settings.js +1 -1
  554. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  555. package/dist/src/tui/tui.js +1 -2
  556. package/dist/src/tui/tui.js.map +1 -1
  557. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  558. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  559. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  560. package/dist/src/tunnel/frpc-binary.js +2 -2
  561. package/dist/src/tunnel/frpc-config.js +1 -1
  562. package/dist/src/tunnel/frpc-extract.js +1 -1
  563. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  564. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  565. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  566. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  567. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  568. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/logger/stats.d.ts +1 -1
  574. package/dist/src/voice/tts/audio.js +1 -1
  575. package/dist/src/voice/tts/factory.js +1 -1
  576. package/dist/src/voice/tts/index.js +2 -2
  577. package/dist/src/voice/tts/merge-config.js +1 -1
  578. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  579. package/dist/src/voice/tts/service.js +1 -1
  580. package/dist/src/voice/tts/service.js.map +1 -1
  581. package/dist/src/voice/tts/speak-core.js +1 -1
  582. package/package.json +10 -5
  583. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  584. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  585. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  586. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  587. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  588. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  589. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  590. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  591. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  592. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  593. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  594. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  595. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  596. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  597. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  598. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  599. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  600. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  601. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  602. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  603. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  604. package/dist/src/gateway/auth-rate-limit.js +0 -192
  605. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  606. package/dist/src/gateway/restart-handler.d.ts +0 -14
  607. package/dist/src/gateway/restart-handler.js +0 -64
  608. package/dist/src/gateway/restart-handler.js.map +0 -1
  609. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  610. package/dist/src/gateway/security/flood-guard.js +0 -42
  611. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  612. package/dist/src/infra/rate-limit.d.ts +0 -38
  613. package/dist/src/infra/rate-limit.js +0 -60
  614. package/dist/src/infra/rate-limit.js.map +0 -1
  615. package/dist/src/infra/restart-intent.d.ts +0 -13
  616. package/dist/src/infra/restart-intent.js +0 -40
  617. package/dist/src/infra/restart-intent.js.map +0 -1
  618. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  619. package/dist/src/infra/restart-sentinel.js +0 -75
  620. package/dist/src/infra/restart-sentinel.js.map +0 -1
  621. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  622. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  623. package/skills/creative/canvas-design/SKILL.md +0 -130
  624. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  625. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  626. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  627. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  628. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  629. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  635. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  637. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  638. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  639. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  641. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  642. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  646. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  651. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  654. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  658. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  662. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  665. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  678. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  685. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  686. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  687. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  690. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  704. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { guardSessionManager } from "./session-tool-result-guard-wrapper.js";
3
+ import { guardSessionManager } from "./session-tool-result-guard.js";
4
4
  import { prepareSessionManagerForRun } from "./session-manager-init.js";
5
- import { prewarmSessionFile } from "./session-manager-cache.js";
5
+ import { defaultSessionManagerCache } from "./session-manager-cache.js";
6
6
  import { applyXopcProviderApiKey, createEmbeddedAuthStorage } from "./xopc-auth-storage.js";
7
7
  import { wrapStreamFnForXopcExtensions } from "./xopc-stream-bridge.js";
8
8
  import { xopcToolsToDefinitions } from "./xopc-tools-bridge.js";
@@ -25,13 +25,6 @@ function buildEmbeddedRunnerFingerprint(input) {
25
25
  input.thinkingLevel
26
26
  ].join("");
27
27
  }
28
- const pool = /* @__PURE__ */ new Map();
29
- let stats = {
30
- acquires: 0,
31
- reuses: 0,
32
- creates: 0,
33
- evictions: 0
34
- };
35
28
  function isEmbeddedSessionRunnerEnabled() {
36
29
  const raw = process.env.XOPC_SESSION_RUNNER?.trim().toLowerCase();
37
30
  if (raw === "0" || raw === "false" || raw === "off") return false;
@@ -43,163 +36,201 @@ function getEmbeddedSessionRunnerIdleTtlMs() {
43
36
  const parsed = Number.parseInt(raw, 10);
44
37
  return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_IDLE_TTL_MS;
45
38
  }
46
- function getEmbeddedSessionRunnerStats() {
47
- return {
48
- ...stats,
49
- pooled: pool.size
50
- };
39
+ function createEmbeddedSettingsManager(cwd) {
40
+ const sm = SettingsManager.inMemory({ compaction: { enabled: false } });
41
+ sm.setCompactionEnabled(false);
42
+ return sm;
51
43
  }
52
- function resetEmbeddedSessionRunnerForTest() {
53
- for (const entry of pool.values()) clearIdleTimer(entry);
54
- pool.clear();
44
+ /**
45
+ * Owns the per-session pool of pi `AgentSession` runners. The class is the supported,
46
+ * injectable owner; {@link defaultEmbeddedSessionRunnerPool} keeps the historic
47
+ * module-level free functions working until every caller is migrated to DI.
48
+ */
49
+ var EmbeddedSessionRunnerPool = class {
50
+ pool = /* @__PURE__ */ new Map();
51
+ cache;
52
+ isEnabledFn;
53
+ getIdleTtlMsFn;
55
54
  stats = {
56
55
  acquires: 0,
57
56
  reuses: 0,
58
57
  creates: 0,
59
58
  evictions: 0
60
59
  };
61
- }
62
- function clearIdleTimer(entry) {
63
- if (entry.idleTimer) {
64
- clearTimeout(entry.idleTimer);
65
- entry.idleTimer = null;
60
+ constructor(opts = {}) {
61
+ this.cache = opts.sessionManagerCache ?? defaultSessionManagerCache;
62
+ this.isEnabledFn = opts.isEnabled ?? isEmbeddedSessionRunnerEnabled;
63
+ this.getIdleTtlMsFn = opts.getIdleTtlMs ?? getEmbeddedSessionRunnerIdleTtlMs;
66
64
  }
65
+ getStats() {
66
+ return {
67
+ ...this.stats,
68
+ pooled: this.pool.size
69
+ };
70
+ }
71
+ resetForTest() {
72
+ for (const entry of this.pool.values()) this.clearIdleTimer(entry);
73
+ this.pool.clear();
74
+ this.stats = {
75
+ acquires: 0,
76
+ reuses: 0,
77
+ creates: 0,
78
+ evictions: 0
79
+ };
80
+ }
81
+ evict(sessionKey, reason = "explicit") {
82
+ const entry = this.pool.get(sessionKey);
83
+ if (!entry) return;
84
+ this.disposePooledRunner(sessionKey, entry, reason);
85
+ }
86
+ evictAll(reason = "dispose_all") {
87
+ for (const sessionKey of [...this.pool.keys()]) this.evict(sessionKey, reason);
88
+ }
89
+ async acquire(params) {
90
+ this.stats.acquires += 1;
91
+ const fingerprint = buildEmbeddedRunnerFingerprint({
92
+ sessionFile: params.sessionFile,
93
+ workspaceDir: params.workspaceDir,
94
+ modelRef: params.modelRef,
95
+ toolNames: params.tools.map((t) => t.name),
96
+ systemPrompt: params.systemPrompt,
97
+ thinkingLevel: params.thinkingLevel ?? "medium"
98
+ });
99
+ const reuseEnabled = this.isEnabledFn();
100
+ const existing = this.pool.get(params.sessionKey);
101
+ let entry;
102
+ let reused = false;
103
+ if (reuseEnabled && existing && existing.fingerprint === fingerprint) {
104
+ this.clearIdleTimer(existing);
105
+ entry = existing;
106
+ entry.lastUsedAt = Date.now();
107
+ reused = true;
108
+ this.stats.reuses += 1;
109
+ applySystemPromptOverrideToSession(entry.session, params.systemPrompt);
110
+ entry.session.agent.streamFn = entry.baseStreamFn;
111
+ log.debug({ sessionKey: params.sessionKey }, "Reusing pooled embedded session runner");
112
+ } else {
113
+ if (existing) this.disposePooledRunner(params.sessionKey, existing, "fingerprint_mismatch");
114
+ entry = await this.createPooledRunner(params);
115
+ this.pool.set(params.sessionKey, entry);
116
+ this.stats.creates += 1;
117
+ log.debug({ sessionKey: params.sessionKey }, "Created embedded session runner");
118
+ }
119
+ return {
120
+ session: entry.session,
121
+ piSm: entry.piSm,
122
+ reused,
123
+ release: () => {
124
+ if (!this.isEnabledFn()) {
125
+ this.disposePooledRunner(params.sessionKey, entry, "runner_disabled");
126
+ return;
127
+ }
128
+ entry.lastUsedAt = Date.now();
129
+ this.scheduleIdleEviction(params.sessionKey, entry);
130
+ }
131
+ };
132
+ }
133
+ clearIdleTimer(entry) {
134
+ if (entry.idleTimer) {
135
+ clearTimeout(entry.idleTimer);
136
+ entry.idleTimer = null;
137
+ }
138
+ }
139
+ scheduleIdleEviction(sessionKey, entry) {
140
+ this.clearIdleTimer(entry);
141
+ const ttlMs = this.getIdleTtlMsFn();
142
+ entry.idleTimer = setTimeout(() => {
143
+ if (this.pool.get(sessionKey) === entry) this.disposePooledRunner(sessionKey, entry, "idle_ttl");
144
+ }, ttlMs);
145
+ entry.idleTimer.unref?.();
146
+ }
147
+ disposePooledRunner(sessionKey, entry, reason) {
148
+ this.clearIdleTimer(entry);
149
+ this.pool.delete(sessionKey);
150
+ this.stats.evictions += 1;
151
+ try {
152
+ entry.piSm.flushPendingToolResults?.();
153
+ } catch {}
154
+ log.debug({
155
+ sessionKey,
156
+ reason
157
+ }, "Embedded session runner evicted");
158
+ }
159
+ async createPooledRunner(params) {
160
+ const { sessionKey, sessionId, sessionFile, sessionsDir, hadSessionFile, workspaceDir, model, thinkingLevel, tools, systemPrompt } = params;
161
+ await this.cache.prewarm(sessionFile);
162
+ const settingsManager = createEmbeddedSettingsManager(workspaceDir);
163
+ const piSm = guardSessionManager(SessionManager.open(sessionFile, sessionsDir, workspaceDir), {
164
+ sessionKey,
165
+ contextWindowTokens: model.contextWindow ?? 128e3
166
+ });
167
+ await prepareSessionManagerForRun({
168
+ sessionManager: piSm,
169
+ sessionFile,
170
+ hadSessionFile,
171
+ sessionId,
172
+ cwd: workspaceDir
173
+ });
174
+ const toolDefs = xopcToolsToDefinitions(tools);
175
+ const toolNames = tools.map((t) => t.name);
176
+ const authStorage = createEmbeddedAuthStorage();
177
+ applyXopcProviderApiKey(authStorage, model.provider);
178
+ const resourceLoader = new DefaultResourceLoader({
179
+ cwd: workspaceDir,
180
+ agentDir: getAgentDir(),
181
+ settingsManager,
182
+ noContextFiles: true
183
+ });
184
+ await resourceLoader.reload();
185
+ const { session } = await createAgentSession({
186
+ cwd: workspaceDir,
187
+ model,
188
+ thinkingLevel: thinkingLevel ?? "medium",
189
+ sessionManager: piSm,
190
+ settingsManager,
191
+ authStorage,
192
+ resourceLoader,
193
+ noTools: "builtin",
194
+ customTools: toolDefs,
195
+ tools: toolNames
196
+ });
197
+ applySystemPromptOverrideToSession(session, systemPrompt);
198
+ const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFn);
199
+ session.agent.streamFn = baseStreamFn;
200
+ return {
201
+ sessionKey,
202
+ fingerprint: buildEmbeddedRunnerFingerprint({
203
+ sessionFile,
204
+ workspaceDir,
205
+ modelRef: params.modelRef,
206
+ toolNames,
207
+ systemPrompt,
208
+ thinkingLevel: thinkingLevel ?? "medium"
209
+ }),
210
+ session,
211
+ piSm,
212
+ settingsManager,
213
+ baseStreamFn,
214
+ lastUsedAt: Date.now(),
215
+ idleTimer: null
216
+ };
217
+ }
218
+ };
219
+ const defaultEmbeddedSessionRunnerPool = new EmbeddedSessionRunnerPool();
220
+ function getEmbeddedSessionRunnerStats() {
221
+ return defaultEmbeddedSessionRunnerPool.getStats();
67
222
  }
68
- function scheduleIdleEviction(sessionKey, entry) {
69
- clearIdleTimer(entry);
70
- const ttlMs = getEmbeddedSessionRunnerIdleTtlMs();
71
- entry.idleTimer = setTimeout(() => {
72
- if (pool.get(sessionKey) === entry) disposePooledRunner(sessionKey, entry, "idle_ttl");
73
- }, ttlMs);
74
- entry.idleTimer.unref?.();
75
- }
76
- function disposePooledRunner(sessionKey, entry, reason) {
77
- clearIdleTimer(entry);
78
- pool.delete(sessionKey);
79
- stats.evictions += 1;
80
- try {
81
- entry.piSm.flushPendingToolResults?.();
82
- } catch {}
83
- log.debug({
84
- sessionKey,
85
- reason
86
- }, "Embedded session runner evicted");
223
+ function resetEmbeddedSessionRunnerForTest() {
224
+ defaultEmbeddedSessionRunnerPool.resetForTest();
87
225
  }
88
226
  function evictEmbeddedSessionRunner(sessionKey, reason = "explicit") {
89
- const entry = pool.get(sessionKey);
90
- if (!entry) return;
91
- disposePooledRunner(sessionKey, entry, reason);
227
+ defaultEmbeddedSessionRunnerPool.evict(sessionKey, reason);
92
228
  }
93
229
  function evictAllEmbeddedSessionRunners(reason = "dispose_all") {
94
- for (const sessionKey of [...pool.keys()]) evictEmbeddedSessionRunner(sessionKey, reason);
95
- }
96
- function createEmbeddedSettingsManager(cwd) {
97
- const sm = SettingsManager.inMemory({ compaction: { enabled: false } });
98
- sm.setCompactionEnabled(false);
99
- return sm;
230
+ defaultEmbeddedSessionRunnerPool.evictAll(reason);
100
231
  }
101
- async function createPooledRunner(params) {
102
- const { sessionKey, sessionId, sessionFile, sessionsDir, hadSessionFile, workspaceDir, model, thinkingLevel, tools, systemPrompt } = params;
103
- await prewarmSessionFile(sessionFile);
104
- const settingsManager = createEmbeddedSettingsManager(workspaceDir);
105
- const piSm = guardSessionManager(SessionManager.open(sessionFile, sessionsDir, workspaceDir), {
106
- sessionKey,
107
- contextWindowTokens: model.contextWindow ?? 128e3
108
- });
109
- await prepareSessionManagerForRun({
110
- sessionManager: piSm,
111
- sessionFile,
112
- hadSessionFile,
113
- sessionId,
114
- cwd: workspaceDir
115
- });
116
- const toolDefs = xopcToolsToDefinitions(tools);
117
- const toolNames = tools.map((t) => t.name);
118
- const authStorage = createEmbeddedAuthStorage();
119
- applyXopcProviderApiKey(authStorage, model.provider);
120
- const resourceLoader = new DefaultResourceLoader({
121
- cwd: workspaceDir,
122
- agentDir: getAgentDir(),
123
- settingsManager,
124
- noContextFiles: true
125
- });
126
- await resourceLoader.reload();
127
- const { session } = await createAgentSession({
128
- cwd: workspaceDir,
129
- model,
130
- thinkingLevel: thinkingLevel ?? "medium",
131
- sessionManager: piSm,
132
- settingsManager,
133
- authStorage,
134
- resourceLoader,
135
- noTools: "builtin",
136
- customTools: toolDefs,
137
- tools: toolNames
138
- });
139
- applySystemPromptOverrideToSession(session, systemPrompt);
140
- const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFn);
141
- session.agent.streamFn = baseStreamFn;
142
- return {
143
- sessionKey,
144
- fingerprint: buildEmbeddedRunnerFingerprint({
145
- sessionFile,
146
- workspaceDir,
147
- modelRef: params.modelRef,
148
- toolNames,
149
- systemPrompt,
150
- thinkingLevel: thinkingLevel ?? "medium"
151
- }),
152
- session,
153
- piSm,
154
- settingsManager,
155
- baseStreamFn,
156
- lastUsedAt: Date.now(),
157
- idleTimer: null
158
- };
159
- }
160
- async function acquireEmbeddedSessionRunner(params) {
161
- stats.acquires += 1;
162
- const fingerprint = buildEmbeddedRunnerFingerprint({
163
- sessionFile: params.sessionFile,
164
- workspaceDir: params.workspaceDir,
165
- modelRef: params.modelRef,
166
- toolNames: params.tools.map((t) => t.name),
167
- systemPrompt: params.systemPrompt,
168
- thinkingLevel: params.thinkingLevel ?? "medium"
169
- });
170
- const reuseEnabled = isEmbeddedSessionRunnerEnabled();
171
- const existing = pool.get(params.sessionKey);
172
- let entry;
173
- let reused = false;
174
- if (reuseEnabled && existing && existing.fingerprint === fingerprint) {
175
- clearIdleTimer(existing);
176
- entry = existing;
177
- entry.lastUsedAt = Date.now();
178
- reused = true;
179
- stats.reuses += 1;
180
- applySystemPromptOverrideToSession(entry.session, params.systemPrompt);
181
- entry.session.agent.streamFn = entry.baseStreamFn;
182
- log.debug({ sessionKey: params.sessionKey }, "Reusing pooled embedded session runner");
183
- } else {
184
- if (existing) disposePooledRunner(params.sessionKey, existing, "fingerprint_mismatch");
185
- entry = await createPooledRunner(params);
186
- pool.set(params.sessionKey, entry);
187
- stats.creates += 1;
188
- log.debug({ sessionKey: params.sessionKey }, "Created embedded session runner");
189
- }
190
- return {
191
- session: entry.session,
192
- piSm: entry.piSm,
193
- reused,
194
- release: () => {
195
- if (!isEmbeddedSessionRunnerEnabled()) {
196
- disposePooledRunner(params.sessionKey, entry, "runner_disabled");
197
- return;
198
- }
199
- entry.lastUsedAt = Date.now();
200
- scheduleIdleEviction(params.sessionKey, entry);
201
- }
202
- };
232
+ function acquireEmbeddedSessionRunner(params) {
233
+ return defaultEmbeddedSessionRunnerPool.acquire(params);
203
234
  }
204
235
  /** Resolve transcript path inputs used by both runner acquire and turn execution. */
205
236
  async function resolveEmbeddedTranscriptInputs(sessionStore, sessionKey) {
@@ -212,6 +243,6 @@ async function resolveEmbeddedTranscriptInputs(sessionStore, sessionKey) {
212
243
  };
213
244
  }
214
245
  //#endregion
215
- export { acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs };
246
+ export { EmbeddedSessionRunnerPool, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, defaultEmbeddedSessionRunnerPool, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs };
216
247
 
217
248
  //# sourceMappingURL=session-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-runner.js","names":[],"sources":["../../../../src/agent/embedded/session-runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n SessionManager,\n SettingsManager,\n type AgentSession,\n} from '@earendil-works/pi-coding-agent';\nimport type { Model, Api } from '@earendil-works/pi-ai';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { guardSessionManager, type GuardedPiTranscriptManager } from './session-tool-result-guard-wrapper.js';\nimport { prepareSessionManagerForRun } from './session-manager-init.js';\nimport { prewarmSessionFile } from './session-manager-cache.js';\nimport { applyXopcProviderApiKey, createEmbeddedAuthStorage } from './xopc-auth-storage.js';\nimport { wrapStreamFnForXopcExtensions } from './xopc-stream-bridge.js';\nimport { xopcToolsToDefinitions } from './xopc-tools-bridge.js';\nimport { applySystemPromptOverrideToSession } from './system-prompt-override.js';\n\nconst log = createLogger('EmbeddedSessionRunner');\n\nconst DEFAULT_IDLE_TTL_MS = 5 * 60_000;\n\nexport type EmbeddedRunnerFingerprintInput = {\n sessionFile: string;\n workspaceDir: string;\n modelRef: string;\n toolNames: readonly string[];\n systemPrompt: string;\n thinkingLevel: string;\n};\n\nexport function buildEmbeddedRunnerFingerprint(input: EmbeddedRunnerFingerprintInput): string {\n const tools = [...input.toolNames].sort().join('\\0');\n const promptMarker = `${input.systemPrompt.length}:${input.systemPrompt.slice(0, 128)}`;\n return [\n input.sessionFile,\n input.workspaceDir,\n input.modelRef,\n tools,\n promptMarker,\n input.thinkingLevel,\n ].join('\\u001f');\n}\n\ntype PooledRunner = {\n sessionKey: string;\n fingerprint: string;\n session: AgentSession;\n piSm: GuardedPiTranscriptManager;\n settingsManager: SettingsManager;\n baseStreamFn: AgentSession['agent']['streamFn'];\n lastUsedAt: number;\n idleTimer: ReturnType<typeof setTimeout> | null;\n};\n\nexport type AcquireEmbeddedSessionRunnerParams = {\n sessionKey: string;\n sessionId: string;\n sessionFile: string;\n sessionsDir: string;\n hadSessionFile: boolean;\n workspaceDir: string;\n model: Model<Api>;\n modelRef: string;\n tools: AgentTool[];\n systemPrompt: string;\n thinkingLevel: ThinkingLevel;\n};\n\nexport type AcquiredEmbeddedSessionRunner = {\n session: AgentSession;\n piSm: GuardedPiTranscriptManager;\n reused: boolean;\n release: () => void;\n};\n\nconst pool = new Map<string, PooledRunner>();\n\nlet stats = {\n acquires: 0,\n reuses: 0,\n creates: 0,\n evictions: 0,\n};\n\nexport function isEmbeddedSessionRunnerEnabled(): boolean {\n const raw = process.env.XOPC_SESSION_RUNNER?.trim().toLowerCase();\n if (raw === '0' || raw === 'false' || raw === 'off') {\n return false;\n }\n return true;\n}\n\nexport function getEmbeddedSessionRunnerIdleTtlMs(): number {\n const raw = process.env.XOPC_SESSION_RUNNER_TTL_MS?.trim();\n if (!raw) {\n return DEFAULT_IDLE_TTL_MS;\n }\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_IDLE_TTL_MS;\n}\n\nexport function getEmbeddedSessionRunnerStats(): Readonly<typeof stats> & { pooled: number } {\n return { ...stats, pooled: pool.size };\n}\n\nexport function resetEmbeddedSessionRunnerForTest(): void {\n for (const entry of pool.values()) {\n clearIdleTimer(entry);\n }\n pool.clear();\n stats = { acquires: 0, reuses: 0, creates: 0, evictions: 0 };\n}\n\nfunction clearIdleTimer(entry: PooledRunner): void {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = null;\n }\n}\n\nfunction scheduleIdleEviction(sessionKey: string, entry: PooledRunner): void {\n clearIdleTimer(entry);\n const ttlMs = getEmbeddedSessionRunnerIdleTtlMs();\n entry.idleTimer = setTimeout(() => {\n const current = pool.get(sessionKey);\n if (current === entry) {\n disposePooledRunner(sessionKey, entry, 'idle_ttl');\n }\n }, ttlMs);\n entry.idleTimer.unref?.();\n}\n\nfunction disposePooledRunner(sessionKey: string, entry: PooledRunner, reason: string): void {\n clearIdleTimer(entry);\n pool.delete(sessionKey);\n stats.evictions += 1;\n try {\n entry.piSm.flushPendingToolResults?.();\n } catch {\n /* ignore */\n }\n log.debug({ sessionKey, reason }, 'Embedded session runner evicted');\n}\n\nexport function evictEmbeddedSessionRunner(sessionKey: string, reason = 'explicit'): void {\n const entry = pool.get(sessionKey);\n if (!entry) {\n return;\n }\n disposePooledRunner(sessionKey, entry, reason);\n}\n\nexport function evictAllEmbeddedSessionRunners(reason = 'dispose_all'): void {\n for (const sessionKey of [...pool.keys()]) {\n evictEmbeddedSessionRunner(sessionKey, reason);\n }\n}\n\nfunction createEmbeddedSettingsManager(cwd: string): SettingsManager {\n const sm = SettingsManager.inMemory({ compaction: { enabled: false } });\n sm.setCompactionEnabled(false);\n void cwd;\n return sm;\n}\n\nasync function createPooledRunner(params: AcquireEmbeddedSessionRunnerParams): Promise<PooledRunner> {\n const {\n sessionKey,\n sessionId,\n sessionFile,\n sessionsDir,\n hadSessionFile,\n workspaceDir,\n model,\n thinkingLevel,\n tools,\n systemPrompt,\n } = params;\n\n await prewarmSessionFile(sessionFile);\n const settingsManager = createEmbeddedSettingsManager(workspaceDir);\n\n const piSm = guardSessionManager(SessionManager.open(sessionFile, sessionsDir, workspaceDir), {\n sessionKey,\n contextWindowTokens: model.contextWindow ?? 128_000,\n });\n\n await prepareSessionManagerForRun({\n sessionManager: piSm,\n sessionFile,\n hadSessionFile,\n sessionId,\n cwd: workspaceDir,\n });\n\n const toolDefs = xopcToolsToDefinitions(tools);\n const toolNames = tools.map((t) => t.name);\n\n const authStorage = createEmbeddedAuthStorage();\n applyXopcProviderApiKey(authStorage, model.provider);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: workspaceDir,\n agentDir: getAgentDir(),\n settingsManager,\n noContextFiles: true,\n });\n await resourceLoader.reload();\n\n const { session } = await createAgentSession({\n cwd: workspaceDir,\n model,\n thinkingLevel: thinkingLevel ?? 'medium',\n sessionManager: piSm,\n settingsManager,\n authStorage,\n resourceLoader,\n noTools: 'builtin',\n customTools: toolDefs,\n tools: toolNames,\n });\n\n applySystemPromptOverrideToSession(session, systemPrompt);\n const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFn);\n session.agent.streamFn = baseStreamFn;\n\n const fingerprint = buildEmbeddedRunnerFingerprint({\n sessionFile,\n workspaceDir,\n modelRef: params.modelRef,\n toolNames,\n systemPrompt,\n thinkingLevel: thinkingLevel ?? 'medium',\n });\n\n return {\n sessionKey,\n fingerprint,\n session,\n piSm,\n settingsManager,\n baseStreamFn,\n lastUsedAt: Date.now(),\n idleTimer: null,\n };\n}\n\nexport async function acquireEmbeddedSessionRunner(\n params: AcquireEmbeddedSessionRunnerParams,\n): Promise<AcquiredEmbeddedSessionRunner> {\n stats.acquires += 1;\n\n const fingerprint = buildEmbeddedRunnerFingerprint({\n sessionFile: params.sessionFile,\n workspaceDir: params.workspaceDir,\n modelRef: params.modelRef,\n toolNames: params.tools.map((t) => t.name),\n systemPrompt: params.systemPrompt,\n thinkingLevel: params.thinkingLevel ?? 'medium',\n });\n\n const reuseEnabled = isEmbeddedSessionRunnerEnabled();\n const existing = pool.get(params.sessionKey);\n\n let entry: PooledRunner;\n let reused = false;\n\n if (reuseEnabled && existing && existing.fingerprint === fingerprint) {\n clearIdleTimer(existing);\n entry = existing;\n entry.lastUsedAt = Date.now();\n reused = true;\n stats.reuses += 1;\n applySystemPromptOverrideToSession(entry.session, params.systemPrompt);\n entry.session.agent.streamFn = entry.baseStreamFn;\n log.debug({ sessionKey: params.sessionKey }, 'Reusing pooled embedded session runner');\n } else {\n if (existing) {\n disposePooledRunner(params.sessionKey, existing, 'fingerprint_mismatch');\n }\n entry = await createPooledRunner(params);\n pool.set(params.sessionKey, entry);\n stats.creates += 1;\n log.debug({ sessionKey: params.sessionKey }, 'Created embedded session runner');\n }\n\n return {\n session: entry.session,\n piSm: entry.piSm,\n reused,\n release: () => {\n if (!isEmbeddedSessionRunnerEnabled()) {\n disposePooledRunner(params.sessionKey, entry, 'runner_disabled');\n return;\n }\n entry.lastUsedAt = Date.now();\n scheduleIdleEviction(params.sessionKey, entry);\n },\n };\n}\n\n/** Resolve transcript path inputs used by both runner acquire and turn execution. */\nexport async function resolveEmbeddedTranscriptInputs(\n sessionStore: import('../../session/store.js').SessionStore,\n sessionKey: string,\n): Promise<{\n sessionId: string;\n sessionFile: string;\n sessionsDir: string;\n hadSessionFile: boolean;\n}> {\n const { sessionId, absPath: sessionFile, sessionsDir } = await sessionStore.resolveTranscriptPath(sessionKey);\n return {\n sessionId,\n sessionFile,\n sessionsDir,\n hadSessionFile: existsSync(sessionFile),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-runner.js","names":[],"sources":["../../../../src/agent/embedded/session-runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n SessionManager,\n SettingsManager,\n type AgentSession,\n} from '@earendil-works/pi-coding-agent';\nimport type { Model, Api } from '@earendil-works/pi-ai';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { guardSessionManager, type GuardedPiTranscriptManager } from './session-tool-result-guard.js';\nimport { prepareSessionManagerForRun } from './session-manager-init.js';\nimport { defaultSessionManagerCache, type SessionManagerCache } from './session-manager-cache.js';\nimport { applyXopcProviderApiKey, createEmbeddedAuthStorage } from './xopc-auth-storage.js';\nimport { wrapStreamFnForXopcExtensions } from './xopc-stream-bridge.js';\nimport { xopcToolsToDefinitions } from './xopc-tools-bridge.js';\nimport { applySystemPromptOverrideToSession } from './system-prompt-override.js';\n\nconst log = createLogger('EmbeddedSessionRunner');\n\nconst DEFAULT_IDLE_TTL_MS = 5 * 60_000;\n\nexport type EmbeddedRunnerFingerprintInput = {\n sessionFile: string;\n workspaceDir: string;\n modelRef: string;\n toolNames: readonly string[];\n systemPrompt: string;\n thinkingLevel: string;\n};\n\nexport function buildEmbeddedRunnerFingerprint(input: EmbeddedRunnerFingerprintInput): string {\n const tools = [...input.toolNames].sort().join('\\0');\n const promptMarker = `${input.systemPrompt.length}:${input.systemPrompt.slice(0, 128)}`;\n return [\n input.sessionFile,\n input.workspaceDir,\n input.modelRef,\n tools,\n promptMarker,\n input.thinkingLevel,\n ].join('\u001f');\n}\n\ntype PooledRunner = {\n sessionKey: string;\n fingerprint: string;\n session: AgentSession;\n piSm: GuardedPiTranscriptManager;\n settingsManager: SettingsManager;\n baseStreamFn: AgentSession['agent']['streamFn'];\n lastUsedAt: number;\n idleTimer: ReturnType<typeof setTimeout> | null;\n};\n\nexport type AcquireEmbeddedSessionRunnerParams = {\n sessionKey: string;\n sessionId: string;\n sessionFile: string;\n sessionsDir: string;\n hadSessionFile: boolean;\n workspaceDir: string;\n model: Model<Api>;\n modelRef: string;\n tools: AgentTool[];\n systemPrompt: string;\n thinkingLevel: ThinkingLevel;\n};\n\nexport type AcquiredEmbeddedSessionRunner = {\n session: AgentSession;\n piSm: GuardedPiTranscriptManager;\n reused: boolean;\n release: () => void;\n};\n\nexport interface EmbeddedSessionRunnerPoolStats {\n acquires: number;\n reuses: number;\n creates: number;\n evictions: number;\n pooled: number;\n}\n\nexport function isEmbeddedSessionRunnerEnabled(): boolean {\n const raw = process.env.XOPC_SESSION_RUNNER?.trim().toLowerCase();\n if (raw === '0' || raw === 'false' || raw === 'off') {\n return false;\n }\n return true;\n}\n\nexport function getEmbeddedSessionRunnerIdleTtlMs(): number {\n const raw = process.env.XOPC_SESSION_RUNNER_TTL_MS?.trim();\n if (!raw) {\n return DEFAULT_IDLE_TTL_MS;\n }\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_IDLE_TTL_MS;\n}\n\nfunction createEmbeddedSettingsManager(cwd: string): SettingsManager {\n const sm = SettingsManager.inMemory({ compaction: { enabled: false } });\n sm.setCompactionEnabled(false);\n void cwd;\n return sm;\n}\n\nexport interface EmbeddedSessionRunnerPoolOptions {\n /** File-exists cache shared with prewarmSessionFile callers. */\n sessionManagerCache?: SessionManagerCache;\n /** Override for the env-driven enable flag (testing). */\n isEnabled?: () => boolean;\n /** Override for the env-driven idle TTL (testing). */\n getIdleTtlMs?: () => number;\n}\n\n/**\n * Owns the per-session pool of pi `AgentSession` runners. The class is the supported,\n * injectable owner; {@link defaultEmbeddedSessionRunnerPool} keeps the historic\n * module-level free functions working until every caller is migrated to DI.\n */\nexport class EmbeddedSessionRunnerPool {\n private readonly pool = new Map<string, PooledRunner>();\n private readonly cache: SessionManagerCache;\n private readonly isEnabledFn: () => boolean;\n private readonly getIdleTtlMsFn: () => number;\n\n private stats: Omit<EmbeddedSessionRunnerPoolStats, 'pooled'> = {\n acquires: 0,\n reuses: 0,\n creates: 0,\n evictions: 0,\n };\n\n constructor(opts: EmbeddedSessionRunnerPoolOptions = {}) {\n this.cache = opts.sessionManagerCache ?? defaultSessionManagerCache;\n this.isEnabledFn = opts.isEnabled ?? isEmbeddedSessionRunnerEnabled;\n this.getIdleTtlMsFn = opts.getIdleTtlMs ?? getEmbeddedSessionRunnerIdleTtlMs;\n }\n\n getStats(): Readonly<EmbeddedSessionRunnerPoolStats> {\n return { ...this.stats, pooled: this.pool.size };\n }\n\n resetForTest(): void {\n for (const entry of this.pool.values()) {\n this.clearIdleTimer(entry);\n }\n this.pool.clear();\n this.stats = { acquires: 0, reuses: 0, creates: 0, evictions: 0 };\n }\n\n evict(sessionKey: string, reason = 'explicit'): void {\n const entry = this.pool.get(sessionKey);\n if (!entry) {\n return;\n }\n this.disposePooledRunner(sessionKey, entry, reason);\n }\n\n evictAll(reason = 'dispose_all'): void {\n for (const sessionKey of [...this.pool.keys()]) {\n this.evict(sessionKey, reason);\n }\n }\n\n async acquire(params: AcquireEmbeddedSessionRunnerParams): Promise<AcquiredEmbeddedSessionRunner> {\n this.stats.acquires += 1;\n\n const fingerprint = buildEmbeddedRunnerFingerprint({\n sessionFile: params.sessionFile,\n workspaceDir: params.workspaceDir,\n modelRef: params.modelRef,\n toolNames: params.tools.map((t) => t.name),\n systemPrompt: params.systemPrompt,\n thinkingLevel: params.thinkingLevel ?? 'medium',\n });\n\n const reuseEnabled = this.isEnabledFn();\n const existing = this.pool.get(params.sessionKey);\n\n let entry: PooledRunner;\n let reused = false;\n\n if (reuseEnabled && existing && existing.fingerprint === fingerprint) {\n this.clearIdleTimer(existing);\n entry = existing;\n entry.lastUsedAt = Date.now();\n reused = true;\n this.stats.reuses += 1;\n applySystemPromptOverrideToSession(entry.session, params.systemPrompt);\n entry.session.agent.streamFn = entry.baseStreamFn;\n log.debug({ sessionKey: params.sessionKey }, 'Reusing pooled embedded session runner');\n } else {\n if (existing) {\n this.disposePooledRunner(params.sessionKey, existing, 'fingerprint_mismatch');\n }\n entry = await this.createPooledRunner(params);\n this.pool.set(params.sessionKey, entry);\n this.stats.creates += 1;\n log.debug({ sessionKey: params.sessionKey }, 'Created embedded session runner');\n }\n\n return {\n session: entry.session,\n piSm: entry.piSm,\n reused,\n release: () => {\n if (!this.isEnabledFn()) {\n this.disposePooledRunner(params.sessionKey, entry, 'runner_disabled');\n return;\n }\n entry.lastUsedAt = Date.now();\n this.scheduleIdleEviction(params.sessionKey, entry);\n },\n };\n }\n\n private clearIdleTimer(entry: PooledRunner): void {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = null;\n }\n }\n\n private scheduleIdleEviction(sessionKey: string, entry: PooledRunner): void {\n this.clearIdleTimer(entry);\n const ttlMs = this.getIdleTtlMsFn();\n entry.idleTimer = setTimeout(() => {\n const current = this.pool.get(sessionKey);\n if (current === entry) {\n this.disposePooledRunner(sessionKey, entry, 'idle_ttl');\n }\n }, ttlMs);\n entry.idleTimer.unref?.();\n }\n\n private disposePooledRunner(sessionKey: string, entry: PooledRunner, reason: string): void {\n this.clearIdleTimer(entry);\n this.pool.delete(sessionKey);\n this.stats.evictions += 1;\n try {\n entry.piSm.flushPendingToolResults?.();\n } catch {\n /* ignore */\n }\n log.debug({ sessionKey, reason }, 'Embedded session runner evicted');\n }\n\n private async createPooledRunner(params: AcquireEmbeddedSessionRunnerParams): Promise<PooledRunner> {\n const {\n sessionKey,\n sessionId,\n sessionFile,\n sessionsDir,\n hadSessionFile,\n workspaceDir,\n model,\n thinkingLevel,\n tools,\n systemPrompt,\n } = params;\n\n await this.cache.prewarm(sessionFile);\n const settingsManager = createEmbeddedSettingsManager(workspaceDir);\n\n const piSm = guardSessionManager(SessionManager.open(sessionFile, sessionsDir, workspaceDir), {\n sessionKey,\n contextWindowTokens: model.contextWindow ?? 128_000,\n });\n\n await prepareSessionManagerForRun({\n sessionManager: piSm,\n sessionFile,\n hadSessionFile,\n sessionId,\n cwd: workspaceDir,\n });\n\n const toolDefs = xopcToolsToDefinitions(tools);\n const toolNames = tools.map((t) => t.name);\n\n const authStorage = createEmbeddedAuthStorage();\n applyXopcProviderApiKey(authStorage, model.provider);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: workspaceDir,\n agentDir: getAgentDir(),\n settingsManager,\n noContextFiles: true,\n });\n await resourceLoader.reload();\n\n const { session } = await createAgentSession({\n cwd: workspaceDir,\n model,\n thinkingLevel: thinkingLevel ?? 'medium',\n sessionManager: piSm,\n settingsManager,\n authStorage,\n resourceLoader,\n noTools: 'builtin',\n customTools: toolDefs,\n tools: toolNames,\n });\n\n applySystemPromptOverrideToSession(session, systemPrompt);\n const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFn);\n session.agent.streamFn = baseStreamFn;\n\n const fingerprint = buildEmbeddedRunnerFingerprint({\n sessionFile,\n workspaceDir,\n modelRef: params.modelRef,\n toolNames,\n systemPrompt,\n thinkingLevel: thinkingLevel ?? 'medium',\n });\n\n return {\n sessionKey,\n fingerprint,\n session,\n piSm,\n settingsManager,\n baseStreamFn,\n lastUsedAt: Date.now(),\n idleTimer: null,\n };\n }\n}\n\nexport const defaultEmbeddedSessionRunnerPool = new EmbeddedSessionRunnerPool();\n\nexport function getEmbeddedSessionRunnerStats(): Readonly<EmbeddedSessionRunnerPoolStats> {\n return defaultEmbeddedSessionRunnerPool.getStats();\n}\n\nexport function resetEmbeddedSessionRunnerForTest(): void {\n defaultEmbeddedSessionRunnerPool.resetForTest();\n}\n\nexport function evictEmbeddedSessionRunner(sessionKey: string, reason = 'explicit'): void {\n defaultEmbeddedSessionRunnerPool.evict(sessionKey, reason);\n}\n\nexport function evictAllEmbeddedSessionRunners(reason = 'dispose_all'): void {\n defaultEmbeddedSessionRunnerPool.evictAll(reason);\n}\n\nexport function acquireEmbeddedSessionRunner(\n params: AcquireEmbeddedSessionRunnerParams,\n): Promise<AcquiredEmbeddedSessionRunner> {\n return defaultEmbeddedSessionRunnerPool.acquire(params);\n}\n\n/** Resolve transcript path inputs used by both runner acquire and turn execution. */\nexport async function resolveEmbeddedTranscriptInputs(\n sessionStore: import('../../session/store.js').SessionStore,\n sessionKey: string,\n): Promise<{\n sessionId: string;\n sessionFile: string;\n sessionsDir: string;\n hadSessionFile: boolean;\n}> {\n const { sessionId, absPath: sessionFile, sessionsDir } = await sessionStore.resolveTranscriptPath(sessionKey);\n return {\n sessionId,\n sessionFile,\n sessionsDir,\n hadSessionFile: existsSync(sessionFile),\n };\n}\n"],"mappings":";;;;;;;;;;;;aAaqD;AASrD,MAAM,MAAM,aAAa,wBAAwB;AAEjD,MAAM,sBAAsB,IAAI;AAWhC,SAAgB,+BAA+B,OAA+C;CAC5F,MAAM,QAAQ,CAAC,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,KAAK;CACpD,MAAM,eAAe,GAAG,MAAM,aAAa,OAAO,GAAG,MAAM,aAAa,MAAM,GAAG,IAAI;AACrF,QAAO;EACL,MAAM;EACN,MAAM;EACN,MAAM;EACN;EACA;EACA,MAAM;EACP,CAAC,KAAK,IAAI;;AA2Cb,SAAgB,iCAA0C;CACxD,MAAM,MAAM,QAAQ,IAAI,qBAAqB,MAAM,CAAC,aAAa;AACjE,KAAI,QAAQ,OAAO,QAAQ,WAAW,QAAQ,MAC5C,QAAO;AAET,QAAO;;AAGT,SAAgB,oCAA4C;CAC1D,MAAM,MAAM,QAAQ,IAAI,4BAA4B,MAAM;AAC1D,KAAI,CAAC,IACH,QAAO;CAET,MAAM,SAAS,OAAO,SAAS,KAAK,GAAG;AACvC,QAAO,OAAO,SAAS,OAAO,IAAI,SAAS,IAAI,SAAS;;AAG1D,SAAS,8BAA8B,KAA8B;CACnE,MAAM,KAAK,gBAAgB,SAAS,EAAE,YAAY,EAAE,SAAS,OAAO,EAAE,CAAC;AACvE,IAAG,qBAAqB,MAAM;AAE9B,QAAO;;;;;;;AAiBT,IAAa,4BAAb,MAAuC;CACrC,uBAAwB,IAAI,KAA2B;CACvD;CACA;CACA;CAEA,QAAgE;EAC9D,UAAU;EACV,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;CAED,YAAY,OAAyC,EAAE,EAAE;AACvD,OAAK,QAAQ,KAAK,uBAAuB;AACzC,OAAK,cAAc,KAAK,aAAa;AACrC,OAAK,iBAAiB,KAAK,gBAAgB;;CAG7C,WAAqD;AACnD,SAAO;GAAE,GAAG,KAAK;GAAO,QAAQ,KAAK,KAAK;GAAM;;CAGlD,eAAqB;AACnB,OAAK,MAAM,SAAS,KAAK,KAAK,QAAQ,CACpC,MAAK,eAAe,MAAM;AAE5B,OAAK,KAAK,OAAO;AACjB,OAAK,QAAQ;GAAE,UAAU;GAAG,QAAQ;GAAG,SAAS;GAAG,WAAW;GAAG;;CAGnE,MAAM,YAAoB,SAAS,YAAkB;EACnD,MAAM,QAAQ,KAAK,KAAK,IAAI,WAAW;AACvC,MAAI,CAAC,MACH;AAEF,OAAK,oBAAoB,YAAY,OAAO,OAAO;;CAGrD,SAAS,SAAS,eAAqB;AACrC,OAAK,MAAM,cAAc,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,CAC5C,MAAK,MAAM,YAAY,OAAO;;CAIlC,MAAM,QAAQ,QAAoF;AAChG,OAAK,MAAM,YAAY;EAEvB,MAAM,cAAc,+BAA+B;GACjD,aAAa,OAAO;GACpB,cAAc,OAAO;GACrB,UAAU,OAAO;GACjB,WAAW,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK;GAC1C,cAAc,OAAO;GACrB,eAAe,OAAO,iBAAiB;GACxC,CAAC;EAEF,MAAM,eAAe,KAAK,aAAa;EACvC,MAAM,WAAW,KAAK,KAAK,IAAI,OAAO,WAAW;EAEjD,IAAI;EACJ,IAAI,SAAS;AAEb,MAAI,gBAAgB,YAAY,SAAS,gBAAgB,aAAa;AACpE,QAAK,eAAe,SAAS;AAC7B,WAAQ;AACR,SAAM,aAAa,KAAK,KAAK;AAC7B,YAAS;AACT,QAAK,MAAM,UAAU;AACrB,sCAAmC,MAAM,SAAS,OAAO,aAAa;AACtE,SAAM,QAAQ,MAAM,WAAW,MAAM;AACrC,OAAI,MAAM,EAAE,YAAY,OAAO,YAAY,EAAE,yCAAyC;SACjF;AACL,OAAI,SACF,MAAK,oBAAoB,OAAO,YAAY,UAAU,uBAAuB;AAE/E,WAAQ,MAAM,KAAK,mBAAmB,OAAO;AAC7C,QAAK,KAAK,IAAI,OAAO,YAAY,MAAM;AACvC,QAAK,MAAM,WAAW;AACtB,OAAI,MAAM,EAAE,YAAY,OAAO,YAAY,EAAE,kCAAkC;;AAGjF,SAAO;GACL,SAAS,MAAM;GACf,MAAM,MAAM;GACZ;GACA,eAAe;AACb,QAAI,CAAC,KAAK,aAAa,EAAE;AACvB,UAAK,oBAAoB,OAAO,YAAY,OAAO,kBAAkB;AACrE;;AAEF,UAAM,aAAa,KAAK,KAAK;AAC7B,SAAK,qBAAqB,OAAO,YAAY,MAAM;;GAEtD;;CAGH,eAAuB,OAA2B;AAChD,MAAI,MAAM,WAAW;AACnB,gBAAa,MAAM,UAAU;AAC7B,SAAM,YAAY;;;CAItB,qBAA6B,YAAoB,OAA2B;AAC1E,OAAK,eAAe,MAAM;EAC1B,MAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAM,YAAY,iBAAiB;AAEjC,OADgB,KAAK,KAAK,IAAI,WACnB,KAAK,MACd,MAAK,oBAAoB,YAAY,OAAO,WAAW;KAExD,MAAM;AACT,QAAM,UAAU,SAAS;;CAG3B,oBAA4B,YAAoB,OAAqB,QAAsB;AACzF,OAAK,eAAe,MAAM;AAC1B,OAAK,KAAK,OAAO,WAAW;AAC5B,OAAK,MAAM,aAAa;AACxB,MAAI;AACF,SAAM,KAAK,2BAA2B;UAChC;AAGR,MAAI,MAAM;GAAE;GAAY;GAAQ,EAAE,kCAAkC;;CAGtE,MAAc,mBAAmB,QAAmE;EAClG,MAAM,EACJ,YACA,WACA,aACA,aACA,gBACA,cACA,OACA,eACA,OACA,iBACE;AAEJ,QAAM,KAAK,MAAM,QAAQ,YAAY;EACrC,MAAM,kBAAkB,8BAA8B,aAAa;EAEnE,MAAM,OAAO,oBAAoB,eAAe,KAAK,aAAa,aAAa,aAAa,EAAE;GAC5F;GACA,qBAAqB,MAAM,iBAAiB;GAC7C,CAAC;AAEF,QAAM,4BAA4B;GAChC,gBAAgB;GAChB;GACA;GACA;GACA,KAAK;GACN,CAAC;EAEF,MAAM,WAAW,uBAAuB,MAAM;EAC9C,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,KAAK;EAE1C,MAAM,cAAc,2BAA2B;AAC/C,0BAAwB,aAAa,MAAM,SAAS;EAEpD,MAAM,iBAAiB,IAAI,sBAAsB;GAC/C,KAAK;GACL,UAAU,aAAa;GACvB;GACA,gBAAgB;GACjB,CAAC;AACF,QAAM,eAAe,QAAQ;EAE7B,MAAM,EAAE,YAAY,MAAM,mBAAmB;GAC3C,KAAK;GACL;GACA,eAAe,iBAAiB;GAChC,gBAAgB;GAChB;GACA;GACA;GACA,SAAS;GACT,aAAa;GACb,OAAO;GACR,CAAC;AAEF,qCAAmC,SAAS,aAAa;EACzD,MAAM,eAAe,8BAA8B,QAAQ,MAAM,SAAS;AAC1E,UAAQ,MAAM,WAAW;AAWzB,SAAO;GACL;GACA,aAXkB,+BAA+B;IACjD;IACA;IACA,UAAU,OAAO;IACjB;IACA;IACA,eAAe,iBAAiB;IACjC,CAIY;GACX;GACA;GACA;GACA;GACA,YAAY,KAAK,KAAK;GACtB,WAAW;GACZ;;;AAIL,MAAa,mCAAmC,IAAI,2BAA2B;AAE/E,SAAgB,gCAA0E;AACxF,QAAO,iCAAiC,UAAU;;AAGpD,SAAgB,oCAA0C;AACxD,kCAAiC,cAAc;;AAGjD,SAAgB,2BAA2B,YAAoB,SAAS,YAAkB;AACxF,kCAAiC,MAAM,YAAY,OAAO;;AAG5D,SAAgB,+BAA+B,SAAS,eAAqB;AAC3E,kCAAiC,SAAS,OAAO;;AAGnD,SAAgB,6BACd,QACwC;AACxC,QAAO,iCAAiC,QAAQ,OAAO;;;AAIzD,eAAsB,gCACpB,cACA,YAMC;CACD,MAAM,EAAE,WAAW,SAAS,aAAa,gBAAgB,MAAM,aAAa,sBAAsB,WAAW;AAC7G,QAAO;EACL;EACA;EACA;EACA,gBAAgB,WAAW,YAAY;EACxC"}
@@ -1,5 +1,25 @@
1
- import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
- import type { SessionManager } from "@earendil-works/pi-coding-agent";
1
+ /**
2
+ * Session tool-result guard wraps a pi `SessionManager.appendMessage` to:
3
+ * 1. cap oversized tool-result text + details so they cannot blow up the next
4
+ * LLM request (size + persistence limits).
5
+ * 2. track pending tool-call IDs so missing tool results can be synthesised
6
+ * (some providers refuse a turn that has an orphan tool_use block).
7
+ * 3. drop assistant `toolCall` blocks whose tool name is not in the allowlist
8
+ * (these would also trigger provider 400s).
9
+ * 4. broadcast `xopc:transcript-row` updates so the gateway UI can stream them.
10
+ *
11
+ * Previously this module shipped with three sibling files
12
+ * (`session-tool-result-state.ts`, `session-raw-append-message.ts`,
13
+ * `session-tool-result-guard-wrapper.ts`). They are now consolidated here as
14
+ * private constructs around the `ToolResultGuard` class. Pi-coding-agent owns
15
+ * the `SessionManager` instance and calls `appendMessage` from inside the
16
+ * runtime, so we still need to monkey-patch that method — but the patched
17
+ * implementation is just `guard.guardedAppend.bind(guard)` and all state lives
18
+ * on the class.
19
+ */
20
+ import type { AgentMessage } from '@earendil-works/pi-agent-core';
21
+ import type { SessionManager } from '@earendil-works/pi-coding-agent';
22
+ import type { Config } from '../../config/schema.js';
3
23
  export type BeforeMessageWriteHookEvent = {
4
24
  message: AgentMessage;
5
25
  };
@@ -7,14 +27,10 @@ export type BeforeMessageWriteHookResult = {
7
27
  block?: boolean;
8
28
  message?: AgentMessage;
9
29
  } | undefined;
10
- import { getRawSessionAppendMessage } from "./session-raw-append-message.js";
11
- export { getRawSessionAppendMessage };
12
- export declare function installSessionToolResultGuard(sessionManager: SessionManager, opts?: {
30
+ export interface ToolResultGuardOptions {
13
31
  /** Optional session key for transcript update broadcasts. */
14
32
  sessionKey?: string;
15
- /**
16
- * Optional transform applied to any message before persistence.
17
- */
33
+ /** Optional transform applied to any message before persistence. */
18
34
  transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;
19
35
  /**
20
36
  * Optional, synchronous transform applied to toolResult messages *before* they are
@@ -43,8 +59,40 @@ export declare function installSessionToolResultGuard(sessionManager: SessionMan
43
59
  */
44
60
  beforeMessageWriteHook?: (event: BeforeMessageWriteHookEvent) => BeforeMessageWriteHookResult;
45
61
  maxToolResultChars?: number;
46
- }): {
62
+ }
63
+ export interface InstallSessionToolResultGuardResult {
47
64
  flushPendingToolResults: () => void;
48
65
  clearPendingToolResults: () => void;
49
66
  getPendingIds: () => string[];
67
+ }
68
+ /** Idempotent wrapper that also adds the helper methods consumers expect. */
69
+ export type GuardedPiTranscriptManager = SessionManager & {
70
+ flushPendingToolResults?: () => void;
71
+ clearPendingToolResults?: () => void;
50
72
  };
73
+ /**
74
+ * Install the guard on a SessionManager and return its control API.
75
+ * Subsequent assistant/toolResult writes by pi-coding-agent flow through the
76
+ * guard transparently.
77
+ */
78
+ export declare function installSessionToolResultGuard(sessionManager: SessionManager, opts?: ToolResultGuardOptions): InstallSessionToolResultGuardResult;
79
+ /**
80
+ * Convenience wrapper used by the embedded runner pool: install the guard
81
+ * (idempotent), pin the size cap from the model context window, and expose
82
+ * `flushPendingToolResults` / `clearPendingToolResults` directly on the
83
+ * SessionManager instance so callers do not need to keep the install result.
84
+ */
85
+ export declare function guardSessionManager(sessionManager: SessionManager, opts?: {
86
+ agentId?: string;
87
+ sessionKey?: string;
88
+ config?: Config;
89
+ contextWindowTokens?: number;
90
+ allowSyntheticToolResults?: boolean;
91
+ missingToolResultText?: string;
92
+ allowedToolNames?: Iterable<string>;
93
+ }): GuardedPiTranscriptManager;
94
+ /**
95
+ * Recover the original (un-guarded) appendMessage for a session manager.
96
+ * Useful for callers that need a low-level "bypass the guard" write path.
97
+ */
98
+ export declare function getRawSessionAppendMessage(sessionManager: SessionManager): SessionManager['appendMessage'];