@xopcai/xopc 0.0.122 → 0.0.124
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/README.md +28 -11
- package/README.zh-CN.md +28 -11
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CK3s5cJo.js → agent-avatar-dicebear-B5uSVAyJ.js} +1 -1
- package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CWsNHtTs.js → app-management-settings-panel-CYCONLIL.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C4b8y6iZ.js → appearance-settings-Clw3ryKg.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-DAtNW3Ia.js → archive-plugin-CXUGRp2i.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Dm-RY54y.js → attachment-load-Cmiub3Wg.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-BKHewSVT.js → automation-suggestion-card-CU0-4nQ-.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BG6Xnk71.js → binary-plugins-0Izz-N3p.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DfndiO3h.js → block-editor-C1Kv0IkJ.js} +28 -28
- package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Cx93GLdw.js → capability-presets-api-BmQTM9Il.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-DdPTtEs8.js → channel-recipient-api-BeA2aVor.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +2 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-D835EHJd.js → directory-picker-path-field-2rjzUu57.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-CCa1F7Fg.js → dreaming-settings-DnHO686d.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-W2ITCPSA.js → extension-debug-page-BGLRuWVN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DrvUytvn.js → extension-page-D978ePp9.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-qM8aLT5u.js → extension-settings-page-B6Ih4Swx.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-ovkvM8KQ.js → fetch-BU5S0Sn7.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BB3biuD0.js → gateway-config-api-BIPGwrl1.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CanQ8UcR.js → gateway-startup-retry-Cd0Zz30N.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-CNqNdEkQ.js → goal-create-dialog-B-KHKeXN.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-BBOX6mUl.js → goals-config-api-B95KdGMj.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BP1kfvWv.js → goals-page-BTJzIl28.js} +2 -2
- package/dist/gateway/static/root/assets/{goals-settings-Bh3A7OZV.js → goals-settings-BJyEuLLm.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +1 -0
- package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +1 -0
- package/dist/gateway/static/root/assets/index-c_9TVr_C.js +191 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-B4TKJHla.js → keyboard-shortcuts-settings-BT8T4DyC.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-DcFtdLci.js → markdown-split-Dv66bO2b.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B6SmeLVB.js → media-plugins-BhIQU5yS.js} +1 -1
- package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +2 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-C29O19s7.js → preview-open-alternatives-DGzet1d7.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-B4ad9GfB.js → save-bar-controls-Cqgb-jqa.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-DdYncfLR.js → schedule-field-DVZcI8Yt.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BMTrDE-7.js → schema-form-Bj7sOxC8.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-MwTW2eK4.js → settings-collapsible-section-BmXn-8N6.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Dg6LBbcr.js → settings-form-section-BnqYMWHR.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-BX4T-OLF.js → settings-page-layout-CdWZU1hd.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Ce1pcFtR.js → setup-status-panel-CWtPM7RK.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-DWE-dUFh.js → share-preview-page-IB1v8i86.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Dd6Y35Cm.js → system-settings-panel-BxQ384RC.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-Cx6XV5A2.js → typed-models-lib-BkcpvFYO.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-D4sMbmy7.js → use-channel-catalog-Cd0FaEQ4.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-Bx-hjMQc.js → user-profile-settings-panel-DQ7NnRSY.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D7b_vZnv.js → utils-YKhVf7Ka.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel--TdohF5N.js → workflow-run-setup-panel-BYD9BtOq.js} +2 -2
- package/dist/gateway/static/root/assets/{workflow-start-dialog-B0lavx_o.js → workflow-start-dialog-BNJVCWoS.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +6 -1
- package/dist/src/agent/agent-manager.js +28 -12
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.js +11 -7
- package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
- package/dist/src/agent/lifecycle/progress.js +3 -1
- package/dist/src/agent/lifecycle/progress.js.map +1 -1
- package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +2 -2
- package/dist/src/agent/lifecycle/timeout-wrapper.js +4 -4
- package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
- package/dist/src/agent/memory/summary-generator.d.ts +1 -1
- package/dist/src/agent/memory/summary-generator.js +1 -2
- package/dist/src/agent/memory/summary-generator.js.map +1 -1
- package/dist/src/agent/middleware/index.d.ts +1 -1
- package/dist/src/agent/middleware/self-verify.d.ts +44 -14
- package/dist/src/agent/middleware/self-verify.js +214 -44
- package/dist/src/agent/middleware/self-verify.js.map +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.js +57 -15
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +18 -13
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/system-reminder.js +2 -2
- package/dist/src/agent/prompt/system-reminder.js.map +1 -1
- package/dist/src/agent/sandbox/sanitize-env-vars.d.ts +2 -2
- package/dist/src/agent/sandbox/sanitize-env-vars.js +2 -2
- package/dist/src/agent/sandbox/sanitize-env-vars.js.map +1 -1
- package/dist/src/agent/sandbox/types.d.ts +2 -2
- package/dist/src/agent/sandbox/types.js.map +1 -1
- package/dist/src/agent/service/btw-query.js +1 -1
- package/dist/src/agent/service/btw-query.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js +6 -2
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +12 -7
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.js +2 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/skill-tool-gating.js +1 -1
- package/dist/src/agent/skills/skill-tool-gating.js.map +1 -1
- package/dist/src/agent/starter-agents.js +9 -9
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/apply-patch.d.ts +25 -0
- package/dist/src/agent/tools/apply-patch.js +256 -0
- package/dist/src/agent/tools/apply-patch.js.map +1 -0
- package/dist/src/agent/tools/delegate-tool.d.ts +1 -1
- package/dist/src/agent/tools/delegate-tool.js +3 -3
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/exec-command.d.ts +30 -0
- package/dist/src/agent/tools/exec-command.js +224 -0
- package/dist/src/agent/tools/exec-command.js.map +1 -0
- package/dist/src/agent/tools/execute-code-tool.js +7 -4
- package/dist/src/agent/tools/execute-code-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -3
- package/dist/src/agent/tools/factory.js +8 -9
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.d.ts +5 -1
- package/dist/src/agent/tools/goal-tool.js +8 -2
- package/dist/src/agent/tools/goal-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +4 -3
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/skills-tools.d.ts +1 -1
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/update-plan-tool.d.ts +11 -0
- package/dist/src/agent/tools/update-plan-tool.js +72 -0
- package/dist/src/agent/tools/update-plan-tool.js.map +1 -0
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
- package/dist/src/agent/workflow/step-labels.js +7 -3
- package/dist/src/agent/workflow/step-labels.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/chat-commands/builtins/goal.js +4 -1
- package/dist/src/chat-commands/builtins/goal.js.map +1 -1
- package/dist/src/chat-commands/builtins/review.d.ts +1 -0
- package/dist/src/chat-commands/builtins/review.js +167 -0
- package/dist/src/chat-commands/builtins/review.js.map +1 -0
- package/dist/src/chat-commands/index.d.ts +1 -0
- package/dist/src/chat-commands/index.js +3 -1
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +3 -2
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +6 -0
- package/dist/src/gateway/chat-stream/mapper.js +149 -6
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +51 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +21 -0
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +1 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +136 -14
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/search.d.ts +3 -0
- package/dist/src/gateway/hono/routes/search.js +47 -0
- package/dist/src/gateway/hono/routes/search.js.map +1 -0
- package/dist/src/gateway/security/dangerous-tools.js +1 -1
- package/dist/src/gateway/security/dangerous-tools.js.map +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/projects/index.d.ts +3 -0
- package/dist/src/projects/index.js +4 -1
- package/dist/src/projects/project-agent-suggestion.d.ts +14 -0
- package/dist/src/projects/project-agent-suggestion.js +19 -0
- package/dist/src/projects/project-agent-suggestion.js.map +1 -0
- package/dist/src/projects/project-kind.d.ts +13 -0
- package/dist/src/projects/project-kind.js +147 -0
- package/dist/src/projects/project-kind.js.map +1 -0
- package/dist/src/projects/project-service.d.ts +15 -0
- package/dist/src/projects/project-service.js +96 -3
- package/dist/src/projects/project-service.js.map +1 -1
- package/dist/src/projects/project-store.js +32 -8
- package/dist/src/projects/project-store.js.map +1 -1
- package/dist/src/projects/types.d.ts +4 -1
- package/dist/src/projects/workspace-project.d.ts +22 -0
- package/dist/src/projects/workspace-project.js +143 -0
- package/dist/src/projects/workspace-project.js.map +1 -0
- package/dist/src/review/review-git.d.ts +48 -0
- package/dist/src/review/review-git.js +333 -0
- package/dist/src/review/review-git.js.map +1 -0
- package/dist/src/review/review-types.d.ts +22 -0
- package/dist/src/review/review-types.js +29 -0
- package/dist/src/review/review-types.js.map +1 -0
- package/dist/src/session/session-context-for-llm.js +151 -0
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/021_projects_fts.sql +21 -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/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +8 -1
- package/dist/src/tui/backends/embedded-backend.js +60 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +9 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +29 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/components/assistant-message.js +35 -0
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/tui-agent-events.js +25 -0
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +20 -0
- package/dist/src/tui/tui-commands.d.ts +1 -0
- package/dist/src/tui/tui-commands.js +110 -4
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +2 -0
- package/dist/src/tui/tui-picker-overlay.js +153 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui.js +36 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agents-SsQrj9B-.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-CYb6fame.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-DpOOq1nk.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-9nXxgh4u.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-D528_YFy.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-Ck-3h5lI.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DL-fAqE_.js +0 -2
- package/dist/gateway/static/root/assets/gateway-settings-mmmnIH27.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-Ceu5zrN6.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-YoYgKlfX.js +0 -1
- package/dist/gateway/static/root/assets/index-DdqSO9R2.js +0 -191
- package/dist/gateway/static/root/assets/index-jGB-2nI-.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-BgVk5DvZ.js +0 -2
- package/dist/gateway/static/root/assets/messages-B5O4OIEo.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BU0x8PGP.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-D6JYVP4I.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-mqRJYnJS.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-DOTgzoeh.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DGUIb4y5.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DVKKUj3u.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BVbzUWxW.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DrNNoSqE.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CMDqgeMR.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-aKSraR8l.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CS-FU_B-.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BaF3u0LA.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-CkhbRt1q.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-CZR05Bu_.js +0 -18
- package/dist/src/agent/tools/edit.d.ts +0 -14
- package/dist/src/agent/tools/edit.js +0 -132
- package/dist/src/agent/tools/edit.js.map +0 -1
- package/dist/src/agent/tools/shell.d.ts +0 -15
- package/dist/src/agent/tools/shell.js +0 -158
- package/dist/src/agent/tools/shell.js.map +0 -1
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { evaluateExecPolicy } from "../sandbox/exec-policy.js";
|
|
2
|
-
import { spawn } from "child_process";
|
|
3
|
-
import { Type } from "@sinclair/typebox";
|
|
4
|
-
//#region src/agent/tools/shell.ts
|
|
5
|
-
const MAX_SHELL_TIMEOUT = 300;
|
|
6
|
-
const DEFAULT_MAX_BYTES = 50 * 1024;
|
|
7
|
-
const DEFAULT_MAX_LINES = 2e3;
|
|
8
|
-
const ShellSchema = Type.Object({ command: Type.String({ description: "Shell command to execute" }) });
|
|
9
|
-
function formatSize(bytes) {
|
|
10
|
-
if (bytes < 1024) return `${bytes}B`;
|
|
11
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
|
|
12
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
13
|
-
}
|
|
14
|
-
function isLikelyTestCommand(command) {
|
|
15
|
-
return /\b(test|vitest|jest|pytest|go test|cargo test|npm test|pnpm test|yarn test)\b/i.test(command);
|
|
16
|
-
}
|
|
17
|
-
function truncateTail(content, maxLines = DEFAULT_MAX_LINES, maxBytes = DEFAULT_MAX_BYTES) {
|
|
18
|
-
const totalBytes = Buffer.byteLength(content, "utf-8");
|
|
19
|
-
const lines = content.split("\n");
|
|
20
|
-
const totalLines = lines.length;
|
|
21
|
-
if (totalLines <= maxLines && totalBytes <= maxBytes) return {
|
|
22
|
-
content,
|
|
23
|
-
truncated: false,
|
|
24
|
-
truncatedBy: null,
|
|
25
|
-
totalLines,
|
|
26
|
-
totalBytes,
|
|
27
|
-
outputLines: totalLines,
|
|
28
|
-
outputBytes: totalBytes
|
|
29
|
-
};
|
|
30
|
-
const outputLinesArr = [];
|
|
31
|
-
let outputBytesCount = 0;
|
|
32
|
-
let truncatedBy = "lines";
|
|
33
|
-
for (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) {
|
|
34
|
-
const line = lines[i];
|
|
35
|
-
const lineBytes = Buffer.byteLength(line, "utf-8") + (outputLinesArr.length > 0 ? 1 : 0);
|
|
36
|
-
if (outputBytesCount + lineBytes > maxBytes) {
|
|
37
|
-
truncatedBy = "bytes";
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
outputLinesArr.unshift(line);
|
|
41
|
-
outputBytesCount += lineBytes;
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
content: outputLinesArr.join("\n"),
|
|
45
|
-
truncated: true,
|
|
46
|
-
truncatedBy,
|
|
47
|
-
totalLines,
|
|
48
|
-
totalBytes,
|
|
49
|
-
outputLines: outputLinesArr.length,
|
|
50
|
-
outputBytes: outputBytesCount
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function createShellTool(cwd, options) {
|
|
54
|
-
return {
|
|
55
|
-
name: "shell",
|
|
56
|
-
description: "Execute shell command.",
|
|
57
|
-
parameters: ShellSchema,
|
|
58
|
-
label: "💻 Shell",
|
|
59
|
-
async execute(toolCallId, params, _signal) {
|
|
60
|
-
const p = params;
|
|
61
|
-
const passthroughNames = options?.getSkillPassthroughEnvVarNames?.() ?? [];
|
|
62
|
-
const policy = evaluateExecPolicy({
|
|
63
|
-
command: p.command,
|
|
64
|
-
cwd,
|
|
65
|
-
allowedEnvVars: passthroughNames
|
|
66
|
-
});
|
|
67
|
-
if (!policy.allowed) return {
|
|
68
|
-
content: [{
|
|
69
|
-
type: "text",
|
|
70
|
-
text: `🚫 Sandbox: ${policy.reason}`
|
|
71
|
-
}],
|
|
72
|
-
details: {
|
|
73
|
-
exitCode: null,
|
|
74
|
-
timedOut: false,
|
|
75
|
-
truncated: false
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return new Promise((resolve) => {
|
|
79
|
-
let output = "";
|
|
80
|
-
let errorOutput = "";
|
|
81
|
-
let timedOut = false;
|
|
82
|
-
let tempStream = null;
|
|
83
|
-
const effectiveTimeoutSec = Math.min(MAX_SHELL_TIMEOUT, Math.ceil(policy.timeoutMs / 1e3));
|
|
84
|
-
const timeout = setTimeout(() => {
|
|
85
|
-
timedOut = true;
|
|
86
|
-
proc.kill("SIGKILL");
|
|
87
|
-
}, effectiveTimeoutSec * 1e3);
|
|
88
|
-
const proc = spawn(p.command, [], {
|
|
89
|
-
shell: true,
|
|
90
|
-
cwd: policy.effectiveCwd,
|
|
91
|
-
env: {
|
|
92
|
-
...policy.sanitizedEnv,
|
|
93
|
-
COLUMNS: "200"
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
proc.stdout?.on("data", (data) => {
|
|
97
|
-
const text = data.toString();
|
|
98
|
-
output += text;
|
|
99
|
-
});
|
|
100
|
-
proc.stderr?.on("data", (data) => {
|
|
101
|
-
const text = data.toString();
|
|
102
|
-
errorOutput += text;
|
|
103
|
-
});
|
|
104
|
-
proc.on("close", (code) => {
|
|
105
|
-
clearTimeout(timeout);
|
|
106
|
-
tempStream?.end();
|
|
107
|
-
const truncation = truncateTail(errorOutput + output);
|
|
108
|
-
let resultText = truncation.content;
|
|
109
|
-
if (timedOut) resultText = `⏱️ Command timed out after ${MAX_SHELL_TIMEOUT}s\n` + resultText;
|
|
110
|
-
if (truncation.truncated) resultText += `\n\n[Output truncated: ${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)}]`;
|
|
111
|
-
const result = {
|
|
112
|
-
content: [{
|
|
113
|
-
type: "text",
|
|
114
|
-
text: resultText
|
|
115
|
-
}],
|
|
116
|
-
details: {
|
|
117
|
-
exitCode: code,
|
|
118
|
-
timedOut,
|
|
119
|
-
truncated: truncation.truncated,
|
|
120
|
-
truncatedBy: truncation.truncatedBy,
|
|
121
|
-
outputBytes: truncation.outputBytes
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
Promise.resolve(options?.recordGoalEvidence?.({
|
|
125
|
-
kind: timedOut || code !== 0 ? "command" : isLikelyTestCommand(p.command) ? "test" : "command",
|
|
126
|
-
title: `Command: ${p.command.slice(0, 120)}`,
|
|
127
|
-
summary: resultText.slice(0, 2e3),
|
|
128
|
-
data: {
|
|
129
|
-
command: p.command,
|
|
130
|
-
exitCode: code,
|
|
131
|
-
timedOut,
|
|
132
|
-
truncated: truncation.truncated,
|
|
133
|
-
outputBytes: truncation.outputBytes
|
|
134
|
-
}
|
|
135
|
-
})).finally(() => resolve(result));
|
|
136
|
-
});
|
|
137
|
-
proc.on("error", (err) => {
|
|
138
|
-
clearTimeout(timeout);
|
|
139
|
-
resolve({
|
|
140
|
-
content: [{
|
|
141
|
-
type: "text",
|
|
142
|
-
text: `Error: ${err.message}`
|
|
143
|
-
}],
|
|
144
|
-
details: {
|
|
145
|
-
exitCode: null,
|
|
146
|
-
timedOut: false,
|
|
147
|
-
truncated: false
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
//#endregion
|
|
156
|
-
export { createShellTool };
|
|
157
|
-
|
|
158
|
-
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","names":[],"sources":["../../../../src/agent/tools/shell.ts"],"sourcesContent":["// Shell tool - executes commands with output truncation\nimport { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\nimport { spawn } from 'child_process';\nimport { evaluateExecPolicy } from '../sandbox/exec-policy.js';\nimport { createWriteStream } from 'fs';\nimport type { GoalEvidenceRecordInput } from './goal-evidence-recorder.js';\n\nconst MAX_SHELL_TIMEOUT = 300;\nconst DEFAULT_MAX_BYTES = 50 * 1024;\nconst DEFAULT_MAX_LINES = 2000;\n\nconst ShellSchema = Type.Object({\n command: Type.String({ description: 'Shell command to execute' }),\n});\n\nexport interface ShellDetails {\n exitCode: number | null;\n timedOut: boolean;\n truncated: boolean;\n truncatedBy?: 'lines' | 'bytes';\n outputBytes?: number;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction isLikelyTestCommand(command: string): boolean {\n return /\\b(test|vitest|jest|pytest|go test|cargo test|npm test|pnpm test|yarn test)\\b/i.test(command);\n}\n\nfunction truncateTail(content: string, maxLines = DEFAULT_MAX_LINES, maxBytes = DEFAULT_MAX_BYTES) {\n const totalBytes = Buffer.byteLength(content, 'utf-8');\n const lines = content.split('\\n');\n const totalLines = lines.length;\n\n if (totalLines <= maxLines && totalBytes <= maxBytes) {\n return { content, truncated: false, truncatedBy: null, totalLines, totalBytes, outputLines: totalLines, outputBytes: totalBytes };\n }\n\n const outputLinesArr: string[] = [];\n let outputBytesCount = 0;\n let truncatedBy: 'lines' | 'bytes' = 'lines';\n\n for (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, 'utf-8') + (outputLinesArr.length > 0 ? 1 : 0);\n\n if (outputBytesCount + lineBytes > maxBytes) {\n truncatedBy = 'bytes';\n break;\n }\n\n outputLinesArr.unshift(line);\n outputBytesCount += lineBytes;\n }\n\n return { content: outputLinesArr.join('\\n'), truncated: true, truncatedBy, totalLines, totalBytes, outputLines: outputLinesArr.length, outputBytes: outputBytesCount };\n}\n\nexport interface CreateShellToolOptions {\n /** Env var names allowed through {@link prepareSafeToolEnv} even if they match secret heuristics (skill passthrough). */\n getSkillPassthroughEnvVarNames?: () => string[];\n recordGoalEvidence?: (input: GoalEvidenceRecordInput) => Promise<void> | void;\n}\n\nexport function createShellTool(\n cwd: string,\n options?: CreateShellToolOptions,\n): AgentTool {\n return {\n name: 'shell',\n description: 'Execute shell command.',\n parameters: ShellSchema,\n label: '💻 Shell',\n\n async execute(\n toolCallId: string,\n params: any,\n _signal?: AbortSignal,\n ): Promise<AgentToolResult<ShellDetails>> {\n const p = params as { command: string };\n\n // Sandbox exec-policy check (path + command injection + env sanitization)\n const passthroughNames = options?.getSkillPassthroughEnvVarNames?.() ?? [];\n const policy = evaluateExecPolicy({\n command: p.command,\n cwd,\n allowedEnvVars: passthroughNames,\n });\n if (!policy.allowed) {\n return {\n content: [{ type: 'text', text: `🚫 Sandbox: ${policy.reason}` }],\n details: { exitCode: null, timedOut: false, truncated: false },\n };\n }\n\n return new Promise((resolve) => {\n const _startTime = Date.now();\n let output = '';\n let errorOutput = '';\n let timedOut = false;\n let _tempFile: string | null = null;\n let tempStream: ReturnType<typeof createWriteStream> | null = null;\n const useTempFile = false; // Disabled - stream directly\n\n const effectiveTimeoutSec = Math.min(\n MAX_SHELL_TIMEOUT,\n Math.ceil(policy.timeoutMs / 1000),\n );\n const timeout = setTimeout(() => {\n timedOut = true;\n proc.kill('SIGKILL');\n }, effectiveTimeoutSec * 1000);\n\n const proc = spawn(p.command, [], {\n shell: true,\n cwd: policy.effectiveCwd,\n env: {\n ...policy.sanitizedEnv,\n COLUMNS: '200',\n },\n });\n\n proc.stdout?.on('data', (data) => {\n const text = data.toString();\n if (!useTempFile) output += text;\n });\n\n proc.stderr?.on('data', (data) => {\n const text = data.toString();\n errorOutput += text;\n });\n\n proc.on('close', (code) => {\n clearTimeout(timeout);\n tempStream?.end();\n\n const fullOutput = errorOutput + output;\n const truncation = truncateTail(fullOutput);\n\n let resultText = truncation.content;\n if (timedOut) {\n resultText = `⏱️ Command timed out after ${MAX_SHELL_TIMEOUT}s\\n` + resultText;\n }\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: ${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)}]`;\n }\n\n const result: AgentToolResult<ShellDetails> = {\n content: [{ type: 'text', text: resultText }],\n details: {\n exitCode: code,\n timedOut,\n truncated: truncation.truncated,\n truncatedBy: truncation.truncatedBy,\n outputBytes: truncation.outputBytes,\n },\n };\n void Promise.resolve(options?.recordGoalEvidence?.({\n kind: timedOut || code !== 0 ? 'command' : isLikelyTestCommand(p.command) ? 'test' : 'command',\n title: `Command: ${p.command.slice(0, 120)}`,\n summary: resultText.slice(0, 2000),\n data: {\n command: p.command,\n exitCode: code,\n timedOut,\n truncated: truncation.truncated,\n outputBytes: truncation.outputBytes,\n },\n })).finally(() => resolve(result));\n });\n\n proc.on('error', (err) => {\n clearTimeout(timeout);\n resolve({\n content: [{ type: 'text', text: `Error: ${err.message}` }],\n details: { exitCode: null, timedOut: false, truncated: false },\n });\n });\n });\n },\n } as any;\n}\n"],"mappings":";;;;AAQA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB,KAAK;AAC/B,MAAM,oBAAoB;AAE1B,MAAM,cAAc,KAAK,OAAO,EAC9B,SAAS,KAAK,OAAO,EAAE,aAAa,4BAA4B,CAAC,EAClE,CAAC;AAUF,SAAS,WAAW,OAAuB;AACzC,KAAI,QAAQ,KAAM,QAAO,GAAG,MAAM;AAClC,KAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAC7D,QAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;;AAG/C,SAAS,oBAAoB,SAA0B;AACrD,QAAO,iFAAiF,KAAK,QAAQ;;AAGvG,SAAS,aAAa,SAAiB,WAAW,mBAAmB,WAAW,mBAAmB;CACjG,MAAM,aAAa,OAAO,WAAW,SAAS,QAAQ;CACtD,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,aAAa,MAAM;AAEzB,KAAI,cAAc,YAAY,cAAc,SAC1C,QAAO;EAAE;EAAS,WAAW;EAAO,aAAa;EAAM;EAAY;EAAY,aAAa;EAAY,aAAa;EAAY;CAGnI,MAAM,iBAA2B,EAAE;CACnC,IAAI,mBAAmB;CACvB,IAAI,cAAiC;AAErC,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,KAAK,eAAe,SAAS,UAAU,KAAK;EAC9E,MAAM,OAAO,MAAM;EACnB,MAAM,YAAY,OAAO,WAAW,MAAM,QAAQ,IAAI,eAAe,SAAS,IAAI,IAAI;AAEtF,MAAI,mBAAmB,YAAY,UAAU;AAC3C,iBAAc;AACd;;AAGF,iBAAe,QAAQ,KAAK;AAC5B,sBAAoB;;AAGtB,QAAO;EAAE,SAAS,eAAe,KAAK,KAAK;EAAE,WAAW;EAAM;EAAa;EAAY;EAAY,aAAa,eAAe;EAAQ,aAAa;EAAkB;;AASxK,SAAgB,gBACd,KACA,SACW;AACX,QAAO;EACL,MAAM;EACN,aAAa;EACb,YAAY;EACZ,OAAO;EAEP,MAAM,QACJ,YACA,QACA,SACwC;GACxC,MAAM,IAAI;GAGV,MAAM,mBAAmB,SAAS,kCAAkC,IAAI,EAAE;GAC1E,MAAM,SAAS,mBAAmB;IAChC,SAAS,EAAE;IACX;IACA,gBAAgB;IACjB,CAAC;AACF,OAAI,CAAC,OAAO,QACV,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM,eAAe,OAAO;KAAU,CAAC;IACjE,SAAS;KAAE,UAAU;KAAM,UAAU;KAAO,WAAW;KAAO;IAC/D;AAGH,UAAO,IAAI,SAAS,YAAY;IAE9B,IAAI,SAAS;IACb,IAAI,cAAc;IAClB,IAAI,WAAW;IAEf,IAAI,aAA0D;IAG9D,MAAM,sBAAsB,KAAK,IAC/B,mBACA,KAAK,KAAK,OAAO,YAAY,IAAK,CACnC;IACD,MAAM,UAAU,iBAAiB;AAC/B,gBAAW;AACX,UAAK,KAAK,UAAU;OACnB,sBAAsB,IAAK;IAE9B,MAAM,OAAO,MAAM,EAAE,SAAS,EAAE,EAAE;KAChC,OAAO;KACP,KAAK,OAAO;KACZ,KAAK;MACH,GAAG,OAAO;MACV,SAAS;MACV;KACF,CAAC;AAEF,SAAK,QAAQ,GAAG,SAAS,SAAS;KAChC,MAAM,OAAO,KAAK,UAAU;AACV,eAAU;MAC5B;AAEF,SAAK,QAAQ,GAAG,SAAS,SAAS;KAChC,MAAM,OAAO,KAAK,UAAU;AAC5B,oBAAe;MACf;AAEF,SAAK,GAAG,UAAU,SAAS;AACzB,kBAAa,QAAQ;AACrB,iBAAY,KAAK;KAGjB,MAAM,aAAa,aADA,cAAc,OACU;KAE3C,IAAI,aAAa,WAAW;AAC5B,SAAI,SACF,cAAa,8BAA8B,kBAAkB,OAAO;AAEtE,SAAI,WAAW,UACb,eAAc,0BAA0B,WAAW,WAAW,YAAY,CAAC,MAAM,WAAW,WAAW,WAAW,CAAC;KAGrH,MAAM,SAAwC;MAC5C,SAAS,CAAC;OAAE,MAAM;OAAQ,MAAM;OAAY,CAAC;MAC7C,SAAS;OACP,UAAU;OACV;OACA,WAAW,WAAW;OACtB,aAAa,WAAW;OACxB,aAAa,WAAW;OACzB;MACF;AACI,aAAQ,QAAQ,SAAS,qBAAqB;MACjD,MAAM,YAAY,SAAS,IAAI,YAAY,oBAAoB,EAAE,QAAQ,GAAG,SAAS;MACrF,OAAO,YAAY,EAAE,QAAQ,MAAM,GAAG,IAAI;MAC1C,SAAS,WAAW,MAAM,GAAG,IAAK;MAClC,MAAM;OACJ,SAAS,EAAE;OACX,UAAU;OACV;OACA,WAAW,WAAW;OACtB,aAAa,WAAW;OACzB;MACF,CAAC,CAAC,CAAC,cAAc,QAAQ,OAAO,CAAC;MAClC;AAEF,SAAK,GAAG,UAAU,QAAQ;AACxB,kBAAa,QAAQ;AACrB,aAAQ;MACN,SAAS,CAAC;OAAE,MAAM;OAAQ,MAAM,UAAU,IAAI;OAAW,CAAC;MAC1D,SAAS;OAAE,UAAU;OAAM,UAAU;OAAO,WAAW;OAAO;MAC/D,CAAC;MACF;KACF;;EAEL"}
|