@xopcai/xopc 0.0.308 → 0.0.309

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 (181) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +8 -0
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +8 -0
  3. package/dist/browser-ext/dist/assets/{sidepanel-BbSQr-6P.css → sidepanel-DD6GEMvc.css} +16 -0
  4. package/dist/browser-ext/dist/sidepanel.html +1 -1
  5. package/dist/browser-ext/dist/sidepanel.js +537 -96
  6. package/dist/browser-ext/manifest.json +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/gateway/static/root/assets/{activity-store-wgSB2HYK.js → activity-store-XKNYlFUI.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dUotwUO6.js → agent-avatar-dicebear-1S2TFECE.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-C6LflMXr.js → agent-defaults-settings-panel-f0-YFMUz.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agents-VPDIGRSS.js → agents-CPqUMtCL.js} +1 -1
  12. package/dist/gateway/static/root/assets/{api-BKHmTb0w.js → api-BEUEE4f2.js} +1 -1
  13. package/dist/gateway/static/root/assets/api-CN4id43t.js +1 -0
  14. package/dist/gateway/static/root/assets/{app-management-settings-panel-zPz0rOND.js → app-management-settings-panel-CgVBSqzu.js} +1 -1
  15. package/dist/gateway/static/root/assets/{appearance-settings-DhvhR43G.js → appearance-settings-CoWdCokb.js} +1 -1
  16. package/dist/gateway/static/root/assets/{apps-page-Pmslbzzr.js → apps-page-CexHOcWg.js} +1 -1
  17. package/dist/gateway/static/root/assets/{archive-plugin-BQVZMreT.js → archive-plugin-C3ZA6LRS.js} +1 -1
  18. package/dist/gateway/static/root/assets/{attachment-load-CPE-TMPf.js → attachment-load-CdgS6_zy.js} +1 -1
  19. package/dist/gateway/static/root/assets/{automations-page-C4IAy_zF.js → automations-page-BtHL2hpg.js} +1 -1
  20. package/dist/gateway/static/root/assets/{automations-workspace-Fx5VUJRu.js → automations-workspace-onJPfmO6.js} +1 -1
  21. package/dist/gateway/static/root/assets/{binary-plugins-DgTl7diZ.js → binary-plugins-CiDhtq_H.js} +1 -1
  22. package/dist/gateway/static/root/assets/{block-editor-CcOVA-Gw.js → block-editor-Br00T83w.js} +1 -1
  23. package/dist/gateway/static/root/assets/{browser-automation-inputs-BzkJog8e.js → browser-automation-inputs-D2tILykA.js} +1 -1
  24. package/dist/gateway/static/root/assets/{browser-automations-page--zKAgj1k.js → browser-automations-page-BVuEmryB.js} +1 -1
  25. package/dist/gateway/static/root/assets/{browser-settings-page-DBms6d35.js → browser-settings-page-BgVTyPFY.js} +1 -1
  26. package/dist/gateway/static/root/assets/{capabilities-settings-panel-epdDWIZy.js → capabilities-settings-panel-Dra8wj1S.js} +1 -1
  27. package/dist/gateway/static/root/assets/{channels-settings-B0bsDtmP.js → channels-settings-CkxiMDJ4.js} +1 -1
  28. package/dist/gateway/static/root/assets/{channels-status-swr-B2JwuTjG.js → channels-status-swr-Dtder4G_.js} +1 -1
  29. package/dist/gateway/static/root/assets/{chat-terminal-dock-BfLd2rIJ.js → chat-terminal-dock-JsMtzDao.js} +1 -1
  30. package/dist/gateway/static/root/assets/{computer-settings-page-Ckgc0Py-.js → computer-settings-page-DHerePwo.js} +1 -1
  31. package/dist/gateway/static/root/assets/{connector-service-page-BlC1OXX4.js → connector-service-page-DZFNUTiN.js} +1 -1
  32. package/dist/gateway/static/root/assets/{connectors-page-By33-bF1.js → connectors-page-cl9ZrV4D.js} +1 -1
  33. package/dist/gateway/static/root/assets/{cron-expression-CqNE-nf6.js → cron-expression-DAhdv_Xv.js} +1 -1
  34. package/dist/gateway/static/root/assets/{date-picker-BS9ZjzYJ.js → date-picker-PacO1m3a.js} +1 -1
  35. package/dist/gateway/static/root/assets/{dependency-picker-CF_zYzxX.js → dependency-picker-B-BcuG1y.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-CDwtLR7Z.js → desktop-pet-CdBBhhdY.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-settings-C0djIc1J.js → desktop-pet-settings-Gy03NgMI.js} +1 -1
  38. package/dist/gateway/static/root/assets/{device-pairing-wizard-CDKj9LQj.js → device-pairing-wizard-aV25nKag.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-debug-page-CX5OXxEU.js → extension-debug-page-BFp5eKtY.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-BytR1PaY.js → extension-page-DL3vyyH6.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-settings-page-CkaMJA5F.js → extension-settings-page-BXtvdAsY.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-config-swr-B6wHa6ZI.js → gateway-config-swr-xAOGtenO.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-realtime-B53R0CA4.js → gateway-realtime-BuaTsMSi.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-realtime-store-BG95uGVW.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-settings-_YU-1p0z.js → gateway-settings-Dcr2Ikeh.js} +1 -1
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-DRzGnEV-.js → gateway-startup-retry-BwDxKHd4.js} +1 -1
  47. package/dist/gateway/static/root/assets/{heartbeat-settings-CVIvvm4x.js → heartbeat-settings-DOy3alvT.js} +1 -1
  48. package/dist/gateway/static/root/assets/{home-page-COCHelcL.js → home-page-CDm3dGVy.js} +1 -1
  49. package/dist/gateway/static/root/assets/{image-generation-api-Ck_pyDom.js → image-generation-api-wGMeI_yW.js} +1 -1
  50. package/dist/gateway/static/root/assets/{imports-page-DrtbjL8O.js → imports-page-zexFT5Rq.js} +1 -1
  51. package/dist/gateway/static/root/assets/index-D-vczw_0.css +1 -0
  52. package/dist/gateway/static/root/assets/{index-CDfcPiPb.js → index-DJo4DimT.js} +47 -47
  53. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BlZh41Xq.js → keyboard-shortcuts-settings-CutG9zLh.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-app-workbench-page-D7_Raxjw.js → local-app-workbench-page-CwLvTwjn.js} +1 -1
  55. package/dist/gateway/static/root/assets/{local-apps-page-DbP7wWuh.js → local-apps-page-CJy6I7Dt.js} +1 -1
  56. package/dist/gateway/static/root/assets/{locale-store-msTfRK8P.js → locale-store-DPZ79W1-.js} +1 -1
  57. package/dist/gateway/static/root/assets/{logs-page-C0n66FiO.js → logs-page-egGcPHNi.js} +1 -1
  58. package/dist/gateway/static/root/assets/{management-settings-i6GhxpGV.js → management-settings-BQhIOELc.js} +1 -1
  59. package/dist/gateway/static/root/assets/{markdown-view-BInabSKf.js → markdown-view-p2P5hP1U.js} +1 -1
  60. package/dist/gateway/static/root/assets/{media-plugins-CnWChQ3Y.js → media-plugins-CsBylqlN.js} +1 -1
  61. package/dist/gateway/static/root/assets/messages-BiYTyLJr.js +3 -0
  62. package/dist/gateway/static/root/assets/{note-detail-panel-C59d8vDW.js → note-detail-panel-c2k5Uz6X.js} +3 -3
  63. package/dist/gateway/static/root/assets/{notes-page-C1GBPrVI.js → notes-page-BLQWJMhf.js} +1 -1
  64. package/dist/gateway/static/root/assets/{page-tabs-BWitjb3e.js → page-tabs-ChQ4jJFs.js} +1 -1
  65. package/dist/gateway/static/root/assets/{preview-open-alternatives-UaCWCxZv.js → preview-open-alternatives-9B5W7nVE.js} +1 -1
  66. package/dist/gateway/static/root/assets/{proactive-page-CtSFJxoM.js → proactive-page-iOjI0d_e.js} +1 -1
  67. package/dist/gateway/static/root/assets/{product-open-page-gmi5LLwM.js → product-open-page-BADxWEdP.js} +1 -1
  68. package/dist/gateway/static/root/assets/{project-detail-page-ILTmQ1YN.js → project-detail-page-BcxbQn2M.js} +1 -1
  69. package/dist/gateway/static/root/assets/{projects-page-snl4rOQZ.js → projects-page-BuSvld0O.js} +1 -1
  70. package/dist/gateway/static/root/assets/{registry-api-BSWtko7U.js → registry-api-B_e_nZSN.js} +1 -1
  71. package/dist/gateway/static/root/assets/{remote-access-hub-BbaAcEN3.js → remote-access-hub-CFS8LQKW.js} +1 -1
  72. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CtOjKGWg.js → runtime-tools-settings-panel-D-pwiIyp.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-DkyyDcl2.js → schema-form-IWmb05DX.js} +1 -1
  74. package/dist/gateway/static/root/assets/{sessions-page-DrWL71O8.js → sessions-page-DZjc__ok.js} +1 -1
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-C1SM5B93.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-C0JDGN_V.js → settings-form-section-B0veRBZs.js} +1 -1
  77. package/dist/gateway/static/root/assets/{settings-page-DiIyMQ52.js → settings-page-CxRWyWYe.js} +1 -1
  78. package/dist/gateway/static/root/assets/{setup-status-panel-EPazhoZO.js → setup-status-panel-D9Rl7Tec.js} +1 -1
  79. package/dist/gateway/static/root/assets/{share-preview-page-Bt1K657Y.js → share-preview-page-CirpgkfD.js} +1 -1
  80. package/dist/gateway/static/root/assets/{shares-settings-g2MdRXSZ.js → shares-settings-CwCThBs0.js} +1 -1
  81. package/dist/gateway/static/root/assets/skill-reload-api-DG6VGbOX.js +1 -0
  82. package/dist/gateway/static/root/assets/{skills-page-Wd0uYSPG.js → skills-page-BdRJ2vnL.js} +1 -1
  83. package/dist/gateway/static/root/assets/{skills-page.utils-vq5Ujm03.js → skills-page.utils-B42mpWKV.js} +1 -1
  84. package/dist/gateway/static/root/assets/{system-settings-panel-Cz1P-HDH.js → system-settings-panel-DXIZpAvU.js} +1 -1
  85. package/dist/gateway/static/root/assets/{task-detail-page-BG3A5gPZ.js → task-detail-page-QXo9LJly.js} +1 -1
  86. package/dist/gateway/static/root/assets/{theme-store-1SZ-HFHX.js → theme-store-BFbj_2Tu.js} +1 -1
  87. package/dist/gateway/static/root/assets/{tunnel-api-DQGoFuZO.js → tunnel-api-Db2guRdW.js} +1 -1
  88. package/dist/gateway/static/root/assets/{use-autosave-DVDlBb95.js → use-autosave-DDY9qoXZ.js} +1 -1
  89. package/dist/gateway/static/root/assets/{user-model-page-qM5UiTGx.js → user-model-page-CzPmMkaO.js} +1 -1
  90. package/dist/gateway/static/root/assets/{voice-api-key-field-B2pZCcxY.js → voice-api-key-field-BZbKQ8HT.js} +1 -1
  91. package/dist/gateway/static/root/assets/{voice-config-api-DgJML_uM.js → voice-config-api-SKCeQLrH.js} +1 -1
  92. package/dist/gateway/static/root/assets/{work-discovery-overlay-Bptv7bEY.js → work-discovery-overlay-BRVTTXNG.js} +1 -1
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BijCrNc4.js → workflow-run-setup-panel-D2kuwv5e.js} +1 -1
  94. package/dist/gateway/static/root/assets/{workflows-page-DRy1RAYH.js → workflows-page-CQXtiYtq.js} +1 -1
  95. package/dist/gateway/static/root/index.html +12 -12
  96. package/dist/package.js +1 -1
  97. package/dist/packages/gateway-contract/src/sessions.js +6 -1
  98. package/dist/src/agent/agent-manager.js +29 -4
  99. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  100. package/dist/src/agent/child-agent-factory.js +18 -4
  101. package/dist/src/agent/coding/repository-instructions.d.ts +4 -0
  102. package/dist/src/agent/coding/repository-instructions.js +46 -2
  103. package/dist/src/agent/data-acquisition/git.d.ts +17 -0
  104. package/dist/src/agent/data-acquisition/git.js +100 -0
  105. package/dist/src/agent/data-acquisition/render.d.ts +7 -0
  106. package/dist/src/agent/data-acquisition/render.js +79 -0
  107. package/dist/src/agent/data-acquisition/scheduler.d.ts +12 -0
  108. package/dist/src/agent/data-acquisition/scheduler.js +53 -0
  109. package/dist/src/agent/data-acquisition/schema.d.ts +75 -0
  110. package/dist/src/agent/data-acquisition/schema.js +206 -0
  111. package/dist/src/agent/data-acquisition/service.d.ts +10 -0
  112. package/dist/src/agent/data-acquisition/service.js +292 -0
  113. package/dist/src/agent/data-acquisition/types.d.ts +37 -0
  114. package/dist/src/agent/data-acquisition/types.js +5 -0
  115. package/dist/src/agent/embedded/run-turn.js +16 -4
  116. package/dist/src/agent/embedded/session-runner.d.ts +1 -0
  117. package/dist/src/agent/embedded/session-runner.js +3 -0
  118. package/dist/src/agent/embedded/tool-result-truncation.js +11 -0
  119. package/dist/src/agent/embedded/xopc-tools-bridge.js +2 -1
  120. package/dist/src/agent/external-tools/composio-provider.js +12 -1
  121. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  122. package/dist/src/agent/external-tools/index.js +8 -1
  123. package/dist/src/agent/external-tools/read-policy.d.ts +6 -0
  124. package/dist/src/agent/external-tools/read-policy.js +21 -0
  125. package/dist/src/agent/external-tools/service.d.ts +1 -0
  126. package/dist/src/agent/external-tools/service.js +4 -1
  127. package/dist/src/agent/external-tools/types.d.ts +2 -0
  128. package/dist/src/agent/orchestration/agent-turn-policy.js +25 -10
  129. package/dist/src/agent/orchestration/delegation-scope.d.ts +9 -0
  130. package/dist/src/agent/orchestration/delegation-scope.js +11 -0
  131. package/dist/src/agent/prompt/sections/tooling.js +3 -1
  132. package/dist/src/agent/prompt/subagent-context.js +4 -2
  133. package/dist/src/agent/sandbox/fileAccess.d.ts +2 -0
  134. package/dist/src/agent/sandbox/fileAccess.js +31 -2
  135. package/dist/src/agent/tools/dataBatch.d.ts +4 -0
  136. package/dist/src/agent/tools/dataBatch.js +50 -0
  137. package/dist/src/agent/tools/delegate-tool.d.ts +6 -3
  138. package/dist/src/agent/tools/delegate-tool.js +65 -48
  139. package/dist/src/agent/tools/delegation-parent-policy.d.ts +7 -0
  140. package/dist/src/agent/tools/delegation-parent-policy.js +41 -0
  141. package/dist/src/agent/tools/delegation-policy.d.ts +16 -0
  142. package/dist/src/agent/tools/delegation-policy.js +93 -0
  143. package/dist/src/agent/tools/factory.d.ts +2 -0
  144. package/dist/src/agent/tools/factory.js +42 -3
  145. package/dist/src/agent/tools/fetch-text.d.ts +7 -0
  146. package/dist/src/agent/tools/fetch-text.js +86 -0
  147. package/dist/src/agent/tools/find.js +1 -1
  148. package/dist/src/agent/tools/grep.js +11 -23
  149. package/dist/src/agent/tools/index.d.ts +1 -0
  150. package/dist/src/agent/tools/index.js +2 -1
  151. package/dist/src/agent/tools/knowledge-memory-tool.js +10 -2
  152. package/dist/src/agent/tools/read.js +7 -5
  153. package/dist/src/agent/tools/repository-search.d.ts +12 -2
  154. package/dist/src/agent/tools/repository-search.js +127 -74
  155. package/dist/src/agent/tools/web.js +19 -28
  156. package/dist/src/agent/workflow/subagent-runner.js +25 -3
  157. package/dist/src/agent/workflow/workflow-child-tools.js +13 -8
  158. package/dist/src/agent-config/schema.d.ts +7 -0
  159. package/dist/src/agent-config/schema.js +2 -0
  160. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  161. package/dist/src/config/schema.d.ts +4 -0
  162. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  163. package/dist/src/gateway/heartbeat/service.js +2 -2
  164. package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -0
  165. package/dist/src/gateway/hono/routes/sessions.js +141 -13
  166. package/dist/src/heartbeat/index.js +1 -1
  167. package/dist/src/storage/sqlite/index.d.ts +1 -0
  168. package/dist/src/storage/sqlite/index.js +2 -1
  169. package/dist/src/storage/sqlite/migrations/186_sidebar_layout.sql +16 -0
  170. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  171. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  172. package/dist/src/storage/sqlite/schema.js +1 -1
  173. package/dist/src/storage/sqlite/sidebar-layout-repository.d.ts +12 -0
  174. package/dist/src/storage/sqlite/sidebar-layout-repository.js +53 -0
  175. package/package.json +3 -3
  176. package/dist/gateway/static/root/assets/api-DFOlahZv.js +0 -1
  177. package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +0 -1
  178. package/dist/gateway/static/root/assets/index-CRu1p38D.css +0 -1
  179. package/dist/gateway/static/root/assets/messages-F74LVAiU.js +0 -3
  180. package/dist/gateway/static/root/assets/settings-advanced-gate-BG0kl4HT.js +0 -1
  181. package/dist/gateway/static/root/assets/skill-reload-api-B1DPzu98.js +0 -1
@@ -0,0 +1,16 @@
1
+ import type { AgentTool } from '@earendil-works/pi-agent-core';
2
+ export declare const DELEGATION_CAPABILITIES: readonly ["local_read", "web_read", "knowledge_read", "skills_read", "external_read", "local_write", "command", "browser"];
3
+ export type DelegationCapability = typeof DELEGATION_CAPABILITIES[number];
4
+ export type DelegationMode = 'inspect' | 'read' | 'research' | 'review' | 'implement' | 'custom';
5
+ /** Host-owned classifications. New tools fail closed until classified. */
6
+ export declare const DELEGATION_TOOL_CAPABILITIES: Readonly<Record<string, DelegationCapability>>;
7
+ export declare function delegationCapabilities(mode: DelegationMode, requested?: DelegationCapability[]): Set<DelegationCapability>;
8
+ export declare function resolveDelegationTools(parentNames: readonly string[], mode: DelegationMode, requested?: string[], capabilities?: DelegationCapability[]): {
9
+ granted: string[];
10
+ rejected: {
11
+ tool: string;
12
+ reason: string;
13
+ }[];
14
+ };
15
+ /** Always enforce the external read contract, even when the child explicitly sends readOnly:false. */
16
+ export declare function protectDelegatedTool(tool: AgentTool<any, any>): AgentTool<any, any>;
@@ -0,0 +1,93 @@
1
+ //#region src/agent/tools/delegation-policy.ts
2
+ const DELEGATION_CAPABILITIES = [
3
+ "local_read",
4
+ "web_read",
5
+ "knowledge_read",
6
+ "skills_read",
7
+ "external_read",
8
+ "local_write",
9
+ "command",
10
+ "browser"
11
+ ];
12
+ /** Host-owned classifications. New tools fail closed until classified. */
13
+ const DELEGATION_TOOL_CAPABILITIES = {
14
+ read_file: "local_read",
15
+ grep: "local_read",
16
+ find: "local_read",
17
+ list_dir: "local_read",
18
+ review_workspace: "local_read",
19
+ read_media: "local_read",
20
+ image: "local_read",
21
+ tool_manual: "local_read",
22
+ web_search: "web_read",
23
+ web_fetch: "web_read",
24
+ web_extract: "web_read",
25
+ knowledge_search: "knowledge_read",
26
+ knowledge_get: "knowledge_read",
27
+ session_search: "knowledge_read",
28
+ session_recall: "knowledge_read",
29
+ user_context_search: "knowledge_read",
30
+ user_context_get: "knowledge_read",
31
+ skills_list: "skills_read",
32
+ skill_view: "skills_read",
33
+ skills_marketplace_search: "skills_read",
34
+ xopc_tool_search: "external_read",
35
+ xopc_tool_describe: "external_read",
36
+ xopc_tool_execute: "external_read",
37
+ write_file: "local_write",
38
+ apply_patch: "local_write",
39
+ exec_command: "command",
40
+ language_diagnostics: "command",
41
+ browser_use: "browser"
42
+ };
43
+ const RESEARCH = [
44
+ "local_read",
45
+ "web_read",
46
+ "knowledge_read",
47
+ "skills_read",
48
+ "external_read"
49
+ ];
50
+ function delegationCapabilities(mode, requested) {
51
+ const ceiling = mode === "implement" ? [
52
+ ...RESEARCH,
53
+ "local_write",
54
+ "command",
55
+ "browser"
56
+ ] : mode === "custom" ? [...RESEARCH, "browser"] : mode === "research" ? RESEARCH : ["local_read"];
57
+ const defaults = mode === "implement" ? ceiling.filter((capability) => capability !== "browser") : mode === "custom" ? [] : ceiling;
58
+ return new Set((requested ?? defaults).filter((capability) => ceiling.includes(capability)));
59
+ }
60
+ function resolveDelegationTools(parentNames, mode, requested, capabilities) {
61
+ const parent = new Set(parentNames);
62
+ const allowed = delegationCapabilities(mode, capabilities);
63
+ const granted = [];
64
+ const rejected = [];
65
+ for (const tool of new Set((requested ?? parentNames).map((name) => name.trim()).filter(Boolean))) {
66
+ const capability = DELEGATION_TOOL_CAPABILITIES[tool];
67
+ const reason = !parent.has(tool) ? "Unavailable to the parent agent" : !capability ? "Tool has no delegable capability" : !allowed.has(capability) ? `Capability ${capability} is outside this delegation` : void 0;
68
+ if (reason) {
69
+ if (requested) rejected.push({
70
+ tool,
71
+ reason
72
+ });
73
+ } else granted.push(tool);
74
+ }
75
+ return {
76
+ granted,
77
+ rejected
78
+ };
79
+ }
80
+ /** Always enforce the external read contract, even when the child explicitly sends readOnly:false. */
81
+ function protectDelegatedTool(tool) {
82
+ if (tool.name !== "xopc_tool_execute") return tool;
83
+ return {
84
+ ...tool,
85
+ execute: (id, args, signal, onUpdate) => tool.execute(id, {
86
+ ...args,
87
+ readOnly: true,
88
+ approvalId: void 0
89
+ }, signal, onUpdate)
90
+ };
91
+ }
92
+ //#endregion
93
+ export { DELEGATION_CAPABILITIES, DELEGATION_TOOL_CAPABILITIES, delegationCapabilities, protectDelegatedTool, resolveDelegationTools };
@@ -83,6 +83,8 @@ export interface ToolFactoryDeps {
83
83
  installSkillFromMarketplace?: (opts: MarketplaceSkillInstallToolOptions) => Promise<MarketplaceSkillInstallToolResult>;
84
84
  }
85
85
  export interface CreateCoreToolsOptions {
86
+ getParentTools?: () => AgentTool<any, any>[];
87
+ createDelegationPolicy?: () => import('../orchestration/agent-turn-policy.js').AgentTurnPolicy;
86
88
  /** Workspace root for file/command tools (defaults to factory workspace). */
87
89
  workspace?: string;
88
90
  /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */
@@ -15,6 +15,7 @@ import { EXTERNAL_TOOL_NAMES } from "../external-tools/gateway-tools.js";
15
15
  import { buildRuntimeEnvironment } from "../../runtime-tools/environment.js";
16
16
  import { createDefaultExternalToolGatewayTools } from "../external-tools/index.js";
17
17
  import { createReadFileTool } from "./read.js";
18
+ import { createDataBatchTool } from "./dataBatch.js";
18
19
  import { skillEnvironmentId } from "../skills/installer.js";
19
20
  import { createWriteFileTool } from "./write.js";
20
21
  import { createListDirTool } from "./list-dir.js";
@@ -64,6 +65,7 @@ import { ComputerRuntime } from "../../computer/runtime.js";
64
65
  import { createComputerUseTool } from "./computer-use-tool.js";
65
66
  import { createReviewWorkspaceTool } from "./review-workspace.js";
66
67
  import { createLanguageDiagnosticsTool } from "./language-diagnostics.js";
68
+ import { createDelegationParentPolicy } from "./delegation-parent-policy.js";
67
69
  import { createWorkflowCatalog } from "../workflow/catalog.js";
68
70
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
69
71
  import { createTextToSpeechTool } from "./tts-tool.js";
@@ -256,7 +258,7 @@ var AgentToolsFactory = class AgentToolsFactory {
256
258
  const listDir = createListDirTool(workspace);
257
259
  const grep = createGrepTool(workspace);
258
260
  const find = createFindTool(workspace);
259
- return filterToolsByDisabledSet([
261
+ const core = [
260
262
  createSessionStatusTool(),
261
263
  createMemoryMaintenanceTool({ getConfig: () => this.deps.getConfig?.() }),
262
264
  createToolManualTool(),
@@ -461,6 +463,12 @@ var AgentToolsFactory = class AgentToolsFactory {
461
463
  })] : [],
462
464
  ...primary ? [createDelegateTool({
463
465
  workspace,
466
+ getParentTools: () => options?.getParentTools?.() ?? filterToolsByDisabledSet(core, disabled),
467
+ createParentPolicy: options?.createDelegationPolicy ?? (() => createDelegationParentPolicy({
468
+ getConfig: () => this.deps.getConfig?.(),
469
+ conversationId: currentConversationId(),
470
+ agentId: resolvedAgentId
471
+ })),
464
472
  getSubagentModel: () => {
465
473
  const m = (options?.getPrimaryModel ?? this.deps.getPrimaryModel)?.();
466
474
  if (!m) throw new Error("No primary model configured for delegate_task");
@@ -468,7 +476,14 @@ var AgentToolsFactory = class AgentToolsFactory {
468
476
  },
469
477
  bus: this.deps.bus,
470
478
  getConfig: () => this.deps.getConfig?.(),
471
- getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,
479
+ getCurrentContext: () => {
480
+ const context = this.deps.getCurrentContext?.();
481
+ const conversationId = currentConversationId();
482
+ return conversationId ? {
483
+ ...context,
484
+ conversationId
485
+ } : context ?? null;
486
+ },
472
487
  toolExecutorConfig: this.deps.toolExecutorConfig,
473
488
  buildChildTools: (childOpts) => {
474
489
  return new AgentToolsFactory({
@@ -485,6 +500,7 @@ var AgentToolsFactory = class AgentToolsFactory {
485
500
  agentId: options?.agentId ?? childOpts.agentId,
486
501
  conversationId: childOpts.browserConversationId,
487
502
  disabledTools: new Set([
503
+ ...disabled ?? [],
488
504
  EXTERNAL_TOOL_NAMES.search,
489
505
  EXTERNAL_TOOL_NAMES.describe,
490
506
  EXTERNAL_TOOL_NAMES.execute,
@@ -495,7 +511,30 @@ var AgentToolsFactory = class AgentToolsFactory {
495
511
  }
496
512
  })] : [],
497
513
  ...optionalTools
498
- ], disabled);
514
+ ];
515
+ if ([
516
+ "read_file",
517
+ "grep",
518
+ "exec_command",
519
+ "knowledge_search",
520
+ "knowledge_get",
521
+ "web_search",
522
+ "web_fetch",
523
+ "xopc_tool_execute"
524
+ ].some((name) => !disabled?.has(name))) {
525
+ const dataTools = () => {
526
+ const config = this.deps.getConfig?.();
527
+ const policies = config ? (currentConversationId() ? resolveEffectiveAgentConfigForSession(config, currentConversationId()) : resolveEffectiveAgentConfigForAgent(config, resolvedAgentId)).config.tools : void 0;
528
+ if (policies?.data_batch?.mode === "deny") return [];
529
+ return filterToolsByDisabledSet(core, disabled).filter((tool) => policies?.[tool.name]?.mode !== "deny");
530
+ };
531
+ core.push(createDataBatchTool(workspace, () => new Set(dataTools().map((tool) => tool.name)), {
532
+ getTools: dataTools,
533
+ canExecute: (name) => dataTools().some((tool) => tool.name === name),
534
+ allowHostGit: () => getCommandIsolation()?.mode !== "docker"
535
+ }));
536
+ }
537
+ return filterToolsByDisabledSet(core, disabled);
499
538
  }
500
539
  createCapabilityTools(capabilityNames, options) {
501
540
  const disabled = options?.disabledTools;
@@ -0,0 +1,7 @@
1
+ import { type WebsiteBlocklistConfig } from './url-safety.js';
2
+ /** Validate each redirect and the address actually used for the connection. */
3
+ export declare function fetchPublicText(input: string, blocklist: WebsiteBlocklistConfig | undefined, signal?: AbortSignal): Promise<{
4
+ text: string;
5
+ contentType: string;
6
+ url: string;
7
+ }>;
@@ -0,0 +1,86 @@
1
+ import { checkUrlSafety, checkWebsiteBlocklist } from "./url-safety.js";
2
+ import { Agent, fetch } from "undici";
3
+ import { lookup } from "node:dns";
4
+ //#region src/agent/tools/fetch-text.ts
5
+ /** Validate each redirect and the address actually used for the connection. */
6
+ async function fetchPublicText(input, blocklist, signal) {
7
+ const deadline = AbortSignal.any([...signal ? [signal] : [], AbortSignal.timeout(25e3)]);
8
+ const dispatcher = new Agent({ connect: { lookup(hostname, options, callback) {
9
+ lookup(hostname, { all: true }, (error, addresses) => {
10
+ if (error) {
11
+ callback(error, "", 4);
12
+ return;
13
+ }
14
+ if (!addresses.length || addresses.some((item) => !checkUrlSafety(`http://${item.family === 6 ? `[${item.address}]` : item.address}`).safe)) {
15
+ callback(/* @__PURE__ */ new Error("DNS resolved to a non-public address"), "", 4);
16
+ return;
17
+ }
18
+ if (options.all) callback(null, addresses);
19
+ else callback(null, addresses[0].address, addresses[0].family);
20
+ });
21
+ } } });
22
+ try {
23
+ let url = input;
24
+ for (let redirects = 0; redirects <= 5; redirects++) {
25
+ deadline.throwIfAborted();
26
+ const safety = checkUrlSafety(url);
27
+ if (!safety.safe) throw new Error(`Blocked: ${safety.reason}`);
28
+ const blocked = checkWebsiteBlocklist(url, blocklist);
29
+ if (blocked) throw new Error(`Blocked: ${blocked.message}`);
30
+ const response = await fetch(url, {
31
+ signal: deadline,
32
+ redirect: "manual",
33
+ dispatcher
34
+ });
35
+ if ([
36
+ 301,
37
+ 302,
38
+ 303,
39
+ 307,
40
+ 308
41
+ ].includes(response.status)) {
42
+ await response.body?.cancel();
43
+ const location = response.headers.get("location");
44
+ if (!location) throw new Error("Redirect has no location");
45
+ url = new URL(location, url).href;
46
+ continue;
47
+ }
48
+ if (!response.ok) {
49
+ await response.body?.cancel();
50
+ throw new Error(`HTTP ${response.status}`);
51
+ }
52
+ const reader = response.body?.getReader();
53
+ if (!reader) return {
54
+ text: "",
55
+ contentType: response.headers.get("content-type") ?? "",
56
+ url
57
+ };
58
+ const decoder = new TextDecoder();
59
+ let text = "", bytes = 0;
60
+ try {
61
+ for (;;) {
62
+ deadline.throwIfAborted();
63
+ const chunk = await reader.read();
64
+ if (chunk.done) break;
65
+ bytes += chunk.value.byteLength;
66
+ if (bytes > 6e6) throw new Error("Response too large");
67
+ text += decoder.decode(chunk.value, { stream: true });
68
+ }
69
+ text += decoder.decode();
70
+ } finally {
71
+ await reader.cancel().catch(() => {});
72
+ reader.releaseLock();
73
+ }
74
+ return {
75
+ text,
76
+ contentType: response.headers.get("content-type") ?? "",
77
+ url
78
+ };
79
+ }
80
+ throw new Error("Too many redirects");
81
+ } finally {
82
+ await dispatcher.close();
83
+ }
84
+ }
85
+ //#endregion
86
+ export { fetchPublicText };
@@ -1,6 +1,6 @@
1
1
  import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
2
- import { resolveToCwd } from "../../utils/helpers.js";
3
2
  import { isSearchFileAllowed, repositorySearch } from "./repository-search.js";
3
+ import { resolveToCwd } from "../../utils/helpers.js";
4
4
  import { Type } from "@sinclair/typebox";
5
5
  //#region src/agent/tools/find.ts
6
6
  const findSchema = Type.Object({
@@ -1,6 +1,6 @@
1
1
  import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
2
+ import { parseRepositoryMatch, repositorySearch } from "./repository-search.js";
2
3
  import { resolveToCwd } from "../../utils/helpers.js";
3
- import { isSearchFileAllowed, repositorySearch } from "./repository-search.js";
4
4
  import { Type } from "@sinclair/typebox";
5
5
  //#region src/agent/tools/grep.ts
6
6
  const grepSchema = Type.Object({
@@ -36,7 +36,9 @@ function createGrepTool(cwd) {
36
36
  if (!policy.allowed) throw new Error(policy.reason);
37
37
  path = policy.canonicalPath;
38
38
  const limit = Math.min(1e3, Math.max(1, params.limit ?? 100));
39
- const result = await repositorySearch(cwd, [
39
+ const lines = [];
40
+ const outputLimit = limit * (1 + 2 * (params.context ?? 0));
41
+ const truncated = (await repositorySearch(cwd, [
40
42
  "--json",
41
43
  "--line-number",
42
44
  "--with-filename",
@@ -45,8 +47,6 @@ function createGrepTool(cwd) {
45
47
  "--max-columns",
46
48
  "300",
47
49
  "--max-columns-preview",
48
- "--max-count",
49
- String(limit),
50
50
  "--context",
51
51
  String(params.context ?? 0),
52
52
  ...params.ignoreCase ? ["--ignore-case"] : [],
@@ -56,25 +56,13 @@ function createGrepTool(cwd) {
56
56
  params.pattern,
57
57
  "--",
58
58
  path
59
- ], signal);
60
- const lines = [];
61
- for (const row of result.output.split("\n")) {
62
- if (!row) continue;
63
- let event;
64
- try {
65
- event = JSON.parse(row);
66
- } catch {
67
- if (result.truncated) continue;
68
- throw new Error("Invalid search output");
69
- }
70
- if (event.type !== "match" && event.type !== "context") continue;
71
- const data = event.data;
72
- if (!data?.path?.text || !data.lines?.text || !isSearchFileAllowed(cwd, data.path.text)) continue;
73
- const separator = event.type === "match" ? ":" : "-";
74
- lines.push(`${data.path.text}${separator}${data.line_number}${separator}${data.lines.text.replace(/\r?\n$/, "")}`);
75
- }
76
- const outputLimit = limit * (1 + 2 * (params.context ?? 0));
77
- const truncated = result.truncated || lines.length > outputLimit;
59
+ ], signal, { onLine: (row) => {
60
+ const match = parseRepositoryMatch(cwd, row);
61
+ if (!match) return;
62
+ const separator = match.match ? ":" : "-";
63
+ lines.push(`${match.path}${separator}${match.line}${separator}${match.text}`);
64
+ if (lines.length > outputLimit) return false;
65
+ } })).truncated || lines.length > outputLimit;
78
66
  return {
79
67
  content: [{
80
68
  type: "text",
@@ -1,6 +1,7 @@
1
1
  export { getToolMetadata, DEFAULT_TOOL_METADATA, type AgentToolWithMetadata, type ToolMutationScope, type ToolVerificationKind, type XopcToolMetadata, } from './metadata.js';
2
2
  export { ToolConcurrencyController, resolveToolLockMode, type ToolLockMode, } from './concurrency.js';
3
3
  export { createReadFileTool, type CreateReadFileToolOptions } from './read.js';
4
+ export { createDataBatchTool } from './dataBatch.js';
4
5
  export { createWriteFileTool, writeFileTool } from './write.js';
5
6
  export { createListDirTool, listDirTool } from './list-dir.js';
6
7
  export { createExecCommandTool, type ExecCommandDetails, type ExecCommandUpdateDetails, } from './exec-command.js';
@@ -2,6 +2,7 @@ import { DEFAULT_TOOL_METADATA, getToolMetadata } from "./metadata.js";
2
2
  import { ToolConcurrencyController, resolveToolLockMode } from "./concurrency.js";
3
3
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, GREP_MAX_LINE_LENGTH, formatSize, truncateHead, truncateLine, truncateTail } from "./truncate.js";
4
4
  import { createReadFileTool } from "./read.js";
5
+ import { createDataBatchTool } from "./dataBatch.js";
5
6
  import { createWriteFileTool, writeFileTool } from "./write.js";
6
7
  import { createListDirTool, listDirTool } from "./list-dir.js";
7
8
  import { createPublishArtifactsTool } from "./publish-artifacts.js";
@@ -43,4 +44,4 @@ import { createDesktopPetTool } from "./desktop-pet-tool.js";
43
44
  import { createManagedJobTool } from "./managed-job-tool.js";
44
45
  import { createImageTool } from "./image-tool.js";
45
46
  import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
46
- export { BrowserRuntime, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_TOOL_METADATA, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, createApplyPatchTool, createAutomationTool, createBrowserAutomationTool, createClarifyTool, createCreateShareTool, createDelegateTool, createDesktopPetTool, createExecCommandTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createKnowledgeGetTool, createKnowledgeSearchTool, createKnowledgeWriteTool, createListDirTool, createManagedJobTool, createMemoryMaintenanceTool, createMessageTool, createPublishArtifactsTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionRecallTool, createSessionSearchTool, createSessionStatusTool, createSkillInstallTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createSkillsMarketplaceSearchTool, createTodoTool, createToolManualTool, createUpdatePlanTool, createUserContextGetTool, createUserContextSearchTool, createUserContextUpdateTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, createXopcUseTool, findTool, formatSize, fuzzyFindText, generateDiffString, getToolMetadata, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, resolveToolLockMode, restoreLineEndings, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
47
+ export { BrowserRuntime, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_TOOL_METADATA, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, createApplyPatchTool, createAutomationTool, createBrowserAutomationTool, createClarifyTool, createCreateShareTool, createDataBatchTool, createDelegateTool, createDesktopPetTool, createExecCommandTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createKnowledgeGetTool, createKnowledgeSearchTool, createKnowledgeWriteTool, createListDirTool, createManagedJobTool, createMemoryMaintenanceTool, createMessageTool, createPublishArtifactsTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionRecallTool, createSessionSearchTool, createSessionStatusTool, createSkillInstallTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createSkillsMarketplaceSearchTool, createTodoTool, createToolManualTool, createUpdatePlanTool, createUserContextGetTool, createUserContextSearchTool, createUserContextUpdateTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, createXopcUseTool, findTool, formatSize, fuzzyFindText, generateDiffString, getToolMetadata, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, resolveToolLockMode, restoreLineEndings, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
@@ -48,6 +48,7 @@ function createKnowledgeSearchTool(options) {
48
48
  label: "Knowledge Search",
49
49
  description: "Search project, workspace, and session knowledge for prior decisions, facts, lessons, and commitments.",
50
50
  parameters: SearchSchema,
51
+ supportsParallel: true,
51
52
  async execute(_toolCallId, raw) {
52
53
  if (!options.canRead()) return {
53
54
  content: [{
@@ -82,6 +83,7 @@ function createKnowledgeGetTool(options) {
82
83
  label: "Knowledge Get",
83
84
  description: "Read one knowledge item returned by knowledge_search.",
84
85
  parameters: GetSchema,
86
+ supportsParallel: true,
85
87
  async execute(_toolCallId, raw) {
86
88
  if (!options.canRead()) return {
87
89
  content: [{
@@ -97,13 +99,19 @@ function createKnowledgeGetTool(options) {
97
99
  type: "text",
98
100
  text: JSON.stringify(item, null, 2)
99
101
  }],
100
- details: { item }
102
+ details: {
103
+ item,
104
+ complete: true
105
+ }
101
106
  } : {
102
107
  content: [{
103
108
  type: "text",
104
109
  text: `Knowledge item not found: ${id}`
105
110
  }],
106
- details: { id }
111
+ details: {
112
+ id,
113
+ error: "knowledge_not_found"
114
+ }
107
115
  };
108
116
  }
109
117
  };
@@ -1,4 +1,5 @@
1
- import { checkedFilePath, readWorkspaceFile } from "../sandbox/fileAccess.js";
1
+ import { checkedFilePath, readWorkspaceFileAsync } from "../sandbox/fileAccess.js";
2
+ import { dataScheduler } from "../data-acquisition/scheduler.js";
2
3
  import { checkFileSafety } from "../prompt/safety.js";
3
4
  import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "./truncate.js";
4
5
  import { isBareProfileMarkdownFileName, resolvePathUnderWorkspace, resolveProfileMarkdownPathIfBareName } from "./tool-paths.js";
@@ -27,12 +28,12 @@ function createReadFileTool(workspace, options) {
27
28
  label: "📄 Read",
28
29
  supportsParallel: true,
29
30
  idempotent: true,
30
- async execute(_toolCallId, params, _signal) {
31
- return executeReadFile(workspace, options?.profileMarkdownRoot, params);
31
+ async execute(_toolCallId, params, signal) {
32
+ return dataScheduler.run(workspace, signal, () => executeReadFile(workspace, options?.profileMarkdownRoot, params, signal));
32
33
  }
33
34
  };
34
35
  }
35
- async function executeReadFile(workspace, profileMarkdownRoot, params) {
36
+ async function executeReadFile(workspace, profileMarkdownRoot, params, signal) {
36
37
  try {
37
38
  const safety = checkFileSafety("read", params.path);
38
39
  if (!safety.allowed) return {
@@ -66,7 +67,7 @@ async function executeReadFile(workspace, profileMarkdownRoot, params) {
66
67
  }],
67
68
  details: { status: "failed" }
68
69
  };
69
- const content = readWorkspaceFile(activeRoot, normalized, MAX_FILE_SIZE).toString("utf8");
70
+ const content = (await readWorkspaceFileAsync(activeRoot, normalized, signal, MAX_FILE_SIZE)).toString("utf8");
70
71
  const offset = Math.max(1, params.offset ?? 1);
71
72
  const lines = content.split("\n");
72
73
  if (offset > lines.length) throw new Error(`Offset ${offset} exceeds ${lines.length} lines`);
@@ -90,6 +91,7 @@ async function executeReadFile(workspace, profileMarkdownRoot, params) {
90
91
  }
91
92
  };
92
93
  } catch (error) {
94
+ signal?.throwIfAborted();
93
95
  return {
94
96
  content: [{
95
97
  type: "text",
@@ -1,5 +1,15 @@
1
- /** Bounded native search; unavailable tools and invalid regexes are explicit failures. */
2
- export declare function repositorySearch(cwd: string, args: string[], signal?: AbortSignal): Promise<{
1
+ export interface RepositorySearchOptions {
2
+ maxBytes?: number;
3
+ onLine?: (line: string) => boolean | void;
4
+ }
5
+ export declare function parseRepositoryMatch(workspace: string, line: string): {
6
+ path: string;
7
+ line: number;
8
+ text: string;
9
+ match: boolean;
10
+ } | undefined;
11
+ /** One bounded process path for raw filename output and streamed JSON events. */
12
+ export declare function repositorySearch(cwd: string, args: string[], signal?: AbortSignal, options?: RepositorySearchOptions): Promise<{
3
13
  output: string;
4
14
  truncated: boolean;
5
15
  }>;