@xopcai/xopc 0.0.126 → 0.0.128
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/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C70vgt60.js → agent-avatar-dicebear-Dx3HQkOk.js} +1 -1
- package/dist/gateway/static/root/assets/agents-Ceb_WmSZ.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-DGtoXVvI.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-BHlahIDL.js → appearance-settings-BQQf_iLu.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-D05daQF8.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-B-aoIt0w.js → archive-plugin-HuCFa2UL.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BD0G0FD5.js → attachment-load-N3csiRso.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-iJRVI7aZ.js → automation-suggestion-card-DeYEW2YQ.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Dxn5-hGx.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B0mNlVSz.js → binary-plugins-DnJO0VG7.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CJY9Lu5G.js → block-editor-DOAZkqfs.js} +27 -27
- package/dist/gateway/static/root/assets/browser-settings-page-DSB-ZKIX.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-DRCu-s6d.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-M7jOJxZX.js +1 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-BrW5Kcgc.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-C1iggCG3.js +1 -0
- package/dist/gateway/static/root/assets/{code-editor-gbRgS14t.js → code-editor--tMO38Tr.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-Df0TJNgv.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-MnqKnEgd.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-settings-PRnTI9no.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-sprite-DqZ6fbIj.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-DJNFtSWq.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-D0_2JavX.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BbyczVZ3.js → extension-debug-page-C4sQuETO.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DLN1I3DR.js → extension-page-DhnpWAUJ.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-D7JDxFGh.js +1 -0
- package/dist/gateway/static/root/assets/fetch-BMjlW0g1.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-B_VyPdKh.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-C0TutwM5.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DEMad2wt.js → gateway-startup-retry-CY5W2Pp4.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-DrDGK2L5.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-aaIMRRor.js +4 -0
- package/dist/gateway/static/root/assets/goals-config-api-CzTu01a1.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-CBfCPiNK.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-4rKUC3EH.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DqJBKlza.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-DV90ddkE.js → html-workspace-editor-COqmtESs.js} +1 -1
- package/dist/gateway/static/root/assets/index-38TSE7ng.js +257 -0
- package/dist/gateway/static/root/assets/index-EKmpPvZj.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-lKTg6St7.js → keyboard-shortcuts-settings-ClVhEihC.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-J8fw1O8x.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-editor-BFOjBBla.js → markdown-editor-jD1LPiP-.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-Bv4k6iGJ.js → markdown-split-DQYDAL4r.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Bbi8g3N8.js → media-plugins-o5fchHfb.js} +1 -1
- package/dist/gateway/static/root/assets/messages-YzjnURPJ.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-D9csuY5T.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CeWoUGI-.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-D_oaF0Pq.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-Cp395RYD.js → page-tabs-u0u41Gxz.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DqV5OM4m.js → preview-open-alternatives-BaYRX55y.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-dkHzwhDL.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DBp2WExF.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Cgzg4pNN.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BItmzAzI.js → save-bar-controls-8ebg7PIX.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BQ8IjjCn.js → schedule-field-Cd7FPvsJ.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BRpD6x3d.js → schema-form-Bq9iqPeA.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-vkORZvUB.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BFJsnSvx.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BKSPQM4R.js → settings-collapsible-section-DaVKl6I7.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BmyfthNQ.js → settings-form-section-C92Shabe.js} +1 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-EJwzElLr.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-BLY6onMK.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-Bls5tfbH.js → settings-page-layout-dTbdUfAB.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BU0JUWIA.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-SgKIyNQ7.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-aiY_QGsl.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C44tGvK7.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C1re61FQ.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-DKDAojWM.js → system-settings-panel-CntJCZEg.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BCCV4Kkp.js → typed-models-lib-CjULd6SF.js} +1 -1
- package/dist/gateway/static/root/assets/url-DFGNSBNT.js +1 -0
- package/dist/gateway/static/root/assets/use-channel-catalog-CPdJ0o0i.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-DBgcbZfp.js +1 -0
- package/dist/gateway/static/root/assets/{utils-DPGVr3tS.js → utils-icmWvHl6.js} +1 -1
- package/dist/gateway/static/root/assets/vendor-codemirror-C1WKjCk5.js +45 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-BfvNUIWI.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-BYvZjBuJ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BTkRVNAh.js → workflow-run-setup-panel-DMXd1znx.js} +2 -2
- package/dist/gateway/static/root/assets/{workflow-start-dialog-DAImVtdO.js → workflow-start-dialog-Dff4IHzz.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-0-640fQi.js +18 -0
- package/dist/gateway/static/root/index.html +7 -6
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +5 -0
- package/dist/src/agent/agent-manager.d.ts +17 -0
- package/dist/src/agent/agent-manager.js +125 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/capabilities/definitions.d.ts +167 -0
- package/dist/src/agent/capabilities/definitions.js +175 -0
- package/dist/src/agent/capabilities/definitions.js.map +1 -0
- package/dist/src/agent/capabilities/index.d.ts +2 -0
- package/dist/src/agent/capabilities/index.js +3 -0
- package/dist/src/agent/capabilities/registry.d.ts +10 -0
- package/dist/src/agent/capabilities/registry.js +51 -0
- package/dist/src/agent/capabilities/registry.js.map +1 -0
- package/dist/src/agent/goals/post-turn.js +23 -2
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +4 -0
- package/dist/src/agent/messaging/command-handler.js +6 -0
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js +5 -3
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +4 -3
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -0
- package/dist/src/agent/service.js +26 -0
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/hub-lock.d.ts +5 -5
- package/dist/src/agent/skills/hub-lock.js +12 -12
- package/dist/src/agent/skills/hub-lock.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.d.ts +15 -0
- package/dist/src/agent/skills/hub-pull.js +299 -24
- package/dist/src/agent/skills/hub-pull.js.map +1 -1
- package/dist/src/agent/skills/index.js +4 -40
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/install-target.d.ts +3 -0
- package/dist/src/agent/skills/install-target.js +11 -0
- package/dist/src/agent/skills/install-target.js.map +1 -0
- package/dist/src/agent/skills/managed-store.d.ts +5 -3
- package/dist/src/agent/skills/managed-store.js +10 -9
- package/dist/src/agent/skills/managed-store.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +5 -3
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +21 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +62 -6
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +1 -1
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -1
- package/dist/src/agent/skills/parse-skill-metadata.js +9 -1
- package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -0
- package/dist/src/agent/skills/skill-manager.js +18 -6
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +5 -0
- package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
- package/dist/src/agent/skills/workspace-skills-dir.js +5 -1
- package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -1
- package/dist/src/agent/tools/automation-tool.d.ts +6 -6
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +20 -20
- package/dist/src/agent/tools/composio-tool.d.ts +3 -3
- package/dist/src/agent/tools/desktop-pet-tool.d.ts +24 -0
- package/dist/src/agent/tools/desktop-pet-tool.js +90 -0
- package/dist/src/agent/tools/desktop-pet-tool.js.map +1 -0
- package/dist/src/agent/tools/factory.d.ts +5 -0
- package/dist/src/agent/tools/factory.js +22 -0
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.d.ts +16 -16
- package/dist/src/agent/tools/index.d.ts +2 -0
- package/dist/src/agent/tools/index.js +3 -1
- package/dist/src/agent/tools/skill-install-tool.d.ts +28 -0
- package/dist/src/agent/tools/skill-install-tool.js +81 -0
- package/dist/src/agent/tools/skill-install-tool.js.map +1 -0
- package/dist/src/agent/tools/skill-manage-tool.js +3 -6
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +2 -2
- package/dist/src/agent/tools/xopc-use-tool.d.ts +5 -5
- package/dist/src/automations/domain/types.d.ts +1 -0
- package/dist/src/automations/service/automation-service.js +9 -0
- package/dist/src/automations/service/automation-service.js.map +1 -1
- package/dist/src/browser/schemas.d.ts +52 -52
- package/dist/src/capabilities/store-connector.d.ts +17 -0
- package/dist/src/capabilities/store-connector.js +191 -0
- package/dist/src/capabilities/store-connector.js.map +1 -0
- package/dist/src/chat-commands/builtins/skill.d.ts +1 -0
- package/dist/src/chat-commands/builtins/skill.js +132 -0
- package/dist/src/chat-commands/builtins/skill.js.map +1 -0
- package/dist/src/chat-commands/context.d.ts +3 -0
- package/dist/src/chat-commands/context.js +2 -0
- package/dist/src/chat-commands/context.js.map +1 -1
- 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/chat-commands/types.d.ts +17 -0
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +4 -0
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/connectors.d.ts +4 -0
- package/dist/src/cli/commands/connectors.js +96 -0
- package/dist/src/cli/commands/connectors.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/skills.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/schema.js +2 -2
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/install.js +3 -1
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/materialize.js +2 -0
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/types.d.ts +19 -1
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/extensions/types/manifest.d.ts +1 -1
- package/dist/src/extensions/update.js +5 -3
- package/dist/src/extensions/update.js.map +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -0
- 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.js +5 -1
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/middleware/auth.d.ts +2 -2
- package/dist/src/gateway/hono/middleware/logger.d.ts +1 -1
- package/dist/src/gateway/hono/middleware/route-errors.d.ts +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +2 -2
- package/dist/src/gateway/hono/routes/capabilities.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capabilities.js +79 -0
- package/dist/src/gateway/hono/routes/capabilities.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +88 -3
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +2 -2
- package/dist/src/gateway/hono/routes/goals.js +212 -3
- package/dist/src/gateway/hono/routes/goals.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 +10 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/mobile.d.ts +3 -0
- package/dist/src/gateway/hono/routes/mobile.js +113 -0
- package/dist/src/gateway/hono/routes/mobile.js.map +1 -0
- package/dist/src/gateway/hono/routes/projects.js +45 -0
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +4 -1
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +3 -3
- package/dist/src/gateway/service/marketplace-service.d.ts +23 -1
- package/dist/src/gateway/service/marketplace-service.js +57 -6
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +6 -2
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +12 -2
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-contract-draft.d.ts +15 -0
- package/dist/src/goals/goal-contract-draft.js +114 -0
- package/dist/src/goals/goal-contract-draft.js.map +1 -0
- package/dist/src/goals/goal-evidence-review.d.ts +15 -0
- package/dist/src/goals/goal-evidence-review.js +91 -0
- package/dist/src/goals/goal-evidence-review.js.map +1 -0
- package/dist/src/goals/goal-runner.js +3 -1
- package/dist/src/goals/goal-runner.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +17 -1
- package/dist/src/goals/goal-service.js +44 -3
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +18 -1
- package/dist/src/goals/goal-store.js +190 -1
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/index.d.ts +4 -0
- package/dist/src/goals/index.js +3 -1
- package/dist/src/goals/types.d.ts +42 -0
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/mobile/notification-service.d.ts +8 -0
- package/dist/src/mobile/notification-service.js +139 -0
- package/dist/src/mobile/notification-service.js.map +1 -0
- package/dist/src/mobile/notification-store.d.ts +28 -0
- package/dist/src/mobile/notification-store.js +134 -0
- package/dist/src/mobile/notification-store.js.map +1 -0
- package/dist/src/mobile/notification-types.d.ts +37 -0
- package/dist/src/mobile/notification-types.js +11 -0
- package/dist/src/mobile/notification-types.js.map +1 -0
- package/dist/src/pets/factory.d.ts +25 -0
- package/dist/src/pets/factory.js +327 -0
- package/dist/src/pets/factory.js.map +1 -0
- package/dist/src/pets/manifest.d.ts +2 -0
- package/dist/src/pets/manifest.js +16 -0
- package/dist/src/pets/manifest.js.map +1 -0
- package/dist/src/pets/validator.d.ts +12 -0
- package/dist/src/pets/validator.js +175 -0
- package/dist/src/pets/validator.js.map +1 -0
- package/dist/src/projects/project-service.d.ts +2 -0
- package/dist/src/projects/project-service.js +6 -0
- package/dist/src/projects/project-service.js.map +1 -1
- package/dist/src/projects/project-store.d.ts +1 -0
- package/dist/src/projects/project-store.js +14 -7
- package/dist/src/projects/project-store.js.map +1 -1
- package/dist/src/projects/types.d.ts +2 -0
- package/dist/src/session/session-title.js +22 -2
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/025_project_pinned_at.sql +5 -0
- package/dist/src/storage/sqlite/migrations/026_goal_contracts.sql +10 -0
- package/dist/src/storage/sqlite/migrations/027_mobile_notifications.sql +43 -0
- package/dist/src/storage/sqlite/migrations/028_goal_evidence_requirements.sql +47 -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/storage/sqlite/schema.sql +44 -0
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/package.json +1 -1
- package/skills/THIRD_PARTY_NOTICES.md +16 -0
- package/skills/creative/algorithmic-art/SKILL.md +37 -0
- package/skills/creative/algorithmic-art/templates/generator-template.js +27 -0
- package/skills/creative/algorithmic-art/templates/viewer.html +27 -0
- package/skills/creative/hatch-pet/SKILL.md +63 -0
- package/skills/documents/doc-coauthoring/SKILL.md +40 -0
- package/skills/documents/doc-coauthoring/references/reader-review.md +9 -0
- package/skills/documents/docx/SKILL.md +40 -0
- package/skills/documents/docx/references/editing-checklist.md +8 -0
- package/skills/documents/docx/scripts/inspect_ooxml.py +36 -0
- package/skills/documents/docx/scripts/render_docx.py +33 -0
- package/skills/documents/pdf/SKILL.md +47 -0
- package/skills/documents/pdf/references/operations.md +16 -0
- package/skills/documents/pdf/scripts/inspect_pdf.py +41 -0
- package/skills/documents/pdf/scripts/render_pdf.py +32 -0
- package/skills/documents/pptx/SKILL.md +41 -0
- package/skills/documents/pptx/references/qa-checklist.md +6 -0
- package/skills/documents/pptx/scripts/inspect_ooxml.py +34 -0
- package/skills/documents/pptx/scripts/render_pptx.py +33 -0
- package/skills/engineering/define-goal/SKILL.md +41 -0
- package/skills/engineering/define-goal/references/objective-rubric.md +12 -0
- package/dist/gateway/static/root/assets/agents-DRYVahI-.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +0 -4
- package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +0 -1
- package/dist/gateway/static/root/assets/channel-recipient-api-0sauApoC.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +0 -2
- package/dist/gateway/static/root/assets/directory-picker-path-field-CiEc4KmY.js +0 -1
- package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +0 -3
- package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +0 -1
- package/dist/gateway/static/root/assets/fetch-5V96dUz3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-BtIzObwp.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +0 -1
- package/dist/gateway/static/root/assets/goals-config-api-CVN7-pdM.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +0 -1
- package/dist/gateway/static/root/assets/index-CA2tR2vm.js +0 -256
- package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +0 -2
- package/dist/gateway/static/root/assets/messages-C22hxE1N.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-DbYZNAPb.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +0 -2
- package/dist/gateway/static/root/assets/use-channel-catalog-NBqg3iFY.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-suQ2x-LB.js +0 -1
- package/dist/gateway/static/root/assets/vendor-codemirror-BvNgyE1Q.js +0 -45
- package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +0 -18
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createDesktopPetPackage } from "../../pets/factory.js";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
//#region src/agent/tools/desktop-pet-tool.ts
|
|
4
|
+
const DesktopPetCreateSchema = Type.Object({
|
|
5
|
+
mode: Type.Optional(Type.Union([Type.Literal("create"), Type.Literal("update")], { description: "create installs a new pet package. update overwrites an existing custom pet package identified by petId." })),
|
|
6
|
+
petId: Type.Optional(Type.String({ description: "Existing custom pet id to update. Accepts either \"custom:<id>\" from Settings or the folder id under ~/.xopc/pets." })),
|
|
7
|
+
prompt: Type.String({ description: "Full description of the desired pet character, visual style, personality, colors, motifs, and requested changes." }),
|
|
8
|
+
name: Type.Optional(Type.String({ description: "Optional display name for the pet." })),
|
|
9
|
+
description: Type.Optional(Type.String({ description: "Optional short description shown in Settings." })),
|
|
10
|
+
overwrite: Type.Optional(Type.Boolean({ description: "When true, reuse the folder derived from the pet name. Default false creates a unique folder if one exists." }))
|
|
11
|
+
});
|
|
12
|
+
function createDesktopPetTool() {
|
|
13
|
+
return {
|
|
14
|
+
name: "create_desktop_pet",
|
|
15
|
+
label: "Create Pet",
|
|
16
|
+
description: "Create or update a custom animated desktop pet from a natural-language description. Packages are written under ~/.xopc/pets and can be selected in Settings > Pet. Use mode=update with petId when iterating on an existing custom pet.",
|
|
17
|
+
parameters: DesktopPetCreateSchema,
|
|
18
|
+
mutatesWorkspace: false,
|
|
19
|
+
mutationScope: "external",
|
|
20
|
+
supportsParallel: false,
|
|
21
|
+
idempotent: false,
|
|
22
|
+
requiresExclusiveWorkspaceLock: false,
|
|
23
|
+
finalGuardRelevant: false,
|
|
24
|
+
async execute(_toolCallId, params) {
|
|
25
|
+
const prompt = typeof params.prompt === "string" ? params.prompt.trim() : "";
|
|
26
|
+
if (!prompt) return {
|
|
27
|
+
content: [{
|
|
28
|
+
type: "text",
|
|
29
|
+
text: "prompt is required."
|
|
30
|
+
}],
|
|
31
|
+
details: {
|
|
32
|
+
ok: false,
|
|
33
|
+
error: "prompt is required"
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const mode = params.mode === "update" ? "update" : "create";
|
|
37
|
+
const petId = typeof params.petId === "string" ? params.petId.trim() : "";
|
|
38
|
+
if (mode === "update" && !petId) return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: "petId is required when mode is update."
|
|
42
|
+
}],
|
|
43
|
+
details: {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: "petId is required when mode is update"
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
const result = await createDesktopPetPackage({
|
|
50
|
+
...mode === "update" ? { id: petId } : {},
|
|
51
|
+
prompt,
|
|
52
|
+
...typeof params.name === "string" && params.name.trim() ? { name: params.name.trim() } : {},
|
|
53
|
+
...typeof params.description === "string" && params.description.trim() ? { description: params.description.trim() } : {},
|
|
54
|
+
overwrite: mode === "update" ? true : params.overwrite === true
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
content: [{
|
|
58
|
+
type: "text",
|
|
59
|
+
text: [
|
|
60
|
+
`${mode === "update" ? "Updated" : "Created"} desktop pet "${result.name}".`,
|
|
61
|
+
`Installed at: ${result.dir}`,
|
|
62
|
+
"Open Settings > Pet, refresh if needed, and select the new custom pet."
|
|
63
|
+
].join("\n")
|
|
64
|
+
}],
|
|
65
|
+
details: {
|
|
66
|
+
ok: true,
|
|
67
|
+
mode,
|
|
68
|
+
...result
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
} catch (e) {
|
|
72
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
73
|
+
return {
|
|
74
|
+
content: [{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: `Failed to create desktop pet: ${error}`
|
|
77
|
+
}],
|
|
78
|
+
details: {
|
|
79
|
+
ok: false,
|
|
80
|
+
error
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export { createDesktopPetTool };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=desktop-pet-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-pet-tool.js","names":[],"sources":["../../../../src/agent/tools/desktop-pet-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport { createDesktopPetPackage } from '../../pets/factory.js';\nimport type { AgentToolWithMetadata } from './metadata.js';\n\nconst DesktopPetCreateSchema = Type.Object({\n mode: Type.Optional(\n Type.Union([Type.Literal('create'), Type.Literal('update')], {\n description:\n 'create installs a new pet package. update overwrites an existing custom pet package identified by petId.',\n }),\n ),\n petId: Type.Optional(\n Type.String({\n description:\n 'Existing custom pet id to update. Accepts either \"custom:<id>\" from Settings or the folder id under ~/.xopc/pets.',\n }),\n ),\n prompt: Type.String({\n description:\n 'Full description of the desired pet character, visual style, personality, colors, motifs, and requested changes.',\n }),\n name: Type.Optional(Type.String({ description: 'Optional display name for the pet.' })),\n description: Type.Optional(Type.String({ description: 'Optional short description shown in Settings.' })),\n overwrite: Type.Optional(\n Type.Boolean({\n description:\n 'When true, reuse the folder derived from the pet name. Default false creates a unique folder if one exists.',\n }),\n ),\n});\n\nexport type DesktopPetCreateDetails =\n | {\n ok: true;\n id: string;\n name: string;\n dir: string;\n manifestPath: string;\n thumbnailPath: string;\n spritesheetPath: string;\n mode: 'create' | 'update';\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function createDesktopPetTool(): AgentToolWithMetadata<typeof DesktopPetCreateSchema, DesktopPetCreateDetails> {\n return {\n name: 'create_desktop_pet',\n label: 'Create Pet',\n description:\n 'Create or update a custom animated desktop pet from a natural-language description. Packages are written under ~/.xopc/pets and can be selected in Settings > Pet. Use mode=update with petId when iterating on an existing custom pet.',\n parameters: DesktopPetCreateSchema,\n mutatesWorkspace: false,\n mutationScope: 'external',\n supportsParallel: false,\n idempotent: false,\n requiresExclusiveWorkspaceLock: false,\n finalGuardRelevant: false,\n async execute(\n _toolCallId: string,\n params: Record<string, unknown>,\n ): Promise<AgentToolResult<DesktopPetCreateDetails>> {\n const prompt = typeof params.prompt === 'string' ? params.prompt.trim() : '';\n if (!prompt) {\n return {\n content: [{ type: 'text', text: 'prompt is required.' }],\n details: { ok: false, error: 'prompt is required' },\n };\n }\n const mode = params.mode === 'update' ? 'update' : 'create';\n const petId = typeof params.petId === 'string' ? params.petId.trim() : '';\n if (mode === 'update' && !petId) {\n return {\n content: [{ type: 'text', text: 'petId is required when mode is update.' }],\n details: { ok: false, error: 'petId is required when mode is update' },\n };\n }\n\n try {\n const result = await createDesktopPetPackage({\n ...(mode === 'update' ? { id: petId } : {}),\n prompt,\n ...(typeof params.name === 'string' && params.name.trim() ? { name: params.name.trim() } : {}),\n ...(typeof params.description === 'string' && params.description.trim()\n ? { description: params.description.trim() }\n : {}),\n overwrite: mode === 'update' ? true : params.overwrite === true,\n });\n return {\n content: [\n {\n type: 'text',\n text: [\n `${mode === 'update' ? 'Updated' : 'Created'} desktop pet \"${result.name}\".`,\n `Installed at: ${result.dir}`,\n 'Open Settings > Pet, refresh if needed, and select the new custom pet.',\n ].join('\\n'),\n },\n ],\n details: { ok: true, mode, ...result },\n };\n } catch (e) {\n const error = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Failed to create desktop pet: ${error}` }],\n details: { ok: false, error },\n };\n }\n },\n };\n}\n"],"mappings":";;;AAMA,MAAM,yBAAyB,KAAK,OAAO;CACzC,MAAM,KAAK,SACT,KAAK,MAAM,CAAC,KAAK,QAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS,CAAC,EAAE,EAC3D,aACE,4GACH,CAAC,CACH;CACD,OAAO,KAAK,SACV,KAAK,OAAO,EACV,aACE,uHACH,CAAC,CACH;CACD,QAAQ,KAAK,OAAO,EAClB,aACE,oHACH,CAAC;CACF,MAAM,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,sCAAsC,CAAC,CAAC;CACvF,aAAa,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,iDAAiD,CAAC,CAAC;CACzG,WAAW,KAAK,SACd,KAAK,QAAQ,EACX,aACE,+GACH,CAAC,CACH;CACF,CAAC;AAkBF,SAAgB,uBAAsG;AACpH,QAAO;EACL,MAAM;EACN,OAAO;EACP,aACE;EACF,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,kBAAkB;EAClB,YAAY;EACZ,gCAAgC;EAChC,oBAAoB;EACpB,MAAM,QACJ,aACA,QACmD;GACnD,MAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,OAAO,MAAM,GAAG;AAC1E,OAAI,CAAC,OACH,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAuB,CAAC;IACxD,SAAS;KAAE,IAAI;KAAO,OAAO;KAAsB;IACpD;GAEH,MAAM,OAAO,OAAO,SAAS,WAAW,WAAW;GACnD,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM,MAAM,GAAG;AACvE,OAAI,SAAS,YAAY,CAAC,MACxB,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAA0C,CAAC;IAC3E,SAAS;KAAE,IAAI;KAAO,OAAO;KAAyC;IACvE;AAGH,OAAI;IACF,MAAM,SAAS,MAAM,wBAAwB;KAC3C,GAAI,SAAS,WAAW,EAAE,IAAI,OAAO,GAAG,EAAE;KAC1C;KACA,GAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,MAAM,GAAG,EAAE,MAAM,OAAO,KAAK,MAAM,EAAE,GAAG,EAAE;KAC7F,GAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,MAAM,GACnE,EAAE,aAAa,OAAO,YAAY,MAAM,EAAE,GAC1C,EAAE;KACN,WAAW,SAAS,WAAW,OAAO,OAAO,cAAc;KAC5D,CAAC;AACF,WAAO;KACL,SAAS,CACP;MACE,MAAM;MACN,MAAM;OACJ,GAAG,SAAS,WAAW,YAAY,UAAU,gBAAgB,OAAO,KAAK;OACzE,iBAAiB,OAAO;OACxB;OACD,CAAC,KAAK,KAAK;MACb,CACF;KACD,SAAS;MAAE,IAAI;MAAM;MAAM,GAAG;MAAQ;KACvC;YACM,GAAG;IACV,MAAM,QAAQ,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACxD,WAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM,iCAAiC;MAAS,CAAC;KAC3E,SAAS;MAAE,IAAI;MAAO;MAAO;KAC9B;;;EAGN"}
|
|
@@ -10,6 +10,7 @@ import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
|
10
10
|
import type { Model, Api } from '@earendil-works/pi-ai';
|
|
11
11
|
import type { Config } from '../../config/schema.js';
|
|
12
12
|
import type { MessageBus } from '../../infra/bus/index.js';
|
|
13
|
+
import { type SkillInstallToolOptions, type SkillInstallToolResult } from './index.js';
|
|
13
14
|
import type { MemoryManager } from '../memory/manager.js';
|
|
14
15
|
import type { SessionStore } from '../../session/store.js';
|
|
15
16
|
import type { GatewayClarifyRequestFn } from './clarify-tool.js';
|
|
@@ -62,6 +63,8 @@ export interface ToolFactoryDeps {
|
|
|
62
63
|
getSkillPassthroughEnvVarNames?: () => string[];
|
|
63
64
|
/** Add declared env names for the current session (no values stored). */
|
|
64
65
|
registerSkillEnvPassthrough?: (names: string[]) => void;
|
|
66
|
+
/** Install managed skills from explicit sources when a capability/tool enables it. */
|
|
67
|
+
installSkillFromSource?: (opts: SkillInstallToolOptions) => Promise<SkillInstallToolResult>;
|
|
65
68
|
}
|
|
66
69
|
export interface CreateCoreToolsOptions {
|
|
67
70
|
/** Workspace root for file/command tools (defaults to factory workspace). */
|
|
@@ -99,5 +102,7 @@ export declare class AgentToolsFactory {
|
|
|
99
102
|
/** Drop the tab for a session when its agent instance is removed. */
|
|
100
103
|
closeBrowserPageForSession(sessionKey: string): Promise<void>;
|
|
101
104
|
createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[];
|
|
105
|
+
createCapabilityTools(capabilityNames: readonly string[], options?: Pick<CreateCoreToolsOptions, 'disabledTools'>): AgentTool<any, any>[];
|
|
106
|
+
getLazyCapabilityToolNames(): string[];
|
|
102
107
|
createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[];
|
|
103
108
|
}
|
|
@@ -36,7 +36,9 @@ import { createGoalTool } from "./goal-tool.js";
|
|
|
36
36
|
import { createXopcUseTool } from "./xopc-use-tool.js";
|
|
37
37
|
import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
|
|
38
38
|
import { createSkillManageTool } from "./skill-manage-tool.js";
|
|
39
|
+
import { createSkillInstallTool } from "./skill-install-tool.js";
|
|
39
40
|
import { createToolManualTool } from "./tool-manual-tool.js";
|
|
41
|
+
import { createDesktopPetTool } from "./desktop-pet-tool.js";
|
|
40
42
|
import { createImageTool } from "./image-tool.js";
|
|
41
43
|
import { createImageGenerateTool } from "./image-generate-tool.js";
|
|
42
44
|
import "./index.js";
|
|
@@ -47,6 +49,8 @@ import { wrapToolsWithProtection } from "./executor.js";
|
|
|
47
49
|
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
48
50
|
import { createTextToSpeechTool } from "./tts-tool.js";
|
|
49
51
|
import { createGoalEvidenceRecorder } from "./goal-evidence-recorder.js";
|
|
52
|
+
import { getAgentCapabilityToolNames } from "../capabilities/registry.js";
|
|
53
|
+
import "../capabilities/index.js";
|
|
50
54
|
//#region src/agent/tools/factory.ts
|
|
51
55
|
init_logger();
|
|
52
56
|
const log = createLogger("AgentToolsFactory");
|
|
@@ -285,6 +289,24 @@ var AgentToolsFactory = class {
|
|
|
285
289
|
...optionalTools
|
|
286
290
|
], disabled);
|
|
287
291
|
}
|
|
292
|
+
createCapabilityTools(capabilityNames, options) {
|
|
293
|
+
const disabled = options?.disabledTools;
|
|
294
|
+
const raw = [];
|
|
295
|
+
const toolNames = /* @__PURE__ */ new Set();
|
|
296
|
+
for (const toolName of getAgentCapabilityToolNames(capabilityNames)) {
|
|
297
|
+
if (disabled?.has(toolName) || toolNames.has(toolName)) continue;
|
|
298
|
+
toolNames.add(toolName);
|
|
299
|
+
if (toolName === "create_desktop_pet") raw.push(createDesktopPetTool());
|
|
300
|
+
if (toolName === "skill_install") raw.push(createSkillInstallTool({
|
|
301
|
+
installSkillFromSource: this.deps.installSkillFromSource,
|
|
302
|
+
getSessionKey: () => this.deps.getCurrentContext()?.sessionKey
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
return wrapToolsWithProtection(raw, this.deps.toolExecutorConfig);
|
|
306
|
+
}
|
|
307
|
+
getLazyCapabilityToolNames() {
|
|
308
|
+
return ["create_desktop_pet", ...this.deps.installSkillFromSource ? ["skill_install"] : []];
|
|
309
|
+
}
|
|
288
310
|
createAllTools(coreOptions) {
|
|
289
311
|
const coreTools = this.createCoreTools(coreOptions);
|
|
290
312
|
const disableExtensions = coreOptions?.disabledTools?.has("extensions");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","names":[],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createApplyPatchTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createExecCommandTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createComposioExecuteTool,\n createSendMediaTool,\n createReadMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createUpdatePlanTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n createToolManualTool,\n createGoalTool,\n createAutomationTool,\n createXopcUseTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { resolveDreamingRootForAgent } from '../memory/dreaming/scope.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport type { AutomationService } from '../../automations/index.js';\nimport type { NotesService } from '../../notes/index.js';\nimport type { ProjectService } from '../../projects/index.js';\nimport type { WorkItemService } from '../../work-items/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { createGoalEvidenceRecorder } from './goal-evidence-recorder.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `automation` tool. */\n getAutomationService?: () => AutomationService | undefined;\n /** Gateway: enables the `xopc_use` product-object tool. */\n getNotesService?: () => NotesService | undefined;\n getProjectService?: () => ProjectService | undefined;\n getWorkItemService?: () => WorkItemService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for command env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/command tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `exec_command`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getMemoryManager?: () => MemoryManager;\n /** Agent-scoped memories directory used for dreaming state (`agents/<id>/memories`). */\n dreamingRoot?: string;\n agentId?: string;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const host = '127.0.0.1';\n const port = 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n s = new CdpSupervisor({ dialogPolicy: 'auto_dismiss', dialogTimeoutSeconds: 300 });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => false,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const dreamingRoot = options?.dreamingRoot ?? (cfg ? resolveDreamingRootForAgent(cfg, options?.agentId) : workspace);\n const browserEnabled = cfg?.browser?.enabled !== false;\n const recordGoalEvidence = createGoalEvidenceRecorder({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n });\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const composioTool = createComposioExecuteTool(() => this.deps.getConfig?.());\n const optionalTools = [imageTool, imageGenerateTool, composioTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const applyPatchTool = createApplyPatchTool(workspace, { recordGoalEvidence });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getDreamingRoot: () => dreamingRoot,\n getConfig: () => this.deps.getConfig?.(),\n getAgentId: () => options?.agentId,\n }),\n createToolManualTool(),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n if (!CLARIFY_SUPPORTED_CHANNELS.has(ctx.channel)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n createUpdatePlanTool(),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n applyPatchTool,\n listDir,\n grep,\n find,\n createExecCommandTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n recordGoalEvidence,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createReadMediaTool(),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n ...(getMemMgr\n ? [\n createMemorySearchTool({ workspaceDir: workspace, dreamingRoot, getMemoryManager: () => getMemMgr() }),\n createMemoryGetTool({ workspaceDir: workspace, dreamingRoot, getMemoryManager: () => getMemMgr() }),\n ]\n : []),\n ...(getMemMgr && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(() => getMemMgr()),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getAutomationService\n ? [\n createAutomationTool({\n getAutomationService: this.deps.getAutomationService,\n }),\n ]\n : []),\n ...(this.deps.getProjectService || this.deps.getNotesService || this.deps.getWorkItemService\n ? [\n createXopcUseTool({\n getConfig: () => this.deps.getConfig?.(),\n getCurrentAgentId: () => options.agentId,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getNotesService: this.deps.getNotesService,\n getProjectService: this.deps.getProjectService,\n getWorkItemService: this.deps.getWorkItemService,\n }),\n ]\n : []),\n createGoalTool({\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(browserEnabled\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(false && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n agentId: options?.agentId ?? childOpts.agentId,\n dreamingRoot: options?.dreamingRoot,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled = false && !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"factory.js","names":[],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createApplyPatchTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createExecCommandTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createComposioExecuteTool,\n createSendMediaTool,\n createReadMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createUpdatePlanTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n createToolManualTool,\n createGoalTool,\n createAutomationTool,\n createXopcUseTool,\n createDesktopPetTool,\n createSkillInstallTool,\n type SkillInstallToolOptions,\n type SkillInstallToolResult,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { resolveDreamingRootForAgent } from '../memory/dreaming/scope.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport type { AutomationService } from '../../automations/index.js';\nimport type { NotesService } from '../../notes/index.js';\nimport type { ProjectService } from '../../projects/index.js';\nimport type { WorkItemService } from '../../work-items/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { createGoalEvidenceRecorder } from './goal-evidence-recorder.js';\nimport { getAgentCapabilityToolNames } from '../capabilities/index.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `automation` tool. */\n getAutomationService?: () => AutomationService | undefined;\n /** Gateway: enables the `xopc_use` product-object tool. */\n getNotesService?: () => NotesService | undefined;\n getProjectService?: () => ProjectService | undefined;\n getWorkItemService?: () => WorkItemService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for command env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n /** Install managed skills from explicit sources when a capability/tool enables it. */\n installSkillFromSource?: (opts: SkillInstallToolOptions) => Promise<SkillInstallToolResult>;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/command tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `exec_command`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getMemoryManager?: () => MemoryManager;\n /** Agent-scoped memories directory used for dreaming state (`agents/<id>/memories`). */\n dreamingRoot?: string;\n agentId?: string;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const host = '127.0.0.1';\n const port = 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n s = new CdpSupervisor({ dialogPolicy: 'auto_dismiss', dialogTimeoutSeconds: 300 });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => false,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const dreamingRoot = options?.dreamingRoot ?? (cfg ? resolveDreamingRootForAgent(cfg, options?.agentId) : workspace);\n const browserEnabled = cfg?.browser?.enabled !== false;\n const recordGoalEvidence = createGoalEvidenceRecorder({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n });\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const composioTool = createComposioExecuteTool(() => this.deps.getConfig?.());\n const optionalTools = [imageTool, imageGenerateTool, composioTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const applyPatchTool = createApplyPatchTool(workspace, { recordGoalEvidence });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getDreamingRoot: () => dreamingRoot,\n getConfig: () => this.deps.getConfig?.(),\n getAgentId: () => options?.agentId,\n }),\n createToolManualTool(),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n if (!CLARIFY_SUPPORTED_CHANNELS.has(ctx.channel)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n createUpdatePlanTool(),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n applyPatchTool,\n listDir,\n grep,\n find,\n createExecCommandTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n recordGoalEvidence,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createReadMediaTool(),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n ...(getMemMgr\n ? [\n createMemorySearchTool({ workspaceDir: workspace, dreamingRoot, getMemoryManager: () => getMemMgr() }),\n createMemoryGetTool({ workspaceDir: workspace, dreamingRoot, getMemoryManager: () => getMemMgr() }),\n ]\n : []),\n ...(getMemMgr && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(() => getMemMgr()),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getAutomationService\n ? [\n createAutomationTool({\n getAutomationService: this.deps.getAutomationService,\n }),\n ]\n : []),\n ...(this.deps.getProjectService || this.deps.getNotesService || this.deps.getWorkItemService\n ? [\n createXopcUseTool({\n getConfig: () => this.deps.getConfig?.(),\n getCurrentAgentId: () => options.agentId,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getNotesService: this.deps.getNotesService,\n getProjectService: this.deps.getProjectService,\n getWorkItemService: this.deps.getWorkItemService,\n }),\n ]\n : []),\n createGoalTool({\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(browserEnabled\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(false && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n agentId: options?.agentId ?? childOpts.agentId,\n dreamingRoot: options?.dreamingRoot,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createCapabilityTools(\n capabilityNames: readonly string[],\n options?: Pick<CreateCoreToolsOptions, 'disabledTools'>,\n ): AgentTool<any, any>[] {\n const disabled = options?.disabledTools;\n const raw: AgentTool<any, any>[] = [];\n const toolNames = new Set<string>();\n for (const toolName of getAgentCapabilityToolNames(capabilityNames)) {\n if (disabled?.has(toolName) || toolNames.has(toolName)) continue;\n toolNames.add(toolName);\n if (toolName === 'create_desktop_pet') raw.push(createDesktopPetTool() as AgentTool<any, any>);\n if (toolName === 'skill_install') {\n raw.push(createSkillInstallTool({\n installSkillFromSource: this.deps.installSkillFromSource,\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }) as AgentTool<any, any>);\n }\n }\n return wrapToolsWithProtection(raw, this.deps.toolExecutorConfig);\n }\n\n getLazyCapabilityToolNames(): string[] {\n return [\n 'create_desktop_pet',\n ...(this.deps.installSkillFromSource ? ['skill_install'] : []),\n ];\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled = false && !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
-
declare const GoalToolSchema: import("@sinclair/typebox
|
|
3
|
-
action: import("@sinclair/typebox
|
|
4
|
-
goalId: import("@sinclair/typebox
|
|
5
|
-
title: import("@sinclair/typebox
|
|
6
|
-
description: import("@sinclair/typebox
|
|
7
|
-
status: import("@sinclair/typebox
|
|
8
|
-
priority: import("@sinclair/typebox
|
|
9
|
-
maxTurns: import("@sinclair/typebox
|
|
10
|
-
deadlineAt: import("@sinclair/typebox
|
|
11
|
-
nextAction: import("@sinclair/typebox
|
|
12
|
-
blockedReason: import("@sinclair/typebox
|
|
13
|
-
judgeModelRef: import("@sinclair/typebox
|
|
14
|
-
agentId: import("@sinclair/typebox
|
|
15
|
-
sessionKey: import("@sinclair/typebox
|
|
16
|
-
projectId: import("@sinclair/typebox
|
|
17
|
-
limit: import("@sinclair/typebox
|
|
2
|
+
declare const GoalToolSchema: import("@sinclair/typebox").TObject<{
|
|
3
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"update">]>;
|
|
4
|
+
goalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
5
|
+
title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
7
|
+
status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"active">, import("@sinclair/typebox").TLiteral<"paused">, import("@sinclair/typebox").TLiteral<"blocked">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"done">, import("@sinclair/typebox").TLiteral<"archived">]>>;
|
|
8
|
+
priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"low">, import("@sinclair/typebox").TLiteral<"normal">, import("@sinclair/typebox").TLiteral<"high">]>>;
|
|
9
|
+
maxTurns: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
10
|
+
deadlineAt: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
11
|
+
nextAction: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
12
|
+
blockedReason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
13
|
+
judgeModelRef: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
14
|
+
agentId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
15
|
+
sessionKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
16
|
+
projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
17
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
18
18
|
}>;
|
|
19
19
|
export interface GoalToolOptions {
|
|
20
20
|
getCurrentSessionKey?: () => string | undefined;
|
|
@@ -31,7 +31,9 @@ export { createGoalTool, type GoalToolOptions } from './goal-tool.js';
|
|
|
31
31
|
export { createXopcUseTool, type XopcUseToolDeps, type XopcUseToolInput } from './xopc-use-tool.js';
|
|
32
32
|
export { createSkillsListTool, createSkillViewTool, type SkillsToolsDeps } from './skills-tools.js';
|
|
33
33
|
export { createSkillManageTool, type SkillManageToolDeps } from './skill-manage-tool.js';
|
|
34
|
+
export { createSkillInstallTool, type SkillInstallToolDeps, type SkillInstallToolOptions, type SkillInstallToolResult, } from './skill-install-tool.js';
|
|
34
35
|
export { createToolManualTool } from './tool-manual-tool.js';
|
|
36
|
+
export { createDesktopPetTool, type DesktopPetCreateDetails } from './desktop-pet-tool.js';
|
|
35
37
|
export { createImageTool, resolveImageModelConfigForTool } from './image-tool.js';
|
|
36
38
|
export { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from './image-generate-tool.js';
|
|
37
39
|
export { truncateHead, truncateTail, truncateLine, formatSize, type TruncationResult, type TruncationOptions, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES, GREP_MAX_LINE_LENGTH, } from './truncate.js';
|
|
@@ -35,8 +35,10 @@ import { createGoalTool } from "./goal-tool.js";
|
|
|
35
35
|
import { createXopcUseTool } from "./xopc-use-tool.js";
|
|
36
36
|
import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
|
|
37
37
|
import { createSkillManageTool } from "./skill-manage-tool.js";
|
|
38
|
+
import { createSkillInstallTool } from "./skill-install-tool.js";
|
|
38
39
|
import { createToolManualTool } from "./tool-manual-tool.js";
|
|
40
|
+
import { createDesktopPetTool } from "./desktop-pet-tool.js";
|
|
39
41
|
import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
|
|
40
42
|
import { createImageTool } from "./image-tool.js";
|
|
41
43
|
import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
|
|
42
|
-
export { BrowserManager, 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, SANDBOX_ALLOWED_TOOLS, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, buildSandboxToolMap, createApplyPatchTool, createAutomationTool, createClarifyTool, createComposioExecuteTool, createCreateShareTool, createCuratedMemoryTool, createDelegateTool, createDreamingTool, createExecCommandTool, createExecuteCodeTool, createFindTool, createGoalTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createToolManualTool, createUpdatePlanTool, 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 };
|
|
44
|
+
export { BrowserManager, 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, SANDBOX_ALLOWED_TOOLS, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, buildSandboxToolMap, createApplyPatchTool, createAutomationTool, createClarifyTool, createComposioExecuteTool, createCreateShareTool, createCuratedMemoryTool, createDelegateTool, createDesktopPetTool, createDreamingTool, createExecCommandTool, createExecuteCodeTool, createFindTool, createGoalTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createSkillInstallTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createToolManualTool, createUpdatePlanTool, 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 };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
import { type SkillInstallTarget } from '../skills/install-target.js';
|
|
3
|
+
export interface SkillInstallToolOptions {
|
|
4
|
+
source: string;
|
|
5
|
+
ref?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
skillId?: string;
|
|
8
|
+
target?: SkillInstallTarget;
|
|
9
|
+
/** Current session whose resolved workspace should receive workspace installs. */
|
|
10
|
+
sessionKey?: string;
|
|
11
|
+
/** Explicit workspace override for workspace installs. */
|
|
12
|
+
workspace?: string;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
strictScan?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface SkillInstallToolResult {
|
|
17
|
+
skillId: string;
|
|
18
|
+
path: string;
|
|
19
|
+
source: string;
|
|
20
|
+
kind: 'git' | 'archive';
|
|
21
|
+
contentHash: string;
|
|
22
|
+
target?: SkillInstallTarget;
|
|
23
|
+
}
|
|
24
|
+
export interface SkillInstallToolDeps {
|
|
25
|
+
installSkillFromSource?: (opts: SkillInstallToolOptions) => Promise<SkillInstallToolResult>;
|
|
26
|
+
getSessionKey?: () => string | undefined;
|
|
27
|
+
}
|
|
28
|
+
export declare function createSkillInstallTool(deps: SkillInstallToolDeps): AgentTool;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { isSkillInstallTarget } from "../skills/install-target.js";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
//#region src/agent/tools/skill-install-tool.ts
|
|
4
|
+
const SkillInstallSchema = Type.Object({
|
|
5
|
+
source: Type.String({ description: "Explicit skill source: Git URL, GitHub repository URL, https .zip/.tar.gz URL, file:// URL, or local archive/path." }),
|
|
6
|
+
ref: Type.Optional(Type.String({ description: "Optional Git branch/tag/ref." })),
|
|
7
|
+
path: Type.Optional(Type.String({ description: "Optional subdirectory inside the source that contains SKILL.md." })),
|
|
8
|
+
skillId: Type.Optional(Type.String({ description: "Optional target managed skill id under the current workspace .xopc/skills." })),
|
|
9
|
+
target: Type.Optional(Type.Union([Type.Literal("workspace"), Type.Literal("global")], { description: "Install target. Defaults to workspace. Use global only when the user explicitly asks for a global/personal install." })),
|
|
10
|
+
force: Type.Optional(Type.Boolean({ description: "Replace an existing managed skill with the same id." })),
|
|
11
|
+
strictScan: Type.Optional(Type.Boolean({ description: "Fail when the current scanner reports critical findings." }))
|
|
12
|
+
});
|
|
13
|
+
function clean(value) {
|
|
14
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
15
|
+
}
|
|
16
|
+
function createSkillInstallTool(deps) {
|
|
17
|
+
return {
|
|
18
|
+
name: "skill_install",
|
|
19
|
+
label: "Install skill",
|
|
20
|
+
description: "Install an xopc skill from an explicit user-provided source. Use only when the user clearly asks to install or update a skill; do not install from a URL the user merely pasted without installation intent.",
|
|
21
|
+
parameters: SkillInstallSchema,
|
|
22
|
+
async execute(_toolCallId, params) {
|
|
23
|
+
if (!deps.installSkillFromSource) return {
|
|
24
|
+
content: [{
|
|
25
|
+
type: "text",
|
|
26
|
+
text: "Skill installation is not available in this runtime context."
|
|
27
|
+
}],
|
|
28
|
+
details: {}
|
|
29
|
+
};
|
|
30
|
+
const source = clean(params.source);
|
|
31
|
+
if (!source) return {
|
|
32
|
+
content: [{
|
|
33
|
+
type: "text",
|
|
34
|
+
text: "Missing source. Provide a Git URL, archive URL, file URL, or local path."
|
|
35
|
+
}],
|
|
36
|
+
details: { errorCode: "missing_source" }
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
const result = await deps.installSkillFromSource({
|
|
40
|
+
source,
|
|
41
|
+
ref: clean(params.ref),
|
|
42
|
+
path: clean(params.path),
|
|
43
|
+
skillId: clean(params.skillId),
|
|
44
|
+
target: isSkillInstallTarget(params.target) ? params.target : void 0,
|
|
45
|
+
sessionKey: deps.getSessionKey?.(),
|
|
46
|
+
force: params.force === true,
|
|
47
|
+
strictScan: params.strictScan === true
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: [
|
|
53
|
+
`Installed skill "${result.skillId}".`,
|
|
54
|
+
`Target: ${result.target ?? "workspace"}`,
|
|
55
|
+
`Source: ${result.source} (${result.kind})`,
|
|
56
|
+
`Path: ${result.path}`,
|
|
57
|
+
`Tree hash: ${result.contentHash.slice(0, 16)}`
|
|
58
|
+
].join("\n")
|
|
59
|
+
}],
|
|
60
|
+
details: { result }
|
|
61
|
+
};
|
|
62
|
+
} catch (err) {
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
return {
|
|
65
|
+
content: [{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: `Skill install failed: ${message}`
|
|
68
|
+
}],
|
|
69
|
+
details: {
|
|
70
|
+
errorCode: "install_failed",
|
|
71
|
+
errorMessage: message
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { createSkillInstallTool };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=skill-install-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-install-tool.js","names":[],"sources":["../../../../src/agent/tools/skill-install-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\nimport { isSkillInstallTarget, type SkillInstallTarget } from '../skills/install-target.js';\n\nexport interface SkillInstallToolOptions {\n source: string;\n ref?: string;\n path?: string;\n skillId?: string;\n target?: SkillInstallTarget;\n /** Current session whose resolved workspace should receive workspace installs. */\n sessionKey?: string;\n /** Explicit workspace override for workspace installs. */\n workspace?: string;\n force?: boolean;\n strictScan?: boolean;\n}\n\nexport interface SkillInstallToolResult {\n skillId: string;\n path: string;\n source: string;\n kind: 'git' | 'archive';\n contentHash: string;\n target?: SkillInstallTarget;\n}\n\nexport interface SkillInstallToolDeps {\n installSkillFromSource?: (opts: SkillInstallToolOptions) => Promise<SkillInstallToolResult>;\n getSessionKey?: () => string | undefined;\n}\n\nconst SkillInstallSchema = Type.Object({\n source: Type.String({\n description:\n 'Explicit skill source: Git URL, GitHub repository URL, https .zip/.tar.gz URL, file:// URL, or local archive/path.',\n }),\n ref: Type.Optional(Type.String({ description: 'Optional Git branch/tag/ref.' })),\n path: Type.Optional(\n Type.String({ description: 'Optional subdirectory inside the source that contains SKILL.md.' }),\n ),\n skillId: Type.Optional(\n Type.String({ description: 'Optional target managed skill id under the current workspace .xopc/skills.' }),\n ),\n target: Type.Optional(\n Type.Union([\n Type.Literal('workspace'),\n Type.Literal('global'),\n ], {\n description:\n 'Install target. Defaults to workspace. Use global only when the user explicitly asks for a global/personal install.',\n }),\n ),\n force: Type.Optional(Type.Boolean({ description: 'Replace an existing managed skill with the same id.' })),\n strictScan: Type.Optional(\n Type.Boolean({ description: 'Fail when the current scanner reports critical findings.' }),\n ),\n});\n\nfunction clean(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function createSkillInstallTool(deps: SkillInstallToolDeps): AgentTool {\n return {\n name: 'skill_install',\n label: 'Install skill',\n description:\n 'Install an xopc skill from an explicit user-provided source. Use only when the user clearly asks to install or update a skill; do not install from a URL the user merely pasted without installation intent.',\n parameters: SkillInstallSchema,\n async execute(_toolCallId: string, params: any): Promise<AgentToolResult<{}>> {\n if (!deps.installSkillFromSource) {\n return {\n content: [{ type: 'text', text: 'Skill installation is not available in this runtime context.' }],\n details: {},\n };\n }\n\n const source = clean(params.source);\n if (!source) {\n return {\n content: [{ type: 'text', text: 'Missing source. Provide a Git URL, archive URL, file URL, or local path.' }],\n details: { errorCode: 'missing_source' },\n };\n }\n\n try {\n const result = await deps.installSkillFromSource({\n source,\n ref: clean(params.ref),\n path: clean(params.path),\n skillId: clean(params.skillId),\n target: isSkillInstallTarget(params.target) ? params.target : undefined,\n sessionKey: deps.getSessionKey?.(),\n force: params.force === true,\n strictScan: params.strictScan === true,\n });\n return {\n content: [\n {\n type: 'text',\n text: [\n `Installed skill \"${result.skillId}\".`,\n `Target: ${result.target ?? 'workspace'}`,\n `Source: ${result.source} (${result.kind})`,\n `Path: ${result.path}`,\n `Tree hash: ${result.contentHash.slice(0, 16)}`,\n ].join('\\n'),\n },\n ],\n details: { result },\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Skill install failed: ${message}` }],\n details: { errorCode: 'install_failed', errorMessage: message },\n };\n }\n },\n } as any;\n}\n"],"mappings":";;;AAgCA,MAAM,qBAAqB,KAAK,OAAO;CACrC,QAAQ,KAAK,OAAO,EAClB,aACE,sHACH,CAAC;CACF,KAAK,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,gCAAgC,CAAC,CAAC;CAChF,MAAM,KAAK,SACT,KAAK,OAAO,EAAE,aAAa,mEAAmE,CAAC,CAChG;CACD,SAAS,KAAK,SACZ,KAAK,OAAO,EAAE,aAAa,8EAA8E,CAAC,CAC3G;CACD,QAAQ,KAAK,SACX,KAAK,MAAM,CACT,KAAK,QAAQ,YAAY,EACzB,KAAK,QAAQ,SAAS,CACvB,EAAE,EACD,aACE,uHACH,CAAC,CACH;CACD,OAAO,KAAK,SAAS,KAAK,QAAQ,EAAE,aAAa,uDAAuD,CAAC,CAAC;CAC1G,YAAY,KAAK,SACf,KAAK,QAAQ,EAAE,aAAa,4DAA4D,CAAC,CAC1F;CACF,CAAC;AAEF,SAAS,MAAM,OAAoC;AACjD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,SAAgB,uBAAuB,MAAuC;AAC5E,QAAO;EACL,MAAM;EACN,OAAO;EACP,aACE;EACF,YAAY;EACZ,MAAM,QAAQ,aAAqB,QAA2C;AAC5E,OAAI,CAAC,KAAK,uBACR,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAgE,CAAC;IACjG,SAAS,EAAE;IACZ;GAGH,MAAM,SAAS,MAAM,OAAO,OAAO;AACnC,OAAI,CAAC,OACH,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAA4E,CAAC;IAC7G,SAAS,EAAE,WAAW,kBAAkB;IACzC;AAGH,OAAI;IACF,MAAM,SAAS,MAAM,KAAK,uBAAuB;KAC/C;KACA,KAAK,MAAM,OAAO,IAAI;KACtB,MAAM,MAAM,OAAO,KAAK;KACxB,SAAS,MAAM,OAAO,QAAQ;KAC9B,QAAQ,qBAAqB,OAAO,OAAO,GAAG,OAAO,SAAS,KAAA;KAC9D,YAAY,KAAK,iBAAiB;KAClC,OAAO,OAAO,UAAU;KACxB,YAAY,OAAO,eAAe;KACnC,CAAC;AACF,WAAO;KACL,SAAS,CACP;MACE,MAAM;MACN,MAAM;OACJ,oBAAoB,OAAO,QAAQ;OACnC,WAAW,OAAO,UAAU;OAC5B,WAAW,OAAO,OAAO,IAAI,OAAO,KAAK;OACzC,SAAS,OAAO;OAChB,cAAc,OAAO,YAAY,MAAM,GAAG,GAAG;OAC9C,CAAC,KAAK,KAAK;MACb,CACF;KACD,SAAS,EAAE,QAAQ;KACpB;YACM,KAAK;IACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,WAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM,yBAAyB;MAAW,CAAC;KACrE,SAAS;MAAE,WAAW;MAAkB,cAAc;MAAS;KAChE;;;EAGN"}
|
|
@@ -20,7 +20,7 @@ const SkillManageSchema = Type.Object({
|
|
|
20
20
|
name: Type.Optional(Type.String({ description: "Skill name (directory id / frontmatter name)" })),
|
|
21
21
|
content: Type.Optional(Type.String({ description: "Full SKILL.md for create or edit" })),
|
|
22
22
|
category: Type.Optional(Type.String({ description: "Optional single-segment category folder under skills root" })),
|
|
23
|
-
write_target: Type.Optional(Type.Union([Type.Literal("global"), Type.Literal("workspace")], { description: "Where to create the skill
|
|
23
|
+
write_target: Type.Optional(Type.Union([Type.Literal("global"), Type.Literal("workspace")], { description: "Where to create the skill. Defaults to workspace. Use global only when the user explicitly asks for a global/personal skill. Respects skills.agentWritePolicy." })),
|
|
24
24
|
old_string: Type.Optional(Type.String()),
|
|
25
25
|
new_string: Type.Optional(Type.String()),
|
|
26
26
|
replace_all: Type.Optional(Type.Boolean({ default: false })),
|
|
@@ -73,11 +73,7 @@ function createSkillManageTool(deps) {
|
|
|
73
73
|
success: false,
|
|
74
74
|
error: md.error
|
|
75
75
|
});
|
|
76
|
-
|
|
77
|
-
success: false,
|
|
78
|
-
error: `A skill named "${name}" already exists. Use edit or choose another name.`
|
|
79
|
-
});
|
|
80
|
-
const target = params.write_target ?? "global";
|
|
76
|
+
const target = params.write_target ?? "workspace";
|
|
81
77
|
const dirRes = resolveCreateSkillDir(name, params.category?.trim(), target, workspace, policy);
|
|
82
78
|
if (dirRes.ok === false) return jsonResult({
|
|
83
79
|
success: false,
|
|
@@ -112,6 +108,7 @@ function createSkillManageTool(deps) {
|
|
|
112
108
|
return jsonResult({
|
|
113
109
|
success: true,
|
|
114
110
|
message: `Skill "${name}" created.`,
|
|
111
|
+
target,
|
|
115
112
|
path: dirRes.dir
|
|
116
113
|
});
|
|
117
114
|
}
|