@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.
- package/dist/browser-ext/_locales/en/messages.json +8 -0
- package/dist/browser-ext/_locales/zh_CN/messages.json +8 -0
- package/dist/browser-ext/dist/assets/{sidepanel-BbSQr-6P.css → sidepanel-DD6GEMvc.css} +16 -0
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +537 -96
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-wgSB2HYK.js → activity-store-XKNYlFUI.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dUotwUO6.js → agent-avatar-dicebear-1S2TFECE.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-C6LflMXr.js → agent-defaults-settings-panel-f0-YFMUz.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-VPDIGRSS.js → agents-CPqUMtCL.js} +1 -1
- package/dist/gateway/static/root/assets/{api-BKHmTb0w.js → api-BEUEE4f2.js} +1 -1
- package/dist/gateway/static/root/assets/api-CN4id43t.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-zPz0rOND.js → app-management-settings-panel-CgVBSqzu.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DhvhR43G.js → appearance-settings-CoWdCokb.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-Pmslbzzr.js → apps-page-CexHOcWg.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-BQVZMreT.js → archive-plugin-C3ZA6LRS.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CPE-TMPf.js → attachment-load-CdgS6_zy.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-C4IAy_zF.js → automations-page-BtHL2hpg.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-Fx5VUJRu.js → automations-workspace-onJPfmO6.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DgTl7diZ.js → binary-plugins-CiDhtq_H.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CcOVA-Gw.js → block-editor-Br00T83w.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-BzkJog8e.js → browser-automation-inputs-D2tILykA.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page--zKAgj1k.js → browser-automations-page-BVuEmryB.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-DBms6d35.js → browser-settings-page-BgVTyPFY.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-epdDWIZy.js → capabilities-settings-panel-Dra8wj1S.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-B0bsDtmP.js → channels-settings-CkxiMDJ4.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-B2JwuTjG.js → channels-status-swr-Dtder4G_.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-BfLd2rIJ.js → chat-terminal-dock-JsMtzDao.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-Ckgc0Py-.js → computer-settings-page-DHerePwo.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-BlC1OXX4.js → connector-service-page-DZFNUTiN.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-By33-bF1.js → connectors-page-cl9ZrV4D.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-expression-CqNE-nf6.js → cron-expression-DAhdv_Xv.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BS9ZjzYJ.js → date-picker-PacO1m3a.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CF_zYzxX.js → dependency-picker-B-BcuG1y.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CDwtLR7Z.js → desktop-pet-CdBBhhdY.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-C0djIc1J.js → desktop-pet-settings-Gy03NgMI.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-CDKj9LQj.js → device-pairing-wizard-aV25nKag.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CX5OXxEU.js → extension-debug-page-BFp5eKtY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BytR1PaY.js → extension-page-DL3vyyH6.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CkaMJA5F.js → extension-settings-page-BXtvdAsY.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-B6wHa6ZI.js → gateway-config-swr-xAOGtenO.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-B53R0CA4.js → gateway-realtime-BuaTsMSi.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BG95uGVW.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-_YU-1p0z.js → gateway-settings-Dcr2Ikeh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DRzGnEV-.js → gateway-startup-retry-BwDxKHd4.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-CVIvvm4x.js → heartbeat-settings-DOy3alvT.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-COCHelcL.js → home-page-CDm3dGVy.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-Ck_pyDom.js → image-generation-api-wGMeI_yW.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-DrtbjL8O.js → imports-page-zexFT5Rq.js} +1 -1
- package/dist/gateway/static/root/assets/index-D-vczw_0.css +1 -0
- package/dist/gateway/static/root/assets/{index-CDfcPiPb.js → index-DJo4DimT.js} +47 -47
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BlZh41Xq.js → keyboard-shortcuts-settings-CutG9zLh.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-D7_Raxjw.js → local-app-workbench-page-CwLvTwjn.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-DbP7wWuh.js → local-apps-page-CJy6I7Dt.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-msTfRK8P.js → locale-store-DPZ79W1-.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-C0n66FiO.js → logs-page-egGcPHNi.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-i6GhxpGV.js → management-settings-BQhIOELc.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-BInabSKf.js → markdown-view-p2P5hP1U.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CnWChQ3Y.js → media-plugins-CsBylqlN.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BiYTyLJr.js +3 -0
- package/dist/gateway/static/root/assets/{note-detail-panel-C59d8vDW.js → note-detail-panel-c2k5Uz6X.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-page-C1GBPrVI.js → notes-page-BLQWJMhf.js} +1 -1
- package/dist/gateway/static/root/assets/{page-tabs-BWitjb3e.js → page-tabs-ChQ4jJFs.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-UaCWCxZv.js → preview-open-alternatives-9B5W7nVE.js} +1 -1
- package/dist/gateway/static/root/assets/{proactive-page-CtSFJxoM.js → proactive-page-iOjI0d_e.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-gmi5LLwM.js → product-open-page-BADxWEdP.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-ILTmQ1YN.js → project-detail-page-BcxbQn2M.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-snl4rOQZ.js → projects-page-BuSvld0O.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-BSWtko7U.js → registry-api-B_e_nZSN.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-BbaAcEN3.js → remote-access-hub-CFS8LQKW.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CtOjKGWg.js → runtime-tools-settings-panel-D-pwiIyp.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DkyyDcl2.js → schema-form-IWmb05DX.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-DrWL71O8.js → sessions-page-DZjc__ok.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-C1SM5B93.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C0JDGN_V.js → settings-form-section-B0veRBZs.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DiIyMQ52.js → settings-page-CxRWyWYe.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-EPazhoZO.js → setup-status-panel-D9Rl7Tec.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-Bt1K657Y.js → share-preview-page-CirpgkfD.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-g2MdRXSZ.js → shares-settings-CwCThBs0.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DG6VGbOX.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Wd0uYSPG.js → skills-page-BdRJ2vnL.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-vq5Ujm03.js → skills-page.utils-B42mpWKV.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-Cz1P-HDH.js → system-settings-panel-DXIZpAvU.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-BG3A5gPZ.js → task-detail-page-QXo9LJly.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-1SZ-HFHX.js → theme-store-BFbj_2Tu.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DQGoFuZO.js → tunnel-api-Db2guRdW.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DVDlBb95.js → use-autosave-DDY9qoXZ.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-qM5UiTGx.js → user-model-page-CzPmMkaO.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-B2pZCcxY.js → voice-api-key-field-BZbKQ8HT.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-DgJML_uM.js → voice-config-api-SKCeQLrH.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-Bptv7bEY.js → work-discovery-overlay-BRVTTXNG.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BijCrNc4.js → workflow-run-setup-panel-D2kuwv5e.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DRy1RAYH.js → workflows-page-CQXtiYtq.js} +1 -1
- package/dist/gateway/static/root/index.html +12 -12
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/sessions.js +6 -1
- package/dist/src/agent/agent-manager.js +29 -4
- package/dist/src/agent/child-agent-factory.d.ts +1 -0
- package/dist/src/agent/child-agent-factory.js +18 -4
- package/dist/src/agent/coding/repository-instructions.d.ts +4 -0
- package/dist/src/agent/coding/repository-instructions.js +46 -2
- package/dist/src/agent/data-acquisition/git.d.ts +17 -0
- package/dist/src/agent/data-acquisition/git.js +100 -0
- package/dist/src/agent/data-acquisition/render.d.ts +7 -0
- package/dist/src/agent/data-acquisition/render.js +79 -0
- package/dist/src/agent/data-acquisition/scheduler.d.ts +12 -0
- package/dist/src/agent/data-acquisition/scheduler.js +53 -0
- package/dist/src/agent/data-acquisition/schema.d.ts +75 -0
- package/dist/src/agent/data-acquisition/schema.js +206 -0
- package/dist/src/agent/data-acquisition/service.d.ts +10 -0
- package/dist/src/agent/data-acquisition/service.js +292 -0
- package/dist/src/agent/data-acquisition/types.d.ts +37 -0
- package/dist/src/agent/data-acquisition/types.js +5 -0
- package/dist/src/agent/embedded/run-turn.js +16 -4
- package/dist/src/agent/embedded/session-runner.d.ts +1 -0
- package/dist/src/agent/embedded/session-runner.js +3 -0
- package/dist/src/agent/embedded/tool-result-truncation.js +11 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +2 -1
- package/dist/src/agent/external-tools/composio-provider.js +12 -1
- package/dist/src/agent/external-tools/gateway-tools.js +2 -1
- package/dist/src/agent/external-tools/index.js +8 -1
- package/dist/src/agent/external-tools/read-policy.d.ts +6 -0
- package/dist/src/agent/external-tools/read-policy.js +21 -0
- package/dist/src/agent/external-tools/service.d.ts +1 -0
- package/dist/src/agent/external-tools/service.js +4 -1
- package/dist/src/agent/external-tools/types.d.ts +2 -0
- package/dist/src/agent/orchestration/agent-turn-policy.js +25 -10
- package/dist/src/agent/orchestration/delegation-scope.d.ts +9 -0
- package/dist/src/agent/orchestration/delegation-scope.js +11 -0
- package/dist/src/agent/prompt/sections/tooling.js +3 -1
- package/dist/src/agent/prompt/subagent-context.js +4 -2
- package/dist/src/agent/sandbox/fileAccess.d.ts +2 -0
- package/dist/src/agent/sandbox/fileAccess.js +31 -2
- package/dist/src/agent/tools/dataBatch.d.ts +4 -0
- package/dist/src/agent/tools/dataBatch.js +50 -0
- package/dist/src/agent/tools/delegate-tool.d.ts +6 -3
- package/dist/src/agent/tools/delegate-tool.js +65 -48
- package/dist/src/agent/tools/delegation-parent-policy.d.ts +7 -0
- package/dist/src/agent/tools/delegation-parent-policy.js +41 -0
- package/dist/src/agent/tools/delegation-policy.d.ts +16 -0
- package/dist/src/agent/tools/delegation-policy.js +93 -0
- package/dist/src/agent/tools/factory.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +42 -3
- package/dist/src/agent/tools/fetch-text.d.ts +7 -0
- package/dist/src/agent/tools/fetch-text.js +86 -0
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +11 -23
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/knowledge-memory-tool.js +10 -2
- package/dist/src/agent/tools/read.js +7 -5
- package/dist/src/agent/tools/repository-search.d.ts +12 -2
- package/dist/src/agent/tools/repository-search.js +127 -74
- package/dist/src/agent/tools/web.js +19 -28
- package/dist/src/agent/workflow/subagent-runner.js +25 -3
- package/dist/src/agent/workflow/workflow-child-tools.js +13 -8
- package/dist/src/agent-config/schema.d.ts +7 -0
- package/dist/src/agent-config/schema.js +2 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/schema.d.ts +4 -0
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -0
- package/dist/src/gateway/hono/routes/sessions.js +141 -13
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/186_sidebar_layout.sql +16 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/sidebar-layout-repository.d.ts +12 -0
- package/dist/src/storage/sqlite/sidebar-layout-repository.js +53 -0
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/api-DFOlahZv.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +0 -1
- package/dist/gateway/static/root/assets/index-CRu1p38D.css +0 -1
- package/dist/gateway/static/root/assets/messages-F74LVAiU.js +0 -3
- package/dist/gateway/static/root/assets/settings-advanced-gate-BG0kl4HT.js +0 -1
- 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
|
-
|
|
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: () =>
|
|
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
|
-
]
|
|
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
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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: {
|
|
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: {
|
|
111
|
+
details: {
|
|
112
|
+
id,
|
|
113
|
+
error: "knowledge_not_found"
|
|
114
|
+
}
|
|
107
115
|
};
|
|
108
116
|
}
|
|
109
117
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { checkedFilePath,
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
2
|
-
|
|
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
|
}>;
|