@xopcai/xopc 0.0.385 → 0.0.387

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 (360) hide show
  1. package/dist/browser-ext/dist/sidepanel.js +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Cb9eaXxR.js → agent-avatar-dicebear-Bv8M5ygD.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DEV-xtgm.js → agent-defaults-settings-panel-UBy01-65.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agent-plugin-dialog-DXKc3Luj.js → agent-plugin-dialog-Q9guA8kU.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agents-DcNxwpJQ.js → agents-yfJFubD0.js} +3 -3
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-X5i0Tz7_.js → app-management-settings-panel-Cdyad8c1.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-CmHHzquT.js → appearance-settings-DPPvnKH_.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-ChFA4Zp0.js → apps-page-Bn_jwaeA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{automations-page-BFqsIqOI.js → automations-page-CAB2sLJ5.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-workspace-Blfak-fT.js → automations-workspace-CYRUhhH4.js} +1 -1
  13. package/dist/gateway/static/root/assets/{block-editor-CpOLG3Co.js → block-editor-B9DmMEa8.js} +1 -1
  14. package/dist/gateway/static/root/assets/{browser-automations-page-BSbTJ9j2.js → browser-automations-page-BHAWpZE2.js} +1 -1
  15. package/dist/gateway/static/root/assets/{browser-settings-page-BUlILJrB.js → browser-settings-page-BG_17NcQ.js} +2 -2
  16. package/dist/gateway/static/root/assets/{capabilities-2Do3eKMM.js → capabilities-BX1rCiVm.js} +1 -1
  17. package/dist/gateway/static/root/assets/{capabilities-XFwwUNU3.js → capabilities-CW389yo6.js} +1 -1
  18. package/dist/gateway/static/root/assets/{capabilities-page-CeRdkwRf.js → capabilities-page-BAnBYWlY.js} +2 -2
  19. package/dist/gateway/static/root/assets/{capabilities-settings-panel-S-cKsGja.js → capabilities-settings-panel-Ca-d6lXk.js} +3 -3
  20. package/dist/gateway/static/root/assets/{capability-header-actions-6w8pQhnn.js → capability-header-actions-B3TL8TcF.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-DfNTGBmp.js → channels-BadpS-nq.js} +1 -1
  22. package/dist/gateway/static/root/assets/{chat-terminal-dock-DnoQHpDc.js → chat-terminal-dock-C_vntFpP.js} +1 -1
  23. package/dist/gateway/static/root/assets/{chunk-KS7C4IRE-BMYIfy9x.js → chunk-KS7C4IRE--EKdQGRF.js} +1 -1
  24. package/dist/gateway/static/root/assets/{computer-settings-page-7yliE7sG.js → computer-settings-page-B-5kxk70.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connector-service-page-DOLAUFSW.js → connector-service-page-DTnfpLHL.js} +1 -1
  26. package/dist/gateway/static/root/assets/{connectors-page-DAsn97XG.js → connectors-page-CmJV7gqj.js} +1 -1
  27. package/dist/gateway/static/root/assets/constants-DeXt1mV-.js +1 -0
  28. package/dist/gateway/static/root/assets/{date-picker-DNDqr4Fk.js → date-picker-D5zYeC8q.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-B5oG7RgE.js → dependency-picker-D72vT-tb.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-K7kUCX1O.js → desktop-pet-DvoeVPf_.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-KgOAuqSh.js → desktop-pet-settings-Dfb392hs.js} +1 -1
  32. package/dist/gateway/static/root/assets/{device-pairing-wizard-DvqniZDm.js → device-pairing-wizard-B06Sqn5D.js} +1 -1
  33. package/dist/gateway/static/root/assets/{directory-picker-path-field-BmOguLDl.js → directory-picker-path-field-CA3H3bc-.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-debug-page-DtHNy4TE.js → extension-debug-page-B0wTBCx4.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-DSSuMQxp.js → extension-page-BeHiXhB1.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-provider-nbgU7xBS.js → extension-provider-CJZ5EVpQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-DSd__mNd.js → extension-settings-page-Q88-LFCJ.js} +1 -1
  38. package/dist/gateway/static/root/assets/{fallback-models-D7bjbiwZ.js → fallback-models-BXoPCvzq.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-settings-hSXGWumL.js → gateway-settings-IICLMGDI.js} +1 -1
  40. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-C7xJwE61.js → highlighted-body-KQOG7T2V-D336so8z.js} +1 -1
  41. package/dist/gateway/static/root/assets/home-page--MvqsFhQ.js +2 -0
  42. package/dist/gateway/static/root/assets/{imports-page-BufZPzGE.js → imports-page-muV1SduS.js} +1 -1
  43. package/dist/gateway/static/root/assets/index-D0qMv3jf.js +260 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-B8pPP5RF.js → keyboard-shortcuts-settings-i1sDWcwl.js} +1 -1
  45. package/dist/gateway/static/root/assets/{local-app-workbench-page-zEtvE7pJ.js → local-app-workbench-page-DY9tXEO6.js} +1 -1
  46. package/dist/gateway/static/root/assets/{local-apps-page-Bli7e_eg.js → local-apps-page-BHD73STy.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-session-drafts-Be4BGM4Z.js +1 -0
  48. package/dist/gateway/static/root/assets/{logs-page-BimZk3R4.js → logs-page-DsPpe8Ws.js} +1 -1
  49. package/dist/gateway/static/root/assets/{management-settings-5Y4COyU9.js → management-settings-Buwi2wQE.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-view-DHfQAvZQ.js → markdown-view-CBjl-XEc.js} +2 -2
  51. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-D2mip-f9.js +1 -0
  52. package/dist/gateway/static/root/assets/{note-detail-panel-KLDPLVg7.js → note-detail-panel-D8n80Gbr.js} +3 -3
  53. package/dist/gateway/static/root/assets/{notes-api-nqN2wKYc.js → notes-api-BlGP533W.js} +1 -1
  54. package/dist/gateway/static/root/assets/{notes-page-DST0oPXD.js → notes-page-Btf-jSS_.js} +5 -5
  55. package/dist/gateway/static/root/assets/{page-context-capture-button-Bmed83-6.js → page-context-capture-button-97RL8Gc7.js} +1 -1
  56. package/dist/gateway/static/root/assets/{personal-page-BG4Ystrm.js → personal-page-B04L8Oz5.js} +1 -1
  57. package/dist/gateway/static/root/assets/product-open-page-9zEDvZa7.js +1 -0
  58. package/dist/gateway/static/root/assets/{product-preview-content-DjmupQSq.js → product-preview-content-DynBrIXq.js} +1 -1
  59. package/dist/gateway/static/root/assets/{project-detail-page-CzBmV0P6.js → project-detail-page-BM7MsoVA.js} +1 -1
  60. package/dist/gateway/static/root/assets/{projects-page-DByqe5Em.js → projects-page-pcyeEJnz.js} +1 -1
  61. package/dist/gateway/static/root/assets/{remote-access-hub-DTjj-odF.js → remote-access-hub-CphyTu22.js} +1 -1
  62. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-B_ptn3T8.js → runtime-tools-settings-panel-DPafoO0G.js} +1 -1
  63. package/dist/gateway/static/root/assets/{scenes-page-wkua4l5y.js → scenes-page-j97FrDRW.js} +2 -2
  64. package/dist/gateway/static/root/assets/{schema-form-VvOSM84Y.js → schema-form-CuJNwKHO.js} +1 -1
  65. package/dist/gateway/static/root/assets/{send-session-input-BCAF-Ikt.js → send-session-input-C293-Hbx.js} +1 -1
  66. package/dist/gateway/static/root/assets/session-manager-COd9RECl.js +16 -0
  67. package/dist/gateway/static/root/assets/{sessions-page-D06XwYAT.js → sessions-page-D8t_8fMl.js} +1 -1
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-CDkitNHA.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-page-C-6BJdb1.js → settings-page-DS9DMYUe.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-L0JSG0K-.js → setup-status-panel-DRDvm9yZ.js} +1 -1
  71. package/dist/gateway/static/root/assets/{share-link-dialog-C47Xgzta.js → share-link-dialog-BKGI8Kr0.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-nJ2FWAEP.js → share-preview-page-BF2WaO43.js} +1 -1
  73. package/dist/gateway/static/root/assets/{shares-settings-BbgAUM3v.js → shares-settings-DQTQZu6V.js} +1 -1
  74. package/dist/gateway/static/root/assets/{skill-api-BFU1tPyw.js → skill-api-DzVa7G-O.js} +1 -1
  75. package/dist/gateway/static/root/assets/{skills-page-DZw6el4o.js → skills-page-CfJIjRdS.js} +1 -1
  76. package/dist/gateway/static/root/assets/{system-settings-panel-DshSGWNg.js → system-settings-panel-Bzhqed-a.js} +1 -1
  77. package/dist/gateway/static/root/assets/task-detail-page-BYQFC0-U.js +2 -0
  78. package/dist/gateway/static/root/assets/task-expandable-content-C9ohICpw.js +1 -0
  79. package/dist/gateway/static/root/assets/{tasks-DJIeIk9C.js → tasks-PuIUgF9L.js} +1 -1
  80. package/dist/gateway/static/root/assets/{tunnel-api-DFDXwWnU.js → tunnel-api-DrgpZ81I.js} +1 -1
  81. package/dist/gateway/static/root/assets/{usage-page-2RJLg54s.js → usage-page-Drk8FWnj.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-composer-attachments-BFP3k6oC.js → use-composer-attachments-rgW7h4sD.js} +1 -1
  83. package/dist/gateway/static/root/assets/{use-file-preview-expanded-B1BiTQNS.js → use-file-preview-expanded-DSKIxfz9.js} +1 -1
  84. package/dist/gateway/static/root/assets/{user-model-page-y1gjGYPI.js → user-model-page-07t2-nFE.js} +2 -2
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-Ch-KfpCF.js → work-discovery-overlay-TQ5bjVot.js} +1 -1
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CTu297Hc.js → workflow-run-setup-panel-C9HP2uGG.js} +1 -1
  87. package/dist/gateway/static/root/assets/{workflows-page-CRZXG_rm.js → workflows-page-DK01JRI1.js} +3 -3
  88. package/dist/gateway/static/root/assets/{workspace-api-Xr3wz8T3.js → workspace-api-JWHOFos6.js} +2 -2
  89. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-hEfjVjnc.js → xopc-cloud-account-card-B-BhQdAf.js} +1 -1
  90. package/dist/gateway/static/root/index.html +16 -16
  91. package/dist/package.js +1 -1
  92. package/dist/packages/gateway-contract/src/index.js +4 -0
  93. package/dist/packages/gateway-contract/src/result-reference.js +25 -0
  94. package/dist/packages/gateway-contract/src/session-input-command.js +2 -1
  95. package/dist/packages/gateway-contract/src/task-research-result.js +90 -0
  96. package/dist/packages/gateway-contract/src/task-result-delivery.js +21 -0
  97. package/dist/packages/gateway-contract/src/tasks.js +7 -1
  98. package/dist/packages/gateway-contract/src/turn-outcome.js +4 -0
  99. package/dist/src/agent/agent-manager.js +3 -3
  100. package/dist/src/agent/background-review/run-background-review.js +1 -1
  101. package/dist/src/agent/child-agent-factory.d.ts +4 -1
  102. package/dist/src/agent/child-agent-factory.js +86 -12
  103. package/dist/src/agent/context/connection-objective-context.d.ts +1 -0
  104. package/dist/src/agent/context/connection-objective-context.js +33 -0
  105. package/dist/src/agent/data-acquisition/service.js +41 -6
  106. package/dist/src/agent/data-acquisition/types.d.ts +2 -0
  107. package/dist/src/agent/embedded/agent-profile-context.d.ts +7 -0
  108. package/dist/src/agent/embedded/agent-profile-context.js +92 -0
  109. package/dist/src/agent/embedded/run-for-session.js +5 -2
  110. package/dist/src/agent/embedded/run-turn.js +19 -6
  111. package/dist/src/agent/embedded/runs.d.ts +9 -2
  112. package/dist/src/agent/embedded/runs.js +30 -7
  113. package/dist/src/agent/embedded/session-runner.js +5 -2
  114. package/dist/src/agent/embedded/types.d.ts +4 -0
  115. package/dist/src/agent/embedded/xopc-tools-bridge.js +13 -2
  116. package/dist/src/agent/external-tools/cliProvider.js +1 -1
  117. package/dist/src/agent/external-tools/composio-provider.js +2 -2
  118. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  119. package/dist/src/agent/external-tools/gateway-tools.js +8 -4
  120. package/dist/src/agent/inbound/attachment-pipeline.js +1 -1
  121. package/dist/src/agent/orchestration/agent-run-supervisor.js +2 -1
  122. package/dist/src/agent/orchestration/agent-turn-policy.js +5 -1
  123. package/dist/src/agent/orchestration/delegation-budget.d.ts +7 -1
  124. package/dist/src/agent/orchestration/delegation-budget.js +17 -9
  125. package/dist/src/agent/orchestration/research-checkpoint.d.ts +56 -0
  126. package/dist/src/agent/orchestration/research-checkpoint.js +64 -0
  127. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +3 -1
  128. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +15 -2
  129. package/dist/src/agent/orchestration/run-termination.d.ts +12 -0
  130. package/dist/src/agent/orchestration/run-termination.js +24 -0
  131. package/dist/src/agent/orchestration/turn-recovery.d.ts +4 -1
  132. package/dist/src/agent/orchestration/turn-recovery.js +19 -3
  133. package/dist/src/agent/prompt/sections/agent-identity.js +12 -7
  134. package/dist/src/agent/prompt/sections/messaging-runtime.js +1 -1
  135. package/dist/src/agent/prompt/sections/project-context.js +1 -1
  136. package/dist/src/agent/prompt/sections/response-language.d.ts +1 -1
  137. package/dist/src/agent/prompt/sections/response-language.js +6 -2
  138. package/dist/src/agent/prompt/subagent-context.js +1 -1
  139. package/dist/src/agent/prompt/system-prompt.js +4 -6
  140. package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
  141. package/dist/src/agent/service/direct-turn-helpers.js +4 -0
  142. package/dist/src/agent/service/process-direct-one-shot.js +4 -1
  143. package/dist/src/agent/service/process-direct-streaming.js +3 -2
  144. package/dist/src/agent/service.js +2 -2
  145. package/dist/src/agent/skills/index.js +1 -1
  146. package/dist/src/agent/skills/managed-store.js +1 -1
  147. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  148. package/dist/src/agent/source-context/index.js +1 -1
  149. package/dist/src/agent/source-context/result-context.d.ts +2 -0
  150. package/dist/src/agent/source-context/result-context.js +32 -0
  151. package/dist/src/agent/source-context/types.d.ts +2 -2
  152. package/dist/src/agent/source-context/types.js +1 -1
  153. package/dist/src/agent/tasks/task-judge-service.js +3 -1
  154. package/dist/src/agent/tools/apply-patch.js +1 -1
  155. package/dist/src/agent/tools/delegate-tool.js +216 -121
  156. package/dist/src/agent/tools/delegation-policy.js +13 -1
  157. package/dist/src/agent/tools/exec-command.js +47 -2
  158. package/dist/src/agent/tools/factory.js +19 -10
  159. package/dist/src/agent/tools/index.d.ts +1 -0
  160. package/dist/src/agent/tools/index.js +2 -1
  161. package/dist/src/agent/tools/language-diagnostics.js +1 -1
  162. package/dist/src/agent/tools/personal-performance.d.ts +2 -0
  163. package/dist/src/agent/tools/personal-performance.js +82 -0
  164. package/dist/src/agent/tools/personal-read-tool.js +1 -1
  165. package/dist/src/agent/tools/personal-request-tool.js +9 -14
  166. package/dist/src/agent/tools/personal-result-tool.d.ts +2 -0
  167. package/dist/src/agent/tools/personal-result-tool.js +106 -0
  168. package/dist/src/agent/tools/personal-task-tool.d.ts +12 -3
  169. package/dist/src/agent/tools/personal-task-tool.js +115 -10
  170. package/dist/src/agent/tools/publish-artifacts.js +1 -1
  171. package/dist/src/agent/tools/research-checkpoint-tool.d.ts +3 -0
  172. package/dist/src/agent/tools/research-checkpoint-tool.js +28 -0
  173. package/dist/src/agent/tools/review-workspace.js +21 -2
  174. package/dist/src/agent/tools/search/cache.d.ts +20 -0
  175. package/dist/src/agent/tools/search/cache.js +19 -0
  176. package/dist/src/agent/tools/search/errors.d.ts +19 -0
  177. package/dist/src/agent/tools/search/errors.js +69 -0
  178. package/dist/src/agent/tools/search/providers/bing-api.js +2 -1
  179. package/dist/src/agent/tools/search/providers/bing-html.js +2 -1
  180. package/dist/src/agent/tools/search/providers/brave.js +2 -1
  181. package/dist/src/agent/tools/search/providers/duckduckgo-html.js +2 -1
  182. package/dist/src/agent/tools/search/providers/searxng.js +2 -1
  183. package/dist/src/agent/tools/search/providers/tavily.js +2 -1
  184. package/dist/src/agent/tools/search/providers/xopc-cloud.d.ts +1 -0
  185. package/dist/src/agent/tools/search/providers/xopc-cloud.js +7 -2
  186. package/dist/src/agent/tools/search/registry.d.ts +21 -5
  187. package/dist/src/agent/tools/search/registry.js +252 -25
  188. package/dist/src/agent/tools/search/types.d.ts +25 -0
  189. package/dist/src/agent/tools/send-media.js +1 -1
  190. package/dist/src/agent/tools/task-collaboration-tool.d.ts +9 -1
  191. package/dist/src/agent/tools/task-collaboration-tool.js +121 -2
  192. package/dist/src/agent/tools/task-evidence.d.ts +3 -0
  193. package/dist/src/agent/tools/task-evidence.js +71 -0
  194. package/dist/src/agent/tools/task-result-tool.d.ts +2 -0
  195. package/dist/src/agent/tools/task-result-tool.js +93 -0
  196. package/dist/src/agent/tools/tool-media.js +1 -1
  197. package/dist/src/agent/tools/web.d.ts +16 -2
  198. package/dist/src/agent/tools/web.js +74 -29
  199. package/dist/src/agent/tools/xopc-use-tool.js +27 -6
  200. package/dist/src/agent/workspace-runtime/registry.js +1 -1
  201. package/dist/src/agent-catalog/capabilities.js +2 -2
  202. package/dist/src/automations/capabilities/drafts.js +1 -1
  203. package/dist/src/automations/capabilities/write.d.ts +4 -4
  204. package/dist/src/automations/domain/validation.d.ts +8 -8
  205. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  206. package/dist/src/automations/service/action-executor.js +1 -1
  207. package/dist/src/bootstrap/application-state.js +1 -1
  208. package/dist/src/browser/automations/schema.d.ts +2 -2
  209. package/dist/src/browser/automations/service.d.ts +2 -2
  210. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  211. package/dist/src/capabilities/runtime/product.js +1 -1
  212. package/dist/src/chat-commands/agent-edit.js +1 -1
  213. package/dist/src/cli/commands/agent.js +1 -1
  214. package/dist/src/cli/commands/agents.js +1 -1
  215. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  216. package/dist/src/cli/commands/models.js +1 -1
  217. package/dist/src/cli/commands/onboard/model.js +1 -1
  218. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  219. package/dist/src/config/agent-profile.js +2 -2
  220. package/dist/src/config/index.js +2 -2
  221. package/dist/src/config/loader.js +1 -1
  222. package/dist/src/config/models-json.js +1 -1
  223. package/dist/src/config/schema.d.ts +1 -0
  224. package/dist/src/config/schema.js +5 -2
  225. package/dist/src/connectors/connection-recovery-service.d.ts +3 -1
  226. package/dist/src/connectors/connection-recovery-service.js +67 -6
  227. package/dist/src/discussions/action-tasks.d.ts +2 -2
  228. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  229. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  230. package/dist/src/gateway/agents-admin.js +2 -2
  231. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  232. package/dist/src/gateway/hono/routes/agent-stream.js +1 -1
  233. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  234. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  235. package/dist/src/gateway/hono/routes/context-sources.js +1 -1
  236. package/dist/src/gateway/hono/routes/notes.js +2 -2
  237. package/dist/src/gateway/hono/routes/projects.js +3 -3
  238. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +18 -2
  239. package/dist/src/gateway/hono/routes/session-input-handler.js +2 -2
  240. package/dist/src/gateway/hono/routes/tasks.js +2 -2
  241. package/dist/src/gateway/image-generation-setup.js +1 -1
  242. package/dist/src/gateway/lock.js +1 -1
  243. package/dist/src/gateway/media-access.js +1 -1
  244. package/dist/src/gateway/service/agent-runner.d.ts +2 -0
  245. package/dist/src/gateway/service/agent-runner.js +30 -17
  246. package/dist/src/gateway/service/run-gateway-agent.js +32 -2
  247. package/dist/src/gateway/service/session-input-coordinator.d.ts +10 -1
  248. package/dist/src/gateway/service/session-input-coordinator.js +214 -27
  249. package/dist/src/gateway/service.d.ts +1 -0
  250. package/dist/src/gateway/service.js +49 -16
  251. package/dist/src/gateway/session-context-summary.js +1 -1
  252. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  253. package/dist/src/home-intelligence/host.js +2 -2
  254. package/dist/src/local-apps/service.js +1 -1
  255. package/dist/src/media/session-references.js +1 -1
  256. package/dist/src/personal-agent/communication.js +1 -0
  257. package/dist/src/personal-agent/performance.d.ts +83 -0
  258. package/dist/src/personal-agent/performance.js +65 -0
  259. package/dist/src/personal-agent/policy.d.ts +1 -1
  260. package/dist/src/personal-agent/policy.js +1 -0
  261. package/dist/src/personal-agent/proactivity/service.js +1 -1
  262. package/dist/src/personal-agent/prompt-context.js +3 -1
  263. package/dist/src/personal-agent/prompts.js +10 -4
  264. package/dist/src/personal-agent/reply-composer.d.ts +1 -0
  265. package/dist/src/personal-agent/reply-composer.js +149 -20
  266. package/dist/src/personal-agent/reply-style.d.ts +1 -1
  267. package/dist/src/personal-agent/reply-style.js +1 -0
  268. package/dist/src/personal-agent/repository.d.ts +1 -1
  269. package/dist/src/personal-agent/repository.js +1 -1
  270. package/dist/src/personal-agent/request-delivery.js +3 -1
  271. package/dist/src/personal-agent/request-repository.d.ts +2 -0
  272. package/dist/src/personal-agent/request-service.d.ts +4 -0
  273. package/dist/src/personal-agent/request-service.js +91 -20
  274. package/dist/src/personal-agent/result-extraction.d.ts +42 -0
  275. package/dist/src/personal-agent/result-extraction.js +209 -0
  276. package/dist/src/personal-agent/result-file-links.d.ts +3 -0
  277. package/dist/src/personal-agent/result-file-links.js +21 -0
  278. package/dist/src/personal-agent/result-read-continuations.d.ts +13 -0
  279. package/dist/src/personal-agent/result-read-continuations.js +78 -0
  280. package/dist/src/personal-agent/result-reader.d.ts +43 -0
  281. package/dist/src/personal-agent/result-reader.js +461 -0
  282. package/dist/src/personal-agent/service.js +2 -2
  283. package/dist/src/personal-agent/task-cancel.js +85 -35
  284. package/dist/src/providers/model-catalog-persistence.js +1 -1
  285. package/dist/src/routing/resolve-route.js +1 -1
  286. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  287. package/dist/src/scenes/taskFollowUp/service.d.ts +15 -5
  288. package/dist/src/session/client-history.d.ts +1 -1
  289. package/dist/src/session/client-history.js +1 -1
  290. package/dist/src/session/session-context-for-llm.js +4 -2
  291. package/dist/src/session/store.d.ts +3 -1
  292. package/dist/src/session/store.js +13 -3
  293. package/dist/src/share/hosted-session-share.js +1 -1
  294. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +5 -2
  295. package/dist/src/storage/sqlite/connection-wait-repository.js +42 -17
  296. package/dist/src/storage/sqlite/index.d.ts +1 -0
  297. package/dist/src/storage/sqlite/index.js +3 -1
  298. package/dist/src/storage/sqlite/migrations/250_research_checkpoints.sql +15 -0
  299. package/dist/src/storage/sqlite/migrations/251_personal_result_reads.sql +40 -0
  300. package/dist/src/storage/sqlite/migrations/252_task_work_revisions.sql +15 -0
  301. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  302. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  303. package/dist/src/storage/sqlite/research-checkpoint-repository.d.ts +24 -0
  304. package/dist/src/storage/sqlite/research-checkpoint-repository.js +91 -0
  305. package/dist/src/storage/sqlite/schema.js +1 -1
  306. package/dist/src/storage/sqlite/session-creation-repository.js +3 -2
  307. package/dist/src/storage/sqlite/session-input-repository.d.ts +16 -0
  308. package/dist/src/storage/sqlite/session-input-repository.js +41 -7
  309. package/dist/src/tasks/capabilities/management.d.ts +2 -2
  310. package/dist/src/tasks/capabilities/read.js +2 -2
  311. package/dist/src/tasks/capabilities/relations.d.ts +7 -7
  312. package/dist/src/tasks/capabilities/write.d.ts +2 -2
  313. package/dist/src/tasks/capabilities/write.js +1 -1
  314. package/dist/src/tasks/index.js +1 -1
  315. package/dist/src/tasks/task-allocation-service.d.ts +2 -0
  316. package/dist/src/tasks/task-allocation-service.js +100 -8
  317. package/dist/src/tasks/task-application-service.d.ts +18 -0
  318. package/dist/src/tasks/task-application-service.js +133 -2
  319. package/dist/src/tasks/task-context-assembler.js +13 -5
  320. package/dist/src/tasks/task-continuation.d.ts +1 -0
  321. package/dist/src/tasks/task-continuation.js +1 -0
  322. package/dist/src/tasks/task-contract-definition.d.ts +3 -0
  323. package/dist/src/tasks/task-contract-planner.d.ts +1 -0
  324. package/dist/src/tasks/task-contract-planner.js +61 -20
  325. package/dist/src/tasks/task-conversation-repository.js +1 -1
  326. package/dist/src/tasks/task-evidence-ranges.d.ts +7 -0
  327. package/dist/src/tasks/task-evidence-ranges.js +20 -0
  328. package/dist/src/tasks/task-execution-capabilities.d.ts +26 -0
  329. package/dist/src/tasks/task-execution-capabilities.js +117 -0
  330. package/dist/src/tasks/task-handoff-service.js +1 -1
  331. package/dist/src/tasks/task-handoff.d.ts +56 -0
  332. package/dist/src/tasks/task-handoff.js +510 -0
  333. package/dist/src/tasks/task-model-call.d.ts +7 -0
  334. package/dist/src/tasks/task-model-call.js +35 -0
  335. package/dist/src/tasks/task-read-model-projector.d.ts +6 -0
  336. package/dist/src/tasks/task-read-model-projector.js +12 -1
  337. package/dist/src/tasks/task-research-repair.d.ts +19 -0
  338. package/dist/src/tasks/task-research-repair.js +79 -0
  339. package/dist/src/tasks/task-research-result.d.ts +99 -0
  340. package/dist/src/tasks/task-research-result.js +478 -0
  341. package/dist/src/tasks/task-result-delivery-repository.js +37 -3
  342. package/dist/src/tasks/task-result-delivery-service.js +38 -10
  343. package/dist/src/tasks/task-run-coordinator.js +71 -15
  344. package/dist/src/tasks/task-run-dispatcher.d.ts +1 -0
  345. package/dist/src/tasks/task-run-dispatcher.js +3 -1
  346. package/dist/src/tasks/task-run-repository.d.ts +5 -0
  347. package/dist/src/tasks/task-run-repository.js +88 -1
  348. package/dist/src/tui/backends/embedded-backend.js +2 -2
  349. package/dist/src/voice/realtime/persona-context.js +1 -1
  350. package/package.json +12 -6
  351. package/dist/gateway/static/root/assets/constants-Dy8Gw0sF.js +0 -1
  352. package/dist/gateway/static/root/assets/home-page-DJNmlMfH.js +0 -2
  353. package/dist/gateway/static/root/assets/index-K8SXDtxr.js +0 -260
  354. package/dist/gateway/static/root/assets/local-session-drafts-D_tYFy7d.js +0 -1
  355. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DBRj4-1-.js +0 -1
  356. package/dist/gateway/static/root/assets/product-open-page-CXkYP9xE.js +0 -1
  357. package/dist/gateway/static/root/assets/session-manager-_yy4bxhT.js +0 -16
  358. package/dist/gateway/static/root/assets/settings-advanced-gate-DoAHy1wj.js +0 -1
  359. package/dist/gateway/static/root/assets/task-detail-page-CfZhq4XZ.js +0 -2
  360. package/dist/gateway/static/root/assets/task-expandable-content-CF6Bj-Qa.js +0 -1
@@ -0,0 +1,3 @@
1
+ /** Preserve literal code; remove actionable local file references from prose. */
2
+ export declare function sanitizePersonalResultFileLinks(text: string): string;
3
+ export declare function hasPersonalResultFileLinks(text: string): boolean;
@@ -0,0 +1,21 @@
1
+ //#region src/personal-agent/result-file-links.ts
2
+ /** File delivery belongs to structured artifacts, not model-authored host links. */
3
+ function localTarget(value) {
4
+ let target = value.trim().replace(/^<|>$/g, "").replace(/\\([\\/])/g, "$1");
5
+ try {
6
+ target = decodeURIComponent(target);
7
+ } catch {}
8
+ return /^(?:\/|\\\\|~\/|\.\.?\/|[a-z]:[\\/]|file:|media:|xopc:\/\/workspace\/file)/i.test(target) || /^[^\s:?#]+\.(?:md|pdf|docx?|xlsx?|csv|pptx?|zip|png|jpe?g|webp|mp[34]|wav)(?:[?#].*)?$/i.test(target);
9
+ }
10
+ function cleanSegment(text) {
11
+ return text.replace(/^\s*MEDIA\s*:\s*.*$/gim, "").replace(/!?\[([^\]\n]*)\]\(\s*(<[^>]+>|[^\s)]+)(?:\s+["'][^\n]*?["'])?\s*\)/g, (match, label, target) => localTarget(target) ? label : match).replace(/^\s*\[[^\]\n]+\]:\s*(<[^>]+>|\S+).*$/gm, (match, target) => localTarget(target) ? "" : match).replace(/<([^<>\n]+)>/g, (match, target) => localTarget(target) ? "" : match).replace(/\b(?:file:\/\/|media:\/\/|xopc:\/\/workspace\/file)[^\s<>"'`]+/gi, "").replace(/(?<![\w:/])(?:\/(?:Users|home|tmp|private|workspace|var)\/|[a-z]:[\\/])[^\s<>"'`]+/gi, "");
12
+ }
13
+ /** Preserve literal code; remove actionable local file references from prose. */
14
+ function sanitizePersonalResultFileLinks(text) {
15
+ return text.split(/(```[\s\S]*?```|~~~[\s\S]*?~~~|`[^`\n]+`)/g).map((part, index) => index % 2 ? part : cleanSegment(part)).join("").trim();
16
+ }
17
+ function hasPersonalResultFileLinks(text) {
18
+ return sanitizePersonalResultFileLinks(text) !== text.trim();
19
+ }
20
+ //#endregion
21
+ export { hasPersonalResultFileLinks, sanitizePersonalResultFileLinks };
@@ -0,0 +1,13 @@
1
+ import { type PersonalResultInput } from './result-reader.js';
2
+ /** Preserve the original question while a cold extraction runs; no new business Task. */
3
+ export declare function waitForPersonalResult(conversationId: string, request: PersonalResultInput): boolean;
4
+ /** Existing result dispatch owns scheduling; stable input IDs recover an enqueue crash. */
5
+ export declare function drainPersonalResultReads(options: {
6
+ isAvailable: (conversationId: string) => boolean;
7
+ submit: (input: {
8
+ conversationId: string;
9
+ clientMessageId: string;
10
+ expectedTranscriptId: string;
11
+ content: string;
12
+ }) => Promise<boolean>;
13
+ }): Promise<void>;
@@ -0,0 +1,78 @@
1
+ import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
2
+ import { init_session_instance_repository, readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
3
+ import { findSessionInput, getSessionInputById, getSessionInputState, init_session_input_repository } from "../storage/sqlite/session-input-repository.js";
4
+ import { readPersonalResult } from "./result-reader.js";
5
+ import { personalConversationState } from "./conversation-state.js";
6
+ //#region src/personal-agent/result-read-continuations.ts
7
+ init_session_input_repository();
8
+ init_session_instance_repository();
9
+ init_transaction();
10
+ /** Preserve the original question while a cold extraction runs; no new business Task. */
11
+ function waitForPersonalResult(conversationId, request) {
12
+ const db = getSqliteDatabase();
13
+ const inputId = getSessionInputState(conversationId).activeInputId;
14
+ const input = inputId ? getSessionInputById(conversationId, inputId) : void 0;
15
+ const transcriptId = readCurrentTranscriptId(db, conversationId);
16
+ if (!input || !transcriptId || input.clientMessageId.startsWith("personal-result-read:")) return false;
17
+ const stored = db.prepare("SELECT requests_json FROM personal_result_read_waits WHERE input_id = ?").get(input.id);
18
+ const requests = stored ? JSON.parse(stored.requests_json) : [];
19
+ if (!requests.some((item) => JSON.stringify(item) === JSON.stringify(request)) && requests.length < 5) requests.push(request);
20
+ db.prepare(`INSERT INTO personal_result_read_waits(input_id, conversation_id, transcript_id, requests_json)
21
+ VALUES (?, ?, ?, ?) ON CONFLICT(input_id) DO UPDATE SET requests_json = excluded.requests_json`).run(input.id, conversationId, transcriptId, JSON.stringify(requests));
22
+ return true;
23
+ }
24
+ /** Existing result dispatch owns scheduling; stable input IDs recover an enqueue crash. */
25
+ async function drainPersonalResultReads(options) {
26
+ const db = getSqliteDatabase();
27
+ const rows = db.prepare("SELECT * FROM personal_result_read_waits WHERE status IN ('pending','queued') LIMIT 20").all();
28
+ for (const row of rows) {
29
+ const original = getSessionInputById(row.conversation_id, row.input_id);
30
+ const update = (status) => db.prepare("UPDATE personal_result_read_waits SET status = ? WHERE input_id = ?").run(status, row.input_id);
31
+ if (!original || [
32
+ "cancelled",
33
+ "interrupted",
34
+ "failed"
35
+ ].includes(original.status) || readCurrentTranscriptId(db, row.conversation_id) !== row.transcript_id) {
36
+ update("stale");
37
+ continue;
38
+ }
39
+ const clientMessageId = `personal-result-read:${row.input_id}`;
40
+ const queued = findSessionInput(row.conversation_id, clientMessageId);
41
+ if (queued) {
42
+ update(queued.status === "completed" ? "done" : [
43
+ "failed",
44
+ "cancelled",
45
+ "interrupted"
46
+ ].includes(queued.status) ? "stale" : "queued");
47
+ continue;
48
+ }
49
+ if (original.status !== "completed" || !personalConversationState(row.conversation_id).idle || !options.isAvailable(row.conversation_id)) continue;
50
+ const requests = JSON.parse(row.requests_json);
51
+ const states = [];
52
+ let pending = false;
53
+ for (const request of requests) try {
54
+ const value = await readPersonalResult(row.conversation_id, request);
55
+ if (value.status === "preparing") pending = true;
56
+ states.push({
57
+ request,
58
+ status: value.status,
59
+ reason: value.reason ?? value.error
60
+ });
61
+ } catch {
62
+ states.push({
63
+ request,
64
+ status: "unavailable"
65
+ });
66
+ }
67
+ if (pending) continue;
68
+ if (readCurrentTranscriptId(db, row.conversation_id) !== row.transcript_id || !personalConversationState(row.conversation_id).idle) continue;
69
+ if (await options.submit({
70
+ conversationId: row.conversation_id,
71
+ clientMessageId,
72
+ expectedTranscriptId: row.transcript_id,
73
+ content: `Continue the existing user's result question after background text preparation. This is a read-only continuation, not a new Task or authorization. Read the prepared ranges with personal_result and answer the original question. Respect later user corrections; explain actual access failures. Do not recreate artifacts or execute new work.\nOriginal question (data): ${JSON.stringify(original.content)}\nPrepared reads (data): ${JSON.stringify(states)}`
74
+ })) update("queued");
75
+ }
76
+ }
77
+ //#endregion
78
+ export { drainPersonalResultReads, waitForPersonalResult };
@@ -0,0 +1,43 @@
1
+ import { type TaskResultDelivery } from '@xopcai/gateway-contract';
2
+ export interface PersonalResultInput {
3
+ command: 'list' | 'get' | 'read' | 'search';
4
+ resultId?: string;
5
+ taskId?: string;
6
+ sourceId?: string;
7
+ revision?: string;
8
+ sectionId?: string;
9
+ offset?: number;
10
+ limit?: number;
11
+ query?: string;
12
+ cursor?: string;
13
+ }
14
+ /** A delegated reader must retain the source account's current Agent access restrictions. */
15
+ export declare function assertPersonalResultDelegateAccess(conversationId: string, delivery: TaskResultDelivery, agentId: string): void;
16
+ export declare function resolvePersonalResultReference(conversationId: string, resultId: string): TaskResultDelivery;
17
+ /** Retry only an exhausted delivery outbox; never reopen execution, parsing, or a historical revision. */
18
+ export declare function retryPersonalResultDelivery(conversationId: string, resultId: string): Record<string, unknown>;
19
+ /** Metadata-only directory; no extraction, model calls or file IO on the prompt path. */
20
+ export declare function listPersonalResults(conversationId: string, options?: {
21
+ taskId?: string;
22
+ limit?: number;
23
+ offset?: number;
24
+ }): {
25
+ offset: number;
26
+ nextOffset?: number;
27
+ items: {
28
+ resultId: string;
29
+ taskId: unknown;
30
+ title: string;
31
+ runId: unknown;
32
+ status: unknown;
33
+ deliveryState: unknown;
34
+ baselineVersion: string;
35
+ resultRevision: unknown;
36
+ previousResultId: unknown;
37
+ createdAt: unknown;
38
+ }[];
39
+ };
40
+ export declare function stopPersonalResultPreparations(): Promise<void>;
41
+ /** Warm only bounded source counts after delivery; never wait for a parser or hold a main conversation lock. */
42
+ export declare function warmPersonalResult(conversationId: string, resultId: string): void;
43
+ export declare function readPersonalResult(conversationId: string, raw: PersonalResultInput): Promise<Record<string, unknown>>;
@@ -0,0 +1,461 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
4
+ import { TaskResultDeliverySchema } from "../../packages/gateway-contract/src/task-result-delivery.js";
5
+ import { init_src } from "../../packages/gateway-contract/src/index.js";
6
+ import { init_session_instance_repository, readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
7
+ import { init_request_repository, personalRequestForTask } from "./request-repository.js";
8
+ import { getConnectorAccount, init_connector_account_repository } from "../storage/sqlite/connector-account-repository.js";
9
+ import { getConnectorConnection, getConnectorInstallation, init_connector_repository } from "../storage/sqlite/connector-repository.js";
10
+ import { isPersonalConversation } from "./repository.js";
11
+ import { canAccessConnectorAccount } from "../connectors/account-access.js";
12
+ import { connectorPrincipalForSession } from "../connectors/principal.js";
13
+ import { resolveMediaReference } from "../media/media-reference.js";
14
+ import { createRequire } from "node:module";
15
+ import { existsSync } from "node:fs";
16
+ import { fileURLToPath } from "node:url";
17
+ import { createHash, randomUUID } from "node:crypto";
18
+ import { lstat } from "node:fs/promises";
19
+ import { Worker } from "node:worker_threads";
20
+ //#region src/personal-agent/result-reader.ts
21
+ init_src();
22
+ init_connector_account_repository();
23
+ init_connector_repository();
24
+ init_session_instance_repository();
25
+ init_transaction();
26
+ init_logger();
27
+ init_request_repository();
28
+ const PARSER_VERSION = 1;
29
+ const workers = /* @__PURE__ */ new Map();
30
+ const shuttingDownWorkers = /* @__PURE__ */ new WeakSet();
31
+ const log = createLogger("PersonalResultRead");
32
+ let preparationGeneration = 0;
33
+ const require = createRequire(import.meta.url);
34
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
35
+ function databasePath() {
36
+ return getSqliteDatabase().prepare("PRAGMA database_list").all().find((row) => row.name === "main").file;
37
+ }
38
+ function assertAccess(conversationId, delivery) {
39
+ const db = getSqliteDatabase();
40
+ if (!isPersonalConversation(conversationId) || delivery.conversationId !== conversationId || !readCurrentTranscriptId(db, conversationId) || !db.prepare("SELECT 1 FROM task_origin_links WHERE task_id = ? AND conversation_id = ?").get(delivery.taskId, conversationId)) throw new Error("Result is unavailable in this conversation");
41
+ const request = personalRequestForTask(delivery.taskId);
42
+ if (!request) return;
43
+ const principal = connectorPrincipalForSession(conversationId);
44
+ const account = request.accountId ? getConnectorAccount(request.accountId) : void 0;
45
+ const connection = account?.currentConnectionId ? getConnectorConnection(account.currentConnectionId) : void 0;
46
+ const installation = getConnectorInstallation(`${request.connectorId}-${principal.principalId}`);
47
+ if (request.state === "cancelled" || request.transcriptId !== readCurrentTranscriptId(db, conversationId) || !principal.isLocalOwner || !installation || !connection || connection.status !== "active" || account?.connectorId !== request.connectorId || !canAccessConnectorAccount(connection, installation, principal.agentId) || !canAccessConnectorAccount(connection, installation, request.executorAgentId)) throw new Error("Result account access is no longer available");
48
+ }
49
+ function resolve(conversationId, resultId) {
50
+ const row = getSqliteDatabase().prepare(`SELECT delivery_id, payload_json, reply_payload_json, status FROM task_result_deliveries
51
+ WHERE delivery_id = ? AND conversation_id = ? AND status IN ('pending','delivered','stale','failed')`).get(resultId, conversationId);
52
+ if (!row) throw new Error("Result is unavailable in this conversation");
53
+ const delivery = TaskResultDeliverySchema.parse(JSON.parse(row.payload_json));
54
+ assertAccess(conversationId, delivery);
55
+ return {
56
+ row,
57
+ delivery
58
+ };
59
+ }
60
+ /** A delegated reader must retain the source account's current Agent access restrictions. */
61
+ function assertPersonalResultDelegateAccess(conversationId, delivery, agentId) {
62
+ assertAccess(conversationId, delivery);
63
+ const request = personalRequestForTask(delivery.taskId);
64
+ if (!request) return;
65
+ const principal = connectorPrincipalForSession(conversationId);
66
+ const account = request.accountId ? getConnectorAccount(request.accountId) : void 0;
67
+ const connection = account?.currentConnectionId ? getConnectorConnection(account.currentConnectionId) : void 0;
68
+ const installation = getConnectorInstallation(`${request.connectorId}-${principal.principalId}`);
69
+ if (!connection || !installation || !canAccessConnectorAccount(connection, installation, agentId)) throw new Error("Result account access does not permit this Task executor");
70
+ }
71
+ function resolvePersonalResultReference(conversationId, resultId) {
72
+ return resolve(conversationId, resultId).delivery;
73
+ }
74
+ /** Retry only an exhausted delivery outbox; never reopen execution, parsing, or a historical revision. */
75
+ function retryPersonalResultDelivery(conversationId, resultId) {
76
+ const { delivery } = resolve(conversationId, resultId);
77
+ return runSqliteWriteTransaction((db) => {
78
+ const task = db.prepare("SELECT latest_contract_version, resolution FROM tasks WHERE task_id = ?").get(delivery.taskId);
79
+ const latest = db.prepare("SELECT run_id, status FROM task_runs WHERE task_id = ? AND parent_run_id IS NULL ORDER BY queued_at DESC, rowid DESC LIMIT 1").get(delivery.taskId);
80
+ if (!latest || latest.run_id !== delivery.taskRunId || !["succeeded", "failed"].includes(latest.status) || task.resolution && task.resolution !== "done" || delivery.contractVersion !== void 0 && delivery.contractVersion !== task.latest_contract_version || delivery.instructionSequence !== void 0 && delivery.instructionSequence !== Number(db.prepare("SELECT COALESCE(MAX(sequence),0) AS n FROM task_collaboration_entries WHERE task_id = ? AND author_kind IN ('main_agent','user') AND kind IN ('instruction','answer')").get(delivery.taskId)?.n ?? 0)) return {
81
+ retryQueued: false,
82
+ resultId,
83
+ reason: "historical_or_changed_requirements",
84
+ guidance: "Read this historical result. Do not resend it as the completion of newer or cancelled work."
85
+ };
86
+ const row = db.prepare("SELECT status, notified_at, reply_attempts, reply_notified_at FROM task_result_deliveries WHERE delivery_id = ?").get(resultId);
87
+ if (row.status !== "failed" && row.notified_at !== -1 && row.reply_attempts < 8 && row.reply_notified_at !== -1) return {
88
+ retryQueued: false,
89
+ resultId,
90
+ reason: "already_pending_or_delivered"
91
+ };
92
+ db.prepare(`UPDATE task_result_deliveries SET status = CASE WHEN status = 'failed' THEN 'pending' ELSE status END,
93
+ attempts = 0, next_attempt_at = 0, last_error = NULL, notified_at = CASE WHEN status = 'failed' OR notified_at = -1 THEN NULL ELSE notified_at END,
94
+ reply_attempts = 0, reply_next_attempt_at = 0, reply_last_error = NULL, reply_lease_until = 0, reply_lease_token = NULL,
95
+ reply_notified_at = CASE WHEN reply_notified_at = -1 THEN NULL ELSE reply_notified_at END WHERE delivery_id = ?`).run(resultId);
96
+ return {
97
+ retryQueued: true,
98
+ resultId,
99
+ taskId: delivery.taskId,
100
+ scope: "delivery_only",
101
+ executionRestarted: false
102
+ };
103
+ });
104
+ }
105
+ /** Metadata-only directory; no extraction, model calls or file IO on the prompt path. */
106
+ function listPersonalResults(conversationId, options = {}) {
107
+ const db = getSqliteDatabase();
108
+ const limit = Math.min(10, Math.max(1, options.limit ?? 5));
109
+ const offset = Math.max(0, options.offset ?? 0);
110
+ const rows = db.prepare(`SELECT delivery_id, json_extract(payload_json, '$.taskId') AS taskId,
111
+ json_extract(payload_json, '$.taskTitle') AS title, json_extract(payload_json, '$.taskRunId') AS runId,
112
+ status AS deliveryState, json_extract(payload_json, '$.assignmentEpoch') AS assignmentEpoch, json_extract(payload_json, '$.outcome.outcomeId') AS outcomeId,
113
+ json_extract(payload_json, '$.outcome.status') AS status, json_extract(payload_json, '$.resultRevision') AS resultRevision,
114
+ json_extract(payload_json, '$.previousResultId') AS previousResultId, created_at AS createdAt
115
+ FROM task_result_deliveries WHERE conversation_id = ? AND status IN ('pending','delivered','stale','failed')
116
+ AND (? IS NULL OR json_extract(payload_json, '$.taskId') = ?)
117
+ ORDER BY created_at DESC, delivery_id DESC LIMIT ? OFFSET ?`).all(conversationId, options.taskId ?? null, options.taskId ?? null, limit + 1, offset);
118
+ return {
119
+ items: rows.slice(0, limit).flatMap((row) => {
120
+ try {
121
+ assertAccess(conversationId, {
122
+ taskId: String(row.taskId),
123
+ conversationId
124
+ });
125
+ return [{
126
+ resultId: String(row.delivery_id),
127
+ taskId: row.taskId,
128
+ title: String(row.title).slice(0, 200),
129
+ runId: row.runId,
130
+ status: row.status,
131
+ deliveryState: row.deliveryState,
132
+ baselineVersion: `${row.runId}:${row.assignmentEpoch}:${row.outcomeId}`,
133
+ resultRevision: row.resultRevision ?? 1,
134
+ previousResultId: row.previousResultId,
135
+ createdAt: row.createdAt
136
+ }];
137
+ } catch {
138
+ return [];
139
+ }
140
+ }),
141
+ ...rows.length > limit ? { nextOffset: offset + limit } : {},
142
+ offset
143
+ };
144
+ }
145
+ function documentRow(documentId) {
146
+ return getSqliteDatabase().prepare(`SELECT document_id, status, content_revision, sections_json, limitations_json, fingerprint,
147
+ error, length(content) AS length, lease_until FROM personal_result_documents WHERE document_id = ?`).get(documentId);
148
+ }
149
+ function launch(input) {
150
+ if (workers.size >= 2) return false;
151
+ const entry = new URL("./result-extraction.js", import.meta.url);
152
+ const source = existsSync(fileURLToPath(entry)) ? entry.href : new URL("./result-extraction.ts", import.meta.url).href;
153
+ const worker = new Worker(`
154
+ const { workerData, parentPort } = require('node:worker_threads');
155
+ (async () => {
156
+ const module = workerData.source.endsWith('.ts')
157
+ ? await require(workerData.tsx).tsImport(workerData.source, workerData.source)
158
+ : await import(workerData.source);
159
+ await module.prepareResultDocument(workerData.input);
160
+ parentPort.postMessage('complete');
161
+ })().catch(error => { throw error; });
162
+ `, {
163
+ eval: true,
164
+ execArgv: [],
165
+ resourceLimits: { maxOldGenerationSizeMb: 256 },
166
+ workerData: {
167
+ source,
168
+ ...source.endsWith(".ts") ? { tsx: require.resolve("tsx/esm/api") } : {},
169
+ input
170
+ }
171
+ });
172
+ const key = `${input.database}:${input.documentId}`;
173
+ workers.set(key, worker);
174
+ const fail = (err) => {
175
+ if (shuttingDownWorkers.has(worker)) return;
176
+ try {
177
+ if (getSqliteDatabase().prepare(`UPDATE personal_result_documents SET status = 'failed', error = ?,
178
+ lease_until = 0 WHERE document_id = ? AND status = 'pending' AND lease_token = ?`).run((err?.message ?? "Background preparation stopped").slice(0, 500), input.documentId, input.lease).changes) log.warn({
179
+ err,
180
+ documentId: input.documentId,
181
+ phase: "result_preparation"
182
+ }, "Background result preparation stopped");
183
+ } catch {}
184
+ };
185
+ const timer = setTimeout(() => {
186
+ fail();
187
+ worker.terminate();
188
+ }, 45e3);
189
+ timer.unref();
190
+ worker.once("error", fail);
191
+ worker.once("exit", () => {
192
+ clearTimeout(timer);
193
+ workers.delete(key);
194
+ fail();
195
+ });
196
+ worker.unref();
197
+ return true;
198
+ }
199
+ async function stopPersonalResultPreparations() {
200
+ preparationGeneration++;
201
+ for (const worker of workers.values()) shuttingDownWorkers.add(worker);
202
+ try {
203
+ getSqliteDatabase().prepare("UPDATE personal_result_documents SET lease_until = 0 WHERE status = 'pending' AND lease_token LIKE ?").run(`${process.pid}:%`);
204
+ } catch {}
205
+ await Promise.all([...workers.values()].map((worker) => worker.terminate()));
206
+ workers.clear();
207
+ }
208
+ async function prepare(conversationId, resultId, sourceId) {
209
+ const { row, delivery } = resolve(conversationId, resultId);
210
+ const documentId = hash(`${resultId}:${sourceId}:parser:${PARSER_VERSION}`);
211
+ const db = getSqliteDatabase();
212
+ let file;
213
+ let expectedSha256;
214
+ let text;
215
+ let title = delivery.taskTitle;
216
+ let mimeType;
217
+ if (sourceId === "body") {
218
+ const packet = row.reply_payload_json ? JSON.parse(row.reply_payload_json) : void 0;
219
+ text = delivery.text ?? (packet ? [packet.report, packet.preservedText].filter(Boolean).join("\n\n") : void 0);
220
+ if (!text) return {
221
+ status: "unavailable",
222
+ reason: "No complete result body was retained. Read an artifact; the summary is not the full result."
223
+ };
224
+ } else {
225
+ const artifact = delivery.outcome.deliverables.find((item) => item.artifactId === sourceId);
226
+ if (!artifact || artifact.availability !== "available" || !artifact.uri?.startsWith("media://")) return {
227
+ status: "unavailable",
228
+ reason: "No readable published artifact for this source ID"
229
+ };
230
+ ({path: file} = await resolveMediaReference(artifact.uri));
231
+ expectedSha256 = artifact.sha256;
232
+ title = artifact.title;
233
+ mimeType = artifact.mimeType;
234
+ }
235
+ const existing = documentRow(documentId);
236
+ if (file) {
237
+ const info = await lstat(file).catch(() => void 0);
238
+ if (!info?.isFile()) return {
239
+ status: "unavailable",
240
+ reason: "Published file is missing or is not a regular file"
241
+ };
242
+ const fingerprint = `${info.size}:${info.mtimeMs}:${info.ctimeMs}`;
243
+ if (existing?.status === "ready" && fingerprint !== existing.fingerprint) return {
244
+ status: "changed",
245
+ reason: "Published bytes changed; the indexed version is not current"
246
+ };
247
+ }
248
+ resolve(conversationId, resultId);
249
+ if (existing && existing.status !== "pending") return {
250
+ ...existing,
251
+ documentId
252
+ };
253
+ let ownerAlive = true;
254
+ const owner = db.prepare("SELECT lease_token FROM personal_result_documents WHERE document_id = ?").get(documentId)?.lease_token;
255
+ if (typeof owner === "string" && /^\d+:/.test(owner)) try {
256
+ process.kill(Number(owner.split(":")[0]), 0);
257
+ } catch {
258
+ ownerAlive = false;
259
+ }
260
+ if (existing && existing.lease_until > Date.now() && ownerAlive) return {
261
+ status: "preparing",
262
+ preparationId: documentId
263
+ };
264
+ if (existing && !ownerAlive) db.prepare("UPDATE personal_result_documents SET lease_until = 0 WHERE document_id = ? AND lease_token = ?").run(documentId, owner);
265
+ if (workers.size >= 2) return {
266
+ status: "preparing",
267
+ preparationId: documentId,
268
+ reason: "Preparation capacity is busy; retry this same read later"
269
+ };
270
+ const lease = `${process.pid}:${randomUUID()}`;
271
+ if (db.prepare(`INSERT INTO personal_result_documents(document_id, delivery_id, source_id, status, parser_version, lease_token, lease_until)
272
+ VALUES (?, ?, ?, 'pending', ?, ?, ?) ON CONFLICT(document_id) DO UPDATE SET lease_token = excluded.lease_token,
273
+ lease_until = excluded.lease_until WHERE personal_result_documents.status = 'pending' AND personal_result_documents.lease_until <= ?`).run(documentId, resultId, sourceId, PARSER_VERSION, lease, Date.now() + 5e4, Date.now()).changes) launch({
274
+ database: databasePath(),
275
+ documentId,
276
+ lease,
277
+ file,
278
+ expectedSha256,
279
+ title,
280
+ mimeType,
281
+ text
282
+ });
283
+ return {
284
+ status: "preparing",
285
+ preparationId: documentId
286
+ };
287
+ }
288
+ /** Warm only bounded source counts after delivery; never wait for a parser or hold a main conversation lock. */
289
+ function warmPersonalResult(conversationId, resultId) {
290
+ const generation = preparationGeneration;
291
+ setImmediate(() => {
292
+ if (generation !== preparationGeneration) return;
293
+ try {
294
+ const { delivery } = resolve(conversationId, resultId);
295
+ const sources = ["body", ...delivery.outcome.deliverables.slice(0, 50).map((item) => item.artifactId)];
296
+ (async () => {
297
+ for (const sourceId of sources) {
298
+ if (generation !== preparationGeneration) return;
299
+ await prepare(conversationId, resultId, sourceId);
300
+ while (workers.size >= 2 && generation === preparationGeneration) await new Promise((resolve) => {
301
+ setTimeout(resolve, 100).unref();
302
+ });
303
+ }
304
+ })().catch(() => {});
305
+ } catch {}
306
+ });
307
+ }
308
+ async function readPersonalResult(conversationId, raw) {
309
+ if (raw.command === "list") return listPersonalResults(conversationId, raw);
310
+ const input = { ...raw };
311
+ if (!input.resultId) throw new Error("resultId is required; use list to discover results");
312
+ const { delivery, row } = resolve(conversationId, input.resultId);
313
+ const sourceId = input.sourceId ?? "body";
314
+ const scope = hash(JSON.stringify([
315
+ input.resultId,
316
+ sourceId,
317
+ input.command,
318
+ input.query,
319
+ input.sectionId
320
+ ]));
321
+ if (input.cursor) {
322
+ if (input.cursor.length > 1024) throw new Error("Invalid result cursor");
323
+ if (JSON.parse(Buffer.from(input.cursor, "base64url").toString("utf8")).scope !== scope) throw new Error("Cursor belongs to a different result, query or revision");
324
+ }
325
+ const current = getSqliteDatabase().prepare("SELECT latest_contract_version FROM tasks WHERE task_id = ?").get(delivery.taskId);
326
+ const base = {
327
+ ...delivery.contractVersion === void 0 ? {} : { currentRequirementsSatisfied: delivery.contractVersion === current.latest_contract_version && delivery.outcome.status === "succeeded" && delivery.instructionSequence === Number(getSqliteDatabase().prepare("SELECT COALESCE(MAX(sequence),0) AS n FROM task_collaboration_entries WHERE task_id = ? AND author_kind IN ('main_agent','user') AND kind IN ('instruction','answer')").get(delivery.taskId)?.n ?? 0) },
328
+ deliveryState: row.status,
329
+ resultId: input.resultId,
330
+ taskId: delivery.taskId,
331
+ runId: delivery.taskRunId,
332
+ sourceId
333
+ };
334
+ if (input.command === "get" && !input.sourceId) {
335
+ const offset = input.offset ?? 0;
336
+ const limit = Math.min(10, input.limit ?? 10);
337
+ return {
338
+ ...base,
339
+ status: delivery.outcome.status,
340
+ baselineVersion: `${delivery.taskRunId}:${delivery.assignmentEpoch}:${delivery.outcome.outcomeId}`,
341
+ resultRevision: delivery.resultRevision ?? 1,
342
+ previousResultId: delivery.previousResultId,
343
+ contractVersion: delivery.contractVersion,
344
+ instructionSequence: delivery.instructionSequence,
345
+ adoption: delivery.adoption?.slice(offset, offset + limit),
346
+ ...delivery.adoption && offset + limit < delivery.adoption.length ? { nextAdoptionOffset: offset + limit } : {},
347
+ body: {
348
+ sourceId: "body",
349
+ description: "Retained execution result, not the composed chat reply"
350
+ },
351
+ sources: delivery.outcome.deliverables.slice(offset, offset + limit).map((item) => ({
352
+ sourceId: item.artifactId,
353
+ title: item.title.slice(0, 200),
354
+ kind: item.kind,
355
+ availability: item.availability,
356
+ mimeType: item.mimeType
357
+ })),
358
+ ...offset + limit < delivery.outcome.deliverables.length ? { nextOffset: offset + limit } : {},
359
+ guidance: "Use read/search with sourceId=body or an exact artifact sourceId. Omitted chat text is available here when retained."
360
+ };
361
+ }
362
+ const prepared = await prepare(conversationId, input.resultId, sourceId);
363
+ if (prepared.status !== "ready") return {
364
+ ...base,
365
+ ...prepared,
366
+ complete: false
367
+ };
368
+ const doc = prepared;
369
+ if (input.revision && input.revision !== doc.content_revision) throw new Error("Result content revision changed");
370
+ let offset = Math.max(0, input.offset ?? 0);
371
+ const binding = hash(JSON.stringify([
372
+ input.resultId,
373
+ sourceId,
374
+ doc.content_revision,
375
+ input.command,
376
+ input.query,
377
+ input.sectionId
378
+ ]));
379
+ if (input.cursor) {
380
+ if (input.cursor.length > 1024) throw new Error("Invalid result cursor");
381
+ const cursor = JSON.parse(Buffer.from(input.cursor, "base64url").toString("utf8"));
382
+ if (cursor.binding !== binding || !Number.isSafeInteger(cursor.offset) || cursor.offset < 0) throw new Error("Cursor belongs to a different result, query or revision");
383
+ offset = cursor.offset;
384
+ }
385
+ const cursorAt = (next) => Buffer.from(JSON.stringify({
386
+ binding,
387
+ scope,
388
+ offset: next
389
+ })).toString("base64url");
390
+ const metadata = {
391
+ ...base,
392
+ revision: doc.content_revision,
393
+ status: "ready",
394
+ representation: "extracted_text",
395
+ limitations: JSON.parse(doc.limitations_json),
396
+ totalChars: doc.length
397
+ };
398
+ const sectionFromRow = (row) => ({
399
+ id: String(row.section_id),
400
+ title: String(row.title),
401
+ offset: Number(row.start_offset),
402
+ length: Number(row.char_length),
403
+ locator: JSON.parse(String(row.locator_json))
404
+ });
405
+ const db = getSqliteDatabase();
406
+ if (input.command === "get") {
407
+ const limit = Math.min(10, input.limit ?? 10);
408
+ const rows = db.prepare("SELECT * FROM personal_result_sections WHERE document_id = ? ORDER BY ordinal LIMIT ? OFFSET ?").all(doc.documentId, limit + 1, offset);
409
+ return {
410
+ ...metadata,
411
+ sections: rows.slice(0, limit).map(sectionFromRow),
412
+ ...rows.length > limit ? { nextCursor: cursorAt(offset + limit) } : {},
413
+ complete: rows.length <= limit
414
+ };
415
+ }
416
+ if (input.command === "search") {
417
+ const query = input.query?.trim();
418
+ if (!query || [...query].length < 3 || query.length > 500) throw new Error("Search requires 3–500 characters; use read for shorter terms");
419
+ const limit = Math.min(5, Math.max(1, input.limit ?? 5));
420
+ const rows = db.prepare(`SELECT CAST(start_offset AS INTEGER) AS offset, text
421
+ FROM personal_result_search WHERE personal_result_search MATCH ? AND document_id = ?
422
+ ORDER BY CAST(start_offset AS INTEGER) LIMIT ? OFFSET ?`).all(`"${query.replaceAll("\"", "\"\"")}"`, doc.documentId, limit + 1, offset);
423
+ const items = rows.slice(0, limit).map((row) => {
424
+ const start = Math.max(0, row.text.toLowerCase().indexOf(query.toLowerCase()) - 120);
425
+ const hitOffset = row.offset + [...row.text.slice(0, start)].length;
426
+ return {
427
+ offset: hitOffset,
428
+ text: row.text.slice(start, start + 800),
429
+ section: db.prepare(`SELECT section_id FROM personal_result_sections WHERE document_id = ?
430
+ AND start_offset <= ? AND start_offset + char_length > ? ORDER BY ordinal DESC LIMIT 1`).get(doc.documentId, hitOffset, hitOffset)?.section_id
431
+ };
432
+ });
433
+ return {
434
+ ...metadata,
435
+ query,
436
+ items,
437
+ complete: rows.length <= limit,
438
+ ...rows.length > limit ? { nextCursor: cursorAt(offset + items.length) } : {}
439
+ };
440
+ }
441
+ const sectionRow = input.sectionId ? db.prepare("SELECT * FROM personal_result_sections WHERE document_id = ? AND section_id = ?").get(doc.documentId, input.sectionId) : void 0;
442
+ const section = sectionRow ? sectionFromRow(sectionRow) : void 0;
443
+ if (input.sectionId && !section) throw new Error("Section is unavailable");
444
+ const start = section?.offset ?? 0;
445
+ const length = section?.length ?? doc.length;
446
+ if (offset > length) throw new Error("Offset exceeds source range");
447
+ const count = Math.min(4e3, Math.max(1, input.limit ?? 4e3), length - offset);
448
+ const value = db.prepare("SELECT substr(content, ?, ?) AS text FROM personal_result_documents WHERE document_id = ?").get(start + offset + 1, count, doc.documentId);
449
+ const next = offset + [...value.text].length;
450
+ return {
451
+ ...metadata,
452
+ section,
453
+ offset,
454
+ text: value.text,
455
+ rangeComplete: next >= length,
456
+ complete: !section && next >= length,
457
+ ...next < length ? { nextCursor: cursorAt(next) } : {}
458
+ };
459
+ }
460
+ //#endregion
461
+ export { assertPersonalResultDelegateAccess, listPersonalResults, readPersonalResult, resolvePersonalResultReference, retryPersonalResultDelivery, stopPersonalResultPreparations, warmPersonalResult };
@@ -1,15 +1,15 @@
1
1
  import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
2
2
  import { init_session_repository, patchSessionMetadata } from "../storage/sqlite/session-repository.js";
3
3
  import { init_config_repository, setSessionConfig } from "../storage/sqlite/config-repository.js";
4
+ import { createConversation, init_conversation_repository } from "../storage/sqlite/conversation-repository.js";
4
5
  import { ResponsePreferencesSchema } from "../agent-config/schema.js";
5
6
  import { init_agent_config } from "../agent-config/index.js";
6
7
  import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
7
- import { AgentCatalogService } from "../agent-catalog/service.js";
8
- import { createConversation, init_conversation_repository } from "../storage/sqlite/conversation-repository.js";
9
8
  import { getAvailableModels, init_providers } from "../providers/index.js";
10
9
  import { DEFAULT_PERSONAL_PREFERENCES, getPersonalAgent, personalAgentId } from "./repository.js";
11
10
  import { PERSONAL_MAIN_TOOL_IDS, PERSONAL_READ_TOOL_ALIASES } from "./policy.js";
12
11
  import { getModelThinking } from "../providers/model-thinking.js";
12
+ import { AgentCatalogService } from "../agent-catalog/service.js";
13
13
  import { personalInstructions, upgradePersonalInstructions } from "./prompts.js";
14
14
  import { completePersonalOnboarding } from "./onboarding.js";
15
15
  import { z } from "zod";