@xopcai/xopc 0.0.6 → 0.0.8
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/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BSNzJWbQ.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js.map → agents-BSNzJWbQ.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-BKk9SB4D.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-BKk9SB4D.js.map} +1 -1
- package/dist/gateway/static/root/assets/attachment-load-DXcJLSWT.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-_J6cQN6G.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-_J6cQN6G.js.map} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-DPb_0O8M.js} +2 -2
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-DPb_0O8M.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-BUJOuuKX.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-BUJOuuKX.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Cn0YVg8x.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Cn0YVg8x.js.map} +1 -1
- package/dist/gateway/static/root/assets/electron-env-D9bm1FIu.js +2 -0
- package/dist/gateway/static/root/assets/electron-env-D9bm1FIu.js.map +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-DTz4O5Ua.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-DTz4O5Ua.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-Cs1Kde9o.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-Cs1Kde9o.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-G52iX0Bo.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-G52iX0Bo.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-CO2jxBA9.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-CO2jxBA9.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-D9Ul8uSt.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-D9Ul8uSt.js.map} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Bc8SVD15.js} +2 -2
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Bc8SVD15.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-BXUJbteW.js +16 -0
- package/dist/gateway/static/root/assets/index-BXUJbteW.js.map +1 -0
- package/dist/gateway/static/root/assets/index-CQLMxWSA.css +2 -0
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-5V25JkQY.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-5V25JkQY.js.map} +1 -1
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-he3aQfme.js} +2 -2
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-he3aQfme.js.map} +1 -1
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
- package/dist/gateway/static/root/assets/page-header-store-DJHD9Ean.js +2 -0
- package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-DJHD9Ean.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-n-4O5d9U.js} +2 -2
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-n-4O5d9U.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-B6dHLvbr.js} +3 -3
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-B6dHLvbr.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-rBUfTdm3.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-rBUfTdm3.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-B3QrJm-E.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-B3QrJm-E.js.map +1 -0
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-vxtE8kI6.js} +2 -2
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-vxtE8kI6.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-D36_O2Ub.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-D36_O2Ub.js.map} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CmiSsYBd.js} +2 -2
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CmiSsYBd.js.map} +1 -1
- package/dist/gateway/static/root/assets/url-CtSqjF9J.js +2 -0
- package/dist/gateway/static/root/assets/url-CtSqjF9J.js.map +1 -0
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-DYORQ7x6.js} +2 -2
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-DYORQ7x6.js.map} +1 -1
- package/dist/gateway/static/root/index.html +16 -16
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/image/index.d.ts +0 -1
- package/dist/src/agent/image/index.js +1 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +1 -1
- package/dist/src/agent/service.js +3 -3
- package/dist/src/agent/skills/hub-hash.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tools.js +2 -2
- package/dist/src/agent/tools/browser/tools.js.map +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/image-tool.js +2 -2
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/read.d.ts +0 -2
- package/dist/src/agent/tools/read.js +1 -3
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/channels/plugin-types.d.ts +14 -0
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
- package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
- package/dist/src/cli/commands/doctor/flow.js +51 -0
- package/dist/src/cli/commands/doctor/flow.js.map +1 -0
- package/dist/src/cli/commands/doctor/format.d.ts +6 -0
- package/dist/src/cli/commands/doctor/format.js +61 -0
- package/dist/src/cli/commands/doctor/format.js.map +1 -0
- package/dist/src/cli/commands/doctor/index.js +44 -0
- package/dist/src/cli/commands/doctor/index.js.map +1 -0
- package/dist/src/cli/commands/doctor/types.d.ts +20 -0
- package/dist/src/cli/commands/doctor/types.js +1 -0
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/index.d.ts +1 -1
- package/dist/src/cli/index.js +1 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace.js +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +15 -15
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/schema.d.ts +0 -105
- package/dist/src/config/schema.js +3 -40
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/executor.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/launchd.js.map +1 -1
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/systemd.js.map +1 -1
- package/dist/src/extensions/loader.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
- package/dist/src/gateway/hono/routes/doctor.js +35 -0
- package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
- 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/workspace.js +2 -2
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +98 -3
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/service.d.ts +0 -4
- package/dist/src/gateway/service.js +4 -23
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/routing/bindings.js +1 -1
- package/dist/src/routing/index.d.ts +1 -1
- package/dist/src/routing/index.js +2 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/session-key.d.ts +0 -5
- package/dist/src/routing/session-key.js +1 -27
- package/dist/src/routing/session-key.js.map +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +2 -6
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +0 -10
- package/dist/src/session/types.js.map +1 -1
- package/package.json +1 -2
- package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
- package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
- package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
- package/dist/src/acp/commands.d.ts +0 -11
- package/dist/src/acp/commands.js +0 -17
- package/dist/src/acp/commands.js.map +0 -1
- package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
- package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
- package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
- package/dist/src/acp/control-plane/index.d.ts +0 -10
- package/dist/src/acp/control-plane/index.js +0 -6
- package/dist/src/acp/control-plane/manager.d.ts +0 -86
- package/dist/src/acp/control-plane/manager.js +0 -502
- package/dist/src/acp/control-plane/manager.js.map +0 -1
- package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
- package/dist/src/acp/control-plane/manager.types.js +0 -14
- package/dist/src/acp/control-plane/manager.types.js.map +0 -1
- package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
- package/dist/src/acp/control-plane/manager.utils.js +0 -46
- package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
- package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
- package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
- package/dist/src/acp/control-plane/runtime-cache.js +0 -58
- package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
- package/dist/src/acp/control-plane/runtime-options.js +0 -92
- package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
- package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
- package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
- package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
- package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
- package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
- package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
- package/dist/src/acp/control-plane/session-store.d.ts +0 -39
- package/dist/src/acp/control-plane/session-store.js +0 -149
- package/dist/src/acp/control-plane/session-store.js.map +0 -1
- package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
- package/dist/src/acp/control-plane/turn-manager.js +0 -134
- package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
- package/dist/src/acp/event-mapper.d.ts +0 -48
- package/dist/src/acp/event-mapper.js +0 -94
- package/dist/src/acp/event-mapper.js.map +0 -1
- package/dist/src/acp/index.d.ts +0 -10
- package/dist/src/acp/index.js +0 -5
- package/dist/src/acp/meta.d.ts +0 -15
- package/dist/src/acp/meta.js +0 -36
- package/dist/src/acp/meta.js.map +0 -1
- package/dist/src/acp/routing-integration.d.ts +0 -37
- package/dist/src/acp/routing-integration.js +0 -58
- package/dist/src/acp/routing-integration.js.map +0 -1
- package/dist/src/acp/runtime/backends/index.d.ts +0 -4
- package/dist/src/acp/runtime/backends/index.js +0 -2
- package/dist/src/acp/runtime/backends/local.d.ts +0 -136
- package/dist/src/acp/runtime/backends/local.js +0 -603
- package/dist/src/acp/runtime/backends/local.js.map +0 -1
- package/dist/src/acp/runtime/error-text.d.ts +0 -16
- package/dist/src/acp/runtime/error-text.js +0 -40
- package/dist/src/acp/runtime/error-text.js.map +0 -1
- package/dist/src/acp/runtime/errors.d.ts +0 -31
- package/dist/src/acp/runtime/errors.js +0 -47
- package/dist/src/acp/runtime/errors.js.map +0 -1
- package/dist/src/acp/runtime/index.d.ts +0 -7
- package/dist/src/acp/runtime/index.js +0 -4
- package/dist/src/acp/runtime/registry.d.ts +0 -35
- package/dist/src/acp/runtime/registry.js +0 -85
- package/dist/src/acp/runtime/registry.js.map +0 -1
- package/dist/src/acp/runtime/session-identity.d.ts +0 -35
- package/dist/src/acp/runtime/session-identity.js +0 -134
- package/dist/src/acp/runtime/session-identity.js.map +0 -1
- package/dist/src/acp/runtime/types.d.ts +0 -214
- package/dist/src/acp/secret-file.d.ts +0 -7
- package/dist/src/acp/secret-file.js +0 -19
- package/dist/src/acp/secret-file.js.map +0 -1
- package/dist/src/acp/server.d.ts +0 -48
- package/dist/src/acp/server.js +0 -300
- package/dist/src/acp/server.js.map +0 -1
- package/dist/src/acp/session.d.ts +0 -29
- package/dist/src/acp/session.js +0 -30
- package/dist/src/acp/session.js.map +0 -1
- package/dist/src/acp/types.d.ts +0 -39
- package/dist/src/acp/types.js +0 -13
- package/dist/src/acp/types.js.map +0 -1
- package/dist/src/agent/image/describe-images.d.ts +0 -18
- package/dist/src/agent/image/describe-images.js +0 -19
- package/dist/src/agent/image/describe-images.js.map +0 -1
- package/dist/src/cli/commands/acp.d.ts +0 -4
- package/dist/src/cli/commands/acp.js +0 -200
- package/dist/src/cli/commands/acp.js.map +0 -1
- /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-DYORQ7x6.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-
|
|
2
|
-
//# sourceMappingURL=useTranslation-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-CtSqjF9J.js";import{o as i}from"./vendor-swr-8rdcElid.js";var a=e(t()),o=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);p(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},s={},c=(e,t,n,r)=>{p(n)&&s[n]||(p(n)&&(s[n]=new Date),o(e,t,n,r))},l=(e,t)=>()=>{if(e.isInitialized)t();else{let n=()=>{setTimeout(()=>{e.off(`initialized`,n)},0),t()};e.on(`initialized`,n)}},u=(e,t,n)=>{e.loadNamespaces(t,l(e,n))},d=(e,t,n,r)=>{if(p(n)&&(n=[n]),e.options.preload&&e.options.preload.indexOf(t)>-1)return u(e,n,r);n.forEach(t=>{e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,l(e,r))},f=(e,t,n={})=>!t.languages||!t.languages.length?(c(t,`NO_LANGUAGES`,`i18n.languages were undefined or empty`,{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:n.lng,precheck:(t,r)=>{if(n.bindI18n&&n.bindI18n.indexOf(`languageChanging`)>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}),p=e=>typeof e==`string`,m=e=>typeof e==`object`&&!!e,h=(0,a.createContext)(),g=class{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}},_=i(),v={t:(e,t)=>{if(p(t))return t;if(m(t)&&p(t.defaultValue))return t.defaultValue;if(typeof e==`function`)return``;if(Array.isArray(e)){let t=e[e.length-1];return typeof t==`function`?``:t}return e},ready:!1},y=()=>()=>{},b=(e,t={})=>{let{i18n:i}=t,{i18n:o,defaultNS:s}=(0,a.useContext)(h)||{},l=i||o||r();l&&!l.reportNamespaces&&(l.reportNamespaces=new g),l||c(l,`NO_I18NEXT_INSTANCE`,`useTranslation: You will need to pass in an i18next instance by using initReactI18next`);let m=(0,a.useMemo)(()=>({...n(),...l?.options?.react,...t}),[l,t]),{useSuspense:b,keyPrefix:x}=m,S=e||s||l?.options?.defaultNS,C=p(S)?[S]:S||[`translation`],w=(0,a.useMemo)(()=>C,C);l?.reportNamespaces?.addUsedNamespaces?.(w);let T=(0,a.useRef)(0),E=(0,a.useCallback)(e=>{if(!l)return y;let{bindI18n:t,bindI18nStore:n}=m,r=()=>{T.current+=1,e()};return t&&l.on(t,r),n&&l.store.on(n,r),()=>{t&&t.split(` `).forEach(e=>l.off(e,r)),n&&n.split(` `).forEach(e=>l.store.off(e,r))}},[l,m]),D=(0,a.useRef)(),O=(0,a.useCallback)(()=>{if(!l)return v;let e=!!(l.isInitialized||l.initializedStoreOnce)&&w.every(e=>f(e,l,m)),n=t.lng||l.language,r=T.current,i=D.current;if(i&&i.ready===e&&i.lng===n&&i.keyPrefix===x&&i.revision===r)return i;let a={t:l.getFixedT(n,m.nsMode===`fallback`?w:w[0],x),ready:e,lng:n,keyPrefix:x,revision:r};return D.current=a,a},[l,w,x,m,t.lng]),[k,A]=(0,a.useState)(0),{t:j,ready:M}=(0,_.useSyncExternalStore)(E,O,O);(0,a.useEffect)(()=>{if(l&&!M&&!b){let e=()=>A(e=>e+1);t.lng?d(l,t.lng,w,e):u(l,w,e)}},[l,t.lng,w,M,b,k]);let N=l||{},P=(0,a.useRef)(null),F=(0,a.useRef)(),I=e=>{let t=Object.getOwnPropertyDescriptors(e);t.__original&&delete t.__original;let n=Object.create(Object.getPrototypeOf(e),t);if(!Object.prototype.hasOwnProperty.call(n,`__original`))try{Object.defineProperty(n,`__original`,{value:e,writable:!1,enumerable:!1,configurable:!1})}catch{}return n},L=(0,a.useMemo)(()=>{let e=N,t=e?.language,n=e;e&&(P.current&&P.current.__original===e&&F.current===t?n=P.current:(n=I(e),P.current=n,F.current=t));let r=!M&&!b?(...e)=>(c(l,`USE_T_BEFORE_READY`,`useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.`),j(...e)):j,i=[r,n,M];return i.t=r,i.i18n=n,i.ready=M,i},[j,N,M,N.resolvedLanguage,N.language,N.languages]);if(l&&b&&!M)throw new Promise(e=>{let n=()=>e();t.lng?d(l,t.lng,w,n):u(l,w,n)});return L};export{h as n,b as t};
|
|
2
|
+
//# sourceMappingURL=useTranslation-DYORQ7x6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTranslation-BEUWOMuh.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTranslation-DYORQ7x6.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
|
10
10
|
<link rel="apple-touch-icon" href="/logo.svg" />
|
|
11
11
|
<title>xopc</title>
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-BXUJbteW.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-B1FJdls4.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DzyYoeor.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/dist-CjRB05pZ.js">
|
|
@@ -24,34 +24,34 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/dist-CpMMntuC.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/cn-DPF56z7S.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/vendor-swr-8rdcElid.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/url-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/url-CtSqjF9J.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/check-CDc_K89l.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/chunk-QFMPRPBF-DOYp8d2p.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/form-field-width-BlpNwrfn.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/interaction-C4gx-xSs.js">
|
|
32
|
-
<link rel="modulepreload" crossorigin href="/assets/model-selector-
|
|
32
|
+
<link rel="modulepreload" crossorigin href="/assets/model-selector-he3aQfme.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/button-CRQ9eQGX.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="/assets/markdown-view-BpEqr7_J.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/settings-nav-state-BSa0kz44.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/pin-DlJMazAN.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/extension-paths-BNsLxSIK.js">
|
|
38
38
|
<link rel="modulepreload" crossorigin href="/assets/sparkles-BG1XFBU0.js">
|
|
39
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-store-
|
|
40
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
39
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-store-CmiSsYBd.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/assets/electron-env-D9bm1FIu.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/chevron-down-DUplxB5j.js">
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/skill-api-
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/skill-api-vxtE8kI6.js">
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/chevron-right-DmT4UtDa.js">
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/loader-circle-B2bCE4iI.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/attachment-utils-core-B42k7cMx.js">
|
|
46
|
-
<link rel="modulepreload" crossorigin href="/assets/session-api-
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-
|
|
46
|
+
<link rel="modulepreload" crossorigin href="/assets/session-api-n-4O5d9U.js">
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-B6dHLvbr.js">
|
|
48
48
|
<link rel="modulepreload" crossorigin href="/assets/segmented-styles-DEG4J-_P.js">
|
|
49
49
|
<link rel="modulepreload" crossorigin href="/assets/sliding-segmented-BIYAScDL.js">
|
|
50
|
-
<link rel="modulepreload" crossorigin href="/assets/navigation-
|
|
50
|
+
<link rel="modulepreload" crossorigin href="/assets/navigation-DB9S-C6S.js">
|
|
51
51
|
<link rel="modulepreload" crossorigin href="/assets/ellipsis-vertical-BJP8MSr5.js">
|
|
52
52
|
<link rel="modulepreload" crossorigin href="/assets/send-CPmJTrt0.js">
|
|
53
53
|
<link rel="modulepreload" crossorigin href="/assets/external-link-DxIqSrRZ.js">
|
|
54
|
-
<link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-
|
|
54
|
+
<link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-Bc8SVD15.js">
|
|
55
55
|
<link rel="modulepreload" crossorigin href="/assets/file-text-CVBsYEv2.js">
|
|
56
56
|
<link rel="modulepreload" crossorigin href="/assets/folder-BZ5toHcH.js">
|
|
57
57
|
<link rel="modulepreload" crossorigin href="/assets/info-Ccltk00r.js">
|
|
@@ -61,13 +61,13 @@
|
|
|
61
61
|
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-D7hzzeQ5.js">
|
|
62
62
|
<link rel="modulepreload" crossorigin href="/assets/search-DoMetBR0.js">
|
|
63
63
|
<link rel="modulepreload" crossorigin href="/assets/trash-2-D9v5oysq.js">
|
|
64
|
-
<link rel="modulepreload" crossorigin href="/assets/useTranslation-
|
|
65
|
-
<link rel="modulepreload" crossorigin href="/assets/extension-provider-
|
|
66
|
-
<link rel="modulepreload" crossorigin href="/assets/chat-agents-api-
|
|
67
|
-
<link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-
|
|
68
|
-
<link rel="modulepreload" crossorigin href="/assets/page-header-store-
|
|
64
|
+
<link rel="modulepreload" crossorigin href="/assets/useTranslation-DYORQ7x6.js">
|
|
65
|
+
<link rel="modulepreload" crossorigin href="/assets/extension-provider-CO2jxBA9.js">
|
|
66
|
+
<link rel="modulepreload" crossorigin href="/assets/chat-agents-api-DPb_0O8M.js">
|
|
67
|
+
<link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-Cs1Kde9o.js">
|
|
68
|
+
<link rel="modulepreload" crossorigin href="/assets/page-header-store-DJHD9Ean.js">
|
|
69
69
|
<link rel="stylesheet" crossorigin href="/assets/markdown-view-CL7jotIt.css">
|
|
70
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
70
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CQLMxWSA.css">
|
|
71
71
|
</head>
|
|
72
72
|
<body>
|
|
73
73
|
<div id="root"></div>
|
package/dist/package.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../utils/logger.js";
|
|
3
1
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
4
2
|
import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
|
|
5
3
|
import { resolveAgentBootstrapDir } from "./agent-scope.js";
|
|
6
4
|
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
7
|
-
import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
|
|
8
5
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
6
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
7
|
+
import { init_logger } from "../utils/logger.js";
|
|
8
|
+
import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
|
|
9
9
|
import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
|
|
10
10
|
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
11
11
|
import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
@@ -26,9 +26,9 @@ import { extractAgentUserPlainText } from "./memory/user-message-text.js";
|
|
|
26
26
|
import { resolveBackgroundReviewSettings } from "./background-review/settings.js";
|
|
27
27
|
import { isAssistantTurnAborted, isAssistantTurnFailed } from "./orchestration/llm-turn-retry.js";
|
|
28
28
|
import { runBackgroundReviewTurn } from "./background-review/run-background-review.js";
|
|
29
|
+
import { Agent } from "@mariozechner/pi-agent-core";
|
|
29
30
|
import { basename, resolve, sep } from "node:path";
|
|
30
31
|
import { readFileSync } from "node:fs";
|
|
31
|
-
import { Agent } from "@mariozechner/pi-agent-core";
|
|
32
32
|
//#region src/agent/agent-manager.ts
|
|
33
33
|
/**
|
|
34
34
|
* Agent Manager - Manages Agent instances per session
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentBootstrapDir } from "../agent-scope.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentBootstrapDir } from "../agent-scope.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
|
|
5
5
|
import { BOOTSTRAP_FILES } from "./workspace.js";
|
|
6
6
|
import { dirname, join } from "node:path";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
8
7
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
9
|
//#region src/agent/context/workspace-seed.ts
|
|
10
10
|
/**
|
|
11
11
|
* Seed bootstrap persona Markdown files under `…/agents/<id>/bootstrap/` (ensure workspace + write-if-missing).
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Unified image stack: understanding (pi-ai multimodal) under this folder;
|
|
3
3
|
* generation (OpenAI Images API; DashScope Beijing wan2.6-t2i via `dashscope/`) under `./generation/`.
|
|
4
4
|
*/
|
|
5
|
-
export { describeImagesWithPiAi } from './describe-images.js';
|
|
6
5
|
export { describeImages, describeImagesWithFallback, type DescribeImagesParams, type DescribeImagesWithFallbackParams, type DescribeImagesWithFallbackResult, type DescribeImagesAttempt, } from './understanding/runtime.js';
|
|
7
6
|
export { registerImageUnderstandingProvider, getImageUnderstandingProvider, listImageUnderstandingProviders, } from './understanding/provider-registry.js';
|
|
8
7
|
export type { ImageUnderstandingProvider, ImageUnderstandingRequest, ImageUnderstandingResult, } from './understanding/types.js';
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { getImageUnderstandingProvider, listImageUnderstandingProviders, registerImageUnderstandingProvider } from "./understanding/provider-registry.js";
|
|
2
2
|
import { resolveImageModelConfigForTool } from "./tool-model-config.js";
|
|
3
3
|
import { describeImages, describeImagesWithFallback } from "./understanding/runtime.js";
|
|
4
|
-
import { describeImagesWithPiAi } from "./describe-images.js";
|
|
5
4
|
import { runWithImageModelFallback } from "./image-model-fallback.js";
|
|
6
5
|
import { loadImageForToolInput } from "./load-image-media.js";
|
|
7
6
|
import { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL } from "./generation/constants.js";
|
|
8
7
|
import { getImageGenerationProvider, listImageGenerationProviders, registerImageGenerationProvider } from "./generation/provider-registry.js";
|
|
9
8
|
import { generateImage, listImageGenerationProvidersSummary } from "./generation/runtime.js";
|
|
10
9
|
import { modelSupportsVision, resolveImageHandlingStrategy } from "./vision-detection.js";
|
|
11
|
-
export { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL, describeImages, describeImagesWithFallback,
|
|
10
|
+
export { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL, describeImages, describeImagesWithFallback, generateImage, getImageGenerationProvider, getImageUnderstandingProvider, listImageGenerationProviders, listImageGenerationProvidersSummary, listImageUnderstandingProviders, loadImageForToolInput, modelSupportsVision, registerImageGenerationProvider, registerImageUnderstandingProvider, resolveImageHandlingStrategy, resolveImageModelConfigForTool, runWithImageModelFallback };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
|
|
4
4
|
import { createResponseMessage, createSignalMessage, createTaskMessage } from "./types.js";
|
|
5
5
|
import { AgentInbox } from "./inbox.js";
|
|
6
6
|
//#region src/agent/ipc/bus.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
2
|
import { readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
4
|
//#region src/agent/memory/plugin-discovery.ts
|
|
5
5
|
async function discoverMemoryPlugins() {
|
|
6
6
|
const pluginsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "plugins", "memory");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
4
4
|
import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
5
5
|
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
6
6
|
import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { DEFAULT_USER_FILENAME, toWorkspaceBootstrapFile } from "../context/workspace.js";
|
|
6
6
|
import { createSkillConfigManager } from "../skills/config.js";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { runWithLogContext, updateAsyncLogContext } from "../utils/logger/context.js";
|
|
2
|
-
import { createLogger } from "../utils/logger/index.js";
|
|
3
|
-
import { init_logger } from "../utils/logger.js";
|
|
4
1
|
import { init_agent_scope, resolveAgentBootstrapDir, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
|
|
5
2
|
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
6
3
|
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
7
4
|
import { extractProfileAgentId } from "../config/agent-profile.js";
|
|
5
|
+
import { runWithLogContext, updateAsyncLogContext } from "../utils/logger/context.js";
|
|
6
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
7
|
+
import { init_logger } from "../utils/logger.js";
|
|
8
8
|
import { getDefaultModelSync, init_providers } from "../providers/index.js";
|
|
9
9
|
import { extractTextContent, loadBootstrapFiles } from "./context/workspace.js";
|
|
10
10
|
import { isTTSAvailable } from "../voice/tts/factory.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join, relative } from "node:path";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
2
|
import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
4
|
//#region src/agent/skills/hub-hash.ts
|
|
5
5
|
/**
|
|
6
6
|
* Deterministic content hash for a skill directory (for hub lock / drift detection).
|
|
@@ -6,8 +6,8 @@ import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
|
|
|
6
6
|
import { computeSkillTreeHashSync } from "./hub-hash.js";
|
|
7
7
|
import { basename, join, normalize, resolve, sep } from "node:path";
|
|
8
8
|
import { tmpdir } from "node:os";
|
|
9
|
-
import { fileURLToPath } from "node:url";
|
|
10
9
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
11
|
import { fetch } from "undici";
|
|
12
12
|
import { execFileSync } from "node:child_process";
|
|
13
13
|
//#region src/agent/skills/hub-pull.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
6
6
|
import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, init_installer, installSkill } from "./installer.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
|
|
5
5
|
import { createSkillConfigManager, isSkillEnabled } from "./config.js";
|
|
6
6
|
import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveImageModelConfigForTool } from "../../image/tool-model-config.js";
|
|
2
2
|
import { buildImageToolTextResult } from "../../image/image-helpers.js";
|
|
3
|
-
import {
|
|
3
|
+
import { describeImages } from "../../image/understanding/runtime.js";
|
|
4
4
|
import { runWithImageModelFallback } from "../../image/image-model-fallback.js";
|
|
5
5
|
import "../image-tool.js";
|
|
6
6
|
import { BrowserClickSchema, BrowserNavigateSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema } from "./schemas.js";
|
|
@@ -247,7 +247,7 @@ function createBrowserTools(deps) {
|
|
|
247
247
|
toolConfig: imageModelConfig,
|
|
248
248
|
modelOverride: void 0,
|
|
249
249
|
run: async (modelRef) => {
|
|
250
|
-
const { text, provider, model } = await
|
|
250
|
+
const { text, provider, model } = await describeImages({
|
|
251
251
|
modelRef,
|
|
252
252
|
prompt,
|
|
253
253
|
images: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","names":[],"sources":["../../../../../src/agent/tools/browser/tools.ts"],"sourcesContent":["import type { Static } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Locator, Page } from 'playwright-core';\n\nimport type { Config } from '../../../config/schema.js';\nimport { describeImagesWithPiAi } from '../../image/describe-images.js';\nimport { buildImageToolTextResult } from '../../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../../image/image-model-fallback.js';\nimport { resolveImageModelConfigForTool } from '../image-tool.js';\nimport type { BrowserManager } from './manager.js';\nimport {\n BrowserClickSchema,\n BrowserNavigateSchema,\n BrowserScreenshotSchema,\n BrowserScrollSchema,\n BrowserSnapshotSchema,\n BrowserTypeSchema,\n} from './schemas.js';\nimport { assertBrowserUrlAllowed } from './url-policy.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst NAV_TIMEOUT_MS = 30_000;\nconst MAX_SCREENSHOT_BYTES = 6 * 1024 * 1024;\n\nexport interface CreateBrowserToolsDeps {\n getManager: () => BrowserManager;\n getTaskId: () => string;\n getConfig: () => Config | undefined;\n}\n\nfunction resolveClickLocator(page: Page, params: Static<typeof BrowserClickSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasText = Boolean(params.text?.trim());\n const hasRole = Boolean(params.role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) {\n throw new Error('Provide exactly one of: selector, text, role');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n if (hasText) {\n return page.getByText(params.text!.trim(), { exact: false }).first();\n }\n const raw = params.role!.trim();\n const idx = raw.indexOf(':');\n const role = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!role) {\n throw new Error('Invalid role: empty ARIA role');\n }\n // Playwright typings list roles as a union; the model may pass any valid ARIA role string.\n return page.getByRole(role as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, params: Static<typeof BrowserTypeSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasLab = Boolean(params.label?.trim());\n if (hasSel === hasLab) {\n throw new Error('Provide exactly one of: selector, label');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n return page.getByLabel(params.label!.trim()).first();\n}\n\nasync function ariaSnapshotFor(\n page: Page,\n selector: string | undefined,\n maxLength: number,\n): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: 15_000 });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: 15_000 });\n if (!text || !text.trim()) {\n text = '(empty snapshot)';\n }\n if (text.length > maxLength) {\n text = `${text.slice(0, maxLength)}\\n... (truncated)`;\n }\n return text;\n}\n\nexport function createBrowserTools(deps: CreateBrowserToolsDeps): AgentTool<any, any>[] {\n const pageFor = () => deps.getManager().getPage(deps.getTaskId());\n\n const navigate: AgentTool<typeof BrowserNavigateSchema, { url: string; title: string }> = {\n name: 'browser_navigate',\n label: '🌐 Browser Navigate',\n description:\n 'Navigate the headless browser to a URL. The page persists for this chat session.\\n' +\n 'Call `browser_snapshot` after navigation to inspect the UI. Only http(s) public URLs; private IPs and localhost are blocked.',\n parameters: BrowserNavigateSchema,\n\n async execute(_id, params, signal) {\n assertBrowserUrlAllowed(params.url);\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const waitUntil = params.waitFor ?? 'domcontentloaded';\n await page.goto(params.url, {\n waitUntil,\n timeout: NAV_TIMEOUT_MS,\n });\n const title = await page.title();\n const url = page.url();\n return {\n content: [{ type: 'text', text: `Navigated to: ${title}\\nURL: ${url}` }],\n details: { url, title },\n };\n },\n };\n\n const snapshot: AgentTool<typeof BrowserSnapshotSchema, { length: number }> = {\n name: 'browser_snapshot',\n label: '📸 Browser Snapshot',\n description:\n 'Capture an AI-oriented ARIA snapshot of the current page (YAML-like tree with element refs).\\n' +\n 'Use after `browser_navigate` to see interactive elements before `browser_click` / `browser_type`.',\n parameters: BrowserSnapshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const maxLength = params.maxLength ?? DEFAULT_SNAPSHOT_MAX;\n try {\n const text = await ariaSnapshotFor(page, params.selector, maxLength);\n return {\n content: [{ type: 'text', text }],\n details: { length: text.length },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Snapshot failed: ${msg}` }],\n details: { length: 0 },\n };\n }\n },\n };\n\n const click: AgentTool<typeof BrowserClickSchema, { ok: boolean }> = {\n name: 'browser_click',\n label: '🖱️ Browser Click',\n description:\n 'Click an element. Provide exactly one targeting mode: `selector` (CSS), `text` (visible text), or `role` (e.g. `button:Submit`).',\n parameters: BrowserClickSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveClickLocator(page, params);\n await loc.click({ timeout: 15_000 });\n return {\n content: [{ type: 'text', text: 'Click succeeded.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Click failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const typeTool: AgentTool<typeof BrowserTypeSchema, { ok: boolean }> = {\n name: 'browser_type',\n label: '⌨️ Browser Type',\n description:\n 'Type into an input. Provide exactly one of `selector` or `label` (associated label text). Optional `pressEnter` to submit.',\n parameters: BrowserTypeSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveTypeLocator(page, params);\n await loc.clear({ timeout: 5000 }).catch(() => {});\n await loc.fill(params.text, { timeout: 15_000 });\n if (params.pressEnter) {\n await page.keyboard.press('Enter');\n }\n return {\n content: [{ type: 'text', text: 'Typed into field.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Type failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const scroll: AgentTool<typeof BrowserScrollSchema, { ok: boolean }> = {\n name: 'browser_scroll',\n label: '📜 Browser Scroll',\n description: 'Scroll the page up or down by a pixel amount (default 500).',\n parameters: BrowserScrollSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const amount = params.amount ?? 500;\n const dy = params.direction === 'down' ? amount : -amount;\n await page.evaluate(\n ({ deltaY }) => {\n (globalThis as unknown as { scrollBy: (x: number, y: number) => void }).scrollBy(0, deltaY);\n },\n { deltaY: dy },\n );\n return {\n content: [{ type: 'text', text: `Scrolled ${params.direction} by ${amount}px.` }],\n details: { ok: true },\n };\n },\n };\n\n const screenshot: AgentTool<typeof BrowserScreenshotSchema, Record<string, unknown>> = {\n name: 'browser_screenshot',\n label: '🖼️ Browser Screenshot',\n description:\n 'Take a PNG screenshot of the viewport or a CSS selector. When `agents.defaults.imageModel` is configured, runs vision on the image using `description` as the prompt (default: short UI summary).',\n parameters: BrowserScreenshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const cfg = deps.getConfig();\n let buf: Buffer;\n try {\n if (params.selector?.trim()) {\n const loc = page.locator(params.selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout: 15_000 });\n buf = await loc.screenshot({ type: 'png', timeout: 15_000 });\n } else {\n buf = await page.screenshot({ type: 'png', fullPage: false, timeout: 15_000 });\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Screenshot failed: ${msg}` }],\n details: { error: msg },\n };\n }\n\n if (buf.length > MAX_SCREENSHOT_BYTES) {\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot too large (${buf.length} bytes, max ${MAX_SCREENSHOT_BYTES}). Try a narrower selector.`,\n },\n ],\n details: { error: 'too_large', bytes: buf.length },\n };\n }\n\n const imageModelConfig = resolveImageModelConfigForTool({ cfg });\n const prompt =\n params.description?.trim() ||\n 'Describe this browser screenshot briefly. Focus on visible text, controls, and actionable UI state.';\n\n if (!imageModelConfig) {\n return {\n content: [\n {\n type: 'text',\n text:\n `Captured PNG screenshot (${buf.length} bytes). Configure agents.defaults.imageModel for automatic visual description.`,\n },\n ],\n details: { bytes: buf.length, vision: false },\n };\n }\n\n try {\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride: undefined,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImagesWithPiAi({\n modelRef,\n prompt,\n images: [{ buffer: buf, mimeType: 'image/png' }],\n timeoutMs: 60_000,\n signal,\n });\n return { text, provider, model };\n },\n });\n const { result: inner, attempts } = runResult;\n return buildImageToolTextResult(\n { text: inner.text, provider: inner.provider, model: inner.model, attempts },\n { bytes: buf.length, vision: true },\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot captured (${buf.length} bytes) but vision failed: ${msg}`,\n },\n ],\n details: { bytes: buf.length, visionError: msg },\n };\n }\n },\n };\n\n return [navigate, snapshot, click, typeTool, scroll, screenshot];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","names":[],"sources":["../../../../../src/agent/tools/browser/tools.ts"],"sourcesContent":["import type { Static } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Locator, Page } from 'playwright-core';\n\nimport type { Config } from '../../../config/schema.js';\nimport { describeImages } from '../../image/understanding/runtime.js';\nimport { buildImageToolTextResult } from '../../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../../image/image-model-fallback.js';\nimport { resolveImageModelConfigForTool } from '../image-tool.js';\nimport type { BrowserManager } from './manager.js';\nimport {\n BrowserClickSchema,\n BrowserNavigateSchema,\n BrowserScreenshotSchema,\n BrowserScrollSchema,\n BrowserSnapshotSchema,\n BrowserTypeSchema,\n} from './schemas.js';\nimport { assertBrowserUrlAllowed } from './url-policy.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst NAV_TIMEOUT_MS = 30_000;\nconst MAX_SCREENSHOT_BYTES = 6 * 1024 * 1024;\n\nexport interface CreateBrowserToolsDeps {\n getManager: () => BrowserManager;\n getTaskId: () => string;\n getConfig: () => Config | undefined;\n}\n\nfunction resolveClickLocator(page: Page, params: Static<typeof BrowserClickSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasText = Boolean(params.text?.trim());\n const hasRole = Boolean(params.role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) {\n throw new Error('Provide exactly one of: selector, text, role');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n if (hasText) {\n return page.getByText(params.text!.trim(), { exact: false }).first();\n }\n const raw = params.role!.trim();\n const idx = raw.indexOf(':');\n const role = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!role) {\n throw new Error('Invalid role: empty ARIA role');\n }\n // Playwright typings list roles as a union; the model may pass any valid ARIA role string.\n return page.getByRole(role as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, params: Static<typeof BrowserTypeSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasLab = Boolean(params.label?.trim());\n if (hasSel === hasLab) {\n throw new Error('Provide exactly one of: selector, label');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n return page.getByLabel(params.label!.trim()).first();\n}\n\nasync function ariaSnapshotFor(\n page: Page,\n selector: string | undefined,\n maxLength: number,\n): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: 15_000 });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: 15_000 });\n if (!text || !text.trim()) {\n text = '(empty snapshot)';\n }\n if (text.length > maxLength) {\n text = `${text.slice(0, maxLength)}\\n... (truncated)`;\n }\n return text;\n}\n\nexport function createBrowserTools(deps: CreateBrowserToolsDeps): AgentTool<any, any>[] {\n const pageFor = () => deps.getManager().getPage(deps.getTaskId());\n\n const navigate: AgentTool<typeof BrowserNavigateSchema, { url: string; title: string }> = {\n name: 'browser_navigate',\n label: '🌐 Browser Navigate',\n description:\n 'Navigate the headless browser to a URL. The page persists for this chat session.\\n' +\n 'Call `browser_snapshot` after navigation to inspect the UI. Only http(s) public URLs; private IPs and localhost are blocked.',\n parameters: BrowserNavigateSchema,\n\n async execute(_id, params, signal) {\n assertBrowserUrlAllowed(params.url);\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const waitUntil = params.waitFor ?? 'domcontentloaded';\n await page.goto(params.url, {\n waitUntil,\n timeout: NAV_TIMEOUT_MS,\n });\n const title = await page.title();\n const url = page.url();\n return {\n content: [{ type: 'text', text: `Navigated to: ${title}\\nURL: ${url}` }],\n details: { url, title },\n };\n },\n };\n\n const snapshot: AgentTool<typeof BrowserSnapshotSchema, { length: number }> = {\n name: 'browser_snapshot',\n label: '📸 Browser Snapshot',\n description:\n 'Capture an AI-oriented ARIA snapshot of the current page (YAML-like tree with element refs).\\n' +\n 'Use after `browser_navigate` to see interactive elements before `browser_click` / `browser_type`.',\n parameters: BrowserSnapshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const maxLength = params.maxLength ?? DEFAULT_SNAPSHOT_MAX;\n try {\n const text = await ariaSnapshotFor(page, params.selector, maxLength);\n return {\n content: [{ type: 'text', text }],\n details: { length: text.length },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Snapshot failed: ${msg}` }],\n details: { length: 0 },\n };\n }\n },\n };\n\n const click: AgentTool<typeof BrowserClickSchema, { ok: boolean }> = {\n name: 'browser_click',\n label: '🖱️ Browser Click',\n description:\n 'Click an element. Provide exactly one targeting mode: `selector` (CSS), `text` (visible text), or `role` (e.g. `button:Submit`).',\n parameters: BrowserClickSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveClickLocator(page, params);\n await loc.click({ timeout: 15_000 });\n return {\n content: [{ type: 'text', text: 'Click succeeded.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Click failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const typeTool: AgentTool<typeof BrowserTypeSchema, { ok: boolean }> = {\n name: 'browser_type',\n label: '⌨️ Browser Type',\n description:\n 'Type into an input. Provide exactly one of `selector` or `label` (associated label text). Optional `pressEnter` to submit.',\n parameters: BrowserTypeSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveTypeLocator(page, params);\n await loc.clear({ timeout: 5000 }).catch(() => {});\n await loc.fill(params.text, { timeout: 15_000 });\n if (params.pressEnter) {\n await page.keyboard.press('Enter');\n }\n return {\n content: [{ type: 'text', text: 'Typed into field.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Type failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const scroll: AgentTool<typeof BrowserScrollSchema, { ok: boolean }> = {\n name: 'browser_scroll',\n label: '📜 Browser Scroll',\n description: 'Scroll the page up or down by a pixel amount (default 500).',\n parameters: BrowserScrollSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const amount = params.amount ?? 500;\n const dy = params.direction === 'down' ? amount : -amount;\n await page.evaluate(\n ({ deltaY }) => {\n (globalThis as unknown as { scrollBy: (x: number, y: number) => void }).scrollBy(0, deltaY);\n },\n { deltaY: dy },\n );\n return {\n content: [{ type: 'text', text: `Scrolled ${params.direction} by ${amount}px.` }],\n details: { ok: true },\n };\n },\n };\n\n const screenshot: AgentTool<typeof BrowserScreenshotSchema, Record<string, unknown>> = {\n name: 'browser_screenshot',\n label: '🖼️ Browser Screenshot',\n description:\n 'Take a PNG screenshot of the viewport or a CSS selector. When `agents.defaults.imageModel` is configured, runs vision on the image using `description` as the prompt (default: short UI summary).',\n parameters: BrowserScreenshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const cfg = deps.getConfig();\n let buf: Buffer;\n try {\n if (params.selector?.trim()) {\n const loc = page.locator(params.selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout: 15_000 });\n buf = await loc.screenshot({ type: 'png', timeout: 15_000 });\n } else {\n buf = await page.screenshot({ type: 'png', fullPage: false, timeout: 15_000 });\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Screenshot failed: ${msg}` }],\n details: { error: msg },\n };\n }\n\n if (buf.length > MAX_SCREENSHOT_BYTES) {\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot too large (${buf.length} bytes, max ${MAX_SCREENSHOT_BYTES}). Try a narrower selector.`,\n },\n ],\n details: { error: 'too_large', bytes: buf.length },\n };\n }\n\n const imageModelConfig = resolveImageModelConfigForTool({ cfg });\n const prompt =\n params.description?.trim() ||\n 'Describe this browser screenshot briefly. Focus on visible text, controls, and actionable UI state.';\n\n if (!imageModelConfig) {\n return {\n content: [\n {\n type: 'text',\n text:\n `Captured PNG screenshot (${buf.length} bytes). Configure agents.defaults.imageModel for automatic visual description.`,\n },\n ],\n details: { bytes: buf.length, vision: false },\n };\n }\n\n try {\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride: undefined,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImages({\n modelRef,\n prompt,\n images: [{ buffer: buf, mimeType: 'image/png' }],\n timeoutMs: 60_000,\n signal,\n });\n return { text, provider, model };\n },\n });\n const { result: inner, attempts } = runResult;\n return buildImageToolTextResult(\n { text: inner.text, provider: inner.provider, model: inner.model, attempts },\n { bytes: buf.length, vision: true },\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot captured (${buf.length} bytes) but vision failed: ${msg}`,\n },\n ],\n details: { bytes: buf.length, visionError: msg },\n };\n }\n },\n };\n\n return [navigate, snapshot, click, typeTool, scroll, screenshot];\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
4
4
|
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
5
5
|
import { createReadFileTool } from "./read.js";
|
|
6
6
|
import { createWriteFileTool } from "./write.js";
|
|
@@ -3,9 +3,9 @@ import { applyImageGenerationModelConfigDefaults } from "../image/image-helpers.
|
|
|
3
3
|
import { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL } from "../image/generation/constants.js";
|
|
4
4
|
import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import { randomBytes } from "node:crypto";
|
|
7
6
|
import { Type } from "@sinclair/typebox";
|
|
8
7
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
|
+
import { randomBytes } from "node:crypto";
|
|
9
9
|
//#region src/agent/tools/image-generate-tool.ts
|
|
10
10
|
const DEFAULT_COUNT = 1;
|
|
11
11
|
const MAX_COUNT = 4;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
|
|
2
2
|
import { buildImageToolTextResult, resolvePromptAndModelOverride } from "../image/image-helpers.js";
|
|
3
|
-
import {
|
|
3
|
+
import { describeImages } from "../image/understanding/runtime.js";
|
|
4
4
|
import { runWithImageModelFallback } from "../image/image-model-fallback.js";
|
|
5
5
|
import { loadImageForToolInput } from "../image/load-image-media.js";
|
|
6
6
|
import { Type } from "@sinclair/typebox";
|
|
@@ -121,7 +121,7 @@ function createImageTool(options) {
|
|
|
121
121
|
toolConfig: imageModelConfig,
|
|
122
122
|
modelOverride,
|
|
123
123
|
run: async (modelRef) => {
|
|
124
|
-
const { text, provider, model } = await
|
|
124
|
+
const { text, provider, model } = await describeImages({
|
|
125
125
|
modelRef,
|
|
126
126
|
prompt: promptRaw,
|
|
127
127
|
images: loadedImages.map((img) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-tool.js","names":[],"sources":["../../../../src/agent/tools/image-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Config } from '../../config/schema.js';\nimport { describeImagesWithPiAi } from '../image/describe-images.js';\nimport { buildImageToolTextResult, resolvePromptAndModelOverride } from '../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../image/image-model-fallback.js';\nimport { loadImageForToolInput } from '../image/load-image-media.js';\nimport {\n resolveImageModelConfigForTool,\n type ToolModelConfig,\n} from '../image/tool-model-config.js';\n\nconst DEFAULT_PROMPT = 'Describe the image.';\nconst DEFAULT_MAX_IMAGES = 20;\n\nexport { resolveImageModelConfigForTool } from '../image/tool-model-config.js';\n\nfunction pickMaxBytes(cfg?: Config, maxBytesMb?: number): number {\n if (typeof maxBytesMb === 'number' && Number.isFinite(maxBytesMb) && maxBytesMb > 0) {\n return Math.floor(maxBytesMb * 1024 * 1024);\n }\n const configured = cfg?.agents?.defaults?.mediaMaxMb;\n if (typeof configured === 'number' && Number.isFinite(configured) && configured > 0) {\n return Math.floor(configured * 1024 * 1024);\n }\n return 20 * 1024 * 1024;\n}\n\nexport function createImageTool(options: {\n config?: Config;\n workspace: string;\n /** When true, session model already receives images in the user message. */\n modelHasVision?: boolean;\n}): AgentTool<any, Record<string, unknown>> | null {\n const imageModelConfig = resolveImageModelConfigForTool({ cfg: options.config });\n if (!imageModelConfig) {\n return null;\n }\n\n const description = options.modelHasVision\n ? 'Analyze one or more images with a vision model. Use `image` for a single path/URL, or `images` for multiple (up to 20). Only use when images were NOT already in the user message.'\n : 'Analyze one or more images using the configured image model (agents.defaults.imageModel). Use `image` or `images` for paths/URLs; optional `prompt` for what to extract.';\n\n const localRoots = [options.workspace];\n\n return {\n name: 'image',\n label: 'Image',\n description,\n parameters: Type.Object({\n prompt: Type.Optional(Type.String()),\n image: Type.Optional(Type.String({ description: 'Single image path or URL.' })),\n images: Type.Optional(\n Type.Array(Type.String(), {\n description: 'Multiple image paths or URLs (up to maxImages, default 20).',\n }),\n ),\n model: Type.Optional(Type.String({ description: 'Optional provider/model override.' })),\n maxBytesMb: Type.Optional(Type.Number()),\n maxImages: Type.Optional(Type.Number()),\n }),\n async execute(\n _toolCallId: string,\n args: Record<string, unknown>,\n ): Promise<AgentToolResult<Record<string, unknown>>> {\n const record = args && typeof args === 'object' ? args : {};\n\n const imageCandidates: string[] = [];\n if (typeof record.image === 'string') {\n imageCandidates.push(record.image);\n }\n if (Array.isArray(record.images)) {\n imageCandidates.push(...record.images.filter((v): v is string => typeof v === 'string'));\n }\n\n const seenImages = new Set<string>();\n const imageInputs: string[] = [];\n for (const candidate of imageCandidates) {\n const trimmedCandidate = candidate.trim();\n const normalizedForDedupe = trimmedCandidate.startsWith('@')\n ? trimmedCandidate.slice(1).trim()\n : trimmedCandidate;\n if (!normalizedForDedupe || seenImages.has(normalizedForDedupe)) {\n continue;\n }\n seenImages.add(normalizedForDedupe);\n imageInputs.push(trimmedCandidate);\n }\n\n if (imageInputs.length === 0) {\n return {\n content: [{ type: 'text', text: 'Error: provide `image` or `images`.' }],\n details: { error: 'missing_image' },\n };\n }\n\n const maxImagesRaw = typeof record.maxImages === 'number' ? record.maxImages : undefined;\n const maxImages =\n typeof maxImagesRaw === 'number' && Number.isFinite(maxImagesRaw) && maxImagesRaw > 0\n ? Math.floor(maxImagesRaw)\n : DEFAULT_MAX_IMAGES;\n if (imageInputs.length > maxImages) {\n return {\n content: [\n {\n type: 'text',\n text: `Too many images: ${imageInputs.length} (max ${maxImages}).`,\n },\n ],\n details: { error: 'too_many_images', count: imageInputs.length, max: maxImages },\n };\n }\n\n const { prompt: promptRaw, modelOverride } = resolvePromptAndModelOverride(\n record,\n DEFAULT_PROMPT,\n );\n const maxBytesMb = typeof record.maxBytesMb === 'number' ? record.maxBytesMb : undefined;\n const maxBytes = pickMaxBytes(options.config, maxBytesMb);\n\n const loadedImages: Array<{ buffer: Buffer; mimeType: string; resolvedImage: string }> = [];\n\n for (const imageRawInput of imageInputs) {\n const trimmed = imageRawInput.trim();\n const imageRaw = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n if (!imageRaw) {\n return {\n content: [{ type: 'text', text: 'Error: empty image entry.' }],\n details: { error: 'empty_image' },\n };\n }\n\n const looksLikeWindowsDrivePath = /^[a-zA-Z]:[\\\\/]/.test(imageRaw);\n const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(imageRaw);\n const isFileUrl = /^file:/i.test(imageRaw);\n const isHttpUrl = /^https?:\\/\\//i.test(imageRaw);\n const isDataUrl = /^data:/i.test(imageRaw);\n if (hasScheme && !looksLikeWindowsDrivePath && !isFileUrl && !isHttpUrl && !isDataUrl) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported image reference: ${imageRawInput}. Use a path, file://, data:, or http(s) URL.`,\n },\n ],\n details: { error: 'unsupported_image_reference', image: imageRawInput },\n };\n }\n\n try {\n const media = await loadImageForToolInput(imageRaw, {\n maxBytes,\n workspace: options.workspace,\n localRoots,\n });\n loadedImages.push({\n buffer: media.buffer,\n mimeType: media.mimeType,\n resolvedImage: imageRaw,\n });\n } catch (e) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to load image (${imageRawInput}): ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n details: { error: 'load_failed', image: imageRawInput },\n };\n }\n }\n\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImagesWithPiAi({\n modelRef,\n prompt: promptRaw,\n images: loadedImages.map((img) => ({ buffer: img.buffer, mimeType: img.mimeType })),\n timeoutMs: 60_000,\n });\n return { text, provider, model };\n },\n });\n\n const { result: inner, attempts } = runResult;\n const result = {\n text: inner.text,\n provider: inner.provider,\n model: inner.model,\n attempts,\n };\n\n const imageDetails =\n loadedImages.length === 1\n ? { image: loadedImages[0].resolvedImage }\n : {\n images: loadedImages.map((img) => ({ image: img.resolvedImage })),\n };\n\n return buildImageToolTextResult(result, imageDetails);\n },\n };\n}\n"],"mappings":";;;;;;;AAYA,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAI3B,SAAS,aAAa,KAAc,YAA6B;AAC/D,KAAI,OAAO,eAAe,YAAY,OAAO,SAAS,WAAW,IAAI,aAAa,EAChF,QAAO,KAAK,MAAM,aAAa,OAAO,KAAK;CAE7C,MAAM,aAAa,KAAK,QAAQ,UAAU;AAC1C,KAAI,OAAO,eAAe,YAAY,OAAO,SAAS,WAAW,IAAI,aAAa,EAChF,QAAO,KAAK,MAAM,aAAa,OAAO,KAAK;AAE7C,QAAO,KAAK,OAAO;;AAGrB,SAAgB,gBAAgB,SAKmB;CACjD,MAAM,mBAAmB,+BAA+B,EAAE,KAAK,QAAQ,QAAQ,CAAC;AAChF,KAAI,CAAC,iBACH,QAAO;CAGT,MAAM,cAAc,QAAQ,iBACxB,uLACA;CAEJ,MAAM,aAAa,CAAC,QAAQ,UAAU;AAEtC,QAAO;EACL,MAAM;EACN,OAAO;EACP;EACA,YAAY,KAAK,OAAO;GACtB,QAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC;GACpC,OAAO,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,6BAA6B,CAAC,CAAC;GAC/E,QAAQ,KAAK,SACX,KAAK,MAAM,KAAK,QAAQ,EAAE,EACxB,aAAa,+DACd,CAAC,CACH;GACD,OAAO,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,qCAAqC,CAAC,CAAC;GACvF,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC;GACxC,WAAW,KAAK,SAAS,KAAK,QAAQ,CAAC;GACxC,CAAC;EACF,MAAM,QACJ,aACA,MACmD;GACnD,MAAM,SAAS,QAAQ,OAAO,SAAS,WAAW,OAAO,EAAE;GAE3D,MAAM,kBAA4B,EAAE;AACpC,OAAI,OAAO,OAAO,UAAU,SAC1B,iBAAgB,KAAK,OAAO,MAAM;AAEpC,OAAI,MAAM,QAAQ,OAAO,OAAO,CAC9B,iBAAgB,KAAK,GAAG,OAAO,OAAO,QAAQ,MAAmB,OAAO,MAAM,SAAS,CAAC;GAG1F,MAAM,6BAAa,IAAI,KAAa;GACpC,MAAM,cAAwB,EAAE;AAChC,QAAK,MAAM,aAAa,iBAAiB;IACvC,MAAM,mBAAmB,UAAU,MAAM;IACzC,MAAM,sBAAsB,iBAAiB,WAAW,IAAI,GACxD,iBAAiB,MAAM,EAAE,CAAC,MAAM,GAChC;AACJ,QAAI,CAAC,uBAAuB,WAAW,IAAI,oBAAoB,CAC7D;AAEF,eAAW,IAAI,oBAAoB;AACnC,gBAAY,KAAK,iBAAiB;;AAGpC,OAAI,YAAY,WAAW,EACzB,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAuC,CAAC;IACxE,SAAS,EAAE,OAAO,iBAAiB;IACpC;GAGH,MAAM,eAAe,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;GAC/E,MAAM,YACJ,OAAO,iBAAiB,YAAY,OAAO,SAAS,aAAa,IAAI,eAAe,IAChF,KAAK,MAAM,aAAa,GACxB;AACN,OAAI,YAAY,SAAS,UACvB,QAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM,oBAAoB,YAAY,OAAO,QAAQ,UAAU;KAChE,CACF;IACD,SAAS;KAAE,OAAO;KAAmB,OAAO,YAAY;KAAQ,KAAK;KAAW;IACjF;GAGH,MAAM,EAAE,QAAQ,WAAW,kBAAkB,8BAC3C,QACA,eACD;GACD,MAAM,aAAa,OAAO,OAAO,eAAe,WAAW,OAAO,aAAa,KAAA;GAC/E,MAAM,WAAW,aAAa,QAAQ,QAAQ,WAAW;GAEzD,MAAM,eAAmF,EAAE;AAE3F,QAAK,MAAM,iBAAiB,aAAa;IACvC,MAAM,UAAU,cAAc,MAAM;IACpC,MAAM,WAAW,QAAQ,WAAW,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG;AACrE,QAAI,CAAC,SACH,QAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;MAA6B,CAAC;KAC9D,SAAS,EAAE,OAAO,eAAe;KAClC;IAGH,MAAM,4BAA4B,kBAAkB,KAAK,SAAS;IAClE,MAAM,YAAY,uBAAuB,KAAK,SAAS;IACvD,MAAM,YAAY,UAAU,KAAK,SAAS;IAC1C,MAAM,YAAY,gBAAgB,KAAK,SAAS;IAChD,MAAM,YAAY,UAAU,KAAK,SAAS;AAC1C,QAAI,aAAa,CAAC,6BAA6B,CAAC,aAAa,CAAC,aAAa,CAAC,UAC1E,QAAO;KACL,SAAS,CACP;MACE,MAAM;MACN,MAAM,gCAAgC,cAAc;MACrD,CACF;KACD,SAAS;MAAE,OAAO;MAA+B,OAAO;MAAe;KACxE;AAGH,QAAI;KACF,MAAM,QAAQ,MAAM,sBAAsB,UAAU;MAClD;MACA,WAAW,QAAQ;MACnB;MACD,CAAC;AACF,kBAAa,KAAK;MAChB,QAAQ,MAAM;MACd,UAAU,MAAM;MAChB,eAAe;MAChB,CAAC;aACK,GAAG;AACV,YAAO;MACL,SAAS,CACP;OACE,MAAM;OACN,MAAM,yBAAyB,cAAc,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;OAC7F,CACF;MACD,SAAS;OAAE,OAAO;OAAe,OAAO;OAAe;MACxD;;;GAkBL,MAAM,EAAE,QAAQ,OAAO,aAdL,MAAM,0BAA0B;IAChD,YAAY;IACZ;IACA,KAAK,OAAO,aAAa;KACvB,MAAM,EAAE,MAAM,UAAU,UAAU,MAAM,uBAAuB;MAC7D;MACA,QAAQ;MACR,QAAQ,aAAa,KAAK,SAAS;OAAE,QAAQ,IAAI;OAAQ,UAAU,IAAI;OAAU,EAAE;MACnF,WAAW;MACZ,CAAC;AACF,YAAO;MAAE;MAAM;MAAU;MAAO;;IAEnC,CAAC;AAiBF,UAAO,yBAdQ;IACb,MAAM,MAAM;IACZ,UAAU,MAAM;IAChB,OAAO,MAAM;IACb;IACD,EAGC,aAAa,WAAW,IACpB,EAAE,OAAO,aAAa,GAAG,eAAe,GACxC,EACE,QAAQ,aAAa,KAAK,SAAS,EAAE,OAAO,IAAI,eAAe,EAAE,EAClE,CAE8C;;EAExD"}
|
|
1
|
+
{"version":3,"file":"image-tool.js","names":[],"sources":["../../../../src/agent/tools/image-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Config } from '../../config/schema.js';\nimport { describeImages } from '../image/understanding/runtime.js';\nimport { buildImageToolTextResult, resolvePromptAndModelOverride } from '../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../image/image-model-fallback.js';\nimport { loadImageForToolInput } from '../image/load-image-media.js';\nimport {\n resolveImageModelConfigForTool,\n type ToolModelConfig,\n} from '../image/tool-model-config.js';\n\nconst DEFAULT_PROMPT = 'Describe the image.';\nconst DEFAULT_MAX_IMAGES = 20;\n\nexport { resolveImageModelConfigForTool } from '../image/tool-model-config.js';\n\nfunction pickMaxBytes(cfg?: Config, maxBytesMb?: number): number {\n if (typeof maxBytesMb === 'number' && Number.isFinite(maxBytesMb) && maxBytesMb > 0) {\n return Math.floor(maxBytesMb * 1024 * 1024);\n }\n const configured = cfg?.agents?.defaults?.mediaMaxMb;\n if (typeof configured === 'number' && Number.isFinite(configured) && configured > 0) {\n return Math.floor(configured * 1024 * 1024);\n }\n return 20 * 1024 * 1024;\n}\n\nexport function createImageTool(options: {\n config?: Config;\n workspace: string;\n /** When true, session model already receives images in the user message. */\n modelHasVision?: boolean;\n}): AgentTool<any, Record<string, unknown>> | null {\n const imageModelConfig = resolveImageModelConfigForTool({ cfg: options.config });\n if (!imageModelConfig) {\n return null;\n }\n\n const description = options.modelHasVision\n ? 'Analyze one or more images with a vision model. Use `image` for a single path/URL, or `images` for multiple (up to 20). Only use when images were NOT already in the user message.'\n : 'Analyze one or more images using the configured image model (agents.defaults.imageModel). Use `image` or `images` for paths/URLs; optional `prompt` for what to extract.';\n\n const localRoots = [options.workspace];\n\n return {\n name: 'image',\n label: 'Image',\n description,\n parameters: Type.Object({\n prompt: Type.Optional(Type.String()),\n image: Type.Optional(Type.String({ description: 'Single image path or URL.' })),\n images: Type.Optional(\n Type.Array(Type.String(), {\n description: 'Multiple image paths or URLs (up to maxImages, default 20).',\n }),\n ),\n model: Type.Optional(Type.String({ description: 'Optional provider/model override.' })),\n maxBytesMb: Type.Optional(Type.Number()),\n maxImages: Type.Optional(Type.Number()),\n }),\n async execute(\n _toolCallId: string,\n args: Record<string, unknown>,\n ): Promise<AgentToolResult<Record<string, unknown>>> {\n const record = args && typeof args === 'object' ? args : {};\n\n const imageCandidates: string[] = [];\n if (typeof record.image === 'string') {\n imageCandidates.push(record.image);\n }\n if (Array.isArray(record.images)) {\n imageCandidates.push(...record.images.filter((v): v is string => typeof v === 'string'));\n }\n\n const seenImages = new Set<string>();\n const imageInputs: string[] = [];\n for (const candidate of imageCandidates) {\n const trimmedCandidate = candidate.trim();\n const normalizedForDedupe = trimmedCandidate.startsWith('@')\n ? trimmedCandidate.slice(1).trim()\n : trimmedCandidate;\n if (!normalizedForDedupe || seenImages.has(normalizedForDedupe)) {\n continue;\n }\n seenImages.add(normalizedForDedupe);\n imageInputs.push(trimmedCandidate);\n }\n\n if (imageInputs.length === 0) {\n return {\n content: [{ type: 'text', text: 'Error: provide `image` or `images`.' }],\n details: { error: 'missing_image' },\n };\n }\n\n const maxImagesRaw = typeof record.maxImages === 'number' ? record.maxImages : undefined;\n const maxImages =\n typeof maxImagesRaw === 'number' && Number.isFinite(maxImagesRaw) && maxImagesRaw > 0\n ? Math.floor(maxImagesRaw)\n : DEFAULT_MAX_IMAGES;\n if (imageInputs.length > maxImages) {\n return {\n content: [\n {\n type: 'text',\n text: `Too many images: ${imageInputs.length} (max ${maxImages}).`,\n },\n ],\n details: { error: 'too_many_images', count: imageInputs.length, max: maxImages },\n };\n }\n\n const { prompt: promptRaw, modelOverride } = resolvePromptAndModelOverride(\n record,\n DEFAULT_PROMPT,\n );\n const maxBytesMb = typeof record.maxBytesMb === 'number' ? record.maxBytesMb : undefined;\n const maxBytes = pickMaxBytes(options.config, maxBytesMb);\n\n const loadedImages: Array<{ buffer: Buffer; mimeType: string; resolvedImage: string }> = [];\n\n for (const imageRawInput of imageInputs) {\n const trimmed = imageRawInput.trim();\n const imageRaw = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n if (!imageRaw) {\n return {\n content: [{ type: 'text', text: 'Error: empty image entry.' }],\n details: { error: 'empty_image' },\n };\n }\n\n const looksLikeWindowsDrivePath = /^[a-zA-Z]:[\\\\/]/.test(imageRaw);\n const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(imageRaw);\n const isFileUrl = /^file:/i.test(imageRaw);\n const isHttpUrl = /^https?:\\/\\//i.test(imageRaw);\n const isDataUrl = /^data:/i.test(imageRaw);\n if (hasScheme && !looksLikeWindowsDrivePath && !isFileUrl && !isHttpUrl && !isDataUrl) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported image reference: ${imageRawInput}. Use a path, file://, data:, or http(s) URL.`,\n },\n ],\n details: { error: 'unsupported_image_reference', image: imageRawInput },\n };\n }\n\n try {\n const media = await loadImageForToolInput(imageRaw, {\n maxBytes,\n workspace: options.workspace,\n localRoots,\n });\n loadedImages.push({\n buffer: media.buffer,\n mimeType: media.mimeType,\n resolvedImage: imageRaw,\n });\n } catch (e) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to load image (${imageRawInput}): ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n details: { error: 'load_failed', image: imageRawInput },\n };\n }\n }\n\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImages({\n modelRef,\n prompt: promptRaw,\n images: loadedImages.map((img) => ({ buffer: img.buffer, mimeType: img.mimeType })),\n timeoutMs: 60_000,\n });\n return { text, provider, model };\n },\n });\n\n const { result: inner, attempts } = runResult;\n const result = {\n text: inner.text,\n provider: inner.provider,\n model: inner.model,\n attempts,\n };\n\n const imageDetails =\n loadedImages.length === 1\n ? { image: loadedImages[0].resolvedImage }\n : {\n images: loadedImages.map((img) => ({ image: img.resolvedImage })),\n };\n\n return buildImageToolTextResult(result, imageDetails);\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createReadFileTool,
|
|
1
|
+
export { createReadFileTool, type CreateReadFileToolOptions } from './read.js';
|
|
2
2
|
export { createWriteFileTool, writeFileTool } from './write.js';
|
|
3
3
|
export { createEditFileTool, editFileTool, type EditToolDetails } from './edit.js';
|
|
4
4
|
export { createListDirTool, listDirTool } from './list-dir.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, GREP_MAX_LINE_LENGTH, formatSize, truncateHead, truncateLine, truncateTail } from "./truncate.js";
|
|
2
|
-
import { createReadFileTool
|
|
2
|
+
import { createReadFileTool } from "./read.js";
|
|
3
3
|
import { createWriteFileTool, writeFileTool } from "./write.js";
|
|
4
4
|
import { fuzzyFindText, generateDiffString, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings, stripBom } from "./edit-diff.js";
|
|
5
5
|
import { createEditFileTool, editFileTool } from "./edit.js";
|
|
@@ -29,4 +29,4 @@ import { createCronjobTool, scanCronPrompt } from "./cronjob-tool.js";
|
|
|
29
29
|
import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
|
|
30
30
|
import { createSkillManageTool } from "./skill-manage-tool.js";
|
|
31
31
|
import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
|
|
32
|
-
export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createBrowserTools, createClarifyTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createSendMediaTool, createSessionSearchTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebSearchTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, invalidateSessionSearchIndexCache, listDirTool, normalizeForFuzzyMatch, normalizeToLF,
|
|
32
|
+
export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createBrowserTools, createClarifyTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createSendMediaTool, createSessionSearchTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebSearchTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, invalidateSessionSearchIndexCache, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, webFetchTool, writeFileTool };
|
|
@@ -8,6 +8,4 @@ export interface CreateReadFileToolOptions {
|
|
|
8
8
|
bootstrapDir?: string;
|
|
9
9
|
}
|
|
10
10
|
export declare function createReadFileTool(workspace: string, options?: CreateReadFileToolOptions): AgentTool<typeof ReadFileSchema, {}>;
|
|
11
|
-
/** @deprecated Use {@link createReadFileTool}(process.cwd()) — default cwd; prefer factory with workspace. */
|
|
12
|
-
export declare const readFileTool: AgentTool<typeof ReadFileSchema, {}>;
|
|
13
11
|
export {};
|