@xopcai/xopc 0.0.359 → 0.0.360

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 (222) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-D-yhlYSG.js → agent-avatar-dicebear-CQTERenW.js} +1 -1
  4. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CPF0lunJ.js +1 -0
  5. package/dist/gateway/static/root/assets/agent-plugin-dialog-BjDaZlKy.js +1 -0
  6. package/dist/gateway/static/root/assets/agents-XopBILLB.js +66 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CiSdkzuX.js → app-management-settings-panel-V5QVeMvW.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-SdlCHKg8.js → appearance-settings-BDkRcoI6.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-ntyBe6mP.js → apps-page-DzCyL89L.js} +1 -1
  10. package/dist/gateway/static/root/assets/{automations-page-DU0R5C65.js → automations-page-DOu1wMOV.js} +1 -1
  11. package/dist/gateway/static/root/assets/automations-workspace-CiY_2otj.js +7 -0
  12. package/dist/gateway/static/root/assets/{block-editor-CLejMPkV.js → block-editor-K6is5GrS.js} +3 -3
  13. package/dist/gateway/static/root/assets/{browser-automations-page-BjGswNM0.js → browser-automations-page-B8IiXEBs.js} +2 -2
  14. package/dist/gateway/static/root/assets/{browser-settings-page-DBcYssNQ.js → browser-settings-page-Cms2Bu3Q.js} +2 -2
  15. package/dist/gateway/static/root/assets/{capabilities-page-CsTpcrPP.js → capabilities-page-BAFRNHQv.js} +2 -2
  16. package/dist/gateway/static/root/assets/capabilities-settings-panel-Cws6od1d.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-header-actions-B0Xiav_-.js → capability-header-actions-wh3Nr0qS.js} +1 -1
  18. package/dist/gateway/static/root/assets/channels-DxwismTc.js +1 -0
  19. package/dist/gateway/static/root/assets/{chat-terminal-dock-C9pMFB6k.js → chat-terminal-dock-BU-X9nu1.js} +2 -2
  20. package/dist/gateway/static/root/assets/computer-settings-page-MyXsSqFJ.js +1 -0
  21. package/dist/gateway/static/root/assets/{connector-service-page-OyQKwHNr.js → connector-service-page-DyxPM_MZ.js} +1 -1
  22. package/dist/gateway/static/root/assets/connectors-page-C7-OC3MW.js +2 -0
  23. package/dist/gateway/static/root/assets/{constants-Co2_smKQ.js → constants-Dy8Gw0sF.js} +1 -1
  24. package/dist/gateway/static/root/assets/{date-picker-DxGsweV_.js → date-picker-WRFvi7Pu.js} +1 -1
  25. package/dist/gateway/static/root/assets/{dependency-picker-D9ZfAJwn.js → dependency-picker-CLun5Tst.js} +1 -1
  26. package/dist/gateway/static/root/assets/{desktop-pet-DFgK1z5i.js → desktop-pet-iaVa9vVM.js} +1 -1
  27. package/dist/gateway/static/root/assets/{desktop-pet-settings-CyFW0raW.js → desktop-pet-settings-0RS3sP3Z.js} +1 -1
  28. package/dist/gateway/static/root/assets/device-pairing-wizard-DVAGb04L.js +1 -0
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-2nrl6Exh.js → directory-picker-path-field-Btlldlt3.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-debug-page-BodxNAys.js → extension-debug-page-BImQT4PU.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-DMb2YFlb.js → extension-page-BmuLv-ET.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-provider-aigS3RJu.js → extension-provider-Dg7cRxDX.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-D3hvXtxi.js → extension-settings-page-7Kr8UJK4.js} +1 -1
  34. package/dist/gateway/static/root/assets/{fallback-models-DsXySQVF.js → fallback-models-B0w1lumZ.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-DmPvmwYp.js +1 -0
  36. package/dist/gateway/static/root/assets/home-page-N0Mp-eTJ.js +1 -0
  37. package/dist/gateway/static/root/assets/{imports-page-Czzsa_Eu.js → imports-page-BLOJY67-.js} +1 -1
  38. package/dist/gateway/static/root/assets/{index-DUgsBdV3.css → index-B7AHDHSO.css} +1 -1
  39. package/dist/gateway/static/root/assets/{index-DUU_2HF0.js → index-BXrBL_Hb.js} +41 -41
  40. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DqsFlXlp.js → keyboard-shortcuts-settings-Dlbsip2R.js} +1 -1
  41. package/dist/gateway/static/root/assets/{local-app-workbench-page-BcDFXc1k.js → local-app-workbench-page-nyWeTK0r.js} +1 -1
  42. package/dist/gateway/static/root/assets/{local-apps-page-BaxqXA1-.js → local-apps-page-CfEpFLs0.js} +1 -1
  43. package/dist/gateway/static/root/assets/{logs-page-DmJjZ0Uk.js → logs-page-A38cawkA.js} +2 -2
  44. package/dist/gateway/static/root/assets/{management-settings-1O7zsu4t.js → management-settings-Cse9K61x.js} +1 -1
  45. package/dist/gateway/static/root/assets/{note-detail-panel-BLvVlQG8.js → note-detail-panel-CUGVyo2V.js} +3 -3
  46. package/dist/gateway/static/root/assets/notes-page-Dk89l5dC.js +8 -0
  47. package/dist/gateway/static/root/assets/{page-context-capture-button-gL3453SU.js → page-context-capture-button-C72qIgBg.js} +1 -1
  48. package/dist/gateway/static/root/assets/personal-page-DCtduzh8.js +1 -0
  49. package/dist/gateway/static/root/assets/{product-open-page-Dw8JPizo.js → product-open-page-CT98FsVl.js} +1 -1
  50. package/dist/gateway/static/root/assets/{project-detail-page-Zg4KZ0vK.js → project-detail-page-BlqOVwKP.js} +1 -1
  51. package/dist/gateway/static/root/assets/{projects-page-B33uj1lz.js → projects-page-DVN2q_yR.js} +1 -1
  52. package/dist/gateway/static/root/assets/remote-access-hub-BP5kUgIN.js +1 -0
  53. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BLNXzyeh.js → runtime-tools-settings-panel-ry0jprz7.js} +1 -1
  54. package/dist/gateway/static/root/assets/{scenes-page-D868Zuj9.js → scenes-page-CV1GkOj6.js} +2 -2
  55. package/dist/gateway/static/root/assets/{schema-form-5z33VTce.js → schema-form-C5zMrxgR.js} +1 -1
  56. package/dist/gateway/static/root/assets/{send-session-input-OaBPDJ9E.js → send-session-input-Dt0t5SoR.js} +1 -1
  57. package/dist/gateway/static/root/assets/session-manager-DDR-gv_e.js +16 -0
  58. package/dist/gateway/static/root/assets/sessions-page-BXtGeOsR.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-advanced-gate-CvFVkELy.js +1 -0
  60. package/dist/gateway/static/root/assets/{settings-page-BG_dOYMq.js → settings-page-C88fsfZF.js} +1 -1
  61. package/dist/gateway/static/root/assets/{setup-status-panel-DNj1hD_H.js → setup-status-panel-DESlRgZS.js} +1 -1
  62. package/dist/gateway/static/root/assets/{share-preview-page-M_rAQR60.js → share-preview-page-D5Gey-6E.js} +1 -1
  63. package/dist/gateway/static/root/assets/shares-settings-btoP07Fx.js +1 -0
  64. package/dist/gateway/static/root/assets/{skill-api-BBaKs-Xx.js → skill-api-1hbX3qDC.js} +1 -1
  65. package/dist/gateway/static/root/assets/skills-page-DYJbwwBT.js +2 -0
  66. package/dist/gateway/static/root/assets/{system-settings-panel-DKjsZo49.js → system-settings-panel-DbNk-Jwq.js} +1 -1
  67. package/dist/gateway/static/root/assets/{task-detail-page-DSvaiKGb.js → task-detail-page-DoLKOJrE.js} +1 -1
  68. package/dist/gateway/static/root/assets/{tunnel-api-DR8Qu6R_.js → tunnel-api-H3FheXYH.js} +1 -1
  69. package/dist/gateway/static/root/assets/{usage-page-CAIqAduR.js → usage-page-DGbqcsV6.js} +1 -1
  70. package/dist/gateway/static/root/assets/{use-composer-attachments-CUaywGe0.js → use-composer-attachments-pzPAUV_o.js} +1 -1
  71. package/dist/gateway/static/root/assets/{use-file-preview-expanded-D809I8ur.js → use-file-preview-expanded-DNhXjL0W.js} +1 -1
  72. package/dist/gateway/static/root/assets/user-model-page-7pW4Pazn.js +2 -0
  73. package/dist/gateway/static/root/assets/{work-discovery-overlay-wGFcle2p.js → work-discovery-overlay-DfyI9kVf.js} +1 -1
  74. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CewS2IbN.js → workflow-run-setup-panel-De80GODZ.js} +2 -2
  75. package/dist/gateway/static/root/assets/workflows-page-BuH3pC1C.js +6 -0
  76. package/dist/gateway/static/root/assets/{workspace-api-BtXzxf_w.js → workspace-api-Dwa8kHdY.js} +2 -2
  77. package/dist/gateway/static/root/index.html +9 -9
  78. package/dist/package.js +1 -1
  79. package/dist/packages/gateway-contract/src/index.js +2 -0
  80. package/dist/packages/gateway-contract/src/task-result-delivery.js +30 -0
  81. package/dist/src/agent/agent-manager.js +3 -3
  82. package/dist/src/agent/background-review/run-background-review.js +1 -1
  83. package/dist/src/agent/context/workspace-templates/SOUL.md +2 -0
  84. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  85. package/dist/src/agent/external-tools/gateway-tools.js +41 -1
  86. package/dist/src/agent/image/tool-model-config.js +1 -1
  87. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  88. package/dist/src/agent/prompt/sections/behavior.js +4 -1
  89. package/dist/src/agent/prompt/sections/memory-skills.js +2 -0
  90. package/dist/src/agent/service.js +2 -2
  91. package/dist/src/agent/session/session-config-service.js +11 -3
  92. package/dist/src/agent/skills/hub-lock.js +1 -1
  93. package/dist/src/agent/skills/index.js +1 -1
  94. package/dist/src/agent/skills/managed-store.js +1 -1
  95. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  96. package/dist/src/agent/tools/factory.js +32 -6
  97. package/dist/src/agent/tools/personal-preference-tool.js +11 -0
  98. package/dist/src/agent/tools/personal-request-result-tool.d.ts +22 -0
  99. package/dist/src/agent/tools/personal-request-result-tool.js +84 -0
  100. package/dist/src/agent/tools/personal-request-tool.d.ts +3 -0
  101. package/dist/src/agent/tools/personal-request-tool.js +100 -0
  102. package/dist/src/agent/tools/personal-task-tool.d.ts +6 -0
  103. package/dist/src/agent/tools/personal-task-tool.js +12 -10
  104. package/dist/src/agent/tools/tool-media.js +2 -3
  105. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  106. package/dist/src/agent-catalog/capabilities.js +2 -2
  107. package/dist/src/auth/credentials.js +1 -1
  108. package/dist/src/auth/oauth-provider-lock.js +1 -1
  109. package/dist/src/auth/profiles/store.js +1 -1
  110. package/dist/src/automations/capabilities/drafts.js +1 -1
  111. package/dist/src/bootstrap/application-state.js +1 -1
  112. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  113. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  114. package/dist/src/capabilities/runtime/product.js +1 -1
  115. package/dist/src/cli/commands/agent.js +1 -1
  116. package/dist/src/cli/commands/agents.js +1 -1
  117. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  118. package/dist/src/cli/commands/models.js +1 -1
  119. package/dist/src/cli/commands/onboard/model.js +1 -1
  120. package/dist/src/cli/templates.js +4 -0
  121. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  122. package/dist/src/config/index.js +3 -3
  123. package/dist/src/config/loader.js +1 -1
  124. package/dist/src/config/models-json.js +1 -1
  125. package/dist/src/config/schema.js +1 -1
  126. package/dist/src/connectors/connection-recovery-service.d.ts +2 -0
  127. package/dist/src/connectors/connection-recovery-service.js +23 -5
  128. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  129. package/dist/src/extensions/lockfile.js +1 -1
  130. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  131. package/dist/src/gateway/agents-admin.js +2 -2
  132. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  133. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  134. package/dist/src/gateway/hono/routes/media.js +4 -3
  135. package/dist/src/gateway/hono/routes/notes.js +2 -2
  136. package/dist/src/gateway/hono/routes/personal-agent.js +68 -0
  137. package/dist/src/gateway/hono/routes/projects.js +2 -2
  138. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  139. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  140. package/dist/src/gateway/image-generation-setup.js +2 -2
  141. package/dist/src/gateway/lock.js +1 -1
  142. package/dist/src/gateway/media-access.js +2 -2
  143. package/dist/src/gateway/service.d.ts +3 -0
  144. package/dist/src/gateway/service.js +46 -5
  145. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  146. package/dist/src/local-apps/service.js +1 -1
  147. package/dist/src/media/index.js +2 -2
  148. package/dist/src/media/session-references.d.ts +2 -0
  149. package/dist/src/media/session-references.js +22 -2
  150. package/dist/src/media/store.d.ts +1 -0
  151. package/dist/src/media/store.js +2 -1
  152. package/dist/src/personal-agent/capability-service.d.ts +14 -0
  153. package/dist/src/personal-agent/capability-service.js +63 -0
  154. package/dist/src/personal-agent/communication.d.ts +4 -0
  155. package/dist/src/personal-agent/communication.js +24 -0
  156. package/dist/src/personal-agent/model-config.d.ts +5 -0
  157. package/dist/src/personal-agent/model-config.js +59 -0
  158. package/dist/src/personal-agent/policy.d.ts +1 -1
  159. package/dist/src/personal-agent/policy.js +2 -0
  160. package/dist/src/personal-agent/repository.d.ts +1 -0
  161. package/dist/src/personal-agent/repository.js +3 -1
  162. package/dist/src/personal-agent/request-delivery.d.ts +4 -0
  163. package/dist/src/personal-agent/request-delivery.js +159 -0
  164. package/dist/src/personal-agent/request-repository.d.ts +33 -0
  165. package/dist/src/personal-agent/request-repository.js +71 -0
  166. package/dist/src/personal-agent/request-result.d.ts +21 -0
  167. package/dist/src/personal-agent/request-result.js +45 -0
  168. package/dist/src/personal-agent/request-service.d.ts +18 -0
  169. package/dist/src/personal-agent/request-service.js +308 -0
  170. package/dist/src/personal-agent/service.js +30 -7
  171. package/dist/src/providers/model-catalog-persistence.js +1 -1
  172. package/dist/src/session/client-history.d.ts +2 -1
  173. package/dist/src/session/client-history.js +40 -0
  174. package/dist/src/session/compact-history.js +9 -5
  175. package/dist/src/session/config-store.js +2 -1
  176. package/dist/src/session/session-context-for-llm.js +55 -0
  177. package/dist/src/session/store.js +2 -0
  178. package/dist/src/session/types.d.ts +2 -0
  179. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +5 -1
  180. package/dist/src/storage/sqlite/connection-wait-repository.js +38 -8
  181. package/dist/src/storage/sqlite/migrations/231_task_result_deliveries.sql +32 -0
  182. package/dist/src/storage/sqlite/migrations/232_personal_requests.sql +28 -0
  183. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  184. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  185. package/dist/src/storage/sqlite/schema.js +1 -1
  186. package/dist/src/storage/sqlite/session-repository.js +33 -0
  187. package/dist/src/tasks/capabilities/read.js +2 -2
  188. package/dist/src/tasks/task-application-service.d.ts +1 -0
  189. package/dist/src/tasks/task-application-service.js +7 -0
  190. package/dist/src/tasks/task-context-assembler.js +1 -0
  191. package/dist/src/tasks/task-main-update-delivery.js +32 -1
  192. package/dist/src/tasks/task-result-delivery-repository.d.ts +18 -0
  193. package/dist/src/tasks/task-result-delivery-repository.js +144 -0
  194. package/dist/src/tasks/task-result-delivery-service.d.ts +4 -0
  195. package/dist/src/tasks/task-result-delivery-service.js +128 -0
  196. package/dist/src/tasks/task-run-coordinator.js +6 -1
  197. package/dist/src/tasks/task-run-dispatcher.d.ts +1 -0
  198. package/dist/src/tasks/task-run-dispatcher.js +22 -3
  199. package/dist/src/tui/backends/embedded-backend.js +2 -2
  200. package/dist/src/voice/realtime/persona-context.js +1 -1
  201. package/package.json +3 -3
  202. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CYq-3pbE.js +0 -1
  203. package/dist/gateway/static/root/assets/agent-plugin-dialog-Cx3UbhqT.js +0 -1
  204. package/dist/gateway/static/root/assets/agents-Ce9uvui7.js +0 -66
  205. package/dist/gateway/static/root/assets/automations-workspace-BaHJml4R.js +0 -7
  206. package/dist/gateway/static/root/assets/capabilities-settings-panel-BXlVwnMr.js +0 -8
  207. package/dist/gateway/static/root/assets/channels-TPqwcbZ4.js +0 -1
  208. package/dist/gateway/static/root/assets/computer-settings-page-BJOn14Ow.js +0 -1
  209. package/dist/gateway/static/root/assets/connectors-page-DBWH5bVr.js +0 -2
  210. package/dist/gateway/static/root/assets/device-pairing-wizard-C6Co5dT3.js +0 -1
  211. package/dist/gateway/static/root/assets/gateway-settings-CubM1m6Z.js +0 -1
  212. package/dist/gateway/static/root/assets/home-page-CQ9y_LMT.js +0 -1
  213. package/dist/gateway/static/root/assets/notes-page-AWU_G61i.js +0 -8
  214. package/dist/gateway/static/root/assets/personal-page-BPy5m3QR.js +0 -1
  215. package/dist/gateway/static/root/assets/remote-access-hub-BZoUVzgS.js +0 -1
  216. package/dist/gateway/static/root/assets/session-manager-BK5IvdGz.js +0 -16
  217. package/dist/gateway/static/root/assets/sessions-page-Du7ueBFc.js +0 -1
  218. package/dist/gateway/static/root/assets/settings-advanced-gate-CaxCsIIZ.js +0 -1
  219. package/dist/gateway/static/root/assets/shares-settings-Cr_Ut6FE.js +0 -1
  220. package/dist/gateway/static/root/assets/skills-page-DU7fV5pc.js +0 -2
  221. package/dist/gateway/static/root/assets/user-model-page-C--t6SLp.js +0 -2
  222. package/dist/gateway/static/root/assets/workflows-page-CxfsWFL5.js +0 -6
@@ -0,0 +1,59 @@
1
+ import { init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
3
+ import { init_session_repository } from "../storage/sqlite/session-repository.js";
4
+ import { getSessionConfig, init_config_repository, updateSessionConfig } from "../storage/sqlite/config-repository.js";
5
+ import { RuntimePolicySchema } from "../agent-config/schema.js";
6
+ import { init_agent_config } from "../agent-config/index.js";
7
+ import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
8
+ import { resolveEffectiveAgentConfigForSession } from "../config/agent-profile.js";
9
+ import { isPersonalConversation } from "./repository.js";
10
+ //#region src/personal-agent/model-config.ts
11
+ init_repository();
12
+ init_agent_config();
13
+ init_config_repository();
14
+ init_session_repository();
15
+ init_transaction();
16
+ /** Personal AI has one conversation; its Agent is the source of model preferences. */
17
+ function syncPersonalModelConfig(conversationId) {
18
+ const existing = getSessionConfig(conversationId);
19
+ if (!isPersonalConversation(conversationId)) return existing;
20
+ const effective = resolveEffectiveAgentConfigForSession(conversationId).config;
21
+ const modelOverride = effective.models.chat.primary;
22
+ const thinkingLevel = effective.runtime.thinkingLevel ?? "off";
23
+ if (existing?.modelOverride === modelOverride && existing.thinkingLevel === thinkingLevel && existing.fixedModel) return existing;
24
+ return updateSessionConfig(conversationId, {
25
+ modelOverride,
26
+ thinkingLevel,
27
+ fixedModel: true
28
+ }, process.cwd());
29
+ }
30
+ function savePersonalModelConfig(conversationId, model, thinkingLevel) {
31
+ return runSqliteWriteTransaction(() => {
32
+ const agentId = getSessionMetadata(conversationId).agentId;
33
+ const repository = new AgentCatalogRepository();
34
+ const agent = repository.get(agentId);
35
+ const { revision: _revision, provisioningState: _state, provisioningError: _error, createdAt: _created, updatedAt: _updated, deletedAt: _deleted, ...entry } = agent;
36
+ repository.update(agentId, agent.revision, {
37
+ ...entry,
38
+ models: {
39
+ ...agent.models,
40
+ chat: {
41
+ ...agent.models?.chat,
42
+ primary: model,
43
+ fallbacks: agent.models?.chat?.fallbacks ?? []
44
+ }
45
+ },
46
+ runtime: {
47
+ ...agent.runtime,
48
+ thinkingLevel: RuntimePolicySchema.shape.thinkingLevel.parse(thinkingLevel)
49
+ }
50
+ });
51
+ return updateSessionConfig(conversationId, {
52
+ modelOverride: model,
53
+ thinkingLevel,
54
+ fixedModel: true
55
+ }, process.cwd());
56
+ });
57
+ }
58
+ //#endregion
59
+ export { savePersonalModelConfig, syncPersonalModelConfig };
@@ -1 +1 @@
1
- export declare const PERSONAL_MAIN_TOOL_IDS: readonly ["personal_task", "personal_preference", "session_recall", "user_context_search", "user_context_get", "knowledge_search", "knowledge_get", "clarify"];
1
+ export declare const PERSONAL_MAIN_TOOL_IDS: readonly ["personal_task", "personal_capability", "personal_request", "personal_preference", "session_recall", "user_context_search", "user_context_get", "knowledge_search", "knowledge_get", "clarify"];
@@ -1,6 +1,8 @@
1
1
  //#region src/personal-agent/policy.ts
2
2
  const PERSONAL_MAIN_TOOL_IDS = [
3
3
  "personal_task",
4
+ "personal_capability",
5
+ "personal_request",
4
6
  "personal_preference",
5
7
  "session_recall",
6
8
  "user_context_search",
@@ -6,6 +6,7 @@ export interface PersonalAgentRecord {
6
6
  conversationId: string;
7
7
  state: PersonalAgentState;
8
8
  displayName: string;
9
+ userCallName: string | null;
9
10
  appearance: PersonalAppearance;
10
11
  voicePreference: {
11
12
  provider: string;
@@ -2,6 +2,7 @@ import { init_connection, isXopcDatabaseOpen } from "../storage/sqlite/connectio
2
2
  import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
3
3
  import { getSessionConfig, init_config_repository } from "../storage/sqlite/config-repository.js";
4
4
  import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
5
+ import { getUserProfileSnapshot } from "../user-model/profile.js";
5
6
  import { createHash } from "node:crypto";
6
7
  //#region src/personal-agent/repository.ts
7
8
  init_repository();
@@ -37,13 +38,14 @@ function appearanceFrom(agent) {
37
38
  }
38
39
  function toRecord(ownerId, agent, session) {
39
40
  const config = session ? getSessionConfig(session.conversation_id) : null;
40
- const ready = agent.provisioningState === "ready" && agent.runtime?.thinkingLevel === "off" && session && config?.thinkingLevel === "off" && config.fixedModel;
41
+ const ready = agent.provisioningState === "ready" && session && config?.fixedModel;
41
42
  return {
42
43
  ownerId,
43
44
  agentId: agent.id,
44
45
  conversationId: session?.conversation_id ?? personalConversationId(ownerId),
45
46
  state: agent.provisioningState === "error" ? "error" : ready ? "ready" : "provisioning",
46
47
  displayName: agent.profile?.name ?? "Ada",
48
+ userCallName: getUserProfileSnapshot().callName ?? null,
47
49
  appearance: appearanceFrom(agent),
48
50
  voicePreference: agent.profile?.voicePreference ?? null,
49
51
  preferences: agent.profile?.responsePreferences ?? DEFAULT_PERSONAL_PREFERENCES,
@@ -0,0 +1,4 @@
1
+ /** Closed authorization waits retain their feedback marker for restart-safe delivery. */
2
+ export declare function drainPersonalRequestContinuations(notify?: (conversationId: string, requestId: string) => void): void;
3
+ /** The request itself is the durable outbox; append and delivery marker commit together. */
4
+ export declare function drainPersonalRequestResults(notify?: (conversationId: string, requestId: string) => void): void;
@@ -0,0 +1,159 @@
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 { TASK_RESULT_DELIVERY_TYPE, 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 { TaskRunRepository, init_task_run_repository } from "../tasks/task-run-repository.js";
8
+ import { getPersonalRequest, init_request_repository, updatePersonalRequest } from "./request-repository.js";
9
+ import { appendTranscriptEntry, init_transcript_repository, loadLlmMessagesForSession } from "../storage/sqlite/transcript-repository.js";
10
+ import { TaskConversationRepository } from "../tasks/task-conversation-repository.js";
11
+ import { emitSessionTranscriptUpdate } from "../session/transcript-events.js";
12
+ import { PersonalRequestResultSchema, renderPersonalRequestResult } from "./request-result.js";
13
+ //#region src/personal-agent/request-delivery.ts
14
+ init_src();
15
+ init_transaction();
16
+ init_transcript_repository();
17
+ init_session_instance_repository();
18
+ init_task_run_repository();
19
+ init_logger();
20
+ init_request_repository();
21
+ const log = createLogger("PersonalRequestDelivery");
22
+ /** Closed authorization waits retain their feedback marker for restart-safe delivery. */
23
+ function drainPersonalRequestContinuations(notify) {
24
+ const db = getSqliteDatabase();
25
+ const rows = db.prepare(`SELECT wait.id, request.request_id FROM session_connection_waits wait
26
+ JOIN personal_requests request ON request.connection_wait_id = wait.id
27
+ WHERE wait.status = 'closed' AND json_extract(wait.data_json, '$.resolution') = 'continued'
28
+ AND json_extract(wait.data_json, '$.personalResumeFeedback.notifiedAt') IS NULL
29
+ ORDER BY request.created_at LIMIT 50`).all();
30
+ for (const row of rows) try {
31
+ const request = getPersonalRequest(row.request_id);
32
+ if (!runSqliteWriteTransaction(() => {
33
+ if (readCurrentTranscriptId(db, request.conversationId) !== request.transcriptId || request.state === "cancelled") {
34
+ db.prepare("UPDATE session_connection_waits SET data_json = json_set(data_json, '$.personalResumeFeedback.notifiedAt', ?) WHERE id = ?").run(Date.now(), row.id);
35
+ return;
36
+ }
37
+ const stored = db.prepare("SELECT json_extract(data_json, '$.personalResumeFeedback.entryId') AS entry_id FROM session_connection_waits WHERE id = ?").get(row.id);
38
+ if (stored.entry_id) return stored.entry_id;
39
+ const content = /[\u3400-\u9fff]/u.test(request.objective) ? "连接成功,正在继续处理你的请求。结果会直接发到这里。" : "Connected. Continuing your request; the result will appear here.";
40
+ const entry = appendTranscriptEntry(request.conversationId, {
41
+ role: "custom",
42
+ customType: "personal_request_status",
43
+ content,
44
+ details: {
45
+ requestId: request.requestId,
46
+ waitId: row.id,
47
+ taskId: request.taskId
48
+ },
49
+ display: true,
50
+ timestamp: Date.now()
51
+ });
52
+ db.prepare("UPDATE session_connection_waits SET data_json = json_set(data_json, '$.personalResumeFeedback.entryId', ?) WHERE id = ?").run(entry.entry_id, row.id);
53
+ return entry.entry_id;
54
+ })) continue;
55
+ emitSessionTranscriptUpdate({ conversationId: request.conversationId });
56
+ notify?.(request.conversationId, request.requestId);
57
+ db.prepare("UPDATE session_connection_waits SET data_json = json_set(data_json, '$.personalResumeFeedback.notifiedAt', ?) WHERE id = ?").run(Date.now(), row.id);
58
+ } catch (err) {
59
+ const errorMessage = (err instanceof Error ? err.message : String(err)).slice(0, 500);
60
+ if (db.prepare(`UPDATE session_connection_waits
61
+ SET data_json = json_set(data_json, '$.personalResumeFeedback.error', ?)
62
+ WHERE id = ? AND COALESCE(json_extract(data_json, '$.personalResumeFeedback.error'), '') != ?`).run(errorMessage, row.id, errorMessage).changes) log.warn({
63
+ err,
64
+ requestId: row.request_id,
65
+ waitId: row.id
66
+ }, "Connection continuation feedback will retry");
67
+ }
68
+ }
69
+ /** The request itself is the durable outbox; append and delivery marker commit together. */
70
+ function drainPersonalRequestResults(notify) {
71
+ const db = getSqliteDatabase();
72
+ const rows = db.prepare(`SELECT request_id, delivery_attempts FROM personal_requests request WHERE task_id IS NOT NULL
73
+ AND state != 'cancelled' AND notified_at IS NULL AND delivery_attempts < 8 AND delivery_next_attempt_at <= ? AND EXISTS
74
+ (SELECT 1 FROM task_runs run WHERE run.task_id = request.task_id AND run.parent_run_id IS NULL
75
+ AND run.status IN ('succeeded','failed','cancelled')
76
+ AND NOT EXISTS (SELECT 1 FROM task_runs newer WHERE newer.task_id = run.task_id
77
+ AND newer.parent_run_id IS NULL AND newer.queued_at > run.queued_at))
78
+ ORDER BY created_at LIMIT 50`).all(Date.now());
79
+ for (const row of rows) try {
80
+ const request = getPersonalRequest(row.request_id);
81
+ const run = new TaskRunRepository().getLatestRoot(request.taskId);
82
+ if (!run || ![
83
+ "succeeded",
84
+ "failed",
85
+ "cancelled"
86
+ ].includes(run.status)) continue;
87
+ const state = new TaskConversationRepository().getState(request.taskId);
88
+ const receipt = new TaskRunRepository().getReceipt(run.id);
89
+ runSqliteWriteTransaction(() => {
90
+ const stored = db.prepare("SELECT result_json, result_run_id, delivery_entry_id FROM personal_requests WHERE request_id = ?").get(request.requestId);
91
+ if (stored.delivery_entry_id) return;
92
+ if (readCurrentTranscriptId(db, request.conversationId) !== request.transcriptId) {
93
+ updatePersonalRequest(request, { state: run.status === "succeeded" ? "completed" : "failed" });
94
+ db.prepare("UPDATE personal_requests SET notified_at = ? WHERE request_id = ?").run(Date.now(), request.requestId);
95
+ return;
96
+ }
97
+ if (state?.activeConversationId !== run.conversationId) throw new Error("Task execution changed");
98
+ const parsed = stored.result_json && stored.result_run_id === run.id ? PersonalRequestResultSchema.safeParse(JSON.parse(stored.result_json)) : void 0;
99
+ const assistant = (run.conversationId ? loadLlmMessagesForSession(run.conversationId) : []).filter((message) => message.role === "assistant").at(-1);
100
+ const fallback = assistant?.role === "assistant" ? assistant.content.filter((part) => part.type === "text").map((part) => part.text).join("\n").trim() : "";
101
+ const content = parsed?.success ? renderPersonalRequestResult(parsed.data) : fallback && fallback !== "NO_REPLY" ? fallback.slice(0, 16e3) : receipt?.summary ?? "Request finished without a readable result.";
102
+ const failed = run.status !== "succeeded";
103
+ const display = failed ? `查询未完成。\n\n${content}` : content;
104
+ const now = Date.now();
105
+ const delivery = TaskResultDeliverySchema.parse({
106
+ version: 1,
107
+ deliveryId: `personal-request:${request.requestId}`,
108
+ taskId: request.taskId,
109
+ taskRunId: run.id,
110
+ taskTitle: request.objective.slice(0, 300),
111
+ conversationId: request.conversationId,
112
+ originTranscriptId: request.transcriptId,
113
+ requestInputId: request.inputId,
114
+ assignmentEpoch: state?.assignmentEpoch ?? 0,
115
+ outcome: {
116
+ version: 1,
117
+ outcomeId: `personal-request:${request.requestId}`,
118
+ runId: run.id,
119
+ turnId: `personal-request:${request.requestId}`,
120
+ status: failed ? "failed" : parsed?.success && parsed.data.coverage?.partial ? "partial" : "succeeded",
121
+ summary: content.slice(0, 2e3),
122
+ deliverables: [],
123
+ evidence: [],
124
+ createdAt: new Date(now).toISOString()
125
+ },
126
+ createdAt: now
127
+ });
128
+ const entry = appendTranscriptEntry(request.conversationId, {
129
+ role: "custom",
130
+ customType: TASK_RESULT_DELIVERY_TYPE,
131
+ content: display,
132
+ details: delivery,
133
+ display: true,
134
+ timestamp: now
135
+ });
136
+ updatePersonalRequest(request, { state: run.status === "cancelled" ? "cancelled" : failed ? "failed" : "completed" });
137
+ db.prepare("UPDATE personal_requests SET delivery_entry_id = ? WHERE request_id = ?").run(entry.entry_id, request.requestId);
138
+ db.prepare(`UPDATE task_main_update_deliveries SET status = 'delivered', decision = 'silent',
139
+ decision_reason = 'Personal request result delivered', updated_at = ? WHERE entry_id IN
140
+ (SELECT entry_id FROM task_collaboration_entries WHERE task_run_id = ? AND kind IN ('result','failure','progress'))`).run(now, run.id);
141
+ });
142
+ const delivered = db.prepare("SELECT delivery_entry_id, notified_at FROM personal_requests WHERE request_id = ?").get(request.requestId);
143
+ if (delivered.delivery_entry_id && !delivered.notified_at) {
144
+ emitSessionTranscriptUpdate({ conversationId: request.conversationId });
145
+ notify?.(request.conversationId, request.requestId);
146
+ db.prepare("UPDATE personal_requests SET notified_at = ? WHERE request_id = ?").run(Date.now(), request.requestId);
147
+ }
148
+ } catch (err) {
149
+ db.prepare(`UPDATE personal_requests SET delivery_attempts = delivery_attempts + 1,
150
+ delivery_next_attempt_at = ?, delivery_error = ? WHERE request_id = ?`).run(Date.now() + Math.min(6e4, 1e3 * 2 ** row.delivery_attempts), (err instanceof Error ? err.message : String(err)).slice(0, 500), row.request_id);
151
+ if (row.delivery_attempts === 0 || row.delivery_attempts === 7) log.warn({
152
+ err,
153
+ requestId: row.request_id,
154
+ attempts: row.delivery_attempts + 1
155
+ }, row.delivery_attempts === 7 ? "Personal request delivery exhausted retries" : "Personal request delivery will retry");
156
+ }
157
+ }
158
+ //#endregion
159
+ export { drainPersonalRequestContinuations, drainPersonalRequestResults };
@@ -0,0 +1,33 @@
1
+ import type { PersonalRequestResult } from './request-result.js';
2
+ export type PersonalRequestState = 'preflighting' | 'waiting_connection' | 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
3
+ export interface PersonalRequest {
4
+ requestId: string;
5
+ conversationId: string;
6
+ transcriptId: string;
7
+ inputId: string;
8
+ objective: string;
9
+ connectorId: string;
10
+ executorAgentId: string;
11
+ accountId?: string;
12
+ parameters: {
13
+ timeRange?: {
14
+ from: string;
15
+ to: string;
16
+ timezone: string;
17
+ expression: string;
18
+ };
19
+ };
20
+ state: PersonalRequestState;
21
+ connectionWaitId?: string;
22
+ taskId?: string;
23
+ version: number;
24
+ createdAt: number;
25
+ updatedAt: number;
26
+ result?: PersonalRequestResult;
27
+ }
28
+ export declare function getPersonalRequest(requestId: string): PersonalRequest | undefined;
29
+ export declare function personalRequestForWait(waitId: string): PersonalRequest | undefined;
30
+ export declare function personalRequestForTask(taskId: string): PersonalRequest | undefined;
31
+ export declare function personalRequestForExecution(conversationId: string): PersonalRequest | undefined;
32
+ export declare function listPersonalRequests(conversationId: string): PersonalRequest[];
33
+ export declare function updatePersonalRequest(request: PersonalRequest, patch: Partial<Pick<PersonalRequest, 'state' | 'connectionWaitId' | 'accountId' | 'taskId' | 'objective' | 'connectorId' | 'parameters'>>): PersonalRequest;
@@ -0,0 +1,71 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_connection, isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
3
+ import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
4
+ //#region src/personal-agent/request-repository.ts
5
+ function fromRow(row) {
6
+ return {
7
+ requestId: row.request_id,
8
+ conversationId: row.conversation_id,
9
+ transcriptId: row.transcript_id,
10
+ inputId: row.input_id,
11
+ objective: row.objective,
12
+ connectorId: row.connector_id,
13
+ executorAgentId: row.executor_agent_id,
14
+ accountId: row.account_id ?? void 0,
15
+ parameters: JSON.parse(row.parameters_json),
16
+ state: row.state,
17
+ connectionWaitId: row.connection_wait_id ?? void 0,
18
+ taskId: row.task_id ?? void 0,
19
+ version: row.version,
20
+ createdAt: row.created_at,
21
+ updatedAt: row.updated_at,
22
+ ...row.result_json ? { result: JSON.parse(row.result_json) } : {}
23
+ };
24
+ }
25
+ function getPersonalRequest(requestId) {
26
+ if (!isXopcDatabaseOpen()) return void 0;
27
+ const row = getSqliteDatabase().prepare("SELECT * FROM personal_requests WHERE request_id = ?").get(requestId);
28
+ return row ? fromRow(row) : void 0;
29
+ }
30
+ function personalRequestForWait(waitId) {
31
+ if (!isXopcDatabaseOpen()) return void 0;
32
+ const row = getSqliteDatabase().prepare("SELECT * FROM personal_requests WHERE connection_wait_id = ?").get(waitId);
33
+ return row ? fromRow(row) : void 0;
34
+ }
35
+ function personalRequestForTask(taskId) {
36
+ if (!isXopcDatabaseOpen()) return void 0;
37
+ const row = getSqliteDatabase().prepare("SELECT * FROM personal_requests WHERE task_id = ?").get(taskId);
38
+ return row ? fromRow(row) : void 0;
39
+ }
40
+ function personalRequestForExecution(conversationId) {
41
+ if (!isXopcDatabaseOpen()) return void 0;
42
+ const row = getSqliteDatabase().prepare(`SELECT request.* FROM personal_requests request
43
+ JOIN task_sessions session ON session.task_id = request.task_id
44
+ JOIN task_conversation_state state ON state.task_id = session.task_id
45
+ AND state.active_conversation_id = session.conversation_id AND state.assignment_epoch = session.assignment_epoch
46
+ WHERE session.conversation_id = ? AND session.role = 'execution' AND session.status = 'active'
47
+ ORDER BY session.created_at DESC LIMIT 1`).get(conversationId);
48
+ return row ? fromRow(row) : void 0;
49
+ }
50
+ function listPersonalRequests(conversationId) {
51
+ return getSqliteDatabase().prepare("SELECT * FROM personal_requests WHERE conversation_id = ? ORDER BY created_at DESC LIMIT 50").all(conversationId).map(fromRow);
52
+ }
53
+ function updatePersonalRequest(request, patch) {
54
+ const next = {
55
+ ...request,
56
+ ...patch,
57
+ version: request.version + 1,
58
+ updatedAt: Date.now()
59
+ };
60
+ if (!getSqliteDatabase().prepare(`UPDATE personal_requests SET state = ?, connection_wait_id = ?,
61
+ account_id = ?, task_id = ?, objective = ?, connector_id = ?, parameters_json = ?, version = ?, updated_at = ?
62
+ WHERE request_id = ? AND version = ?`).run(next.state, next.connectionWaitId ?? null, next.accountId ?? null, next.taskId ?? null, next.objective, next.connectorId, JSON.stringify(next.parameters), next.version, next.updatedAt, request.requestId, request.version).changes) throw new Error("PERSONAL_REQUEST_CHANGED");
63
+ return next;
64
+ }
65
+ var init_request_repository = __esmMin((() => {
66
+ init_transaction();
67
+ init_connection();
68
+ }));
69
+ //#endregion
70
+ init_request_repository();
71
+ export { getPersonalRequest, init_request_repository, listPersonalRequests, personalRequestForExecution, personalRequestForTask, personalRequestForWait, updatePersonalRequest };
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const PersonalRequestResultSchema: z.ZodObject<{
3
+ summary: z.ZodString;
4
+ coverage: z.ZodOptional<z.ZodObject<{
5
+ from: z.ZodString;
6
+ to: z.ZodString;
7
+ scannedCount: z.ZodNumber;
8
+ partial: z.ZodBoolean;
9
+ }, z.core.$strip>>;
10
+ items: z.ZodDefault<z.ZodArray<z.ZodObject<{
11
+ messageId: z.ZodString;
12
+ subject: z.ZodString;
13
+ sender: z.ZodString;
14
+ receivedAt: z.ZodString;
15
+ importanceReason: z.ZodString;
16
+ suggestedAction: z.ZodOptional<z.ZodString>;
17
+ openUrl: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>>>;
19
+ }, z.core.$strict>;
20
+ export type PersonalRequestResult = z.infer<typeof PersonalRequestResultSchema>;
21
+ export declare function renderPersonalRequestResult(result: PersonalRequestResult): string;
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ //#region src/personal-agent/request-result.ts
3
+ const PersonalRequestResultSchema = z.object({
4
+ summary: z.string().trim().min(1).max(8e3),
5
+ coverage: z.object({
6
+ from: z.string().datetime({ offset: true }),
7
+ to: z.string().datetime({ offset: true }),
8
+ scannedCount: z.number().int().nonnegative(),
9
+ partial: z.boolean()
10
+ }).optional(),
11
+ items: z.array(z.object({
12
+ messageId: z.string().min(1).max(500),
13
+ subject: z.string().max(500),
14
+ sender: z.string().max(500),
15
+ receivedAt: z.string().datetime({ offset: true }),
16
+ importanceReason: z.string().max(2e3),
17
+ suggestedAction: z.string().max(2e3).optional(),
18
+ openUrl: z.string().url().refine((value) => {
19
+ const url = new URL(value);
20
+ return url.protocol === "https:" && !url.username && !url.password && [
21
+ "mail.google.com",
22
+ "outlook.live.com",
23
+ "outlook.office.com",
24
+ "outlook.office365.com"
25
+ ].includes(url.hostname);
26
+ }).optional()
27
+ })).max(50).default([])
28
+ }).strict();
29
+ function escapeMarkdown(value) {
30
+ return value.replace(/[\\`*_{}\[\]()<>#!|]/g, "\\$&").replace(/\r?\n/g, " ");
31
+ }
32
+ function renderPersonalRequestResult(result) {
33
+ const lines = [result.summary];
34
+ if (result.coverage) {
35
+ const { from, to, scannedCount, partial } = result.coverage;
36
+ lines.push(`查询范围:${escapeMarkdown(from)} — ${escapeMarkdown(to)};已检查 ${scannedCount} 封邮件${partial ? "。查询尚未覆盖全部邮件。" : "。"}`);
37
+ }
38
+ for (const item of result.items) {
39
+ const title = escapeMarkdown(item.subject || "(无主题)");
40
+ lines.push(`${item.openUrl ? `[${title}](${encodeURI(item.openUrl).replace(/\(/g, "%28").replace(/\)/g, "%29")})` : title}\n\n${escapeMarkdown(item.sender)} · ${escapeMarkdown(item.receivedAt)}\n\n${escapeMarkdown(item.importanceReason)}${item.suggestedAction ? `\n\n${escapeMarkdown(item.suggestedAction)}` : ""}`);
41
+ }
42
+ return lines.join("\n\n");
43
+ }
44
+ //#endregion
45
+ export { PersonalRequestResultSchema, renderPersonalRequestResult };
@@ -0,0 +1,18 @@
1
+ import { type ConnectionWait } from '@xopcai/gateway-contract';
2
+ import { type PersonalRequest } from './request-repository.js';
3
+ export declare function submitPersonalRequest(input: {
4
+ conversationId: string;
5
+ connectorId: string;
6
+ objective: string;
7
+ agentId: string;
8
+ accountId?: string;
9
+ timeRange?: PersonalRequest['parameters']['timeRange'];
10
+ idempotencyKey: string;
11
+ }): PersonalRequest;
12
+ /** Called inside the connection-resolution transaction; ordinary waits return undefined. */
13
+ export declare function resolvePersonalRequestConnection(wait: ConnectionWait, resolution: 'continued' | 'skipped'): PersonalRequest | undefined;
14
+ /** A worker can request access recovery without requiring a new main-chat turn. */
15
+ export declare function requirePersonalWorkerConnection(conversationId: string): PersonalRequest;
16
+ export declare function personalRequestSnapshot(request: PersonalRequest): PersonalRequest;
17
+ export declare function cancelPersonalRequest(request: PersonalRequest): PersonalRequest;
18
+ export declare function publishPersonalRequest(request: PersonalRequest): void;